Commit 162d604644a1c9876799fe3fd332f32ccadc7518

Authored by YunaiV
2 parents 0fedc8fe 4779413b

Merge branch 'master' of https://gitee.com/zhijiantianya/ruoyi-vue-pro into sms_temp_zzf_0127

Showing 111 changed files with 3584 additions and 2487 deletions

Too many changes.

To preserve performance only 100 of 111 files are displayed.

@@ -22,15 +22,15 @@ @@ -22,15 +22,15 @@
22 <maven.compiler.target>${java.version}</maven.compiler.target> 22 <maven.compiler.target>${java.version}</maven.compiler.target>
23 <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version> 23 <maven-compiler-plugin.version>3.8.0</maven-compiler-plugin.version>
24 <!-- 统一依赖管理 --> 24 <!-- 统一依赖管理 -->
25 - <spring.boot.version>2.4.2</spring.boot.version> 25 + <spring.boot.version>2.4.4</spring.boot.version>
26 <!-- Web 相关 --> 26 <!-- Web 相关 -->
27 <knife4j.version>3.0.2</knife4j.version> 27 <knife4j.version>3.0.2</knife4j.version>
28 <swagger-annotations.version>1.5.22</swagger-annotations.version> 28 <swagger-annotations.version>1.5.22</swagger-annotations.version>
29 <!-- DB 相关 --> 29 <!-- DB 相关 -->
30 <mysql-connector-java.version>5.1.46</mysql-connector-java.version> 30 <mysql-connector-java.version>5.1.46</mysql-connector-java.version>
31 <druid.version>1.2.4</druid.version> 31 <druid.version>1.2.4</druid.version>
32 - <mybatis-plus.version>3.4.1</mybatis-plus.version>  
33 - <redisson.version>3.14.1</redisson.version> 32 + <mybatis-plus.version>3.4.2</mybatis-plus.version>
  33 + <redisson.version>3.15.1</redisson.version>
34 <!-- Config 配置中心相关 --> 34 <!-- Config 配置中心相关 -->
35 <apollo.version>1.7.0</apollo.version> 35 <apollo.version>1.7.0</apollo.version>
36 <!-- 服务保障相关 --> 36 <!-- 服务保障相关 -->
@@ -42,7 +42,7 @@ @@ -42,7 +42,7 @@
42 <!-- 工具类相关 --> 42 <!-- 工具类相关 -->
43 <lombok.version>1.16.14</lombok.version> 43 <lombok.version>1.16.14</lombok.version>
44 <mapstruct.version>1.4.1.Final</mapstruct.version> 44 <mapstruct.version>1.4.1.Final</mapstruct.version>
45 - <hutool.version>5.5.6</hutool.version> 45 + <hutool.version>5.6.1</hutool.version>
46 <easyexcel.verion>2.2.7</easyexcel.verion> 46 <easyexcel.verion>2.2.7</easyexcel.verion>
47 <velocity.version>2.2</velocity.version> 47 <velocity.version>2.2</velocity.version>
48 <screw.version>1.0.5</screw.version> 48 <screw.version>1.0.5</screw.version>
@@ -249,27 +249,7 @@ @@ -249,27 +249,7 @@
249 249
250 <dependency> 250 <dependency>
251 <groupId>cn.hutool</groupId> 251 <groupId>cn.hutool</groupId>
252 - <artifactId>hutool-core</artifactId>  
253 - <version>${hutool.version}</version>  
254 - </dependency>  
255 - <dependency>  
256 - <groupId>cn.hutool</groupId>  
257 - <artifactId>hutool-extra</artifactId>  
258 - <version>${hutool.version}</version>  
259 - </dependency>  
260 - <dependency>  
261 - <groupId>cn.hutool</groupId>  
262 - <artifactId>hutool-captcha</artifactId>  
263 - <version>${hutool.version}</version>  
264 - </dependency>  
265 - <dependency>  
266 - <groupId>cn.hutool</groupId>  
267 - <artifactId>hutool-http</artifactId>  
268 - <version>${hutool.version}</version>  
269 - </dependency>  
270 - <dependency>  
271 - <groupId>cn.hutool</groupId>  
272 - <artifactId>hutool-crypto</artifactId> 252 + <artifactId>hutool-all</artifactId>
273 <version>${hutool.version}</version> 253 <version>${hutool.version}</version>
274 </dependency> 254 </dependency>
275 255
ruoyi-ui/src/api/system/dept.js
@@ -46,7 +46,7 @@ export function addDept(data) { @@ -46,7 +46,7 @@ export function addDept(data) {
46 export function updateDept(data) { 46 export function updateDept(data) {
47 return request({ 47 return request({
48 url: '/system/dept/update', 48 url: '/system/dept/update',
49 - method: 'post', 49 + method: 'put',
50 data: data 50 data: data
51 }) 51 })
52 } 52 }
@@ -55,6 +55,6 @@ export function updateDept(data) { @@ -55,6 +55,6 @@ export function updateDept(data) {
55 export function delDept(id) { 55 export function delDept(id) {
56 return request({ 56 return request({
57 url: '/system/dept/delete?id=' + id, 57 url: '/system/dept/delete?id=' + id,
58 - method: 'post' 58 + method: 'delete'
59 }) 59 })
60 } 60 }
ruoyi-ui/src/api/system/dict/data.js
@@ -38,7 +38,7 @@ export function addData(data) { @@ -38,7 +38,7 @@ export function addData(data) {
38 export function updateData(data) { 38 export function updateData(data) {
39 return request({ 39 return request({
40 url: '/system/dict-data/update', 40 url: '/system/dict-data/update',
41 - method: 'post', 41 + method: 'put',
42 data: data 42 data: data
43 }) 43 })
44 } 44 }
@@ -47,7 +47,7 @@ export function updateData(data) { @@ -47,7 +47,7 @@ export function updateData(data) {
47 export function delData(dictCode) { 47 export function delData(dictCode) {
48 return request({ 48 return request({
49 url: '/system/dict-data/delete?id=' + dictCode, 49 url: '/system/dict-data/delete?id=' + dictCode,
50 - method: 'post' 50 + method: 'delete'
51 }) 51 })
52 } 52 }
53 53
ruoyi-ui/src/api/system/dict/type.js
@@ -30,7 +30,7 @@ export function addType(data) { @@ -30,7 +30,7 @@ export function addType(data) {
30 export function updateType(data) { 30 export function updateType(data) {
31 return request({ 31 return request({
32 url: '/system/dict-type/update', 32 url: '/system/dict-type/update',
33 - method: 'post', 33 + method: 'put',
34 data: data 34 data: data
35 }) 35 })
36 } 36 }
@@ -39,7 +39,7 @@ export function updateType(data) { @@ -39,7 +39,7 @@ export function updateType(data) {
39 export function delType(dictId) { 39 export function delType(dictId) {
40 return request({ 40 return request({
41 url: '/system/dict-type/delete?id=' + dictId, 41 url: '/system/dict-type/delete?id=' + dictId,
42 - method: 'post' 42 + method: 'delete'
43 }) 43 })
44 } 44 }
45 45
ruoyi-ui/src/api/system/menu.js
@@ -38,7 +38,7 @@ export function addMenu(data) { @@ -38,7 +38,7 @@ export function addMenu(data) {
38 export function updateMenu(data) { 38 export function updateMenu(data) {
39 return request({ 39 return request({
40 url: '/system/menu/update', 40 url: '/system/menu/update',
41 - method: 'post', 41 + method: 'put',
42 data: data 42 data: data
43 }) 43 })
44 } 44 }
@@ -47,6 +47,6 @@ export function updateMenu(data) { @@ -47,6 +47,6 @@ export function updateMenu(data) {
47 export function delMenu(id) { 47 export function delMenu(id) {
48 return request({ 48 return request({
49 url: '/system/menu/delete?id=' + id, 49 url: '/system/menu/delete?id=' + id,
50 - method: 'post' 50 + method: 'delete'
51 }) 51 })
52 } 52 }
ruoyi-ui/src/api/system/notice.js
@@ -30,7 +30,7 @@ export function addNotice(data) { @@ -30,7 +30,7 @@ export function addNotice(data) {
30 export function updateNotice(data) { 30 export function updateNotice(data) {
31 return request({ 31 return request({
32 url: '/system/notice/update', 32 url: '/system/notice/update',
33 - method: 'post', 33 + method: 'put',
34 data: data 34 data: data
35 }) 35 })
36 } 36 }
@@ -39,6 +39,6 @@ export function updateNotice(data) { @@ -39,6 +39,6 @@ export function updateNotice(data) {
39 export function delNotice(noticeId) { 39 export function delNotice(noticeId) {
40 return request({ 40 return request({
41 url: '/system/notice/delete?id=' + noticeId, 41 url: '/system/notice/delete?id=' + noticeId,
42 - method: 'post' 42 + method: 'delete'
43 }) 43 })
44 } 44 }
ruoyi-ui/src/api/system/post.js
@@ -38,7 +38,7 @@ export function addPost(data) { @@ -38,7 +38,7 @@ export function addPost(data) {
38 export function updatePost(data) { 38 export function updatePost(data) {
39 return request({ 39 return request({
40 url: '/system/post/update', 40 url: '/system/post/update',
41 - method: 'post', 41 + method: 'put',
42 data: data 42 data: data
43 }) 43 })
44 } 44 }
@@ -47,7 +47,7 @@ export function updatePost(data) { @@ -47,7 +47,7 @@ export function updatePost(data) {
47 export function delPost(postId) { 47 export function delPost(postId) {
48 return request({ 48 return request({
49 url: '/system/post/delete?id=' + postId, 49 url: '/system/post/delete?id=' + postId,
50 - method: 'post' 50 + method: 'delete'
51 }) 51 })
52 } 52 }
53 53
ruoyi-ui/src/api/system/role.js
@@ -38,7 +38,7 @@ export function addRole(data) { @@ -38,7 +38,7 @@ export function addRole(data) {
38 export function updateRole(data) { 38 export function updateRole(data) {
39 return request({ 39 return request({
40 url: '/system/role/update', 40 url: '/system/role/update',
41 - method: 'post', 41 + method: 'put',
42 data: data 42 data: data
43 }) 43 })
44 } 44 }
@@ -51,7 +51,7 @@ export function changeRoleStatus(id, status) { @@ -51,7 +51,7 @@ export function changeRoleStatus(id, status) {
51 } 51 }
52 return request({ 52 return request({
53 url: '/system/role/update-status', 53 url: '/system/role/update-status',
54 - method: 'post', 54 + method: 'put',
55 data: data 55 data: data
56 }) 56 })
57 } 57 }
@@ -60,7 +60,7 @@ export function changeRoleStatus(id, status) { @@ -60,7 +60,7 @@ export function changeRoleStatus(id, status) {
60 export function delRole(roleId) { 60 export function delRole(roleId) {
61 return request({ 61 return request({
62 url: '/system/role/delete?id=' + roleId, 62 url: '/system/role/delete?id=' + roleId,
63 - method: 'post' 63 + method: 'delete'
64 }) 64 })
65 } 65 }
66 66
ruoyi-ui/src/api/system/user.js
@@ -31,7 +31,7 @@ export function addUser(data) { @@ -31,7 +31,7 @@ export function addUser(data) {
31 export function updateUser(data) { 31 export function updateUser(data) {
32 return request({ 32 return request({
33 url: '/system/user/update', 33 url: '/system/user/update',
34 - method: 'post', 34 + method: 'put',
35 data: data 35 data: data
36 }) 36 })
37 } 37 }
@@ -62,7 +62,7 @@ export function resetUserPwd(id, password) { @@ -62,7 +62,7 @@ export function resetUserPwd(id, password) {
62 } 62 }
63 return request({ 63 return request({
64 url: '/system/user/update-password', 64 url: '/system/user/update-password',
65 - method: 'post', 65 + method: 'put',
66 data: data 66 data: data
67 }) 67 })
68 } 68 }
@@ -75,7 +75,7 @@ export function changeUserStatus(id, status) { @@ -75,7 +75,7 @@ export function changeUserStatus(id, status) {
75 } 75 }
76 return request({ 76 return request({
77 url: '/system/user/update-status', 77 url: '/system/user/update-status',
78 - method: 'post', 78 + method: 'put',
79 data: data 79 data: data
80 }) 80 })
81 } 81 }
@@ -83,7 +83,7 @@ export function changeUserStatus(id, status) { @@ -83,7 +83,7 @@ export function changeUserStatus(id, status) {
83 // 查询用户个人信息 83 // 查询用户个人信息
84 export function getUserProfile() { 84 export function getUserProfile() {
85 return request({ 85 return request({
86 - url: '/system/user/profile', 86 + url: '/system/user/profile/get',
87 method: 'get' 87 method: 'get'
88 }) 88 })
89 } 89 }
@@ -91,7 +91,7 @@ export function getUserProfile() { @@ -91,7 +91,7 @@ export function getUserProfile() {
91 // 修改用户个人信息 91 // 修改用户个人信息
92 export function updateUserProfile(data) { 92 export function updateUserProfile(data) {
93 return request({ 93 return request({
94 - url: '/system/user/profile', 94 + url: '/system/user/profile/update',
95 method: 'put', 95 method: 'put',
96 data: data 96 data: data
97 }) 97 })
@@ -104,9 +104,9 @@ export function updateUserPwd(oldPassword, newPassword) { @@ -104,9 +104,9 @@ export function updateUserPwd(oldPassword, newPassword) {
104 newPassword 104 newPassword
105 } 105 }
106 return request({ 106 return request({
107 - url: '/system/user/profile/updatePwd', 107 + url: '/system/user/profile/update-password',
108 method: 'put', 108 method: 'put',
109 - params: data 109 + data: data
110 }) 110 })
111 } 111 }
112 112
@@ -114,7 +114,7 @@ export function updateUserPwd(oldPassword, newPassword) { @@ -114,7 +114,7 @@ export function updateUserPwd(oldPassword, newPassword) {
114 export function uploadAvatar(data) { 114 export function uploadAvatar(data) {
115 return request({ 115 return request({
116 url: '/system/user/profile/avatar', 116 url: '/system/user/profile/avatar',
117 - method: 'post', 117 + method: 'put',
118 data: data 118 data: data
119 }) 119 })
120 } 120 }
ruoyi-ui/src/store/modules/user.js
@@ -53,7 +53,7 @@ const user = { @@ -53,7 +53,7 @@ const user = {
53 getInfo(state.token).then(res => { 53 getInfo(state.token).then(res => {
54 res = res.data; // 读取 data 数据 54 res = res.data; // 读取 data 数据
55 const user = res.user 55 const user = res.user
56 - const avatar = user.avatar === "" ? require("@/assets/images/profile.jpg") : process.env.VUE_APP_BASE_API + user.avatar; 56 + const avatar = user.avatar === "" ? require("@/assets/images/profile.jpg") : user.avatar;
57 if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组 57 if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
58 commit('SET_ROLES', res.roles) 58 commit('SET_ROLES', res.roles)
59 commit('SET_PERMISSIONS', res.permissions) 59 commit('SET_PERMISSIONS', res.permissions)
ruoyi-ui/src/views/system/dept/index.vue
@@ -2,22 +2,11 @@ @@ -2,22 +2,11 @@
2 <div class="app-container"> 2 <div class="app-container">
3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch"> 3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
4 <el-form-item label="部门名称" prop="name"> 4 <el-form-item label="部门名称" prop="name">
5 - <el-input  
6 - v-model="queryParams.name"  
7 - placeholder="请输入部门名称"  
8 - clearable  
9 - size="small"  
10 - @keyup.enter.native="handleQuery"  
11 - /> 5 + <el-input v-model="queryParams.name" placeholder="请输入部门名称" clearable size="small" @keyup.enter.native="handleQuery"/>
12 </el-form-item> 6 </el-form-item>
13 <el-form-item label="状态" prop="status"> 7 <el-form-item label="状态" prop="status">
14 <el-select v-model="queryParams.status" placeholder="菜单状态" clearable size="small"> 8 <el-select v-model="queryParams.status" placeholder="菜单状态" clearable size="small">
15 - <el-option  
16 - v-for="dict in statusDictDatas"  
17 - :key="parseInt(dict.value)"  
18 - :label="dict.label"  
19 - :value="parseInt(dict.value)"  
20 - /> 9 + <el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
21 </el-select> 10 </el-select>
22 </el-form-item> 11 </el-form-item>
23 <el-form-item> 12 <el-form-item>
@@ -28,24 +17,13 @@ @@ -28,24 +17,13 @@
28 17
29 <el-row :gutter="10" class="mb8"> 18 <el-row :gutter="10" class="mb8">
30 <el-col :span="1.5"> 19 <el-col :span="1.5">
31 - <el-button  
32 - type="primary"  
33 - icon="el-icon-plus"  
34 - size="mini"  
35 - @click="handleAdd"  
36 - v-hasPermi="['system:dept:add']"  
37 - >新增</el-button> 20 + <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:dept:create']">新增</el-button>
38 </el-col> 21 </el-col>
39 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> 22 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
40 </el-row> 23 </el-row>
41 24
42 - <el-table  
43 - v-loading="loading"  
44 - :data="deptList"  
45 - row-key="id"  
46 - default-expand-all  
47 - :tree-props="{children: 'children', hasChildren: 'hasChildren'}"  
48 - > 25 + <el-table v-loading="loading" :data="deptList" row-key="id" default-expand-all
  26 + :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
49 <el-table-column prop="name" label="部门名称" width="260"></el-table-column> 27 <el-table-column prop="name" label="部门名称" width="260"></el-table-column>
50 <el-table-column prop="sort" label="排序" width="200"></el-table-column> 28 <el-table-column prop="sort" label="排序" width="200"></el-table-column>
51 <el-table-column prop="status" label="状态" :formatter="statusFormat" width="100"></el-table-column> 29 <el-table-column prop="status" label="状态" :formatter="statusFormat" width="100"></el-table-column>
@@ -56,28 +34,12 @@ @@ -56,28 +34,12 @@
56 </el-table-column> 34 </el-table-column>
57 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> 35 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
58 <template slot-scope="scope"> 36 <template slot-scope="scope">
59 - <el-button  
60 - size="mini"  
61 - type="text"  
62 - icon="el-icon-edit"  
63 - @click="handleUpdate(scope.row)"  
64 - v-hasPermi="['system:dept:edit']"  
65 - >修改</el-button>  
66 - <el-button  
67 - size="mini"  
68 - type="text"  
69 - icon="el-icon-plus"  
70 - @click="handleAdd(scope.row)"  
71 - v-hasPermi="['system:dept:add']"  
72 - >新增</el-button>  
73 - <el-button  
74 - v-if="scope.row.parentId !== 0"  
75 - size="mini"  
76 - type="text"  
77 - icon="el-icon-delete"  
78 - @click="handleDelete(scope.row)"  
79 - v-hasPermi="['system:dept:remove']"  
80 - >删除</el-button> 37 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  38 + v-hasPermi="['system:dept:update']">修改</el-button>
  39 + <el-button size="mini" type="text" icon="el-icon-plus" @click="handleAdd(scope.row)"
  40 + v-hasPermi="['system:dept:create']">新增</el-button>
  41 + <el-button v-if="scope.row.parentId !== 0" size="mini" type="text" icon="el-icon-delete"
  42 + @click="handleDelete(scope.row)" v-hasPermi="['system:dept:delete']">删除</el-button>
81 </template> 43 </template>
82 </el-table-column> 44 </el-table-column>
83 </el-table> 45 </el-table>
@@ -119,11 +81,8 @@ @@ -119,11 +81,8 @@
119 <el-col :span="12"> 81 <el-col :span="12">
120 <el-form-item label="部门状态" prop="status"> 82 <el-form-item label="部门状态" prop="status">
121 <el-radio-group v-model="form.status"> 83 <el-radio-group v-model="form.status">
122 - <el-radio  
123 - v-for="dict in statusDictDatas"  
124 - :key="parseInt(dict.value)"  
125 - :label="parseInt(dict.value)"  
126 - >{{dict.label}}</el-radio> 84 + <el-radio v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
  85 + {{dict.label}}</el-radio>
127 </el-radio-group> 86 </el-radio-group>
128 </el-form-item> 87 </el-form-item>
129 </el-col> 88 </el-col>
ruoyi-ui/src/views/system/dict/data.vue
@@ -3,31 +3,15 @@ @@ -3,31 +3,15 @@
3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> 3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
4 <el-form-item label="字典名称" prop="dictType"> 4 <el-form-item label="字典名称" prop="dictType">
5 <el-select v-model="queryParams.dictType" size="small"> 5 <el-select v-model="queryParams.dictType" size="small">
6 - <el-option  
7 - v-for="item in typeOptions"  
8 - :key="item.id"  
9 - :label="item.name"  
10 - :value="item.type"  
11 - /> 6 + <el-option v-for="item in typeOptions" :key="item.id" :label="item.name" :value="item.type"/>
12 </el-select> 7 </el-select>
13 </el-form-item> 8 </el-form-item>
14 <el-form-item label="字典标签" prop="label"> 9 <el-form-item label="字典标签" prop="label">
15 - <el-input  
16 - v-model="queryParams.label"  
17 - placeholder="请输入字典标签"  
18 - clearable  
19 - size="small"  
20 - @keyup.enter.native="handleQuery"  
21 - /> 10 + <el-input v-model="queryParams.label" placeholder="请输入字典标签" clearable size="small" @keyup.enter.native="handleQuery"/>
22 </el-form-item> 11 </el-form-item>
23 <el-form-item label="状态" prop="status"> 12 <el-form-item label="状态" prop="status">
24 <el-select v-model="queryParams.status" placeholder="数据状态" clearable size="small"> 13 <el-select v-model="queryParams.status" placeholder="数据状态" clearable size="small">
25 - <el-option  
26 - v-for="dict in statusOptions"  
27 - :key="dict.value"  
28 - :label="dict.label"  
29 - :value="dict.value"  
30 - /> 14 + <el-option v-for="dict in statusOptions" :key="dict.value" :label="dict.label" :value="dict.value"/>
31 </el-select> 15 </el-select>
32 </el-form-item> 16 </el-form-item>
33 <el-form-item> 17 <el-form-item>
@@ -38,22 +22,12 @@ @@ -38,22 +22,12 @@
38 22
39 <el-row :gutter="10" class="mb8"> 23 <el-row :gutter="10" class="mb8">
40 <el-col :span="1.5"> 24 <el-col :span="1.5">
41 - <el-button  
42 - type="primary"  
43 - icon="el-icon-plus"  
44 - size="mini"  
45 - @click="handleAdd"  
46 - v-hasPermi="['system:dict:add']"  
47 - >新增</el-button> 25 + <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
  26 + v-hasPermi="['system:dict:create']">新增</el-button>
48 </el-col> 27 </el-col>
49 <el-col :span="1.5"> 28 <el-col :span="1.5">
50 - <el-button  
51 - type="warning"  
52 - icon="el-icon-download"  
53 - size="mini"  
54 - @click="handleExport"  
55 - v-hasPermi="['system:dict:export']"  
56 - >导出</el-button> 29 + <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport"
  30 + v-hasPermi="['system:dict:export']">导出</el-button>
57 </el-col> 31 </el-col>
58 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> 32 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
59 </el-row> 33 </el-row>
@@ -72,31 +46,16 @@ @@ -72,31 +46,16 @@
72 </el-table-column> 46 </el-table-column>
73 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> 47 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
74 <template slot-scope="scope"> 48 <template slot-scope="scope">
75 - <el-button  
76 - size="mini"  
77 - type="text"  
78 - icon="el-icon-edit"  
79 - @click="handleUpdate(scope.row)"  
80 - v-hasPermi="['system:dict:edit']"  
81 - >修改</el-button>  
82 - <el-button  
83 - size="mini"  
84 - type="text"  
85 - icon="el-icon-delete"  
86 - @click="handleDelete(scope.row)"  
87 - v-hasPermi="['system:dict:remove']"  
88 - >删除</el-button> 49 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  50 + v-hasPermi="['system:dict:update']">修改</el-button>
  51 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  52 + v-hasPermi="['system:dict:delete']">删除</el-button>
89 </template> 53 </template>
90 </el-table-column> 54 </el-table-column>
91 </el-table> 55 </el-table>
92 56
93 - <pagination  
94 - v-show="total>0"  
95 - :total="total"  
96 - :page.sync="queryParams.pageNo"  
97 - :limit.sync="queryParams.pageSize"  
98 - @pagination="getList"  
99 - /> 57 + <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
  58 + @pagination="getList"/>
100 59
101 <!-- 添加或修改参数配置对话框 --> 60 <!-- 添加或修改参数配置对话框 -->
102 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> 61 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
@@ -115,11 +74,7 @@ @@ -115,11 +74,7 @@
115 </el-form-item> 74 </el-form-item>
116 <el-form-item label="状态" prop="status"> 75 <el-form-item label="状态" prop="status">
117 <el-radio-group v-model="form.status"> 76 <el-radio-group v-model="form.status">
118 - <el-radio  
119 - v-for="dict in statusDictDatas"  
120 - :key="parseInt(dict.value)"  
121 - :label="parseInt(dict.value)"  
122 - >{{dict.label}}</el-radio> 77 + <el-radio v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)">{{dict.label}}</el-radio>
123 </el-radio-group> 78 </el-radio-group>
124 </el-form-item> 79 </el-form-item>
125 <el-form-item label="备注" prop="remark"> 80 <el-form-item label="备注" prop="remark">
ruoyi-ui/src/views/system/dict/index.vue
@@ -2,52 +2,19 @@ @@ -2,52 +2,19 @@
2 <div class="app-container"> 2 <div class="app-container">
3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> 3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
4 <el-form-item label="字典名称" prop="name"> 4 <el-form-item label="字典名称" prop="name">
5 - <el-input  
6 - v-model="queryParams.name"  
7 - placeholder="请输入字典名称"  
8 - clearable  
9 - size="small"  
10 - style="width: 240px"  
11 - @keyup.enter.native="handleQuery"  
12 - /> 5 + <el-input v-model="queryParams.name" placeholder="请输入字典名称" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery"/>
13 </el-form-item> 6 </el-form-item>
14 <el-form-item label="字典类型" prop="type"> 7 <el-form-item label="字典类型" prop="type">
15 - <el-input  
16 - v-model="queryParams.type"  
17 - placeholder="请输入字典类型"  
18 - clearable  
19 - size="small"  
20 - style="width: 240px"  
21 - @keyup.enter.native="handleQuery"  
22 - /> 8 + <el-input v-model="queryParams.type" placeholder="请输入字典类型" clearable size="small" style="width: 240px" @keyup.enter.native="handleQuery"/>
23 </el-form-item> 9 </el-form-item>
24 <el-form-item label="状态" prop="status"> 10 <el-form-item label="状态" prop="status">
25 - <el-select  
26 - v-model="queryParams.status"  
27 - placeholder="字典状态"  
28 - clearable  
29 - size="small"  
30 - style="width: 240px"  
31 - >  
32 - <el-option  
33 - v-for="dict in statusDictDatas"  
34 - :key="parseInt(dict.value)"  
35 - :label="dict.label"  
36 - :value="parseInt(dict.value)"  
37 - /> 11 + <el-select v-model="queryParams.status" placeholder="字典状态" clearable size="small" style="width: 240px">
  12 + <el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
38 </el-select> 13 </el-select>
39 </el-form-item> 14 </el-form-item>
40 <el-form-item label="创建时间"> 15 <el-form-item label="创建时间">
41 - <el-date-picker  
42 - v-model="dateRangeCreateTime"  
43 - size="small"  
44 - style="width: 240px"  
45 - value-format="yyyy-MM-dd"  
46 - type="daterange"  
47 - range-separator="-"  
48 - start-placeholder="开始日期"  
49 - end-placeholder="结束日期"  
50 - ></el-date-picker> 16 + <el-date-picker v-model="dateRangeCreateTime" size="small" style="width: 240px" value-format="yyyy-MM-dd" type="daterange"
  17 + range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
51 </el-form-item> 18 </el-form-item>
52 <el-form-item> 19 <el-form-item>
53 <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> 20 <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -57,22 +24,12 @@ @@ -57,22 +24,12 @@
57 24
58 <el-row :gutter="10" class="mb8"> 25 <el-row :gutter="10" class="mb8">
59 <el-col :span="1.5"> 26 <el-col :span="1.5">
60 - <el-button  
61 - type="primary"  
62 - icon="el-icon-plus"  
63 - size="mini"  
64 - @click="handleAdd"  
65 - v-hasPermi="['system:dict:add']"  
66 - >新增</el-button> 27 + <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
  28 + v-hasPermi="['system:dict:create']">新增</el-button>
67 </el-col> 29 </el-col>
68 <el-col :span="1.5"> 30 <el-col :span="1.5">
69 - <el-button  
70 - type="warning"  
71 - icon="el-icon-download"  
72 - size="mini"  
73 - @click="handleExport"  
74 - v-hasPermi="['system:dict:export']"  
75 - >导出</el-button> 31 + <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport"
  32 + v-hasPermi="['system:dict:export']">导出</el-button>
76 </el-col> 33 </el-col>
77 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> 34 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
78 </el-row> 35 </el-row>
@@ -96,31 +53,16 @@ @@ -96,31 +53,16 @@
96 </el-table-column> 53 </el-table-column>
97 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> 54 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
98 <template slot-scope="scope"> 55 <template slot-scope="scope">
99 - <el-button  
100 - size="mini"  
101 - type="text"  
102 - icon="el-icon-edit"  
103 - @click="handleUpdate(scope.row)"  
104 - v-hasPermi="['system:dict:edit']"  
105 - >修改</el-button>  
106 - <el-button  
107 - size="mini"  
108 - type="text"  
109 - icon="el-icon-delete"  
110 - @click="handleDelete(scope.row)"  
111 - v-hasPermi="['system:dict:remove']"  
112 - >删除</el-button> 56 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  57 + v-hasPermi="['system:dict:update']">修改</el-button>
  58 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  59 + v-hasPermi="['system:dict:delete']">删除</el-button>
113 </template> 60 </template>
114 </el-table-column> 61 </el-table-column>
115 </el-table> 62 </el-table>
116 63
117 - <pagination  
118 - v-show="total>0"  
119 - :total="total"  
120 - :page.sync="queryParams.pageNo"  
121 - :limit.sync="queryParams.pageSize"  
122 - @pagination="getList"  
123 - /> 64 + <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
  65 + @pagination="getList"/>
124 66
125 <!-- 添加或修改参数配置对话框 --> 67 <!-- 添加或修改参数配置对话框 -->
126 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> 68 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
@@ -133,11 +75,7 @@ @@ -133,11 +75,7 @@
133 </el-form-item> 75 </el-form-item>
134 <el-form-item label="状态" prop="status"> 76 <el-form-item label="状态" prop="status">
135 <el-radio-group v-model="form.status"> 77 <el-radio-group v-model="form.status">
136 - <el-radio  
137 - v-for="dict in statusDictDatas"  
138 - :key="parseInt(dict.value)"  
139 - :label="parseInt(dict.value)"  
140 - >{{dict.label}}</el-radio> 78 + <el-radio v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)">{{dict.label}}</el-radio>
141 </el-radio-group> 79 </el-radio-group>
142 </el-form-item> 80 </el-form-item>
143 <el-form-item label="备注" prop="remark"> 81 <el-form-item label="备注" prop="remark">
ruoyi-ui/src/views/system/loginlog/index.vue
@@ -2,56 +2,22 @@ @@ -2,56 +2,22 @@
2 <div class="app-container"> 2 <div class="app-container">
3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> 3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
4 <el-form-item label="登录地址" prop="userIp"> 4 <el-form-item label="登录地址" prop="userIp">
5 - <el-input  
6 - v-model="queryParams.userIp"  
7 - placeholder="请输入登录地址"  
8 - clearable  
9 - style="width: 240px;"  
10 - size="small"  
11 - @keyup.enter.native="handleQuery"  
12 - /> 5 + <el-input v-model="queryParams.userIp" placeholder="请输入登录地址" clearable style="width: 240px;" size="small"
  6 + @keyup.enter.native="handleQuery"/>
13 </el-form-item> 7 </el-form-item>
14 <el-form-item label="用户名称" prop="username"> 8 <el-form-item label="用户名称" prop="username">
15 - <el-input  
16 - v-model="queryParams.username"  
17 - placeholder="请输入用户名称"  
18 - clearable  
19 - style="width: 240px;"  
20 - size="small"  
21 - @keyup.enter.native="handleQuery"  
22 - /> 9 + <el-input v-model="queryParams.username" placeholder="请输入用户名称" clearable style="width: 240px;" size="small"
  10 + @keyup.enter.native="handleQuery"/>
23 </el-form-item> 11 </el-form-item>
24 <el-form-item label="状态" prop="status"> 12 <el-form-item label="状态" prop="status">
25 - <el-select  
26 - v-model="queryParams.status"  
27 - placeholder="结果"  
28 - clearable  
29 - size="small"  
30 - style="width: 240px"  
31 - >  
32 - <el-option  
33 - :key="true"  
34 - label="成功"  
35 - :value="true"  
36 - />  
37 - <el-option  
38 - :key="false"  
39 - label="失败"  
40 - :value="false"  
41 - /> 13 + <el-select v-model="queryParams.status" placeholder="结果" clearable size="small" style="width: 240px">
  14 + <el-option :key="true" label="成功" :value="true"/>
  15 + <el-option :key="false" label="失败" :value="false"/>
42 </el-select> 16 </el-select>
43 </el-form-item> 17 </el-form-item>
44 <el-form-item label="登录时间"> 18 <el-form-item label="登录时间">
45 - <el-date-picker  
46 - v-model="dateRange"  
47 - size="small"  
48 - style="width: 240px"  
49 - value-format="yyyy-MM-dd"  
50 - type="daterange"  
51 - range-separator="-"  
52 - start-placeholder="开始日期"  
53 - end-placeholder="结束日期"  
54 - ></el-date-picker> 19 + <el-date-picker v-model="dateRange" size="small" style="width: 240px" value-format="yyyy-MM-dd"
  20 + type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
55 </el-form-item> 21 </el-form-item>
56 <el-form-item> 22 <el-form-item>
57 <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> 23 <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -61,13 +27,8 @@ @@ -61,13 +27,8 @@
61 27
62 <el-row :gutter="10" class="mb8"> 28 <el-row :gutter="10" class="mb8">
63 <el-col :span="1.5"> 29 <el-col :span="1.5">
64 - <el-button  
65 - type="warning"  
66 - icon="el-icon-download"  
67 - size="mini"  
68 - @click="handleExport"  
69 - v-hasPermi="['system:login-log:export']"  
70 - >导出</el-button> 30 + <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport"
  31 + v-hasPermi="['system:login-log:export']">导出</el-button>
71 </el-col> 32 </el-col>
72 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> 33 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
73 </el-row> 34 </el-row>
@@ -76,7 +37,7 @@ @@ -76,7 +37,7 @@
76 <el-table-column label="访问编号" align="center" prop="id" /> 37 <el-table-column label="访问编号" align="center" prop="id" />
77 <el-table-column label="日志类型" align="center" prop="logType"> 38 <el-table-column label="日志类型" align="center" prop="logType">
78 <template slot-scope="scope"> 39 <template slot-scope="scope">
79 - <span>{{ scope.row.logType === 1 ? '登录' : '退出' }}</span> 40 + <span>{{ scope.row.logType === 100 ? '登录' : '退出' }}</span>
80 </template> 41 </template>
81 </el-table-column> 42 </el-table-column>
82 <el-table-column label="用户名称" align="center" prop="username" /> 43 <el-table-column label="用户名称" align="center" prop="username" />
@@ -95,13 +56,8 @@ @@ -95,13 +56,8 @@
95 </el-table-column> 56 </el-table-column>
96 </el-table> 57 </el-table>
97 58
98 - <pagination  
99 - v-show="total>0"  
100 - :total="total"  
101 - :page.sync="queryParams.pageNo"  
102 - :limit.sync="queryParams.pageSize"  
103 - @pagination="getList"  
104 - /> 59 + <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
  60 + @pagination="getList"/>
105 </div> 61 </div>
106 </template> 62 </template>
107 63
ruoyi-ui/src/views/system/menu/index.vue
@@ -2,22 +2,11 @@ @@ -2,22 +2,11 @@
2 <div class="app-container"> 2 <div class="app-container">
3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch"> 3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch">
4 <el-form-item label="菜单名称" prop="name"> 4 <el-form-item label="菜单名称" prop="name">
5 - <el-input  
6 - v-model="queryParams.name"  
7 - placeholder="请输入菜单名称"  
8 - clearable  
9 - size="small"  
10 - @keyup.enter.native="handleQuery"  
11 - /> 5 + <el-input v-model="queryParams.name" placeholder="请输入菜单名称" clearable size="small" @keyup.enter.native="handleQuery"/>
12 </el-form-item> 6 </el-form-item>
13 <el-form-item label="状态" prop="status"> 7 <el-form-item label="状态" prop="status">
14 <el-select v-model="queryParams.status" placeholder="菜单状态" clearable size="small"> 8 <el-select v-model="queryParams.status" placeholder="菜单状态" clearable size="small">
15 - <el-option  
16 - v-for="dict in statusDictDatas"  
17 - :key="parseInt(dict.value)"  
18 - :label="dict.label"  
19 - :value="parseInt(dict.value)"  
20 - /> 9 + <el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
21 </el-select> 10 </el-select>
22 </el-form-item> 11 </el-form-item>
23 <el-form-item> 12 <el-form-item>
@@ -28,23 +17,14 @@ @@ -28,23 +17,14 @@
28 17
29 <el-row :gutter="10" class="mb8"> 18 <el-row :gutter="10" class="mb8">
30 <el-col :span="1.5"> 19 <el-col :span="1.5">
31 - <el-button  
32 - type="primary"  
33 - icon="el-icon-plus"  
34 - size="mini"  
35 - @click="handleAdd"  
36 - v-hasPermi="['system:menu:add']"  
37 - >新增</el-button> 20 + <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
  21 + v-hasPermi="['system:menu:create']">新增</el-button>
38 </el-col> 22 </el-col>
39 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> 23 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
40 </el-row> 24 </el-row>
41 25
42 - <el-table  
43 - v-loading="loading"  
44 - :data="menuList"  
45 - row-key="id"  
46 - :tree-props="{children: 'children', hasChildren: 'hasChildren'}"  
47 - > 26 + <el-table v-loading="loading" :data="menuList" row-key="id"
  27 + :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
48 <el-table-column prop="name" label="菜单名称" :show-overflow-tooltip="true" width="200"></el-table-column> 28 <el-table-column prop="name" label="菜单名称" :show-overflow-tooltip="true" width="200"></el-table-column>
49 <el-table-column prop="icon" label="图标" align="center" width="100"> 29 <el-table-column prop="icon" label="图标" align="center" width="100">
50 <template slot-scope="scope"> 30 <template slot-scope="scope">
@@ -62,26 +42,12 @@ @@ -62,26 +42,12 @@
62 </el-table-column> 42 </el-table-column>
63 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> 43 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
64 <template slot-scope="scope"> 44 <template slot-scope="scope">
65 - <el-button size="mini"  
66 - type="text"  
67 - icon="el-icon-edit"  
68 - @click="handleUpdate(scope.row)"  
69 - v-hasPermi="['system:menu:edit']"  
70 - >修改</el-button>  
71 - <el-button  
72 - size="mini"  
73 - type="text"  
74 - icon="el-icon-plus"  
75 - @click="handleAdd(scope.row)"  
76 - v-hasPermi="['system:menu:add']"  
77 - >新增</el-button>  
78 - <el-button  
79 - size="mini"  
80 - type="text"  
81 - icon="el-icon-delete"  
82 - @click="handleDelete(scope.row)"  
83 - v-hasPermi="['system:menu:remove']"  
84 - >删除</el-button> 45 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  46 + v-hasPermi="['system:menu:update']">修改</el-button>
  47 + <el-button size="mini" type="text" icon="el-icon-plus" @click="handleAdd(scope.row)"
  48 + v-hasPermi="['system:menu:create']">新增</el-button>
  49 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  50 + v-hasPermi="['system:menu:delete']">删除</el-button>
85 </template> 51 </template>
86 </el-table-column> 52 </el-table-column>
87 </el-table> 53 </el-table>
@@ -92,43 +58,25 @@ @@ -92,43 +58,25 @@
92 <el-row> 58 <el-row>
93 <el-col :span="24"> 59 <el-col :span="24">
94 <el-form-item label="上级菜单"> 60 <el-form-item label="上级菜单">
95 - <treeselect  
96 - v-model="form.parentId"  
97 - :options="menuOptions"  
98 - :normalizer="normalizer"  
99 - :show-count="true"  
100 - placeholder="选择上级菜单"  
101 - /> 61 + <treeselect v-model="form.parentId" :options="menuOptions" :normalizer="normalizer" :show-count="true"
  62 + placeholder="选择上级菜单"/>
102 </el-form-item> 63 </el-form-item>
103 </el-col> 64 </el-col>
104 <el-col :span="24"> 65 <el-col :span="24">
105 <el-form-item label="菜单类型" prop="type"> 66 <el-form-item label="菜单类型" prop="type">
106 <el-radio-group v-model="form.type"> 67 <el-radio-group v-model="form.type">
107 - <el-radio  
108 - v-for="dict in menuTypeDictDatas"  
109 - :key="parseInt(dict.value)"  
110 - :label="parseInt(dict.value)"  
111 - >{{dict.label}}</el-radio> 68 + <el-radio v-for="dict in menuTypeDictDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
  69 + {{dict.label}}</el-radio>
112 </el-radio-group> 70 </el-radio-group>
113 </el-form-item> 71 </el-form-item>
114 </el-col> 72 </el-col>
115 <el-col :span="24"> 73 <el-col :span="24">
116 <el-form-item v-if="form.type != '3'" label="菜单图标"> 74 <el-form-item v-if="form.type != '3'" label="菜单图标">
117 - <el-popover  
118 - placement="bottom-start"  
119 - width="460"  
120 - trigger="click"  
121 - @show="$refs['iconSelect'].reset()"  
122 - > 75 + <el-popover placement="bottom-start" width="460" trigger="click" @show="$refs['iconSelect'].reset()">
123 <IconSelect ref="iconSelect" @selected="selected" /> 76 <IconSelect ref="iconSelect" @selected="selected" />
124 <el-input slot="reference" v-model="form.icon" placeholder="点击选择图标" readonly> 77 <el-input slot="reference" v-model="form.icon" placeholder="点击选择图标" readonly>
125 - <svg-icon  
126 - v-if="form.icon"  
127 - slot="prefix"  
128 - :icon-class="form.icon"  
129 - class="el-input__icon"  
130 - style="height: 32px;width: 16px;"  
131 - /> 78 + <svg-icon v-if="form.icon" slot="prefix" :icon-class="form.icon" class="el-input__icon"
  79 + style="height: 32px;width: 16px;"/>
132 <i v-else slot="prefix" class="el-icon-search el-input__icon" /> 80 <i v-else slot="prefix" class="el-icon-search el-input__icon" />
133 </el-input> 81 </el-input>
134 </el-popover> 82 </el-popover>
ruoyi-ui/src/views/system/notice/index.vue
@@ -2,31 +2,14 @@ @@ -2,31 +2,14 @@
2 <div class="app-container"> 2 <div class="app-container">
3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> 3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
4 <el-form-item label="公告标题" prop="title"> 4 <el-form-item label="公告标题" prop="title">
5 - <el-input  
6 - v-model="queryParams.title"  
7 - placeholder="请输入公告标题"  
8 - clearable  
9 - size="small"  
10 - @keyup.enter.native="handleQuery"  
11 - /> 5 + <el-input v-model="queryParams.title" placeholder="请输入公告标题" clearable size="small" @keyup.enter.native="handleQuery"/>
12 </el-form-item> 6 </el-form-item>
13 <el-form-item label="操作人员" prop="createBy"> 7 <el-form-item label="操作人员" prop="createBy">
14 - <el-input  
15 - v-model="queryParams.createBy"  
16 - placeholder="请输入操作人员"  
17 - clearable  
18 - size="small"  
19 - @keyup.enter.native="handleQuery"  
20 - /> 8 + <el-input v-model="queryParams.createBy" placeholder="请输入操作人员" clearable size="small" @keyup.enter.native="handleQuery"/>
21 </el-form-item> 9 </el-form-item>
22 <el-form-item label="类型" prop="type"> 10 <el-form-item label="类型" prop="type">
23 <el-select v-model="queryParams.type" placeholder="公告类型" clearable size="small"> 11 <el-select v-model="queryParams.type" placeholder="公告类型" clearable size="small">
24 - <el-option  
25 - v-for="dict in noticeTypeDictDatas"  
26 - :key="parseInt(dict.value)"  
27 - :label="dict.label"  
28 - :value="parseInt(dict.value)"  
29 - /> 12 + <el-option v-for="dict in noticeTypeDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
30 </el-select> 13 </el-select>
31 </el-form-item> 14 </el-form-item>
32 <el-form-item> 15 <el-form-item>
@@ -37,39 +20,16 @@ @@ -37,39 +20,16 @@
37 20
38 <el-row :gutter="10" class="mb8"> 21 <el-row :gutter="10" class="mb8">
39 <el-col :span="1.5"> 22 <el-col :span="1.5">
40 - <el-button  
41 - type="primary"  
42 - icon="el-icon-plus"  
43 - size="mini"  
44 - @click="handleAdd"  
45 - v-hasPermi="['system:notice:add']"  
46 - >新增</el-button> 23 + <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:notice:create']"s>新增</el-button>
47 </el-col> 24 </el-col>
48 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> 25 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
49 </el-row> 26 </el-row>
50 27
51 <el-table v-loading="loading" :data="noticeList"> 28 <el-table v-loading="loading" :data="noticeList">
52 <el-table-column label="序号" align="center" prop="id" width="100" /> 29 <el-table-column label="序号" align="center" prop="id" width="100" />
53 - <el-table-column  
54 - label="公告标题"  
55 - align="center"  
56 - prop="title"  
57 - :show-overflow-tooltip="true"  
58 - />  
59 - <el-table-column  
60 - label="公告类型"  
61 - align="center"  
62 - prop="type"  
63 - :formatter="typeFormat"  
64 - width="100"  
65 - />  
66 - <el-table-column  
67 - label="状态"  
68 - align="center"  
69 - prop="status"  
70 - :formatter="statusFormat"  
71 - width="100"  
72 - /> 30 + <el-table-column label="公告标题" align="center" prop="title" :show-overflow-tooltip="true"/>
  31 + <el-table-column label="公告类型" align="center" prop="type" :formatter="typeFormat" width="100"/>
  32 + <el-table-column label="状态" align="center" prop="status" :formatter="statusFormat" width="100"/>
73 <el-table-column label="创建者" align="center" prop="createBy" width="100" /> 33 <el-table-column label="创建者" align="center" prop="createBy" width="100" />
74 <el-table-column label="创建时间" align="center" prop="createTime" width="100"> 34 <el-table-column label="创建时间" align="center" prop="createTime" width="100">
75 <template slot-scope="scope"> 35 <template slot-scope="scope">
@@ -78,31 +38,16 @@ @@ -78,31 +38,16 @@
78 </el-table-column> 38 </el-table-column>
79 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> 39 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
80 <template slot-scope="scope"> 40 <template slot-scope="scope">
81 - <el-button  
82 - size="mini"  
83 - type="text"  
84 - icon="el-icon-edit"  
85 - @click="handleUpdate(scope.row)"  
86 - v-hasPermi="['system:notice:edit']"  
87 - >修改</el-button>  
88 - <el-button  
89 - size="mini"  
90 - type="text"  
91 - icon="el-icon-delete"  
92 - @click="handleDelete(scope.row)"  
93 - v-hasPermi="['system:notice:remove']"  
94 - >删除</el-button> 41 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  42 + v-hasPermi="['system:notice:update']">修改</el-button>
  43 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  44 + v-hasPermi="['system:notice:delete']">删除</el-button>
95 </template> 45 </template>
96 </el-table-column> 46 </el-table-column>
97 </el-table> 47 </el-table>
98 48
99 - <pagination  
100 - v-show="total>0"  
101 - :total="total"  
102 - :page.sync="queryParams.pageNo"  
103 - :limit.sync="queryParams.pageSize"  
104 - @pagination="getList"  
105 - /> 49 + <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
  50 + @pagination="getList"/>
106 51
107 <!-- 添加或修改公告对话框 --> 52 <!-- 添加或修改公告对话框 -->
108 <el-dialog :title="title" :visible.sync="open" width="780px" append-to-body> 53 <el-dialog :title="title" :visible.sync="open" width="780px" append-to-body>
ruoyi-ui/src/views/system/operatelog/index.vue
@@ -2,72 +2,28 @@ @@ -2,72 +2,28 @@
2 <div class="app-container"> 2 <div class="app-container">
3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> 3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
4 <el-form-item label="系统模块" prop="title"> 4 <el-form-item label="系统模块" prop="title">
5 - <el-input  
6 - v-model="queryParams.title"  
7 - placeholder="请输入系统模块"  
8 - clearable  
9 - style="width: 240px;"  
10 - size="small"  
11 - @keyup.enter.native="handleQuery"  
12 - /> 5 + <el-input v-model="queryParams.title" placeholder="请输入系统模块" clearable style="width: 240px;" size="small"
  6 + @keyup.enter.native="handleQuery"/>
13 </el-form-item> 7 </el-form-item>
14 <el-form-item label="操作人员" prop="operName"> 8 <el-form-item label="操作人员" prop="operName">
15 - <el-input  
16 - v-model="queryParams.operName"  
17 - placeholder="请输入操作人员"  
18 - clearable  
19 - style="width: 240px;"  
20 - size="small"  
21 - @keyup.enter.native="handleQuery"  
22 - /> 9 + <el-input v-model="queryParams.operName" placeholder="请输入操作人员" clearable style="width: 240px;" size="small"
  10 + @keyup.enter.native="handleQuery"/>
23 </el-form-item> 11 </el-form-item>
24 <el-form-item label="类型" prop="type"> 12 <el-form-item label="类型" prop="type">
25 - <el-select  
26 - v-model="queryParams.type"  
27 - placeholder="操作类型"  
28 - clearable  
29 - size="small"  
30 - style="width: 240px"  
31 - >  
32 - <el-option  
33 - v-for="dict in this.getDictDatas(DICT_TYPE.SYS_OPERATE_TYPE)"  
34 - :key="parseInt(dict.value)"  
35 - :label="dict.label"  
36 - :value="parseInt(dict.value)"  
37 - /> 13 + <el-select v-model="queryParams.type" placeholder="操作类型" clearable size="small" style="width: 240px">
  14 + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.SYS_OPERATE_TYPE)" :key="parseInt(dict.value)"
  15 + :label="dict.label" :value="parseInt(dict.value)"/>
38 </el-select> 16 </el-select>
39 </el-form-item> 17 </el-form-item>
40 <el-form-item label="状态" prop="status"> 18 <el-form-item label="状态" prop="status">
41 - <el-select  
42 - v-model="queryParams.success"  
43 - placeholder="操作状态"  
44 - clearable  
45 - size="small"  
46 - style="width: 240px"  
47 - >  
48 - <el-option  
49 - :key="true"  
50 - label="成功"  
51 - :value="true"  
52 - />  
53 - <el-option  
54 - :key="false"  
55 - label="失败"  
56 - :value="false"  
57 - /> 19 + <el-select v-model="queryParams.success" placeholder="操作状态" clearable size="small" style="width: 240px">
  20 + <el-option :key="true" label="成功" :value="true"/>
  21 + <el-option :key="false" label="失败" :value="false"/>
58 </el-select> 22 </el-select>
59 </el-form-item> 23 </el-form-item>
60 <el-form-item label="操作时间"> 24 <el-form-item label="操作时间">
61 - <el-date-picker  
62 - v-model="dateRange"  
63 - size="small"  
64 - style="width: 240px"  
65 - value-format="yyyy-MM-dd"  
66 - type="daterange"  
67 - range-separator="-"  
68 - start-placeholder="开始日期"  
69 - end-placeholder="结束日期"  
70 - ></el-date-picker> 25 + <el-date-picker v-model="dateRange" size="small" style="width: 240px" value-format="yyyy-MM-dd"
  26 + type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
71 </el-form-item> 27 </el-form-item>
72 <el-form-item> 28 <el-form-item>
73 <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> 29 <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -77,13 +33,8 @@ @@ -77,13 +33,8 @@
77 33
78 <el-row :gutter="10" class="mb8"> 34 <el-row :gutter="10" class="mb8">
79 <el-col :span="1.5"> 35 <el-col :span="1.5">
80 - <el-button  
81 - type="warning"  
82 - icon="el-icon-download"  
83 - size="mini"  
84 - @click="handleExport"  
85 - v-hasPermi="['system:config:export']"  
86 - >导出</el-button> 36 + <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport"
  37 + v-hasPermi="['system:operate-log:export']">导出</el-button>
87 </el-col> 38 </el-col>
88 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> 39 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
89 </el-row> 40 </el-row>
ruoyi-ui/src/views/system/post/index.vue
@@ -2,31 +2,14 @@ @@ -2,31 +2,14 @@
2 <div class="app-container"> 2 <div class="app-container">
3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> 3 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
4 <el-form-item label="岗位编码" prop="code"> 4 <el-form-item label="岗位编码" prop="code">
5 - <el-input  
6 - v-model="queryParams.code"  
7 - placeholder="请输入岗位编码"  
8 - clearable  
9 - size="small"  
10 - @keyup.enter.native="handleQuery"  
11 - /> 5 + <el-input v-model="queryParams.code" placeholder="请输入岗位编码" clearable size="small" @keyup.enter.native="handleQuery"/>
12 </el-form-item> 6 </el-form-item>
13 <el-form-item label="岗位名称" prop="name"> 7 <el-form-item label="岗位名称" prop="name">
14 - <el-input  
15 - v-model="queryParams.name"  
16 - placeholder="请输入岗位名称"  
17 - clearable  
18 - size="small"  
19 - @keyup.enter.native="handleQuery"  
20 - /> 8 + <el-input v-model="queryParams.name" placeholder="请输入岗位名称" clearable size="small" @keyup.enter.native="handleQuery"/>
21 </el-form-item> 9 </el-form-item>
22 <el-form-item label="状态" prop="status"> 10 <el-form-item label="状态" prop="status">
23 <el-select v-model="queryParams.status" placeholder="岗位状态" clearable size="small"> 11 <el-select v-model="queryParams.status" placeholder="岗位状态" clearable size="small">
24 - <el-option  
25 - v-for="dict in statusDictDatas"  
26 - :key="parseInt(dict.value)"  
27 - :label="dict.label"  
28 - :value="parseInt(dict.value)"  
29 - /> 12 + <el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
30 </el-select> 13 </el-select>
31 </el-form-item> 14 </el-form-item>
32 <el-form-item> 15 <el-form-item>
@@ -37,22 +20,12 @@ @@ -37,22 +20,12 @@
37 20
38 <el-row :gutter="10" class="mb8"> 21 <el-row :gutter="10" class="mb8">
39 <el-col :span="1.5"> 22 <el-col :span="1.5">
40 - <el-button  
41 - type="primary"  
42 - icon="el-icon-plus"  
43 - size="mini"  
44 - @click="handleAdd"  
45 - v-hasPermi="['system:post:add']"  
46 - >新增</el-button> 23 + <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
  24 + v-hasPermi="['system:post:create']">新增</el-button>
47 </el-col> 25 </el-col>
48 <el-col :span="1.5"> 26 <el-col :span="1.5">
49 - <el-button  
50 - type="warning"  
51 - icon="el-icon-download"  
52 - size="mini"  
53 - @click="handleExport"  
54 - v-hasPermi="['system:post:export']"  
55 - >导出</el-button> 27 + <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport"
  28 + v-hasPermi="['system:post:export']">导出</el-button>
56 </el-col> 29 </el-col>
57 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> 30 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
58 </el-row> 31 </el-row>
@@ -70,31 +43,16 @@ @@ -70,31 +43,16 @@
70 </el-table-column> 43 </el-table-column>
71 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> 44 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
72 <template slot-scope="scope"> 45 <template slot-scope="scope">
73 - <el-button  
74 - size="mini"  
75 - type="text"  
76 - icon="el-icon-edit"  
77 - @click="handleUpdate(scope.row)"  
78 - v-hasPermi="['system:post:edit']"  
79 - >修改</el-button>  
80 - <el-button  
81 - size="mini"  
82 - type="text"  
83 - icon="el-icon-delete"  
84 - @click="handleDelete(scope.row)"  
85 - v-hasPermi="['system:post:remove']"  
86 - >删除</el-button> 46 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  47 + v-hasPermi="['system:post:update']">修改</el-button>
  48 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  49 + v-hasPermi="['system:post:delete']">删除</el-button>
87 </template> 50 </template>
88 </el-table-column> 51 </el-table-column>
89 </el-table> 52 </el-table>
90 53
91 - <pagination  
92 - v-show="total>0"  
93 - :total="total"  
94 - :page.sync="queryParams.pageNo"  
95 - :limit.sync="queryParams.pageSize"  
96 - @pagination="getList"  
97 - /> 54 + <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
  55 + @pagination="getList"/>
98 56
99 <!-- 添加或修改岗位对话框 --> 57 <!-- 添加或修改岗位对话框 -->
100 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> 58 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
@@ -110,11 +68,8 @@ @@ -110,11 +68,8 @@
110 </el-form-item> 68 </el-form-item>
111 <el-form-item label="岗位状态" prop="status"> 69 <el-form-item label="岗位状态" prop="status">
112 <el-radio-group v-model="form.status"> 70 <el-radio-group v-model="form.status">
113 - <el-radio  
114 - v-for="dict in statusDictDatas"  
115 - :key="parseInt(dict.value)"  
116 - :label="parseInt(dict.value)"  
117 - >{{dict.label}}</el-radio> 71 + <el-radio v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="parseInt(dict.value)">
  72 + {{dict.label}}</el-radio>
118 </el-radio-group> 73 </el-radio-group>
119 </el-form-item> 74 </el-form-item>
120 <el-form-item label="备注" prop="remark"> 75 <el-form-item label="备注" prop="remark">
ruoyi-ui/src/views/system/role/index.vue
@@ -2,52 +2,21 @@ @@ -2,52 +2,21 @@
2 <div class="app-container"> 2 <div class="app-container">
3 <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true"> 3 <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
4 <el-form-item label="角色名称" prop="name"> 4 <el-form-item label="角色名称" prop="name">
5 - <el-input  
6 - v-model="queryParams.name"  
7 - placeholder="请输入角色名称"  
8 - clearable  
9 - size="small"  
10 - style="width: 240px"  
11 - @keyup.enter.native="handleQuery"  
12 - /> 5 + <el-input v-model="queryParams.name" placeholder="请输入角色名称" clearable size="small" style="width: 240px"
  6 + @keyup.enter.native="handleQuery"/>
13 </el-form-item> 7 </el-form-item>
14 <el-form-item label="角色标识" prop="code"> 8 <el-form-item label="角色标识" prop="code">
15 - <el-input  
16 - v-model="queryParams.code"  
17 - placeholder="请输入角色标识"  
18 - clearable  
19 - size="small"  
20 - style="width: 240px"  
21 - @keyup.enter.native="handleQuery"  
22 - /> 9 + <el-input v-model="queryParams.code" placeholder="请输入角色标识" clearable size="small" style="width: 240px"
  10 + @keyup.enter.native="handleQuery"/>
23 </el-form-item> 11 </el-form-item>
24 <el-form-item label="状态" prop="status"> 12 <el-form-item label="状态" prop="status">
25 - <el-select  
26 - v-model="queryParams.status"  
27 - placeholder="角色状态"  
28 - clearable  
29 - size="small"  
30 - style="width: 240px"  
31 - >  
32 - <el-option  
33 - v-for="dict in statusDictDatas"  
34 - :key="parseInt(dict.value)"  
35 - :label="dict.label"  
36 - :value="parseInt(dict.value)"  
37 - /> 13 + <el-select v-model="queryParams.status" placeholder="角色状态" clearable size="small" style="width: 240px">
  14 + <el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
38 </el-select> 15 </el-select>
39 </el-form-item> 16 </el-form-item>
40 <el-form-item label="创建时间"> 17 <el-form-item label="创建时间">
41 - <el-date-picker  
42 - v-model="dateRange"  
43 - size="small"  
44 - style="width: 240px"  
45 - value-format="yyyy-MM-dd"  
46 - type="daterange"  
47 - range-separator="-"  
48 - start-placeholder="开始日期"  
49 - end-placeholder="结束日期"  
50 - ></el-date-picker> 18 + <el-date-picker v-model="dateRange" size="small" style="width: 240px" value-format="yyyy-MM-dd" type="daterange"
  19 + range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
51 </el-form-item> 20 </el-form-item>
52 <el-form-item> 21 <el-form-item>
53 <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> 22 <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -57,22 +26,12 @@ @@ -57,22 +26,12 @@
57 26
58 <el-row :gutter="10" class="mb8"> 27 <el-row :gutter="10" class="mb8">
59 <el-col :span="1.5"> 28 <el-col :span="1.5">
60 - <el-button  
61 - type="primary"  
62 - icon="el-icon-plus"  
63 - size="mini"  
64 - @click="handleAdd"  
65 - v-hasPermi="['system:role:add']"  
66 - >新增</el-button> 29 + <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
  30 + v-hasPermi="['system:role:create']">新增</el-button>
67 </el-col> 31 </el-col>
68 <el-col :span="1.5"> 32 <el-col :span="1.5">
69 - <el-button  
70 - type="warning"  
71 - icon="el-icon-download"  
72 - size="mini"  
73 - @click="handleExport"  
74 - v-hasPermi="['system:role:export']"  
75 - >导出</el-button> 33 + <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport"
  34 + v-hasPermi="['system:role:export']">导出</el-button>
76 </el-col> 35 </el-col>
77 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> 36 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
78 </el-row> 37 </el-row>
@@ -85,12 +44,7 @@ @@ -85,12 +44,7 @@
85 <el-table-column label="显示顺序" prop="sort" width="100" /> 44 <el-table-column label="显示顺序" prop="sort" width="100" />
86 <el-table-column label="状态" align="center" width="100"> 45 <el-table-column label="状态" align="center" width="100">
87 <template slot-scope="scope"> 46 <template slot-scope="scope">
88 - <el-switch  
89 - v-model="scope.row.status"  
90 - :active-value="0"  
91 - :inactive-value="1"  
92 - @change="handleStatusChange(scope.row)"  
93 - ></el-switch> 47 + <el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch>
94 </template> 48 </template>
95 </el-table-column> 49 </el-table-column>
96 <el-table-column label="创建时间" align="center" prop="createTime" width="180"> 50 <el-table-column label="创建时间" align="center" prop="createTime" width="180">
@@ -100,45 +54,20 @@ @@ -100,45 +54,20 @@
100 </el-table-column> 54 </el-table-column>
101 <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> 55 <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
102 <template slot-scope="scope"> 56 <template slot-scope="scope">
103 - <el-button  
104 - size="mini"  
105 - type="text"  
106 - icon="el-icon-edit"  
107 - @click="handleUpdate(scope.row)"  
108 - v-hasPermi="['system:role:edit']"  
109 - >修改</el-button>  
110 - <el-button  
111 - size="mini"  
112 - type="text"  
113 - icon="el-icon-circle-check"  
114 - @click="handleMenu(scope.row)"  
115 - v-hasPermi="['system:permission:assign-role-menu']"  
116 - >菜单权限</el-button>  
117 - <el-button  
118 - size="mini"  
119 - type="text"  
120 - icon="el-icon-circle-check"  
121 - @click="handleDataScope(scope.row)"  
122 - v-hasPermi="['system:permission:assign-role-data-scope']"  
123 - >数据权限</el-button>  
124 - <el-button  
125 - size="mini"  
126 - type="text"  
127 - icon="el-icon-delete"  
128 - @click="handleDelete(scope.row)"  
129 - v-hasPermi="['system:role:remove']"  
130 - >删除</el-button> 57 + <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  58 + v-hasPermi="['system:role:update']">修改</el-button>
  59 + <el-button size="mini" type="text" icon="el-icon-circle-check" @click="handleMenu(scope.row)"
  60 + v-hasPermi="['system:permission:assign-role-menu']">菜单权限</el-button>
  61 + <el-button size="mini" type="text" icon="el-icon-circle-check" @click="handleDataScope(scope.row)"
  62 + v-hasPermi="['system:permission:assign-role-data-scope']">数据权限</el-button>
  63 + <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
  64 + v-hasPermi="['system:role:delete']">删除</el-button>
131 </template> 65 </template>
132 </el-table-column> 66 </el-table-column>
133 </el-table> 67 </el-table>
134 68
135 - <pagination  
136 - v-show="total>0"  
137 - :total="total"  
138 - :page.sync="queryParams.pageNum"  
139 - :limit.sync="queryParams.pageSize"  
140 - @pagination="getList"  
141 - /> 69 + <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
  70 + @pagination="getList"/>
142 71
143 <!-- 添加或修改角色配置对话框 --> 72 <!-- 添加或修改角色配置对话框 -->
144 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> 73 <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
ruoyi-ui/src/views/system/user/index.vue
@@ -4,77 +4,32 @@ @@ -4,77 +4,32 @@
4 <!--部门数据--> 4 <!--部门数据-->
5 <el-col :span="4" :xs="24"> 5 <el-col :span="4" :xs="24">
6 <div class="head-container"> 6 <div class="head-container">
7 - <el-input  
8 - v-model="deptName"  
9 - placeholder="请输入部门名称"  
10 - clearable  
11 - size="small"  
12 - prefix-icon="el-icon-search"  
13 - style="margin-bottom: 20px"  
14 - /> 7 + <el-input v-model="deptName" placeholder="请输入部门名称" clearable size="small" prefix-icon="el-icon-search" style="margin-bottom: 20px"/>
15 </div> 8 </div>
16 <div class="head-container"> 9 <div class="head-container">
17 - <el-tree  
18 - :data="deptOptions"  
19 - :props="defaultProps"  
20 - :expand-on-click-node="false"  
21 - :filter-node-method="filterNode"  
22 - ref="tree"  
23 - default-expand-all  
24 - @node-click="handleNodeClick"  
25 - /> 10 + <el-tree :data="deptOptions" :props="defaultProps" :expand-on-click-node="false" :filter-node-method="filterNode"
  11 + ref="tree" default-expand-all @node-click="handleNodeClick"/>
26 </div> 12 </div>
27 </el-col> 13 </el-col>
28 <!--用户数据--> 14 <!--用户数据-->
29 <el-col :span="20" :xs="24"> 15 <el-col :span="20" :xs="24">
30 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px"> 16 <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
31 <el-form-item label="用户名称" prop="username"> 17 <el-form-item label="用户名称" prop="username">
32 - <el-input  
33 - v-model="queryParams.username"  
34 - placeholder="请输入用户名称"  
35 - clearable  
36 - size="small"  
37 - style="width: 240px"  
38 - @keyup.enter.native="handleQuery"  
39 - /> 18 + <el-input v-model="queryParams.username" placeholder="请输入用户名称" clearable size="small" style="width: 240px"
  19 + @keyup.enter.native="handleQuery"/>
40 </el-form-item> 20 </el-form-item>
41 <el-form-item label="手机号码" prop="mobile"> 21 <el-form-item label="手机号码" prop="mobile">
42 - <el-input  
43 - v-model="queryParams.mobile"  
44 - placeholder="请输入手机号码"  
45 - clearable  
46 - size="small"  
47 - style="width: 240px"  
48 - @keyup.enter.native="handleQuery"  
49 - /> 22 + <el-input v-model="queryParams.mobile" placeholder="请输入手机号码" clearable size="small" style="width: 240px"
  23 + @keyup.enter.native="handleQuery"/>
50 </el-form-item> 24 </el-form-item>
51 <el-form-item label="状态" prop="status"> 25 <el-form-item label="状态" prop="status">
52 - <el-select  
53 - v-model="queryParams.status"  
54 - placeholder="用户状态"  
55 - clearable  
56 - size="small"  
57 - style="width: 240px"  
58 - >  
59 - <el-option  
60 - v-for="dict in statusDictDatas"  
61 - :key="parseInt(dict.value)"  
62 - :label="dict.label"  
63 - :value="parseInt(dict.value)"  
64 - /> 26 + <el-select v-model="queryParams.status" placeholder="用户状态" clearable size="small" style="width: 240px">
  27 + <el-option v-for="dict in statusDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
65 </el-select> 28 </el-select>
66 </el-form-item> 29 </el-form-item>
67 <el-form-item label="创建时间"> 30 <el-form-item label="创建时间">
68 - <el-date-picker  
69 - v-model="dateRange"  
70 - size="small"  
71 - style="width: 240px"  
72 - value-format="yyyy-MM-dd"  
73 - type="daterange"  
74 - range-separator="-"  
75 - start-placeholder="开始日期"  
76 - end-placeholder="结束日期"  
77 - ></el-date-picker> 31 + <el-date-picker v-model="dateRange" size="small" style="width: 240px" value-format="yyyy-MM-dd" type="daterange"
  32 + range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
78 </el-form-item> 33 </el-form-item>
79 <el-form-item> 34 <el-form-item>
80 <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> 35 <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -84,31 +39,16 @@ @@ -84,31 +39,16 @@
84 39
85 <el-row :gutter="10" class="mb8"> 40 <el-row :gutter="10" class="mb8">
86 <el-col :span="1.5"> 41 <el-col :span="1.5">
87 - <el-button  
88 - type="primary"  
89 - icon="el-icon-plus"  
90 - size="mini"  
91 - @click="handleAdd"  
92 - v-hasPermi="['system:user:add']"  
93 - >新增</el-button> 42 + <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd"
  43 + v-hasPermi="['system:user:create']">新增</el-button>
94 </el-col> 44 </el-col>
95 <el-col :span="1.5"> 45 <el-col :span="1.5">
96 - <el-button  
97 - type="info"  
98 - icon="el-icon-upload2"  
99 - size="mini"  
100 - @click="handleImport"  
101 - v-hasPermi="['system:user:import']"  
102 - >导入</el-button> 46 + <el-button type="info" icon="el-icon-upload2" size="mini" @click="handleImport"
  47 + v-hasPermi="['system:user:import']">导入</el-button>
103 </el-col> 48 </el-col>
104 <el-col :span="1.5"> 49 <el-col :span="1.5">
105 - <el-button  
106 - type="warning"  
107 - icon="el-icon-download"  
108 - size="mini"  
109 - @click="handleExport"  
110 - v-hasPermi="['system:user:export']"  
111 - >导出</el-button> 50 + <el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport"
  51 + v-hasPermi="['system:user:export']">导出</el-button>
112 </el-col> 52 </el-col>
113 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar> 53 <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
114 </el-row> 54 </el-row>
@@ -121,12 +61,7 @@ @@ -121,12 +61,7 @@
121 <el-table-column label="手机号码" align="center" prop="mobile" width="120" /> 61 <el-table-column label="手机号码" align="center" prop="mobile" width="120" />
122 <el-table-column label="状态" align="center"> 62 <el-table-column label="状态" align="center">
123 <template slot-scope="scope"> 63 <template slot-scope="scope">
124 - <el-switch  
125 - v-model="scope.row.status"  
126 - :active-value="0"  
127 - :inactive-value="1"  
128 - @change="handleStatusChange(scope.row)"  
129 - ></el-switch> 64 + <el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1" @change="handleStatusChange(scope.row)" />
130 </template> 65 </template>
131 </el-table-column> 66 </el-table-column>
132 <el-table-column label="创建时间" align="center" prop="createTime" width="160"> 67 <el-table-column label="创建时间" align="center" prop="createTime" width="160">
@@ -134,60 +69,29 @@ @@ -134,60 +69,29 @@
134 <span>{{ parseTime(scope.row.createTime) }}</span> 69 <span>{{ parseTime(scope.row.createTime) }}</span>
135 </template> 70 </template>
136 </el-table-column> 71 </el-table-column>
137 - <el-table-column  
138 - label="操作"  
139 - align="center"  
140 - width="160"  
141 - class-name="small-padding fixed-width"  
142 - > 72 + <el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
143 <template slot-scope="scope"> 73 <template slot-scope="scope">
144 - <el-button  
145 - size="large"  
146 - type="text"  
147 - icon="el-icon-edit"  
148 - @click="handleUpdate(scope.row)"  
149 - v-hasPermi="['system:role:edit']"  
150 - >修改</el-button> 74 + <el-button size="large" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
  75 + v-hasPermi="['system:role:update']">修改</el-button>
151 <el-dropdown @command="(command) => handleCommand(command, scope.$index, scope.row)"> 76 <el-dropdown @command="(command) => handleCommand(command, scope.$index, scope.row)">
152 <span class="el-dropdown-link"> 77 <span class="el-dropdown-link">
153 更多操作<i class="el-icon-arrow-down el-icon--right"></i> 78 更多操作<i class="el-icon-arrow-down el-icon--right"></i>
154 </span> 79 </span>
155 <el-dropdown-menu slot="dropdown"> 80 <el-dropdown-menu slot="dropdown">
156 - <el-dropdown-item  
157 - command="handleDelete"  
158 - v-if="scope.row.id !== 1"  
159 - size="mini"  
160 - type="text"  
161 - icon="el-icon-delete"  
162 - v-hasPermi="['system:user:remove']"  
163 - >删除</el-dropdown-item>  
164 - <el-dropdown-item  
165 - command="handleResetPwd"  
166 - size="mini"  
167 - type="text"  
168 - icon="el-icon-key"  
169 - v-hasPermi="['system:user:resetPwd']"  
170 - >重置</el-dropdown-item>  
171 - <el-dropdown-item  
172 - command="handleRole"  
173 - size="mini"  
174 - type="text"  
175 - icon="el-icon-circle-check"  
176 - v-hasPermi="['system:permission:assign-user-role']"  
177 - >分配角色</el-dropdown-item> 81 + <el-dropdown-item command="handleDelete" v-if="scope.row.id !== 1" size="mini" type="text" icon="el-icon-delete"
  82 + v-hasPermi="['system:user:delete']">删除</el-dropdown-item>
  83 + <el-dropdown-item command="handleResetPwd" size="mini" type="text" icon="el-icon-key"
  84 + v-hasPermi="['system:user:update-password']">重置密码</el-dropdown-item>
  85 + <el-dropdown-item command="handleRole" size="mini" type="text" icon="el-icon-circle-check"
  86 + v-hasPermi="['system:permission:assign-user-role']">分配角色</el-dropdown-item>
178 </el-dropdown-menu> 87 </el-dropdown-menu>
179 </el-dropdown> 88 </el-dropdown>
180 </template> 89 </template>
181 </el-table-column> 90 </el-table-column>
182 </el-table> 91 </el-table>
183 92
184 - <pagination  
185 - v-show="total>0"  
186 - :total="total"  
187 - :page.sync="queryParams.pageNo"  
188 - :limit.sync="queryParams.pageSize"  
189 - @pagination="getList"  
190 - /> 93 + <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
  94 + @pagination="getList"/>
191 </el-col> 95 </el-col>
192 </el-row> 96 </el-row>
193 97
@@ -203,8 +107,7 @@ @@ -203,8 +107,7 @@
203 <el-col :span="12"> 107 <el-col :span="12">
204 <el-form-item label="归属部门" prop="deptId"> 108 <el-form-item label="归属部门" prop="deptId">
205 <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true" 109 <treeselect v-model="form.deptId" :options="deptOptions" :show-count="true"
206 - placeholder="请选择归属部门" :normalizer="normalizer"  
207 - /> 110 + placeholder="请选择归属部门" :normalizer="normalizer"/>
208 </el-form-item> 111 </el-form-item>
209 </el-col> 112 </el-col>
210 </el-row> 113 </el-row>
@@ -236,12 +139,7 @@ @@ -236,12 +139,7 @@
236 <el-col :span="12"> 139 <el-col :span="12">
237 <el-form-item label="用户性别"> 140 <el-form-item label="用户性别">
238 <el-select v-model="form.sex" placeholder="请选择"> 141 <el-select v-model="form.sex" placeholder="请选择">
239 - <el-option  
240 - v-for="dict in sexDictDatas"  
241 - :key="parseInt(dict.value)"  
242 - :label="dict.label"  
243 - :value="parseInt(dict.value)"  
244 - ></el-option> 142 + <el-option v-for="dict in sexDictDatas" :key="parseInt(dict.value)" :label="dict.label" :value="parseInt(dict.value)"/>
245 </el-select> 143 </el-select>
246 </el-form-item> 144 </el-form-item>
247 </el-col> 145 </el-col>
@@ -333,8 +231,18 @@ @@ -333,8 +231,18 @@
333 </template> 231 </template>
334 232
335 <script> 233 <script>
336 -import { listUser, getUser, delUser, addUser, updateUser, exportUser, resetUserPwd, changeUserStatus, importTemplate } from "@/api/system/user";  
337 -import { getToken } from "@/utils/auth"; 234 +import {
  235 + addUser,
  236 + changeUserStatus,
  237 + delUser,
  238 + exportUser,
  239 + getUser,
  240 + importTemplate,
  241 + listUser,
  242 + resetUserPwd,
  243 + updateUser
  244 +} from "@/api/system/user";
  245 +import {getToken} from "@/utils/auth";
338 import Treeselect from "@riophae/vue-treeselect"; 246 import Treeselect from "@riophae/vue-treeselect";
339 import "@riophae/vue-treeselect/dist/vue-treeselect.css"; 247 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
340 248
ruoyi-ui/src/views/system/user/profile/index.vue
@@ -13,11 +13,11 @@ @@ -13,11 +13,11 @@
13 <ul class="list-group list-group-striped"> 13 <ul class="list-group list-group-striped">
14 <li class="list-group-item"> 14 <li class="list-group-item">
15 <svg-icon icon-class="user" />用户名称 15 <svg-icon icon-class="user" />用户名称
16 - <div class="pull-right">{{ user.userName }}</div> 16 + <div class="pull-right">{{ user.username }}</div>
17 </li> 17 </li>
18 <li class="list-group-item"> 18 <li class="list-group-item">
19 <svg-icon icon-class="phone" />手机号码 19 <svg-icon icon-class="phone" />手机号码
20 - <div class="pull-right">{{ user.phonenumber }}</div> 20 + <div class="pull-right">{{ user.mobile }}</div>
21 </li> 21 </li>
22 <li class="list-group-item"> 22 <li class="list-group-item">
23 <svg-icon icon-class="email" />用户邮箱 23 <svg-icon icon-class="email" />用户邮箱
@@ -25,15 +25,19 @@ @@ -25,15 +25,19 @@
25 </li> 25 </li>
26 <li class="list-group-item"> 26 <li class="list-group-item">
27 <svg-icon icon-class="tree" />所属部门 27 <svg-icon icon-class="tree" />所属部门
28 - <div class="pull-right" v-if="user.dept">{{ user.dept.deptName }} / {{ postGroup }}</div> 28 + <div class="pull-right" v-if="user.dept">{{ user.dept.name }}</div>
  29 + </li>
  30 + <li class="list-group-item">
  31 + <svg-icon icon-class="tree" />所属岗位
  32 + <div class="pull-right" v-if="user.posts">{{ user.posts.map(post => post.name).join(',') }}</div>
29 </li> 33 </li>
30 <li class="list-group-item"> 34 <li class="list-group-item">
31 <svg-icon icon-class="peoples" />所属角色 35 <svg-icon icon-class="peoples" />所属角色
32 - <div class="pull-right">{{ roleGroup }}</div> 36 + <div class="pull-right">{{ user.roles.map(post => post.name).join(',') }}</div>
33 </li> 37 </li>
34 <li class="list-group-item"> 38 <li class="list-group-item">
35 <svg-icon icon-class="date" />创建日期 39 <svg-icon icon-class="date" />创建日期
36 - <div class="pull-right">{{ user.createTime }}</div> 40 + <div class="pull-right">{{ parseTime(user.createTime) }}</div>
37 </li> 41 </li>
38 </ul> 42 </ul>
39 </div> 43 </div>
@@ -82,8 +86,6 @@ export default { @@ -82,8 +86,6 @@ export default {
82 getUser() { 86 getUser() {
83 getUserProfile().then(response => { 87 getUserProfile().then(response => {
84 this.user = response.data; 88 this.user = response.data;
85 - this.roleGroup = response.roleGroup;  
86 - this.postGroup = response.postGroup;  
87 }); 89 });
88 } 90 }
89 } 91 }
ruoyi-ui/src/views/system/user/profile/userInfo.vue
1 <template> 1 <template>
2 <el-form ref="form" :model="user" :rules="rules" label-width="80px"> 2 <el-form ref="form" :model="user" :rules="rules" label-width="80px">
3 <el-form-item label="用户昵称" prop="nickName"> 3 <el-form-item label="用户昵称" prop="nickName">
4 - <el-input v-model="user.nickName" />  
5 - </el-form-item>  
6 - <el-form-item label="手机号码" prop="phonenumber">  
7 - <el-input v-model="user.phonenumber" maxlength="11" /> 4 + <el-input v-model="user.nickname" />
  5 + </el-form-item>
  6 + <el-form-item label="手机号码" prop="mobile">
  7 + <el-input v-model="user.mobile" maxlength="11" />
8 </el-form-item> 8 </el-form-item>
9 <el-form-item label="邮箱" prop="email"> 9 <el-form-item label="邮箱" prop="email">
10 <el-input v-model="user.email" maxlength="50" /> 10 <el-input v-model="user.email" maxlength="50" />
11 </el-form-item> 11 </el-form-item>
12 <el-form-item label="性别"> 12 <el-form-item label="性别">
13 <el-radio-group v-model="user.sex"> 13 <el-radio-group v-model="user.sex">
14 - <el-radio label="0">男</el-radio>  
15 - <el-radio label="1">女</el-radio> 14 + <el-radio :label="1">男</el-radio>
  15 + <el-radio :label="2">女</el-radio>
16 </el-radio-group> 16 </el-radio-group>
17 </el-form-item> 17 </el-form-item>
18 <el-form-item> 18 <el-form-item>
@@ -35,7 +35,7 @@ export default { @@ -35,7 +35,7 @@ export default {
35 return { 35 return {
36 // 表单校验 36 // 表单校验
37 rules: { 37 rules: {
38 - nickName: [ 38 + nickname: [
39 { required: true, message: "用户昵称不能为空", trigger: "blur" } 39 { required: true, message: "用户昵称不能为空", trigger: "blur" }
40 ], 40 ],
41 email: [ 41 email: [
@@ -46,7 +46,7 @@ export default { @@ -46,7 +46,7 @@ export default {
46 trigger: ["blur", "change"] 46 trigger: ["blur", "change"]
47 } 47 }
48 ], 48 ],
49 - phonenumber: [ 49 + mobile: [
50 { required: true, message: "手机号码不能为空", trigger: "blur" }, 50 { required: true, message: "手机号码不能为空", trigger: "blur" },
51 { 51 {
52 pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, 52 pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
sql/quartz.sql
@@ -178,3 +178,11 @@ CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIG @@ -178,3 +178,11 @@ CREATE INDEX IDX_QRTZ_FT_T_G ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_NAME,TRIG
178 CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP); 178 CREATE INDEX IDX_QRTZ_FT_TG ON QRTZ_FIRED_TRIGGERS(SCHED_NAME,TRIGGER_GROUP);
179 179
180 commit; 180 commit;
  181 +
  182 +-- 初始化默认任务 用户 Session 超时 Job
  183 +INSERT INTO QRTZ_JOB_DETAILS VALUES ('schedulerName', 'sysUserSessionTimeoutJob', 'DEFAULT', NULL, 'cn.iocoder.dashboard.framework.quartz.core.handler.JobHandlerInvoker', '0', '1', '1', '0', 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000027400064A4F425F49447372000E6A6176612E6C616E672E4C6F6E673B8BE490CC8F23DF0200014A000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787000000000000000047400104A4F425F48414E444C45525F4E414D457400187379735573657253657373696F6E54696D656F75744A6F627800);
  184 +commit;
  185 +INSERT INTO QRTZ_TRIGGERS VALUES ('schedulerName', 'sysUserSessionTimeoutJob', 'DEFAULT', 'sysUserSessionTimeoutJob', 'DEFAULT', NULL, 1615706340000, 1615706280000, 5, 'WAITING', 'CRON', 1615706125000, 0, NULL, 0, 0xACED0005737200156F72672E71756172747A2E4A6F62446174614D61709FB083E8BFA9B0CB020000787200266F72672E71756172747A2E7574696C732E537472696E674B65794469727479466C61674D61708208E8C3FBC55D280200015A0013616C6C6F77735472616E7369656E74446174617872001D6F72672E71756172747A2E7574696C732E4469727479466C61674D617013E62EAD28760ACE0200025A000564697274794C00036D617074000F4C6A6176612F7574696C2F4D61703B787001737200116A6176612E7574696C2E486173684D61700507DAC1C31660D103000246000A6C6F6164466163746F724900097468726573686F6C6478703F4000000000000C770800000010000000037400114A4F425F48414E444C45525F504152414D707400124A4F425F52455452595F494E54455256414C737200116A6176612E6C616E672E496E746567657212E2A0A4F781873802000149000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B0200007870000007D074000F4A4F425F52455452595F434F554E547371007E0009000000037800);
  186 +commit;
  187 +INSERT INTO QRTZ_CRON_TRIGGERS VALUES ('schedulerName', 'sysUserSessionTimeoutJob', 'DEFAULT', '0 * * * * ? *', 'Asia/Shanghai');
  188 +commit;
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: 14/03/2021 13:12:25 14 + Date: 21/03/2021 18:53:24
15 */ 15 */
16 16
17 SET NAMES utf8mb4; 17 SET NAMES utf8mb4;
@@ -43,155 +43,12 @@ CREATE TABLE `inf_api_access_log` ( @@ -43,155 +43,12 @@ 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=592 DEFAULT CHARSET=utf8mb4 COMMENT='API 访问日志表'; 46 +) ENGINE=InnoDB AUTO_INCREMENT=1318 DEFAULT CHARSET=utf8mb4 COMMENT='API 访问日志表';
47 47
48 -- ---------------------------- 48 -- ----------------------------
49 -- Records of inf_api_access_log 49 -- Records of inf_api_access_log
50 -- ---------------------------- 50 -- ----------------------------
51 BEGIN; 51 BEGIN;
52 -INSERT INTO `inf_api_access_log` VALUES (449, 'f22b9b8b-baf1-4e79-9858-c5417b12d808', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-13 13:32:12', '2021-03-13 13:32:12', 153, 0, '', NULL, '2021-03-13 13:32:12', NULL, '2021-03-13 13:32:12', b'0');  
53 -INSERT INTO `inf_api_access_log` VALUES (450, '0a38df74-a77c-48fd-89e5-11182a2ee6a8', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-13 13:32:12', '2021-03-13 13:32:12', 153, 0, '', NULL, '2021-03-13 13:32:12', NULL, '2021-03-13 13:32:12', b'0');  
54 -INSERT INTO `inf_api_access_log` VALUES (451, 'ee2dffcd-6423-488f-bdc5-be78f6e2576d', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-13 13:32:12', '2021-03-13 13:32:12', 13, 0, '', NULL, '2021-03-13 13:32:12', NULL, '2021-03-13 13:32:12', b'0');  
55 -INSERT INTO `inf_api_access_log` VALUES (452, 'a71edfed-315b-4f60-9d60-f4d65eb71934', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-13 13:32:12', '2021-03-13 13:32:13', 23, 0, '', NULL, '2021-03-13 13:32:13', NULL, '2021-03-13 13:32:13', b'0');  
56 -INSERT INTO `inf_api_access_log` VALUES (453, '71d26ef0-e0ff-4d00-9e88-fcc1586b5ed7', 1, 2, 'dashboard', 'GET', '/api/system/dept/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-13 13:32:13', '2021-03-13 13:32:13', 32, 0, '', NULL, '2021-03-13 13:32:13', NULL, '2021-03-13 13:32:13', b'0');  
57 -INSERT INTO `inf_api_access_log` VALUES (454, '11cbd450-214c-4217-9ab3-eebfdcc668d2', 1, 2, 'dashboard', 'GET', '/api/system/post/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-13 13:32:13', '2021-03-13 13:32:13', 29, 0, '', NULL, '2021-03-13 13:32:13', NULL, '2021-03-13 13:32:13', b'0');  
58 -INSERT INTO `inf_api_access_log` VALUES (455, '9400d6b4-16f6-4a19-ade8-0e3b788e386f', 1, 2, 'dashboard', 'GET', '/api/infra/config/get-value-by-key', '{\"query\":{\"key\":\"sys.user.initPassword\"},\"body\":null}', '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', '2021-03-13 13:32:13', '2021-03-13 13:32:13', 51, 0, '', NULL, '2021-03-13 13:32:13', NULL, '2021-03-13 13:32:13', b'0');  
59 -INSERT INTO `inf_api_access_log` VALUES (456, '74bd4331-3765-4e57-9207-7f461c0bf4a3', 1, 2, 'dashboard', 'GET', '/api/system/user/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"},\"body\":null}', '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', '2021-03-13 13:32:12', '2021-03-13 13:32:13', 162, 0, '', NULL, '2021-03-13 13:32:13', NULL, '2021-03-13 13:32:13', b'0');  
60 -INSERT INTO `inf_api_access_log` VALUES (457, '84877f91-7e13-4150-8cc6-1c4a2a769e85', 1, 2, 'dashboard', 'GET', '/api/infra/file/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"},\"body\":null}', '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', '2021-03-13 13:32:24', '2021-03-13 13:32:24', 37, 0, '', NULL, '2021-03-13 13:32:24', NULL, '2021-03-13 13:32:24', b'0');  
61 -INSERT INTO `inf_api_access_log` VALUES (458, 'a50536b1-94a2-419a-9c81-2ae812cd1e26', 0, 2, 'dashboard', 'GET', '/api/infra/file/get/5e8609290e915c4fa8b08e67.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-13 13:32:24', '2021-03-13 13:32:24', 14, 0, '', NULL, '2021-03-13 13:32:24', NULL, '2021-03-13 13:32:24', b'0');  
62 -INSERT INTO `inf_api_access_log` VALUES (459, '82da8546-b43b-4290-9a8e-1e7dcd9dbd1c', 0, 2, 'dashboard', 'GET', '/api/infra/file/get/427.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-13 13:32:24', '2021-03-13 13:32:24', 14, 0, '', NULL, '2021-03-13 13:32:24', NULL, '2021-03-13 13:32:24', b'0');  
63 -INSERT INTO `inf_api_access_log` VALUES (460, '8886554b-d6af-4538-b3fb-51584363b567', 0, 2, 'dashboard', 'GET', '/api/infra/file/get/8448cada8c714e4ab61f521c8da21990', '{\"query\":{},\"body\":null}', '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', '2021-03-13 13:32:24', '2021-03-13 13:32:24', 12, 0, '', NULL, '2021-03-13 13:32:24', NULL, '2021-03-13 13:32:24', b'0');  
64 -INSERT INTO `inf_api_access_log` VALUES (461, '528742f2-6311-49d9-8c15-54e1d89730bb', 1, 2, 'dashboard', 'GET', '/api/tool/codegen/table/page', '{\"query\":{\"pageNo\":\"1\",\"pageSize\":\"10\"},\"body\":null}', '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', '2021-03-13 13:35:08', '2021-03-13 13:35:08', 40, 0, '', NULL, '2021-03-13 13:35:08', NULL, '2021-03-13 13:35:08', b'0');  
65 -INSERT INTO `inf_api_access_log` VALUES (462, 'c62d9055-d12c-4236-af7c-16753905a0dd', 1, 2, 'dashboard', 'GET', '/api/tool/codegen/preview', '{\"query\":{\"tableId\":\"33\"},\"body\":null}', '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', '2021-03-13 13:35:12', '2021-03-13 13:35:12', 235, 0, '', NULL, '2021-03-13 13:35:12', NULL, '2021-03-13 13:35:12', b'0');  
66 -INSERT INTO `inf_api_access_log` VALUES (463, '0aebc46f-2852-4300-afb6-323a97e1d45c', 1, 2, 'dashboard', 'GET', '/api/tool/codegen/detail', '{\"query\":{\"tableId\":\"33\"},\"body\":null}', '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', '2021-03-13 13:35:48', '2021-03-13 13:35:48', 26, 0, '', NULL, '2021-03-13 13:35:48', NULL, '2021-03-13 13:35:48', b'0');  
67 -INSERT INTO `inf_api_access_log` VALUES (464, 'ed36b980-e12d-474e-99fe-53962b4fcde7', 1, 2, 'dashboard', 'GET', '/api/system/dict-type/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-13 13:35:48', '2021-03-13 13:35:48', 20, 0, '', NULL, '2021-03-13 13:35:48', NULL, '2021-03-13 13:35:48', b'0');  
68 -INSERT INTO `inf_api_access_log` VALUES (465, 'bac9bea3-1e07-4642-8252-469bb0c58ab8', 1, 2, 'dashboard', 'GET', '/api/system/menu/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-13 13:35:48', '2021-03-13 13:35:48', 34, 0, '', NULL, '2021-03-13 13:35:48', NULL, '2021-03-13 13:35:48', b'0');  
69 -INSERT INTO `inf_api_access_log` VALUES (466, 'b8c6972c-0cd0-475a-8cbe-c25f965233ec', 0, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:32', '2021-03-14 00:31:32', 35, 0, '', NULL, '2021-03-14 00:31:32', NULL, '2021-03-14 00:31:32', b'0');  
70 -INSERT INTO `inf_api_access_log` VALUES (467, '3223baf6-510b-44ac-b174-1e8f754f274e', 0, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:32', '2021-03-14 00:31:32', 35, 0, '', NULL, '2021-03-14 00:31:32', NULL, '2021-03-14 00:31:32', b'0');  
71 -INSERT INTO `inf_api_access_log` VALUES (468, '43158144-4ea2-459d-a677-0431effdc434', 0, 2, 'dashboard', 'POST', '/api/logout', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:32', '2021-03-14 00:31:32', 4, 0, '', NULL, '2021-03-14 00:31:32', NULL, '2021-03-14 00:31:32', b'0');  
72 -INSERT INTO `inf_api_access_log` VALUES (469, '02497e40-c460-4ba1-8b56-f0ec6d327371', 0, 2, 'dashboard', 'POST', '/api/logout', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:34', '2021-03-14 00:31:34', 2, 0, '', NULL, '2021-03-14 00:31:34', NULL, '2021-03-14 00:31:34', b'0');  
73 -INSERT INTO `inf_api_access_log` VALUES (470, '3cfcc80d-150e-42f5-bace-472b52db4898', 0, 2, 'dashboard', 'GET', '/api/system/captcha/get-image', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:32', '2021-03-14 00:31:34', 2432, 0, '', NULL, '2021-03-14 00:31:34', NULL, '2021-03-14 00:31:34', b'0');  
74 -INSERT INTO `inf_api_access_log` VALUES (471, 'd8d4767b-9064-4e2d-a619-08755e31758a', 0, 2, 'dashboard', 'GET', '/api/system/captcha/get-image', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:34', '2021-03-14 00:31:34', 30, 0, '', NULL, '2021-03-14 00:31:34', NULL, '2021-03-14 00:31:34', b'0');  
75 -INSERT INTO `inf_api_access_log` VALUES (472, '5a937554-c758-4d39-8473-84078eb23708', 0, 2, 'dashboard', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"0j0pw\\\",\\\"uuid\\\":\\\"cf44d21646cb4dc4b6bd0207dec9c387\\\"}\"}', '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', '2021-03-14 00:31:39', '2021-03-14 00:31:39', 55, 1002000004, '验证码不正确', NULL, '2021-03-14 00:31:39', NULL, '2021-03-14 00:31:39', b'0');  
76 -INSERT INTO `inf_api_access_log` VALUES (473, '0b0a61ba-3b13-4f7e-8eac-d037854afbe5', 0, 2, 'dashboard', 'GET', '/api/system/captcha/get-image', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:39', '2021-03-14 00:31:39', 15, 0, '', NULL, '2021-03-14 00:31:39', NULL, '2021-03-14 00:31:39', b'0');  
77 -INSERT INTO `inf_api_access_log` VALUES (474, '3fbef0e6-da78-408f-bf58-2b09e9316285', 0, 2, 'dashboard', 'POST', '/api/login', '{\"query\":{},\"body\":\"{\\\"username\\\":\\\"admin\\\",\\\"password\\\":\\\"admin123\\\",\\\"code\\\":\\\"18nyi\\\",\\\"uuid\\\":\\\"f39a9a64154c4e72a7fa4deda5b83052\\\"}\"}', '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', '2021-03-14 00:31:43', '2021-03-14 00:31:43', 244, 0, '', NULL, '2021-03-14 00:31:43', NULL, '2021-03-14 00:31:43', b'0');  
78 -INSERT INTO `inf_api_access_log` VALUES (475, '0d50b4d2-b545-44e2-9cfb-ea1961c58e9a', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:43', '2021-03-14 00:31:43', 29, 0, '', NULL, '2021-03-14 00:31:43', NULL, '2021-03-14 00:31:43', b'0');  
79 -INSERT INTO `inf_api_access_log` VALUES (476, 'a837de17-c5bc-4223-91ac-2f9b79c536e3', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:43', '2021-03-14 00:31:43', 29, 0, '', NULL, '2021-03-14 00:31:43', NULL, '2021-03-14 00:31:43', b'0');  
80 -INSERT INTO `inf_api_access_log` VALUES (477, 'e57342e2-7db6-4b7b-9ab5-55169ef7d042', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:43', '2021-03-14 00:31:43', 11, 0, '', NULL, '2021-03-14 00:31:43', NULL, '2021-03-14 00:31:43', b'0');  
81 -INSERT INTO `inf_api_access_log` VALUES (478, '7bb82837-8a93-4357-a14f-f1d0856074c8', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:43', '2021-03-14 00:31:43', 4, 0, '', NULL, '2021-03-14 00:31:44', NULL, '2021-03-14 00:31:44', b'0');  
82 -INSERT INTO `inf_api_access_log` VALUES (479, 'ee9e5588-1704-4c35-afca-f42007c17079', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:31:49', '2021-03-14 00:31:50', 549, 0, '', NULL, '2021-03-14 00:31:50', NULL, '2021-03-14 00:31:50', b'0');  
83 -INSERT INTO `inf_api_access_log` VALUES (480, '07e9d2a7-a35d-4d46-aedf-37a899c50f77', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:32:17', '2021-03-14 00:32:17', 9, 0, '', NULL, '2021-03-14 00:32:17', NULL, '2021-03-14 00:32:17', b'0');  
84 -INSERT INTO `inf_api_access_log` VALUES (481, '7b2e7d88-baa9-4b3a-bef9-97d1cb9a27c7', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:32:17', '2021-03-14 00:32:17', 17, 0, '', NULL, '2021-03-14 00:32:17', NULL, '2021-03-14 00:32:17', b'0');  
85 -INSERT INTO `inf_api_access_log` VALUES (482, '0078c48a-beb9-4b34-b44e-b75ff3aa974b', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:32:17', '2021-03-14 00:32:17', 7, 0, '', NULL, '2021-03-14 00:32:17', NULL, '2021-03-14 00:32:17', b'0');  
86 -INSERT INTO `inf_api_access_log` VALUES (483, '8d8541f4-7921-46da-9804-3922ea43ccab', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:32:18', '2021-03-14 00:32:18', 4, 0, '', NULL, '2021-03-14 00:32:18', NULL, '2021-03-14 00:32:18', b'0');  
87 -INSERT INTO `inf_api_access_log` VALUES (484, '442c170e-7eb8-43a7-aad4-7cd10a75f64a', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:32:18', '2021-03-14 00:32:18', 132, 0, '', NULL, '2021-03-14 00:32:18', NULL, '2021-03-14 00:32:18', b'0');  
88 -INSERT INTO `inf_api_access_log` VALUES (485, 'b3d0f1e8-e31e-4611-9463-615adca3a89e', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:34:15', '2021-03-14 00:34:15', 9, 0, '', NULL, '2021-03-14 00:34:15', NULL, '2021-03-14 00:34:15', b'0');  
89 -INSERT INTO `inf_api_access_log` VALUES (486, '12040d3b-c59c-4727-b646-a9633a71a9bc', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:34:15', '2021-03-14 00:34:15', 14, 0, '', NULL, '2021-03-14 00:34:15', NULL, '2021-03-14 00:34:15', b'0');  
90 -INSERT INTO `inf_api_access_log` VALUES (487, 'df248447-6cf7-4cca-be03-dd98330fbafe', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:34:15', '2021-03-14 00:34:15', 6, 0, '', NULL, '2021-03-14 00:34:15', NULL, '2021-03-14 00:34:15', b'0');  
91 -INSERT INTO `inf_api_access_log` VALUES (488, '243764af-294c-47e5-aedc-529c9939a37e', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:34:16', '2021-03-14 00:34:16', 6, 0, '', NULL, '2021-03-14 00:34:16', NULL, '2021-03-14 00:34:16', b'0');  
92 -INSERT INTO `inf_api_access_log` VALUES (489, '737d22fc-3d3d-4104-919a-8cec3ac5b837', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:34:16', '2021-03-14 00:34:16', 215, 0, '', NULL, '2021-03-14 00:34:16', NULL, '2021-03-14 00:34:16', b'0');  
93 -INSERT INTO `inf_api_access_log` VALUES (490, '33d35537-8a07-4197-8930-e78d351f393f', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:34:57', '2021-03-14 00:34:57', 8, 0, '', NULL, '2021-03-14 00:34:57', NULL, '2021-03-14 00:34:57', b'0');  
94 -INSERT INTO `inf_api_access_log` VALUES (491, '28c0cccd-0130-476b-89c6-f601f7b8b445', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:34:57', '2021-03-14 00:34:57', 16, 0, '', NULL, '2021-03-14 00:34:57', NULL, '2021-03-14 00:34:57', b'0');  
95 -INSERT INTO `inf_api_access_log` VALUES (492, 'c649f830-e6b1-41db-9bdb-94bb5a7b8167', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:34:57', '2021-03-14 00:34:57', 4, 0, '', NULL, '2021-03-14 00:34:57', NULL, '2021-03-14 00:34:57', b'0');  
96 -INSERT INTO `inf_api_access_log` VALUES (493, 'b66c63cf-3d74-4a74-acd6-2cd806062b62', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:34:57', '2021-03-14 00:34:57', 4, 0, '', NULL, '2021-03-14 00:34:57', NULL, '2021-03-14 00:34:57', b'0');  
97 -INSERT INTO `inf_api_access_log` VALUES (494, '2d6d575f-c380-47c1-acc6-20989092060c', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:34:57', '2021-03-14 00:34:58', 225, 0, '', NULL, '2021-03-14 00:34:58', NULL, '2021-03-14 00:34:58', b'0');  
98 -INSERT INTO `inf_api_access_log` VALUES (495, 'ffd49974-e6b7-425d-98cd-be851e38815e', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:35:04', '2021-03-14 00:35:04', 121, 0, '', NULL, '2021-03-14 00:35:04', NULL, '2021-03-14 00:35:04', b'0');  
99 -INSERT INTO `inf_api_access_log` VALUES (496, '5292d11b-6981-49f5-9879-94f30cf93db4', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:35:10', '2021-03-14 00:35:10', 10, 0, '', NULL, '2021-03-14 00:35:10', NULL, '2021-03-14 00:35:10', b'0');  
100 -INSERT INTO `inf_api_access_log` VALUES (497, '9e4816d7-b70a-46f5-afc5-f6fc7061fee3', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:35:10', '2021-03-14 00:35:10', 17, 0, '', NULL, '2021-03-14 00:35:10', NULL, '2021-03-14 00:35:10', b'0');  
101 -INSERT INTO `inf_api_access_log` VALUES (498, 'df961948-f3f7-4fad-8d77-944820152305', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:35:10', '2021-03-14 00:35:10', 4, 0, '', NULL, '2021-03-14 00:35:10', NULL, '2021-03-14 00:35:10', b'0');  
102 -INSERT INTO `inf_api_access_log` VALUES (499, 'dd5c28a0-76e1-47e6-bac7-293001d91f40', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:35:11', '2021-03-14 00:35:11', 4, 0, '', NULL, '2021-03-14 00:35:11', NULL, '2021-03-14 00:35:11', b'0');  
103 -INSERT INTO `inf_api_access_log` VALUES (500, 'e15bf39c-80c8-432e-96fb-46543a892471', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:35:11', '2021-03-14 00:35:11', 184, 0, '', NULL, '2021-03-14 00:35:11', NULL, '2021-03-14 00:35:11', b'0');  
104 -INSERT INTO `inf_api_access_log` VALUES (501, '564d7339-60f6-4c4e-8989-ef984a7dbe9c', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:35:16', '2021-03-14 00:35:16', 112, 0, '', NULL, '2021-03-14 00:35:16', NULL, '2021-03-14 00:35:16', b'0');  
105 -INSERT INTO `inf_api_access_log` VALUES (502, '5d9562a7-ee32-4bd0-95b9-465685c4b037', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:35:31', '2021-03-14 00:35:31', 109, 0, '', NULL, '2021-03-14 00:35:31', NULL, '2021-03-14 00:35:31', b'0');  
106 -INSERT INTO `inf_api_access_log` VALUES (503, '5eb9207f-4093-43af-aac4-8652d3088e7a', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:35:35', '2021-03-14 00:35:35', 102, 0, '', NULL, '2021-03-14 00:35:35', NULL, '2021-03-14 00:35:35', b'0');  
107 -INSERT INTO `inf_api_access_log` VALUES (504, '0d7ec6da-0fb4-48c0-ac0e-d07d147970be', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:45:11', '2021-03-14 00:45:11', 21, 0, '', NULL, '2021-03-14 00:45:11', NULL, '2021-03-14 00:45:11', b'0');  
108 -INSERT INTO `inf_api_access_log` VALUES (505, 'a9553f2b-c43b-4c65-a8bd-f62b462cd2ff', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:45:11', '2021-03-14 00:45:11', 30, 0, '', NULL, '2021-03-14 00:45:11', NULL, '2021-03-14 00:45:11', b'0');  
109 -INSERT INTO `inf_api_access_log` VALUES (506, '850e7e9a-41fa-4321-a75b-ea74b3e0929e', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:45:11', '2021-03-14 00:45:11', 5, 0, '', NULL, '2021-03-14 00:45:11', NULL, '2021-03-14 00:45:11', b'0');  
110 -INSERT INTO `inf_api_access_log` VALUES (507, 'd7e021f2-c943-4dd8-a47a-aabb7f0d4b98', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:45:12', '2021-03-14 00:45:12', 4, 0, '', NULL, '2021-03-14 00:45:12', NULL, '2021-03-14 00:45:12', b'0');  
111 -INSERT INTO `inf_api_access_log` VALUES (508, '2a06b244-12b5-4ede-a1dc-487185515454', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:45:12', '2021-03-14 00:45:12', 141, 0, '', NULL, '2021-03-14 00:45:12', NULL, '2021-03-14 00:45:12', b'0');  
112 -INSERT INTO `inf_api_access_log` VALUES (509, '1c8eeb85-895d-44b0-8872-aa80518c4644', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:22', '2021-03-14 00:46:22', 10, 0, '', NULL, '2021-03-14 00:46:22', NULL, '2021-03-14 00:46:22', b'0');  
113 -INSERT INTO `inf_api_access_log` VALUES (510, '28d8923f-30f2-476e-9747-d6d8f5db464e', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:22', '2021-03-14 00:46:22', 6, 0, '', NULL, '2021-03-14 00:46:22', NULL, '2021-03-14 00:46:22', b'0');  
114 -INSERT INTO `inf_api_access_log` VALUES (511, 'e16652a5-9eab-4717-945c-dfd157f71f3d', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:22', '2021-03-14 00:46:22', 4, 0, '', NULL, '2021-03-14 00:46:22', NULL, '2021-03-14 00:46:22', b'0');  
115 -INSERT INTO `inf_api_access_log` VALUES (512, 'f8ebcae7-0292-4d54-b759-91dd0a82be05', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:23', '2021-03-14 00:46:23', 3, 0, '', NULL, '2021-03-14 00:46:23', NULL, '2021-03-14 00:46:23', b'0');  
116 -INSERT INTO `inf_api_access_log` VALUES (513, 'a9f375d3-8da8-4459-9a22-74aad944ce43', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:23', '2021-03-14 00:46:23', 121, 0, '', NULL, '2021-03-14 00:46:23', NULL, '2021-03-14 00:46:23', b'0');  
117 -INSERT INTO `inf_api_access_log` VALUES (514, '77043f29-8918-4d07-a7f3-30dff623607d', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:29', '2021-03-14 00:46:29', 127, 0, '', NULL, '2021-03-14 00:46:29', NULL, '2021-03-14 00:46:29', b'0');  
118 -INSERT INTO `inf_api_access_log` VALUES (515, '8dfc5fe3-1f31-4a6a-8539-0ae3e599180b', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:35', '2021-03-14 00:46:35', 8, 0, '', NULL, '2021-03-14 00:46:35', NULL, '2021-03-14 00:46:35', b'0');  
119 -INSERT INTO `inf_api_access_log` VALUES (516, '2fe23869-fbe2-463e-8b60-6c31b9ba4216', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:35', '2021-03-14 00:46:35', 13, 0, '', NULL, '2021-03-14 00:46:35', NULL, '2021-03-14 00:46:35', b'0');  
120 -INSERT INTO `inf_api_access_log` VALUES (517, 'a1f78480-d3ee-4d66-aa2f-9c9ae8a410c6', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:35', '2021-03-14 00:46:35', 5, 0, '', NULL, '2021-03-14 00:46:35', NULL, '2021-03-14 00:46:35', b'0');  
121 -INSERT INTO `inf_api_access_log` VALUES (518, '960426c8-a155-4000-8021-97463dae5f63', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:36', '2021-03-14 00:46:36', 4, 0, '', NULL, '2021-03-14 00:46:36', NULL, '2021-03-14 00:46:36', b'0');  
122 -INSERT INTO `inf_api_access_log` VALUES (519, '6f074c2e-a508-4f62-87cb-af209d4bde98', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:36', '2021-03-14 00:46:36', 143, 0, '', NULL, '2021-03-14 00:46:36', NULL, '2021-03-14 00:46:36', b'0');  
123 -INSERT INTO `inf_api_access_log` VALUES (520, 'efab06d5-343f-46ba-9e4f-9ba76b91b571', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:45', '2021-03-14 00:46:45', 5, 0, '', NULL, '2021-03-14 00:46:45', NULL, '2021-03-14 00:46:45', b'0');  
124 -INSERT INTO `inf_api_access_log` VALUES (521, 'd1ee71ee-a30f-4123-8db3-7c3d885a6b50', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:45', '2021-03-14 00:46:45', 10, 0, '', NULL, '2021-03-14 00:46:45', NULL, '2021-03-14 00:46:45', b'0');  
125 -INSERT INTO `inf_api_access_log` VALUES (522, 'e0d9c8f7-d12b-4791-8cd4-a6b8dbebc2d4', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:45', '2021-03-14 00:46:45', 5, 0, '', NULL, '2021-03-14 00:46:45', NULL, '2021-03-14 00:46:45', b'0');  
126 -INSERT INTO `inf_api_access_log` VALUES (523, 'f17372a7-b9e1-43ce-a89a-9aef741fe679', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:46', '2021-03-14 00:46:46', 3, 0, '', NULL, '2021-03-14 00:46:46', NULL, '2021-03-14 00:46:46', b'0');  
127 -INSERT INTO `inf_api_access_log` VALUES (524, 'e3b7d7fb-1c63-4623-aa7a-eb6931e703b3', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:46:46', '2021-03-14 00:46:46', 92, 0, '', NULL, '2021-03-14 00:46:46', NULL, '2021-03-14 00:46:46', b'0');  
128 -INSERT INTO `inf_api_access_log` VALUES (525, 'd8e688e0-443c-4845-a666-fed7a77d5638', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:47:24', '2021-03-14 00:47:24', 118, 0, '', NULL, '2021-03-14 00:47:24', NULL, '2021-03-14 00:47:24', b'0');  
129 -INSERT INTO `inf_api_access_log` VALUES (526, 'daa5a590-346c-4101-bfdf-c366e43e0714', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:47:25', '2021-03-14 00:47:25', 12, 0, '', NULL, '2021-03-14 00:47:25', NULL, '2021-03-14 00:47:25', b'0');  
130 -INSERT INTO `inf_api_access_log` VALUES (527, 'dd28ff77-9d5b-4c34-a8d1-4fa6dcd68f68', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:47:25', '2021-03-14 00:47:25', 8, 0, '', NULL, '2021-03-14 00:47:25', NULL, '2021-03-14 00:47:25', b'0');  
131 -INSERT INTO `inf_api_access_log` VALUES (528, '800bc255-e685-40a7-a623-ef1fc8087663', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:47:25', '2021-03-14 00:47:25', 6, 0, '', NULL, '2021-03-14 00:47:25', NULL, '2021-03-14 00:47:25', b'0');  
132 -INSERT INTO `inf_api_access_log` VALUES (529, 'f3b59dce-a8d0-4b21-84b7-697498e19b63', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:47:26', '2021-03-14 00:47:26', 4, 0, '', NULL, '2021-03-14 00:47:26', NULL, '2021-03-14 00:47:26', b'0');  
133 -INSERT INTO `inf_api_access_log` VALUES (530, 'ededd21f-77ef-4131-8c68-88815f9ca0bf', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:47:26', '2021-03-14 00:47:26', 121, 0, '', NULL, '2021-03-14 00:47:26', NULL, '2021-03-14 00:47:26', b'0');  
134 -INSERT INTO `inf_api_access_log` VALUES (531, '17133597-d007-437b-9d5f-b04a6a412d89', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:47:28', '2021-03-14 00:47:28', 106, 0, '', NULL, '2021-03-14 00:47:28', NULL, '2021-03-14 00:47:28', b'0');  
135 -INSERT INTO `inf_api_access_log` VALUES (532, '71daef1d-151c-48f9-9258-76210c22ecb2', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:48:56', '2021-03-14 00:48:56', 11, 0, '', NULL, '2021-03-14 00:48:56', NULL, '2021-03-14 00:48:56', b'0');  
136 -INSERT INTO `inf_api_access_log` VALUES (533, '63d267ee-c6be-424b-a1d7-c75ef9135beb', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:48:56', '2021-03-14 00:48:56', 14, 0, '', NULL, '2021-03-14 00:48:56', NULL, '2021-03-14 00:48:56', b'0');  
137 -INSERT INTO `inf_api_access_log` VALUES (534, '8b4be6d4-c505-4645-a46d-d74ea13b1221', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:48:56', '2021-03-14 00:48:56', 8, 0, '', NULL, '2021-03-14 00:48:56', NULL, '2021-03-14 00:48:56', b'0');  
138 -INSERT INTO `inf_api_access_log` VALUES (535, '0d3fbb85-6d30-4e5f-a05b-c1939aca2f6b', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:48:56', '2021-03-14 00:48:56', 4, 0, '', NULL, '2021-03-14 00:48:56', NULL, '2021-03-14 00:48:56', b'0');  
139 -INSERT INTO `inf_api_access_log` VALUES (536, '4594a8c9-95d2-4065-a5ca-6bbabb68a118', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:48:56', '2021-03-14 00:48:57', 121, 0, '', NULL, '2021-03-14 00:48:57', NULL, '2021-03-14 00:48:57', b'0');  
140 -INSERT INTO `inf_api_access_log` VALUES (537, '6ebbcd89-38c1-4149-9238-1fa88ead86cf', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:49:40', '2021-03-14 00:49:40', 9, 0, '', NULL, '2021-03-14 00:49:40', NULL, '2021-03-14 00:49:40', b'0');  
141 -INSERT INTO `inf_api_access_log` VALUES (538, '62931059-c92b-44d8-85fb-96ab71763ad6', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:49:40', '2021-03-14 00:49:40', 11, 0, '', NULL, '2021-03-14 00:49:40', NULL, '2021-03-14 00:49:40', b'0');  
142 -INSERT INTO `inf_api_access_log` VALUES (539, '4f3a27de-2994-451d-b33c-048e6479aebb', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:49:40', '2021-03-14 00:49:40', 5, 0, '', NULL, '2021-03-14 00:49:40', NULL, '2021-03-14 00:49:40', b'0');  
143 -INSERT INTO `inf_api_access_log` VALUES (540, 'f1ccb45d-ec2d-4cc5-845a-4e120d2f2aa5', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:49:41', '2021-03-14 00:49:41', 4, 0, '', NULL, '2021-03-14 00:49:41', NULL, '2021-03-14 00:49:41', b'0');  
144 -INSERT INTO `inf_api_access_log` VALUES (541, '26359dfe-1c16-459c-a84e-24cb03e4c065', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:49:41', '2021-03-14 00:49:41', 139, 0, '', NULL, '2021-03-14 00:49:41', NULL, '2021-03-14 00:49:41', b'0');  
145 -INSERT INTO `inf_api_access_log` VALUES (542, '7b669973-5430-4655-8800-64c0ac83b1a3', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:50:20', '2021-03-14 00:50:20', 8, 0, '', NULL, '2021-03-14 00:50:20', NULL, '2021-03-14 00:50:20', b'0');  
146 -INSERT INTO `inf_api_access_log` VALUES (543, 'd24724d2-318a-4876-b706-58aea1ef7dc5', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:50:20', '2021-03-14 00:50:20', 8, 0, '', NULL, '2021-03-14 00:50:20', NULL, '2021-03-14 00:50:20', b'0');  
147 -INSERT INTO `inf_api_access_log` VALUES (544, 'cd024db3-fb5e-40ff-a574-674361441bc2', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:50:20', '2021-03-14 00:50:20', 4, 0, '', NULL, '2021-03-14 00:50:20', NULL, '2021-03-14 00:50:20', b'0');  
148 -INSERT INTO `inf_api_access_log` VALUES (545, 'd2eec64e-7a8c-498d-89fc-42e958cb8408', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:50:21', '2021-03-14 00:50:21', 4, 0, '', NULL, '2021-03-14 00:50:21', NULL, '2021-03-14 00:50:21', b'0');  
149 -INSERT INTO `inf_api_access_log` VALUES (546, '28859271-d60e-4644-a600-a5b77538e5c4', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:50:21', '2021-03-14 00:50:21', 97, 0, '', NULL, '2021-03-14 00:50:21', NULL, '2021-03-14 00:50:21', b'0');  
150 -INSERT INTO `inf_api_access_log` VALUES (547, '571b1d57-465a-43f2-955b-fa63d6b0181e', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:51:00', '2021-03-14 00:51:00', 83, 0, '', NULL, '2021-03-14 00:51:00', NULL, '2021-03-14 00:51:00', b'0');  
151 -INSERT INTO `inf_api_access_log` VALUES (548, 'b1afa1bd-bf40-4c69-a1df-bb214853a70c', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:51:02', '2021-03-14 00:51:02', 7, 0, '', NULL, '2021-03-14 00:51:02', NULL, '2021-03-14 00:51:02', b'0');  
152 -INSERT INTO `inf_api_access_log` VALUES (549, 'a7a60980-6a8b-4624-abb9-c2f8d22dbdc9', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:51:02', '2021-03-14 00:51:02', 8, 0, '', NULL, '2021-03-14 00:51:02', NULL, '2021-03-14 00:51:02', b'0');  
153 -INSERT INTO `inf_api_access_log` VALUES (550, '14690b9d-ae7b-493d-994c-68b9c0b3ebf6', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:51:02', '2021-03-14 00:51:02', 11, 0, '', NULL, '2021-03-14 00:51:02', NULL, '2021-03-14 00:51:02', b'0');  
154 -INSERT INTO `inf_api_access_log` VALUES (551, 'd2851315-11ee-4762-af1a-64a94c07678d', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:51:03', '2021-03-14 00:51:03', 3, 0, '', NULL, '2021-03-14 00:51:03', NULL, '2021-03-14 00:51:03', b'0');  
155 -INSERT INTO `inf_api_access_log` VALUES (552, 'a9c16cb6-5549-4041-a062-4dce54466dce', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:51:03', '2021-03-14 00:51:03', 107, 0, '', NULL, '2021-03-14 00:51:03', NULL, '2021-03-14 00:51:03', b'0');  
156 -INSERT INTO `inf_api_access_log` VALUES (553, 'cbaea7cc-33cf-4422-b572-be0ea36bb0ae', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:51:04', '2021-03-14 00:51:04', 103, 0, '', NULL, '2021-03-14 00:51:04', NULL, '2021-03-14 00:51:04', b'0');  
157 -INSERT INTO `inf_api_access_log` VALUES (554, '5c129cb2-65f4-4590-97dd-7300169190c4', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:51:10', '2021-03-14 00:51:10', 76, 0, '', NULL, '2021-03-14 00:51:10', NULL, '2021-03-14 00:51:10', b'0');  
158 -INSERT INTO `inf_api_access_log` VALUES (555, '4bc3e1e7-ed14-4ccb-8c55-72d6de7918ca', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:51:31', '2021-03-14 00:51:31', 82, 0, '', NULL, '2021-03-14 00:51:31', NULL, '2021-03-14 00:51:31', b'0');  
159 -INSERT INTO `inf_api_access_log` VALUES (556, 'ee785bdd-bc34-4f32-80fc-4640b82b9ac0', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:51:51', '2021-03-14 00:51:51', 84, 0, '', NULL, '2021-03-14 00:51:51', NULL, '2021-03-14 00:51:51', b'0');  
160 -INSERT INTO `inf_api_access_log` VALUES (557, '7e0599b4-40a0-4483-a894-3aac27433b3c', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:13', '2021-03-14 00:55:13', 18, 0, '', NULL, '2021-03-14 00:55:13', NULL, '2021-03-14 00:55:13', b'0');  
161 -INSERT INTO `inf_api_access_log` VALUES (558, '9ba6d255-fc1f-4404-928f-7043db300fd4', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:13', '2021-03-14 00:55:13', 16, 0, '', NULL, '2021-03-14 00:55:13', NULL, '2021-03-14 00:55:13', b'0');  
162 -INSERT INTO `inf_api_access_log` VALUES (559, 'e6666077-1657-4379-9450-d3d85d4c1258', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:13', '2021-03-14 00:55:13', 3, 0, '', NULL, '2021-03-14 00:55:13', NULL, '2021-03-14 00:55:13', b'0');  
163 -INSERT INTO `inf_api_access_log` VALUES (560, 'b25155cf-2cd8-4ce0-87f4-71e070df815b', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:13', '2021-03-14 00:55:13', 3, 0, '', NULL, '2021-03-14 00:55:13', NULL, '2021-03-14 00:55:13', b'0');  
164 -INSERT INTO `inf_api_access_log` VALUES (561, '2ccd65ca-69b0-4057-abd9-b1a966651fc5', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:13', '2021-03-14 00:55:13', 117, 0, '', NULL, '2021-03-14 00:55:13', NULL, '2021-03-14 00:55:13', b'0');  
165 -INSERT INTO `inf_api_access_log` VALUES (562, '587de0ff-1252-4205-bd17-a803b74ddb2e', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:16', '2021-03-14 00:55:16', 8, 0, '', NULL, '2021-03-14 00:55:16', NULL, '2021-03-14 00:55:16', b'0');  
166 -INSERT INTO `inf_api_access_log` VALUES (563, 'ee876570-68aa-4ded-ba7d-2165747211a5', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:16', '2021-03-14 00:55:16', 7, 0, '', NULL, '2021-03-14 00:55:16', NULL, '2021-03-14 00:55:16', b'0');  
167 -INSERT INTO `inf_api_access_log` VALUES (564, '0369c181-f2c3-4d3b-8929-e6363adb8b2e', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:16', '2021-03-14 00:55:16', 4, 0, '', NULL, '2021-03-14 00:55:16', NULL, '2021-03-14 00:55:16', b'0');  
168 -INSERT INTO `inf_api_access_log` VALUES (565, '2871031c-fb9c-401f-b877-37ec9ab3f4ad', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:16', '2021-03-14 00:55:16', 3, 0, '', NULL, '2021-03-14 00:55:16', NULL, '2021-03-14 00:55:16', b'0');  
169 -INSERT INTO `inf_api_access_log` VALUES (566, '3bd22cb5-6ace-487d-82e6-50697644c317', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:16', '2021-03-14 00:55:16', 101, 0, '', NULL, '2021-03-14 00:55:16', NULL, '2021-03-14 00:55:16', b'0');  
170 -INSERT INTO `inf_api_access_log` VALUES (567, '3a57f69f-4606-436c-9735-680089207fc5', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:30', '2021-03-14 00:55:30', 10, 0, '', NULL, '2021-03-14 00:55:30', NULL, '2021-03-14 00:55:30', b'0');  
171 -INSERT INTO `inf_api_access_log` VALUES (568, '22f1460b-2326-47fd-9cd0-ea6df3a44914', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:30', '2021-03-14 00:55:30', 7, 0, '', NULL, '2021-03-14 00:55:30', NULL, '2021-03-14 00:55:30', b'0');  
172 -INSERT INTO `inf_api_access_log` VALUES (569, 'c60675ce-fa92-4a7e-9cc9-d87ce3b3262a', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:30', '2021-03-14 00:55:30', 3, 0, '', NULL, '2021-03-14 00:55:30', NULL, '2021-03-14 00:55:30', b'0');  
173 -INSERT INTO `inf_api_access_log` VALUES (570, 'a8b1a03e-5dad-4600-8e11-6d843568e408', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:31', '2021-03-14 00:55:31', 3, 0, '', NULL, '2021-03-14 00:55:31', NULL, '2021-03-14 00:55:31', b'0');  
174 -INSERT INTO `inf_api_access_log` VALUES (571, 'c32df32a-7e50-48d8-8063-8b3a6d25f923', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:31', '2021-03-14 00:55:31', 104, 0, '', NULL, '2021-03-14 00:55:31', NULL, '2021-03-14 00:55:31', b'0');  
175 -INSERT INTO `inf_api_access_log` VALUES (572, '752e6282-961b-4f02-901e-9433e440c5fa', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-word', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:32', '2021-03-14 00:55:32', 145, 0, '', NULL, '2021-03-14 00:55:32', NULL, '2021-03-14 00:55:32', b'0');  
176 -INSERT INTO `inf_api_access_log` VALUES (573, 'af6920a9-d027-428a-91ac-339bff58a5cd', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:55:54', '2021-03-14 00:55:54', 89, 0, '', NULL, '2021-03-14 00:55:54', NULL, '2021-03-14 00:55:54', b'0');  
177 -INSERT INTO `inf_api_access_log` VALUES (574, 'f69013a1-1ccc-48d4-b0d0-7cad81242e98', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:56:14', '2021-03-14 00:56:15', 89, 0, '', NULL, '2021-03-14 00:56:15', NULL, '2021-03-14 00:56:15', b'0');  
178 -INSERT INTO `inf_api_access_log` VALUES (575, '57019f8e-4d4f-4e79-84d5-010e3c7cccac', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:56:40', '2021-03-14 00:56:40', 6, 0, '', NULL, '2021-03-14 00:56:40', NULL, '2021-03-14 00:56:40', b'0');  
179 -INSERT INTO `inf_api_access_log` VALUES (576, '27da3255-4f47-4c77-b001-d44a7f12d09f', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:56:40', '2021-03-14 00:56:40', 8, 0, '', NULL, '2021-03-14 00:56:40', NULL, '2021-03-14 00:56:40', b'0');  
180 -INSERT INTO `inf_api_access_log` VALUES (577, '58f40949-366d-4df3-8a10-ee8b88c7ac7e', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:56:40', '2021-03-14 00:56:40', 3, 0, '', NULL, '2021-03-14 00:56:40', NULL, '2021-03-14 00:56:40', b'0');  
181 -INSERT INTO `inf_api_access_log` VALUES (578, 'b1d195de-c8ed-4001-b701-666dcfc6c4bb', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:56:41', '2021-03-14 00:56:41', 4, 0, '', NULL, '2021-03-14 00:56:41', NULL, '2021-03-14 00:56:41', b'0');  
182 -INSERT INTO `inf_api_access_log` VALUES (579, 'b12d0c14-6251-4fad-99b7-c7a74d1e28c5', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:56:41', '2021-03-14 00:56:41', 183, 0, '', NULL, '2021-03-14 00:56:41', NULL, '2021-03-14 00:56:41', b'0');  
183 -INSERT INTO `inf_api_access_log` VALUES (580, '05994cf8-30e3-443b-b9bd-defcee3c34b7', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:56:58', '2021-03-14 00:56:58', 7, 0, '', NULL, '2021-03-14 00:56:58', NULL, '2021-03-14 00:56:58', b'0');  
184 -INSERT INTO `inf_api_access_log` VALUES (581, '569e9723-8f80-418d-8862-048061abd517', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:56:58', '2021-03-14 00:56:58', 5, 0, '', NULL, '2021-03-14 00:56:58', NULL, '2021-03-14 00:56:58', b'0');  
185 -INSERT INTO `inf_api_access_log` VALUES (582, '84fc7483-7197-4652-96fe-eaef3fc1e72f', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:56:58', '2021-03-14 00:56:58', 3, 0, '', NULL, '2021-03-14 00:56:58', NULL, '2021-03-14 00:56:58', b'0');  
186 -INSERT INTO `inf_api_access_log` VALUES (583, '022cd5b7-4b5b-48ee-ae3b-34fa5d627ff4', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:56:59', '2021-03-14 00:56:59', 3, 0, '', NULL, '2021-03-14 00:56:59', NULL, '2021-03-14 00:56:59', b'0');  
187 -INSERT INTO `inf_api_access_log` VALUES (584, '8f76d7b3-5302-4f95-9158-45bd91c5a468', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:56:59', '2021-03-14 00:56:59', 97, 0, '', NULL, '2021-03-14 00:56:59', NULL, '2021-03-14 00:56:59', b'0');  
188 -INSERT INTO `inf_api_access_log` VALUES (585, 'fb3868ea-e5f4-4e33-b1ff-277bf17d3581', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-markdown', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:57:00', '2021-03-14 00:57:00', 111, 0, '', NULL, '2021-03-14 00:57:00', NULL, '2021-03-14 00:57:00', b'0');  
189 -INSERT INTO `inf_api_access_log` VALUES (586, '3ffb100a-5e77-4a9f-b2d8-6bf4e2904451', 1, 2, 'dashboard', 'GET', '/api/system/dict-data/list-all-simple', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:57:23', '2021-03-14 00:57:23', 13, 0, '', NULL, '2021-03-14 00:57:23', NULL, '2021-03-14 00:57:23', b'0');  
190 -INSERT INTO `inf_api_access_log` VALUES (587, 'cdc2e1f8-35b2-41b1-b3ba-f9ec1fa1e6d0', 1, 2, 'dashboard', 'GET', '/api/get-permission-info', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:57:23', '2021-03-14 00:57:23', 7, 0, '', NULL, '2021-03-14 00:57:23', NULL, '2021-03-14 00:57:23', b'0');  
191 -INSERT INTO `inf_api_access_log` VALUES (588, 'b9815e22-5c15-429e-800c-736f52fe99a9', 1, 2, 'dashboard', 'GET', '/api/list-menus', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:57:23', '2021-03-14 00:57:23', 4, 0, '', NULL, '2021-03-14 00:57:23', NULL, '2021-03-14 00:57:23', b'0');  
192 -INSERT INTO `inf_api_access_log` VALUES (589, '8da35ff9-526e-4b76-a486-c1c27c744493', 0, 2, 'dashboard', 'GET', '/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:57:23', '2021-03-14 00:57:23', 3, 0, '', NULL, '2021-03-14 00:57:23', NULL, '2021-03-14 00:57:23', b'0');  
193 -INSERT INTO `inf_api_access_log` VALUES (590, '604ae467-e8a2-48cf-b19f-0c7d79aa0c9c', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-html', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:57:23', '2021-03-14 00:57:23', 100, 0, '', NULL, '2021-03-14 00:57:23', NULL, '2021-03-14 00:57:23', b'0');  
194 -INSERT INTO `inf_api_access_log` VALUES (591, 'eba82a07-fcde-4566-a8db-cd4f55c42d4a', 1, 2, 'dashboard', 'GET', '/api/infra/db-doc/export-markdown', '{\"query\":{},\"body\":null}', '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', '2021-03-14 00:57:25', '2021-03-14 00:57:25', 87, 0, '', NULL, '2021-03-14 00:57:25', NULL, '2021-03-14 00:57:25', b'0');  
195 COMMIT; 52 COMMIT;
196 53
197 -- ---------------------------- 54 -- ----------------------------
@@ -344,162 +201,12 @@ CREATE TABLE `inf_job_log` ( @@ -344,162 +201,12 @@ CREATE TABLE `inf_job_log` (
344 `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 '更新时间',
345 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 202 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
346 PRIMARY KEY (`id`) USING BTREE 203 PRIMARY KEY (`id`) USING BTREE
347 -) ENGINE=InnoDB AUTO_INCREMENT=435 DEFAULT CHARSET=utf8mb4 COMMENT='定时任务日志表'; 204 +) ENGINE=InnoDB AUTO_INCREMENT=627 DEFAULT CHARSET=utf8mb4 COMMENT='定时任务日志表';
348 205
349 -- ---------------------------- 206 -- ----------------------------
350 -- Records of inf_job_log 207 -- Records of inf_job_log
351 -- ---------------------------- 208 -- ----------------------------
352 BEGIN; 209 BEGIN;
353 -INSERT INTO `inf_job_log` VALUES (285, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-13 13:31:44', '2021-03-13 13:31:44', 63, 1, '移除在线会话数量为 0 个', NULL, '2021-03-13 13:31:44', NULL, '2021-03-13 13:31:44', b'0');  
354 -INSERT INTO `inf_job_log` VALUES (286, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-13 13:32:00', '2021-03-13 13:32:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-13 13:32:00', NULL, '2021-03-13 13:32:00', b'0');  
355 -INSERT INTO `inf_job_log` VALUES (287, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-13 13:33:00', '2021-03-13 13:33:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-13 13:33:00', NULL, '2021-03-13 13:33:00', b'0');  
356 -INSERT INTO `inf_job_log` VALUES (288, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-13 13:34:00', '2021-03-13 13:34:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-13 13:34:00', NULL, '2021-03-13 13:34:00', b'0');  
357 -INSERT INTO `inf_job_log` VALUES (289, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-13 13:35:00', '2021-03-13 13:35:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-13 13:35:00', NULL, '2021-03-13 13:35:00', b'0');  
358 -INSERT INTO `inf_job_log` VALUES (290, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-13 13:36:00', '2021-03-13 13:36:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-13 13:36:00', NULL, '2021-03-13 13:36:00', b'0');  
359 -INSERT INTO `inf_job_log` VALUES (291, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-13 13:37:00', '2021-03-13 13:37:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-13 13:37:00', NULL, '2021-03-13 13:37:00', b'0');  
360 -INSERT INTO `inf_job_log` VALUES (292, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-13 13:38:00', '2021-03-13 13:38:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-13 13:38:00', NULL, '2021-03-13 13:38:00', b'0');  
361 -INSERT INTO `inf_job_log` VALUES (293, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-13 13:39:00', '2021-03-13 13:39:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-13 13:39:00', NULL, '2021-03-13 13:39:00', b'0');  
362 -INSERT INTO `inf_job_log` VALUES (294, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-13 13:40:00', '2021-03-13 13:40:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-13 13:40:00', NULL, '2021-03-13 13:40:00', b'0');  
363 -INSERT INTO `inf_job_log` VALUES (295, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-13 13:41:00', '2021-03-13 13:41:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-13 13:41:00', NULL, '2021-03-13 13:41:00', b'0');  
364 -INSERT INTO `inf_job_log` VALUES (296, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:31:13', '2021-03-14 00:31:13', 133, 1, '移除在线会话数量为 1 个', NULL, '2021-03-14 00:31:13', NULL, '2021-03-14 00:31:13', b'0');  
365 -INSERT INTO `inf_job_log` VALUES (297, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:32:00', '2021-03-14 00:32:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:32:00', NULL, '2021-03-14 00:32:00', b'0');  
366 -INSERT INTO `inf_job_log` VALUES (298, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:33:00', '2021-03-14 00:33:00', 14, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:33:00', NULL, '2021-03-14 00:33:00', b'0');  
367 -INSERT INTO `inf_job_log` VALUES (299, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:34:00', '2021-03-14 00:34:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:34:00', NULL, '2021-03-14 00:34:00', b'0');  
368 -INSERT INTO `inf_job_log` VALUES (300, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:35:00', '2021-03-14 00:35:00', 11, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:35:00', NULL, '2021-03-14 00:35:00', b'0');  
369 -INSERT INTO `inf_job_log` VALUES (301, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:36:00', '2021-03-14 00:36:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:36:00', NULL, '2021-03-14 00:36:00', b'0');  
370 -INSERT INTO `inf_job_log` VALUES (302, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:37:00', '2021-03-14 00:37:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:37:00', NULL, '2021-03-14 00:37:00', b'0');  
371 -INSERT INTO `inf_job_log` VALUES (303, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:38:00', '2021-03-14 00:38:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:38:00', NULL, '2021-03-14 00:38:00', b'0');  
372 -INSERT INTO `inf_job_log` VALUES (304, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:39:00', '2021-03-14 00:39:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:39:00', NULL, '2021-03-14 00:39:00', b'0');  
373 -INSERT INTO `inf_job_log` VALUES (305, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:40:00', '2021-03-14 00:40:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:40:00', NULL, '2021-03-14 00:40:00', b'0');  
374 -INSERT INTO `inf_job_log` VALUES (306, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:41:00', '2021-03-14 00:41:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:41:00', NULL, '2021-03-14 00:41:00', b'0');  
375 -INSERT INTO `inf_job_log` VALUES (307, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:42:00', '2021-03-14 00:42:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:42:00', NULL, '2021-03-14 00:42:00', b'0');  
376 -INSERT INTO `inf_job_log` VALUES (308, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:43:00', '2021-03-14 00:43:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:43:00', NULL, '2021-03-14 00:43:00', b'0');  
377 -INSERT INTO `inf_job_log` VALUES (309, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:44:00', '2021-03-14 00:44:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:44:00', NULL, '2021-03-14 00:44:00', b'0');  
378 -INSERT INTO `inf_job_log` VALUES (310, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:45:00', '2021-03-14 00:45:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:45:00', NULL, '2021-03-14 00:45:00', b'0');  
379 -INSERT INTO `inf_job_log` VALUES (311, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:46:00', '2021-03-14 00:46:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:46:00', NULL, '2021-03-14 00:46:00', b'0');  
380 -INSERT INTO `inf_job_log` VALUES (312, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:47:00', '2021-03-14 00:47:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:47:00', NULL, '2021-03-14 00:47:00', b'0');  
381 -INSERT INTO `inf_job_log` VALUES (313, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:48:00', '2021-03-14 00:48:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:48:00', NULL, '2021-03-14 00:48:00', b'0');  
382 -INSERT INTO `inf_job_log` VALUES (314, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:49:00', '2021-03-14 00:49:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:49:00', NULL, '2021-03-14 00:49:00', b'0');  
383 -INSERT INTO `inf_job_log` VALUES (315, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:50:00', '2021-03-14 00:50:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:50:00', NULL, '2021-03-14 00:50:00', b'0');  
384 -INSERT INTO `inf_job_log` VALUES (316, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:51:00', '2021-03-14 00:51:00', 9, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:51:00', NULL, '2021-03-14 00:51:00', b'0');  
385 -INSERT INTO `inf_job_log` VALUES (317, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:52:00', '2021-03-14 00:52:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:52:00', NULL, '2021-03-14 00:52:00', b'0');  
386 -INSERT INTO `inf_job_log` VALUES (318, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:53:00', '2021-03-14 00:53:00', 8, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:53:00', NULL, '2021-03-14 00:53:00', b'0');  
387 -INSERT INTO `inf_job_log` VALUES (319, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:54:00', '2021-03-14 00:54:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:54:00', NULL, '2021-03-14 00:54:00', b'0');  
388 -INSERT INTO `inf_job_log` VALUES (320, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:55:00', '2021-03-14 00:55:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:55:00', NULL, '2021-03-14 00:55:00', b'0');  
389 -INSERT INTO `inf_job_log` VALUES (321, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:56:00', '2021-03-14 00:56:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:56:00', NULL, '2021-03-14 00:56:00', b'0');  
390 -INSERT INTO `inf_job_log` VALUES (322, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:57:00', '2021-03-14 00:57:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:57:00', NULL, '2021-03-14 00:57:00', b'0');  
391 -INSERT INTO `inf_job_log` VALUES (323, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:58:00', '2021-03-14 00:58:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:58:00', NULL, '2021-03-14 00:58:00', b'0');  
392 -INSERT INTO `inf_job_log` VALUES (324, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 00:59:00', '2021-03-14 00:59:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 00:59:00', NULL, '2021-03-14 00:59:00', b'0');  
393 -INSERT INTO `inf_job_log` VALUES (325, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:00:00', '2021-03-14 01:00:00', 4, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:00:00', NULL, '2021-03-14 01:00:00', b'0');  
394 -INSERT INTO `inf_job_log` VALUES (326, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:01:00', '2021-03-14 01:01:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:01:00', NULL, '2021-03-14 01:01:00', b'0');  
395 -INSERT INTO `inf_job_log` VALUES (327, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:02:00', '2021-03-14 01:02:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:02:00', NULL, '2021-03-14 01:02:00', b'0');  
396 -INSERT INTO `inf_job_log` VALUES (328, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:03:00', '2021-03-14 01:03:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:03:00', NULL, '2021-03-14 01:03:00', b'0');  
397 -INSERT INTO `inf_job_log` VALUES (329, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:04:00', '2021-03-14 01:04:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:04:00', NULL, '2021-03-14 01:04:00', b'0');  
398 -INSERT INTO `inf_job_log` VALUES (330, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:05:00', '2021-03-14 01:05:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:05:00', NULL, '2021-03-14 01:05:00', b'0');  
399 -INSERT INTO `inf_job_log` VALUES (331, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:06:00', '2021-03-14 01:06:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:06:00', NULL, '2021-03-14 01:06:00', b'0');  
400 -INSERT INTO `inf_job_log` VALUES (332, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:07:00', '2021-03-14 01:07:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:07:00', NULL, '2021-03-14 01:07:00', b'0');  
401 -INSERT INTO `inf_job_log` VALUES (333, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:08:00', '2021-03-14 01:08:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:08:00', NULL, '2021-03-14 01:08:00', b'0');  
402 -INSERT INTO `inf_job_log` VALUES (334, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:09:00', '2021-03-14 01:09:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:09:00', NULL, '2021-03-14 01:09:00', b'0');  
403 -INSERT INTO `inf_job_log` VALUES (335, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:10:00', '2021-03-14 01:10:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:10:00', NULL, '2021-03-14 01:10:00', b'0');  
404 -INSERT INTO `inf_job_log` VALUES (336, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:11:00', '2021-03-14 01:11:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:11:00', NULL, '2021-03-14 01:11:00', b'0');  
405 -INSERT INTO `inf_job_log` VALUES (337, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:12:00', '2021-03-14 01:12:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:12:00', NULL, '2021-03-14 01:12:00', b'0');  
406 -INSERT INTO `inf_job_log` VALUES (338, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:13:00', '2021-03-14 01:13:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:13:00', NULL, '2021-03-14 01:13:00', b'0');  
407 -INSERT INTO `inf_job_log` VALUES (339, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:14:00', '2021-03-14 01:14:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:14:00', NULL, '2021-03-14 01:14:00', b'0');  
408 -INSERT INTO `inf_job_log` VALUES (340, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:15:00', '2021-03-14 01:15:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:15:00', NULL, '2021-03-14 01:15:00', b'0');  
409 -INSERT INTO `inf_job_log` VALUES (341, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:16:00', '2021-03-14 01:16:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:16:00', NULL, '2021-03-14 01:16:00', b'0');  
410 -INSERT INTO `inf_job_log` VALUES (342, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:17:00', '2021-03-14 01:17:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:17:00', NULL, '2021-03-14 01:17:00', b'0');  
411 -INSERT INTO `inf_job_log` VALUES (343, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:18:00', '2021-03-14 01:18:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:18:00', NULL, '2021-03-14 01:18:00', b'0');  
412 -INSERT INTO `inf_job_log` VALUES (344, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:19:00', '2021-03-14 01:19:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:19:00', NULL, '2021-03-14 01:19:00', b'0');  
413 -INSERT INTO `inf_job_log` VALUES (345, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:20:00', '2021-03-14 01:20:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:20:00', NULL, '2021-03-14 01:20:00', b'0');  
414 -INSERT INTO `inf_job_log` VALUES (346, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:21:00', '2021-03-14 01:21:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:21:00', NULL, '2021-03-14 01:21:00', b'0');  
415 -INSERT INTO `inf_job_log` VALUES (347, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:22:00', '2021-03-14 01:22:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:22:00', NULL, '2021-03-14 01:22:00', b'0');  
416 -INSERT INTO `inf_job_log` VALUES (348, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:23:00', '2021-03-14 01:23:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:23:00', NULL, '2021-03-14 01:23:00', b'0');  
417 -INSERT INTO `inf_job_log` VALUES (349, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:24:00', '2021-03-14 01:24:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:24:00', NULL, '2021-03-14 01:24:00', b'0');  
418 -INSERT INTO `inf_job_log` VALUES (350, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:25:00', '2021-03-14 01:25:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:25:00', NULL, '2021-03-14 01:25:00', b'0');  
419 -INSERT INTO `inf_job_log` VALUES (351, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:26:00', '2021-03-14 01:26:00', 16, 1, '移除在线会话数量为 1 个', NULL, '2021-03-14 01:26:00', NULL, '2021-03-14 01:26:00', b'0');  
420 -INSERT INTO `inf_job_log` VALUES (352, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:27:00', '2021-03-14 01:27:00', 4, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:27:00', NULL, '2021-03-14 01:27:00', b'0');  
421 -INSERT INTO `inf_job_log` VALUES (353, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:28:00', '2021-03-14 01:28:00', 4, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:28:00', NULL, '2021-03-14 01:28:00', b'0');  
422 -INSERT INTO `inf_job_log` VALUES (354, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:29:00', '2021-03-14 01:29:00', 4, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:29:00', NULL, '2021-03-14 01:29:00', b'0');  
423 -INSERT INTO `inf_job_log` VALUES (355, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:30:00', '2021-03-14 01:30:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:30:00', NULL, '2021-03-14 01:30:00', b'0');  
424 -INSERT INTO `inf_job_log` VALUES (356, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:31:00', '2021-03-14 01:31:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:31:00', NULL, '2021-03-14 01:31:00', b'0');  
425 -INSERT INTO `inf_job_log` VALUES (357, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:32:00', '2021-03-14 01:32:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:32:00', NULL, '2021-03-14 01:32:00', b'0');  
426 -INSERT INTO `inf_job_log` VALUES (358, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:33:00', '2021-03-14 01:33:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:33:00', NULL, '2021-03-14 01:33:00', b'0');  
427 -INSERT INTO `inf_job_log` VALUES (359, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:34:00', '2021-03-14 01:34:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:34:00', NULL, '2021-03-14 01:34:00', b'0');  
428 -INSERT INTO `inf_job_log` VALUES (360, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:35:00', '2021-03-14 01:35:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:35:00', NULL, '2021-03-14 01:35:00', b'0');  
429 -INSERT INTO `inf_job_log` VALUES (361, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:36:00', '2021-03-14 01:36:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:36:00', NULL, '2021-03-14 01:36:00', b'0');  
430 -INSERT INTO `inf_job_log` VALUES (362, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:37:00', '2021-03-14 01:37:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:37:00', NULL, '2021-03-14 01:37:00', b'0');  
431 -INSERT INTO `inf_job_log` VALUES (363, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:38:00', '2021-03-14 01:38:00', 4, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:38:00', NULL, '2021-03-14 01:38:00', b'0');  
432 -INSERT INTO `inf_job_log` VALUES (364, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:39:00', '2021-03-14 01:39:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:39:00', NULL, '2021-03-14 01:39:00', b'0');  
433 -INSERT INTO `inf_job_log` VALUES (365, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:40:00', '2021-03-14 01:40:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:40:00', NULL, '2021-03-14 01:40:00', b'0');  
434 -INSERT INTO `inf_job_log` VALUES (366, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 01:41:00', '2021-03-14 01:41:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 01:41:00', NULL, '2021-03-14 01:41:00', b'0');  
435 -INSERT INTO `inf_job_log` VALUES (367, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 02:30:57', '2021-03-14 02:30:57', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 02:30:57', NULL, '2021-03-14 02:30:57', b'0');  
436 -INSERT INTO `inf_job_log` VALUES (368, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 02:31:00', '2021-03-14 02:31:00', 4, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 02:31:00', NULL, '2021-03-14 02:31:00', b'0');  
437 -INSERT INTO `inf_job_log` VALUES (369, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 02:32:00', '2021-03-14 02:32:00', 32, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 02:32:00', NULL, '2021-03-14 02:32:00', b'0');  
438 -INSERT INTO `inf_job_log` VALUES (370, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 02:33:00', '2021-03-14 02:33:00', 18, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 02:33:00', NULL, '2021-03-14 02:33:00', b'0');  
439 -INSERT INTO `inf_job_log` VALUES (371, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 02:34:00', '2021-03-14 02:34:00', 18, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 02:34:00', NULL, '2021-03-14 02:34:00', b'0');  
440 -INSERT INTO `inf_job_log` VALUES (372, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 06:25:17', '2021-03-14 06:25:17', 37, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 06:25:17', NULL, '2021-03-14 06:25:17', b'0');  
441 -INSERT INTO `inf_job_log` VALUES (373, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 06:26:00', '2021-03-14 06:26:00', 18, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 06:26:00', NULL, '2021-03-14 06:26:00', b'0');  
442 -INSERT INTO `inf_job_log` VALUES (374, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 06:27:00', '2021-03-14 06:27:00', 17, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 06:27:00', NULL, '2021-03-14 06:27:00', b'0');  
443 -INSERT INTO `inf_job_log` VALUES (375, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 06:28:00', '2021-03-14 06:28:00', 17, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 06:28:00', NULL, '2021-03-14 06:28:00', b'0');  
444 -INSERT INTO `inf_job_log` VALUES (376, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 07:06:09', '2021-03-14 07:06:09', 36, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 07:06:09', NULL, '2021-03-14 07:06:09', b'0');  
445 -INSERT INTO `inf_job_log` VALUES (377, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 07:52:11', '2021-03-14 07:52:11', 32, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 07:52:11', NULL, '2021-03-14 07:52:11', b'0');  
446 -INSERT INTO `inf_job_log` VALUES (378, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:00:55', '2021-03-14 10:00:55', 41, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:00:55', NULL, '2021-03-14 10:00:55', b'0');  
447 -INSERT INTO `inf_job_log` VALUES (379, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:01:00', '2021-03-14 10:01:00', 17, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:01:00', NULL, '2021-03-14 10:01:00', b'0');  
448 -INSERT INTO `inf_job_log` VALUES (380, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:02:00', '2021-03-14 10:02:00', 16, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:02:00', NULL, '2021-03-14 10:02:00', b'0');  
449 -INSERT INTO `inf_job_log` VALUES (381, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:03:00', '2021-03-14 10:03:00', 16, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:03:00', NULL, '2021-03-14 10:03:00', b'0');  
450 -INSERT INTO `inf_job_log` VALUES (382, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:04:00', '2021-03-14 10:04:00', 14, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:04:00', NULL, '2021-03-14 10:04:00', b'0');  
451 -INSERT INTO `inf_job_log` VALUES (383, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:05:00', '2021-03-14 10:05:00', 13, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:05:00', NULL, '2021-03-14 10:05:00', b'0');  
452 -INSERT INTO `inf_job_log` VALUES (384, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:06:00', '2021-03-14 10:06:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:06:00', NULL, '2021-03-14 10:06:00', b'0');  
453 -INSERT INTO `inf_job_log` VALUES (385, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:07:00', '2021-03-14 10:07:00', 12, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:07:00', NULL, '2021-03-14 10:07:00', b'0');  
454 -INSERT INTO `inf_job_log` VALUES (386, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:08:00', '2021-03-14 10:08:00', 14, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:08:00', NULL, '2021-03-14 10:08:00', b'0');  
455 -INSERT INTO `inf_job_log` VALUES (387, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:09:00', '2021-03-14 10:09:00', 14, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:09:00', NULL, '2021-03-14 10:09:00', b'0');  
456 -INSERT INTO `inf_job_log` VALUES (388, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:10:00', '2021-03-14 10:10:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:10:00', NULL, '2021-03-14 10:10:00', b'0');  
457 -INSERT INTO `inf_job_log` VALUES (389, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:11:00', '2021-03-14 10:11:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:11:00', NULL, '2021-03-14 10:11:00', b'0');  
458 -INSERT INTO `inf_job_log` VALUES (390, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:12:00', '2021-03-14 10:12:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:12:00', NULL, '2021-03-14 10:12:00', b'0');  
459 -INSERT INTO `inf_job_log` VALUES (391, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:13:00', '2021-03-14 10:13:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:13:00', NULL, '2021-03-14 10:13:00', b'0');  
460 -INSERT INTO `inf_job_log` VALUES (392, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:14:00', '2021-03-14 10:14:00', 17, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:14:00', NULL, '2021-03-14 10:14:00', b'0');  
461 -INSERT INTO `inf_job_log` VALUES (393, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:15:00', '2021-03-14 10:15:00', 15, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:15:00', NULL, '2021-03-14 10:15:00', b'0');  
462 -INSERT INTO `inf_job_log` VALUES (394, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:16:00', '2021-03-14 10:16:00', 13, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:16:00', NULL, '2021-03-14 10:16:00', b'0');  
463 -INSERT INTO `inf_job_log` VALUES (395, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:17:00', '2021-03-14 10:17:00', 12, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:17:00', NULL, '2021-03-14 10:17:00', b'0');  
464 -INSERT INTO `inf_job_log` VALUES (396, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:18:00', '2021-03-14 10:18:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:18:00', NULL, '2021-03-14 10:18:00', b'0');  
465 -INSERT INTO `inf_job_log` VALUES (397, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:19:00', '2021-03-14 10:19:00', 11, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:19:00', NULL, '2021-03-14 10:19:00', b'0');  
466 -INSERT INTO `inf_job_log` VALUES (398, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:20:00', '2021-03-14 10:20:00', 12, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:20:00', NULL, '2021-03-14 10:20:00', b'0');  
467 -INSERT INTO `inf_job_log` VALUES (399, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:21:00', '2021-03-14 10:21:00', 13, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:21:00', NULL, '2021-03-14 10:21:00', b'0');  
468 -INSERT INTO `inf_job_log` VALUES (400, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:22:00', '2021-03-14 10:22:00', 12, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:22:00', NULL, '2021-03-14 10:22:00', b'0');  
469 -INSERT INTO `inf_job_log` VALUES (401, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:23:00', '2021-03-14 10:23:00', 13, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:23:00', NULL, '2021-03-14 10:23:00', b'0');  
470 -INSERT INTO `inf_job_log` VALUES (402, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:24:00', '2021-03-14 10:24:00', 11, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:24:00', NULL, '2021-03-14 10:24:00', b'0');  
471 -INSERT INTO `inf_job_log` VALUES (403, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:25:00', '2021-03-14 10:25:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:25:00', NULL, '2021-03-14 10:25:00', b'0');  
472 -INSERT INTO `inf_job_log` VALUES (404, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:26:00', '2021-03-14 10:26:00', 12, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:26:00', NULL, '2021-03-14 10:26:00', b'0');  
473 -INSERT INTO `inf_job_log` VALUES (405, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:27:00', '2021-03-14 10:27:00', 13, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:27:00', NULL, '2021-03-14 10:27:00', b'0');  
474 -INSERT INTO `inf_job_log` VALUES (406, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:28:00', '2021-03-14 10:28:00', 14, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:28:00', NULL, '2021-03-14 10:28:00', b'0');  
475 -INSERT INTO `inf_job_log` VALUES (407, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:29:00', '2021-03-14 10:29:00', 13, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:29:00', NULL, '2021-03-14 10:29:00', b'0');  
476 -INSERT INTO `inf_job_log` VALUES (408, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:30:00', '2021-03-14 10:30:00', 11, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:30:00', NULL, '2021-03-14 10:30:00', b'0');  
477 -INSERT INTO `inf_job_log` VALUES (409, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:31:00', '2021-03-14 10:31:00', 11, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:31:00', NULL, '2021-03-14 10:31:00', b'0');  
478 -INSERT INTO `inf_job_log` VALUES (410, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:32:00', '2021-03-14 10:32:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:32:00', NULL, '2021-03-14 10:32:00', b'0');  
479 -INSERT INTO `inf_job_log` VALUES (411, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:33:00', '2021-03-14 10:33:00', 12, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:33:00', NULL, '2021-03-14 10:33:00', b'0');  
480 -INSERT INTO `inf_job_log` VALUES (412, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:34:00', '2021-03-14 10:34:00', 13, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:34:00', NULL, '2021-03-14 10:34:00', b'0');  
481 -INSERT INTO `inf_job_log` VALUES (413, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:35:00', '2021-03-14 10:35:00', 13, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:35:00', NULL, '2021-03-14 10:35:00', b'0');  
482 -INSERT INTO `inf_job_log` VALUES (414, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:36:00', '2021-03-14 10:36:00', 11, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:36:00', NULL, '2021-03-14 10:36:00', b'0');  
483 -INSERT INTO `inf_job_log` VALUES (415, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:37:00', '2021-03-14 10:37:00', 11, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:37:00', NULL, '2021-03-14 10:37:00', b'0');  
484 -INSERT INTO `inf_job_log` VALUES (416, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:38:00', '2021-03-14 10:38:00', 10, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:38:00', NULL, '2021-03-14 10:38:00', b'0');  
485 -INSERT INTO `inf_job_log` VALUES (417, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:39:00', '2021-03-14 10:39:00', 12, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:39:00', NULL, '2021-03-14 10:39:00', b'0');  
486 -INSERT INTO `inf_job_log` VALUES (418, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:40:00', '2021-03-14 10:40:00', 14, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:40:00', NULL, '2021-03-14 10:40:00', b'0');  
487 -INSERT INTO `inf_job_log` VALUES (419, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:41:00', '2021-03-14 10:41:00', 14, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:41:00', NULL, '2021-03-14 10:41:00', b'0');  
488 -INSERT INTO `inf_job_log` VALUES (420, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:42:00', '2021-03-14 10:42:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:42:00', NULL, '2021-03-14 10:42:00', b'0');  
489 -INSERT INTO `inf_job_log` VALUES (421, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:43:00', '2021-03-14 10:43:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:43:00', NULL, '2021-03-14 10:43:00', b'0');  
490 -INSERT INTO `inf_job_log` VALUES (422, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:44:00', '2021-03-14 10:44:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:44:00', NULL, '2021-03-14 10:44:00', b'0');  
491 -INSERT INTO `inf_job_log` VALUES (423, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:45:00', '2021-03-14 10:45:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:45:00', NULL, '2021-03-14 10:45:00', b'0');  
492 -INSERT INTO `inf_job_log` VALUES (424, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:46:00', '2021-03-14 10:46:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:46:00', NULL, '2021-03-14 10:46:00', b'0');  
493 -INSERT INTO `inf_job_log` VALUES (425, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:47:00', '2021-03-14 10:47:00', 7, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:47:00', NULL, '2021-03-14 10:47:00', b'0');  
494 -INSERT INTO `inf_job_log` VALUES (426, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:48:00', '2021-03-14 10:48:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:48:00', NULL, '2021-03-14 10:48:00', b'0');  
495 -INSERT INTO `inf_job_log` VALUES (427, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:49:00', '2021-03-14 10:49:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:49:00', NULL, '2021-03-14 10:49:00', b'0');  
496 -INSERT INTO `inf_job_log` VALUES (428, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:50:00', '2021-03-14 10:50:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:50:00', NULL, '2021-03-14 10:50:00', b'0');  
497 -INSERT INTO `inf_job_log` VALUES (429, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:51:00', '2021-03-14 10:51:00', 4, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:51:00', NULL, '2021-03-14 10:51:00', b'0');  
498 -INSERT INTO `inf_job_log` VALUES (430, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:52:00', '2021-03-14 10:52:00', 6, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:52:00', NULL, '2021-03-14 10:52:00', b'0');  
499 -INSERT INTO `inf_job_log` VALUES (431, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:53:00', '2021-03-14 10:53:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:53:00', NULL, '2021-03-14 10:53:00', b'0');  
500 -INSERT INTO `inf_job_log` VALUES (432, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:54:00', '2021-03-14 10:54:00', 4, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:54:00', NULL, '2021-03-14 10:54:00', b'0');  
501 -INSERT INTO `inf_job_log` VALUES (433, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:55:00', '2021-03-14 10:55:00', 5, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:55:00', NULL, '2021-03-14 10:55:00', b'0');  
502 -INSERT INTO `inf_job_log` VALUES (434, 3, 'sysUserSessionTimeoutJob', NULL, 1, '2021-03-14 10:56:00', '2021-03-14 10:56:00', 4, 1, '移除在线会话数量为 0 个', NULL, '2021-03-14 10:56:00', NULL, '2021-03-14 10:56:00', b'0');  
503 COMMIT; 210 COMMIT;
504 211
505 -- ---------------------------- 212 -- ----------------------------
@@ -528,7 +235,7 @@ CREATE TABLE `sys_dept` ( @@ -528,7 +235,7 @@ CREATE TABLE `sys_dept` (
528 -- ---------------------------- 235 -- ----------------------------
529 BEGIN; 236 BEGIN;
530 INSERT INTO `sys_dept` VALUES (100, '芋道源码', 0, 0, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-06 19:45:52', b'0'); 237 INSERT INTO `sys_dept` VALUES (100, '芋道源码', 0, 0, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-06 19:45:52', b'0');
531 -INSERT INTO `sys_dept` VALUES (101, '深圳总公司', 100, 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); 238 +INSERT INTO `sys_dept` VALUES (101, '深圳总公司', 100, 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '1', '2021-03-14 20:26:18', b'0');
532 INSERT INTO `sys_dept` VALUES (102, '长沙分公司', 100, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); 239 INSERT INTO `sys_dept` VALUES (102, '长沙分公司', 100, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0');
533 INSERT INTO `sys_dept` VALUES (103, '研发部门', 101, 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); 240 INSERT INTO `sys_dept` VALUES (103, '研发部门', 101, 1, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0');
534 INSERT INTO `sys_dept` VALUES (104, '市场部门', 101, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); 241 INSERT INTO `sys_dept` VALUES (104, '市场部门', 101, 2, '若依', '15888888888', 'ry@qq.com', 0, 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0');
@@ -679,16 +386,12 @@ CREATE TABLE `sys_login_log` ( @@ -679,16 +386,12 @@ CREATE TABLE `sys_login_log` (
679 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 386 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
680 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 387 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
681 PRIMARY KEY (`id`) USING BTREE 388 PRIMARY KEY (`id`) USING BTREE
682 -) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录'; 389 +) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问记录';
683 390
684 -- ---------------------------- 391 -- ----------------------------
685 -- Records of sys_login_log 392 -- Records of sys_login_log
686 -- ---------------------------- 393 -- ----------------------------
687 BEGIN; 394 BEGIN;
688 -INSERT INTO `sys_login_log` VALUES (6, 201, 'f15eab42-8dc9-4da8-b231-3d3c6df5e0a6', 'admin', 0, '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 00:31:13', NULL, '2021-03-14 00:31:13', b'0');  
689 -INSERT INTO `sys_login_log` VALUES (7, 100, '65d43b8b-9e34-45f7-9925-67e64266de11', 'admin', 31, '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 00:31:39', NULL, '2021-03-14 00:31:39', b'0');  
690 -INSERT INTO `sys_login_log` VALUES (8, 100, 'fe66aec6-4196-43dd-8653-7f06d0bdaf7d', 'admin', 0, '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 00:31:43', NULL, '2021-03-14 00:31:43', b'0');  
691 -INSERT INTO `sys_login_log` VALUES (9, 201, '2b1a614d-1073-48b9-9bf3-502382af432c', 'admin', 0, '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 01:26:00', NULL, '2021-03-14 01:26:00', b'0');  
692 COMMIT; 395 COMMIT;
693 396
694 -- ---------------------------- 397 -- ----------------------------
@@ -723,13 +426,13 @@ INSERT INTO `sys_menu` VALUES (2, &#39;基础设施&#39;, &#39;&#39;, 1, 2, 0, &#39;/infra&#39;, &#39;monito @@ -723,13 +426,13 @@ INSERT INTO `sys_menu` VALUES (2, &#39;基础设施&#39;, &#39;&#39;, 1, 2, 0, &#39;/infra&#39;, &#39;monito
723 INSERT INTO `sys_menu` VALUES (3, '研发工具', '', 1, 3, 0, '/tool', 'tool', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 12:44:42', b'0'); 426 INSERT INTO `sys_menu` VALUES (3, '研发工具', '', 1, 3, 0, '/tool', 'tool', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-02-06 12:44:42', b'0');
724 INSERT INTO `sys_menu` VALUES (4, '若依官网', '', 1, 4, 0, 'http://ruoyi.vip', 'guide', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 21:54:28', b'1'); 427 INSERT INTO `sys_menu` VALUES (4, '若依官网', '', 1, 4, 0, 'http://ruoyi.vip', 'guide', NULL, 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 21:54:28', b'1');
725 INSERT INTO `sys_menu` VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'user', 'system/user/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); 428 INSERT INTO `sys_menu` VALUES (100, '用户管理', 'system:user:list', 2, 1, 1, 'user', 'user', 'system/user/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0');
726 -INSERT INTO `sys_menu` VALUES (101, '角色管理', 'system:role:list', 2, 2, 1, 'role', 'peoples', 'system/role/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0');  
727 -INSERT INTO `sys_menu` VALUES (102, '菜单管理', 'system:menu:list', 2, 3, 1, 'menu', 'tree-table', 'system/menu/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0');  
728 -INSERT INTO `sys_menu` VALUES (103, '部门管理', 'system:dept:list', 2, 4, 1, 'dept', 'tree', 'system/dept/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0');  
729 -INSERT INTO `sys_menu` VALUES (104, '岗位管理', 'system:post:list', 2, 5, 1, 'post', 'post', 'system/post/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0');  
730 -INSERT INTO `sys_menu` VALUES (105, '字典管理', 'system:dict:list', 2, 6, 1, 'dict', 'dict', 'system/dict/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); 429 +INSERT INTO `sys_menu` VALUES (101, '角色管理', '', 2, 2, 1, 'role', 'peoples', 'system/role/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:04:49', b'0');
  430 +INSERT INTO `sys_menu` VALUES (102, '菜单管理', '', 2, 3, 1, 'menu', 'tree-table', 'system/menu/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:04:28', b'0');
  431 +INSERT INTO `sys_menu` VALUES (103, '部门管理', '', 2, 4, 1, 'dept', 'tree', 'system/dept/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:19', b'0');
  432 +INSERT INTO `sys_menu` VALUES (104, '岗位管理', '', 2, 5, 1, 'post', 'post', 'system/post/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:23', b'0');
  433 +INSERT INTO `sys_menu` VALUES (105, '字典管理', '', 2, 6, 1, 'dict', 'dict', 'system/dict/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:16:58', b'0');
731 INSERT INTO `sys_menu` VALUES (106, '配置管理', '', 2, 1, 2, 'config', 'edit', 'infra/config/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:10', b'0'); 434 INSERT INTO `sys_menu` VALUES (106, '配置管理', '', 2, 1, 2, 'config', 'edit', 'infra/config/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:10', b'0');
732 -INSERT INTO `sys_menu` VALUES (107, '通知公告', 'system:notice:list', 2, 8, 1, 'notice', 'message', 'system/notice/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); 435 +INSERT INTO `sys_menu` VALUES (107, '通知公告', '', 2, 8, 1, 'notice', 'message', 'system/notice/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:51:39', b'0');
733 INSERT INTO `sys_menu` VALUES (108, '日志管理', '', 1, 9, 1, 'log', 'log', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:34:28', b'0'); 436 INSERT INTO `sys_menu` VALUES (108, '日志管理', '', 1, 9, 1, 'log', 'log', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:34:28', b'0');
734 INSERT INTO `sys_menu` VALUES (109, '在线用户', 'system:user-session:list', 2, 10, 1, 'user-session', 'online', 'system/session/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:21:20', b'0'); 437 INSERT INTO `sys_menu` VALUES (109, '在线用户', 'system:user-session:list', 2, 10, 1, 'user-session', 'online', 'system/session/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-26 08:21:20', b'0');
735 INSERT INTO `sys_menu` VALUES (110, '定时任务', '', 2, 2, 2, 'job', 'job', 'infra/job/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:25:51', b'0'); 438 INSERT INTO `sys_menu` VALUES (110, '定时任务', '', 2, 2, 2, 'job', 'job', 'infra/job/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:25:51', b'0');
@@ -739,37 +442,37 @@ INSERT INTO `sys_menu` VALUES (113, &#39;Redis 监控&#39;, &#39;&#39;, 2, 5, 2, &#39;redis&#39;, &#39;redis @@ -739,37 +442,37 @@ INSERT INTO `sys_menu` VALUES (113, &#39;Redis 监控&#39;, &#39;&#39;, 2, 5, 2, &#39;redis&#39;, &#39;redis
739 INSERT INTO `sys_menu` VALUES (114, '表单构建', 'tool:build:list', 2, 1, 3, 'build', 'build', 'tool/build/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); 442 INSERT INTO `sys_menu` VALUES (114, '表单构建', 'tool:build:list', 2, 1, 3, 'build', 'build', 'tool/build/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0');
740 INSERT INTO `sys_menu` VALUES (115, '代码生成', 'tool:codegen:query', 2, 0, 3, 'codegen', 'code', 'tool/codegen/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-06 03:43:14', b'0'); 443 INSERT INTO `sys_menu` VALUES (115, '代码生成', 'tool:codegen:query', 2, 0, 3, 'codegen', 'code', 'tool/codegen/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-06 03:43:14', b'0');
741 INSERT INTO `sys_menu` VALUES (116, '系统接口', 'tool:swagger:list', 2, 3, 3, 'swagger', 'swagger', 'tool/swagger/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0'); 444 INSERT INTO `sys_menu` VALUES (116, '系统接口', 'tool:swagger:list', 2, 3, 3, 'swagger', 'swagger', 'tool/swagger/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:45', b'0');
742 -INSERT INTO `sys_menu` VALUES (500, '操作日志', 'system:operate-log:list', 2, 1, 108, 'operate-log', 'form', 'system/operatelog/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-16 18:25:45', b'0');  
743 -INSERT INTO `sys_menu` VALUES (501, '登录日志', 'system:login-log:list', 2, 2, 108, 'login-log', 'logininfor', 'system/loginlog/index', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 05:29:58', b'0'); 445 +INSERT INTO `sys_menu` VALUES (500, '操作日志', '', 2, 1, 108, 'operate-log', 'form', 'system/operatelog/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:42:56', b'0');
  446 +INSERT INTO `sys_menu` VALUES (501, '登录日志', '', 2, 2, 108, 'login-log', 'logininfor', 'system/loginlog/index', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:39:23', b'0');
744 INSERT INTO `sys_menu` VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 447 INSERT INTO `sys_menu` VALUES (1001, '用户查询', 'system:user:query', 3, 1, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
745 -INSERT INTO `sys_menu` VALUES (1002, '用户新增', 'system:user:add', 3, 2, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
746 -INSERT INTO `sys_menu` VALUES (1003, '用户修改', 'system:user:edit', 3, 3, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
747 -INSERT INTO `sys_menu` VALUES (1004, '用户删除', 'system:user:remove', 3, 4, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 448 +INSERT INTO `sys_menu` VALUES (1002, '用户新增', 'system:user:create', 3, 2, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:21:47', b'0');
  449 +INSERT INTO `sys_menu` VALUES (1003, '用户修改', 'system:user:update', 3, 3, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:21:54', b'0');
  450 +INSERT INTO `sys_menu` VALUES (1004, '用户删除', 'system:user:delete', 3, 4, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:22:03', b'0');
748 INSERT INTO `sys_menu` VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 451 INSERT INTO `sys_menu` VALUES (1005, '用户导出', 'system:user:export', 3, 5, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
749 INSERT INTO `sys_menu` VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 452 INSERT INTO `sys_menu` VALUES (1006, '用户导入', 'system:user:import', 3, 6, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
750 -INSERT INTO `sys_menu` VALUES (1007, '重置密码', 'system:user:resetPwd', 3, 7, 100, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 453 +INSERT INTO `sys_menu` VALUES (1007, '重置密码', 'system:user:update-password', 3, 7, 100, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:20:55', b'0');
751 INSERT INTO `sys_menu` VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 454 INSERT INTO `sys_menu` VALUES (1008, '角色查询', 'system:role:query', 3, 1, 101, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
752 -INSERT INTO `sys_menu` VALUES (1009, '角色新增', 'system:role:add', 3, 2, 101, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
753 -INSERT INTO `sys_menu` VALUES (1010, '角色修改', 'system:role:edit', 3, 3, 101, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
754 -INSERT INTO `sys_menu` VALUES (1011, '角色删除', 'system:role:remove', 3, 4, 101, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 455 +INSERT INTO `sys_menu` VALUES (1009, '角色新增', 'system:role:create', 3, 2, 101, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:05:24', b'0');
  456 +INSERT INTO `sys_menu` VALUES (1010, '角色修改', 'system:role:update', 3, 3, 101, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:05:14', b'0');
  457 +INSERT INTO `sys_menu` VALUES (1011, '角色删除', 'system:role:delete', 3, 4, 101, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 22:05:05', b'0');
755 INSERT INTO `sys_menu` VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 458 INSERT INTO `sys_menu` VALUES (1012, '角色导出', 'system:role:export', 3, 5, 101, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
756 INSERT INTO `sys_menu` VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 459 INSERT INTO `sys_menu` VALUES (1013, '菜单查询', 'system:menu:query', 3, 1, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
757 -INSERT INTO `sys_menu` VALUES (1014, '菜单新增', 'system:menu:add', 3, 2, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
758 -INSERT INTO `sys_menu` VALUES (1015, '菜单修改', 'system:menu:edit', 3, 3, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
759 -INSERT INTO `sys_menu` VALUES (1016, '菜单删除', 'system:menu:remove', 3, 4, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 460 +INSERT INTO `sys_menu` VALUES (1014, '菜单新增', 'system:menu:create', 3, 2, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-13 15:49:36', b'0');
  461 +INSERT INTO `sys_menu` VALUES (1015, '菜单修改', 'system:menu:update', 3, 3, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-13 15:49:30', b'0');
  462 +INSERT INTO `sys_menu` VALUES (1016, '菜单删除', 'system:menu:delete', 3, 4, 102, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-03-13 15:49:45', b'0');
760 INSERT INTO `sys_menu` VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 463 INSERT INTO `sys_menu` VALUES (1017, '部门查询', 'system:dept:query', 3, 1, 103, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
761 -INSERT INTO `sys_menu` VALUES (1018, '部门新增', 'system:dept:add', 3, 2, 103, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
762 -INSERT INTO `sys_menu` VALUES (1019, '部门修改', 'system:dept:edit', 3, 3, 103, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
763 -INSERT INTO `sys_menu` VALUES (1020, '部门删除', 'system:dept:remove', 3, 4, 103, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 464 +INSERT INTO `sys_menu` VALUES (1018, '部门新增', 'system:dept:create', 3, 2, 103, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:30', b'0');
  465 +INSERT INTO `sys_menu` VALUES (1019, '部门修改', 'system:dept:update', 3, 3, 103, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:37', b'0');
  466 +INSERT INTO `sys_menu` VALUES (1020, '部门删除', 'system:dept:delete', 3, 4, 103, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:25:43', b'0');
764 INSERT INTO `sys_menu` VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 467 INSERT INTO `sys_menu` VALUES (1021, '岗位查询', 'system:post:query', 3, 1, 104, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
765 -INSERT INTO `sys_menu` VALUES (1022, '岗位新增', 'system:post:add', 3, 2, 104, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
766 -INSERT INTO `sys_menu` VALUES (1023, '岗位修改', 'system:post:edit', 3, 3, 104, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
767 -INSERT INTO `sys_menu` VALUES (1024, '岗位删除', 'system:post:remove', 3, 4, 104, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 468 +INSERT INTO `sys_menu` VALUES (1022, '岗位新增', 'system:post:create', 3, 2, 104, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:34', b'0');
  469 +INSERT INTO `sys_menu` VALUES (1023, '岗位修改', 'system:post:update', 3, 3, 104, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:41', b'0');
  470 +INSERT INTO `sys_menu` VALUES (1024, '岗位删除', 'system:post:delete', 3, 4, 104, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:38:48', b'0');
768 INSERT INTO `sys_menu` VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 471 INSERT INTO `sys_menu` VALUES (1025, '岗位导出', 'system:post:export', 3, 5, 104, '', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
769 INSERT INTO `sys_menu` VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 472 INSERT INTO `sys_menu` VALUES (1026, '字典查询', 'system:dict:query', 3, 1, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
770 -INSERT INTO `sys_menu` VALUES (1027, '字典新增', 'system:dict:add', 3, 2, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
771 -INSERT INTO `sys_menu` VALUES (1028, '字典修改', 'system:dict:edit', 3, 3, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
772 -INSERT INTO `sys_menu` VALUES (1029, '字典删除', 'system:dict:remove', 3, 4, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 473 +INSERT INTO `sys_menu` VALUES (1027, '字典新增', 'system:dict:create', 3, 2, 105, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:19:29', b'0');
  474 +INSERT INTO `sys_menu` VALUES (1028, '字典修改', 'system:dict:update', 3, 3, 105, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:19:36', b'0');
  475 +INSERT INTO `sys_menu` VALUES (1029, '字典删除', 'system:dict:delete', 3, 4, 105, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:19:45', b'0');
773 INSERT INTO `sys_menu` VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 476 INSERT INTO `sys_menu` VALUES (1030, '字典导出', 'system:dict:export', 3, 5, 105, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
774 INSERT INTO `sys_menu` VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:00', b'0'); 477 INSERT INTO `sys_menu` VALUES (1031, '配置查询', 'infra:config:query', 3, 1, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:00', b'0');
775 INSERT INTO `sys_menu` VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:18', b'0'); 478 INSERT INTO `sys_menu` VALUES (1032, '配置新增', 'infra:config:create', 3, 2, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:18', b'0');
@@ -777,9 +480,9 @@ INSERT INTO `sys_menu` VALUES (1033, &#39;配置修改&#39;, &#39;infra:config:update&#39;, 3, 3 @@ -777,9 +480,9 @@ INSERT INTO `sys_menu` VALUES (1033, &#39;配置修改&#39;, &#39;infra:config:update&#39;, 3, 3
777 INSERT INTO `sys_menu` VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:36', b'0'); 480 INSERT INTO `sys_menu` VALUES (1034, '配置删除', 'infra:config:delete', 3, 4, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-10 01:12:36', b'0');
778 INSERT INTO `sys_menu` VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:19', b'0'); 481 INSERT INTO `sys_menu` VALUES (1035, '配置导出', 'infra:config:export', 3, 5, 106, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-20 14:34:19', b'0');
779 INSERT INTO `sys_menu` VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 482 INSERT INTO `sys_menu` VALUES (1036, '公告查询', 'system:notice:query', 3, 1, 107, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');
780 -INSERT INTO `sys_menu` VALUES (1037, '公告新增', 'system:notice:add', 3, 2, 107, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
781 -INSERT INTO `sys_menu` VALUES (1038, '公告修改', 'system:notice:edit', 3, 3, 107, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0');  
782 -INSERT INTO `sys_menu` VALUES (1039, '公告删除', 'system:notice:remove', 3, 4, 107, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-05 22:36:55', b'0'); 483 +INSERT INTO `sys_menu` VALUES (1037, '公告新增', 'system:notice:create', 3, 2, 107, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:51:48', b'0');
  484 +INSERT INTO `sys_menu` VALUES (1038, '公告修改', 'system:notice:update', 3, 3, 107, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:51:55', b'0');
  485 +INSERT INTO `sys_menu` VALUES (1039, '公告删除', 'system:notice:delete', 3, 4, 107, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 21:52:01', b'0');
783 INSERT INTO `sys_menu` VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-16 18:28:10', b'0'); 486 INSERT INTO `sys_menu` VALUES (1040, '操作查询', 'system:operate-log:query', 3, 1, 500, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-16 18:28:10', b'0');
784 INSERT INTO `sys_menu` VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-16 18:28:23', b'0'); 487 INSERT INTO `sys_menu` VALUES (1042, '日志导出', 'system:operate-log:export', 3, 2, 500, '', '', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-16 18:28:23', b'0');
785 INSERT INTO `sys_menu` VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 05:29:26', b'0'); 488 INSERT INTO `sys_menu` VALUES (1043, '登录查询', 'system:login-log:query', 3, 1, 501, '#', '#', '', 0, 'admin', '2021-01-05 17:03:48', '', '2021-01-18 05:29:26', b'0');
@@ -886,7 +589,7 @@ CREATE TABLE `sys_operate_log` ( @@ -886,7 +589,7 @@ CREATE TABLE `sys_operate_log` (
886 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', 589 `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
887 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除', 590 `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
888 PRIMARY KEY (`id`) USING BTREE 591 PRIMARY KEY (`id`) USING BTREE
889 -) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录'; 592 +) ENGINE=InnoDB AUTO_INCREMENT=65 DEFAULT CHARSET=utf8mb4 COMMENT='操作日志记录';
890 593
891 -- ---------------------------- 594 -- ----------------------------
892 -- Records of sys_operate_log 595 -- Records of sys_operate_log
@@ -917,8 +620,8 @@ CREATE TABLE `sys_post` ( @@ -917,8 +620,8 @@ CREATE TABLE `sys_post` (
917 -- Records of sys_post 620 -- Records of sys_post
918 -- ---------------------------- 621 -- ----------------------------
919 BEGIN; 622 BEGIN;
920 -INSERT INTO `sys_post` VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0');  
921 -INSERT INTO `sys_post` VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); 623 +INSERT INTO `sys_post` VALUES (1, 'ceo', '董事长', 1, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:39:03', b'0');
  624 +INSERT INTO `sys_post` VALUES (2, 'se', '项目经理', 2, 0, '', 'admin', '2021-01-05 17:03:48', '1', '2021-03-14 20:39:05', b'0');
922 INSERT INTO `sys_post` VALUES (3, 'hr', '人力资源', 3, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); 625 INSERT INTO `sys_post` VALUES (3, 'hr', '人力资源', 3, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0');
923 INSERT INTO `sys_post` VALUES (4, 'user', '普通员工', 4, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0'); 626 INSERT INTO `sys_post` VALUES (4, 'user', '普通员工', 4, 0, '', 'admin', '2021-01-05 17:03:48', '', '2021-01-05 17:03:48', b'0');
924 INSERT INTO `sys_post` VALUES (5, 'test', '测试岗位', 0, 1, '132', '', '2021-01-07 15:07:44', '', '2021-01-07 15:10:35', b'1'); 627 INSERT INTO `sys_post` VALUES (5, 'test', '测试岗位', 0, 1, '132', '', '2021-01-07 15:07:44', '', '2021-01-07 15:10:35', b'1');
@@ -952,7 +655,7 @@ CREATE TABLE `sys_role` ( @@ -952,7 +655,7 @@ CREATE TABLE `sys_role` (
952 BEGIN; 655 BEGIN;
953 INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 12:40:20', b'0'); 656 INSERT INTO `sys_role` VALUES (1, '超级管理员', 'admin', 1, 1, '', 0, 1, '超级管理员', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 12:40:20', b'0');
954 INSERT INTO `sys_role` VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 11:46:58', b'0'); 657 INSERT INTO `sys_role` VALUES (2, '普通角色', 'common', 2, 2, '', 0, 1, '普通角色', 'admin', '2021-01-05 17:03:48', '', '2021-01-06 11:46:58', b'0');
955 -INSERT INTO `sys_role` VALUES (101, '测试账号', 'test', 0, 2, '[104]', 0, 2, '132', '', '2021-01-06 13:49:35', '', '2021-01-21 02:15:26', b'0'); 658 +INSERT INTO `sys_role` VALUES (101, '测试账号', 'test', 0, 2, '[104]', 0, 2, '132', '', '2021-01-06 13:49:35', '1', '2021-03-14 22:17:20', b'0');
956 COMMIT; 659 COMMIT;
957 660
958 -- ---------------------------- 661 -- ----------------------------
@@ -1162,11 +865,11 @@ CREATE TABLE `sys_user` ( @@ -1162,11 +865,11 @@ CREATE TABLE `sys_user` (
1162 -- Records of sys_user 865 -- Records of sys_user
1163 -- ---------------------------- 866 -- ----------------------------
1164 BEGIN; 867 BEGIN;
1165 -INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '若依', '管理员', 103, '[1]', 'ry@163.com', '15888888888', 1, 'http://127.0.0.1:8080/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', 0, '127.0.0.1', '2021-01-05 17:03:47', 'admin', '2021-01-05 17:03:47', '', '2021-01-13 17:51:06', b'0'); 868 +INSERT INTO `sys_user` VALUES (1, 'admin', '$2a$10$0acJOIk2D25/oC87nyclE..0lzeu9DtQ/n3geP4fkun/zIVRhHJIO', '芋道', '管理员', 103, '[1]', 'aoteman@126.com', '15612345678', 1, 'http://127.0.0.1:8080/api/system/file/get/add5ec1891a7d97d2cc1d60847e16294.jpg', 0, '127.0.0.1', '2021-01-05 17:03:47', 'admin', '2021-01-05 17:03:47', '1', '2021-03-21 18:16:16', b'0');
1166 INSERT INTO `sys_user` VALUES (2, 'ry', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '若依', '测试员', 105, '[2]', 'ry@qq.com', '15666666666', 1, '', 0, '127.0.0.1', '2021-01-05 17:03:47', 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0'); 869 INSERT INTO `sys_user` VALUES (2, 'ry', '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '若依', '测试员', 105, '[2]', 'ry@qq.com', '15666666666', 1, '', 0, '127.0.0.1', '2021-01-05 17:03:47', 'admin', '2021-01-05 17:03:47', '', '2021-01-05 17:03:47', b'0');
1167 -INSERT INTO `sys_user` VALUES (100, 'yudao', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 100, '[1]', 'yudao@iocoder.cn', '15601691300', 1, '', 1, '', NULL, '', '2021-01-07 09:07:17', '', '2021-01-13 23:53:12', b'0'); 870 +INSERT INTO `sys_user` VALUES (100, 'yudao', '$2a$10$11U48RhyJ5pSBYWSn12AD./ld671.ycSzJHbyrtpeoMeYiw31eo8a', '芋道', '不要吓我', 100, '[1]', 'yudao@iocoder.cn', '15601691300', 1, '', 1, '', NULL, '', '2021-01-07 09:07:17', '1', '2021-03-14 22:35:17', b'0');
1168 INSERT INTO `sys_user` VALUES (103, 'yuanma', '', '源码', NULL, 100, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '', NULL, '', '2021-01-13 23:50:35', '', '2021-01-13 23:50:35', b'0'); 871 INSERT INTO `sys_user` VALUES (103, 'yuanma', '', '源码', NULL, 100, NULL, 'yuanma@iocoder.cn', '15601701300', 0, '', 0, '', NULL, '', '2021-01-13 23:50:35', '', '2021-01-13 23:50:35', b'0');
1169 -INSERT INTO `sys_user` VALUES (104, 'test', '$2a$10$wTJ.1LVmhxcujss2NR2SMeBo8AaFsjkoDfDafHYsdHmitAiwmnvce', '测试号', NULL, 100, '[]', '', '15601691200', 1, '', 0, '', NULL, '', '2021-01-21 02:13:53', '', '2021-01-21 02:14:13', b'0'); 872 +INSERT INTO `sys_user` VALUES (104, 'test', '$2a$10$.TOFpaIiI3PzEwkGrNq0Eu6Cc3rOqJMxTb1DqeSEM8StxaGPBRKoi', '测试号', NULL, 100, '[]', '', '15601691200', 1, '', 0, '', NULL, '', '2021-01-21 02:13:53', '1', '2021-03-14 22:36:38', b'0');
1170 COMMIT; 873 COMMIT;
1171 874
1172 -- ---------------------------- 875 -- ----------------------------
@@ -1224,6 +927,10 @@ BEGIN; @@ -1224,6 +927,10 @@ BEGIN;
1224 INSERT INTO `sys_user_session` VALUES ('505b4e7d8b0d4b40aa23bf540da81234', 1, '2021-03-14 01:25:13', '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 00:31:43', NULL, '2021-03-13 07:35:26', b'1'); 927 INSERT INTO `sys_user_session` VALUES ('505b4e7d8b0d4b40aa23bf540da81234', 1, '2021-03-14 01:25:13', '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 00:31:43', NULL, '2021-03-13 07:35:26', b'1');
1225 INSERT INTO `sys_user_session` VALUES ('5a7248bf87d14e7e9f0578b05969986c', 1, '2021-03-13 10:42:50', '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 09:37:36', NULL, '2021-03-12 19:53:07', b'1'); 928 INSERT INTO `sys_user_session` VALUES ('5a7248bf87d14e7e9f0578b05969986c', 1, '2021-03-13 10:42:50', '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 09:37:36', NULL, '2021-03-12 19:53:07', b'1');
1226 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'); 929 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');
  930 +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');
  931 +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-21 18:46:28', b'0');
  932 +INSERT INTO `sys_user_session` VALUES ('e8872f5192584440a548641b83c877ef', 1, '2021-03-21 18:36:01', '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 17:51:48', NULL, '2021-03-15 03:54:20', b'1');
  933 +INSERT INTO `sys_user_session` VALUES ('f1ab99b09b5a475795579ff99d60ac78', 1, '2021-03-14 23:04:31', '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 21:12:44', NULL, '2021-03-15 03:32:38', b'1');
1227 INSERT INTO `sys_user_session` VALUES ('f853b50d064340a581e9a49bba9411fc', 1, '2021-03-10 01:55:41', '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-10 01:11:53', NULL, '2021-03-12 18:37:05', b'1'); 934 INSERT INTO `sys_user_session` VALUES ('f853b50d064340a581e9a49bba9411fc', 1, '2021-03-10 01:55:41', '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-10 01:11:53', NULL, '2021-03-12 18:37:05', b'1');
1228 COMMIT; 935 COMMIT;
1229 936
src/main/java/cn/iocoder/dashboard/framework/jackson/config/JacksonConfig.java
1 package cn.iocoder.dashboard.framework.jackson.config; 1 package cn.iocoder.dashboard.framework.jackson.config;
2 2
  3 +import cn.iocoder.dashboard.framework.jackson.deser.LocalDateTimeDeserializer;
  4 +import cn.iocoder.dashboard.framework.jackson.ser.LocalDateTimeSerializer;
3 import cn.iocoder.dashboard.util.json.JsonUtils; 5 import cn.iocoder.dashboard.util.json.JsonUtils;
4 import com.fasterxml.jackson.databind.ObjectMapper; 6 import com.fasterxml.jackson.databind.ObjectMapper;
  7 +import com.fasterxml.jackson.databind.module.SimpleModule;
5 import org.springframework.context.annotation.Bean; 8 import org.springframework.context.annotation.Bean;
6 import org.springframework.context.annotation.Configuration; 9 import org.springframework.context.annotation.Configuration;
7 10
  11 +import java.time.LocalDateTime;
  12 +
8 @Configuration 13 @Configuration
9 public class JacksonConfig { 14 public class JacksonConfig {
10 15
11 @Bean 16 @Bean
12 @SuppressWarnings("InstantiationOfUtilityClass") 17 @SuppressWarnings("InstantiationOfUtilityClass")
13 public JsonUtils jsonUtils(ObjectMapper objectMapper) { 18 public JsonUtils jsonUtils(ObjectMapper objectMapper) {
  19 + SimpleModule simpleModule = new SimpleModule();
  20 + /*
  21 + * 1. 新增Long类型序列化规则,数值超过2^53-1,在JS会出现精度丢失问题,因此Long自动序列化为字符串类型
  22 + * 2. 新增LocalDateTime序列化、反序列化规则
  23 + */
  24 + simpleModule
  25 +// .addSerializer(Long.class, ToStringSerializer.instance)
  26 +// .addSerializer(Long.TYPE, ToStringSerializer.instance)
  27 + .addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE)
  28 + .addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
  29 +
  30 + objectMapper.registerModules(simpleModule);
  31 +
14 JsonUtils.init(objectMapper); 32 JsonUtils.init(objectMapper);
15 return new JsonUtils(); 33 return new JsonUtils();
16 } 34 }
17 -  
18 } 35 }
src/main/java/cn/iocoder/dashboard/framework/jackson/deser/LocalDateTimeDeserializer.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.jackson.deser;
  2 +
  3 +import com.fasterxml.jackson.core.JsonParser;
  4 +import com.fasterxml.jackson.core.JsonProcessingException;
  5 +import com.fasterxml.jackson.databind.DeserializationContext;
  6 +import com.fasterxml.jackson.databind.JsonDeserializer;
  7 +
  8 +import java.io.IOException;
  9 +import java.time.Instant;
  10 +import java.time.LocalDateTime;
  11 +import java.time.ZoneId;
  12 +
  13 +/**
  14 + * LocalDateTime反序列化规则
  15 + * <p>
  16 + * 会将毫秒级时间戳反序列化为LocalDateTime
  17 + */
  18 +public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
  19 +
  20 + public static final LocalDateTimeDeserializer INSTANCE = new LocalDateTimeDeserializer();
  21 +
  22 + @Override
  23 + public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
  24 + return LocalDateTime.ofInstant(Instant.ofEpochMilli(p.getValueAsLong()), ZoneId.systemDefault());
  25 + }
  26 +}
src/main/java/cn/iocoder/dashboard/framework/jackson/ser/LocalDateTimeSerializer.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.jackson.ser;
  2 +
  3 +import com.fasterxml.jackson.core.JsonGenerator;
  4 +import com.fasterxml.jackson.databind.JsonSerializer;
  5 +import com.fasterxml.jackson.databind.SerializerProvider;
  6 +
  7 +import java.io.IOException;
  8 +import java.time.LocalDateTime;
  9 +import java.time.ZoneId;
  10 +
  11 +/**
  12 + * LocalDateTime序列化规则
  13 + * <p>
  14 + * 会将LocalDateTime序列化为毫秒级时间戳
  15 + */
  16 +public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
  17 +
  18 + public static final LocalDateTimeSerializer INSTANCE = new LocalDateTimeSerializer();
  19 +
  20 + @Override
  21 + public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
  22 + gen.writeNumber(value.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
  23 + }
  24 +}
src/main/java/cn/iocoder/dashboard/framework/logger/apilog/core/filter/ApiAccessLogFilter.java
@@ -81,7 +81,7 @@ public class ApiAccessLogFilter extends OncePerRequestFilter { @@ -81,7 +81,7 @@ public class ApiAccessLogFilter extends OncePerRequestFilter {
81 Map<String, String> queryString, String requestBody, Exception ex) { 81 Map<String, String> queryString, String requestBody, Exception ex) {
82 // 处理用户信息 82 // 处理用户信息
83 accessLog.setUserId(WebFrameworkUtils.getLoginUserId(request)); 83 accessLog.setUserId(WebFrameworkUtils.getLoginUserId(request));
84 - accessLog.setUserType(WebFrameworkUtils.getUesrType(request)); 84 + accessLog.setUserType(WebFrameworkUtils.getUserType(request));
85 // 设置访问结果 85 // 设置访问结果
86 CommonResult<?> result = WebFrameworkUtils.getCommonResult(request); 86 CommonResult<?> result = WebFrameworkUtils.getCommonResult(request);
87 if (result != null) { 87 if (result != null) {
src/main/java/cn/iocoder/dashboard/framework/redis/config/RedisConfig.java
1 package cn.iocoder.dashboard.framework.redis.config; 1 package cn.iocoder.dashboard.framework.redis.config;
2 2
  3 +import cn.hutool.system.SystemUtil;
3 import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener; 4 import cn.iocoder.dashboard.framework.redis.core.pubsub.AbstractChannelMessageListener;
  5 +import cn.iocoder.dashboard.framework.redis.core.stream.AbstractStreamMessageListener;
4 import lombok.extern.slf4j.Slf4j; 6 import lombok.extern.slf4j.Slf4j;
5 import org.springframework.context.annotation.Bean; 7 import org.springframework.context.annotation.Bean;
6 import org.springframework.context.annotation.Configuration; 8 import org.springframework.context.annotation.Configuration;
7 import org.springframework.data.redis.connection.RedisConnectionFactory; 9 import org.springframework.data.redis.connection.RedisConnectionFactory;
  10 +import org.springframework.data.redis.connection.stream.Consumer;
  11 +import org.springframework.data.redis.connection.stream.ObjectRecord;
  12 +import org.springframework.data.redis.connection.stream.ReadOffset;
  13 +import org.springframework.data.redis.connection.stream.StreamOffset;
8 import org.springframework.data.redis.core.RedisTemplate; 14 import org.springframework.data.redis.core.RedisTemplate;
9 import org.springframework.data.redis.listener.ChannelTopic; 15 import org.springframework.data.redis.listener.ChannelTopic;
10 import org.springframework.data.redis.listener.RedisMessageListenerContainer; 16 import org.springframework.data.redis.listener.RedisMessageListenerContainer;
11 import org.springframework.data.redis.serializer.RedisSerializer; 17 import org.springframework.data.redis.serializer.RedisSerializer;
  18 +import org.springframework.data.redis.stream.StreamMessageListenerContainer;
12 19
13 import java.util.List; 20 import java.util.List;
14 21
@@ -19,6 +26,9 @@ import java.util.List; @@ -19,6 +26,9 @@ import java.util.List;
19 @Slf4j 26 @Slf4j
20 public class RedisConfig { 27 public class RedisConfig {
21 28
  29 + /**
  30 + * 创建 RedisTemplate Bean,使用 JSON 序列化方式
  31 + */
22 @Bean 32 @Bean
23 public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { 33 public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
24 // 创建 RedisTemplate 对象 34 // 创建 RedisTemplate 对象
@@ -27,11 +37,16 @@ public class RedisConfig { @@ -27,11 +37,16 @@ public class RedisConfig {
27 template.setConnectionFactory(factory); 37 template.setConnectionFactory(factory);
28 // 使用 String 序列化方式,序列化 KEY 。 38 // 使用 String 序列化方式,序列化 KEY 。
29 template.setKeySerializer(RedisSerializer.string()); 39 template.setKeySerializer(RedisSerializer.string());
  40 + template.setHashKeySerializer(RedisSerializer.string());
30 // 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。 41 // 使用 JSON 序列化方式(库是 Jackson ),序列化 VALUE 。
31 template.setValueSerializer(RedisSerializer.json()); 42 template.setValueSerializer(RedisSerializer.json());
  43 + template.setHashValueSerializer(RedisSerializer.json());
32 return template; 44 return template;
33 } 45 }
34 46
  47 + /**
  48 + * 创建 Redis Pub/Sub 广播消费的容器
  49 + */
35 @Bean 50 @Bean
36 public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory factory, 51 public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory factory,
37 List<AbstractChannelMessageListener<?>> listeners) { 52 List<AbstractChannelMessageListener<?>> listeners) {
@@ -48,4 +63,57 @@ public class RedisConfig { @@ -48,4 +63,57 @@ public class RedisConfig {
48 return container; 63 return container;
49 } 64 }
50 65
  66 + /**
  67 + * 创建 Redis Stream 集群消费的容器
  68 + *
  69 + * Redis Stream 的 xreadgroup 命令:https://www.geek-book.com/src/docs/redis/redis/redis.io/commands/xreadgroup.html
  70 + */
  71 + @Bean(initMethod = "start", destroyMethod = "stop")
  72 + public StreamMessageListenerContainer<String, ObjectRecord<String, String>> redisStreamMessageListenerContainer(RedisTemplate<String, Object> redisTemplate,
  73 + List<AbstractStreamMessageListener<?>> listeners) {
  74 + // 第一步,创建 StreamMessageListenerContainer 容器
  75 + // 创建 options 配置
  76 + StreamMessageListenerContainer.StreamMessageListenerContainerOptions<String, ObjectRecord<String, String>> containerOptions =
  77 + StreamMessageListenerContainer.StreamMessageListenerContainerOptions.builder()
  78 + .batchSize(10) // 一次性最多拉取多少条消息
  79 + .targetType(String.class) // 目标类型。统一使用 String,通过自己封装的 AbstractStreamMessageListener 去反序列化
  80 + .build();
  81 + // 创建 container 对象
  82 + StreamMessageListenerContainer<String, ObjectRecord<String, String>> container = StreamMessageListenerContainer.create(
  83 + redisTemplate.getRequiredConnectionFactory(), containerOptions);
  84 +
  85 + // 第二步,注册监听器,消费对应的 Stream 主题
  86 + String consumerName = buildConsumerName();
  87 +// String consumerName = "110";
  88 + listeners.forEach(listener -> {
  89 + // 创建 listener 对应的消费者分组
  90 + try {
  91 + redisTemplate.opsForStream().createGroup(listener.getStreamKey(), listener.getGroup());
  92 + } catch (Exception ignore) {}
  93 + // 设置 listener 对应的 redisTemplate
  94 + listener.setRedisTemplate(redisTemplate);
  95 + // 创建 Consumer 对象
  96 + Consumer consumer = Consumer.from(listener.getGroup(), consumerName);
  97 + // 设置 Consumer 消费进度,以最小消费进度为准
  98 + StreamOffset<String> streamOffset = StreamOffset.create(listener.getStreamKey(), ReadOffset.lastConsumed());
  99 + // 设置 Consumer 监听
  100 + StreamMessageListenerContainer.StreamReadRequestBuilder<String> builder = StreamMessageListenerContainer.StreamReadRequest
  101 + .builder(streamOffset).consumer(consumer)
  102 + .autoAcknowledge(false) // 不自动 ack
  103 + .cancelOnError(throwable -> false); // 默认配置,发生异常就取消消费,显然不符合预期;因此,我们设置为 false
  104 + container.register(builder.build(), listener);
  105 + });
  106 + return container;
  107 + }
  108 +
  109 + /**
  110 + * 构建消费者名字,使用本地 IP + 进程编号的方式。
  111 + * 参考自 RocketMQ clientId 的实现
  112 + *
  113 + * @return 消费者名字
  114 + */
  115 + private static String buildConsumerName() {
  116 + return String.format("%s@%d", SystemUtil.getHostInfo().getAddress(), SystemUtil.getCurrentPID());
  117 + }
  118 +
51 } 119 }
src/main/java/cn/iocoder/dashboard/framework/redis/core/pubsub/AbstractChannelMessageListener.java
1 package cn.iocoder.dashboard.framework.redis.core.pubsub; 1 package cn.iocoder.dashboard.framework.redis.core.pubsub;
2 2
3 -import cn.hutool.core.util.ArrayUtil; 3 +import cn.hutool.core.util.TypeUtil;
4 import cn.iocoder.dashboard.util.json.JsonUtils; 4 import cn.iocoder.dashboard.util.json.JsonUtils;
5 import lombok.SneakyThrows; 5 import lombok.SneakyThrows;
6 import org.springframework.data.redis.connection.Message; 6 import org.springframework.data.redis.connection.Message;
7 import org.springframework.data.redis.connection.MessageListener; 7 import org.springframework.data.redis.connection.MessageListener;
8 -import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;  
9 8
10 import java.lang.reflect.Type; 9 import java.lang.reflect.Type;
11 10
@@ -62,21 +61,11 @@ public abstract class AbstractChannelMessageListener&lt;T extends ChannelMessage&gt; i @@ -62,21 +61,11 @@ public abstract class AbstractChannelMessageListener&lt;T extends ChannelMessage&gt; i
62 */ 61 */
63 @SuppressWarnings("unchecked") 62 @SuppressWarnings("unchecked")
64 private Class<T> getMessageClass() { 63 private Class<T> getMessageClass() {
65 - Class<?> targetClass = getClass();  
66 - while (targetClass.getSuperclass() != null) {  
67 - // 如果不是 AbstractMessageListener 父类,继续向上查找  
68 - if (targetClass.getSuperclass() != AbstractChannelMessageListener.class) {  
69 - targetClass = targetClass.getSuperclass();  
70 - continue;  
71 - }  
72 - // 如果是 AbstractMessageListener 父类,则解析泛型  
73 - Type[] types = ((ParameterizedTypeImpl) targetClass.getGenericSuperclass()).getActualTypeArguments();  
74 - if (ArrayUtil.isEmpty(types)) {  
75 - throw new IllegalStateException(String.format("类型(%s) 需要设置消息类型", getClass().getName()));  
76 - }  
77 - return (Class<T>) types[0]; 64 + Type type = TypeUtil.getTypeArgument(getClass(), 0);
  65 + if (type == null) {
  66 + throw new IllegalStateException(String.format("类型(%s) 需要设置消息类型", getClass().getName()));
78 } 67 }
79 - throw new IllegalStateException(String.format("类型(%s) 找不到 AbstractMessageListener 父类", getClass().getName())); 68 + return (Class<T>) type;
80 } 69 }
81 70
82 } 71 }
src/main/java/cn/iocoder/dashboard/framework/redis/core/pubsub/ChannelMessage.java
@@ -4,6 +4,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore; @@ -4,6 +4,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
4 4
5 /** 5 /**
6 * Redis Channel Message 接口 6 * Redis Channel Message 接口
  7 + *
  8 + * @author 芋道源码
7 */ 9 */
8 public interface ChannelMessage { 10 public interface ChannelMessage {
9 11
@@ -12,7 +14,7 @@ public interface ChannelMessage { @@ -12,7 +14,7 @@ public interface ChannelMessage {
12 * 14 *
13 * @return Channel 15 * @return Channel
14 */ 16 */
15 - @JsonIgnore // 必须序列化 17 + @JsonIgnore // 避免序列化
16 String getChannel(); 18 String getChannel();
17 19
18 } 20 }
src/main/java/cn/iocoder/dashboard/framework/redis/core/stream/AbstractStreamMessageListener.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.redis.core.stream;
  2 +
  3 +import cn.hutool.core.util.TypeUtil;
  4 +import cn.iocoder.dashboard.util.json.JsonUtils;
  5 +import lombok.Getter;
  6 +import lombok.Setter;
  7 +import lombok.SneakyThrows;
  8 +import org.springframework.beans.factory.annotation.Value;
  9 +import org.springframework.data.redis.connection.stream.ObjectRecord;
  10 +import org.springframework.data.redis.core.RedisTemplate;
  11 +import org.springframework.data.redis.stream.StreamListener;
  12 +
  13 +import java.lang.reflect.Type;
  14 +
  15 +/**
  16 + * Redis Stream 监听器抽象类,用于实现集群消费
  17 + *
  18 + * @param <T> 消息类型。一定要填写噢,不然会报错
  19 + *
  20 + * @author 芋道源码
  21 + */
  22 +public abstract class AbstractStreamMessageListener<T extends StreamMessage>
  23 + implements StreamListener<String, ObjectRecord<String, String>> {
  24 +
  25 + /**
  26 + * 消息类型
  27 + */
  28 + private final Class<T> messageType;
  29 + /**
  30 + * Redis Channel
  31 + */
  32 + @Getter
  33 + private final String streamKey;
  34 +
  35 + /**
  36 + * Redis 消费者分组,默认使用 spring.application.name 名字
  37 + */
  38 + @Value("${spring.application.name}")
  39 + @Getter
  40 + private String group;
  41 + /**
  42 + *
  43 + */
  44 + @Setter
  45 + private RedisTemplate<String, ?> redisTemplate;
  46 +
  47 + @SneakyThrows
  48 + protected AbstractStreamMessageListener() {
  49 + this.messageType = getMessageClass();
  50 + this.streamKey = messageType.newInstance().getStreamKey();
  51 + }
  52 +
  53 + @Override
  54 + public void onMessage(ObjectRecord<String, String> message) {
  55 + // 消费消息
  56 + T messageObj = JsonUtils.parseObject(message.getValue(), messageType);
  57 + this.onMessage(messageObj);
  58 + // ack 消息消费完成
  59 + redisTemplate.opsForStream().acknowledge(group, message);
  60 + // TODO 芋艿:需要额外考虑以下几个点:
  61 + // 1. 处理异常的情况
  62 + // 2. 发送日志;以及事务的结合
  63 + // 3. 消费日志;以及通用的幂等性
  64 + // 4. 消费失败的重试,https://zhuanlan.zhihu.com/p/60501638
  65 + }
  66 +
  67 + /**
  68 + * 处理消息
  69 + *
  70 + * @param message 消息
  71 + */
  72 + public abstract void onMessage(T message);
  73 +
  74 + /**
  75 + * 通过解析类上的泛型,获得消息类型
  76 + *
  77 + * @return 消息类型
  78 + */
  79 + @SuppressWarnings("unchecked")
  80 + private Class<T> getMessageClass() {
  81 + Type type = TypeUtil.getTypeArgument(getClass(), 0);
  82 + if (type == null) {
  83 + throw new IllegalStateException(String.format("类型(%s) 需要设置消息类型", getClass().getName()));
  84 + }
  85 + return (Class<T>) type;
  86 + }
  87 +
  88 +}
src/main/java/cn/iocoder/dashboard/framework/redis/core/stream/StreamMessage.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.redis.core.stream;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonIgnore;
  4 +
  5 +/**
  6 + * Redis Stream Message 接口
  7 + *
  8 + * @author 芋道源码
  9 + */
  10 +public interface StreamMessage {
  11 +
  12 + /**
  13 + * 获得 Redis Stream Key
  14 + *
  15 + * @return Channel
  16 + */
  17 + @JsonIgnore // 避免序列化
  18 + String getStreamKey();
  19 +
  20 +}
src/main/java/cn/iocoder/dashboard/framework/redis/core/util/RedisMessageUtils.java
1 package cn.iocoder.dashboard.framework.redis.core.util; 1 package cn.iocoder.dashboard.framework.redis.core.util;
2 2
3 import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage; 3 import cn.iocoder.dashboard.framework.redis.core.pubsub.ChannelMessage;
  4 +import cn.iocoder.dashboard.framework.redis.core.stream.StreamMessage;
4 import cn.iocoder.dashboard.util.json.JsonUtils; 5 import cn.iocoder.dashboard.util.json.JsonUtils;
  6 +import org.springframework.data.redis.connection.stream.RecordId;
  7 +import org.springframework.data.redis.connection.stream.StreamRecords;
5 import org.springframework.data.redis.core.RedisTemplate; 8 import org.springframework.data.redis.core.RedisTemplate;
6 9
7 /** 10 /**
@@ -17,8 +20,21 @@ public class RedisMessageUtils { @@ -17,8 +20,21 @@ public class RedisMessageUtils {
17 * @param redisTemplate Redis 操作模板 20 * @param redisTemplate Redis 操作模板
18 * @param message 消息 21 * @param message 消息
19 */ 22 */
20 - public static <T extends ChannelMessage> void sendChannelMessage(RedisTemplate<?, ?> redisTemplate, T message) { 23 + public static <T extends ChannelMessage> void sendChannelMessage(RedisTemplate<?, ?> redisTemplate, T message) {
21 redisTemplate.convertAndSend(message.getChannel(), JsonUtils.toJsonString(message)); 24 redisTemplate.convertAndSend(message.getChannel(), JsonUtils.toJsonString(message));
22 } 25 }
23 26
  27 + /**
  28 + * 发送 Redis 消息,基于 Redis Stream 实现
  29 + *
  30 + * @param redisTemplate Redis 操作模板
  31 + * @param message 消息
  32 + * @return 消息记录的编号对象
  33 + */
  34 + public static <T extends StreamMessage> RecordId sendStreamMessage(RedisTemplate<String, ?> redisTemplate, T message) {
  35 + return redisTemplate.opsForStream().add(StreamRecords.newRecord()
  36 + .ofObject(JsonUtils.toJsonString(message)) // 设置内容
  37 + .withStreamKey(message.getStreamKey())); // 设置 stream key
  38 + }
  39 +
24 } 40 }
src/main/java/cn/iocoder/dashboard/framework/web/core/handler/GlobalExceptionHandler.java
@@ -269,7 +269,7 @@ public class GlobalExceptionHandler { @@ -269,7 +269,7 @@ public class GlobalExceptionHandler {
269 private void initExceptionLog(ApiErrorLogCreateDTO errorLog, HttpServletRequest request, Throwable e) { 269 private void initExceptionLog(ApiErrorLogCreateDTO errorLog, HttpServletRequest request, Throwable e) {
270 // 处理用户信息 270 // 处理用户信息
271 errorLog.setUserId(WebFrameworkUtils.getLoginUserId(request)); 271 errorLog.setUserId(WebFrameworkUtils.getLoginUserId(request));
272 - errorLog.setUserType(WebFrameworkUtils.getUesrType(request)); 272 + errorLog.setUserType(WebFrameworkUtils.getUserType(request));
273 // 设置异常字段 273 // 设置异常字段
274 errorLog.setExceptionName(e.getClass().getName()); 274 errorLog.setExceptionName(e.getClass().getName());
275 errorLog.setExceptionMessage(ExceptionUtil.getMessage(e)); 275 errorLog.setExceptionMessage(ExceptionUtil.getMessage(e));
src/main/java/cn/iocoder/dashboard/framework/web/core/util/WebFrameworkUtils.java
@@ -31,7 +31,7 @@ public class WebFrameworkUtils { @@ -31,7 +31,7 @@ public class WebFrameworkUtils {
31 return (Long) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID); 31 return (Long) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID);
32 } 32 }
33 33
34 - public static Integer getUesrType(HttpServletRequest request) { 34 + public static Integer getUserType(HttpServletRequest request) {
35 return UserTypeEnum.ADMIN.getValue(); // TODO 芋艿:等后续优化 35 return UserTypeEnum.ADMIN.getValue(); // TODO 芋艿:等后续优化
36 } 36 }
37 37
src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java
@@ -19,6 +19,7 @@ import cn.iocoder.dashboard.modules.system.service.user.SysUserService; @@ -19,6 +19,7 @@ import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
19 import cn.iocoder.dashboard.util.collection.SetUtils; 19 import cn.iocoder.dashboard.util.collection.SetUtils;
20 import io.swagger.annotations.Api; 20 import io.swagger.annotations.Api;
21 import io.swagger.annotations.ApiOperation; 21 import io.swagger.annotations.ApiOperation;
  22 +import org.springframework.validation.annotation.Validated;
22 import org.springframework.web.bind.annotation.*; 23 import org.springframework.web.bind.annotation.*;
23 24
24 import javax.annotation.Resource; 25 import javax.annotation.Resource;
@@ -34,6 +35,7 @@ import static cn.iocoder.dashboard.util.servlet.ServletUtils.getUserAgent; @@ -34,6 +35,7 @@ import static cn.iocoder.dashboard.util.servlet.ServletUtils.getUserAgent;
34 @Api(tags = "认证") 35 @Api(tags = "认证")
35 @RestController 36 @RestController
36 @RequestMapping("/") 37 @RequestMapping("/")
  38 +@Validated
37 public class SysAuthController { 39 public class SysAuthController {
38 40
39 @Resource 41 @Resource
@@ -45,8 +47,8 @@ public class SysAuthController { @@ -45,8 +47,8 @@ public class SysAuthController {
45 @Resource 47 @Resource
46 private SysPermissionService permissionService; 48 private SysPermissionService permissionService;
47 49
48 - @ApiOperation("使用账号密码登录")  
49 @PostMapping("/login") 50 @PostMapping("/login")
  51 + @ApiOperation("使用账号密码登录")
50 @OperateLog(enable = false) // 避免 Post 请求被记录操作日志 52 @OperateLog(enable = false) // 避免 Post 请求被记录操作日志
51 public CommonResult<SysAuthLoginRespVO> login(@RequestBody @Valid SysAuthLoginReqVO reqVO) { 53 public CommonResult<SysAuthLoginRespVO> login(@RequestBody @Valid SysAuthLoginReqVO reqVO) {
52 String token = authService.login(reqVO, getClientIP(), getUserAgent()); 54 String token = authService.login(reqVO, getClientIP(), getUserAgent());
@@ -54,8 +56,8 @@ public class SysAuthController { @@ -54,8 +56,8 @@ public class SysAuthController {
54 return success(SysAuthLoginRespVO.builder().token(token).build()); 56 return success(SysAuthLoginRespVO.builder().token(token).build());
55 } 57 }
56 58
57 - @ApiOperation("获取登陆用户的权限信息")  
58 @GetMapping("/get-permission-info") 59 @GetMapping("/get-permission-info")
  60 + @ApiOperation("获取登陆用户的权限信息")
59 public CommonResult<SysAuthPermissionInfoRespVO> getPermissionInfo() { 61 public CommonResult<SysAuthPermissionInfoRespVO> getPermissionInfo() {
60 // 获得用户信息 62 // 获得用户信息
61 SysUserDO user = userService.getUser(getLoginUserId()); 63 SysUserDO user = userService.getUser(getLoginUserId());
@@ -63,9 +65,9 @@ public class SysAuthController { @@ -63,9 +65,9 @@ public class SysAuthController {
63 return null; 65 return null;
64 } 66 }
65 // 获得角色列表 67 // 获得角色列表
66 - List<SysRoleDO> roleList = roleService.listRolesFromCache(getLoginUserRoleIds()); 68 + List<SysRoleDO> roleList = roleService.getRolesFromCache(getLoginUserRoleIds());
67 // 获得菜单列表 69 // 获得菜单列表
68 - List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache( 70 + List<SysMenuDO> menuList = permissionService.getRoleMenusFromCache(
69 getLoginUserRoleIds(), // 注意,基于登陆的角色,因为后续的权限判断也是基于它 71 getLoginUserRoleIds(), // 注意,基于登陆的角色,因为后续的权限判断也是基于它
70 SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()), 72 SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()),
71 SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); 73 SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus()));
@@ -73,11 +75,11 @@ public class SysAuthController { @@ -73,11 +75,11 @@ public class SysAuthController {
73 return success(SysAuthConvert.INSTANCE.convert(user, roleList, menuList)); 75 return success(SysAuthConvert.INSTANCE.convert(user, roleList, menuList));
74 } 76 }
75 77
76 - @ApiOperation("获得登陆用户的菜单列表")  
77 @GetMapping("list-menus") 78 @GetMapping("list-menus")
78 - public CommonResult<List<SysAuthMenuRespVO>> listMenus() { 79 + @ApiOperation("获得登陆用户的菜单列表")
  80 + public CommonResult<List<SysAuthMenuRespVO>> getMenus() {
79 // 获得用户拥有的菜单列表 81 // 获得用户拥有的菜单列表
80 - List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache( 82 + List<SysMenuDO> menuList = permissionService.getRoleMenusFromCache(
81 getLoginUserRoleIds(), // 注意,基于登陆的角色,因为后续的权限判断也是基于它 83 getLoginUserRoleIds(), // 注意,基于登陆的角色,因为后续的权限判断也是基于它
82 SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型 84 SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型
83 SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的 85 SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的
src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysUserSessionController.java
@@ -39,9 +39,9 @@ public class SysUserSessionController { @@ -39,9 +39,9 @@ public class SysUserSessionController {
39 @Resource 39 @Resource
40 private SysDeptService deptService; 40 private SysDeptService deptService;
41 41
  42 + @GetMapping("/page")
42 @ApiOperation("获得 Session 分页列表") 43 @ApiOperation("获得 Session 分页列表")
43 @PreAuthorize("@ss.hasPermission('system:user-session:page')") 44 @PreAuthorize("@ss.hasPermission('system:user-session:page')")
44 - @GetMapping("/page")  
45 public CommonResult<PageResult<SysUserSessionPageItemRespVO>> getUserSessionPage(@Validated SysUserSessionPageReqVO reqVO) { 45 public CommonResult<PageResult<SysUserSessionPageItemRespVO>> getUserSessionPage(@Validated SysUserSessionPageReqVO reqVO) {
46 // 获得 Session 分页 46 // 获得 Session 分页
47 PageResult<SysUserSessionDO> pageResult = userSessionService.getUserSessionPage(reqVO); 47 PageResult<SysUserSessionDO> pageResult = userSessionService.getUserSessionPage(reqVO);
@@ -66,12 +66,12 @@ public class SysUserSessionController { @@ -66,12 +66,12 @@ public class SysUserSessionController {
66 return success(new PageResult<>(sessionList, pageResult.getTotal())); 66 return success(new PageResult<>(sessionList, pageResult.getTotal()));
67 } 67 }
68 68
69 - @ApiOperation("删除 Session")  
70 - @PreAuthorize("@ss.hasPermission('system:user-session:delete')")  
71 @DeleteMapping("/delete") 69 @DeleteMapping("/delete")
  70 + @ApiOperation("删除 Session")
72 @ApiImplicitParam(name = "id", value = "Session 编号", required = true, dataTypeClass = String.class, 71 @ApiImplicitParam(name = "id", value = "Session 编号", required = true, dataTypeClass = String.class,
73 example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7") 72 example = "fe50b9f6-d177-44b1-8da9-72ea34f63db7")
74 - public CommonResult<Boolean> delete(@RequestParam("id") String id) { 73 + @PreAuthorize("@ss.hasPermission('system:user-session:delete')")
  74 + public CommonResult<Boolean> deleteUserSession(@RequestParam("id") String id) {
75 userSessionService.deleteUserSession(id); 75 userSessionService.deleteUserSession(id);
76 return success(true); 76 return success(true);
77 } 77 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysDeptController.java
@@ -9,10 +9,12 @@ import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService; @@ -9,10 +9,12 @@ import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
9 import io.swagger.annotations.Api; 9 import io.swagger.annotations.Api;
10 import io.swagger.annotations.ApiImplicitParam; 10 import io.swagger.annotations.ApiImplicitParam;
11 import io.swagger.annotations.ApiOperation; 11 import io.swagger.annotations.ApiOperation;
  12 +import org.springframework.security.access.prepost.PreAuthorize;
12 import org.springframework.validation.annotation.Validated; 13 import org.springframework.validation.annotation.Validated;
13 import org.springframework.web.bind.annotation.*; 14 import org.springframework.web.bind.annotation.*;
14 15
15 import javax.annotation.Resource; 16 import javax.annotation.Resource;
  17 +import javax.validation.Valid;
16 import java.util.Comparator; 18 import java.util.Comparator;
17 import java.util.List; 19 import java.util.List;
18 20
@@ -21,65 +23,64 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success; @@ -21,65 +23,64 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
21 @Api(tags = "部门") 23 @Api(tags = "部门")
22 @RestController 24 @RestController
23 @RequestMapping("/system/dept") 25 @RequestMapping("/system/dept")
  26 +@Validated
24 public class SysDeptController { 27 public class SysDeptController {
25 28
26 @Resource 29 @Resource
27 private SysDeptService deptService; 30 private SysDeptService deptService;
28 31
29 - @ApiOperation("获取部门列表")  
30 -// @PreAuthorize("@ss.hasPermi('system:dept:list')") 32 + @PostMapping("create")
  33 + @ApiOperation("创建部门")
  34 + @PreAuthorize("@ss.hasPermission('system:dept:create')")
  35 + public CommonResult<Long> createDept(@Valid @RequestBody SysDeptCreateReqVO reqVO) {
  36 + Long deptId = deptService.createDept(reqVO);
  37 + return success(deptId);
  38 + }
  39 +
  40 + @PutMapping("update")
  41 + @ApiOperation("更新部门")
  42 + @PreAuthorize("@ss.hasPermission('system:dept:update')")
  43 + public CommonResult<Boolean> updateDept(@Valid @RequestBody SysDeptUpdateReqVO reqVO) {
  44 + deptService.updateDept(reqVO);
  45 + return success(true);
  46 + }
  47 +
  48 + @DeleteMapping("delete")
  49 + @ApiOperation("删除部门")
  50 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  51 + @PreAuthorize("@ss.hasPermission('system:dept:delete')")
  52 + public CommonResult<Boolean> deleteDept(@RequestParam("id") Long id) {
  53 + deptService.deleteDept(id);
  54 + return success(true);
  55 + }
  56 +
31 @GetMapping("/list") 57 @GetMapping("/list")
  58 + @ApiOperation("获取部门列表")
  59 + @PreAuthorize("@ss.hasPermission('system:dept:query')")
32 public CommonResult<List<SysDeptRespVO>> listDepts(SysDeptListReqVO reqVO) { 60 public CommonResult<List<SysDeptRespVO>> listDepts(SysDeptListReqVO reqVO) {
33 - List<SysDeptDO> list = deptService.listDepts(reqVO); 61 + List<SysDeptDO> list = deptService.getSimpleDepts(reqVO);
34 list.sort(Comparator.comparing(SysDeptDO::getSort)); 62 list.sort(Comparator.comparing(SysDeptDO::getSort));
35 return success(SysDeptConvert.INSTANCE.convertList(list)); 63 return success(SysDeptConvert.INSTANCE.convertList(list));
36 } 64 }
37 65
38 - @ApiOperation(value = "获取部门精简信息列表", notes = "只包含被开启的部门,主要用于前端的下拉选项")  
39 @GetMapping("/list-all-simple") 66 @GetMapping("/list-all-simple")
40 - public CommonResult<List<SysDeptSimpleRespVO>> listSimpleDepts() { 67 + @ApiOperation(value = "获取部门精简信息列表", notes = "只包含被开启的部门,主要用于前端的下拉选项")
  68 + public CommonResult<List<SysDeptSimpleRespVO>> getSimpleDepts() {
41 // 获得部门列表,只要开启状态的 69 // 获得部门列表,只要开启状态的
42 SysDeptListReqVO reqVO = new SysDeptListReqVO(); 70 SysDeptListReqVO reqVO = new SysDeptListReqVO();
43 reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); 71 reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
44 - List<SysDeptDO> list = deptService.listDepts(reqVO); 72 + List<SysDeptDO> list = deptService.getSimpleDepts(reqVO);
45 // 排序后,返回给前端 73 // 排序后,返回给前端
46 list.sort(Comparator.comparing(SysDeptDO::getSort)); 74 list.sort(Comparator.comparing(SysDeptDO::getSort));
47 return success(SysDeptConvert.INSTANCE.convertList02(list)); 75 return success(SysDeptConvert.INSTANCE.convertList02(list));
48 } 76 }
49 77
  78 + @GetMapping("/get")
50 @ApiOperation("获得部门信息") 79 @ApiOperation("获得部门信息")
51 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) 80 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
52 -// @PreAuthorize("@ss.hasPermi('system:dept:query')")  
53 - @GetMapping("/get") 81 + @PreAuthorize("@ss.hasPermission('system:dept:query')")
54 public CommonResult<SysDeptRespVO> getDept(@RequestParam("id") Long id) { 82 public CommonResult<SysDeptRespVO> getDept(@RequestParam("id") Long id) {
55 return success(SysDeptConvert.INSTANCE.convert(deptService.getDept(id))); 83 return success(SysDeptConvert.INSTANCE.convert(deptService.getDept(id)));
56 } 84 }
57 85
58 - @ApiOperation("新增部门")  
59 - @PostMapping("create")  
60 -// @PreAuthorize("@ss.hasPermi('system:dept:add')")  
61 -// @Log(title = "部门管理", businessType = BusinessType.INSERT)  
62 - public CommonResult<Long> createDept(@Validated @RequestBody SysDeptCreateReqVO reqVO) {  
63 - Long deptId = deptService.createDept(reqVO);  
64 - return success(deptId);  
65 - }  
66 -  
67 - @ApiOperation("修改部门")  
68 - @PostMapping("update")  
69 -// @PreAuthorize("@ss.hasPermi('system:dept:edit')")  
70 -// @Log(title = "部门管理", businessType = BusinessType.UPDATE)  
71 - public CommonResult<Boolean> updateDept(@Validated @RequestBody SysDeptUpdateReqVO reqVO) {  
72 - deptService.updateDept(reqVO);  
73 - return success(true);  
74 - }  
75 -  
76 - @ApiOperation("删除部门")  
77 - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)  
78 - @PostMapping("delete")  
79 -// @PreAuthorize("@ss.hasPermi('system:dept:remove')")  
80 -// @Log(title = "部门管理", businessType = BusinessType.DELETE)  
81 - public CommonResult<Boolean> deleteDept(@RequestParam("id") Long id) {  
82 - deptService.deleteDept(id);  
83 - return success(true);  
84 - }  
85 } 86 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/dept/SysPostController.java
@@ -4,6 +4,7 @@ import cn.iocoder.dashboard.common.enums.CommonStatusEnum; @@ -4,6 +4,7 @@ import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 import cn.iocoder.dashboard.common.pojo.CommonResult; 4 import cn.iocoder.dashboard.common.pojo.CommonResult;
5 import cn.iocoder.dashboard.common.pojo.PageResult; 5 import cn.iocoder.dashboard.common.pojo.PageResult;
6 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; 6 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
  7 +import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
7 import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.*; 8 import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.*;
8 import cn.iocoder.dashboard.modules.system.convert.dept.SysPostConvert; 9 import cn.iocoder.dashboard.modules.system.convert.dept.SysPostConvert;
9 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; 10 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO;
@@ -11,88 +12,88 @@ import cn.iocoder.dashboard.modules.system.service.dept.SysPostService; @@ -11,88 +12,88 @@ import cn.iocoder.dashboard.modules.system.service.dept.SysPostService;
11 import io.swagger.annotations.Api; 12 import io.swagger.annotations.Api;
12 import io.swagger.annotations.ApiImplicitParam; 13 import io.swagger.annotations.ApiImplicitParam;
13 import io.swagger.annotations.ApiOperation; 14 import io.swagger.annotations.ApiOperation;
  15 +import org.springframework.security.access.prepost.PreAuthorize;
14 import org.springframework.validation.annotation.Validated; 16 import org.springframework.validation.annotation.Validated;
15 import org.springframework.web.bind.annotation.*; 17 import org.springframework.web.bind.annotation.*;
16 18
17 import javax.annotation.Resource; 19 import javax.annotation.Resource;
18 import javax.servlet.http.HttpServletResponse; 20 import javax.servlet.http.HttpServletResponse;
  21 +import javax.validation.Valid;
19 import java.io.IOException; 22 import java.io.IOException;
20 import java.util.Collections; 23 import java.util.Collections;
21 import java.util.Comparator; 24 import java.util.Comparator;
22 import java.util.List; 25 import java.util.List;
23 26
24 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 27 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  28 +import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT;
25 29
26 @Api(tags = "岗位") 30 @Api(tags = "岗位")
27 @RestController 31 @RestController
28 @RequestMapping("/system/post") 32 @RequestMapping("/system/post")
  33 +@Valid
29 public class SysPostController { 34 public class SysPostController {
30 35
31 @Resource 36 @Resource
32 private SysPostService postService; 37 private SysPostService postService;
33 38
34 - @ApiOperation(value = "获取岗位精简信息列表", notes = "只包含被开启的岗位,主要用于前端的下拉选项")  
35 - @GetMapping("/list-all-simple")  
36 - public CommonResult<List<SysPostSimpleRespVO>> listSimplePosts() {  
37 - // 获得岗位列表,只要开启状态的  
38 - List<SysPostDO> list = postService.listPosts(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus()));  
39 - // 排序后,返回给前端  
40 - list.sort(Comparator.comparing(SysPostDO::getSort));  
41 - return success(SysPostConvert.INSTANCE.convertList02(list));  
42 - }  
43 -  
44 - @ApiOperation("获得岗位分页列表")  
45 - @GetMapping("/page")  
46 -// @PreAuthorize("@ss.hasPermi('system:post:list')")  
47 - public CommonResult<PageResult<SysPostRespVO>> pagePosts(@Validated SysPostPageReqVO reqVO) {  
48 - return success(SysPostConvert.INSTANCE.convertPage(postService.pagePosts(reqVO)));  
49 - }  
50 -  
51 - @ApiOperation("新增岗位")  
52 @PostMapping("/create") 39 @PostMapping("/create")
53 -// @PreAuthorize("@ss.hasPermi('system:post:add')")  
54 -// @Log(title = "岗位管理", businessType = BusinessType.INSERT)  
55 - public CommonResult<Long> createPost(@Validated @RequestBody SysPostCreateReqVO reqVO) { 40 + @ApiOperation("创建岗位")
  41 + @PreAuthorize("@ss.hasPermission('system:post:create')")
  42 + public CommonResult<Long> createPost(@Valid @RequestBody SysPostCreateReqVO reqVO) {
56 Long postId = postService.createPost(reqVO); 43 Long postId = postService.createPost(reqVO);
57 return success(postId); 44 return success(postId);
58 } 45 }
59 46
  47 + @PutMapping("/update")
60 @ApiOperation("修改岗位") 48 @ApiOperation("修改岗位")
61 - @PostMapping("/update")  
62 -// @PreAuthorize("@ss.hasPermi('system:post:edit')")  
63 -// @Log(title = "岗位管理", businessType = BusinessType.UPDATE)  
64 - public CommonResult<Boolean> updatePost(@Validated @RequestBody SysPostUpdateReqVO reqVO) { 49 + @PreAuthorize("@ss.hasPermission('system:post:update')")
  50 + public CommonResult<Boolean> updatePost(@Valid @RequestBody SysPostUpdateReqVO reqVO) {
65 postService.updatePost(reqVO); 51 postService.updatePost(reqVO);
66 return success(true); 52 return success(true);
67 } 53 }
68 54
  55 + @DeleteMapping("/delete")
69 @ApiOperation("删除岗位") 56 @ApiOperation("删除岗位")
70 - @PostMapping("/delete")  
71 -// @PreAuthorize("@ss.hasPermi('system:post:remove')")  
72 -// @Log(title = "岗位管理", businessType = BusinessType.DELETE) 57 + @PreAuthorize("@ss.hasPermission('system:post:delete')")
73 public CommonResult<Boolean> deletePost(@RequestParam("id") Long id) { 58 public CommonResult<Boolean> deletePost(@RequestParam("id") Long id) {
74 postService.deletePost(id); 59 postService.deletePost(id);
75 return success(true); 60 return success(true);
76 } 61 }
77 62
  63 + @GetMapping(value = "/get")
78 @ApiOperation("获得岗位信息") 64 @ApiOperation("获得岗位信息")
79 @ApiImplicitParam(name = "id", value = "岗位编号", required = true, example = "1024", dataTypeClass = Long.class) 65 @ApiImplicitParam(name = "id", value = "岗位编号", required = true, example = "1024", dataTypeClass = Long.class)
80 -// @PreAuthorize("@ss.hasPermi('system:post:query')")  
81 - @GetMapping(value = "/get") 66 + @PreAuthorize("@ss.hasPermission('system:post:query')")
82 public CommonResult<SysPostRespVO> getPost(@RequestParam("id") Long id) { 67 public CommonResult<SysPostRespVO> getPost(@RequestParam("id") Long id) {
83 return success(SysPostConvert.INSTANCE.convert(postService.getPost(id))); 68 return success(SysPostConvert.INSTANCE.convert(postService.getPost(id)));
84 } 69 }
85 70
  71 + @GetMapping("/list-all-simple")
  72 + @ApiOperation(value = "获取岗位精简信息列表", notes = "只包含被开启的岗位,主要用于前端的下拉选项")
  73 + public CommonResult<List<SysPostSimpleRespVO>> getSimplePosts() {
  74 + // 获得岗位列表,只要开启状态的
  75 + List<SysPostDO> list = postService.getPosts(null, Collections.singleton(CommonStatusEnum.ENABLE.getStatus()));
  76 + // 排序后,返回给前端
  77 + list.sort(Comparator.comparing(SysPostDO::getSort));
  78 + return success(SysPostConvert.INSTANCE.convertList02(list));
  79 + }
  80 +
  81 + @GetMapping("/page")
  82 + @ApiOperation("获得岗位分页列表")
  83 + @PreAuthorize("@ss.hasPermission('system:post:query')")
  84 + public CommonResult<PageResult<SysPostRespVO>> getPostPage(@Validated SysPostPageReqVO reqVO) {
  85 + return success(SysPostConvert.INSTANCE.convertPage(postService.getPostPage(reqVO)));
  86 + }
  87 +
86 @GetMapping("/export") 88 @GetMapping("/export")
87 @ApiOperation("岗位管理") 89 @ApiOperation("岗位管理")
88 -// @Log(title = "岗位管理", businessType = BusinessType.EXPORT)  
89 -// @PreAuthorize("@ss.hasPermi('system:post:export')") 90 + @PreAuthorize("@ss.hasPermission('system:post:export')")
  91 + @OperateLog(type = EXPORT)
90 public void export(HttpServletResponse response, @Validated SysPostExportReqVO reqVO) throws IOException { 92 public void export(HttpServletResponse response, @Validated SysPostExportReqVO reqVO) throws IOException {
91 - List<SysPostDO> posts = postService.listPosts(reqVO);  
92 - List<SysPostExcelVO> excelDataList = SysPostConvert.INSTANCE.convertList03(posts); 93 + List<SysPostDO> posts = postService.getPosts(reqVO);
  94 + List<SysPostExcelVO> data = SysPostConvert.INSTANCE.convertList03(posts);
93 // 输出 95 // 输出
94 - ExcelUtils.write(response, "岗位数据.xls", "岗位列表",  
95 - SysPostExcelVO.class, excelDataList); 96 + ExcelUtils.write(response, "岗位数据.xls", "岗位列表", SysPostExcelVO.class, data);
96 } 97 }
97 98
98 } 99 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictDataController.java
@@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.controller.dict; @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.controller.dict;
3 import cn.iocoder.dashboard.common.pojo.CommonResult; 3 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; 5 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
  6 +import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
6 import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.*; 7 import cn.iocoder.dashboard.modules.system.controller.dict.vo.data.*;
7 import cn.iocoder.dashboard.modules.system.convert.dict.SysDictDataConvert; 8 import cn.iocoder.dashboard.modules.system.convert.dict.SysDictDataConvert;
8 import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO; 9 import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictDataDO;
@@ -10,84 +11,85 @@ import cn.iocoder.dashboard.modules.system.service.dict.SysDictDataService; @@ -10,84 +11,85 @@ import cn.iocoder.dashboard.modules.system.service.dict.SysDictDataService;
10 import io.swagger.annotations.Api; 11 import io.swagger.annotations.Api;
11 import io.swagger.annotations.ApiImplicitParam; 12 import io.swagger.annotations.ApiImplicitParam;
12 import io.swagger.annotations.ApiOperation; 13 import io.swagger.annotations.ApiOperation;
  14 +import org.springframework.security.access.prepost.PreAuthorize;
13 import org.springframework.validation.annotation.Validated; 15 import org.springframework.validation.annotation.Validated;
14 import org.springframework.web.bind.annotation.*; 16 import org.springframework.web.bind.annotation.*;
15 17
16 import javax.annotation.Resource; 18 import javax.annotation.Resource;
17 import javax.servlet.http.HttpServletResponse; 19 import javax.servlet.http.HttpServletResponse;
  20 +import javax.validation.Valid;
18 import java.io.IOException; 21 import java.io.IOException;
19 import java.util.List; 22 import java.util.List;
20 23
21 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 24 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  25 +import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT;
22 26
23 @Api(tags = "字典数据") 27 @Api(tags = "字典数据")
24 @RestController 28 @RestController
25 @RequestMapping("/system/dict-data") 29 @RequestMapping("/system/dict-data")
  30 +@Validated
26 public class SysDictDataController { 31 public class SysDictDataController {
27 32
28 @Resource 33 @Resource
29 private SysDictDataService dictDataService; 34 private SysDictDataService dictDataService;
30 35
31 - @ApiOperation(value = "获得全部字典数据列表", notes = "一般用于管理后台缓存字典数据在本地")  
32 - @GetMapping("/list-all-simple")  
33 - // 无需添加权限认证,因为前端全局都需要  
34 - public CommonResult<List<SysDictDataSimpleVO>> listSimpleDictDatas() {  
35 - List<SysDictDataDO> list = dictDataService.getDictDataList();  
36 - return success(SysDictDataConvert.INSTANCE.convertList(list));  
37 - }  
38 -  
39 - @ApiOperation("/获得字典类型的分页列表")  
40 - @GetMapping("/page")  
41 -// @PreAuthorize("@ss.hasPermi('system:dict:list')")  
42 - public CommonResult<PageResult<SysDictDataRespVO>> pageDictTypes(@Validated SysDictDataPageReqVO reqVO) {  
43 - return success(SysDictDataConvert.INSTANCE.convertPage(dictDataService.getDictDataPage(reqVO)));  
44 - }  
45 -  
46 - @ApiOperation("/查询字典数据详细")  
47 - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)  
48 - @GetMapping(value = "/get")  
49 -// @PreAuthorize("@ss.hasPermi('system:dict:query')")  
50 - public CommonResult<SysDictDataRespVO> getDictData(@RequestParam("id") Long id) {  
51 - return success(SysDictDataConvert.INSTANCE.convert(dictDataService.getDictData(id)));  
52 - }  
53 -  
54 - @ApiOperation("新增字典数据")  
55 @PostMapping("/create") 36 @PostMapping("/create")
56 -// @PreAuthorize("@ss.hasPermi('system:dict:add')")  
57 -// @Log(title = "字典数据", businessData = BusinessData.INSERT)  
58 - public CommonResult<Long> createDictData(@Validated @RequestBody SysDictDataCreateReqVO reqVO) { 37 + @ApiOperation("新增字典数据")
  38 + @PreAuthorize("@ss.hasPermission('system:dict:create')")
  39 + public CommonResult<Long> createDictData(@Valid @RequestBody SysDictDataCreateReqVO reqVO) {
59 Long dictDataId = dictDataService.createDictData(reqVO); 40 Long dictDataId = dictDataService.createDictData(reqVO);
60 return success(dictDataId); 41 return success(dictDataId);
61 } 42 }
62 43
  44 + @PutMapping("update")
63 @ApiOperation("修改字典数据") 45 @ApiOperation("修改字典数据")
64 - @PostMapping("update")  
65 -// @PreAuthorize("@ss.hasPermi('system:dict:edit')")  
66 -// @Log(title = "字典数据", businessData = BusinessData.UPDATE)  
67 - public CommonResult<Boolean> updateDictData(@Validated @RequestBody SysDictDataUpdateReqVO reqVO) { 46 + @PreAuthorize("@ss.hasPermission('system:dict:update')")
  47 + public CommonResult<Boolean> updateDictData(@Valid @RequestBody SysDictDataUpdateReqVO reqVO) {
68 dictDataService.updateDictData(reqVO); 48 dictDataService.updateDictData(reqVO);
69 return success(true); 49 return success(true);
70 } 50 }
71 51
  52 + @DeleteMapping("/delete")
72 @ApiOperation("删除字典数据") 53 @ApiOperation("删除字典数据")
73 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) 54 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
74 - @PostMapping("/delete")  
75 -// @PreAuthorize("@ss.hasPermi('system:dict:remove')") 55 + @PreAuthorize("@ss.hasPermission('system:dict:delete')")
76 public CommonResult<Boolean> deleteDictData(Long id) { 56 public CommonResult<Boolean> deleteDictData(Long id) {
77 dictDataService.deleteDictData(id); 57 dictDataService.deleteDictData(id);
78 return success(true); 58 return success(true);
79 } 59 }
80 60
81 - @ApiOperation("导出字典数据") 61 + @GetMapping("/list-all-simple")
  62 + @ApiOperation(value = "获得全部字典数据列表", notes = "一般用于管理后台缓存字典数据在本地")
  63 + // 无需添加权限认证,因为前端全局都需要
  64 + public CommonResult<List<SysDictDataSimpleVO>> getSimpleDictDatas() {
  65 + List<SysDictDataDO> list = dictDataService.getDictDatas();
  66 + return success(SysDictDataConvert.INSTANCE.convertList(list));
  67 + }
  68 +
  69 + @GetMapping("/page")
  70 + @ApiOperation("/获得字典类型的分页列表")
  71 + @PreAuthorize("@ss.hasPermission('system:dict:query')")
  72 + public CommonResult<PageResult<SysDictDataRespVO>> getDictTypePage(@Valid SysDictDataPageReqVO reqVO) {
  73 + return success(SysDictDataConvert.INSTANCE.convertPage(dictDataService.getDictDataPage(reqVO)));
  74 + }
  75 +
  76 + @GetMapping(value = "/get")
  77 + @ApiOperation("/查询字典数据详细")
  78 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  79 + @PreAuthorize("@ss.hasPermission('system:dict:query')")
  80 + public CommonResult<SysDictDataRespVO> getDictData(@RequestParam("id") Long id) {
  81 + return success(SysDictDataConvert.INSTANCE.convert(dictDataService.getDictData(id)));
  82 + }
  83 +
82 @GetMapping("/export") 84 @GetMapping("/export")
83 -// @Log(title = "字典类型", businessType = BusinessType.EXPORT)  
84 -// @PreAuthorize("@ss.hasPermi('system:dict:export')")  
85 - public void export(HttpServletResponse response, @Validated SysDictDataExportReqVO reqVO) throws IOException {  
86 - List<SysDictDataDO> list = dictDataService.getDictDataList(reqVO);  
87 - List<SysDictDataExcelVO> excelDataList = SysDictDataConvert.INSTANCE.convertList02(list); 85 + @ApiOperation("导出字典数据")
  86 + @PreAuthorize("@ss.hasPermission('system:dict:export')")
  87 + @OperateLog(type = EXPORT)
  88 + public void export(HttpServletResponse response, @Valid SysDictDataExportReqVO reqVO) throws IOException {
  89 + List<SysDictDataDO> list = dictDataService.getDictDatas(reqVO);
  90 + List<SysDictDataExcelVO> data = SysDictDataConvert.INSTANCE.convertList02(list);
88 // 输出 91 // 输出
89 - ExcelUtils.write(response, "字典数据.xls", "数据列表",  
90 - SysDictDataExcelVO.class, excelDataList); 92 + ExcelUtils.write(response, "字典数据.xls", "数据列表", SysDictDataExcelVO.class, data);
91 } 93 }
92 94
93 } 95 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/dict/SysDictTypeController.java
@@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.controller.dict; @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.controller.dict;
3 import cn.iocoder.dashboard.common.pojo.CommonResult; 3 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; 5 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
  6 +import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
6 import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.*; 7 import cn.iocoder.dashboard.modules.system.controller.dict.vo.type.*;
7 import cn.iocoder.dashboard.modules.system.convert.dict.SysDictTypeConvert; 8 import cn.iocoder.dashboard.modules.system.convert.dict.SysDictTypeConvert;
8 import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO; 9 import cn.iocoder.dashboard.modules.system.dal.dataobject.dict.SysDictTypeDO;
@@ -10,66 +11,67 @@ import cn.iocoder.dashboard.modules.system.service.dict.SysDictTypeService; @@ -10,66 +11,67 @@ import cn.iocoder.dashboard.modules.system.service.dict.SysDictTypeService;
10 import io.swagger.annotations.Api; 11 import io.swagger.annotations.Api;
11 import io.swagger.annotations.ApiImplicitParam; 12 import io.swagger.annotations.ApiImplicitParam;
12 import io.swagger.annotations.ApiOperation; 13 import io.swagger.annotations.ApiOperation;
  14 +import org.springframework.security.access.prepost.PreAuthorize;
13 import org.springframework.validation.annotation.Validated; 15 import org.springframework.validation.annotation.Validated;
14 import org.springframework.web.bind.annotation.*; 16 import org.springframework.web.bind.annotation.*;
15 17
16 import javax.annotation.Resource; 18 import javax.annotation.Resource;
17 import javax.servlet.http.HttpServletResponse; 19 import javax.servlet.http.HttpServletResponse;
  20 +import javax.validation.Valid;
18 import java.io.IOException; 21 import java.io.IOException;
19 import java.util.List; 22 import java.util.List;
20 23
21 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 24 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  25 +import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT;
22 26
23 @Api(tags = "字典类型") 27 @Api(tags = "字典类型")
24 @RestController 28 @RestController
25 @RequestMapping("/system/dict-type") 29 @RequestMapping("/system/dict-type")
  30 +@Validated
26 public class SysDictTypeController { 31 public class SysDictTypeController {
27 32
28 @Resource 33 @Resource
29 private SysDictTypeService dictTypeService; 34 private SysDictTypeService dictTypeService;
30 35
31 - @ApiOperation("/获得字典类型的分页列表")  
32 - @GetMapping("/page")  
33 -// @PreAuthorize("@ss.hasPermi('system:dict:list')")  
34 - public CommonResult<PageResult<SysDictTypeRespVO>> pageDictTypes(@Validated SysDictTypePageReqVO reqVO) {  
35 - return success(SysDictTypeConvert.INSTANCE.convertPage(dictTypeService.getDictTypePage(reqVO)));  
36 - }  
37 -  
38 - @ApiOperation("/查询字典类型详细")  
39 - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)  
40 - @GetMapping(value = "/get")  
41 -// @PreAuthorize("@ss.hasPermi('system:dict:query')")  
42 - public CommonResult<SysDictTypeRespVO> getDictType(@RequestParam("id") Long id) {  
43 - return success(SysDictTypeConvert.INSTANCE.convert(dictTypeService.getDictType(id)));  
44 - }  
45 -  
46 - @ApiOperation("新增字典类型")  
47 @PostMapping("/create") 36 @PostMapping("/create")
48 -// @PreAuthorize("@ss.hasPermi('system:dict:add')")  
49 -// @Log(title = "字典类型", businessType = BusinessType.INSERT)  
50 - public CommonResult<Long> createDictType(@Validated @RequestBody SysDictTypeCreateReqVO reqVO) { 37 + @ApiOperation("创建字典类型")
  38 + @PreAuthorize("@ss.hasPermission('system:dict:create')")
  39 + public CommonResult<Long> createDictType(@Valid @RequestBody SysDictTypeCreateReqVO reqVO) {
51 Long dictTypeId = dictTypeService.createDictType(reqVO); 40 Long dictTypeId = dictTypeService.createDictType(reqVO);
52 return success(dictTypeId); 41 return success(dictTypeId);
53 } 42 }
54 43
55 - @ApiOperation("修改字典类型")  
56 @PostMapping("update") 44 @PostMapping("update")
57 -// @PreAuthorize("@ss.hasPermi('system:dict:edit')")  
58 -// @Log(title = "字典类型", businessType = BusinessType.UPDATE)  
59 - public CommonResult<Boolean> updateDictType(@Validated @RequestBody SysDictTypeUpdateReqVO reqVO) { 45 + @ApiOperation("修改字典类型")
  46 + @PreAuthorize("@ss.hasPermission('system:dict:update')")
  47 + public CommonResult<Boolean> updateDictType(@Valid @RequestBody SysDictTypeUpdateReqVO reqVO) {
60 dictTypeService.updateDictType(reqVO); 48 dictTypeService.updateDictType(reqVO);
61 return success(true); 49 return success(true);
62 } 50 }
63 51
  52 + @DeleteMapping("/delete")
64 @ApiOperation("删除字典类型") 53 @ApiOperation("删除字典类型")
65 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) 54 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
66 - @PostMapping("/delete")  
67 -// @PreAuthorize("@ss.hasPermi('system:dict:remove')") 55 + @PreAuthorize("@ss.hasPermission('system:dict:delete')")
68 public CommonResult<Boolean> deleteDictType(Long id) { 56 public CommonResult<Boolean> deleteDictType(Long id) {
69 dictTypeService.deleteDictType(id); 57 dictTypeService.deleteDictType(id);
70 return success(true); 58 return success(true);
71 } 59 }
72 60
  61 + @ApiOperation("/获得字典类型的分页列表")
  62 + @GetMapping("/page")
  63 + @PreAuthorize("@ss.hasPermission('system:dict:quey')")
  64 + public CommonResult<PageResult<SysDictTypeRespVO>> pageDictTypes(@Valid SysDictTypePageReqVO reqVO) {
  65 + return success(SysDictTypeConvert.INSTANCE.convertPage(dictTypeService.getDictTypePage(reqVO)));
  66 + }
  67 +
  68 + @ApiOperation("/查询字典类型详细")
  69 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  70 + @GetMapping(value = "/get")
  71 + @PreAuthorize("@ss.hasPermission('system:dict:quey')")
  72 + public CommonResult<SysDictTypeRespVO> getDictType(@RequestParam("id") Long id) {
  73 + return success(SysDictTypeConvert.INSTANCE.convert(dictTypeService.getDictType(id)));
  74 + }
73 75
74 @GetMapping("/list-all-simple") 76 @GetMapping("/list-all-simple")
75 @ApiOperation(value = "获得全部字典类型列表", notes = "包括开启 + 禁用的字典类型,主要用于前端的下拉选项") 77 @ApiOperation(value = "获得全部字典类型列表", notes = "包括开启 + 禁用的字典类型,主要用于前端的下拉选项")
@@ -81,14 +83,13 @@ public class SysDictTypeController { @@ -81,14 +83,13 @@ public class SysDictTypeController {
81 83
82 @ApiOperation("导出数据类型") 84 @ApiOperation("导出数据类型")
83 @GetMapping("/export") 85 @GetMapping("/export")
84 -// @Log(title = "字典类型", businessType = BusinessType.EXPORT)  
85 -// @PreAuthorize("@ss.hasPermi('system:dict:export')")  
86 - public void export(HttpServletResponse response, @Validated SysDictTypeExportReqVO reqVO) throws IOException { 86 + @PreAuthorize("@ss.hasPermission('system:dict:quey')")
  87 + @OperateLog(type = EXPORT)
  88 + public void export(HttpServletResponse response, @Valid SysDictTypeExportReqVO reqVO) throws IOException {
87 List<SysDictTypeDO> list = dictTypeService.getDictTypeList(reqVO); 89 List<SysDictTypeDO> list = dictTypeService.getDictTypeList(reqVO);
88 - List<SysDictTypeExcelVO> excelTypeList = SysDictTypeConvert.INSTANCE.convertList02(list); 90 + List<SysDictTypeExcelVO> data = SysDictTypeConvert.INSTANCE.convertList02(list);
89 // 输出 91 // 输出
90 - ExcelUtils.write(response, "字典类型.xls", "类型列表",  
91 - SysDictTypeExcelVO.class, excelTypeList); 92 + ExcelUtils.write(response, "字典类型.xls", "类型列表", SysDictTypeExcelVO.class, data);
92 } 93 }
93 94
94 } 95 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysLoginLogController.java
@@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.controller.logger; @@ -3,6 +3,7 @@ package cn.iocoder.dashboard.modules.system.controller.logger;
3 import cn.iocoder.dashboard.common.pojo.CommonResult; 3 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; 5 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
  6 +import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
6 import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExcelVO; 7 import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExcelVO;
7 import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO; 8 import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogExportReqVO;
8 import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO; 9 import cn.iocoder.dashboard.modules.system.controller.logger.vo.loginlog.SysLoginLogPageReqVO;
@@ -12,6 +13,7 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO; @@ -12,6 +13,7 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.logger.SysLoginLogDO;
12 import cn.iocoder.dashboard.modules.system.service.logger.SysLoginLogService; 13 import cn.iocoder.dashboard.modules.system.service.logger.SysLoginLogService;
13 import io.swagger.annotations.Api; 14 import io.swagger.annotations.Api;
14 import io.swagger.annotations.ApiOperation; 15 import io.swagger.annotations.ApiOperation;
  16 +import org.springframework.security.access.prepost.PreAuthorize;
15 import org.springframework.validation.annotation.Validated; 17 import org.springframework.validation.annotation.Validated;
16 import org.springframework.web.bind.annotation.GetMapping; 18 import org.springframework.web.bind.annotation.GetMapping;
17 import org.springframework.web.bind.annotation.RequestMapping; 19 import org.springframework.web.bind.annotation.RequestMapping;
@@ -19,36 +21,39 @@ import org.springframework.web.bind.annotation.RestController; @@ -19,36 +21,39 @@ import org.springframework.web.bind.annotation.RestController;
19 21
20 import javax.annotation.Resource; 22 import javax.annotation.Resource;
21 import javax.servlet.http.HttpServletResponse; 23 import javax.servlet.http.HttpServletResponse;
  24 +import javax.validation.Valid;
22 import java.io.IOException; 25 import java.io.IOException;
23 import java.util.List; 26 import java.util.List;
24 27
  28 +import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT;
  29 +
25 @Api(tags = "登陆日志") 30 @Api(tags = "登陆日志")
26 @RestController 31 @RestController
27 @RequestMapping("/system/login-log") 32 @RequestMapping("/system/login-log")
  33 +@Validated
28 public class SysLoginLogController { 34 public class SysLoginLogController {
29 35
30 @Resource 36 @Resource
31 private SysLoginLogService loginLogService; 37 private SysLoginLogService loginLogService;
32 38
33 - @ApiOperation("获得登陆日志分页列表")  
34 @GetMapping("/page") 39 @GetMapping("/page")
35 -// @PreAuthorize("@ss.hasPermi('system:login-log:query')")  
36 - public CommonResult<PageResult<SysLoginLogRespVO>> getLoginLogPage(@Validated SysLoginLogPageReqVO reqVO) { 40 + @ApiOperation("获得登陆日志分页列表")
  41 + @PreAuthorize("@ss.hasPermission('system:login-log:query')")
  42 + public CommonResult<PageResult<SysLoginLogRespVO>> getLoginLogPage(@Valid SysLoginLogPageReqVO reqVO) {
37 PageResult<SysLoginLogDO> page = loginLogService.getLoginLogPage(reqVO); 43 PageResult<SysLoginLogDO> page = loginLogService.getLoginLogPage(reqVO);
38 return CommonResult.success(SysLoginLogConvert.INSTANCE.convertPage(page)); 44 return CommonResult.success(SysLoginLogConvert.INSTANCE.convertPage(page));
39 } 45 }
40 46
41 - @ApiOperation("导出登陆日志 Excel")  
42 @GetMapping("/export") 47 @GetMapping("/export")
43 -// @Log(title = "登录日志", businessType = BusinessType.EXPORT)  
44 -// @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")  
45 - public void exportLoginLog(HttpServletResponse response, @Validated SysLoginLogExportReqVO reqVO) throws IOException { 48 + @ApiOperation("导出登陆日志 Excel")
  49 + @PreAuthorize("@ss.hasPermission('system:login-log:export')")
  50 + @OperateLog(type = EXPORT)
  51 + public void exportLoginLog(HttpServletResponse response, @Valid SysLoginLogExportReqVO reqVO) throws IOException {
46 List<SysLoginLogDO> list = loginLogService.getLoginLogList(reqVO); 52 List<SysLoginLogDO> list = loginLogService.getLoginLogList(reqVO);
47 // 拼接数据 53 // 拼接数据
48 - List<SysLoginLogExcelVO> excelDataList = SysLoginLogConvert.INSTANCE.convertList(list); 54 + List<SysLoginLogExcelVO> data = SysLoginLogConvert.INSTANCE.convertList(list);
49 // 输出 55 // 输出
50 - ExcelUtils.write(response, "登陆日志.xls", "数据列表",  
51 - SysLoginLogExcelVO.class, excelDataList); 56 + ExcelUtils.write(response, "登陆日志.xls", "数据列表", SysLoginLogExcelVO.class, data);
52 } 57 }
53 58
54 } 59 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/logger/SysOperateLogController.java
@@ -4,8 +4,6 @@ import cn.iocoder.dashboard.common.pojo.CommonResult; @@ -4,8 +4,6 @@ import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
5 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; 5 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
6 import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog; 6 import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
7 -import cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum;  
8 -import cn.iocoder.dashboard.framework.logger.operatelog.core.util.OperateLogUtils;  
9 import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO; 7 import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExcelVO;
10 import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO; 8 import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogExportReqVO;
11 import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO; 9 import cn.iocoder.dashboard.modules.system.controller.logger.vo.operatelog.SysOperateLogPageReqVO;
@@ -19,6 +17,7 @@ import cn.iocoder.dashboard.util.collection.CollectionUtils; @@ -19,6 +17,7 @@ import cn.iocoder.dashboard.util.collection.CollectionUtils;
19 import cn.iocoder.dashboard.util.collection.MapUtils; 17 import cn.iocoder.dashboard.util.collection.MapUtils;
20 import io.swagger.annotations.Api; 18 import io.swagger.annotations.Api;
21 import io.swagger.annotations.ApiOperation; 19 import io.swagger.annotations.ApiOperation;
  20 +import org.springframework.security.access.prepost.PreAuthorize;
22 import org.springframework.validation.annotation.Validated; 21 import org.springframework.validation.annotation.Validated;
23 import org.springframework.web.bind.annotation.GetMapping; 22 import org.springframework.web.bind.annotation.GetMapping;
24 import org.springframework.web.bind.annotation.RequestMapping; 23 import org.springframework.web.bind.annotation.RequestMapping;
@@ -26,6 +25,7 @@ import org.springframework.web.bind.annotation.RestController; @@ -26,6 +25,7 @@ import org.springframework.web.bind.annotation.RestController;
26 25
27 import javax.annotation.Resource; 26 import javax.annotation.Resource;
28 import javax.servlet.http.HttpServletResponse; 27 import javax.servlet.http.HttpServletResponse;
  28 +import javax.validation.Valid;
29 import java.io.IOException; 29 import java.io.IOException;
30 import java.util.ArrayList; 30 import java.util.ArrayList;
31 import java.util.Collection; 31 import java.util.Collection;
@@ -38,33 +38,19 @@ import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.Operat @@ -38,33 +38,19 @@ import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.Operat
38 @Api(tags = "操作日志") 38 @Api(tags = "操作日志")
39 @RestController 39 @RestController
40 @RequestMapping("/system/operate-log") 40 @RequestMapping("/system/operate-log")
  41 +@Validated
41 public class SysOperateLogController { 42 public class SysOperateLogController {
42 43
43 @Resource 44 @Resource
44 private SysOperateLogService operateLogService; 45 private SysOperateLogService operateLogService;
45 -  
46 @Resource 46 @Resource
47 private SysUserService userService; 47 private SysUserService userService;
48 48
49 - @ApiOperation("示例")  
50 - @OperateLog(type = OperateTypeEnum.OTHER)  
51 - @GetMapping("/demo")  
52 - public CommonResult<Boolean> demo() {  
53 - // 这里可以调用业务逻辑  
54 -  
55 - // 补全操作日志的明细  
56 - OperateLogUtils.setContent("将编号 1 的数据,xxx 字段修改成了 yyyy");  
57 - OperateLogUtils.addExt("orderId", 1);  
58 -  
59 - // 响应  
60 - return success(true);  
61 - }  
62 -  
63 - @ApiOperation("查看操作日志分页列表")  
64 @GetMapping("/page") 49 @GetMapping("/page")
65 -// @PreAuthorize("@ss.hasPermi('system:operate-log:query')")  
66 - public CommonResult<PageResult<SysOperateLogRespVO>> pageOperateLog(@Validated SysOperateLogPageReqVO reqVO) {  
67 - PageResult<SysOperateLogDO> pageResult = operateLogService.pageOperateLog(reqVO); 50 + @ApiOperation("查看操作日志分页列表")
  51 + @PreAuthorize("@ss.hasPermission('system:operate-log:query')")
  52 + public CommonResult<PageResult<SysOperateLogRespVO>> pageOperateLog(@Valid SysOperateLogPageReqVO reqVO) {
  53 + PageResult<SysOperateLogDO> pageResult = operateLogService.getOperateLogPage(reqVO);
68 54
69 // 获得拼接需要的数据 55 // 获得拼接需要的数据
70 Collection<Long> userIds = CollectionUtils.convertList(pageResult.getList(), SysOperateLogDO::getUserId); 56 Collection<Long> userIds = CollectionUtils.convertList(pageResult.getList(), SysOperateLogDO::getUserId);
@@ -82,11 +68,10 @@ public class SysOperateLogController { @@ -82,11 +68,10 @@ public class SysOperateLogController {
82 68
83 @ApiOperation("导出操作日志") 69 @ApiOperation("导出操作日志")
84 @GetMapping("/export") 70 @GetMapping("/export")
  71 + @PreAuthorize("@ss.hasPermission('system:operate-log:export')")
85 @OperateLog(type = EXPORT) 72 @OperateLog(type = EXPORT)
86 -// @PreAuthorize("@ss.hasPermi('system:operate-log:export')")  
87 - public void exportOperateLog(HttpServletResponse response, @Validated SysOperateLogExportReqVO reqVO)  
88 - throws IOException {  
89 - List<SysOperateLogDO> list = operateLogService.listOperateLogs(reqVO); 73 + public void exportOperateLog(HttpServletResponse response, @Valid SysOperateLogExportReqVO reqVO) throws IOException {
  74 + List<SysOperateLogDO> list = operateLogService.getOperateLogs(reqVO);
90 75
91 // 获得拼接需要的数据 76 // 获得拼接需要的数据
92 Collection<Long> userIds = CollectionUtils.convertList(list, SysOperateLogDO::getUserId); 77 Collection<Long> userIds = CollectionUtils.convertList(list, SysOperateLogDO::getUserId);
@@ -94,8 +79,7 @@ public class SysOperateLogController { @@ -94,8 +79,7 @@ public class SysOperateLogController {
94 // 拼接数据 79 // 拼接数据
95 List<SysOperateLogExcelVO> excelDataList = SysOperateLogConvert.INSTANCE.convertList(list, userMap); 80 List<SysOperateLogExcelVO> excelDataList = SysOperateLogConvert.INSTANCE.convertList(list, userMap);
96 // 输出 81 // 输出
97 - ExcelUtils.write(response, "操作日志.xls", "数据列表",  
98 - SysOperateLogExcelVO.class, excelDataList); 82 + ExcelUtils.write(response, "操作日志.xls", "数据列表", SysOperateLogExcelVO.class, excelDataList);
99 } 83 }
100 84
101 } 85 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/notice/SysNoticeController.java
@@ -11,62 +11,62 @@ import cn.iocoder.dashboard.modules.system.service.notice.SysNoticeService; @@ -11,62 +11,62 @@ import cn.iocoder.dashboard.modules.system.service.notice.SysNoticeService;
11 import io.swagger.annotations.Api; 11 import io.swagger.annotations.Api;
12 import io.swagger.annotations.ApiImplicitParam; 12 import io.swagger.annotations.ApiImplicitParam;
13 import io.swagger.annotations.ApiOperation; 13 import io.swagger.annotations.ApiOperation;
  14 +import org.springframework.security.access.prepost.PreAuthorize;
14 import org.springframework.validation.annotation.Validated; 15 import org.springframework.validation.annotation.Validated;
15 import org.springframework.web.bind.annotation.*; 16 import org.springframework.web.bind.annotation.*;
16 17
17 import javax.annotation.Resource; 18 import javax.annotation.Resource;
  19 +import javax.validation.Valid;
18 20
19 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 21 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
20 22
21 @Api(tags = "通知公告") 23 @Api(tags = "通知公告")
22 @RestController 24 @RestController
23 @RequestMapping("/system/notice") 25 @RequestMapping("/system/notice")
  26 +@Validated
24 public class SysNoticeController { 27 public class SysNoticeController {
25 28
26 @Resource 29 @Resource
27 private SysNoticeService noticeService; 30 private SysNoticeService noticeService;
28 31
29 - @ApiOperation("获取通知公告列表")  
30 - @GetMapping("/page")  
31 -// @PreAuthorize("@ss.hasPermi('system:notice:list')")  
32 - public CommonResult<PageResult<SysNoticeRespVO>> pageNotices(@Validated SysNoticePageReqVO reqVO) {  
33 - return success(SysNoticeConvert.INSTANCE.convertPage(noticeService.pageNotices(reqVO)));  
34 - }  
35 -  
36 - @ApiOperation("获得通知公告")  
37 - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)  
38 -// @PreAuthorize("@ss.hasPermi('system:notice:query')")  
39 - @GetMapping(value = "/get")  
40 - public CommonResult<SysNoticeRespVO> getNotice(@RequestParam("id") Long id) {  
41 - return success(SysNoticeConvert.INSTANCE.convert(noticeService.getNotice(id)));  
42 - }  
43 -  
44 - @ApiOperation("新增通知公告")  
45 -// @PreAuthorize("@ss.hasPermi('system:notice:add')")  
46 -// @Log(title = "通知公告", businessType = BusinessType.INSERT)  
47 @PostMapping("/create") 32 @PostMapping("/create")
48 - public CommonResult<Long> createNotice(@Validated @RequestBody SysNoticeCreateReqVO reqVO) { 33 + @ApiOperation("创建通知公告")
  34 + @PreAuthorize("@ss.hasPermission('system:notice:create')")
  35 + public CommonResult<Long> createNotice(@Valid @RequestBody SysNoticeCreateReqVO reqVO) {
49 Long noticeId = noticeService.createNotice(reqVO); 36 Long noticeId = noticeService.createNotice(reqVO);
50 return success(noticeId); 37 return success(noticeId);
51 } 38 }
52 39
  40 + @PutMapping("/update")
53 @ApiOperation("修改通知公告") 41 @ApiOperation("修改通知公告")
54 -// @PreAuthorize("@ss.hasPermi('system:notice:edit')")  
55 -// @Log(title = "通知公告", businessType = BusinessType.UPDATE)  
56 - @PostMapping("/update")  
57 - public CommonResult<Boolean> updateNotice(@Validated @RequestBody SysNoticeUpdateReqVO reqVO) { 42 + @PreAuthorize("@ss.hasPermission('system:notice:update')")
  43 + public CommonResult<Boolean> updateNotice(@Valid @RequestBody SysNoticeUpdateReqVO reqVO) {
58 noticeService.updateNotice(reqVO); 44 noticeService.updateNotice(reqVO);
59 return success(true); 45 return success(true);
60 } 46 }
61 47
  48 + @DeleteMapping("/delete")
62 @ApiOperation("删除通知公告") 49 @ApiOperation("删除通知公告")
63 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) 50 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
64 -// @PreAuthorize("@ss.hasPermi('system:notice:remove')")  
65 -// @Log(title = "通知公告", businessType = BusinessType.DELETE)  
66 - @PostMapping("/delete") 51 + @PreAuthorize("@ss.hasPermission('system:notice:delete')")
67 public CommonResult<Boolean> deleteNotice(@RequestParam("id") Long id) { 52 public CommonResult<Boolean> deleteNotice(@RequestParam("id") Long id) {
68 noticeService.deleteNotice(id); 53 noticeService.deleteNotice(id);
69 return success(true); 54 return success(true);
70 } 55 }
71 56
  57 + @GetMapping("/page")
  58 + @ApiOperation("获取通知公告列表")
  59 + @PreAuthorize("@ss.hasPermission('system:notice:quey')")
  60 + public CommonResult<PageResult<SysNoticeRespVO>> pageNotices(@Validated SysNoticePageReqVO reqVO) {
  61 + return success(SysNoticeConvert.INSTANCE.convertPage(noticeService.pageNotices(reqVO)));
  62 + }
  63 +
  64 + @GetMapping("/get")
  65 + @ApiOperation("获得通知公告")
  66 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  67 + @PreAuthorize("@ss.hasPermission('system:notice:quey')")
  68 + public CommonResult<SysNoticeRespVO> getNotice(@RequestParam("id") Long id) {
  69 + return success(SysNoticeConvert.INSTANCE.convert(noticeService.getNotice(id)));
  70 + }
  71 +
72 } 72 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.java
@@ -9,10 +9,12 @@ import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; @@ -9,10 +9,12 @@ import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService;
9 import io.swagger.annotations.Api; 9 import io.swagger.annotations.Api;
10 import io.swagger.annotations.ApiImplicitParam; 10 import io.swagger.annotations.ApiImplicitParam;
11 import io.swagger.annotations.ApiOperation; 11 import io.swagger.annotations.ApiOperation;
  12 +import org.springframework.security.access.prepost.PreAuthorize;
12 import org.springframework.validation.annotation.Validated; 13 import org.springframework.validation.annotation.Validated;
13 import org.springframework.web.bind.annotation.*; 14 import org.springframework.web.bind.annotation.*;
14 15
15 import javax.annotation.Resource; 16 import javax.annotation.Resource;
  17 +import javax.validation.Valid;
16 import java.util.Comparator; 18 import java.util.Comparator;
17 import java.util.List; 19 import java.util.List;
18 20
@@ -21,78 +23,64 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success; @@ -21,78 +23,64 @@ import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
21 @Api(tags = "菜单") 23 @Api(tags = "菜单")
22 @RestController 24 @RestController
23 @RequestMapping("/system/menu") 25 @RequestMapping("/system/menu")
  26 +@Validated
24 public class SysMenuController { 27 public class SysMenuController {
25 28
26 @Resource 29 @Resource
27 private SysMenuService menuService; 30 private SysMenuService menuService;
28 31
29 - @ApiOperation("获取菜单列表")  
30 -// @PreAuthorize("@ss.hasPermi('system:menu:list')") 32 + @PostMapping("/create")
  33 + @ApiOperation("创建菜单")
  34 + @PreAuthorize("@ss.hasPermission('system:menu:create')")
  35 + public CommonResult<Long> createMenu(@Valid @RequestBody SysMenuCreateReqVO reqVO) {
  36 + Long menuId = menuService.createMenu(reqVO);
  37 + return success(menuId);
  38 + }
  39 +
  40 + @PutMapping("/update")
  41 + @ApiOperation("修改菜单")
  42 + @PreAuthorize("@ss.hasPermission('system:menu:update')")
  43 + public CommonResult<Boolean> updateMenu(@Valid @RequestBody SysMenuUpdateReqVO reqVO) {
  44 + menuService.updateMenu(reqVO);
  45 + return success(true);
  46 + }
  47 +
  48 + @DeleteMapping("/delete")
  49 + @ApiOperation("删除菜单")
  50 + @ApiImplicitParam(name = "id", value = "角色编号", required= true, example = "1024", dataTypeClass = Long.class)
  51 + @PreAuthorize("@ss.hasPermission('system:menu:delete')")
  52 + public CommonResult<Boolean> deleteMenu(@RequestParam("id") Long id) {
  53 + menuService.deleteMenu(id);
  54 + return success(true);
  55 + }
  56 +
31 @GetMapping("/list") 57 @GetMapping("/list")
32 - public CommonResult<List<SysMenuRespVO>> listMenus(SysMenuListReqVO reqVO) {  
33 - List<SysMenuDO> list = menuService.listMenus(reqVO); 58 + @ApiOperation("获取菜单列表")
  59 + @PreAuthorize("@ss.hasPermission('system:menu:query')")
  60 + public CommonResult<List<SysMenuRespVO>> getMenus(SysMenuListReqVO reqVO) {
  61 + List<SysMenuDO> list = menuService.getMenus(reqVO);
34 list.sort(Comparator.comparing(SysMenuDO::getSort)); 62 list.sort(Comparator.comparing(SysMenuDO::getSort));
35 return success(SysMenuConvert.INSTANCE.convertList(list)); 63 return success(SysMenuConvert.INSTANCE.convertList(list));
36 } 64 }
37 65
38 - @ApiOperation(value = "获取菜单精简信息列表", notes = "只包含被开启的菜单,主要用于前端的下拉选项")  
39 @GetMapping("/list-all-simple") 66 @GetMapping("/list-all-simple")
40 - public CommonResult<List<SysMenuSimpleRespVO>> listSimpleMenus() { 67 + @ApiOperation(value = "获取菜单精简信息列表", notes = "只包含被开启的菜单,主要用于前端的下拉选项")
  68 + public CommonResult<List<SysMenuSimpleRespVO>> getSimpleMenus() {
41 // 获得菜单列表,只要开启状态的 69 // 获得菜单列表,只要开启状态的
42 SysMenuListReqVO reqVO = new SysMenuListReqVO(); 70 SysMenuListReqVO reqVO = new SysMenuListReqVO();
43 reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus()); 71 reqVO.setStatus(CommonStatusEnum.ENABLE.getStatus());
44 - List<SysMenuDO> list = menuService.listMenus(reqVO); 72 + List<SysMenuDO> list = menuService.getMenus(reqVO);
45 // 排序后,返回个诶前端 73 // 排序后,返回个诶前端
46 list.sort(Comparator.comparing(SysMenuDO::getSort)); 74 list.sort(Comparator.comparing(SysMenuDO::getSort));
47 return success(SysMenuConvert.INSTANCE.convertList02(list)); 75 return success(SysMenuConvert.INSTANCE.convertList02(list));
48 } 76 }
49 77
50 - @ApiOperation("获取菜单信息")  
51 @GetMapping("/get") 78 @GetMapping("/get")
52 -// @PreAuthorize("@ss.hasPermi('system:menu:query')") 79 + @ApiOperation("获取菜单信息")
  80 + @PreAuthorize("@ss.hasPermission('system:menu:query')")
53 public CommonResult<SysMenuRespVO> getMenu(Long id) { 81 public CommonResult<SysMenuRespVO> getMenu(Long id) {
54 SysMenuDO menu = menuService.getMenu(id); 82 SysMenuDO menu = menuService.getMenu(id);
55 return success(SysMenuConvert.INSTANCE.convert(menu)); 83 return success(SysMenuConvert.INSTANCE.convert(menu));
56 } 84 }
57 85
58 -// /**  
59 -// * 加载对应角色菜单列表树  
60 -// */  
61 -// @GetMapping(value = "/roleMenuTreeselect/{roleId}")  
62 -// public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) {  
63 -// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());  
64 -// List<SysMenu> menus = menuService.selectMenuList(loginUser.getUser().getUserId());  
65 -// AjaxResult ajax = AjaxResult.success();  
66 -// ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));  
67 -// ajax.put("menus", menuService.buildMenuTreeSelect(menus));  
68 -// return ajax;  
69 -// }  
70 -  
71 - @ApiOperation("创建菜单")  
72 -// @PreAuthorize("@ss.hasPermi('system:menu:add')")  
73 -// @Log(title = "菜单管理", businessType = BusinessType.INSERT)  
74 - @PostMapping("/create")  
75 - public CommonResult<Long> createMenu(@Validated @RequestBody SysMenuCreateReqVO reqVO) {  
76 - Long menuId = menuService.createMenu(reqVO);  
77 - return success(menuId);  
78 - }  
79 -  
80 - @ApiOperation("修改菜单")  
81 -// @PreAuthorize("@ss.hasPermi('system:menu:edit')")  
82 -// @Log(title = "菜单管理", businessType = BusinessType.UPDATE)  
83 - @PostMapping("/update")  
84 - public CommonResult<Boolean> updateMenu(@Validated @RequestBody SysMenuUpdateReqVO reqVO) {  
85 - menuService.updateMenu(reqVO);  
86 - return success(true);  
87 - }  
88 -  
89 - @ApiOperation("删除菜单")  
90 - @PostMapping("/delete")  
91 - @ApiImplicitParam(name = "id", value = "角色编号", required= true, example = "1024", dataTypeClass = Long.class)  
92 -// @Log(title = "菜单管理", businessType = BusinessType.DELETE)  
93 - public CommonResult<Boolean> deleteMenu(@RequestParam("id") Long id) {  
94 - menuService.deleteMenu(id);  
95 - return success(true);  
96 - }  
97 -  
98 } 86 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.java
@@ -4,6 +4,7 @@ import cn.iocoder.dashboard.common.enums.CommonStatusEnum; @@ -4,6 +4,7 @@ import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 import cn.iocoder.dashboard.common.pojo.CommonResult; 4 import cn.iocoder.dashboard.common.pojo.CommonResult;
5 import cn.iocoder.dashboard.common.pojo.PageResult; 5 import cn.iocoder.dashboard.common.pojo.PageResult;
6 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; 6 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
  7 +import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
7 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.*; 8 import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.*;
8 import cn.iocoder.dashboard.modules.system.convert.permission.SysRoleConvert; 9 import cn.iocoder.dashboard.modules.system.convert.permission.SysRoleConvert;
9 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; 10 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO;
@@ -11,96 +12,95 @@ import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; @@ -11,96 +12,95 @@ import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
11 import io.swagger.annotations.Api; 12 import io.swagger.annotations.Api;
12 import io.swagger.annotations.ApiImplicitParam; 13 import io.swagger.annotations.ApiImplicitParam;
13 import io.swagger.annotations.ApiOperation; 14 import io.swagger.annotations.ApiOperation;
  15 +import org.springframework.security.access.prepost.PreAuthorize;
14 import org.springframework.validation.annotation.Validated; 16 import org.springframework.validation.annotation.Validated;
15 import org.springframework.web.bind.annotation.*; 17 import org.springframework.web.bind.annotation.*;
16 18
17 import javax.annotation.Resource; 19 import javax.annotation.Resource;
18 import javax.servlet.http.HttpServletResponse; 20 import javax.servlet.http.HttpServletResponse;
  21 +import javax.validation.Valid;
19 import java.io.IOException; 22 import java.io.IOException;
20 import java.util.Collections; 23 import java.util.Collections;
21 import java.util.Comparator; 24 import java.util.Comparator;
22 import java.util.List; 25 import java.util.List;
23 26
24 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 27 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  28 +import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT;
25 29
26 @Api(tags = "角色") 30 @Api(tags = "角色")
27 @RestController 31 @RestController
28 @RequestMapping("/system/role") 32 @RequestMapping("/system/role")
  33 +@Validated
29 public class SysRoleController { 34 public class SysRoleController {
30 35
31 @Resource 36 @Resource
32 private SysRoleService roleService; 37 private SysRoleService roleService;
33 38
34 - @ApiOperation("获得角色分页")  
35 - @GetMapping("/page")  
36 -// @PreAuthorize("@ss.hasPermi('system:role:list')")  
37 - public CommonResult<PageResult<SysRoleDO>> list(SysRolePageReqVO reqVO) {  
38 - return success(roleService.pageRole(reqVO));  
39 - }  
40 -  
41 - @ApiOperation(value = "获取角色精简信息列表", notes = "只包含被开启的角色,主要用于前端的下拉选项")  
42 - @GetMapping("/list-all-simple")  
43 - public CommonResult<List<SysRoleSimpleRespVO>> listSimpleRoles() {  
44 - // 获得角色列表,只要开启状态的  
45 - List<SysRoleDO> list = roleService.listRoles(Collections.singleton(CommonStatusEnum.ENABLE.getStatus()));  
46 - // 排序后,返回个诶前端  
47 - list.sort(Comparator.comparing(SysRoleDO::getSort));  
48 - return success(SysRoleConvert.INSTANCE.convertList02(list));  
49 - }  
50 -  
51 - @ApiOperation("创建角色")  
52 @PostMapping("/create") 39 @PostMapping("/create")
53 -// @PreAuthorize("@ss.hasPermi('system:role:add')")  
54 -// @Log(title = "角色管理", businessType = BusinessType.INSERT)  
55 - public CommonResult<Long> add(@Validated @RequestBody SysRoleCreateReqVO reqVO) { 40 + @ApiOperation("创建角色")
  41 + @PreAuthorize("@ss.hasPermission('system:role:create')")
  42 + public CommonResult<Long> createRole(@Valid @RequestBody SysRoleCreateReqVO reqVO) {
56 return success(roleService.createRole(reqVO)); 43 return success(roleService.createRole(reqVO));
57 } 44 }
58 45
  46 + @PutMapping("/update")
59 @ApiOperation("修改角色") 47 @ApiOperation("修改角色")
60 -// @PreAuthorize("@ss.hasPermi('system:role:edit')")  
61 -// @Log(title = "角色管理", businessType = BusinessType.UPDATE)  
62 - @PostMapping("/update")  
63 - public CommonResult<Boolean> update(@Validated @RequestBody SysRoleUpdateReqVO reqVO) { 48 + @PreAuthorize("@ss.hasPermission('system:role:update')")
  49 + public CommonResult<Boolean> updateRole(@Valid @RequestBody SysRoleUpdateReqVO reqVO) {
64 roleService.updateRole(reqVO); 50 roleService.updateRole(reqVO);
65 return success(true); 51 return success(true);
66 } 52 }
67 53
  54 + @PutMapping("/update-status")
  55 + @ApiOperation("修改角色状态")
  56 + @PreAuthorize("@ss.hasPermission('system:role:update')")
  57 + public CommonResult<Boolean> updateRoleStatus(@Valid @RequestBody SysRoleUpdateStatusReqVO reqVO) {
  58 + roleService.updateRoleStatus(reqVO.getId(), reqVO.getStatus());
  59 + return success(true);
  60 + }
  61 +
  62 + @DeleteMapping("/delete")
68 @ApiOperation("删除角色") 63 @ApiOperation("删除角色")
69 - @PostMapping("/delete")  
70 @ApiImplicitParam(name = "id", value = "角色编号", required = true, example = "1024", dataTypeClass = Long.class) 64 @ApiImplicitParam(name = "id", value = "角色编号", required = true, example = "1024", dataTypeClass = Long.class)
71 -// @PreAuthorize("@ss.hasPermi('system:role:remove')")  
72 -// @Log(title = "角色管理", businessType = BusinessType.DELETE) 65 + @PreAuthorize("@ss.hasPermission('system:role:delete')")
73 public CommonResult<Boolean> deleteRole(@RequestParam("id") Long id) { 66 public CommonResult<Boolean> deleteRole(@RequestParam("id") Long id) {
74 roleService.deleteRole(id); 67 roleService.deleteRole(id);
75 return success(true); 68 return success(true);
76 } 69 }
77 70
78 - @ApiOperation("获得角色信息")  
79 @GetMapping("/get") 71 @GetMapping("/get")
80 -// @PreAuthorize("@ss.hasPermi('system:role:query')") 72 + @ApiOperation("获得角色信息")
  73 + @PreAuthorize("@ss.hasPermission('system:role:query')")
81 public CommonResult<SysRoleRespVO> getRole(@RequestParam("id") Long id) { 74 public CommonResult<SysRoleRespVO> getRole(@RequestParam("id") Long id) {
82 SysRoleDO role = roleService.getRole(id); 75 SysRoleDO role = roleService.getRole(id);
83 return success(SysRoleConvert.INSTANCE.convert(role)); 76 return success(SysRoleConvert.INSTANCE.convert(role));
84 } 77 }
85 78
86 - @ApiOperation("修改角色状态")  
87 - @PostMapping("/update-status")  
88 -// @PreAuthorize("@ss.hasPermi('system:role:edit')")  
89 -// @Log(title = "角色管理", businessType = BusinessType.UPDATE)  
90 - public CommonResult<Boolean> updateRoleStatus(@Validated @RequestBody SysRoleUpdateStatusReqVO reqVO) {  
91 - roleService.updateRoleStatus(reqVO.getId(), reqVO.getStatus());  
92 - return success(true); 79 + @GetMapping("/page")
  80 + @ApiOperation("获得角色分页")
  81 + @PreAuthorize("@ss.hasPermission('system:role:query')")
  82 + public CommonResult<PageResult<SysRoleDO>> getRolePage(SysRolePageReqVO reqVO) {
  83 + return success(roleService.getRolePage(reqVO));
  84 + }
  85 +
  86 + @GetMapping("/list-all-simple")
  87 + @ApiOperation(value = "获取角色精简信息列表", notes = "只包含被开启的角色,主要用于前端的下拉选项")
  88 + public CommonResult<List<SysRoleSimpleRespVO>> getSimpleRoles() {
  89 + // 获得角色列表,只要开启状态的
  90 + List<SysRoleDO> list = roleService.getRoles(Collections.singleton(CommonStatusEnum.ENABLE.getStatus()));
  91 + // 排序后,返回个诶前端
  92 + list.sort(Comparator.comparing(SysRoleDO::getSort));
  93 + return success(SysRoleConvert.INSTANCE.convertList02(list));
93 } 94 }
94 95
95 @GetMapping("/export") 96 @GetMapping("/export")
96 -// @Log(title = "角色管理", businessType = BusinessType.EXPORT)  
97 -// @PreAuthorize("@ss.hasPermi('system:role:export')") 97 + @OperateLog(type = EXPORT)
  98 + @PreAuthorize("@ss.hasPermission('system:role:export')")
98 public void export(HttpServletResponse response, @Validated SysRoleExportReqVO reqVO) throws IOException { 99 public void export(HttpServletResponse response, @Validated SysRoleExportReqVO reqVO) throws IOException {
99 - List<SysRoleDO> list = roleService.listRoles(reqVO);  
100 - List<SysRoleExcelVO> excelDataList = SysRoleConvert.INSTANCE.convertList03(list); 100 + List<SysRoleDO> list = roleService.getRoles(reqVO);
  101 + List<SysRoleExcelVO> data = SysRoleConvert.INSTANCE.convertList03(list);
101 // 输出 102 // 输出
102 - ExcelUtils.write(response, "角色数据.xls", "角色列表",  
103 - SysRoleExcelVO.class, excelDataList); 103 + ExcelUtils.write(response, "角色数据.xls", "角色列表", SysRoleExcelVO.class, data);
104 } 104 }
105 105
106 } 106 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserController.java
@@ -5,6 +5,7 @@ import cn.iocoder.dashboard.common.enums.CommonStatusEnum; @@ -5,6 +5,7 @@ import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
5 import cn.iocoder.dashboard.common.pojo.CommonResult; 5 import cn.iocoder.dashboard.common.pojo.CommonResult;
6 import cn.iocoder.dashboard.common.pojo.PageResult; 6 import cn.iocoder.dashboard.common.pojo.PageResult;
7 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils; 7 import cn.iocoder.dashboard.framework.excel.core.util.ExcelUtils;
  8 +import cn.iocoder.dashboard.framework.logger.operatelog.core.annotations.OperateLog;
8 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*; 9 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*;
9 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; 10 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
10 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; 11 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO;
@@ -25,14 +26,17 @@ import org.springframework.web.multipart.MultipartFile; @@ -25,14 +26,17 @@ import org.springframework.web.multipart.MultipartFile;
25 26
26 import javax.annotation.Resource; 27 import javax.annotation.Resource;
27 import javax.servlet.http.HttpServletResponse; 28 import javax.servlet.http.HttpServletResponse;
  29 +import javax.validation.Valid;
28 import java.io.IOException; 30 import java.io.IOException;
29 import java.util.*; 31 import java.util.*;
30 32
31 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 33 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  34 +import static cn.iocoder.dashboard.framework.logger.operatelog.core.enums.OperateTypeEnum.EXPORT;
32 35
33 @Api(tags = "用户") 36 @Api(tags = "用户")
34 @RestController 37 @RestController
35 @RequestMapping("/system/user") 38 @RequestMapping("/system/user")
  39 +@Validated
36 public class SysUserController { 40 public class SysUserController {
37 41
38 @Resource 42 @Resource
@@ -40,12 +44,53 @@ public class SysUserController { @@ -40,12 +44,53 @@ public class SysUserController {
40 @Resource 44 @Resource
41 private SysDeptService deptService; 45 private SysDeptService deptService;
42 46
  47 + @PostMapping("/create")
  48 + @ApiOperation("新增用户")
  49 + @PreAuthorize("@ss.hasPermission('system:user:create')")
  50 + public CommonResult<Long> createUser(@Valid @RequestBody SysUserCreateReqVO reqVO) {
  51 + Long id = userService.createUser(reqVO);
  52 + return success(id);
  53 + }
  54 +
  55 + @PutMapping("update")
  56 + @ApiOperation("修改用户")
  57 + @PreAuthorize("@ss.hasPermission('system:user:update')")
  58 + public CommonResult<Boolean> updateUser(@Valid @RequestBody SysUserUpdateReqVO reqVO) {
  59 + userService.updateUser(reqVO);
  60 + return success(true);
  61 + }
  62 +
  63 + @DeleteMapping("/delete")
  64 + @ApiOperation("删除用户")
  65 + @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
  66 + @PreAuthorize("@ss.hasPermission('system:user:delete')")
  67 + public CommonResult<Boolean> deleteUser(@RequestParam("id") Long id) {
  68 + userService.deleteUser(id);
  69 + return success(true);
  70 + }
  71 +
  72 + @PutMapping("/update-password")
  73 + @ApiOperation("重置用户密码")
  74 + @PreAuthorize("@ss.hasPermission('system:user:update-password')")
  75 + public CommonResult<Boolean> updateUserPassword(@Valid @RequestBody SysUserUpdatePasswordReqVO reqVO) {
  76 + userService.updateUserPassword(reqVO.getId(), reqVO.getPassword());
  77 + return success(true);
  78 + }
  79 +
  80 + @PutMapping("/update-status")
  81 + @ApiOperation("修改用户状态")
  82 + @PreAuthorize("@ss.hasPermission('system:user:update')")
  83 + public CommonResult<Boolean> updateUserStatus(@Valid @RequestBody SysUserUpdateStatusReqVO reqVO) {
  84 + userService.updateUserStatus(reqVO.getId(), reqVO.getStatus());
  85 + return success(true);
  86 + }
  87 +
43 @GetMapping("/page") 88 @GetMapping("/page")
44 @ApiOperation("获得用户分页列表") 89 @ApiOperation("获得用户分页列表")
45 @PreAuthorize("@ss.hasPermission('system:user:list')") 90 @PreAuthorize("@ss.hasPermission('system:user:list')")
46 - public CommonResult<PageResult<SysUserPageItemRespVO>> pageUsers(@Validated SysUserPageReqVO reqVO) { 91 + public CommonResult<PageResult<SysUserPageItemRespVO>> getUserPage(@Valid SysUserPageReqVO reqVO) {
47 // 获得用户分页列表 92 // 获得用户分页列表
48 - PageResult<SysUserDO> pageResult = userService.pageUsers(reqVO); 93 + PageResult<SysUserDO> pageResult = userService.getUserPage(reqVO);
49 if (CollUtil.isEmpty(pageResult.getList())) { 94 if (CollUtil.isEmpty(pageResult.getList())) {
50 return success(new PageResult<>(pageResult.getTotal())); // 返回空 95 return success(new PageResult<>(pageResult.getTotal())); // 返回空
51 } 96 }
@@ -63,71 +108,22 @@ public class SysUserController { @@ -63,71 +108,22 @@ public class SysUserController {
63 return success(new PageResult<>(userList, pageResult.getTotal())); 108 return success(new PageResult<>(userList, pageResult.getTotal()));
64 } 109 }
65 110
66 - /**  
67 - * 根据用户编号获取详细信息  
68 - */  
69 @GetMapping("/get") 111 @GetMapping("/get")
70 @ApiOperation("获得用户详情") 112 @ApiOperation("获得用户详情")
71 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class) 113 @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)
72 -// @PreAuthorize("@ss.hasPermi('system:user:query')") 114 + @PreAuthorize("@ss.hasPermission('system:user:query')")
73 public CommonResult<SysUserRespVO> getInfo(@RequestParam("id") Long id) { 115 public CommonResult<SysUserRespVO> getInfo(@RequestParam("id") Long id) {
74 return success(SysUserConvert.INSTANCE.convert(userService.getUser(id))); 116 return success(SysUserConvert.INSTANCE.convert(userService.getUser(id)));
75 } 117 }
76 118
77 - @ApiOperation("新增用户")  
78 - @PostMapping("/create")  
79 -// @PreAuthorize("@ss.hasPermi('system:user:add')")  
80 -// @Log(title = "用户管理", businessType = BusinessType.INSERT)  
81 - public CommonResult<Long> createUser(@Validated @RequestBody SysUserCreateReqVO reqVO) {  
82 - Long id = userService.createUser(reqVO);  
83 - return success(id);  
84 - }  
85 -  
86 - @ApiOperation("修改用户")  
87 - @PostMapping("update")  
88 -// @PreAuthorize("@ss.hasPermi('system:user:edit')")  
89 -// @Log(title = "用户管理", businessType = BusinessType.UPDATE)  
90 - public CommonResult<Boolean> updateUser(@Validated @RequestBody SysUserUpdateReqVO reqVO) {  
91 - userService.updateUser(reqVO);  
92 - return success(true);  
93 - }  
94 -  
95 - @ApiOperation("删除用户")  
96 - @ApiImplicitParam(name = "id", value = "编号", required = true, example = "1024", dataTypeClass = Long.class)  
97 - @PostMapping("/delete")  
98 -// @PreAuthorize("@ss.hasPermi('system:user:remove')")  
99 -// @Log(title = "用户管理", businessType = BusinessType.DELETE)  
100 - public CommonResult<Boolean> deleteUser(@RequestParam("id") Long id) {  
101 - userService.deleteUser(id);  
102 - return success(true);  
103 - }  
104 -  
105 - @ApiOperation("重置用户密码")  
106 - @PostMapping("/update-password")  
107 -// @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")  
108 -// @Log(title = "用户管理", businessType = BusinessType.UPDATE)  
109 - public CommonResult<Boolean> updateUserPassword(@Validated @RequestBody SysUserUpdatePasswordReqVO reqVO) {  
110 - userService.updateUserPassword(reqVO.getId(), reqVO.getPassword());  
111 - return success(true);  
112 - }  
113 -  
114 - @ApiOperation("修改用户状态")  
115 - @PostMapping("/update-status")  
116 -// @PreAuthorize("@ss.hasPermi('system:user:edit')")  
117 -// @Log(title = "用户管理", businessType = BusinessType.UPDATE)  
118 - public CommonResult<Boolean> updateUserStatus(@Validated @RequestBody SysUserUpdateStatusReqVO reqVO) {  
119 - userService.updateUserStatus(reqVO.getId(), reqVO.getStatus());  
120 - return success(true);  
121 - }  
122 -  
123 - @ApiOperation("导出用户")  
124 @GetMapping("/export") 119 @GetMapping("/export")
125 -// @PreAuthorize("@ss.hasPermi('system:user:export')") , @Validated SysUserExportReqVO reqVO  
126 -// @Log(title = "用户管理", businessType = BusinessType.EXPORT) 120 + @ApiOperation("导出用户")
  121 + @PreAuthorize("@ss.hasPermission('system:user:export')")
  122 + @OperateLog(type = EXPORT)
127 public void exportUsers(@Validated SysUserExportReqVO reqVO, 123 public void exportUsers(@Validated SysUserExportReqVO reqVO,
128 HttpServletResponse response) throws IOException { 124 HttpServletResponse response) throws IOException {
129 // 获得用户列表 125 // 获得用户列表
130 - List<SysUserDO> users = userService.listUsers(reqVO); 126 + List<SysUserDO> users = userService.getUsers(reqVO);
131 127
132 // 获得拼接需要的数据 128 // 获得拼接需要的数据
133 Collection<Long> deptIds = CollectionUtils.convertList(users, SysUserDO::getDeptId); 129 Collection<Long> deptIds = CollectionUtils.convertList(users, SysUserDO::getDeptId);
@@ -147,8 +143,8 @@ public class SysUserController { @@ -147,8 +143,8 @@ public class SysUserController {
147 ExcelUtils.write(response, "用户数据.xls", "用户列表", SysUserExcelVO.class, excelUsers); 143 ExcelUtils.write(response, "用户数据.xls", "用户列表", SysUserExcelVO.class, excelUsers);
148 } 144 }
149 145
150 - @ApiOperation("获得导入用户模板")  
151 @GetMapping("/get-import-template") 146 @GetMapping("/get-import-template")
  147 + @ApiOperation("获得导入用户模板")
152 public void importTemplate(HttpServletResponse response) throws IOException { 148 public void importTemplate(HttpServletResponse response) throws IOException {
153 // 手动创建导出 demo 149 // 手动创建导出 demo
154 List<SysUserImportExcelVO> list = Arrays.asList( 150 List<SysUserImportExcelVO> list = Arrays.asList(
@@ -159,21 +155,18 @@ public class SysUserController { @@ -159,21 +155,18 @@ public class SysUserController {
159 ); 155 );
160 156
161 // 输出 157 // 输出
162 - ExcelUtils.write(response, "用户导入模板.xls", "用户列表",  
163 - SysUserImportExcelVO.class, list);  
164 - 158 + ExcelUtils.write(response, "用户导入模板.xls", "用户列表", SysUserImportExcelVO.class, list);
165 } 159 }
166 160
  161 + @PostMapping("/import")
167 @ApiOperation("导入用户") 162 @ApiOperation("导入用户")
168 @ApiImplicitParams({ 163 @ApiImplicitParams({
169 @ApiImplicitParam(name = "file", value = "Excel 文件", required = true, dataTypeClass = MultipartFile.class), 164 @ApiImplicitParam(name = "file", value = "Excel 文件", required = true, dataTypeClass = MultipartFile.class),
170 @ApiImplicitParam(name = "updateSupport", value = "是否支持更新,默认为 false", example = "true", dataTypeClass = Boolean.class) 165 @ApiImplicitParam(name = "updateSupport", value = "是否支持更新,默认为 false", example = "true", dataTypeClass = Boolean.class)
171 }) 166 })
172 - @PostMapping("/import")  
173 -// @Log(title = "用户管理", businessType = BusinessType.IMPORT)  
174 -// @PreAuthorize("@ss.hasPermi('system:user:import')") 167 + @PreAuthorize("@ss.hasPermission('system:user:import')")
175 public CommonResult<SysUserImportRespVO> importExcel(@RequestParam("file") MultipartFile file, 168 public CommonResult<SysUserImportRespVO> importExcel(@RequestParam("file") MultipartFile file,
176 - @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { 169 + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception {
177 List<SysUserImportExcelVO> list = ExcelUtils.raed(file, SysUserImportExcelVO.class); 170 List<SysUserImportExcelVO> list = ExcelUtils.raed(file, SysUserImportExcelVO.class);
178 return success(userService.importUsers(list, updateSupport)); 171 return success(userService.importUsers(list, updateSupport));
179 } 172 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/SysUserProfileController.java
1 package cn.iocoder.dashboard.modules.system.controller.user; 1 package cn.iocoder.dashboard.modules.system.controller.user;
2 2
  3 +import cn.hutool.core.collection.CollUtil;
3 import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; 4 import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
4 import cn.iocoder.dashboard.common.pojo.CommonResult; 5 import cn.iocoder.dashboard.common.pojo.CommonResult;
5 -import cn.iocoder.dashboard.framework.security.core.util.SecurityFrameworkUtils;  
6 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileRespVO;  
7 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO;  
8 -import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert; 6 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileRespVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
9 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; 9 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
  10 +import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO;
  11 +import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO;
10 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; 12 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO;
11 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 13 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
  14 +import cn.iocoder.dashboard.modules.system.service.dept.SysDeptService;
  15 +import cn.iocoder.dashboard.modules.system.service.dept.SysPostService;
12 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; 16 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
13 import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; 17 import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
14 import cn.iocoder.dashboard.modules.system.service.user.SysUserService; 18 import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
15 -import cn.iocoder.dashboard.util.collection.CollectionUtils;  
16 import io.swagger.annotations.Api; 19 import io.swagger.annotations.Api;
17 import io.swagger.annotations.ApiOperation; 20 import io.swagger.annotations.ApiOperation;
18 import lombok.extern.slf4j.Slf4j; 21 import lombok.extern.slf4j.Slf4j;
19 -import org.springframework.web.bind.annotation.GetMapping;  
20 -import org.springframework.web.bind.annotation.PostMapping;  
21 -import org.springframework.web.bind.annotation.RequestBody;  
22 -import org.springframework.web.bind.annotation.RequestMapping;  
23 -import org.springframework.web.bind.annotation.RequestParam;  
24 -import org.springframework.web.bind.annotation.RestController; 22 +import org.springframework.validation.annotation.Validated;
  23 +import org.springframework.web.bind.annotation.*;
25 import org.springframework.web.multipart.MultipartFile; 24 import org.springframework.web.multipart.MultipartFile;
26 25
27 import javax.annotation.Resource; 26 import javax.annotation.Resource;
28 -import javax.servlet.http.HttpServletRequest; 27 +import javax.validation.Valid;
29 import java.io.IOException; 28 import java.io.IOException;
30 import java.util.List; 29 import java.util.List;
31 30
32 import static cn.iocoder.dashboard.common.pojo.CommonResult.success; 31 import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
  32 +import static cn.iocoder.dashboard.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
33 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY; 33 import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.FILE_IS_EMPTY;
34 34
35 /** 35 /**
36 * @author niudehua 36 * @author niudehua
37 */ 37 */
  38 +@Api(tags = "用户个人中心")
38 @RestController 39 @RestController
39 @RequestMapping("/system/user/profile") 40 @RequestMapping("/system/user/profile")
40 -@Api(tags = "用户个人中心") 41 +@Validated
41 @Slf4j 42 @Slf4j
42 public class SysUserProfileController { 43 public class SysUserProfileController {
43 44
44 @Resource 45 @Resource
45 private SysUserService userService; 46 private SysUserService userService;
46 @Resource 47 @Resource
  48 + private SysDeptService deptService;
  49 + @Resource
  50 + private SysPostService postService;
  51 + @Resource
47 private SysPermissionService permissionService; 52 private SysPermissionService permissionService;
48 @Resource 53 @Resource
49 private SysRoleService roleService; 54 private SysRoleService roleService;
@@ -51,30 +56,47 @@ public class SysUserProfileController { @@ -51,30 +56,47 @@ public class SysUserProfileController {
51 @GetMapping("/get") 56 @GetMapping("/get")
52 @ApiOperation("获得登录用户信息") 57 @ApiOperation("获得登录用户信息")
53 public CommonResult<SysUserProfileRespVO> profile() { 58 public CommonResult<SysUserProfileRespVO> profile() {
54 - // 获取用户信息  
55 - Long userId = SecurityFrameworkUtils.getLoginUserId();  
56 - SysUserDO user = userService.getUser(userId);  
57 - SysUserProfileRespVO userProfileRespVO = SysUserConvert.INSTANCE.convert03(user);  
58 - List<SysRoleDO> userRoles = roleService.listRolesFromCache(permissionService.listUserRoleIs(userId));  
59 - userProfileRespVO.setRoles(CollectionUtils.convertSet(userRoles, SysUserConvert.INSTANCE::convert));  
60 - return success(userProfileRespVO); 59 + // 获得用户基本信息
  60 + SysUserDO user = userService.getUser(getLoginUserId());
  61 + SysUserProfileRespVO resp = SysUserConvert.INSTANCE.convert03(user);
  62 + // 获得用户角色
  63 + List<SysRoleDO> userRoles = roleService.getRolesFromCache(permissionService.listUserRoleIs(user.getId()));
  64 + resp.setRoles(SysUserConvert.INSTANCE.convertList(userRoles));
  65 + // 获得部门信息
  66 + if (user.getDeptId() != null) {
  67 + SysDeptDO dept = deptService.getDept(user.getDeptId());
  68 + resp.setDept(SysUserConvert.INSTANCE.convert02(dept));
  69 + }
  70 + // 获得岗位信息
  71 + if (CollUtil.isNotEmpty(user.getPostIds())) {
  72 + List<SysPostDO> posts = postService.getPosts(user.getPostIds());
  73 + resp.setPosts(SysUserConvert.INSTANCE.convertList02(posts));
  74 + }
  75 + return success(resp);
61 } 76 }
62 77
63 - @PostMapping("/update") 78 + @PutMapping("/update")
64 @ApiOperation("修改用户个人信息") 79 @ApiOperation("修改用户个人信息")
65 - public CommonResult<Boolean> updateProfile(@RequestBody SysUserProfileUpdateReqVO reqVO, HttpServletRequest request) {  
66 - userService.updateUserProfile(reqVO);  
67 - SecurityFrameworkUtils.setLoginUser(SysAuthConvert.INSTANCE.convert(reqVO), request); 80 + public CommonResult<Boolean> updateUserProfile(@Valid @RequestBody SysUserProfileUpdateReqVO reqVO) {
  81 + userService.updateUserProfile(getLoginUserId(), reqVO);
68 return success(true); 82 return success(true);
69 } 83 }
70 84
71 - @PostMapping("/upload-avatar") 85 + @PutMapping("/update-password")
  86 + @ApiOperation("修改用户个人密码")
  87 + public CommonResult<Boolean> updateUserProfilePassword(@Valid @RequestBody SysUserProfileUpdatePasswordReqVO reqVO) {
  88 + userService.updateUserPassword(getLoginUserId(), reqVO);
  89 + return success(true);
  90 + }
  91 +
  92 + @PutMapping("/upload-avatar")
72 @ApiOperation("上传用户个人头像") 93 @ApiOperation("上传用户个人头像")
73 - public CommonResult<Boolean> uploadAvatar(@RequestParam("avatarFile") MultipartFile file) throws IOException { 94 + public CommonResult<Boolean> updateUserAvatar(@RequestParam("avatarFile") MultipartFile file) throws IOException {
74 if (file.isEmpty()) { 95 if (file.isEmpty()) {
75 throw ServiceExceptionUtil.exception(FILE_IS_EMPTY); 96 throw ServiceExceptionUtil.exception(FILE_IS_EMPTY);
76 } 97 }
77 - userService.updateAvatar(SecurityFrameworkUtils.getLoginUserId(), file.getInputStream()); 98 + userService.updateUserAvatar(getLoginUserId(), file.getInputStream());
78 return success(true); 99 return success(true);
79 } 100 }
  101 +
80 } 102 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileRespVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.user.vo.profile;
  2 +
  3 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserBaseVO;
  4 +import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
  6 +import lombok.AllArgsConstructor;
  7 +import lombok.Data;
  8 +import lombok.EqualsAndHashCode;
  9 +import lombok.NoArgsConstructor;
  10 +
  11 +import java.util.Date;
  12 +import java.util.List;
  13 +
  14 +
  15 +@Data
  16 +@EqualsAndHashCode(callSuper = true)
  17 +@NoArgsConstructor
  18 +@AllArgsConstructor
  19 +@ApiModel("用户个人中心信息 Response VO")
  20 +public class SysUserProfileRespVO extends SysUserBaseVO {
  21 +
  22 + @ApiModelProperty(value = "用户编号", required = true, example = "1")
  23 + private Long id;
  24 +
  25 + @ApiModelProperty(value = "状态", required = true, example = "1", notes = "参见 SysCommonStatusEnum 枚举类")
  26 + private Integer status;
  27 +
  28 + @ApiModelProperty(value = "最后登陆 IP", required = true, example = "192.168.1.1")
  29 + private String loginIp;
  30 +
  31 + @ApiModelProperty(value = "最后登录时间", required = true, example = "时间戳格式")
  32 + private Date loginDate;
  33 +
  34 + @ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
  35 + private Date createTime;
  36 +
  37 + /**
  38 + * 所属角色
  39 + */
  40 + private List<Role> roles;
  41 +
  42 + /**
  43 + * 所在部门
  44 + */
  45 + private Dept dept;
  46 +
  47 + /**
  48 + * 所属岗位数组
  49 + */
  50 + private List<Post> posts;
  51 +
  52 + @ApiModel("角色")
  53 + @Data
  54 + public static class Role {
  55 +
  56 + @ApiModelProperty(value = "角色编号", required = true, example = "1")
  57 + private Long id;
  58 +
  59 + @ApiModelProperty(value = "角色名称", required = true, example = "普通角色")
  60 + private String name;
  61 +
  62 + }
  63 +
  64 + @ApiModel("部门")
  65 + @Data
  66 + public static class Dept {
  67 +
  68 + @ApiModelProperty(value = "部门编号", required = true, example = "1")
  69 + private Long id;
  70 +
  71 + @ApiModelProperty(value = "部门名称", required = true, example = "研发部")
  72 + private String name;
  73 +
  74 + }
  75 +
  76 + @ApiModel("岗位")
  77 + @Data
  78 + public static class Post {
  79 +
  80 + @ApiModelProperty(value = "岗位编号", required = true, example = "1")
  81 + private Long id;
  82 +
  83 + @ApiModelProperty(value = "岗位名称", required = true, example = "开发")
  84 + private String name;
  85 +
  86 + }
  87 +
  88 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdatePasswordReqVO.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.controller.user.vo.profile;
  2 +
  3 +import io.swagger.annotations.ApiModel;
  4 +import io.swagger.annotations.ApiModelProperty;
  5 +import lombok.Data;
  6 +import org.hibernate.validator.constraints.Length;
  7 +
  8 +import javax.validation.constraints.NotEmpty;
  9 +
  10 +@ApiModel("用户个人中心更新密码 Request VO")
  11 +@Data
  12 +public class SysUserProfileUpdatePasswordReqVO {
  13 +
  14 + @ApiModelProperty(value = "旧密码", required = true, example = "123456")
  15 + @NotEmpty(message = "旧密码不能为空")
  16 + @Length(min = 4, max = 16, message = "密码长度为 4-16 位")
  17 + private String oldPassword;
  18 +
  19 + @ApiModelProperty(value = "新密码", required = true, example = "654321")
  20 + @NotEmpty(message = "新密码不能为空")
  21 + @Length(min = 4, max = 16, message = "密码长度为 4-16 位")
  22 + private String newPassword;
  23 +
  24 +}
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileUpdateReqVO.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/profile/SysUserProfileUpdateReqVO.java
1 -package cn.iocoder.dashboard.modules.system.controller.user.vo.user; 1 +package cn.iocoder.dashboard.modules.system.controller.user.vo.profile;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
4 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
5 import lombok.Data; 5 import lombok.Data;
6 6
7 import javax.validation.constraints.Email; 7 import javax.validation.constraints.Email;
8 -import javax.validation.constraints.NotNull; 8 +import javax.validation.constraints.Pattern;
9 import javax.validation.constraints.Size; 9 import javax.validation.constraints.Size;
10 10
11 @ApiModel("用户个人信息更新 Request VO") 11 @ApiModel("用户个人信息更新 Request VO")
12 @Data 12 @Data
13 public class SysUserProfileUpdateReqVO { 13 public class SysUserProfileUpdateReqVO {
14 14
15 - @ApiModelProperty(value = "用户编号", required = true, example = "1024")  
16 - @NotNull(message = "用户编号不能为空")  
17 - private Long id;  
18 -  
19 @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿") 15 @ApiModelProperty(value = "用户昵称", required = true, example = "芋艿")
20 @Size(max = 30, message = "用户昵称长度不能超过30个字符") 16 @Size(max = 30, message = "用户昵称长度不能超过30个字符")
21 private String nickname; 17 private String nickname;
22 18
23 @ApiModelProperty(value = "用户邮箱", example = "yudao@iocoder.cn") 19 @ApiModelProperty(value = "用户邮箱", example = "yudao@iocoder.cn")
24 @Email(message = "邮箱格式不正确") 20 @Email(message = "邮箱格式不正确")
25 - @Size(max = 50, message = "邮箱长度不能超过50个字符") 21 + @Size(max = 50, message = "邮箱长度不能超过 50 个字符")
26 private String email; 22 private String email;
27 23
28 @ApiModelProperty(value = "手机号码", example = "15601691300") 24 @ApiModelProperty(value = "手机号码", example = "15601691300")
29 - @Size(max = 11, message = "手机号码长度不能超过11个字符") 25 + @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手机号码格式错误")
30 private String mobile; 26 private String mobile;
31 27
32 @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类") 28 @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类")
33 private Integer sex; 29 private Integer sex;
34 30
35 - @ApiModelProperty(value = "用户头像", example = "http://www.iocoder.cn/xxx.png")  
36 - private String avatar;  
37 -  
38 - @ApiModelProperty(value = "旧密码", required = true, example = "123456")  
39 - private String oldPassword;  
40 -  
41 - @ApiModelProperty(value = "新密码", required = true, example = "654321")  
42 - private String newPassword;  
43 -  
44 } 31 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserBaseVO.java
@@ -5,6 +5,7 @@ import lombok.Data; @@ -5,6 +5,7 @@ import lombok.Data;
5 5
6 import javax.validation.constraints.Email; 6 import javax.validation.constraints.Email;
7 import javax.validation.constraints.NotBlank; 7 import javax.validation.constraints.NotBlank;
  8 +import javax.validation.constraints.Pattern;
8 import javax.validation.constraints.Size; 9 import javax.validation.constraints.Size;
9 import java.util.Set; 10 import java.util.Set;
10 11
@@ -35,11 +36,11 @@ public class SysUserBaseVO { @@ -35,11 +36,11 @@ public class SysUserBaseVO {
35 36
36 @ApiModelProperty(value = "用户邮箱", example = "yudao@iocoder.cn") 37 @ApiModelProperty(value = "用户邮箱", example = "yudao@iocoder.cn")
37 @Email(message = "邮箱格式不正确") 38 @Email(message = "邮箱格式不正确")
38 - @Size(max = 50, message = "邮箱长度不能超过50个字符") 39 + @Size(max = 50, message = "邮箱长度不能超过 50 个字符")
39 private String email; 40 private String email;
40 41
41 @ApiModelProperty(value = "手机号码", example = "15601691300") 42 @ApiModelProperty(value = "手机号码", example = "15601691300")
42 - @Size(max = 11, message = "手机号码长度不能超过11个字符") 43 + @Pattern(regexp = "^1(3|4|5|7|8)\\d{9}$",message = "手机号码格式错误")
43 private String mobile; 44 private String mobile;
44 45
45 @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类") 46 @ApiModelProperty(value = "用户性别", example = "1", notes = "参见 SysSexEnum 枚举类")
@@ -48,5 +49,4 @@ public class SysUserBaseVO { @@ -48,5 +49,4 @@ public class SysUserBaseVO {
48 @ApiModelProperty(value = "用户头像", example = "http://www.iocoder.cn/xxx.png") 49 @ApiModelProperty(value = "用户头像", example = "http://www.iocoder.cn/xxx.png")
49 private String avatar; 50 private String avatar;
50 51
51 -  
52 } 52 }
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserPageItemRespVO.java
1 package cn.iocoder.dashboard.modules.system.controller.user.vo.user; 1 package cn.iocoder.dashboard.modules.system.controller.user.vo.user;
2 2
3 -import com.fasterxml.jackson.annotation.JsonIgnore;  
4 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
5 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
6 import lombok.AllArgsConstructor; 5 import lombok.AllArgsConstructor;
@@ -18,7 +17,6 @@ public class SysUserPageItemRespVO extends SysUserRespVO { @@ -18,7 +17,6 @@ public class SysUserPageItemRespVO extends SysUserRespVO {
18 /** 17 /**
19 * 所在部门 18 * 所在部门
20 */ 19 */
21 - @JsonIgnore  
22 private Dept dept; 20 private Dept dept;
23 21
24 @ApiModel("部门") 22 @ApiModel("部门")
src/main/java/cn/iocoder/dashboard/modules/system/controller/user/vo/user/SysUserProfileRespVO.java deleted
1 -package cn.iocoder.dashboard.modules.system.controller.user.vo.user;  
2 -  
3 -import io.swagger.annotations.ApiModel;  
4 -import io.swagger.annotations.ApiModelProperty;  
5 -import lombok.AllArgsConstructor;  
6 -import lombok.Data;  
7 -import lombok.EqualsAndHashCode;  
8 -import lombok.NoArgsConstructor;  
9 -  
10 -import java.util.Set;  
11 -  
12 -  
13 -@ApiModel("用户个人中心信息 Response VO")  
14 -@Data  
15 -@NoArgsConstructor  
16 -@AllArgsConstructor  
17 -@EqualsAndHashCode(callSuper = true)  
18 -public class SysUserProfileRespVO extends SysUserRespVO {  
19 -  
20 - /**  
21 - * 所属角色  
22 - */  
23 - @ApiModelProperty(value = "所属角色", required = true, example = "123456")  
24 - private Set<Role> roles;  
25 -  
26 - @ApiModel("角色")  
27 - @Data  
28 - public static class Role {  
29 -  
30 - @ApiModelProperty(value = "角色编号", required = true, example = "1")  
31 - private Long id;  
32 -  
33 - @ApiModelProperty(value = "角色名称", required = true, example = "普通角色")  
34 - private String name;  
35 -  
36 - }  
37 -}  
src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java
@@ -3,7 +3,8 @@ package cn.iocoder.dashboard.modules.system.convert.auth; @@ -3,7 +3,8 @@ package cn.iocoder.dashboard.modules.system.convert.auth;
3 import cn.iocoder.dashboard.framework.security.core.LoginUser; 3 import cn.iocoder.dashboard.framework.security.core.LoginUser;
4 import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO; 4 import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthMenuRespVO;
5 import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO; 5 import cn.iocoder.dashboard.modules.system.controller.auth.vo.auth.SysAuthPermissionInfoRespVO;
6 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO; 6 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
7 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO; 8 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysMenuDO;
8 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; 9 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO;
9 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 10 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
@@ -41,6 +42,8 @@ public interface SysAuthConvert { @@ -41,6 +42,8 @@ public interface SysAuthConvert {
41 42
42 LoginUser convert(SysUserProfileUpdateReqVO reqVO); 43 LoginUser convert(SysUserProfileUpdateReqVO reqVO);
43 44
  45 + LoginUser convert(SysUserProfileUpdatePasswordReqVO reqVO);
  46 +
44 /** 47 /**
45 * 将菜单列表,构建成菜单树 48 * 将菜单列表,构建成菜单树
46 * 49 *
src/main/java/cn/iocoder/dashboard/modules/system/convert/user/SysUserConvert.java
1 package cn.iocoder.dashboard.modules.system.convert.user; 1 package cn.iocoder.dashboard.modules.system.convert.user;
2 2
3 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;  
4 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExcelVO;  
5 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO;  
6 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageItemRespVO;  
7 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileRespVO;  
8 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO;  
9 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; 3 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileRespVO;
  4 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.user.vo.user.*;
10 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; 7 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO;
  8 +import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO;
11 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO; 9 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleDO;
12 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 10 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
13 import org.mapstruct.Mapper; 11 import org.mapstruct.Mapper;
14 import org.mapstruct.factory.Mappers; 12 import org.mapstruct.factory.Mappers;
15 13
  14 +import java.util.List;
  15 +
16 @Mapper 16 @Mapper
17 public interface SysUserConvert { 17 public interface SysUserConvert {
18 18
@@ -32,10 +32,14 @@ public interface SysUserConvert { @@ -32,10 +32,14 @@ public interface SysUserConvert {
32 32
33 SysUserProfileRespVO convert03(SysUserDO bean); 33 SysUserProfileRespVO convert03(SysUserDO bean);
34 34
35 - SysUserProfileRespVO.Role convert(SysRoleDO bean); 35 + List<SysUserProfileRespVO.Role> convertList(List<SysRoleDO> list);
  36 +
  37 + SysUserProfileRespVO.Dept convert02(SysDeptDO bean);
36 38
37 SysUserDO convert(SysUserProfileUpdateReqVO bean); 39 SysUserDO convert(SysUserProfileUpdateReqVO bean);
38 40
  41 + SysUserDO convert(SysUserProfileUpdatePasswordReqVO bean);
39 42
  43 + List<SysUserProfileRespVO.Post> convertList02(List<SysPostDO> list);
40 44
41 } 45 }
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysRoleMenuMapper.java
@@ -4,6 +4,7 @@ import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX; @@ -4,6 +4,7 @@ import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX;
4 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleMenuDO; 4 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysRoleMenuDO;
5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
6 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
  7 +import org.apache.ibatis.annotations.Select;
7 8
8 import java.util.Collection; 9 import java.util.Collection;
9 import java.util.Date; 10 import java.util.Date;
@@ -32,10 +33,16 @@ public interface SysRoleMenuMapper extends BaseMapperX&lt;SysRoleMenuDO&gt; { @@ -32,10 +33,16 @@ public interface SysRoleMenuMapper extends BaseMapperX&lt;SysRoleMenuDO&gt; {
32 delete(new QueryWrapper<SysRoleMenuDO>().eq("role_id", roleId) 33 delete(new QueryWrapper<SysRoleMenuDO>().eq("role_id", roleId)
33 .in("menu_id", menuIds)); 34 .in("menu_id", menuIds));
34 } 35 }
  36 +
  37 + default void deleteListByMenuId(Long menuId) {
  38 + delete(new QueryWrapper<SysRoleMenuDO>().eq("menu_id", menuId));
  39 + }
35 40
36 - default boolean selectExistsByUpdateTimeAfter(Date maxUpdateTime) {  
37 - return selectOne(new QueryWrapper<SysRoleMenuDO>().select("id")  
38 - .gt("update_time", maxUpdateTime).last("LIMIT 1")) != null; 41 + default void deleteListByRoleId(Long roleId) {
  42 + delete(new QueryWrapper<SysRoleMenuDO>().eq("role_id", roleId));
39 } 43 }
40 44
  45 + @Select("SELECT id FROM sys_role_menu WHERE update_time > #{maxUpdateTime} LIMIT 1")
  46 + Long selectExistsByUpdateTimeAfter(Date maxUpdateTime);
  47 +
41 } 48 }
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/permission/SysUserRoleMapper.java
1 package cn.iocoder.dashboard.modules.system.dal.mysql.permission; 1 package cn.iocoder.dashboard.modules.system.dal.mysql.permission;
2 2
  3 +import cn.iocoder.dashboard.framework.mybatis.core.mapper.BaseMapperX;
3 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysUserRoleDO; 4 import cn.iocoder.dashboard.modules.system.dal.dataobject.permission.SysUserRoleDO;
4 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 5 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 -import com.baomidou.mybatisplus.core.mapper.BaseMapper;  
6 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
7 7
8 import java.util.Collection; 8 import java.util.Collection;
@@ -10,7 +10,7 @@ import java.util.List; @@ -10,7 +10,7 @@ import java.util.List;
10 import java.util.stream.Collectors; 10 import java.util.stream.Collectors;
11 11
12 @Mapper 12 @Mapper
13 -public interface SysUserRoleMapper extends BaseMapper<SysUserRoleDO> { 13 +public interface SysUserRoleMapper extends BaseMapperX<SysUserRoleDO> {
14 14
15 default List<SysUserRoleDO> selectListByUserId(Long userId) { 15 default List<SysUserRoleDO> selectListByUserId(Long userId) {
16 return selectList(new QueryWrapper<SysUserRoleDO>().eq("user_id", userId)); 16 return selectList(new QueryWrapper<SysUserRoleDO>().eq("user_id", userId));
@@ -32,4 +32,12 @@ public interface SysUserRoleMapper extends BaseMapper&lt;SysUserRoleDO&gt; { @@ -32,4 +32,12 @@ public interface SysUserRoleMapper extends BaseMapper&lt;SysUserRoleDO&gt; {
32 .in("role_id", roleIds)); 32 .in("role_id", roleIds));
33 } 33 }
34 34
  35 + default void deleteListByUserId(Long userId) {
  36 + delete(new QueryWrapper<SysUserRoleDO>().eq("user_id", userId));
  37 + }
  38 +
  39 + default void deleteListByRoleId(Long roleId) {
  40 + delete(new QueryWrapper<SysUserRoleDO>().eq("role_id", roleId));
  41 + }
  42 +
35 } 43 }
src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/mail/SysMailSendConsumer.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.mq.consumer.mail;
  2 +
  3 +import cn.iocoder.dashboard.framework.redis.core.stream.AbstractStreamMessageListener;
  4 +import cn.iocoder.dashboard.modules.system.mq.message.mail.SysMailSendMessage;
  5 +import lombok.extern.slf4j.Slf4j;
  6 +import org.springframework.stereotype.Component;
  7 +
  8 +@Component
  9 +@Slf4j
  10 +public class SysMailSendConsumer extends AbstractStreamMessageListener<SysMailSendMessage> {
  11 +
  12 + @Override
  13 + public void onMessage(SysMailSendMessage message) {
  14 + log.info("[onMessage][消息内容({})]", message);
  15 + }
  16 +
  17 +}
src/main/java/cn/iocoder/dashboard/modules/system/mq/consumer/sms/SysSmsSendConsumer.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.mq.consumer.sms;
  2 +
  3 +import cn.iocoder.dashboard.framework.redis.core.stream.AbstractStreamMessageListener;
  4 +import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage;
  5 +import lombok.extern.slf4j.Slf4j;
  6 +import org.springframework.stereotype.Component;
  7 +
  8 +@Component
  9 +@Slf4j
  10 +public class SysSmsSendConsumer extends AbstractStreamMessageListener<SysSmsSendMessage> {
  11 +
  12 + @Override
  13 + public void onMessage(SysSmsSendMessage message) {
  14 + log.info("[onMessage][消息内容({})]", message);
  15 + }
  16 +
  17 +}
src/main/java/cn/iocoder/dashboard/modules/system/mq/message/mail/SysMailSendMessage.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.mq.message.mail;
  2 +
  3 +import cn.iocoder.dashboard.framework.redis.core.stream.StreamMessage;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +import java.util.Map;
  8 +
  9 +/**
  10 + * 邮箱发送消息
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Data
  15 +public class SysMailSendMessage implements StreamMessage {
  16 +
  17 + /**
  18 + * 邮箱地址
  19 + */
  20 + @NotNull(message = "邮箱地址不能为空")
  21 + private String address;
  22 + /**
  23 + * 短信模板编号
  24 + */
  25 + @NotNull(message = "短信模板编号不能为空")
  26 + private String templateCode;
  27 + /**
  28 + * 短信模板参数
  29 + */
  30 + private Map<String, Object> templateParams;
  31 +
  32 + /**
  33 + * 用户编号,允许空
  34 + */
  35 + private Integer userId;
  36 + /**
  37 + * 用户类型,允许空
  38 + */
  39 + private Integer userType;
  40 +
  41 + @Override
  42 + public String getStreamKey() {
  43 + return "system.mail.send";
  44 + }
  45 +
  46 +}
src/main/java/cn/iocoder/dashboard/modules/system/mq/message/sms/SysSmsSendMessage.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.mq.message.sms;
  2 +
  3 +import cn.iocoder.dashboard.framework.redis.core.stream.StreamMessage;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +import java.util.Map;
  8 +
  9 +/**
  10 + * 短信发送消息
  11 + *
  12 + * @author 芋道源码
  13 + */
  14 +@Data
  15 +public class SysSmsSendMessage implements StreamMessage {
  16 +
  17 + /**
  18 + * 手机号
  19 + */
  20 + @NotNull(message = "手机号不能为空")
  21 + private String mobile;
  22 + /**
  23 + * 短信模板编号
  24 + */
  25 + @NotNull(message = "短信模板编号不能为空")
  26 + private String templateCode;
  27 + /**
  28 + * 短信模板参数
  29 + */
  30 + private Map<String, Object> templateParams;
  31 +
  32 + /**
  33 + * 用户编号,允许空
  34 + */
  35 + private Integer userId;
  36 + /**
  37 + * 用户类型,允许空
  38 + */
  39 + private Integer userType;
  40 +
  41 + @Override
  42 + public String getStreamKey() {
  43 + return "system.sms.send";
  44 + }
  45 +
  46 +}
src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java
@@ -61,7 +61,7 @@ public class SysAuthServiceImpl implements SysAuthService { @@ -61,7 +61,7 @@ public class SysAuthServiceImpl implements SysAuthService {
61 @Override 61 @Override
62 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 62 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
63 // 获取 username 对应的 SysUserDO 63 // 获取 username 对应的 SysUserDO
64 - SysUserDO user = userService.getUserByUserName(username); 64 + SysUserDO user = userService.getUserByUsername(username);
65 if (user == null) { 65 if (user == null) {
66 throw new UsernameNotFoundException(username); 66 throw new UsernameNotFoundException(username);
67 } 67 }
src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysUserSessionServiceImpl.java
@@ -101,7 +101,7 @@ public class SysUserSessionServiceImpl implements SysUserSessionService { @@ -101,7 +101,7 @@ public class SysUserSessionServiceImpl implements SysUserSessionService {
101 // 处理基于用户昵称的查询 101 // 处理基于用户昵称的查询
102 Collection<Long> userIds = null; 102 Collection<Long> userIds = null;
103 if (StrUtil.isNotEmpty(reqVO.getUsername())) { 103 if (StrUtil.isNotEmpty(reqVO.getUsername())) {
104 - userIds = convertSet(userService.listUsersByUsername(reqVO.getUsername()), SysUserDO::getId); 104 + userIds = convertSet(userService.getUsersByUsername(reqVO.getUsername()), SysUserDO::getId);
105 if (CollUtil.isEmpty(userIds)) { 105 if (CollUtil.isEmpty(userIds)) {
106 return PageResult.empty(); 106 return PageResult.empty();
107 } 107 }
src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysDeptService.java
@@ -25,12 +25,34 @@ public interface SysDeptService { @@ -25,12 +25,34 @@ public interface SysDeptService {
25 void initLocalCache(); 25 void initLocalCache();
26 26
27 /** 27 /**
  28 + * 创建部门
  29 + *
  30 + * @param reqVO 部门信息
  31 + * @return 部门编号
  32 + */
  33 + Long createDept(SysDeptCreateReqVO reqVO);
  34 +
  35 + /**
  36 + * 更新部门
  37 + *
  38 + * @param reqVO 部门信息
  39 + */
  40 + void updateDept(SysDeptUpdateReqVO reqVO);
  41 +
  42 + /**
  43 + * 删除部门
  44 + *
  45 + * @param id 部门编号
  46 + */
  47 + void deleteDept(Long id);
  48 +
  49 + /**
28 * 获得指定编号的部门列表 50 * 获得指定编号的部门列表
29 * 51 *
30 * @param ids 部门编号数组 52 * @param ids 部门编号数组
31 * @return 部门列表 53 * @return 部门列表
32 */ 54 */
33 - List<SysDeptDO> listDepts(Collection<Long> ids); 55 + List<SysDeptDO> getSimpleDepts(Collection<Long> ids);
34 56
35 /** 57 /**
36 * 获得指定编号的部门 Map 58 * 获得指定编号的部门 Map
@@ -42,7 +64,7 @@ public interface SysDeptService { @@ -42,7 +64,7 @@ public interface SysDeptService {
42 if (CollUtil.isEmpty(ids)) { 64 if (CollUtil.isEmpty(ids)) {
43 return Collections.emptyMap(); 65 return Collections.emptyMap();
44 } 66 }
45 - List<SysDeptDO> list = listDepts(ids); 67 + List<SysDeptDO> list = getSimpleDepts(ids);
46 return CollectionUtils.convertMap(list, SysDeptDO::getId); 68 return CollectionUtils.convertMap(list, SysDeptDO::getId);
47 } 69 }
48 70
@@ -52,16 +74,7 @@ public interface SysDeptService { @@ -52,16 +74,7 @@ public interface SysDeptService {
52 * @param reqVO 筛选条件请求 VO 74 * @param reqVO 筛选条件请求 VO
53 * @return 部门列表 75 * @return 部门列表
54 */ 76 */
55 - List<SysDeptDO> listDepts(SysDeptListReqVO reqVO);  
56 -  
57 - /**  
58 - * 获得所有子部门,从缓存中  
59 - *  
60 - * @param parentId 部门编号  
61 - * @param recursive 是否递归获取所有  
62 - * @return 子部门列表  
63 - */  
64 - List<SysDeptDO> listDeptsByParentIdFromCache(Long parentId, boolean recursive); 77 + List<SysDeptDO> getSimpleDepts(SysDeptListReqVO reqVO);
65 78
66 /** 79 /**
67 * 获得部门信息 80 * 获得部门信息
@@ -72,25 +85,12 @@ public interface SysDeptService { @@ -72,25 +85,12 @@ public interface SysDeptService {
72 SysDeptDO getDept(Long id); 85 SysDeptDO getDept(Long id);
73 86
74 /** 87 /**
75 - * 创建部门  
76 - *  
77 - * @param reqVO 部门信息  
78 - * @return 部门编号  
79 - */  
80 - Long createDept(SysDeptCreateReqVO reqVO);  
81 -  
82 - /**  
83 - * 更新部门  
84 - *  
85 - * @param reqVO 部门信息  
86 - */  
87 - void updateDept(SysDeptUpdateReqVO reqVO);  
88 -  
89 - /**  
90 - * 删除部门 88 + * 获得所有子部门,从缓存中
91 * 89 *
92 - * @param id 部门编号 90 + * @param parentId 部门编号
  91 + * @param recursive 是否递归获取所有
  92 + * @return 子部门列表
93 */ 93 */
94 - void deleteDept(Long id); 94 + List<SysDeptDO> getDeptsByParentIdFromCache(Long parentId, boolean recursive);
95 95
96 } 96 }
src/main/java/cn/iocoder/dashboard/modules/system/service/dept/SysPostService.java
1 package cn.iocoder.dashboard.modules.system.service.dept; 1 package cn.iocoder.dashboard.modules.system.service.dept;
2 2
  3 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
3 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
4 import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostCreateReqVO; 5 import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostCreateReqVO;
5 import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostExportReqVO; 6 import cn.iocoder.dashboard.modules.system.controller.dept.vo.post.SysPostExportReqVO;
@@ -11,6 +12,8 @@ import org.springframework.lang.Nullable; @@ -11,6 +12,8 @@ import org.springframework.lang.Nullable;
11 import java.util.Collection; 12 import java.util.Collection;
12 import java.util.List; 13 import java.util.List;
13 14
  15 +import static cn.iocoder.dashboard.util.collection.SetUtils.asSet;
  16 +
14 /** 17 /**
15 * 岗位 Service 接口 18 * 岗位 Service 接口
16 * 19 *
@@ -19,58 +22,68 @@ import java.util.List; @@ -19,58 +22,68 @@ import java.util.List;
19 public interface SysPostService { 22 public interface SysPostService {
20 23
21 /** 24 /**
22 - * 获得符合条件的岗位列表 25 + * 创建岗位
23 * 26 *
24 - * @param ids 岗位编号数组。如果为空,不进行筛选  
25 - * @param statuses 状态数组。如果为空,不进行筛选  
26 - * @return 部门列表 27 + * @param reqVO 岗位信息
  28 + * @return 岗位编号
27 */ 29 */
28 - List<SysPostDO> listPosts(@Nullable Collection<Long> ids, @Nullable Collection<Integer> statuses); 30 + Long createPost(SysPostCreateReqVO reqVO);
29 31
30 /** 32 /**
31 - * 获得岗位分页列表 33 + * 更新岗位
32 * 34 *
33 - * @param reqVO 分页条件  
34 - * @return 部门分页列表 35 + * @param reqVO 岗位信息
  36 + */
  37 + void updatePost(SysPostUpdateReqVO reqVO);
  38 +
  39 + /**
  40 + * 删除岗位信息
  41 + *
  42 + * @param id 岗位编号
35 */ 43 */
36 - PageResult<SysPostDO> pagePosts(SysPostPageReqVO reqVO); 44 + void deletePost(Long id);
37 45
38 /** 46 /**
39 * 获得岗位列表 47 * 获得岗位列表
40 * 48 *
41 - * @param reqVO 查询条件 49 + * @param ids 岗位编号数组。如果为空,不进行筛选
42 * @return 部门列表 50 * @return 部门列表
43 */ 51 */
44 - List<SysPostDO> listPosts(SysPostExportReqVO reqVO); 52 + default List<SysPostDO> getPosts(@Nullable Collection<Long> ids) {
  53 + return getPosts(ids, asSet(CommonStatusEnum.ENABLE.getStatus(), CommonStatusEnum.DISABLE.getStatus()));
  54 + }
45 55
46 /** 56 /**
47 - * 获得岗位信息 57 + * 获得符合条件的岗位列表
48 * 58 *
49 - * @param id 岗位编号  
50 - * @return 岗位信息 59 + * @param ids 岗位编号数组。如果为空,不进行筛选
  60 + * @param statuses 状态数组。如果为空,不进行筛选
  61 + * @return 部门列表
51 */ 62 */
52 - SysPostDO getPost(Long id); 63 + List<SysPostDO> getPosts(@Nullable Collection<Long> ids, @Nullable Collection<Integer> statuses);
53 64
54 /** 65 /**
55 - * 创建岗位 66 + * 获得岗位分页列表
56 * 67 *
57 - * @param reqVO 岗位信息  
58 - * @return 岗位编号 68 + * @param reqVO 分页条件
  69 + * @return 部门分页列表
59 */ 70 */
60 - Long createPost(SysPostCreateReqVO reqVO); 71 + PageResult<SysPostDO> getPostPage(SysPostPageReqVO reqVO);
61 72
62 /** 73 /**
63 - * 更新岗位 74 + * 获得岗位列表
64 * 75 *
65 - * @param reqVO 岗位信息 76 + * @param reqVO 查询条件
  77 + * @return 部门列表
66 */ 78 */
67 - void updatePost(SysPostUpdateReqVO reqVO); 79 + List<SysPostDO> getPosts(SysPostExportReqVO reqVO);
68 80
69 /** 81 /**
70 - * 删除岗位信息 82 + * 获得岗位信息
71 * 83 *
72 * @param id 岗位编号 84 * @param id 岗位编号
  85 + * @return 岗位信息
73 */ 86 */
74 - void deletePost(Long id); 87 + SysPostDO getPost(Long id);
75 88
76 } 89 }
src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysDeptServiceImpl.java
@@ -19,6 +19,7 @@ import com.google.common.collect.Multimap; @@ -19,6 +19,7 @@ import com.google.common.collect.Multimap;
19 import lombok.extern.slf4j.Slf4j; 19 import lombok.extern.slf4j.Slf4j;
20 import org.springframework.scheduling.annotation.Scheduled; 20 import org.springframework.scheduling.annotation.Scheduled;
21 import org.springframework.stereotype.Service; 21 import org.springframework.stereotype.Service;
  22 +import org.springframework.validation.annotation.Validated;
22 23
23 import javax.annotation.PostConstruct; 24 import javax.annotation.PostConstruct;
24 import javax.annotation.Resource; 25 import javax.annotation.Resource;
@@ -32,6 +33,7 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; @@ -32,6 +33,7 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
32 * @author 芋道源码 33 * @author 芋道源码
33 */ 34 */
34 @Service 35 @Service
  36 +@Validated
35 @Slf4j 37 @Slf4j
36 public class SysDeptServiceImpl implements SysDeptService { 38 public class SysDeptServiceImpl implements SysDeptService {
37 39
@@ -47,6 +49,7 @@ public class SysDeptServiceImpl implements SysDeptService { @@ -47,6 +49,7 @@ public class SysDeptServiceImpl implements SysDeptService {
47 * 49 *
48 * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 50 * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向
49 */ 51 */
  52 + @SuppressWarnings("FieldCanBeLocal")
50 private volatile Map<Long, SysDeptDO> deptCache; 53 private volatile Map<Long, SysDeptDO> deptCache;
51 /** 54 /**
52 * 父部门缓存 55 * 父部门缓存
@@ -118,17 +121,54 @@ public class SysDeptServiceImpl implements SysDeptService { @@ -118,17 +121,54 @@ public class SysDeptServiceImpl implements SysDeptService {
118 } 121 }
119 122
120 @Override 123 @Override
121 - public List<SysDeptDO> listDepts(Collection<Long> ids) { 124 + public Long createDept(SysDeptCreateReqVO reqVO) {
  125 + // 校验正确性
  126 + checkCreateOrUpdate(null, reqVO.getParentId(), reqVO.getName());
  127 + // 插入部门
  128 + SysDeptDO dept = SysDeptConvert.INSTANCE.convert(reqVO);
  129 + deptMapper.insert(dept);
  130 + // 发送刷新消息
  131 + deptProducer.sendDeptRefreshMessage();
  132 + return dept.getId();
  133 + }
  134 +
  135 + @Override
  136 + public void updateDept(SysDeptUpdateReqVO reqVO) {
  137 + // 校验正确性
  138 + checkCreateOrUpdate(reqVO.getId(), reqVO.getParentId(), reqVO.getName());
  139 + // 更新部门
  140 + SysDeptDO updateObj = SysDeptConvert.INSTANCE.convert(reqVO);
  141 + deptMapper.updateById(updateObj);
  142 + // 发送刷新消息
  143 + deptProducer.sendDeptRefreshMessage();
  144 + }
  145 +
  146 + @Override
  147 + public void deleteDept(Long id) {
  148 + // 校验是否存在
  149 + checkDeptExists(id);
  150 + // 校验是否有子部门
  151 + if (deptMapper.selectCountByParentId(id) > 0) {
  152 + throw ServiceExceptionUtil.exception(DEPT_EXITS_CHILDREN);
  153 + }
  154 + // 删除部门
  155 + deptMapper.deleteById(id);
  156 + // 发送刷新消息
  157 + deptProducer.sendDeptRefreshMessage();
  158 + }
  159 +
  160 + @Override
  161 + public List<SysDeptDO> getSimpleDepts(Collection<Long> ids) {
122 return deptMapper.selectBatchIds(ids); 162 return deptMapper.selectBatchIds(ids);
123 } 163 }
124 164
125 @Override 165 @Override
126 - public List<SysDeptDO> listDepts(SysDeptListReqVO reqVO) { 166 + public List<SysDeptDO> getSimpleDepts(SysDeptListReqVO reqVO) {
127 return deptMapper.selectList(reqVO); 167 return deptMapper.selectList(reqVO);
128 } 168 }
129 169
130 @Override 170 @Override
131 - public List<SysDeptDO> listDeptsByParentIdFromCache(Long parentId, boolean recursive) { 171 + public List<SysDeptDO> getDeptsByParentIdFromCache(Long parentId, boolean recursive) {
132 List<SysDeptDO> result = new ArrayList<>(); 172 List<SysDeptDO> result = new ArrayList<>();
133 // 递归,简单粗暴 173 // 递归,简单粗暴
134 this.listDeptsByParentIdFromCache(result, parentId, 174 this.listDeptsByParentIdFromCache(result, parentId,
@@ -167,44 +207,6 @@ public class SysDeptServiceImpl implements SysDeptService { @@ -167,44 +207,6 @@ public class SysDeptServiceImpl implements SysDeptService {
167 return deptMapper.selectById(id); 207 return deptMapper.selectById(id);
168 } 208 }
169 209
170 - @Override  
171 - public Long createDept(SysDeptCreateReqVO reqVO) {  
172 - // 校验正确性  
173 - checkCreateOrUpdate(null, reqVO.getParentId(), reqVO.getName());  
174 - // 插入部门  
175 - SysDeptDO dept = SysDeptConvert.INSTANCE.convert(reqVO);  
176 - deptMapper.insert(dept);  
177 - // 发送刷新消息  
178 - deptProducer.sendDeptRefreshMessage();  
179 - return dept.getId();  
180 - }  
181 -  
182 - @Override  
183 - public void updateDept(SysDeptUpdateReqVO reqVO) {  
184 - // 校验正确性  
185 - checkCreateOrUpdate(reqVO.getId(), reqVO.getParentId(), reqVO.getName());  
186 - // 更新部门  
187 - SysDeptDO updateObj = SysDeptConvert.INSTANCE.convert(reqVO);  
188 - deptMapper.updateById(updateObj);  
189 - // 发送刷新消息  
190 - deptProducer.sendDeptRefreshMessage();  
191 - }  
192 -  
193 - @Override  
194 - public void deleteDept(Long id) {  
195 - // 校验是否存在  
196 - checkDeptExists(id);  
197 - // 校验是否有子部门  
198 - if (deptMapper.selectCountByParentId(id) > 0) {  
199 - throw ServiceExceptionUtil.exception(DEPT_EXITS_CHILDREN);  
200 - }  
201 - // 删除部门  
202 - deptMapper.deleteById(id);  
203 - // TODO 需要处理下与角色的数据权限关联,等做数据权限一起处理下  
204 - // 发送刷新消息  
205 - deptProducer.sendDeptRefreshMessage();  
206 - }  
207 -  
208 private void checkCreateOrUpdate(Long id, Long parentId, String name) { 210 private void checkCreateOrUpdate(Long id, Long parentId, String name) {
209 // 校验自己存在 211 // 校验自己存在
210 checkDeptExists(id); 212 checkDeptExists(id);
@@ -232,7 +234,7 @@ public class SysDeptServiceImpl implements SysDeptService { @@ -232,7 +234,7 @@ public class SysDeptServiceImpl implements SysDeptService {
232 throw ServiceExceptionUtil.exception(DEPT_NOT_ENABLE); 234 throw ServiceExceptionUtil.exception(DEPT_NOT_ENABLE);
233 } 235 }
234 // 父部门不能是原来的子部门 236 // 父部门不能是原来的子部门
235 - List<SysDeptDO> children = this.listDeptsByParentIdFromCache(id, true); 237 + List<SysDeptDO> children = this.getDeptsByParentIdFromCache(id, true);
236 if (children.stream().anyMatch(dept1 -> dept1.getId().equals(parentId))) { 238 if (children.stream().anyMatch(dept1 -> dept1.getId().equals(parentId))) {
237 throw ServiceExceptionUtil.exception(DEPT_PARENT_IS_CHILD); 239 throw ServiceExceptionUtil.exception(DEPT_PARENT_IS_CHILD);
238 } 240 }
@@ -262,12 +264,6 @@ public class SysDeptServiceImpl implements SysDeptService { @@ -262,12 +264,6 @@ public class SysDeptServiceImpl implements SysDeptService {
262 } 264 }
263 } 265 }
264 266
265 -// /**  
266 -// * 查询部门管理数据  
267 -// *  
268 -// * @param dept 部门信息  
269 -// * @return 部门信息集合  
270 -// */  
271 // @Override 267 // @Override
272 // @DataScope(deptAlias = "d") 268 // @DataScope(deptAlias = "d")
273 // public List<SysDept> selectDeptList(SysDept dept) 269 // public List<SysDept> selectDeptList(SysDept dept)
src/main/java/cn/iocoder/dashboard/modules/system/service/dept/impl/SysPostServiceImpl.java
@@ -11,6 +11,7 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysPostMapper; @@ -11,6 +11,7 @@ import cn.iocoder.dashboard.modules.system.dal.mysql.dept.SysPostMapper;
11 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO; 11 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysPostDO;
12 import cn.iocoder.dashboard.modules.system.service.dept.SysPostService; 12 import cn.iocoder.dashboard.modules.system.service.dept.SysPostService;
13 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
  14 +import org.springframework.validation.annotation.Validated;
14 15
15 import javax.annotation.Resource; 16 import javax.annotation.Resource;
16 import java.util.Collection; 17 import java.util.Collection;
@@ -24,32 +25,13 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*; @@ -24,32 +25,13 @@ import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
24 * @author 芋道源码 25 * @author 芋道源码
25 */ 26 */
26 @Service 27 @Service
  28 +@Validated
27 public class SysPostServiceImpl implements SysPostService { 29 public class SysPostServiceImpl implements SysPostService {
28 30
29 @Resource 31 @Resource
30 private SysPostMapper postMapper; 32 private SysPostMapper postMapper;
31 33
32 @Override 34 @Override
33 - public List<SysPostDO> listPosts(Collection<Long> ids, Collection<Integer> statuses) {  
34 - return postMapper.selectList(ids, statuses);  
35 - }  
36 -  
37 - @Override  
38 - public PageResult<SysPostDO> pagePosts(SysPostPageReqVO reqVO) {  
39 - return postMapper.selectPage(reqVO);  
40 - }  
41 -  
42 - @Override  
43 - public List<SysPostDO> listPosts(SysPostExportReqVO reqVO) {  
44 - return postMapper.selectList(reqVO);  
45 - }  
46 -  
47 - @Override  
48 - public SysPostDO getPost(Long id) {  
49 - return postMapper.selectById(id);  
50 - }  
51 -  
52 - @Override  
53 public Long createPost(SysPostCreateReqVO reqVO) { 35 public Long createPost(SysPostCreateReqVO reqVO) {
54 // 校验正确性 36 // 校验正确性
55 this.checkCreateOrUpdate(null, reqVO.getName(), reqVO.getCode()); 37 this.checkCreateOrUpdate(null, reqVO.getName(), reqVO.getCode());
@@ -68,6 +50,34 @@ public class SysPostServiceImpl implements SysPostService { @@ -68,6 +50,34 @@ public class SysPostServiceImpl implements SysPostService {
68 postMapper.updateById(updateObj); 50 postMapper.updateById(updateObj);
69 } 51 }
70 52
  53 + @Override
  54 + public void deletePost(Long id) {
  55 + // 校验是否存在
  56 + this.checkPostExists(id);
  57 + // 删除部门
  58 + postMapper.deleteById(id);
  59 + }
  60 +
  61 + @Override
  62 + public List<SysPostDO> getPosts(Collection<Long> ids, Collection<Integer> statuses) {
  63 + return postMapper.selectList(ids, statuses);
  64 + }
  65 +
  66 + @Override
  67 + public PageResult<SysPostDO> getPostPage(SysPostPageReqVO reqVO) {
  68 + return postMapper.selectPage(reqVO);
  69 + }
  70 +
  71 + @Override
  72 + public List<SysPostDO> getPosts(SysPostExportReqVO reqVO) {
  73 + return postMapper.selectList(reqVO);
  74 + }
  75 +
  76 + @Override
  77 + public SysPostDO getPost(Long id) {
  78 + return postMapper.selectById(id);
  79 + }
  80 +
71 private void checkCreateOrUpdate(Long id, String name, String code) { 81 private void checkCreateOrUpdate(Long id, String name, String code) {
72 // 校验自己存在 82 // 校验自己存在
73 checkPostExists(id); 83 checkPostExists(id);
@@ -105,14 +115,6 @@ public class SysPostServiceImpl implements SysPostService { @@ -105,14 +115,6 @@ public class SysPostServiceImpl implements SysPostService {
105 } 115 }
106 } 116 }
107 117
108 - @Override  
109 - public void deletePost(Long id) {  
110 - // 校验是否存在  
111 - this.checkPostExists(id);  
112 - // 删除部门  
113 - postMapper.deleteById(id);  
114 - }  
115 -  
116 private void checkPostExists(Long id) { 118 private void checkPostExists(Long id) {
117 if (id == null) { 119 if (id == null) {
118 return; 120 return;
src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictDataService.java
@@ -23,57 +23,57 @@ public interface SysDictDataService extends DictDataFrameworkService { @@ -23,57 +23,57 @@ public interface SysDictDataService extends DictDataFrameworkService {
23 void initLocalCache(); 23 void initLocalCache();
24 24
25 /** 25 /**
26 - * 获得字典数据列表 26 + * 创建字典数据
27 * 27 *
28 - * @return 字典数据全列表 28 + * @param reqVO 字典数据信息
  29 + * @return 字典数据编号
29 */ 30 */
30 - List<SysDictDataDO> getDictDataList(); 31 + Long createDictData(SysDictDataCreateReqVO reqVO);
31 32
32 /** 33 /**
33 - * 获得字典数据分页列表 34 + * 更新字典数据
34 * 35 *
35 - * @param reqVO 分页请求  
36 - * @return 字典数据分页列表 36 + * @param reqVO 字典数据信息
37 */ 37 */
38 - PageResult<SysDictDataDO> getDictDataPage(SysDictDataPageReqVO reqVO); 38 + void updateDictData(SysDictDataUpdateReqVO reqVO);
39 39
40 /** 40 /**
41 - * 获得字典数据列表 41 + * 删除字典数据
42 * 42 *
43 - * @param reqVO 列表请求  
44 - * @return 字典数据列表 43 + * @param id 字典数据编号
45 */ 44 */
46 - List<SysDictDataDO> getDictDataList(SysDictDataExportReqVO reqVO); 45 + void deleteDictData(Long id);
47 46
48 /** 47 /**
49 - * 获得字典数据详情 48 + * 获得字典数据列表
50 * 49 *
51 - * @param id 字典数据编号  
52 - * @return 字典数据 50 + * @return 字典数据全列表
53 */ 51 */
54 - SysDictDataDO getDictData(Long id); 52 + List<SysDictDataDO> getDictDatas();
55 53
56 /** 54 /**
57 - * 创建字典数据 55 + * 获得字典数据分页列表
58 * 56 *
59 - * @param reqVO 字典数据信息  
60 - * @return 字典数据编号 57 + * @param reqVO 分页请求
  58 + * @return 字典数据分页列表
61 */ 59 */
62 - Long createDictData(SysDictDataCreateReqVO reqVO); 60 + PageResult<SysDictDataDO> getDictDataPage(SysDictDataPageReqVO reqVO);
63 61
64 /** 62 /**
65 - * 更新字典数据 63 + * 获得字典数据列表
66 * 64 *
67 - * @param reqVO 字典数据信息 65 + * @param reqVO 列表请求
  66 + * @return 字典数据列表
68 */ 67 */
69 - void updateDictData(SysDictDataUpdateReqVO reqVO); 68 + List<SysDictDataDO> getDictDatas(SysDictDataExportReqVO reqVO);
70 69
71 /** 70 /**
72 - * 删除字典数据 71 + * 获得字典数据详情
73 * 72 *
74 * @param id 字典数据编号 73 * @param id 字典数据编号
  74 + * @return 字典数据
75 */ 75 */
76 - void deleteDictData(Long id); 76 + SysDictDataDO getDictData(Long id);
77 77
78 /** 78 /**
79 * 获得指定字典类型的数据数量 79 * 获得指定字典类型的数据数量
src/main/java/cn/iocoder/dashboard/modules/system/service/dict/SysDictTypeService.java
@@ -17,6 +17,28 @@ import java.util.List; @@ -17,6 +17,28 @@ import java.util.List;
17 public interface SysDictTypeService { 17 public interface SysDictTypeService {
18 18
19 /** 19 /**
  20 + * 创建字典类型
  21 + *
  22 + * @param reqVO 字典类型信息
  23 + * @return 字典类型编号
  24 + */
  25 + Long createDictType(SysDictTypeCreateReqVO reqVO);
  26 +
  27 + /**
  28 + * 更新字典类型
  29 + *
  30 + * @param reqVO 字典类型信息
  31 + */
  32 + void updateDictType(SysDictTypeUpdateReqVO reqVO);
  33 +
  34 + /**
  35 + * 删除字典类型
  36 + *
  37 + * @param id 字典类型编号
  38 + */
  39 + void deleteDictType(Long id);
  40 +
  41 + /**
20 * 获得字典类型分页列表 42 * 获得字典类型分页列表
21 * 43 *
22 * @param reqVO 分页请求 44 * @param reqVO 分页请求
@@ -49,28 +71,6 @@ public interface SysDictTypeService { @@ -49,28 +71,6 @@ public interface SysDictTypeService {
49 SysDictTypeDO getDictType(String type); 71 SysDictTypeDO getDictType(String type);
50 72
51 /** 73 /**
52 - * 创建字典类型  
53 - *  
54 - * @param reqVO 字典类型信息  
55 - * @return 字典类型编号  
56 - */  
57 - Long createDictType(SysDictTypeCreateReqVO reqVO);  
58 -  
59 - /**  
60 - * 更新字典类型  
61 - *  
62 - * @param reqVO 字典类型信息  
63 - */  
64 - void updateDictType(SysDictTypeUpdateReqVO reqVO);  
65 -  
66 - /**  
67 - * 删除字典类型  
68 - *  
69 - * @param id 字典类型编号  
70 - */  
71 - void deleteDictType(Long id);  
72 -  
73 - /**  
74 * 获得全部字典类型列表 74 * 获得全部字典类型列表
75 * 75 *
76 * @return 字典类型列表 76 * @return 字典类型列表
src/main/java/cn/iocoder/dashboard/modules/system/service/dict/impl/SysDictDataServiceImpl.java
@@ -131,7 +131,7 @@ public class SysDictDataServiceImpl implements SysDictDataService { @@ -131,7 +131,7 @@ public class SysDictDataServiceImpl implements SysDictDataService {
131 } 131 }
132 132
133 @Override 133 @Override
134 - public List<SysDictDataDO> getDictDataList() { 134 + public List<SysDictDataDO> getDictDatas() {
135 List<SysDictDataDO> list = dictDataMapper.selectList(); 135 List<SysDictDataDO> list = dictDataMapper.selectList();
136 list.sort(COMPARATOR_TYPE_AND_SORT); 136 list.sort(COMPARATOR_TYPE_AND_SORT);
137 return list; 137 return list;
@@ -143,7 +143,7 @@ public class SysDictDataServiceImpl implements SysDictDataService { @@ -143,7 +143,7 @@ public class SysDictDataServiceImpl implements SysDictDataService {
143 } 143 }
144 144
145 @Override 145 @Override
146 - public List<SysDictDataDO> getDictDataList(SysDictDataExportReqVO reqVO) { 146 + public List<SysDictDataDO> getDictDatas(SysDictDataExportReqVO reqVO) {
147 List<SysDictDataDO> list = dictDataMapper.selectList(reqVO); 147 List<SysDictDataDO> list = dictDataMapper.selectList(reqVO);
148 list.sort(COMPARATOR_TYPE_AND_SORT); 148 list.sort(COMPARATOR_TYPE_AND_SORT);
149 return list; 149 return list;
src/main/java/cn/iocoder/dashboard/modules/system/service/logger/SysOperateLogService.java
@@ -19,7 +19,7 @@ public interface SysOperateLogService extends OperateLogFrameworkService { @@ -19,7 +19,7 @@ public interface SysOperateLogService extends OperateLogFrameworkService {
19 * @param reqVO 分页条件 19 * @param reqVO 分页条件
20 * @return 操作日志分页列表 20 * @return 操作日志分页列表
21 */ 21 */
22 - PageResult<SysOperateLogDO> pageOperateLog(SysOperateLogPageReqVO reqVO); 22 + PageResult<SysOperateLogDO> getOperateLogPage(SysOperateLogPageReqVO reqVO);
23 23
24 /** 24 /**
25 * 获得操作日志列表 25 * 获得操作日志列表
@@ -27,6 +27,6 @@ public interface SysOperateLogService extends OperateLogFrameworkService { @@ -27,6 +27,6 @@ public interface SysOperateLogService extends OperateLogFrameworkService {
27 * @param reqVO 列表条件 27 * @param reqVO 列表条件
28 * @return 日志列表 28 * @return 日志列表
29 */ 29 */
30 - List<SysOperateLogDO> listOperateLogs(SysOperateLogExportReqVO reqVO); 30 + List<SysOperateLogDO> getOperateLogs(SysOperateLogExportReqVO reqVO);
31 31
32 } 32 }
src/main/java/cn/iocoder/dashboard/modules/system/service/logger/impl/SysOperateLogServiceImpl.java
@@ -55,11 +55,11 @@ public class SysOperateLogServiceImpl implements SysOperateLogService { @@ -55,11 +55,11 @@ public class SysOperateLogServiceImpl implements SysOperateLogService {
55 } 55 }
56 56
57 @Override 57 @Override
58 - public PageResult<SysOperateLogDO> pageOperateLog(SysOperateLogPageReqVO reqVO) { 58 + public PageResult<SysOperateLogDO> getOperateLogPage(SysOperateLogPageReqVO reqVO) {
59 // 处理基于用户昵称的查询 59 // 处理基于用户昵称的查询
60 Collection<Long> userIds = null; 60 Collection<Long> userIds = null;
61 if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { 61 if (StrUtil.isNotEmpty(reqVO.getUserNickname())) {
62 - userIds = convertSet(userService.listUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId); 62 + userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId);
63 if (CollUtil.isEmpty(userIds)) { 63 if (CollUtil.isEmpty(userIds)) {
64 return PageResult.empty(); 64 return PageResult.empty();
65 } 65 }
@@ -69,11 +69,11 @@ public class SysOperateLogServiceImpl implements SysOperateLogService { @@ -69,11 +69,11 @@ public class SysOperateLogServiceImpl implements SysOperateLogService {
69 } 69 }
70 70
71 @Override 71 @Override
72 - public List<SysOperateLogDO> listOperateLogs(SysOperateLogExportReqVO reqVO) { 72 + public List<SysOperateLogDO> getOperateLogs(SysOperateLogExportReqVO reqVO) {
73 // 处理基于用户昵称的查询 73 // 处理基于用户昵称的查询
74 Collection<Long> userIds = null; 74 Collection<Long> userIds = null;
75 if (StrUtil.isNotEmpty(reqVO.getUserNickname())) { 75 if (StrUtil.isNotEmpty(reqVO.getUserNickname())) {
76 - userIds = convertSet(userService.listUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId); 76 + userIds = convertSet(userService.getUsersByNickname(reqVO.getUserNickname()), SysUserDO::getId);
77 if (CollUtil.isEmpty(userIds)) { 77 if (CollUtil.isEmpty(userIds)) {
78 return Collections.emptyList(); 78 return Collections.emptyList();
79 } 79 }
src/main/java/cn/iocoder/dashboard/modules/system/service/notice/SysNoticeService.java
@@ -12,22 +12,6 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.notice.SysNoticeDO; @@ -12,22 +12,6 @@ import cn.iocoder.dashboard.modules.system.dal.dataobject.notice.SysNoticeDO;
12 public interface SysNoticeService { 12 public interface SysNoticeService {
13 13
14 /** 14 /**
15 - * 获得岗位公告公告分页列表  
16 - *  
17 - * @param reqVO 分页条件  
18 - * @return 部门分页列表  
19 - */  
20 - PageResult<SysNoticeDO> pageNotices(SysNoticePageReqVO reqVO);  
21 -  
22 - /**  
23 - * 获得岗位公告公告信息  
24 - *  
25 - * @param id 岗位公告公告编号  
26 - * @return 岗位公告公告信息  
27 - */  
28 - SysNoticeDO getNotice(Long id);  
29 -  
30 - /**  
31 * 创建岗位公告公告 15 * 创建岗位公告公告
32 * 16 *
33 * @param reqVO 岗位公告公告信息 17 * @param reqVO 岗位公告公告信息
@@ -48,4 +32,21 @@ public interface SysNoticeService { @@ -48,4 +32,21 @@ public interface SysNoticeService {
48 * @param id 岗位公告公告编号 32 * @param id 岗位公告公告编号
49 */ 33 */
50 void deleteNotice(Long id); 34 void deleteNotice(Long id);
  35 +
  36 + /**
  37 + * 获得岗位公告公告分页列表
  38 + *
  39 + * @param reqVO 分页条件
  40 + * @return 部门分页列表
  41 + */
  42 + PageResult<SysNoticeDO> pageNotices(SysNoticePageReqVO reqVO);
  43 +
  44 + /**
  45 + * 获得岗位公告公告信息
  46 + *
  47 + * @param id 岗位公告公告编号
  48 + * @return 岗位公告公告信息
  49 + */
  50 + SysNoticeDO getNotice(Long id);
  51 +
51 } 52 }
src/main/java/cn/iocoder/dashboard/modules/system/service/notice/impl/SysNoticeServiceImpl.java
@@ -28,16 +28,6 @@ public class SysNoticeServiceImpl implements SysNoticeService { @@ -28,16 +28,6 @@ public class SysNoticeServiceImpl implements SysNoticeService {
28 private SysNoticeMapper noticeMapper; 28 private SysNoticeMapper noticeMapper;
29 29
30 @Override 30 @Override
31 - public PageResult<SysNoticeDO> pageNotices(SysNoticePageReqVO reqVO) {  
32 - return noticeMapper.selectPage(reqVO);  
33 - }  
34 -  
35 - @Override  
36 - public SysNoticeDO getNotice(Long id) {  
37 - return noticeMapper.selectById(id);  
38 - }  
39 -  
40 - @Override  
41 public Long createNotice(SysNoticeCreateReqVO reqVO) { 31 public Long createNotice(SysNoticeCreateReqVO reqVO) {
42 SysNoticeDO notice = SysNoticeConvert.INSTANCE.convert(reqVO); 32 SysNoticeDO notice = SysNoticeConvert.INSTANCE.convert(reqVO);
43 noticeMapper.insert(notice); 33 noticeMapper.insert(notice);
@@ -61,6 +51,16 @@ public class SysNoticeServiceImpl implements SysNoticeService { @@ -61,6 +51,16 @@ public class SysNoticeServiceImpl implements SysNoticeService {
61 noticeMapper.deleteById(id); 51 noticeMapper.deleteById(id);
62 } 52 }
63 53
  54 + @Override
  55 + public PageResult<SysNoticeDO> pageNotices(SysNoticePageReqVO reqVO) {
  56 + return noticeMapper.selectPage(reqVO);
  57 + }
  58 +
  59 + @Override
  60 + public SysNoticeDO getNotice(Long id) {
  61 + return noticeMapper.selectById(id);
  62 + }
  63 +
64 @VisibleForTesting 64 @VisibleForTesting
65 public void checkNoticeExists(Long id) { 65 public void checkNoticeExists(Long id) {
66 if (id == null) { 66 if (id == null) {
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysMenuService.java
@@ -21,11 +21,33 @@ public interface SysMenuService { @@ -21,11 +21,33 @@ public interface SysMenuService {
21 void initLocalCache(); 21 void initLocalCache();
22 22
23 /** 23 /**
  24 + * 创建菜单
  25 + *
  26 + * @param reqVO 菜单信息
  27 + * @return 创建出来的菜单编号
  28 + */
  29 + Long createMenu(SysMenuCreateReqVO reqVO);
  30 +
  31 + /**
  32 + * 更新菜单
  33 + *
  34 + * @param reqVO 菜单信息
  35 + */
  36 + void updateMenu(SysMenuUpdateReqVO reqVO);
  37 +
  38 + /**
  39 + * 删除菜单
  40 + *
  41 + * @param id 菜单编号
  42 + */
  43 + void deleteMenu(Long id);
  44 +
  45 + /**
24 * 获得所有菜单列表 46 * 获得所有菜单列表
25 * 47 *
26 * @return 菜单列表 48 * @return 菜单列表
27 */ 49 */
28 - List<SysMenuDO> listMenus(); 50 + List<SysMenuDO> getMenus();
29 51
30 /** 52 /**
31 * 筛选菜单列表 53 * 筛选菜单列表
@@ -33,7 +55,7 @@ public interface SysMenuService { @@ -33,7 +55,7 @@ public interface SysMenuService {
33 * @param reqVO 筛选条件请求 VO 55 * @param reqVO 筛选条件请求 VO
34 * @return 菜单列表 56 * @return 菜单列表
35 */ 57 */
36 - List<SysMenuDO> listMenus(SysMenuListReqVO reqVO); 58 + List<SysMenuDO> getMenus(SysMenuListReqVO reqVO);
37 59
38 /** 60 /**
39 * 获得所有菜单,从缓存中 61 * 获得所有菜单,从缓存中
@@ -67,28 +89,6 @@ public interface SysMenuService { @@ -67,28 +89,6 @@ public interface SysMenuService {
67 */ 89 */
68 List<SysMenuDO> getMenuListByPermissionFromCache(String permission); 90 List<SysMenuDO> getMenuListByPermissionFromCache(String permission);
69 91
70 - /*  
71 - * 创建菜单  
72 - *  
73 - * @param reqVO 菜单信息  
74 - * @return 创建出来的菜单编号  
75 - */  
76 - Long createMenu(SysMenuCreateReqVO reqVO);  
77 -  
78 - /**  
79 - * 更新菜单  
80 - *  
81 - * @param reqVO 菜单信息  
82 - */  
83 - void updateMenu(SysMenuUpdateReqVO reqVO);  
84 -  
85 - /**  
86 - * 删除菜单  
87 - *  
88 - * @param id 菜单编号  
89 - */  
90 - void deleteMenu(Long id);  
91 -  
92 /** 92 /**
93 * 获得菜单 93 * 获得菜单
94 * 94 *
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionService.java
@@ -32,8 +32,8 @@ public interface SysPermissionService extends SecurityPermissionFrameworkService @@ -32,8 +32,8 @@ public interface SysPermissionService extends SecurityPermissionFrameworkService
32 * @param menusStatuses 菜单状态数组 32 * @param menusStatuses 菜单状态数组
33 * @return 菜单列表 33 * @return 菜单列表
34 */ 34 */
35 - List<SysMenuDO> listRoleMenusFromCache(Collection<Long> roleIds, Collection<Integer> menuTypes,  
36 - Collection<Integer> menusStatuses); 35 + List<SysMenuDO> getRoleMenusFromCache(Collection<Long> roleIds, Collection<Integer> menuTypes,
  36 + Collection<Integer> menusStatuses);
37 37
38 /** 38 /**
39 * 获得用户拥有的角色编号集合 39 * 获得用户拥有的角色编号集合
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleService.java
@@ -25,6 +25,45 @@ public interface SysRoleService { @@ -25,6 +25,45 @@ public interface SysRoleService {
25 void initLocalCache(); 25 void initLocalCache();
26 26
27 /** 27 /**
  28 + * 创建角色
  29 + *
  30 + * @param reqVO 创建角色信息
  31 + * @return 角色编号
  32 + */
  33 + Long createRole(SysRoleCreateReqVO reqVO);
  34 +
  35 + /**
  36 + * 更新角色
  37 + *
  38 + * @param reqVO 更新角色信息
  39 + */
  40 + void updateRole(SysRoleUpdateReqVO reqVO);
  41 +
  42 + /**
  43 + * 删除角色
  44 + *
  45 + * @param id 角色编号
  46 + */
  47 + void deleteRole(Long id);
  48 +
  49 + /**
  50 + * 更新角色状态
  51 + *
  52 + * @param id 角色编号
  53 + * @param status 状态
  54 + */
  55 + void updateRoleStatus(Long id, Integer status);
  56 +
  57 + /**
  58 + * 设置角色的数据权限
  59 + *
  60 + * @param id 角色编号
  61 + * @param dataScope 数据范围
  62 + * @param dataScopeDeptIds 部门编号数组
  63 + */
  64 + void updateRoleDataScope(Long id, Integer dataScope, Set<Long> dataScopeDeptIds);
  65 +
  66 + /**
28 * 获得角色,从缓存中 67 * 获得角色,从缓存中
29 * 68 *
30 * @param id 角色编号 69 * @param id 角色编号
@@ -38,7 +77,7 @@ public interface SysRoleService { @@ -38,7 +77,7 @@ public interface SysRoleService {
38 * @param statuses 筛选的状态。允许空,空时不筛选 77 * @param statuses 筛选的状态。允许空,空时不筛选
39 * @return 角色列表 78 * @return 角色列表
40 */ 79 */
41 - List<SysRoleDO> listRoles(@Nullable Collection<Integer> statuses); 80 + List<SysRoleDO> getRoles(@Nullable Collection<Integer> statuses);
42 81
43 /** 82 /**
44 * 获得角色数组,从缓存中 83 * 获得角色数组,从缓存中
@@ -46,7 +85,7 @@ public interface SysRoleService { @@ -46,7 +85,7 @@ public interface SysRoleService {
46 * @param ids 角色编号数组 85 * @param ids 角色编号数组
47 * @return 角色数组 86 * @return 角色数组
48 */ 87 */
49 - List<SysRoleDO> listRolesFromCache(Collection<Long> ids); 88 + List<SysRoleDO> getRolesFromCache(Collection<Long> ids);
50 89
51 /** 90 /**
52 * 判断角色数组中,是否有管理员 91 * 判断角色数组中,是否有管理员
@@ -63,32 +102,10 @@ public interface SysRoleService { @@ -63,32 +102,10 @@ public interface SysRoleService {
63 * @return 是否有管理员 102 * @return 是否有管理员
64 */ 103 */
65 default boolean hasAnyAdmin(Set<Long> ids) { 104 default boolean hasAnyAdmin(Set<Long> ids) {
66 - return hasAnyAdmin(listRolesFromCache(ids)); 105 + return hasAnyAdmin(getRolesFromCache(ids));
67 } 106 }
68 107
69 /** 108 /**
70 - * 创建角色  
71 - *  
72 - * @param reqVO 创建角色信息  
73 - * @return 角色编号  
74 - */  
75 - Long createRole(SysRoleCreateReqVO reqVO);  
76 -  
77 - /**  
78 - * 更新角色  
79 - *  
80 - * @param reqVO 更新角色信息  
81 - */  
82 - void updateRole(SysRoleUpdateReqVO reqVO);  
83 -  
84 - /**  
85 - * 删除角色  
86 - *  
87 - * @param id 角色编号  
88 - */  
89 - void deleteRole(Long id);  
90 -  
91 - /**  
92 * 获得角色 109 * 获得角色
93 * 110 *
94 * @param id 角色编号 111 * @param id 角色编号
@@ -102,7 +119,7 @@ public interface SysRoleService { @@ -102,7 +119,7 @@ public interface SysRoleService {
102 * @param reqVO 角色分页查询 119 * @param reqVO 角色分页查询
103 * @return 角色分页结果 120 * @return 角色分页结果
104 */ 121 */
105 - PageResult<SysRoleDO> pageRole(SysRolePageReqVO reqVO); 122 + PageResult<SysRoleDO> getRolePage(SysRolePageReqVO reqVO);
106 123
107 /** 124 /**
108 * 获得角色列表 125 * 获得角色列表
@@ -110,23 +127,6 @@ public interface SysRoleService { @@ -110,23 +127,6 @@ public interface SysRoleService {
110 * @param reqVO 列表查询 127 * @param reqVO 列表查询
111 * @return 角色列表 128 * @return 角色列表
112 */ 129 */
113 - List<SysRoleDO> listRoles(SysRoleExportReqVO reqVO);  
114 -  
115 - /**  
116 - * 更新角色状态  
117 - *  
118 - * @param id 角色编号  
119 - * @param status 状态  
120 - */  
121 - void updateRoleStatus(Long id, Integer status);  
122 -  
123 - /**  
124 - * 设置角色的数据权限  
125 - *  
126 - * @param id 角色编号  
127 - * @param dataScope 数据范围  
128 - * @param dataScopeDeptIds 部门编号数组  
129 - */  
130 - void updateRoleDataScope(Long id, Integer dataScope, Set<Long> dataScopeDeptIds); 130 + List<SysRoleDO> getRoles(SysRoleExportReqVO reqVO);
131 131
132 } 132 }
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java
@@ -15,6 +15,7 @@ import cn.iocoder.dashboard.modules.system.redis.mq.producer.permission.SysMenuP @@ -15,6 +15,7 @@ import cn.iocoder.dashboard.modules.system.redis.mq.producer.permission.SysMenuP
15 import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; 15 import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService;
16 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; 16 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
17 import cn.iocoder.dashboard.util.collection.CollectionUtils; 17 import cn.iocoder.dashboard.util.collection.CollectionUtils;
  18 +import com.google.common.annotations.VisibleForTesting;
18 import com.google.common.collect.ImmutableMap; 19 import com.google.common.collect.ImmutableMap;
19 import com.google.common.collect.ImmutableMultimap; 20 import com.google.common.collect.ImmutableMultimap;
20 import com.google.common.collect.Multimap; 21 import com.google.common.collect.Multimap;
@@ -128,46 +129,6 @@ public class SysMenuServiceImpl implements SysMenuService { @@ -128,46 +129,6 @@ public class SysMenuServiceImpl implements SysMenuService {
128 } 129 }
129 130
130 @Override 131 @Override
131 - public List<SysMenuDO> listMenus() {  
132 - return menuMapper.selectList();  
133 - }  
134 -  
135 - @Override  
136 - public List<SysMenuDO> listMenus(SysMenuListReqVO reqVO) {  
137 - return menuMapper.selectList(reqVO);  
138 - }  
139 -  
140 - @Override  
141 - public List<SysMenuDO> listMenusFromCache(Collection<Integer> menuTypes, Collection<Integer> menusStatuses) {  
142 - // 任一一个参数为空,则返回空  
143 - if (CollectionUtils.isAnyEmpty(menuTypes, menusStatuses)) {  
144 - return Collections.emptyList();  
145 - }  
146 - // 创建新数组,避免缓存被修改  
147 - return menuCache.values().stream().filter(menu -> menuTypes.contains(menu.getType())  
148 - && menusStatuses.contains(menu.getStatus()))  
149 - .collect(Collectors.toList());  
150 - }  
151 -  
152 - @Override  
153 - public List<SysMenuDO> listMenusFromCache(Collection<Long> menuIds, Collection<Integer> menuTypes,  
154 - Collection<Integer> menusStatuses) {  
155 - // 任一一个参数为空,则返回空  
156 - if (CollectionUtils.isAnyEmpty(menuIds, menuTypes, menusStatuses)) {  
157 - return Collections.emptyList();  
158 - }  
159 - return menuCache.values().stream().filter(menu -> menuIds.contains(menu.getId())  
160 - && menuTypes.contains(menu.getType())  
161 - && menusStatuses.contains(menu.getStatus()))  
162 - .collect(Collectors.toList());  
163 - }  
164 -  
165 - @Override  
166 - public List<SysMenuDO> getMenuListByPermissionFromCache(String permission) {  
167 - return new ArrayList<>(permissionMenuCache.get(permission));  
168 - }  
169 -  
170 - @Override  
171 public Long createMenu(SysMenuCreateReqVO reqVO) { 132 public Long createMenu(SysMenuCreateReqVO reqVO) {
172 // 校验父菜单存在 133 // 校验父菜单存在
173 checkParentResource(reqVO.getParentId(), null); 134 checkParentResource(reqVO.getParentId(), null);
@@ -208,10 +169,6 @@ public class SysMenuServiceImpl implements SysMenuService { @@ -208,10 +169,6 @@ public class SysMenuServiceImpl implements SysMenuService {
208 */ 169 */
209 @Transactional(rollbackFor = Exception.class) 170 @Transactional(rollbackFor = Exception.class)
210 public void deleteMenu(Long menuId) { 171 public void deleteMenu(Long menuId) {
211 - // 校验更新的菜单是否存在  
212 - if (menuMapper.selectById(menuId) == null) {  
213 - throw ServiceExceptionUtil.exception(MENU_NOT_EXISTS);  
214 - }  
215 // 校验是否还有子菜单 172 // 校验是否还有子菜单
216 if (menuMapper.selectCountByParentId(menuId) > 0) { 173 if (menuMapper.selectCountByParentId(menuId) > 0) {
217 throw ServiceExceptionUtil.exception(MENU_EXISTS_CHILDREN); 174 throw ServiceExceptionUtil.exception(MENU_EXISTS_CHILDREN);
@@ -236,6 +193,46 @@ public class SysMenuServiceImpl implements SysMenuService { @@ -236,6 +193,46 @@ public class SysMenuServiceImpl implements SysMenuService {
236 } 193 }
237 194
238 @Override 195 @Override
  196 + public List<SysMenuDO> getMenus() {
  197 + return menuMapper.selectList();
  198 + }
  199 +
  200 + @Override
  201 + public List<SysMenuDO> getMenus(SysMenuListReqVO reqVO) {
  202 + return menuMapper.selectList(reqVO);
  203 + }
  204 +
  205 + @Override
  206 + public List<SysMenuDO> listMenusFromCache(Collection<Integer> menuTypes, Collection<Integer> menusStatuses) {
  207 + // 任一一个参数为空,则返回空
  208 + if (CollectionUtils.isAnyEmpty(menuTypes, menusStatuses)) {
  209 + return Collections.emptyList();
  210 + }
  211 + // 创建新数组,避免缓存被修改
  212 + return menuCache.values().stream().filter(menu -> menuTypes.contains(menu.getType())
  213 + && menusStatuses.contains(menu.getStatus()))
  214 + .collect(Collectors.toList());
  215 + }
  216 +
  217 + @Override
  218 + public List<SysMenuDO> listMenusFromCache(Collection<Long> menuIds, Collection<Integer> menuTypes,
  219 + Collection<Integer> menusStatuses) {
  220 + // 任一一个参数为空,则返回空
  221 + if (CollectionUtils.isAnyEmpty(menuIds, menuTypes, menusStatuses)) {
  222 + return Collections.emptyList();
  223 + }
  224 + return menuCache.values().stream().filter(menu -> menuIds.contains(menu.getId())
  225 + && menuTypes.contains(menu.getType())
  226 + && menusStatuses.contains(menu.getStatus()))
  227 + .collect(Collectors.toList());
  228 + }
  229 +
  230 + @Override
  231 + public List<SysMenuDO> getMenuListByPermissionFromCache(String permission) {
  232 + return new ArrayList<>(permissionMenuCache.get(permission));
  233 + }
  234 +
  235 + @Override
239 public SysMenuDO getMenu(Long id) { 236 public SysMenuDO getMenu(Long id) {
240 return menuMapper.selectById(id); 237 return menuMapper.selectById(id);
241 } 238 }
@@ -250,7 +247,8 @@ public class SysMenuServiceImpl implements SysMenuService { @@ -250,7 +247,8 @@ public class SysMenuServiceImpl implements SysMenuService {
250 * @param parentId 父菜单编号 247 * @param parentId 父菜单编号
251 * @param childId 当前菜单编号 248 * @param childId 当前菜单编号
252 */ 249 */
253 - private void checkParentResource(Long parentId, Long childId) { 250 + @VisibleForTesting
  251 + public void checkParentResource(Long parentId, Long childId) {
254 if (parentId == null || MenuIdEnum.ROOT.getId().equals(parentId)) { 252 if (parentId == null || MenuIdEnum.ROOT.getId().equals(parentId)) {
255 return; 253 return;
256 } 254 }
@@ -279,7 +277,8 @@ public class SysMenuServiceImpl implements SysMenuService { @@ -279,7 +277,8 @@ public class SysMenuServiceImpl implements SysMenuService {
279 * @param parentId 父菜单编号 277 * @param parentId 父菜单编号
280 * @param id 菜单编号 278 * @param id 菜单编号
281 */ 279 */
282 - private void checkResource(Long parentId, String name, Long id) { 280 + @VisibleForTesting
  281 + public void checkResource(Long parentId, String name, Long id) {
283 SysMenuDO menu = menuMapper.selectByParentIdAndName(parentId, name); 282 SysMenuDO menu = menuMapper.selectByParentIdAndName(parentId, name);
284 if (menu == null) { 283 if (menu == null) {
285 return; 284 return;
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java
@@ -86,6 +86,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { @@ -86,6 +86,7 @@ public class SysPermissionServiceImpl implements SysPermissionService {
86 @Override 86 @Override
87 @PostConstruct 87 @PostConstruct
88 public void initLocalCache() { 88 public void initLocalCache() {
  89 + Date now = new Date();
89 // 获取角色与菜单的关联列表,如果有更新 90 // 获取角色与菜单的关联列表,如果有更新
90 List<SysRoleMenuDO> roleMenuList = this.loadRoleMenuIfUpdate(maxUpdateTime); 91 List<SysRoleMenuDO> roleMenuList = this.loadRoleMenuIfUpdate(maxUpdateTime);
91 if (CollUtil.isEmpty(roleMenuList)) { 92 if (CollUtil.isEmpty(roleMenuList)) {
@@ -102,7 +103,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { @@ -102,7 +103,7 @@ public class SysPermissionServiceImpl implements SysPermissionService {
102 roleMenuCache = roleMenuCacheBuilder.build(); 103 roleMenuCache = roleMenuCacheBuilder.build();
103 menuRoleCache = menuRoleCacheBuilder.build(); 104 menuRoleCache = menuRoleCacheBuilder.build();
104 assert roleMenuList.size() > 0; // 断言,避免告警 105 assert roleMenuList.size() > 0; // 断言,避免告警
105 - maxUpdateTime = roleMenuList.stream().max(Comparator.comparing(BaseDO::getUpdateTime)).get().getUpdateTime(); 106 + maxUpdateTime = now;
106 log.info("[initLocalCache][初始化角色与菜单的关联数量为 {}]", roleMenuList.size()); 107 log.info("[initLocalCache][初始化角色与菜单的关联数量为 {}]", roleMenuList.size());
107 } 108 }
108 109
@@ -123,7 +124,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { @@ -123,7 +124,7 @@ public class SysPermissionServiceImpl implements SysPermissionService {
123 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据 124 if (maxUpdateTime == null) { // 如果更新时间为空,说明 DB 一定有新数据
124 log.info("[loadRoleMenuIfUpdate][首次加载全量角色与菜单的关联]"); 125 log.info("[loadRoleMenuIfUpdate][首次加载全量角色与菜单的关联]");
125 } else { // 判断数据库中是否有更新的角色与菜单的关联 126 } else { // 判断数据库中是否有更新的角色与菜单的关联
126 - if (!roleMenuMapper.selectExistsByUpdateTimeAfter(maxUpdateTime)) { 127 + if (Objects.isNull(roleMenuMapper.selectExistsByUpdateTimeAfter(maxUpdateTime))) {
127 return null; 128 return null;
128 } 129 }
129 log.info("[loadRoleMenuIfUpdate][增量加载全量角色与菜单的关联]"); 130 log.info("[loadRoleMenuIfUpdate][增量加载全量角色与菜单的关联]");
@@ -133,14 +134,14 @@ public class SysPermissionServiceImpl implements SysPermissionService { @@ -133,14 +134,14 @@ public class SysPermissionServiceImpl implements SysPermissionService {
133 } 134 }
134 135
135 @Override 136 @Override
136 - public List<SysMenuDO> listRoleMenusFromCache(Collection<Long> roleIds, Collection<Integer> menuTypes,  
137 - Collection<Integer> menusStatuses) { 137 + public List<SysMenuDO> getRoleMenusFromCache(Collection<Long> roleIds, Collection<Integer> menuTypes,
  138 + Collection<Integer> menusStatuses) {
138 // 任一一个参数为空时,不返回任何菜单 139 // 任一一个参数为空时,不返回任何菜单
139 if (CollectionUtils.isAnyEmpty(roleIds, menusStatuses, menusStatuses)) { 140 if (CollectionUtils.isAnyEmpty(roleIds, menusStatuses, menusStatuses)) {
140 return Collections.emptyList(); 141 return Collections.emptyList();
141 } 142 }
142 // 判断角色是否包含管理员 143 // 判断角色是否包含管理员
143 - List<SysRoleDO> roleList = roleService.listRolesFromCache(roleIds); 144 + List<SysRoleDO> roleList = roleService.getRolesFromCache(roleIds);
144 boolean hasAdmin = roleService.hasAnyAdmin(roleList); 145 boolean hasAdmin = roleService.hasAnyAdmin(roleList);
145 // 获得角色拥有的菜单关联 146 // 获得角色拥有的菜单关联
146 if (hasAdmin) { // 管理员,获取到全部 147 if (hasAdmin) { // 管理员,获取到全部
@@ -168,7 +169,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { @@ -168,7 +169,7 @@ public class SysPermissionServiceImpl implements SysPermissionService {
168 // 如果是管理员的情况下,获取全部菜单编号 169 // 如果是管理员的情况下,获取全部菜单编号
169 SysRoleDO role = roleService.getRole(roleId); 170 SysRoleDO role = roleService.getRole(roleId);
170 if (roleService.hasAnyAdmin(Collections.singletonList(role))) { 171 if (roleService.hasAnyAdmin(Collections.singletonList(role))) {
171 - return CollectionUtils.convertSet(menuService.listMenus(), SysMenuDO::getId); 172 + return CollectionUtils.convertSet(menuService.getMenus(), SysMenuDO::getId);
172 } 173 }
173 // 如果是非管理员的情况下,获得拥有的菜单编号 174 // 如果是非管理员的情况下,获得拥有的菜单编号
174 return CollectionUtils.convertSet(roleMenuMapper.selectListByRoleId(roleId), 175 return CollectionUtils.convertSet(roleMenuMapper.selectListByRoleId(roleId),
@@ -231,22 +232,41 @@ public class SysPermissionServiceImpl implements SysPermissionService { @@ -231,22 +232,41 @@ public class SysPermissionServiceImpl implements SysPermissionService {
231 } 232 }
232 233
233 @Override 234 @Override
  235 + @Transactional(rollbackFor = Exception.class)
234 public void processRoleDeleted(Long roleId) { 236 public void processRoleDeleted(Long roleId) {
235 - // TODO 实现我  
236 -// // 标记删除 RoleResource  
237 -// roleResourceMapper.deleteByRoleId(roleId);  
238 -// // 标记删除 AdminRole  
239 -// adminRoleMapper.deleteByRoleId(roleId); 237 + // 标记删除 UserRole
  238 + userRoleMapper.deleteListByRoleId(roleId);
  239 + // 标记删除 RoleMenu
  240 + roleMenuMapper.deleteListByRoleId(roleId);
  241 + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了
  242 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
  243 +
  244 + @Override
  245 + public void afterCommit() {
  246 + permissionProducer.sendRoleMenuRefreshMessage();
  247 + }
  248 +
  249 + });
240 } 250 }
241 251
242 @Override 252 @Override
  253 + @Transactional(rollbackFor = Exception.class)
243 public void processMenuDeleted(Long menuId) { 254 public void processMenuDeleted(Long menuId) {
244 - // TODO 实现我 255 + roleMenuMapper.deleteListByMenuId(menuId);
  256 + // 发送刷新消息. 注意,需要事务提交后,在进行发送刷新消息。不然 db 还未提交,结果缓存先刷新了
  257 + TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
  258 +
  259 + @Override
  260 + public void afterCommit() {
  261 + permissionProducer.sendRoleMenuRefreshMessage();
  262 + }
  263 +
  264 + });
245 } 265 }
246 266
247 @Override 267 @Override
248 public void processUserDeleted(Long userId) { 268 public void processUserDeleted(Long userId) {
249 - // TODO 实现我 269 + userRoleMapper.deleteListByUserId(userId);
250 } 270 }
251 271
252 @Override 272 @Override
@@ -305,7 +325,7 @@ public class SysPermissionServiceImpl implements SysPermissionService { @@ -305,7 +325,7 @@ public class SysPermissionServiceImpl implements SysPermissionService {
305 if (roleService.hasAnyAdmin(roleIds)) { 325 if (roleService.hasAnyAdmin(roleIds)) {
306 return true; 326 return true;
307 } 327 }
308 - Set<String> userRoles = CollectionUtils.convertSet(roleService.listRolesFromCache(roleIds), 328 + Set<String> userRoles = CollectionUtils.convertSet(roleService.getRolesFromCache(roleIds),
309 SysRoleDO::getCode); 329 SysRoleDO::getCode);
310 return CollUtil.containsAny(userRoles, Sets.newHashSet(roles)); 330 return CollUtil.containsAny(userRoles, Sets.newHashSet(roles));
311 } 331 }
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java
@@ -119,33 +119,6 @@ public class SysRoleServiceImpl implements SysRoleService { @@ -119,33 +119,6 @@ public class SysRoleServiceImpl implements SysRoleService {
119 } 119 }
120 120
121 @Override 121 @Override
122 - public SysRoleDO getRoleFromCache(Long id) {  
123 - return roleCache.get(id);  
124 - }  
125 -  
126 - @Override  
127 - public List<SysRoleDO> listRoles(@Nullable Collection<Integer> statuses) {  
128 - return roleMapper.selectListByStatus(statuses);  
129 - }  
130 -  
131 - @Override  
132 - public List<SysRoleDO> listRolesFromCache(Collection<Long> ids) {  
133 - if (CollectionUtil.isEmpty(ids)) {  
134 - return Collections.emptyList();  
135 - }  
136 - return roleCache.values().stream().filter(roleDO -> ids.contains(roleDO.getId()))  
137 - .collect(Collectors.toList());  
138 - }  
139 -  
140 - @Override  
141 - public boolean hasAnyAdmin(Collection<SysRoleDO> roleList) {  
142 - if (CollectionUtil.isEmpty(roleList)) {  
143 - return false;  
144 - }  
145 - return roleList.stream().anyMatch(roleDO -> RoleCodeEnum.ADMIN.getKey().equals(roleDO.getCode()));  
146 - }  
147 -  
148 - @Override  
149 public Long createRole(SysRoleCreateReqVO reqVO) { 122 public Long createRole(SysRoleCreateReqVO reqVO) {
150 // 校验角色 123 // 校验角色
151 checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null); 124 checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null);
@@ -174,6 +147,33 @@ public class SysRoleServiceImpl implements SysRoleService { @@ -174,6 +147,33 @@ public class SysRoleServiceImpl implements SysRoleService {
174 } 147 }
175 148
176 @Override 149 @Override
  150 + public void updateRoleStatus(Long id, Integer status) {
  151 + // 校验是否可以更新
  152 + this.checkUpdateRole(id);
  153 + // 更新状态
  154 + SysRoleDO updateObject = new SysRoleDO();
  155 + updateObject.setId(id);
  156 + updateObject.setStatus(status);
  157 + roleMapper.updateById(updateObject);
  158 + // 发送刷新消息
  159 + roleProducer.sendRoleRefreshMessage();
  160 + }
  161 +
  162 + @Override
  163 + public void updateRoleDataScope(Long id, Integer dataScope, Set<Long> dataScopeDeptIds) {
  164 + // 校验是否可以更新
  165 + checkUpdateRole(id);
  166 + // 更新数据范围
  167 + SysRoleDO updateObject = new SysRoleDO();
  168 + updateObject.setId(id);
  169 + updateObject.setDataScope(dataScope);
  170 + updateObject.setDataScopeDeptIds(dataScopeDeptIds);
  171 + roleMapper.updateById(updateObject);
  172 + // 发送刷新消息
  173 + roleProducer.sendRoleRefreshMessage();
  174 + }
  175 +
  176 + @Override
177 @Transactional(rollbackFor = Exception.class) 177 @Transactional(rollbackFor = Exception.class)
178 public void deleteRole(Long id) { 178 public void deleteRole(Long id) {
179 // 校验是否可以更新 179 // 校验是否可以更新
@@ -194,45 +194,45 @@ public class SysRoleServiceImpl implements SysRoleService { @@ -194,45 +194,45 @@ public class SysRoleServiceImpl implements SysRoleService {
194 } 194 }
195 195
196 @Override 196 @Override
197 - public SysRoleDO getRole(Long id) {  
198 - return roleMapper.selectById(id); 197 + public SysRoleDO getRoleFromCache(Long id) {
  198 + return roleCache.get(id);
199 } 199 }
200 200
201 @Override 201 @Override
202 - public PageResult<SysRoleDO> pageRole(SysRolePageReqVO reqVO) {  
203 - return roleMapper.selectPage(reqVO); 202 + public List<SysRoleDO> getRoles(@Nullable Collection<Integer> statuses) {
  203 + return roleMapper.selectListByStatus(statuses);
204 } 204 }
205 205
206 @Override 206 @Override
207 - public List<SysRoleDO> listRoles(SysRoleExportReqVO reqVO) {  
208 - return roleMapper.listRoles(reqVO); 207 + public List<SysRoleDO> getRolesFromCache(Collection<Long> ids) {
  208 + if (CollectionUtil.isEmpty(ids)) {
  209 + return Collections.emptyList();
  210 + }
  211 + return roleCache.values().stream().filter(roleDO -> ids.contains(roleDO.getId()))
  212 + .collect(Collectors.toList());
209 } 213 }
210 214
211 @Override 215 @Override
212 - public void updateRoleStatus(Long id, Integer status) {  
213 - // 校验是否可以更新  
214 - this.checkUpdateRole(id);  
215 - // 更新状态  
216 - SysRoleDO updateObject = new SysRoleDO();  
217 - updateObject.setId(id);  
218 - updateObject.setStatus(status);  
219 - roleMapper.updateById(updateObject);  
220 - // 发送刷新消息  
221 - roleProducer.sendRoleRefreshMessage(); 216 + public boolean hasAnyAdmin(Collection<SysRoleDO> roleList) {
  217 + if (CollectionUtil.isEmpty(roleList)) {
  218 + return false;
  219 + }
  220 + return roleList.stream().anyMatch(roleDO -> RoleCodeEnum.ADMIN.getKey().equals(roleDO.getCode()));
222 } 221 }
223 222
224 @Override 223 @Override
225 - public void updateRoleDataScope(Long id, Integer dataScope, Set<Long> dataScopeDeptIds) {  
226 - // 校验是否可以更新  
227 - checkUpdateRole(id);  
228 - // 更新数据范围  
229 - SysRoleDO updateObject = new SysRoleDO();  
230 - updateObject.setId(id);  
231 - updateObject.setDataScope(dataScope);  
232 - updateObject.setDataScopeDeptIds(dataScopeDeptIds);  
233 - roleMapper.updateById(updateObject);  
234 - // 发送刷新消息  
235 - roleProducer.sendRoleRefreshMessage(); 224 + public SysRoleDO getRole(Long id) {
  225 + return roleMapper.selectById(id);
  226 + }
  227 +
  228 + @Override
  229 + public PageResult<SysRoleDO> getRolePage(SysRolePageReqVO reqVO) {
  230 + return roleMapper.selectPage(reqVO);
  231 + }
  232 +
  233 + @Override
  234 + public List<SysRoleDO> getRoles(SysRoleExportReqVO reqVO) {
  235 + return roleMapper.listRoles(reqVO);
236 } 236 }
237 237
238 /** 238 /**
@@ -278,16 +278,10 @@ public class SysRoleServiceImpl implements SysRoleService { @@ -278,16 +278,10 @@ public class SysRoleServiceImpl implements SysRoleService {
278 } 278 }
279 } 279 }
280 280
281 -  
282 -// /**  
283 -// * 根据条件分页查询角色数据  
284 -// *  
285 -// * @param role 角色信息  
286 -// * @return 角色数据集合信息  
287 -// */  
288 // @Override 281 // @Override
289 // @DataScope(deptAlias = "d") 282 // @DataScope(deptAlias = "d")
290 // public List<SysRole> selectRoleList(SysRole role) { 283 // public List<SysRole> selectRoleList(SysRole role) {
291 // return roleMapper.selectRoleList(role); 284 // return roleMapper.selectRoleList(role);
292 // } 285 // }
  286 +
293 } 287 }
src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserService.java
@@ -2,12 +2,13 @@ package cn.iocoder.dashboard.modules.system.service.user; @@ -2,12 +2,13 @@ package cn.iocoder.dashboard.modules.system.service.user;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.iocoder.dashboard.common.pojo.PageResult; 4 import cn.iocoder.dashboard.common.pojo.PageResult;
  5 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
5 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; 7 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;
6 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO; 8 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO;
7 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO; 9 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO;
8 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO; 10 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO;
9 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; 11 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO;
10 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO;  
11 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; 12 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
12 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO; 13 import cn.iocoder.dashboard.modules.system.dal.dataobject.user.SysUserDO;
13 import cn.iocoder.dashboard.util.collection.CollectionUtils; 14 import cn.iocoder.dashboard.util.collection.CollectionUtils;
@@ -26,12 +27,74 @@ import java.util.Map; @@ -26,12 +27,74 @@ import java.util.Map;
26 public interface SysUserService { 27 public interface SysUserService {
27 28
28 /** 29 /**
  30 + * 创建用户
  31 + *
  32 + * @param reqVO 用户信息
  33 + * @return 用户编号
  34 + */
  35 + Long createUser(SysUserCreateReqVO reqVO);
  36 +
  37 + /**
  38 + * 修改用户
  39 + *
  40 + * @param reqVO 用户信息
  41 + */
  42 + void updateUser(SysUserUpdateReqVO reqVO);
  43 +
  44 + /**
  45 + * 修改用户个人信息
  46 + *
  47 + * @param id 用户编号
  48 + * @param reqVO 用户个人信息
  49 + */
  50 + void updateUserProfile(Long id, SysUserProfileUpdateReqVO reqVO);
  51 +
  52 + /**
  53 + * 修改用户个人密码
  54 + *
  55 + * @param id 用户编号
  56 + * @param reqVO 更新用户个人密码
  57 + */
  58 + void updateUserPassword(Long id, SysUserProfileUpdatePasswordReqVO reqVO);
  59 +
  60 + /**
  61 + * 更新用户头像
  62 + *
  63 + * @param id 用户 id
  64 + * @param avatarFile 头像文件
  65 + */
  66 + void updateUserAvatar(Long id, InputStream avatarFile);
  67 +
  68 + /**
  69 + * 修改密码
  70 + *
  71 + * @param id 用户编号
  72 + * @param password 密码
  73 + */
  74 + void updateUserPassword(Long id, String password);
  75 +
  76 + /**
  77 + * 修改密码
  78 + *
  79 + * @param id 用户编号
  80 + * @param status 状态
  81 + */
  82 + void updateUserStatus(Long id, Integer status);
  83 +
  84 + /**
  85 + * 删除用户
  86 + *
  87 + * @param id 用户编号
  88 + */
  89 + void deleteUser(Long id);
  90 +
  91 + /**
29 * 通过用户名查询用户 92 * 通过用户名查询用户
30 * 93 *
31 * @param username 用户名 94 * @param username 用户名
32 * @return 用户对象信息 95 * @return 用户对象信息
33 */ 96 */
34 - SysUserDO getUserByUserName(String username); 97 + SysUserDO getUserByUsername(String username);
35 98
36 /** 99 /**
37 * 通过用户 ID 查询用户 100 * 通过用户 ID 查询用户
@@ -47,7 +110,7 @@ public interface SysUserService { @@ -47,7 +110,7 @@ public interface SysUserService {
47 * @param reqVO 分页条件 110 * @param reqVO 分页条件
48 * @return 分页列表 111 * @return 分页列表
49 */ 112 */
50 - PageResult<SysUserDO> pageUsers(SysUserPageReqVO reqVO); 113 + PageResult<SysUserDO> getUserPage(SysUserPageReqVO reqVO);
51 114
52 /** 115 /**
53 * 获得用户列表 116 * 获得用户列表
@@ -55,7 +118,7 @@ public interface SysUserService { @@ -55,7 +118,7 @@ public interface SysUserService {
55 * @param reqVO 列表请求 118 * @param reqVO 列表请求
56 * @return 用户列表 119 * @return 用户列表
57 */ 120 */
58 - List<SysUserDO> listUsers(SysUserExportReqVO reqVO); 121 + List<SysUserDO> getUsers(SysUserExportReqVO reqVO);
59 122
60 /** 123 /**
61 * 获得用户列表 124 * 获得用户列表
@@ -63,7 +126,7 @@ public interface SysUserService { @@ -63,7 +126,7 @@ public interface SysUserService {
63 * @param ids 用户编号数组 126 * @param ids 用户编号数组
64 * @return 用户列表 127 * @return 用户列表
65 */ 128 */
66 - List<SysUserDO> listUsers(Collection<Long> ids); 129 + List<SysUserDO> getUsers(Collection<Long> ids);
67 130
68 /** 131 /**
69 * 获得用户 Map 132 * 获得用户 Map
@@ -75,7 +138,7 @@ public interface SysUserService { @@ -75,7 +138,7 @@ public interface SysUserService {
75 if (CollUtil.isEmpty(ids)) { 138 if (CollUtil.isEmpty(ids)) {
76 return new HashMap<>(); 139 return new HashMap<>();
77 } 140 }
78 - return CollectionUtils.convertMap(listUsers(ids), SysUserDO::getId); 141 + return CollectionUtils.convertMap(getUsers(ids), SysUserDO::getId);
79 } 142 }
80 143
81 /** 144 /**
@@ -84,7 +147,7 @@ public interface SysUserService { @@ -84,7 +147,7 @@ public interface SysUserService {
84 * @param nickname 昵称 147 * @param nickname 昵称
85 * @return 用户列表 148 * @return 用户列表
86 */ 149 */
87 - List<SysUserDO> listUsersByNickname(String nickname); 150 + List<SysUserDO> getUsersByNickname(String nickname);
88 151
89 /** 152 /**
90 * 获得用户列表,基于用户账号模糊匹配 153 * 获得用户列表,基于用户账号模糊匹配
@@ -92,53 +155,7 @@ public interface SysUserService { @@ -92,53 +155,7 @@ public interface SysUserService {
92 * @param username 用户账号 155 * @param username 用户账号
93 * @return 用户列表 156 * @return 用户列表
94 */ 157 */
95 - List<SysUserDO> listUsersByUsername(String username);  
96 -  
97 - /**  
98 - * 创建用户  
99 - *  
100 - * @param reqVO 用户信息  
101 - * @return 用户编号  
102 - */  
103 - Long createUser(SysUserCreateReqVO reqVO);  
104 -  
105 - /**  
106 - * 修改用户  
107 - *  
108 - * @param reqVO 用户信息  
109 - */  
110 - void updateUser(SysUserUpdateReqVO reqVO);  
111 -  
112 - /**  
113 - * 修改用户个人信息  
114 - *  
115 - * @param reqVO 用户个人信息  
116 - * @return 修改结果  
117 - */  
118 - void updateUserProfile(SysUserProfileUpdateReqVO reqVO);  
119 -  
120 - /**  
121 - * 删除用户  
122 - *  
123 - * @param id 用户编号  
124 - */  
125 - void deleteUser(Long id);  
126 -  
127 - /**  
128 - * 修改密码  
129 - *  
130 - * @param id 用户编号  
131 - * @param password 密码  
132 - */  
133 - void updateUserPassword(Long id, String password);  
134 -  
135 - /**  
136 - * 修改密码  
137 - *  
138 - * @param id 用户编号  
139 - * @param status 状态  
140 - */  
141 - void updateUserStatus(Long id, Integer status); 158 + List<SysUserDO> getUsersByUsername(String username);
142 159
143 /** 160 /**
144 * 批量导入用户 161 * 批量导入用户
@@ -149,47 +166,4 @@ public interface SysUserService { @@ -149,47 +166,4 @@ public interface SysUserService {
149 */ 166 */
150 SysUserImportRespVO importUsers(List<SysUserImportExcelVO> importUsers, boolean isUpdateSupport); 167 SysUserImportRespVO importUsers(List<SysUserImportExcelVO> importUsers, boolean isUpdateSupport);
151 168
152 - /**  
153 - * 更新用户头像  
154 - *  
155 - * @param id 用户 id  
156 - * @param avatarFile 头像文件  
157 - */  
158 - void updateAvatar(Long id, InputStream avatarFile);  
159 -  
160 -//  
161 -// /**  
162 -// * 修改用户基本信息  
163 -// *  
164 -// * @param user 用户信息  
165 -// * @return 结果  
166 -// */  
167 -// public int updateUserProfile(SysUser user);  
168 -//  
169 -// /**  
170 -// * 修改用户头像  
171 -// *  
172 -// * @param userName 用户名  
173 -// * @param avatar 头像地址  
174 -// * @return 结果  
175 -// */  
176 -// public boolean updateUserAvatar(String userName, String avatar);  
177 -//  
178 -// /**  
179 -// * 重置用户密码  
180 -// *  
181 -// * @param user 用户信息  
182 -// * @return 结果  
183 -// */  
184 -// public int resetPwd(SysUser user);  
185 -//  
186 -// /**  
187 -// * 重置用户密码  
188 -// *  
189 -// * @param userName 用户名  
190 -// * @param password 密码  
191 -// * @return 结果  
192 -// */  
193 -// public int resetUserPwd(String userName, String password);  
194 -  
195 } 169 }
src/main/java/cn/iocoder/dashboard/modules/system/service/user/SysUserServiceImpl.java
@@ -9,12 +9,13 @@ import cn.iocoder.dashboard.common.exception.ServiceException; @@ -9,12 +9,13 @@ import cn.iocoder.dashboard.common.exception.ServiceException;
9 import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil; 9 import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
10 import cn.iocoder.dashboard.common.pojo.PageResult; 10 import cn.iocoder.dashboard.common.pojo.PageResult;
11 import cn.iocoder.dashboard.modules.infra.service.file.InfFileService; 11 import cn.iocoder.dashboard.modules.infra.service.file.InfFileService;
  12 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdatePasswordReqVO;
  13 +import cn.iocoder.dashboard.modules.system.controller.user.vo.profile.SysUserProfileUpdateReqVO;
12 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO; 14 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserCreateReqVO;
13 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO; 15 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserExportReqVO;
14 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO; 16 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportExcelVO;
15 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO; 17 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserImportRespVO;
16 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO; 18 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserPageReqVO;
17 -import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserProfileUpdateReqVO;  
18 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO; 19 import cn.iocoder.dashboard.modules.system.controller.user.vo.user.SysUserUpdateReqVO;
19 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert; 20 import cn.iocoder.dashboard.modules.system.convert.user.SysUserConvert;
20 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO; 21 import cn.iocoder.dashboard.modules.system.dal.dataobject.dept.SysDeptDO;
@@ -61,65 +62,12 @@ public class SysUserServiceImpl implements SysUserService { @@ -61,65 +62,12 @@ public class SysUserServiceImpl implements SysUserService {
61 private SysPostService postService; 62 private SysPostService postService;
62 @Resource 63 @Resource
63 private SysPermissionService permissionService; 64 private SysPermissionService permissionService;
64 -  
65 @Resource 65 @Resource
66 private PasswordEncoder passwordEncoder; 66 private PasswordEncoder passwordEncoder;
67 -  
68 @Resource 67 @Resource
69 private InfFileService fileService; 68 private InfFileService fileService;
70 69
71 @Override 70 @Override
72 - public SysUserDO getUserByUserName(String username) {  
73 - return userMapper.selectByUsername(username);  
74 - }  
75 -  
76 - @Override  
77 - public SysUserDO getUser(Long id) {  
78 - return userMapper.selectById(id);  
79 - }  
80 -  
81 - @Override  
82 - public PageResult<SysUserDO> pageUsers(SysUserPageReqVO reqVO) {  
83 - return userMapper.selectPage(reqVO, this.getDeptCondition(reqVO.getDeptId()));  
84 - }  
85 -  
86 - @Override  
87 - public List<SysUserDO> listUsers(SysUserExportReqVO reqVO) {  
88 - return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId()));  
89 - }  
90 -  
91 - @Override  
92 - public List<SysUserDO> listUsers(Collection<Long> ids) {  
93 - return userMapper.selectBatchIds(ids);  
94 - }  
95 -  
96 - @Override  
97 - public List<SysUserDO> listUsersByNickname(String nickname) {  
98 - return userMapper.selectListByNickname(nickname);  
99 - }  
100 -  
101 - @Override  
102 - public List<SysUserDO> listUsersByUsername(String username) {  
103 - return userMapper.selectListByUsername(username);  
104 - }  
105 -  
106 - /**  
107 - * 获得部门条件:查询指定部门的子部门编号们,包括自身  
108 - *  
109 - * @param deptId 部门编号  
110 - * @return 部门编号集合  
111 - */  
112 - private Set<Long> getDeptCondition(Long deptId) {  
113 - if (deptId == null) {  
114 - return Collections.emptySet();  
115 - }  
116 - Set<Long> deptIds = CollectionUtils.convertSet(deptService.listDeptsByParentIdFromCache(  
117 - deptId, true), SysDeptDO::getId);  
118 - deptIds.add(deptId); // 包括自身  
119 - return deptIds;  
120 - }  
121 -  
122 - @Override  
123 public Long createUser(SysUserCreateReqVO reqVO) { 71 public Long createUser(SysUserCreateReqVO reqVO) {
124 // 校验正确性 72 // 校验正确性
125 this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(), 73 this.checkCreateOrUpdate(null, reqVO.getUsername(), reqVO.getMobile(), reqVO.getEmail(),
@@ -143,30 +91,35 @@ public class SysUserServiceImpl implements SysUserService { @@ -143,30 +91,35 @@ public class SysUserServiceImpl implements SysUserService {
143 } 91 }
144 92
145 @Override 93 @Override
146 - public void updateUserProfile(SysUserProfileUpdateReqVO reqVO) { 94 + public void updateUserProfile(Long id, SysUserProfileUpdateReqVO reqVO) {
147 // 校验正确性 95 // 校验正确性
148 - this.checkUserExists(reqVO.getId());  
149 - this.checkEmailUnique(reqVO.getId(), reqVO.getEmail());  
150 - this.checkMobileUnique(reqVO.getId(), reqVO.getMobile());  
151 - // 校验填写密码  
152 - String encode = null;  
153 - if (this.checkOldPassword(reqVO.getId(), reqVO.getOldPassword(), reqVO.getNewPassword())) {  
154 - // 更新密码  
155 - encode = passwordEncoder.encode(reqVO.getNewPassword());  
156 - }  
157 - SysUserDO updateObj = SysUserConvert.INSTANCE.convert(reqVO);  
158 - if (StrUtil.isNotBlank(encode)) {  
159 - updateObj.setPassword(encode);  
160 - } 96 + this.checkUserExists(id);
  97 + this.checkEmailUnique(id, reqVO.getEmail());
  98 + this.checkMobileUnique(id, reqVO.getMobile());
  99 + // 执行更新
  100 + userMapper.updateById(SysUserConvert.INSTANCE.convert(reqVO).setId(id));
  101 + }
  102 +
  103 + @Override
  104 + public void updateUserPassword(Long id, SysUserProfileUpdatePasswordReqVO reqVO) {
  105 + // 校验旧密码密码
  106 + this.checkOldPassword(id, reqVO.getOldPassword());
  107 + // 执行更新
  108 + SysUserDO updateObj = new SysUserDO().setId(id);
  109 + updateObj.setPassword(passwordEncoder.encode(reqVO.getNewPassword())); // 加密密码
161 userMapper.updateById(updateObj); 110 userMapper.updateById(updateObj);
162 } 111 }
163 112
164 @Override 113 @Override
165 - public void deleteUser(Long id) {  
166 - // 校验用户存在 114 + public void updateUserAvatar(Long id, InputStream avatarFile) {
167 this.checkUserExists(id); 115 this.checkUserExists(id);
168 - // 删除用户  
169 - userMapper.deleteById(id); 116 + // 存储文件
  117 + String avatar = fileService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile));
  118 + // 更新路径
  119 + SysUserDO sysUserDO = new SysUserDO();
  120 + sysUserDO.setId(id);
  121 + sysUserDO.setAvatar(avatar);
  122 + userMapper.updateById(sysUserDO);
170 } 123 }
171 124
172 @Override 125 @Override
@@ -193,6 +146,65 @@ public class SysUserServiceImpl implements SysUserService { @@ -193,6 +146,65 @@ public class SysUserServiceImpl implements SysUserService {
193 permissionService.processUserDeleted(id); 146 permissionService.processUserDeleted(id);
194 } 147 }
195 148
  149 + @Override
  150 + public void deleteUser(Long id) {
  151 + // 校验用户存在
  152 + this.checkUserExists(id);
  153 + // 删除用户
  154 + userMapper.deleteById(id);
  155 + }
  156 +
  157 + @Override
  158 + public SysUserDO getUserByUsername(String username) {
  159 + return userMapper.selectByUsername(username);
  160 + }
  161 +
  162 + @Override
  163 + public SysUserDO getUser(Long id) {
  164 + return userMapper.selectById(id);
  165 + }
  166 +
  167 + @Override
  168 + public PageResult<SysUserDO> getUserPage(SysUserPageReqVO reqVO) {
  169 + return userMapper.selectPage(reqVO, this.getDeptCondition(reqVO.getDeptId()));
  170 + }
  171 +
  172 + @Override
  173 + public List<SysUserDO> getUsers(SysUserExportReqVO reqVO) {
  174 + return userMapper.selectList(reqVO, this.getDeptCondition(reqVO.getDeptId()));
  175 + }
  176 +
  177 + @Override
  178 + public List<SysUserDO> getUsers(Collection<Long> ids) {
  179 + return userMapper.selectBatchIds(ids);
  180 + }
  181 +
  182 + @Override
  183 + public List<SysUserDO> getUsersByNickname(String nickname) {
  184 + return userMapper.selectListByNickname(nickname);
  185 + }
  186 +
  187 + @Override
  188 + public List<SysUserDO> getUsersByUsername(String username) {
  189 + return userMapper.selectListByUsername(username);
  190 + }
  191 +
  192 + /**
  193 + * 获得部门条件:查询指定部门的子部门编号们,包括自身
  194 + *
  195 + * @param deptId 部门编号
  196 + * @return 部门编号集合
  197 + */
  198 + private Set<Long> getDeptCondition(Long deptId) {
  199 + if (deptId == null) {
  200 + return Collections.emptySet();
  201 + }
  202 + Set<Long> deptIds = CollectionUtils.convertSet(deptService.getDeptsByParentIdFromCache(
  203 + deptId, true), SysDeptDO::getId);
  204 + deptIds.add(deptId); // 包括自身
  205 + return deptIds;
  206 + }
  207 +
196 private void checkCreateOrUpdate(Long id, String username, String mobile, String email, 208 private void checkCreateOrUpdate(Long id, String username, String mobile, String email,
197 Long deptId, Set<Long> postIds) { 209 Long deptId, Set<Long> postIds) {
198 // 校验用户存在 210 // 校验用户存在
@@ -287,7 +299,7 @@ public class SysUserServiceImpl implements SysUserService { @@ -287,7 +299,7 @@ public class SysUserServiceImpl implements SysUserService {
287 if (CollUtil.isEmpty(postIds)) { // 允许不选择 299 if (CollUtil.isEmpty(postIds)) { // 允许不选择
288 return; 300 return;
289 } 301 }
290 - List<SysPostDO> posts = postService.listPosts(postIds, null); 302 + List<SysPostDO> posts = postService.getPosts(postIds, null);
291 if (CollUtil.isEmpty(posts)) { 303 if (CollUtil.isEmpty(posts)) {
292 throw ServiceExceptionUtil.exception(POST_NOT_FOUND); 304 throw ServiceExceptionUtil.exception(POST_NOT_FOUND);
293 } 305 }
@@ -304,26 +316,19 @@ public class SysUserServiceImpl implements SysUserService { @@ -304,26 +316,19 @@ public class SysUserServiceImpl implements SysUserService {
304 } 316 }
305 317
306 /** 318 /**
307 - * 校验旧密码、新密码 319 + * 校验旧密码
308 * 320 *
309 * @param id 用户 id 321 * @param id 用户 id
310 * @param oldPassword 旧密码 322 * @param oldPassword 旧密码
311 - * @param newPassword 新密码  
312 - * @return 校验结果  
313 */ 323 */
314 - private boolean checkOldPassword(Long id, String oldPassword, String newPassword) {  
315 - if (id == null || StrUtil.isBlank(oldPassword) || StrUtil.isBlank(newPassword)) {  
316 - return false;  
317 - } 324 + private void checkOldPassword(Long id, String oldPassword) {
318 SysUserDO user = userMapper.selectById(id); 325 SysUserDO user = userMapper.selectById(id);
319 if (user == null) { 326 if (user == null) {
320 throw ServiceExceptionUtil.exception(USER_NOT_EXISTS); 327 throw ServiceExceptionUtil.exception(USER_NOT_EXISTS);
321 } 328 }
322 -  
323 if (!passwordEncoder.matches(oldPassword, user.getPassword())) { 329 if (!passwordEncoder.matches(oldPassword, user.getPassword())) {
324 throw ServiceExceptionUtil.exception(USER_PASSWORD_FAILED); 330 throw ServiceExceptionUtil.exception(USER_PASSWORD_FAILED);
325 } 331 }
326 - return true;  
327 } 332 }
328 333
329 @Override 334 @Override
@@ -364,16 +369,4 @@ public class SysUserServiceImpl implements SysUserService { @@ -364,16 +369,4 @@ public class SysUserServiceImpl implements SysUserService {
364 return respVO; 369 return respVO;
365 } 370 }
366 371
367 - @Override  
368 - public void updateAvatar(Long id, InputStream avatarFile) {  
369 - this.checkUserExists(id);  
370 - // 存储文件  
371 - String avatar = fileService.createFile(IdUtil.fastUUID(), IoUtil.readBytes(avatarFile));  
372 - // 更新路径  
373 - SysUserDO sysUserDO = new SysUserDO();  
374 - sysUserDO.setId(id);  
375 - sysUserDO.setAvatar(avatar);  
376 - userMapper.updateById(sysUserDO);  
377 - }  
378 -  
379 } 372 }
src/test-integration/java/cn/iocoder/dashboard/BaseRedisIntegrationTest.java 0 → 100644
  1 +package cn.iocoder.dashboard;
  2 +
  3 +import cn.iocoder.dashboard.framework.redis.config.RedisConfig;
  4 +import org.redisson.spring.starter.RedissonAutoConfiguration;
  5 +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
  6 +import org.springframework.boot.test.context.SpringBootTest;
  7 +import org.springframework.context.annotation.Import;
  8 +import org.springframework.test.context.ActiveProfiles;
  9 +
  10 +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisIntegrationTest.Application.class)
  11 +@ActiveProfiles("integration-test") // 设置使用 application-integration-test 配置文件
  12 +public class BaseRedisIntegrationTest {
  13 +
  14 + @Import({
  15 + // Redis 配置类
  16 + RedisAutoConfiguration.class, // Spring Redis 自动配置类
  17 + RedisConfig.class, // 自己的 Redis 配置类
  18 + RedissonAutoConfiguration.class, // Redisson 自动高配置类
  19 + })
  20 + public static class Application {
  21 + }
  22 +
  23 +}
src/test/java/cn/iocoder/dashboard/framework/quartz/core/scheduler/SchedulerManagerTest.java renamed to src/test-integration/java/cn/iocoder/dashboard/framework/quartz/core/SchedulerManagerTest.java
1 -package cn.iocoder.dashboard.framework.quartz.core.scheduler; 1 +package cn.iocoder.dashboard.framework.quartz.core;
2 2
3 import cn.hutool.core.util.StrUtil; 3 import cn.hutool.core.util.StrUtil;
4 import cn.iocoder.dashboard.BaseDbUnitTest; 4 import cn.iocoder.dashboard.BaseDbUnitTest;
  5 +import cn.iocoder.dashboard.framework.quartz.core.scheduler.SchedulerManager;
5 import cn.iocoder.dashboard.modules.system.job.auth.SysUserSessionTimeoutJob; 6 import cn.iocoder.dashboard.modules.system.job.auth.SysUserSessionTimeoutJob;
6 import org.junit.jupiter.api.Test; 7 import org.junit.jupiter.api.Test;
7 import org.quartz.SchedulerException; 8 import org.quartz.SchedulerException;
src/test-integration/java/cn/iocoder/dashboard/framework/redis/core/stream/RedisStreamTest.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.redis.core.stream;
  2 +
  3 +import cn.hutool.core.thread.ThreadUtil;
  4 +import cn.iocoder.dashboard.BaseRedisIntegrationTest;
  5 +import cn.iocoder.dashboard.framework.redis.core.util.RedisMessageUtils;
  6 +import cn.iocoder.dashboard.modules.system.mq.consumer.mail.SysMailSendConsumer;
  7 +import cn.iocoder.dashboard.modules.system.mq.consumer.sms.SysSmsSendConsumer;
  8 +import cn.iocoder.dashboard.modules.system.mq.message.mail.SysMailSendMessage;
  9 +import cn.iocoder.dashboard.modules.system.mq.message.sms.SysSmsSendMessage;
  10 +import org.junit.jupiter.api.Disabled;
  11 +import org.junit.jupiter.api.Test;
  12 +import org.springframework.context.annotation.Import;
  13 +import org.springframework.data.redis.core.RedisTemplate;
  14 +import org.springframework.data.redis.core.StringRedisTemplate;
  15 +
  16 +import javax.annotation.Resource;
  17 +import java.util.concurrent.TimeUnit;
  18 +
  19 +public class RedisStreamTest {
  20 +
  21 + @Import({SysSmsSendConsumer.class, SysMailSendConsumer.class})
  22 + @Disabled
  23 + public static class ConsumerTest extends BaseRedisIntegrationTest {
  24 +
  25 + @Test
  26 + public void testConsumer() {
  27 + ThreadUtil.sleep(1, TimeUnit.DAYS);
  28 + }
  29 +
  30 + }
  31 +
  32 + @Disabled
  33 + public static class ProducerTest extends BaseRedisIntegrationTest {
  34 +
  35 + @Resource
  36 + private StringRedisTemplate stringRedisTemplate;
  37 +
  38 + @Resource
  39 + private RedisTemplate<String, Object> redisTemplate;
  40 +
  41 + @Test
  42 + public void testProducer01() {
  43 + for (int i = 0; i < 100; i++) {
  44 + // 创建消息
  45 + SysSmsSendMessage message = new SysSmsSendMessage();
  46 + message.setMobile("15601691300").setTemplateCode("test:" + i);
  47 + // 发送消息
  48 + RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message);
  49 + }
  50 + }
  51 +
  52 + @Test
  53 + public void testProducer02() {
  54 + // 创建消息
  55 + SysMailSendMessage message = new SysMailSendMessage();
  56 + message.setAddress("fangfang@mihayou.com").setTemplateCode("test");
  57 + // 发送消息
  58 + RedisMessageUtils.sendStreamMessage(stringRedisTemplate, message);
  59 + }
  60 +
  61 + }
  62 +
  63 +}
src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java renamed to src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaColumnMapperTest.java
src/test/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java renamed to src/test-integration/java/cn/iocoder/dashboard/modules/tool/dal/mysql/codegen/ToolInformationSchemaTableMapperTest.java
src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenEngineTest.java renamed to src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenEngineTest.java
1 -package cn.iocoder.dashboard.modules.tool.service.codegen.impl; 1 +package cn.iocoder.dashboard.modules.tool.service.codegen;
2 2
3 import cn.iocoder.dashboard.BaseDbUnitTest; 3 import cn.iocoder.dashboard.BaseDbUnitTest;
4 import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO; 4 import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenColumnDO;
5 import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO; 5 import cn.iocoder.dashboard.modules.tool.dal.dataobject.codegen.ToolCodegenTableDO;
6 import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenColumnMapper; 6 import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenColumnMapper;
7 import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenTableMapper; 7 import cn.iocoder.dashboard.modules.tool.dal.mysql.codegen.ToolCodegenTableMapper;
  8 +import cn.iocoder.dashboard.modules.tool.service.codegen.impl.ToolCodegenEngine;
8 import org.junit.jupiter.api.Test; 9 import org.junit.jupiter.api.Test;
9 10
10 import javax.annotation.Resource; 11 import javax.annotation.Resource;
src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenSQLParserTest.java renamed to src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenSQLParserTest.java
1 -package cn.iocoder.dashboard.modules.tool.service.codegen.impl; 1 +package cn.iocoder.dashboard.modules.tool.service.codegen;
2 2
3 import cn.iocoder.dashboard.BaseDbUnitTest; 3 import cn.iocoder.dashboard.BaseDbUnitTest;
  4 +import cn.iocoder.dashboard.modules.tool.service.codegen.impl.ToolCodegenSQLParser;
4 import org.junit.jupiter.api.Test; 5 import org.junit.jupiter.api.Test;
5 6
6 public class ToolCodegenSQLParserTest extends BaseDbUnitTest { 7 public class ToolCodegenSQLParserTest extends BaseDbUnitTest {
src/test/java/cn/iocoder/dashboard/modules/tool/service/codegen/impl/ToolCodegenServiceImplTest.java renamed to src/test-integration/java/cn/iocoder/dashboard/modules/tool/service/codegen/ToolCodegenServiceImplTest.java
1 -package cn.iocoder.dashboard.modules.tool.service.codegen.impl; 1 +package cn.iocoder.dashboard.modules.tool.service.codegen;
2 2
3 import cn.iocoder.dashboard.BaseDbUnitTest; 3 import cn.iocoder.dashboard.BaseDbUnitTest;
  4 +import cn.iocoder.dashboard.modules.tool.service.codegen.impl.ToolCodegenServiceImpl;
4 import org.junit.jupiter.api.Test; 5 import org.junit.jupiter.api.Test;
5 6
6 import javax.annotation.Resource; 7 import javax.annotation.Resource;
src/test-integration/resources/application-integration-test.yaml 0 → 100644
  1 +spring:
  2 + main:
  3 + lazy-initialization: true # 开启懒加载,加快速度
  4 + banner-mode: off # 单元测试,禁用 Banner
  5 +
  6 +--- #################### 数据库相关配置 ####################
  7 +
  8 +spring:
  9 + # 数据源配置项
  10 + datasource:
  11 + name: ruoyi-vue-pro
  12 + url: jdbc:h2:mem:testdb;MODE=MYSQL;DATABASE_TO_UPPER=false; # MODE 使用 MySQL 模式;DATABASE_TO_UPPER 配置表和字段使用小写
  13 + driver-class-name: org.h2.Driver
  14 + username: sa
  15 + password:
  16 + schema: classpath:sql/create_tables.sql # MySQL 转 H2 的语句,使用 https://www.jooq.org/translate/ 工具
  17 + druid:
  18 + async-init: true # 单元测试,异步初始化 Druid 连接池,提升启动速度
  19 + initial-size: 1 # 单元测试,配置为 1,提升启动速度
  20 +
  21 + # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
  22 + redis:
  23 + host: 127.0.0.1 # 地址
  24 + port: 6379 # 端口(单元测试,使用 16379 端口)
  25 + database: 0 # 数据库索引
  26 +
  27 +mybatis:
  28 + lazy-initialization: true # 单元测试,设置 MyBatis Mapper 延迟加载,加速每个单元测试
  29 +
  30 +--- #################### 定时任务相关配置 ####################
  31 +
  32 +--- #################### 配置中心相关配置 ####################
  33 +
  34 +--- #################### 服务保障相关配置 ####################
  35 +
  36 +# Lock4j 配置项(单元测试,禁用 Lock4j)
  37 +
  38 +# Resilience4j 配置项
  39 +resilience4j:
  40 + ratelimiter:
  41 + instances:
  42 + backendA:
  43 + limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50
  44 + limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500
  45 + timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s
  46 + register-health-indicator: true # 是否注册到健康监测
  47 +
  48 +--- #################### 监控相关配置 ####################
  49 +
  50 +--- #################### 芋道相关配置 ####################
  51 +
  52 +# 芋道配置项,设置当前项目所有自定义的配置
  53 +yudao:
  54 + info:
  55 + version: 1.0.0
  56 + base-package: cn.iocoder.dashboard
  57 + web:
  58 + api-prefix: /api
  59 + controller-package: ${yudao.info.base-package}
  60 + security:
  61 + token-header: Authorization
  62 + token-secret: abcdefghijklmnopqrstuvwxyz
  63 + token-timeout: 1d
  64 + session-timeout: 30m
  65 + mock-enable: true
  66 + mock-secret: test
  67 + swagger:
  68 + enable: false # 单元测试,禁用 Swagger
  69 + captcha:
  70 + timeout: 5m
  71 + width: 160
  72 + height: 60
  73 + file:
  74 + base-path: http://127.0.0.1:${server.port}/${yudao.web.api-prefix}/file/get/
  75 + codegen:
  76 + base-package: ${yudao.info.base-package}.modules
  77 + db-schemas: ${spring.datasource.name}
  78 + xss:
  79 + enable: false
  80 + exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
  81 + - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
  82 + - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
src/test/java/cn/iocoder/dashboard/BaseDbAndRedisUnitTest.java
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; @@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
9 import org.redisson.spring.starter.RedissonAutoConfiguration; 9 import org.redisson.spring.starter.RedissonAutoConfiguration;
10 import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; 10 import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
11 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 11 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  12 +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
12 import org.springframework.boot.test.context.SpringBootTest; 13 import org.springframework.boot.test.context.SpringBootTest;
13 import org.springframework.context.annotation.Import; 14 import org.springframework.context.annotation.Import;
14 import org.springframework.test.context.ActiveProfiles; 15 import org.springframework.test.context.ActiveProfiles;
@@ -30,6 +31,7 @@ public class BaseDbAndRedisUnitTest { @@ -30,6 +31,7 @@ public class BaseDbAndRedisUnitTest {
30 // DB 配置类 31 // DB 配置类
31 DataSourceConfiguration.class, // 自己的 DB 配置类 32 DataSourceConfiguration.class, // 自己的 DB 配置类
32 DataSourceAutoConfiguration.class, // Spring DB 自动配置类 33 DataSourceAutoConfiguration.class, // Spring DB 自动配置类
  34 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
33 DruidDataSourceAutoConfigure.class, // Druid 自动配置类 35 DruidDataSourceAutoConfigure.class, // Druid 自动配置类
34 // MyBatis 配置类 36 // MyBatis 配置类
35 MybatisConfiguration.class, // 自己的 MyBatis 配置类 37 MybatisConfiguration.class, // 自己的 MyBatis 配置类
src/test/java/cn/iocoder/dashboard/BaseDbUnitTest.java
@@ -5,6 +5,7 @@ import cn.iocoder.dashboard.framework.mybatis.config.MybatisConfiguration; @@ -5,6 +5,7 @@ import cn.iocoder.dashboard.framework.mybatis.config.MybatisConfiguration;
5 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; 5 import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure;
6 import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; 6 import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
7 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; 7 import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
  8 +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
8 import org.springframework.boot.test.context.SpringBootTest; 9 import org.springframework.boot.test.context.SpringBootTest;
9 import org.springframework.context.annotation.Import; 10 import org.springframework.context.annotation.Import;
10 import org.springframework.test.context.ActiveProfiles; 11 import org.springframework.test.context.ActiveProfiles;
@@ -26,6 +27,7 @@ public class BaseDbUnitTest { @@ -26,6 +27,7 @@ public class BaseDbUnitTest {
26 // DB 配置类 27 // DB 配置类
27 DataSourceConfiguration.class, // 自己的 DB 配置类 28 DataSourceConfiguration.class, // 自己的 DB 配置类
28 DataSourceAutoConfiguration.class, // Spring DB 自动配置类 29 DataSourceAutoConfiguration.class, // Spring DB 自动配置类
  30 + DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
29 DruidDataSourceAutoConfigure.class, // Druid 自动配置类 31 DruidDataSourceAutoConfigure.class, // Druid 自动配置类
30 // MyBatis 配置类 32 // MyBatis 配置类
31 MybatisConfiguration.class, // 自己的 MyBatis 配置类 33 MybatisConfiguration.class, // 自己的 MyBatis 配置类
src/test/java/cn/iocoder/dashboard/config/RedisTestConfiguration.java
@@ -17,7 +17,7 @@ public class RedisTestConfiguration { @@ -17,7 +17,7 @@ public class RedisTestConfiguration {
17 /** 17 /**
18 * 创建模拟的 Redis Server 服务器 18 * 创建模拟的 Redis Server 服务器
19 */ 19 */
20 - @Bean(destroyMethod = "stop") 20 + @Bean
21 public RedisServer redisServer(RedisProperties properties) throws IOException { 21 public RedisServer redisServer(RedisProperties properties) throws IOException {
22 RedisServer redisServer = new RedisServer(properties.getPort()); 22 RedisServer redisServer = new RedisServer(properties.getPort());
23 // TODO 芋艿:一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。 23 // TODO 芋艿:一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。
src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobLogServiceTest.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.infra.service.job;
  2 +
  3 +import static cn.hutool.core.util.RandomUtil.randomEle;
  4 +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
  5 +import static cn.iocoder.dashboard.util.RandomUtils.randomLongId;
  6 +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo;
  7 +import static cn.iocoder.dashboard.util.RandomUtils.randomString;
  8 +import static cn.iocoder.dashboard.util.date.DateUtils.buildTime;
  9 +import static org.junit.jupiter.api.Assertions.assertEquals;
  10 +import static org.junit.jupiter.api.Assertions.assertNotNull;
  11 +
  12 +import java.util.ArrayList;
  13 +import java.util.List;
  14 +
  15 +import javax.annotation.Resource;
  16 +
  17 +import org.junit.jupiter.api.Test;
  18 +import org.springframework.context.annotation.Import;
  19 +
  20 +import cn.iocoder.dashboard.BaseDbUnitTest;
  21 +import cn.iocoder.dashboard.common.pojo.PageResult;
  22 +import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogExportReqVO;
  23 +import cn.iocoder.dashboard.modules.infra.controller.job.vo.log.InfJobLogPageReqVO;
  24 +import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobLogDO;
  25 +import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobLogMapper;
  26 +import cn.iocoder.dashboard.modules.infra.enums.job.InfJobLogStatusEnum;
  27 +import cn.iocoder.dashboard.modules.infra.service.job.impl.InfJobLogServiceImpl;
  28 +import cn.iocoder.dashboard.util.object.ObjectUtils;
  29 +
  30 +/**
  31 + * {@link InfJobLogServiceImpl} 的单元测试
  32 + *
  33 + * @author neilz
  34 + */
  35 +@Import(InfJobLogServiceImpl.class)
  36 +public class InfJobLogServiceTest extends BaseDbUnitTest {
  37 +
  38 + @Resource
  39 + private InfJobLogServiceImpl jobLogService;
  40 + @Resource
  41 + private InfJobLogMapper jobLogMapper;
  42 +
  43 + @Test
  44 + public void testCreateJobLog_success() {
  45 + // 准备参数
  46 + InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> {
  47 + o.setExecuteIndex(1);
  48 + });
  49 + // 调用
  50 + Long jobLogId = jobLogService.createJobLog(reqVO.getJobId(), reqVO.getBeginTime(), reqVO.getHandlerName(), reqVO.getHandlerParam(), reqVO.getExecuteIndex());
  51 + // 断言
  52 + assertNotNull(jobLogId);
  53 + // 校验记录的属性是否正确
  54 + InfJobLogDO job = jobLogMapper.selectById(jobLogId);
  55 + assertEquals(InfJobLogStatusEnum.RUNNING.getStatus(), job.getStatus());
  56 + }
  57 +
  58 + @Test
  59 + public void testUpdateJobLogResultAsync_success() {
  60 + // 准备参数
  61 + InfJobLogDO reqVO = randomPojo(InfJobLogDO.class, o -> {
  62 + o.setExecuteIndex(1);
  63 + });
  64 + InfJobLogDO log = InfJobLogDO.builder().jobId(reqVO.getJobId()).handlerName(reqVO.getHandlerName()).handlerParam(reqVO.getHandlerParam()).executeIndex(reqVO.getExecuteIndex())
  65 + .beginTime(reqVO.getBeginTime()).status(InfJobLogStatusEnum.RUNNING.getStatus()).build();
  66 + jobLogMapper.insert(log);
  67 + // 调用
  68 + jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), true,reqVO.getResult());
  69 + // 校验记录的属性是否正确
  70 + InfJobLogDO job = jobLogMapper.selectById(log.getId());
  71 + assertEquals(InfJobLogStatusEnum.SUCCESS.getStatus(), job.getStatus());
  72 +
  73 + // 调用
  74 + jobLogService.updateJobLogResultAsync(log.getId(), reqVO.getBeginTime(), reqVO.getDuration(), false,reqVO.getResult());
  75 + // 校验记录的属性是否正确
  76 + InfJobLogDO job2 = jobLogMapper.selectById(log.getId());
  77 + assertEquals(InfJobLogStatusEnum.FAILURE.getStatus(), job2.getStatus());
  78 + }
  79 +
  80 + @Test
  81 + public void testGetJobLogListByIds_success() {
  82 + // mock 数据
  83 + InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> {
  84 + o.setExecuteIndex(1);
  85 + o.setStatus(randomEle(InfJobLogStatusEnum.values()).getStatus()); // 保证 status 的范围
  86 + });
  87 + InfJobLogDO cloneJobLog = ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString()));
  88 + jobLogMapper.insert(dbJobLog);
  89 + // 测试 handlerName 不匹配
  90 + jobLogMapper.insert(cloneJobLog);
  91 + // 准备参数
  92 + ArrayList ids = new ArrayList<>();
  93 + ids.add(dbJobLog.getId());
  94 + ids.add(cloneJobLog.getId());
  95 + // 调用
  96 + List<InfJobLogDO> list = jobLogService.getJobLogList(ids);
  97 + // 断言
  98 + assertEquals(2, list.size());
  99 + assertPojoEquals(dbJobLog, list.get(0));
  100 + }
  101 +
  102 + @Test
  103 + public void testGetJobPage_success() {
  104 + // mock 数据
  105 + InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> {
  106 + o.setExecuteIndex(1);
  107 + o.setHandlerName("handlerName 单元测试");
  108 + o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus());
  109 + o.setBeginTime(buildTime(2021, 1, 8));
  110 + o.setEndTime(buildTime(2021, 1, 8));
  111 + });
  112 + jobLogMapper.insert(dbJobLog);
  113 + // 测试 jobId 不匹配
  114 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setJobId(randomLongId())));
  115 + // 测试 handlerName 不匹配
  116 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString())));
  117 + // 测试 beginTime 不匹配
  118 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7))));
  119 + // 测试 endTime 不匹配
  120 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9))));
  121 + // 测试 status 不匹配
  122 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus())));
  123 + // 准备参数
  124 + InfJobLogPageReqVO reqVo = new InfJobLogPageReqVO();
  125 + reqVo.setJobId(dbJobLog.getJobId());
  126 + reqVo.setHandlerName("单元");
  127 + reqVo.setBeginTime(dbJobLog.getBeginTime());
  128 + reqVo.setEndTime(dbJobLog.getEndTime());
  129 + reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus());
  130 + // 调用
  131 + PageResult<InfJobLogDO> pageResult = jobLogService.getJobLogPage(reqVo);
  132 + // 断言
  133 + assertEquals(1, pageResult.getTotal());
  134 + assertEquals(1, pageResult.getList().size());
  135 + assertPojoEquals(dbJobLog, pageResult.getList().get(0));
  136 + }
  137 +
  138 + @Test
  139 + public void testGetJobListForExport_success() {
  140 + // mock 数据
  141 + InfJobLogDO dbJobLog = randomPojo(InfJobLogDO.class, o -> {
  142 + o.setExecuteIndex(1);
  143 + o.setHandlerName("handlerName 单元测试");
  144 + o.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus());
  145 + o.setBeginTime(buildTime(2021, 1, 8));
  146 + o.setEndTime(buildTime(2021, 1, 8));
  147 + });
  148 + jobLogMapper.insert(dbJobLog);
  149 + // 测试 jobId 不匹配
  150 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setJobId(randomLongId())));
  151 + // 测试 handlerName 不匹配
  152 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setHandlerName(randomString())));
  153 + // 测试 beginTime 不匹配
  154 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setBeginTime(buildTime(2021, 1, 7))));
  155 + // 测试 endTime 不匹配
  156 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setEndTime(buildTime(2021, 1, 9))));
  157 + // 测试 status 不匹配
  158 + jobLogMapper.insert(ObjectUtils.clone(dbJobLog, o -> o.setStatus(InfJobLogStatusEnum.FAILURE.getStatus())));
  159 + // 准备参数
  160 + InfJobLogExportReqVO reqVo = new InfJobLogExportReqVO();
  161 + reqVo.setJobId(dbJobLog.getJobId());
  162 + reqVo.setHandlerName("单元");
  163 + reqVo.setBeginTime(dbJobLog.getBeginTime());
  164 + reqVo.setEndTime(dbJobLog.getEndTime());
  165 + reqVo.setStatus(InfJobLogStatusEnum.SUCCESS.getStatus());
  166 + // 调用
  167 + List<InfJobLogDO> list = jobLogService.getJobLogList(reqVo);
  168 + // 断言
  169 + assertEquals(1, list.size());
  170 + assertPojoEquals(dbJobLog, list.get(0));
  171 + }
  172 +
  173 +}
src/test/java/cn/iocoder/dashboard/modules/infra/service/job/InfJobServiceTest.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.infra.service.job;
  2 +
  3 +import static cn.hutool.core.util.RandomUtil.randomEle;
  4 +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_EQUALS;
  5 +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CHANGE_STATUS_INVALID;
  6 +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_CRON_EXPRESSION_VALID;
  7 +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_HANDLER_EXISTS;
  8 +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_NOT_EXISTS;
  9 +import static cn.iocoder.dashboard.modules.infra.enums.InfErrorCodeConstants.JOB_UPDATE_ONLY_NORMAL_STATUS;
  10 +import static cn.iocoder.dashboard.util.AssertUtils.assertPojoEquals;
  11 +import static cn.iocoder.dashboard.util.AssertUtils.assertServiceException;
  12 +import static cn.iocoder.dashboard.util.RandomUtils.randomPojo;
  13 +import static cn.iocoder.dashboard.util.RandomUtils.randomString;
  14 +import static org.junit.jupiter.api.Assertions.assertEquals;
  15 +import static org.junit.jupiter.api.Assertions.assertNotNull;
  16 +import static org.junit.jupiter.api.Assertions.assertNull;
  17 +import static org.mockito.ArgumentMatchers.eq;
  18 +import static org.mockito.Mockito.times;
  19 +import static org.mockito.Mockito.verify;
  20 +
  21 +import java.util.ArrayList;
  22 +import java.util.List;
  23 +
  24 +import javax.annotation.Resource;
  25 +
  26 +import org.junit.jupiter.api.Test;
  27 +import org.quartz.SchedulerException;
  28 +import org.springframework.boot.test.mock.mockito.MockBean;
  29 +import org.springframework.context.annotation.Import;
  30 +
  31 +import cn.iocoder.dashboard.BaseDbUnitTest;
  32 +import cn.iocoder.dashboard.common.pojo.PageResult;
  33 +import cn.iocoder.dashboard.framework.quartz.core.scheduler.SchedulerManager;
  34 +import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobCreateReqVO;
  35 +import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobExportReqVO;
  36 +import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobPageReqVO;
  37 +import cn.iocoder.dashboard.modules.infra.controller.job.vo.job.InfJobUpdateReqVO;
  38 +import cn.iocoder.dashboard.modules.infra.convert.job.InfJobConvert;
  39 +import cn.iocoder.dashboard.modules.infra.dal.dataobject.job.InfJobDO;
  40 +import cn.iocoder.dashboard.modules.infra.dal.mysql.job.InfJobMapper;
  41 +import cn.iocoder.dashboard.modules.infra.enums.job.InfJobStatusEnum;
  42 +import cn.iocoder.dashboard.modules.infra.service.job.impl.InfJobServiceImpl;
  43 +import cn.iocoder.dashboard.util.object.ObjectUtils;
  44 +
  45 +/**
  46 + * {@link InfJobServiceImpl} 的单元测试
  47 + *
  48 + * @author neilz
  49 + */
  50 +@Import(InfJobServiceImpl.class)
  51 +public class InfJobServiceTest extends BaseDbUnitTest {
  52 +
  53 + @Resource
  54 + private InfJobServiceImpl jobService;
  55 + @Resource
  56 + private InfJobMapper jobMapper;
  57 + @MockBean
  58 + private SchedulerManager schedulerManager;
  59 +
  60 + @Test
  61 + public void testCreateJob_cronExpressionValid() {
  62 + // 准备参数。Cron 表达式为 String 类型,默认随机字符串。
  63 + InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class);
  64 + // 调用,并断言异常
  65 + assertServiceException(() -> jobService.createJob(reqVO), JOB_CRON_EXPRESSION_VALID);
  66 + }
  67 +
  68 + @Test
  69 + public void testCreateJob_jobHandlerExists() throws SchedulerException {
  70 + // 准备参数 指定 Cron 表达式
  71 + InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
  72 + // 调用
  73 + jobService.createJob(reqVO);
  74 + // 调用,并断言异常
  75 + assertServiceException(() -> jobService.createJob(reqVO), JOB_HANDLER_EXISTS);
  76 + }
  77 +
  78 + @Test
  79 + public void testCreateJob_success() throws SchedulerException {
  80 + // 准备参数 指定 Cron 表达式
  81 + InfJobCreateReqVO reqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
  82 + // 调用
  83 + Long jobId = jobService.createJob(reqVO);
  84 + // 断言
  85 + assertNotNull(jobId);
  86 + // 校验记录的属性是否正确
  87 + InfJobDO job = jobMapper.selectById(jobId);
  88 + assertPojoEquals(reqVO, job);
  89 + assertEquals(InfJobStatusEnum.NORMAL.getStatus(), job.getStatus());
  90 + // 校验调用
  91 + verify(schedulerManager, times(1)).addJob(eq(job.getId()), eq(job.getHandlerName()), eq(job.getHandlerParam()), eq(job.getCronExpression()),
  92 + eq(reqVO.getRetryCount()), eq(reqVO.getRetryInterval()));
  93 + }
  94 +
  95 + @Test
  96 + public void testUpdateJob_jobNotExists(){
  97 + // 准备参数
  98 + InfJobUpdateReqVO reqVO = randomPojo(InfJobUpdateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
  99 + // 调用,并断言异常
  100 + assertServiceException(() -> jobService.updateJob(reqVO), JOB_NOT_EXISTS);
  101 + }
  102 +
  103 + @Test
  104 + public void testUpdateJob_onlyNormalStatus(){
  105 + // mock 数据
  106 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
  107 + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
  108 + job.setStatus(InfJobStatusEnum.INIT.getStatus());
  109 + fillJobMonitorTimeoutEmpty(job);
  110 + jobMapper.insert(job);
  111 + // 准备参数
  112 + InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> {
  113 + o.setId(job.getId());
  114 + o.setName(createReqVO.getName());
  115 + o.setCronExpression(createReqVO.getCronExpression());
  116 + });
  117 + // 调用,并断言异常
  118 + assertServiceException(() -> jobService.updateJob(updateReqVO), JOB_UPDATE_ONLY_NORMAL_STATUS);
  119 + }
  120 +
  121 + @Test
  122 + public void testUpdateJob_success() throws SchedulerException {
  123 + // mock 数据
  124 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
  125 + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
  126 + job.setStatus(InfJobStatusEnum.NORMAL.getStatus());
  127 + fillJobMonitorTimeoutEmpty(job);
  128 + jobMapper.insert(job);
  129 + // 准备参数
  130 + InfJobUpdateReqVO updateReqVO = randomPojo(InfJobUpdateReqVO.class, o -> {
  131 + o.setId(job.getId());
  132 + o.setName(createReqVO.getName());
  133 + o.setCronExpression(createReqVO.getCronExpression());
  134 + });
  135 + // 调用
  136 + jobService.updateJob(updateReqVO);
  137 + // 校验记录的属性是否正确
  138 + InfJobDO updateJob = jobMapper.selectById(updateReqVO.getId());
  139 + assertPojoEquals(updateReqVO, updateJob);
  140 + // 校验调用
  141 + verify(schedulerManager, times(1)).updateJob(eq(job.getHandlerName()), eq(updateReqVO.getHandlerParam()), eq(updateReqVO.getCronExpression()),
  142 + eq(updateReqVO.getRetryCount()), eq(updateReqVO.getRetryInterval()));
  143 + }
  144 +
  145 + @Test
  146 + public void testUpdateJobStatus_changeStatusInvalid() {
  147 + // 调用,并断言异常
  148 + assertServiceException(() -> jobService.updateJobStatus(1l, InfJobStatusEnum.INIT.getStatus()), JOB_CHANGE_STATUS_INVALID);
  149 + }
  150 +
  151 + @Test
  152 + public void testUpdateJobStatus_changeStatusEquals() {
  153 + // mock 数据
  154 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
  155 + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
  156 + job.setStatus(InfJobStatusEnum.NORMAL.getStatus());
  157 + fillJobMonitorTimeoutEmpty(job);
  158 + jobMapper.insert(job);
  159 + // 调用,并断言异常
  160 + assertServiceException(() -> jobService.updateJobStatus(job.getId(), job.getStatus()), JOB_CHANGE_STATUS_EQUALS);
  161 + }
  162 +
  163 + @Test
  164 + public void testUpdateJobStatus_NormalToStop_success() throws SchedulerException {
  165 + // mock 数据
  166 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
  167 + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
  168 + job.setStatus(InfJobStatusEnum.NORMAL.getStatus());
  169 + fillJobMonitorTimeoutEmpty(job);
  170 + jobMapper.insert(job);
  171 + // 调用
  172 + jobService.updateJobStatus(job.getId(), InfJobStatusEnum.STOP.getStatus());
  173 + // 校验记录的属性是否正确
  174 + InfJobDO updateJob = jobMapper.selectById(job.getId());
  175 + assertEquals(InfJobStatusEnum.STOP.getStatus(), updateJob.getStatus());
  176 + // 校验调用
  177 + verify(schedulerManager, times(1)).pauseJob(eq(job.getHandlerName()));
  178 + }
  179 +
  180 + @Test
  181 + public void testUpdateJobStatus_StopToNormal_success() throws SchedulerException {
  182 + // mock 数据
  183 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
  184 + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
  185 + job.setStatus(InfJobStatusEnum.STOP.getStatus());
  186 + fillJobMonitorTimeoutEmpty(job);
  187 + jobMapper.insert(job);
  188 + // 调用
  189 + jobService.updateJobStatus(job.getId(), InfJobStatusEnum.NORMAL.getStatus());
  190 + // 校验记录的属性是否正确
  191 + InfJobDO updateJob = jobMapper.selectById(job.getId());
  192 + assertEquals(InfJobStatusEnum.NORMAL.getStatus(), updateJob.getStatus());
  193 + // 校验调用
  194 + verify(schedulerManager, times(1)).resumeJob(eq(job.getHandlerName()));
  195 + }
  196 +
  197 + @Test
  198 + public void testTriggerJob_success() throws SchedulerException {
  199 + // mock 数据
  200 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
  201 + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
  202 + job.setStatus(InfJobStatusEnum.NORMAL.getStatus());
  203 + fillJobMonitorTimeoutEmpty(job);
  204 + jobMapper.insert(job);
  205 + // 调用
  206 + jobService.triggerJob(job.getId());
  207 + // 校验调用
  208 + verify(schedulerManager, times(1)).triggerJob(eq(job.getId()), eq(job.getHandlerName()), eq(job.getHandlerParam()));
  209 + }
  210 +
  211 + @Test
  212 + public void testDeleteJob_success() throws SchedulerException {
  213 + // mock 数据
  214 + InfJobCreateReqVO createReqVO = randomPojo(InfJobCreateReqVO.class, o -> o.setCronExpression("0 0/1 * * * ? *"));
  215 + InfJobDO job = InfJobConvert.INSTANCE.convert(createReqVO);
  216 + job.setStatus(InfJobStatusEnum.NORMAL.getStatus());
  217 + fillJobMonitorTimeoutEmpty(job);
  218 + jobMapper.insert(job);
  219 + // 调用 UPDATE inf_job SET deleted=1 WHERE id=? AND deleted=0
  220 + jobService.deleteJob(job.getId());
  221 + // 校验数据不存在了 WHERE id=? AND deleted=0 查询为空正常
  222 + assertNull(jobMapper.selectById(job.getId()));
  223 + // 校验调用
  224 + verify(schedulerManager, times(1)).deleteJob(eq(job.getHandlerName()));
  225 + }
  226 +
  227 + @Test
  228 + public void testGetJobListByIds_success() {
  229 + // mock 数据
  230 + InfJobDO dbJob = randomPojo(InfJobDO.class, o -> {
  231 + o.setStatus(randomEle(InfJobStatusEnum.values()).getStatus()); // 保证 status 的范围
  232 + });
  233 + InfJobDO cloneJob = ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString()));
  234 + jobMapper.insert(dbJob);
  235 + // 测试 handlerName 不匹配
  236 + jobMapper.insert(cloneJob);
  237 + // 准备参数
  238 + ArrayList ids = new ArrayList<>();
  239 + ids.add(dbJob.getId());
  240 + ids.add(cloneJob.getId());
  241 + // 调用
  242 + List<InfJobDO> list = jobService.getJobList(ids);
  243 + // 断言
  244 + assertEquals(2, list.size());
  245 + assertPojoEquals(dbJob, list.get(0));
  246 + }
  247 +
  248 + @Test
  249 + public void testGetJobPage_success() {
  250 + // mock 数据
  251 + InfJobDO dbJob = randomPojo(InfJobDO.class, o -> {
  252 + o.setName("定时任务测试");
  253 + o.setHandlerName("handlerName 单元测试");
  254 + o.setStatus(InfJobStatusEnum.INIT.getStatus());
  255 + });
  256 + jobMapper.insert(dbJob);
  257 + // 测试 name 不匹配
  258 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setName("土豆")));
  259 + // 测试 status 不匹配
  260 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus())));
  261 + // 测试 handlerName 不匹配
  262 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString())));
  263 + // 准备参数
  264 + InfJobPageReqVO reqVo = new InfJobPageReqVO();
  265 + reqVo.setName("定时");
  266 + reqVo.setStatus(InfJobStatusEnum.INIT.getStatus());
  267 + reqVo.setHandlerName("单元");
  268 + // 调用
  269 + PageResult<InfJobDO> pageResult = jobService.getJobPage(reqVo);
  270 + // 断言
  271 + assertEquals(1, pageResult.getTotal());
  272 + assertEquals(1, pageResult.getList().size());
  273 + assertPojoEquals(dbJob, pageResult.getList().get(0));
  274 + }
  275 +
  276 + @Test
  277 + public void testGetJobListForExport_success() {
  278 + // mock 数据
  279 + InfJobDO dbJob = randomPojo(InfJobDO.class, o -> {
  280 + o.setName("定时任务测试");
  281 + o.setHandlerName("handlerName 单元测试");
  282 + o.setStatus(InfJobStatusEnum.INIT.getStatus());
  283 + });
  284 + jobMapper.insert(dbJob);
  285 + // 测试 name 不匹配
  286 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setName("土豆")));
  287 + // 测试 status 不匹配
  288 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setStatus(InfJobStatusEnum.NORMAL.getStatus())));
  289 + // 测试 handlerName 不匹配
  290 + jobMapper.insert(ObjectUtils.clone(dbJob, o -> o.setHandlerName(randomString())));
  291 + // 准备参数
  292 + InfJobExportReqVO reqVo = new InfJobExportReqVO();
  293 + reqVo.setName("定时");
  294 + reqVo.setStatus(InfJobStatusEnum.INIT.getStatus());
  295 + reqVo.setHandlerName("单元");
  296 + // 调用
  297 + List<InfJobDO> list = jobService.getJobList(reqVo);
  298 + // 断言
  299 + assertEquals(1, list.size());
  300 + assertPojoEquals(dbJob, list.get(0));
  301 + }
  302 +
  303 + private static void fillJobMonitorTimeoutEmpty(InfJobDO job) {
  304 + if (job.getMonitorTimeout() == null) {
  305 + job.setMonitorTimeout(0);
  306 + }
  307 + }
  308 +
  309 +}
src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiAccessLogServiceImplTest.java
@@ -38,7 +38,6 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { @@ -38,7 +38,6 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest {
38 @Resource 38 @Resource
39 private InfApiAccessLogMapper infApiAccessLogMapper; 39 private InfApiAccessLogMapper infApiAccessLogMapper;
40 40
41 -  
42 @Test 41 @Test
43 public void testCreateApiAccessLogAsync() throws Exception { 42 public void testCreateApiAccessLogAsync() throws Exception {
44 ApiAccessLogCreateDTO createDTO = RandomUtils.randomPojo( 43 ApiAccessLogCreateDTO createDTO = RandomUtils.randomPojo(
@@ -59,13 +58,12 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { @@ -59,13 +58,12 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest {
59 assertPojoEquals(createDTO, infApiAccessLogDO); 58 assertPojoEquals(createDTO, infApiAccessLogDO);
60 } 59 }
61 60
62 -  
63 @Test 61 @Test
64 public void testGetApiAccessLogPage() { 62 public void testGetApiAccessLogPage() {
65 // 构造测试数据 63 // 构造测试数据
66 long userId = 2233L; 64 long userId = 2233L;
67 int userType = UserTypeEnum.ADMIN.getValue(); 65 int userType = UserTypeEnum.ADMIN.getValue();
68 - String applicationName = "ruoyi-test"; 66 + String applicationName = "yudao-test";
69 String requestUrl = "foo"; 67 String requestUrl = "foo";
70 Date beginTime = buildTime(2021, 3, 13); 68 Date beginTime = buildTime(2021, 3, 13);
71 int duration = 1000; 69 int duration = 1000;
@@ -123,7 +121,7 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { @@ -123,7 +121,7 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest {
123 // 构造测试数据 121 // 构造测试数据
124 long userId = 2233L; 122 long userId = 2233L;
125 int userType = UserTypeEnum.ADMIN.getValue(); 123 int userType = UserTypeEnum.ADMIN.getValue();
126 - String applicationName = "ruoyi-test"; 124 + String applicationName = "yudao-test";
127 String requestUrl = "foo"; 125 String requestUrl = "foo";
128 Date beginTime = buildTime(2021, 3, 13); 126 Date beginTime = buildTime(2021, 3, 13);
129 int duration = 1000; 127 int duration = 1000;
@@ -174,4 +172,5 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest { @@ -174,4 +172,5 @@ public class InfApiAccessLogServiceImplTest extends BaseDbUnitTest {
174 assertEquals(1, list.size()); 172 assertEquals(1, list.size());
175 assertPojoEquals(infApiAccessLogDO, list.get(0)); 173 assertPojoEquals(infApiAccessLogDO, list.get(0));
176 } 174 }
  175 +
177 } 176 }
src/test/java/cn/iocoder/dashboard/modules/infra/service/logger/InfApiErrorLogServiceImplTest.java
@@ -68,7 +68,7 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { @@ -68,7 +68,7 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest {
68 // 构造测试数据 68 // 构造测试数据
69 long userId = 2233L; 69 long userId = 2233L;
70 int userType = UserTypeEnum.ADMIN.getValue(); 70 int userType = UserTypeEnum.ADMIN.getValue();
71 - String applicationName = "ruoyi-test"; 71 + String applicationName = "yudao-test";
72 String requestUrl = "foo"; 72 String requestUrl = "foo";
73 Date beginTime = buildTime(2021, 3, 13); 73 Date beginTime = buildTime(2021, 3, 13);
74 int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus(); 74 int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus();
@@ -121,7 +121,7 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest { @@ -121,7 +121,7 @@ public class InfApiErrorLogServiceImplTest extends BaseDbUnitTest {
121 // 构造测试数据 121 // 构造测试数据
122 long userId = 2233L; 122 long userId = 2233L;
123 int userType = UserTypeEnum.ADMIN.getValue(); 123 int userType = UserTypeEnum.ADMIN.getValue();
124 - String applicationName = "ruoyi-test"; 124 + String applicationName = "yudao-test";
125 String requestUrl = "foo"; 125 String requestUrl = "foo";
126 Date beginTime = buildTime(2021, 3, 13); 126 Date beginTime = buildTime(2021, 3, 13);
127 int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus(); 127 int progressStatus = InfApiErrorLogProcessStatusEnum.INIT.getStatus();