美食杰项目(六)发布菜谱

news2024/9/20 8:03:23

目录

  • 前言
  • 具体效果
  • 实现的具体功能
  • 代码思路
  • 主要引入的element ui的具体样式
  • 相关代码
  • 总结:

前言

  • 本节给大家讲的是美食杰项目的发布菜谱的主要功能和具体样式,希望我的代码能够帮助到你,也希望你能够看懂

具体效果

在这里插入图片描述

实现的具体功能

按照效果图实现静态页面布局
可以使用element-ui框架
实现上传图片功能
默认为3个可以增加,删除,最少为1个
点击提交,成功发布菜谱

代码思路

主页面完成具体的样式,可以看element ui的具体框架来实现具体样式
根据选项来实现具体口味和烹饪方法
将主料辅料功能实现组件化封装
将上传图片进行组件化封装
将选的具体数据传给接口实现发布菜谱 

主要引入的element ui的具体样式

点击这里跳转到的element ui上传图片的具体样式和使用
点击这里跳转到的element ui中input的具体样式和使用
点击这里跳转到的element ui中select的具体样式和使用

相关代码

由于前面将编辑资料的时候说过上传图片的具体功能和样式,如果想要了解编辑资料可以
点击这里跳转到编辑个人资料页面看上传图片的样式

  • 主页面为总组件发布菜谱的主要功能都在这里面所以代码有点多、主页面的相关代码:
