mirror of
				https://github.com/continew-org/continew-admin.git
				synced 2025-10-31 22:57:17 +08:00 
			
		
		
		
	fix: 新增全局响应结果处理器
实现ResponseBodyAdvice接口,可以将相同的处理逻辑抽取出来,避免了在多个Controller中重复编写代码,提高了代码的可维护性和可读性。同时,对返回结果进行统一格式化、异常处理等处理,使得返回结果更加规范、易于处理和阅读。
This commit is contained in:
		| @@ -39,7 +39,6 @@ import top.charles7c.cnadmin.auth.model.vo.UserInfoVO; | ||||
| import top.charles7c.cnadmin.auth.service.LoginService; | ||||
| import top.charles7c.cnadmin.common.constant.CacheConsts; | ||||
| import top.charles7c.cnadmin.common.model.dto.LoginUser; | ||||
| import top.charles7c.cnadmin.common.model.vo.R; | ||||
| import top.charles7c.cnadmin.common.util.ExceptionUtils; | ||||
| import top.charles7c.cnadmin.common.util.RedisUtils; | ||||
| import top.charles7c.cnadmin.common.util.SecureUtils; | ||||
| @@ -67,7 +66,7 @@ public class LoginController { | ||||
|     @SaIgnore | ||||
|     @Operation(summary = "用户登录", description = "根据用户名和密码进行登录认证") | ||||
|     @PostMapping("/login") | ||||
|     public R<LoginVO> login(@Validated @RequestBody LoginRequest loginRequest) { | ||||
|     public LoginVO login(@Validated @RequestBody LoginRequest loginRequest) { | ||||
|         String captchaKey = RedisUtils.formatKey(CacheConsts.CAPTCHA_KEY_PREFIX, loginRequest.getUuid()); | ||||
|         String captcha = RedisUtils.getCacheObject(captchaKey); | ||||
|         ValidationUtils.throwIfBlank(captcha, "验证码已失效"); | ||||
| @@ -78,7 +77,7 @@ public class LoginController { | ||||
|             ExceptionUtils.exToNull(() -> SecureUtils.decryptByRsaPrivateKey(loginRequest.getPassword())); | ||||
|         ValidationUtils.throwIfBlank(rawPassword, "密码解密失败"); | ||||
|         String token = loginService.login(loginRequest.getUsername(), rawPassword); | ||||
|         return R.ok(LoginVO.builder().token(token).build()); | ||||
|         return LoginVO.builder().token(token).build(); | ||||
|     } | ||||
|  | ||||
|     @SaIgnore | ||||
| @@ -86,29 +85,27 @@ public class LoginController { | ||||
|     @Parameter(name = "Authorization", description = "令牌", required = true, example = "Bearer xxxx-xxxx-xxxx-xxxx", | ||||
|         in = ParameterIn.HEADER) | ||||
|     @PostMapping("/logout") | ||||
|     public R logout() { | ||||
|     public void logout() { | ||||
|         StpUtil.logout(); | ||||
|         return R.ok(); | ||||
|     } | ||||
|  | ||||
|     @Log(ignore = true) | ||||
|     @Operation(summary = "获取用户信息", description = "获取登录用户信息") | ||||
|     @GetMapping("/user/info") | ||||
|     public R<UserInfoVO> getUserInfo() { | ||||
|     public UserInfoVO getUserInfo() { | ||||
|         LoginUser loginUser = LoginHelper.getLoginUser(); | ||||
|         UserDetailVO userDetailVO = userService.get(loginUser.getId()); | ||||
|         UserInfoVO userInfoVO = BeanUtil.copyProperties(userDetailVO, UserInfoVO.class); | ||||
|         userInfoVO.setPermissions(loginUser.getPermissions()); | ||||
|         userInfoVO.setRoles(loginUser.getRoleCodes()); | ||||
|         return R.ok(userInfoVO); | ||||
|         return userInfoVO; | ||||
|     } | ||||
|  | ||||
|     @Log(ignore = true) | ||||
|     @Operation(summary = "获取路由信息", description = "获取登录用户的路由信息") | ||||
|     @GetMapping("/route") | ||||
|     public R<List<RouteVO>> listRoute() { | ||||
|     public List<RouteVO> listRoute() { | ||||
|         Long userId = LoginHelper.getUserId(); | ||||
|         List<RouteVO> routeTree = loginService.buildRouteTree(userId); | ||||
|         return R.ok(routeTree); | ||||
|         return loginService.buildRouteTree(userId); | ||||
|     } | ||||
| } | ||||
| @@ -69,7 +69,7 @@ public class CaptchaController { | ||||
|  | ||||
|     @Operation(summary = "获取图片验证码", description = "获取图片验证码(Base64编码,带图片格式:data:image/gif;base64)") | ||||
|     @GetMapping("/img") | ||||
|     public R<CaptchaVO> getImageCaptcha() { | ||||
|     public CaptchaVO getImageCaptcha() { | ||||
|         // 生成验证码 | ||||
|         CaptchaProperties.CaptchaImage captchaImage = captchaProperties.getImage(); | ||||
|         Captcha captcha = captchaImage.getCaptcha(); | ||||
| @@ -78,7 +78,7 @@ public class CaptchaController { | ||||
|         String captchaKey = RedisUtils.formatKey(CacheConsts.CAPTCHA_KEY_PREFIX, uuid); | ||||
|         RedisUtils.setCacheObject(captchaKey, captcha.text(), | ||||
|             Duration.ofMinutes(captchaImage.getExpirationInMinutes())); | ||||
|         return R.ok(CaptchaVO.builder().uuid(uuid).img(captcha.toBase64()).build()); | ||||
|         return CaptchaVO.builder().uuid(uuid).img(captcha.toBase64()).build(); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "获取邮箱验证码", description = "发送验证码到指定邮箱") | ||||
|   | ||||
| @@ -97,42 +97,39 @@ public class CommonController { | ||||
|  | ||||
|     @Operation(summary = "查询部门树", description = "查询树结构的部门列表") | ||||
|     @GetMapping("/tree/dept") | ||||
|     public R<List<Tree<Long>>> listDeptTree(DeptQuery query, SortQuery sortQuery) { | ||||
|         List<Tree<Long>> treeList = deptService.tree(query, sortQuery, true); | ||||
|         return R.ok(treeList); | ||||
|     public List<Tree<Long>> listDeptTree(DeptQuery query, SortQuery sortQuery) { | ||||
|         return deptService.tree(query, sortQuery, true); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "查询菜单树", description = "查询树结构的菜单列表") | ||||
|     @GetMapping("/tree/menu") | ||||
|     public R<List<Tree<Long>>> listMenuTree(MenuQuery query, SortQuery sortQuery) { | ||||
|         List<Tree<Long>> treeList = menuService.tree(query, sortQuery, true); | ||||
|         return R.ok(treeList); | ||||
|     public List<Tree<Long>> listMenuTree(MenuQuery query, SortQuery sortQuery) { | ||||
|         return menuService.tree(query, sortQuery, true); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "查询角色字典", description = "查询角色字典列表") | ||||
|     @GetMapping("/dict/role") | ||||
|     public R<List<LabelValueVO<Long>>> listRoleDict(RoleQuery query, SortQuery sortQuery) { | ||||
|     public List<LabelValueVO<Long>> listRoleDict(RoleQuery query, SortQuery sortQuery) { | ||||
|         List<RoleVO> list = roleService.list(query, sortQuery); | ||||
|         List<LabelValueVO<Long>> labelValueVOList = roleService.buildDict(list); | ||||
|         return R.ok(labelValueVOList); | ||||
|         return roleService.buildDict(list); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "查询字典", description = "查询字典列表") | ||||
|     @Parameter(name = "code", description = "字典编码", example = "announcement_type", in = ParameterIn.PATH) | ||||
|     @GetMapping("/dict/{code}") | ||||
|     @Cacheable(key = "#code", cacheNames = CacheConsts.DICT_KEY_PREFIX) | ||||
|     public R<List<LabelValueVO>> listDict(@PathVariable String code) { | ||||
|     public List<LabelValueVO> listDict(@PathVariable String code) { | ||||
|         Optional<Class<?>> enumClass = this.getEnumClassByName(code); | ||||
|         return enumClass.map(this::listEnumDict).orElseGet(() -> R.ok(dictItemService.listByDictCode(code))); | ||||
|         return enumClass.map(this::listEnumDict).orElseGet(() -> dictItemService.listByDictCode(code)); | ||||
|     } | ||||
|  | ||||
|     @SaIgnore | ||||
|     @Operation(summary = "查询参数", description = "查询参数") | ||||
|     @GetMapping("/option") | ||||
|     @Cacheable(cacheNames = CacheConsts.OPTION_KEY_PREFIX) | ||||
|     public R<List<LabelValueVO>> listOption(@Validated OptionQuery query) { | ||||
|         return R.ok(optionService.list(query).stream().map(option -> new LabelValueVO(option.getCode(), | ||||
|             StrUtil.nullToDefault(option.getValue(), option.getDefaultValue()))).collect(Collectors.toList())); | ||||
|     public List<LabelValueVO> listOption(@Validated OptionQuery query) { | ||||
|         return optionService.list(query).stream().map(option -> new LabelValueVO(option.getCode(), | ||||
|             StrUtil.nullToDefault(option.getValue(), option.getDefaultValue()))).collect(Collectors.toList()); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
| @@ -157,12 +154,11 @@ public class CommonController { | ||||
|      *            枚举类型 | ||||
|      * @return 枚举字典 | ||||
|      */ | ||||
|     private R<List<LabelValueVO>> listEnumDict(Class<?> enumClass) { | ||||
|     private List<LabelValueVO> listEnumDict(Class<?> enumClass) { | ||||
|         Object[] enumConstants = enumClass.getEnumConstants(); | ||||
|         List<LabelValueVO> labelValueList = Arrays.stream(enumConstants).map(e -> { | ||||
|         return Arrays.stream(enumConstants).map(e -> { | ||||
|             BaseEnum<Integer> baseEnum = (BaseEnum<Integer>)e; | ||||
|             return new LabelValueVO<>(baseEnum.getDescription(), baseEnum.getValue(), baseEnum.getColor()); | ||||
|         }).collect(Collectors.toList()); | ||||
|         return R.ok(labelValueList); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -31,7 +31,6 @@ import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
|  | ||||
| import top.charles7c.cnadmin.common.model.vo.R; | ||||
| import top.charles7c.cnadmin.common.util.validate.ValidationUtils; | ||||
| import top.charles7c.cnadmin.monitor.annotation.Log; | ||||
| import top.charles7c.cnadmin.monitor.model.vo.DashboardAccessTrendVO; | ||||
| @@ -59,33 +58,33 @@ public class DashboardController { | ||||
|  | ||||
|     @Operation(summary = "查询总计信息", description = "查询总计信息") | ||||
|     @GetMapping("/total") | ||||
|     public R<DashboardTotalVO> getTotal() { | ||||
|         return R.ok(dashboardService.getTotal()); | ||||
|     public DashboardTotalVO getTotal() { | ||||
|         return dashboardService.getTotal(); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "查询访问趋势信息", description = "查询访问趋势信息") | ||||
|     @Parameter(name = "days", description = "日期数", example = "30", in = ParameterIn.PATH) | ||||
|     @GetMapping("/access/trend/{days}") | ||||
|     public R<List<DashboardAccessTrendVO>> listAccessTrend(@PathVariable Integer days) { | ||||
|     public List<DashboardAccessTrendVO> listAccessTrend(@PathVariable Integer days) { | ||||
|         ValidationUtils.throwIf(7 != days && 30 != days, "仅支持查询近 7/30 天访问趋势信息"); | ||||
|         return R.ok(dashboardService.listAccessTrend(days)); | ||||
|         return dashboardService.listAccessTrend(days); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "查询热门模块列表", description = "查询热门模块列表") | ||||
|     @GetMapping("/popular/module") | ||||
|     public R<List<DashboardPopularModuleVO>> listPopularModule() { | ||||
|         return R.ok(dashboardService.listPopularModule()); | ||||
|     public List<DashboardPopularModuleVO> listPopularModule() { | ||||
|         return dashboardService.listPopularModule(); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "查询访客地域分布信息", description = "查询访客地域分布信息") | ||||
|     @GetMapping("/geo/distribution") | ||||
|     public R<DashboardGeoDistributionVO> getGeoDistribution() { | ||||
|         return R.ok(dashboardService.getGeoDistribution()); | ||||
|     public DashboardGeoDistributionVO getGeoDistribution() { | ||||
|         return dashboardService.getGeoDistribution(); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "查询公告列表", description = "查询公告列表") | ||||
|     @GetMapping("/announcement") | ||||
|     public R<List<DashboardAnnouncementVO>> listAnnouncement() { | ||||
|         return R.ok(dashboardService.listAnnouncement()); | ||||
|     public List<DashboardAnnouncementVO> listAnnouncement() { | ||||
|         return dashboardService.listAnnouncement(); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -31,7 +31,6 @@ import org.springframework.web.bind.annotation.RestController; | ||||
|  | ||||
| import top.charles7c.cnadmin.common.model.query.PageQuery; | ||||
| import top.charles7c.cnadmin.common.model.vo.PageDataVO; | ||||
| import top.charles7c.cnadmin.common.model.vo.R; | ||||
| import top.charles7c.cnadmin.monitor.annotation.Log; | ||||
| import top.charles7c.cnadmin.monitor.model.query.LoginLogQuery; | ||||
| import top.charles7c.cnadmin.monitor.model.query.OperationLogQuery; | ||||
| @@ -59,33 +58,29 @@ public class LogController { | ||||
|     @Log(module = "登录日志") | ||||
|     @Operation(summary = "分页查询登录日志列表", description = "分页查询登录日志列表") | ||||
|     @GetMapping("/login") | ||||
|     public R<PageDataVO<LoginLogVO>> page(LoginLogQuery query, @Validated PageQuery pageQuery) { | ||||
|         PageDataVO<LoginLogVO> pageDataVO = logService.page(query, pageQuery); | ||||
|         return R.ok(pageDataVO); | ||||
|     public PageDataVO<LoginLogVO> page(LoginLogQuery query, @Validated PageQuery pageQuery) { | ||||
|         return logService.page(query, pageQuery); | ||||
|     } | ||||
|  | ||||
|     @Log(module = "操作日志") | ||||
|     @Operation(summary = "分页查询操作日志列表", description = "分页查询操作日志列表") | ||||
|     @GetMapping("/operation") | ||||
|     public R<PageDataVO<OperationLogVO>> page(OperationLogQuery query, @Validated PageQuery pageQuery) { | ||||
|         PageDataVO<OperationLogVO> pageDataVO = logService.page(query, pageQuery); | ||||
|         return R.ok(pageDataVO); | ||||
|     public PageDataVO<OperationLogVO> page(OperationLogQuery query, @Validated PageQuery pageQuery) { | ||||
|         return logService.page(query, pageQuery); | ||||
|     } | ||||
|  | ||||
|     @Log(module = "系统日志") | ||||
|     @Operation(summary = "分页查询系统日志列表", description = "分页查询系统日志列表") | ||||
|     @GetMapping("/system") | ||||
|     public R<PageDataVO<SystemLogVO>> page(SystemLogQuery query, @Validated PageQuery pageQuery) { | ||||
|         PageDataVO<SystemLogVO> pageDataVO = logService.page(query, pageQuery); | ||||
|         return R.ok(pageDataVO); | ||||
|     public PageDataVO<SystemLogVO> page(SystemLogQuery query, @Validated PageQuery pageQuery) { | ||||
|         return logService.page(query, pageQuery); | ||||
|     } | ||||
|  | ||||
|     @Log(module = "系统日志") | ||||
|     @Operation(summary = "查看系统日志详情", description = "查看系统日志详情") | ||||
|     @Parameter(name = "id", description = "ID", example = "1", in = ParameterIn.PATH) | ||||
|     @GetMapping("/system/{id}") | ||||
|     public R<SystemLogDetailVO> get(@PathVariable Long id) { | ||||
|         SystemLogDetailVO detailVO = logService.get(id); | ||||
|         return R.ok(detailVO); | ||||
|     public SystemLogDetailVO get(@PathVariable Long id) { | ||||
|         return logService.get(id); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -54,8 +54,8 @@ public class OnlineUserController { | ||||
|     @Operation(summary = "分页查询列表", description = "分页查询列表") | ||||
|     @SaCheckPermission("monitor:online:user:list") | ||||
|     @GetMapping | ||||
|     public R<PageDataVO<OnlineUserVO>> page(OnlineUserQuery query, @Validated PageQuery pageQuery) { | ||||
|         return R.ok(onlineUserService.page(query, pageQuery)); | ||||
|     public PageDataVO<OnlineUserVO> page(OnlineUserQuery query, @Validated PageQuery pageQuery) { | ||||
|         return onlineUserService.page(query, pageQuery); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "强退在线用户", description = "强退在线用户") | ||||
|   | ||||
| @@ -28,7 +28,6 @@ import org.springframework.web.bind.annotation.*; | ||||
|  | ||||
| import cn.dev33.satoken.annotation.SaCheckPermission; | ||||
|  | ||||
| import top.charles7c.cnadmin.common.model.vo.R; | ||||
| import top.charles7c.cnadmin.system.model.query.OptionQuery; | ||||
| import top.charles7c.cnadmin.system.model.request.OptionRequest; | ||||
| import top.charles7c.cnadmin.system.model.request.ResetOptionValueRequest; | ||||
| @@ -52,23 +51,21 @@ public class OptionController { | ||||
|     @Operation(summary = "查询参数列表", description = "查询参数列表") | ||||
|     @SaCheckPermission("system:config:list") | ||||
|     @GetMapping | ||||
|     public R<List<OptionVO>> list(@Validated OptionQuery query) { | ||||
|         return R.ok(optionService.list(query)); | ||||
|     public List<OptionVO> list(@Validated OptionQuery query) { | ||||
|         return optionService.list(query); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "修改参数", description = "修改参数") | ||||
|     @SaCheckPermission("system:config:update") | ||||
|     @PatchMapping | ||||
|     public R update(@Validated @RequestBody List<OptionRequest> request) { | ||||
|     public void update(@Validated @RequestBody List<OptionRequest> request) { | ||||
|         optionService.update(request); | ||||
|         return R.ok(); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "重置参数", description = "重置参数") | ||||
|     @SaCheckPermission("system:config:reset") | ||||
|     @PatchMapping("/value") | ||||
|     public R resetValue(@Validated @RequestBody ResetOptionValueRequest request) { | ||||
|     public void resetValue(@Validated @RequestBody ResetOptionValueRequest request) { | ||||
|         optionService.resetValue(request); | ||||
|         return R.ok(); | ||||
|     } | ||||
| } | ||||
| @@ -61,8 +61,8 @@ public class GeneratorController { | ||||
|     @Operation(summary = "分页查询数据表", description = "分页查询数据表") | ||||
|     @SaCheckPermission("tool:generator:list") | ||||
|     @GetMapping("/table") | ||||
|     public R<PageDataVO<TableVO>> pageTable(TableQuery query, @Validated PageQuery pageQuery) throws SQLException { | ||||
|         return R.ok(generatorService.pageTable(query, pageQuery)); | ||||
|     public PageDataVO<TableVO> pageTable(TableQuery query, @Validated PageQuery pageQuery) throws SQLException { | ||||
|         return generatorService.pageTable(query, pageQuery); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "查询字段配置列表", description = "查询字段配置列表") | ||||
| @@ -70,17 +70,17 @@ public class GeneratorController { | ||||
|     @Parameter(name = "requireSync", description = "是否需要同步", example = "false", in = ParameterIn.QUERY) | ||||
|     @SaCheckPermission("tool:generator:list") | ||||
|     @GetMapping("/field/{tableName}") | ||||
|     public R<List<FieldConfigDO>> listFieldConfig(@PathVariable String tableName, | ||||
|     public List<FieldConfigDO> listFieldConfig(@PathVariable String tableName, | ||||
|         @RequestParam(required = false, defaultValue = "false") Boolean requireSync) { | ||||
|         return R.ok(generatorService.listFieldConfig(tableName, requireSync)); | ||||
|         return generatorService.listFieldConfig(tableName, requireSync); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "查询生成配置信息", description = "查询生成配置信息") | ||||
|     @Parameter(name = "tableName", description = "表名称", required = true, example = "sys_user", in = ParameterIn.PATH) | ||||
|     @SaCheckPermission("tool:generator:list") | ||||
|     @GetMapping("/config/{tableName}") | ||||
|     public R<GenConfigDO> getGenConfig(@PathVariable String tableName) throws SQLException { | ||||
|         return R.ok(generatorService.getGenConfig(tableName)); | ||||
|     public GenConfigDO getGenConfig(@PathVariable String tableName) throws SQLException { | ||||
|         return generatorService.getGenConfig(tableName); | ||||
|     } | ||||
|  | ||||
|     @Operation(summary = "保存配置信息", description = "保存配置信息") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Bull-BCLS
					Bull-BCLS