Skip to content

❤通知公告模块

1、新建通知公告表

通告模块是我们的标准模块,其他模块都会参考公告模块部分

☞ 这里注意将Node之中的蛇形命名法转为=>驼峰命名法

☞ 搭建一个sql表格来存储公共信息

JS
DROP TABLE IF EXISTS `sys_notice`;
CREATE TABLE `sys_notice` (
  `notice_id` int(0) NOT NULL AUTO_INCREMENT COMMENT '公告ID',
  `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '公告标题',
  `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '公告类型(1通知 2公告)',
  `notice_content` longblob NULL COMMENT '公告内容',
  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)',
  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '创建者',
  `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT '' COMMENT '更新者',
  `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间',
  `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`notice_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '通知公告表' ROW_FORMAT = Dynamic;

2、搭建引入文件

☞ 新建 server => api => noticeRoutes.js

JS
console.log('noticeRoutes.js--公告模块');

☞ app.js之中引入

JS
//引入通知公告路由
const noticeRoutes = require('./server/api/noticeRoutes');

// 公告中心路由
app.use('/api/notice', noticeRoutes);

3、新增接口

JS

const express = require('express');
const router = express.Router();
const connectionPool = require('../db'); // 引入数据库连接池模块
const { addCondition, addDateRangeCondition, addPagination, convertKeysToSnakeCase } = require('../methods.js'); // 引入封装方法

// 新增 POST
router.post('/', (req, res) => {
    const insertSql = 'INSERT INTO sys_notice SET ?'; // 准备 SQL 插入语句
    const {
        noticeTitle,
        noticeType,
        noticeContent,
        status,
        createBy,
        createTime,
        updateBy,
        updateTime,
        remark
    } = req.body;

    // 检查是否缺少必要字段
    if (!noticeTitle || !noticeContent) {
        res.send({
            code: 400,
            data: results,
            message: '请填写必填信息!'
        });
        return
    }

    const postData = convertKeysToSnakeCase({ 
        noticeTitle,
        noticeType,
        noticeContent,
        status,
        createBy,
        createTime,
        updateBy,
        updateTime,
        remark
    });

    console.log(postData,'postData');
    connectionPool.query(insertSql, postData, (error, results, fields) => {
        console.log(results, 'results');
        if (error) {
            res.send({
                code: 500,
                data: results,
                message: '添加失败!'
            });
            return;
        } else {
            res.send({
                code: 200,
                data: results,
                message: '添加成功!'
            });
        }
    });
});

测试一下 欧克

4、查询接口

js
// 分页查询
router.get('/', (req, res) => {

    // notice_title, notice_type, notice_content, status, create_by, create_time, update_by, update_time, remark

    const { notice_title, notice_type, notice_content,pageNum, pageSize } = convertKeysToSnakeCase(req.query);
    let query = `SELECT * FROM sys_notice`;
    // 构建查询条件
    const params = [];
    query = addCondition(query, params, 'notice_title', notice_title);
    query = addCondition(query, params, 'notice_type', notice_type);
    query = addPagination(query, params, pageNum, pageSize); //分页条件
    // console.log('查询条件', query, params);
    // 查询数据库并返回数据
    connectionPool.query(query, params, (error, results) => {
        if (error) {
            res.send({
                code: 500,
                data: results,
                message: '查询失败!'
            });
            return;
        } else {
            let sqltotal = `SELECT COUNT(*) AS total FROM sys_notice;`
            // 查询数据库并返回数据
            connectionPool.query(sqltotal, (errtotal, rows) => {
                let total = rows[0]['total'];
                if (errtotal) {
                    res.send({
                        code: 401,
                        // data: results,
                        message: '查询失败!'
                    });
                    return;
                } else {
                    res.send({
                        total: total,
                        code: 200,
                        data:convertToCamelCase(results),
                        message: '查询成功!',
                    });
                }
            });
        }
    });
});

测试一下 欧克

5、详情接口

JS
// 详情接口
router.get('/:id', (req, res) => {
    // console.log(req.query,'req.query');
    const { id } = convertKeysToSnakeCase(req.params);
    const values = [id];
    let query = 'SELECT * FROM sys_notice WHERE notice_id = ?';
    connectionPool.query(query, values, (err, results) => {
        if (err) {
            // console.error('Error querying database:', err);
            res.status(500).json({ error: 'Internal server error' });
            return;
        }
        res.json({
            code: 200,
            data: results ? convertToCamelCase(results[0]): {},
        });
    });
});

6、更新接口

JS
// 详情接口
router.get('/:id', (req, res) => {
    // console.log(req.query,'req.query');
    const { id } = convertKeysToSnakeCase(req.params);
    const values = [id];
    let query = 'SELECT * FROM sys_notice WHERE notice_id = ?';
    connectionPool.query(query, values, (err, results) => {
        if (err) {
            // console.error('Error querying database:', err);
            res.status(500).json({ error: 'Internal server error' });
            return;
        }
        res.json({
            code: 200,
            data: results ? convertToCamelCase(results[0]): {},
        });
    });
});

7、删除接口

JS
// 删除数据 DELETE请求处理程序  
router.delete('/:ids', (req, res) => {
    const { ids } = req.params;
    
    // 如果ids为空,直接返回400错误
    if (!ids) {
        return res.status(400).json({ success: false, message: '没有提供有效的公告ID' });
    }

    const idArray = ids.split(',').map(id => id.trim()).filter(id => id !== '');  // 去除空格和空字符串
    console.log(idArray, 'idArray');  // 注意:生产环境中应该避免调试输出

    // 如果idArray为空,说明没有有效的ID
    if (idArray.length === 0) {
        return res.status(400).json({ success: false, message: '没有有效的公告ID' });
    }

    const sql = "DELETE FROM sys_notice WHERE notice_id IN (?)";
    connectionPool.query(sql, [idArray], (err, results) => {
        if (err) {
            console.error('Error querying database:', err);
            return res.status(500).json({ success: false, error: 'Internal server error' });
        }

        // 如果没有影响的行数,返回失败消息
        if (results.affectedRows === 0) {
            return res.status(404).json({ success: false, message: '未找到对应的公告或删除失败' });
        }

        // 返回成功消息,包含删除的行数
        res.json({
            code:200,
            success: true,
            message: `${results.affectedRows}个数据已删除`,
        });
    });
});

测试一下,增删改查没问题,欧克!👌

8、规范通知模块

之前我们的通知类型只是简单的模拟成了两种类型的文章,现在我们来规范一下设置成枚举类型,并且设定层级,在我们的不同类型之中进行规范,我们的通知类型有:

也就是把我们的通告信息设置为枚举类型的,并且设定层级,我们的不同类型之中进行规范,我们的通知类型有:

js
ALTER TABLE sys_notice MODIFY 
notice_type 
ENUM('success', 'data', 'chatmsg', 'info', 'danger', 'warn');
js
我们规定:
- success:成功 绿色
- chatmsg:聊天消息 紫色
- info:信息 灰色
- danger:危险 红色
- warn:警告 橙色

Released under the MIT License.