# 一、基础准备

说明:学习本案例,需要把第二学期-第三季课程:章节2.Egg.js基础 按照老师的课程视频,一步一步听下来敲下来,不要跳课学习!

# ① 安装eggjs项目、postman调试工具、关闭csrf开启跨域

具体先学习完第二学期-第三季课程:章节2.Egg.js基础

npm run dev //让项目跑起来

# ② 配置路由

路由配置 /app/router.js

router.post('/message/create',controller.message.create);

# ③ 控制器代码

/app/controller/message.js

'use strict';

const fs = require('node:fs');
const path = require('node:path');
let querystring = require('querystring');
let crypto = require('crypto');
//自定义IV(16位)、key(密钥(32位的'aes-256-cbc')(24位的'aes-192-cbc'))
const secret = {
    iv: 'IloveYOU@520520!',// 初始化向量(iv)16位
    key: 'a123456789@!*&%bcdef@123456789&&', // 32 位秘钥密钥
}

const Controller = require('egg').Controller;

class MessageController extends Controller {
    //读取所有的留言信息列表
    async list() {
        this.ctx.body = {
            msg: 'ok',
            data: await this.getMessageJson()
        }
    }
    //获取某一条留言数据
    async read() {
        // this.ctx.body = this.ctx.params.id;
        let id = this.ctx.params.id;
        // console.log(typeof id);//string
        //根据id查找对应的留言数据,数组中根据某个条件找元素返回新数组 find方法
        let messageData = await this.getMessageJson();
        let data = messageData.find(item => item.id == id);
        this.ctx.body = {
            msg: 'ok',
            data: data
        }
        //设置状态码
        // this.ctx.status = 200;
    }

    //创建一条信息的留言
    async create() {
        /*
        //post、put、patch 接收参数 ctx.request.body
        // console.log(this.ctx.request);
        console.log(this.ctx.request.body);
        //一般处理流程
        //1.参数验证
        //2.写入数据库
        //3.成功之后给页面反馈
        this.ctx.body = {
            msg:'ok',
            // data:{
            //     username:'林俊杰',
            //     tel:13545858789
            // },
            data:this.ctx.request.body
        };
        */
        this.ctx.body = {
            msg: 'ok',
            data: 'success'
        }
        //留言写入json文件
        let paths = {
            dir: './data',
            file: './data/message.json'
            //   dir:'./Appdata',
            //   file:'./Appdata/data.json'
        }
        let data = this.ctx.request.body;
        await this.addmessage(data, paths);
    }


    //获取留言数据
    async getMessageJson() {
        // console.log(__dirname);//D:\【第二学期第3季】课程代码\myegg\app\controller
        //D:\【第二学期第3季】课程代码\myegg\data\message.json
        // console.log(path.resolve(__dirname,'../../','data/message.json'));
        let data = fs.readFileSync(path.resolve(__dirname, '../../', 'data/message.json'), {
            encoding: 'utf-8'
        });
        // let data = fs.readFileSync('./data/message.json',{
        //     encoding: 'utf-8'
        // });
        // console.log(JSON.parse(data).data);
        return JSON.parse(data).data
    }

    //留言写入json文件
    async addmessage(data, paths) {
        // console.log(querystring.parse(data.toString()));
        //data = querystring.parse(data.toString());
        //对电话号码做一个加密
        // console.log(data);
        data.tel = await this.aesEncrypt(data.tel, secret.key, secret.iv);
        // let _tel = aesDecrypt(data.tel, secret.key, secret.iv);
        // console.log(_tel);
        // console.log(data); return;

        //创建一个文件夹data
        if (!fs.existsSync(paths.dir)) {
            fs.mkdirSync(paths.dir);
        };
        //判断message.json文件是否存在,存在说明之前写入过了,先读一下
        // console.log(fs.existsSync('./data/message.json'));
        let flag = fs.existsSync(paths.file);
        if (flag) {
            //存在先读取一下
            await this.readmessage(paths.file, data)
        } else {
            //不存在,首次直接写
            let ms = data;
            ms.id = 1;
            //加入时间,所在地等等
            ms.timestamp = new Date().getTime();
            // console.log(ms);
            let o = {};
            o.data = [];
            o.data.push(ms);
            o.total = 1;
            o.currentId = 1;
            // console.log(o);
            // console.log(JSON.stringify(o));
            //写入内容,同步异步promise,以及可写流
            await this.writemessage(paths.file, o);

        }
    }

    //存在先读取一下
    async readmessage(path, data) {
        //读取内容,同步异步promise,以及可写流
        fs.readFile(path, {
            flag: 'r',
            encoding: 'utf-8',
        }, (err, oldmessage) => {
            if (err) throw err;
            oldmessage = JSON.parse(oldmessage);
            console.log(oldmessage)
            console.log(data);
            //处理留言数据
            data.id = oldmessage.currentId + 1;
            //加入时间,所在地等等
            data.timestamp = new Date().getTime();
            //大对象
            oldmessage.data.push(data);
            oldmessage.total = oldmessage.data.length;
            oldmessage.currentId = data.id;
            console.log(oldmessage);
            //写入内容,同步异步promise,以及可写流
            this.writemessage(path, oldmessage);

        })
    }

    //写入留言
    async writemessage(path, data) {
        fs.writeFile(path, JSON.stringify(data), (err) => {
            if (err) throw err;
            console.log('写入成功')
        });
    }

    //对称加密
    async aesEncrypt(data, key, iv) {
        // 给定的算法,密钥和初始化向量(iv)创建并返回Cipher对象
        const cipher = crypto.createCipheriv('aes-256-cbc', key, iv)
        // 指定要摘要的原始内容,可以在摘要被输出之前使用多次update方法来添加摘要内容
        // 数据的编码 utf8 返回值的编码 hex
        var crypted = cipher.update(data, 'utf8', 'hex')
        crypted += cipher.final('hex')
        return crypted
    }
    //对称解密
    async aesDecrypt(data, key, iv) {
        // 给定的算法,密钥和初始化向量(iv)创建并返回Cipher对象
        const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv)
        // 数据的编码 hex 返回值的编码 utf8
        var decrypted = decipher.update(data, 'hex', 'utf8')
        decrypted += decipher.final('utf8')
        return decrypted
    }
}

module.exports = MessageController;
更新时间: 2024年1月12日星期五上午10点54分