在后台管理系统中,数据审核功能是非常常见的需求,比如用户提交的内容、订单信息、配置变更等都需要经过审核才能生效。利用MySQL的特性可以低成本实现一套完整的数据审核流程,不需要额外引入复杂的组件。

核心表结构设计
实现审核功能首先需要设计合理的表结构,通常需要两张核心表,一张是业务数据主表,一张是审核记录表,部分场景也可以将审核状态直接放在业务表中。
业务数据主表
以文章提交审核为例,文章主表结构如下:
CREATE TABLE `article` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(100) NOT NULL COMMENT '文章标题', `content` text NOT NULL COMMENT '文章内容', `author_id` int(11) NOT NULL COMMENT '作者ID', `status` tinyint(1) NOT NULL DEFAULT 0 COMMENT '状态 0待审核 1审核通过 2审核驳回', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章主表';
审核记录表
审核记录表用来存储每一次审核的操作信息,方便后续追溯:
CREATE TABLE `article_audit_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `article_id` int(11) NOT NULL COMMENT '文章ID', `audit_user_id` int(11) NOT NULL COMMENT '审核人ID', `audit_result` tinyint(1) NOT NULL COMMENT '审核结果 1通过 2驳回', `audit_remark` varchar(255) DEFAULT NULL COMMENT '审核备注', `audit_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `idx_article_id` (`article_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='文章审核记录表';
审核流程实现逻辑
完整的审核流程通常包含以下几个步骤:
- 用户提交业务数据,初始状态为待审核
- 审核人员在后台查看待审核数据列表
- 审核人员执行审核操作,选择通过或驳回,填写备注
- 系统更新业务数据状态,同时写入审核记录
查询待审核数据
审核人员登录后台后,首先查询所有待审核的文章:
SELECT id, title, content, author_id, create_time FROM article WHERE status = 0 ORDER BY create_time DESC LIMIT 0, 20;
执行审核操作
审核操作需要同时更新文章状态和写入审核记录,为了保证数据一致性,需要使用事务。以下是审核通过的示例逻辑:
-- 开启事务 START TRANSACTION; -- 更新文章状态为审核通过 UPDATE article SET status = 1 WHERE id = 123 AND status = 0; -- 如果更新影响行数为0,说明文章不存在或者已经审核过,回滚事务 -- 这里可以通过程序判断受影响行数,受影响行数为1则继续 -- 写入审核记录 INSERT INTO article_audit_log (article_id, audit_user_id, audit_result, audit_remark) VALUES (123, 1, 1, '内容合规,审核通过'); -- 提交事务 COMMIT;
如果是审核驳回,只需要修改对应的状态和审核结果即可:
START TRANSACTION; UPDATE article SET status = 2 WHERE id = 123 AND status = 0; INSERT INTO article_audit_log (article_id, audit_user_id, audit_result, audit_remark) VALUES (123, 1, 2, '内容包含违规信息,予以驳回'); COMMIT;
利用触发器简化审核记录写入
如果希望每次审核状态变更时自动写入审核记录,不需要在业务代码中显式插入审核日志,可以使用MySQL触发器实现。首先创建一个存储审核操作信息的临时变量,然后创建触发器:
-- 创建用于存储审核信息的会话变量
SET @audit_user_id = 0;
SET @audit_result = 0;
SET @audit_remark = '';
-- 创建更新文章状态时的触发器
DELIMITER //
CREATE TRIGGER `trg_article_after_update`
AFTER UPDATE ON `article`
FOR EACH ROW
BEGIN
-- 只有当状态从待审核变为其他状态时,才写入审核记录
IF OLD.status = 0 AND NEW.status IN (1,2) THEN
INSERT INTO article_audit_log (article_id, audit_user_id, audit_result, audit_remark)
VALUES (NEW.id, @audit_user_id, @audit_result, @audit_remark);
END IF;
END //
DELIMITER ;
使用触发器后,执行审核操作时只需要先设置会话变量,再更新文章状态即可:
-- 设置审核信息 SET @audit_user_id = 1; SET @audit_result = 1; SET @audit_remark = '自动触发审核通过'; -- 更新文章状态,触发器会自动写入审核记录 UPDATE article SET status = 1 WHERE id = 123 AND status = 0;
注意事项
在实际使用中需要注意以下几点:
- 审核操作必须校验原状态为待审核,避免重复审核
- 涉及状态更新和记录插入的操作尽量使用事务,防止数据不一致
- 如果业务量较大,审核记录表需要合理添加索引,提升查询效率
- 敏感操作的审核记录建议定期备份,满足审计要求
以上方案可以满足大部分中小型后台系统的数据审核需求,开发者可以根据自身业务场景调整表结构和流程逻辑。