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,7 +37,8 @@
37 | | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 | 37 | | 字典管理 | 对系统中经常使用的一些较为固定的数据进行维护 |
38 | 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、云片等主流短信平台 | 38 | 🚀 | 短信管理 | 短信渠道、短息模板、短信日志,对接阿里云、云片等主流短信平台 |
39 | 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 | 39 | 🚀 | 操作日志 | 系统正常操作日志记录和查询,集成 Swagger 生成日志内容 |
40 -| | 登录日志 | 系统登录日志记录查询包含登录异常 | 40 +| | 登录日志 | 系统登录日志记录查询,包含登录异常 |
  41 +| 🚀 | 错误码管理 | 系统所有错误码的管理,可在线修改错误提示,无需重启服务 |
41 | | 通知公告 | 系统通知公告信息发布维护 | 42 | | 通知公告 | 系统通知公告信息发布维护 |
42 43
43 计划新增功能: 44 计划新增功能:
@@ -53,7 +54,7 @@ @@ -53,7 +54,7 @@
53 | 🚀 | 文件服务 | 支持本地文件存储,同时支持兼容 Amazon S3 协议的云服务、开源组件 | 54 | 🚀 | 文件服务 | 支持本地文件存储,同时支持兼容 Amazon S3 协议的云服务、开源组件 |
54 | 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 | 55 | 🚀 | API 日志 | 包括 RESTful API 访问日志、异常日志两部分,方便排查 API 相关的问题 |
55 | | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 | 56 | | MySQL 监控 | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈 |
56 -| | Redis 监控 |监控 Redis 数据库的使用情况,使用的 Redis Key 管理 | 57 +| | Redis 监控 |监控 Redis 数据库的使用情况,使用的 Redis Key 管理 |
57 | 🚀 |Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 | 58 | 🚀 |Java 监控 | 基于 Spring Boot Admin 实现 Java 应用的监控 |
58 | 🚀 | 链路追踪 | 基于 SkyWalking 实现性能监控,特别是链路的追踪 | 59 | 🚀 | 链路追踪 | 基于 SkyWalking 实现性能监控,特别是链路的追踪 |
59 | 🚀 | 分布式锁 | 基于 Redis 实现分布式锁,满足并发场景 | 60 | 🚀 | 分布式锁 | 基于 Redis 实现分布式锁,满足并发场景 |
@@ -64,7 +65,6 @@ @@ -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,6 +21,7 @@ export const DICT_TYPE = {
21 SYS_SMS_TEMPLATE_TYPE: 'sys_sms_template_type', 21 SYS_SMS_TEMPLATE_TYPE: 'sys_sms_template_type',
22 SYS_SMS_SEND_STATUS: 'sys_sms_send_status', 22 SYS_SMS_SEND_STATUS: 'sys_sms_send_status',
23 SYS_SMS_RECEIVE_STATUS: 'sys_sms_receive_status', 23 SYS_SMS_RECEIVE_STATUS: 'sys_sms_receive_status',
  24 + SYS_ERROR_CODE_TYPE: 'sys_error_code_type',
24 25
25 INF_REDIS_TIMEOUT_TYPE: 'inf_redis_timeout_type', 26 INF_REDIS_TIMEOUT_TYPE: 'inf_redis_timeout_type',
26 INF_JOB_STATUS: 'inf_job_status', 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,7 +11,7 @@
11 Target Server Version : 50718 11 Target Server Version : 50718
12 File Encoding : 65001 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 SET NAMES utf8mb4; 17 SET NAMES utf8mb4;
@@ -43,7 +43,7 @@ CREATE TABLE `inf_api_access_log` ( @@ -43,7 +43,7 @@ CREATE TABLE `inf_api_access_log` (
43 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 43 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
44 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 44 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
45 PRIMARY KEY (`id`) USING BTREE 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 -- Records of inf_api_access_log 49 -- Records of inf_api_access_log
@@ -84,7 +84,7 @@ CREATE TABLE `inf_api_error_log` ( @@ -84,7 +84,7 @@ CREATE TABLE `inf_api_error_log` (
84 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 84 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
85 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 85 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
86 PRIMARY KEY (`id`) USING BTREE 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 -- Records of inf_api_error_log 90 -- Records of inf_api_error_log
@@ -118,7 +118,7 @@ CREATE TABLE `inf_config` ( @@ -118,7 +118,7 @@ CREATE TABLE `inf_config` (
118 -- ---------------------------- 118 -- ----------------------------
119 BEGIN; 119 BEGIN;
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'); 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 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'); 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 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'); 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 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'); 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,7 +201,7 @@ CREATE TABLE `inf_job_log` (
201 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 201 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
202 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 202 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
203 PRIMARY KEY (`id`) USING BTREE 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 -- Records of inf_job_log 207 -- Records of inf_job_log
@@ -264,7 +264,7 @@ CREATE TABLE `sys_dict_data` ( @@ -264,7 +264,7 @@ CREATE TABLE `sys_dict_data` (
264 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 264 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
265 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 265 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
266 PRIMARY KEY (`id`) USING BTREE 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 -- Records of sys_dict_data 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,6 +337,8 @@ INSERT INTO `sys_dict_data` VALUES (74, 0, &#39;等待结果&#39;, &#39;0&#39;, &#39;sys_sms_receive
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'); 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 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'); 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 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'); 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 COMMIT; 342 COMMIT;
341 343
342 -- ---------------------------- 344 -- ----------------------------
@@ -356,7 +358,7 @@ CREATE TABLE `sys_dict_type` ( @@ -356,7 +358,7 @@ CREATE TABLE `sys_dict_type` (
356 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 358 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
357 PRIMARY KEY (`id`) USING BTREE, 359 PRIMARY KEY (`id`) USING BTREE,
358 UNIQUE KEY `dict_type` (`type`) 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 -- Records of sys_dict_type 364 -- Records of sys_dict_type
@@ -383,6 +385,109 @@ INSERT INTO `sys_dict_type` VALUES (111, &#39;短信渠é“ç¼–ç &#39;, &#39;sys_sms_channel_ @@ -383,6 +385,109 @@ INSERT INTO `sys_dict_type` VALUES (111, &#39;短信渠é“ç¼–ç &#39;, &#39;sys_sms_channel_
383 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'); 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 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'); 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 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'); 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 COMMIT; 491 COMMIT;
387 492
388 -- ---------------------------- 493 -- ----------------------------
@@ -403,7 +508,7 @@ CREATE TABLE `sys_login_log` ( @@ -403,7 +508,7 @@ CREATE TABLE `sys_login_log` (
403 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 508 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
404 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 509 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
405 PRIMARY KEY (`id`) USING BTREE 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 -- Records of sys_login_log 514 -- Records of sys_login_log
@@ -432,7 +537,7 @@ CREATE TABLE `sys_menu` ( @@ -432,7 +537,7 @@ CREATE TABLE `sys_menu` (
432 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 537 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
433 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 538 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
434 PRIMARY KEY (`id`) USING BTREE 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 -- Records of sys_menu 543 -- Records of sys_menu
@@ -563,6 +668,12 @@ INSERT INTO `sys_menu` VALUES (1106, &#39;å‘逿µ‹è¯•短信&#39;, &#39;system:sms-template: @@ -563,6 +668,12 @@ INSERT INTO `sys_menu` VALUES (1106, &#39;å‘逿µ‹è¯•短信&#39;, &#39;system:sms-template:
563 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'); 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 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'); 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 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'); 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 COMMIT; 677 COMMIT;
567 678
568 -- ---------------------------- 679 -- ----------------------------
@@ -622,7 +733,7 @@ CREATE TABLE `sys_operate_log` ( @@ -622,7 +733,7 @@ CREATE TABLE `sys_operate_log` (
622 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 733 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
623 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 734 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
624 PRIMARY KEY (`id`) USING BTREE 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 -- Records of sys_operate_log 739 -- Records of sys_operate_log
@@ -933,7 +1044,7 @@ CREATE TABLE `sys_sms_log` ( @@ -933,7 +1044,7 @@ CREATE TABLE `sys_sms_log` (
933 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 1044 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
934 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 1045 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
935 PRIMARY KEY (`id`) USING BTREE 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 -- Records of sys_sms_log 1050 -- Records of sys_sms_log
@@ -1074,6 +1185,7 @@ INSERT INTO `sys_user_session` VALUES (&#39;12166cd28b4f448ea468d13c471dfc6e&#39;, 1, &#39;2 @@ -1074,6 +1185,7 @@ INSERT INTO `sys_user_session` VALUES (&#39;12166cd28b4f448ea468d13c471dfc6e&#39;, 1, &#39;2
1074 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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,16 +1196,22 @@ INSERT INTO `sys_user_session` VALUES (&#39;5c30d80eb72048daa1a24d3d4f01317b&#39;, 1, &#39;2
1084 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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 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'); 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,7 +1252,7 @@ CREATE TABLE `tool_codegen_column` (
1134 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 1252 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
1135 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 1253 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
1136 PRIMARY KEY (`id`) USING BTREE 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 -- Records of tool_codegen_column 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,6 +1472,17 @@ INSERT INTO `tool_codegen_column` VALUES (443, 36, &#39;create_time&#39;, &#39;datetime&#39;, &#39;å
1354 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'); 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 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'); 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 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'); 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 COMMIT; 1486 COMMIT;
1358 1487
1359 -- ---------------------------- 1488 -- ----------------------------
@@ -1379,7 +1508,7 @@ CREATE TABLE `tool_codegen_table` ( @@ -1379,7 +1508,7 @@ CREATE TABLE `tool_codegen_table` (
1379 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´', 1508 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'æ›´æ–°æ—¶é—´',
1380 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤', 1509 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是å¦åˆ é™¤',
1381 PRIMARY KEY (`id`) USING BTREE 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 -- Records of tool_codegen_table 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,6 +1529,7 @@ INSERT INTO `tool_codegen_table` VALUES (33, 1, &#39;inf_file&#39;, &#39;文件表&#39;, NULL, &#39;
1400 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'); 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 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'); 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 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'); 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 COMMIT; 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 \ No newline at end of file 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,6 +8,9 @@ import lombok.Data;
8 @Data 8 @Data
9 public class SysPostExportReqVO { 9 public class SysPostExportReqVO {
10 10
  11 + @ApiModelProperty(value = "岗位编码", example = "yudao", notes = "模糊匹配")
  12 + private String code;
  13 +
11 @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") 14 @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配")
12 private String name; 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,6 +11,9 @@ import lombok.EqualsAndHashCode;
11 @EqualsAndHashCode(callSuper = true) 11 @EqualsAndHashCode(callSuper = true)
12 public class SysPostPageReqVO extends PageParam { 12 public class SysPostPageReqVO extends PageParam {
13 13
  14 + @ApiModelProperty(value = "岗位编码", example = "yudao", notes = "模糊匹配")
  15 + private String code;
  16 +
14 @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配") 17 @ApiModelProperty(value = "岗位名称", example = "芋道", notes = "模糊匹配")
15 private String name; 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,12 +22,15 @@ public interface SysPostMapper extends BaseMapperX&lt;SysPostDO&gt; {
22 22
23 default PageResult<SysPostDO> selectPage(SysPostPageReqVO reqVO) { 23 default PageResult<SysPostDO> selectPage(SysPostPageReqVO reqVO) {
24 return selectPage(reqVO, new QueryWrapperX<SysPostDO>() 24 return selectPage(reqVO, new QueryWrapperX<SysPostDO>()
  25 + .likeIfPresent("code", reqVO.getCode())
25 .likeIfPresent("name", reqVO.getName()) 26 .likeIfPresent("name", reqVO.getName())
26 .eqIfPresent("status", reqVO.getStatus())); 27 .eqIfPresent("status", reqVO.getStatus()));
27 } 28 }
28 29
29 default List<SysPostDO> selectList(SysPostExportReqVO reqVO) { 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 .eqIfPresent("status", reqVO.getStatus())); 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,5 +91,8 @@ public interface SysErrorCodeConstants {
91 ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002012000, "手机号不存在"); 91 ErrorCode SMS_SEND_MOBILE_NOT_EXISTS = new ErrorCode(1002012000, "手机号不存在");
92 ErrorCode SMS_SEND_MOBILE_TEMPLATE_PARAM_MISS = new ErrorCode(1002012001, "模板参数({})缺失"); 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,12 +22,12 @@ public enum SysDictTypeEnum {
22 SYS_SMS_TEMPLATE_TYPE("sys_sms_template_type"), // 短信模板类型 22 SYS_SMS_TEMPLATE_TYPE("sys_sms_template_type"), // 短信模板类型
23 SYS_SMS_SEND_STATUS("sys_sms_send_status"), // 短信发送状态 23 SYS_SMS_SEND_STATUS("sys_sms_send_status"), // 短信发送状态
24 SYS_SMS_RECEIVE_STATUS("sys_sms_receive_status"), // 短信接收状态 24 SYS_SMS_RECEIVE_STATUS("sys_sms_receive_status"), // 短信接收状态
  25 + SYS_ERROR_CODE_TYPE("inf_error_code_type"), // 错误码的类型枚举
25 26
26 INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型 27 INF_REDIS_TIMEOUT_TYPE("inf_redis_timeout_type"), // Redis 超时类型
27 INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举 28 INF_JOB_STATUS("inf_job_status"), // 定时任务状态的枚举
28 INF_JOB_LOG_STATUS("inf_job_log_status"), // 定时任务日志状态的枚举 29 INF_JOB_LOG_STATUS("inf_job_log_status"), // 定时任务日志状态的枚举
29 INF_API_ERROR_LOG_PROCESS_STATUS("inf_api_error_log_process_status"), // API 错误日志的处理状态的枚举 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,7 +85,7 @@ public class SysAuthServiceImpl implements SysAuthService {
85 @Override 85 @Override
86 public String login(SysAuthLoginReqVO reqVO, String userIp, String userAgent) { 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 LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword()); 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,4 +64,14 @@ public class DateUtils {
64 return calendar.getTime(); 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,6 +12,7 @@ spring:
12 max-file-size: 16MB # 单个文件大小 12 max-file-size: 16MB # 单个文件大小
13 max-request-size: 32MB # 设置总上传的文件大小 13 max-request-size: 32MB # 设置总上传的文件大小
14 14
  15 + # Jackson 配置项
15 jackson: 16 jackson:
16 serialization: 17 serialization:
17 write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳 18 write-dates-as-timestamps: true # 设置 Date 的格式,使用时间戳
@@ -34,3 +35,8 @@ mybatis-plus: @@ -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,7 +53,7 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
53 public void delete${simpleClassName}(${primaryColumn.javaType} id) { 53 public void delete${simpleClassName}(${primaryColumn.javaType} id) {
54 // 校验存在 54 // 校验存在
55 this.validate${simpleClassName}Exists(id); 55 this.validate${simpleClassName}Exists(id);
56 - // 更新 56 + // 删除
57 ${classNameVar}Mapper.deleteById(id); 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,3 +22,4 @@ DELETE FROM &quot;sys_user&quot;;
22 DELETE FROM "sys_sms_channel"; 22 DELETE FROM "sys_sms_channel";
23 DELETE FROM "sys_sms_template"; 23 DELETE FROM "sys_sms_template";
24 DELETE FROM "sys_sms_log"; 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,7 +359,7 @@ CREATE TABLE IF NOT EXISTS &quot;sys_sms_channel&quot; (
359 PRIMARY KEY ("id") 359 PRIMARY KEY ("id")
360 ) COMMENT '短信渠道'; 360 ) COMMENT '短信渠道';
361 361
362 -CREATE TABLE "sys_sms_template" ( 362 +CREATE TABLE IF NOT EXISTS "sys_sms_template" (
363 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 363 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
364 "type" tinyint NOT NULL, 364 "type" tinyint NOT NULL,
365 "status" tinyint NOT NULL, 365 "status" tinyint NOT NULL,
@@ -379,7 +379,7 @@ CREATE TABLE &quot;sys_sms_template&quot; ( @@ -379,7 +379,7 @@ CREATE TABLE &quot;sys_sms_template&quot; (
379 PRIMARY KEY ("id") 379 PRIMARY KEY ("id")
380 ) COMMENT '短信模板'; 380 ) COMMENT '短信模板';
381 381
382 -CREATE TABLE "sys_sms_log" ( 382 +CREATE TABLE IF NOT EXISTS "sys_sms_log" (
383 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY, 383 "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
384 "channel_id" bigint NOT NULL, 384 "channel_id" bigint NOT NULL,
385 "channel_code" varchar(63) NOT NULL, 385 "channel_code" varchar(63) NOT NULL,
@@ -411,3 +411,18 @@ CREATE TABLE &quot;sys_sms_log&quot; ( @@ -411,3 +411,18 @@ CREATE TABLE &quot;sys_sms_log&quot; (
411 "deleted" bit NOT NULL DEFAULT FALSE, 411 "deleted" bit NOT NULL DEFAULT FALSE,
412 PRIMARY KEY ("id") 412 PRIMARY KEY ("id")
413 ) COMMENT '短信日志'; 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 '错误码表';