From bcee37b84bde39072e6e35e642b0911a94f52eef Mon Sep 17 00:00:00 2001 From: RuoYi <yzz_ivy@163.com> Date: Mon, 11 Nov 2019 08:59:15 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8B=A5=E4=BE=9D=201.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +- ruoyi-ui/package.json | 2 +- ruoyi-ui/src/api/monitor/logininfor.js | 25 + ruoyi-ui/src/api/monitor/operlog.js | 25 + ruoyi-ui/src/api/system/config.js | 9 + ruoyi-ui/src/api/system/dict/data.js | 9 + ruoyi-ui/src/api/system/dict/type.js | 9 + ruoyi-ui/src/api/system/post.js | 9 + ruoyi-ui/src/api/system/role.js | 9 + ruoyi-ui/src/api/system/user.js | 11 +- ruoyi-ui/src/assets/styles/ruoyi.scss | 50 + ruoyi-ui/src/main.js | 3 +- ruoyi-ui/src/utils/ruoyi.js | 7 + .../src/views/monitor/logininfor/index.vue | 100 +- ruoyi-ui/src/views/monitor/online/index.vue | 12 +- ruoyi-ui/src/views/monitor/operlog/index.vue | 102 +- ruoyi-ui/src/views/system/config/index.vue | 103 ++- ruoyi-ui/src/views/system/dict/data.vue | 106 ++- ruoyi-ui/src/views/system/dict/index.vue | 112 ++- ruoyi-ui/src/views/system/notice/index.vue | 82 +- ruoyi-ui/src/views/system/post/index.vue | 104 ++- ruoyi-ui/src/views/system/role/index.vue | 99 +- ruoyi-ui/src/views/system/user/index.vue | 95 +- ruoyi-ui/vue.config.js | 2 +- ruoyi/pom.xml | 10 +- .../sql/{ry_20191008.sql => ry_20191111.sql} | 40 +- .../com/ruoyi/common/utils/poi/ExcelUtil.java | 872 ++++++++++++++++++ .../common/utils/reflect/ReflectUtils.java | 406 ++++++++ .../aspectj/lang/annotation/Excel.java | 113 +++ .../aspectj/lang/annotation/Excels.java | 18 + .../framework/config/SecurityConfig.java | 1 + .../ruoyi/framework/config/SwaggerConfig.java | 51 +- .../web/exception/GlobalExceptionHandler.java | 24 + .../project/common/CommonController.java | 43 + .../controller/SysLogininforController.java | 33 + .../controller/SysOperlogController.java | 32 + .../project/monitor/domain/SysLogininfor.java | 11 + .../project/monitor/domain/SysOperLog.java | 18 + .../monitor/mapper/SysLogininforMapper.java | 4 +- .../monitor/mapper/SysOperLogMapper.java | 4 +- .../service/ISysLogininforService.java | 4 +- .../monitor/service/ISysOperLogService.java | 4 +- .../impl/SysLogininforServiceImpl.java | 7 +- .../service/impl/SysOperLogServiceImpl.java | 10 +- .../controller/SysConfigController.java | 22 +- .../system/controller/SysDeptController.java | 7 +- .../controller/SysDictDataController.java | 24 +- .../controller/SysDictTypeController.java | 24 +- .../system/controller/SysMenuController.java | 6 +- .../controller/SysNoticeController.java | 5 +- .../system/controller/SysPostController.java | 22 +- .../system/controller/SysRoleController.java | 25 +- .../system/controller/SysUserController.java | 23 +- .../project/system/domain/SysConfig.java | 25 + .../ruoyi/project/system/domain/SysDept.java | 33 +- .../project/system/domain/SysDictData.java | 31 + .../project/system/domain/SysDictType.java | 23 + .../ruoyi/project/system/domain/SysMenu.java | 35 +- .../project/system/domain/SysNotice.java | 22 + .../ruoyi/project/system/domain/SysPost.java | 25 + .../ruoyi/project/system/domain/SysRole.java | 36 +- .../ruoyi/project/system/domain/SysUser.java | 51 +- .../system/mapper/SysConfigMapper.java | 10 +- .../system/mapper/SysDictDataMapper.java | 8 + .../system/mapper/SysDictTypeMapper.java | 8 + .../system/mapper/SysNoticeMapper.java | 8 + .../project/system/mapper/SysPostMapper.java | 8 + .../project/system/mapper/SysRoleMapper.java | 7 + .../project/system/mapper/SysUserMapper.java | 8 + .../system/service/ISysConfigService.java | 10 +- .../system/service/ISysDictDataService.java | 8 + .../system/service/ISysDictTypeService.java | 8 + .../system/service/ISysNoticeService.java | 8 + .../system/service/ISysPostService.java | 17 + .../system/service/ISysRoleService.java | 16 + .../system/service/ISysUserService.java | 8 + .../service/impl/SysConfigServiceImpl.java | 14 +- .../service/impl/SysDictDataServiceImpl.java | 11 + .../service/impl/SysDictTypeServiceImpl.java | 11 + .../service/impl/SysNoticeServiceImpl.java | 11 + .../service/impl/SysPostServiceImpl.java | 38 +- .../service/impl/SysRoleServiceImpl.java | 36 + .../service/impl/SysUserServiceImpl.java | 15 + ruoyi/src/main/resources/application.yml | 2 +- .../mybatis/monitor/SysLogininforMapper.xml | 2 +- .../mybatis/monitor/SysOperLogMapper.xml | 2 +- .../mybatis/system/SysConfigMapper.xml | 7 + .../mybatis/system/SysDictDataMapper.xml | 7 + .../mybatis/system/SysDictTypeMapper.xml | 7 + .../mybatis/system/SysNoticeMapper.xml | 7 + .../mybatis/system/SysPostMapper.xml | 7 + .../mybatis/system/SysRoleMapper.xml | 7 + .../mybatis/system/SysUserMapper.xml | 7 + 93 files changed, 3327 insertions(+), 237 deletions(-) rename ruoyi/sql/{ry_20191008.sql => ry_20191111.sql} (95%) create mode 100644 ruoyi/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java create mode 100644 ruoyi/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java create mode 100644 ruoyi/src/main/java/com/ruoyi/framework/aspectj/lang/annotation/Excel.java create mode 100644 ruoyi/src/main/java/com/ruoyi/framework/aspectj/lang/annotation/Excels.java diff --git a/README.md b/README.md index 3d24601..f171485 100644 --- a/README.md +++ b/README.md @@ -49,12 +49,12 @@ <td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td> </tr> <tr> - <td><img src="https://oscimg.oschina.net/oscnet/97fcdc766fa04c03722aef4b3d77f71e8d2.jpg"/></td> - <td><img src="https://oscimg.oschina.net/oscnet/642858372da91853c39e2d4746f036ea171.jpg"/></td> + <td><img src="https://oscimg.oschina.net/oscnet/707825ad3f29de74a8d6d02fbd73ad631ea.jpg"/></td> + <td><img src="https://oscimg.oschina.net/oscnet/46be40cc6f01aa300eed53a19b5012bf484.jpg"/></td> </tr> <tr> - <td><img src="https://oscimg.oschina.net/oscnet/8678d5204148e2610c9d02822274a961dcf.jpg"/></td> - <td><img src="https://oscimg.oschina.net/oscnet/feb2b25a08bf9dd121b8f51274ae935ead6.jpg"/></td> + <td><img src="https://oscimg.oschina.net/oscnet/4284796d4cea240d181b8f2201813dda710.jpg"/></td> + <td><img src="https://oscimg.oschina.net/oscnet/3ecfac87a049f7fe36abbcaafb2c40d36cf.jpg"/></td> </tr> <tr> <td><img src="https://oscimg.oschina.net/oscnet/71c2d48905221a09a728df4aff4160b8607.jpg"/></td> @@ -65,8 +65,8 @@ <td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td> </tr> <tr> - <td><img src="https://oscimg.oschina.net/oscnet/c162686bf3a39e3cd6b4fd6b5919f515ebf.jpg"/></td> - <td><img src="https://oscimg.oschina.net/oscnet/412fb931faa8b3e3de6f9cbbc5b7979cf36.jpg"/></td> + <td><img src="https://oscimg.oschina.net/oscnet/fdea1d8bb8625c27bf964176a2c8ebc6945.jpg"/></td> + <td><img src="https://oscimg.oschina.net/oscnet/509d2708cfd762b6e6339364cac1cc1970c.jpg"/></td> </tr> <tr> <td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td> diff --git a/ruoyi-ui/package.json b/ruoyi-ui/package.json index 1122913..ae3a5c3 100644 --- a/ruoyi-ui/package.json +++ b/ruoyi-ui/package.json @@ -1,6 +1,6 @@ { "name": "ruoyi", - "version": "1.0.0", + "version": "1.1.0", "description": "è‹¥ä¾ç®¡ç†ç³»ç»Ÿ", "author": "è‹¥ä¾", "license": "MIT", diff --git a/ruoyi-ui/src/api/monitor/logininfor.js b/ruoyi-ui/src/api/monitor/logininfor.js index 9914aaf..0b89cdc 100644 --- a/ruoyi-ui/src/api/monitor/logininfor.js +++ b/ruoyi-ui/src/api/monitor/logininfor.js @@ -7,4 +7,29 @@ export function list(query) { method: 'get', params: query }) +} + +// åˆ é™¤ç™»å½•æ—¥å¿— +export function delLogininfor(infoId) { + return request({ + url: '/monitor/logininfor/' + infoId, + method: 'delete' + }) +} + +// 清空登录日志 +export function cleanLogininfor() { + return request({ + url: '/monitor/logininfor/clean', + method: 'delete' + }) +} + +// 导出登录日志 +export function exportLogininfor(query) { + return request({ + url: '/monitor/logininfor/export', + method: 'get', + params: query + }) } \ No newline at end of file diff --git a/ruoyi-ui/src/api/monitor/operlog.js b/ruoyi-ui/src/api/monitor/operlog.js index a6088ad..c519355 100644 --- a/ruoyi-ui/src/api/monitor/operlog.js +++ b/ruoyi-ui/src/api/monitor/operlog.js @@ -7,4 +7,29 @@ export function list(query) { method: 'get', params: query }) +} + +// åˆ é™¤æ“作日志 +export function delOperlog(operId) { + return request({ + url: '/monitor/operlog/' + operId, + method: 'delete' + }) +} + +// 清空æ“作日志 +export function cleanOperlog() { + return request({ + url: '/monitor/operlog/clean', + method: 'delete' + }) +} + +// 导出æ“作日志 +export function exportOperlog(query) { + return request({ + url: '/monitor/operlog/export', + method: 'get', + params: query + }) } \ No newline at end of file diff --git a/ruoyi-ui/src/api/system/config.js b/ruoyi-ui/src/api/system/config.js index 6ed1050..124c981 100644 --- a/ruoyi-ui/src/api/system/config.js +++ b/ruoyi-ui/src/api/system/config.js @@ -49,4 +49,13 @@ export function delConfig(configId) { url: '/system/config/' + configId, method: 'delete' }) +} + +// å¯¼å‡ºå‚æ•° +export function exportConfig(query) { + return request({ + url: '/system/config/export', + method: 'get', + params: query + }) } \ No newline at end of file diff --git a/ruoyi-ui/src/api/system/dict/data.js b/ruoyi-ui/src/api/system/dict/data.js index a0fb115..6a3f418 100644 --- a/ruoyi-ui/src/api/system/dict/data.js +++ b/ruoyi-ui/src/api/system/dict/data.js @@ -49,4 +49,13 @@ export function delData(dictCode) { url: '/system/dict/data/' + dictCode, method: 'delete' }) +} + +// 导出å—å…¸æ•°æ® +export function exportData(query) { + return request({ + url: '/system/dict/data/export', + method: 'get', + params: query + }) } \ No newline at end of file diff --git a/ruoyi-ui/src/api/system/dict/type.js b/ruoyi-ui/src/api/system/dict/type.js index 749bfaa..80a6cfa 100644 --- a/ruoyi-ui/src/api/system/dict/type.js +++ b/ruoyi-ui/src/api/system/dict/type.js @@ -42,3 +42,12 @@ export function delType(dictId) { method: 'delete' }) } + +// 导出å—典类型 +export function exportType(query) { + return request({ + url: '/system/dict/type/export', + method: 'get', + params: query + }) +} diff --git a/ruoyi-ui/src/api/system/post.js b/ruoyi-ui/src/api/system/post.js index 1bdf069..fb124d9 100644 --- a/ruoyi-ui/src/api/system/post.js +++ b/ruoyi-ui/src/api/system/post.js @@ -41,4 +41,13 @@ export function delPost(postId) { url: '/system/post/' + postId, method: 'delete' }) +} + +// å¯¼å‡ºå²—ä½ +export function exportPost(query) { + return request({ + url: '/system/post/export', + method: 'get', + params: query + }) } \ No newline at end of file diff --git a/ruoyi-ui/src/api/system/role.js b/ruoyi-ui/src/api/system/role.js index 95a606d..736708c 100644 --- a/ruoyi-ui/src/api/system/role.js +++ b/ruoyi-ui/src/api/system/role.js @@ -63,4 +63,13 @@ export function delRole(roleId) { url: '/system/role/' + roleId, method: 'delete' }) +} + +// 导出角色 +export function exportRole(query) { + return request({ + url: '/system/role/export', + method: 'get', + params: query + }) } \ No newline at end of file diff --git a/ruoyi-ui/src/api/system/user.js b/ruoyi-ui/src/api/system/user.js index 55766af..3b1170e 100644 --- a/ruoyi-ui/src/api/system/user.js +++ b/ruoyi-ui/src/api/system/user.js @@ -43,6 +43,15 @@ export function delUser(userId) { }) } +// 导出用户 +export function exportUser(query) { + return request({ + url: '/system/user/export', + method: 'get', + params: query + }) +} + // 用户密ç é‡ç½® export function resetUserPwd(userId, password) { const data = { @@ -106,4 +115,4 @@ export function uploadAvatar(data) { method: 'post', data: data }) -} \ No newline at end of file +} diff --git a/ruoyi-ui/src/assets/styles/ruoyi.scss b/ruoyi-ui/src/assets/styles/ruoyi.scss index 7c3aca1..9e0cdc3 100644 --- a/ruoyi-ui/src/assets/styles/ruoyi.scss +++ b/ruoyi-ui/src/assets/styles/ruoyi.scss @@ -3,6 +3,56 @@ * Copyright (c) 2019 ruoyi */ + /** 基础通用 **/ +.pt5 { + padding-top: 5px; +} +.pr5 { + padding-right: 5px; +} +.pb5 { + padding-bottom: 5px; +} +.mt5 { + margin-top: 5px; +} +.mr5 { + margin-right: 5px; +} +.mb5 { + margin-bottom: 5px; +} +.mb8 { + margin-bottom: 8px; +} +.ml5 { + margin-left: 5px; +} +.mt10 { + margin-top: 10px; +} +.mr10 { + margin-right: 10px; +} +.mb10 { + margin-bottom: 10px; +} +.ml0 { + margin-left: 10px; +} +.mt20 { + margin-top: 20px; +} +.mr20 { + margin-right: 20px; +} +.mb20 { + margin-bottom: 20px; +} +.m20 { + margin-left: 20px; +} + .el-table .el-table__header-wrapper th { word-break: break-word; background-color: #f8f8f9; diff --git a/ruoyi-ui/src/main.js b/ruoyi-ui/src/main.js index 2b5419d..fbd3d6d 100644 --- a/ruoyi-ui/src/main.js +++ b/ruoyi-ui/src/main.js @@ -18,7 +18,7 @@ import './assets/icons' // icon import './permission' // permission control import { getDicts } from "@/api/system/dict/data"; import { getConfigKey } from "@/api/system/config"; -import { parseTime, resetForm, addDateRange, selectDictLabel } from "@/utils/ruoyi"; +import { parseTime, resetForm, addDateRange, selectDictLabel, download } from "@/utils/ruoyi"; import Pagination from "@/components/Pagination"; // 全局方法挂载 @@ -28,6 +28,7 @@ Vue.prototype.parseTime = parseTime Vue.prototype.resetForm = resetForm Vue.prototype.addDateRange = addDateRange Vue.prototype.selectDictLabel = selectDictLabel +Vue.prototype.download = download Vue.prototype.msgSuccess = function (msg) { this.$message({ showClose: true, message: msg, type: "success" }); diff --git a/ruoyi-ui/src/utils/ruoyi.js b/ruoyi-ui/src/utils/ruoyi.js index 6442ce2..db97dcc 100644 --- a/ruoyi-ui/src/utils/ruoyi.js +++ b/ruoyi-ui/src/utils/ruoyi.js @@ -3,6 +3,8 @@ * Copyright (c) 2019 ruoyi */ +const baseURL = process.env.VUE_APP_BASE_API + // æ—¥æœŸæ ¼å¼åŒ– export function parseTime(time, pattern) { if (arguments.length === 0) { @@ -73,6 +75,11 @@ export function selectDictLabel(datas, value) { return actions.join(''); } +// 通用下载方法 +export function download(fileName) { + window.location.href = baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true; +} + // å—ç¬¦ä¸²æ ¼å¼åŒ–(%s ) export function sprintf(str) { var args = arguments, flag = true, i = 1; diff --git a/ruoyi-ui/src/views/monitor/logininfor/index.vue b/ruoyi-ui/src/views/monitor/logininfor/index.vue index 1e3811e..9dee330 100644 --- a/ruoyi-ui/src/views/monitor/logininfor/index.vue +++ b/ruoyi-ui/src/views/monitor/logininfor/index.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> - <el-form :inline="true" label-width="68px"> - <el-form-item label="登录地å€"> + <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> + <el-form-item label="登录地å€" prop="ipaddr"> <el-input v-model="queryParams.ipaddr" placeholder="请输入登录地å€" @@ -11,7 +11,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="用户åç§°"> + <el-form-item label="用户åç§°" prop="userName"> <el-input v-model="queryParams.userName" placeholder="请输入用户åç§°" @@ -21,7 +21,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="状æ€"> + <el-form-item label="状æ€" prop="status"> <el-select v-model="queryParams.status" placeholder="登录状æ€" @@ -51,10 +51,43 @@ </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æœç´¢</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">é‡ç½®</el-button> </el-form-item> </el-form> - <el-table v-loading="loading" :data="list" style="width: 100%;"> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['monitor:logininfor:remove']" + >åˆ é™¤</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + @click="handleClean" + v-hasPermi="['monitor:logininfor:remove']" + >清空</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + icon="el-icon-download" + size="mini" + @click="handleExport" + v-hasPermi="['system:logininfor:export']" + >导出</el-button> + </el-col> + </el-row> + + <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> <el-table-column label="访问编å·" align="center" prop="infoId" /> <el-table-column label="用户åç§°" align="center" prop="userName" /> <el-table-column label="登录地å€" align="center" prop="ipaddr" width="130" :show-overflow-tooltip="true" /> @@ -81,13 +114,17 @@ </template> <script> -import { list } from "@/api/monitor/logininfor"; +import { list, delLogininfor, cleanLogininfor, exportLogininfor } from "@/api/monitor/logininfor"; export default { data() { return { // é®ç½©å±‚ loading: true, + // 选䏿•°ç»„ + ids: [], + // éžå¤šä¸ªç¦ç”¨ + multiple: true, // æ€»æ¡æ•° total: 0, // è¡¨æ ¼æ•°æ® @@ -131,6 +168,57 @@ export default { handleQuery() { this.queryParams.pageNum = 1; this.getList(); + }, + /** é‡ç½®æŒ‰é’®æ“作 */ + resetQuery() { + this.dateRange = []; + this.resetForm("queryForm"); + this.handleQuery(); + }, + // å¤šé€‰æ¡†é€‰ä¸æ•°æ® + handleSelectionChange(selection) { + this.ids = selection.map(item => item.infoId) + this.multiple = !selection.length + }, + /** åˆ é™¤æŒ‰é’®æ“作 */ + handleDelete(row) { + const infoIds = row.infoId || this.ids; + this.$confirm('是å¦ç¡®è®¤åˆ 除访问编å·ä¸º"' + infoIds + '"的数æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return delLogininfor(infoIds); + }).then(() => { + this.getList(); + this.msgSuccess("åˆ é™¤æˆåŠŸ"); + }).catch(function() {}); + }, + /** 清空按钮æ“作 */ + handleClean() { + this.$confirm('是å¦ç¡®è®¤æ¸…空所有登录日志数æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return cleanLogininfor(); + }).then(() => { + this.getList(); + this.msgSuccess("清空æˆåŠŸ"); + }).catch(function() {}); + }, + /** 导出按钮æ“作 */ + handleExport() { + const queryParams = this.queryParams; + this.$confirm('是å¦ç¡®è®¤å¯¼å‡ºæ‰€æœ‰æ“作日志数æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return exportLogininfor(queryParams); + }).then(response => { + this.download(response.msg); + }).catch(function() {}); } } }; diff --git a/ruoyi-ui/src/views/monitor/online/index.vue b/ruoyi-ui/src/views/monitor/online/index.vue index 17104de..e5b4b1f 100644 --- a/ruoyi-ui/src/views/monitor/online/index.vue +++ b/ruoyi-ui/src/views/monitor/online/index.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> - <el-form :inline="true"> - <el-form-item label="登录地å€"> + <el-form :model="queryParams" ref="queryForm" :inline="true"> + <el-form-item label="登录地å€" prop="ipaddr"> <el-input v-model="queryParams.ipaddr" placeholder="请输入登录地å€" @@ -10,7 +10,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="用户åç§°"> + <el-form-item label="用户åç§°" prop="userName"> <el-input v-model="queryParams.userName" placeholder="请输入用户åç§°" @@ -21,6 +21,7 @@ </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æœç´¢</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">é‡ç½®</el-button> </el-form-item> </el-form> @@ -102,6 +103,11 @@ export default { this.pageNum = 1; this.getList(); }, + /** é‡ç½®æŒ‰é’®æ“作 */ + resetQuery() { + this.resetForm("queryForm"); + this.handleQuery(); + }, /** 强退按钮æ“作 */ handleForceLogout(row) { this.$confirm('是å¦ç¡®è®¤å¼ºé€€å称为"' + row.userName + '"的数æ®é¡¹?', "è¦å‘Š", { diff --git a/ruoyi-ui/src/views/monitor/operlog/index.vue b/ruoyi-ui/src/views/monitor/operlog/index.vue index 9ea7f77..187de28 100644 --- a/ruoyi-ui/src/views/monitor/operlog/index.vue +++ b/ruoyi-ui/src/views/monitor/operlog/index.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> - <el-form :inline="true" label-width="68px"> - <el-form-item label="系统模å—"> + <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> + <el-form-item label="系统模å—" prop="title"> <el-input v-model="queryParams.title" placeholder="请输入系统模å—" @@ -11,7 +11,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="æ“作人员"> + <el-form-item label="æ“作人员" prop="operName"> <el-input v-model="queryParams.operName" placeholder="请输入æ“作人员" @@ -21,7 +21,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="类型"> + <el-form-item label="类型" prop="businessType"> <el-select v-model="queryParams.businessType" placeholder="æ“作类型" @@ -37,7 +37,7 @@ /> </el-select> </el-form-item> - <el-form-item label="状æ€"> + <el-form-item label="状æ€" prop="status"> <el-select v-model="queryParams.status" placeholder="æ“作状æ€" @@ -67,10 +67,43 @@ </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æœç´¢</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">é‡ç½®</el-button> </el-form-item> </el-form> - <el-table v-loading="loading" :data="list" style="width: 100%;"> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['monitor:operlog:remove']" + >åˆ é™¤</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + @click="handleClean" + v-hasPermi="['monitor:operlog:remove']" + >清空</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + icon="el-icon-download" + size="mini" + @click="handleExport" + v-hasPermi="['system:config:export']" + >导出</el-button> + </el-col> + </el-row> + + <el-table v-loading="loading" :data="list" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> <el-table-column label="日志编å·" align="center" prop="operId" /> <el-table-column label="系统模å—" align="center" prop="title" /> <el-table-column label="æ“作类型" align="center" prop="businessType" :formatter="typeFormat" /> @@ -150,13 +183,17 @@ </template> <script> -import { list } from "@/api/monitor/operlog"; +import { list, delOperlog, cleanOperlog, exportOperlog } from "@/api/monitor/operlog"; export default { data() { return { // é®ç½©å±‚ loading: true, + // 选䏿•°ç»„ + ids: [], + // éžå¤šä¸ªç¦ç”¨ + multiple: true, // æ€»æ¡æ•° total: 0, // è¡¨æ ¼æ•°æ® @@ -215,10 +252,61 @@ export default { this.queryParams.pageNum = 1; this.getList(); }, + /** é‡ç½®æŒ‰é’®æ“作 */ + resetQuery() { + this.dateRange = []; + this.resetForm("queryForm"); + this.handleQuery(); + }, + // å¤šé€‰æ¡†é€‰ä¸æ•°æ® + handleSelectionChange(selection) { + this.ids = selection.map(item => item.operId) + this.multiple = !selection.length + }, /** 详细按钮æ“作 */ handleView(row) { this.open = true; this.form = row; + }, + /** åˆ é™¤æŒ‰é’®æ“作 */ + handleDelete(row) { + const operIds = row.operId || this.ids; + this.$confirm('是å¦ç¡®è®¤åˆ 除日志编å·ä¸º"' + operIds + '"的数æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return delOperlog(operIds); + }).then(() => { + this.getList(); + this.msgSuccess("åˆ é™¤æˆåŠŸ"); + }).catch(function() {}); + }, + /** 清空按钮æ“作 */ + handleClean() { + this.$confirm('是å¦ç¡®è®¤æ¸…空所有æ“作日志数æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return cleanOperlog(); + }).then(() => { + this.getList(); + this.msgSuccess("清空æˆåŠŸ"); + }).catch(function() {}); + }, + /** 导出按钮æ“作 */ + handleExport() { + const queryParams = this.queryParams; + this.$confirm('是å¦ç¡®è®¤å¯¼å‡ºæ‰€æœ‰æ“作日志数æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return exportOperlog(queryParams); + }).then(response => { + this.download(response.msg); + }).catch(function() {}); } } }; diff --git a/ruoyi-ui/src/views/system/config/index.vue b/ruoyi-ui/src/views/system/config/index.vue index 957bb83..b84fac5 100644 --- a/ruoyi-ui/src/views/system/config/index.vue +++ b/ruoyi-ui/src/views/system/config/index.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> - <el-form :inline="true" label-width="68px"> - <el-form-item label="傿•°åç§°"> + <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> + <el-form-item label="傿•°åç§°" prop="configName"> <el-input v-model="queryParams.configName" placeholder="è¯·è¾“å…¥å‚æ•°åç§°" @@ -11,7 +11,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="傿•°é”®å"> + <el-form-item label="傿•°é”®å" prop="configKey"> <el-input v-model="queryParams.configKey" placeholder="è¯·è¾“å…¥å‚æ•°é”®å" @@ -21,7 +21,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="系统内置"> + <el-form-item label="系统内置" prop="configType"> <el-select v-model="queryParams.configType" placeholder="系统内置" clearable size="small"> <el-option v-for="dict in typeOptions" @@ -45,11 +45,53 @@ </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æœç´¢</el-button> - <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:config:add']">新增</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">é‡ç½®</el-button> </el-form-item> </el-form> - <el-table v-loading="loading" :data="configList"> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="primary" + icon="el-icon-plus" + size="mini" + @click="handleAdd" + v-hasPermi="['system:config:add']" + >新增</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="success" + icon="el-icon-edit" + size="mini" + :disabled="single" + @click="handleUpdate" + v-hasPermi="['system:config:edit']" + >修改</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['system:config:remove']" + >åˆ é™¤</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + icon="el-icon-download" + size="mini" + @click="handleExport" + v-hasPermi="['system:config:export']" + >导出</el-button> + </el-col> + </el-row> + + <el-table v-loading="loading" :data="configList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> <el-table-column label="傿•°ä¸»é”®" align="center" prop="configId" /> <el-table-column label="傿•°åç§°" align="center" prop="configName" :show-overflow-tooltip="true" /> <el-table-column label="傿•°é”®å" align="center" prop="configKey" :show-overflow-tooltip="true" /> @@ -63,10 +105,10 @@ </el-table-column> <el-table-column label="æ“作" align="center" class-name="small-padding fixed-width"> <template slot-scope="scope"> - <el-button - size="mini" - type="text" - icon="el-icon-edit" + <el-button + size="mini" + type="text" + icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:config:edit']" >修改</el-button> @@ -123,13 +165,19 @@ </template> <script> -import { listConfig, getConfig, delConfig, addConfig, updateConfig } from "@/api/system/config"; +import { listConfig, getConfig, delConfig, addConfig, updateConfig, exportConfig } from "@/api/system/config"; export default { data() { return { // é®ç½©å±‚ loading: true, + // 选䏿•°ç»„ + ids: [], + // éžå•个ç¦ç”¨ + single: true, + // éžå¤šä¸ªç¦ç”¨ + multiple: true, // æ€»æ¡æ•° total: 0, // 傿•°è¡¨æ ¼æ•°æ® @@ -209,16 +257,29 @@ export default { this.queryParams.pageNum = 1; this.getList(); }, + /** é‡ç½®æŒ‰é’®æ“作 */ + resetQuery() { + this.dateRange = []; + this.resetForm("queryForm"); + this.handleQuery(); + }, /** 新增按钮æ“作 */ handleAdd() { this.reset(); this.open = true; this.title = "æ·»åŠ å‚æ•°"; }, + // å¤šé€‰æ¡†é€‰ä¸æ•°æ® + handleSelectionChange(selection) { + this.ids = selection.map(item => item.configId) + this.single = selection.length!=1 + this.multiple = !selection.length + }, /** 修改按钮æ“作 */ handleUpdate(row) { this.reset(); - getConfig(row.configId).then(response => { + const configId = row.configId || this.ids + getConfig(configId).then(response => { this.form = response.data; this.open = true; this.title = "ä¿®æ”¹å‚æ•°"; @@ -254,16 +315,30 @@ export default { }, /** åˆ é™¤æŒ‰é’®æ“作 */ handleDelete(row) { - this.$confirm('是å¦ç¡®è®¤åˆ 除å称为"' + row.configName + '"的数æ®é¡¹?', "è¦å‘Š", { + const configIds = row.configId || this.ids; + this.$confirm('是å¦ç¡®è®¤åˆ 除傿•°ç¼–å·ä¸º"' + configIds + '"的数æ®é¡¹?', "è¦å‘Š", { confirmButtonText: "确定", cancelButtonText: "å–æ¶ˆ", type: "warning" }).then(function() { - return delConfig(row.configId); + return delConfig(configIds); }).then(() => { this.getList(); this.msgSuccess("åˆ é™¤æˆåŠŸ"); }).catch(function() {}); + }, + /** 导出按钮æ“作 */ + handleExport() { + const queryParams = this.queryParams; + this.$confirm('是å¦ç¡®è®¤å¯¼å‡ºæ‰€æœ‰å‚æ•°æ•°æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return exportConfig(queryParams); + }).then(response => { + this.download(response.msg); + }).catch(function() {}); } } }; diff --git a/ruoyi-ui/src/views/system/dict/data.vue b/ruoyi-ui/src/views/system/dict/data.vue index 8c4db3f..649e302 100644 --- a/ruoyi-ui/src/views/system/dict/data.vue +++ b/ruoyi-ui/src/views/system/dict/data.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> - <el-form :inline="true"> - <el-form-item label="å—å…¸åç§°"> + <el-form :model="queryParams" ref="queryForm" :inline="true"> + <el-form-item label="å—å…¸åç§°" prop="dictType"> <el-select v-model="queryParams.dictType" size="small"> <el-option v-for="item in typeOptions" @@ -11,7 +11,7 @@ /> </el-select> </el-form-item> - <el-form-item label="å—å…¸æ ‡ç¾"> + <el-form-item label="å—å…¸æ ‡ç¾" prop="dictLabel"> <el-input v-model="queryParams.dictLabel" placeholder="请输入å—å…¸æ ‡ç¾" @@ -20,7 +20,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="状æ€"> + <el-form-item label="状æ€" prop="status"> <el-select v-model="queryParams.status" placeholder="æ•°æ®çжæ€" clearable size="small"> <el-option v-for="dict in statusOptions" @@ -32,11 +32,53 @@ </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æœç´¢</el-button> - <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:dict:add']">新增</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">é‡ç½®</el-button> </el-form-item> </el-form> - <el-table v-loading="loading" :data="dataList" style="width: 100%;"> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="primary" + icon="el-icon-plus" + size="mini" + @click="handleAdd" + v-hasPermi="['system:dict:add']" + >新增</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="success" + icon="el-icon-edit" + size="mini" + :disabled="single" + @click="handleUpdate" + v-hasPermi="['system:dict:edit']" + >修改</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['system:dict:remove']" + >åˆ é™¤</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + icon="el-icon-download" + size="mini" + @click="handleExport" + v-hasPermi="['system:dict:export']" + >导出</el-button> + </el-col> + </el-row> + + <el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> <el-table-column label="å—典编ç " align="center" prop="dictCode" /> <el-table-column label="å—å…¸æ ‡ç¾" align="center" prop="dictLabel" /> <el-table-column label="å—典键值" align="center" prop="dictValue" /> @@ -50,10 +92,10 @@ </el-table-column> <el-table-column label="æ“作" align="center" class-name="small-padding fixed-width"> <template slot-scope="scope"> - <el-button - size="mini" - type="text" - icon="el-icon-edit" + <el-button + size="mini" + type="text" + icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']" >修改</el-button> @@ -113,7 +155,7 @@ </template> <script> -import { listData, getData, delData, addData, updateData } from "@/api/system/dict/data"; +import { listData, getData, delData, addData, updateData, exportData } from "@/api/system/dict/data"; import { listType, getType } from "@/api/system/dict/type"; export default { @@ -121,10 +163,18 @@ export default { return { // é®ç½©å±‚ loading: true, + // 选䏿•°ç»„ + ids: [], + // éžå•个ç¦ç”¨ + single: true, + // éžå¤šä¸ªç¦ç”¨ + multiple: true, // æ€»æ¡æ•° total: 0, // å—å…¸è¡¨æ ¼æ•°æ® dataList: [], + // 默认å—典类型 + defaultDictType: "", // å¼¹å‡ºå±‚æ ‡é¢˜ title: "", // æ˜¯å¦æ˜¾ç¤ºå¼¹å‡ºå±‚ @@ -170,6 +220,7 @@ export default { getType(dictId) { getType(dictId).then(response => { this.queryParams.dictType = response.data.dictType; + this.defaultDictType = response.data.dictType; this.getList(); }); }, @@ -214,6 +265,12 @@ export default { this.queryParams.pageNum = 1; this.getList(); }, + /** é‡ç½®æŒ‰é’®æ“作 */ + resetQuery() { + this.resetForm("queryForm"); + this.queryParams.dictType = this.defaultDictType; + this.handleQuery(); + }, /** 新增按钮æ“作 */ handleAdd() { this.reset(); @@ -221,10 +278,17 @@ export default { this.title = "æ·»åŠ å—典数æ®"; this.form.dictType = this.queryParams.dictType; }, + // å¤šé€‰æ¡†é€‰ä¸æ•°æ® + handleSelectionChange(selection) { + this.ids = selection.map(item => item.dictCode) + this.single = selection.length!=1 + this.multiple = !selection.length + }, /** 修改按钮æ“作 */ handleUpdate(row) { this.reset(); - getData(row.dictCode).then(response => { + const dictCode = row.dictCode || this.ids + getData(dictCode).then(response => { this.form = response.data; this.open = true; this.title = "修改å—典数æ®"; @@ -260,16 +324,30 @@ export default { }, /** åˆ é™¤æŒ‰é’®æ“作 */ handleDelete(row) { - this.$confirm('是å¦ç¡®è®¤åˆ 除å称为"' + row.dictLabel + '"的数æ®é¡¹?', "è¦å‘Š", { + const dictCodes = row.dictCode || this.ids; + this.$confirm('是å¦ç¡®è®¤åˆ 除å—典编ç 为"' + dictCodes + '"的数æ®é¡¹?', "è¦å‘Š", { confirmButtonText: "确定", cancelButtonText: "å–æ¶ˆ", type: "warning" }).then(function() { - return delData(row.dictCode); + return delData(dictCodes); }).then(() => { this.getList(); this.msgSuccess("åˆ é™¤æˆåŠŸ"); }).catch(function() {}); + }, + /** 导出按钮æ“作 */ + handleExport() { + const queryParams = this.queryParams; + this.$confirm('是å¦ç¡®è®¤å¯¼å‡ºæ‰€æœ‰æ•°æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return exportData(queryParams); + }).then(response => { + this.download(response.msg); + }).catch(function() {}); } } }; diff --git a/ruoyi-ui/src/views/system/dict/index.vue b/ruoyi-ui/src/views/system/dict/index.vue index 86de17b..2dd211f 100644 --- a/ruoyi-ui/src/views/system/dict/index.vue +++ b/ruoyi-ui/src/views/system/dict/index.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> - <el-form :inline="true" label-width="68px"> - <el-form-item label="å—å…¸åç§°"> + <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> + <el-form-item label="å—å…¸åç§°" prop="dictName"> <el-input v-model="queryParams.dictName" placeholder="请输入å—å…¸åç§°" @@ -11,7 +11,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="å—典类型"> + <el-form-item label="å—典类型" prop="dictType"> <el-input v-model="queryParams.dictType" placeholder="请输入å—典类型" @@ -21,7 +21,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="状æ€"> + <el-form-item label="状æ€" prop="status"> <el-select v-model="queryParams.status" placeholder="å—典状æ€" @@ -39,7 +39,7 @@ </el-form-item> <el-form-item label="创建时间"> <el-date-picker - v-model="queryParams.createTime" + v-model="dateRange" size="small" style="width: 240px" value-format="yyyy-MM-dd" @@ -51,14 +51,56 @@ </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æœç´¢</el-button> - <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:dict:add']">新增</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">é‡ç½®</el-button> </el-form-item> </el-form> - <el-table v-loading="loading" :data="typeList" style="width: 100%;"> - <el-table-column label="å—典主键" align="center" prop="dictId" /> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="primary" + icon="el-icon-plus" + size="mini" + @click="handleAdd" + v-hasPermi="['system:dict:add']" + >新增</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="success" + icon="el-icon-edit" + size="mini" + :disabled="single" + @click="handleUpdate" + v-hasPermi="['system:dict:edit']" + >修改</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['system:dict:remove']" + >åˆ é™¤</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + icon="el-icon-download" + size="mini" + @click="handleExport" + v-hasPermi="['system:dict:export']" + >导出</el-button> + </el-col> + </el-row> + + <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> + <el-table-column label="å—典编å·" align="center" prop="dictId" /> <el-table-column label="å—å…¸åç§°" align="center" prop="dictName" :show-overflow-tooltip="true" /> - <el-table-column label="å—典类型" align="center"> + <el-table-column label="å—典类型" align="center" :show-overflow-tooltip="true"> <template slot-scope="scope"> <router-link :to="'/dict/type/data/' + scope.row.dictId" class="link-type"> <span>{{ scope.row.dictType }}</span> @@ -74,10 +116,10 @@ </el-table-column> <el-table-column label="æ“作" align="center" class-name="small-padding fixed-width"> <template slot-scope="scope"> - <el-button - size="mini" - type="text" - icon="el-icon-edit" + <el-button + size="mini" + type="text" + icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']" >修改</el-button> @@ -131,13 +173,19 @@ </template> <script> -import { listType, getType, delType, addType, updateType } from "@/api/system/dict/type"; +import { listType, getType, delType, addType, updateType, exportType } from "@/api/system/dict/type"; export default { data() { return { // é®ç½©å±‚ loading: true, + // 选䏿•°ç»„ + ids: [], + // éžå•个ç¦ç”¨ + single: true, + // éžå¤šä¸ªç¦ç”¨ + multiple: true, // æ€»æ¡æ•° total: 0, // å—å…¸è¡¨æ ¼æ•°æ® @@ -181,8 +229,7 @@ export default { /** 查询å—典类型列表 */ getList() { this.loading = true; - listType(this.addDateRange(this.queryParams, this.dateRange)).then( - response => { + listType(this.addDateRange(this.queryParams, this.dateRange)).then(response => { this.typeList = response.rows; this.total = response.total; this.loading = false; @@ -214,16 +261,29 @@ export default { this.queryParams.pageNum = 1; this.getList(); }, + /** é‡ç½®æŒ‰é’®æ“作 */ + resetQuery() { + this.dateRange = []; + this.resetForm("queryForm"); + this.handleQuery(); + }, /** 新增按钮æ“作 */ handleAdd() { this.reset(); this.open = true; this.title = "æ·»åŠ å—典类型"; }, + // å¤šé€‰æ¡†é€‰ä¸æ•°æ® + handleSelectionChange(selection) { + this.ids = selection.map(item => item.dictId) + this.single = selection.length!=1 + this.multiple = !selection.length + }, /** 修改按钮æ“作 */ handleUpdate(row) { this.reset(); - getType(row.dictId).then(response => { + const dictId = row.dictId || this.ids + getType(dictId).then(response => { this.form = response.data; this.open = true; this.title = "修改å—典类型"; @@ -259,16 +319,30 @@ export default { }, /** åˆ é™¤æŒ‰é’®æ“作 */ handleDelete(row) { - this.$confirm('是å¦ç¡®è®¤åˆ 除å称为"' + row.dictName + '"的数æ®é¡¹?', "è¦å‘Š", { + const dictIds = row.dictId || this.ids; + this.$confirm('是å¦ç¡®è®¤åˆ 除å—典编å·ä¸º"' + dictIds + '"的数æ®é¡¹?', "è¦å‘Š", { confirmButtonText: "确定", cancelButtonText: "å–æ¶ˆ", type: "warning" }).then(function() { - return delType(row.dictId); + return delType(dictIds); }).then(() => { this.getList(); this.msgSuccess("åˆ é™¤æˆåŠŸ"); }).catch(function() {}); + }, + /** 导出按钮æ“作 */ + handleExport() { + const queryParams = this.queryParams; + this.$confirm('是å¦ç¡®è®¤å¯¼å‡ºæ‰€æœ‰ç±»åž‹æ•°æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return exportType(queryParams); + }).then(response => { + this.download(response.msg); + }).catch(function() {}); } } }; diff --git a/ruoyi-ui/src/views/system/notice/index.vue b/ruoyi-ui/src/views/system/notice/index.vue index f65e8ea..caedc50 100644 --- a/ruoyi-ui/src/views/system/notice/index.vue +++ b/ruoyi-ui/src/views/system/notice/index.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> - <el-form :inline="true" label-width="68px"> - <el-form-item label="å…¬å‘Šæ ‡é¢˜"> + <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> + <el-form-item label="å…¬å‘Šæ ‡é¢˜" prop="noticeTitle"> <el-input v-model="queryParams.noticeTitle" placeholder="è¯·è¾“å…¥å…¬å‘Šæ ‡é¢˜" @@ -10,7 +10,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="æ“作人员"> + <el-form-item label="æ“作人员" prop="createBy"> <el-input v-model="queryParams.createBy" placeholder="请输入æ“作人员" @@ -19,7 +19,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="类型"> + <el-form-item label="类型" prop="noticeType"> <el-select v-model="queryParams.noticeType" placeholder="公告类型" clearable size="small"> <el-option v-for="dict in typeOptions" @@ -31,11 +31,44 @@ </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æœç´¢</el-button> - <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:notice:add']">新增</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">é‡ç½®</el-button> </el-form-item> </el-form> - <el-table v-loading="loading" :data="noticeList"> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="primary" + icon="el-icon-plus" + size="mini" + @click="handleAdd" + v-hasPermi="['system:notice:add']" + >新增</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="success" + icon="el-icon-edit" + size="mini" + :disabled="single" + @click="handleUpdate" + v-hasPermi="['system:notice:edit']" + >修改</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['system:notice:remove']" + >åˆ é™¤</el-button> + </el-col> + </el-row> + + <el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> <el-table-column label="åºå·" align="center" prop="noticeId" width="100" /> <el-table-column label="å…¬å‘Šæ ‡é¢˜" @@ -65,10 +98,10 @@ </el-table-column> <el-table-column label="æ“作" align="center" class-name="small-padding fixed-width"> <template slot-scope="scope"> - <el-button - size="mini" - type="text" - icon="el-icon-edit" + <el-button + size="mini" + type="text" + icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:notice:edit']" >修改</el-button> @@ -125,7 +158,7 @@ </el-col> <el-col :span="24"> <el-form-item label="内容"> - <Editor v-model="form.noticeContent"/> + <Editor v-model="form.noticeContent" /> </el-form-item> </el-col> </el-row> @@ -139,7 +172,7 @@ </template> <script> -import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice"; +import { listNotice, getNotice, delNotice, addNotice, updateNotice, exportNotice } from "@/api/system/notice"; import Editor from '@/components/Editor'; export default { @@ -150,6 +183,12 @@ export default { return { // é®ç½©å±‚ loading: true, + // 选䏿•°ç»„ + ids: [], + // éžå•个ç¦ç”¨ + single: true, + // éžå¤šä¸ªç¦ç”¨ + multiple: true, // æ€»æ¡æ•° total: 0, // å…¬å‘Šè¡¨æ ¼æ•°æ® @@ -231,6 +270,17 @@ export default { this.queryParams.pageNum = 1; this.getList(); }, + /** é‡ç½®æŒ‰é’®æ“作 */ + resetQuery() { + this.resetForm("queryForm"); + this.handleQuery(); + }, + // å¤šé€‰æ¡†é€‰ä¸æ•°æ® + handleSelectionChange(selection) { + this.ids = selection.map(item => item.noticeId) + this.single = selection.length!=1 + this.multiple = !selection.length + }, /** 新增按钮æ“作 */ handleAdd() { this.reset(); @@ -240,7 +290,8 @@ export default { /** 修改按钮æ“作 */ handleUpdate(row) { this.reset(); - getNotice(row.noticeId).then(response => { + const noticeId = row.noticeId || this.ids + getNotice(noticeId).then(response => { this.form = response.data; this.open = true; this.title = "修改公告"; @@ -276,12 +327,13 @@ export default { }, /** åˆ é™¤æŒ‰é’®æ“作 */ handleDelete(row) { - this.$confirm('是å¦ç¡®è®¤åˆ é™¤å…¬å‘Šæ ‡é¢˜ä¸º"' + row.noticeTitle + '"的数æ®é¡¹?', "è¦å‘Š", { + const noticeIds = row.noticeId || this.ids + this.$confirm('是å¦ç¡®è®¤åˆ 除公告编å·ä¸º"' + noticeIds + '"的数æ®é¡¹?', "è¦å‘Š", { confirmButtonText: "确定", cancelButtonText: "å–æ¶ˆ", type: "warning" }).then(function() { - return delNotice(row.noticeId); + return delNotice(noticeIds); }).then(() => { this.getList(); this.msgSuccess("åˆ é™¤æˆåŠŸ"); diff --git a/ruoyi-ui/src/views/system/post/index.vue b/ruoyi-ui/src/views/system/post/index.vue index f380b23..5c4f28f 100644 --- a/ruoyi-ui/src/views/system/post/index.vue +++ b/ruoyi-ui/src/views/system/post/index.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> - <el-form :inline="true" label-width="68px"> - <el-form-item label="å²—ä½ç¼–ç "> + <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> + <el-form-item label="å²—ä½ç¼–ç " prop="postCode"> <el-input v-model="queryParams.postCode" placeholder="请输入岗ä½ç¼–ç " @@ -10,7 +10,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="å²—ä½åç§°"> + <el-form-item label="å²—ä½åç§°" prop="postName"> <el-input v-model="queryParams.postName" placeholder="请输入岗ä½åç§°" @@ -19,7 +19,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="状æ€"> + <el-form-item label="状æ€" prop="status"> <el-select v-model="queryParams.status" placeholder="å²—ä½çжæ€" clearable size="small"> <el-option v-for="dict in statusOptions" @@ -31,11 +31,53 @@ </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æœç´¢</el-button> - <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:post:add']">新增</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">é‡ç½®</el-button> </el-form-item> </el-form> - <el-table v-loading="loading" :data="postList"> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="primary" + icon="el-icon-plus" + size="mini" + @click="handleAdd" + v-hasPermi="['system:post:add']" + >新增</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="success" + icon="el-icon-edit" + size="mini" + :disabled="single" + @click="handleUpdate" + v-hasPermi="['system:post:edit']" + >修改</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['system:post:remove']" + >åˆ é™¤</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + icon="el-icon-download" + size="mini" + @click="handleExport" + v-hasPermi="['system:post:export']" + >导出</el-button> + </el-col> + </el-row> + + <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> <el-table-column label="å²—ä½ç¼–å·" align="center" prop="postId" /> <el-table-column label="å²—ä½ç¼–ç " align="center" prop="postCode" /> <el-table-column label="å²—ä½åç§°" align="center" prop="postName" /> @@ -48,10 +90,10 @@ </el-table-column> <el-table-column label="æ“作" align="center" class-name="small-padding fixed-width"> <template slot-scope="scope"> - <el-button - size="mini" - type="text" - icon="el-icon-edit" + <el-button + size="mini" + type="text" + icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:post:edit']" >修改</el-button> @@ -65,7 +107,7 @@ </template> </el-table-column> </el-table> - + <pagination v-show="total>0" :total="total" @@ -108,13 +150,19 @@ </template> <script> -import { listPost, getPost, delPost, addPost, updatePost } from "@/api/system/post"; +import { listPost, getPost, delPost, addPost, updatePost, exportPost } from "@/api/system/post"; export default { data() { return { // é®ç½©å±‚ loading: true, + // 选䏿•°ç»„ + ids: [], + // éžå•个ç¦ç”¨ + single: true, + // éžå¤šä¸ªç¦ç”¨ + multiple: true, // æ€»æ¡æ•° total: 0, // å²—ä½è¡¨æ ¼æ•°æ® @@ -191,6 +239,17 @@ export default { this.queryParams.pageNum = 1; this.getList(); }, + /** é‡ç½®æŒ‰é’®æ“作 */ + resetQuery() { + this.resetForm("queryForm"); + this.handleQuery(); + }, + // å¤šé€‰æ¡†é€‰ä¸æ•°æ® + handleSelectionChange(selection) { + this.ids = selection.map(item => item.postId) + this.single = selection.length!=1 + this.multiple = !selection.length + }, /** 新增按钮æ“作 */ handleAdd() { this.reset(); @@ -200,7 +259,8 @@ export default { /** 修改按钮æ“作 */ handleUpdate(row) { this.reset(); - getPost(row.postId).then(response => { + const postId = row.postId || this.ids + getPost(postId).then(response => { this.form = response.data; this.open = true; this.title = "修改岗ä½"; @@ -236,16 +296,30 @@ export default { }, /** åˆ é™¤æŒ‰é’®æ“作 */ handleDelete(row) { - this.$confirm('是å¦ç¡®è®¤åˆ 除岗ä½å称为"' + row.postName + '"的数æ®é¡¹?', "è¦å‘Š", { + const postIds = row.postId || this.ids; + this.$confirm('是å¦ç¡®è®¤åˆ 除岗ä½ç¼–å·ä¸º"' + postIds + '"的数æ®é¡¹?', "è¦å‘Š", { confirmButtonText: "确定", cancelButtonText: "å–æ¶ˆ", type: "warning" }).then(function() { - return delPost(row.postId); + return delPost(postIds); }).then(() => { this.getList(); this.msgSuccess("åˆ é™¤æˆåŠŸ"); }).catch(function() {}); + }, + /** 导出按钮æ“作 */ + handleExport() { + const queryParams = this.queryParams; + this.$confirm('是å¦ç¡®è®¤å¯¼å‡ºæ‰€æœ‰å²—使•°æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return exportPost(queryParams); + }).then(response => { + this.download(response.msg); + }).catch(function() {}); } } }; diff --git a/ruoyi-ui/src/views/system/role/index.vue b/ruoyi-ui/src/views/system/role/index.vue index 7f0feb9..05379c2 100644 --- a/ruoyi-ui/src/views/system/role/index.vue +++ b/ruoyi-ui/src/views/system/role/index.vue @@ -1,7 +1,7 @@ <template> <div class="app-container"> - <el-form :inline="true"> - <el-form-item label="角色åç§°"> + <el-form :model="queryParams" ref="queryForm" :inline="true"> + <el-form-item label="角色åç§°" prop="roleName"> <el-input v-model="queryParams.roleName" placeholder="请输入角色åç§°" @@ -11,7 +11,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="æƒé™å—符"> + <el-form-item label="æƒé™å—符" prop="roleKey"> <el-input v-model="queryParams.roleKey" placeholder="请输入æƒé™å—符" @@ -21,7 +21,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="状æ€"> + <el-form-item label="状æ€" prop="status"> <el-select v-model="queryParams.status" placeholder="角色状æ€" @@ -51,6 +51,12 @@ </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æœç´¢</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">é‡ç½®</el-button> + </el-form-item> + </el-form> + + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> <el-button type="primary" icon="el-icon-plus" @@ -58,15 +64,45 @@ @click="handleAdd" v-hasPermi="['system:role:add']" >新增</el-button> - </el-form-item> - </el-form> + </el-col> + <el-col :span="1.5"> + <el-button + type="success" + icon="el-icon-edit" + size="mini" + :disabled="single" + @click="handleUpdate" + v-hasPermi="['system:role:edit']" + >修改</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['system:role:remove']" + >åˆ é™¤</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + icon="el-icon-download" + size="mini" + @click="handleExport" + v-hasPermi="['system:post:export']" + >导出</el-button> + </el-col> + </el-row> - <el-table v-loading="loading" :data="roleList"> + <el-table v-loading="loading" :data="roleList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> <el-table-column label="角色编å·" prop="roleId" width="120" /> <el-table-column label="角色åç§°" prop="roleName" :show-overflow-tooltip="true" width="150" /> - <el-table-column label="æƒé™å—符" prop="roleKey" :show-overflow-tooltip="true" width="180" /> - <el-table-column label="显示顺åº" prop="roleSort" width="120" /> - <el-table-column label="状æ€" align="center" width="120"> + <el-table-column label="æƒé™å—符" prop="roleKey" :show-overflow-tooltip="true" width="150" /> + <el-table-column label="显示顺åº" prop="roleSort" width="100" /> + <el-table-column label="状æ€" align="center" width="100"> <template slot-scope="scope"> <el-switch v-model="scope.row.status" @@ -197,7 +233,7 @@ </template> <script> -import { listRole, getRole, delRole, addRole, updateRole, dataScope, changeRoleStatus } from "@/api/system/role"; +import { listRole, getRole, delRole, addRole, updateRole, exportRole, dataScope, changeRoleStatus } from "@/api/system/role"; import { treeselect as menuTreeselect, roleMenuTreeselect } from "@/api/system/menu"; import { treeselect as deptTreeselect, roleDeptTreeselect } from "@/api/system/dept"; @@ -206,6 +242,12 @@ export default { return { // é®ç½©å±‚ loading: true, + // 选䏿•°ç»„ + ids: [], + // éžå•个ç¦ç”¨ + single: true, + // éžå¤šä¸ªç¦ç”¨ + multiple: true, // æ€»æ¡æ•° total: 0, // è§’è‰²è¡¨æ ¼æ•°æ® @@ -384,6 +426,18 @@ export default { this.queryParams.pageNum = 1; this.getList(); }, + /** é‡ç½®æŒ‰é’®æ“作 */ + resetQuery() { + this.dateRange = []; + this.resetForm("queryForm"); + this.handleQuery(); + }, + // å¤šé€‰æ¡†é€‰ä¸æ•°æ® + handleSelectionChange(selection) { + this.ids = selection.map(item => item.roleId) + this.single = selection.length!=1 + this.multiple = !selection.length + }, /** 新增按钮æ“作 */ handleAdd() { this.reset(); @@ -394,10 +448,11 @@ export default { /** 修改按钮æ“作 */ handleUpdate(row) { this.reset(); + const roleId = row.roleId || this.ids this.$nextTick(() => { - this.getRoleMenuTreeselect(row.roleId); + this.getRoleMenuTreeselect(roleId); }); - getRole(row.roleId).then(response => { + getRole(roleId).then(response => { this.form = response.data; this.open = true; this.title = "修改角色"; @@ -462,16 +517,30 @@ export default { }, /** åˆ é™¤æŒ‰é’®æ“作 */ handleDelete(row) { - this.$confirm('是å¦ç¡®è®¤åˆ 除å称为"' + row.roleName + '"的数æ®é¡¹?', "è¦å‘Š", { + const roleIds = row.roleId || this.ids; + this.$confirm('是å¦ç¡®è®¤åˆ 除角色编å·ä¸º"' + roleIds + '"的数æ®é¡¹?', "è¦å‘Š", { confirmButtonText: "确定", cancelButtonText: "å–æ¶ˆ", type: "warning" }).then(function() { - return delRole(row.roleId); + return delRole(roleIds); }).then(() => { this.getList(); this.msgSuccess("åˆ é™¤æˆåŠŸ"); }).catch(function() {}); + }, + /** 导出按钮æ“作 */ + handleExport() { + const queryParams = this.queryParams; + this.$confirm('是å¦ç¡®è®¤å¯¼å‡ºæ‰€æœ‰è§’色数æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return exportRole(queryParams); + }).then(response => { + this.download(response.msg); + }).catch(function() {}); } } }; diff --git a/ruoyi-ui/src/views/system/user/index.vue b/ruoyi-ui/src/views/system/user/index.vue index 2d57670..760036b 100644 --- a/ruoyi-ui/src/views/system/user/index.vue +++ b/ruoyi-ui/src/views/system/user/index.vue @@ -27,8 +27,8 @@ </el-col> <!--用户数æ®--> <el-col :span="20" :xs="24"> - <el-form :inline="true" label-width="68px"> - <el-form-item label="用户åç§°"> + <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px"> + <el-form-item label="用户åç§°" prop="userName"> <el-input v-model="queryParams.userName" placeholder="请输入用户åç§°" @@ -38,7 +38,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="手机å·ç "> + <el-form-item label="手机å·ç " prop="phonenumber"> <el-input v-model="queryParams.phonenumber" placeholder="请输入手机å·ç " @@ -48,7 +48,7 @@ @keyup.enter.native="handleQuery" /> </el-form-item> - <el-form-item label="状æ€"> + <el-form-item label="状æ€" prop="status"> <el-select v-model="queryParams.status" placeholder="用户状æ€" @@ -78,11 +78,53 @@ </el-form-item> <el-form-item> <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">æœç´¢</el-button> - <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['system:user:add']">新增</el-button> + <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">é‡ç½®</el-button> </el-form-item> </el-form> - <el-table v-loading="loading" :data="userList"> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="primary" + icon="el-icon-plus" + size="mini" + @click="handleAdd" + v-hasPermi="['system:user:add']" + >新增</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="success" + icon="el-icon-edit" + size="mini" + :disabled="single" + @click="handleUpdate" + v-hasPermi="['system:user:edit']" + >修改</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="danger" + icon="el-icon-delete" + size="mini" + :disabled="multiple" + @click="handleDelete" + v-hasPermi="['system:user:remove']" + >åˆ é™¤</el-button> + </el-col> + <el-col :span="1.5"> + <el-button + type="warning" + icon="el-icon-download" + size="mini" + @click="handleExport" + v-hasPermi="['system:user:export']" + >导出</el-button> + </el-col> + </el-row> + + <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="40" align="center" /> <el-table-column label="用户编å·" align="center" prop="userId" /> <el-table-column label="用户åç§°" align="center" prop="userName" /> <el-table-column label="用户昵称" align="center" prop="nickName" /> @@ -246,7 +288,7 @@ </template> <script> -import { listUser, getUser, delUser, addUser, updateUser, resetUserPwd, changeUserStatus } from "@/api/system/user"; +import { listUser, getUser, delUser, addUser, updateUser, exportUser, resetUserPwd, changeUserStatus } from "@/api/system/user"; import { treeselect } from "@/api/system/dept"; import { listPost } from "@/api/system/post"; import { listRole } from "@/api/system/role"; @@ -259,6 +301,12 @@ export default { return { // é®ç½©å±‚ loading: true, + // 选䏿•°ç»„ + ids: [], + // éžå•个ç¦ç”¨ + single: true, + // éžå¤šä¸ªç¦ç”¨ + multiple: true, // æ€»æ¡æ•° total: 0, // ç”¨æˆ·è¡¨æ ¼æ•°æ® @@ -430,6 +478,18 @@ export default { this.queryParams.page = 1; this.getList(); }, + /** é‡ç½®æŒ‰é’®æ“作 */ + resetQuery() { + this.dateRange = []; + this.resetForm("queryForm"); + this.handleQuery(); + }, + // å¤šé€‰æ¡†é€‰ä¸æ•°æ® + handleSelectionChange(selection) { + this.ids = selection.map(item => item.userId) + this.single = selection.length!=1 + this.multiple = !selection.length + }, /** 新增按钮æ“作 */ handleAdd() { this.reset(); @@ -446,7 +506,8 @@ export default { this.getTreeselect(); this.getPosts(); this.getRoles(); - getUser(row.userId).then(response => { + const userId = row.userId || this.ids + getUser(userId).then(response => { this.form = response.data; this.form.postIds = response.postIds; this.form.roleIds = response.roleIds; @@ -500,16 +561,30 @@ export default { }, /** åˆ é™¤æŒ‰é’®æ“作 */ handleDelete(row) { - this.$confirm('是å¦ç¡®è®¤åˆ 除å称为"' + row.userName + '"的数æ®é¡¹?', "è¦å‘Š", { + const userIds = row.userId || this.ids; + this.$confirm('是å¦ç¡®è®¤åˆ 除用户编å·ä¸º"' + userIds + '"的数æ®é¡¹?', "è¦å‘Š", { confirmButtonText: "确定", cancelButtonText: "å–æ¶ˆ", type: "warning" }).then(function() { - return delUser(row.userId); + return delUser(userIds); }).then(() => { this.getList(); this.msgSuccess("åˆ é™¤æˆåŠŸ"); }).catch(function() {}); + }, + /** 导出按钮æ“作 */ + handleExport() { + const queryParams = this.queryParams; + this.$confirm('是å¦ç¡®è®¤å¯¼å‡ºæ‰€æœ‰ç”¨æˆ·æ•°æ®é¡¹?', "è¦å‘Š", { + confirmButtonText: "确定", + cancelButtonText: "å–æ¶ˆ", + type: "warning" + }).then(function() { + return exportUser(queryParams); + }).then(response => { + this.download(response.msg); + }).catch(function() {}); } } }; diff --git a/ruoyi-ui/vue.config.js b/ruoyi-ui/vue.config.js index 62589f0..5dce8d6 100644 --- a/ruoyi-ui/vue.config.js +++ b/ruoyi-ui/vue.config.js @@ -17,7 +17,7 @@ module.exports = { // 部署生产环境和开å‘环境下的URL。 // 默认情况下,Vue CLI 会å‡è®¾ä½ 的应用是被部署在一个域åçš„æ ¹è·¯å¾„ä¸Š // 例如 https://www.ruoyi.vip/。如果应用被部署在一个åè·¯å¾„ä¸Šï¼Œä½ å°±éœ€è¦ç”¨è¿™ä¸ªé€‰é¡¹æŒ‡å®šè¿™ä¸ªåè·¯å¾„ã€‚ä¾‹å¦‚ï¼Œå¦‚æžœä½ çš„åº”ç”¨è¢«éƒ¨ç½²åœ¨ https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 - publicPath: process.env.NODE_ENV === "production" ? "./" : "/", + publicPath: process.env.NODE_ENV === "production" ? "/" : "/", // 在npm run build 或 yarn build æ—¶ ï¼Œç”Ÿæˆæ–‡ä»¶çš„目录å称(è¦å’ŒbaseUrl的生产环境路径一致)(默认dist) outputDir: 'dist', // 用于放置生æˆçš„陿€èµ„æº (jsã€cssã€imgã€fonts) 的;(项目打包之åŽï¼Œé™æ€èµ„æºä¼šæ”¾åœ¨è¿™ä¸ªæ–‡ä»¶å¤¹ä¸‹ï¼‰ diff --git a/ruoyi/pom.xml b/ruoyi/pom.xml index 0e04df7..f9f6b9a 100644 --- a/ruoyi/pom.xml +++ b/ruoyi/pom.xml @@ -5,7 +5,7 @@ <groupId>com.ruoyi</groupId> <artifactId>ruoyi</artifactId> - <version>1.0</version> + <version>1.1</version> <packaging>jar</packaging> <name>ruoyi</name> @@ -32,6 +32,7 @@ <bitwalker.version>1.19</bitwalker.version> <jwt.version>0.9.0</jwt.version> <swagger.version>2.9.2</swagger.version> + <poi.version>3.17</poi.version> <oshi.version>3.9.1</oshi.version> </properties> @@ -223,6 +224,13 @@ <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> </dependency> + + <!-- excel工具 --> + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi-ooxml</artifactId> + <version>${poi.version}</version> + </dependency> </dependencies> diff --git a/ruoyi/sql/ry_20191008.sql b/ruoyi/sql/ry_20191111.sql similarity index 95% rename from ruoyi/sql/ry_20191008.sql rename to ruoyi/sql/ry_20191111.sql index 7d75501..0558cba 100644 --- a/ruoyi/sql/ry_20191008.sql +++ b/ruoyi/sql/ry_20191111.sql @@ -136,7 +136,7 @@ create table sys_menu ( path varchar(200) default '' comment '路由地å€', component varchar(255) default null comment '组件路径', is_frame int(1) default 1 comment '是å¦ä¸ºå¤–链(0是 1å¦ï¼‰', - menu_type char(1) default '' comment 'èœå•类型(0目录 1èœå• 2按钮)', + menu_type char(1) default '' comment 'èœå•类型(M目录 Cèœå• F按钮)', visible char(1) default 0 comment 'èœå•状æ€ï¼ˆ0显示 1éšè—)', perms varchar(100) default null comment 'æƒé™æ ‡è¯†', icon varchar(100) default '#' comment 'èœå•å›¾æ ‡', @@ -152,10 +152,10 @@ create table sys_menu ( -- åˆå§‹åŒ–-èœå•ä¿¡æ¯è¡¨æ•°æ® -- ---------------------------- -- 一级èœå• -insert into sys_menu values('1', '系统管ç†', '0', '1', 'system', null, 1, 'M', '0', '', 'system', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统管ç†ç›®å½•'); -insert into sys_menu values('2', '系统监控', '0', '2', 'monitor', null, 1, 'M', '0', '', 'monitor', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统监控目录'); -insert into sys_menu values('3', '系统工具', '0', '3', 'tool', null, 1, 'M', '0', '', 'tool', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统工具目录'); -INSERT INTO sys_menu VALUES('4', 'è‹¥ä¾å®˜ç½‘', '0', '4', 'http://ruoyi.vip', NULL , 0, 'M', '0', '', 'guide', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', 'è‹¥ä¾å®˜ç½‘'); +insert into sys_menu values('1', '系统管ç†', '0', '1', 'system', null, 1, 'M', '0', '', 'system', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统管ç†ç›®å½•'); +insert into sys_menu values('2', '系统监控', '0', '2', 'monitor', null, 1, 'M', '0', '', 'monitor', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统监控目录'); +insert into sys_menu values('3', '系统工具', '0', '3', 'tool', null, 1, 'M', '0', '', 'tool', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统工具目录'); +insert into sys_menu values('4', 'è‹¥ä¾å®˜ç½‘', '0', '4', 'http://ruoyi.vip', null , 0, 'M', '0', '', 'guide', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', 'è‹¥ä¾å®˜ç½‘地å€'); -- 二级èœå• insert into sys_menu values('100', '用户管ç†', '1', '1', 'user', 'system/user/index', 1, 'C', '0', 'system:user:list', 'user', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '用户管ç†èœå•'); insert into sys_menu values('101', '角色管ç†', '1', '2', 'role', 'system/role/index', 1, 'C', '0', 'system:role:list', 'peoples', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '角色管ç†èœå•'); @@ -550,27 +550,7 @@ create table sys_logininfor ( -- ---------------------------- --- 15ã€åœ¨çº¿ç”¨æˆ·è®°å½• --- ---------------------------- -drop table if exists sys_user_online; -create table sys_user_online ( - sessionId varchar(50) default '' comment '用户会è¯id', - user_name varchar(50) default '' comment '用户账å·', - dept_name varchar(50) default '' comment '部门åç§°', - ipaddr varchar(50) default '' comment '登录IP地å€', - login_location varchar(255) default '' comment '登录地点', - browser varchar(50) default '' comment 'æµè§ˆå™¨ç±»åž‹', - os varchar(50) default '' comment 'æ“作系统', - status varchar(10) default '' comment '在线状æ€on_line在线off_line离线', - start_timestamp datetime comment 'session创建时间', - last_access_time datetime comment 'session最åŽè®¿é—®æ—¶é—´', - expire_time int(5) default 0 comment '超时时间,å•ä½ä¸ºåˆ†é’Ÿ', - primary key (sessionId) -) engine=innodb comment = '在线用户记录'; - - --- ---------------------------- --- 16ã€å®šæ—¶ä»»åŠ¡è°ƒåº¦è¡¨ +-- 15ã€å®šæ—¶ä»»åŠ¡è°ƒåº¦è¡¨ -- ---------------------------- drop table if exists sys_job; create table sys_job ( @@ -596,7 +576,7 @@ insert into sys_job values(3, '系统默认(多å‚)', 'DEFAULT', 'ryTask.ryM -- ---------------------------- --- 17ã€å®šæ—¶ä»»åŠ¡è°ƒåº¦æ—¥å¿—è¡¨ +-- 16ã€å®šæ—¶ä»»åŠ¡è°ƒåº¦æ—¥å¿—è¡¨ -- ---------------------------- drop table if exists sys_job_log; create table sys_job_log ( @@ -613,7 +593,7 @@ create table sys_job_log ( -- ---------------------------- --- 18ã€é€šçŸ¥å…¬å‘Šè¡¨ +-- 17ã€é€šçŸ¥å…¬å‘Šè¡¨ -- ---------------------------- drop table if exists sys_notice; create table sys_notice ( @@ -638,7 +618,7 @@ insert into sys_notice values('2', '维护通知:2018-07-01 è‹¥ä¾ç³»ç»Ÿå‡Œæ™¨ -- ---------------------------- --- 19ã€ä»£ç 生æˆä¸šåŠ¡è¡¨ +-- 18ã€ä»£ç 生æˆä¸šåŠ¡è¡¨ -- ---------------------------- drop table if exists gen_table; create table gen_table ( @@ -663,7 +643,7 @@ create table gen_table ( -- ---------------------------- --- 20ã€ä»£ç 生æˆä¸šåŠ¡è¡¨å—æ®µ +-- 19ã€ä»£ç 生æˆä¸šåŠ¡è¡¨å—æ®µ -- ---------------------------- drop table if exists gen_table_column; create table gen_table_column ( diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java b/ruoyi/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java new file mode 100644 index 0000000..27652fe --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java @@ -0,0 +1,872 @@ +package com.ruoyi.common.utils.poi; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.ss.usermodel.BorderStyle; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.DataValidation; +import org.apache.poi.ss.usermodel.DataValidationConstraint; +import org.apache.poi.ss.usermodel.DataValidationHelper; +import org.apache.poi.ss.usermodel.DateUtil; +import org.apache.poi.ss.usermodel.FillPatternType; +import org.apache.poi.ss.usermodel.Font; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.VerticalAlignment; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.framework.aspectj.lang.annotation.Excel; +import com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.ruoyi.framework.aspectj.lang.annotation.Excel.Type; +import com.ruoyi.framework.aspectj.lang.annotation.Excels; +import com.ruoyi.framework.config.RuoYiConfig; +import com.ruoyi.framework.web.domain.AjaxResult; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.exception.CustomException; +import com.ruoyi.common.utils.DateUtils; +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.reflect.ReflectUtils; + +/** + * Excelç›¸å…³å¤„ç† + * + * @author ruoyi + */ +public class ExcelUtil<T> +{ + private static final Logger log = LoggerFactory.getLogger(ExcelUtil.class); + + /** + * Excel sheet最大行数,默认65536 + */ + public static final int sheetSize = 65536; + + /** + * 工作表åç§° + */ + private String sheetName; + + /** + * 导出类型(EXPORT:导出数æ®ï¼›IMPORT:导入模æ¿ï¼‰ + */ + private Type type; + + /** + * 工作薄对象 + */ + private Workbook wb; + + /** + * 工作表对象 + */ + private Sheet sheet; + + /** + * æ ·å¼åˆ—表 + */ + private Map<String, CellStyle> styles; + + /** + * 导入导出数æ®åˆ—表 + */ + private List<T> list; + + /** + * 注解列表 + */ + private List<Object[]> fields; + + /** + * 实体对象 + */ + public Class<T> clazz; + + public ExcelUtil(Class<T> clazz) + { + this.clazz = clazz; + } + + public void init(List<T> list, String sheetName, Type type) + { + if (list == null) + { + list = new ArrayList<T>(); + } + this.list = list; + this.sheetName = sheetName; + this.type = type; + createExcelField(); + createWorkbook(); + } + + /** + * 对excel表å•默认第一个索引åè½¬æ¢æˆlist + * + * @param is è¾“å…¥æµ + * @return 转æ¢åŽé›†åˆ + */ + public List<T> importExcel(InputStream is) throws Exception + { + return importExcel(StringUtils.EMPTY, is); + } + + /** + * 对excelè¡¨å•æŒ‡å®šè¡¨æ ¼ç´¢å¼•åè½¬æ¢æˆlist + * + * @param sheetName è¡¨æ ¼ç´¢å¼•å + * @param is è¾“å…¥æµ + * @return 转æ¢åŽé›†åˆ + */ + public List<T> importExcel(String sheetName, InputStream is) throws Exception + { + this.type = Type.IMPORT; + this.wb = WorkbookFactory.create(is); + List<T> list = new ArrayList<T>(); + Sheet sheet = null; + if (StringUtils.isNotEmpty(sheetName)) + { + // 如果指定sheetå,åˆ™å–æŒ‡å®šsheetä¸çš„内容. + sheet = wb.getSheet(sheetName); + } + else + { + // å¦‚æžœä¼ å…¥çš„sheetåä¸å˜åœ¨åˆ™é»˜è®¤æŒ‡å‘第1个sheet. + sheet = wb.getSheetAt(0); + } + + if (sheet == null) + { + throw new IOException("文件sheetä¸å˜åœ¨"); + } + + int rows = sheet.getPhysicalNumberOfRows(); + + if (rows > 0) + { + // 定义一个mapç”¨äºŽå˜æ”¾excel列的åºå·å’Œfield. + Map<String, Integer> cellMap = new HashMap<String, Integer>(); + // 获å–表头 + Row heard = sheet.getRow(0); + for (int i = 0; i < heard.getPhysicalNumberOfCells(); i++) + { + Cell cell = heard.getCell(i); + if (StringUtils.isNotNull(cell != null)) + { + String value = this.getCellValue(heard, i).toString(); + cellMap.put(value, i); + } + else + { + cellMap.put(null, i); + } + } + // æœ‰æ•°æ®æ—¶æ‰å¤„ç† å¾—åˆ°ç±»çš„æ‰€æœ‰field. + Field[] allFields = clazz.getDeclaredFields(); + // 定义一个mapç”¨äºŽå˜æ”¾åˆ—çš„åºå·å’Œfield. + Map<Integer, Field> fieldsMap = new HashMap<Integer, Field>(); + for (int col = 0; col < allFields.length; col++) + { + Field field = allFields[col]; + Excel attr = field.getAnnotation(Excel.class); + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + // è®¾ç½®ç±»çš„ç§æœ‰å—段属性å¯è®¿é—®. + field.setAccessible(true); + Integer column = cellMap.get(attr.name()); + fieldsMap.put(column, field); + } + } + for (int i = 1; i < rows; i++) + { + // 从第2è¡Œå¼€å§‹å–æ•°æ®,默认第一行是表头. + Row row = sheet.getRow(i); + T entity = null; + for (Map.Entry<Integer, Field> entry : fieldsMap.entrySet()) + { + Object val = this.getCellValue(row, entry.getKey()); + + // 如果ä¸å˜åœ¨å®žä¾‹åˆ™æ–°å»º. + entity = (entity == null ? clazz.newInstance() : entity); + // 从mapä¸å¾—到对应列的field. + Field field = fieldsMap.get(entry.getKey()); + // å–得类型,å¹¶æ ¹æ®å¯¹è±¡ç±»åž‹è®¾ç½®å€¼. + Class<?> fieldType = field.getType(); + if (String.class == fieldType) + { + String s = Convert.toStr(val); + if (StringUtils.endsWith(s, ".0")) + { + val = StringUtils.substringBefore(s, ".0"); + } + else + { + val = Convert.toStr(val); + } + } + else if ((Integer.TYPE == fieldType) || (Integer.class == fieldType)) + { + val = Convert.toInt(val); + } + else if ((Long.TYPE == fieldType) || (Long.class == fieldType)) + { + val = Convert.toLong(val); + } + else if ((Double.TYPE == fieldType) || (Double.class == fieldType)) + { + val = Convert.toDouble(val); + } + else if ((Float.TYPE == fieldType) || (Float.class == fieldType)) + { + val = Convert.toFloat(val); + } + else if (BigDecimal.class == fieldType) + { + val = Convert.toBigDecimal(val); + } + else if (Date.class == fieldType) + { + if (val instanceof String) + { + val = DateUtils.parseDate(val); + } + else if (val instanceof Double) + { + val = DateUtil.getJavaDate((Double) val); + } + } + if (StringUtils.isNotNull(fieldType)) + { + Excel attr = field.getAnnotation(Excel.class); + String propertyName = field.getName(); + if (StringUtils.isNotEmpty(attr.targetAttr())) + { + propertyName = field.getName() + "." + attr.targetAttr(); + } + else if (StringUtils.isNotEmpty(attr.readConverterExp())) + { + val = reverseByExp(String.valueOf(val), attr.readConverterExp()); + } + ReflectUtils.invokeSetter(entity, propertyName, val); + } + } + list.add(entity); + } + } + return list; + } + + /** + * 对listæ•°æ®æºå°†å…¶é‡Œé¢çš„æ•°æ®å¯¼å…¥åˆ°excelè¡¨å• + * + * @param list 导出数æ®é›†åˆ + * @param sheetName 工作表的åç§° + * @return 结果 + */ + public AjaxResult exportExcel(List<T> list, String sheetName) + { + this.init(list, sheetName, Type.EXPORT); + return exportExcel(); + } + + /** + * 对listæ•°æ®æºå°†å…¶é‡Œé¢çš„æ•°æ®å¯¼å…¥åˆ°excelè¡¨å• + * + * @param sheetName 工作表的åç§° + * @return 结果 + */ + public AjaxResult importTemplateExcel(String sheetName) + { + this.init(null, sheetName, Type.IMPORT); + return exportExcel(); + } + + /** + * 对listæ•°æ®æºå°†å…¶é‡Œé¢çš„æ•°æ®å¯¼å…¥åˆ°excelè¡¨å• + * + * @return 结果 + */ + public AjaxResult exportExcel() + { + OutputStream out = null; + try + { + // å–出一共有多少个sheet. + double sheetNo = Math.ceil(list.size() / sheetSize); + for (int index = 0; index <= sheetNo; index++) + { + createSheet(sheetNo, index); + + // 产生一行 + Row row = sheet.createRow(0); + int column = 0; + // 写入å„ä¸ªå—æ®µçš„列头åç§° + for (Object[] os : fields) + { + Excel excel = (Excel) os[1]; + this.createCell(excel, row, column++); + } + if (Type.EXPORT.equals(type)) + { + fillExcelData(index, row); + } + } + String filename = encodingFilename(sheetName); + out = new FileOutputStream(getAbsoluteFile(filename)); + wb.write(out); + return AjaxResult.success(filename); + } + catch (Exception e) + { + log.error("导出Excel异常{}", e.getMessage()); + throw new CustomException("导出Excel失败,请è”系网站管ç†å‘˜ï¼"); + } + finally + { + if (wb != null) + { + try + { + wb.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + if (out != null) + { + try + { + out.close(); + } + catch (IOException e1) + { + e1.printStackTrace(); + } + } + } + } + + /** + * å¡«å……excelæ•°æ® + * + * @param index åºå· + * @param row å•å…ƒæ ¼è¡Œ + */ + public void fillExcelData(int index, Row row) + { + int startNo = index * sheetSize; + int endNo = Math.min(startNo + sheetSize, list.size()); + for (int i = startNo; i < endNo; i++) + { + row = sheet.createRow(i + 1 - startNo); + // 得到导出对象. + T vo = (T) list.get(i); + int column = 0; + for (Object[] os : fields) + { + Field field = (Field) os[0]; + Excel excel = (Excel) os[1]; + // è®¾ç½®å®žä½“ç±»ç§æœ‰å±žæ€§å¯è®¿é—® + field.setAccessible(true); + this.addCell(excel, row, vo, field, column++); + } + } + } + + /** + * åˆ›å»ºè¡¨æ ¼æ ·å¼ + * + * @param wb 工作薄对象 + * @return æ ·å¼åˆ—表 + */ + private Map<String, CellStyle> createStyles(Workbook wb) + { + // 写入儿¡è®°å½•,æ¯æ¡è®°å½•对应excel表ä¸çš„一行 + Map<String, CellStyle> styles = new HashMap<String, CellStyle>(); + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setBorderRight(BorderStyle.THIN); + style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderLeft(BorderStyle.THIN); + style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderTop(BorderStyle.THIN); + style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setBorderBottom(BorderStyle.THIN); + style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex()); + Font dataFont = wb.createFont(); + dataFont.setFontName("Arial"); + dataFont.setFontHeightInPoints((short) 10); + style.setFont(dataFont); + styles.put("data", style); + + style = wb.createCellStyle(); + style.cloneStyleFrom(styles.get("data")); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + Font headerFont = wb.createFont(); + headerFont.setFontName("Arial"); + headerFont.setFontHeightInPoints((short) 10); + headerFont.setBold(true); + headerFont.setColor(IndexedColors.WHITE.getIndex()); + style.setFont(headerFont); + styles.put("header", style); + + return styles; + } + + /** + * 创建å•å…ƒæ ¼ + */ + public Cell createCell(Excel attr, Row row, int column) + { + // 创建列 + Cell cell = row.createCell(column); + // å†™å…¥åˆ—ä¿¡æ¯ + cell.setCellValue(attr.name()); + setDataValidation(attr, row, column); + cell.setCellStyle(styles.get("header")); + return cell; + } + + /** + * 设置å•å…ƒæ ¼ä¿¡æ¯ + * + * @param value å•å…ƒæ ¼å€¼ + * @param attr 注解相关 + * @param cell å•å…ƒæ ¼ä¿¡æ¯ + */ + public void setCellVo(Object value, Excel attr, Cell cell) + { + if (ColumnType.STRING == attr.cellType()) + { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(StringUtils.isNull(value) ? attr.defaultValue() : value + attr.suffix()); + } + else if (ColumnType.NUMERIC == attr.cellType()) + { + cell.setCellType(CellType.NUMERIC); + cell.setCellValue(Integer.parseInt(value + "")); + } + } + + /** + * åˆ›å»ºè¡¨æ ¼æ ·å¼ + */ + public void setDataValidation(Excel attr, Row row, int column) + { + if (attr.name().indexOf("注:") >= 0) + { + sheet.setColumnWidth(column, 6000); + } + else + { + // 设置列宽 + sheet.setColumnWidth(column, (int) ((attr.width() + 0.72) * 256)); + row.setHeight((short) (attr.height() * 20)); + } + // 如果设置了æç¤ºä¿¡æ¯åˆ™é¼ æ ‡æ”¾ä¸ŠåŽ»æç¤º. + if (StringUtils.isNotEmpty(attr.prompt())) + { + // 这里默认设了2-101列æç¤º. + setXSSFPrompt(sheet, "", attr.prompt(), 1, 100, column, column); + } + // 如果设置了combo属性则本列åªèƒ½é€‰æ‹©ä¸èƒ½è¾“å…¥ + if (attr.combo().length > 0) + { + // 这里默认设了2-101列åªèƒ½é€‰æ‹©ä¸èƒ½è¾“å…¥. + setXSSFValidation(sheet, attr.combo(), 1, 100, column, column); + } + } + + /** + * æ·»åŠ å•å…ƒæ ¼ + */ + public Cell addCell(Excel attr, Row row, T vo, Field field, int column) + { + Cell cell = null; + try + { + // 设置行高 + row.setHeight((short) (attr.height() * 20)); + // æ ¹æ®Excelä¸è®¾ç½®æƒ…况决定是å¦å¯¼å‡º,有些情况需è¦ä¿æŒä¸ºç©º,希望用户填写这一列. + if (attr.isExport()) + { + // 创建cell + cell = row.createCell(column); + cell.setCellStyle(styles.get("data")); + + // 用于读å–对象ä¸çš„属性 + Object value = getTargetValue(vo, field, attr); + String dateFormat = attr.dateFormat(); + String readConverterExp = attr.readConverterExp(); + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) + { + cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value)); + } + else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) + { + cell.setCellValue(convertByExp(String.valueOf(value), readConverterExp)); + } + else + { + // 设置列类型 + setCellVo(value, attr, cell); + } + } + } + catch (Exception e) + { + log.error("导出Excel失败{}", e); + } + return cell; + } + + /** + * 设置 POI XSSFSheet å•å…ƒæ ¼æç¤º + * + * @param sheet è¡¨å• + * @param promptTitle æç¤ºæ ‡é¢˜ + * @param promptContent æç¤ºå†…容 + * @param firstRow 开始行 + * @param endRow 结æŸè¡Œ + * @param firstCol 开始列 + * @param endCol 结æŸåˆ— + */ + public void setXSSFPrompt(Sheet sheet, String promptTitle, String promptContent, int firstRow, int endRow, + int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + DataValidationConstraint constraint = helper.createCustomConstraint("DD1"); + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + DataValidation dataValidation = helper.createValidation(constraint, regions); + dataValidation.createPromptBox(promptTitle, promptContent); + dataValidation.setShowPromptBox(true); + sheet.addValidationData(dataValidation); + } + + /** + * 设置æŸäº›åˆ—的值åªèƒ½è¾“入预制的数æ®,显示下拉框. + * + * @param sheet è¦è®¾ç½®çš„sheet. + * @param textlist 下拉框显示的内容 + * @param firstRow 开始行 + * @param endRow 结æŸè¡Œ + * @param firstCol 开始列 + * @param endCol 结æŸåˆ— + * @return 设置好的sheet. + */ + public void setXSSFValidation(Sheet sheet, String[] textlist, int firstRow, int endRow, int firstCol, int endCol) + { + DataValidationHelper helper = sheet.getDataValidationHelper(); + // åŠ è½½ä¸‹æ‹‰åˆ—è¡¨å†…å®¹ + DataValidationConstraint constraint = helper.createExplicitListConstraint(textlist); + // è®¾ç½®æ•°æ®æœ‰æ•ˆæ€§åŠ è½½åœ¨å“ªä¸ªå•å…ƒæ ¼ä¸Š,å››ä¸ªå‚æ•°åˆ†åˆ«æ˜¯ï¼šèµ·å§‹è¡Œã€ç»ˆæ¢è¡Œã€èµ·å§‹åˆ—ã€ç»ˆæ¢åˆ— + CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); + // æ•°æ®æœ‰æ•ˆæ€§å¯¹è±¡ + DataValidation dataValidation = helper.createValidation(constraint, regions); + // 处ç†Excel兼容性问题 + if (dataValidation instanceof XSSFDataValidation) + { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + } + else + { + dataValidation.setSuppressDropDownArrow(false); + } + + sheet.addValidationData(dataValidation); + } + + /** + * è§£æžå¯¼å‡ºå€¼ 0=ç”·,1=女,2=未知 + * + * @param propertyValue 傿•°å€¼ + * @param converterExp 翻译注解 + * @return è§£æžåŽå€¼ + * @throws Exception + */ + public static String convertByExp(String propertyValue, String converterExp) throws Exception + { + try + { + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (itemArray[0].equals(propertyValue)) + { + return itemArray[1]; + } + } + } + catch (Exception e) + { + throw e; + } + return propertyValue; + } + + /** + * åå‘è§£æžå€¼ ç”·=0,女=1,未知=2 + * + * @param propertyValue 傿•°å€¼ + * @param converterExp 翻译注解 + * @return è§£æžåŽå€¼ + * @throws Exception + */ + public static String reverseByExp(String propertyValue, String converterExp) throws Exception + { + try + { + String[] convertSource = converterExp.split(","); + for (String item : convertSource) + { + String[] itemArray = item.split("="); + if (itemArray[1].equals(propertyValue)) + { + return itemArray[0]; + } + } + } + catch (Exception e) + { + throw e; + } + return propertyValue; + } + + /** + * ç¼–ç æ–‡ä»¶å + */ + public String encodingFilename(String filename) + { + filename = UUID.randomUUID().toString() + "_" + filename + ".xlsx"; + return filename; + } + + /** + * 获å–下载路径 + * + * @param filename 文件åç§° + */ + public String getAbsoluteFile(String filename) + { + String downloadPath = RuoYiConfig.getDownloadPath() + filename; + File desc = new File(downloadPath); + if (!desc.getParentFile().exists()) + { + desc.getParentFile().mkdirs(); + } + return downloadPath; + } + + /** + * 获å–beanä¸çš„属性值 + * + * @param vo 实体对象 + * @param field å—æ®µ + * @param excel 注解 + * @return 最终的属性值 + * @throws Exception + */ + private Object getTargetValue(T vo, Field field, Excel excel) throws Exception + { + Object o = field.get(vo); + if (StringUtils.isNotEmpty(excel.targetAttr())) + { + String target = excel.targetAttr(); + if (target.indexOf(".") > -1) + { + String[] targets = target.split("[.]"); + for (String name : targets) + { + o = getValue(o, name); + } + } + else + { + o = getValue(o, target); + } + } + return o; + } + + /** + * 以类的属性的get方法方法形å¼èŽ·å–值 + * + * @param o + * @param name + * @return value + * @throws Exception + */ + private Object getValue(Object o, String name) throws Exception + { + if (StringUtils.isNotEmpty(name)) + { + Class<?> clazz = o.getClass(); + String methodName = "get" + name.substring(0, 1).toUpperCase() + name.substring(1); + Method method = clazz.getMethod(methodName); + o = method.invoke(o); + } + return o; + } + + /** + * å¾—åˆ°æ‰€æœ‰å®šä¹‰å—æ®µ + */ + private void createExcelField() + { + this.fields = new ArrayList<Object[]>(); + List<Field> tempFields = new ArrayList<>(); + tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields())); + tempFields.addAll(Arrays.asList(clazz.getDeclaredFields())); + for (Field field : tempFields) + { + // 啿³¨è§£ + if (field.isAnnotationPresent(Excel.class)) + { + putToField(field, field.getAnnotation(Excel.class)); + } + + // 多注解 + if (field.isAnnotationPresent(Excels.class)) + { + Excels attrs = field.getAnnotation(Excels.class); + Excel[] excels = attrs.value(); + for (Excel excel : excels) + { + putToField(field, excel); + } + } + } + } + + /** + * æ”¾åˆ°å—æ®µé›†åˆä¸ + */ + private void putToField(Field field, Excel attr) + { + if (attr != null && (attr.type() == Type.ALL || attr.type() == type)) + { + this.fields.add(new Object[] { field, attr }); + } + } + + /** + * 创建一个工作簿 + */ + public void createWorkbook() + { + this.wb = new SXSSFWorkbook(500); + } + + /** + * 创建工作表 + * + * @param sheetNo sheetæ•°é‡ + * @param index åºå· + */ + public void createSheet(double sheetNo, int index) + { + this.sheet = wb.createSheet(); + this.styles = createStyles(wb); + // 设置工作表的åç§°. + if (sheetNo == 0) + { + wb.setSheetName(index, sheetName); + } + else + { + wb.setSheetName(index, sheetName + index); + } + } + + /** + * 获å–å•å…ƒæ ¼å€¼ + * + * @param row 获å–的行 + * @param column 获å–å•å…ƒæ ¼åˆ—å· + * @return å•å…ƒæ ¼å€¼ + */ + public Object getCellValue(Row row, int column) + { + if (row == null) + { + return row; + } + Object val = ""; + try + { + Cell cell = row.getCell(column); + if (cell != null) + { + if (cell.getCellTypeEnum() == CellType.NUMERIC || cell.getCellTypeEnum() == CellType.FORMULA) + { + val = cell.getNumericCellValue(); + if (HSSFDateUtil.isCellDateFormatted(cell)) + { + val = DateUtil.getJavaDate((Double) val); // POI Excel æ—¥æœŸæ ¼å¼è½¬æ¢ + } + else + { + if ((Double) val % 1 > 0) + { + val = new DecimalFormat("0.00").format(val); + } + else + { + val = new DecimalFormat("0").format(val); + } + } + } + else if (cell.getCellTypeEnum() == CellType.STRING) + { + val = cell.getStringCellValue(); + } + else if (cell.getCellTypeEnum() == CellType.BOOLEAN) + { + val = cell.getBooleanCellValue(); + } + else if (cell.getCellTypeEnum() == CellType.ERROR) + { + val = cell.getErrorCellValue(); + } + + } + } + catch (Exception e) + { + return val; + } + return val; + } +} \ No newline at end of file diff --git a/ruoyi/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java b/ruoyi/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java new file mode 100644 index 0000000..b78e53e --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/common/utils/reflect/ReflectUtils.java @@ -0,0 +1,406 @@ +package com.ruoyi.common.utils.reflect; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Date; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import com.ruoyi.common.core.text.Convert; +import com.ruoyi.common.utils.DateUtils; + +/** + * å射工具类. æä¾›è°ƒç”¨getter/setter方法, è®¿é—®ç§æœ‰å˜é‡, è°ƒç”¨ç§æœ‰æ–¹æ³•, èŽ·å–æ³›åž‹ç±»åž‹Class, 被AOP过的真实类ç‰å·¥å…·å‡½æ•°. + * + * @author ruoyi + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils +{ + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 调用Getter方法. + * 支æŒå¤šçº§ï¼Œå¦‚:对象å.对象å.方法 + */ + @SuppressWarnings("unchecked") + public static <E> E invokeGetter(Object obj, String propertyName) + { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + return (E) object; + } + + /** + * 调用Setter方法, ä»…åŒ¹é…æ–¹æ³•å。 + * 支æŒå¤šçº§ï¼Œå¦‚:对象å.对象å.方法 + */ + public static <E> void invokeSetter(Object obj, String propertyName, E value) + { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) + { + if (i < names.length - 1) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + else + { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[] { value }); + } + } + } + + /** + * 直接读å–对象属性值, æ— è§†private/protected修饰符, ä¸ç»è¿‡getter函数. + */ + @SuppressWarnings("unchecked") + public static <E> E getFieldValue(final Object obj, final String fieldName) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + logger.debug("在 [" + obj.getClass() + "] ä¸ï¼Œæ²¡æœ‰æ‰¾åˆ° [" + fieldName + "] å—æ®µ "); + return null; + } + E result = null; + try + { + result = (E) field.get(obj); + } + catch (IllegalAccessException e) + { + logger.error("ä¸å¯èƒ½æŠ›å‡ºçš„异常{}", e.getMessage()); + } + return result; + } + + /** + * 直接设置对象属性值, æ— è§†private/protected修饰符, ä¸ç»è¿‡setter函数. + */ + public static <E> void setFieldValue(final Object obj, final String fieldName, final E value) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + // throw new IllegalArgumentException("在 [" + obj.getClass() + "] ä¸ï¼Œæ²¡æœ‰æ‰¾åˆ° [" + fieldName + "] å—æ®µ "); + logger.debug("在 [" + obj.getClass() + "] ä¸ï¼Œæ²¡æœ‰æ‰¾åˆ° [" + fieldName + "] å—æ®µ "); + return; + } + try + { + field.set(obj, value); + } + catch (IllegalAccessException e) + { + logger.error("ä¸å¯èƒ½æŠ›å‡ºçš„异常: {}", e.getMessage()); + } + } + + /** + * 直接调用对象方法, æ— è§†private/protected修饰符. + * 用于一次性调用的情况,å¦åˆ™åº”使用getAccessibleMethod()函数获得MethodåŽåå¤è°ƒç”¨. + * åŒæ—¶åŒ¹é…方法å+傿•°ç±»åž‹ï¼Œ + */ + @SuppressWarnings("unchecked") + public static <E> E invokeMethod(final Object obj, final String methodName, final Class<?>[] parameterTypes, + final Object[] args) + { + if (obj == null || methodName == null) + { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) + { + logger.debug("在 [" + obj.getClass() + "] ä¸ï¼Œæ²¡æœ‰æ‰¾åˆ° [" + methodName + "] 方法 "); + return null; + } + try + { + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 直接调用对象方法, æ— è§†private/protected修饰符, + * 用于一次性调用的情况,å¦åˆ™åº”使用getAccessibleMethodByName()函数获得MethodåŽåå¤è°ƒç”¨. + * åªåŒ¹é…函数å,如果有多个åŒå函数调用第一个。 + */ + @SuppressWarnings("unchecked") + public static <E> E invokeMethodByName(final Object obj, final String methodName, final Object[] args) + { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) + { + // å¦‚æžœä¸ºç©ºä¸æŠ¥é”™ï¼Œç›´æŽ¥è¿”å›žç©ºã€‚ + logger.debug("在 [" + obj.getClass() + "] ä¸ï¼Œæ²¡æœ‰æ‰¾åˆ° [" + methodName + "] 方法 "); + return null; + } + try + { + // 类型转æ¢ï¼ˆå°†å‚æ•°æ•°æ®ç±»åž‹è½¬æ¢ä¸ºç›®æ ‡æ–¹æ³•傿•°ç±»åž‹ï¼‰ + Class<?>[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) + { + if (args[i] != null && !args[i].getClass().equals(cs[i])) + { + if (cs[i] == String.class) + { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) + { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } + else if (cs[i] == Integer.class) + { + args[i] = Convert.toInt(args[i]); + } + else if (cs[i] == Long.class) + { + args[i] = Convert.toLong(args[i]); + } + else if (cs[i] == Double.class) + { + args[i] = Convert.toDouble(args[i]); + } + else if (cs[i] == Float.class) + { + args[i] = Convert.toFloat(args[i]); + } + else if (cs[i] == Date.class) + { + if (args[i] instanceof String) + { + args[i] = DateUtils.parseDate(args[i]); + } + else + { + args[i] = DateUtil.getJavaDate((Double) args[i]); + } + } + } + } + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 循环å‘上转型, 获å–对象的DeclaredField, 并强制设置为å¯è®¿é—®. + * 如å‘上转型到Object仿— 法找到, 返回null. + */ + public static Field getAccessibleField(final Object obj, final String fieldName) + { + // ä¸ºç©ºä¸æŠ¥é”™ã€‚ç›´æŽ¥è¿”å›ž null + if (obj == null) + { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) + { + try + { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } + catch (NoSuchFieldException e) + { + continue; + } + } + return null; + } + + /** + * 循环å‘上转型, 获å–对象的DeclaredMethod,并强制设置为å¯è®¿é—®. + * 如å‘上转型到Object仿— 法找到, 返回null. + * 匹é…函数å+傿•°ç±»åž‹ã€‚ + * 用于方法需è¦è¢«å¤šæ¬¡è°ƒç”¨çš„æƒ…况. 先使用本函数先å–å¾—Method,ç„¶åŽè°ƒç”¨Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class<?>... parameterTypes) + { + // ä¸ºç©ºä¸æŠ¥é”™ã€‚ç›´æŽ¥è¿”å›ž null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + try + { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } + catch (NoSuchMethodException e) + { + continue; + } + } + return null; + } + + /** + * 循环å‘上转型, 获å–对象的DeclaredMethod,并强制设置为å¯è®¿é—®. + * 如å‘上转型到Object仿— 法找到, 返回null. + * åªåŒ¹é…函数å。 + * 用于方法需è¦è¢«å¤šæ¬¡è°ƒç”¨çš„æƒ…况. 先使用本函数先å–å¾—Method,ç„¶åŽè°ƒç”¨Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) + { + // ä¸ºç©ºä¸æŠ¥é”™ã€‚ç›´æŽ¥è¿”å›ž null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class<?> searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) + { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) + { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 改å˜private/protected的方法为public,尽é‡ä¸è°ƒç”¨å®žé™…改动的è¯å¥ï¼Œé¿å…JDKçš„SecurityManager抱怨。 + */ + public static void makeAccessible(Method method) + { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) + { + method.setAccessible(true); + } + } + + /** + * 改å˜private/protectedçš„æˆå‘˜å˜é‡ä¸ºpublic,尽é‡ä¸è°ƒç”¨å®žé™…改动的è¯å¥ï¼Œé¿å…JDKçš„SecurityManager抱怨。 + */ + public static void makeAccessible(Field field) + { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) + { + field.setAccessible(true); + } + } + + /** + * 通过åå°„, 获得Class定义ä¸å£°æ˜Žçš„æ³›åž‹å‚数的类型, æ³¨æ„æ³›åž‹å¿…须定义在父类处 + * å¦‚æ— æ³•æ‰¾åˆ°, 返回Object.class. + */ + @SuppressWarnings("unchecked") + public static <T> Class<T> getClassGenricType(final Class clazz) + { + return getClassGenricType(clazz, 0); + } + + /** + * 通过åå°„, 获得Class定义ä¸å£°æ˜Žçš„çˆ¶ç±»çš„æ³›åž‹å‚æ•°çš„类型. + * å¦‚æ— æ³•æ‰¾åˆ°, 返回Object.class. + */ + public static Class getClassGenricType(final Class clazz, final int index) + { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) + { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) + { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) + { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + public static Class<?> getUserClass(Object instance) + { + if (instance == null) + { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) + { + Class<?> superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) + { + return superClass; + } + } + return clazz; + + } + + /** + * å°†åå°„æ—¶çš„checked exception转æ¢ä¸ºunchecked exception. + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) + { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) + { + return new IllegalArgumentException(msg, e); + } + else if (e instanceof InvocationTargetException) + { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/lang/annotation/Excel.java b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/lang/annotation/Excel.java new file mode 100644 index 0000000..8037cb8 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/lang/annotation/Excel.java @@ -0,0 +1,113 @@ +package com.ruoyi.framework.aspectj.lang.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义导出Excelæ•°æ®æ³¨è§£ + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 导出到Excelä¸çš„åå—. + */ + public String name() default ""; + + /** + * æ—¥æœŸæ ¼å¼, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 读å–å†…å®¹è½¬è¡¨è¾¾å¼ (如: 0=ç”·,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 导出类型(0æ•°å— 1å—符串) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出时在excel䏿¯ä¸ªåˆ—的高度 å•ä½ä¸ºå—符 + */ + public double height() default 14; + + /** + * 导出时在excel䏿¯ä¸ªåˆ—的宽 å•ä½ä¸ºå—符 + */ + public double width() default 16; + + /** + * æ–‡å—åŽç¼€,如% 90 å˜æˆ90% + */ + public String suffix() default ""; + + /** + * 当值为空时,å—æ®µçš„默认值 + */ + public String defaultValue() default ""; + + /** + * æç¤ºä¿¡æ¯ + */ + public String prompt() default ""; + + /** + * 设置åªèƒ½é€‰æ‹©ä¸èƒ½è¾“入的列内容. + */ + public String[] combo() default {}; + + /** + * 是å¦å¯¼å‡ºæ•°æ®,应对需求:有时我们需è¦å¯¼å‡ºä¸€ä»½æ¨¡æ¿,è¿™æ˜¯æ ‡é¢˜éœ€è¦ä½†å†…容需è¦ç”¨æˆ·æ‰‹å·¥å¡«å†™. + */ + public boolean isExport() default true; + + /** + * å¦ä¸€ä¸ªç±»ä¸çš„属性åç§°,支æŒå¤šçº§èŽ·å–,以尿•°ç‚¹éš”å¼€ + */ + public String targetAttr() default ""; + + /** + * å—æ®µç±»åž‹ï¼ˆ0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type + { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + public enum ColumnType + { + NUMERIC(0), STRING(1); + private final int value; + + ColumnType(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } +} \ No newline at end of file diff --git a/ruoyi/src/main/java/com/ruoyi/framework/aspectj/lang/annotation/Excels.java b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/lang/annotation/Excels.java new file mode 100644 index 0000000..ff22802 --- /dev/null +++ b/ruoyi/src/main/java/com/ruoyi/framework/aspectj/lang/annotation/Excels.java @@ -0,0 +1,18 @@ +package com.ruoyi.framework.aspectj.lang.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel注解集 + * + * @author ruoyi + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels +{ + Excel[] value(); +} \ No newline at end of file diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/SecurityConfig.java index 45000b5..4e0eca4 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/SecurityConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/SecurityConfig.java @@ -98,6 +98,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter "/**/*.js" ).permitAll() .antMatchers("/profile/**").anonymous() + .antMatchers("/common/download**").anonymous() .antMatchers("/swagger-ui.html").anonymous() .antMatchers("/swagger-resources/**").anonymous() .antMatchers("/webjars/**").anonymous() diff --git a/ruoyi/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java b/ruoyi/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java index a2da4e8..a51cd34 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/config/SwaggerConfig.java @@ -1,5 +1,7 @@ package com.ruoyi.framework.config; +import java.util.ArrayList; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -8,8 +10,12 @@ import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.ApiKey; +import springfox.documentation.service.AuthorizationScope; import springfox.documentation.service.Contact; +import springfox.documentation.service.SecurityReference; import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @@ -33,6 +39,7 @@ public class SwaggerConfig public Docket createRestApi() { return new Docket(DocumentationType.SWAGGER_2) + .pathMapping("/dev-api") // 用æ¥åˆ›å»ºè¯¥API的基本信æ¯ï¼Œå±•示在文档的页é¢ä¸ï¼ˆè‡ªå®šä¹‰å±•示的信æ¯ï¼‰ .apiInfo(apiInfo()) // è®¾ç½®å“ªäº›æŽ¥å£æš´éœ²ç»™Swagger展示 @@ -43,7 +50,47 @@ public class SwaggerConfig //.apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger")) // æ‰«ææ‰€æœ‰ .apis(RequestHandlerSelectors.any()) .paths(PathSelectors.any()) - .build(); + .build() + /* 设置安全模å¼ï¼Œswaggerå¯ä»¥è®¾ç½®è®¿é—®token */ + .securitySchemes(securitySchemes()) + .securityContexts(securityContexts()); + } + + /** + * 安全模å¼ï¼Œè¿™é‡ŒæŒ‡å®štoken通过Authorizationå¤´è¯·æ±‚å¤´ä¼ é€’ + */ + private List<ApiKey> securitySchemes() + { + List<ApiKey> apiKeyList = new ArrayList<ApiKey>(); + apiKeyList.add(new ApiKey("Authorization", "Authorization", "header")); + return apiKeyList; + } + + /** + * 安全上下文 + */ + private List<SecurityContext> securityContexts() + { + List<SecurityContext> securityContexts = new ArrayList<>(); + securityContexts.add( + SecurityContext.builder() + .securityReferences(defaultAuth()) + .forPaths(PathSelectors.regex("^(?!auth).*$")) + .build()); + return securityContexts; + } + + /** + * 默认的安全上引用 + */ + private List<SecurityReference> defaultAuth() + { + AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); + AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; + authorizationScopes[0] = authorizationScope; + List<SecurityReference> securityReferences = new ArrayList<>(); + securityReferences.add(new SecurityReference("Authorization", authorizationScopes)); + return securityReferences; } /** @@ -54,7 +101,7 @@ public class SwaggerConfig // 用ApiInfoBuilder进行定制 return new ApiInfoBuilder() // è®¾ç½®æ ‡é¢˜ - .title("æ ‡é¢˜ï¼šä½™å¿ƒç®¡ç†ç³»ç»Ÿ_æŽ¥å£æ–‡æ¡£") + .title("æ ‡é¢˜ï¼šè‹¥ä¾ç®¡ç†ç³»ç»Ÿ_æŽ¥å£æ–‡æ¡£") // æè¿° .description("æè¿°ï¼šç”¨äºŽç®¡ç†é›†å›¢æ——下公å¸çš„人员信æ¯,具体包括XXX,XXX模å—...") // ä½œè€…ä¿¡æ¯ diff --git a/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java b/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java index d5e4289..12b4358 100644 --- a/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java +++ b/ruoyi/src/main/java/com/ruoyi/framework/web/exception/GlobalExceptionHandler.java @@ -5,6 +5,8 @@ import org.slf4j.LoggerFactory; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.authentication.AccountExpiredException; import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.validation.BindException; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.servlet.NoHandlerFoundException; @@ -82,6 +84,28 @@ public class GlobalExceptionHandler return AjaxResult.error(e.getMessage()); } + /** + * 自定义验è¯å¼‚常 + */ + @ExceptionHandler(BindException.class) + public AjaxResult validatedBindException(BindException e) + { + log.error(e.getMessage(), e); + String message = e.getAllErrors().get(0).getDefaultMessage(); + return AjaxResult.error(message); + } + + /** + * 自定义验è¯å¼‚常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Object validExceptionHandler(MethodArgumentNotValidException e) + { + log.error(e.getMessage(), e); + String message = e.getBindingResult().getFieldError().getDefaultMessage(); + return AjaxResult.error(message); + } + /** * 演示模å¼å¼‚常 */ diff --git a/ruoyi/src/main/java/com/ruoyi/project/common/CommonController.java b/ruoyi/src/main/java/com/ruoyi/project/common/CommonController.java index 3362e00..3bb81d0 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/common/CommonController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/common/CommonController.java @@ -1,10 +1,17 @@ package com.ruoyi.project.common; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.file.FileUploadUtils; +import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.framework.config.RuoYiConfig; import com.ruoyi.framework.config.ServerConfig; import com.ruoyi.framework.web.domain.AjaxResult; @@ -17,9 +24,45 @@ import com.ruoyi.framework.web.domain.AjaxResult; @RestController public class CommonController { + private static final Logger log = LoggerFactory.getLogger(CommonController.class); + @Autowired private ServerConfig serverConfig; + /** + * 通用下载请求 + * + * @param fileName 文件åç§° + * @param delete 是å¦åˆ 除 + */ + @GetMapping("common/download") + public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) + { + try + { + if (!FileUtils.isValidFilename(fileName)) + { + throw new Exception(StringUtils.format("文件åç§°({})éžæ³•,ä¸å…许下载。 ", fileName)); + } + String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1); + String filePath = RuoYiConfig.getDownloadPath() + fileName; + + response.setCharacterEncoding("utf-8"); + response.setContentType("multipart/form-data"); + response.setHeader("Content-Disposition", + "attachment;fileName=" + FileUtils.setFileDownloadHeader(request, realFileName)); + FileUtils.writeBytes(filePath, response.getOutputStream()); + if (delete) + { + FileUtils.deleteFile(filePath); + } + } + catch (Exception e) + { + log.error("下载文件失败", e); + } + } + /** * é€šç”¨ä¸Šä¼ è¯·æ±‚ */ diff --git a/ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysLogininforController.java b/ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysLogininforController.java index 2915b84..ecda076 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysLogininforController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysLogininforController.java @@ -3,10 +3,16 @@ package com.ruoyi.project.monitor.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.framework.aspectj.lang.annotation.Log; +import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; +import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.project.monitor.domain.SysLogininfor; import com.ruoyi.project.monitor.service.ISysLogininforService; @@ -31,4 +37,31 @@ public class SysLogininforController extends BaseController List<SysLogininfor> list = logininforService.selectLogininforList(logininfor); return getDataTable(list); } + + @Log(title = "登陆日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')") + @GetMapping("/export") + public AjaxResult export(SysLogininfor logininfor) + { + List<SysLogininfor> list = logininforService.selectLogininforList(logininfor); + ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class); + return util.exportExcel(list, "登陆日志"); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登陆日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{infoIds}") + public AjaxResult remove(@PathVariable Long[] infoIds) + { + return toAjax(logininforService.deleteLogininforByIds(infoIds)); + } + + @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')") + @Log(title = "登陆日志", businessType = BusinessType.CLEAN) + @DeleteMapping("/clean") + public AjaxResult clean() + { + logininforService.cleanLogininfor(); + return AjaxResult.success(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysOperlogController.java b/ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysOperlogController.java index 5d316ab..d0d5c34 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysOperlogController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/monitor/controller/SysOperlogController.java @@ -3,10 +3,16 @@ package com.ruoyi.project.monitor.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.ruoyi.common.utils.poi.ExcelUtil; +import com.ruoyi.framework.aspectj.lang.annotation.Log; +import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; +import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.page.TableDataInfo; import com.ruoyi.project.monitor.domain.SysOperLog; import com.ruoyi.project.monitor.service.ISysOperLogService; @@ -31,4 +37,30 @@ public class SysOperlogController extends BaseController List<SysOperLog> list = operLogService.selectOperLogList(operLog); return getDataTable(list); } + + @Log(title = "æ“作日志", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('monitor:operlog:export')") + @GetMapping("/export") + public AjaxResult export(SysOperLog operLog) + { + List<SysOperLog> list = operLogService.selectOperLogList(operLog); + ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class); + return util.exportExcel(list, "æ“作日志"); + } + + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/{operIds}") + public AjaxResult remove(@PathVariable Long[] operIds) + { + return toAjax(operLogService.deleteOperLogByIds(operIds)); + } + + @Log(title = "æ“作日志", businessType = BusinessType.CLEAN) + @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')") + @DeleteMapping("/clean") + public AjaxResult clean() + { + operLogService.cleanOperLog(); + return AjaxResult.success(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysLogininfor.java b/ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysLogininfor.java index ea0c40f..7519058 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysLogininfor.java +++ b/ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysLogininfor.java @@ -1,6 +1,8 @@ package com.ruoyi.project.monitor.domain; import java.util.Date; +import com.ruoyi.framework.aspectj.lang.annotation.Excel; +import com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType; import com.ruoyi.framework.web.domain.BaseEntity; /** @@ -13,30 +15,39 @@ public class SysLogininfor extends BaseEntity private static final long serialVersionUID = 1L; /** ID */ + @Excel(name = "åºå·", cellType = ColumnType.NUMERIC) private Long infoId; /** ç”¨æˆ·è´¦å· */ + @Excel(name = "用户账å·") private String userName; /** ç™»å½•çŠ¶æ€ 0æˆåŠŸ 1失败 */ + @Excel(name = "登录状æ€", readConverterExp = "0=æˆåŠŸ,1=失败") private String status; /** 登录IPåœ°å€ */ + @Excel(name = "登录地å€") private String ipaddr; /** 登录地点 */ + @Excel(name = "登录地点") private String loginLocation; /** æµè§ˆå™¨ç±»åž‹ */ + @Excel(name = "æµè§ˆå™¨") private String browser; /** æ“作系统 */ + @Excel(name = "æ“作系统") private String os; /** æç¤ºæ¶ˆæ¯ */ + @Excel(name = "æç¤ºæ¶ˆæ¯") private String msg; /** 访问时间 */ + @Excel(name = "访问时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date loginTime; public Long getInfoId() diff --git a/ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysOperLog.java b/ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysOperLog.java index a111aca..813100c 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysOperLog.java +++ b/ruoyi/src/main/java/com/ruoyi/project/monitor/domain/SysOperLog.java @@ -1,6 +1,8 @@ package com.ruoyi.project.monitor.domain; import java.util.Date; +import com.ruoyi.framework.aspectj.lang.annotation.Excel; +import com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType; import com.ruoyi.framework.web.domain.BaseEntity; /** @@ -13,54 +15,70 @@ public class SysOperLog extends BaseEntity private static final long serialVersionUID = 1L; /** 日志主键 */ + @Excel(name = "æ“作åºå·", cellType = ColumnType.NUMERIC) private Long operId; /** æ“ä½œæ¨¡å— */ + @Excel(name = "æ“作模å—") private String title; /** 业务类型(0其它 1新增 2修改 3åˆ é™¤ï¼‰ */ + @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=åˆ é™¤,4=授æƒ,5=导出,6=导入,7=强退,8=生æˆä»£ç ,9=清空数æ®") private Integer businessType; /** 业务类型数组 */ private Integer[] businessTypes; /** 请求方法 */ + @Excel(name = "请求方法") private String method; /** è¯·æ±‚æ–¹å¼ */ + @Excel(name = "请求方å¼") private String requestMethod; /** æ“作类别(0其它 1åŽå°ç”¨æˆ· 2手机端用户) */ + @Excel(name = "æ“作类别", readConverterExp = "0=其它,1=åŽå°ç”¨æˆ·,2=手机端用户") private Integer operatorType; /** æ“作人员 */ + @Excel(name = "æ“作人员") private String operName; /** 部门åç§° */ + @Excel(name = "部门åç§°") private String deptName; /** 请求url */ + @Excel(name = "请求地å€") private String operUrl; /** æ“ä½œåœ°å€ */ + @Excel(name = "æ“作地å€") private String operIp; /** æ“作地点 */ + @Excel(name = "æ“作地点") private String operLocation; /** è¯·æ±‚å‚æ•° */ + @Excel(name = "è¯·æ±‚å‚æ•°") private String operParam; /** è¿”å›žå‚æ•° */ + @Excel(name = "è¿”å›žå‚æ•°") private String jsonResult; /** æ“作状æ€ï¼ˆ0æ£å¸¸ 1异常) */ + @Excel(name = "状æ€", readConverterExp = "0=æ£å¸¸,1=异常") private Integer status; /** é”™è¯¯æ¶ˆæ¯ */ + @Excel(name = "错误消æ¯") private String errorMsg; /** æ“作时间 */ + @Excel(name = "æ“作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date operTime; public Long getOperId() diff --git a/ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysLogininforMapper.java b/ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysLogininforMapper.java index 43cd82e..707fed1 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysLogininforMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysLogininforMapper.java @@ -28,10 +28,10 @@ public interface SysLogininforMapper /** * 批é‡åˆ 除系统登录日志 * - * @param ids 需è¦åˆ é™¤çš„æ•°æ® + * @param infoIds 需è¦åˆ 除的登录日志ID * @return 结果 */ - public int deleteLogininforByIds(String[] ids); + public int deleteLogininforByIds(Long[] infoIds); /** * 清空系统登录日志 diff --git a/ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysOperLogMapper.java b/ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysOperLogMapper.java index 2f7c2da..25b1904 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysOperLogMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/project/monitor/mapper/SysOperLogMapper.java @@ -28,10 +28,10 @@ public interface SysOperLogMapper /** * 批é‡åˆ 除系统æ“作日志 * - * @param ids 需è¦åˆ é™¤çš„æ•°æ® + * @param operIds 需è¦åˆ 除的æ“作日志ID * @return 结果 */ - public int deleteOperLogByIds(String[] ids); + public int deleteOperLogByIds(Long[] operIds); /** * 查询æ“作日志详细 diff --git a/ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysLogininforService.java b/ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysLogininforService.java index c00bff7..f46dddf 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysLogininforService.java +++ b/ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysLogininforService.java @@ -28,10 +28,10 @@ public interface ISysLogininforService /** * 批é‡åˆ 除系统登录日志 * - * @param ids 需è¦åˆ é™¤çš„æ•°æ® + * @param infoIds 需è¦åˆ 除的登录日志ID * @return */ - public int deleteLogininforByIds(String ids); + public int deleteLogininforByIds(Long[] infoIds); /** * 清空系统登录日志 diff --git a/ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysOperLogService.java b/ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysOperLogService.java index d99eaf0..3e062ac 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysOperLogService.java +++ b/ruoyi/src/main/java/com/ruoyi/project/monitor/service/ISysOperLogService.java @@ -28,10 +28,10 @@ public interface ISysOperLogService /** * 批é‡åˆ 除系统æ“作日志 * - * @param ids 需è¦åˆ é™¤çš„æ•°æ® + * @param operIds 需è¦åˆ 除的æ“作日志ID * @return 结果 */ - public int deleteOperLogByIds(String ids); + public int deleteOperLogByIds(Long[] operIds); /** * 查询æ“作日志详细 diff --git a/ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysLogininforServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysLogininforServiceImpl.java index 6de6159..5195bb3 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysLogininforServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysLogininforServiceImpl.java @@ -3,7 +3,6 @@ package com.ruoyi.project.monitor.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.ruoyi.common.core.text.Convert; import com.ruoyi.project.monitor.domain.SysLogininfor; import com.ruoyi.project.monitor.mapper.SysLogininforMapper; import com.ruoyi.project.monitor.service.ISysLogininforService; @@ -46,13 +45,13 @@ public class SysLogininforServiceImpl implements ISysLogininforService /** * 批é‡åˆ 除系统登录日志 * - * @param ids 需è¦åˆ é™¤çš„æ•°æ® + * @param infoIds 需è¦åˆ 除的登录日志ID * @return */ @Override - public int deleteLogininforByIds(String ids) + public int deleteLogininforByIds(Long[] infoIds) { - return logininforMapper.deleteLogininforByIds(Convert.toStrArray(ids)); + return logininforMapper.deleteLogininforByIds(infoIds); } /** diff --git a/ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysOperLogServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysOperLogServiceImpl.java index fdf9684..65193dd 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysOperLogServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/project/monitor/service/impl/SysOperLogServiceImpl.java @@ -3,7 +3,6 @@ package com.ruoyi.project.monitor.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.ruoyi.common.core.text.Convert; import com.ruoyi.project.monitor.domain.SysOperLog; import com.ruoyi.project.monitor.mapper.SysOperLogMapper; import com.ruoyi.project.monitor.service.ISysOperLogService; @@ -45,13 +44,12 @@ public class SysOperLogServiceImpl implements ISysOperLogService /** * 批é‡åˆ 除系统æ“作日志 * - * @param ids 需è¦åˆ é™¤çš„æ•°æ® - * @return + * @param operIds 需è¦åˆ 除的æ“作日志ID + * @return 结果 */ - @Override - public int deleteOperLogByIds(String ids) + public int deleteOperLogByIds(Long[] operIds) { - return operLogMapper.deleteOperLogByIds(Convert.toStrArray(ids)); + return operLogMapper.deleteOperLogByIds(operIds); } /** diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysConfigController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysConfigController.java index 13b9d7c..df175e3 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysConfigController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysConfigController.java @@ -3,6 +3,7 @@ package com.ruoyi.project.system.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; @@ -45,6 +47,16 @@ public class SysConfigController extends BaseController return getDataTable(list); } + @Log(title = "傿•°ç®¡ç†", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:config:export')") + @GetMapping("/export") + public AjaxResult export(SysConfig config) + { + List<SysConfig> list = configService.selectConfigList(config); + ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class); + return util.exportExcel(list, "傿•°æ•°æ®"); + } + /** * æ ¹æ®å‚æ•°ç¼–å·èŽ·å–è¯¦ç»†ä¿¡æ¯ */ @@ -71,7 +83,7 @@ public class SysConfigController extends BaseController @PreAuthorize("@ss.hasPermi('system:config:add')") @Log(title = "傿•°ç®¡ç†", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody SysConfig config) + public AjaxResult add(@Validated @RequestBody SysConfig config) { if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) { @@ -87,7 +99,7 @@ public class SysConfigController extends BaseController @PreAuthorize("@ss.hasPermi('system:config:edit')") @Log(title = "傿•°ç®¡ç†", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody SysConfig config) + public AjaxResult edit(@Validated @RequestBody SysConfig config) { if (UserConstants.NOT_UNIQUE.equals(configService.checkConfigKeyUnique(config))) { @@ -102,9 +114,9 @@ public class SysConfigController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:config:remove')") @Log(title = "傿•°ç®¡ç†", businessType = BusinessType.DELETE) - @DeleteMapping("/{configId}") - public AjaxResult remove(@PathVariable Long configId) + @DeleteMapping("/{configIds}") + public AjaxResult remove(@PathVariable Long[] configIds) { - return toAjax(configService.deleteConfigById(configId)); + return toAjax(configService.deleteConfigByIds(configIds)); } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDeptController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDeptController.java index 00700b1..4934dcb 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDeptController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDeptController.java @@ -3,6 +3,7 @@ package com.ruoyi.project.system.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -10,7 +11,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.utils.SecurityUtils; @@ -70,7 +70,6 @@ public class SysDeptController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:dept:query')") @GetMapping(value = "/roleDeptTreeselect/{roleId}") - @ResponseBody public AjaxResult roleDeptTreeselect(@PathVariable("roleId") Long roleId) { return AjaxResult.success(deptService.selectDeptListByRoleId(roleId)); @@ -82,7 +81,7 @@ public class SysDeptController extends BaseController @PreAuthorize("@ss.hasPermi('system:dept:add')") @Log(title = "部门管ç†", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody SysDept dept) + public AjaxResult add(@Validated @RequestBody SysDept dept) { if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) { @@ -98,7 +97,7 @@ public class SysDeptController extends BaseController @PreAuthorize("@ss.hasPermi('system:dept:edit')") @Log(title = "部门管ç†", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody SysDept dept) + public AjaxResult edit(@Validated @RequestBody SysDept dept) { if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) { diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java index 488eeb5..8c5f1ea 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictDataController.java @@ -3,6 +3,7 @@ package com.ruoyi.project.system.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -10,9 +11,9 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; @@ -35,7 +36,6 @@ public class SysDictDataController extends BaseController @PreAuthorize("@ss.hasPermi('system:dict:list')") @GetMapping("/list") - @ResponseBody public TableDataInfo list(SysDictData dictData) { startPage(); @@ -43,6 +43,16 @@ public class SysDictDataController extends BaseController return getDataTable(list); } + @Log(title = "å—典数æ®", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @GetMapping("/export") + public AjaxResult export(SysDictData dictData) + { + List<SysDictData> list = dictDataService.selectDictDataList(dictData); + ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class); + return util.exportExcel(list, "å—典数æ®"); + } + /** * 查询å—典数æ®è¯¦ç»† */ @@ -69,7 +79,7 @@ public class SysDictDataController extends BaseController @PreAuthorize("@ss.hasPermi('system:dict:add')") @Log(title = "å—典数æ®", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody SysDictData dict) + public AjaxResult add(@Validated @RequestBody SysDictData dict) { dict.setCreateBy(SecurityUtils.getUsername()); return toAjax(dictDataService.insertDictData(dict)); @@ -81,7 +91,7 @@ public class SysDictDataController extends BaseController @PreAuthorize("@ss.hasPermi('system:dict:edit')") @Log(title = "å—典数æ®", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody SysDictData dict) + public AjaxResult edit(@Validated @RequestBody SysDictData dict) { dict.setUpdateBy(SecurityUtils.getUsername()); return toAjax(dictDataService.updateDictData(dict)); @@ -92,9 +102,9 @@ public class SysDictDataController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:dict:remove')") @Log(title = "å—典类型", businessType = BusinessType.DELETE) - @DeleteMapping("/{dictCode}") - public AjaxResult remove(@PathVariable Long dictCode) + @DeleteMapping("/{dictCodes}") + public AjaxResult remove(@PathVariable Long[] dictCodes) { - return toAjax(dictDataService.deleteDictDataById(dictCode)); + return toAjax(dictDataService.deleteDictDataByIds(dictCodes)); } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java index e98abde..f1dabc9 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysDictTypeController.java @@ -3,6 +3,7 @@ package com.ruoyi.project.system.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -10,10 +11,10 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; @@ -36,7 +37,6 @@ public class SysDictTypeController extends BaseController @PreAuthorize("@ss.hasPermi('system:dict:list')") @GetMapping("/list") - @ResponseBody public TableDataInfo list(SysDictType dictType) { startPage(); @@ -44,6 +44,16 @@ public class SysDictTypeController extends BaseController return getDataTable(list); } + @Log(title = "å—典类型", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:dict:export')") + @GetMapping("/export") + public AjaxResult export(SysDictType dictType) + { + List<SysDictType> list = dictTypeService.selectDictTypeList(dictType); + ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class); + return util.exportExcel(list, "å—典类型"); + } + /** * 查询å—典类型详细 */ @@ -60,7 +70,7 @@ public class SysDictTypeController extends BaseController @PreAuthorize("@ss.hasPermi('system:dict:add')") @Log(title = "å—典类型", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody SysDictType dict) + public AjaxResult add(@Validated @RequestBody SysDictType dict) { if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { @@ -76,7 +86,7 @@ public class SysDictTypeController extends BaseController @PreAuthorize("@ss.hasPermi('system:dict:edit')") @Log(title = "å—典类型", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody SysDictType dict) + public AjaxResult edit(@Validated @RequestBody SysDictType dict) { if (UserConstants.NOT_UNIQUE.equals(dictTypeService.checkDictTypeUnique(dict))) { @@ -91,9 +101,9 @@ public class SysDictTypeController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:dict:remove')") @Log(title = "å—典类型", businessType = BusinessType.DELETE) - @DeleteMapping("/{dictId}") - public AjaxResult remove(@PathVariable Long dictId) + @DeleteMapping("/{dictIds}") + public AjaxResult remove(@PathVariable Long[] dictIds) { - return toAjax(dictTypeService.deleteDictTypeById(dictId)); + return toAjax(dictTypeService.deleteDictTypeByIds(dictIds)); } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysMenuController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysMenuController.java index d47ff4d..173c0fa 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysMenuController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysMenuController.java @@ -11,7 +11,6 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.utils.SecurityUtils; @@ -71,7 +70,6 @@ public class SysMenuController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:menu:query')") @GetMapping(value = "/roleMenuTreeselect/{roleId}") - @ResponseBody public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) { return AjaxResult.success(menuService.selectMenuListByRoleId(roleId)); @@ -83,7 +81,7 @@ public class SysMenuController extends BaseController @PreAuthorize("@ss.hasPermi('system:menu:add')") @Log(title = "èœå•管ç†", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody @Validated SysMenu menu) + public AjaxResult add(@Validated @RequestBody SysMenu menu) { if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { @@ -99,7 +97,7 @@ public class SysMenuController extends BaseController @PreAuthorize("@ss.hasPermi('system:menu:edit')") @Log(title = "èœå•管ç†", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody SysMenu menu) + public AjaxResult edit(@Validated @RequestBody SysMenu menu) { if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) { diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysNoticeController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysNoticeController.java index 8bd3985..2435053 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysNoticeController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysNoticeController.java @@ -3,6 +3,7 @@ package com.ruoyi.project.system.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -60,7 +61,7 @@ public class SysNoticeController extends BaseController @PreAuthorize("@ss.hasPermi('system:notice:add')") @Log(title = "通知公告", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody SysNotice notice) + public AjaxResult add(@Validated @RequestBody SysNotice notice) { notice.setCreateBy(SecurityUtils.getUsername()); return toAjax(noticeService.insertNotice(notice)); @@ -72,7 +73,7 @@ public class SysNoticeController extends BaseController @PreAuthorize("@ss.hasPermi('system:notice:edit')") @Log(title = "通知公告", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody SysNotice notice) + public AjaxResult edit(@Validated @RequestBody SysNotice notice) { notice.setUpdateBy(SecurityUtils.getUsername()); return toAjax(noticeService.updateNotice(notice)); diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysPostController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysPostController.java index 77c3b55..f40f769 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysPostController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysPostController.java @@ -3,6 +3,7 @@ package com.ruoyi.project.system.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; @@ -44,6 +46,16 @@ public class SysPostController extends BaseController List<SysPost> list = postService.selectPostList(post); return getDataTable(list); } + + @Log(title = "å²—ä½ç®¡ç†", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:config:export')") + @GetMapping("/export") + public AjaxResult export(SysPost post) + { + List<SysPost> list = postService.selectPostList(post); + ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class); + return util.exportExcel(list, "岗使•°æ®"); + } /** * æ ¹æ®å²—ä½ç¼–å·èŽ·å–è¯¦ç»†ä¿¡æ¯ @@ -61,7 +73,7 @@ public class SysPostController extends BaseController @PreAuthorize("@ss.hasPermi('system:post:add')") @Log(title = "å²—ä½ç®¡ç†", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody SysPost post) + public AjaxResult add(@Validated @RequestBody SysPost post) { if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) { @@ -81,7 +93,7 @@ public class SysPostController extends BaseController @PreAuthorize("@ss.hasPermi('system:post:edit')") @Log(title = "å²—ä½ç®¡ç†", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody SysPost post) + public AjaxResult edit(@Validated @RequestBody SysPost post) { if (UserConstants.NOT_UNIQUE.equals(postService.checkPostNameUnique(post))) { @@ -100,10 +112,10 @@ public class SysPostController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:post:remove')") @Log(title = "å²—ä½ç®¡ç†", businessType = BusinessType.DELETE) - @DeleteMapping("/{postId}") - public AjaxResult remove(@PathVariable Long postId) + @DeleteMapping("/{postIds}") + public AjaxResult remove(@PathVariable Long[] postIds) { - return toAjax(postService.deletePostById(postId)); + return toAjax(postService.deletePostByIds(postIds)); } /** diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysRoleController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysRoleController.java index 9eae5b4..62ab858 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysRoleController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysRoleController.java @@ -3,6 +3,7 @@ package com.ruoyi.project.system.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; @@ -42,6 +44,16 @@ public class SysRoleController extends BaseController return getDataTable(list); } + @Log(title = "角色管ç†", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:role:export')") + @GetMapping("/export") + public AjaxResult export(SysRole role) + { + List<SysRole> list = roleService.selectRoleList(role); + ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class); + return util.exportExcel(list, "角色数æ®"); + } + /** * æ ¹æ®è§’色编å·èŽ·å–è¯¦ç»†ä¿¡æ¯ */ @@ -58,7 +70,7 @@ public class SysRoleController extends BaseController @PreAuthorize("@ss.hasPermi('system:role:add')") @Log(title = "角色管ç†", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody SysRole role) + public AjaxResult add(@Validated @RequestBody SysRole role) { if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) { @@ -79,7 +91,7 @@ public class SysRoleController extends BaseController @PreAuthorize("@ss.hasPermi('system:role:edit')") @Log(title = "角色管ç†", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody SysRole role) + public AjaxResult edit(@Validated @RequestBody SysRole role) { roleService.checkRoleAllowed(role); if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role))) @@ -120,15 +132,14 @@ public class SysRoleController extends BaseController } /** - * åˆ é™¤å²—ä½ + * åˆ é™¤è§’è‰² */ @PreAuthorize("@ss.hasPermi('system:role:remove')") @Log(title = "角色管ç†", businessType = BusinessType.DELETE) - @DeleteMapping("/{roleId}") - public AjaxResult remove(@PathVariable Long roleId) + @DeleteMapping("/{roleIds}") + public AjaxResult remove(@PathVariable Long[] roleIds) { - roleService.checkRoleAllowed(new SysRole(roleId)); - return toAjax(roleService.deleteRoleById(roleId)); + return toAjax(roleService.deleteRoleByIds(roleIds)); } /** diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysUserController.java b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysUserController.java index cd8cd89..d7449a5 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysUserController.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/controller/SysUserController.java @@ -3,6 +3,7 @@ package com.ruoyi.project.system.controller; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.ruoyi.common.constant.UserConstants; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.framework.aspectj.lang.annotation.Log; import com.ruoyi.framework.aspectj.lang.enums.BusinessType; import com.ruoyi.framework.web.controller.BaseController; @@ -53,6 +55,16 @@ public class SysUserController extends BaseController return getDataTable(list); } + @Log(title = "用户管ç†", businessType = BusinessType.EXPORT) + @PreAuthorize("@ss.hasPermi('system:user:export')") + @GetMapping("/export") + public AjaxResult export(SysUser user) + { + List<SysUser> list = userService.selectUserList(user); + ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class); + return util.exportExcel(list, "用户数æ®"); + } + /** * æ ¹æ®ç”¨æˆ·ç¼–å·èŽ·å–è¯¦ç»†ä¿¡æ¯ */ @@ -72,7 +84,7 @@ public class SysUserController extends BaseController @PreAuthorize("@ss.hasPermi('system:user:add')") @Log(title = "用户管ç†", businessType = BusinessType.INSERT) @PostMapping - public AjaxResult add(@RequestBody SysUser user) + public AjaxResult add(@Validated @RequestBody SysUser user) { if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName()))) { @@ -97,7 +109,7 @@ public class SysUserController extends BaseController @PreAuthorize("@ss.hasPermi('system:user:edit')") @Log(title = "用户管ç†", businessType = BusinessType.UPDATE) @PutMapping - public AjaxResult edit(@RequestBody SysUser user) + public AjaxResult edit(@Validated @RequestBody SysUser user) { userService.checkUserAllowed(user); if (UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user))) @@ -117,11 +129,10 @@ public class SysUserController extends BaseController */ @PreAuthorize("@ss.hasPermi('system:user:remove')") @Log(title = "用户管ç†", businessType = BusinessType.DELETE) - @DeleteMapping("/{userId}") - public AjaxResult remove(@PathVariable Long userId) + @DeleteMapping("/{userIds}") + public AjaxResult remove(@PathVariable Long[] userIds) { - userService.checkUserAllowed(new SysUser(userId)); - return toAjax(userService.deleteUserById(userId)); + return toAjax(userService.deleteUserByIds(userIds)); } /** diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysConfig.java b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysConfig.java index 9b4352a..ba1c022 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysConfig.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysConfig.java @@ -2,6 +2,10 @@ package com.ruoyi.project.system.domain; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.framework.aspectj.lang.annotation.Excel; +import com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType; import com.ruoyi.framework.web.domain.BaseEntity; /** @@ -14,18 +18,23 @@ public class SysConfig extends BaseEntity private static final long serialVersionUID = 1L; /** 傿•°ä¸»é”® */ + @Excel(name = "傿•°ä¸»é”®", cellType = ColumnType.NUMERIC) private Long configId; /** 傿•°åç§° */ + @Excel(name = "傿•°åç§°") private String configName; /** 傿•°é”®å */ + @Excel(name = "傿•°é”®å") private String configKey; /** 傿•°é”®å€¼ */ + @Excel(name = "傿•°é”®å€¼") private String configValue; /** 系统内置(Y是 Nå¦ï¼‰ */ + @Excel(name = "系统内置", readConverterExp = "Y=是,N=å¦") private String configType; public Long getConfigId() @@ -83,4 +92,20 @@ public class SysConfig extends BaseEntity { this.configType = configType; } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("configId", getConfigId()) + .append("configName", getConfigName()) + .append("configKey", getConfigKey()) + .append("configValue", getConfigValue()) + .append("configType", getConfigType()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDept.java b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDept.java index 8541660..ba12f15 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDept.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDept.java @@ -2,6 +2,11 @@ package com.ruoyi.project.system.domain; import java.util.ArrayList; import java.util.List; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.framework.web.domain.BaseEntity; /** @@ -45,7 +50,7 @@ public class SysDept extends BaseEntity /** 父部门åç§° */ private String parentName; - + /** å部门 */ private List<SysDept> children = new ArrayList<SysDept>(); @@ -79,6 +84,8 @@ public class SysDept extends BaseEntity this.ancestors = ancestors; } + @NotBlank(message = "部门åç§°ä¸èƒ½ä¸ºç©º") + @Size(min = 0, max = 30, message = "部门å称长度ä¸èƒ½è¶…过30个å—符") public String getDeptName() { return deptName; @@ -89,6 +96,7 @@ public class SysDept extends BaseEntity this.deptName = deptName; } + @NotBlank(message = "显示顺åºä¸èƒ½ä¸ºç©º") public String getOrderNum() { return orderNum; @@ -109,6 +117,7 @@ public class SysDept extends BaseEntity this.leader = leader; } + @Size(min = 0, max = 11, message = "è”系电è¯é•¿åº¦ä¸èƒ½è¶…过11个å—符") public String getPhone() { return phone; @@ -119,6 +128,8 @@ public class SysDept extends BaseEntity this.phone = phone; } + @Email(message = "é‚®ç®±æ ¼å¼ä¸æ£ç¡®") + @Size(min = 0, max = 50, message = "邮箱长度ä¸èƒ½è¶…过50个å—符") public String getEmail() { return email; @@ -168,4 +179,24 @@ public class SysDept extends BaseEntity { this.children = children; } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("deptId", getDeptId()) + .append("parentId", getParentId()) + .append("ancestors", getAncestors()) + .append("deptName", getDeptName()) + .append("orderNum", getOrderNum()) + .append("leader", getLeader()) + .append("phone", getPhone()) + .append("email", getEmail()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDictData.java b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDictData.java index 4c7efc6..8f7ec61 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDictData.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDictData.java @@ -2,7 +2,11 @@ package com.ruoyi.project.system.domain; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.framework.aspectj.lang.annotation.Excel; +import com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType; import com.ruoyi.framework.web.domain.BaseEntity; /** @@ -15,18 +19,23 @@ public class SysDictData extends BaseEntity private static final long serialVersionUID = 1L; /** å—典编ç */ + @Excel(name = "å—典编ç ", cellType = ColumnType.NUMERIC) private Long dictCode; /** å—å…¸æŽ’åº */ + @Excel(name = "å—典排åº", cellType = ColumnType.NUMERIC) private Long dictSort; /** å—å…¸æ ‡ç¾ */ + @Excel(name = "å—å…¸æ ‡ç¾") private String dictLabel; /** å—典键值 */ + @Excel(name = "å—典键值") private String dictValue; /** å—典类型 */ + @Excel(name = "å—典类型") private String dictType; /** æ ·å¼å±žæ€§ï¼ˆå…¶ä»–æ ·å¼æ‰©å±•) */ @@ -36,9 +45,11 @@ public class SysDictData extends BaseEntity private String listClass; /** 是å¦é»˜è®¤ï¼ˆY是 Nå¦ï¼‰ */ + @Excel(name = "是å¦é»˜è®¤", readConverterExp = "Y=是,N=å¦") private String isDefault; /** 状æ€ï¼ˆ0æ£å¸¸ 1åœç”¨ï¼‰ */ + @Excel(name = "状æ€", readConverterExp = "0=æ£å¸¸,1=åœç”¨") private String status; public Long getDictCode() @@ -142,4 +153,24 @@ public class SysDictData extends BaseEntity { this.status = status; } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictCode", getDictCode()) + .append("dictSort", getDictSort()) + .append("dictLabel", getDictLabel()) + .append("dictValue", getDictValue()) + .append("dictType", getDictType()) + .append("cssClass", getCssClass()) + .append("listClass", getListClass()) + .append("isDefault", getIsDefault()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDictType.java b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDictType.java index 8d3021e..a800f69 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDictType.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysDictType.java @@ -2,6 +2,10 @@ package com.ruoyi.project.system.domain; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.framework.aspectj.lang.annotation.Excel; +import com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType; import com.ruoyi.framework.web.domain.BaseEntity; /** @@ -14,15 +18,19 @@ public class SysDictType extends BaseEntity private static final long serialVersionUID = 1L; /** å—典主键 */ + @Excel(name = "å—典主键", cellType = ColumnType.NUMERIC) private Long dictId; /** å—å…¸åç§° */ + @Excel(name = "å—å…¸åç§°") private String dictName; /** å—典类型 */ + @Excel(name = "å—典类型") private String dictType; /** 状æ€ï¼ˆ0æ£å¸¸ 1åœç”¨ï¼‰ */ + @Excel(name = "状æ€", readConverterExp = "0=æ£å¸¸,1=åœç”¨") private String status; public Long getDictId() @@ -68,4 +76,19 @@ public class SysDictType extends BaseEntity { this.status = status; } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("dictId", getDictId()) + .append("dictName", getDictName()) + .append("dictType", getDictType()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysMenu.java b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysMenu.java index 73303d2..baeeeed 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysMenu.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysMenu.java @@ -1,8 +1,12 @@ package com.ruoyi.project.system.domain; +import java.util.ArrayList; import java.util.List; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.framework.web.domain.BaseEntity; -import java.util.ArrayList; /** * èœå•æƒé™è¡¨ sys_menu @@ -62,6 +66,8 @@ public class SysMenu extends BaseEntity this.menuId = menuId; } + @NotBlank(message = "èœå•åç§°ä¸èƒ½ä¸ºç©º") + @Size(min = 0, max = 50, message = "èœå•å称长度ä¸èƒ½è¶…过50个å—符") public String getMenuName() { return menuName; @@ -92,6 +98,7 @@ public class SysMenu extends BaseEntity this.parentId = parentId; } + @NotBlank(message = "显示顺åºä¸èƒ½ä¸ºç©º") public String getOrderNum() { return orderNum; @@ -102,6 +109,7 @@ public class SysMenu extends BaseEntity this.orderNum = orderNum; } + @Size(min = 0, max = 200, message = "路由地å€ä¸èƒ½è¶…过200个å—符") public String getPath() { return path; @@ -112,6 +120,7 @@ public class SysMenu extends BaseEntity this.path = path; } + @Size(min = 0, max = 200, message = "组件路径ä¸èƒ½è¶…过255个å—符") public String getComponent() { return component; @@ -132,6 +141,7 @@ public class SysMenu extends BaseEntity this.isFrame = isFrame; } + @NotBlank(message = "èœå•类型ä¸èƒ½ä¸ºç©º") public String getMenuType() { return menuType; @@ -152,6 +162,7 @@ public class SysMenu extends BaseEntity this.visible = visible; } + @Size(min = 0, max = 100, message = "æƒé™æ ‡è¯†é•¿åº¦ä¸èƒ½è¶…过100个å—符") public String getPerms() { return perms; @@ -181,4 +192,26 @@ public class SysMenu extends BaseEntity { this.children = children; } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("menuId", getMenuId()) + .append("menuName", getMenuName()) + .append("parentId", getParentId()) + .append("orderNum", getOrderNum()) + .append("path", getPath()) + .append("component", getComponent()) + .append("isFrame", getIsFrame()) + .append("menuType", getMenuType()) + .append("visible", getVisible()) + .append("perms", getPerms()) + .append("icon", getIcon()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysNotice.java b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysNotice.java index dbf5248..916fd32 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysNotice.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysNotice.java @@ -1,5 +1,9 @@ package com.ruoyi.project.system.domain; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; import com.ruoyi.framework.web.domain.BaseEntity; /** @@ -41,6 +45,8 @@ public class SysNotice extends BaseEntity this.noticeTitle = noticeTitle; } + @NotBlank(message = "å…¬å‘Šæ ‡é¢˜ä¸èƒ½ä¸ºç©º") + @Size(min = 0, max = 50, message = "å…¬å‘Šæ ‡é¢˜ä¸èƒ½è¶…过50个å—符") public String getNoticeTitle() { return noticeTitle; @@ -75,4 +81,20 @@ public class SysNotice extends BaseEntity { return status; } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("noticeId", getNoticeId()) + .append("noticeTitle", getNoticeTitle()) + .append("noticeType", getNoticeType()) + .append("noticeContent", getNoticeContent()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysPost.java b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysPost.java index 0b1a937..ebafe7d 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysPost.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysPost.java @@ -2,6 +2,10 @@ package com.ruoyi.project.system.domain; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.framework.aspectj.lang.annotation.Excel; +import com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType; import com.ruoyi.framework.web.domain.BaseEntity; /** @@ -14,18 +18,23 @@ public class SysPost extends BaseEntity private static final long serialVersionUID = 1L; /** å²—ä½åºå· */ + @Excel(name = "å²—ä½åºå·", cellType = ColumnType.NUMERIC) private Long postId; /** å²—ä½ç¼–ç */ + @Excel(name = "å²—ä½ç¼–ç ") private String postCode; /** å²—ä½åç§° */ + @Excel(name = "å²—ä½åç§°") private String postName; /** å²—ä½æŽ’åº */ + @Excel(name = "岗使ޒåº") private String postSort; /** 状æ€ï¼ˆ0æ£å¸¸ 1åœç”¨ï¼‰ */ + @Excel(name = "状æ€", readConverterExp = "0=æ£å¸¸,1=åœç”¨") private String status; /** 用户是å¦å˜åœ¨æ¤å²—使 ‡è¯† 默认ä¸å˜åœ¨ */ @@ -95,4 +104,20 @@ public class SysPost extends BaseEntity { this.flag = flag; } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("postId", getPostId()) + .append("postCode", getPostCode()) + .append("postName", getPostName()) + .append("postSort", getPostSort()) + .append("status", getStatus()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysRole.java b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysRole.java index 27bed48..ca33e32 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysRole.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysRole.java @@ -1,5 +1,11 @@ package com.ruoyi.project.system.domain; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.framework.aspectj.lang.annotation.Excel; +import com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType; import com.ruoyi.framework.web.domain.BaseEntity; /** @@ -12,21 +18,27 @@ public class SysRole extends BaseEntity private static final long serialVersionUID = 1L; /** 角色ID */ + @Excel(name = "角色åºå·", cellType = ColumnType.NUMERIC) private Long roleId; /** 角色åç§° */ + @Excel(name = "角色åç§°") private String roleName; /** 角色æƒé™ */ + @Excel(name = "角色æƒé™") private String roleKey; /** è§’è‰²æŽ’åº */ + @Excel(name = "角色排åº") private String roleSort; - /** æ•°æ®èŒƒå›´ */ + /** æ•°æ®èŒƒå›´ï¼ˆ1ï¼šæ‰€æœ‰æ•°æ®æƒé™ï¼›2ï¼šè‡ªå®šä¹‰æ•°æ®æƒé™ï¼›3ï¼šæœ¬éƒ¨é—¨æ•°æ®æƒé™ï¼›4:本部门åŠä»¥ä¸‹æ•°æ®æƒé™ï¼‰ */ + @Excel(name = "æ•°æ®èŒƒå›´", readConverterExp = "1=æ‰€æœ‰æ•°æ®æƒé™,2=è‡ªå®šä¹‰æ•°æ®æƒé™,3=æœ¬éƒ¨é—¨æ•°æ®æƒé™,4=本部门åŠä»¥ä¸‹æ•°æ®æƒé™") private String dataScope; /** 角色状æ€ï¼ˆ0æ£å¸¸ 1åœç”¨ï¼‰ */ + @Excel(name = "角色状æ€", readConverterExp = "0=æ£å¸¸,1=åœç”¨") private String status; /** åˆ é™¤æ ‡å¿—ï¼ˆ0代表å˜åœ¨ 2ä»£è¡¨åˆ é™¤ï¼‰ */ @@ -71,6 +83,8 @@ public class SysRole extends BaseEntity return roleId != null && 1L == roleId; } + @NotBlank(message = "角色åç§°ä¸èƒ½ä¸ºç©º") + @Size(min = 0, max = 30, message = "角色å称长度ä¸èƒ½è¶…过30个å—符") public String getRoleName() { return roleName; @@ -81,6 +95,8 @@ public class SysRole extends BaseEntity this.roleName = roleName; } + @NotBlank(message = "æƒé™å—符ä¸èƒ½ä¸ºç©º") + @Size(min = 0, max = 100, message = "æƒé™å—符长度ä¸èƒ½è¶…过100个å—符") public String getRoleKey() { return roleKey; @@ -91,6 +107,7 @@ public class SysRole extends BaseEntity this.roleKey = roleKey; } + @NotBlank(message = "显示顺åºä¸èƒ½ä¸ºç©º") public String getRoleSort() { return roleSort; @@ -160,4 +177,21 @@ public class SysRole extends BaseEntity { this.deptIds = deptIds; } + + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("roleId", getRoleId()) + .append("roleName", getRoleName()) + .append("roleKey", getRoleKey()) + .append("roleSort", getRoleSort()) + .append("dataScope", getDataScope()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysUser.java b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysUser.java index f6549bb..6c2981e 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysUser.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/domain/SysUser.java @@ -2,6 +2,14 @@ package com.ruoyi.project.system.domain; import java.util.Date; import java.util.List; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.framework.aspectj.lang.annotation.Excel; +import com.ruoyi.framework.aspectj.lang.annotation.Excel.ColumnType; +import com.ruoyi.framework.aspectj.lang.annotation.Excels; import com.ruoyi.framework.web.domain.BaseEntity; /** @@ -14,24 +22,30 @@ public class SysUser extends BaseEntity private static final long serialVersionUID = 1L; /** 用户ID */ + @Excel(name = "用户åºå·", cellType = ColumnType.NUMERIC, prompt = "用户编å·") private Long userId; /** 部门ID */ private Long deptId; /** ç”¨æˆ·è´¦å· */ + @Excel(name = "登录åç§°") private String userName; /** 用户昵称 */ + @Excel(name = "用户åç§°") private String nickName; /** 用户邮箱 */ + @Excel(name = "用户邮箱") private String email; /** 手机å·ç */ + @Excel(name = "手机å·ç ") private String phonenumber; /** 用户性别 */ + @Excel(name = "用户性别", readConverterExp = "0=ç”·,1=女,2=未知") private String sex; /** ç”¨æˆ·å¤´åƒ */ @@ -44,18 +58,22 @@ public class SysUser extends BaseEntity private String salt; /** å¸å·çжæ€ï¼ˆ0æ£å¸¸ 1åœç”¨ï¼‰ */ + @Excel(name = "å¸å·çжæ€", readConverterExp = "0=æ£å¸¸,1=åœç”¨") private String status; /** åˆ é™¤æ ‡å¿—ï¼ˆ0代表å˜åœ¨ 2ä»£è¡¨åˆ é™¤ï¼‰ */ private String delFlag; /** 最åŽç™»é™†IP */ + @Excel(name = "最åŽç™»é™†IP") private String loginIp; /** 最åŽç™»é™†æ—¶é—´ */ + @Excel(name = "最åŽç™»é™†æ—¶é—´", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date loginDate; /** 部门对象 */ + @Excels({ @Excel(name = "部门åç§°", targetAttr = "deptName"), @Excel(name = "部门负责人", targetAttr = "leader") }) private SysDept dept; /** 角色对象 */ @@ -107,6 +125,7 @@ public class SysUser extends BaseEntity this.deptId = deptId; } + @Size(min = 0, max = 30, message = "用户昵称长度ä¸èƒ½è¶…过30个å—符") public String getNickName() { return nickName; @@ -117,6 +136,8 @@ public class SysUser extends BaseEntity this.nickName = nickName; } + @NotBlank(message = "用户账å·ä¸èƒ½ä¸ºç©º") + @Size(min = 0, max = 30, message = "用户账å·é•¿åº¦ä¸èƒ½è¶…过30个å—符") public String getUserName() { return userName; @@ -127,6 +148,8 @@ public class SysUser extends BaseEntity this.userName = userName; } + @Email(message = "é‚®ç®±æ ¼å¼ä¸æ£ç¡®") + @Size(min = 0, max = 50, message = "邮箱长度ä¸èƒ½è¶…过50个å—符") public String getEmail() { return email; @@ -137,6 +160,7 @@ public class SysUser extends BaseEntity this.email = email; } + @Size(min = 0, max = 11, message = "手机å·ç 长度ä¸èƒ½è¶…过11个å—符") public String getPhonenumber() { return phonenumber; @@ -266,5 +290,30 @@ public class SysUser extends BaseEntity { this.postIds = postIds; } - + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("deptId", getDeptId()) + .append("userName", getUserName()) + .append("nickName", getNickName()) + .append("email", getEmail()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("avatar", getAvatar()) + .append("password", getPassword()) + .append("salt", getSalt()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("loginIp", getLoginIp()) + .append("loginDate", getLoginDate()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) + .append("dept", getDept()) + .toString(); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysConfigMapper.java b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysConfigMapper.java index 02d9270..eea48d6 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysConfigMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysConfigMapper.java @@ -53,8 +53,16 @@ public interface SysConfigMapper /** * åˆ é™¤å‚æ•°é…ç½® * - * @param configId 需è¦åˆ 除的数æ®ID + * @param configId 傿•°ID * @return 结果 */ public int deleteConfigById(Long configId); + + /** + * 批é‡åˆ 除傿•°ä¿¡æ¯ + * + * @param configIds 需è¦åˆ é™¤çš„å‚æ•°ID + * @return 结果 + */ + public int deleteConfigByIds(Long[] configIds); } \ No newline at end of file diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysDictDataMapper.java b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysDictDataMapper.java index eaa25da..c938d88 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysDictDataMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysDictDataMapper.java @@ -60,6 +60,14 @@ public interface SysDictDataMapper */ public int deleteDictDataById(Long dictCode); + /** + * 批é‡åˆ 除å—典数æ®ä¿¡æ¯ + * + * @param dictCodes 需è¦åˆ 除的å—典数æ®ID + * @return 结果 + */ + public int deleteDictDataByIds(Long[] dictCodes); + /** * 新增å—典数æ®ä¿¡æ¯ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysDictTypeMapper.java b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysDictTypeMapper.java index 16ceb69..8a71574 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysDictTypeMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysDictTypeMapper.java @@ -51,6 +51,14 @@ public interface SysDictTypeMapper */ public int deleteDictTypeById(Long dictId); + /** + * 批é‡åˆ 除å—å…¸ç±»åž‹ä¿¡æ¯ + * + * @param dictIds 需è¦åˆ 除的å—å…¸ID + * @return 结果 + */ + public int deleteDictTypeByIds(Long[] dictIds); + /** * 新增å—å…¸ç±»åž‹ä¿¡æ¯ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysNoticeMapper.java b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysNoticeMapper.java index ed6bcc0..2046c7a 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysNoticeMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysNoticeMapper.java @@ -49,4 +49,12 @@ public interface SysNoticeMapper * @return 结果 */ public int deleteNoticeById(Long noticeId); + + /** + * 批é‡åˆ é™¤å…¬å‘Šä¿¡æ¯ + * + * @param noticeIds 需è¦åˆ 除的公告ID + * @return 结果 + */ + public int deleteNoticeByIds(Long noticeIds); } \ No newline at end of file diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysPostMapper.java b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysPostMapper.java index 4c0d41e..2cb34f7 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysPostMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysPostMapper.java @@ -57,6 +57,14 @@ public interface SysPostMapper */ public int deletePostById(Long postId); + /** + * 批é‡åˆ 除岗ä½ä¿¡æ¯ + * + * @param postIds 需è¦åˆ 除的岗ä½ID + * @return 结果 + */ + public int deletePostByIds(Long[] postIds); + /** * 修改岗ä½ä¿¡æ¯ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysRoleMapper.java b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysRoleMapper.java index 2f8cbd0..200bb1e 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysRoleMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysRoleMapper.java @@ -97,4 +97,11 @@ public interface SysRoleMapper */ public int deleteRoleById(Long roleId); + /** + * 批é‡åˆ é™¤è§’è‰²ä¿¡æ¯ + * + * @param roleIds 需è¦åˆ 除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds); } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java index a93cb6f..bb07335 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java @@ -79,6 +79,14 @@ public interface SysUserMapper */ public int deleteUserById(Long userId); + /** + * 批é‡åˆ é™¤ç”¨æˆ·ä¿¡æ¯ + * + * @param userIds 需è¦åˆ 除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds); + /** * æ ¡éªŒç”¨æˆ·å称是å¦å”¯ä¸€ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysConfigService.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysConfigService.java index 45353e9..4d8666c 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysConfigService.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysConfigService.java @@ -53,11 +53,19 @@ public interface ISysConfigService /** * åˆ é™¤å‚æ•°é…ç½®ä¿¡æ¯ * - * @param configId 需è¦åˆ 除的数æ®ID + * @param configId 傿•°ID * @return 结果 */ public int deleteConfigById(Long configId); + /** + * 批é‡åˆ 除傿•°ä¿¡æ¯ + * + * @param configIds 需è¦åˆ é™¤çš„å‚æ•°ID + * @return 结果 + */ + public int deleteConfigByIds(Long[] configIds); + /** * æ ¡éªŒå‚æ•°é”®å是å¦å”¯ä¸€ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictDataService.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictDataService.java index 936bc44..870f357 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictDataService.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictDataService.java @@ -51,6 +51,14 @@ public interface ISysDictDataService */ public int deleteDictDataById(Long dictCode); + /** + * 批é‡åˆ 除å—典数æ®ä¿¡æ¯ + * + * @param dictCodes 需è¦åˆ 除的å—典数æ®ID + * @return 结果 + */ + public int deleteDictDataByIds(Long[] dictCodes); + /** * 新增ä¿å˜å—典数æ®ä¿¡æ¯ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictTypeService.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictTypeService.java index 1e3e7cf..326beb7 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictTypeService.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysDictTypeService.java @@ -49,6 +49,14 @@ public interface ISysDictTypeService */ public int deleteDictTypeById(Long dictId); + /** + * 批é‡åˆ 除å—å…¸ä¿¡æ¯ + * + * @param dictIds 需è¦åˆ 除的å—å…¸ID + * @return 结果 + */ + public int deleteDictTypeByIds(Long[] dictIds); + /** * 新增ä¿å˜å—å…¸ç±»åž‹ä¿¡æ¯ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysNoticeService.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysNoticeService.java index 77c6722..f45e391 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysNoticeService.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysNoticeService.java @@ -49,4 +49,12 @@ public interface ISysNoticeService * @return 结果 */ public int deleteNoticeById(Long noticeId); + + /** + * 批é‡åˆ é™¤å…¬å‘Šä¿¡æ¯ + * + * @param noticeIds 需è¦åˆ 除的公告ID + * @return 结果 + */ + public int deleteNoticeByIds(Long noticeIds); } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysPostService.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysPostService.java index f5770f6..5696e08 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysPostService.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysPostService.java @@ -57,6 +57,14 @@ public interface ISysPostService */ public String checkPostCodeUnique(SysPost post); + /** + * 通过岗ä½ID查询岗ä½ä½¿ç”¨æ•°é‡ + * + * @param postId å²—ä½ID + * @return 结果 + */ + public int countUserPostById(Long postId); + /** * åˆ é™¤å²—ä½ä¿¡æ¯ * @@ -65,6 +73,15 @@ public interface ISysPostService */ public int deletePostById(Long postId); + /** + * 批é‡åˆ 除岗ä½ä¿¡æ¯ + * + * @param postIds 需è¦åˆ 除的岗ä½ID + * @return 结果 + * @throws Exception 异常 + */ + public int deletePostByIds(Long[] postIds); + /** * 新增ä¿å˜å²—ä½ä¿¡æ¯ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysRoleService.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysRoleService.java index 1774f13..fbd5617 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysRoleService.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysRoleService.java @@ -73,6 +73,14 @@ public interface ISysRoleService */ public void checkRoleAllowed(SysRole role); + /** + * 通过角色IDæŸ¥è¯¢è§’è‰²ä½¿ç”¨æ•°é‡ + * + * @param roleId 角色ID + * @return 结果 + */ + public int countUserRoleByRoleId(Long roleId); + /** * 新增ä¿å˜è§’è‰²ä¿¡æ¯ * @@ -112,4 +120,12 @@ public interface ISysRoleService * @return 结果 */ public int deleteRoleById(Long roleId); + + /** + * 批é‡åˆ é™¤è§’è‰²ä¿¡æ¯ + * + * @param roleIds 需è¦åˆ 除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds); } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysUserService.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysUserService.java index 2136cc9..9aa9eac 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysUserService.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/ISysUserService.java @@ -146,4 +146,12 @@ public interface ISysUserService * @return 结果 */ public int deleteUserById(Long userId); + + /** + * 批é‡åˆ é™¤ç”¨æˆ·ä¿¡æ¯ + * + * @param userIds 需è¦åˆ 除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds); } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysConfigServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysConfigServiceImpl.java index de62e8d..bf4d7c2 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysConfigServiceImpl.java @@ -88,7 +88,7 @@ public class SysConfigServiceImpl implements ISysConfigService /** * åˆ é™¤å‚æ•°é…ç½®ä¿¡æ¯ * - * @param configId 需è¦åˆ 除的数æ®ID + * @param configId 傿•°ID * @return 结果 */ @Override @@ -97,6 +97,18 @@ public class SysConfigServiceImpl implements ISysConfigService return configMapper.deleteConfigById(configId); } + /** + * 批é‡åˆ 除傿•°ä¿¡æ¯ + * + * @param configIds 需è¦åˆ é™¤çš„å‚æ•°ID + * @return 结果 + */ + @Override + public int deleteConfigByIds(Long[] configIds) + { + return configMapper.deleteConfigByIds(configIds); + } + /** * æ ¡éªŒå‚æ•°é”®å是å¦å”¯ä¸€ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictDataServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictDataServiceImpl.java index d940743..e8475dc 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictDataServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictDataServiceImpl.java @@ -79,6 +79,17 @@ public class SysDictDataServiceImpl implements ISysDictDataService return dictDataMapper.deleteDictDataById(dictCode); } + /** + * 批é‡åˆ 除å—典数æ®ä¿¡æ¯ + * + * @param dictCodes 需è¦åˆ 除的å—典数æ®ID + * @return 结果 + */ + public int deleteDictDataByIds(Long[] dictCodes) + { + return dictDataMapper.deleteDictDataByIds(dictCodes); + } + /** * 新增ä¿å˜å—典数æ®ä¿¡æ¯ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictTypeServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictTypeServiceImpl.java index de784de..2cf5f19 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictTypeServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysDictTypeServiceImpl.java @@ -83,6 +83,17 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService return dictTypeMapper.deleteDictTypeById(dictId); } + /** + * 批é‡åˆ 除å—å…¸ç±»åž‹ä¿¡æ¯ + * + * @param dictIds 需è¦åˆ 除的å—å…¸ID + * @return 结果 + */ + public int deleteDictTypeByIds(Long[] dictIds) + { + return dictTypeMapper.deleteDictTypeByIds(dictIds); + } + /** * 新增ä¿å˜å—å…¸ç±»åž‹ä¿¡æ¯ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java index 800f4d1..ee29660 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysNoticeServiceImpl.java @@ -77,4 +77,15 @@ public class SysNoticeServiceImpl implements ISysNoticeService { return noticeMapper.deleteNoticeById(noticeId); } + + /** + * 批é‡åˆ é™¤å…¬å‘Šä¿¡æ¯ + * + * @param noticeIds 需è¦åˆ 除的公告ID + * @return 结果 + */ + public int deleteNoticeByIds(Long noticeIds) + { + return noticeMapper.deleteNoticeByIds(noticeIds); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysPostServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysPostServiceImpl.java index 682d147..e60dc06 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysPostServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysPostServiceImpl.java @@ -4,9 +4,11 @@ import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ruoyi.common.constant.UserConstants; +import com.ruoyi.common.exception.CustomException; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.project.system.domain.SysPost; import com.ruoyi.project.system.mapper.SysPostMapper; +import com.ruoyi.project.system.mapper.SysUserPostMapper; import com.ruoyi.project.system.service.ISysPostService; /** @@ -20,6 +22,9 @@ public class SysPostServiceImpl implements ISysPostService @Autowired private SysPostMapper postMapper; + @Autowired + private SysUserPostMapper userPostMapper; + /** * 查询岗ä½ä¿¡æ¯é›†åˆ * @@ -66,7 +71,6 @@ public class SysPostServiceImpl implements ISysPostService return postMapper.selectPostListByUserId(userId); } - /** * æ ¡éªŒå²—ä½å称是å¦å”¯ä¸€ * @@ -103,6 +107,18 @@ public class SysPostServiceImpl implements ISysPostService return UserConstants.UNIQUE; } + /** + * 通过岗ä½ID查询岗ä½ä½¿ç”¨æ•°é‡ + * + * @param postId å²—ä½ID + * @return 结果 + */ + @Override + public int countUserPostById(Long postId) + { + return userPostMapper.countUserPostById(postId); + } + /** * åˆ é™¤å²—ä½ä¿¡æ¯ * @@ -115,6 +131,26 @@ public class SysPostServiceImpl implements ISysPostService return postMapper.deletePostById(postId); } + /** + * 批é‡åˆ 除岗ä½ä¿¡æ¯ + * + * @param postIds 需è¦åˆ 除的岗ä½ID + * @return 结果 + * @throws Exception 异常 + */ + public int deletePostByIds(Long[] postIds) + { + for (Long postId : postIds) + { + SysPost post = selectPostById(postId); + if (countUserPostById(postId) > 0) + { + throw new CustomException(String.format("%1$s已分é…,ä¸èƒ½åˆ 除", post.getPostName())); + } + } + return postMapper.deletePostByIds(postIds); + } + /** * 新增ä¿å˜å²—ä½ä¿¡æ¯ * diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysRoleServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysRoleServiceImpl.java index 82c458d..4ca63e4 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysRoleServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysRoleServiceImpl.java @@ -18,6 +18,7 @@ import com.ruoyi.project.system.domain.SysRoleMenu; import com.ruoyi.project.system.mapper.SysRoleDeptMapper; import com.ruoyi.project.system.mapper.SysRoleMapper; import com.ruoyi.project.system.mapper.SysRoleMenuMapper; +import com.ruoyi.project.system.mapper.SysUserRoleMapper; import com.ruoyi.project.system.service.ISysRoleService; /** @@ -34,6 +35,9 @@ public class SysRoleServiceImpl implements ISysRoleService @Autowired private SysRoleMenuMapper roleMenuMapper; + @Autowired + private SysUserRoleMapper userRoleMapper; + @Autowired private SysRoleDeptMapper roleDeptMapper; @@ -152,6 +156,18 @@ public class SysRoleServiceImpl implements ISysRoleService } } + /** + * 通过角色IDæŸ¥è¯¢è§’è‰²ä½¿ç”¨æ•°é‡ + * + * @param roleId 角色ID + * @return 结果 + */ + @Override + public int countUserRoleByRoleId(Long roleId) + { + return userRoleMapper.countUserRoleByRoleId(roleId); + } + /** * 新增ä¿å˜è§’è‰²ä¿¡æ¯ * @@ -272,4 +288,24 @@ public class SysRoleServiceImpl implements ISysRoleService { return roleMapper.deleteRoleById(roleId); } + + /** + * 批é‡åˆ é™¤è§’è‰²ä¿¡æ¯ + * + * @param roleIds 需è¦åˆ 除的角色ID + * @return 结果 + */ + public int deleteRoleByIds(Long[] roleIds) + { + for (Long roleId : roleIds) + { + checkRoleAllowed(new SysRole(roleId)); + SysRole role = selectRoleById(roleId); + if (countUserRoleByRoleId(roleId) > 0) + { + throw new CustomException(String.format("%1$s已分é…,ä¸èƒ½åˆ 除", role.getRoleName())); + } + } + return roleMapper.deleteRoleByIds(roleIds); + } } diff --git a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java index 0a62aca..5aba7a1 100644 --- a/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi/src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java @@ -360,4 +360,19 @@ public class SysUserServiceImpl implements ISysUserService userPostMapper.deleteUserPostByUserId(userId); return userMapper.deleteUserById(userId); } + + /** + * 批é‡åˆ é™¤ç”¨æˆ·ä¿¡æ¯ + * + * @param userIds 需è¦åˆ 除的用户ID + * @return 结果 + */ + public int deleteUserByIds(Long[] userIds) + { + for (Long userId : userIds) + { + checkUserAllowed(new SysUser(userId)); + } + return userMapper.deleteUserByIds(userIds); + } } diff --git a/ruoyi/src/main/resources/application.yml b/ruoyi/src/main/resources/application.yml index 4146e35..a1f653d 100644 --- a/ruoyi/src/main/resources/application.yml +++ b/ruoyi/src/main/resources/application.yml @@ -3,7 +3,7 @@ ruoyi: # åç§° name: RuoYi # 版本 - version: 1.0.0 + version: 1.1.0 # 版æƒå¹´ä»½ copyrightYear: 2019 # 实例演示开关 diff --git a/ruoyi/src/main/resources/mybatis/monitor/SysLogininforMapper.xml b/ruoyi/src/main/resources/mybatis/monitor/SysLogininforMapper.xml index 0301a3d..c5521a4 100644 --- a/ruoyi/src/main/resources/mybatis/monitor/SysLogininforMapper.xml +++ b/ruoyi/src/main/resources/mybatis/monitor/SysLogininforMapper.xml @@ -42,7 +42,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" </where> </select> - <delete id="deleteLogininforByIds" parameterType="String"> + <delete id="deleteLogininforByIds" parameterType="Long"> delete from sys_logininfor where info_id in <foreach collection="array" item="infoId" open="(" separator="," close=")"> #{infoId} diff --git a/ruoyi/src/main/resources/mybatis/monitor/SysOperLogMapper.xml b/ruoyi/src/main/resources/mybatis/monitor/SysOperLogMapper.xml index 6517828..c6e12c4 100644 --- a/ruoyi/src/main/resources/mybatis/monitor/SysOperLogMapper.xml +++ b/ruoyi/src/main/resources/mybatis/monitor/SysOperLogMapper.xml @@ -63,7 +63,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" </where> </select> - <delete id="deleteOperLogByIds" parameterType="String"> + <delete id="deleteOperLogByIds" parameterType="Long"> delete from sys_oper_log where oper_id in <foreach collection="array" item="operId" open="(" separator="," close=")"> #{operId} diff --git a/ruoyi/src/main/resources/mybatis/system/SysConfigMapper.xml b/ruoyi/src/main/resources/mybatis/system/SysConfigMapper.xml index 2189371..5cfb1f3 100644 --- a/ruoyi/src/main/resources/mybatis/system/SysConfigMapper.xml +++ b/ruoyi/src/main/resources/mybatis/system/SysConfigMapper.xml @@ -102,4 +102,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" delete from sys_config where config_id = #{configId} </delete> + <delete id="deleteConfigByIds" parameterType="Long"> + delete from sys_config where config_id in + <foreach item="configId" collection="array" open="(" separator="," close=")"> + #{configId} + </foreach> + </delete> + </mapper> \ No newline at end of file diff --git a/ruoyi/src/main/resources/mybatis/system/SysDictDataMapper.xml b/ruoyi/src/main/resources/mybatis/system/SysDictDataMapper.xml index 57e53c7..b610053 100644 --- a/ruoyi/src/main/resources/mybatis/system/SysDictDataMapper.xml +++ b/ruoyi/src/main/resources/mybatis/system/SysDictDataMapper.xml @@ -62,6 +62,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <delete id="deleteDictDataById" parameterType="Long"> delete from sys_dict_data where dict_code = #{dictCode} </delete> + + <delete id="deleteDictDataByIds" parameterType="Long"> + delete from sys_dict_data where dict_code in + <foreach collection="array" item="dictCode" open="(" separator="," close=")"> + #{dictCode} + </foreach> + </delete> <update id="updateDictData" parameterType="SysDictData"> update sys_dict_data diff --git a/ruoyi/src/main/resources/mybatis/system/SysDictTypeMapper.xml b/ruoyi/src/main/resources/mybatis/system/SysDictTypeMapper.xml index 0a8b26c..2c3f74e 100644 --- a/ruoyi/src/main/resources/mybatis/system/SysDictTypeMapper.xml +++ b/ruoyi/src/main/resources/mybatis/system/SysDictTypeMapper.xml @@ -63,6 +63,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <delete id="deleteDictTypeById" parameterType="Long"> delete from sys_dict_type where dict_id = #{dictId} </delete> + + <delete id="deleteDictTypeByIds" parameterType="Long"> + delete from sys_dict_type where dict_id in + <foreach collection="array" item="dictId" open="(" separator="," close=")"> + #{dictId} + </foreach> + </delete> <update id="updateDictType" parameterType="SysDictType"> update sys_dict_type diff --git a/ruoyi/src/main/resources/mybatis/system/SysNoticeMapper.xml b/ruoyi/src/main/resources/mybatis/system/SysNoticeMapper.xml index 952e92f..c12816a 100644 --- a/ruoyi/src/main/resources/mybatis/system/SysNoticeMapper.xml +++ b/ruoyi/src/main/resources/mybatis/system/SysNoticeMapper.xml @@ -79,4 +79,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" delete from sys_notice where notice_id = #{noticeId} </delete> + <delete id="deleteNoticeByIds" parameterType="Long"> + delete from sys_notice where notice_id in + <foreach item="noticeId" collection="array" open="(" separator="," close=")"> + #{noticeId} + </foreach> + </delete> + </mapper> \ No newline at end of file diff --git a/ruoyi/src/main/resources/mybatis/system/SysPostMapper.xml b/ruoyi/src/main/resources/mybatis/system/SysPostMapper.xml index 232136c..1fb6f45 100644 --- a/ruoyi/src/main/resources/mybatis/system/SysPostMapper.xml +++ b/ruoyi/src/main/resources/mybatis/system/SysPostMapper.xml @@ -111,5 +111,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <delete id="deletePostById" parameterType="Long"> delete from sys_post where post_id = #{postId} </delete> + + <delete id="deletePostByIds" parameterType="Long"> + delete from sys_post where post_id in + <foreach collection="array" item="postId" open="(" separator="," close=")"> + #{postId} + </foreach> + </delete> </mapper> \ No newline at end of file diff --git a/ruoyi/src/main/resources/mybatis/system/SysRoleMapper.xml b/ruoyi/src/main/resources/mybatis/system/SysRoleMapper.xml index 4d62760..182c6c7 100644 --- a/ruoyi/src/main/resources/mybatis/system/SysRoleMapper.xml +++ b/ruoyi/src/main/resources/mybatis/system/SysRoleMapper.xml @@ -134,4 +134,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" delete from sys_role where role_id = #{roleId} </delete> + <delete id="deleteRoleByIds" parameterType="Long"> + update sys_role set del_flag = '2' where role_id in + <foreach collection="array" item="roleId" open="(" separator="," close=")"> + #{roleId} + </foreach> + </delete> + </mapper> \ No newline at end of file diff --git a/ruoyi/src/main/resources/mybatis/system/SysUserMapper.xml b/ruoyi/src/main/resources/mybatis/system/SysUserMapper.xml index eaf27a0..85d1786 100644 --- a/ruoyi/src/main/resources/mybatis/system/SysUserMapper.xml +++ b/ruoyi/src/main/resources/mybatis/system/SysUserMapper.xml @@ -170,5 +170,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" <delete id="deleteUserById" parameterType="Long"> delete from sys_user where user_id = #{userId} </delete> + + <delete id="deleteUserByIds" parameterType="Long"> + update sys_user set del_flag = '2' where user_id in + <foreach collection="array" item="userId" open="(" separator="," close=")"> + #{userId} + </foreach> + </delete> </mapper> \ No newline at end of file -- 2.18.1