瀏覽代碼

Merge branch 'system-zjy' of uskycloud/usky-cloud into master

gez 5 月之前
父節點
當前提交
f31806d694
共有 28 個文件被更改,包括 340 次插入113 次删除
  1. 7 0
      base-modules/service-system/service-system-api/src/main/java/com/usky/system/domain/SysOperLogVO.java
  2. 4 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/MceReceiveController.java
  3. 5 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysConfigController.java
  4. 5 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysDeptController.java
  5. 5 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysDictDataController.java
  6. 5 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysDictTypeController.java
  7. 2 2
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysLogininforController.java
  8. 4 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysMenuController.java
  9. 5 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysNoticeController.java
  10. 1 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysOperlogController.java
  11. 2 2
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysPlatformController.java
  12. 5 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysPostController.java
  13. 7 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysRoleController.java
  14. 4 2
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysTenantConfigController.java
  15. 1 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserController.java
  16. 82 50
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserOnlineController.java
  17. 5 3
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/UserConfigController.java
  18. 39 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/page/TableDataInfo.java
  19. 8 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysOperLog.java
  20. 78 29
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysUserOnline.java
  21. 25 10
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/SysLoginService.java
  22. 2 0
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserOnlineServiceImpl.java
  23. 6 1
      base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/SysOperLogExportVO.java
  24. 5 2
      base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysOperLogMapper.xml
  25. 4 0
      usky-common/usky-common-core/src/main/java/com/usky/common/core/bean/ApiResult.java
  26. 6 4
      usky-common/usky-common-log/src/main/java/com/usky/common/log/aspect/LogAspect.java
  27. 1 1
      usky-common/usky-common-log/src/main/java/com/usky/common/log/service/AsyncLogService.java
  28. 17 4
      usky-common/usky-common-security/src/main/java/com/usky/common/security/auth/AuthLogic.java

+ 7 - 0
base-modules/service-system/service-system-api/src/main/java/com/usky/system/domain/SysOperLogVO.java

@@ -69,6 +69,9 @@ public class SysOperLogVO extends BaseEntity
     /** 执行结束时间 */
     private Date endTime;
 
+    /** 执行耗时时间 */
+    private Long consumingTime;
+
     /** 执行耗时时间(带单位) */
     private String consumingTimeWithUnit;
 
@@ -240,6 +243,10 @@ public class SysOperLogVO extends BaseEntity
 
     public void setEndTime(Date endTime) {this.endTime = endTime;}
 
+    public Long getConsumingTime() {return consumingTime;}
+
+    public void setConsumingTime(Long consumingTime) {this.consumingTime = consumingTime;}
+
     public String getConsumingTimeWithUnit() {return consumingTimeWithUnit;}
 
     public void setConsumingTimeWithUnit(String consumingTimeWithUnit) {this.consumingTimeWithUnit = consumingTimeWithUnit;}

+ 4 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/MceReceiveController.java

@@ -3,6 +3,8 @@ package com.usky.system.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.system.domain.MceReceive;
 import com.usky.system.service.MceReceiveService;
 import io.swagger.models.auth.In;
