From 992a8fca173ea76722b388aca462cff8a1128803 Mon Sep 17 00:00:00 2001
From: Bull-BCLS <1019113057@qq.com>
Date: Thu, 12 Oct 2023 23:12:41 +0800
Subject: [PATCH] =?UTF-8?q?fix:=20=E6=96=B0=E5=A2=9E=E5=85=A8=E5=B1=80?=
 =?UTF-8?q?=E5=93=8D=E5=BA=94=E7=BB=93=E6=9E=9C=E5=A4=84=E7=90=86=E5=99=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

实现ResponseBodyAdvice接口,可以将相同的处理逻辑抽取出来,避免了在多个Controller中重复编写代码,提高了代码的可维护性和可读性。同时,对返回结果进行统一格式化、异常处理等处理,使得返回结果更加规范、易于处理和阅读。
---
 .../common/annotation/NoResponseAdvice.java   | 32 +++++++++
 .../cnadmin/common/base/BaseController.java   | 22 +++----
 .../GlobalResponseBodyAdviceHandler.java      | 66 +++++++++++++++++++
 .../controller/auth/LoginController.java      | 17 ++---
 .../controller/common/CaptchaController.java  |  4 +-
 .../controller/common/CommonController.java   | 30 ++++-----
 .../common/DashboardController.java           | 21 +++---
 .../controller/monitor/LogController.java     | 21 +++---
 .../monitor/OnlineUserController.java         |  4 +-
 .../controller/system/OptionController.java   | 11 ++--
 .../controller/tool/GeneratorController.java  | 12 ++--
 11 files changed, 160 insertions(+), 80 deletions(-)
 create mode 100644 continew-admin-common/src/main/java/top/charles7c/cnadmin/common/annotation/NoResponseAdvice.java
 create mode 100644 continew-admin-common/src/main/java/top/charles7c/cnadmin/common/handler/GlobalResponseBodyAdviceHandler.java

diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/annotation/NoResponseAdvice.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/annotation/NoResponseAdvice.java
new file mode 100644
index 00000000..1ed7cf68
--- /dev/null
+++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/annotation/NoResponseAdvice.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.charles7c.cnadmin.common.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 响应拦截忽略注解
+ *
+ * @author BULL_BCLS
+ * @since 2023/10/8 20:44
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface NoResponseAdvice {}
\ No newline at end of file
diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java
index 281c1108..df1fdba7 100644
--- a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java
+++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/base/BaseController.java
@@ -37,6 +37,7 @@ import cn.hutool.core.lang.tree.Tree;
 import cn.hutool.core.util.StrUtil;
 
 import top.charles7c.cnadmin.common.annotation.CrudRequestMapping;
+import top.charles7c.cnadmin.common.annotation.NoResponseAdvice;
 import top.charles7c.cnadmin.common.constant.StringConsts;
 import top.charles7c.cnadmin.common.model.query.PageQuery;
 import top.charles7c.cnadmin.common.model.query.SortQuery;
@@ -77,10 +78,9 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
     @Operation(summary = "分页查询列表", description = "分页查询列表")
     @ResponseBody
     @GetMapping
