/**
|
# __----~~~~~~~~~~~------___
|
# . . ~~//====...... __--~ ~~
|
# -. \_|// |||\\ ~~~~~~::::... /~
|
# ___-==_ _-~o~ \/ ||| \\ _/~~-
|
# __---~~~.==~||\=_ -_--~/_-~|- |\\ \\ _/~
|
# _-~~ .=~ | \\-_ '-~7 /- / || \ /
|
# .~ .~ | \\ -_ / /- / || \ /
|
# / ____ / | \\ ~-_/ /|- _/ .|| \ /
|
# |~~ ~~|--~~~~--_ \ ~==-/ | \~--===~~ .\
|
# ' ~-| /| |-~\~~ __--~~
|
# |-~~-_/ | | ~\_ _-~ /\
|
# / \ \__ \/~ \__
|
# _--~ _/ | .-~~____--~-/ ~~==.
|
# ((->/~ '.|||' -_| ~~-/ , . _||
|
# -_ ~\ ~~---l__i__i__i--~~_/
|
# _-~-__ ~) \--______________--~~
|
# //.-~~~-~_--~- |-------~~~~~~~~
|
# //.-~~~--\
|
# 神兽保佑
|
# 永无BUG!
|
*/
|
package com.lunhan.water.host.controller.user;
|
|
import com.google.gson.JsonObject;
|
import com.google.gson.JsonParser;
|
import com.lunhan.water.common.ConstantFactory;
|
import com.lunhan.water.common.ExecutedResult;
|
import com.lunhan.water.common.PagerResult;
|
import com.lunhan.water.common.config.SysConfig;
|
import com.lunhan.water.common.enums.EResultCode;
|
import com.lunhan.water.common.exceptions.BusinessException;
|
import com.lunhan.water.common.jwt.JWTUtil;
|
import com.lunhan.water.common.jwt.LoginUserDTO;
|
import com.lunhan.water.common.util.HttpUtil;
|
import com.lunhan.water.common.util.LocalDateTimeUtil;
|
import com.lunhan.water.common.util.ParameterUtil;
|
import com.lunhan.water.common.util.SerializeUtil;
|
import com.lunhan.water.common.validator.ParameterValidateResult;
|
import com.lunhan.water.common.validator.ParameterValidator;
|
import com.lunhan.water.entity.enums.EState;
|
import com.lunhan.water.entity.enums.EUserType;
|
import com.lunhan.water.entity.request.ReqChangePassword;
|
import com.lunhan.water.entity.request.ReqListId;
|
import com.lunhan.water.entity.request.ReqNeedCode;
|
import com.lunhan.water.entity.request.ReqUserLogin;
|
import com.lunhan.water.entity.weixin.WeiXinUserDto;
|
import com.lunhan.water.host.BasicController;
|
import com.lunhan.water.host.api.NonLogin;
|
import com.lunhan.water.repository.po.UserLoginPO;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.web.bind.annotation.*;
|
import java.util.List;
|
import java.util.Objects;
|
|
import com.lunhan.water.service.UserLoginService;
|
import com.lunhan.water.entity.request.userlogin.ReqCreateUserLogin;
|
import com.lunhan.water.entity.request.userlogin.ReqModifyUserLogin;
|
import com.lunhan.water.entity.search.SearchUserLogin;
|
import com.lunhan.water.repository.vo.UserLoginVO;
|
|
/**
|
* 9000.UserLogin
|
* @author lin.liu
|
* @order 9000
|
*/
|
@RestController
|
@RequestMapping(value = "user")
|
public class UserLoginController extends BasicController {
|
@Autowired
|
private UserLoginService userLoginService;
|
/**
|
* 微信小程序授权
|
* @param request 请求参数
|
*/
|
@NonLogin
|
@PostMapping(value = "wxAuthorize")
|
public ExecutedResult<WeiXinUserDto> wxAuthorization(@RequestBody ReqNeedCode request) {
|
return success(this.wxMiniAppAuth(request.getCode()));
|
}
|
/**
|
* 微信登录
|
* @param request 请求参数
|
*/
|
@NonLogin
|
@PostMapping(value = "wxLogin")
|
public ExecutedResult<LoginUserDTO> wxLogin(@RequestBody ReqNeedCode request) {
|
//微信授权
|
WeiXinUserDto userInfo = this.wxMiniAppAuth(request.getCode());
|
Long now = LocalDateTimeUtil.nowTimeStamp();
|
String openId = userInfo.getOpenId();
|
|
UserLoginPO user = userLoginService.get4Openid(openId);
|
if (Objects.isNull(user)) {
|
// 微信未绑定账号,新增用户
|
ReqCreateUserLogin reqCreateUser = new ReqCreateUserLogin();
|
reqCreateUser.setUserName(openId);
|
reqCreateUser.setPassword("");
|
reqCreateUser.setWxOpenId(openId);
|
reqCreateUser.setNickName(userInfo.getNickName());
|
reqCreateUser.setHeadImg(userInfo.getHeadImgUrl());
|
reqCreateUser.setPhone("");
|
reqCreateUser.setComment("");
|
ExecutedResult<Long> createAdmin = userLoginService.create(reqCreateUser);
|
if (createAdmin.isFailed()) {
|
return ExecutedResult.failed(createAdmin.getMsg());
|
}
|
|
user = userLoginService.get4Openid(openId);
|
}
|
if (!Objects.equals(user.getStatus(), EState.NORMAL.getValue())) {
|
return ExecutedResult.failed("账号异常, 请联系管理员!");
|
}
|
LoginUserDTO loginUser = new LoginUserDTO();
|
loginUser.setUserType(EUserType.ADMIN_USER.getValue());
|
loginUser.setUserId(openId);
|
loginUser.setNickName(user.getNickName());
|
loginUser.setHeadImg(user.getHeadImg());
|
loginUser.setPhone("");
|
loginUser.setToken(JWTUtil.getToken(loginUser));
|
return ExecutedResult.success(loginUser);
|
}
|
/**
|
* 微信小程序授权
|
*/
|
private WeiXinUserDto wxMiniAppAuth(String code) {
|
//微信接口服务,通过调用微信接口服务中jscode2session接口获取到openid和session_key
|
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + SysConfig.wx.getAppId() + "&secret=" + SysConfig.wx.getSecret() + "&js_code=" + code + "&grant_type=authorization_code";
|
String response = HttpUtil.doGet(url);
|
JsonObject jsonObject = new JsonParser().parse(response).getAsJsonObject();
|
if (!jsonObject.has("errcode")) {
|
String sessionKey = jsonObject.get("session_key").toString();
|
String openId = jsonObject.get("openid").toString();
|
}
|
if (jsonObject.has("errcode")) {
|
String errCode = jsonObject.get("errcode").getAsString();
|
switch (errCode) {
|
case "1":
|
throw new BusinessException(EResultCode.FAILED, "微信授权失败,请稍后再试.");
|
case "40029":
|
throw new BusinessException(EResultCode.FAILED, "微信授权code无效");
|
case "40163":
|
throw new BusinessException(EResultCode.FAILED, "微信授权code已被使用");
|
case "45011":
|
throw new BusinessException(EResultCode.FAILED, "访问次数过于频繁,请稍后再试");
|
|
default:
|
throw new BusinessException(EResultCode.FAILED, "微信返回错误:" + errCode);
|
}
|
}
|
return SerializeUtil.toObject(response, WeiXinUserDto.class);
|
}
|
/**
|
* 修改密码
|
* @param request 请求参数
|
* @author lin.liu
|
*/
|
@PostMapping("/changePassword")
|
public ExecutedResult<String> changePassword(@RequestBody ReqChangePassword request) {
|
//#region 参数验证
|
ParameterValidator validator = new ParameterValidator()
|
.addNotNullOrEmpty(ParameterUtil.named("旧密码"), request.getOldPassword())
|
.addNotNullOrEmpty(ParameterUtil.named("新密码"), request.getNewPassword())
|
.addLengthMax(ParameterUtil.named("新密码"), request.getNewPassword(), ConstantFactory.LENGTH_MAX50);
|
ParameterValidateResult result = validator.validate();
|
if (result.getIsFiled()) {
|
return ExecutedResult.failed(result.getErrorMsg());
|
}
|
//#endregion
|
LoginUserDTO user = super.getTokenUser();
|
return userLoginService.changePassword(user, request);
|
}
|
|
/**
|
* 帐号密码登录
|
* @param request 请求参数
|
* @author lin.liu
|
*/
|
@PostMapping("login")
|
@NonLogin
|
public ExecutedResult<LoginUserDTO> login(@RequestBody ReqUserLogin request) {
|
//#region 参数验证
|
ParameterValidator validator = new ParameterValidator()
|
.addNotNullOrEmpty(ParameterUtil.named("用户名"), request.getUserName())
|
.addNotNullOrEmpty(ParameterUtil.named("密码"), request.getPassword());
|
ParameterValidateResult result = validator.validate();
|
if (result.getIsFiled()) {
|
return ExecutedResult.failed(result.getErrorMsg());
|
}
|
//#endregion
|
return userLoginService.login(request);
|
}
|
}
|