@@ -110,6 +112,7 @@ public class MceReceiveController {
      * 消息接收接口
      * @return
      */
+    @Log(title = "新增发布消息", businessType = BusinessType.INSERT)
     @PostMapping("/mceAdd")
     ApiResult<Void> add(@RequestBody String mceReceive){
         mceReceiveService.add(mceReceive);
@@ -119,6 +122,7 @@ public class MceReceiveController {
     /**
      * 删除
      */
+    @Log(title = "删除已发布消息", businessType = BusinessType.DELETE)
     @DeleteMapping("/{id}")
     public ApiResult<Void> removeById(@PathVariable("id") Integer id)
     {

+ 5 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysConfigController.java

@@ -3,6 +3,8 @@ package com.usky.system.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.exception.BusinessErrorCode;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.system.controller.web.page.TableDataInfo;
 import com.usky.system.domain.SysConfig;
@@ -58,6 +60,7 @@ public class SysConfigController extends BaseController
     /**
      * 新增参数配置
      */
+    @Log(title = "新增-参数配置", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult add(@Validated @RequestBody SysConfig config)
     {
@@ -72,6 +75,7 @@ public class SysConfigController extends BaseController
     /**
      * 修改参数配置
      */
+    @Log(title = "修改-参数配置", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult edit(@Validated @RequestBody SysConfig config)
     {
@@ -86,6 +90,7 @@ public class SysConfigController extends BaseController
     /**
      * 删除参数配置
      */
+    @Log(title = "删除-参数配置", businessType = BusinessType.DELETE)
     @DeleteMapping("/{configIds}")
     public ApiResult remove(@PathVariable Long[] configIds)
     {

+ 5 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysDeptController.java

@@ -4,6 +4,8 @@ package com.usky.system.controller.web;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.exception.BusinessErrorCode;
 import com.usky.common.core.util.StringUtils;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.system.domain.SysDept;
 import com.usky.system.domain.SysUser;
@@ -113,6 +115,7 @@ public class SysDeptController extends BaseController {
     /**
      * 新增部门
      */
+    @Log(title = "新增-部门", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult add(@Validated @RequestBody SysDept dept) {
         if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) {
@@ -126,6 +129,7 @@ public class SysDeptController extends BaseController {
     /**
      * 修改部门
      */
+    @Log(title = "修改-部门", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult edit(@Validated @RequestBody SysDept dept) {
         if (UserConstants.NOT_UNIQUE.equals(deptService.checkDeptNameUnique(dept))) {
@@ -143,6 +147,7 @@ public class SysDeptController extends BaseController {
     /**
      * 删除部门
      */
+    @Log(title = "删除-部门", businessType = BusinessType.DELETE)
     @DeleteMapping("/{deptId}")
     public ApiResult remove(@PathVariable Long deptId) {
         if (deptService.hasChildByDeptId(deptId)) {

+ 5 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysDictDataController.java

@@ -1,6 +1,8 @@
 package com.usky.system.controller.web;
 
 
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.system.controller.web.page.TableDataInfo;
@@ -65,6 +67,7 @@ public class SysDictDataController extends BaseController
     /**
      * 新增字典类型
      */
+    @Log(title = "新增-字典数据", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult add(@Validated @RequestBody SysDictData dict)
     {
@@ -75,6 +78,7 @@ public class SysDictDataController extends BaseController
     /**
      * 修改保存字典类型
      */
+    @Log(title = "修改-字典数据", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult edit(@Validated @RequestBody SysDictData dict)
     {
@@ -85,6 +89,7 @@ public class SysDictDataController extends BaseController
     /**
      * 删除字典类型
      */
+    @Log(title = "删除-字典数据", businessType = BusinessType.DELETE)
     @DeleteMapping("/{dictCodes}")
     public ApiResult remove(@PathVariable Long[] dictCodes)
     {

+ 5 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysDictTypeController.java

@@ -1,6 +1,8 @@
 package com.usky.system.controller.web;
 
 
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.exception.BusinessErrorCode;
@@ -47,6 +49,7 @@ public class SysDictTypeController extends BaseController
     /**
      * 新增字典类型
      */
+    @Log(title = "新增-字典类型", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult add(@Validated @RequestBody SysDictType dict)
     {
@@ -62,6 +65,7 @@ public class SysDictTypeController extends BaseController
     /**
      * 修改字典类型
      */
+    @Log(title = "修改-字典类型", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult edit(@Validated @RequestBody SysDictType dict)
     {
@@ -76,6 +80,7 @@ public class SysDictTypeController extends BaseController
     /**
      * 删除字典类型
      */
+    @Log(title = "删除-字典类型", businessType = BusinessType.DELETE)
     @DeleteMapping("/{dictIds}")
     public ApiResult remove(@PathVariable Long[] dictIds)
     {

+ 2 - 2
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysLogininforController.java

@@ -28,7 +28,7 @@ public class SysLogininforController extends BaseController
     @Autowired
     private ISysLogininforService logininforService;
 
-    @Log(title = "查询登录日志", businessType = BusinessType.SELECT)
+//    @Log(title = "查询登录日志", businessType = BusinessType.SELECT)
     @GetMapping("/list")
     public ApiResult<TableDataInfo> list(SysLogininfor logininfor)
     {
@@ -53,7 +53,7 @@ public class SysLogininforController extends BaseController
         return toAjax(logininforService.deleteLogininforByIds(infoIds));
     }
 
-
+    @Log(title = "清空登录日志", businessType = BusinessType.CLEAN)
     @DeleteMapping("/clean")
     public ApiResult<Void> clean()
     {

+ 4 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysMenuController.java

@@ -108,6 +108,7 @@ public class SysMenuController extends BaseController
     /**
      * 新增菜单
      */
+    @Log(title = "新增-菜单", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult add(@Validated @RequestBody SysMenu menu)
     {
@@ -127,6 +128,7 @@ public class SysMenuController extends BaseController
     /**
      * 修改菜单
      */
+    @Log(title = "修改-菜单", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult edit(@Validated @RequestBody SysMenu menu)
     {
@@ -150,6 +152,7 @@ public class SysMenuController extends BaseController
     /**
      * 删除菜单
      */
+    @Log(title = "删除-菜单", businessType = BusinessType.DELETE)
     @DeleteMapping("/{menuId}")
     public ApiResult remove(@PathVariable("menuId") Long menuId)
     {
@@ -218,7 +221,7 @@ public class SysMenuController extends BaseController
      * @param tenantMenu
      * @return
      */
-    @Log(title = "修改菜单昵称", businessType = BusinessType.UPDATE)
+    @Log(title = "修改-菜单昵称", businessType = BusinessType.UPDATE)
     @PutMapping("/updateTenantMenu")
     public ApiResult<Void> updateTenantMenu(@RequestBody SysTenantMenu tenantMenu)
     {

+ 5 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysNoticeController.java

@@ -1,5 +1,7 @@
 package com.usky.system.controller.web;
 
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.common.security.annotation.RequiresPermissions;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.common.core.bean.ApiResult;
@@ -47,6 +49,7 @@ public class SysNoticeController extends BaseController
     /**
      * 新增通知公告
      */
+    @Log(title = "新增-通知公告", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult add(@Validated @RequestBody SysNotice notice)
     {
@@ -57,6 +60,7 @@ public class SysNoticeController extends BaseController
     /**
      * 修改通知公告
      */
+    @Log(title = "修改-通知公告", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult edit(@Validated @RequestBody SysNotice notice)
     {
@@ -67,6 +71,7 @@ public class SysNoticeController extends BaseController
     /**
      * 删除通知公告
      */
+    @Log(title = "删除-通知公告", businessType = BusinessType.DELETE)
     @DeleteMapping("/{noticeIds}")
     public ApiResult remove(@PathVariable Long[] noticeIds)
     {

+ 1 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysOperlogController.java

@@ -43,6 +43,7 @@ public class SysOperlogController extends BaseController
      * @param operLog
      * @throws IOException
      */
+    @Log(title = "操作日志-导出", businessType = BusinessType.EXPORT)
     @PostMapping("listExport")
     public void export(HttpServletResponse response,
                        @RequestParam(value = "exportTitle") String exportTitle,

+ 2 - 2
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysPlatformController.java

@@ -105,7 +105,7 @@ public class SysPlatformController {
      * @param platformMenuVo
      * @return
      */
-//    @Log(title = "平台挂管理", businessType = BusinessType.INSERT)
+    @Log(title = "PC端应用菜单编辑", businessType = BusinessType.INSERT)
     @PostMapping("updatePlatformMenu")
     public ApiResult<Void> updatePlatformMenu(@RequestBody PlatformMenuVo platformMenuVo) {
         sysPlatformService.updatePlatformMenu(platformMenuVo);
@@ -119,7 +119,7 @@ public class SysPlatformController {
      * @param mobilePlatformMenuVO
      * @return
      */
-//    @Log(title = "平台挂管理", businessType = BusinessType.INSERT)
+    @Log(title = "移动端应用菜单编辑", businessType = BusinessType.INSERT)
     @PostMapping("updateMobilePlatformMenu")
     public ApiResult<Void> updateMobilePlatformMenu(@RequestBody MobilePlatformMenuVO mobilePlatformMenuVO) {
         sysPlatformService.updateMobilePlatformMenu(mobilePlatformMenuVO);

+ 5 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysPostController.java

@@ -1,6 +1,8 @@
 package com.usky.system.controller.web;
 
 
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.exception.BusinessErrorCode;
@@ -50,6 +52,7 @@ public class SysPostController extends BaseController
     /**
      * 新增岗位
      */
+    @Log(title = "新增-菜单", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult add(@Validated @RequestBody SysPost post)
     {
@@ -70,6 +73,7 @@ public class SysPostController extends BaseController
      * 修改岗位
      */
 //    @PreAuthorize("@ss.hasPermi('system:post:edit')")
+    @Log(title = "修改-菜单", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult edit(@Validated @RequestBody SysPost post)
     {
@@ -88,6 +92,7 @@ public class SysPostController extends BaseController
     /**
      * 删除岗位
      */
+    @Log(title = "删除-菜单", businessType = BusinessType.DELETE)
     @DeleteMapping("/{postIds}")
     public ApiResult remove(@PathVariable Long[] postIds)
     {

+ 7 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysRoleController.java

@@ -1,6 +1,8 @@
 package com.usky.system.controller.web;
 
 
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.exception.BusinessErrorCode;
@@ -57,6 +59,7 @@ public class SysRoleController extends BaseController
     /**
      * 新增角色
      */
+    @Log(title = "新增-角色", businessType = BusinessType.INSERT)
     @PostMapping
     public ApiResult add(@Validated @RequestBody SysRole role)
     {
@@ -77,6 +80,7 @@ public class SysRoleController extends BaseController
     /**
      * 修改保存角色
      */
+    @Log(title = "修改-角色", businessType = BusinessType.UPDATE)
     @PutMapping
     public ApiResult edit(@Validated @RequestBody SysRole role)
     {
@@ -96,6 +100,7 @@ public class SysRoleController extends BaseController
     /**
      * 修改保存数据权限
      */
+    @Log(title = "修改-角色", businessType = BusinessType.UPDATE)
     @PutMapping("/dataScope")
     public ApiResult dataScope(@RequestBody SysRole role)
     {
@@ -106,6 +111,7 @@ public class SysRoleController extends BaseController
     /**
      * 状态修改
      */
+    @Log(title = "修改-角色", businessType = BusinessType.UPDATE)
     @PutMapping("/changeStatus")
     public ApiResult changeStatus(@RequestBody SysRole role)
     {
@@ -117,6 +123,7 @@ public class SysRoleController extends BaseController
     /**
      * 删除角色
      */
+    @Log(title = "删除-角色", businessType = BusinessType.DELETE)
     @DeleteMapping("/{roleIds}")
     public ApiResult remove(@PathVariable Long[] roleIds)
     {

+ 4 - 2
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysTenantConfigController.java

@@ -3,6 +3,8 @@ package com.usky.system.controller.web;
 
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.system.domain.SysMenu;
 import com.usky.system.domain.SysTenantConfig;
 import com.usky.system.service.SysTenantConfigService;
@@ -82,7 +84,7 @@ public class SysTenantConfigController {
      * @param sysTenantConfig
      * @return
      */
-//    @Log(title = "租户管理-系统配置", businessType = BusinessType.INSERT)
+    @Log(title = "新增租户信息", businessType = BusinessType.INSERT)
     @PostMapping("addMiddleConfig")
     public ApiResult<Void> addMiddleConfig(@RequestBody SysTenantConfig sysTenantConfig) {
         sysTenantConfigService.addMiddleConfig(sysTenantConfig);
@@ -95,7 +97,7 @@ public class SysTenantConfigController {
      * @param sysTenantConfig
      * @return
      */
-//    @Log(title = "租户管理-系统配置", businessType = BusinessType.UPDATE)
+    @Log(title = "修改租户信息", businessType = BusinessType.UPDATE)
     @PostMapping("updaMiddleConfig")
     public ApiResult<Void> updaMiddleConfig(@RequestBody SysTenantConfig sysTenantConfig) {
         sysTenantConfigService.updaMiddleConfig(sysTenantConfig);

+ 1 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserController.java

@@ -51,7 +51,7 @@ public class SysUserController extends BaseController
     /**
      * 获取用户列表
      */
-    @Log(title = "用户列表", businessType = BusinessType.SELECT)
+//    @Log(title = "用户列表", businessType = BusinessType.SELECT)
     @GetMapping("/list")
     public ApiResult<TableDataInfo> list(SysUser user)
     {

+ 82 - 50
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/SysUserOnlineController.java

@@ -1,12 +1,9 @@
 package com.usky.system.controller.web;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
+import java.util.*;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.constants.CacheConstants;
+import com.usky.common.core.utils.StringUtils;
 import com.usky.common.log.annotation.Log;
 import com.usky.common.log.enums.BusinessType;
 import com.usky.common.redis.core.RedisService;
@@ -15,13 +12,10 @@ import com.usky.system.controller.web.page.TableDataInfo;
 import com.usky.system.domain.SysUserOnline;
 import com.usky.system.model.LoginUser;
 import com.usky.system.service.ISysUserOnlineService;
-import org.apache.commons.lang3.StringUtils;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-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 org.springframework.web.bind.annotation.*;
+import org.slf4j.Logger;
 
 /**
  * 在线用户监控
@@ -29,63 +23,101 @@ import org.springframework.web.bind.annotation.RestController;
  */
 @RestController
 @RequestMapping("/online")
-public class SysUserOnlineController extends BaseController
-{
+public class SysUserOnlineController {
+    private final Logger logger = LoggerFactory.getLogger(SysUserOnlineController.class);
+
     @Autowired
     private ISysUserOnlineService userOnlineService;
 
     @Autowired
     private RedisService redisService;
 
-    @RequiresPermissions("monitor:online:list")
+    private TableDataInfo getDataTable(List<SysUserOnline> userOnlineList, int pageNum, int pageSize, long total) {
+        TableDataInfo dataInfo = new TableDataInfo();
+        dataInfo.setRows(userOnlineList);
+        dataInfo.setTotal(total);
+        dataInfo.setPageNum(pageNum);
+        dataInfo.setPageSize(pageSize);
+        dataInfo.setPages((int) Math.ceil((double) total / pageSize));
+        return dataInfo;
+    }
+
     @GetMapping("/list")
-    public ApiResult<TableDataInfo> list(String ipaddr, String userName)
-    {
-        Collection<String> keys = redisService.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
-        List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
-        for (String key : keys)
-        {
-            LoginUser user = redisService.getCacheObject(key);
-            if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
-            {
-                if (StringUtils.equals(ipaddr, user.getIpaddr()) && StringUtils.equals(userName, user.getUsername()))
-                {
-                    userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
-                }
-            }
-            else if (StringUtils.isNotEmpty(ipaddr))
-            {
-                if (StringUtils.equals(ipaddr, user.getIpaddr()))
-                {
-                    userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
-                }
+    public ApiResult<TableDataInfo> list(@RequestParam(required = false, defaultValue = "1") Integer page,
+                                         @RequestParam(required = false, defaultValue = "10") Integer size) {
+        try {
+            Collection<String> keys = redisService.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
+            if (keys == null || keys.isEmpty()) {
+                logger.error("Redis keys is null or empty");
+                return ApiResult.error("SYS-0000", "Redis keys is null or empty");
             }
-            else if (StringUtils.isNotEmpty(userName))
-            {
-                if (StringUtils.equals(userName, user.getUsername()))
-                {
-                    userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
+            Map<String, List<SysUserOnline>> userOnlineMap = new HashMap<>();
+
+            for (String key : keys) {
+                // 检查键是否存在并且未过期
+                if (redisService.hasKey(key)) {
+                    LoginUser user = redisService.getCacheObject(key);
+                    if (user != null) {
+                        SysUserOnline online = userOnlineService.loginUserToUserOnline(user);
+                        if (online != null) {
+                            List<SysUserOnline> list = userOnlineMap.computeIfAbsent(user.getUsername(), k -> new ArrayList<>());
+                            list.add(online);
+                        }
+                    }
                 }
             }
-            else
-            {
-                userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
+
+            List<SysUserOnline> userOnlineList = new ArrayList<>();
+            for (Map.Entry<String, List<SysUserOnline>> entry : userOnlineMap.entrySet()) {
+                List<SysUserOnline> sortedList = entry.getValue();
+                sortedList.sort(Comparator.comparing(SysUserOnline::getLoginTime).reversed());
+                int loginCount = sortedList.size(); // 计算登录次数
+                SysUserOnline lastOnline = sortedList.get(0); // 取最后登录时间的记录
+                lastOnline.setLoginCount(loginCount); // 设置登录记录的数量
+                lastOnline.setPreviousOnlines(sortedList.subList(1, sortedList.size())); // 设置其他登录记录
+                userOnlineList.add(lastOnline);
             }
+
+            // 按照登录时间降序排序
+            userOnlineList.sort(Comparator.comparing(SysUserOnline::getLoginTime).reversed());
+
+            long total = userOnlineList.size();
+            int start = (page - 1) * size;
+            int end = Math.min(start + size, (int) total);
+            List<SysUserOnline> pageList = userOnlineList.subList(start, end);
+
+            return ApiResult.success(getDataTable(pageList, page, size, total));
+        } catch (Exception ex) {
+            logger.error("Error processing /online/list", ex);
+            return ApiResult.error("SYS-0001", "Internal system error", ex.getMessage());
         }
-        Collections.reverse(userOnlineList);
-        userOnlineList.removeAll(Collections.singleton(null));
-        return ApiResult.success(getDataTable(userOnlineList));
     }
 
     /**
      * 强退用户
      */
-    @RequiresPermissions("monitor:online:forceLogout")
+//    @RequiresPermissions("monitor:online:forceLogout")
     @Log(title = "在线用户", businessType = BusinessType.FORCE)
     @DeleteMapping("/{tokenId}")
-    public ApiResult forceLogout(@PathVariable String tokenId)
-    {
-        redisService.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
-        return ApiResult.success();
+    public ApiResult forceLogout(@PathVariable String tokenId) {
+        try {
+            if (StringUtils.isBlank(tokenId)) {
+                logger.error("Token ID is blank for force logout");
+                return ApiResult.error("SYS-0004", "Token ID is required for force logout");
+            }
+
+            String key = CacheConstants.LOGIN_TOKEN_KEY + tokenId;
+            boolean deleted = redisService.deleteObject(key);
+            if (deleted) {
+                logger.info("User with tokenId {} has been forcibly logged out.", tokenId);
+                return ApiResult.success();
+            } else {
+                logger.warn("Failed to find and delete user session with tokenId {}", tokenId);
+                return ApiResult.error("SYS-0002", "Session not found or already deleted");
+            }
+        } catch (Exception ex) {
+            logger.error("Error processing forceLogout for tokenId {}", tokenId, ex);
+            return ApiResult.error("SYS-0003", "Internal system error during force logout", ex.getMessage());
+        }
     }
 }

+ 5 - 3
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/UserConfigController.java

@@ -1,6 +1,8 @@
 package com.usky.system.controller.web;
 
 import com.usky.common.core.util.StringUtils;
+import com.usky.common.log.annotation.Log;
+import com.usky.common.log.enums.BusinessType;
 import com.usky.common.security.utils.SecurityUtils;
 import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.bean.CommonPage;
@@ -66,7 +68,7 @@ public class UserConfigController extends BaseController {
      * @param user
      * @return
      */
-//    @Log(title = "租户管理-管理员配置", businessType = BusinessType.UPDATE)
+    @Log(title = "修改租户信息", businessType = BusinessType.UPDATE)
     @Transactional
     @PostMapping("/updateserData")
     public ApiResult<Void> updateserData(@Validated @RequestBody SysUser user) {
@@ -85,7 +87,7 @@ public class UserConfigController extends BaseController {
      * @param userId 用户ID
      * @return
      */
-//    @Log(title = "租户管理-管理员配置", businessType = BusinessType.DELETE)
+    @Log(title = "删除租户", businessType = BusinessType.DELETE)
     @GetMapping("/delUsers")
     public ApiResult<Void> delUsers(@RequestParam Long userId) {
         SysUser user = new SysUser();
@@ -109,7 +111,7 @@ public class UserConfigController extends BaseController {
      * @param UserId      用户ID
      * @return
      */
-//    @Log(title = "租户管理-管理员配置", businessType = BusinessType.UPDATE)
+    @Log(title = "重置租户密码", businessType = BusinessType.UPDATE)
     @PutMapping("/updatePwd")
     public ApiResult updatePwd(String newPassword, Long UserId) {
         SysUser sysUser = userService.selectUserById(UserId);

+ 39 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/controller/web/page/TableDataInfo.java

@@ -29,6 +29,21 @@ public class TableDataInfo implements Serializable {
      */
     private String msg;
 
+    /**
+     * 当前页码
+     */
+    private int pageNum;
+
+    /**
+     * 每页记录数
+     */
+    private int pageSize;
+
+    /**
+     * 总页数
+     */
+    private int pages;
+
     /**
      * 表格数据对象
      */
@@ -77,4 +92,28 @@ public class TableDataInfo implements Serializable {
     public void setMsg(String msg) {
         this.msg = msg;
     }
+
+    public int getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(int pageNum) {
+        this.pageNum = pageNum;
+    }
+
+    public int getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(int pageSize) {
+        this.pageSize = pageSize;
+    }
+
+    public int getPages() {
+        return pages;
+    }
+
+    public void setPages(int pages) {
+        this.pages = pages;
+    }
 }

+ 8 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysOperLog.java

@@ -92,7 +92,10 @@ public class SysOperLog extends BaseEntity
     /** 执行结束时间 */
     private Date endTime;
 
-    /** 执行耗时时间(带单位) */
+    /** 执行耗时时间 */
+    private Long consumingTime;
+
+    /** 执行耗时时间(单位:毫秒) */
     private String consumingTimeWithUnit;
 
     public String getSearchValue() {
@@ -332,6 +335,10 @@ public class SysOperLog extends BaseEntity
 
     public void setEndTime(Date endTime) { this.endTime = endTime; }
 
+    public Long getConsumingTime() { return consumingTime; }
+
+    public void setConsumingTime(Long consumingTime) { this.consumingTime = consumingTime; }
+
     public String getConsumingTimeWithUnit() { return consumingTimeWithUnit; }
 
     public void setConsumingTimeWithUnit(String consumingTimeWithUnit) { this.consumingTimeWithUnit = consumingTimeWithUnit; }

+ 78 - 29
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/domain/SysUserOnline.java

@@ -1,15 +1,20 @@
 package com.usky.system.domain;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 当前在线会话
  * 
  * @author yq
  */
-public class SysUserOnline
-{
+public class SysUserOnline {
     /** 会话编号 */
     private String tokenId;
 
+    /** 用户ID */
+    private Long userid;
+
     /** 部门名称 */
     private String deptName;
 
@@ -31,68 +36,79 @@ public class SysUserOnline
     /** 登录时间 */
     private Long loginTime;
 
-    public String getTokenId()
-    {
+    /** 最后访问时间 */
+    private Long expireTime;
+
+    /** 登录记录的数量 */
+    private int loginCount;
+
+
+    private SysUserOnline lastOnline;
+    private List<SysUserOnline> previousOnlines;
+
+    public SysUserOnline() {
+        // 初始化默认值
+        this.lastOnline = null;
+        this.previousOnlines = new ArrayList<>();
+    }
+
+    public String getTokenId() {
         return tokenId;
     }
 
-    public void setTokenId(String tokenId)
-    {
+    public void setTokenId(String tokenId) {
         this.tokenId = tokenId;
     }
 
-    public String getDeptName()
-    {
+    public Long getUserid() {
+        return userid;
+    }
+
+    public void setUserid(Long userid) {
+        this.userid = userid;
+    }
+
+    public String getDeptName() {
         return deptName;
     }
 
-    public void setDeptName(String deptName)
-    {
+    public void setDeptName(String deptName) {
         this.deptName = deptName;
     }
 
-    public String getUserName()
-    {
+    public String getUserName() {
         return userName;
     }
 
-    public void setUserName(String userName)
-    {
+    public void setUserName(String userName) {
         this.userName = userName;
     }
 
-    public String getIpaddr()
-    {
+    public String getIpaddr() {
         return ipaddr;
     }
 
-    public void setIpaddr(String ipaddr)
-    {
+    public void setIpaddr(String ipaddr) {
         this.ipaddr = ipaddr;
     }
 
-    public String getLoginLocation()
-    {
+    public String getLoginLocation() {
         return loginLocation;
     }
 
-    public void setLoginLocation(String loginLocation)
-    {
+    public void setLoginLocation(String loginLocation) {
         this.loginLocation = loginLocation;
     }
 
-    public String getBrowser()
-    {
+    public String getBrowser() {
         return browser;
     }
 
-    public void setBrowser(String browser)
-    {
+    public void setBrowser(String browser) {
         this.browser = browser;
     }
 
-    public String getOs()
-    {
+    public String getOs() {
         return os;
     }
 
@@ -110,4 +126,37 @@ public class SysUserOnline
     {
         this.loginTime = loginTime;
     }
-}
+
+    public Long getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(Long expireTime) {
+        this.expireTime = expireTime;
+    }
+
+
+    public SysUserOnline getLastOnline() {
+        return lastOnline;
+    }
+
+    public void setLastOnline(SysUserOnline lastOnline) {
+        this.lastOnline = lastOnline;
+    }
+
+    public List<SysUserOnline> getPreviousOnlines() {
+        return previousOnlines;
+    }
+
+    public void setPreviousOnlines(List<SysUserOnline> previousOnlines) {
+        this.previousOnlines = previousOnlines;
+    }
+
+    public int getLoginCount() {
+        return loginCount;
+    }
+
+    public void setLoginCount(int loginCount) {
+        this.loginCount = loginCount;
+    }
+}

+ 25 - 10
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/SysLoginService.java

@@ -180,6 +180,17 @@ public class SysLoginService {
                 throw new BusinessException("用户名或手机号不能为空");
             }
             loginUser = sysUserService.getAppUserInfo(null, tenantId, phone);
+            // 获取部门ID
+            LambdaQueryWrapper<SysUser> deptQueryWrapper = Wrappers.lambdaQuery();
+            deptQueryWrapper.select(SysUser::getDeptId)
+                    .eq(SysUser::getDelFlag, 0)
+                    .eq(SysUser::getTenantId, tenantId)
+                    .and(w -> w.eq(SysUser::getUserName, username).or().eq(SysUser::getPhonenumber, username));
+            SysUser sysUser = sysUserService.getOne(deptQueryWrapper);
+            Integer deptId = 0; // 默认值为0,假设0表示没有部门ID
+            if (sysUser != null) {
+                deptId = sysUser.getDeptId().intValue(); // 将Long转换为Integer
+            }
         } else if(!StringUtils.isBlank(username) && !StringUtils.isBlank(verify)) {
             LOGGER.info("二维码验证码登录");
             if (StringUtils.isBlank(username)) {
@@ -191,16 +202,6 @@ public class SysLoginService {
             }
             loginUser = sysUserService.getAppUserInfo(username, tenantId, null);
         }
-
-        if (UserStatus.DELETED.getCode().equals(loginUser.getDelFlag())) {
-            asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "对不起,您的账号已被删除", null);
-            throw new BusinessException("对不起,您的账号:" + username + " 已被删除");
-        }
-        if (UserStatus.DISABLE.getCode().equals(loginUser.getStatus())) {
-            asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户已停用,请联系管理员", null);
-            throw new BusinessException("对不起,您的账号:" + loginUser.getUserName() + " 已停用");
-        }
-
         // 获取部门ID
         LambdaQueryWrapper<SysUser> deptQueryWrapper = Wrappers.lambdaQuery();
         deptQueryWrapper.select(SysUser::getDeptId)
@@ -212,6 +213,20 @@ public class SysLoginService {
         if (sysUser != null) {
             deptId = sysUser.getDeptId().intValue(); // 将Long转换为Integer
         }
+        if (UserStatus.DELETED.getCode().equals(loginUser.getDelFlag())) {
+            asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "对不起,您的账号已被删除", null);
+            throw new BusinessException("对不起,您的账号:" + username + " 已被删除");
+        }
+        if (UserStatus.DISABLE.getCode().equals(loginUser.getStatus())) {
+            asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_FAIL, "用户已停用,请联系管理员", null);
+            throw new BusinessException("对不起,您的账号:" + loginUser.getUserName() + " 已停用");
+        }
+
+//        Integer deptId = 0; // 默认值为0,假设0表示没有部门ID
+        // 确保在所有登录成功的路径中都获取部门ID
+        if (loginUser != null && loginUser.getDeptId() != null) {
+            deptId = loginUser.getDeptId().intValue();
+        }
         asyncManager.insertLog(tenantId,loginUser.getUserName(), Constants.LOGIN_SUCCESS, "登录成功", deptId);
         return loginUser;
     }

+ 2 - 0
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/impl/SysUserOnlineServiceImpl.java

@@ -85,9 +85,11 @@ public class SysUserOnlineServiceImpl implements ISysUserOnlineService
         }
         SysUserOnline sysUserOnline = new SysUserOnline();
         sysUserOnline.setTokenId(user.getToken());
+        sysUserOnline.setUserid(user.getUserid());
         sysUserOnline.setUserName(user.getUsername());
         sysUserOnline.setIpaddr(user.getIpaddr());
         sysUserOnline.setLoginTime(user.getLoginTime());
+        sysUserOnline.setExpireTime(user.getExpireTime());
         return sysUserOnline;
     }
 }

+ 6 - 1
base-modules/service-system/service-system-biz/src/main/java/com/usky/system/service/vo/SysOperLogExportVO.java

@@ -68,6 +68,11 @@ public class SysOperLogExportVO {
     @Excel(name = "执行结束时间")
     private LocalDateTime endTime;
 
-    /** 执行耗时时间(带单位) */
+    /** 执行耗时时间 */
+    @Excel(name = "执行耗时时间")
+    private Long consumingTime;
+
+    /** 执行耗时时间(单位:毫秒) */
+    @Excel(name = "执行耗时时间(带单位)")
     private String consumingTimeWithUnit;
 }

+ 5 - 2
base-modules/service-system/service-system-biz/src/main/resources/mapper/system/SysOperLogMapper.xml

@@ -26,11 +26,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<result property="createBy"       column="create_by"      />
 		<result property="startTime"     column="start_time"    />
 		<result property="endTime"       column="end_time"      />
+		<result property="consumingTime"   column="consuming_time" />
 		<result property="consumingTimeWithUnit"     column="consuming_time_with_unit"    />
 	</resultMap>
 
 	<sql id="selectOperLogVo">
-        select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time, start_time, end_time, consuming_time_with_unit
+		select oper_id, title, business_type, method, request_method, operator_type, oper_name, dept_name, oper_url, oper_ip, oper_location, oper_param, json_result, status, error_msg, oper_time, start_time, end_time, consuming_time, consuming_time_with_unit
 		from sys_oper_log d
     </sql>
     
@@ -57,6 +58,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="createBy != null"> create_by, </if>
 			<if test="startTime != null"> start_time, </if>
 			<if test="endTime != null"> end_time, </if>
+			<if test="consumingTime != null"> consuming_time, </if>
 			<if test="consumingTimeWithUnit !=null"> consuming_time_with_unit, </if>
 		</trim>
 		values
@@ -81,6 +83,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="createBy != null"> #{createBy},</if>
 			<if test="startTime != null"> #{startTime},</if>
 		    <if test="endTime != null"> #{endTime},</if>
+			<if test="consumingTime != null"> #{consumingTime},</if>
 		    <if test="consumingTimeWithUnit !=null"> #{consumingTimeWithUnit},</if>
 		</trim>
 	</insert>
@@ -122,7 +125,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</select>
 
 	<select id="selectOperLogListExport" parameterType="com.usky.system.domain.SysOperLog" resultType="com.usky.system.service.vo.SysOperLogExportVO">
-		SELECT oper_id, oper_ip, oper_name, title, (CASE business_type WHEN '0' THEN '其它' WHEN '1' THEN '新增' WHEN '2' THEN '修改' ELSE '删除' END) AS businessType, request_method, (CASE STATUS WHEN '0' THEN '成功' ELSE '失败' END) AS STATUS, oper_time, start_time, end_time, consuming_time_with_unit
+		SELECT oper_id, oper_ip, oper_name, title, (CASE business_type WHEN '0' THEN '其它' WHEN '1' THEN '新增' WHEN '2' THEN '修改' ELSE '删除' END) AS businessType, request_method, (CASE STATUS WHEN '0' THEN '成功' ELSE '失败' END) AS STATUS, oper_time, start_time, end_time, consuming_time, consuming_time_with_unit
 		FROM sys_oper_log d
 		<where>
 			<if test="title != null and title != ''">

+ 4 - 0
usky-common/usky-common-core/src/main/java/com/usky/common/core/bean/ApiResult.java

@@ -62,6 +62,10 @@ public class ApiResult<T> implements Serializable {
         return new ApiResult<>(null);
     }
 
+    public static <T> ApiResult<T> error(String message) {
+        return new ApiResult<>("9999", message);
+    }
+
     public static <T> ApiResult<T> error(String code, String message) {
         return new ApiResult<>(code, message);
     }

+ 6 - 4
usky-common/usky-common-log/src/main/java/com/usky/common/log/aspect/LogAspect.java

@@ -7,7 +7,6 @@ import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.xml.crypto.Data;
 
 import com.alibaba.fastjson.JSON;
 import com.usky.common.core.util.IpUtils;
@@ -42,11 +41,13 @@ public class LogAspect {
     @Autowired
     private AsyncLogService asyncLogService;
 
-    @Pointcut("@annotation(controllerLog)")
-    public void logPointcut(Log controllerLog) {
+    // 定义切入点,使用@annotation指示器
+    @Pointcut("@annotation(com.usky.common.log.annotation.Log)")
+    public void logPointcut() {
     }
 
-    @Around("logPointcut(controllerLog)")
+    // 环绕通知,引用切入点并传递注解实例
+    @Around("logPointcut() && @annotation(controllerLog)")
     public Object aroundLog(ProceedingJoinPoint joinPoint, Log controllerLog) throws Throwable {
         Date startTime = new Date();
         Object result = null;
@@ -95,6 +96,7 @@ public class LogAspect {
 
             // 将耗时转换为带有单位"ms"的字符串
             String consumingTimeWithUnit = consumingTime + "ms";
+            operLog.setConsumingTime(consumingTime); // 存储耗时
             operLog.setConsumingTimeWithUnit(consumingTimeWithUnit); // 存储带有单位的字符串
 
             // 保存数据库

+ 1 - 1
usky-common/usky-common-log/src/main/java/com/usky/common/log/service/AsyncLogService.java

@@ -25,6 +25,6 @@ public class AsyncLogService
     @Async
     public void saveSysLog(SysOperLogVO sysOperLog)
     {
-        remoteLogService.saveLog(sysOperLog);
+        this.remoteLogService.saveLog(sysOperLog);
     }
 }

+ 17 - 4
usky-common/usky-common-security/src/main/java/com/usky/common/security/auth/AuthLogic.java

@@ -1,5 +1,6 @@
 package com.usky.common.security.auth;
 
+import com.usky.common.core.bean.ApiResult;
 import com.usky.common.core.util.SpringContextUtils;
 import com.usky.common.security.annotation.Logical;
 import com.usky.common.security.annotation.RequiresLogin;
@@ -13,9 +14,11 @@ import com.usky.common.security.utils.SecurityUtils;
 import com.usky.system.model.LoginUser;
 import org.springframework.util.PatternMatchUtils;
 import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.ExceptionHandler;
 
 import java.util.Collection;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -109,14 +112,20 @@ public class AuthLogic
      * @param permission 权限字符串
      * @return 用户是否具备某权限
      */
-    public boolean hasPermi(String permission)
-    {
-        return hasPermi(getPermiList(), permission);
+    public boolean hasPermi(List<String> permissions, String permission) {
+        if (permissions == null || permission == null) {
+            return false;
+        }
+        return permissions.stream().anyMatch(p -> p.equals(permission));
+    }
+    @ExceptionHandler(NotPermissionException.class)
+    public ApiResult<Void> handleNotPermissionException(NotPermissionException ex) {
+        return ApiResult.error("您没有权限执行这个操作");
     }
 
     /**
      * 验证用户是否具备某权限, 如果验证未通过,则抛出异常: NotPermissionException
-     * 
+     *
      * @param permission 权限字符串
      * @return 用户是否具备某权限
      */
@@ -369,4 +378,8 @@ public class AuthLogic
         return roles.stream().filter(StringUtils::hasText)
                 .anyMatch(x -> SUPER_ADMIN.contains(x) || PatternMatchUtils.simpleMatch(x, role));
     }
+
+    public boolean hasPermi(String permission) {
+        return hasPermi(getPermiList(), permission);
+    }
 }