package com.aijiuyi.admin.controller; import com.aijiuyi.admin.common.annotation.Log; import com.aijiuyi.admin.common.annotation.NoAuth; import com.aijiuyi.admin.common.context.RequestContext; import com.aijiuyi.admin.common.entity.Result; import com.aijiuyi.admin.common.enums.OperationType; import com.aijiuyi.admin.entity.AdminUser; import com.aijiuyi.admin.controller.dto.LoginDTO; import com.aijiuyi.admin.service.AdminService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.util.HashMap; import java.util.Map; import org.springframework.util.DigestUtils; import org.springframework.util.StringUtils; /** * 认证管理 Controller * 提供管理员登录、退出、获取当前用户信息接口 * 使用独立的 admin_user 表进行身份验证 */ @RestController @RequestMapping("/auth") public class AuthController { @Autowired private AdminService adminService; /** * 管理员登录接口 * 免鉴权(使用 @NoAuth 注解跳过 Token 验证) * * @param loginDTO 登录参数(用户名、密码) * @return 包含 token 和用户信息的 Result */ @PostMapping("/login") @NoAuth @Log(value = "管理员登录", module = "认证管理", operationType = OperationType.OTHER) public Result> login(@RequestBody @Valid LoginDTO loginDTO) { return adminService.login(loginDTO); } /** * 管理员退出登录 * 删除 Redis 中的 Token,使当前 Token 立即失效 * * @param request HTTP 请求(用于获取 Authorization 头中的 Token) * @return 操作结果 */ @PostMapping("/logout") @Log(value = "管理员退出", module = "认证管理", operationType = OperationType.OTHER) public Result logout(HttpServletRequest request) { String token = request.getHeader("Authorization"); adminService.logout(token); return Result.success(); } /** * 获取当前登录管理员信息(含权限路由列表) * * @return 管理员信息 + permissions 权限路由列表 */ @GetMapping("/info") @Log(value = "获取当前用户信息", module = "认证管理", operationType = OperationType.QUERY) public Result> getUserInfo() { Long userId = RequestContext.getUserId(); AdminUser admin = adminService.getById(userId); // 查询权限路由列表(超级管理员返回 null,前端视为全部权限) String permissions = adminService.getPermissions(userId); Map data = new HashMap<>(8); data.put("userId", admin != null ? admin.getId() : null); data.put("username", admin != null ? admin.getUsername() : null); data.put("nickname", admin != null ? admin.getNickname() : null); data.put("avatar", admin != null ? admin.getAvatar() : null); data.put("phone", admin != null ? admin.getPhone() : null); data.put("userType", 3); data.put("adminRole", admin != null ? admin.getAdminRole() : null); data.put("permissions", permissions); return Result.success(data); } /** * 更新当前管理员个人信息(昵称、手机、头像、密码) * * @param payload 请求体(nickname/phone/avatar/password/oldPassword) * @return 操作结果 */ @PutMapping("/profile") @Log(value = "更新个人信息", module = "认证管理", operationType = OperationType.UPDATE) public Result updateProfile(@RequestBody Map payload, HttpServletRequest request) { Long userId = RequestContext.getUserId(); AdminUser admin = adminService.getById(userId); if (admin == null) { return Result.error("用户不存在"); } // 如果修改密码,验证旧密码 String newPassword = payload.get("password"); String oldPassword = payload.get("oldPassword"); if (StringUtils.hasText(newPassword)) { if (!StringUtils.hasText(oldPassword)) { return Result.error("请输入旧密码"); } String oldPasswordMd5 = DigestUtils.md5DigestAsHex(oldPassword.getBytes()); if (!oldPasswordMd5.equals(admin.getPassword())) { return Result.error("旧密码不正确"); } } // 如果修改了手机号,校验唯一性 String newPhone = payload.get("phone"); if (StringUtils.hasText(newPhone) && !newPhone.equals(admin.getPhone())) { long phoneCount = adminService.lambdaQuery() .eq(AdminUser::getPhone, newPhone) .ne(AdminUser::getId, userId) .count(); if (phoneCount > 0) { return Result.error("该手机号已注册,请更换手机号"); } } AdminUser update = new AdminUser(); update.setId(userId); if (payload.containsKey("nickname")) { update.setNickname(payload.get("nickname")); } if (payload.containsKey("phone")) { update.setPhone(payload.get("phone")); } if (payload.containsKey("avatar")) { update.setAvatar(payload.get("avatar")); } if (StringUtils.hasText(newPassword)) { update.setPassword(DigestUtils.md5DigestAsHex(newPassword.getBytes())); } adminService.updateById(update); // 修改密码后,使当前 Token 失效,强制重新登录 if (StringUtils.hasText(newPassword)) { String token = request.getHeader("Authorization"); adminService.logout(token); } return Result.success(); } }