package com.sinata.rest.modular.member.controller;
|
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.json.JSONUtil;
|
import com.alibaba.fastjson.JSON;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.sinata.common.enums.EnumRedisKey;
|
import com.sinata.common.model.AccountCheckNumVo;
|
import com.sinata.rest.common.ApiUtils;
|
import com.sinata.rest.core.huawei.ivs.DetectExtentionByNameAndIdSolution;
|
import com.sinata.rest.core.huawei.ivs.DetectStandardByNameAndIdSolution;
|
import com.sinata.rest.core.util.MD5Util;
|
import com.sinata.rest.modular.auth.util.AccountCheckUtil;
|
import com.sinata.rest.modular.auth.util.JwtTokenUtil;
|
import com.sinata.rest.modular.auth.util.ThreadPoolUtil;
|
import com.sinata.rest.modular.mall.job.UserV3UpDownWork;
|
import com.sinata.rest.modular.member.controller.common.body.BodyPwd;
|
import com.sinata.rest.modular.member.controller.common.body.BodyRegister;
|
import com.sinata.rest.modular.member.controller.common.body.BodyUser;
|
import com.sinata.rest.modular.member.controller.common.body.RegisterThirdUserRequest;
|
import com.sinata.rest.modular.member.controller.common.vo.LoginResponse;
|
import com.sinata.rest.modular.member.controller.common.vo.LoginVo;
|
import com.sinata.rest.modular.member.controller.common.vo.RegisterVo;
|
import com.sinata.rest.modular.member.controller.common.vo.WeChatMiniAuthorizeVo;
|
import com.sinata.rest.modular.member.model.MemUser;
|
import com.sinata.rest.modular.member.model.MemUserLogin;
|
import com.sinata.rest.modular.member.model.MyCoupon;
|
import com.sinata.rest.modular.member.service.IMemMemberGradeService;
|
import com.sinata.rest.modular.member.service.IMemUserService;
|
import com.sinata.rest.modular.member.service.IMyUserCouponService;
|
import com.sinata.rest.modular.member.service.WechatNewService;
|
import com.sinata.rest.modular.system.controller.AuthController;
|
import com.sinata.rest.modular.system.service.ICityRegionService;
|
import com.sinata.rest.modular.system.service.ISmsRecordService;
|
import com.sinata.rest.modular.system.service.RedisTemplateService;
|
import io.swagger.annotations.Api;
|
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParams;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.util.StringUtils;
|
import org.springframework.validation.annotation.Validated;
|
import org.springframework.web.bind.annotation.*;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import java.util.Objects;
|
|
@Slf4j
|
@RestController
|
@RequestMapping("/user")
|
@Api(tags = "用户信息(包括登录注册)", description = "用户注册")
|
public class UserController extends AuthController {
|
|
@Autowired
|
private IMemUserService userService;
|
|
@Autowired
|
private ISmsRecordService smsRecordService;
|
|
@Autowired
|
private ICityRegionService regionService;
|
|
@Autowired
|
private IMemMemberGradeService gradeService;
|
|
@Autowired
|
private RedisTemplateService redis;
|
|
@Resource
|
private JwtTokenUtil jwtTokenUtil;
|
|
@Resource
|
private AccountCheckUtil accountCheckUtil;
|
|
@Autowired
|
private WechatNewService wechatNewService;
|
|
@Autowired
|
IMyUserCouponService userCouponService;
|
|
/**
|
* 微信登录小程序授权登录
|
*/
|
@ApiOperation(value = "微信登录小程序授权登录", response = LoginResponse.class)
|
@GetMapping(value = "/wechat/code")
|
@ApiImplicitParams({
|
@ApiImplicitParam(name = "code", value = "小程序code", dataType = "String", paramType = "query", required = true),
|
@ApiImplicitParam(name = "isUser", value = "是否用户小程序,1用户,0门店", dataType = "Integer", paramType = "query", required = true),
|
})
|
public WeChatMiniAuthorizeVo wechatCode(String code, Integer isUser) {
|
Boolean isUserFlag = Boolean.TRUE;
|
if (isUser != null && isUser == 0) {
|
isUserFlag = Boolean.FALSE;
|
}
|
|
// 用户通过code获取用户的openid,sessionKey,unionid,存入redis
|
WeChatMiniAuthorizeVo response = wechatNewService.miniAuthCode(isUserFlag, code);
|
redis.set(EnumRedisKey.WX_CODE.index + code, JSONUtil.toJsonStr(response));
|
return response;
|
}
|
|
/**
|
* 微信登录小程序授权登录
|
*/
|
@ApiOperation(value = "微信登录小程序授权登录", response = LoginResponse.class)
|
@RequestMapping(value = "/authorize/program/login", method = RequestMethod.POST)
|
public Object programLogin(@RequestBody @Validated RegisterThirdUserRequest request) {
|
WeChatMiniAuthorizeVo response;
|
try {
|
response = wechatNewService.miniLogin(Boolean.TRUE, request);
|
} catch (Exception e) {
|
log.error("微信登录小程序授权登录失败,提示再试一次!");
|
return ApiUtils.returnNG("微信登陆失败", "微信登陆失败,请再试一次", -1);
|
}
|
if (Objects.isNull(response)) {
|
return ApiUtils.returnNG("微信登陆失败");
|
}
|
log.info("programLogin小程序登陆成功 = " + JSON.toJSONString(response));
|
|
//通过小程序获取手机号 来查找用户
|
LambdaQueryWrapper<MemUser> wrapper = new LambdaQueryWrapper<>();
|
wrapper.eq(MemUser::getPhone, response.getPhone());
|
MemUser loginUser = userService.getOne(wrapper, Boolean.FALSE);
|
if (Objects.isNull(loginUser)) {
|
//这里需要走注册程序
|
BodyRegister register = new BodyRegister();
|
register.setPhone(response.getPhone());
|
register.setPassword(MD5Util.encrypt(response.getPhone()));
|
register.setWxOpenId(response.getOpenId());
|
register.setCityCode(request.getCityCode());
|
register.setShareUserId(request.getShareUserId());
|
userService.registerUser(register);
|
loginUser = new MemUser();
|
loginUser.setPhone(register.getPhone());
|
loginUser.setPassword(register.getPassword());
|
} else {
|
// 这里修改用户绑定的微信账号
|
MemUser openUser = new MemUser();
|
openUser.setWxOpenId(response.getOpenId());
|
openUser.setId(loginUser.getId());
|
userService.updateById(openUser);
|
}
|
ApiUtils login = (ApiUtils) login(loginUser.getPhone(), "WXLOGIN", request.getShareUserId());
|
if (login.code == 0) {
|
LoginResponse loginResponse = new LoginResponse();
|
loginResponse.setToken(response.getSessionKey());
|
loginResponse.setOpenId(response.getOpenId());
|
loginResponse.setVo((LoginVo) login.data);
|
return ApiUtils.returnOK(loginResponse);
|
}
|
return login;
|
}
|
|
|
@PostMapping(value = "/register")
|
@ApiOperation(value = "注册", notes = "用户注册", response = RegisterVo.class)
|
public Object register(@RequestBody BodyRegister register) {
|
String msg = userService.registerUser(register);
|
if (!StringUtils.isEmpty(msg)) {
|
return ApiUtils.returnNG(null, msg);
|
} else {
|
LambdaQueryWrapper<MemUser> wrapper = new LambdaQueryWrapper();
|
wrapper.eq(MemUser::getPhone, register.phone);
|
MemUser user = userService.getOne(wrapper);
|
RegisterVo vo = wrapperUserInfo(user);
|
vo.setLogin(setUserAuth(user.getId()));
|
return ApiUtils.returnOK(vo);
|
}
|
}
|
|
@GetMapping(value = "/login")
|
@ApiOperation(value = "登录", notes = "用户登录", response = LoginVo.class)
|
@ApiImplicitParams({
|
@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true),
|
@ApiImplicitParam(name = "code", value = "验证码", dataType = "String", paramType = "query", required = true),
|
@ApiImplicitParam(name = "shareUserId", value = "邀请用户ID", dataType = "Integer", paramType = "query")
|
})
|
public Object login(String phone, String code, Integer shareUserId) {
|
if (!StringUtils.isEmpty(phone) && !StringUtils.isEmpty(code)) {
|
LambdaQueryWrapper<MemUser> wrapper = new LambdaQueryWrapper();
|
wrapper.eq(MemUser::getPhone, phone);
|
MemUser user = userService.getOne(wrapper);
|
if (user == null) {
|
//这里需要走注册程序
|
BodyRegister register = new BodyRegister();
|
register.setPhone(phone);
|
register.setPassword(MD5Util.encrypt(phone));
|
register.setShareUserId(shareUserId);
|
userService.registerUser(register);
|
LambdaQueryWrapper<MemUser> wrapper2 = new LambdaQueryWrapper();
|
wrapper2.eq(MemUser::getPhone, register.phone);
|
MemUser user2 = userService.getOne(wrapper);
|
RegisterVo vo = wrapperUserInfo(user2);
|
vo.setLogin(setUserAuth(user2.getId()));
|
return ApiUtils.returnOK(vo);
|
}
|
if (1 == user.getIsLock()) {
|
return ApiUtils.returnNG(null, "您帐号已被锁定");
|
}
|
String msg = smsRecordService.verifyCode(2, phone, code);
|
if (StringUtils.isEmpty(msg)) {
|
return ApiUtils.returnOK(setUserAuth(user.getId()));
|
} else {
|
return ApiUtils.returnNG(null, msg);
|
}
|
}
|
return ApiUtils.returnNG(null, "登录失败");
|
}
|
|
@GetMapping(value = "/pwd_login")
|
@ApiOperation(value = "密码登录", notes = "密码登录", response = LoginVo.class)
|
@ApiImplicitParams({
|
@ApiImplicitParam(name = "phone", value = "手机号", dataType = "String", paramType = "query", required = true),
|
@ApiImplicitParam(name = "password", value = "密码", dataType = "String", paramType = "query", required = true)
|
})
|
public Object loginPwd(String phone, String password) {
|
if (StringUtils.isEmpty(phone)) {
|
return ApiUtils.returnNG(null, "帐号或密码错误");
|
}
|
if (StringUtils.isEmpty(password)) {
|
return ApiUtils.returnNG(null, "帐号或密码错误");
|
}
|
|
// 账号密码-验证次数
|
AccountCheckNumVo chVo = accountCheckUtil.accountCheckPwdNum(phone);
|
if (chVo == null) {
|
return ApiUtils.returnNG(null, "帐号或密码错误");
|
}
|
|
LambdaQueryWrapper<MemUser> wrapper = new LambdaQueryWrapper();
|
wrapper.eq(MemUser::getPhone, phone);
|
MemUser user = userService.getOne(wrapper);
|
if (user == null) {
|
return ApiUtils.returnNG(null, "帐号或密码错误");
|
}
|
if (1 == user.getIsLock()) {
|
return ApiUtils.returnNG(null, "您帐号已被锁定");
|
}
|
if (password.equals(user.getPassword())) {
|
// 账号密码-验证次数【重置次数】
|
accountCheckUtil.resetAccountCheckPwdNum(chVo);
|
/*if (org.apache.commons.lang3.StringUtils.isEmpty(user.getImAccount())) {
|
//环信注册
|
userService.RingLetterRegister(user.getId(), null);
|
}*/
|
return ApiUtils.returnOK(setUserAuth(user.getId()));
|
} else {
|
return ApiUtils.returnNG(null, "帐号或密码错误");
|
}
|
}
|
|
@PostMapping(value = "/edit")
|
@ApiOperation(value = "修改用户信息", notes = "字段有就传,没有就不传", response = RegisterVo.class)
|
public Object editUser(@RequestBody BodyUser info, HttpServletRequest request) {
|
log.info("修改用户信息---------->:{}", info);
|
/************************ 拦截Token校验-begin ******************************/
|
// 验证用户ID
|
int authCode = authUserId(request, info.userId);
|
if (authCode != 0) {
|
return ApiUtils.returnNG(null, "系统繁忙.请稍候再试..");
|
}
|
/************************ 拦截Token校验-end ********************************/
|
|
MemUser user = userService.getById(info.userId);
|
if (user == null) {
|
return ApiUtils.returnNG(null, "修改失败");
|
}
|
user.setAvatar(info.avatar);
|
user.setNickName(info.nickname);
|
user.setSex(info.gender);
|
user.setBirthday(info.birthday);
|
if (StrUtil.isNotBlank(info.getCityCode())) {
|
String province = StrUtil.sub(info.getCityCode(), 0, 2) + "0000";
|
String city = StrUtil.sub(info.getCityCode(), 0, 4) + "00";
|
String county = info.getCityCode();
|
|
user.setCityCode(info.getCityCode());
|
user.setAgentProvinceCode(province);
|
user.setAgentCityCode(city);
|
user.setAgentCountyCode(county);
|
}
|
// user.setSignature(info.signature);
|
// user.setAddress(info.address);
|
userService.saveOrUpdate(user);
|
return ApiUtils.returnOK(wrapperUserInfo(userService.getById(info.userId)));
|
}
|
|
@GetMapping(value = "/user_info")
|
@ApiOperation(value = "获取用户信息", notes = "获取用户信息", response = RegisterVo.class)
|
@ApiImplicitParams({
|
@ApiImplicitParam(name = "userId", value = "用户id", dataType = "Int", paramType = "query", required = true)
|
})
|
public Object getUserInfo(Integer userId, HttpServletRequest request) {
|
/************************ 拦截Token校验-begin ******************************/
|
// 验证用户ID
|
int authCode = authUserId(request, userId);
|
if (authCode != 0) {
|
return ApiUtils.returnNG(null, "系统繁忙.请稍候再试..");
|
}
|
/************************ 拦截Token校验-end ********************************/
|
MemUser user = userService.getById(userId);
|
if (user == null) {
|
return ApiUtils.returnNG(null, "无此用户");
|
}
|
|
try {
|
// 记录用户活跃
|
MemUserLogin.builder()
|
.userId(userId)
|
.loginDate(DateUtil.today())
|
.build()
|
.insert();
|
} catch (Exception e) {
|
}
|
|
return ApiUtils.returnOK(wrapperUserInfo(user));
|
}
|
|
@PostMapping(value = "/change_pwd")
|
@ApiOperation(value = "修改用户密码", notes = "修改用户密码", response = ApiUtils.class)
|
public Object changePassword(@RequestBody BodyPwd info) {
|
String msg = smsRecordService.verifyCode(3, info.getPhone(), info.getCode());
|
if (!StringUtils.isEmpty(msg)) {
|
return ApiUtils.returnNG(null, msg);
|
}
|
|
LambdaQueryWrapper<MemUser> wrapper = new LambdaQueryWrapper();
|
wrapper.eq(MemUser::getPhone, info.getPhone());
|
MemUser user = userService.getOne(wrapper);
|
if (user == null) {
|
return ApiUtils.returnNG(null, "修改失败!");
|
}
|
if (!user.getId().equals(info.getUserId()) && info.getType() == 1) {
|
return ApiUtils.returnNG(null, "您要修改的手机号不正确!");
|
}
|
user.setPassword(info.getPassword());
|
user.updateById();
|
return ApiUtils.returnOK();
|
}
|
|
/**
|
* 封装用户信息
|
*/
|
public RegisterVo wrapperUserInfo(MemUser user) {
|
RegisterVo vo = new RegisterVo();
|
vo.setId(user.getId());
|
vo.setShowId(user.getShowId());
|
vo.setPhone(user.getPhone());
|
vo.setAvatar(user.getAvatar());
|
vo.setNickname(user.getNickName());
|
vo.setGender(user.getSex());
|
vo.setBirthday(user.getBirthday());
|
vo.setSignature(user.getSignature());
|
vo.setCityCode(user.getCityCode());
|
vo.setAddress(user.getAddress());
|
vo.setIsLock(user.getIsLock() == 1);
|
vo.setFullName(regionService.getFullName(user.getCityCode()));
|
vo.setMemberGradeId(user.getMemberGradeId());
|
vo.setGradeName(gradeService.getById(user.getMemberGradeId()).getGradeName());
|
vo.setWxOpenId(user.getWxOpenId());
|
vo.setQqAccount(user.getQqAccount());
|
vo.setAppleOpenId(user.getAppleOpenId());
|
vo.setAuditState(user.getAuditState());
|
vo.setRealName(user.getRealName());
|
vo.setIdCard(user.getIdCard());
|
vo.setImAccount(user.getImAccount());
|
vo.setImPassword(user.getImPassword());
|
|
return vo;
|
}
|
|
/**
|
* 封装用户登录认证信息
|
*/
|
public LoginVo setUserAuth(Integer id) {
|
// 获取混淆MD5签名用的随机字符串
|
final String randomKey = jwtTokenUtil.getRandomKey();
|
// 获取Token
|
final String token = jwtTokenUtil.generateToken(id.toString(), randomKey);
|
// 封装用户登录认证信息
|
LoginVo map = new LoginVo();
|
map.setId(id);
|
map.setRandomKey(randomKey);
|
map.setToken(token);
|
|
// 缓存中存token
|
redis.hashPushHashMap(EnumRedisKey.TOKEN.index, id.toString(), token);
|
|
return map;
|
}
|
|
|
@GetMapping(value = "/getUserCouponList")
|
@ApiOperation(value = "获取用户优惠券列表", notes = "获取用户优惠券列表", response = MyCoupon.class)
|
@ApiImplicitParams({
|
@ApiImplicitParam(name = "type", value = "type 1 未使用 2 已使用 3 已过期", dataType = "Int", paramType = "query", required = true),
|
@ApiImplicitParam(name = "current", value = "页数", defaultValue = "1", dataType = "Int", paramType = "query", required = true),
|
@ApiImplicitParam(name = "size", value = "大小", defaultValue = "10", dataType = "Int", paramType = "query", required = true)
|
})
|
public Object getCouponList(String type, Integer current, Integer size) {
|
Page<MyCoupon> page = new Page<MyCoupon>(current, size);
|
return ApiUtils.returnOK(userCouponService.getUserCouponList(type, ThreadPoolUtil.getUserId(), page));
|
}
|
|
@GetMapping(value = "/delete")
|
@ApiOperation(value = "注销用户申请", notes = "注销用户申请", response = ApiUtils.class)
|
public Object delete() {
|
return ApiUtils.returnOK(userService.deleteUser(ThreadPoolUtil.getUserId()));
|
}
|
|
@GetMapping(value = "/verificationNameId")
|
@ApiOperation(value = "身份证验证", response = ApiUtils.class)
|
@ApiImplicitParams({
|
@ApiImplicitParam(name = "verificationName", value = "姓名", dataType = "String", paramType = "query", required = true),
|
@ApiImplicitParam(name = "verificationId", value = "身份证号", dataType = "String", paramType = "query", required = true),
|
})
|
public ApiUtils<Boolean> verificationNameId(String verificationName, String verificationId) {
|
return ApiUtils.returnOK(DetectExtentionByNameAndIdSolution.isValid(verificationName, verificationId));
|
}
|
|
@GetMapping(value = "/verificationNameIdFace")
|
@ApiOperation(value = "身份证人脸验证", response = ApiUtils.class)
|
@ApiImplicitParams({
|
@ApiImplicitParam(name = "verificationName", value = "姓名", dataType = "String", paramType = "query", required = true),
|
@ApiImplicitParam(name = "verificationId", value = "身份证号", dataType = "String", paramType = "query", required = true),
|
@ApiImplicitParam(name = "faceImageBase64", value = "人脸图Base64", dataType = "String", paramType = "query", required = true),
|
})
|
public ApiUtils<String> verificationNameIdFace(String verificationName, String verificationId, String faceImageBase64) {
|
return ApiUtils.returnOK(DetectStandardByNameAndIdSolution.similarity(verificationName, verificationId, faceImageBase64));
|
}
|
|
}
|