美食杰项目(七)菜谱大全

news2024/9/23 13:30:38

本文目录

  • 前言:
  • 1.具体样式
  • 2.实现的具体功能和代码思路
  • 3.element ui具体样式的网址
  • 4.相关代码
  • 5.总结:

前言:

  • 本文给大家讲的是美食杰项目中菜谱大全项目的具体样式,代码思路和具体代码,希望能帮助到你

1.具体样式

在这里插入图片描述

2.实现的具体功能和代码思路

1.头部:根据tab切换筛选点击哪个选中哪个,并将其筛选结果传进路由,根据传进路由的数据进行筛选渲染
tab切换的具体样式是根据element ui里面的具体代码实现
2.左侧:左侧也是筛选条件,点击哪个选中那个并将数据传进路由,根据传进路由的数据进行筛选渲染,具体
样式也是element ui里面的代码实现的
3.右侧:右侧是跟剧筛选数据传给接口接口返回给我的数据,具体样式是根据封装的组件来实现的
并且伴有加载样式也是element ui里面的具体代码
4.右下角:具体样式是根据element ui里面的相关代码实现的,具体功能的实现element ui官网讲解的也很详细

3.element ui具体样式的网址

  • 头部:tab切换 https://element.eleme.cn/#/zh-CN/component/tabs
  • 左侧:Collapse折叠 https://element.eleme.cn/#/zh-CN/component/collapse
  • 加载:loading https://element.eleme.cn/#/zh-CN/component/loading
  • 右下角 :分页 https://element.eleme.cn/#/zh-CN/component/pagination

4.相关代码

<template>
  <div class="box">
    <!-- top -->
    <el-tabs
      v-model="classifyName"
      type="card"
      @tab-click="handleClick"
      class="el-tabs"
    >
      <el-tab-pane
        v-for="item in list"
        :key="item.parent_type"
        :label="item.parent_name"
        :name="item.parent_type"
        class="el-tab-pane"
      >
        <div>
          <router-link
            v-for="option in item.list"
            :key="option.type"
            :to="{
              query: { ...$route.query, classify: option.type, page: 1 },
            }"
            :class="{ active: option.type === classifyType }"
            >{{ option.name }}</router-link
          >
        </div>
      </el-tab-pane>
    </el-tabs>
    <!-- left -->
    <p class="title">家常好味道,给你家一般的温暖</p>
    <div class="left">
      <el-collapse v-model="activeNames">
        <h4>筛选</h4>
        <el-collapse-item
          v-for="item in property"
          :key="item.parent_type"
          :title="item.parent_name"
          :name="item.parent_type"
        >
          <div>
            <span
              type="info"
              v-for="option in item.list"
              :key="option.type"
              :class="{ active: activeType[option.title] == option.type }"
              @click="selectedTag(option)"
              >{{ option.name }}</span
            >
          </div>
        </el-collapse-item>
      </el-collapse>
    </div>

    <div class="right roll">
      <div class="menu-empty" v-show="loading">
        暂时没有过滤出菜谱信息,请选择其他的筛选条件
      </div>
      <Roll :menus="menus" :id="170"></Roll>
    </div>
    <div class="block">
      <el-pagination
        layout="total,prev, pager, next"
        :total="total"
        :page-size="page_size"
        :current-page.sync="page"
        @size-change="handleCurrentChange"
        @current-change="handleCurrentChange"
        @prev-click="handleCurrentChange"
        @next-click="handleCurrentChange"
        hide-on-single-page="true"
      >
      </el-pagination>
    </div>
  </div>
</template>

