• 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>
  • 相关阅读:
    追踪CPU跑满
    巧用Systemtap注入延迟模拟IO设备抖动
    用户态函数跟踪 (无调试符号)
    C#(同步调用、异步调用、异步回调)
    如何安装Python环境以及为Visual Studio 2012安装Python插件
    [转] FTP主动模式和被动模式的区别
    ORA-12154: TNS: 无法解析指定的连接标识符
    C# Enum,Int,String的互相转换 枚举转换
    2.Maven之(二)Maven生命周期
    1.Maven之(一)Maven是什么
  • 原文地址:https://www.cnblogs.com/hy96/p/11924102.html
Copyright © 2020-2023  润新知