package com.hxzk.gps.controller.User;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hxzk.gps.controller.User.Results.MenuListResult;
import com.hxzk.gps.controller.User.Results.UserTreeTableDto;
import com.hxzk.gps.controller.User.Results.UserResult;
import com.hxzk.gps.entity.Role.Role;
import com.hxzk.gps.entity.User.TbUser;
import com.hxzk.gps.entity.User.dto.LoginResult;
import com.hxzk.gps.service.Role.IRoleService;
import com.hxzk.gps.service.User.TbUserService;
import com.hxzk.gps.util.GetUser.UserInfoUtil;
import com.hxzk.gps.util.MessageUtils.MessageUtils;
import com.hxzk.gps.util.Result.ReturnMessage;
import com.hxzk.gps.util.SMS.TenSMS;
import com.hxzk.gps.util.Time.TimeUtil;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.hxzk.gps.util.AES.AES.encrypt;
/**
*
* 前端控制器
* 用户管理
*
*
* @author YuZhiTong
* @since 2025-04-17
*/
@RestController
@RequestMapping("/User")
@Api(tags="用户管理")
public class TbUserController {
@Autowired
private TbUserService tbUserService;
@Autowired
IRoleService roleService;
// 登录
Map UserSmsMap = new HashMap<>();
@ApiOperation(value = "用户密码登录接口", notes = "该接口用于用户登录系统,接收用户名和密码作为参数,返回加密Token信息")
@PostMapping("/Login")
public LoginResult Login(@RequestBody TbUser user, HttpServletRequest request) {
String clientIp = getClientIp(request);
return tbUserService.Login(user.getUsername(),user.getPassword(),user.getStatus(),clientIp);
}
@ApiOperation(value = "用户手机号登录接口", notes = "该接口用于用户登录系统,接收用户名和密码作为参数,返回加密Token信息")
@PostMapping("/phoneLogin")
public LoginResult phoneLogin(@RequestBody TbUser user, HttpServletRequest request) {
String clientIp = getClientIp(request);
String code = UserSmsMap.get(user.getPhone());
if (code.equals(user.getPassword())){
//登录成功
unfreezeUser(user);
return tbUserService.phoneLogin(user.getPhone(),clientIp);
}else{
return new LoginResult(201, MessageUtils.getMessage("LoginSmSError"), "000");
}
}
@RequestMapping("GetToken")
public TbUser GetToken(@RequestBody TbUser user) throws Exception {
TbUser user1 = new TbUser();
user1.setUsername(encrypt(user.getUsername()));
user1.setPassword(encrypt(user.getPassword()));
return user1;
}
@ApiOperation(value = "用户冻结接口", notes = "该接口用于用户冻结")
@PostMapping("/freezeUser")
public boolean freezeUser(@RequestBody TbUser user) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username",user.getUsername());
user.setStatus("1");
return tbUserService.update(user,queryWrapper);
}
@ApiOperation(value = "用户解冻接口", notes = "该接口用于用户冻结")
@PostMapping("/unfreezeUser")
public boolean unfreezeUser(@RequestBody TbUser user) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username",user.getUsername());
user.setStatus("0");
return tbUserService.update(user,queryWrapper);
}
@ApiOperation(value = "检查登录接口", notes = "该接口用于检查用户是否还在登录状态,返回布尔值表示是否登录")
@RequestMapping("isLogin")
public boolean isLogin(){
return StpUtil.isLogin();
}
@ApiOperation(value = "用户菜单接口", notes = "该接口用于展示用户导航菜单信息")
@SaCheckLogin
@RequestMapping("MenuList")
public MenuListResult MenuList(){
return tbUserService.UserMenu();
}
@SaCheckLogin
@ApiOperation(value = "平台用户列表接口", notes = "该接口提供了平台用户的信息查询功能")
@PostMapping("FindUserInfo")
public UserResult FindUserInfo(@RequestBody UserTreeTableDto userTreeTableDto){
return tbUserService.FindUserInfo(userTreeTableDto);
}
@SaCheckLogin
@ApiOperation(value = "平台导航菜单列表接口", notes = "该接口提供了平台导航菜单列表信息")
@PostMapping("Menu/All")
public MenuListResult MenuAll(){
return tbUserService.MenuAll();
}
@PostMapping("/sendSmsApi")
public ReturnMessage SendMsage(@RequestBody TbUser user) throws TencentCloudSDKException {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("phone",user.getPhone());
Integer result = Math.toIntExact(tbUserService.getBaseMapper().selectCount(queryWrapper));
if (result >= 1){
//发送短信
TenSMS tenSMS = new TenSMS();
String code = generateVerificationCode();
tenSMS.sms(user.getPhone(),code);
UserSmsMap.put(user.getPhone(),code);
return ReturnMessage.ReturnMessageSuccess("SmsSuccess");
}else{
return ReturnMessage.ReturnMessageError("PhoneError");
}
}
@PostMapping("/SendWarning")
public ReturnMessage SendWarning(@RequestBody TbUser user) throws TencentCloudSDKException {
TenSMS tenSMS = new TenSMS();
tenSMS.smsWarning(user.getPhone(), user.getStatus());
return ReturnMessage.ReturnMessageSuccess("SmsSuccess");
}
@SaCheckLogin
@ApiOperation(value = "平台用户退出接口", notes = "该接口提供了平台用户退出")
@PostMapping("logout")
public String logout(){
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username",UserInfoUtil.getUserName());
TbUser user = new TbUser();
user.setStatus("0");
user.setUsername(UserInfoUtil.getUserName());
tbUserService.getBaseMapper().update(user,queryWrapper);
StpUtil.logout();
return "已退出";
}
@SaCheckLogin
@ApiOperation(value = "平台用户添加接口", notes = "该接口提供了平台用户添加功能")
@PostMapping("add")
public ReturnMessage add(@RequestBody TbUser user){
return tbUserService.add(user);
}
@SaCheckLogin
@ApiOperation(value = "平台用户修改接口", notes = "该接口提供了平台用户修改功能")
@PostMapping("update")
public ReturnMessage update(@RequestBody TbUser user){
return tbUserService.update(user);
}
@SaCheckLogin
@ApiOperation(value = "平台用户删除接口", notes = "该接口提供了平台用户删除功能")
@PostMapping("delete")
public ReturnMessage delete(@RequestBody TbUser user){
return tbUserService.delete(user);
}
@SaCheckLogin
@ApiOperation(value = "平台获取用户名称接口", notes = "该接口提供了平台获取用户名称功能")
@PostMapping("FindUserName")
public TbUser FindUserName(){
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username",UserInfoUtil.getUserName());
TbUser user = tbUserService.getBaseMapper().selectOne(queryWrapper);
return user;
}
@SaCheckLogin
@ApiOperation(value = "平台用户权限接口", notes = "该接口提供了平台用户权限查询功能")
@GetMapping("buttons")
public Map loginTest1(){
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", UserInfoUtil.getUserName());
TbUser user1 = tbUserService.getBaseMapper().selectOne(queryWrapper);
QueryWrapper queryWrapper1 = new QueryWrapper<>();
queryWrapper1.eq("id",user1.getJueseid());
Role role = roleService.getBaseMapper().selectOne(queryWrapper1);
List user = new ArrayList<>();
if (role.isAddrole()){
user.add("add");
}
if (role.isEditrole()){
user.add("edit");
}
if (role.isDeleterole()){
user.add("delete");
}
// 创建权限数据对象
Map> data = new HashMap<>();
data.put("role", user);
// 创建响应对象
Map map = new HashMap<>();
map.put("code", 200);
map.put("data", data);
return map;
}
private String getClientIp(HttpServletRequest request) {
String xffHeader = request.getHeader("X-Forwarded-For");
if (xffHeader == null || xffHeader.isEmpty() || "unknown".equalsIgnoreCase(xffHeader)) {
// 如果 X-Forwarded-For 头不存在或者无效,则尝试从其他常见的头获取
String proxyClientIp = request.getHeader("Proxy-Client-IP");
if (proxyClientIp != null && !proxyClientIp.isEmpty() && !"unknown".equalsIgnoreCase(proxyClientIp)) {
return proxyClientIp;
}
String wlProxyClientIp = request.getHeader("WL-Proxy-Client-IP");
if (wlProxyClientIp != null && !wlProxyClientIp.isEmpty() && !"unknown".equalsIgnoreCase(wlProxyClientIp)) {
return wlProxyClientIp;
}
// 若都没有,直接使用 request.getRemoteAddr()
return request.getRemoteAddr();
} else {
// X-Forwarded-For 头存在,取第一个 IP 地址
int index = xffHeader.indexOf(',');
if (index != -1) {
return xffHeader.substring(0, index);
} else {
return xffHeader;
}
}
}
/*
* 生成六位数随机验证码
* */
public static String generateVerificationCode() {
// 生成 0 到 999999 之间的随机整数
int randomNum = (int) (Math.random() * 1000000);
// 将随机整数格式化为 6 位字符串,不足 6 位时前面补 0
return String.format("%06d", randomNum);
}
}