<script>
import Roll from "@/views/home-page/roll.vue";
import { getClassify, getProperty, getMenus } from "@/connector/api";
export default {
  components: {
    Roll,
  },
  data() {
    return {
      // top
      // 存储分类中的所有数据
      list: [],
      // 定义刷新tab时的值(一级路由)
      classifyName: 1,
      // tab切换的选中项(二级路由),里面存的谁,谁就是点击项让谁发生改变
      classifyType: "1-1",

      // 存储属性的分类,例如:{craft:1-4,flavor=2-1}
      activeNames: [],
      // 记录所有的属性分类
      activeType: {},
      // 存储属性中的所有数据
      property: [],

      // 存储右侧主体
      menus: [],
      // 每页显示几个
      page_size: 0,
      // 总页数
      total: 0,
      // 页数
      page: 0,
      // 遮罩层
      loading: false,
    };
  },
  // 监听事件
  watch: {
    // 路由改变时执行
    $route: {
      handler() {
        // 获取路由 query 参数里的 classify
        const { classify } = this.$route.query;
        // console.log(classify[0]);
        // 判断是否有内容
        if (classify) {
          // 有则把 classify 的值赋值给 classifyType ,第一个值赋值给 classifyName
          this.classifyName = classify[0];
          this.classifyType = classify;
          // 调用 getMenus 获取符合条件的菜谱
          this.getMenus();
          // 调用 getClassify 获取所有菜谱分类
          this.getClassify();
        }
      },
      immediate: true,
    },
  },
  // 进入当前页面时执行
  mounted() {
    // 给 url 地址添加 query 参数
    this.$router.push({
      query: {
        // 留存
        ...this.$route.query,
        classify: "1-1",
        // 如果有值则显示,没有则为 1
        page: this.page || 1,
      },
    });
    // 获取所有属性分类
    getProperty().then(({ data }) => {
      // console.log(data);
      this.property = data;
      // 获取所有 query 参数
      const { query } = this.$route;
      // reduce 用来迭代一个数组,并且把它累积到一个值中
      this.activeType = this.property.reduce((o, item) => {
        // 判断所有属性在 query 中是否存在,存在则赋值,不存在则为空
        o[item.title] = query[item.title] ? query[item.title] : "";
        // 判断是否为空
        if (o[item.title]) {
          // 不为空则添加至 activeNames
          this.activeNames.push(o[item.title][0]);
        }
        // 把值返回给 activeType
        return o;
      }, {});
    });
  },
  // 触发时执行
  methods: {
    // 获取所有菜谱分类
    getClassify() {
      getClassify().then(({ data }) => {
        this.list = data;
        // console.log(...this.$route.query);
      });
    },
    // 点击头部(一级路由)时触发
    handleClick(tab, event) {
      // console.log(tab.name, event);
      // tab.name 值为第几个(下标)
      this.classifyName = Number(tab.name);
      this.classifyType = tab.name + "-1";
      // 改变 query 参数
      // 点击(一级路由)第几个,则选中(二级路由)第一个
      this.$router.push({
        ...this.$route.query,
        query: {
          classify: tab.name + "-1",
          page: 1,
        },
      });
    },
    // 点击左侧筛选(二级路由)
    selectedTag(option) {
      // option 点击的具体信息
      // 获取路由中所有 query 参数
      let query = { ...this.$route.query };
      // 判断该属性是否选中
      if (this.activeType[option.title] == option.type) {
        // 选中则取消选中
        this.activeType[option.title] = "";
        delete query[option.title];
      } else {
        // 否则选中
        this.activeType[option.title] = option.type;
        query[option.title] = option.type;
      }
      // 路由也跟着改变
      this.$router.push({
        query,
      });
    },
    // 获取右侧数据
    getMenus() {
      // 获取路由中所有 query 参数
      const query = { ...this.$route.query };
      // 新建一个对象
      const param = {
        // 存在则使用,不存在则为一
        page: query.page || 1,
        classify: query.classify,
      };
      // 让 page 的值,跟随 query 中 page 的值
      this.page = query.page;
      // 删除 page 和 classify
      delete query.page;
      delete query.classify;
      // 判断是否还有值
      if (Object.keys(query).length) {
        // 有则添加到 param.property
        param.property = {
          ...query,
        };
      }
      // 打开遮罩层
      this.loading = true;
      // 声明一个变量为空
      let loading = null;
      // 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM
      this.$nextTick(() => {
        // element-ui 里的遮罩层
        loading = this.$loading({
          target: ".roll",
          text: "Loading...",
          spinner: "el-icon-loading",
          background: "rgba(0, 0, 0, 0.8)",
        });
      });
      // 防止数据重复,list 为空
      this.list = [];
      // console.log(param.property);
      getMenus(param).then(({ data }) => {
        // console.log(data);
        // 所有菜谱的属性
        this.menus = data.list;
        // 总数
        this.total = data.total;
        // 一页多少个
        this.page_size = data.page_size;
        // 第几页
        this.page = data.current_page;
        // 关闭遮罩层
        loading.close();
        // 判断是否有值
        if (data.list.length) {
          // 有的话关闭遮罩层
          this.loading = false;
        }
      });
    },
    // 点击页数时执行
    handleCurrentChange(val) {
      // val:点击的页码
      // console.log({ ...this.$route.query });
      // 改变 query 中的页数
      this.$router.push({
        query: {
          ...this.$route.query,
          page: val,
        },
      });
    },
  },
};
</script>

