Py学习  »  DATABASE

react+egg+mysql 写一个评论组件(三)

LJ在掘金92468 • 2 年前 • 246 次点击  
阅读 30

react+egg+mysql 写一个评论组件(三)

theme: mk-cute
复制代码

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

前言

前面2节主要介绍前端组件,本次将介绍一下评论组件的后端

前文推荐:react+egg+mysql 写一个评论组件(一)

后端主要采用的egg 数据库插件用的 egg-mysql

后台

数据库配置

Npm install egg-mysql

在config.default.js 里面配置数据库信息

config.mysql = { 
 // database configuration
 client: { 
 // host
 host: 'localhost', 
 // port
 port: '3306', 
 // username
 user: 'root', //数据库用户名
 // password
 password: '123456',  //数据库密码
 // database
 database: 'react_blog',    // 数据库库表名
 charset:'utf8mb4'   //字符集一定要写,否则表情包存储不了 
 }, 
 // load into app, default is open
 app: true, 
 // load into agent, default is close
 agent: false, 
 }; 
复制代码

接口设计

接着在控制层编写接口

const Controller = require('egg').Controller; 
复制代码

后端主要有几个接口

  • 根据文章id获取文章内的所有评论信息
  • 新增一条评论信息

根据id 获取评论信息

文章评论表C表与评论回复P表是2个不同的表

1 首先根据id查询评论表中所有的文章评论内容

2 根据查询出来的评论信息 去匹配 评论回复表中所有的评论信息

3 将查询出来的结果返回给前端

1.查询的评论表 中 还需要查询用户的信息 (用户的昵称 与联系方式)所以需要 2个表联查

       let id = this.ctx.params.id
 let comment = 'SELECT comment.comment_id as comment_id,'+ 
 'comment.article_id as article_id,'+ 
 'comment.content as content,'+ 
 'comment.user_id as userid,'+ 
 'comment.state as state,'+ 
 'comment.likes as likes,'+ 
 'comment.replys as replys,'+ 
 "FROM_UNIXTIME(comment.createtime,'%Y-%m-%d %H:%i:%s' ) as createtime,"+ 
 'user.user_id as user_id,'+ 
 'user.name as name,'+ 
 'user.contact as contact,'+ 
 'user.img_url as img_url '+ 
 'FROM comment LEFT JOIN user on comment.user_id = user.user_id '+ 
 'WHERE comment.article_id='+id
 
 const commentData = await this.app.mysql.query(comment) 
复制代码

2.评论回复表中由于有 评论人id 与被评论人的id 返回给前端的时候 需把评论人的昵称与被评论人的昵称都要返回给前端 所以要对用户表 查2次信息 ,利用写别名的方式查询2次(这里卡了好久 还好问了写后端的同事~哈哈哈哈啊 哈哈哈)

       let replay = 'SELECT reply.comment_id as comment_id,'+ 
 'reply.user_id as user_id,'+ 
 'reply.reply_id as reply_id,'+ 
 'reply.content as content,'+ 
 'reply.likes as likes,'+ 
 'reply.id as id,'+ 
 'reply.article_id as article_id,'+ 
 'reply.state as state,'+ 
 "FROM_UNIXTIME(reply.createtime,'%Y-%m-%d %H:%i:%s' ) as createtime,"+ 
 'u1.user_id as user_id,'+ 
 'u1.name as name,'+ 
 'u1.contact as contact,'+ 
 'u1.img_url as img_url,'+ 
 'u2.user_id as reply_id,'+ 
 'u2.name as Rname,'+ 
 'u2.contact as Rcontact,'+ 
 'u2.img_url as Rimg_url '+ 
 'FROM reply LEFT JOIN user u1 on reply.user_id = u1.user_id LEFT JOIN user u2 on reply.reply_id = u2.user_id '+ 
 'WHERE reply.article_id='+id
 const replayData = await this.app.mysql.query(replay) 
复制代码

3.遍历获取到的文章评论,将评论的所有信息 都放在replays 字段下面 方便前端解析

     const replayData = await this.app.mysql.query(replay) 
 // 根据文章的ID 获取所有的评论 跟用户信息 
 // 根据 评论里面的信息 获取 回复的信息
 let resluts = [] 
 commentData.map(a=>{ 
 let result = [] 
 replayData.map(b=>{ 
 if(a.comment_id == b.comment_id){ 
 result.push(b) 
 } 
 }) 
 a.replys = result
 }) 
 resluts = commentData
 this.ctx.body={ 
 data:resluts   //返回给前端
 } 
复制代码

存在的问题

写着 发现一个问题 就是 我需要拿出 回复评论表的所有信息 然后在去匹配 。数据量大会造成资源的消耗。

等待更新.......

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/118875
 
246 次点击