|
|
|
|
@ -4,6 +4,7 @@ import cn.binarywang.wx.miniapp.api.WxMaService;
|
|
|
|
|
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
|
|
|
|
|
import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
|
|
|
|
|
import cn.dev33.satoken.annotation.SaIgnore;
|
|
|
|
|
import cn.dev33.satoken.context.SaHolder;
|
|
|
|
|
import cn.dev33.satoken.stp.StpUtil;
|
|
|
|
|
import cn.hutool.core.map.MapUtil;
|
|
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
|
|
@ -30,6 +31,7 @@ import com.ruoyi.system.service.ISysUserService;
|
|
|
|
|
import com.ruoyi.system.service.SysLoginService;
|
|
|
|
|
import lombok.Data;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
import me.chanjar.weixin.common.error.WxErrorException;
|
|
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
import org.springframework.web.bind.annotation.*;
|
|
|
|
|
@ -48,30 +50,32 @@ import java.util.Map;
|
|
|
|
|
@Validated
|
|
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
@RestController
|
|
|
|
|
@Slf4j
|
|
|
|
|
public class SysLoginController {
|
|
|
|
|
|
|
|
|
|
private final SysLoginService loginService;
|
|
|
|
|
private final ISysMenuService menuService;
|
|
|
|
|
private final ISysUserService userService;
|
|
|
|
|
private final RSAProperties properties;
|
|
|
|
|
|
|
|
|
|
private final WxMaService wxMaService;
|
|
|
|
|
private final RuoYiConfig config;
|
|
|
|
|
|
|
|
|
|
private final ISysConfigService configService;
|
|
|
|
|
/**
|
|
|
|
|
* 登录方法
|
|
|
|
|
*
|
|
|
|
|
* @param loginBody 登录信息
|
|
|
|
|
* @return 结果
|
|
|
|
|
*/
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/login")
|
|
|
|
|
public R<?> login(@Validated @RequestBody LoginBody loginBody) {
|
|
|
|
|
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
|
|
|
|
|
loginBody.getUuid());
|
|
|
|
|
return R.map().put(Constants.TOKEN, token);
|
|
|
|
|
}
|
|
|
|
|
private final SysLoginService loginService;
|
|
|
|
|
private final ISysMenuService menuService;
|
|
|
|
|
private final ISysUserService userService;
|
|
|
|
|
private final RSAProperties properties;
|
|
|
|
|
|
|
|
|
|
private final WxMaService wxMaService;
|
|
|
|
|
private final RuoYiConfig config;
|
|
|
|
|
|
|
|
|
|
private final ISysConfigService configService;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 登录方法
|
|
|
|
|
*
|
|
|
|
|
* @param loginBody 登录信息
|
|
|
|
|
* @return 结果
|
|
|
|
|
*/
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/login")
|
|
|
|
|
public R<?> login(@Validated @RequestBody LoginBody loginBody) {
|
|
|
|
|
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
|
|
|
|
|
loginBody.getUuid());
|
|
|
|
|
return R.map().put(Constants.TOKEN, token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Data
|
|
|
|
|
public static class EmqxLoginBody {
|
|
|
|
|
@ -101,134 +105,136 @@ public class SysLoginController {
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 登录
|
|
|
|
|
*
|
|
|
|
|
* @param username 用户名
|
|
|
|
|
* @param password 密码 使用RSA算法公钥加密后的字符串
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
@PostMapping("/login-pwd")
|
|
|
|
|
@SaIgnore
|
|
|
|
|
public R login(String username,String password) {
|
|
|
|
|
if(StrUtil.hasBlank(username,password)) {
|
|
|
|
|
throw new ServiceException("用户名或密码不能为空",1);
|
|
|
|
|
public R login(String username, String password) {
|
|
|
|
|
if (StrUtil.hasBlank(username, password)) {
|
|
|
|
|
throw new ServiceException("用户名或密码不能为空", 1);
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
password = properties.getRsa().decryptStr(password, KeyType.PrivateKey);
|
|
|
|
|
}catch (Exception ex){
|
|
|
|
|
throw new ServiceException("密码必须为RSA加密后",2);
|
|
|
|
|
} catch (Exception ex) {
|
|
|
|
|
throw new ServiceException("密码必须为RSA加密后", 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return R.ok().setMsg("登录成功").setData(loginService.login(username,password));
|
|
|
|
|
return R.ok().setMsg("登录成功").setData(loginService.login(username, password));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 短信登录(示例)
|
|
|
|
|
*
|
|
|
|
|
* @param smsLoginBody 登录信息
|
|
|
|
|
* @return 结果
|
|
|
|
|
*/
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/smsLogin")
|
|
|
|
|
public R<?> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) {
|
|
|
|
|
String token = loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode());
|
|
|
|
|
return R.map().put(Constants.TOKEN,token);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 短信登录(示例)
|
|
|
|
|
*
|
|
|
|
|
* @param smsLoginBody 登录信息
|
|
|
|
|
* @return 结果
|
|
|
|
|
*/
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/smsLogin")
|
|
|
|
|
public R<?> smsLogin(@Validated @RequestBody SmsLoginBody smsLoginBody) {
|
|
|
|
|
String token = loginService.smsLogin(smsLoginBody.getPhonenumber(), smsLoginBody.getSmsCode());
|
|
|
|
|
return R.map().put(Constants.TOKEN, token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 小程序登录(示例)
|
|
|
|
|
*
|
|
|
|
|
* @param xcxCode 小程序code
|
|
|
|
|
* @return 结果
|
|
|
|
|
*/
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/xcxLogin")
|
|
|
|
|
public R<?> xcxLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode) {
|
|
|
|
|
String token = loginService.xcxLoginByOpenId(xcxCode);
|
|
|
|
|
return R.map().put(Constants.TOKEN,token);
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 小程序登录(示例)
|
|
|
|
|
*
|
|
|
|
|
* @param xcxCode 小程序code
|
|
|
|
|
* @return 结果
|
|
|
|
|
*/
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/xcxLogin")
|
|
|
|
|
public R<?> xcxLogin(@NotBlank(message = "{xcx.code.not.blank}") String xcxCode) {
|
|
|
|
|
String token = loginService.xcxLoginByOpenId(xcxCode);
|
|
|
|
|
return R.map().put(Constants.TOKEN, token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/openid")
|
|
|
|
|
@Dev
|
|
|
|
|
public R<?> xcxOpenid(@NotBlank(message = "{xcx.code.not.blank}") String openid) {
|
|
|
|
|
String token = loginService.xcxLoginByOpenId(openid);
|
|
|
|
|
return R.map().put(Constants.TOKEN,token);
|
|
|
|
|
}
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/openid")
|
|
|
|
|
@Dev
|
|
|
|
|
public R<?> xcxOpenid(@NotBlank(message = "{xcx.code.not.blank}") String openid) {
|
|
|
|
|
String token = loginService.xcxLoginByOpenId(openid);
|
|
|
|
|
return R.map().put(Constants.TOKEN, token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/xcxRegLogin")
|
|
|
|
|
public R<?> xcxRegLogin(@NotBlank(message = "{xcx.code.not.blank}") String code,
|
|
|
|
|
MultipartFile avatar,
|
|
|
|
|
@NotBlank(message = "{not.null}") String nickname,
|
|
|
|
|
@NotBlank(message = "邀请码不能为空") String regCode
|
|
|
|
|
) {
|
|
|
|
|
if(!regCode.equals(configService.selectConfigByKey("reg.code"))){
|
|
|
|
|
throw new RuntimeException("邀请码不正确");
|
|
|
|
|
}
|
|
|
|
|
String token = loginService.xcxRegLoginByOpenid(code,avatar,nickname);
|
|
|
|
|
return R.map().put(Constants.TOKEN,token);
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/xcxRegLogin")
|
|
|
|
|
public R<?> xcxRegLogin(@NotBlank(message = "{xcx.code.not.blank}") String code,
|
|
|
|
|
MultipartFile avatar,
|
|
|
|
|
@NotBlank(message = "{not.null}") String nickname,
|
|
|
|
|
@NotBlank(message = "邀请码不能为空") String regCode
|
|
|
|
|
) {
|
|
|
|
|
if (!regCode.equals(configService.selectConfigByKey("reg.code"))) {
|
|
|
|
|
throw new RuntimeException("邀请码不正确");
|
|
|
|
|
}
|
|
|
|
|
String token = loginService.xcxRegLoginByOpenid(code, avatar, nickname);
|
|
|
|
|
return R.map().put(Constants.TOKEN, token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/xcxRegLoginByOpenid")
|
|
|
|
|
@Dev
|
|
|
|
|
public R<?> xcxRegLoginByOpenid(String openid, MultipartFile avatar, String nickname) {
|
|
|
|
|
String token = loginService.xcxRegLoginByOpenid(openid,avatar,nickname);
|
|
|
|
|
return R.map().put(Constants.TOKEN,token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 退出登录
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "/logout",method = {RequestMethod.POST,RequestMethod.GET})
|
|
|
|
|
public R<Void> logout() {
|
|
|
|
|
loginService.logout();
|
|
|
|
|
return R.ok("退出成功");
|
|
|
|
|
}
|
|
|
|
|
@SaIgnore
|
|
|
|
|
@PostMapping("/xcxRegLoginByOpenid")
|
|
|
|
|
@Dev
|
|
|
|
|
public R<?> xcxRegLoginByOpenid(String openid, MultipartFile avatar, String nickname) {
|
|
|
|
|
String token = loginService.xcxRegLoginByOpenid(openid, avatar, nickname);
|
|
|
|
|
return R.map().put(Constants.TOKEN, token);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取用户信息
|
|
|
|
|
*
|
|
|
|
|
* @return 用户信息
|
|
|
|
|
*/
|
|
|
|
|
@GetMapping("getInfo")
|
|
|
|
|
public R<?> getInfo() {
|
|
|
|
|
LoginUser loginUser = LoginHelper.getLoginUser();
|
|
|
|
|
SysUser user = userService.selectUserById(loginUser.getUserId());
|
|
|
|
|
return R.map().put("user", user)
|
|
|
|
|
.put("roles", loginUser.getRolePermission())
|
|
|
|
|
.put("permissions", loginUser.getMenuPermission());
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 退出登录
|
|
|
|
|
*/
|
|
|
|
|
@RequestMapping(value = "/logout", method = {RequestMethod.POST, RequestMethod.GET})
|
|
|
|
|
public R<Void> logout() {
|
|
|
|
|
loginService.logout();
|
|
|
|
|
return R.ok("退出成功");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取路由信息
|
|
|
|
|
*
|
|
|
|
|
* @return 路由信息
|
|
|
|
|
*/
|
|
|
|
|
@GetMapping("getRouters")
|
|
|
|
|
public R<List<RouterVo>> getRouters() {
|
|
|
|
|
Long userId = LoginHelper.getUserId();
|
|
|
|
|
List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
|
|
|
|
|
return R.ok(menuService.buildMenus(menus));
|
|
|
|
|
}
|
|
|
|
|
/**
|
|
|
|
|
* 获取用户信息
|
|
|
|
|
*
|
|
|
|
|
* @return 用户信息
|
|
|
|
|
*/
|
|
|
|
|
@GetMapping("getInfo")
|
|
|
|
|
public R<?> getInfo() {
|
|
|
|
|
LoginUser loginUser = LoginHelper.getLoginUser();
|
|
|
|
|
SysUser user = userService.selectUserById(loginUser.getUserId());
|
|
|
|
|
return R.map().put("user", user)
|
|
|
|
|
.put("roles", loginUser.getRolePermission())
|
|
|
|
|
.put("permissions", loginUser.getMenuPermission());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取路由信息
|
|
|
|
|
*
|
|
|
|
|
* @return 路由信息
|
|
|
|
|
*/
|
|
|
|
|
@GetMapping("getRouters")
|
|
|
|
|
public R<List<RouterVo>> getRouters() {
|
|
|
|
|
Long userId = LoginHelper.getUserId();
|
|
|
|
|
List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
|
|
|
|
|
return R.ok(menuService.buildMenus(menus));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Log(title = "获取微信手机号码", businessType = BusinessType.GRANT)
|
|
|
|
|
@PostMapping("xcxPhone")
|
|
|
|
|
@SaIgnore
|
|
|
|
|
public R<?> xcxPhone(@NotBlank(message = "{xcx.code.not.blank}") String code) {
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getNewPhoneNoInfo(code);
|
|
|
|
|
WxMaConfigHolder.remove();//清理ThreadLocal
|
|
|
|
|
return R.ok(phoneNoInfo);
|
|
|
|
|
} catch (WxErrorException e) {
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
}
|
|
|
|
|
@Log(title = "获取微信手机号码", businessType = BusinessType.GRANT)
|
|
|
|
|
@PostMapping("xcxPhone")
|
|
|
|
|
@SaIgnore
|
|
|
|
|
public R<?> xcxPhone(@NotBlank(message = "{xcx.code.not.blank}") String code) {
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
|
|
WxMaPhoneNumberInfo phoneNoInfo = wxMaService.getUserService().getNewPhoneNoInfo(code);
|
|
|
|
|
WxMaConfigHolder.remove();//清理ThreadLocal
|
|
|
|
|
return R.ok(phoneNoInfo);
|
|
|
|
|
} catch (WxErrorException e) {
|
|
|
|
|
throw new RuntimeException(e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|