package com.ks.app.controller.client.api;
|
|
import com.ks.app.dto.user.LoginInfoDTO;
|
import com.ks.app.entity.APPPlatform;
|
import com.ks.app.entity.user.UserInfo;
|
import com.ks.app.entity.user.UserLoginRecord;
|
import com.ks.app.entity.vip.UserVIPInfo;
|
import com.ks.app.exception.user.LoginException;
|
import com.ks.app.exception.user.UserAccountException;
|
import com.ks.app.service.inter.user.UserAccountService;
|
import com.ks.app.service.inter.user.UserExtraInfoService;
|
import com.ks.app.service.inter.user.UserInfoService;
|
import com.ks.app.service.inter.vip.VIPService;
|
import com.ks.app.service.manager.PushManager;
|
import com.ks.app.service.manager.VerifyCodeManager;
|
import com.ks.app.utils.ApiCodeConstant;
|
import com.ks.app.utils.ImageUtil;
|
import com.ks.app.utils.annotation.UserLogin;
|
import com.ks.app.vo.AcceptData;
|
import com.ks.app.vo.user.UserInfoVO;
|
import com.ks.lib.common.exception.ParamsException;
|
import com.ks.push.exception.BPushDeviceTokenException;
|
import com.ks.push.pojo.DO.BPushDeviceToken;
|
import com.ks.push.pojo.DO.PushPlatform;
|
import com.ks.push.service.BDeviceTokenService;
|
import org.apache.commons.codec.digest.DigestUtils;
|
import org.apache.dubbo.config.annotation.Reference;
|
import org.springframework.lang.Nullable;
|
import org.springframework.stereotype.Controller;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.ResponseBody;
|
import org.springframework.web.multipart.MultipartFile;
|
import org.yeshi.utils.IPUtil;
|
import org.yeshi.utils.JsonUtil;
|
import org.yeshi.utils.StringUtil;
|
import org.yeshi.utils.ThreadUtil;
|
import org.yeshi.utils.entity.FileUploadResult;
|
import org.yeshi.utils.tencentcloud.COSManager;
|
|
import javax.annotation.Resource;
|
import javax.servlet.http.HttpServletRequest;
|
import java.io.InputStream;
|
|
/**
|
* @author hxh
|
* @title: UserController
|
* @description: 用户接口
|
* @date 2021/11/16 17:37
|
*/
|
@Controller
|
@RequestMapping("api/v1/user")
|
public class UserController {
|
|
@Resource
|
private UserAccountService userAccountService;
|
|
@Resource
|
private UserInfoService userInfoService;
|
|
@Resource
|
private VIPService vipService;
|
|
@Resource
|
private VerifyCodeManager verifyCodeManager;
|
|
@Resource
|
private PushManager pushManager;
|
|
@Resource
|
private UserExtraInfoService userExtraInfoService;
|
|
@ResponseBody
|
@RequestMapping("loginPhone")
|
public String loginPhone(AcceptData acceptData, String phone, String vcode, String token, HttpServletRequest request) {
|
LoginInfoDTO loginInfo = new LoginInfoDTO();
|
loginInfo.setIpInfo(IPUtil.getRemotIP(request) + ":" + request.getRemotePort());
|
loginInfo.setLoginType(UserLoginRecord.TYPE_LOGIN_PHONE);
|
if (!StringUtil.isNullOrEmpty(phone)) {
|
if (StringUtil.isNullOrEmpty(vcode)) {
|
return JsonUtil.loadFalseResult("请上传验证码");
|
}
|
|
loginInfo.setPhone(phone);
|
loginInfo.setVcode(vcode);
|
|
} else if (!StringUtil.isNullOrEmpty(token)) {
|
loginInfo.setPhoneAuthInfo(token);
|
} else {
|
return JsonUtil.loadFalseResult("信息不完整");
|
}
|
loginInfo.setSystem(acceptData.getSystem());
|
return login(loginInfo, acceptData);
|
}
|
|
|
@ResponseBody
|
@RequestMapping("loginWX")
|
public String loginWX(AcceptData acceptData, String code, HttpServletRequest request) {
|
LoginInfoDTO loginInfo = new LoginInfoDTO();
|
loginInfo.setIpInfo(IPUtil.getRemotIP(request) + ":" + request.getRemotePort());
|
loginInfo.setLoginType(UserLoginRecord.TYPE_LOGIN_WX);
|
if (StringUtil.isNullOrEmpty(code)) {
|
return JsonUtil.loadFalseResult("信息不完整");
|
}
|
loginInfo.setWxCode(code);
|
loginInfo.setSystem(acceptData.getSystem());
|
return login(loginInfo, acceptData);
|
}
|
|
private String login(LoginInfoDTO loginInfo, AcceptData acceptData) {
|
try {
|
UserInfo userInfo = userAccountService.login(loginInfo);
|
ThreadUtil.run(new Runnable() {
|
@Override
|
public void run() {
|
try {
|
//登录成功
|
pushManager.bindUid(acceptData.getSystem(), userInfo.getId(), acceptData.getPlatform() == APPPlatform.ios ? acceptData.getIdfa() : acceptData.getUtdId());
|
} catch (Exception e) {
|
|
}
|
}
|
});
|
|
return outUserInfoForLogin(userInfo);
|
} catch (LoginException e) {
|
return JsonUtil.loadFalseResult(e.getMessage());
|
}
|
}
|
|
private String outUserInfoForLogin(UserInfo userInfo) {
|
UserInfoVO vo = UserInfoVO.create(userInfo, userExtraInfoService.get(userInfo.getId()));
|
//是否需要填写邀请码
|
vo.setHasBoss(false);
|
return JsonUtil.loadTrueResult(JsonUtil.getSimpleGson().toJson(vo));
|
}
|
|
|
@UserLogin(uid = "#uid")
|
@ResponseBody
|
@RequestMapping("bindWX")
|
public String bindWX(AcceptData acceptData, Long uid, String code) {
|
|
try {
|
userAccountService.bindWX(uid, code);
|
} catch (UserAccountException e) {
|
e.printStackTrace();
|
return JsonUtil.loadFalseResult(e.getMsg());
|
}
|
|
return JsonUtil.loadTrueResult("");
|
}
|
|
@UserLogin(uid = "#uid")
|
@ResponseBody
|
@RequestMapping("bindPhone")
|
public String bindPhone(AcceptData acceptData, Long uid, String phone, String vcode, String token) {
|
|
try {
|
userAccountService.bindPhone(uid, phone, vcode, token);
|
} catch (UserAccountException e) {
|
e.printStackTrace();
|
return JsonUtil.loadFalseResult(e.getMsg());
|
}
|
|
return JsonUtil.loadTrueResult("");
|
}
|
|
@UserLogin(uid = "#uid")
|
@ResponseBody
|
@RequestMapping("logout")
|
public String logout(AcceptData acceptData, Long uid) {
|
try {
|
//解绑UID
|
pushManager.unBind(acceptData.getSystem(), acceptData.getPlatform() == APPPlatform.ios ? acceptData.getIdfa() : acceptData.getUtdId());
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
return JsonUtil.loadTrueResult("");
|
}
|
|
|
@UserLogin(uid = "#uid")
|
@ResponseBody
|
@RequestMapping("unRegister")
|
public String unRegister(AcceptData acceptData, String vcode, String phone) {
|
|
if (StringUtil.isNullOrEmpty(vcode)) {
|
return JsonUtil.loadFalseResult("验证码不能为空");
|
}
|
|
if (StringUtil.isNullOrEmpty(phone)) {
|
return JsonUtil.loadFalseResult("手机号不能为空");
|
}
|
|
if (!verifyCodeManager.isPhoneCodeRight(acceptData.getSystem(), phone, vcode)) {
|
return JsonUtil.loadFalseResult("验证码错误");
|
}
|
|
UserInfo user = userInfoService.selectValidByPhone(acceptData.getSystem(), phone);
|
if (user == null) {
|
return JsonUtil.loadFalseResult("不存在绑定该手机号的用户");
|
}
|
//注销
|
userAccountService.unRegister(user.getId());
|
return JsonUtil.loadTrueResult("");
|
}
|
|
@UserLogin(uid = "#uid")
|
@ResponseBody
|
@RequestMapping("getUserInfo")
|
public String getUserInfo(AcceptData acceptData, Long uid) {
|
|
UserInfo user = userInfoService.get(uid);
|
|
if (user == null) {
|
return JsonUtil.loadFalseResult("用户不存在");
|
}
|
if (user.getStatus() == UserInfo.STATUS_FORBIDDEN) {
|
return JsonUtil.loadFalseResult(ApiCodeConstant.CODE_FAIL_USER_FORBIDDEN, "账号被封禁");
|
}
|
|
if (user.getStatus() == UserInfo.STATUS_OWN_DELETE) {
|
return JsonUtil.loadFalseResult(ApiCodeConstant.CODE_FAIL_USER_DELETE, "用户已被删除");
|
}
|
|
UserInfoVO vo = new UserInfoVO();
|
vo.setId(user.getId() + "");
|
vo.setNickName(user.getNickName());
|
vo.setPortrait(user.getPortrait());
|
|
UserVIPInfo userVIPInfo = vipService.getVIPInfo(user.getId());
|
if (userVIPInfo != null) {
|
vo.setVipExpireTime(userVIPInfo.getExpireDate().getTime());
|
}
|
|
|
return JsonUtil.loadTrueResult(vo);
|
}
|
|
@UserLogin(uid = "#uid")
|
@ResponseBody
|
@RequestMapping("updateUserInfo")
|
public String updateUserInfo(AcceptData acceptData, Long uid, String nickName, @Nullable @RequestParam("portrait") MultipartFile portrait, String portraitMD5) {
|
|
UserInfo user = userInfoService.get(uid);
|
|
if (user == null) {
|
return JsonUtil.loadFalseResult("用户不存在");
|
}
|
|
UserInfo update = new UserInfo();
|
update.setId(uid);
|
|
if (!StringUtil.isNullOrEmpty(nickName)) {
|
update.setNickName(nickName);
|
}
|
|
if (portrait != null) {
|
|
if (StringUtil.isNullOrEmpty(portraitMD5)) {
|
return JsonUtil.loadFalseResult("头像文件加密值为空");
|
}
|
|
try {
|
String md5 = DigestUtils.md5Hex(portrait.getBytes());
|
if (!portraitMD5.equalsIgnoreCase(md5)) {
|
return JsonUtil.loadFalseResult("头像文件加密值错误");
|
}
|
|
InputStream inputStream = portrait.getInputStream();
|
String contentType = portrait.getContentType();
|
String key = String.format("/imgs/portrait/%s_%s.png", uid, md5);
|
FileUploadResult result = COSManager.getInstance().uploadFile(inputStream, key);
|
if (result == null) {
|
return JsonUtil.loadFalseResult("上传出错");
|
}
|
update.setPortrait(ImageUtil.getCOSImageUrl(key));
|
} catch (Exception e) {
|
return JsonUtil.loadFalseResult("头像修改出错");
|
}
|
}
|
|
userInfoService.update(update);
|
if (portrait != null) {
|
//删除原来的头像
|
if (!user.getPortrait().contains("default")) {
|
try {
|
COSManager.getInstance().deleteFileByKey(ImageUtil.getUrlKey(user.getPortrait()));
|
} catch (Exception e) {
|
}
|
}
|
}
|
|
return JsonUtil.loadTrueResult("");
|
}
|
|
|
@ResponseBody
|
@RequestMapping("uploadPushRegId")
|
public String uploadPushRegId(AcceptData acceptData, Long uid, String regId) {
|
|
try {
|
pushManager.saveToken(acceptData, uid, regId);
|
return JsonUtil.loadTrueResult("");
|
} catch (BPushDeviceTokenException e) {
|
return JsonUtil.loadFalseResult(e.getCode(), "业务出错");
|
} catch (ParamsException e) {
|
return JsonUtil.loadFalseResult(e.getCode(), "参数错误");
|
}
|
}
|
|
|
}
|