Commit 27e1fe4468b9c87cb47fd7e51370a37ededcc545

Authored by 芋道源码
Committed by Gitee
2 parents b8d4c374 49a386d7

!23 错误码

Merge pull request !23 from dylan/feature/errorcode
Showing 43 changed files with 1995 additions and 22 deletions
README.md
... ... @@ -37,7 +37,8 @@
37 37 | | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 |
38 38 | 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、云片等主流短信平台 |
39 39 | 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 |
40   -| | 登录日志 | 系统登录日志记录查询包含登录异常 |
  40 +| | 登录日志 | 系统登录日志记录查询,包含登录异常 |
  41 +| 🚀 | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务 |
41 42 | | 通知公告 | 系统通知公告信息发布维护 |
42 43  
43 44 计划新增功能:
... ... @@ -53,7 +54,7 @@
53 54 | 🚀 | 文件服务 | 支持本地文件存储,同时支持兼容 Amazon S3 协议的云服务、开源组件 |
54 55 | 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 |
55 56 | | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 |
56   -| | Redis 监控 |监控 Redis 数据库的使用情况,使用的 Redis Key 管理 |
  57 +| | Redis 监控 |监控 Redis 数据库的使用情况,使用的 Redis Key 管理 |
57 58 | 🚀 |Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 |
58 59 | 🚀 | 链路追踪 | 基于 SkyWalking 实现性能监控,特别是链路的追踪 |
59 60 | 🚀 | 分布式锁 | 基于 Redis 实现分布式锁,满足并发场景 |
... ... @@ -64,7 +65,6 @@
64 65  
65 66 计划新增:
66 67 * 工作流
67   -* 错误码
68 68  
69 69 ### 研发工具
70 70  
... ...
ruoyi-ui/src/api/system/errorCode.js 0 → 100644
  1 +import request from '@/utils/request'
  2 +
  3 +// 创建错误码
  4 +export function createErrorCode(data) {
  5 + return request({
  6 + url: '/system/error-code/create',
  7 + method: 'post',
  8 + data: data
  9 + })
  10 +}
  11 +
  12 +// 更新错误码
  13 +export function updateErrorCode(data) {
  14 + return request({
  15 + url: '/system/error-code/update',
  16 + method: 'put',
  17 + data: data
  18 + })
  19 +}
  20 +
  21 +// 删除错误码
  22 +export function deleteErrorCode(id) {
  23 + return request({
  24 + url: '/system/error-code/delete?id=' + id,
  25 + method: 'delete'
  26 + })
  27 +}
  28 +
  29 +// 获得错误码
  30 +export function getErrorCode(id) {
  31 + return request({
  32 + url: '/system/error-code/get?id=' + id,
  33 + method: 'get'
  34 + })
  35 +}
  36 +
  37 +// 获得错误码分页
  38 +export function getErrorCodePage(query) {
  39 + return request({
  40 + url: '/system/error-code/page',
  41 + method: 'get',
  42 + params: query
  43 + })
  44 +}
  45 +
  46 +// 导出错误码 Excel
  47 +export function exportErrorCodeExcel(query) {
  48 + return request({
  49 + url: '/system/error-code/export-excel',
  50 + method: 'get',
  51 + params: query,
  52 + responseType: 'blob'
  53 + })
  54 +}
... ...
ruoyi-ui/src/utils/dict.js
... ... @@ -21,6 +21,7 @@ export const DICT_TYPE = {
21 21 SYS_SMS_TEMPLATE_TYPE: 'sys_sms_template_type',
22 22 SYS_SMS_SEND_STATUS: 'sys_sms_send_status',
23 23 SYS_SMS_RECEIVE_STATUS: 'sys_sms_receive_status',
  24 + SYS_ERROR_CODE_TYPE: 'sys_error_code_type',
24 25  
25 26 INF_REDIS_TIMEOUT_TYPE: 'inf_redis_timeout_type',
26 27 INF_JOB_STATUS: 'inf_job_status',
... ...
ruoyi-ui/src/views/system/errorCode/index.vue 0 → 100644
  1 +<template>
  2 + <div class="app-container">
  3 +
  4 + <!-- 搜索工作栏 -->
  5 + <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="100px">
  6 + <el-form-item label="错误码类型" prop="type">
  7 + <el-select v-model="queryParams.type" placeholder="请选择错误码类型" clearable size="small">
  8 + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.SYS_ERROR_CODE_TYPE)"
  9 + :key="dict.value" :label="dict.label" :value="dict.value"/>
  10 + </el-select>
  11 + </el-form-item>
  12 + <el-form-item label="应用名" prop="applicationName">
  13 + <el-input v-model="queryParams.applicationName" placeholder="请输入应用名" clearable size="small" @keyup.enter.native="handleQuery"/>
  14 + </el-form-item>
  15 + <el-form-item label="错误码编码" prop="code">
  16 + <el-input v-model="queryParams.code" placeholder="请输入错误码编码" clearable size="small" @keyup.enter.native="handleQuery"/>
  17 + </el-form-item>
  18 + <el-form-item label="错误码提示" prop="message">
  19 + <el-input v-model="queryParams.message" placeholder="请输入错误码提示" clearable size="small" @keyup.enter.native="handleQuery"/>
  20 + </el-form-item>
  21 + <el-form-item label="创建时间">
  22 + <el-date-picker v-model="dateRangeCreateTime" size="small" style="width: 240px" value-format="yyyy-MM-dd"
  23 + type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" />
  24 + </el-form-item>
  25 + <el-form-item>
  26 + <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  27 + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  28 + </el-form-item>
  29 + </el-form>
  30 +
  31 + <!-- 操作工具栏 -->
  32 + <el-row :gutter="10" class="mb8">
  33 + <el-col :span="1.5">
  34 + <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
  35 + v-hasPermi="['system:error-code:create']">新增</el-button>
  36 + </el-col>
  37 + <el-col :span="1.5">
  38 + <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
  39 + v-hasPermi="['system:error-code:export']">导出</el-button>
  40 + </el-col>
  41 + <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  42 + </el-row>
  43 +
  44 + <!-- 列表 -->
  45 + <el-table v-loading="loading" :data="list">
  46 + <el-table-column label="编号" align="center" prop="id" />
  47 + <el-table-column label="类型" align="center" prop="type" width="80">
  48 + <template slot-scope="scope">
  49 + <span>{{ getDictDataLabel(DICT_TYPE.SYS_ERROR_CODE_TYPE, scope.row.type) }}</span>
  50 + </template>
  51 + </el-table-column>
  52 + <el-table-column label="应用名" align="center" prop="applicationName" width="200" />
  53 + <el-table-column label="错误码编码" align="center" prop="code" width="100" />
  54 + <el-table-column label="错误码提示" align="center" prop="message" width="300" />
  55 + <el-table-column label="备注" align="center" prop="memo" width="200" />
  56 + <el-table-column label="创建时间" align="center" prop="createTime" width="180">
  57 + <template slot-scope="scope">
  58 + <span>{{ parseTime(scope.row.createTime) }}</span>
  59 + </template>
  60 + </el-table-column>
  61 + <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
  62 + <template slot-scope="scope">
  63 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  64 + v-hasPermi="['system:error-code:update']">修改</el-button>
  65 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  66 + v-hasPermi="['system:error-code:delete']">删除</el-button>
  67 + </template>
  68 + </el-table-column>
  69 + </el-table>
  70 + <!-- 分页组件 -->
  71 + <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
  72 + @pagination="getList"/>
  73 +
  74 + <!-- 对话框(添加 / 修改) -->
  75 + <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
  76 + <el-form ref="form" :model="form" :rules="rules" label-width="100px">
  77 + <el-form-item label="应用名" prop="applicationName">
  78 + <el-input v-model="form.applicationName" placeholder="请输入应用名" />
  79 + </el-form-item>
  80 + <el-form-item label="错误码编码" prop="code">
  81 + <el-input v-model="form.code" placeholder="请输入错误码编码" />
  82 + </el-form-item>
  83 + <el-form-item label="错误码提示" prop="message">
  84 + <el-input v-model="form.message" placeholder="请输入错误码提示" />
  85 + </el-form-item>
  86 + <el-form-item label="备注" prop="memo">
  87 + <el-input v-model="form.memo" placeholder="请输入备注" />
  88 + </el-form-item>
  89 + </el-form>
  90 + <div slot="footer" class="dialog-footer">
  91 + <el-button type="primary" @click="submitForm">确 定</el-button>
  92 + <el-button @click="cancel">取 消</el-button>
  93 + </div>
  94 + </el-dialog>
  95 + </div>
  96 +</template>
  97 +
  98 +<script>
  99 +import { createErrorCode, updateErrorCode, deleteErrorCode, getErrorCode, getErrorCodePage, exportErrorCodeExcel } from "@/api/system/errorCode";
  100 +
  101 +export default {
  102 + name: "ErrorCode",
  103 + components: {
  104 + },
  105 + data() {
  106 + return {
  107 + // 遮罩层
  108 + loading: true,
  109 + // 显示搜索条件
  110 + showSearch: true,
  111 + // 总条数
  112 + total: 0,
  113 + // 错误码列表
  114 + list: [],
  115 + // 弹出层标题
  116 + title: "",
  117 + // 是否显示弹出层
  118 + open: false,
  119 + dateRangeCreateTime: [],
  120 + // 查询参数
  121 + queryParams: {
  122 + pageNo: 1,
  123 + pageSize: 10,
  124 + type: null,
  125 + applicationName: null,
  126 + code: null,
  127 + message: null,
  128 + },
  129 + // 表单参数
  130 + form: {},
  131 + // 表单校验
  132 + rules: {
  133 + applicationName: [{ required: true, message: "应用名不能为空", trigger: "blur" }],
  134 + code: [{ required: true, message: "错误码编码不能为空", trigger: "blur" }],
  135 + message: [{ required: true, message: "错误码提示不能为空", trigger: "blur" }],
  136 + }
  137 + };
  138 + },
  139 + created() {
  140 + this.getList();
  141 + },
  142 + methods: {
  143 + /** 查询列表 */
  144 + getList() {
  145 + this.loading = true;
  146 + // 处理查询参数
  147 + let params = {...this.queryParams};
  148 + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
  149 + // 执行查询
  150 + getErrorCodePage(params).then(response => {
  151 + this.list = response.data.list;
  152 + this.total = response.data.total;
  153 + this.loading = false;
  154 + });
  155 + },
  156 + /** 取消按钮 */
  157 + cancel() {
  158 + this.open = false;
  159 + this.reset();
  160 + },
  161 + /** 表单重置 */
  162 + reset() {
  163 + this.form = {
  164 + id: undefined,
  165 + applicationName: undefined,
  166 + code: undefined,
  167 + message: undefined,
  168 + memo: undefined,
  169 + };
  170 + this.resetForm("form");
  171 + },
  172 + /** 搜索按钮操作 */
  173 + handleQuery() {
  174 + this.queryParams.pageNo = 1;
  175 + this.getList();
  176 + },
  177 + /** 重置按钮操作 */
  178 + resetQuery() {
  179 + this.dateRangeCreateTime = [];
  180 + this.resetForm("queryForm");
  181 + this.handleQuery();
  182 + },
  183 + /** 新增按钮操作 */
  184 + handleAdd() {
  185 + this.reset();
  186 + this.open = true;
  187 + this.title = "添加错误码";
  188 + },
  189 + /** 修改按钮操作 */
  190 + handleUpdate(row) {
  191 + this.reset();
  192 + const id = row.id;
  193 + getErrorCode(id).then(response => {
  194 + this.form = response.data;
  195 + this.open = true;
  196 + this.title = "修改错误码";
  197 + });
  198 + },
  199 + /** 提交按钮 */
  200 + submitForm() {
  201 + this.$refs["form"].validate(valid => {
  202 + if (!valid) {
  203 + return;
  204 + }
  205 + // 修改的提交
  206 + if (this.form.id != null) {
  207 + updateErrorCode(this.form).then(response => {
  208 + this.msgSuccess("修改成功");
  209 + this.open = false;
  210 + this.getList();
  211 + });
  212 + return;
  213 + }
  214 + // 添加的提交
  215 + createErrorCode(this.form).then(response => {
  216 + this.msgSuccess("新增成功");
  217 + this.open = false;
  218 + this.getList();
  219 + });
  220 + });
  221 + },
  222 + /** 删除按钮操作 */
  223 + handleDelete(row) {
  224 + const id = row.id;
  225 + this.$confirm('是否确认删除错误码编号为"' + id + '"的数据项?', "警告", {
  226 + confirmButtonText: "确定",
  227 + cancelButtonText: "取消",
  228 + type: "warning"
  229 + }).then(function() {
  230 + return deleteErrorCode(id);
  231 + }).then(() => {
  232 + this.getList();
  233 + this.msgSuccess("删除成功");
  234 + })
  235 + },
  236 + /** 导出按钮操作 */
  237 + handleExport() {
  238 + // 处理查询参数
  239 + let params = {...this.queryParams};
  240 + params.pageNo = undefined;
  241 + params.pageSize = undefined;
  242 + this.addBeginAndEndTime(params, this.dateRangeCreateTime, 'createTime');
  243 + // 执行导出
  244 + this.$confirm('是否确认导出所有错误码数据项?', "警告", {
  245 + confirmButtonText: "确定",
  246 + cancelButtonText: "取消",
  247 + type: "warning"
  248 + }).then(function() {
  249 + return exportErrorCodeExcel(params);
  250 + }).then(response => {
  251 + this.downloadExcel(response, '错误码.xls');
  252 + })
  253 + }
  254 + }
  255 +};
  256 +</script>
... ...
sql/ruoyi-vue-pro.sql
... ... @@ -11,7 +11,7 @@
11 11 Target Server Version : 50718
12 12 File Encoding : 65001
13 13  
14   - Date: 18/04/2021 00:36:06
  14 + Date: 22/04/2021 00:48:26
15 15 */
16 16  
17 17 SET NAMES utf8mb4;
... ... @@ -43,7 +43,7 @@ CREATE TABLE `inf_api_access_log` (
43 43 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
44 44 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
45 45 PRIMARY KEY (`id`) USING BTREE
46   -) ENGINE=InnoDB AUTO_INCREMENT=3750 DEFAULT CHARSET=utf8mb4 COMMENT='API 访问日志表';
  46 +) ENGINE=InnoDB AUTO_INCREMENT=4229 DEFAULT CHARSET=utf8mb4 COMMENT='API 访问日志表';
47 47  
48 48 -- ----------------------------
49 49 -- Records of inf_api_access_log
... ... @@ -84,7 +84,7 @@ CREATE TABLE `inf_api_error_log` (
84 84 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
85 85 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
86 86 PRIMARY KEY (`id`) USING BTREE
87   -) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='系统异常日志';
  87 +) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT='系统异常日志';