-    public R<PageDataVO<V>> page(Q query, @Validated PageQuery pageQuery) {
+    public PageDataVO<V> page(Q query, @Validated PageQuery pageQuery) {
         this.checkPermission(Api.LIST);
-        PageDataVO<V> pageDataVO = baseService.page(query, pageQuery);
-        return R.ok(pageDataVO);
+        return baseService.page(query, pageQuery);
     }
 
     /**
@@ -95,10 +95,9 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
     @Operation(summary = "查询树列表", description = "查询树列表")
     @ResponseBody
     @GetMapping("/tree")
-    public R<List<Tree<Long>>> tree(Q query, SortQuery sortQuery) {
+    public List<Tree<Long>> tree(Q query, SortQuery sortQuery) {
         this.checkPermission(Api.LIST);
-        List<Tree<Long>> list = baseService.tree(query, sortQuery, false);
-        return R.ok(list);
+        return baseService.tree(query, sortQuery, false);
     }
 
     /**
@@ -113,10 +112,9 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
     @Operation(summary = "查询列表", description = "查询列表")
     @ResponseBody
     @GetMapping("/list")
-    public R<List<V>> list(Q query, SortQuery sortQuery) {
+    public List<V> list(Q query, SortQuery sortQuery) {
         this.checkPermission(Api.LIST);
-        List<V> list = baseService.list(query, sortQuery);
-        return R.ok(list);
+        return baseService.list(query, sortQuery);
     }
 
     /**
@@ -130,10 +128,9 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
     @Parameter(name = "id", description = "ID", example = "1", in = ParameterIn.PATH)
     @ResponseBody
     @GetMapping("/{id}")
-    public R<D> get(@PathVariable Long id) {
+    public D get(@PathVariable Long id) {
         this.checkPermission(Api.LIST);
-        D detail = baseService.get(id);
-        return R.ok(detail);
+        return baseService.get(id);
     }
 
     /**
@@ -199,6 +196,7 @@ public abstract class BaseController<S extends BaseService<V, D, Q, C>, V, D, Q,
      *            响应对象
      */
     @Operation(summary = "导出数据", description = "导出数据")
+    @NoResponseAdvice
     @GetMapping("/export")
     public void export(Q query, SortQuery sortQuery, HttpServletResponse response) {
         this.checkPermission(Api.EXPORT);
diff --git a/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/handler/GlobalResponseBodyAdviceHandler.java b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/handler/GlobalResponseBodyAdviceHandler.java
new file mode 100644
index 00000000..25f54d6b
--- /dev/null
+++ b/continew-admin-common/src/main/java/top/charles7c/cnadmin/common/handler/GlobalResponseBodyAdviceHandler.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package top.charles7c.cnadmin.common.handler;
+
+import lombok.RequiredArgsConstructor;
+
+import org.springframework.core.MethodParameter;
+import org.springframework.http.MediaType;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.server.ServerHttpRequest;
+import org.springframework.http.server.ServerHttpResponse;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import top.charles7c.cnadmin.common.annotation.NoResponseAdvice;
+import top.charles7c.cnadmin.common.model.vo.R;
+
+/**
+ * 全局响应结果处理器
+ *
+ * @author BULL_BCLS
+ * @since 2023/10/8 20:19
+ */
+@RestControllerAdvice
+@RequiredArgsConstructor
+public class GlobalResponseBodyAdviceHandler implements ResponseBodyAdvice<Object> {
+
+    private final ObjectMapper objectMapper;
+
+    @Override
+    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> converterType) {
+        return !methodParameter.getParameterType().isAssignableFrom(R.class)
+            && !methodParameter.hasMethodAnnotation(NoResponseAdvice.class);
+    }
+
+    @Override
+    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
+        Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
+        ServerHttpResponse response) {
+        if (String.class.equals(returnType.getGenericParameterType())) {
+            try {
+                return objectMapper.writeValueAsString(R.ok(body));
+            } catch (JsonProcessingException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return R.ok(body);
+    }
+}
diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/auth/LoginController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/auth/LoginController.java
index ec5dedc3..1df19306 100644
--- a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/auth/LoginController.java
+++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/auth/LoginController.java
@@ -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);
     }
 }
\ No newline at end of file
diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CaptchaController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CaptchaController.java
index a502acd9..6909a1de 100644
--- a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CaptchaController.java
+++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CaptchaController.java
@@ -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 = "发送验证码到指定邮箱")
diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CommonController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CommonController.java
index 02668e5d..4e2d1f5e 100644
--- a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CommonController.java
+++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/CommonController.java
@@ -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);
     }
 }
diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/DashboardController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/DashboardController.java
index 10416055..82e302e8 100644
--- a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/DashboardController.java
+++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/common/DashboardController.java
@@ -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();
     }
 }
diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/LogController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/LogController.java
index 31c8d533..932fb2f2 100644
--- a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/LogController.java
+++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/LogController.java
@@ -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);
     }
 }
diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/OnlineUserController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/OnlineUserController.java
index 5741fa77..82fa2ad9 100644
--- a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/OnlineUserController.java
+++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/OnlineUserController.java
@@ -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 = "强退在线用户")
diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/OptionController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/OptionController.java
index 6db70183..b6c95a58 100644
--- a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/OptionController.java
+++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/system/OptionController.java
@@ -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();
     }
 }
\ No newline at end of file
diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/tool/GeneratorController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/tool/GeneratorController.java
index 85e49144..a4d77b7f 100644
--- a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/tool/GeneratorController.java
+++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/tool/GeneratorController.java
@@ -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 = "保存配置信息")