5.总结:

以上就是 美食杰项目 中 发布菜谱页的具体实现方法,不懂得也可以在评论区里问我或私聊我询问,以后会持续发布一些新的功能,敬请关注。
我的其他文章

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

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

相关文章

Zabbix6.0使用教程 (一)—zabbix新增功能介绍1

使用zabbix的小伙伴应该都有关注到目前zabbix的大版本已经更新到了6.0&#xff0c;后面乐乐将会对如何使用zabbix6.0做一个使用教程的系列&#xff0c;大家可以持续关注&#xff0c;这篇我们主要聊聊zabbix6.0新增的一些功能介绍。 一、Zabbix server 的高可用集群 新版本附带…

Hadoop Windows10 安裝

安裝Hadoop之前&#xff0c;我们先需要安装JDK&#xff0c;JDK的安装我就不多说了 一、安装JDK 1、到Oracle的官网中下载jdk&#xff0c;然后解压到一个指定的文件夹&#xff0c;如&#xff1a;D:\Program Files\Java\jdk-15.0.1 2、配置环境变量&#xff1a;在我的电脑中的高…

SCRM是什么,SCRM和CRM区别?

要想知道什么是SCRM&#xff1f;首先必须清楚SCRM和CRM的区别。 1、定义不同 CRM全称&#xff1a;Customer Relationship Management&#xff0c;中文叫“客户关系管理”&#xff0c;是指社会化客户关系管理。CRM一词流行至今已有20余年&#xff0c;是企业管理系统中专门针对客…

【MySQL】第01章_数据库概述

目录第01章_数据库概述1.为什么要使用数据库2.数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系3.MySQL介绍3.1 概述3.2 关于MySQL 8.04. RDBMS 与 非RDBMS4.1 关系型数据库(RDBMS)4.1.1 实质4.1.2 优势4.2 非关系型数据库(非RDBMS)4.2.1 介绍4.2.…

什么是JDBC?JDBC程序的具体实现步骤

什么是JDBC?JDBC程序的具体实现步骤JDBC的全称是Java数据库连接&#xff08;Java Database Connectivity)&#xff0c;它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系数据库&#xff0c;并使用SQL语句来完成对数据库中数据的查询、更新和删除等操作。应…

2-2-3-5-3、SynchronousQueue详解

简介 SynchronousQueue是一个没有数据缓冲的BlockingQueue&#xff0c;生产者线程对其的插入操作put必须等待消费者的移除操作take 如图所示&#xff0c;SynchronousQueue 最大的不同之处在于&#xff0c;它的容量为 0&#xff0c;所以没有一个地方来暂存元素&#xff0c;导…

排序算法-计数排序、桶排序、基数排序

计数排序、桶排序、基数排序 这三种排序算法都利用了桶的概念&#xff0c;都属于用空间换时间的算法。但对桶的使用方法上有明显差异&#xff1a; 计数排序&#xff1a;每个桶只存储单一键值&#xff1b;桶排序&#xff1a;每个桶存储一定范围的数值&#xff1b;基数排序&…

Linux网络基础(基础概念)

Linux网络基础(基础概念) 文章目录Linux网络基础(基础概念)1.计算机网络的发展过程1.1 独立模式1.2 网络互联模式1.3 局域网 LAN1.4 广域网 WAN2.计算机网络协议2.1 协议的概念2.2 什么是网络协议2.3 什么是网络协议簇2.4 OSI 七层模型2.5 TCP/IP 五层模型3.网络传输基本流程3.…

3M EDI 855 采购订单确认报文详解