88 88  
89 89 -- ----------------------------
90 90 -- Records of inf_api_error_log
... ... @@ -118,7 +118,7 @@ CREATE TABLE `inf_config` (
118 118 -- ----------------------------
119 119 BEGIN;
120 120 INSERT INTO `inf_config` VALUES (1, 'ui', 1, '主框架页-默认皮肤样å¼åç§°', 'sys.index.skinName', 'skin-blue', b'0', 'è“色 skin-blueã€ç»¿è‰² skin-greenã€ç´«è‰² skin-purpleã€çº¢è‰² skin-redã€é»„色 skin-yellow', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0');
121   -INSERT INTO `inf_config` VALUES (2, 'biz', 1, '用户管ç†-è´¦å·åˆå§‹å¯†ç ', 'sys.user.initPassword', '123456', b'0', 'åˆå§‹åŒ–å¯†ç  123456', 'admin', '2021-01-05 17:03:48', '', '2021-01-21 02:13:02', b'0');
  121 +INSERT INTO `inf_config` VALUES (2, 'biz', 1, '用户管ç†-è´¦å·åˆå§‹å¯†ç ', 'sys.user.init-password', '123456', b'0', 'åˆå§‹åŒ–å¯†ç  123456', 'admin', '2021-01-05 17:03:48', '', '2021-04-13 03:48:02', b'0');
122 122 INSERT INTO `inf_config` VALUES (3, 'ui', 1, '主框架页-ä¾§è¾¹æ ä¸»é¢˜', 'sys.index.sideTheme', 'theme-dark', b'0', '深色主题theme-dark,浅色主题theme-light', 'admin', '2021-01-05 17:03:48', '', '2021-01-19 03:05:21', b'0');
123 123 INSERT INTO `inf_config` VALUES (4, '1', 2, 'xxx', 'demo.test', '10', b'0', '5', '', '2021-01-19 03:10:26', '', '2021-01-20 09:25:55', b'0');
124 124 INSERT INTO `inf_config` VALUES (5, 'xxx', 2, 'xxx', 'xxx', 'xxx', b'1', 'xxx', '', '2021-02-09 20:06:47', '', '2021-02-09 20:06:47', b'0');
... ... @@ -201,7 +201,7 @@ CREATE TABLE `inf_job_log` (
201 201 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
202 202 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
203 203 PRIMARY KEY (`id`) USING BTREE
204   -) ENGINE=InnoDB AUTO_INCREMENT=2322 DEFAULT CHARSET=utf8mb4 COMMENT='定时任务日志表';
  204 +) ENGINE=InnoDB AUTO_INCREMENT=2527 DEFAULT CHARSET=utf8mb4 COMMENT='定时任务日志表';
205 205  
206 206 -- ----------------------------
207 207 -- Records of inf_job_log
... ... @@ -264,7 +264,7 @@ CREATE TABLE `sys_dict_data` (
264 264 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
265 265 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
266 266 PRIMARY KEY (`id`) USING BTREE
267   -) ENGINE=InnoDB AUTO_INCREMENT=78 DEFAULT CHARSET=utf8mb4 COMMENT='字典数æ®è¡¨';
  267 +) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8mb4 COMMENT='字典数æ®è¡¨';
268 268  
269 269 -- ----------------------------
270 270 -- Records of sys_dict_data
... ... @@ -337,6 +337,8 @@ INSERT INTO `sys_dict_data` VALUES (74, 0, &#39;等待结果&#39;, &#39;0&#39;, &#39;sys_sms_receive
337 337 INSERT INTO `sys_dict_data` VALUES (75, 1, '接收æˆåŠŸ', '10', 'sys_sms_receive_status', 0, NULL, '1', '2021-04-11 20:29:25', '1', '2021-04-11 20:29:35', b'0');
338 338 INSERT INTO `sys_dict_data` VALUES (76, 2, '接收失败', '20', 'sys_sms_receive_status', 0, NULL, '1', '2021-04-11 20:29:31', '1', '2021-04-11 20:29:39', b'0');
339 339 INSERT INTO `sys_dict_data` VALUES (77, 0, '调试(钉钉)', 'DEBUG_DING_TALK', 'sys_sms_channel_code', 0, NULL, '1', '2021-04-13 00:20:37', '1', '2021-04-13 00:20:37', b'0');
  340 +INSERT INTO `sys_dict_data` VALUES (78, 1, '自动生æˆ', '1', 'sys_error_code_type', 0, NULL, '1', '2021-04-21 00:06:48', '1', '2021-04-13 22:06:44', b'0');
  341 +INSERT INTO `sys_dict_data` VALUES (79, 2, '手动编辑', '2', 'sys_error_code_type', 0, NULL, '1', '2021-04-21 00:07:14', '1', '2021-04-13 22:06:49', b'0');
340 342 COMMIT;
341 343  
342 344 -- ----------------------------
... ... @@ -356,7 +358,7 @@ CREATE TABLE `sys_dict_type` (
356 358 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
357 359 PRIMARY KEY (`id`) USING BTREE,
358 360 UNIQUE KEY `dict_type` (`type`)
359   -) ENGINE=InnoDB AUTO_INCREMENT=115 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表';
  361 +) ENGINE=InnoDB AUTO_INCREMENT=116 DEFAULT CHARSET=utf8mb4 COMMENT='字典类型表';
