IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 美食杰项目---个人页和他人主页 -> 正文阅读

[JavaScript知识库]美食杰项目---个人页和他人主页

美食杰项目—个人页和他人主页

  1. 跳转个人主页。
  2. 跳转他人主页。
  3. 点击他人关注或取消关注。
  4. 点击他人菜谱,粉丝及关注。

效果图展示

点击跳转到个人空间,个人空间没有关注和取消关注。
在这里插入图片描述
点击个人跳转如下图:
在这里插入图片描述

点击跳转到他人的主页,可以点击关注和跳转。
在这里插入图片描述
点击他人跳转如下图:
在这里插入图片描述

space.vue空间页

总体思路
1.显示别人的空间

  • a.地址栏中如有userid 则显示对应的用户数据

2.显示自身空间

  • a.如果没有userid 则默认显示自己信息
  • b.如果在菜谱中 点击自己 也是有userid传递
  • c.通过判断是否为自己的 如果是,不需要后端拿,登录时,个人信息
<template>
  <div class="space">
    <h2>欢迎来到我的美食空间</h2>
    <div class="user-info">
      <div class="user-avatar">
        <img :src="userInfo.avatar" alt="">
      </div>
      <div class="user-main">
        <h1>{{userInfo.name}}</h1>
        <span class="info">
          <em>{{userInfo.createdAt}}加入美食杰</em>
          |
          <router-link :to="{name:'edit'}" v-if="isOwner">编辑个人资料</router-link>
        </span>
        <div class="tools" v-if="!isOwner">
          <!-- follow-at  no-follow-at-->
				  <a href="javascript:;" class="follow-at"
            :class="{'no-follow-at':userInfo.isFollowing}"
            @click="toggleHandler"
          >
            {{userInfo.isFollowing ? '已关注':'未关注'}}
          </a>
        </div>
      </div>

      <ul class="user-more-info">
        <li>
          <div>
            <span>关注</span>
            <strong>{{userInfo.following_len}}</strong>
          </div>
        </li>
        <li>
          <div>
            <span>粉丝</span>
            <strong>{{userInfo.follows_len}}</strong>
          </div>
        </li>
        <li>
          <div>
            <span>收藏</span>
            <strong>{{userInfo.collections_len}}</strong>
          </div>
        </li>
        <li>
          <div>
            <span>发布菜谱</span>
            <strong>{{userInfo.work_menus_len}}</strong>
          </div>
        </li>
      </ul>
    </div>

    <!-- v-model="activeName" -->
    <el-tabs class="user-nav"
       v-model="activeName"
       @tab-click="tabClickHandler"
     >
      <el-tab-pane label="作品" name="works"></el-tab-pane>
      <el-tab-pane label="粉丝" name="fans"></el-tab-pane>
      <el-tab-pane label="关注" name="following"></el-tab-pane>
      <el-tab-pane label="收藏" name="collection"></el-tab-pane>
    </el-tabs>

    <div class="user-info-show">
      <!-- 作品 & 收藏 布局 -->
      <!-- <menu-card :margin-left="13"></menu-card> -->
      <!-- 粉丝 & 关注 布局 -->
      <!-- <Fans></Fans> -->
      <router-view :info="list" :activeName="activeName"></router-view>
    </div>

  </div>
</template>
<script>
import {userInfo, toggleFollowing, getMenus, following, fans, collection} from '@/service/api';
const getOtherInfo = {
   async works(params){  //作品
   let data =(await getMenus(params)).data
   data.flag="works"
      return data;
    },

    async following(params){ //关注
      let data=(await following(params)).data
      data.flag="following"
      return data;
    },


     async fans(params){ // 粉丝
     let data=(await fans(params)).data
     data.flag="fans"
      return data;
    },

     async collection(params){  //收藏
     let data=(await collection(params)).data
     data.flag="collection"
      return data;
    }
}

