package vvpkassistant.User.controller; import cn.dev33.satoken.stp.StpUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import vvpkassistant.CoinRecords.CoinRecords; import vvpkassistant.CoinRecords.CoinRecordsDao; import vvpkassistant.Data.ResponseData; import vvpkassistant.Data.ResponseInfo; import vvpkassistant.Data.WxChatParam; import vvpkassistant.User.mapper.UserDao; import vvpkassistant.User.model.DTO.UserModelDTO; import vvpkassistant.User.model.UserModel; import vvpkassistant.User.model.UserModelVO; import vvpkassistant.User.service.UserService; import vvpkassistant.common.ErrorCode; import vvpkassistant.config.FunctionConfigHolder; import vvpkassistant.Tools.VVRequester; import vvpkassistant.Tools.VVTools; import vvpkassistant.exception.BusinessException; import vvpkassistant.mail.model.MailModel; import vvpkassistant.mail.service.MailService; import vvpkassistant.pk.mapper.PkInfoDao; import vvpkassistant.pk.model.PkInfoModel; import vvpkassistant.pk.model.PkRecordDetail; import vvpkassistant.pk.mapper.PkRecordDetailDao; import javax.annotation.Resource; import java.util.HashMap; import java.util.List; import java.util.Map; @RestController @RequestMapping("user") public class UserController { @Autowired private UserDao userDao; @Autowired private PkInfoDao pkInfoDao; @Autowired private PkRecordDetailDao detailDao; @Autowired private CoinRecordsDao coinRecordsDao; @Autowired private WxChatParam wxChatParam; @Autowired private VVRequester vvRequester; @Resource private UserService userService; @Resource private MailService mailService; // 配置用户信息 @PostMapping("inputUserInfo") public ResponseData inputUserInfo(@RequestBody Map param) { if (!param.containsKey("code")) { throw new BusinessException(ErrorCode.PARAMS_ERROR,"code不能为空"); } if (!param.containsKey("id")) { throw new BusinessException(ErrorCode.PARAMS_ERROR,"id不能为空"); } //获取前端传递过来的code String code = param.get("code").toString(); // 调用微信获取openid接口 Map wx_result = vvRequester.loginApp(code); // 错误处理 if (wx_result.containsKey("errcode")) { Integer errcode = Integer.valueOf(wx_result.get("errcode").toString()); if (errcode == 45011) { throw new BusinessException(ErrorCode.WX_API_CALL_TOO_FREQUENT); } if (errcode == 40029) { throw new BusinessException(ErrorCode.WX_INVALID_JSCODE); } if (errcode == 40226) { throw new BusinessException(ErrorCode.WX_RISK_ACCOUNT); } if (errcode == -1) { throw new BusinessException(ErrorCode.WX_SYSTEM_BUSY); } if (!wx_result.containsKey("openid")) { throw new BusinessException(ErrorCode.WX_GET_USER_INFO_FAILED); } } //查询用户 String openId = wx_result.get("openid").toString(); String sessionKey = wx_result.get("session_key").toString(); // 创建一个临时model UserModel tempModel = new UserModel(); tempModel.setId(Integer.valueOf(param.get("id").toString())); tempModel.setOpenid(openId); tempModel.setHeaderIcon(param.get("headerIcon").toString()); tempModel.setNickName(param.get("nickName").toString()); tempModel.setSessionKey(sessionKey); tempModel.setUserChatId(openId); int i = userDao.updateById(tempModel); if (i == 1) { // String usersig = param.get("usersig").toString(); // // 注册聊天账号 // Integer createAccountResult = vvRequester.createChatAccount(tempModel, usersig); // if (createAccountResult != 0) { // return ResponseData.error(ResponseInfo.ERROR,"创建聊天账号失败,请稍后再试"); // } Map result = new HashMap<>(); result.put("info", tempModel); result.put("newAccount",false); //否则直接返回用户 return ResponseData.success(result); } throw new BusinessException(ErrorCode.SYSTEM_ERROR); } // 手机号登录 / 注册 @PostMapping("loginWithPhoneNumber") public ResponseData loginWithPhoneNumber(@RequestBody Map param) { if (!param.containsKey("code")) { throw new BusinessException(ErrorCode.PARAMS_ERROR,"code不能为空"); } String code = param.get("code").toString(); String phoneNumber = vvRequester.queryPhoneNumber(code); if (phoneNumber.isEmpty()) { throw new BusinessException(ErrorCode.PARAMS_ERROR,"手机号码无法查询"); } // 查询是否存在用户。如果用户存在直接返回 如果用户不存在则新建用户 UserModel model = userDao.queryWithPhoneNumber(phoneNumber); Map result = new HashMap<>(); if (model != null) { // 老用户 result.put("info",model); result.put("newAccount", false); result.put("chatInfo",wxChatParam); return ResponseData.success(result); }else{ // 新用户 UserModel tempModel = new UserModel(); tempModel.setPhoneNumber(phoneNumber); tempModel.setCreateTime(VVTools.currentTimeStamp()); //设置状态为正常 tempModel.setStatus(0); //设置积分为0 tempModel.setPoints(0); userDao.insert(tempModel); // 判断用户是否为邀请用户 if (param.containsKey("inviterId")) { int inviterId = (int) param.get("inviterId"); // 查询用户增加积分 UserModel oldUser = userDao.selectById(inviterId); oldUser.setPoints(oldUser.getPoints() + 10); userDao.updateById(oldUser); } result.put("info",tempModel); result.put("newAccount",true); result.put("chatInfo",wxChatParam); return ResponseData.success(result); } } // 修改用户信息 @PostMapping("updateUserInfo") public ResponseData updateUserInfo(@RequestBody UserModelDTO userModelDTO) { UserModelVO userModelVO = userService.updateUserInfo( userModelDTO); return ResponseData.success(userModelVO); } // 获取用户信息 @PostMapping("getUserInfo") public ResponseData getUserInfo(@RequestBody Map map) { UserModel userModel = userDao.selectById(map.get("id")); return ResponseData.success(userModel); } // 查询用户所有pk数据 @PostMapping("queryMyAllPkData") public ResponseData queryMyAllPkData(@RequestBody Map map) { Integer userId = map.get("userId"); Integer page = map.get("page"); Integer size = map.get("size"); List pkInfoModels = pkInfoDao.queryAllPkData(userId, page * size, size); long currentTimeStamp = VVTools.currentTimeStamp(); // 查找置顶的数据 for (PkInfoModel pkInfoModel : pkInfoModels) { pkInfoModel.setIsPin(pkInfoModel.getPinExpireTime() > currentTimeStamp); } return ResponseData.success(pkInfoModels); } // 查询我的pk记录 列表 @PostMapping("handlePkInfo") public ResponseData handlePkInfo(@RequestBody Map map) { Integer type = map.get("type"); Integer id = map.get("userId"); Integer page = map.get("page"); Integer size = map.get("size"); // 我发起的pk数据 if (type == 1) { return ResponseData.success(userDao.findCreatedPk(id, page * size, size)); }else if (type == 2){ // 别人邀请我的pk数据 return ResponseData.success(userDao.getMyGuestPkList(id, page * size, size)); } throw new BusinessException(ErrorCode.SYSTEM_ERROR); } // 查詢单条pk记录详情 @PostMapping("pkRecordDetail") public ResponseData pkRecordDetail(@RequestBody Map map) { Integer id = map.get("id"); List pkRecordDetails = detailDao.queryDetail(id); return ResponseData.success(pkRecordDetails); } // 签到 @PostMapping("signIn") public ResponseData signIn(@RequestBody Map map) { Integer userId = map.get("userId"); int i = userDao.checkSignStatus(userId); if (i != 0) { throw new BusinessException(ErrorCode.SIGN_IN_FAIL); } int result = userDao.signIn(userId); UserModel userModel = userDao.selectById(userId); int count = Integer.parseInt(FunctionConfigHolder.getValue("签到增加积分")); // 增加积分 userModel.setPoints(userModel.getPoints() + count); // 入库 userDao.updateById(userModel); if (result == 1) { // 增加记录 CoinRecords coinRecords = new CoinRecords("签到增加积分",userId,count, (int) VVTools.currentTimeStamp(),1); coinRecordsDao.insert(coinRecords); return ResponseData.success(null); }else { throw new BusinessException(ErrorCode.SYSTEM_ERROR,"签到失败"); } } // 查询用户当天签到状态 @GetMapping("checkSignStatus") public ResponseData checkSignStatus(Integer userId) { int i = userDao.checkSignStatus(userId); return i == 0 ? ResponseData.success(true) : ResponseData.success(false); } // 置顶文章 @PostMapping("pinToTop") public ResponseData pinToTop(@RequestBody Map map) { // 文章id Integer articleId = map.get("articleId"); PkInfoModel pkInfoModel = pkInfoDao.selectById(articleId); Integer userId = pkInfoModel.getSenderId(); // 到期时间戳 Integer pinExpireTime = map.get("pinExpireTime"); long currentTimeStamp = VVTools.currentTimeStamp(); long hour = VVTools.calculateHoursRound(pinExpireTime, currentTimeStamp); String coin = FunctionConfigHolder.getValue("置顶扣除积分"); int totalCoin = (int) (Integer.parseInt(coin) * hour); UserModel userModel = userDao.selectById(userId); if (userModel != null) { // 扣除积分 更新数据 Integer points = userModel.getPoints(); if (points - totalCoin > 0) { userModel.setPoints(userModel.getPoints() - totalCoin); userDao.updateById(userModel); // 设置置顶到期时间 pkInfoModel.setPinExpireTime(pinExpireTime); // 设置创建置顶的时间 pkInfoModel.setPinCreateTime((int) VVTools.currentTimeStamp()); // 更新pk文章数据 int i = pkInfoDao.updateById(pkInfoModel); if (i == 1) { String info = String.format("置顶成功,扣除%d积分",totalCoin); // 增加积分变动记录 CoinRecords coinRecords = new CoinRecords("置顶扣除积分",userId,totalCoin, (int) VVTools.currentTimeStamp(),0); coinRecordsDao.insert(coinRecords); // 返回给前端数据 return ResponseData.success(info); }else { throw new BusinessException(ErrorCode.SYSTEM_ERROR); } }else { throw new BusinessException(ErrorCode.SYSTEM_ERROR,String.format("积分不足,需要%d积分",totalCoin)); } }else { throw new BusinessException(ErrorCode.SYSTEM_ERROR,"用户不存在"); } } // 取消置顶 @PostMapping("cancelPin") public ResponseData cancelPin(@RequestBody Map map) { Integer articleId = map.get("articleId"); PkInfoModel pkInfoModel = pkInfoDao.selectById(articleId); Integer pinExpireTime = pkInfoModel.getPinExpireTime(); long hour = VVTools.calculateHoursFloor(pinExpireTime, VVTools.currentTimeStamp()); String coin = FunctionConfigHolder.getValue("置顶扣除积分"); // 计算总积分。用于返还给用户 int totalCoin = (int) (Integer.parseInt(coin) * hour); // 获取用户对象 UserModel userModel = userDao.selectById(pkInfoModel.getSenderId()); Integer points = userModel.getPoints(); // 返还用户积分 userModel.setPoints(points + totalCoin); // 更新数据库 userDao.updateById(userModel); // 重置置顶时间 pkInfoModel.setPinExpireTime(0); pkInfoModel.setPinCreateTime(0); int i = pkInfoDao.updateById(pkInfoModel); if (i == 1) { // 添加积分更变相关记录 CoinRecords coinRecords = new CoinRecords("取消置顶返还积分",pkInfoModel.getSenderId(),totalCoin, (int) VVTools.currentTimeStamp(),1); coinRecordsDao.insert(coinRecords); return ResponseData.success(String.format("操作成功,返还%d积分",totalCoin)); }else { return ResponseData.error(ResponseInfo.ERROR.getCode(),null); } } // 获取积分明细 @PostMapping("pointsDetail") public ResponseData pointsDetail(@RequestBody Map map) { Integer userId = map.get("userId"); Integer page = map.get("page"); Integer size = map.get("size"); List coinRecords = coinRecordsDao.fetchMyPointsData(userId, page * size, size); return ResponseData.success(coinRecords); } @PostMapping("/loginWithMail") public ResponseData loginWithMail(@RequestBody UserModelDTO model) { return ResponseData.success(userService.loginWithMail(model)); } @PostMapping("/registerWithMail") public ResponseData mailRegister(@RequestBody UserModelDTO model){ return ResponseData.success(userService.addUserWithMail(model)); } @GetMapping("/activateAccount") public ResponseData activateAccount(@RequestParam("token") String token){ return ResponseData.success(userService.activateAccount(token)); } @PostMapping("/resendMail") public ResponseData resendMail(@RequestBody UserModelDTO userModelDTO){ return ResponseData.success(mailService.resendMail(userModelDTO)); } @GetMapping("/verificationMail") public ResponseData verificationMail(@RequestParam("token") String token){ return ResponseData.success(userService.verificationMail(token)); } }