vue之写发表评论思路
后端接口
var express = require('express'); const sql = require('../sql') const Comment = require('../sql/collection/comments') const User = require('../sql/collection/users') const uuid = require('node-uuid'); const utils = require('./../utils'); var router = express.Router(); // 获取评论信息列表 router.get('/', function(req, res, next) { let { proid } = req.query; let arr = [] let comment = [] // 内部包含用户的信息,通过用户id 获取到所有的用户名,对应的相关评论,拼接数据 sql.find(Comment, { proid }, { _id: 0 }).then(data => { comment = data var promises = data.map((item, index) => { return sql.find(User, { userid: item.userid }, { _id: 0 }) }) return Promise.all(promises) }).then(list => { console.log('comment', comment) console.log('list', list) list.map((item,index) => { arr.push({ commentid: comment[index].commentid, username: item[0].username, text: comment[index].text, rating: comment[index].rating, file: comment[index].file, flag: comment[index].flag, time: comment[index].createtime }) }) res.send({ code: '200', data: arr }) }) }); router.post('/add', (req, res, next) => { var now = new Date(); var year = now.getFullYear(); //得到年份 var month = now.getMonth();//得到月份 var date = now.getDate();//得到日期 month = month + 1; if (month < 10) month = "0" + month; if (date < 10) date = "0" + date; var time = ""; time = year + "-" + month + "-" + date; let { userid, rating } = req.body; rating = rating * 1 || 5 let list = JSON.parse(req.body.info) for (let item of list) { item.userid = userid, item.commentid = 'comment_' + uuid.v1() item.rating = rating item.createtime = time } console.log(list) sql.insert(Comment, ...list).then(() => { res.send(utils.commentsuccess) }) }) // router.post('/add',(req, res, next) => { // let { userid, rating } = req.body // rating = rating *1 || 5 // let list = JSON.parse(req.query.) // }) module.exports = router;
sql/collection:
const mongoose = require('../db.js'); // 引入数据库连接模块
const Schema = mongoose.Schema; // 拿到当前数据库相应的集合对象
// 设计用户表的集合
const commentSchema = new Schema({ // 设计用户集合的字段以及数据类型
commentid: {type: String },
userid: { type: String },
proid: { type: String },
text: { type: String }, //评论内容
rating: { type: Number }, //评分
username: {type: String},
num: { type: Number },
price: { type: Number },
proimg: {type: String},
createtime:{ type: String}, // 发布时间
proname: {type: String},
createtime:{ type: String}, // 发布时间
file: {type: String},// 头像信息
flag: {type: String}//好、中、差评
})
module.exports = mongoose.model('Comment', commentSchema);
前端页面:
<template> <div class="box"> <Header> <div slot="center">我的评价</div> <div slot="Icon"></div> <div slot="release" class="release" @click="release(scorelist)">发布</div> </Header> <div class="content"> <ul> <li v-for="item of scorelist[0]" :key="item.proid"> <div class="shopimg"> <img :src="item.proimg" alt=""> <p>{{ item.proname }}</p> </div> <div class="comment"> <p>整体评价 <i class="iconfont icon-haoping" :class="item.flag === 3 ? 'active' : ' '" @click="score(item,3)"></i><span>好评</span> <i class="iconfont icon-zhongping" :class="item.flag === 2 ? 'active' : ' '" @click="score(item,2)"></i><span>中评</span> <i class="iconfont icon-chaping" :class="item.flag === 1 ? 'active' : ' '" @click="score(item,1)"></i><span>差评</span> <input type="hidden" v-model="hidden" > </p> </div> <div class="evacontent"> <van-cell-group :key="item.proid"> <van-field v-model="item.text" rows="2" autosize type="textarea" maxlength="100" placeholder="你觉得产品好用吗?" show-word-limit :name="item.proid" /> </van-cell-group> </div> <div class="upload"> <van-uploader :after-read="afterRead" upload-text="添加照片"/> </div> <div class="anonymous"> <div class="checkbox"> <van-checkbox v-model="checked" checked-color="#ff9000">匿名</van-checkbox> </div> <p>你写的评价将会以匿名的方式展现</p> </div> </li> </ul> </div> </div> </template> <script> import axios from '@/utils/request' import Header from '@/components/Header' import Vue from 'vue' import { Field, Uploader, Checkbox, CheckboxGroup, Rate, Toast, CellGroup } from 'vant' Vue.use(Field) Vue.use(CellGroup) Vue.use(Uploader) Vue.use(Checkbox).use(CheckboxGroup) Vue.use(Rate) Vue.use(Toast) export default { data () { return { name: '', // 每个文本域的单独的id checked: true, scorelist: [], proid: '', message: '', hidden: 1 } }, components: { Header }, created () { axios.get('/order/evaluate?orderid=' + this.$route.query.orderid).then(res => { let arr = [] res.data.data.map(item => { arr.push(item.list) }) this.scorelist = arr console.log(this.scorelist) for (let it of this.scorelist[0]) { console.log(it) it.text = '' it.flag = 3 it.username = localStorage.getItem('username') } }) axios.get('headimg/getimg?userid=' + localStorage.getItem('userid')).then(res => { let headimg = res.data.data[0].file for (let it of this.scorelist[0]) { it.file = headimg } }) }, methods: { afterRead (file) { // 此时可以自行将文件上传至服务器 console.log(file) }, score (obj, index) { obj.flag = index console.log(this.scorelist[0]) console.log(obj) this.hidden = Math.random() }, release (scorelist) { // console.log(scorelist) // let note = [] scorelist[0].map(item => { if (item.text === '') { Toast('请填写内容') } else { console.log(scorelist[0]) // note.push(item.text) let userid = localStorage.getItem('userid') let orderid = this.$route.query.orderid // console.log(userid) // console.log(url) axios.post('/comment/add', { userid, info: JSON.stringify(scorelist[0]) }).then(res => { axios.get('order/updatestatus?orderid=' + orderid + '&status=' + 3).then(res => { this.$router.back() }) }) } }) } } } </script> <style lang="scss"> @import '@/lib/reset.scss'; .box{ @include rect(100%,100%); .release{ color:#d79968;margin-right:2px;font-weight:bold;@include rect(100%,100%); } .content{ @include rect(100%,100%); ul{ @include rect(100%,100%);margin-bottom:.1rem; li{ @include rect(100%,auto);@include background-color(#fff);@include flexbox();@include flex-direction(column);margin:.1rem 0 ; .shopimg{@include flexbox();@include flex-direction();@include align-items(); padding:0 .1rem; img{@include display(block); @include rect(.8rem,.8rem);margin:.05rem .1rem 0 0;border:1px solid #dcdcdc;} p{color:#626262;} } .comment{ @include rect(100%,.5rem);margin-top:.1rem;@include flexbox();@include align-items();border-bottom:1px solid #dcdcdc;padding:0 .1rem; p{ font-size:.18rem;color:#000; i{font-size:.25rem;margin:0 .1rem 0 .25rem;display: inline-block; @include color(#bfbfbf);} .active{@include color(#f23030);} span{font:.12rem/.5rem '';} } } .evacontent{ margin-top:.1rem; @include rect(100%,auto); } .upload{ padding:0 .1rem; @include rect(100%,auto); } .anonymous{ border-top:1px solid #dcdcdc; padding:0 .1rem;@include rect(100%,.5rem); @include flexbox();justify-content: space-between;@include align-items(); .checkbox{} p{font:.14rem/.5rem '';@include color(#bfbfbf);} } } } } } </style>
长风破浪会有时,直挂云帆济沧海