美食杰项目 -- 个人主页(四)

news2024/11/18 7:42:27

目录

  • 前言:
  • 具体实现思路:
  • 步骤:
    • 1. 展示美食杰菜谱大全效果
    • 2. 引入element-ui
    • 3. 代码
  • 总结:

前言:

本文给大家讲解,美食杰项目中 实现个人主页的效果,和具体代码。


具体实现思路:

  1. 判断是否是本人,获取用户详情信息
  2. 关注,取消关注
  3. 点击跳转,显示(发布,收藏,粉丝,关注)
  4. 判断是否是跳转页,是则显示内容
  5. 根据示例图进行渲染

步骤:

1. 展示美食杰菜谱大全效果

在这里插入图片描述

美食杰个人主页演示


2. 引入element-ui

点击跳转至 element-ui 中 Tabs 标签页使用方法:https://element.eleme.cn/#/zh-CN/component/tabs


3. 代码

  • 个人主页

跳转至(发布,收藏,粉丝,关注)页可以使用 element-ui 中 Tabs 标签的方法。

<template>
  <div class="box">
    <p class="title">欢迎来到我的美食空间</p>
    <div class="top">
      <div class="left">
        <img :src="userInfo.avatar" alt="" />
      </div>
      <div class="center">
        <p class="one">
          {{ userInfo.name }}
          <!-- v-if="isLogin" 判断是否是本人 -->
          <span
            :class="{ action: userInfo.isFollowing }"
            v-if="isLogin"
            @click="follow"
          >
            {{ userInfo.isFollowing ? "已关注" : "未关注" }}</span
          >
        </p>
        <p class="two">
          个人简介:{{
            userInfo.sign ? userInfo.sign : "这个人比较懒,还没有简介"
          }}
        </p>
        <p class="three">
          {{ userInfo.createdAt }}加入美食杰<router-link
            :to="{ name: 'personal' }"
            v-if="!isLogin"
          >
            | 编辑个人资料</router-link
          >
        </p>
      </div>
      <div class="right">
        <p>
          关注<span>{{ userInfo.following_len }}</span>
        </p>
        <p>
          粉丝<span>{{ userInfo.follows_len }}</span>
        </p>
        <p>
          收藏<span>{{ userInfo.collections_len }}</span>
        </p>
        <p>
          发布菜谱<span>{{ userInfo.work_menus_len }}</span>
        </p>
      </div>
    </div>
    <div class="centers">
      <router-link :to="{ name: 'works', query: { ...$route.query } }"
        >作品</router-link
      >
      <router-link :to="{ name: 'fans', query: { ...$route.query } }"
        >粉丝</router-link
      >
      <router-link :to="{ name: 'following', query: { ...$route.query } }"
        >关注</router-link
      >
      <router-link :to="{ name: 'collection', query: { ...$route.query } }"
        >收藏</router-link
      >
    </div>
    <div class="bottom">
      <!-- 父传子事件 -->
      <router-view :activeName="activeName" :info="list"></router-view>
    </div>
  </div>
</template>

<script>
import {
  userInfo,
  toggleFollowing,
  getMenus,
  collection,
  following,
  fans,
} from "@/connector/api";
// 封装请求接口
const getaxios = {
  async works(params) {
    return (await getMenus(params)).data;
  },
  async collection(params) {
    return (await collection(params)).data;
  },
  async following(params) {
    return (await following(params)).data;
  },
  async fans(params) {
    return (await fans(params)).data;
  },
};
export default {
  data() {
    return {
      // 用户信息
      userInfo: [],
      // 传递参数
      activeName: "works",
      // 是否是本人
      isLogin: "",
      // 用户自己的
      list: [],
      // 用户自己的 用来判断
      queen: {},
    };
  },
  watch: {
    $route: {
      async handler() {
        // 获取query值
        let { userId } = this.$route.query;
        // 请求当前用户数据
        const { data } = await userInfo({ userId: userId });
        // 判断是否是本人如果是则获取本人信息,如果不是则获取用户信息
        this.userInfo = userId ? data : this.$store.state.userInfo;
        // 判断是否是本人
        this.isLogin = userId ? true : false;
        // console.log(this.userInfo);
        // 传递参数
        this.activeName = this.$route.name;
        this.getaxiose();
      },
      immediate: true,
    },
  },
  mounted() {
    // 获取用户信息
    this.userInfo = this.$store.state.userInfo;
    // console.log(this.userInfo);
  },
  methods: {
    // 点击关注
    async follow() {
      const data = await toggleFollowing({
        followUserId: this.userInfo.userId,
      });
      // console.log(data.data);
      // 因为关注后,要更新数据,所以要整体赋值
      this.userInfo = data.data;
    },
    // 获取跳转子组件时需要传递的参数
    getaxiose() {
      (async (activeName) => {
        // 获取跳转子组件时需要传递的参数
        let data = await getaxios[this.activeName]({
          userId: this.userInfo.userId,
        });
        // 根据 activeName 的值进行赋值
        this.queen[activeName] = data.list;
        // console.log(activeName, this.activeName);
        // 判断当前的 activeName 是否等于显示的 activeName
        if (activeName === this.activeName) {
          // 把值赋值给 list
          this.list = this.queen[this.activeName];
        }
        // 判断失败则不赋值,直到判断成立为止
        // console.log(data);
        this.queen = {};
      })(this.activeName);
    },
  },
};
</script>

