From d123057d73e78cadb07a0a48fb191886a87689a8 Mon Sep 17 00:00:00 2001 From: lzh Date: Tue, 17 Mar 2026 17:44:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(system):=20=E7=94=A8=E6=88=B7=E5=A4=B4?= =?UTF-8?q?=E5=83=8F=20URL=20=E9=A2=84=E7=AD=BE=E5=90=8D=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AuthController 登录权限接口返回预签名头像 - UserController 用户列表及详情返回预签名头像 - UserProfileController 个人中心预签名头像,保存时剥离签名参数 - OAuth2UserController 用户信息接口返回预签名头像 Co-Authored-By: Claude Opus 4.6 --- .../controller/admin/auth/AuthController.java | 363 +++++++++-------- .../admin/oauth2/OAuth2UserController.java | 170 ++++---- .../controller/admin/user/UserController.java | 377 +++++++++--------- .../admin/user/UserProfileController.java | 172 ++++---- 4 files changed, 567 insertions(+), 515 deletions(-) diff --git a/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/auth/AuthController.java b/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/auth/AuthController.java index 5f41e63..06358c2 100644 --- a/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/auth/AuthController.java +++ b/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/auth/AuthController.java @@ -1,174 +1,189 @@ -package com.viewsh.module.system.controller.admin.auth; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.viewsh.framework.common.enums.CommonStatusEnum; -import com.viewsh.framework.common.enums.UserTypeEnum; -import com.viewsh.framework.common.pojo.CommonResult; -import com.viewsh.framework.security.config.SecurityProperties; -import com.viewsh.framework.security.core.util.SecurityFrameworkUtils; -import com.viewsh.module.system.controller.admin.auth.vo.*; -import com.viewsh.module.system.convert.auth.AuthConvert; -import com.viewsh.module.system.dal.dataobject.permission.MenuDO; -import com.viewsh.module.system.dal.dataobject.permission.RoleDO; -import com.viewsh.module.system.dal.dataobject.user.AdminUserDO; -import com.viewsh.module.system.enums.logger.LoginLogTypeEnum; -import com.viewsh.module.system.service.auth.AdminAuthService; -import com.viewsh.module.system.service.permission.MenuService; -import com.viewsh.module.system.service.permission.PermissionService; -import com.viewsh.module.system.service.permission.RoleService; -import com.viewsh.module.system.service.social.SocialClientService; -import com.viewsh.module.system.service.user.AdminUserService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.annotation.security.PermitAll; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.validation.Valid; -import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.Collections; -import java.util.List; -import java.util.Set; - -import static com.viewsh.framework.common.pojo.CommonResult.success; -import static com.viewsh.framework.common.util.collection.CollectionUtils.convertSet; -import static com.viewsh.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管理后台 - 认证") -@RestController -@RequestMapping("/system/auth") -@Validated -@Slf4j -public class AuthController { - - @Resource - private AdminAuthService authService; - @Resource - private AdminUserService userService; - @Resource - private RoleService roleService; - @Resource - private MenuService menuService; - @Resource - private PermissionService permissionService; - @Resource - private SocialClientService socialClientService; - - @Resource - private SecurityProperties securityProperties; - - @PostMapping("/login") - @PermitAll - @Operation(summary = "使用账号密码登录") - public CommonResult login(@RequestBody @Valid AuthLoginReqVO reqVO) { - return success(authService.login(reqVO)); - } - - @PostMapping("/logout") - @PermitAll - @Operation(summary = "登出系统") - public CommonResult logout(HttpServletRequest request) { - String token = SecurityFrameworkUtils.obtainAuthorization(request, - securityProperties.getTokenHeader(), securityProperties.getTokenParameter()); - if (StrUtil.isNotBlank(token)) { - authService.logout(token, LoginLogTypeEnum.LOGOUT_SELF.getType()); - } - return success(true); - } - - @PostMapping("/refresh-token") - @PermitAll - @Operation(summary = "刷新令牌") - @Parameter(name = "refreshToken", description = "刷新令牌", required = true) - public CommonResult refreshToken(@RequestParam("refreshToken") String refreshToken) { - return success(authService.refreshToken(refreshToken)); - } - - @GetMapping("/get-permission-info") - @Operation(summary = "获取登录用户的权限信息") - public CommonResult getPermissionInfo() { - // 1.1 获得用户信息 - AdminUserDO user = userService.getUser(getLoginUserId()); - if (user == null) { - return success(null); - } - - // 1.2 获得角色列表 - Set roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId()); - if (CollUtil.isEmpty(roleIds)) { - return success(AuthConvert.INSTANCE.convert(user, Collections.emptyList(), Collections.emptyList())); - } - List roles = roleService.getRoleList(roleIds); - roles.removeIf(role -> !CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())); // 移除禁用的角色 - - // 1.3 获得菜单列表 - Set menuIds = permissionService.getRoleMenuListByRoleId(convertSet(roles, RoleDO::getId)); - List menuList = menuService.getMenuList(menuIds); - menuList = menuService.filterDisableMenus(menuList); - - // 2. 拼接结果返回 - return success(AuthConvert.INSTANCE.convert(user, roles, menuList)); - } - - @PostMapping("/register") - @PermitAll - @Operation(summary = "注册用户") - public CommonResult register(@RequestBody @Valid AuthRegisterReqVO registerReqVO) { - return success(authService.register(registerReqVO)); - } - - // ========== 短信登录相关 ========== - - @PostMapping("/sms-login") - @PermitAll - @Operation(summary = "使用短信验证码登录") - // 可按需开启限流:https://github.com/YunaiV/ruoyi-vue-pro/issues/851 - // @RateLimiter(time = 60, count = 6, keyResolver = ExpressionRateLimiterKeyResolver.class, keyArg = "#reqVO.mobile") - public CommonResult smsLogin(@RequestBody @Valid AuthSmsLoginReqVO reqVO) { - return success(authService.smsLogin(reqVO)); - } - - @PostMapping("/send-sms-code") - @PermitAll - @Operation(summary = "发送手机验证码") - public CommonResult sendLoginSmsCode(@RequestBody @Valid AuthSmsSendReqVO reqVO) { - authService.sendSmsCode(reqVO); - return success(true); - } - - @PostMapping("/reset-password") - @PermitAll - @Operation(summary = "重置密码") - public CommonResult resetPassword(@RequestBody @Valid AuthResetPasswordReqVO reqVO) { - authService.resetPassword(reqVO); - return success(true); - } - - // ========== 社交登录相关 ========== - - @GetMapping("/social-auth-redirect") - @PermitAll - @Operation(summary = "社交授权的跳转") - @Parameters({ - @Parameter(name = "type", description = "社交类型", required = true), - @Parameter(name = "redirectUri", description = "回调路径") - }) - public CommonResult socialLogin(@RequestParam("type") Integer type, - @RequestParam("redirectUri") String redirectUri) { - return success(socialClientService.getAuthorizeUrl( - type, UserTypeEnum.ADMIN.getValue(), redirectUri)); - } - - @PostMapping("/social-login") - @PermitAll - @Operation(summary = "社交快捷登录,使用 code 授权码", description = "适合未登录的用户,但是社交账号已绑定用户") - public CommonResult socialQuickLogin(@RequestBody @Valid AuthSocialLoginReqVO reqVO) { - return success(authService.socialLogin(reqVO)); - } - -} +package com.viewsh.module.system.controller.admin.auth; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.viewsh.framework.common.enums.CommonStatusEnum; +import com.viewsh.framework.common.enums.UserTypeEnum; +import com.viewsh.framework.common.pojo.CommonResult; +import com.viewsh.framework.security.config.SecurityProperties; +import com.viewsh.framework.security.core.util.SecurityFrameworkUtils; +import com.viewsh.module.infra.api.file.FileApi; +import com.viewsh.module.system.controller.admin.auth.vo.*; +import com.viewsh.module.system.convert.auth.AuthConvert; +import com.viewsh.module.system.dal.dataobject.permission.MenuDO; +import com.viewsh.module.system.dal.dataobject.permission.RoleDO; +import com.viewsh.module.system.dal.dataobject.user.AdminUserDO; +import com.viewsh.module.system.enums.logger.LoginLogTypeEnum; +import com.viewsh.module.system.service.auth.AdminAuthService; +import com.viewsh.module.system.service.permission.MenuService; +import com.viewsh.module.system.service.permission.PermissionService; +import com.viewsh.module.system.service.permission.RoleService; +import com.viewsh.module.system.service.social.SocialClientService; +import com.viewsh.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.annotation.security.PermitAll; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Collections; +import java.util.List; +import java.util.Set; + +import static com.viewsh.framework.common.pojo.CommonResult.success; +import static com.viewsh.framework.common.util.collection.CollectionUtils.convertSet; +import static com.viewsh.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 认证") +@RestController +@RequestMapping("/system/auth") +@Validated +@Slf4j +public class AuthController { + + @Resource + private AdminAuthService authService; + @Resource + private AdminUserService userService; + @Resource + private RoleService roleService; + @Resource + private MenuService menuService; + @Resource + private PermissionService permissionService; + @Resource + private SocialClientService socialClientService; + + @Resource + private SecurityProperties securityProperties; + @Resource + private FileApi fileApi; + + @PostMapping("/login") + @PermitAll + @Operation(summary = "使用账号密码登录") + public CommonResult login(@RequestBody @Valid AuthLoginReqVO reqVO) { + return success(authService.login(reqVO)); + } + + @PostMapping("/logout") + @PermitAll + @Operation(summary = "登出系统") + public CommonResult logout(HttpServletRequest request) { + String token = SecurityFrameworkUtils.obtainAuthorization(request, + securityProperties.getTokenHeader(), securityProperties.getTokenParameter()); + if (StrUtil.isNotBlank(token)) { + authService.logout(token, LoginLogTypeEnum.LOGOUT_SELF.getType()); + } + return success(true); + } + + @PostMapping("/refresh-token") + @PermitAll + @Operation(summary = "刷新令牌") + @Parameter(name = "refreshToken", description = "刷新令牌", required = true) + public CommonResult refreshToken(@RequestParam("refreshToken") String refreshToken) { + return success(authService.refreshToken(refreshToken)); + } + + @GetMapping("/get-permission-info") + @Operation(summary = "获取登录用户的权限信息") + public CommonResult getPermissionInfo() { + // 1.1 获得用户信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + if (user == null) { + return success(null); + } + + // 1.2 获得角色列表 + Set roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId()); + if (CollUtil.isEmpty(roleIds)) { + return success(AuthConvert.INSTANCE.convert(user, Collections.emptyList(), Collections.emptyList())); + } + List roles = roleService.getRoleList(roleIds); + roles.removeIf(role -> !CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())); // 移除禁用的角色 + + // 1.3 获得菜单列表 + Set menuIds = permissionService.getRoleMenuListByRoleId(convertSet(roles, RoleDO::getId)); + List menuList = menuService.getMenuList(menuIds); + menuList = menuService.filterDisableMenus(menuList); + + // 2. 拼接结果返回 + AuthPermissionInfoRespVO respVO = AuthConvert.INSTANCE.convert(user, roles, menuList); + // 私有桶:对头像 URL 生成预签名访问地址 + if (respVO.getUser() != null && StrUtil.isNotEmpty(respVO.getUser().getAvatar())) { + respVO.getUser().setAvatar(fileApi.presignGetUrl(respVO.getUser().getAvatar(), null).getCheckedData()); + } + return success(respVO); + } + + @PostMapping("/register") + @PermitAll + @Operation(summary = "注册用户") + public CommonResult register(@RequestBody @Valid AuthRegisterReqVO registerReqVO) { + return success(authService.register(registerReqVO)); + } + + // ========== 短信登录相关 ========== + + @PostMapping("/sms-login") + @PermitAll + @Operation(summary = "使用短信验证码登录") + // 可按需开启限流:https://github.com/YunaiV/ruoyi-vue-pro/issues/851 + // @RateLimiter(time = 60, count = 6, keyResolver = ExpressionRateLimiterKeyResolver.class, keyArg = "#reqVO.mobile") + public CommonResult smsLogin(@RequestBody @Valid AuthSmsLoginReqVO reqVO) { + return success(authService.smsLogin(reqVO)); + } + + @PostMapping("/send-sms-code") + @PermitAll + @Operation(summary = "发送手机验证码") + public CommonResult sendLoginSmsCode(@RequestBody @Valid AuthSmsSendReqVO reqVO) { + authService.sendSmsCode(reqVO); + return success(true); + } + + @PostMapping("/reset-password") + @PermitAll + @Operation(summary = "重置密码") + public CommonResult resetPassword(@RequestBody @Valid AuthResetPasswordReqVO reqVO) { + authService.resetPassword(reqVO); + return success(true); + } + + // ========== 社交登录相关 ========== + + @GetMapping("/social-auth-redirect") + @PermitAll + @Operation(summary = "社交授权的跳转") + @Parameters({ + @Parameter(name = "type", description = "社交类型", required = true), + @Parameter(name = "redirectUri", description = "回调路径") + }) + public CommonResult socialLogin(@RequestParam("type") Integer type, + @RequestParam("redirectUri") String redirectUri) { + return success(socialClientService.getAuthorizeUrl( + type, UserTypeEnum.ADMIN.getValue(), redirectUri)); + } + + @PostMapping("/social-login") + @PermitAll + @Operation(summary = "社交快捷登录,使用 code 授权码", description = "适合未登录的用户,但是社交账号已绑定用户") + public CommonResult socialQuickLogin(@RequestBody @Valid AuthSocialLoginReqVO reqVO) { + return success(authService.socialLogin(reqVO)); + } + + @PostMapping("/weixin-mini-app-login") + @PermitAll + @Operation(summary = "微信小程序一键登录", description = "通过微信手机号授权匹配管理员账号并自动绑定") + public CommonResult weixinMiniAppLogin(@RequestBody @Valid AuthWeixinMiniAppLoginReqVO reqVO) { + return success(authService.weixinMiniAppLogin(reqVO)); + } + +} diff --git a/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/oauth2/OAuth2UserController.java b/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/oauth2/OAuth2UserController.java index 6fec3e7..8ce3afb 100644 --- a/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/oauth2/OAuth2UserController.java +++ b/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/oauth2/OAuth2UserController.java @@ -1,81 +1,89 @@ -package com.viewsh.module.system.controller.admin.oauth2; - -import cn.hutool.core.collection.CollUtil; -import com.viewsh.framework.common.pojo.CommonResult; -import com.viewsh.framework.common.util.object.BeanUtils; -import com.viewsh.module.system.controller.admin.oauth2.vo.user.OAuth2UserInfoRespVO; -import com.viewsh.module.system.controller.admin.oauth2.vo.user.OAuth2UserUpdateReqVO; -import com.viewsh.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; -import com.viewsh.module.system.dal.dataobject.dept.DeptDO; -import com.viewsh.module.system.dal.dataobject.dept.PostDO; -import com.viewsh.module.system.dal.dataobject.user.AdminUserDO; -import com.viewsh.module.system.service.dept.DeptService; -import com.viewsh.module.system.service.dept.PostService; -import com.viewsh.module.system.service.user.AdminUserService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import java.util.List; - -import static com.viewsh.framework.common.pojo.CommonResult.success; -import static com.viewsh.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -/** - * 提供给外部应用调用为主 - * - * 1. 在 getUserInfo 方法上,添加 @PreAuthorize("@ss.hasScope('user.read')") 注解,声明需要满足 scope = user.read - * 2. 在 updateUserInfo 方法上,添加 @PreAuthorize("@ss.hasScope('user.write')") 注解,声明需要满足 scope = user.write - * - * @author 芋道源码 - */ -@Tag(name = "管理后台 - OAuth2.0 用户") -@RestController -@RequestMapping("/system/oauth2/user") -@Validated -@Slf4j -public class OAuth2UserController { - - @Resource - private AdminUserService userService; - @Resource - private DeptService deptService; - @Resource - private PostService postService; - - @GetMapping("/get") - @Operation(summary = "获得用户基本信息") - @PreAuthorize("@ss.hasScope('user.read')") // - public CommonResult getUserInfo() { - // 获得用户基本信息 - AdminUserDO user = userService.getUser(getLoginUserId()); - OAuth2UserInfoRespVO resp = BeanUtils.toBean(user, OAuth2UserInfoRespVO.class); - // 获得部门信息 - if (user.getDeptId() != null) { - DeptDO dept = deptService.getDept(user.getDeptId()); - resp.setDept(BeanUtils.toBean(dept, OAuth2UserInfoRespVO.Dept.class)); - } - // 获得岗位信息 - if (CollUtil.isNotEmpty(user.getPostIds())) { - List posts = postService.getPostList(user.getPostIds()); - resp.setPosts(BeanUtils.toBean(posts, OAuth2UserInfoRespVO.Post.class)); - } - return success(resp); - } - - @PutMapping("/update") - @Operation(summary = "更新用户基本信息") - @PreAuthorize("@ss.hasScope('user.write')") - public CommonResult updateUserInfo(@Valid @RequestBody OAuth2UserUpdateReqVO reqVO) { - // 这里将 UserProfileUpdateReqVO =》UserProfileUpdateReqVO 对象,实现接口的复用。 - // 主要是,AdminUserService 没有自己的 BO 对象,所以复用只能这么做 - userService.updateUserProfile(getLoginUserId(), BeanUtils.toBean(reqVO, UserProfileUpdateReqVO.class)); - return success(true); - } - -} +package com.viewsh.module.system.controller.admin.oauth2; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.viewsh.framework.common.pojo.CommonResult; +import com.viewsh.framework.common.util.object.BeanUtils; +import com.viewsh.module.infra.api.file.FileApi; +import com.viewsh.module.system.controller.admin.oauth2.vo.user.OAuth2UserInfoRespVO; +import com.viewsh.module.system.controller.admin.oauth2.vo.user.OAuth2UserUpdateReqVO; +import com.viewsh.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.viewsh.module.system.dal.dataobject.dept.DeptDO; +import com.viewsh.module.system.dal.dataobject.dept.PostDO; +import com.viewsh.module.system.dal.dataobject.user.AdminUserDO; +import com.viewsh.module.system.service.dept.DeptService; +import com.viewsh.module.system.service.dept.PostService; +import com.viewsh.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import java.util.List; + +import static com.viewsh.framework.common.pojo.CommonResult.success; +import static com.viewsh.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +/** + * 提供给外部应用调用为主 + * + * 1. 在 getUserInfo 方法上,添加 @PreAuthorize("@ss.hasScope('user.read')") 注解,声明需要满足 scope = user.read + * 2. 在 updateUserInfo 方法上,添加 @PreAuthorize("@ss.hasScope('user.write')") 注解,声明需要满足 scope = user.write + * + * @author 芋道源码 + */ +@Tag(name = "管理后台 - OAuth2.0 用户") +@RestController +@RequestMapping("/system/oauth2/user") +@Validated +@Slf4j +public class OAuth2UserController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + @Resource + private PostService postService; + @Resource + private FileApi fileApi; + + @GetMapping("/get") + @Operation(summary = "获得用户基本信息") + @PreAuthorize("@ss.hasScope('user.read')") // + public CommonResult getUserInfo() { + // 获得用户基本信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + OAuth2UserInfoRespVO resp = BeanUtils.toBean(user, OAuth2UserInfoRespVO.class); + // 获得部门信息 + if (user.getDeptId() != null) { + DeptDO dept = deptService.getDept(user.getDeptId()); + resp.setDept(BeanUtils.toBean(dept, OAuth2UserInfoRespVO.Dept.class)); + } + // 获得岗位信息 + if (CollUtil.isNotEmpty(user.getPostIds())) { + List posts = postService.getPostList(user.getPostIds()); + resp.setPosts(BeanUtils.toBean(posts, OAuth2UserInfoRespVO.Post.class)); + } + // 私有桶:对头像 URL 生成预签名访问地址 + if (StrUtil.isNotEmpty(resp.getAvatar())) { + resp.setAvatar(fileApi.presignGetUrl(resp.getAvatar(), null).getCheckedData()); + } + return success(resp); + } + + @PutMapping("/update") + @Operation(summary = "更新用户基本信息") + @PreAuthorize("@ss.hasScope('user.write')") + public CommonResult updateUserInfo(@Valid @RequestBody OAuth2UserUpdateReqVO reqVO) { + // 这里将 UserProfileUpdateReqVO =》UserProfileUpdateReqVO 对象,实现接口的复用。 + // 主要是,AdminUserService 没有自己的 BO 对象,所以复用只能这么做 + userService.updateUserProfile(getLoginUserId(), BeanUtils.toBean(reqVO, UserProfileUpdateReqVO.class)); + return success(true); + } + +} diff --git a/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/user/UserController.java b/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/user/UserController.java index 6df03e5..ad69ce3 100644 --- a/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/user/UserController.java +++ b/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/user/UserController.java @@ -1,181 +1,196 @@ -package com.viewsh.module.system.controller.admin.user; - -import cn.hutool.core.collection.CollUtil; -import com.viewsh.framework.apilog.core.annotation.ApiAccessLog; -import com.viewsh.framework.common.enums.CommonStatusEnum; -import com.viewsh.framework.common.pojo.CommonResult; -import com.viewsh.framework.common.pojo.PageParam; -import com.viewsh.framework.common.pojo.PageResult; -import com.viewsh.framework.excel.core.util.ExcelUtils; -import com.viewsh.module.system.controller.admin.user.vo.user.*; -import com.viewsh.module.system.convert.user.UserConvert; -import com.viewsh.module.system.dal.dataobject.dept.DeptDO; -import com.viewsh.module.system.dal.dataobject.user.AdminUserDO; -import com.viewsh.module.system.enums.common.SexEnum; -import com.viewsh.module.system.service.dept.DeptService; -import com.viewsh.module.system.service.user.AdminUserService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -import static com.viewsh.framework.apilog.core.enums.OperateTypeEnum.EXPORT; -import static com.viewsh.framework.common.pojo.CommonResult.success; -import static com.viewsh.framework.common.util.collection.CollectionUtils.convertList; - -@Tag(name = "管理后台 - 用户") -@RestController -@RequestMapping("/system/user") -@Validated -public class UserController { - - @Resource - private AdminUserService userService; - @Resource - private DeptService deptService; - - @PostMapping("/create") - @Operation(summary = "新增用户") - @PreAuthorize("@ss.hasPermission('system:user:create')") - public CommonResult createUser(@Valid @RequestBody UserSaveReqVO reqVO) { - Long id = userService.createUser(reqVO); - return success(id); - } - - @PutMapping("update") - @Operation(summary = "修改用户") - @PreAuthorize("@ss.hasPermission('system:user:update')") - public CommonResult updateUser(@Valid @RequestBody UserSaveReqVO reqVO) { - userService.updateUser(reqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除用户") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:user:delete')") - public CommonResult deleteUser(@RequestParam("id") Long id) { - userService.deleteUser(id); - return success(true); - } - - @DeleteMapping("/delete-list") - @Parameter(name = "ids", description = "编号列表", required = true) - @Operation(summary = "批量删除用户") - @PreAuthorize("@ss.hasPermission('system:user:delete')") - public CommonResult deleteUserList(@RequestParam("ids") List ids) { - userService.deleteUserList(ids); - return success(true); - } - - @PutMapping("/update-password") - @Operation(summary = "重置用户密码") - @PreAuthorize("@ss.hasPermission('system:user:update-password')") - public CommonResult updateUserPassword(@Valid @RequestBody UserUpdatePasswordReqVO reqVO) { - userService.updateUserPassword(reqVO.getId(), reqVO.getPassword()); - return success(true); - } - - @PutMapping("/update-status") - @Operation(summary = "修改用户状态") - @PreAuthorize("@ss.hasPermission('system:user:update')") - public CommonResult updateUserStatus(@Valid @RequestBody UserUpdateStatusReqVO reqVO) { - userService.updateUserStatus(reqVO.getId(), reqVO.getStatus()); - return success(true); - } - - @GetMapping("/page") - @Operation(summary = "获得用户分页列表") - @PreAuthorize("@ss.hasPermission('system:user:query')") - public CommonResult> getUserPage(@Valid UserPageReqVO pageReqVO) { - // 获得用户分页列表 - PageResult pageResult = userService.getUserPage(pageReqVO); - if (CollUtil.isEmpty(pageResult.getList())) { - return success(new PageResult<>(pageResult.getTotal())); - } - // 拼接数据 - Map deptMap = deptService.getDeptMap( - convertList(pageResult.getList(), AdminUserDO::getDeptId)); - return success(new PageResult<>(UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap), - pageResult.getTotal())); - } - - @GetMapping({"/list-all-simple", "/simple-list"}) - @Operation(summary = "获取用户精简信息列表", description = "只包含被开启的用户,主要用于前端的下拉选项") - public CommonResult> getSimpleUserList() { - List list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus()); - // 拼接数据 - Map deptMap = deptService.getDeptMap( - convertList(list, AdminUserDO::getDeptId)); - return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap)); - } - - @GetMapping("/get") - @Operation(summary = "获得用户详情") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('system:user:query')") - public CommonResult getUser(@RequestParam("id") Long id) { - AdminUserDO user = userService.getUser(id); - if (user == null) { - return success(null); - } - // 拼接数据 - DeptDO dept = deptService.getDept(user.getDeptId()); - return success(UserConvert.INSTANCE.convert(user, dept)); - } - - @GetMapping("/export-excel") - @Operation(summary = "导出用户") - @PreAuthorize("@ss.hasPermission('system:user:export')") - @ApiAccessLog(operateType = EXPORT) - public void exportUserList(@Validated UserPageReqVO exportReqVO, - HttpServletResponse response) throws IOException { - exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List list = userService.getUserPage(exportReqVO).getList(); - // 输出 Excel - Map deptMap = deptService.getDeptMap( - convertList(list, AdminUserDO::getDeptId)); - ExcelUtils.write(response, "用户数据.xls", "数据", UserRespVO.class, - UserConvert.INSTANCE.convertList(list, deptMap)); - } - - @GetMapping("/get-import-template") - @Operation(summary = "获得导入用户模板") - public void importTemplate(HttpServletResponse response) throws IOException { - // 手动创建导出 demo - List list = Arrays.asList( - UserImportExcelVO.builder().username("yunai").deptId(1L).email("yunai@iocoder.cn").mobile("15601691300") - .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(), - UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") - .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() - ); - // 输出 - ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list); - } - - @PostMapping("/import") - @Operation(summary = "导入用户") - @Parameters({ - @Parameter(name = "file", description = "Excel 文件", required = true), - @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true") - }) - @PreAuthorize("@ss.hasPermission('system:user:import')") - public CommonResult importExcel(@RequestParam("file") MultipartFile file, - @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { - List list = ExcelUtils.read(file, UserImportExcelVO.class); - return success(userService.importUserList(list, updateSupport)); - } - -} +package com.viewsh.module.system.controller.admin.user; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.viewsh.framework.apilog.core.annotation.ApiAccessLog; +import com.viewsh.framework.common.enums.CommonStatusEnum; +import com.viewsh.framework.common.pojo.CommonResult; +import com.viewsh.framework.common.pojo.PageParam; +import com.viewsh.framework.common.pojo.PageResult; +import com.viewsh.framework.excel.core.util.ExcelUtils; +import com.viewsh.module.infra.api.file.FileApi; +import com.viewsh.module.system.controller.admin.user.vo.user.*; +import com.viewsh.module.system.convert.user.UserConvert; +import com.viewsh.module.system.dal.dataobject.dept.DeptDO; +import com.viewsh.module.system.dal.dataobject.user.AdminUserDO; +import com.viewsh.module.system.enums.common.SexEnum; +import com.viewsh.module.system.service.dept.DeptService; +import com.viewsh.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import static com.viewsh.framework.apilog.core.enums.OperateTypeEnum.EXPORT; +import static com.viewsh.framework.common.pojo.CommonResult.success; +import static com.viewsh.framework.common.util.collection.CollectionUtils.convertList; + +@Tag(name = "管理后台 - 用户") +@RestController +@RequestMapping("/system/user") +@Validated +public class UserController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + @Resource + private FileApi fileApi; + + @PostMapping("/create") + @Operation(summary = "新增用户") + @PreAuthorize("@ss.hasPermission('system:user:create')") + public CommonResult createUser(@Valid @RequestBody UserSaveReqVO reqVO) { + Long id = userService.createUser(reqVO); + return success(id); + } + + @PutMapping("update") + @Operation(summary = "修改用户") + @PreAuthorize("@ss.hasPermission('system:user:update')") + public CommonResult updateUser(@Valid @RequestBody UserSaveReqVO reqVO) { + userService.updateUser(reqVO); + return success(true); + } + + @DeleteMapping("/delete") + @Operation(summary = "删除用户") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:user:delete')") + public CommonResult deleteUser(@RequestParam("id") Long id) { + userService.deleteUser(id); + return success(true); + } + + @DeleteMapping("/delete-list") + @Parameter(name = "ids", description = "编号列表", required = true) + @Operation(summary = "批量删除用户") + @PreAuthorize("@ss.hasPermission('system:user:delete')") + public CommonResult deleteUserList(@RequestParam("ids") List ids) { + userService.deleteUserList(ids); + return success(true); + } + + @PutMapping("/update-password") + @Operation(summary = "重置用户密码") + @PreAuthorize("@ss.hasPermission('system:user:update-password')") + public CommonResult updateUserPassword(@Valid @RequestBody UserUpdatePasswordReqVO reqVO) { + userService.updateUserPassword(reqVO.getId(), reqVO.getPassword()); + return success(true); + } + + @PutMapping("/update-status") + @Operation(summary = "修改用户状态") + @PreAuthorize("@ss.hasPermission('system:user:update')") + public CommonResult updateUserStatus(@Valid @RequestBody UserUpdateStatusReqVO reqVO) { + userService.updateUserStatus(reqVO.getId(), reqVO.getStatus()); + return success(true); + } + + @GetMapping("/page") + @Operation(summary = "获得用户分页列表") + @PreAuthorize("@ss.hasPermission('system:user:query')") + public CommonResult> getUserPage(@Valid UserPageReqVO pageReqVO) { + // 获得用户分页列表 + PageResult pageResult = userService.getUserPage(pageReqVO); + if (CollUtil.isEmpty(pageResult.getList())) { + return success(new PageResult<>(pageResult.getTotal())); + } + // 拼接数据 + Map deptMap = deptService.getDeptMap( + convertList(pageResult.getList(), AdminUserDO::getDeptId)); + List userList = UserConvert.INSTANCE.convertList(pageResult.getList(), deptMap); + // 私有桶:对头像 URL 生成预签名访问地址 + userList.forEach(vo -> { + if (StrUtil.isNotEmpty(vo.getAvatar())) { + vo.setAvatar(fileApi.presignGetUrl(vo.getAvatar(), null).getCheckedData()); + } + }); + return success(new PageResult<>(userList, pageResult.getTotal())); + } + + @GetMapping({"/list-all-simple", "/simple-list"}) + @Operation(summary = "获取用户精简信息列表", description = "只包含被开启的用户,主要用于前端的下拉选项") + public CommonResult> getSimpleUserList() { + List list = userService.getUserListByStatus(CommonStatusEnum.ENABLE.getStatus()); + // 拼接数据 + Map deptMap = deptService.getDeptMap( + convertList(list, AdminUserDO::getDeptId)); + return success(UserConvert.INSTANCE.convertSimpleList(list, deptMap)); + } + + @GetMapping("/get") + @Operation(summary = "获得用户详情") + @Parameter(name = "id", description = "编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('system:user:query')") + public CommonResult getUser(@RequestParam("id") Long id) { + AdminUserDO user = userService.getUser(id); + if (user == null) { + return success(null); + } + // 拼接数据 + DeptDO dept = deptService.getDept(user.getDeptId()); + UserRespVO respVO = UserConvert.INSTANCE.convert(user, dept); + // 私有桶:对头像 URL 生成预签名访问地址 + if (StrUtil.isNotEmpty(respVO.getAvatar())) { + respVO.setAvatar(fileApi.presignGetUrl(respVO.getAvatar(), null).getCheckedData()); + } + return success(respVO); + } + + @GetMapping("/export-excel") + @Operation(summary = "导出用户") + @PreAuthorize("@ss.hasPermission('system:user:export')") + @ApiAccessLog(operateType = EXPORT) + public void exportUserList(@Validated UserPageReqVO exportReqVO, + HttpServletResponse response) throws IOException { + exportReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); + List list = userService.getUserPage(exportReqVO).getList(); + // 输出 Excel + Map deptMap = deptService.getDeptMap( + convertList(list, AdminUserDO::getDeptId)); + ExcelUtils.write(response, "用户数据.xls", "数据", UserRespVO.class, + UserConvert.INSTANCE.convertList(list, deptMap)); + } + + @GetMapping("/get-import-template") + @Operation(summary = "获得导入用户模板") + public void importTemplate(HttpServletResponse response) throws IOException { + // 手动创建导出 demo + List list = Arrays.asList( + UserImportExcelVO.builder().username("yunai").deptId(1L).email("yunai@iocoder.cn").mobile("15601691300") + .nickname("芋道").status(CommonStatusEnum.ENABLE.getStatus()).sex(SexEnum.MALE.getSex()).build(), + UserImportExcelVO.builder().username("yuanma").deptId(2L).email("yuanma@iocoder.cn").mobile("15601701300") + .nickname("源码").status(CommonStatusEnum.DISABLE.getStatus()).sex(SexEnum.FEMALE.getSex()).build() + ); + // 输出 + ExcelUtils.write(response, "用户导入模板.xls", "用户列表", UserImportExcelVO.class, list); + } + + @PostMapping("/import") + @Operation(summary = "导入用户") + @Parameters({ + @Parameter(name = "file", description = "Excel 文件", required = true), + @Parameter(name = "updateSupport", description = "是否支持更新,默认为 false", example = "true") + }) + @PreAuthorize("@ss.hasPermission('system:user:import')") + public CommonResult importExcel(@RequestParam("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + List list = ExcelUtils.read(file, UserImportExcelVO.class); + return success(userService.importUserList(list, updateSupport)); + } + +} diff --git a/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/user/UserProfileController.java b/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/user/UserProfileController.java index bbec6be..9069887 100644 --- a/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/user/UserProfileController.java +++ b/viewsh-module-system/viewsh-module-system-server/src/main/java/com/viewsh/module/system/controller/admin/user/UserProfileController.java @@ -1,79 +1,93 @@ -package com.viewsh.module.system.controller.admin.user; - -import cn.hutool.core.collection.CollUtil; -import com.viewsh.framework.common.pojo.CommonResult; -import com.viewsh.framework.datapermission.core.annotation.DataPermission; -import com.viewsh.module.system.controller.admin.user.vo.profile.UserProfileRespVO; -import com.viewsh.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; -import com.viewsh.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; -import com.viewsh.module.system.convert.user.UserConvert; -import com.viewsh.module.system.dal.dataobject.dept.DeptDO; -import com.viewsh.module.system.dal.dataobject.dept.PostDO; -import com.viewsh.module.system.dal.dataobject.permission.RoleDO; -import com.viewsh.module.system.dal.dataobject.user.AdminUserDO; -import com.viewsh.module.system.service.dept.DeptService; -import com.viewsh.module.system.service.dept.PostService; -import com.viewsh.module.system.service.permission.PermissionService; -import com.viewsh.module.system.service.permission.RoleService; -import com.viewsh.module.system.service.user.AdminUserService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import lombok.extern.slf4j.Slf4j; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -import static com.viewsh.framework.common.pojo.CommonResult.success; -import static com.viewsh.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; - -@Tag(name = "管理后台 - 用户个人中心") -@RestController -@RequestMapping("/system/user/profile") -@Validated -@Slf4j -public class UserProfileController { - - @Resource - private AdminUserService userService; - @Resource - private DeptService deptService; - @Resource - private PostService postService; - @Resource - private PermissionService permissionService; - @Resource - private RoleService roleService; - - @GetMapping("/get") - @Operation(summary = "获得登录用户信息") - @DataPermission(enable = false) // 关闭数据权限,避免只查看自己时,查询不到部门。 - public CommonResult getUserProfile() { - // 获得用户基本信息 - AdminUserDO user = userService.getUser(getLoginUserId()); - // 获得用户角色 - List userRoles = roleService.getRoleListFromCache(permissionService.getUserRoleIdListByUserId(user.getId())); - // 获得部门信息 - DeptDO dept = user.getDeptId() != null ? deptService.getDept(user.getDeptId()) : null; - // 获得岗位信息 - List posts = CollUtil.isNotEmpty(user.getPostIds()) ? postService.getPostList(user.getPostIds()) : null; - return success(UserConvert.INSTANCE.convert(user, userRoles, dept, posts)); - } - - @PutMapping("/update") - @Operation(summary = "修改用户个人信息") - public CommonResult updateUserProfile(@Valid @RequestBody UserProfileUpdateReqVO reqVO) { - userService.updateUserProfile(getLoginUserId(), reqVO); - return success(true); - } - - @PutMapping("/update-password") - @Operation(summary = "修改用户个人密码") - public CommonResult updateUserProfilePassword(@Valid @RequestBody UserProfileUpdatePasswordReqVO reqVO) { - userService.updateUserPassword(getLoginUserId(), reqVO); - return success(true); - } - -} +package com.viewsh.module.system.controller.admin.user; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; +import com.viewsh.framework.common.pojo.CommonResult; +import com.viewsh.framework.common.util.http.HttpUtils; +import com.viewsh.framework.datapermission.core.annotation.DataPermission; +import com.viewsh.module.infra.api.file.FileApi; +import com.viewsh.module.system.controller.admin.user.vo.profile.UserProfileRespVO; +import com.viewsh.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO; +import com.viewsh.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO; +import com.viewsh.module.system.convert.user.UserConvert; +import com.viewsh.module.system.dal.dataobject.dept.DeptDO; +import com.viewsh.module.system.dal.dataobject.dept.PostDO; +import com.viewsh.module.system.dal.dataobject.permission.RoleDO; +import com.viewsh.module.system.dal.dataobject.user.AdminUserDO; +import com.viewsh.module.system.service.dept.DeptService; +import com.viewsh.module.system.service.dept.PostService; +import com.viewsh.module.system.service.permission.PermissionService; +import com.viewsh.module.system.service.permission.RoleService; +import com.viewsh.module.system.service.user.AdminUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static com.viewsh.framework.common.pojo.CommonResult.success; +import static com.viewsh.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; + +@Tag(name = "管理后台 - 用户个人中心") +@RestController +@RequestMapping("/system/user/profile") +@Validated +@Slf4j +public class UserProfileController { + + @Resource + private AdminUserService userService; + @Resource + private DeptService deptService; + @Resource + private PostService postService; + @Resource + private PermissionService permissionService; + @Resource + private RoleService roleService; + @Resource + private FileApi fileApi; + + @GetMapping("/get") + @Operation(summary = "获得登录用户信息") + @DataPermission(enable = false) // 关闭数据权限,避免只查看自己时,查询不到部门。 + public CommonResult getUserProfile() { + // 获得用户基本信息 + AdminUserDO user = userService.getUser(getLoginUserId()); + // 获得用户角色 + List userRoles = roleService.getRoleListFromCache(permissionService.getUserRoleIdListByUserId(user.getId())); + // 获得部门信息 + DeptDO dept = user.getDeptId() != null ? deptService.getDept(user.getDeptId()) : null; + // 获得岗位信息 + List posts = CollUtil.isNotEmpty(user.getPostIds()) ? postService.getPostList(user.getPostIds()) : null; + UserProfileRespVO respVO = UserConvert.INSTANCE.convert(user, userRoles, dept, posts); + // 私有桶:对头像 URL 生成预签名访问地址 + if (StrUtil.isNotEmpty(respVO.getAvatar())) { + respVO.setAvatar(fileApi.presignGetUrl(respVO.getAvatar(), null).getCheckedData()); + } + return success(respVO); + } + + @PutMapping("/update") + @Operation(summary = "修改用户个人信息") + public CommonResult updateUserProfile(@Valid @RequestBody UserProfileUpdateReqVO reqVO) { + // 私有桶:移除头像 URL 的预签名 Query 参数,避免存储过期签名 + if (StrUtil.isNotEmpty(reqVO.getAvatar())) { + reqVO.setAvatar(HttpUtils.removeUrlQuery(reqVO.getAvatar())); + } + userService.updateUserProfile(getLoginUserId(), reqVO); + return success(true); + } + + @PutMapping("/update-password") + @Operation(summary = "修改用户个人密码") + public CommonResult updateUserProfilePassword(@Valid @RequestBody UserProfileUpdatePasswordReqVO reqVO) { + userService.updateUserPassword(getLoginUserId(), reqVO); + return success(true); + } + +}