目录
- 前言:
- 具体实现思路:
- 步骤:
- 1. 展示美食杰菜谱大全效果
- 2. 引入element-ui
- 3. 代码
- 总结:
前言:
本文给大家讲解,美食杰项目中 实现菜品信息页的效果,和具体代码。
具体实现思路:
- 跳转时传递菜品 id
- 根据菜品 id 进行(获取菜品详细信息,获取评论信息,发布评论,收藏/取消收藏)
- 点击收藏,判断是否收藏如果收藏则取消收藏,未收藏则收藏
- 给 input 框输入信息,点击提交发布评论信息
- 提交后的评论信息添加到开头
- 根据效果图进行渲染
步骤:
1. 展示美食杰菜谱大全效果
美食杰菜品信息页
2. 引入element-ui
点击跳转至 element-ui 中 input 输入框使用方法:https://element.eleme.cn/#/zh-CN/component/input
点击跳转至 element-ui 中 button 按钮使用方法:https://element.eleme.cn/#/zh-CN/component/button
3. 代码
菜品信息页中可以引入 element-ui 框架使用,本文引入了 input 输入框方法,button 则使用了原生 js。
当然静态页面其他地方你也可以使用 element-ui 框架或其他框架进行布局。
<template>
<div class="box">
<!-- 个人信息 -->
<div class="header">
<img :src="menuInfo.product_pic_url" class="head" />
<div class="right">
<div class="title">
{{ menuInfo.title }}
<a
href="#"
@click="collect"
:class="{ action: menuInfo.isCollection }"
>
<!-- 判断是否收藏,样式不同 -->
{{ menuInfo.isCollection ? "已收藏" : "未收藏" }}
</a>
</div>
<div class="introduce">
<span
v-for="item in menuInfo.properties_show"
:key="item.parent_type"
>
{{ item.parent_name }}
<br />
<b>{{ item.name }}</b>
</span>
</div>
<div class="message">
<img :src="menuInfo.userInfo.avatar" />
<div class="bottom">
<p class="name">{{ menuInfo.userInfo.name }}</p>
<p>
菜谱:{{ menuInfo.userInfo.work_menus_len }} / 关注:{{
menuInfo.userInfo.following_len
}}
/ 粉丝:{{ menuInfo.userInfo.follows_len }}
</p>
<p class="time">{{ menuInfo.createdAt }}</p>
</div>
</div>
</div>
</div>
<!-- 用料 -->
<div class="seasoning">
<p class="product_story">{{ menuInfo.product_story }}</p>
<p class="title">用料</p>
<div class="flavour">
<p>主料</p>
<span
v-for="item in menuInfo.raw_material.main_material"
:key="item._id"
>
{{ item.name }} {{ item.specs }}
</span>
</div>
<div class="flavour">
<p>辅料</p>
<span
v-for="item in menuInfo.raw_material.accessories_material"
:key="item._id"
>
{{ item.name }} {{ item.specs }}
</span>
</div>
</div>
<!-- 步骤 -->
<div class="practice">
<p class="title">{{ menuInfo.title }}的做法</p>
<li v-for="(item, index) in menuInfo.steps" :key="index">
<i>{{ index + 1 }}.</i>
<img :src="item.img_url" alt="" />
<span>{{ item.describe }}</span>
</li>
<p class="skill">烹饪技巧</p>
<p class="skills">{{ menuInfo.skill }}</p>
</div>
<!-- 评论 -->
<div class="comments">
<p class="title">{{ menuInfo.title }}的讨论</p>
<div class="message">
<img
:src="$store.state.userInfo.avatar"
alt=""
v-if="$store.getters.islogin"
/>
<!-- 判断是否登录,登录显示发布评论,未登录不显示 -->
<p v-if="!$store.getters.islogin">请先登录后,在进行评论</p>
<br />
<el-input
type="textarea"
:rows="5"
:cols="500"
placeholder="请输入内容"
v-model="commentText"
class="textarea"
v-if="$store.getters.islogin"
>
</el-input>
<br />
<button class="btn" v-if="$store.getters.islogin" @click="release">
提交
</button>
</div>
<p class="xian"></p>
<!-- 已发布评论 -->
<ul class="information">
<li v-for="item in comments" :key="item.commentId">
<span class="name">{{ item.userInfo.name }}</span>
<img :src="item.userInfo.avatar" alt="" />
<span class="mes">
<p class="text">{{ item.commentText }}</p>
<p class="time">{{ item.updateAt }}</p>
</span>
</li>
</ul>
</div>
</div>
</template>
<script>
// 收藏,菜谱信息,获取评论信息,提交评论信息
import {
toggleCollection,
menuInfo,
getComments,
postComment,
} from "@/connector/api";
export default {
data() {
return {
// 菜谱信息
menuInfo: [],
// 评论信息
comments: [],
// 发布的内容
commentText: "",
};
},
mounted() {
// 获取进入菜品的 id
const { menuId } = this.$route.query;
// 根据菜品 id 获取菜品信息
menuInfo({ menuId: menuId }).then(({ data }) => {
// console.log(data);
this.menuInfo = data.info;
});
// 根据菜品 id 获取评论信息
getComments({ menuId: menuId }).then(({ data }) => {
// console.log(data.comments);
this.comments = data.comments;
});
},
methods: {
// 收藏
async collect() {
// 获取进入菜品的 id
const { menuId } = this.$route.query;
// 已收藏则取消收藏,未收藏则收藏
const { data } = await toggleCollection({ menuId: menuId });
// 给菜品信息进行更新
this.menuInfo.isCollection = data.isCollection;
},
// 发布
async release() {
// 获取进入菜品的 id
const { menuId } = this.$route.query;
// 根据菜品 id 发布评论
const data = await postComment({
menuId: menuId,
// 发布的内容
commentText: this.commentText,
});
// 添加到开头
this.comments.unshift(data.data.comments);
// 发布成功后发布信息框为空
this.commentText = "";
},
},
};
</script>
<style lang="scss" scoped>
.box {
width: 990px;
margin: 20px auto 0;
.header {
background-color: #fff;
display: flex;
.head {
width: 25%;
height: 350px;
}
.right {
width: 75%;
.title {
display: flex;
justify-content: space-between;
padding: 20px 30px;
border-bottom: 1px solid gainsboro;
font-size: 25px;
a {
font-size: 16px;
padding: 10px 15px;
background-color: red;
border-radius: 10px;
text-decoration: none;
color: #fff;
}
.action {
background-color: gainsboro;
}
}
.introduce {
width: 65%;
display: flex;
flex-wrap: wrap;
span {
width: 50%;
padding: 15px 10px;
display: inline-block;
border-bottom: 1px solid gainsboro;
border-right: 1px solid gainsboro;
font-size: 15px;
b {
color: red;
font-weight: 400;
font-size: 25px;
}
}
}
.message {
display: flex;
img {
width: 50px;
height: 50px;
margin: 25px 0 0 25px;
border-radius: 50%;
}
.bottom {
margin: 25px 0 0 20px;
font-size: 12px;
color: gainsboro;
p {
margin: 0;
padding: 1px 0;
}
.name {
color: red;
}
}
}
}
}
.seasoning {
background-color: #fff;
.product_story {
padding: 10px 20px;
}
.title {
font-size: 20px;
padding: 0 20px 10px;
border-bottom: 1px solid gainsboro;
}
.flavour {
p {
width: 40px;
text-align: center;
padding: 2px 0;
margin-left: 20px;
font-size: 12px;
background-color: rgb(241, 241, 241);
border: 1px solid gray;
}
span {
display: inline-block;
padding: 5px;
font-size: 14px;
margin: 0 0 20px 5px;
border: 1px solid gray;
}
}
}
.practice {
background-color: #fff;
.title {
font-size: 20px;
padding: 20px;
border-bottom: 1px solid gainsboro;
}
li {
list-style: none;
padding: 10px 20px;
i {
color: red;
font-size: 40px;
}
img {
padding: 0 10px;
}
}
.skill {
padding: 10px 20px 20px;
border-bottom: 1px solid gainsboro;
font-size: 20px;
}
.skills {
padding: 10px 0 20px 50px;
}
}
.comments {
background-color: #fff;
padding: 0 20px;
.title {
padding: 20px 0;
font-size: 20px;
border-bottom: 1px solid gainsboro;
}
.message {
width: 70%;
img {
width: 50px;
height: 50px;
}
p {
text-align: center;
margin: 0;
}
.btn {
padding: 10px 20px;
border: none;
background-color: red;
color: #fff;
margin-left: 89.9%;
}
}
.xian {
height: 1px;
background-color: gainsboro;
}
.information {
padding: 0;
li {
margin: 10px 0;
display: flex;
list-style: none;
align-items: center;
color: #333;
img {
width: 70px;
height: 70px;
margin: 0 20px;
}
.mes {
.text {
font-size: 18px;
}
.time {
color: gainsboro;
}
}
}
}
}
}
</style>
总结:
总结:
以上就是 美食杰项目 中 菜品信息的具体实现方法,不懂得也可以在评论区里问我,以后会持续发布一些新的功能,敬请关注。
我的其他文章:https://blog.csdn.net/weixin_62897746?type=blog