创建仓库
This commit is contained in:
363
src/main/java/vvpkassistant/User/UserController.java
Normal file
363
src/main/java/vvpkassistant/User/UserController.java
Normal file
@@ -0,0 +1,363 @@
|
||||
package vvpkassistant.User;
|
||||
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.FunctionConfig.FunctionConfigHolder;
|
||||
import vvpkassistant.Tools.VVRequester;
|
||||
import vvpkassistant.Tools.VVTools;
|
||||
import vvpkassistant.pk.PkInfoDao;
|
||||
import vvpkassistant.pk.PkInfoModel;
|
||||
import vvpkassistant.pk.PkRecordDetail;
|
||||
import vvpkassistant.pk.PkRecordDetailDao;
|
||||
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;
|
||||
|
||||
// 配置用户信息
|
||||
@PostMapping("inputUserInfo")
|
||||
public ResponseData<Object> inputUserInfo(@RequestBody Map<String,Object> param) {
|
||||
|
||||
if (!param.containsKey("code")) {
|
||||
return ResponseData.error(ResponseInfo.ERROR, "code不能为空");
|
||||
}
|
||||
|
||||
if (!param.containsKey("id")) {
|
||||
return ResponseData.error(ResponseInfo.ERROR, "id不能为空");
|
||||
}
|
||||
|
||||
//获取前端传递过来的code
|
||||
String code = param.get("code").toString();
|
||||
|
||||
// 调用微信获取openid接口
|
||||
Map<String, Object> wx_result = vvRequester.loginApp(code);
|
||||
|
||||
// 错误处理
|
||||
if (wx_result.containsKey("errcode")) {
|
||||
Integer errcode = Integer.valueOf(wx_result.get("errcode").toString());
|
||||
|
||||
if (errcode == 45011) {
|
||||
return ResponseData.error(ResponseInfo.ERROR, "API 调用太频繁,请稍候再试。");
|
||||
}
|
||||
|
||||
if (errcode == 40029) {
|
||||
return ResponseData.error(ResponseInfo.ERROR, "js_code 无效");
|
||||
}
|
||||
|
||||
if (errcode == 40226) {
|
||||
return ResponseData.error(ResponseInfo.ERROR, "该账号为风险用户。禁止登录小程序");
|
||||
}
|
||||
|
||||
if (errcode == -1) {
|
||||
return ResponseData.error(ResponseInfo.ERROR, "系统繁忙");
|
||||
}
|
||||
|
||||
if (!wx_result.containsKey("openid")) {
|
||||
return ResponseData.error(ResponseInfo.ERROR, "获取用户信息失败,请稍后再试。");
|
||||
}
|
||||
}
|
||||
|
||||
//查询用户
|
||||
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<String,Object> result = new HashMap<>();
|
||||
result.put("info", tempModel);
|
||||
result.put("newAccount",false);
|
||||
//否则直接返回用户
|
||||
return ResponseData.success(result);
|
||||
}
|
||||
|
||||
return ResponseData.error(ResponseInfo.ERROR,"未知错误");
|
||||
}
|
||||
|
||||
// 手机号登录 / 注册
|
||||
@PostMapping("loginWithPhoneNumber")
|
||||
public ResponseData<Object> loginWithPhoneNumber(@RequestBody Map<String,Object> param) {
|
||||
|
||||
if (!param.containsKey("code")) {
|
||||
return ResponseData.error(ResponseInfo.ERROR,"code不能为空");
|
||||
}
|
||||
|
||||
String code = param.get("code").toString();
|
||||
String phoneNumber = vvRequester.queryPhoneNumber(code);
|
||||
|
||||
if (phoneNumber.isEmpty()) {
|
||||
return ResponseData.error(ResponseInfo.ERROR,"手机号码无法查询");
|
||||
}
|
||||
|
||||
// 查询是否存在用户。如果用户存在直接返回 如果用户不存在则新建用户
|
||||
UserModel model = userDao.queryWithPhoneNumber(phoneNumber);
|
||||
Map<String,Object> 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<Object> updateUserInfo(@RequestBody Map<String,Object> map) {
|
||||
UserModel userModel = new UserModel();
|
||||
//设置用户id
|
||||
userModel.setId(Integer.valueOf(map.get("id").toString()));
|
||||
//设置用户头像
|
||||
userModel.setHeaderIcon(map.get("headerIcon").toString());
|
||||
//设置用户昵称
|
||||
userModel.setNickName(map.get("nickName").toString());
|
||||
|
||||
int i = userDao.updateById(userModel);
|
||||
// 返回结果
|
||||
Map<String,Object> result = new HashMap<>();
|
||||
result.put("info", userDao.selectById(map.get("id").toString()));
|
||||
result.put("newAccount", false);
|
||||
return i == 1 ? ResponseData.success(result) : ResponseData.error(ResponseInfo.ERROR, "");
|
||||
}
|
||||
|
||||
// 获取用户信息
|
||||
@PostMapping("getUserInfo")
|
||||
public ResponseData<Object> getUserInfo(@RequestBody Map<String,Integer> map) {
|
||||
UserModel userModel = userDao.selectById(map.get("id"));
|
||||
return ResponseData.success(userModel);
|
||||
}
|
||||
|
||||
// 查询用户所有pk数据
|
||||
@PostMapping("queryMyAllPkData")
|
||||
public ResponseData<Object> queryMyAllPkData(@RequestBody Map<String,Integer> map) {
|
||||
Integer userId = map.get("userId");
|
||||
Integer page = map.get("page");
|
||||
Integer size = map.get("size");
|
||||
List<PkInfoModel> 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<Object> handlePkInfo(@RequestBody Map<String,Integer> 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));
|
||||
}
|
||||
return ResponseData.error(ResponseInfo.ERROR,"未知错误");
|
||||
}
|
||||
|
||||
|
||||
// 查詢单条pk记录详情
|
||||
@PostMapping("pkRecordDetail")
|
||||
public ResponseData<Object> pkRecordDetail(@RequestBody Map<String,Integer> map) {
|
||||
Integer id = map.get("id");
|
||||
List<PkRecordDetail> pkRecordDetails = detailDao.queryDetail(id);
|
||||
return ResponseData.success(pkRecordDetails);
|
||||
}
|
||||
|
||||
// 签到
|
||||
@PostMapping("signIn")
|
||||
public ResponseData<Object> signIn(@RequestBody Map<String,Integer> map) {
|
||||
Integer userId = map.get("userId");
|
||||
int i = userDao.checkSignStatus(userId);
|
||||
if (i != 0) {
|
||||
return ResponseData.error(ResponseInfo.ERROR,"当天已签到");
|
||||
}
|
||||
|
||||
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 {
|
||||
return ResponseData.error(ResponseInfo.ERROR,null);
|
||||
}
|
||||
}
|
||||
|
||||
// 查询用户当天签到状态
|
||||
@GetMapping("checkSignStatus")
|
||||
public ResponseData<Object> checkSignStatus(Integer userId) {
|
||||
int i = userDao.checkSignStatus(userId);
|
||||
return i == 0 ? ResponseData.success(true) : ResponseData.success(false);
|
||||
}
|
||||
|
||||
// 置顶文章
|
||||
@PostMapping("pinToTop")
|
||||
public ResponseData<Object> pinToTop(@RequestBody Map<String,Integer> 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 {
|
||||
return ResponseData.error(ResponseInfo.ERROR,null);
|
||||
}
|
||||
}else {
|
||||
return ResponseData.error(ResponseInfo.ERROR,String.format("积分不足,需要%d积分",totalCoin));
|
||||
}
|
||||
}else {
|
||||
return ResponseData.error(ResponseInfo.ERROR,"用户不存在");
|
||||
}
|
||||
}
|
||||
|
||||
// 取消置顶
|
||||
@PostMapping("cancelPin")
|
||||
public ResponseData<Object> cancelPin(@RequestBody Map<String,Integer> 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,null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 获取积分明细
|
||||
@PostMapping("pointsDetail")
|
||||
public ResponseData<Object> pointsDetail(@RequestBody Map<String,Integer> map) {
|
||||
Integer userId = map.get("userId");
|
||||
Integer page = map.get("page");
|
||||
Integer size = map.get("size");
|
||||
List<CoinRecords> coinRecords = coinRecordsDao.fetchMyPointsData(userId, page * size, size);
|
||||
return ResponseData.success(coinRecords);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
34
src/main/java/vvpkassistant/User/UserDao.java
Normal file
34
src/main/java/vvpkassistant/User/UserDao.java
Normal file
@@ -0,0 +1,34 @@
|
||||
package vvpkassistant.User;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Insert;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.apache.ibatis.annotations.Select;
|
||||
import vvpkassistant.pk.PkRecord;
|
||||
import java.util.List;
|
||||
|
||||
@Mapper
|
||||
public interface UserDao extends BaseMapper<UserModel> {
|
||||
|
||||
// 根据用户的手机号查询用户
|
||||
@Select("SELECT * FROM `user` WHERE phone_number = #{phoneNumber}")
|
||||
UserModel queryWithPhoneNumber(@Param("phoneNumber") String phoneNumber);
|
||||
|
||||
// 我邀请的pk数据
|
||||
@Select("SELECT * FROM pk_record WHERE user_id_b = #{userId} ORDER BY id DESC LIMIT #{page}, #{size};")
|
||||
List<PkRecord> getMyGuestPkList(@Param("userId") Integer userId , @Param("page") Integer page, @Param("size") Integer size);
|
||||
|
||||
// 我发起的pk数据
|
||||
@Select("SELECT * FROM pk_record WHERE user_id_a = #{userId} ORDER BY id DESC LIMIT #{page}, #{size};")
|
||||
List<PkRecord> findCreatedPk(@Param("userId") Integer userId , @Param("page") Integer page, @Param("size") Integer size);
|
||||
|
||||
// 签到
|
||||
@Insert("insert into `sign_in_records` set user_id = #{userId} , time = replace(current_date, '-', '')")
|
||||
int signIn(@Param("userId") int userId);
|
||||
|
||||
// 查询当天签到状态
|
||||
@Select("SELECT COUNT(*) FROM `sign_in_records` WHERE user_id = #{userId} AND time = REPLACE(CURDATE(), '-', '')")
|
||||
int checkSignStatus(@Param("userId") int userId);
|
||||
|
||||
}
|
||||
23
src/main/java/vvpkassistant/User/UserModel.java
Normal file
23
src/main/java/vvpkassistant/User/UserModel.java
Normal file
@@ -0,0 +1,23 @@
|
||||
package vvpkassistant.User;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@TableName("user")
|
||||
public class UserModel {
|
||||
@TableId(type = IdType.AUTO)
|
||||
private Integer id; // 主键
|
||||
private String nickName; // 昵称
|
||||
private String phoneNumber; // 手机号码
|
||||
private String headerIcon; // 头像
|
||||
private String openid; // openid
|
||||
private String sessionKey; // session key
|
||||
private Integer status; // 用户状态 0 正常 其他业务逻辑待定
|
||||
private Long createTime; // 创建时间
|
||||
private String userChatId; // 聊天使用的id,使用微信的openid作为标识
|
||||
private Integer points; // 用户积分
|
||||
private Integer inviterId; // 邀请人id
|
||||
}
|
||||
Reference in New Issue
Block a user