<style lang="scss" scoped>
.box {
  width: 990px;
  margin: 0 auto;
  .title {
    text-align: center;
    margin: 30px 0;
  }
  .top {
    width: 100%;
    background-color: #fff;
    display: flex;
    position: relative;
    img {
      width: 250px;
      height: 250px;
    }
    .center {
      margin-left: 20px;
      p {
        color: gainsboro;
        font-size: 14px;
        padding: 5px 0;
        margin: 0;
      }
      .one {
        color: #333;
        font-size: 20px;
        margin-top: 20px;
        span {
          display: inline-block;
          position: absolute;
          right: 250px;
          background-color: red;
          padding: 5px 10px;
          border-radius: 5px;
          color: #fff;
        }
        .action {
          background-color: grey;
          color: #333;
        }
      }
      .three {
        a {
          text-decoration: none;
          color: gainsboro;
        }
      }
    }
    .right {
      width: 160px;
      display: flex;
      flex-wrap: wrap;
      position: absolute;
      margin: 20px 20px 0 0;
      right: 0;
      p {
        width: 60px;
        height: 60px;
        border-radius: 30px;
        border: 1px solid #333;
        font-size: 12px;
        margin: 20px 10px;
        text-align: center;
        line-height: 40px;
      }
      span {
        display: block;
        line-height: 10px;
        color: red;
      }
    }
  }
  .centers {
    margin: 30px 0;
    a {
      margin-right: 35px;
      padding-bottom: 10px;
      text-decoration: none;
      color: #333;
      &.router-link-exact-active {
        color: red;
        border-bottom: 1px solid red;
      }
    }
  }
}
</style>

  • 收藏发布页

也可以把发布页和收藏页,分成两个组件来写,在一个组件中需要进行判断,那部分显示,那部分不显示

<template>
  <div class="box">
    <!-- 判断是否有内容 -->
    <div class="info-empty" v-if="!info.length">
      <!-- 判断是否是 发布页 -->
      <div v-if="activeName == 'works'">
        <p>私房菜不要偷偷享用哦~~制作成菜谱与大家分享吧!</p>
        <router-link to="">发布菜单</router-link>
      </div>
    </div>
    <!-- 判断是否是 收藏页 -->
    <div class="info-empty" v-if="!info.length">
      <div v-if="activeName == 'collection'">
        <p>还没有收藏任何的菜谱,去搜自己喜欢的菜谱,收藏起来吧。</p>
        <router-link to="">菜谱大全</router-link>
      </div>
    </div>
    <div v-if="info.length">
      <!-- 使用主页时定义的组件 -->
      <Roll :menus="info" :id="5"></Roll>
    </div>
  </div>
</template>

<script>
import Roll from "@/views/home-page/roll.vue";
export default {
  components: { Roll },
  props: {
    // 接收数据 activeName
    activeName: {
      type: String,
      default: "fans",
    },
    // 渲染至页面的数据
    info: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      info: "",
    };
  },
  mounted() {
    this.info = this.$store.getters.islogin;
  },
};
</script>

<style lang="scss" scoped>
.box {
  width: 100%;
  //   height: 300px;
  background-color: #fff;
  .info-empty {
    width: 100%;
    text-align: center;
    display: block;
    line-height: 80px;
    padding: 0 0 20px 0;
    a {
      text-decoration: none;
      padding: 20px 30px;
      border-radius: 15px;
      background-color: red;
    }
  }
}
</style>

  • 粉丝关注页

也可以把粉丝页和关注页,分成两个组件来写,在一个组件中需要进行判断,那部分显示,那部分不显示