360 362  
361 363 -- ----------------------------
362 364 -- Records of sys_dict_type
... ... @@ -383,6 +385,109 @@ INSERT INTO `sys_dict_type` VALUES (111, &#39;短信渠é“ç¼–ç &#39;, &#39;sys_sms_channel_
383 385 INSERT INTO `sys_dict_type` VALUES (112, '短信模æ¿çš„类型', 'sys_sms_template_type', 0, NULL, '1', '2021-04-05 21:50:43', '1', '2021-04-05 21:50:43', b'0');
384 386 INSERT INTO `sys_dict_type` VALUES (113, '短信å‘é€çжæ€', 'sys_sms_send_status', 0, NULL, '1', '2021-04-11 20:18:03', '1', '2021-04-11 09:30:02', b'0');
385 387 INSERT INTO `sys_dict_type` VALUES (114, '短信接收状æ€', 'sys_sms_receive_status', 0, NULL, '1', '2021-04-11 20:27:14', '1', '2021-04-11 20:27:14', b'0');
  388 +INSERT INTO `sys_dict_type` VALUES (115, '错误ç çš„类型', 'sys_error_code_type', 0, NULL, '1', '2021-04-21 00:06:30', '1', '2021-04-13 22:07:12', b'0');
  389 +COMMIT;
  390 +
  391 +-- ----------------------------
  392 +-- Table structure for sys_error_code
  393 +-- ----------------------------
  394 +DROP TABLE IF EXISTS `sys_error_code`;
  395 +CREATE TABLE `sys_error_code` (
  396 + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '错误ç ç¼–å·',
  397 + `type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '错误ç ç±»åž‹',
  398 + `application_name` varchar(50) NOT NULL COMMENT '应用å',
  399 + `code` int(11) NOT NULL DEFAULT '0' COMMENT '错误ç ç¼–ç ',
  400 + `message` varchar(512) NOT NULL DEFAULT '' COMMENT '错误ç é”™è¯¯æç¤º',
  401 + `memo` varchar(512) DEFAULT '' COMMENT '备注',
  402 + `creator` varchar(64) DEFAULT '' COMMENT '创建者',
  403 + `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  404 + `updater` varchar(64) DEFAULT '' COMMENT '更新者',
  405 + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
  406 + `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
  407 + PRIMARY KEY (`id`) USING BTREE
  408 +) ENGINE=InnoDB AUTO_INCREMENT=4016 DEFAULT CHARSET=utf8mb4 COMMENT='错误ç è¡¨';
  409 +
  410 +-- ----------------------------
  411 +-- Records of sys_error_code
  412 +-- ----------------------------
  413 +BEGIN;
  414 +INSERT INTO `sys_error_code` VALUES (3939, 2, 'dashboard', 1001000001, '傿•°é…ç½®ä¸å­˜åœ¨', 'ceshi', NULL, '2021-04-20 23:52:56', '1', '2021-04-21 23:44:15', b'0');
  415 +INSERT INTO `sys_error_code` VALUES (3940, 1, 'dashboard', 1001000002, '傿•°é…ç½® key é‡å¤', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');
  416 +INSERT INTO `sys_error_code` VALUES (3941, 1, 'dashboard', 1001000003, 'ä¸èƒ½åˆ é™¤ç±»åž‹ä¸ºç³»ç»Ÿå†…ç½®çš„å‚æ•°é…ç½®', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');
  417 +INSERT INTO `sys_error_code` VALUES (3942, 1, 'dashboard', 1001000004, 'ä¸å…è®¸èŽ·å–æ•感é…置到å‰ç«¯', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');
  418 +INSERT INTO `sys_error_code` VALUES (3943, 1, 'dashboard', 1001001000, '定时任务ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');
  419 +INSERT INTO `sys_error_code` VALUES (3944, 1, 'dashboard', 1001001001, '定时任务的处ç†å™¨å·²ç»å­˜åœ¨', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');
  420 +INSERT INTO `sys_error_code` VALUES (3945, 1, 'dashboard', 1001001002, 'åªå…è®¸ä¿®æ”¹ä¸ºå¼€å¯æˆ–者关闭状æ€', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');
  421 +INSERT INTO `sys_error_code` VALUES (3946, 1, 'dashboard', 1001001003, '定时任务已ç»å¤„于该状æ€ï¼Œæ— éœ€ä¿®æ”¹', '', NULL, '2021-04-20 23:52:56', NULL, '2021-04-20 23:52:56', b'0');
  422 +INSERT INTO `sys_error_code` VALUES (3947, 1, 'dashboard', 1001001004, 'åªæœ‰å¼€å¯çжæ€çš„任务,æ‰å¯ä»¥ä¿®æ”¹', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  423 +INSERT INTO `sys_error_code` VALUES (3948, 1, 'dashboard', 1001001005, 'CRON 表达å¼ä¸æ­£ç¡®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  424 +INSERT INTO `sys_error_code` VALUES (3949, 2, 'dashboard', 1001002000, 'API 错误日志ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', '1', '2021-04-13 21:55:55', b'1');
  425 +INSERT INTO `sys_error_code` VALUES (3950, 1, 'dashboard', 1001002001, 'API 错误日志已处ç†', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  426 +INSERT INTO `sys_error_code` VALUES (3951, 1, 'dashboard', 1001003000, '文件ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  427 +INSERT INTO `sys_error_code` VALUES (3952, 1, 'dashboard', 1002000000, '登录失败,账å·å¯†ç ä¸æ­£ç¡®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  428 +INSERT INTO `sys_error_code` VALUES (3953, 1, 'dashboard', 1002000001, '登录失败,账å·è¢«ç¦ç”¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  429 +INSERT INTO `sys_error_code` VALUES (3954, 1, 'dashboard', 1002000002, '登录失败', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  430 +INSERT INTO `sys_error_code` VALUES (3955, 1, 'dashboard', 1002000003, '验è¯ç ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  431 +INSERT INTO `sys_error_code` VALUES (3956, 1, 'dashboard', 1002000004, '验è¯ç ä¸æ­£ç¡®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  432 +INSERT INTO `sys_error_code` VALUES (3957, 1, 'dashboard', 1002001000, 'Token å·²ç»è¿‡æœŸ', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  433 +INSERT INTO `sys_error_code` VALUES (3958, 1, 'dashboard', 1002001001, 'Token è§£æžå¤±è´¥', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  434 +INSERT INTO `sys_error_code` VALUES (3959, 1, 'dashboard', 1002002000, 'å·²ç»å­˜åœ¨è¯¥åå­—çš„èœå•', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  435 +INSERT INTO `sys_error_code` VALUES (3960, 1, 'dashboard', 1002002001, '父èœå•ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  436 +INSERT INTO `sys_error_code` VALUES (3961, 1, 'dashboard', 1002002002, 'ä¸èƒ½è®¾ç½®è‡ªå·±ä¸ºçˆ¶èœå•', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  437 +INSERT INTO `sys_error_code` VALUES (3962, 1, 'dashboard', 1002002003, 'èœå•ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  438 +INSERT INTO `sys_error_code` VALUES (3963, 1, 'dashboard', 1002002004, '存在å­èœå•,无法删除', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  439 +INSERT INTO `sys_error_code` VALUES (3964, 1, 'dashboard', 1002002005, '父èœå•的类型必须是目录或者èœå•', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  440 +INSERT INTO `sys_error_code` VALUES (3965, 1, 'dashboard', 1002003000, '角色ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  441 +INSERT INTO `sys_error_code` VALUES (3966, 1, 'dashboard', 1002003001, 'å·²ç»å­˜åœ¨å为ã€{}】的角色', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  442 +INSERT INTO `sys_error_code` VALUES (3967, 1, 'dashboard', 1002003002, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}】的角色', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  443 +INSERT INTO `sys_error_code` VALUES (3968, 1, 'dashboard', 1002003004, 'ä¸èƒ½æ“作类型为系统内置的角色', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  444 +INSERT INTO `sys_error_code` VALUES (3969, 1, 'dashboard', 1002004000, '用户账å·å·²ç»å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  445 +INSERT INTO `sys_error_code` VALUES (3970, 1, 'dashboard', 1002004001, 'å·²ç»å­˜åœ¨è¯¥å字的部门', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-22 00:04:06', b'0');
  446 +INSERT INTO `sys_error_code` VALUES (3971, 1, 'dashboard', 1002004002, '父级部门ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-22 00:04:06', b'0');
  447 +INSERT INTO `sys_error_code` VALUES (3972, 1, 'dashboard', 1002004003, '用户ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-22 00:04:06', b'0');
  448 +INSERT INTO `sys_error_code` VALUES (3973, 1, 'dashboard', 1002004004, '存在å­éƒ¨é—¨ï¼Œæ— æ³•删除', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-22 00:04:06', b'0');
  449 +INSERT INTO `sys_error_code` VALUES (3974, 1, 'dashboard', 1002004005, 'ä¸èƒ½è®¾ç½®è‡ªå·±ä¸ºçˆ¶éƒ¨é—¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-22 00:04:06', b'0');
  450 +INSERT INTO `sys_error_code` VALUES (3975, 1, 'dashboard', 1002004001, 'å·²ç»å­˜åœ¨è¯¥å字的部门', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  451 +INSERT INTO `sys_error_code` VALUES (3976, 1, 'dashboard', 1002004002, '父级部门ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  452 +INSERT INTO `sys_error_code` VALUES (3977, 1, 'dashboard', 1002004003, '当å‰éƒ¨é—¨ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  453 +INSERT INTO `sys_error_code` VALUES (3978, 1, 'dashboard', 1002004004, '存在å­éƒ¨é—¨ï¼Œæ— æ³•删除', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  454 +INSERT INTO `sys_error_code` VALUES (3979, 1, 'dashboard', 1002004005, 'ä¸èƒ½è®¾ç½®è‡ªå·±ä¸ºçˆ¶éƒ¨é—¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  455 +INSERT INTO `sys_error_code` VALUES (3980, 1, 'dashboard', 1002004006, '部门中存在员工,无法删除', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  456 +INSERT INTO `sys_error_code` VALUES (3981, 1, 'dashboard', 1002004007, '部门ä¸å¤„于开å¯çжæ€ï¼Œä¸å…许选择', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  457 +INSERT INTO `sys_error_code` VALUES (3982, 1, 'dashboard', 1002004008, 'ä¸èƒ½è®¾ç½®è‡ªå·±çš„å­éƒ¨é—¨ä¸ºçˆ¶éƒ¨é—¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  458 +INSERT INTO `sys_error_code` VALUES (3983, 1, 'dashboard', 1002005001, 'å·²ç»å­˜åœ¨è¯¥æ ‡è¯†çš„å²—ä½', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-22 00:04:06', b'0');
  459 +INSERT INTO `sys_error_code` VALUES (3984, 1, 'dashboard', 1002005002, 'å²—ä½({}) ä¸å¤„于开å¯çжæ€ï¼Œä¸å…许选择', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  460 +INSERT INTO `sys_error_code` VALUES (3985, 1, 'dashboard', 1002005001, 'å·²ç»å­˜åœ¨è¯¥å字的岗ä½', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  461 +INSERT INTO `sys_error_code` VALUES (3986, 1, 'dashboard', 1002005001, 'å·²ç»å­˜åœ¨è¯¥æ ‡è¯†çš„å²—ä½', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  462 +INSERT INTO `sys_error_code` VALUES (3987, 1, 'dashboard', 1002006001, '当å‰å­—典类型ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  463 +INSERT INTO `sys_error_code` VALUES (3988, 1, 'dashboard', 1002006002, '字典类型ä¸å¤„于开å¯çжæ€ï¼Œä¸å…许选择', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  464 +INSERT INTO `sys_error_code` VALUES (3989, 1, 'dashboard', 1002006003, 'å·²ç»å­˜åœ¨è¯¥å字的字典类型', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  465 +INSERT INTO `sys_error_code` VALUES (3990, 1, 'dashboard', 1002006004, '无法删除,该字典类型还有字典数æ®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-22 00:04:06', b'0');
  466 +INSERT INTO `sys_error_code` VALUES (3991, 1, 'dashboard', 1002006004, '无法删除,该字典类型还有字典数æ®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  467 +INSERT INTO `sys_error_code` VALUES (3992, 1, 'dashboard', 1002007001, '当å‰å­—典数æ®ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  468 +INSERT INTO `sys_error_code` VALUES (3993, 1, 'dashboard', 1002007002, '字典数æ®ä¸å¤„于开å¯çжæ€ï¼Œä¸å…许选择', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  469 +INSERT INTO `sys_error_code` VALUES (3994, 1, 'dashboard', 1002007003, 'å·²ç»å­˜åœ¨è¯¥å€¼çš„字典数æ®', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  470 +INSERT INTO `sys_error_code` VALUES (3995, 1, 'dashboard', 1002008001, '当å‰é€šçŸ¥å…¬å‘Šä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  471 +INSERT INTO `sys_error_code` VALUES (3996, 1, 'dashboard', 1002009001, '文件路径已ç»å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-21 00:03:20', b'0');
  472 +INSERT INTO `sys_error_code` VALUES (3997, 1, 'dashboard', 1002009002, '文件上传失败', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  473 +INSERT INTO `sys_error_code` VALUES (3998, 1, 'dashboard', 1002009003, '文件为空', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  474 +INSERT INTO `sys_error_code` VALUES (3999, 1, 'dashboard', 1002011000, '短信模æ¿ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-22 00:04:06', b'0');
  475 +INSERT INTO `sys_error_code` VALUES (4000, 1, 'dashboard', 1002011001, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}】的短信模æ¿', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-22 00:04:06', b'0');
  476 +INSERT INTO `sys_error_code` VALUES (4001, 2, 'dashboard', 1002011002, '无法删除,该短信渠é“还有短信模æ¿', '', NULL, '2021-04-20 23:52:57', '1', '2021-04-22 00:06:52', b'0');
  477 +INSERT INTO `sys_error_code` VALUES (4002, 1, 'dashboard', 1002011000, '短信模æ¿ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  478 +INSERT INTO `sys_error_code` VALUES (4003, 1, 'dashboard', 1002011001, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}】的短信模æ¿', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  479 +INSERT INTO `sys_error_code` VALUES (4004, 1, 'dashboard', 1002012000, '手机å·ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  480 +INSERT INTO `sys_error_code` VALUES (4005, 1, 'dashboard', 1002012001, '模æ¿å‚æ•°({})缺失', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  481 +INSERT INTO `sys_error_code` VALUES (4006, 1, 'dashboard', 1002009000, '错误ç ä¸å­˜åœ¨', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  482 +INSERT INTO `sys_error_code` VALUES (4007, 1, 'dashboard', 1002009001, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}}】的错误ç ', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  483 +INSERT INTO `sys_error_code` VALUES (4008, 1, 'dashboard', 1002004003, 'ä¸èƒ½ä¿®æ”¹ç±»åž‹ä¸ºç³»ç»Ÿå†…置的错误ç ', '', NULL, '2021-04-20 23:52:57', NULL, '2021-04-20 23:52:57', b'0');
  484 +INSERT INTO `sys_error_code` VALUES (4009, 1, 'dashboard', 1001004000, '错误ç ä¸å­˜åœ¨', '', NULL, '2021-04-21 00:38:01', NULL, '2021-04-21 00:38:01', b'0');
  485 +INSERT INTO `sys_error_code` VALUES (4010, 1, 'dashboard', 1001004001, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}】的错误ç ', '', NULL, '2021-04-21 00:38:01', NULL, '2021-04-21 23:48:44', b'0');
  486 +INSERT INTO `sys_error_code` VALUES (4011, 1, 'dashboard', 1001004002, 'ä¸èƒ½ä¿®æ”¹ç±»åž‹ä¸ºç³»ç»Ÿå†…置的错误ç ', '', NULL, '2021-04-21 00:38:01', NULL, '2021-04-21 00:38:01', b'0');
  487 +INSERT INTO `sys_error_code` VALUES (4012, 2, 'dashboard', 1201002000, '啦啦啦啦', 'biubiub', '1', '2021-04-21 23:46:02', '1', '2021-04-21 23:46:02', b'0');
  488 +INSERT INTO `sys_error_code` VALUES (4013, 1, 'dashboard', 1001002000, 'API 错误日志ä¸å­˜åœ¨', '', NULL, '2021-04-21 23:48:44', NULL, '2021-04-21 23:48:44', b'0');
  489 +INSERT INTO `sys_error_code` VALUES (4014, 1, 'dashboard', 1002013000, '错误ç ä¸å­˜åœ¨', '', NULL, '2021-04-22 00:04:06', NULL, '2021-04-22 00:04:06', b'0');
  490 +INSERT INTO `sys_error_code` VALUES (4015, 1, 'dashboard', 1002013001, 'å·²ç»å­˜åœ¨ç¼–ç ä¸ºã€{}】的错误ç ', '', NULL, '2021-04-22 00:04:06', NULL, '2021-04-22 00:04:06', b'0');
386 491 COMMIT;
387 492  
388 493 -- ----------------------------
... ... @@ -403,7 +508,7 @@ CREATE TABLE `sys_login_log` (
403 508 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
404 509 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
405 510 PRIMARY KEY (`id`) USING BTREE
406   -) ENGINE=InnoDB AUTO_INCREMENT=84 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录';
  511 +) ENGINE=InnoDB AUTO_INCREMENT=98 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录';
407 512  
408 513 -- ----------------------------
409 514 -- Records of sys_login_log
... ... @@ -432,7 +537,7 @@ CREATE TABLE `sys_menu` (
432 537 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
433 538 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
434 539 PRIMARY KEY (`id`) USING BTREE
435   -) ENGINE=InnoDB AUTO_INCREMENT=1110 DEFAULT CHARSET=utf8mb4 COMMENT='èœå•æƒé™è¡¨';
  540 +) ENGINE=InnoDB AUTO_INCREMENT=1116 DEFAULT CHARSET=utf8mb4 COMMENT='èœå•æƒé™è¡¨';
436 541  
437 542 -- ----------------------------
438 543 -- Records of sys_menu
... ... @@ -563,6 +668,12 @@ INSERT INTO `sys_menu` VALUES (1106, &#39;å‘逿µ‹è¯•短信&#39;, &#39;system:sms-template:
563 668 INSERT INTO `sys_menu` VALUES (1107, '短信日志', '', 2, 2, 1093, 'sms-log', 'phone', 'system/sms/smsLog', 0, '', '2021-04-11 08:37:05', '1', '2021-04-11 19:34:25', b'0');
564 669 INSERT INTO `sys_menu` VALUES (1108, '短信日志查询', 'system:sms-log:query', 3, 1, 1107, '', '', '', 0, '', '2021-04-11 08:37:05', '', '2021-04-11 08:37:05', b'0');
565 670 INSERT INTO `sys_menu` VALUES (1109, '短信日志导出', 'system:sms-log:export', 3, 5, 1107, '', '', '', 0, '', '2021-04-11 08:37:05', '', '2021-04-11 08:37:05', b'0');
  671 +INSERT INTO `sys_menu` VALUES (1110, '错误ç ç®¡ç†', '', 2, 12, 1, 'error-code', 'code', 'system/errorCode/index', 0, '', '2021-04-13 21:46:42', '1', '2021-04-22 00:04:35', b'0');
  672 +INSERT INTO `sys_menu` VALUES (1111, 'é”™è¯¯ç æŸ¥è¯¢', 'system:error-code:query', 3, 1, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:37', b'0');
  673 +INSERT INTO `sys_menu` VALUES (1112, '错误ç åˆ›å»º', 'system:error-code:create', 3, 2, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:43', b'0');
  674 +INSERT INTO `sys_menu` VALUES (1113, 'é”™è¯¯ç æ›´æ–°', 'system:error-code:update', 3, 3, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:47', b'0');
  675 +INSERT INTO `sys_menu` VALUES (1114, '错误ç åˆ é™¤', 'system:error-code:delete', 3, 4, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:51', b'0');
  676 +INSERT INTO `sys_menu` VALUES (1115, '错误ç å¯¼å‡º', 'system:error-code:export', 3, 5, 1110, '', '', '', 0, '', '2021-04-13 21:46:42', '', '2021-04-13 22:09:55', b'0');
566 677 COMMIT;
567 678  
568 679 -- ----------------------------
... ... @@ -622,7 +733,7 @@ CREATE TABLE `sys_operate_log` (
622 733 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
623 734 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
624 735 PRIMARY KEY (`id`) USING BTREE
625   -) ENGINE=InnoDB AUTO_INCREMENT=177 DEFAULT CHARSET=utf8mb4 COMMENT='æ“作日志记录';
  736 +) ENGINE=InnoDB AUTO_INCREMENT=193 DEFAULT CHARSET=utf8mb4 COMMENT='æ“作日志记录';
626 737  
627 738 -- ----------------------------
628 739 -- Records of sys_operate_log
... ... @@ -933,7 +1044,7 @@ CREATE TABLE `sys_sms_log` (
933 1044 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
934 1045 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
935 1046 PRIMARY KEY (`id`) USING BTREE
936   -) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8mb4 COMMENT='短信日志';
  1047 +) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb4 COMMENT='短信日志';
937 1048  
938 1049 -- ----------------------------
939 1050 -- Records of sys_sms_log
... ... @@ -1074,6 +1185,7 @@ INSERT INTO `sys_user_session` VALUES (&#39;12166cd28b4f448ea468d13c471dfc6e&#39;, 1, &#39;2
1074 1185 INSERT INTO `sys_user_session` VALUES ('134d908ae33146bd9b5291471c04f604', 1, '2021-04-10 00:29:28', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-09 23:10:26', NULL, '2021-04-02 08:08:17', b'1');
1075 1186 INSERT INTO `sys_user_session` VALUES ('1407ce21e47947b9b8d93bff1b55c7d6', 1, '2021-04-07 01:09:11', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-07 00:07:43', NULL, '2021-04-01 18:10:44', b'1');
1076 1187 INSERT INTO `sys_user_session` VALUES ('1477c38290ff4cee8887ebfe593faa02', 1, '2021-04-17 23:34:57', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-17 23:04:57', NULL, '2021-04-12 21:36:29', b'1');
  1188 +INSERT INTO `sys_user_session` VALUES ('347ec49c06d74d138a95266cbb5535a0', 1, '2021-04-21 00:45:41', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-21 00:03:50', NULL, '2021-04-13 18:38:39', b'1');
1077 1189 INSERT INTO `sys_user_session` VALUES ('3c75ea73e13b4857a18eb57ca2eea80f', 1, '2021-04-11 20:06:52', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-11 19:36:52', NULL, '2021-04-11 09:10:53', b'1');
1078 1190 INSERT INTO `sys_user_session` VALUES ('40d532d8900c43b791266429a7911751', 1, '2021-04-05 22:11:34', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-05 21:41:34', NULL, '2021-04-01 12:28:20', b'1');
1079 1191 INSERT INTO `sys_user_session` VALUES ('43676e85d0e04980b2a67181f8d9933b', 1, '2021-04-11 10:41:09', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-11 09:56:31', NULL, '2021-04-02 17:32:07', b'1');
... ... @@ -1084,16 +1196,22 @@ INSERT INTO `sys_user_session` VALUES (&#39;5c30d80eb72048daa1a24d3d4f01317b&#39;, 1, &#39;2
1084 1196 INSERT INTO `sys_user_session` VALUES ('5dca80a5c61541479a4dbb6e004c2e28', 1, '2021-04-14 00:57:25', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-13 23:38:30', NULL, '2021-04-12 17:33:48', b'1');
1085 1197 INSERT INTO `sys_user_session` VALUES ('7324a76b029a49ee95bf54ceb4164ba9', 1, '2021-04-13 01:29:14', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-13 00:18:40', NULL, '2021-04-11 23:15:00', b'1');
1086 1198 INSERT INTO `sys_user_session` VALUES ('749619894bc441bb9773902515f81e6a', 1, '2021-04-11 00:39:51', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-11 00:09:51', NULL, '2021-04-02 16:50:56', b'1');
  1199 +INSERT INTO `sys_user_session` VALUES ('750dca41b315488b8c17e1c0f8b6a519', 1, '2021-04-21 01:24:28', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-21 00:54:28', NULL, '2021-04-13 21:42:10', b'1');
1087 1200 INSERT INTO `sys_user_session` VALUES ('7768ae62ad974fd989f5159649a4be82', 1, '2021-04-11 00:53:39', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-10 23:23:27', NULL, '2021-04-02 17:04:58', b'1');
1088 1201 INSERT INTO `sys_user_session` VALUES ('79efcb8f64aa42af9f4b327fb383532f', 1, '2021-04-11 22:44:07', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-11 21:34:53', NULL, '2021-04-11 14:10:45', b'1');
  1202 +INSERT INTO `sys_user_session` VALUES ('83b227ad356f4343b01d321ad26807ce', 1, '2021-04-22 00:49:12', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-21 23:33:02', NULL, '2021-04-22 00:19:12', b'0');
1089 1203 INSERT INTO `sys_user_session` VALUES ('87d5b95fdad9447189a95abf8a5152df', 1, '2021-04-17 23:01:18', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-17 22:31:18', NULL, '2021-04-12 21:03:27', b'1');
1090 1204 INSERT INTO `sys_user_session` VALUES ('8b3eac5e4a104a4191c8070e03d553ea', 1, '2021-04-05 02:45:12', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-05 02:15:12', NULL, '2021-04-01 11:05:25', b'1');
1091 1205 INSERT INTO `sys_user_session` VALUES ('9ae27346d8b7491aad1385f51e8aa196', 1, '2021-03-13 14:02:12', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', NULL, '2021-03-13 10:43:06', NULL, '2021-03-13 06:40:35', b'1');
1092 1206 INSERT INTO `sys_user_session` VALUES ('a2fb443b31c049008975ff8ee5499db1', 1, '2021-04-11 09:42:09', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-11 09:12:09', NULL, '2021-04-02 17:16:00', b'1');
1093 1207 INSERT INTO `sys_user_session` VALUES ('a71a74adf9d141e2849d2a411d558205', 1, '2021-04-17 18:24:44', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-17 17:54:44', NULL, '2021-04-12 17:54:50', b'1');
  1208 +INSERT INTO `sys_user_session` VALUES ('ab2099c12f5c4b0288c60abe8cfff307', 1, '2021-04-18 01:41:46', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-18 01:01:35', NULL, '2021-04-13 05:14:54', b'1');
1094 1209 INSERT INTO `sys_user_session` VALUES ('ae9ee7452ee54e4b983d658188c15c4d', 1, '2021-03-14 21:32:57', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36', NULL, '2021-03-14 20:25:00', NULL, '2021-03-13 15:19:10', b'1');
1095 1210 INSERT INTO `sys_user_session` VALUES ('b727853eccea4c8589e006ffea985146', 1, '2021-04-12 01:36:00', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-12 01:06:00', NULL, '2021-04-11 19:40:07', b'1');
  1211 +INSERT INTO `sys_user_session` VALUES ('b9ee6fde7bf74ed49cad99abf86c94d6', 1, '2021-04-18 20:21:02', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-18 19:18:52', NULL, '2021-04-13 06:36:39', b'1');
  1212 +INSERT INTO `sys_user_session` VALUES ('bb4ad4579bd1436c859b94228967582f', 1, '2021-04-18 20:52:38', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-18 20:22:38', NULL, '2021-04-13 07:14:58', b'1');
1096 1213 INSERT INTO `sys_user_session` VALUES ('c095616db95044c5bed66a3f84519b8b', 1, '2021-04-11 19:59:33', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-11 19:29:33', NULL, '2021-04-11 09:04:19', b'1');
  1214 +INSERT INTO `sys_user_session` VALUES ('c8805f37eb76432c89d6d54feb14756f', 1, '2021-04-18 21:54:56', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-18 21:00:38', NULL, '2021-04-13 17:45:30', b'1');
1097 1215 INSERT INTO `sys_user_session` VALUES ('d0adf48f82914212b947e5ab04d9fb65', 1, '2021-03-21 19:16:28', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-03-21 18:13:37', NULL, '2021-03-15 05:53:20', b'1');
1098 1216 INSERT INTO `sys_user_session` VALUES ('dfbce0af867547f4bb01ac6f2e583337', 1, '2021-04-11 17:06:15', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-11 16:36:15', NULL, '2021-04-11 08:24:03', b'1');
1099 1217 INSERT INTO `sys_user_session` VALUES ('e5ecf10e40a5463b8f9b5b453cb1649b', 1, '2021-04-11 17:06:22', 'admin', '127.0.0.1', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36', NULL, '2021-04-11 16:36:22', NULL, '2021-04-11 08:24:03', b'1');
... ... @@ -1134,7 +1252,7 @@ CREATE TABLE `tool_codegen_column` (
1134 1252 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
1135 1253 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
1136 1254 PRIMARY KEY (`id`) USING BTREE
1137   -) ENGINE=InnoDB AUTO_INCREMENT=447 DEFAULT CHARSET=utf8mb4 COMMENT='代ç ç”Ÿæˆè¡¨å­—段定义';
  1255 +) ENGINE=InnoDB AUTO_INCREMENT=458 DEFAULT CHARSET=utf8mb4 COMMENT='代ç ç”Ÿæˆè¡¨å­—段定义';
1138 1256  
1139 1257 -- ----------------------------
1140 1258 -- Records of tool_codegen_column
... ... @@ -1354,6 +1472,17 @@ INSERT INTO `tool_codegen_column` VALUES (443, 36, &#39;create_time&#39;, &#39;datetime&#39;, &#39;å
1354 1472 INSERT INTO `tool_codegen_column` VALUES (444, 36, 'updater', 'varchar(64)', '更新者', b'1', b'0', '0', 27, 'String', 'updater', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '1', '2021-04-11 09:13:48', '1', '2021-04-11 20:33:54', b'0');
1355 1473 INSERT INTO `tool_codegen_column` VALUES (445, 36, 'update_time', 'datetime', 'æ›´æ–°æ—¶é—´', b'0', b'0', '0', 28, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'0', 'datetime', '1', '2021-04-11 09:13:48', '1', '2021-04-11 20:33:54', b'0');
1356 1474 INSERT INTO `tool_codegen_column` VALUES (446, 36, 'deleted', 'bit(1)', '是å¦åˆ é™¤', b'0', b'0', '0', 29, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'0', '=', b'0', 'radio', '1', '2021-04-11 09:13:48', '1', '2021-04-11 20:33:54', b'0');
  1475 +INSERT INTO `tool_codegen_column` VALUES (447, 37, 'id', 'bigint(20)', '错误ç ç¼–å·', b'0', b'1', '1', 1, 'Long', 'id', '', '1024', b'0', b'1', b'0', '=', b'1', 'input', '1', '2021-04-21 00:04:13', '1', '2021-04-21 00:55:37', b'0');
  1476 +INSERT INTO `tool_codegen_column` VALUES (448, 37, 'type', 'tinyint(4)', '错误ç ç±»åž‹', b'0', b'0', '0', 2, 'Integer', 'type', 'inf_error_code_type', '1', b'0', b'0', b'1', '=', b'1', 'select', '1', '2021-04-21 00:04:13', '1', '2021-04-21 00:55:37', b'0');
  1477 +INSERT INTO `tool_codegen_column` VALUES (449, 37, 'application_name', 'varchar(50)', '应用å', b'0', b'0', '0', 3, 'String', 'applicationName', '', 'dashboard', b'1', b'1', b'1', 'LIKE', b'1', 'input', '1', '2021-04-21 00:04:13', '1', '2021-04-21 00:55:37', b'0');
  1478 +INSERT INTO `tool_codegen_column` VALUES (450, 37, 'code', 'int(11)', '错误ç ç¼–ç ', b'0', b'0', '0', 4, 'Integer', 'code', '', '1234', b'1', b'1', b'1', '=', b'1', 'input', '1', '2021-04-21 00:04:13', '1', '2021-04-21 00:55:37', b'0');
  1479 +INSERT INTO `tool_codegen_column` VALUES (451, 37, 'message', 'varchar(512)', '错误ç é”™è¯¯æç¤º', b'0', b'0', '0', 5, 'String', 'message', '', '帅气', b'1', b'1', b'1', 'LIKE', b'1', 'input', '1', '2021-04-21 00:04:13', '1', '2021-04-21 00:55:37', b'0');
  1480 +INSERT INTO `tool_codegen_column` VALUES (452, 37, 'memo', 'varchar(512)', '备注', b'1', b'0', '0', 6, 'String', 'memo', '', '哈哈哈', b'1', b'1', b'0', '=', b'1', 'input', '1', '2021-04-21 00:04:13', '1', '2021-04-21 00:55:37', b'0');
  1481 +INSERT INTO `tool_codegen_column` VALUES (453, 37, 'creator', 'varchar(64)', '创建者', b'1', b'0', '0', 7, 'String', 'creator', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '1', '2021-04-21 00:04:13', '1', '2021-04-21 00:55:37', b'0');
  1482 +INSERT INTO `tool_codegen_column` VALUES (454, 37, 'create_time', 'datetime', '创建时间', b'0', b'0', '0', 8, 'Date', 'createTime', '', NULL, b'0', b'0', b'1', 'BETWEEN', b'1', 'datetime', '1', '2021-04-21 00:04:13', '1', '2021-04-21 00:55:37', b'0');
  1483 +INSERT INTO `tool_codegen_column` VALUES (455, 37, 'updater', 'varchar(64)', '更新者', b'1', b'0', '0', 9, 'String', 'updater', '', NULL, b'0', b'0', b'0', '=', b'0', 'input', '1', '2021-04-21 00:04:13', '1', '2021-04-21 00:55:37', b'0');
  1484 +INSERT INTO `tool_codegen_column` VALUES (456, 37, 'update_time', 'datetime', 'æ›´æ–°æ—¶é—´', b'0', b'0', '0', 10, 'Date', 'updateTime', '', NULL, b'0', b'0', b'0', 'BETWEEN', b'0', 'datetime', '1', '2021-04-21 00:04:13', '1', '2021-04-21 00:55:37', b'0');
  1485 +INSERT INTO `tool_codegen_column` VALUES (457, 37, 'deleted', 'bit(1)', '是å¦åˆ é™¤', b'0', b'0', '0', 11, 'Boolean', 'deleted', '', NULL, b'0', b'0', b'0', '=', b'0', 'radio', '1', '2021-04-21 00:04:13', '1', '2021-04-21 00:55:37', b'0');
1357 1486 COMMIT;
1358 1487  
1359 1488 -- ----------------------------
... ... @@ -1379,7 +1508,7 @@ CREATE TABLE `tool_codegen_table` (
1379 1508 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
1380 1509 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
1381 1510 PRIMARY KEY (`id`) USING BTREE
1382   -) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb4 COMMENT='代ç ç”Ÿæˆè¡¨å®šä¹‰';
  1511 +) ENGINE=InnoDB AUTO_INCREMENT=38 DEFAULT CHARSET=utf8mb4 COMMENT='代ç ç”Ÿæˆè¡¨å®šä¹‰';
1383 1512  
1384 1513 -- ----------------------------
1385 1514 -- Records of tool_codegen_table
... ... @@ -1400,6 +1529,7 @@ INSERT INTO `tool_codegen_table` VALUES (33, 1, &#39;inf_file&#39;, &#39;文件表&#39;, NULL, &#39;
1400 1529 INSERT INTO `tool_codegen_table` VALUES (34, 1, 'sys_sms_channel', '短信渠é“', NULL, 'system', 'sms', 'SysSmsChannel', '短信渠é“', 'èŠ‹é“æºç ', 1, 1093, '1', '2021-04-03 13:39:06', '1', '2021-04-05 20:52:09', b'0');
1401 1530 INSERT INTO `tool_codegen_table` VALUES (35, 1, 'sys_sms_template', '短信模æ¿', NULL, 'system', 'sms', 'SysSmsTemplate', '短信模æ¿', 'èŠ‹é“æºç ', 1, 1093, '1', '2021-04-03 13:58:55', '1', '2021-04-05 22:23:38', b'0');
1402 1531 INSERT INTO `tool_codegen_table` VALUES (36, 1, 'sys_sms_log', '短信日志', NULL, 'system', 'sms', 'SysSmsLog', '短信日志', 'èŠ‹é“æºç ', 1, 1093, '1', '2021-04-11 01:12:57', '1', '2021-04-11 20:33:54', b'0');
  1532 +INSERT INTO `tool_codegen_table` VALUES (37, 1, 'inf_error_code', '错误ç è¡¨', NULL, 'infra', 'errorcode', 'InfErrorCode', '错误ç ', 'èŠ‹é“æºç ', 1, 2, '1', '2021-04-20 15:27:45', '1', '2021-04-21 00:55:37', b'0');
1403 1533 COMMIT;
1404 1534  
1405 1535 -- ----------------------------
... ...
src/main/java/cn/iocoder/dashboard/framework/errorcode/config/ErrorCodeConfiguration.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.config;
  2 +
  3 +import cn.iocoder.dashboard.framework.errorcode.core.generator.ErrorCodeAutoGenerator;
  4 +import cn.iocoder.dashboard.framework.errorcode.core.loader.ErrorCodeLoader;
  5 +import cn.iocoder.dashboard.framework.errorcode.core.service.ErrorCodeFrameworkService;
  6 +import cn.iocoder.dashboard.framework.errorcode.core.loader.ErrorCodeLoaderImpl;
  7 +import cn.iocoder.dashboard.framework.errorcode.core.generator.ErrorCodeAutoGeneratorImpl;
  8 +import org.springframework.beans.factory.annotation.Value;
  9 +import org.springframework.boot.context.properties.EnableConfigurationProperties;
  10 +import org.springframework.context.annotation.Bean;
  11 +import org.springframework.context.annotation.Configuration;
  12 +import org.springframework.scheduling.annotation.EnableScheduling;
  13 +
  14 +/**
  15 + * 错误码配置类
  16 + */
  17 +@Configuration
  18 +@EnableConfigurationProperties(ErrorCodeProperties.class)
  19 +@EnableScheduling // 开启调度任务的功能,因为 ErrorCodeRemoteLoader 通过定时刷新错误码
  20 +public class ErrorCodeConfiguration {
  21 +
  22 + @Bean
  23 + public ErrorCodeAutoGenerator errorCodeAutoGenerator(@Value("${spring.application.name}") String applicationName,
  24 + ErrorCodeProperties errorCodeProperties,
  25 + ErrorCodeFrameworkService errorCodeFrameworkService) {
  26 + return new ErrorCodeAutoGeneratorImpl(applicationName, errorCodeProperties.getConstantsClassList(),
  27 + errorCodeFrameworkService);
  28 + }
  29 +
  30 + @Bean
  31 + public ErrorCodeLoader errorCodeLoader(@Value("${spring.application.name}") String applicationName,
  32 + ErrorCodeFrameworkService errorCodeFrameworkService) {
  33 + return new ErrorCodeLoaderImpl(applicationName, errorCodeFrameworkService);
  34 + }
  35 +
  36 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/errorcode/config/ErrorCodeProperties.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.config;
  2 +
  3 +import lombok.Data;
  4 +import org.springframework.boot.context.properties.ConfigurationProperties;
  5 +import org.springframework.validation.annotation.Validated;
  6 +
  7 +import javax.validation.constraints.NotNull;
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * 错误码的配置属性类
  12 + *
  13 + * @author dlyan
  14 + */
  15 +@ConfigurationProperties("yudao.error-code")
  16 +@Data
  17 +@Validated
  18 +public class ErrorCodeProperties {
  19 +
  20 + /**
  21 + * 错误码枚举类
  22 + */
  23 + @NotNull(message = "错误码枚举类不能为空")
  24 + private List<String> constantsClassList;
  25 +
  26 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/dto/ErrorCodeAutoGenerateReqDTO.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.core.dto;
  2 +
  3 +import lombok.Data;
  4 +import lombok.experimental.Accessors;
  5 +
  6 +import javax.validation.constraints.NotEmpty;
  7 +import javax.validation.constraints.NotNull;
  8 +
  9 +/**
  10 + * 错误码自动生成 DTO
  11 + *
  12 + * @author dylan
  13 + */
  14 +@Data
  15 +@Accessors(chain = true)
  16 +public class ErrorCodeAutoGenerateReqDTO {
  17 +
  18 + /**
  19 + * 应用名
  20 + */
  21 + @NotNull(message = "应用名不能为空")
  22 + private String applicationName;
  23 + /**
  24 + * 错误码编码
  25 + */
  26 + @NotNull(message = "错误码编码不能为空")
  27 + private Integer code;
  28 + /**
  29 + * 错误码错误提示
  30 + */
  31 + @NotEmpty(message = "错误码错误提示不能为空")
  32 + private String message;
  33 +
  34 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/dto/ErrorCodeRespDTO.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.core.dto;
  2 +
  3 +import lombok.Data;
  4 +
  5 +import java.util.Date;
  6 +
  7 +/**
  8 + * 错误码的 Response DTO
  9 + *
  10 + * @author 芋道源码
  11 + */
  12 +@Data
  13 +public class ErrorCodeRespDTO {
  14 +
  15 + /**
  16 + * 错误码编码
  17 + */
  18 + private Integer code;
  19 + /**
  20 + * 错误码错误提示
  21 + */
  22 + private String message;
  23 + /**
  24 + * 更新时间
  25 + */
  26 + private Date updateTime;
  27 +
  28 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/generator/ErrorCodeAutoGenerator.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.core.generator;
  2 +
  3 +/**
  4 + * 错误码的自动生成器
  5 + *
  6 + * @author dylan
  7 + */
  8 +public interface ErrorCodeAutoGenerator {
  9 +
  10 + /**
  11 + * 将配置类到错误码写入数据库
  12 + */
  13 + void execute();
  14 +
  15 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/generator/ErrorCodeAutoGeneratorImpl.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.core.generator;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.util.ClassUtil;
  5 +import cn.hutool.core.util.ReflectUtil;
  6 +import cn.iocoder.dashboard.common.exception.ErrorCode;
  7 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO;
  8 +import cn.iocoder.dashboard.framework.errorcode.core.service.ErrorCodeFrameworkService;
  9 +import lombok.RequiredArgsConstructor;
  10 +import lombok.extern.slf4j.Slf4j;
  11 +import org.springframework.boot.context.event.ApplicationReadyEvent;
  12 +import org.springframework.context.event.EventListener;
  13 +import org.springframework.scheduling.annotation.Async;
  14 +
  15 +import java.util.ArrayList;
  16 +import java.util.Arrays;
  17 +import java.util.List;
  18 +
  19 +/**
  20 + * ErrorCodeAutoGenerator 的实现类
  21 + * 目的是,扫描指定的 {@link #constantsClassList} 类,写入到 system 服务中
  22 + *
  23 + * @author dylan
  24 + */
  25 +@RequiredArgsConstructor
  26 +@Slf4j
  27 +public class ErrorCodeAutoGeneratorImpl implements ErrorCodeAutoGenerator {
  28 +
  29 + /**
  30 + * 应用分组
  31 + */
  32 + private final String applicationName;
  33 + /**
  34 + * 错误码枚举类
  35 + */
  36 + private final List<String> constantsClassList;
  37 + /**
  38 + * 错误码 Service
  39 + */
  40 + private final ErrorCodeFrameworkService errorCodeService;
  41 +
  42 + @Override
  43 + @EventListener(ApplicationReadyEvent.class)
  44 + @Async // 异步,保证项目的启动过程,毕竟非关键流程
  45 + public void execute() {
  46 + // 第一步,解析错误码
  47 + List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs = parseErrorCode();
  48 + log.info("[execute][解析到错误码数量为 ({}) 个]", autoGenerateDTOs.size());
  49 +
  50 + // 第二步,写入到 system 服务
  51 + errorCodeService.autoGenerateErrorCodes(autoGenerateDTOs);
  52 + log.info("[execute][写入到 system 组件完成]");
  53 + }
  54 +
  55 + /**
  56 + * 解析 constantsClassList 变量,转换成错误码数组
  57 + *
  58 + * @return 错误码数组
  59 + */
  60 + private List<ErrorCodeAutoGenerateReqDTO> parseErrorCode() {
  61 + // 校验 errorCodeConstantsClass 参数
  62 + if (CollUtil.isEmpty(constantsClassList)) {
  63 + log.info("[execute][未配置 yudao.error-code.constants-class-list 配置项,不进行自动写入到 system 服务中]");
  64 + return new ArrayList<>();
  65 + }
  66 +
  67 + // 解析错误码
  68 + List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs = new ArrayList<>();
  69 + constantsClassList.forEach(constantsClass -> {
  70 + // 解析错误码枚举类
  71 + Class<?> errorCodeConstantsClazz = ClassUtil.loadClass(constantsClass);
  72 + // 解析错误码
  73 + autoGenerateDTOs.addAll(parseErrorCode(errorCodeConstantsClazz));
  74 + });
  75 + return autoGenerateDTOs;
  76 + }
  77 +
  78 + /**
  79 + * 解析错误码类,获得错误码数组
  80 + *
  81 + * @return 错误码数组
  82 + */
  83 + private List<ErrorCodeAutoGenerateReqDTO> parseErrorCode(Class<?> constantsClass) {
  84 + List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs = new ArrayList<>();
  85 + Arrays.stream(constantsClass.getFields()).forEach(field -> {
  86 + if (field.getType() != ErrorCode.class) {
  87 + return;
  88 + }
  89 + // 转换成 ErrorCodeAutoGenerateReqDTO 对象
  90 + ErrorCode errorCode = (ErrorCode) ReflectUtil.getFieldValue(constantsClass, field);
  91 + autoGenerateDTOs.add(new ErrorCodeAutoGenerateReqDTO().setApplicationName(applicationName)
  92 + .setCode(errorCode.getCode()).setMessage(errorCode.getMsg()));
  93 + });
  94 + return autoGenerateDTOs;
  95 + }
  96 +
  97 +}
  98 +
... ...
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/loader/ErrorCodeLoader.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.core.loader;
  2 +
  3 +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
  4 +
  5 +/**
  6 + * 错误码加载器
  7 + *
  8 + * 注意,错误码最终加载到 {@link cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil} 的 MESSAGES 变量中!
  9 + *
  10 + * @author dlyan
  11 + */
  12 +public interface ErrorCodeLoader {
  13 +
  14 + /**
  15 + * 添加错误码
  16 + *
  17 + * @param code 错误码的编号
  18 + * @param msg 错误码的提示
  19 + */
  20 + default void putErrorCode(Integer code, String msg) {
  21 + ServiceExceptionUtil.put(code, msg);
  22 + }
  23 +
  24 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/loader/ErrorCodeLoaderImpl.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.core.loader;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeRespDTO;
  5 +import cn.iocoder.dashboard.framework.errorcode.core.service.ErrorCodeFrameworkService;
  6 +import cn.iocoder.dashboard.util.date.DateUtils;
  7 +import lombok.RequiredArgsConstructor;
  8 +import lombok.extern.slf4j.Slf4j;
  9 +import org.springframework.boot.context.event.ApplicationReadyEvent;
  10 +import org.springframework.context.event.EventListener;
  11 +import org.springframework.scheduling.annotation.Scheduled;
  12 +
  13 +import java.util.Date;
  14 +import java.util.List;
  15 +
  16 +/**
  17 + * ErrorCodeLoader 的实现类,从 infra 的数据库中,加载错误码。
  18 + *
  19 + * 考虑到错误码会刷新,所以按照 {@link #REFRESH_ERROR_CODE_PERIOD} 频率,增量加载错误码。
  20 + *
  21 + * @author dlyan
  22 + */
  23 +@RequiredArgsConstructor
  24 +@Slf4j
  25 +public class ErrorCodeLoaderImpl implements ErrorCodeLoader {
  26 +
  27 + /**
  28 + * 刷新错误码的频率,单位:毫秒
  29 + */
  30 + private static final int REFRESH_ERROR_CODE_PERIOD = 60 * 1000;
  31 +
  32 + /**
  33 + * 应用分组
  34 + */
  35 + private final String applicationName;
  36 + /**
  37 + * 错误码 Service
  38 + */
  39 + private final ErrorCodeFrameworkService errorCodeService;
  40 +
  41 + /**
  42 + * 缓存错误码的最大更新时间,用于后续的增量轮询,判断是否有更新
  43 + */
  44 + private Date maxUpdateTime;
  45 +
  46 + @EventListener(ApplicationReadyEvent.class)
  47 + public void loadErrorCodes() {
  48 + this.loadErrorCodes0();
  49 + }
  50 +
  51 + @Scheduled(fixedDelay = REFRESH_ERROR_CODE_PERIOD, initialDelay = REFRESH_ERROR_CODE_PERIOD)
  52 + public void refreshErrorCodes() {
  53 + this.loadErrorCodes0();
  54 + }
  55 +
  56 + private void loadErrorCodes0() {
  57 + // 加载错误码
  58 + List<ErrorCodeRespDTO> errorCodeRespDTOs = errorCodeService.getErrorCodeList(applicationName, maxUpdateTime);
  59 + if (CollUtil.isEmpty(errorCodeRespDTOs)) {
  60 + return;
  61 + }
  62 + log.info("[loadErrorCodes0][加载到 ({}) 个错误码]", errorCodeRespDTOs.size());
  63 +
  64 + // 刷新错误码的缓存
  65 + errorCodeRespDTOs.forEach(errorCodeRespDTO -> {
  66 + // 写入到错误码的缓存
  67 + putErrorCode(errorCodeRespDTO.getCode(), errorCodeRespDTO.getMessage());
  68 + // 记录下更新时间,方便增量更新
  69 + maxUpdateTime = DateUtils.max(maxUpdateTime, errorCodeRespDTO.getUpdateTime());
  70 + });
  71 + }
  72 +
  73 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/errorcode/core/service/ErrorCodeFrameworkService.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.errorcode.core.service;
  2 +
  3 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO;
  4 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeRespDTO;
  5 +
  6 +import javax.validation.Valid;
  7 +import java.util.Date;
  8 +import java.util.List;
  9 +
  10 +/**
  11 + * 错误码 Framework Service 接口
  12 + *
  13 + * @author 芋道源码
  14 + */
  15 +public interface ErrorCodeFrameworkService {
  16 +
  17 + /**
  18 + * 自动创建错误码
  19 + *
  20 + * @param autoGenerateDTOs 错误码信息
  21 + */
  22 + void autoGenerateErrorCodes(@Valid List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs);
  23 +
  24 + /**
  25 + * 增量获得错误码数组
  26 + *
  27 + * 如果 minUpdateTime 为空时,则获取所有错误码
  28 + *
  29 + * @param applicationName 应用名
  30 + * @param minUpdateTime 最小更新时间
  31 + * @return 错误码数组
  32 + */
  33 + List<ErrorCodeRespDTO> getErrorCodeList(String applicationName, Date minUpdateTime);
  34 +
  35 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/validator/InEnum.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.validator;
  2 +
  3 +import cn.iocoder.dashboard.common.core.IntArrayValuable;
  4 +
  5 +import javax.validation.Constraint;
  6 +import javax.validation.Payload;
  7 +import java.lang.annotation.*;
  8 +
  9 +@Target({
  10 + ElementType.METHOD,
  11 + ElementType.FIELD,
  12 + ElementType.ANNOTATION_TYPE,
  13 + ElementType.CONSTRUCTOR,
  14 + ElementType.PARAMETER,
  15 + ElementType.TYPE_USE
  16 +})
  17 +@Retention(RetentionPolicy.RUNTIME)
  18 +@Documented
  19 +@Constraint(
  20 + validatedBy = InEnumValidator.class
  21 +)
  22 +public @interface InEnum {
  23 +
  24 + /**
  25 + * @return 实现 EnumValuable 接口的
  26 + */
  27 + Class<? extends IntArrayValuable> value();
  28 +
  29 + String message() default "必须在指定范围 {value}";
  30 +
  31 + Class<?>[] groups() default {};
  32 +
  33 + Class<? extends Payload>[] payload() default {};
  34 +
  35 +}
0 36 \ No newline at end of file
... ...
src/main/java/cn/iocoder/dashboard/framework/validator/InEnumValidator.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.validator;
  2 +
  3 +import cn.iocoder.dashboard.common.core.IntArrayValuable;
  4 +
  5 +import javax.validation.ConstraintValidator;
  6 +import javax.validation.ConstraintValidatorContext;
  7 +import java.util.Arrays;
  8 +import java.util.Collections;
  9 +import java.util.List;
  10 +import java.util.stream.Collectors;
  11 +
  12 +public class InEnumValidator implements ConstraintValidator<InEnum, Integer> {
  13 +
  14 + private List<Integer> values;
  15 +
  16 + @Override
  17 + public void initialize(InEnum annotation) {
  18 + IntArrayValuable[] values = annotation.value().getEnumConstants();
  19 + if (values.length == 0) {
  20 + this.values = Collections.emptyList();
  21 + } else {
  22 + this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList());
  23 + }
  24 + }
  25 +
  26 + @Override
  27 + public boolean isValid(Integer value, ConstraintValidatorContext context) {
  28 + // 为空时,默认不校验,即认为通过
  29 + if (value == null) {
  30 + return true;
  31 + }
  32 + // 校验通过
  33 + if (values.contains(value)) {
  34 + return true;
  35 + }
  36 + // 校验不通过,自定义提示语句(因为,注解上的 value 是枚举类,无法获得枚举类的实际值)
  37 + context.disableDefaultConstraintViolation(); // 禁用默认的 message 的值
  38 + context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate()
  39 + .replaceAll("\\{value}", values.toString())).addConstraintViolation(); // 重新添加错误提示语句
  40 + return false;
  41 + }
  42 +
  43 +}
  44 +
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostExportReqVO.java
... ... @@ -8,6 +8,9 @@ import lombok.Data;
8 8 @Data
9 9 public class SysPostExportReqVO {
10 10  
  11 + @ApiModelProperty(value = "岗位编码", example = "yudao", notes = "模糊匹配")
  12 + private String code;
  13 +
11 14 @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配")
12 15 private String name;
13 16  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/vo/post/SysPostPageReqVO.java
... ... @@ -11,6 +11,9 @@ import lombok.EqualsAndHashCode;
11 11 @EqualsAndHashCode(callSuper = true)
12 12 public class SysPostPageReqVO extends PageParam {
13 13  
  14 + @ApiModelProperty(value = "岗位编码", example = "yudao", notes = "模糊匹配")
  15 + private String code;
  16 +
14 17 @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配")
15 18 private String name;
16 19  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.http 0 → 100644
  1 +###
  2 +POST {{baseUrl}}/inra/error-code/create
  3 +Authorization: Bearer {{token}}
  4 +Content-Type:application/json
  5 +
  6 +{
  7 + "code": 200,
  8 + "message": "成功",
  9 + "group": "test",
  10 + "type": 1
  11 +}
  12 +
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/SysErrorCodeController.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.errorcode;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.CommonResult;
  4 +import cn.iocoder.dashboard.common.pojo.PageResult;
  5 +import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
  6 +import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
  7 +import cn.iocoder.dashboard.modules.system.convert.errorcode.SysErrorCodeConvert;
  8 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.*;
  9 +import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO;
  10 +import cn.iocoder.dashboard.modules.system.service.errorcode.SysErrorCodeService;
  11 +import io.swagger.annotations.Api;
  12 +import io.swagger.annotations.ApiImplicitParam;
  13 +import io.swagger.annotations.ApiOperation;
  14 +import org.springframework.security.access.prepost.PreAuthorize;
  15 +import org.springframework.validation.annotation.Validated;
  16 +import org.springframework.web.bind.annotation.*;
  17 +
  18 +import javax.annotation.Resource;
  19 +import javax.servlet.http.HttpServletResponse;
  20 +import javax.validation.Valid;
  21 +import java.io.IOException;
  22 +import java.util.List;
  23 +
  24 +import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  25 +import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT;
  26 +
  27 +@Api(tags = "错误码")
  28 +@RestController
  29 +@RequestMapping("/system/error-code")
  30 +@Validated
  31 +public class SysErrorCodeController {
  32 +
  33 + @Resource
  34 + private SysErrorCodeService errorCodeService;
  35 +
  36 + @PostMapping("/create")
  37 + @ApiOperation("创建错误码")
  38 + @PreAuthorize("@ss.hasPermission('system:error-code:create')")
  39 + public CommonResult<Long> createErrorCode(@Valid @RequestBody SysErrorCodeCreateReqVO createReqVO) {
  40 + return success(errorCodeService.createErrorCode(createReqVO));
  41 + }
  42 +
  43 + @PutMapping("/update")
  44 + @ApiOperation("更新错误码")
  45 + @PreAuthorize("@ss.hasPermission('system:error-code:update')")
  46 + public CommonResult<Boolean> updateErrorCode(@Valid @RequestBody SysErrorCodeUpdateReqVO updateReqVO) {
  47 + errorCodeService.updateErrorCode(updateReqVO);
  48 + return success(true);
  49 + }
  50 +
  51 + @DeleteMapping("/delete")
  52 + @ApiOperation("删除错误码")
  53 + @ApiImplicitParam(name = "id", value = "编号", required = true)
  54 + @PreAuthorize("@ss.hasPermission('system:error-code:delete')")
  55 + public CommonResult<Boolean> deleteErrorCode(@RequestParam("id") Long id) {
  56 + errorCodeService.deleteErrorCode(id);
  57 + return success(true);
  58 + }
  59 +
  60 + @GetMapping("/get")
  61 + @ApiOperation("获得错误码")
  62 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  63 + @PreAuthorize("@ss.hasPermission('system:error-code:query')")
  64 + public CommonResult<SysErrorCodeRespVO> getErrorCode(@RequestParam("id") Long id) {
  65 + SysErrorCodeDO errorCode = errorCodeService.getErrorCode(id);
  66 + return success(SysErrorCodeConvert.INSTANCE.convert(errorCode));
  67 + }
  68 +
  69 + @GetMapping("/page")
  70 + @ApiOperation("获得错误码分页")
  71 + @PreAuthorize("@ss.hasPermission('system:error-code:query')")
  72 + public CommonResult<PageResult<SysErrorCodeRespVO>> getErrorCodePage(@Valid SysErrorCodePageReqVO pageVO) {
  73 + PageResult<SysErrorCodeDO> pageResult = errorCodeService.getErrorCodePage(pageVO);
  74 + return success(SysErrorCodeConvert.INSTANCE.convertPage(pageResult));
  75 + }
  76 +
  77 + @GetMapping("/export-excel")
  78 + @ApiOperation("导出错误码 Excel")
  79 + @PreAuthorize("@ss.hasPermission('system:error-code:export')")
  80 + @OperateLog(type = EXPORT)
  81 + public void exportErrorCodeExcel(@Valid SysErrorCodeExportReqVO exportReqVO,
  82 + HttpServletResponse response) throws IOException {
  83 + List<SysErrorCodeDO> list = errorCodeService.getErrorCodeList(exportReqVO);
  84 + // 导出 Excel
  85 + List<SysErrorCodeExcelVO> datas = SysErrorCodeConvert.INSTANCE.convertList02(list);
  86 + ExcelUtils.write(response, "错误码.xls", "数据", SysErrorCodeExcelVO.class, datas);
  87 + }
  88 +
  89 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeBaseVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.errorcode.vo;
  2 +
  3 +import io.swagger.annotations.ApiModelProperty;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 +* 错误码 Base VO,提供给添加、修改、详细的子 VO 使用
  10 +* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  11 +*/
  12 +@Data
  13 +public class SysErrorCodeBaseVO {
  14 +
  15 + @ApiModelProperty(value = "应用名", required = true, example = "dashboard")
  16 + @NotNull(message = "应用名不能为空")
  17 + private String applicationName;
  18 +
  19 + @ApiModelProperty(value = "错误码编码", required = true, example = "1234")
  20 + @NotNull(message = "错误码编码不能为空")
  21 + private Integer code;
  22 +
  23 + @ApiModelProperty(value = "错误码错误提示", required = true, example = "帅气")
  24 + @NotNull(message = "错误码错误提示不能为空")
  25 + private String message;
  26 +
  27 + @ApiModelProperty(value = "备注", example = "哈哈哈")
  28 + private String memo;
  29 +
  30 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.errorcode.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +@ApiModel("错误码创建 Request VO")
  9 +@Data
  10 +@EqualsAndHashCode(callSuper = true)
  11 +@ToString(callSuper = true)
  12 +public class SysErrorCodeCreateReqVO extends SysErrorCodeBaseVO {
  13 +
  14 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExcelVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.errorcode.vo;
  2 +
  3 +import cn.iocoder.dashboard.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.dashboard.framework.excel.core.convert.DictConvert;
  5 +import com.alibaba.excel.annotation.ExcelProperty;
  6 +import lombok.Data;
  7 +
  8 +import java.util.Date;
  9 +
  10 +import static cn.iocoder.dashboard.modules.system.enums.dict.SysDictTypeEnum.SYS_ERROR_CODE_TYPE;
  11 +
  12 +/**
  13 + * 错误码 Excel VO
  14 + *
  15 + * @author 芋道源码
  16 + */
  17 +@Data
  18 +public class SysErrorCodeExcelVO {
  19 +
  20 + @ExcelProperty("错误码编号")
  21 + private Long id;
  22 +
  23 + @ExcelProperty(value = "错误码类型", converter = DictConvert.class)
  24 + @DictFormat(SYS_ERROR_CODE_TYPE)
  25 + private Integer type;
  26 +
  27 + @ExcelProperty("应用名")
  28 + private String applicationName;
  29 +
  30 + @ExcelProperty("错误码编码")
  31 + private Integer code;
  32 +
  33 + @ExcelProperty("错误码错误提示")
  34 + private String message;
  35 +
  36 + @ExcelProperty("备注")
  37 + private String memo;
  38 +
  39 + @ExcelProperty("创建时间")
  40 + private Date createTime;
  41 +
  42 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeExportReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.errorcode.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import org.springframework.format.annotation.DateTimeFormat;
  7 +
  8 +import java.util.Date;
  9 +
  10 +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  11 +
  12 +@ApiModel(value = "错误码 Excel 导出 Request VO", description = "参数和 InfErrorCodePageReqVO 是一致的")
  13 +@Data
  14 +public class SysErrorCodeExportReqVO {
  15 +
  16 + @ApiModelProperty(value = "错误码类型", example = "1")
  17 + private Integer type;
  18 +
  19 + @ApiModelProperty(value = "应用名", example = "dashboard")
  20 + private String applicationName;
  21 +
  22 + @ApiModelProperty(value = "错误码编码", example = "1234")
  23 + private Integer code;
  24 +
  25 + @ApiModelProperty(value = "错误码错误提示", example = "帅气")
  26 + private String message;
  27 +
  28 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  29 + @ApiModelProperty(value = "开始创建时间")
  30 + private Date beginCreateTime;
  31 +
  32 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  33 + @ApiModelProperty(value = "结束创建时间")
  34 + private Date endCreateTime;
  35 +
  36 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodePageReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.errorcode.vo;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageParam;
  4 +import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.Data;
  7 +import lombok.EqualsAndHashCode;
  8 +import lombok.ToString;
  9 +import org.springframework.format.annotation.DateTimeFormat;
  10 +
  11 +import java.util.Date;
  12 +
  13 +import static cn.iocoder.dashboard.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  14 +
  15 +@ApiModel("错误码分页 Request VO")
  16 +@Data
  17 +@EqualsAndHashCode(callSuper = true)
  18 +@ToString(callSuper = true)
  19 +public class SysErrorCodePageReqVO extends PageParam {
  20 +
  21 + @ApiModelProperty(value = "错误码类型", example = "1", notes = "参见 SysErrorCodeTypeEnum 枚举类")
  22 + private Integer type;
  23 +
  24 + @ApiModelProperty(value = "应用名", example = "dashboard")
  25 + private String applicationName;
  26 +
  27 + @ApiModelProperty(value = "错误码编码", example = "1234")
  28 + private Integer code;
  29 +
  30 + @ApiModelProperty(value = "错误码错误提示", example = "帅气")
  31 + private String message;
  32 +
  33 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  34 + @ApiModelProperty(value = "开始创建时间")
  35 + private Date beginCreateTime;
  36 +
  37 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  38 + @ApiModelProperty(value = "结束创建时间")
  39 + private Date endCreateTime;
  40 +
  41 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeRespVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.errorcode.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import java.util.Date;
  10 +
  11 +@ApiModel("错误码 Response VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class SysErrorCodeRespVO extends SysErrorCodeBaseVO {
  16 +
  17 + @ApiModelProperty(value = "错误码编号", required = true, example = "1024")
  18 + private Long id;
  19 +
  20 + @ApiModelProperty(value = "错误码类型", required = true, example = "1", notes = "参见 SysErrorCodeTypeEnum 枚举类")
  21 + private Integer type;
  22 +
  23 + @ApiModelProperty(value = "创建时间", required = true)
  24 + private Date createTime;
  25 +
  26 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/errorcode/vo/SysErrorCodeUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.errorcode.vo;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +import javax.validation.constraints.NotNull;
  10 +
  11 +@ApiModel("错误码更新 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class SysErrorCodeUpdateReqVO extends SysErrorCodeBaseVO {
  16 +
  17 + @ApiModelProperty(value = "错误码编号", required = true, example = "1024")
  18 + @NotNull(message = "错误码编号不能为空")
  19 + private Long id;
  20 +
  21 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/convert/errorcode/SysErrorCodeConvert.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.convert.errorcode;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO;
  5 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeRespDTO;
  6 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeExcelVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeRespVO;
  9 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO;
  10 +import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO;
  11 +import org.mapstruct.Mapper;
  12 +import org.mapstruct.factory.Mappers;
  13 +
  14 +import java.util.List;
  15 +
  16 +/**
  17 + * 错误码 Convert
  18 + *
  19 + * @author 芋道源码
  20 + */
  21 +@Mapper
  22 +public interface SysErrorCodeConvert {
  23 +
  24 + SysErrorCodeConvert INSTANCE = Mappers.getMapper(SysErrorCodeConvert.class);
  25 +
  26 + SysErrorCodeDO convert(SysErrorCodeCreateReqVO bean);
  27 +
  28 + SysErrorCodeDO convert(SysErrorCodeUpdateReqVO bean);
  29 +
  30 + SysErrorCodeRespVO convert(SysErrorCodeDO bean);
  31 +
  32 + List<SysErrorCodeRespVO> convertList(List<SysErrorCodeDO> list);
  33 +
  34 + PageResult<SysErrorCodeRespVO> convertPage(PageResult<SysErrorCodeDO> page);
  35 +
  36 + List<SysErrorCodeExcelVO> convertList02(List<SysErrorCodeDO> list);
  37 +
  38 + SysErrorCodeDO convert(ErrorCodeAutoGenerateReqDTO bean);
  39 +
  40 + List<ErrorCodeRespDTO> convertList03(List<SysErrorCodeDO> list);
  41 +
  42 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/dataobject/errorcode/SysErrorCodeDO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode;
  2 +
  3 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.dashboard.modules.system.enums.errorcode.SysErrorCodeTypeEnum;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import lombok.Data;
  8 +import lombok.EqualsAndHashCode;
  9 +import lombok.ToString;
  10 +
  11 +/**
  12 + * 错误码表
  13 + *
  14 + * @author 芋道源码
  15 + */
  16 +@TableName(value = "sys_error_code")
  17 +@Data
  18 +@EqualsAndHashCode(callSuper = true)
  19 +@ToString(callSuper = true)
  20 +public class SysErrorCodeDO extends BaseDO {
  21 +
  22 + /**
  23 + * 错误码编号,自增
  24 + */
  25 + @TableId
  26 + private Long id;
  27 + /**
  28 + * 错误码类型
  29 + *
  30 + * 枚举 {@link SysErrorCodeTypeEnum}
  31 + */
  32 + private Integer type;
  33 + /**
  34 + * 应用名
  35 + */
  36 + private String applicationName;
  37 + /**
  38 + * 错误码编码
  39 + */
  40 + private Integer code;
  41 + /**
  42 + * 错误码错误提示
  43 + */
  44 + private String message;
  45 + /**
  46 + * 错误码备注
  47 + */
  48 + private String memo;
  49 +
  50 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dept/SysPostMapper.java
... ... @@ -22,12 +22,15 @@ public interface SysPostMapper extends BaseMapperX&lt;SysPostDO&gt; {
22 22  
23 23 default PageResult<SysPostDO> selectPage(SysPostPageReqVO reqVO) {
24 24 return selectPage(reqVO, new QueryWrapperX<SysPostDO>()
  25 + .likeIfPresent("code", reqVO.getCode())
25 26 .likeIfPresent("name", reqVO.getName())
26 27 .eqIfPresent("status", reqVO.getStatus()));
27 28 }
28 29  
29 30 default List<SysPostDO> selectList(SysPostExportReqVO reqVO) {
30   - return selectList(new QueryWrapperX<SysPostDO>().likeIfPresent("name", reqVO.getName())
  31 + return selectList(new QueryWrapperX<SysPostDO>()
  32 + .likeIfPresent("code", reqVO.getCode())
  33 + .likeIfPresent("name", reqVO.getName())
31 34 .eqIfPresent("status", reqVO.getStatus()));
32 35 }
33 36  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/errorcode/SysErrorCodeMapper.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.dal.mysql.errorcode;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
  6 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO;
  8 +import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO;
  9 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  10 +import org.apache.ibatis.annotations.Mapper;
  11 +
  12 +import java.util.Collection;
  13 +import java.util.Date;
  14 +import java.util.List;
  15 +
  16 +@Mapper
  17 +public interface SysErrorCodeMapper extends BaseMapperX<SysErrorCodeDO> {
  18 +
  19 + default PageResult<SysErrorCodeDO> selectPage(SysErrorCodePageReqVO reqVO) {
  20 + return selectPage(reqVO, new QueryWrapperX<SysErrorCodeDO>()
  21 + .eqIfPresent("type", reqVO.getType())
  22 + .likeIfPresent("application_name", reqVO.getApplicationName())
  23 + .eqIfPresent("code", reqVO.getCode())
  24 + .likeIfPresent("message", reqVO.getMessage())
  25 + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  26 + .orderByAsc("application_name", "code"));
  27 + }
  28 +
  29 + default List<SysErrorCodeDO> selectList(SysErrorCodeExportReqVO reqVO) {
  30 + return selectList(new QueryWrapperX<SysErrorCodeDO>()
  31 + .eqIfPresent("type", reqVO.getType())
  32 + .likeIfPresent("application_name", reqVO.getApplicationName())
  33 + .eqIfPresent("code", reqVO.getCode())
  34 + .likeIfPresent("message", reqVO.getMessage())
  35 + .betweenIfPresent("create_time", reqVO.getBeginCreateTime(), reqVO.getEndCreateTime())
  36 + .orderByAsc("application_name", "code"));
  37 + }
  38 +
  39 + default List<SysErrorCodeDO> selectListByCodes(Collection<Integer> codes) {
  40 + return selectList(new QueryWrapper<SysErrorCodeDO>().in("code", codes));
  41 + }
  42 +
  43 + default SysErrorCodeDO selectByCode(Integer code) {
  44 + return selectOne(new QueryWrapper<SysErrorCodeDO>().eq("code", code));
  45 + }
  46 +
  47 + default List<SysErrorCodeDO> selectListByApplicationNameAndUpdateTimeGt(String applicationName, Date minUpdateTime) {
  48 + return selectList(new QueryWrapperX<SysErrorCodeDO>().eq("application_name", applicationName)
  49 + .gtIfPresent("update_time", minUpdateTime));
  50 + }
  51 +
  52 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
... ... @@ -91,5 +91,8 @@ public interface SysErrorCodeConstants {
91 91 ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002012000, "手机号不存在");
92 92 ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002012001, "模板参数({})缺失");
93 93  
  94 + // ========== 错误码模块 1002013000 ==========
  95 + ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1002013000, "错误码不存在");
  96 + ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1002013001, "已经存在编码为【{}】的错误码");
94 97  
95 98 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/dict/SysDictTypeEnum.java
... ... @@ -22,12 +22,12 @@ public enum SysDictTypeEnum {
22 22 SYS_SMS_TEMPLATE_TYPE("sys_sms_template_type"), // 短信模板类型
23 23 SYS_SMS_SEND_STATUS("sys_sms_send_status"), // 短信发送状态
24 24 SYS_SMS_RECEIVE_STATUS("sys_sms_receive_status"), // 短信接收状态
  25 + SYS_ERROR_CODE_TYPE("inf_error_code_type"), // 错误码的类型枚举
25 26  
26 27 INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型
27 28 INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举
28 29 INF_JOB_LOG_STATUS("inf_job_log_status"), // 定时任务日志状态的枚举
29 30 INF_API_ERROR_LOG_PROCESS_STATUS("inf_api_error_log_process_status"), // API 错误日志的处理状态的枚举
30   -
31 31 ;
32 32  
33 33  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/errorcode/SysErrorCodeTypeEnum.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.enums.errorcode;
  2 +
  3 +import cn.iocoder.dashboard.common.core.IntArrayValuable;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +
  7 +import java.util.Arrays;
  8 +
  9 +/**
  10 + * 错误码的类型枚举
  11 + *
  12 + * @author dylan
  13 + */
  14 +@AllArgsConstructor
  15 +@Getter
  16 +public enum SysErrorCodeTypeEnum implements IntArrayValuable {
  17 +
  18 + /**
  19 + * 自动生成
  20 + */
  21 + AUTO_GENERATION(1),
  22 + /**
  23 + * 手动编辑
  24 + */
  25 + MANUAL_OPERATION(2);
  26 +
  27 + public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysErrorCodeTypeEnum::getType).toArray();
  28 +
  29 + /**
  30 + * 类型
  31 + */
  32 + private final Integer type;
  33 +
  34 + @Override
  35 + public int[] array() {
  36 + return ARRAYS;
  37 + }
  38 +
  39 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java
... ... @@ -85,7 +85,7 @@ public class SysAuthServiceImpl implements SysAuthService {
85 85 @Override
86 86 public String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent) {
87 87 // 判断验证码是否正确
88   - this.verifyCaptcha(reqVO.getUsername(), reqVO.getUuid(), reqVO.getCode());
  88 +// this.verifyCaptcha(reqVO.getUsername(), reqVO.getUuid(), reqVO.getCode());
89 89  
90 90 // 使用账号密码,进行登陆。
91 91 LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword());
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeService.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.errorcode;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.framework.errorcode.core.service.ErrorCodeFrameworkService;
  5 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO;
  9 +import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO;
  10 +
  11 +import javax.validation.Valid;
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 错误码 Service 接口
  16 + *
  17 + * @author 芋道源码
  18 + */
  19 +public interface SysErrorCodeService extends ErrorCodeFrameworkService {
  20 +
  21 + /**
  22 + * 创建错误码
  23 + *
  24 + * @param createReqVO 创建信息
  25 + * @return 编号
  26 + */
  27 + Long createErrorCode(@Valid SysErrorCodeCreateReqVO createReqVO);
  28 +
  29 + /**
  30 + * 更新错误码
  31 + *
  32 + * @param updateReqVO 更新信息
  33 + */
  34 + void updateErrorCode(@Valid SysErrorCodeUpdateReqVO updateReqVO);
  35 +
  36 + /**
  37 + * 删除错误码
  38 + *
  39 + * @param id 编号
  40 + */
  41 + void deleteErrorCode(Long id);
  42 +
  43 + /**
  44 + * 获得错误码
  45 + *
  46 + * @param id 编号
  47 + * @return 错误码
  48 + */
  49 + SysErrorCodeDO getErrorCode(Long id);
  50 +
  51 + /**
  52 + * 获得错误码分页
  53 + *
  54 + * @param pageReqVO 分页查询
  55 + * @return 错误码分页
  56 + */
  57 + PageResult<SysErrorCodeDO> getErrorCodePage(SysErrorCodePageReqVO pageReqVO);
  58 +
  59 + /**
  60 + * 获得错误码列表, 用于 Excel 导出
  61 + *
  62 + * @param exportReqVO 查询条件
  63 + * @return 错误码列表
  64 + */
  65 + List<SysErrorCodeDO> getErrorCodeList(SysErrorCodeExportReqVO exportReqVO);
  66 +
  67 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/errorcode/impl/SysErrorCodeServiceImpl.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.errorcode.impl;
  2 +
  3 +import cn.hutool.core.collection.CollUtil;
  4 +import cn.iocoder.dashboard.common.pojo.PageResult;
  5 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO;
  6 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeRespDTO;
  7 +import cn.iocoder.dashboard.modules.system.convert.errorcode.SysErrorCodeConvert;
  8 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO;
  9 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO;
  10 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO;
  11 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO;
  12 +import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO;
  13 +import cn.iocoder.dashboard.modules.system.dal.mysql.errorcode.SysErrorCodeMapper;
  14 +import cn.iocoder.dashboard.modules.system.enums.errorcode.SysErrorCodeTypeEnum;
  15 +import cn.iocoder.dashboard.modules.system.service.errorcode.SysErrorCodeService;
  16 +import com.google.common.annotations.VisibleForTesting;
  17 +import lombok.extern.slf4j.Slf4j;
  18 +import org.springframework.stereotype.Service;
  19 +import org.springframework.transaction.annotation.Transactional;
  20 +import org.springframework.validation.annotation.Validated;
  21 +
  22 +import javax.annotation.Resource;
  23 +import java.util.Date;
  24 +import java.util.List;
  25 +import java.util.Map;
  26 +
  27 +import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception;
  28 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
  29 +import static cn.iocoder.dashboard.util.collection.CollectionUtils.convertMap;
  30 +import static cn.iocoder.dashboard.util.collection.CollectionUtils.convertSet;
  31 +
  32 +/**
  33 + * 错误码 Service 实现类
  34 + *
  35 + * @author dlyan
  36 + */
  37 +@Service
  38 +@Validated
  39 +@Slf4j
  40 +public class SysErrorCodeServiceImpl implements SysErrorCodeService {
  41 +
  42 + @Resource
  43 + private SysErrorCodeMapper errorCodeMapper;
  44 +
  45 + @Override
  46 + public Long createErrorCode(SysErrorCodeCreateReqVO createReqVO) {
  47 + // 校验 code 重复
  48 + validateCodeDuplicate(createReqVO.getCode(), null);
  49 +
  50 + // 插入
  51 + SysErrorCodeDO errorCode = SysErrorCodeConvert.INSTANCE.convert(createReqVO)
  52 + .setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType());
  53 + errorCodeMapper.insert(errorCode);
  54 + // 返回
  55 + return errorCode.getId();
  56 + }
  57 +
  58 + @Override
  59 + public void updateErrorCode(SysErrorCodeUpdateReqVO updateReqVO) {
  60 + // 校验存在
  61 + this.validateErrorCodeExists(updateReqVO.getId());
  62 + // 校验 code 重复
  63 + validateCodeDuplicate(updateReqVO.getCode(), updateReqVO.getId());
  64 +
  65 + // 更新
  66 + SysErrorCodeDO updateObj = SysErrorCodeConvert.INSTANCE.convert(updateReqVO)
  67 + .setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType());
  68 + errorCodeMapper.updateById(updateObj);
  69 + }
  70 +
  71 + @Override
  72 + public void deleteErrorCode(Long id) {
  73 + // 校验存在
  74 + this.validateErrorCodeExists(id);
  75 + // 删除
  76 + errorCodeMapper.deleteById(id);
  77 + }
  78 +
  79 + /**
  80 + * 校验错误码的唯一字段是否重复
  81 + *
  82 + * 是否存在相同编码的错误码
  83 + *
  84 + * @param code 错误码编码
  85 + * @param id 错误码编号
  86 + */
  87 + @VisibleForTesting
  88 + public void validateCodeDuplicate(Integer code, Long id) {
  89 + SysErrorCodeDO errorCodeDO = errorCodeMapper.selectByCode(code);
  90 + if (errorCodeDO == null) {
  91 + return;
  92 + }
  93 + // 如果 id 为空,说明不用比较是否为相同 id 的错误码
  94 + if (id == null) {
  95 + throw exception(ERROR_CODE_DUPLICATE);
  96 + }
  97 + if (!errorCodeDO.getId().equals(id)) {
  98 + throw exception(ERROR_CODE_DUPLICATE);
  99 + }
  100 + }
  101 +
  102 + @VisibleForTesting
  103 + public void validateErrorCodeExists(Long id) {
  104 + if (errorCodeMapper.selectById(id) == null) {
  105 + throw exception(ERROR_CODE_NOT_EXISTS);
  106 + }
  107 + }
  108 +
  109 + @Override
  110 + public SysErrorCodeDO getErrorCode(Long id) {
  111 + return errorCodeMapper.selectById(id);
  112 + }
  113 +
  114 + @Override
  115 + public PageResult<SysErrorCodeDO> getErrorCodePage(SysErrorCodePageReqVO pageReqVO) {
  116 + return errorCodeMapper.selectPage(pageReqVO);
  117 + }
  118 +
  119 + @Override
  120 + public List<SysErrorCodeDO> getErrorCodeList(SysErrorCodeExportReqVO exportReqVO) {
  121 + return errorCodeMapper.selectList(exportReqVO);
  122 + }
  123 +
  124 + @Override
  125 + @Transactional
  126 + public void autoGenerateErrorCodes(List<ErrorCodeAutoGenerateReqDTO> autoGenerateDTOs) {
  127 + if (CollUtil.isEmpty(autoGenerateDTOs)) {
  128 + return;
  129 + }
  130 + // 获得错误码
  131 + List<SysErrorCodeDO> errorCodeDOs = errorCodeMapper.selectListByCodes(
  132 + convertSet(autoGenerateDTOs, ErrorCodeAutoGenerateReqDTO::getCode));
  133 + Map<Integer, SysErrorCodeDO> errorCodeDOMap = convertMap(errorCodeDOs, SysErrorCodeDO::getCode);
  134 +
  135 + // 遍历 autoGenerateBOs 数组,逐个插入或更新。考虑到每次量级不大,就不走批量了
  136 + autoGenerateDTOs.forEach(autoGenerateDTO -> {
  137 + SysErrorCodeDO errorCodeDO = errorCodeDOMap.get(autoGenerateDTO.getCode());
  138 + // 不存在,则进行新增
  139 + if (errorCodeDO == null) {
  140 + errorCodeDO = SysErrorCodeConvert.INSTANCE.convert(autoGenerateDTO)
  141 + .setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType());
  142 + errorCodeMapper.insert(errorCodeDO);
  143 + return;
  144 + }
  145 + // 存在,则进行更新。更新有三个前置条件:
  146 + // 条件 1. 只更新自动生成的错误码,即 Type 为 ErrorCodeTypeEnum.AUTO_GENERATION
  147 + if (!SysErrorCodeTypeEnum.AUTO_GENERATION.getType().equals(errorCodeDO.getType())) {
  148 + return;
  149 + }
  150 + // 条件 2. 分组 applicationName 必须匹配,避免存在错误码冲突的情况
  151 + if (!autoGenerateDTO.getApplicationName().equals(errorCodeDO.getApplicationName())) {
  152 + log.error("[autoGenerateErrorCodes][自动创建({}/{}) 错误码失败,数据库中已经存在({}/{})]",
  153 + autoGenerateDTO.getCode(), autoGenerateDTO.getApplicationName(),
  154 + errorCodeDO.getCode(), errorCodeDO.getApplicationName());
  155 + return;
  156 + }
  157 + // 条件 3. 错误提示语存在差异
  158 + if (autoGenerateDTO.getMessage().equals(errorCodeDO.getMessage())) {
  159 + return;
  160 + }
  161 + // 最终匹配,进行更新
  162 + errorCodeMapper.updateById(new SysErrorCodeDO().setId(errorCodeDO.getId()).setMessage(autoGenerateDTO.getMessage()));
  163 + });
  164 + }
  165 +
  166 + @Override
  167 + public List<ErrorCodeRespDTO> getErrorCodeList(String applicationName, Date minUpdateTime) {
  168 + List<SysErrorCodeDO> errorCodeDOs = errorCodeMapper.selectListByApplicationNameAndUpdateTimeGt(
  169 + applicationName, minUpdateTime);
  170 + return SysErrorCodeConvert.INSTANCE.convertList03(errorCodeDOs);
  171 + }
  172 +
  173 +}
  174 +
... ...
src/main/java/cn/iocoder/dashboard/util/date/DateUtils.java
... ... @@ -64,4 +64,14 @@ public class DateUtils {
64 64 return calendar.getTime();
65 65 }
66 66  
  67 + public static Date max(Date a, Date b) {
  68 + if (a == null) {
  69 + return b;
  70 + }
  71 + if (b == null) {
  72 + return a;
  73 + }
  74 + return a.compareTo(b) > 0 ? a : b;
  75 + }
  76 +
67 77 }
... ...
src/main/resources/application.yaml
... ... @@ -12,6 +12,7 @@ spring:
12 12 max-file-size: 16MB # 单个文件大小
13 13 max-request-size: 32MB # 设置总上传的文件大小
14 14  
  15 + # Jackson 配置项
15 16 jackson:
16 17 serialization:
17 18 write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳
... ... @@ -34,3 +35,8 @@ mybatis-plus:
34 35  
35 36 --- #################### 芋道相关配置 ####################
36 37  
  38 +yudao:
  39 + error-code: # 错误码相关配置项
  40 + constants-class-list:
  41 + - cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants
  42 + - cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants
... ...
src/main/resources/codegen/java/service/serviceImpl.vm
... ... @@ -53,7 +53,7 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
53 53 public void delete${simpleClassName}(${primaryColumn.javaType} id) {
54 54 // 校验存在
55 55 this.validate${simpleClassName}Exists(id);
56   - // 更新
  56 + // 删除
57 57 ${classNameVar}Mapper.deleteById(id);
58 58 }
59 59  
... ...
src/test/java/cn/iocoder/dashboard/modules/system/service/errorcode/SysErrorCodeServiceTest.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.service.errorcode;
  2 +
  3 +import cn.iocoder.dashboard.BaseDbUnitTest;
  4 +import cn.iocoder.dashboard.common.pojo.PageResult;
  5 +import cn.iocoder.dashboard.framework.errorcode.core.dto.ErrorCodeAutoGenerateReqDTO;
  6 +import cn.iocoder.dashboard.modules.infra.enums.config.InfConfigTypeEnum;
  7 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeCreateReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeExportReqVO;
  9 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodePageReqVO;
  10 +import cn.iocoder.dashboard.modules.system.controller.errorcode.vo.SysErrorCodeUpdateReqVO;
  11 +import cn.iocoder.dashboard.modules.system.dal.dataobject.errorcode.SysErrorCodeDO;
  12 +import cn.iocoder.dashboard.modules.system.dal.mysql.errorcode.SysErrorCodeMapper;
  13 +import cn.iocoder.dashboard.modules.system.enums.errorcode.SysErrorCodeTypeEnum;
  14 +import cn.iocoder.dashboard.modules.system.service.errorcode.impl.SysErrorCodeServiceImpl;
  15 +import cn.iocoder.dashboard.util.collection.ArrayUtils;
  16 +import cn.iocoder.dashboard.util.object.ObjectUtils;
  17 +import org.assertj.core.util.Lists;
  18 +import org.junit.jupiter.api.Test;
  19 +import org.mockito.Mock;
  20 +import org.slf4j.Logger;
  21 +import org.springframework.context.annotation.Import;
  22 +
  23 +import javax.annotation.Resource;
  24 +import java.util.List;
  25 +import java.util.function.Consumer;
  26 +
  27 +import static cn.hutool.core.util.RandomUtil.randomEle;
  28 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_DUPLICATE;
  29 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.ERROR_CODE_NOT_EXISTS;
  30 +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
  31 +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
  32 +import static cn.iocoder.dashboard.util.RandomUtils.*;
  33 +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime;
  34 +import static org.junit.jupiter.api.Assertions.*;
  35 +
  36 +/**
  37 +* {@link SysErrorCodeServiceImpl} 的单元测试类
  38 +*
  39 +* @author 芋道源码
  40 +*/
  41 +@Import(SysErrorCodeServiceImpl.class)
  42 +public class SysErrorCodeServiceTest extends BaseDbUnitTest {
  43 +
  44 + @Resource
  45 + private SysErrorCodeServiceImpl errorCodeService;
  46 +
  47 + @Resource
  48 + private SysErrorCodeMapper errorCodeMapper;
  49 +
  50 + @Mock
  51 + private Logger log;
  52 +
  53 + @Test
  54 + public void testCreateErrorCode_success() {
  55 + // 准备参数
  56 + SysErrorCodeCreateReqVO reqVO = randomPojo(SysErrorCodeCreateReqVO.class);
  57 +
  58 + // 调用
  59 + Long errorCodeId = errorCodeService.createErrorCode(reqVO);
  60 + // 断言
  61 + assertNotNull(errorCodeId);
  62 + // 校验记录的属性是否正确
  63 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(errorCodeId);
  64 + assertPojoEquals(reqVO, errorCode);
  65 + assertEquals(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType());
  66 + }
  67 +
  68 + @Test
  69 + public void testUpdateErrorCode_success() {
  70 + // mock 数据
  71 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO();
  72 + errorCodeMapper.insert(dbErrorCode);// @Sql: 先插入出一条存在的数据
  73 + // 准备参数
  74 + SysErrorCodeUpdateReqVO reqVO = randomPojo(SysErrorCodeUpdateReqVO.class, o -> {
  75 + o.setId(dbErrorCode.getId()); // 设置更新的 ID
  76 + });
  77 +
  78 + // 调用
  79 + errorCodeService.updateErrorCode(reqVO);
  80 + // 校验是否更新正确
  81 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(reqVO.getId()); // 获取最新的
  82 + assertPojoEquals(reqVO, errorCode);
  83 + assertEquals(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType(), errorCode.getType());
  84 + }
  85 +
  86 + @Test
  87 + public void testDeleteErrorCode_success() {
  88 + // mock 数据
  89 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO();
  90 + errorCodeMapper.insert(dbErrorCode);// @Sql: 先插入出一条存在的数据
  91 + // 准备参数
  92 + Long id = dbErrorCode.getId();
  93 +
  94 + // 调用
  95 + errorCodeService.deleteErrorCode(id);
  96 + // 校验数据不存在了
  97 + assertNull(errorCodeMapper.selectById(id));
  98 + }
  99 +
  100 + @Test
  101 + public void testGetErrorCodePage() {
  102 + // mock 数据
  103 + SysErrorCodeDO dbErrorCode = initGetErrorCodePage();
  104 + // 准备参数
  105 + SysErrorCodePageReqVO reqVO = new SysErrorCodePageReqVO();
  106 + reqVO.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType());
  107 + reqVO.setApplicationName("yudao");
  108 + reqVO.setCode(1);
  109 + reqVO.setMessage("yu");
  110 + reqVO.setBeginCreateTime(buildTime(2020, 11, 1));
  111 + reqVO.setEndCreateTime(buildTime(2020, 11, 30));
  112 +
  113 + // 调用
  114 + PageResult<SysErrorCodeDO> pageResult = errorCodeService.getErrorCodePage(reqVO);
  115 + // 断言
  116 + assertEquals(1, pageResult.getTotal());
  117 + assertEquals(1, pageResult.getList().size());
  118 + assertPojoEquals(dbErrorCode, pageResult.getList().get(0));
  119 + }
  120 +
  121 + /**
  122 + * 初始化 getErrorCodePage 方法的测试数据
  123 + */
  124 + private SysErrorCodeDO initGetErrorCodePage() {
  125 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> { // 等会查询到
  126 + o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType());
  127 + o.setApplicationName("yudaoyuanma");
  128 + o.setCode(1);
  129 + o.setMessage("yudao");
  130 + o.setCreateTime(buildTime(2020, 11, 11));
  131 + });
  132 + errorCodeMapper.insert(dbErrorCode);
  133 + // 测试 type 不匹配
  134 + errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType())));
  135 + // 测试 applicationName 不匹配
  136 + errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setApplicationName("yunai")));
  137 + // 测试 code 不匹配
  138 + errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setCode(2)));
  139 + // 测试 message 不匹配
  140 + errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setMessage("nai")));
  141 + // 测试 createTime 不匹配
  142 + errorCodeMapper.insert(ObjectUtils.clone(dbErrorCode, o -> o.setCreateTime(buildTime(2020, 12, 12))));
  143 + return dbErrorCode;
  144 + }
  145 +
  146 + @Test
  147 + public void testGetErrorCodeList() {
  148 + // mock 数据
  149 + SysErrorCodeDO dbErrorCode = initGetErrorCodePage();
  150 + // 准备参数
  151 + SysErrorCodeExportReqVO reqVO = new SysErrorCodeExportReqVO();
  152 + reqVO.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType());
  153 + reqVO.setApplicationName("yudao");
  154 + reqVO.setCode(1);
  155 + reqVO.setMessage("yu");
  156 + reqVO.setBeginCreateTime(buildTime(2020, 11, 1));
  157 + reqVO.setEndCreateTime(buildTime(2020, 11, 30));
  158 +
  159 + // 调用
  160 + List<SysErrorCodeDO> list = errorCodeService.getErrorCodeList(reqVO);
  161 + // 断言
  162 + assertEquals(1, list.size());
  163 + assertPojoEquals(dbErrorCode, list.get(0));
  164 + }
  165 +
  166 + @Test
  167 + public void testValidateCodeDuplicate_codeDuplicateForCreate() {
  168 + // 准备参数
  169 + Integer code = randomInteger();
  170 + // mock 数据
  171 + errorCodeMapper.insert(randomInfErrorCodeDO(o -> o.setCode(code)));
  172 +
  173 + // 调用,校验异常
  174 + assertServiceException(() -> errorCodeService.validateCodeDuplicate(code, null),
  175 + ERROR_CODE_DUPLICATE);
  176 + }
  177 +
  178 + @Test
  179 + public void testValidateCodeDuplicate_codeDuplicateForUpdate() {
  180 + // 准备参数
  181 + Long id = randomLongId();
  182 + Integer code = randomInteger();
  183 + // mock 数据
  184 + errorCodeMapper.insert(randomInfErrorCodeDO(o -> o.setCode(code)));
  185 +
  186 + // 调用,校验异常
  187 + assertServiceException(() -> errorCodeService.validateCodeDuplicate(code, id),
  188 + ERROR_CODE_DUPLICATE);
  189 + }
  190 +
  191 + @Test
  192 + public void testValidateErrorCodeExists_notExists() {
  193 + assertServiceException(() -> errorCodeService.validateErrorCodeExists(null),
  194 + ERROR_CODE_NOT_EXISTS);
  195 + }
  196 +
  197 + /**
  198 + * 情况 1,错误码不存在的情况
  199 + */
  200 + @Test
  201 + public void testAutoGenerateErrorCodes_01() {
  202 + // 准备参数
  203 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class);
  204 + // mock 方法
  205 +
  206 + // 调用
  207 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO));
  208 + // 断言
  209 + SysErrorCodeDO errorCode = errorCodeMapper.selectOne(null);
  210 + assertPojoEquals(generateReqDTO, errorCode);
  211 + assertEquals(SysErrorCodeTypeEnum.AUTO_GENERATION.getType(), errorCode.getType());
  212 + }
  213 +
  214 + /**
  215 + * 情况 2.1,错误码存在,但是是 SysErrorCodeTypeEnum.MANUAL_OPERATION 类型
  216 + */
  217 + @Test
  218 + public void testAutoGenerateErrorCodes_021() {
  219 + // mock 数据
  220 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.MANUAL_OPERATION.getType()));
  221 + errorCodeMapper.insert(dbErrorCode);
  222 + // 准备参数
  223 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class,
  224 + o -> o.setCode(dbErrorCode.getCode()));
  225 + // mock 方法
  226 +
  227 + // 调用
  228 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO));
  229 + // 断言,相等,说明不会更新
  230 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId());
  231 + assertPojoEquals(dbErrorCode, errorCode);
  232 + }
  233 +
  234 + /**
  235 + * 情况 2.2,错误码存在,但是是 applicationName 不匹配
  236 + */
  237 + @Test
  238 + public void testAutoGenerateErrorCodes_022() {
  239 + // mock 数据
  240 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()));
  241 + errorCodeMapper.insert(dbErrorCode);
  242 + // 准备参数
  243 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class,
  244 + o -> o.setCode(dbErrorCode.getCode()).setApplicationName(randomString()));
  245 + // mock 方法
  246 +
  247 + // 调用
  248 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO));
  249 + // 断言,相等,说明不会更新
  250 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId());
  251 + assertPojoEquals(dbErrorCode, errorCode);
  252 + }
  253 +
  254 + /**
  255 + * 情况 2.3,错误码存在,但是是 message 相同
  256 + */
  257 + @Test
  258 + public void testAutoGenerateErrorCodes_023() {
  259 + // mock 数据
  260 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()));
  261 + errorCodeMapper.insert(dbErrorCode);
  262 + // 准备参数
  263 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class,
  264 + o -> o.setCode(dbErrorCode.getCode()).setApplicationName(dbErrorCode.getApplicationName())
  265 + .setMessage(dbErrorCode.getMessage()));
  266 + // mock 方法
  267 +
  268 + // 调用
  269 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO));
  270 + // 断言,相等,说明不会更新
  271 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId());
  272 + assertPojoEquals(dbErrorCode, errorCode);
  273 + }
  274 +
  275 + /**
  276 + * 情况 2.3,错误码存在,但是是 message 不同,则进行更新
  277 + */
  278 + @Test
  279 + public void testAutoGenerateErrorCodes_024() {
  280 + // mock 数据
  281 + SysErrorCodeDO dbErrorCode = randomInfErrorCodeDO(o -> o.setType(SysErrorCodeTypeEnum.AUTO_GENERATION.getType()));
  282 + errorCodeMapper.insert(dbErrorCode);
  283 + // 准备参数
  284 + ErrorCodeAutoGenerateReqDTO generateReqDTO = randomPojo(ErrorCodeAutoGenerateReqDTO.class,
  285 + o -> o.setCode(dbErrorCode.getCode()).setApplicationName(dbErrorCode.getApplicationName()));
  286 + // mock 方法
  287 +
  288 + // 调用
  289 + errorCodeService.autoGenerateErrorCodes(Lists.newArrayList(generateReqDTO));
  290 + // 断言,匹配
  291 + SysErrorCodeDO errorCode = errorCodeMapper.selectById(dbErrorCode.getId());
  292 + assertPojoEquals(generateReqDTO, errorCode);
  293 + }
  294 +
  295 + // ========== 随机对象 ==========
  296 +
  297 + @SafeVarargs
  298 + private static SysErrorCodeDO randomInfErrorCodeDO(Consumer<SysErrorCodeDO>... consumers) {
  299 + Consumer<SysErrorCodeDO> consumer = (o) -> {
  300 + o.setType(randomEle(InfConfigTypeEnum.values()).getType()); // 保证 key 的范围
  301 + };
  302 + return randomPojo(SysErrorCodeDO.class, ArrayUtils.append(consumer, consumers));
  303 + }
  304 +
  305 +}
... ...
src/test/resources/sql/clean.sql
... ... @@ -22,3 +22,4 @@ DELETE FROM &quot;sys_user&quot;;
22 22 DELETE FROM "sys_sms_channel";
23 23 DELETE FROM "sys_sms_template";
24 24 DELETE FROM "sys_sms_log";
  25 +DELETE FROM "sys_error_code";
... ...
src/test/resources/sql/create_tables.sql
... ... @@ -359,7 +359,7 @@ CREATE TABLE IF NOT EXISTS &quot;sys_sms_channel&quot; (
359 359 PRIMARY KEY ("id")
360 360 ) COMMENT '短信渠道';
361 361  
362   -CREATE TABLE "sys_sms_template" (
  362 +CREATE TABLE IF NOT EXISTS "sys_sms_template" (
363 363 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
364 364 "type" tinyint NOT NULL,
365 365 "status" tinyint NOT NULL,
... ... @@ -379,7 +379,7 @@ CREATE TABLE &quot;sys_sms_template&quot; (
379 379 PRIMARY KEY ("id")
380 380 ) COMMENT '短信模板';
381 381  
382   -CREATE TABLE "sys_sms_log" (
  382 +CREATE TABLE IF NOT EXISTS "sys_sms_log" (
383 383 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
384 384 "channel_id" bigint NOT NULL,
385 385 "channel_code" varchar(63) NOT NULL,
... ... @@ -411,3 +411,18 @@ CREATE TABLE &quot;sys_sms_log&quot; (
411 411 "deleted" bit NOT NULL DEFAULT FALSE,
412 412 PRIMARY KEY ("id")
413 413 ) COMMENT '短信日志';
  414 +
  415 +CREATE TABLE IF NOT EXISTS "sys_error_code" (
  416 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  417 + "type" tinyint NOT NULL DEFAULT '0',
  418 + "application_name" varchar(50) NOT NULL,
  419 + "code" int NOT NULL DEFAULT '0',
  420 + "message" varchar(512) NOT NULL DEFAULT '',
  421 + "memo" varchar(512) DEFAULT '',
  422 + "creator" varchar(64) DEFAULT '',
  423 + "create_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  424 + "updater" varchar(64) DEFAULT '',
  425 + "update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  426 + "deleted" bit NOT NULL DEFAULT FALSE,
  427 + PRIMARY KEY ("id")
  428 +) COMMENT '错误码表';
... ...