3M公司&#xff0c;全称明尼苏达矿业及机器制造公司。它于1902年成立&#xff0c;总部现位于美国明尼苏达州首府圣保罗市&#xff0c;为世界著名的多元化跨国企业&#xff0c;并且是道琼斯30种工业成分指数股票之一。 3M为管理其庞大的供应链建立了EDI&#xff08;Electronic D…

微信小程序|使用小程序制作一个马赛克处理工具

此文主要使用微信小程序制作一个马赛克处理工具&#xff0c;这个场景在生活中也非常常见&#xff0c;例如新闻之类有些视频或者图片不想给大众展示就会将其和谐掉&#xff0c;这就是马赛克应用。 开发步骤创建小程序功能开发实现API接口响应开发步骤 创建小程序 准备百度以及微…

[附源码]Python计算机毕业设计Django医疗器械公司公告管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

2022年11月份中国最具影响力的50位钧瓷匠人排行榜

讲好钧瓷产业的故事 有深度的故事&#xff0c;有温度的内容 有态度的文字&#xff0c;有立场的思考 版权声明:钧瓷内参独家发布&#xff0c;侵权必究 第320期 钧瓷内参 2022年12月1日 低代码——钧瓷企业数字化转型的核心引擎 2022年11月…

百趣代谢组学分享,肠道神奇细菌竟能调控体重,减肥有望“吃出来”

​代谢组学分享&#xff0c;上海交通大学附属瑞金医院宁光院士团队在Nature Medicine在线发布中国人肥胖的肠道菌群的较新研究&#xff0c;发现一系列丰度显著异于正常体重人群的肠道共生菌&#xff0c;其中多形拟杆菌&#xff08;BT菌&#xff09;口服可降低小鼠血清谷氨酸浓度…

java计算机毕业设计ssm校园安全随手拍系统wc38l(附源码、数据库)

java计算机毕业设计ssm校园安全随手拍系统wc38l&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xf…

港科夜闻|香港科大张利民教授荣获2023年度美国土木工程师学会派克奖(Ralph B. Peck Award)...

关注并星标每周阅读港科夜闻建立新视野 开启新思维1、香港科大张利民教授荣获2023年度美国土木工程师学会派克奖(Ralph B. Peck Award)。张利民教授因在岩土多灾害风险评估、基于风险的工程设计和应急决策等领域的杰出贡献&#xff0c;荣获 2023年度美国土木工程师学会派克奖&a…

如何在 Spring Boot 项目中使用 Thymeleaf 和 Bootstrap 实现文件上传

在本教程中&#xff0c;我将向您展示如何在 Spring Boot 项目中使用 Thymeleaf 和 Bootstrap 实现文件上传。我们还使用 Spring Web MultipartFile界面来处理 HTTP 多部分请求。 Thymeleaf 文件上传概述 我们的 Spring Boot Thymeleaf 文件上传示例将具有以下功能&#xff1…

MongoDB的简介及安装配置

文章目录1、什么是MongoDB2、下载3、安装4、配置5、启动拓展&#xff08;mongo不是内部或外部命令&#xff09;1、什么是MongoDB MongoDB是一个基于分布式文件存储 [1] 的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据…

Matlab基于KD树的离散点密度特征提取—点云处理及可视化第4期

在之前的文章中&#xff0c;分享了Matlab基于KD树的邻域点搜索方法&#xff1a; 在此基础上&#xff0c;进一步分享一下基于KD树的离散点密度特征提取方法。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;《Matlab点云处理及可视化》系列文章整理自作者博士期间的部分…

汇编语言与微机原理 期末半开卷复习整理(下)

输入输出 8086采用I/O端口独立编址 in AL/AX,imm8/DX out imm8/DX,AL/AX 大于0FFH的端口只能存在DX 读外设(查询) status:in al,dxtest al,80H;//测标志位jz statusmov dx,100hin al,dx写外设&#xff08;查询&#xff09; status:mov dx,102Hin al,dxtest al,80Hjnz status…

Qt实现跨平台窗口选择功能

Qt实现跨平台获取鼠标位置窗口大小功能 文章目录Qt实现跨平台获取鼠标位置窗口大小功能1、概述2、实现效果3、实现原理4、关键代码5、源代码更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;Qt自定义模块、工具&#x1f448; 1、概述 Qt版本&#xff1a…