<template>
  <div class="box">
    <!-- 判断是否有信心 -->
    <div v-if="!info.length">
      <!-- 判断是否是 粉丝页 -->
      <p v-if="activeName == 'fans'" class="activeName">
        还没有被关注哦!多发布菜谱,更容易被找到。
      </p>
      <!-- 判断是否是 关注页 -->
      <p v-if="activeName == 'following'" class="activeName">
        还没有关注别人哦!可以预览菜谱,找到别人
      </p>
    </div>
    <ul>
      <!-- 渲染数据 -->
      <li v-for="item in info" :key="item._id">
        <router-link
          :to="{ name: 'MyHomepage', query: { userId: item.userId } }"
        >
          <img :src="item.avatar" alt="" />
        </router-link>
        <div class="title">
          <router-link
            :to="{ name: 'MyHomepage', query: { userId: item.userId } }"
          >
            <p class="name">{{ item.name }}</p>
          </router-link>
          <p class="follows">
            粉丝:{{ item.follows_len }} | 关注:{{ item.following_len }}
          </p>
        </div>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  props: {
    // 接收数据 activeName
    activeName: {
      type: String,
      default: "fans",
    },
    // 渲染至页面的数据
    info: {
      type: Array,
      default: () => [],
    },
  },
  mounted() {
    // console.log(this.activeName);
  },
};
</script>

<style lang="scss" scoped>
.box {
  width: 100%;
  //   height: 300px;
  background-color: #fff;
  .activeName {
    width: 100%;
    text-align: center;
    padding: 100px 0;
  }
  ul {
    li {
      display: flex;
      padding: 10px 0;
      list-style: none;
      img {
        width: 120px;
        height: 120px;
        margin-right: 20px;
      }
      .name {
        color: red;
      }
      a {
        text-decoration: none;
      }
    }
  }
}
</style>

总结:

总结:
以上就是 美食杰项目 中 个人主页的具体实现方法,不懂得也可以在评论区里问我,以后会持续发布一些新的功能,敬请关注。
我的其他文章:https://blog.csdn.net/weixin_62897746?type=blog

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29916.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何复用ijkplayer库实现ffmpeg的功能

ijkplayer库介绍 现在ijkplayer播放器应用的非常广泛&#xff0c;很多播放器基本上都是基于ijkplayer二次迭代开发的&#xff0c;众所周知&#xff0c;ijkplayer是基于ffplay的&#xff0c;所以要使用ijkplayer&#xff0c;就必须使用三个so库。 jeffmonyJeffMonydeMacBook-P…

MySQL Server 和 MySQL Workbench安装

对于开发人员来说&#xff0c;只需要安装 MySQL Server 和 MySQL Workbench 这两个软件&#xff0c;就能满足开发的需要了。 ⚫ MySQL Server&#xff1a;专门用来提供数据存储和服务的软件。 ⚫ MySQL Workbench&#xff1a;可视化的 MySQL 管理工具&#xff0c;通过它&#…

会议信息管理系统SSM记录(四)

目录&#xff1a; &#xff08;1&#xff09;部门管理&#xff1a;查询-添加-删除 &#xff08;2&#xff09;部门管理&#xff1a;修改 &#xff08;1&#xff09;部门管理&#xff1a;查询-添加-删除 在DepartmentController中添加方法&#xff1a; 这里getAllDeps方法上篇…

Charles模拟弱网

Charles模拟弱网&#xff0c;适用PC端和移动端&#xff08;IOS&#xff0f;Android&#xff09; 1.打开Proxy->Throttle Settings&#xff0c;以charles 4.2版本为例 2.出现Throttling的界面 3.预设那里有Charles常用的网络设置模拟的数据&#xff0c;根据需要自己选择即可…

【js学习】闭包理解

闭包原理 js使用的是词法作用域&#xff0c;词法作用域的意味着函数执行使用的是定义函数时生效的变量作用域。即函数执行时&#xff0c;里面的参数访问跟执行函数时的作用域无关。如下代码2所示最后输出的是local scope。 闭包定义&#xff1a;js函数对象的内部状态不仅要包…

神经网络的基本工作原理——机器学习

目录 ​编辑 一、实验内容 二、实验过程 1、算法思想 2、算法原理 3、算法分析 三、源程序代码 四、运行结果及分析 五、实验总结 一、实验内容 掌握神经元细胞的数学模型&#xff1b;理解并掌握神经网络的训练过程&#xff1b;理解并掌握神经网络中的矩阵运算&#xff…

Neo4j入门实战

1.介绍 2.实战 Neo4j的sql语句 1.创建多个节点 CREATE (:student {name:小张,age:20}),(:student {name:彭莎丽,age:18})2.匹配节点将节点删除 这样删除是将student中的条件节点删除——>会变成空白节点 match (m:student {name:"Fairy同学"}) remove m:stu…

Docker数据管理

目录 一、数据卷 二、数据卷容器 三、容器互联 管理 Docker容器中数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09;数据卷容器&#xff08;DataVolumes Containers&#xff09; 一、数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容…

设计模式之美——基于接口编程

抽象类在被继承时体现的是 is-a 关系&#xff0c;接口在被实现时体现的是 can-do 关系 例如&#xff0c;Plane can fly. Bird can fly&#xff0c;应该把 fly 定义成一个接口。 – 参考 《码出自效Java 开发手册》 函数的命名不能暴露任何实现细节。比如&#xff0c; uploadT…