<template>
 <div class="box">
   <p class="title">欢迎发布新菜谱,先介绍一下你的大作</p>
   <div class="top">
     <div class="headline">
       <p>标题</p>
       <input type="text" placeholder="请输入内容" v-model="backData.title" />
     </div>
     <div class="property">
       <p>属性</p>
       <el-select
         v-for="item in property"
         :key="item.parent_type"
         :placeholder="item.parent_name"
         v-model="backData.property[item.title]"
       >
         <el-option
           v-for="option in item.list"
           :key="option.type"
           :label="option.name"
           :value="option.type"
         ></el-option>
       </el-select>
     </div>
     <div class="classify">
       <p>菜谱分类</p>
       <el-select v-model="backData.classify" placeholder="请选择">
         <el-option-group
           v-for="item in classify"
           :key="item.parent_type"
           :label="item.parent_name"
         >
           <el-option
             v-for="option in item.list"
             :key="option.type"
             :label="option.name"
             :value="option.type"
           >
           </el-option>
         </el-option-group>
       </el-select>
     </div>
     <div class="articles">
       <p>成品图(328*440</p>
       <div>
         <upload-img
           action="/api/upload/?type=product"
           class="image"
           v-model="backData.product_pic_url"
           @res-url="(data) => (backData.product_pic_url = data.resImgUrl)"
           :imageUrl="backData.product_pic_url"
         ></upload-img>
         <el-input
           type="textarea"
           :rows="5"
           :cols="500"
           placeholder="请输入内容"
           class="textarea"
           v-model="backData.product_story"
         >
         </el-input>
       </div>
     </div>
   </div>
   <p class="title">记录所有原材料</p>
   <div class="center">
     <div class="one">
       <p>主料</p>
       <Material
         v-model="backData.raw_material.main_material"
         @remove="(item) => (backData.raw_material.main_material = item)"
       ></Material>
     </div>
     <div class="two">
       <p>辅料</p>
       <Material
         v-model="backData.raw_material.accessories_material"
         @remove="
           (item) => (backData.raw_material.accessories_material = item)
         "
       ></Material>
     </div>
   </div>
   <p class="title">开始写步骤了!能否简单易学就看你怎么写了,加油!</p>
   <div class="bottom">
     <div v-for="(item, index) in backData.steps" :key="index">
       <b>{{ index }}.</b>
       <upload-img
         v-model="item.img_url"
         :imageUrl="avatar"
         :imgMaxWidth="184"
         class="image"
         action="/api/upload/?type=step"
         @res-url="
           (data) => (
             (item.img_url = data.resImgUrl), (avatar = data.resImgUrl)
           )
         "
       ></upload-img>
       <el-input
         type="textarea"
         :rows="2"
         placeholder="请输入内容"
         v-model="item.describe"
       >
       </el-input>
       <i
         class="delete-icon el-icon-close"
         v-show="backData.steps.length !== 1"
         @click="remove(index, id)"
       ></i>
     </div>
     <el-button
       class="eaeaea"
       type="primary"
       size="medium"
       icon="el-icon-plus"
       @click="add"
       >增加一项</el-button
     >
     <p>烹饪小技巧</p>
     <el-input
       type="textarea"
       :rows="2"
       placeholder="请输入内容"
       :style="{ height: '150px' }"
       v-model="backData.skill"
     >
     </el-input>
   </div>
   <div class="btn">
     <button @click="submit">搞定,提交审核</button>
   </div>
 </div>
</template>

<script>
import { getProperty, getClassify, publish } from "@/connector/api";
import UploadImg from "@/views/uploadImg/upload_img.vue";
import Material from "@/views/PublishRecipes/material.vue";
// const backData = {
//   //向后端发生的数据
//   title: "",
//   property: {
//     craft: 0, // 工艺 enum: [1,2,3,4],
//     flavor: 0, // 口味  enum: [1,2,3,4],
//     hard: 0, // 难度 enum: [1,2,3,4],
//     pepole: 0, // pepole 人数: [1,2,3,4],
//   },
//   //分类
//   classify: "",
//   //成品图
//   product_pic_url:
//     "https://s1.c.meishij.net/n/images/upload_big_img.png?_=1561906961", // 成品图URL
//   product_story: "", // 成品图故事
//   raw_material: {
//     // 料
//     main_material: [{ name: "", specs: "" }], // 主料
//     accessories_material: [{ name: "", specs: "" }], // 辅料
//   },
//   // steps: [{img_url: '',describe: '',}], // 步骤
//   steps: Array(3)
//     .fill(1)
//     .map(() => ({ ...steps_struct, customeId: this.uuid() })),
//   skill: "", //心得
// };
const material = {
 name: "",
 specs: "",
};
const steps_struct = {
 img_url: "",
 describe: "",
};
export default {
 components: {
   UploadImg,
   Material,
 },
 data() {
   return {
     // 向后端发送的数据
     backData: {
       // 标题
       title: "",
       property: {
         // craft: 0, // 工艺 enum: [1,2,3,4],
         // flavor: 0, // 口味  enum: [1,2,3,4],
         // hard: 0, // 难度 enum: [1,2,3,4],
         // pepole: 0, // pepole 人数: [1,2,3,4],
       },
       classify: "",
       // 成品图
       product_pic_url:
         "https://s1.c.meishij.net/n/images/upload_big_img.png?_=1561906961",
       product_story: "",
       raw_material: {
         //  Array(3):数组长度为3,fill(1):数组的值为1,map:循环添加值
         main_material: Array(3)
           .fill(1)
           .map(() => ({ ...material })), // 主料
         accessories_material: Array(3)
           .fill(1)
           .map(() => ({ ...material })), // 辅料
       },
       steps: Array(3)
         .fill(1)
         .map(() => ({ ...steps_struct })),
       skill: "",
     },
     property: [],
     classify: [],
     avatar: "https://s1.c.meishij.net/n/images/upload_step_img.png",
   };
 },
 mounted() {
   // 获取所有属性分类
   getProperty().then(({ data }) => {
     // console.log(data);
     this.property = data;
   });
   // 获取所有菜谱分类
   getClassify().then(({ data }) => {
     // console.log(data);
     this.classify = data;
   });
 },
 methods: {
   // 点击删除
   remove(index) {
     this.backData.steps.splice(index, 1);
   },
   // 点击添加
   add() {
     this.backData.steps.push({
       img_url: "",
       describe: "",
     });
   },
   // 点击发布新的菜品
   submit() {
     // console.log(this.backData);
     // 发布新菜品的请求头
     publish(this.backData).then((data) => {
       // console.log(data);
       // 发布成功后跳转至首页
       window.location.href = "/";
     });
   },
 },
};
</script>
  • input输入框为主料辅料的具体代码由于他是封装起来的所以单独实现、input输入框的具体代码
<template>
  <div>
    <div class="raw-item" v-for="(item, index) in value" :key="index">
      <el-input
        placeholder="请输入内容"
        style="width: 200px"
        v-model="item.name"
      ></el-input>
      <el-input
        placeholder="请输入内容"
        style="width: 100px"
        v-model="item.specs"
      ></el-input>
      <!-- 只要input不等于1,删除功能就一直显示 -->
      <i
        class="delete-icon el-icon-close"
        v-show="value.length !== 1"
        @click="remove(index, id)"
      ></i>
    </div>
    <el-button
      class="eaeaea"
      type="primary"
      size="medium"
      icon="el-icon-plus"
      @click="add"
      >增加一项</el-button
    >
  </div>
</template>

<script>
export default {
  props: {
    // 接收数据v-model传递数据
    value: {
      type: Array,
      default: () => [],
    },
  },
  methods: {
    // 点击删除
    remove(index) {
      const newValue = this.value.filter((item, i) => {
        // console.log(index, item, i);
        return i !== index;
      });
      //   console.log(newValue);
      this.$emit("remove", newValue);
    },
    add() {
      // 子传父触发数据
      this.$emit("input", [...this.value, { name: "", specs: "" }]);
    },
  },
};
</script>

总结:

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

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

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

相关文章

ASO优化在App Store和Google Play之间的区别

App Store和Google Play这两家应用商店的目的都是&#xff0c;给用户提供平台&#xff0c;让用户们找到自己所需要的APP并下载。那它们具体有哪些区别呢&#xff1f; App Store的关键词更新的前提&#xff0c;必须是提交一个新的应用更新。 1.标题&#xff1a;App Store标题要…

开源的笔记和书签应用Benotes

什么是 Benotes &#xff1f; Benotes 一个开源的自托管笔记和书签网络应用程序。使用 Laravel 和轻量级 Lumen 框架构建&#xff0c;可以作为 PWA 安装并托管在几乎任何地方。同时支持 Markdown 和富文本编辑器。 软件特点&#xff1a; URL 会自动保存图片、标题和描述同时支…

电力系统潮流计算与PowerWorld仿真(牛顿拉夫逊法和高斯赛德尔法)(Matlab实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; ​ &#x1f4cb;&#x1f4cb;&#x1f4cb;本文目录如下&#xff1a;⛳️⛳️⛳️ ​ 目录 1 概述 2 主要任务 3 主要内…

【雷达】基于Matlab模拟海洋监视雷达检测仿真

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

攻防世界 真是阳间题

作者本题所使用工具 打开附件 艾尔登法环正式发售在即&#xff0c;迫不及待的mjj身上好像有蚂蚁在爬&#xff0c;写下了一句谜语&#xff1a; 32073579756415871361224665144251529616546134107283371422717502731249951057470539916408170663523436573989472489382550863584…

Nginx的安装与负载均衡、动静分离的初步使用(Windows)

了解Nginx Nginx的作用&#xff1a; 反向代理 正反向代理是什么&#xff1f; 正向代理&#xff1a;代客户端访问服务端 反向代理&#xff1a;代服务端接收客户端的访问 正反向代理示例&#xff1a; 正向代理&#xff1a;客户端A1、客户端A2...----->正向代理服务器------&…

解决vite不是内部或外部命令,也不是可运行的程序 或批处理文件。

前言 今天是要vite创建vue3.0项目的时候&#xff0c;到了最后一步npm run dev的时候出现了以下错误&#xff1a; ‘vite’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 如下图所示 思考问题 想了半天&#xff0c;调试了很久&#xff0c;本来以为是环境…

Eureka

Eureka介绍 注册中心 &#xff1a; 每个服务都有自己的ip和端口&#xff0c;&#xff0c;一个服务调用另一个服务的时候都需要知道对方的ip&#xff0c;&#xff0c;&#xff0c; Eureka类似 dubbo中的zookeeper Eureka 是 netflix公司提供的一款服务注册中心&#xff0c;&a…

刷爆力扣之非递减序列

刷爆力扣之非递减序列 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&#xff0c;…

电磁场几何和衍射理论的统一

在物理光学中&#xff0c;我们使用麦克斯韦方程组处理电磁场。为了快速求解该方程组&#xff0c;我们将不同的麦克斯韦算子结合在一个非序列场追迹概念中。进一步的&#xff0c;快速物理光学概念的支柱是&#xff1a;&#xff08;1&#xff09;尽可能在k域求解麦克斯韦方程组。…

深入理解Linux网络技术内幕(十一)——帧的传输

文章目录前言传输的开启和关闭设备调度以准备传输队列规则接口qdisc_restart函数dev_queue_xmit函数有队列设备无队列设备处理NET_TX_SOFTIRQ: net_tx_action看门狗定时器前言 “传输”这一术语用于离开系统的帧&#xff0c;也许是因为被系统传送出去&#xff0c;或者是因为被…

火山引擎 DataTester:如何用 A/B 测试做产品增长?

技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 随着如今越来越高的获客成本&#xff0c;用户拉新变得不再容易&#xff1b;而且由于获客成本的增高&#xff0c;让用户留存也变得更加重要。同时&#xff0c;一个产品的…

【C++】list的模拟实现+迭代器的设计思维

目录1.认识STL中的list2.迭代器的设计思维2.1 迭代器的定义2.2 迭代器的底层结构3.list的模拟实现3.1 list的节点3.2 list的迭代器3.3 list类4.list和vector的比较1.认识STL中的list &#x1f4a8;相比于vector简单的连续线性结构&#xff0c;list就稍显复杂了。 &#x1f4a8;…

用细节问题撬动自我进化:首届雪浪算力开发者大赛来了!

12月2日&#xff0c;首届【雪浪算力开发者大赛】在无锡雪浪小镇正式揭幕&#xff0c;并由此开启了新一轮智能制造新生力量的博弈。本次大赛不仅将工业界开发者与创新企业置于聚光灯下&#xff0c;也是雪浪算力中心向社会公众展示其强大计算能力与支撑能力的震撼大秀。 在疫情威…

【关于Spring MVC框架中的@RequestBody】

关于Spring MVC框架中的RequestBody 在Spring MVC框架中&#xff0c;可以在POJO类型的请求参数前添加RequestBody。 当服务器端接收请求参数时&#xff0c;使用了RequestBody注解&#xff0c;客户端提交的请求参数必须是对象格式的&#xff01; 如果客户端提交的请求参数不是…

Vue中使用vue-video-player插件播放本地mp4视频文件

场景 若依前后端分离版手把手教你本地搭建环境并运行项目&#xff1a; 若依前后端分离版手把手教你本地搭建环境并运行项目_霸道流氓气质的博客-CSDN博客_前后端分离项目本地运行 在上面搭建项目的基础上&#xff0c;先实现了播放rtmp视频流 Vue中使用vue-video-player和vi…

Unity Animancer插件(一)基本使用

Animancer是什么&#xff1f;资源商店主页 一、快速播放 我们来通过Animancer实现一个最基本的动画播放效果。 首先创建一个脚本PlayAnimationOnEnable&#xff0c;编写如下代码 public AnimancerComponent animancer; public AnimationClip clip;private void OnEnable() …

pinia 持久化存储

pinia刷新数据持久化解决方案 无论是使用vuex 还是pinia都会面临一个问题&#xff1a;页面刷新&#xff0c;状态数据丢失的问题&#xff1b; 为了解决数据状态持久化问题&#xff0c;可以考虑使用插件 pinia-plugin-persistedstate 目录 安装pinia 并引入使用 npm install pin…

CCES软件如何来对ADI的SHARC DSP进行Flash的编程和烧写

如何做 Flash 烧写并实现脱机运行&#xff0c;其实我在之前的文章里有讲过&#xff0c;就可以用 Visual DSP来做&#xff0c;鼠标 点几下&#xff0c;非常简单。但是很多客户用的是 21569、21565这一类的SHARC DSP&#xff0c;不能再用 VDSP 来做烧写了&#xff0c;所以我想了 …

留学Essay写作怎么积累更多词汇量?

大部分留学生们都会感觉Essay挺难写作的&#xff0c;然而这其实是自身平时积累的不够多。当然&#xff0c;还有其他的正确方法&#xff01;高分的Essay都是平时练习出来的&#xff0c;所以我们需要在平时多注意收集一些相关的写作知识。下面是一些常用的Essay写作词汇&#xff…