admin/src/api/system/permission.js
@@ -1,13 +1,8 @@ import request from '@/utils/request' // æ¥è¯¢ export function fetchList (data) { return request.post('/visitsAdmin/cloudService/system/permission/page', data) } // æ¥è¯¢ææ export function fetchAll () { return request.get('/visitsAdmin/cloudService/system/permission/all') // æ¥è¯¢æ å表 export function fetchTree () { return request.get('/visitsAdmin/cloudService/system/permission/tree') } // æ°å»º @@ -24,16 +19,19 @@ }) } // æ¹éä¿®æ¹ export function updateByIdInBatch (data) { return request.post('/visitsAdmin/cloudService/system/permission/updateByIdInBatch', data, { trim: true }) } // å é¤ export function deleteById (id) { return request.get(`/visitsAdmin/cloudService/system/permission/delete/${id}`) export function deletePermission (data) { return request.post('/visitsAdmin/cloudService/system/permission/delete', data) } // æ¹éå é¤ export function deleteByIdInBatch (ids) { return request.get('/visitsAdmin/cloudService/system/permission/delete/batch', { params: { ids } }) export function deletePermissionInBatch (data) { return request.post('/visitsAdmin/cloudService/system/permission/delete/batch', data) } admin/src/components/common/EmptyTip.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,19 @@ <template> <div class="empty-tip"> <slot>ææ æ°æ®</slot> </div> </template> <script> export default { name: 'EmptyTip' } </script> <style scoped lang="scss"> .empty-tip { text-align: center; padding: 40px 0; color: #999; } </style> admin/src/components/common/FormItemTip.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ <template> <p class="form-item-tip"><i class="el-icon-warning-outline"></i><slot></slot></p> </template> <script> export default { name: 'FormItemTip' } </script> <style scoped lang="scss"> .form-item-tip { line-height: 20px; font-size: 13px; color: #999; margin: 6px 0 0 0; .el-icon-warning-outline { font-size: 16px; margin-right: 5px; position: relative; top: 2px; color: orange; } } </style> admin/src/components/system/permission/OperaModuleWindow.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,135 @@ <template> <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm" > <el-form :model="form" ref="form" :rules="rules"> <el-form-item label="æé模å" prop="module"> <el-input v-model="form.module" placeholder="请è¾å ¥æé模å" v-trim maxlength="500"/> <FormItemTip>å¤ä¸ªæ¨¡åå¯ä»¥éè¿"/"åå²ï¼ä¾å¦"æ¥å¿ç®¡ç/æä½æ¥å¿"</FormItemTip> </el-form-item> </el-form> </GlobalWindow> </template> <script> import BaseOpera from '@/components/base/BaseOpera' import GlobalWindow from '@/components/common/GlobalWindow' import FormItemTip from '@/components/common/FormItemTip' import { updateByIdInBatch } from '@/api/system/permission' export default { name: 'OperaModuleWindow', extends: BaseOpera, components: { FormItemTip, GlobalWindow }, data () { return { // è¡æ°æ® row: null, // è¡¨åæ°æ® form: { module: '' }, // éªè¯è§å rules: { module: [ { validator: this.__checkModule, trigger: 'blur' } ] } } }, methods: { /** * æå¼çªå£ * * @param title æ é¢ * @param target è¡å¯¹è±¡ï¼ä» ç¼è¾éè¯¥åæ°ï¼ */ open (title, target) { this.title = title this.row = target this.visible = true // ç¼è¾ this.$nextTick(() => { this.form.module = target.name }) }, /** * 确认 */ confirm () { this.$refs.form.validate(valid => { if (!valid) { return } const pool = [] this.__fillPool(pool, this.row.children, this.form.module) this.isWorking = true updateByIdInBatch(pool) .then(() => { this.visible = false this.$emit('success') }) .catch(e => { this.$tip.apiFailed(e) }) .finally(() => { this.isWorking = false }) }) }, /** * å¡«å æéæ± ï¼å°æææéçæ¨¡ååç¼è°æ´ä¸ºæ°æé模ååä¸¢å ¥poolä¸ * * @param pool æéæ± * @param list æéå表 * @param newModule æ°æéæ¨¡å */ __fillPool (pool, list, newModule) { if (list == null) { return } for (const child of list) { if (child.type !== 'module') { const modulePaths = child.module.split('/') modulePaths[this.row.level] = newModule child.module = modulePaths.join('/') pool.push(child) continue } this.__fillPool(pool, child.children, newModule) } }, /** * éªè¯æ¨¡å * * @param rule è§å * @param value å¼ * @param callback åè° * @returns {*} * @private */ __checkModule (rule, value, callback) { if (value == null || value === '') { return callback() } // ä¸å 许å å«ç©ºæ ¼ if (value.indexOf(' ') !== -1) { return callback(new Error('ä¸å 许å å«ç©ºæ ¼')) } // ä¸å 许使ç¨"/"å¼å¤´æç»å°¾ if (value.startsWith('/') || value.endsWith('/')) { return callback(new Error('请å¿ä½¿ç¨"/"å¼å¤´æç»å°¾')) } return callback() } }, created () { this.config({ api: '/system/permission' }) } } </script> admin/src/components/system/permission/OperaPermissionWindow.vue
@@ -12,6 +12,10 @@ <el-form-item label="æéåç§°" prop="name" required> <el-input v-model="form.name" placeholder="请è¾å ¥æéåç§°" v-trim maxlength="50"/> </el-form-item> <el-form-item label="æé模å" prop="module"> <el-input v-model="form.module" placeholder="请è¾å ¥æé模å" v-trim maxlength="500"/> <FormItemTip>å¤ä¸ªæ¨¡åå¯ä»¥éè¿"/"åå²ï¼ä¾å¦"æ¥å¿ç®¡ç/æä½æ¥å¿"</FormItemTip> </el-form-item> <el-form-item label="æé夿³¨" prop="remark"> <el-input v-model="form.remark" placeholder="请è¾å ¥æé夿³¨" type="textarea" :rows="3" v-trim maxlength="500"/> </el-form-item> @@ -22,10 +26,11 @@ <script> import BaseOpera from '@/components/base/BaseOpera' import GlobalWindow from '@/components/common/GlobalWindow' import FormItemTip from '@/components/common/FormItemTip' export default { name: 'OperaPermissionWindow', extends: BaseOpera, components: { GlobalWindow }, components: { FormItemTip, GlobalWindow }, data () { return { // åæéç @@ -35,6 +40,7 @@ id: null, code: '', name: '', module: '', remark: '' }, // éªè¯è§å @@ -44,19 +50,31 @@ ], name: [ { required: true, message: '请è¾å ¥æéåç§°' } ], module: [ { validator: this.__checkModule, trigger: 'blur' } ] } } }, methods: { /** * æå¼çªå£ * * @param title çªå£æ é¢ * @param target è¡å¯¹è±¡ï¼ä» ç¼è¾éè¯¥åæ°ï¼ */ open (title, target) { this.title = title this.visible = true // æ°å»º if (target == null) { if (target == null || target.type === 'module') { this.$nextTick(() => { this.$refs.form.resetFields() this.form[this.configData['field.id']] = null if (target.type === 'module') { this.form.module = target.modulePath } }) return } @@ -68,6 +86,9 @@ } }) }, /** * 确认 */ confirm () { if (this.form.id == null || this.form.id === '') { this.__confirmCreate() @@ -85,6 +106,29 @@ .then(() => { this.__confirmEdit() }) }, /** * éªè¯æ¨¡å * * @param rule è§å * @param value å¼ * @param callback åè° * @returns {*} * @private */ __checkModule (rule, value, callback) { if (value == null || value === '') { return callback() } // ä¸å 许å å«ç©ºæ ¼ if (value.indexOf(' ') !== -1) { return callback(new Error('ä¸å 许å å«ç©ºæ ¼')) } // ä¸å 许使ç¨"/"å¼å¤´æç»å°¾ if (value.startsWith('/') || value.endsWith('/')) { return callback(new Error('请å¿ä½¿ç¨"/"å¼å¤´æç»å°¾')) } return callback() } }, created () { admin/src/views/system/permission.vue
@@ -1,41 +1,30 @@ <template> <TableLayout :permissions="['system:permission:query']"> <!-- æç´¢è¡¨å --> <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> <el-form-item label="æéç¼ç " prop="code"> <el-input v-model="searchForm.code" v-trim placeholder="请è¾å ¥æéç¼ç " @keypress.enter.native="search"/> </el-form-item> <el-form-item label="æéåç§°" prop="name"> <el-input v-model="searchForm.name" v-trim placeholder="请è¾å ¥æéåç§°" @keypress.enter.native="search"/> </el-form-item> <section> <el-button type="primary" @click="search">æç´¢</el-button> <el-button @click="reset">éç½®</el-button> </section> </el-form> <!-- è¡¨æ ¼åå页 --> <template v-slot:table-wrap> <el-tabs v-model="currentTab" v-loading="isWorking.search"> <el-tab-pane :name="'module'+module.id" :label="module.name" v-for="module in tableData.list" :key="module.id"> <ul class="toolbar" v-permissions="['system:permission:create', 'system:permission:delete']"> <li><el-button type="primary" @click="$refs.operaPermissionWindow.open('æ°å»ºç³»ç»æé')" icon="el-icon-plus" v-permissions="['system:permission:create']">æ°å»º</el-button></li> <li><el-button type="primary" @click="$refs.operaPermissionWindow.open('æ°å»ºç³»ç»æé', module)" icon="el-icon-plus" v-permissions="['system:permission:create']">æ°å»º</el-button></li> <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['system:permission:delete']">å é¤</el-button></li> </ul> <el-table :height="tableHeightNew" v-loading="isWorking.search" :data="tableData.list" :default-sort = "{prop: 'createTime', order: 'descending'}" :data="module.children" :ref="'module' + module.id" row-key="id" stripe default-expand-all @selection-change="handleSelectionChange" @sort-change="handleSortChange" > <el-table-column type="selection" fixed="left" width="55"></el-table-column> <el-table-column prop="code" label="æéç¼ç " fixed="left" min-width="240px"></el-table-column> <el-table-column prop="name" label="æéåç§°" fixed="left" min-width="200px"></el-table-column> <el-table-column prop="remark" label="æé夿³¨" min-width="200px"></el-table-column> <el-table-column prop="code" label="æéç¼ç " min-width="200px"></el-table-column> <el-table-column prop="remark" label="æé夿³¨" min-width="120px"></el-table-column> <el-table-column prop="createUser" label="å建人" min-width="100px"> <template slot-scope="{row}">{{row.createUserInfo == null ? '' : row.createUserInfo.username}}</template> </el-table-column> <el-table-column prop="createTime" label="å建æ¶é´" min-width="140px" sortable="custom" sort-by="perm.CREATE_TIME"></el-table-column> <el-table-column prop="createTime" label="å建æ¶é´" min-width="140px"></el-table-column> <el-table-column prop="updateUser" label="æ´æ°äºº" min-width="100px"> <template slot-scope="{row}">{{row.updateUserInfo == null ? '' : row.updateUserInfo.username}}</template> </el-table-column> @@ -43,55 +32,159 @@ <el-table-column v-if="containPermissions(['system:permission:update', 'system:permission:delete'])" label="æä½" min-width="130" min-width="150" fixed="right" > <template slot-scope="{row}"> <!-- 模åç¼è¾&å é¤ --> <template v-if="row.type === 'module'"> <el-button type="text" @click="$refs.operaModuleWindow.open('ç¼è¾æ¨¡å', row)" icon="el-icon-edit" v-permissions="['system:permission:update']">ç¼è¾</el-button> <el-button type="text" @click="$refs.operaPermissionWindow.open('æ°å»ºç³»ç»æé', row)" icon="el-icon-edit" v-permissions="['system:permission:update']">æ·»å æé</el-button> <el-button v-if="!row.fixed" type="text" @click="deletePermission(row)" icon="el-icon-delete" v-permissions="['system:permission:delete']">å é¤</el-button> </template> <!-- æéç¼è¾&å é¤ --> <template v-else> <el-button v-if="!row.fixed" type="text" @click="$refs.operaPermissionWindow.open('ç¼è¾ç³»ç»æé', row)" icon="el-icon-edit" v-permissions="['system:permission:update']">ç¼è¾</el-button> <el-button v-if="!row.fixed" type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['system:permission:delete']">å é¤</el-button> <el-button v-if="!row.fixed" type="text" @click="deletePermission(row)" icon="el-icon-delete" v-permissions="['system:permission:delete']">å é¤</el-button> </template> </template> </el-table-column> </el-table> <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination" ></pagination> </el-tab-pane> </el-tabs> </template> <!-- æ°å»º/ä¿®æ¹ --> <OperaPermissionWindow ref="operaPermissionWindow" @success="handlePageChange"/> <OperaPermissionWindow ref="operaPermissionWindow" @success="search"/> <!-- ç¼è¾æé模å --> <OperaModuleWindow ref="operaModuleWindow" @success="handlePageChange"/> </TableLayout> </template> <script> import Pagination from '@/components/common/Pagination' import TableLayout from '@/layouts/TableLayout' import BaseTable from '@/components/base/BaseTable' import OperaPermissionWindow from '@/components/system/permission/OperaPermissionWindow' import OperaModuleWindow from '@/components/system/permission/OperaModuleWindow' export default { name: 'SystemPermission', extends: BaseTable, components: { OperaPermissionWindow, TableLayout, Pagination }, components: { OperaModuleWindow, OperaPermissionWindow, TableLayout }, data () { return { // æç´¢ searchForm: { code: '', name: '', remark: '' // å½åéä¸ç模å currentTab: null } }, methods: { /** * è¦ç页ç åæ´å¤ç */ handlePageChange () { this.isWorking.search = true this.api.fetchTree() .then(data => { this.tableData.list = data this.currentTab = 'module' + this.tableData.list[0].id }) .catch(e => { this.$tip.apiFailed(e) }) .finally(() => { this.isWorking.search = false }) }, /** * è¦çå é¤å¤ç */ deletePermission (row, childConfirm = true) { this.__checkApi() let message = `确认å é¤${this.module}ã${row[this.configData['field.main']]}ãå?` if (childConfirm && row.children != null && row.children.length > 0) { message = `确认å é¤${this.module}ã${row[this.configData['field.main']]}ãåå ¶å${this.module}å?` } this.$dialog.deleteConfirm(message) .then(() => { this.isWorking.delete = true this.api.deletePermission({ id: row.type === 'module' ? null : row.id, // 模åä¸ä¼ ID modulePrefix: row.type === 'module' ? row.modulePath : null // æéä¸ä¼ 模å }) .then(() => { this.$tip.apiSuccess('å 餿å') this.__afterDelete() }) .catch(e => { this.$tip.apiFailed(e) }) .finally(() => { this.isWorking.delete = false }) }) .catch(() => {}) }, /** * è¦çæ¹éå é¤å¤ç */ deleteByIdInBatch (childConfirm = true) { this.__checkApi() if (this.tableData.selectedRows.length === 0) { this.$tip.warning('请è³å°éæ©ä¸æ¡æ°æ®') return } let message = `确认å é¤å·²éä¸ç ${this.tableData.selectedRows.length} æ¡${this.module}è®°å½å?` if (childConfirm) { const containChildrenRows = [] for (const row of this.tableData.selectedRows) { if (row.children != null && row.children.length > 0) { containChildrenRows.push(row[this.configData['field.main']]) } } if (containChildrenRows.length > 0) { message = `æ¬æ¬¡å°å é¤${this.module}ã${containChildrenRows.join('ã')}ãåå ¶å${this.module}è®°å½ï¼ç¡®è®¤å é¤åï¼` } } this.$dialog.deleteConfirm(message) .then(() => { this.isWorking.delete = true this.api.deletePermissionInBatch(this.tableData.selectedRows.map(row => { return { id: row.type === 'module' ? null : row.id, // 模åä¸ä¼ ID modulePrefix: row.type === 'module' ? row.modulePath : null // æéä¸ä¼ 模å } })) .then(() => { this.$tip.apiSuccess('å 餿å') this.__afterDelete(this.tableData.selectedRows.length) }) .catch(e => { this.$tip.apiFailed(e) }) .finally(() => { this.isWorking.delete = false }) }) .catch(() => {}) } }, created () { this.config({ module: 'æé', api: '/system/permission', sorts: [{ property: 'perm.CREATE_TIME', direction: 'DESC' }] api: '/system/permission' }) this.search() } } </script> <style scoped lang="scss"> /deep/ .table-content { margin-top: 0; .table-wrap { padding-bottom: 16px; } } /deep/ .el-tabs__nav-prev, /deep/ .el-tabs__nav-next { line-height: 40px; } </style> server/system_service/src/main/java/com/doumee/api/cloud/SystemPermissionCloudController.java
@@ -5,6 +5,7 @@ import com.doumee.config.annotation.CloudRequiredPermission; import com.doumee.core.annotation.pr.PreventRepeat; import com.doumee.core.constants.OperaType; import com.doumee.dao.system.dto.DeleteSystemPermissionDTO; import com.doumee.service.business.third.model.ApiResponse; import com.doumee.service.business.third.model.PageData; import com.doumee.service.business.third.model.PageWrap; @@ -41,54 +42,46 @@ @ApiOperation("æ°å»º") @PostMapping("/create") @CloudRequiredPermission("system:permission:create") public ApiResponse create(@RequestHeader(Constants.HEADER_USER_TOKEN) String token, @Validated(OperaType.Create.class) @RequestBody SystemPermission systemPermission) { systemPermission.setCreateUser(this.getLoginUser(token).getId()); public ApiResponse create(@Validated(Constants.OperaType.Create.class) @RequestBody SystemPermission systemPermission) { return ApiResponse.success(systemPermissionBiz.create(systemPermission)); } @ApiOperation("å é¤") @GetMapping("/delete/{id}") @PostMapping("/delete") @CloudRequiredPermission("system:permission:delete") public ApiResponse deleteById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@PathVariable Integer id) { systemPermissionBiz.deleteById(id); public ApiResponse deleteById(@RequestBody DeleteSystemPermissionDTO dto) { systemPermissionService.delete(dto); return ApiResponse.success(null); } @ApiOperation("æ¹éå é¤") @GetMapping("/delete/batch") @PostMapping("/delete/batch") @CloudRequiredPermission("system:permission:delete") public ApiResponse deleteByIdInBatch(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestParam String ids) { String [] idArray = ids.split(","); List<Integer> idList = new ArrayList<>(); for (String id : idArray) { idList.add(Integer.valueOf(id)); } systemPermissionBiz.deleteByIdInBatch(idList); public ApiResponse deleteByIdInBatch(@RequestBody List<DeleteSystemPermissionDTO> dtos) { systemPermissionService.deleteInBatch(dtos); return ApiResponse.success(null); } @ApiOperation("ä¿®æ¹") @PostMapping("/updateById") @CloudRequiredPermission("system:permission:update") public ApiResponse updateById(@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@Validated(OperaType.Update.class) @RequestBody SystemPermission systemPermission) { systemPermission.setUpdateUser(this.getLoginUser(token).getId()); public ApiResponse updateById(@Validated(Constants.OperaType.Update.class) @RequestBody SystemPermission systemPermission) { systemPermissionBiz.updateById(systemPermission); return ApiResponse.success(null); } @ApiOperation("å页æ¥è¯¢") @PostMapping("/page") @CloudRequiredPermission("system:permission:query") public ApiResponse<PageData<SystemPermissionListVO>> findPage (@RequestHeader(Constants.HEADER_USER_TOKEN) String token,@RequestBody PageWrap<QuerySystemPermissionDTO> pageWrap) { return ApiResponse.success(systemPermissionService.findPage(pageWrap)); @ApiOperation("æ¹éä¿®æ¹") @PostMapping("/updateByIdInBatch") @CloudRequiredPermission("system:permission:update") public ApiResponse updateById(@RequestBody List<SystemPermission> permissions) { systemPermissionService.updateByIdInBatch(permissions); return ApiResponse.success(null); } @ApiOperation("æ¥è¯¢ææ") @GetMapping("/all") @ApiOperation("æ¥è¯¢æéæ å表") @GetMapping("/tree") @CloudRequiredPermission("system:permission:query") public ApiResponse<List<SystemPermission>> findAll (@RequestHeader(Constants.HEADER_USER_TOKEN) String token) { SystemPermission systemPermission = new SystemPermission(); systemPermission.setDeleted(Boolean.FALSE); return ApiResponse.success(systemPermissionService.findList(systemPermission)); public ApiResponse<List<SystemPermissionListVO>> findAll () { return ApiResponse.success(systemPermissionService.findTree()); } } server/system_service/src/main/java/com/doumee/api/system/SystemPermissionController.java
@@ -3,12 +3,8 @@ import com.doumee.api.BaseController; import com.doumee.biz.system.SystemPermissionBiz; import com.doumee.core.annotation.pr.PreventRepeat; import com.doumee.core.constants.OperaType; import com.doumee.service.business.third.model.ApiResponse; import com.doumee.service.business.third.model.PageData; import com.doumee.service.business.third.model.PageWrap; import com.doumee.core.utils.Constants; import com.doumee.dao.system.dto.QuerySystemPermissionDTO; import com.doumee.dao.system.dto.DeleteSystemPermissionDTO; import com.doumee.dao.system.model.SystemPermission; import com.doumee.dao.system.vo.SystemPermissionListVO; import com.doumee.service.system.SystemPermissionService; @@ -17,14 +13,14 @@ import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import java.util.ArrayList; import java.util.List; import org.springframework.web.bind.annotation.*; import java.util.List; import com.doumee.service.business.third.model.ApiResponse; /** * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * @author dm * @since 2025/03/31 16:44 */ @Api(tags = "ç³»ç»æé") @RestController @@ -41,54 +37,46 @@ @ApiOperation("æ°å»º") @PostMapping("/create") @RequiresPermissions("system:permission:create") public ApiResponse create(@Validated(OperaType.Create.class)@RequestBody SystemPermission systemPermission, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) { systemPermission.setCreateUser(this.getLoginUser(token).getId()); public ApiResponse create(@Validated(Constants.OperaType.Create.class) @RequestBody SystemPermission systemPermission) { return ApiResponse.success(systemPermissionBiz.create(systemPermission)); } @ApiOperation("å é¤") @GetMapping("/delete/{id}") @PostMapping("/delete") @RequiresPermissions("system:permission:delete") public ApiResponse deleteById(@PathVariable Integer id) { systemPermissionBiz.deleteById(id); public ApiResponse deleteById(@RequestBody DeleteSystemPermissionDTO dto) { systemPermissionService.delete(dto); return ApiResponse.success(null); } @ApiOperation("æ¹éå é¤") @GetMapping("/delete/batch") @PostMapping("/delete/batch") @RequiresPermissions("system:permission:delete") public ApiResponse deleteByIdInBatch(@RequestParam String ids) { String [] idArray = ids.split(","); List<Integer> idList = new ArrayList<>(); for (String id : idArray) { idList.add(Integer.valueOf(id)); } systemPermissionBiz.deleteByIdInBatch(idList); public ApiResponse deleteByIdInBatch(@RequestBody List<DeleteSystemPermissionDTO> dtos) { systemPermissionService.deleteInBatch(dtos); return ApiResponse.success(null); } @ApiOperation("ä¿®æ¹") @PostMapping("/updateById") @RequiresPermissions("system:permission:update") public ApiResponse updateById(@Validated(OperaType.Update.class) @RequestBody SystemPermission systemPermission, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) { systemPermission.setUpdateUser(this.getLoginUser(token).getId()); public ApiResponse updateById(@Validated(Constants.OperaType.Update.class) @RequestBody SystemPermission systemPermission) { systemPermissionBiz.updateById(systemPermission); return ApiResponse.success(null); } @ApiOperation("å页æ¥è¯¢") @PostMapping("/page") @RequiresPermissions("system:permission:query") public ApiResponse<PageData<SystemPermissionListVO>> findPage (@RequestBody PageWrap<QuerySystemPermissionDTO> pageWrap) { return ApiResponse.success(systemPermissionService.findPage(pageWrap)); @ApiOperation("æ¹éä¿®æ¹") @PostMapping("/updateByIdInBatch") @RequiresPermissions("system:permission:update") public ApiResponse updateById(@RequestBody List<SystemPermission> permissions) { systemPermissionService.updateByIdInBatch(permissions); return ApiResponse.success(null); } @ApiOperation("æ¥è¯¢ææ") @GetMapping("/all") @ApiOperation("æ¥è¯¢æéæ å表") @GetMapping("/tree") @RequiresPermissions("system:permission:query") public ApiResponse<List<SystemPermission>> findAll () { SystemPermission systemPermission = new SystemPermission(); systemPermission.setDeleted(Boolean.FALSE); return ApiResponse.success(systemPermissionService.findList(systemPermission)); public ApiResponse<List<SystemPermissionListVO>> findAll () { return ApiResponse.success(systemPermissionService.findTree()); } } server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -54,7 +54,26 @@ public static final String SIGN_IN_QRCODE ="SIGN_IN_QRCODE" ; public static final String SIGN_IN_ATTENTION ="SIGN_IN_ATTENTION" ; public static final String SIGN_IN_QRCODE_PREFIX ="SIGN_IN_QRCODE_PREFIX" ; /** * æä½ç±»åï¼ç¨äºåæ¥å£éªè¯åç» */ public interface OperaType { /** * å建 */ interface Create {} /** * ä¿®æ¹ */ interface Update {} /** * ä¿®æ¹ç¶æ */ interface UpdateStatus {} } public static final String WEATHER_CONFIG ="WEATHER_CONFIG" ; public static final String REQUEST_URL ="REQUEST_URL" ; server/system_service/src/main/java/com/doumee/dao/system/SystemPermissionMapper.java
@@ -12,23 +12,24 @@ /** * æ ¹æ®ç¨æ·IDæ¥è¯¢ * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param userId ç¨æ·ID * @return List<SystemPermission> */ List<SystemPermission> selectByUserId(Integer userId); /** * æ ¹æ®è§è²IDæ¥è¯¢ * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param roleId è§è²ID * @return List<SystemPermission> */ List<SystemPermission> selectByRoleId(Integer roleId); /** * æ¥è¯¢å表 * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * æ¥è¯¢æé管çå表 * * @return List<SystemPermissionListVO> */ List<SystemPermissionListVO> selectManageList(@Param("dto") QuerySystemPermissionDTO dto, @Param("orderByClause") String orderByClause); List<SystemPermissionListVO> selectManageList(); } server/system_service/src/main/java/com/doumee/dao/system/dto/DeleteSystemPermissionDTO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.doumee.dao.system.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author dm * @since 2025/03/31 16:44 */ @Data @ApiModel("å 餿éåæ°") public class DeleteSystemPermissionDTO { @ApiModelProperty("æéID") private Integer id; @ApiModelProperty("模ååç¼") private String modulePrefix; } server/system_service/src/main/java/com/doumee/dao/system/model/SystemPermission.java
@@ -56,4 +56,9 @@ @ApiModelProperty(value = "æ¯å¦å·²å é¤", hidden = true) private Boolean deleted; @ApiModelProperty(value = "模å") private String module; } server/system_service/src/main/java/com/doumee/dao/system/vo/SystemPermissionListVO.java
@@ -6,14 +6,28 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * @author dm * @since 2025/03/31 16:44 */ @Data @ApiModel("ç³»ç»æéå表è§å¾å¯¹è±¡") public class SystemPermissionListVO extends SystemPermission { @ApiModelProperty(value = "ç±»åï¼module模åï¼permissionæé") private String type; @ApiModelProperty(value = "模åè·¯å¾") private String modulePath; @ApiModelProperty(value = "å±çº§") private Integer level; @ApiModelProperty(value = "åæéå表") private List<SystemPermissionListVO> children; @ApiModelProperty(value = "å建人信æ¯") private SystemUser createUserInfo; server/system_service/src/main/java/com/doumee/service/system/SystemPermissionService.java
@@ -1,5 +1,6 @@ package com.doumee.service.system; import com.doumee.dao.system.dto.DeleteSystemPermissionDTO; import com.doumee.service.business.third.model.PageData; import com.doumee.service.business.third.model.PageWrap; import com.doumee.dao.system.dto.QuerySystemPermissionDTO; @@ -17,85 +18,106 @@ /** * å建 * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param systemPermission å®ä½ * @return Integer */ Integer create(SystemPermission systemPermission); /** * 主é®å é¤ * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param id ä¸»é® */ void deleteById(Integer id); /** * æ¹é主é®å é¤ * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param ids 主é®å表 */ void deleteByIdInBatch(List<Integer> ids); /** * å é¤ * * @param dto å 餿¡ä»¶ */ void delete (DeleteSystemPermissionDTO dto); /** * æ¹éå é¤ * * @param dtos å 餿¡ä»¶å表 */ void deleteInBatch(List<DeleteSystemPermissionDTO> dtos); /** * 䏻鮿´æ° * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param systemPermission å®ä½ */ void updateById(SystemPermission systemPermission); /** * æ¹é䏻鮿´æ° * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param systemPermissions å®ä½å表 */ void updateByIdInBatch(List<SystemPermission> systemPermissions); /** * 䏻鮿¥è¯¢ * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param id ä¸»é® * @return SystemPermission */ SystemPermission findById(Integer id); /** * æ ¹æ®ç¨æ·IDæ¥è¯¢ * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param userId ç¨æ·ID * @return List<SystemPermission> */ List<SystemPermission> findByUserId(Integer userId); /** * æ ¹æ®è§è²IDæ¥è¯¢ * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param roleId è§è²ID * @return List<SystemPermission> */ List<SystemPermission> findByRoleId(Integer roleId); /** * æ¡ä»¶æ¥è¯¢åæ¡è®°å½ * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param systemPermission æ¥è¯¢æ¡ä»¶ * @return SystemPermission */ SystemPermission findOne(SystemPermission systemPermission); /** * æ¡ä»¶æ¥è¯¢ * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param systemPermission æ¥è¯¢æ¡ä»¶ * @return List<SystemPermission> */ List<SystemPermission> findList(SystemPermission systemPermission); /** * å页æ¥è¯¢ * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * æ¥è¯¢ç®¡çå表 * * @return List<SystemPermissionListVO> */ PageData<SystemPermissionListVO> findPage(PageWrap<QuerySystemPermissionDTO> pageWrap); List<SystemPermissionListVO> findTree(); /** * æ¡ä»¶ç»è®¡ * @author Eva.Caesar Liu * @date 2023/03/21 14:49 * * @param systemPermission ç»è®¡æ¡ä»¶ * @return long */ long count(SystemPermission systemPermission); } server/system_service/src/main/java/com/doumee/service/system/impl/SystemPermissionServiceImpl.java
@@ -1,5 +1,7 @@ package com.doumee.service.system.impl; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.doumee.dao.system.dto.DeleteSystemPermissionDTO; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.doumee.service.business.third.model.PageData; @@ -11,11 +13,14 @@ import com.doumee.service.system.SystemPermissionService; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.commons.lang3.RandomStringUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; /** @@ -25,6 +30,7 @@ */ @Service public class SystemPermissionServiceImpl implements SystemPermissionService { @Autowired private SystemPermissionMapper systemPermissionMapper; @@ -49,6 +55,26 @@ if (CollectionUtils.isEmpty(ids)) return; for (Integer id : ids) { this.deleteById(id); } } @Override public void delete(DeleteSystemPermissionDTO dto) { UpdateWrapper<SystemPermission> deleteWrapper = new UpdateWrapper<>(); deleteWrapper.lambda() .set(SystemPermission::getDeleted, Boolean.TRUE) .eq(dto.getId() != null, SystemPermission::getId, dto.getId()) .likeLeft(dto.getModulePrefix() != null, SystemPermission::getModule, dto.getModulePrefix()); systemPermissionMapper.update(null, deleteWrapper); } @Override public void deleteInBatch(List<DeleteSystemPermissionDTO> dtos) { if (CollectionUtils.isEmpty(dtos)) { return; } for (DeleteSystemPermissionDTO dto : dtos) { this.delete(dto); } } @@ -83,7 +109,8 @@ @Override public SystemPermission findOne(SystemPermission systemPermission) { Wrapper<SystemPermission> wrapper = new QueryWrapper<>(systemPermission); QueryWrapper<SystemPermission> wrapper = new QueryWrapper<>(systemPermission); wrapper.lambda().last("limit 1"); return systemPermissionMapper.selectOne(wrapper); } @@ -94,9 +121,46 @@ } @Override public PageData<SystemPermissionListVO> findPage(PageWrap<QuerySystemPermissionDTO> pageWrap) { PageHelper.startPage(pageWrap.getPage(), pageWrap.getCapacity()); return PageData.from(new PageInfo<>(systemPermissionMapper.selectManageList(pageWrap.getModel(), pageWrap.getOrderByClause()))); public List<SystemPermissionListVO> findTree() { List<SystemPermissionListVO> permissionList = systemPermissionMapper.selectManageList(); List<SystemPermissionListVO> tree = new ArrayList<>(); for (SystemPermissionListVO permission : permissionList) { // æ²¡ææ¨¡åçæéé»è®¤å½å±ä¸º"å ¶å®"模å if (StringUtils.isBlank(permission.getModule())) { permission.setModule("å ¶å®"); } // å解模å String[] modulePaths = permission.getModule().split("/"); SystemPermissionListVO target = null; SystemPermissionListVO parent = null; List<String> paths = new ArrayList<>(); for (String path : modulePaths) { paths.add(path); // æ¥æ¾æ¨¡å target = this.getTargetNode(tree, paths); // å¦ææ¨¡åä¸åå¨ï¼åæ·»å ä¸ä¸ªå模å if (target == null) { target = new SystemPermissionListVO(); target.setId(Integer.valueOf(RandomStringUtils.randomNumeric(6)) * -1); target.setLevel(paths.size() - 1); target.setType("module"); target.setName(path); target.setModulePath(StringUtils.join(paths, "/")); target.setChildren(new ArrayList<>()); if (parent != null) { parent.getChildren().add(target); } else { tree.add(target); } } parent = target; } // å°æéæ·»å è¿æ¨¡åä¸ if (target != null) { target.getChildren().add(permission); } } return tree; } @Override @@ -104,4 +168,28 @@ Wrapper<SystemPermission> wrapper = new QueryWrapper<>(systemPermission); return systemPermissionMapper.selectCount(wrapper); } /** * æ¥æ¾ç®æ èç¹ * @param tree èç¹æ * @param paths 模åè·¯å¾ * @return */ private SystemPermissionListVO getTargetNode(List<SystemPermissionListVO> tree, List<String> paths) { List<SystemPermissionListVO> list = tree; List<SystemPermissionListVO> nodeStack = new ArrayList<>(); for (String path : paths) { if (list == null) { break; } for (SystemPermissionListVO permission : list) { if (path.equals(permission.getName()) && "module".equals(permission.getType())) { nodeStack.add(permission); list = permission.getChildren(); break; } } } return nodeStack.size() == paths.size() ? nodeStack.get(nodeStack.size() - 1) : null; } } server/system_service/src/main/resources/mappers/SystemPermissionMapper.xml
@@ -16,7 +16,7 @@ </resultMap> <select id="selectManageList" resultMap="SystemPermissionListVO"> SELECT perm.`ID`, perm.`CODE`, perm.`NAME`, perm.`REMARK`, perm.`FIXED`, perm.`CREATE_TIME`, perm.`UPDATE_TIME`, perm.`CREATE_USER`, perm.`UPDATE_USER`, perm.`DELETED`, perm.`ID`, perm.`CODE`, perm.`NAME`, perm.`MODULE`, perm.`REMARK`, perm.`FIXED`, perm.`CREATE_TIME`, perm.`UPDATE_TIME`, perm.`CREATE_USER`, perm.`UPDATE_USER`, perm.`DELETED`, create_user.ID CREATE_USER_ID, create_user.`USERNAME` CREATE_USER_NAME, update_user.ID UPDETE_USER_ID, update_user.`USERNAME` UPDATE_USER_NAME FROM SYSTEM_PERMISSION perm @@ -24,14 +24,8 @@ LEFT JOIN `SYSTEM_USER` update_user ON update_user.ID = perm.UPDATE_USER <where> perm.DELETED = 0 <if test="dto.code != null"> AND perm.CODE LIKE CONCAT('%', #{dto.code}, '%') </if> <if test="dto.name != null"> AND perm.`NAME` LIKE CONCAT('%', #{dto.name}, '%') </if> </where> ${orderByClause} ORDER BY perm.CREATE_TIME ASC, perm.ID ASC </select> <!-- æ ¹æ®ç¨æ·IDæ¥è¯¢æé --> server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkSketchServiceImpl.java
@@ -76,7 +76,6 @@ jkSketchMapper.insert(jkSketch); return jkSketch.getId(); } @Override public void deleteById(Integer id) { jkSketchMapper.deleteById(id); @@ -87,7 +86,6 @@ UpdateWrapper<JkSketch> deleteWrapper = new UpdateWrapper<>(jkSketch); jkSketchMapper.delete(deleteWrapper); } @Override @PostConstruct @@ -492,7 +490,6 @@ .set(JkSketch::getStatus,Constants.THREE) .set(JkSketch::getPlanLineEndDate,new Date())); } } @Override @Async @@ -550,7 +547,6 @@ for (int j = 0; j < customerListParam.size(); j++) { distanceMatrix1[i+1][j+1] =disList.get(j+1).getDistance() ; } } //æé ä¼åæ°æ®æ¨¡å dataModel.initDataInfo(vehicleNumber1,demands1,vehicleCapacities1,distanceMatrix1); @@ -574,7 +570,6 @@ } line.setDistance(so.getDistance()); } }catch (Exception e){ e.printStackTrace(); success =false; @@ -595,9 +590,7 @@ .set(JkSketch::getStatus,success?Constants.TWO:Constants.THREE) .set(JkSketch::getPlanLineEndDate,new Date())); } } private List<JkSketchCustomer> initSketchCustomerListParam(List<JkSketchCustomer> customerList, List<JkSketchCustomer> customerList1) { for(JkSketchCustomer param : customerList){ for(JkSketchCustomer model : customerList1){