package com.xuekairui.user.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xuekairui.common.Result;
import com.xuekairui.user.dto.AdminUserResponse;
import com.xuekairui.user.dto.UpdateRoleRequest;
import com.xuekairui.user.enums.OperationType;
import com.xuekairui.user.service.AdminUserService;
import com.xuekairui.user.service.OperationAuditLogService;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
* 运营用户管理接口(超级管理员)
*
* 用户角色管理:查询用户列表、修改用户角色。
* 仅 SUPER_ADMIN 可访问,由 SecurityConfig 控制。
*/
@RestController
@RequestMapping("/api/admin/users")
@RequiredArgsConstructor
public class AdminUserController {
private final AdminUserService adminUserService;
private final OperationAuditLogService auditLogService;
/**
* 分页查询用户列表(不支持删除操作)
* GET /api/admin/users?page=1&size=20&userId=1&phone=138&nickname=测试&role=ADMIN
*/
@GetMapping
public Result> listUsers(
@RequestParam(defaultValue = "1") Integer page,
@RequestParam(defaultValue = "20") Integer size,
@RequestParam(required = false) Long userId,
@RequestParam(required = false) String phone,
@RequestParam(required = false) String nickname,
@RequestParam(required = false) String role) {
return Result.success(adminUserService.listUsers(page, size, userId, phone, nickname, role));
}
/**
* 强制踢出用户(使所有Token失效,强制重新登录)
* POST /api/admin/users/{userId}/kick
*/
@PostMapping("/{userId}/kick")
public Result kickUser(
@PathVariable Long userId,
HttpServletRequest httpRequest) {
Long operatorId = (Long) httpRequest.getAttribute("userId");
String operatorRole = getOperatorRole(httpRequest);
adminUserService.kickUser(userId, operatorId);
auditLogService.logSuccess(operatorId, "管理员", operatorRole,
OperationType.USER_UPDATE, "USER_KICK:" + userId, userId);
return Result.success("用户已被强制退出,下次请求将返回1304");
}
/**
* 修改用户角色(仅超级管理员)
* PUT /api/admin/users/{userId}/role
*/
@PutMapping("/{userId}/role")
public Result updateUserRole(
@PathVariable Long userId,
@Valid @RequestBody UpdateRoleRequest request,
HttpServletRequest httpRequest) {
Long operatorId = (Long) httpRequest.getAttribute("userId");
String operatorRole = getOperatorRole(httpRequest);
AdminUserResponse response = adminUserService.updateUserRole(userId, request, operatorId);
auditLogService.logSuccess(operatorId, "管理员", operatorRole,
OperationType.USER_UPDATE, "USER_ROLE:" + userId + "->" + request.getRole(), userId);
return Result.success(response);
}
private String getOperatorRole(HttpServletRequest request) {
String role = (String) request.getAttribute("role");
return role != null ? role : "ADMIN";
}
}