集合类ArrayList的扩容机制详解

ArrayList类的内部对构造方法进行了重载&#xff0c;提供了无参构造和有参构造两种构造方法。在ArrayList类的内部维护了一个elementData数组用来存放添加的对象。(关于transient关键字&#xff1a;该关键字修饰的属性&#xff0c;不会进行串行化、序列化)。 目录 无参构造扩容…

胡编乱造的自我介绍

写在前面&#xff1a;这篇文章的内容纯属胡编乱造 切勿信以为真。 一、 姓&#xff1a;&#xff08;Black) 布莱克 名&#xff1a;&#xff08;Sirius) 天狼星 中间名&#xff1a;(Orion) 奥莱恩 结束&#xff01; 二、于 2022年3月 入读清华大学信息技术系硕士 &#xff01; 结…

harbor 安装

harbor 安装一.离线安装helm1.下载安装包&#xff0c;上传到服务器2.解压4.验证二.安装harbor1.导入 Harbor源2.下载 Harbor Helm目录3.解压缩4.修改 Harbor Values文件5.部署 Harbor6.访问 Harbor7.验证8.修改daemon.json9.登录Harbor、并push镜像验证10.登录Harbor页面验证是…

基站交直流配电多回路无线智能电量采集监控装置

【摘要】介绍了安科瑞两款多回路无线智能电量采集监控装置&#xff0c;可应用于基站的交直流配电监控、低压出线开关柜集中监控、末端配电箱等集成电力参数监测、电能计量、环境温湿度监测以及无线传输的各类应用场景。 【关键词】无线监控&#xff1b;多回路监控&#xff1b;铁…

OpenFeign源码2-Bean注册过程和调用过程

0. 环境 nacos版本&#xff1a;1.4.1Spring Cloud : Hoxton.SR9&#xff08;没用2020.0.2版本后面说明&#xff09;Spring Boot &#xff1a;2.4.4Spring Cloud alibaba: 2.2.5.RELEASESpring Cloud openFeign 2.2.2.RELEASE 测试代码&#xff1a;github.com/hsfxuebao/s… 20…

深入理解java虚拟机:虚拟机类加载机制(1)

文章目录1. 类加载的时机2. 类加载的过程2.1 加载2.2 验证2.3 准备2.4 解析2.5 初始化1. 类加载的时机 类从被加载到虚拟机内存中开始&#xff0c;到卸载出内存为止&#xff0c;它的整个生命周期包括了&#xff1a; 加载&#xff08;Loading&#xff09;验证&#xff08;Verif…

计算机网络-应用层(文件传输协议(FTP协议),电子邮件系统(SMTP协议,MIME,POP3,IMAP协议))

文章目录1. 文件传输协议2. 电子邮件系统1. 文件传输协议 文件传输协议&#xff1a; 文件传送协议FTP&#xff1a;提供不同种类主机系统&#xff08;硬、软件体系等都可以不同&#xff09;之间的文件传输能力。简单文件传送协议TFTP&#xff1a;使用于UDP环境&#xff0c;代码…

MyBatis-Plus入门案例

MybatisPlus&#xff08;简称MP&#xff09;是基于MyBatis框架基础上开发的增强型工具&#xff0c;旨在简化开发、提供效率。 开发方式 基于MyBatis使用MyBatisPlus基于Spring使用MyBatisPlus基于SpringBoot使用MyBatisPlus SpringBoot它能快速构建Spring开发环境用以整合其…

设计模式之美——看似面向对象,实则面向过程

常见的编程范式或者说编程风格有三种&#xff0c;面向过程编程、面向对象编程、函数式编程&#xff0c;而面向对象编程又是这其中最主流的编程范式。现如今&#xff0c;大部分编程语言都是面向对象编程语言&#xff0c;大部分软件都是基于面向对象编程这种编程范式来开发的。 …

《Redis设计与实现》笔记

第二章&#xff1a;简单动态字符串 1.Redis没有直接使用C语言传统的字符串表示(以空字符结尾的字符数组,以下简称C字符串),而是自己构建了一种名为简单动态字符串( simple dynamic string,SDS)的抽象类型,并将SDS用作 Redis的默认字符串表示。 Redis里面,C字符串只会作为字符串…

操作系统第三章习题及答案(汤子瀛第四版)

第三章 1&#xff0e;高级调度与低级调度的主要任务是什么&#xff1f;为什么要引入中级调度&#xff1f; 答&#xff1a;高级调度的主要任务是根据某种算法&#xff0c;把外存上处于后备队列中的那些作业调入内存。低级调度是保存处理机的现场信息&#xff0c;按某种算法先取…