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>
vue之写发表评论思路的更多相关文章
- 像VUE一样写微信小程序-深入研究wepy框架
像VUE一样写微信小程序-深入研究wepy框架 微信小程序自发布到如今已经有半年多的时间了,凭借微信平台的强大影响力,越来越多企业加入小程序开发. 小程序于M页比相比,有以下优势: 1.小程序拥有更多 ...
- 【干货】分享几个写 demo 的思路
好久没有动笔,最近发现了一个新的写 demo 的思路,仔细一想,自己仿佛积累了不少写 demo 的思路和想法,总结一下,抛砖引玉. 本文所说 demo 主要分以下三种: 本地 demo 外链 demo ...
- 分享几个写 demo 的思路
好久没有动笔,最近发现了一个新的写 demo 的思路,非常有意思.仔细一想,自己仿佛积累了不少写 demo 的思路和想法,总结一下,抛砖引玉. 本文所说 demo 主要分以下三种: 本地 demo 外 ...
- 如何为 Vue 项目写单元测试
https://www.w3ctech.com/topic/2052 如何为 Vue 项目写单元测试 前端工程 明非 2017-07-18 4685 访问 1 分享 微信分享 译者:明非 链接:htt ...
- [课程设计]Sprint Three 回顾与总结&发表评论&团队贡献分
Sprint Three 回顾与总结&发表评论&团队贡献分 ● 一.回顾与总结 (1)回顾 燃尽图: Sprint计划-流程图: milestones完成情况如下: (2)总结 本次冲 ...
- [课程设计]Sprint One 总结&发表评论&团队贡献分
一.总结 第一次冲刺结束了,总体来说我们团队还是做得不错的,完成了既定的目标,希望接下来还能保持这样的动力,fighting... ● 二.围观其他组并发表评论 ● http://www.cnblog ...
- [课程设计]Sprint Two 回顾与总结&发表评论&团队贡献分
[课程设计]Sprint Two 回顾与总结&发表评论&团队贡献分 ● 一.回顾与总结 (1)回顾 燃尽图: Sprint计划-流程图: milestones完成情况如下: (2)总结 ...
- Sprint Three 回顾与总结&发表评论&团队贡献分
● 一.回顾与总结 (1)回顾 燃尽图: Sprint计划-流程图: milestones完成情况如下: (2)总结 从sprint one到three,我们团队配合十分默契,互相帮助,虽然遇到了不少 ...
- vue教程2-07 微博评论功能
vue教程2-07 微博评论功能 <!doctype html> <html> <head> <meta charset="utf-8"& ...
- 通过JS控制各种元素的点击事件的【时间间隔】,特别适合【发表评论】功能
1.使用情景模拟:下单(防止用户无脑狂点).支付(防止用户无脑点击支付).发表评论(防止用户无脑点击),当然如果你用了一个提示框进行屏蔽,下面代码可以无视了,右上角谢谢. 2.默写情景比如:比如发表评 ...
随机推荐
- 搭建react项目
1.打开新建的项目空文件夹,终端输入命令:npm init,文件夹生成package.json文件: 2.安装webpack.webpack-cli和cross-env:npm install web ...
- vue 封装时间格式化和number精确度
//format.js 公用js /** * Parse the time to string * @param {(Object|string|number)} time * @param {str ...
- 【python_PAT_乙类】1007_素数对猜想 ,Python运行超时解决方案
题目: 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数."素数对猜想"认为& ...
- Debug --> 使用USTC-TK2016工具对USTC-TFC2016数据集进行处理
文件介绍: https://blog.csdn.net/u010916338/article/details/86511009?spm=1001.2101.3001.6661.1&utm_me ...
- vue 同一个子组件,两次赋值不同,dom不更新
转自:https://blog.csdn.net/WO_JIAMIFENG/article/details/115250918 <div :key="inputkey"> ...
- 弹框tabel树
<template> <div> <el-dialog :title="title" :visible.sync="dialogVisibl ...
- egret tween 屏幕震动动画 ts
let orig = { x: this.x, y: this.y }; var dir = 1; var tox = 0; var toy = 0; var count = 40; // if (n ...
- Spring校验:@Validated和@Valid区别
结论: Spring validation验证框架对入参实体进行嵌套验证必须在相应属性(字段)加上@Valid而不是@Validated Spring Validation验证框架对参数的验证机制提供 ...
- python C# DES 加密转换
import time import base64 import pyDes import binascii def DESEncrypt(desKey, target): key = desKey[ ...
- 【Rust入门】(一)构建自己的第一个Rust项目
安装Rust 参考文档,指定安装目录和镜像配置. rustc --version 检查是否安装成功. 构建程序 使用rustc编译运行 rustc 编译:rustc main.js 运行: Windo ...