export default {
  name: 'Space',
  data(){
    return {
      userInfo:{},
      isOwner:false,
      activeName:'works',
      list:[]
    }
  },
  watch:{
    // 监听路由变化,判断路由当中是否有信息,而分辨是否是自己的空间
    $route:{
      async handler(){
        // 判断路由是否有信息
        let {userId} =this.$route.query;
        this.isOwner=!userId || userId==this.$store.state.userId
        if(this.isOwner){//判断当前登录的用户
          this.userInfo=this.$store.state.userInfo;
        }else{
          const {data}=await userInfo({userId})
          this.userInfo=data;
        }
        // console.log(this.userInfo)
        //可以留存上一次tad的访问信息
        this.activeName=this.$route.name;
        // console.log(this.activeName)
        this.getInfo(); //请求二级路由


      },
      immediate:true
    }
  },
  methods:{
   async toggleHandler(){
     const {data}=await toggleFollowing({followUserId:this.userInfo.userId})
     console.log(data)
    //  因为关注后,要更新的数据里,还有粉丝,所有整体赋值
     this.userInfo=data;
    },
    tabClickHandler(){
      this.list =[];
      this.$router.push({
        name:this.activeName,
        query:{
          ...this.$route.query
        }
      })
    },
    // 调用封装的请求
   async getInfo(){
      let data = await getOtherInfo[this.activeName]({userId:this.userInfo.userId});
        // 给组件赋值
      console.log(data)
      if(this.activeName === data.flag){
         this.list = data.list;
      }
      
    }

  }
}
</script>

在这里插入图片描述

fans.vue 粉丝页

点击粉丝跳转到别人的粉丝,粉丝页和关注页大致相似。

<template>
  <div class="fans">
		<div class="info-empty" v-if="!info.length">
			<div>
				<p v-if="activeName == 'fans'">还没有被关注哦!多发布菜谱,更容易被找到。</p>
				<p v-if="activeName == 'following'">还没有关注别人哦!可以预览菜谱,找到别人</p>
			</div>
		</div>
		<ul class="fans clearfix">
			<router-link 
			v-for="item in info"
			:key="item._id"
			:to="{name:'space',query:{userId:item.userId}}" 
			tag="li" >
				<a href="javascript:;" class="img">
				<img :src="item.avatar"></a>
				<div class="c">
					<strong class="name">
						<router-link :to="{name:'space',query:{userId:item.userId}}">{{item.name}}</router-link>
					</strong>
					<em class="info"><span>粉丝:</span> {{item.follows_len}}| <span>关注:</span>{{item.following_len}}</em>
					<em class="info" v-if="item.sign">
						<span>简介:{{item.sign}}</span>
						这个人太懒啦!还没有介绍自己
					</em>
				</div>
			</router-link>
		</ul>
	</div>
</template>
<script>
export default {
	props:{
       info:{
		   type:Array,
		   default:()=>[]
	   },
	   activeName:{
		   type:String,
		   default:'fans'
	   }
	}
}
</script>

在这里插入图片描述

menu-list.vue 菜谱页

点击作品到别人发布的菜谱页面。

<template>
  <div class="menu-list">
    <div class="info-empty" v-if="!info.length">
			<div v-if="activeName === 'works'">
				<p>私房菜不要偷偷享用哦~~制作成菜谱与大家分享吧!</p>
        	<a href="">发布菜单</a>
			</div>
		</div>
    <div class="info-empty" v-if="!info.length">
			<div v-if="activeName === 'collection'">
				<p>还没有收藏任何的菜谱,去搜自己喜欢的菜谱,收藏起来吧。</p>
        <a href="">菜谱大全</a>
			</div>
		</div>
    <menu-card :margin-left="13" :info='info'></menu-card>
  </div>
  
</template>
<script>
import MenuCard from '@/components/menu-card.vue'
export default {
  components: {MenuCard},
  props:{
       info:{
		   type:Array,
		   default:()=>[]
	   },
	   activeName:{
		   type:String,
		   default:'works'
	   }
	}
}
</script>


  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-09 16:11:30  更:2021-10-09 16:13:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/18 20:54:16-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码