后端接口

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>

vue之写发表评论思路的更多相关文章

  1. 像VUE一样写微信小程序-深入研究wepy框架

    像VUE一样写微信小程序-深入研究wepy框架 微信小程序自发布到如今已经有半年多的时间了,凭借微信平台的强大影响力,越来越多企业加入小程序开发. 小程序于M页比相比,有以下优势: 1.小程序拥有更多 ...

  2. 【干货】分享几个写 demo 的思路

    好久没有动笔,最近发现了一个新的写 demo 的思路,仔细一想,自己仿佛积累了不少写 demo 的思路和想法,总结一下,抛砖引玉. 本文所说 demo 主要分以下三种: 本地 demo 外链 demo ...

  3. 分享几个写 demo 的思路

    好久没有动笔,最近发现了一个新的写 demo 的思路,非常有意思.仔细一想,自己仿佛积累了不少写 demo 的思路和想法,总结一下,抛砖引玉. 本文所说 demo 主要分以下三种: 本地 demo 外 ...

  4. 如何为 Vue 项目写单元测试

    https://www.w3ctech.com/topic/2052 如何为 Vue 项目写单元测试 前端工程 明非 2017-07-18 4685 访问 1 分享 微信分享 译者:明非 链接:htt ...

  5. [课程设计]Sprint Three 回顾与总结&发表评论&团队贡献分

    Sprint Three 回顾与总结&发表评论&团队贡献分 ● 一.回顾与总结 (1)回顾 燃尽图: Sprint计划-流程图: milestones完成情况如下: (2)总结 本次冲 ...

  6. [课程设计]Sprint One 总结&发表评论&团队贡献分

    一.总结 第一次冲刺结束了,总体来说我们团队还是做得不错的,完成了既定的目标,希望接下来还能保持这样的动力,fighting... ● 二.围观其他组并发表评论 ● http://www.cnblog ...

  7. [课程设计]Sprint Two 回顾与总结&发表评论&团队贡献分

    [课程设计]Sprint Two 回顾与总结&发表评论&团队贡献分 ● 一.回顾与总结 (1)回顾 燃尽图: Sprint计划-流程图: milestones完成情况如下: (2)总结 ...

  8. Sprint Three 回顾与总结&发表评论&团队贡献分

    ● 一.回顾与总结 (1)回顾 燃尽图: Sprint计划-流程图: milestones完成情况如下: (2)总结 从sprint one到three,我们团队配合十分默契,互相帮助,虽然遇到了不少 ...

  9. vue教程2-07 微博评论功能

    vue教程2-07 微博评论功能 <!doctype html> <html> <head> <meta charset="utf-8"& ...

  10. 通过JS控制各种元素的点击事件的【时间间隔】,特别适合【发表评论】功能

    1.使用情景模拟:下单(防止用户无脑狂点).支付(防止用户无脑点击支付).发表评论(防止用户无脑点击),当然如果你用了一个提示框进行屏蔽,下面代码可以无视了,右上角谢谢. 2.默写情景比如:比如发表评 ...

随机推荐

  1. JavaScript 取消事件的默认动作

    preventDefault() 方法 Event 对象 定义和用法 取消事件的默认动作. 语法 event.preventDefault() 说明 该方法将通知 Web 浏览器不要执行与事件关联的默 ...

  2. 使用Python实现给企业微信发送allure报告,并实现微信查看

    1.注册企业微信 搜索企业微信直接注册 2.创建应用 3.查看企业id.Secret.应用id.部门id 4.发送代码 import os import jenkins import requests ...

  3. python 创建虚拟环境python –m venv方式

    1.环境准备 1.1.刷新包清单 sudo yum update 1.2.安装SCL实用程序 sudo yum install centos-release-scl 1.3.安装Python 3.6 ...

  4. 代码随想录算法训练营第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    977.有序数组的平方 :https://leetcode.cn/problems/squares-of-a-sorted-array/ 心得:周末再写... public class Solutio ...

  5. vscode 自用插件

    Auto Rename Tag              自动配对标签,一同更改: 这个还是比较推荐吧,需要修改的时候只用改第一个,闭合的那一头自动跟着修改了. Quokka              ...

  6. prometheus 配置数据保留7天时间storage.tsdb.retention.time

    1.修改配置如下: 默认24h添加配置:retention: 168h

  7. 对Java要学东西的认识 (一点点javascript见解)

    JavaScript是一种脚本语言,它采用小程序段的方式实现编程.像其它脚本语言一样,JavaScript同样已是一种解释性语言,它提供了一个易的开发过程.它的基本结构形式与C.C++.VB十分类似. ...

  8. 接口自动化-requests环境安装(import requests模块引用失败问题)

    命名规范,可以避免低级问题 1. 命名最好是英文字符.下划线.数字三个组成. 2.项目(工程)名称.文件包名.模块名称等都应该是用英文开头,不能纯数字,(下划线开头的一般有特殊含义,不懂的话别乱用) ...

  9. 源代码管理工具-Github

    一.实验目的 个人编程:每个开发人员电脑上有自己的代码.硬盘坏了,所有的数据和资料不能找回或是很难复原.安全意识强一些的公司会要求开发人员将代码隔一段时间放到一个集中的计算机上,以日期为文件夹进行备份 ...

  10. Matlab %叁

    ###本章内容十分多 第三章:Variables and Data access Data Types numeric:double.single.int8(16.32.64bit[integer]) ...