Appearance
❤通知公告模块
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:警告 橙色