从0开始用node.js koa创建博客内容管理篇

71 阅读2分钟

前面的登录注册以及jwt鉴权已完成,现在开始步入正文。 1、首先建momment动态数据表。

image.png

2、成功建表后在Controller目录下创建CommentController.js控制器


const services = require('../services/commentService')
class CommentController {
// 创建评论
  async create(ctx,next){
    // 获取评论内容
    const comment = ctx.request.body;
    // 获取用户id
    const { id } = ctx.user;
    comment.user_id = id;
    // 调用service层创建评论
    const result = await services.create(comment);
    // 返回结果
    ctx.body = result;
  }
  // 回复评论
  async reply(ctx,next){
    // 获取评论内容
    const comment = ctx.request.body;
    // 获取用户id
    const { id } = ctx.user;
    comment.user_id = id;
    // 获取comment_id
    const { comment_id } = ctx.params;
    comment.comment_id = comment_id;
    // 调用service层创建评论
    const result = await services.reply(comment);
    // 返回结果
    ctx.body = result;
  }
  // 删除评论
  async deleteComment(ctx,next){
    // 获取评论id
    const { comment_id } = ctx.params;
    // 获取用户id
    const { id } = ctx.user;
    // 调用service层删除评论
    const result = await services.delete(comment_id,id);
    // 返回结果
    ctx.body = result;
  }
  // 获取评论列表
  async getCommentList(ctx,next){
    // 获取评论id
    const { id } = ctx.params;
    // 调用service层获取评论列表
    const result = await services.getCommentList(id);
    // 返回结果
    ctx.body = result;
  }
}

module.exports = new CommentController();

3、在services目录下的momentService.js写动态逻辑处理层


const pool = require('../app/database') // 引入数据库连接池
const { getDate } = require('../utils/utils') // 引入时间工具函数
// 定义公共变量sql语句
let strsql = `
SELECT
m.id id, m.content content, m.create_time create_time,json_object('id', u.id,'username', u.username) users
FROM moment as m
LEFT JOIN users as u ON m.user_id = u.id
`
// 定义MomentService类
class MomentService {
  // 创建动态
  async create(userId, content){
    const sql = `INSERT INTO moment (content,user_id, create_time) VALUES (?,?,?)`;
    const result = await pool.execute(sql, [content,userId, getDate()]);
    return result;
  }
  // 获取单个动态
  async getMomentById(id) {
    try {
      const sql = `${strsql} WHERE m.id = ?`;
      const result = await pool.execute(sql, [id]);
      return result[0];
    } catch (error) {
      return {
        code: 500,
        msg: '获取动态失败'
      }
    }
    
  }
  // 获取动态列表
  async getMomentList(page, pageSize) {
    const sql = `${strsql} LIMIT ?,?`
    const [result] = await pool.execute(sql, [page, pageSize]);
    return result;
  }
  // 删除和更新相同代码逻辑
  async checkMoment(id, userId) {
    // 先判断是否是自己的动态
    const sqlstr = `SELECT user_id FROM moment WHERE id = ?`;
    const [res] = await pool.execute(sqlstr, [id]);
    if (res.length === 0) {
      return {
        code: 404,
        msg: '动态不存在'
      }
    }
    // 判断是否有权限删除
    if (res[0].user_id!== userId) {
      return {
        code: 403,
        msg: '没有权限删除'
      }
    }
    // 权限验证通过,可以删除
    return {
      code: 200,
      msg: 'ok'
    }
  }
  // 删除动态
  async deleteMoment(id, userId) {
    // 先判断是否有权限删除
    const checkResult = await this.checkMoment(id, userId);
    if (checkResult.code !== 200) {
      return checkResult;
    }
    // 执行删除操作
    const sql = `DELETE FROM moment WHERE id = ?`;
    const result = await pool.execute(sql, [id]);
    return result;
  }
 
}

module.exports =new MomentService(); 

4、在router目录下的创建momentRouter.js路由

const Router = require('koa-router');
const momentRouter = new Router({ prefix: '/moment' });
const {
  createMoment,
  getMoment,
  getMomentList,
  deleteMoment
} = require('../controller/momentController');
const {
  verifyToken
} = require('../middleware/userMiddleware')
momentRouter.post('/create', verifyToken, createMoment);
momentRouter.get('/:id', getMoment);
momentRouter.get('/', getMomentList);
momentRouter.get('/del/:id',verifyToken, deleteMoment);

module.exports = momentRouter;

5.end内容管理篇的增删查已完成。