|
@@ -3,132 +3,104 @@ package org.jeecg.modules.app.service.impl;
|
|
import cn.binarywang.wx.miniapp.api.WxMaService;
|
|
import cn.binarywang.wx.miniapp.api.WxMaService;
|
|
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
|
|
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
|
|
import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
|
|
import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
|
|
-import cn.hutool.core.util.IdUtil;
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
|
|
+import lombok.extern.log4j.Log4j2;
|
|
import me.chanjar.weixin.common.error.WxErrorException;
|
|
import me.chanjar.weixin.common.error.WxErrorException;
|
|
-import org.apache.commons.lang3.StringUtils;
|
|
|
|
-import org.jeecg.common.constant.CommonConstant;
|
|
|
|
|
|
+import org.apache.shiro.SecurityUtils;
|
|
import org.jeecg.common.exception.JeecgBootException;
|
|
import org.jeecg.common.exception.JeecgBootException;
|
|
import org.jeecg.common.system.util.JwtUtil;
|
|
import org.jeecg.common.system.util.JwtUtil;
|
|
|
|
+import org.jeecg.common.system.vo.LoginUser;
|
|
import org.jeecg.common.util.RedisUtil;
|
|
import org.jeecg.common.util.RedisUtil;
|
|
-import org.jeecg.modules.app.dto.UserWechatRegisterDTO;
|
|
|
|
-import org.jeecg.modules.app.entity.User;
|
|
|
|
-import org.jeecg.modules.app.mapper.AppUserMapper;
|
|
|
|
import org.jeecg.modules.app.service.IUserService;
|
|
import org.jeecg.modules.app.service.IUserService;
|
|
import org.jeecg.modules.app.vo.LoginUserVO;
|
|
import org.jeecg.modules.app.vo.LoginUserVO;
|
|
-import org.springframework.beans.BeanUtils;
|
|
|
|
|
|
+import org.jeecg.modules.app.vo.MsgVO;
|
|
|
|
+import org.jeecg.modules.system.entity.SysAnnouncementSend;
|
|
|
|
+import org.jeecg.modules.system.entity.SysUser;
|
|
|
|
+import org.jeecg.modules.system.mapper.SysAnnouncementMapper;
|
|
|
|
+import org.jeecg.modules.system.mapper.SysAnnouncementSendMapper;
|
|
|
|
+import org.jeecg.modules.system.mapper.SysUserMapper;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
-import org.springframework.util.DigestUtils;
|
|
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
import javax.annotation.Resource;
|
|
-import javax.servlet.http.HttpServletRequest;
|
|
|
|
|
|
|
|
-import static org.jeecg.common.constant.CommonConstant.*;
|
|
|
|
-import static org.jeecg.common.util.PasswordUtil.SALTA_APP;
|
|
|
|
|
|
+import static org.jeecg.common.constant.CommonConstant.PREFIX_USER_TOKEN;
|
|
|
|
+import static org.jeecg.common.constant.CommonConstant.SC_INTERNAL_SERVER_ERROR_500;
|
|
|
|
|
|
@Service
|
|
@Service
|
|
-public class UserServiceImpl extends ServiceImpl<AppUserMapper, User> implements IUserService {
|
|
|
|
|
|
+@Log4j2
|
|
|
|
+public class UserServiceImpl implements IUserService {
|
|
@Resource
|
|
@Resource
|
|
private WxMaService wxMaService;
|
|
private WxMaService wxMaService;
|
|
|
|
+ @Resource
|
|
|
|
+ private SysUserMapper sysUserMapper;
|
|
|
|
+ @Resource
|
|
|
|
+ private SysAnnouncementSendMapper sysAnnouncementSendMapper;
|
|
|
|
+ @Resource
|
|
|
|
+ private SysAnnouncementMapper sysAnnouncementMapper;
|
|
@Autowired
|
|
@Autowired
|
|
private RedisUtil redisUtil;
|
|
private RedisUtil redisUtil;
|
|
|
|
|
|
- @Override
|
|
|
|
- public LoginUserVO wechatInfo(UserWechatRegisterDTO userWechatRegisterDTO, HttpServletRequest request) {
|
|
|
|
- try {
|
|
|
|
- if (userWechatRegisterDTO == null ||
|
|
|
|
- StringUtils.isAnyBlank(userWechatRegisterDTO.getCode(), userWechatRegisterDTO.getUserName(), userWechatRegisterDTO.getUserAvatar(), userWechatRegisterDTO.getGender())) {
|
|
|
|
- throw new JeecgBootException("参数不能为空", SC_JEECG_NO_AUTHZ);
|
|
|
|
- }
|
|
|
|
- String code = userWechatRegisterDTO.getCode();
|
|
|
|
- String userName = userWechatRegisterDTO.getUserName();
|
|
|
|
- String userAvatar = userWechatRegisterDTO.getUserAvatar();
|
|
|
|
- String gender = userWechatRegisterDTO.getGender();
|
|
|
|
- WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
|
|
|
|
- String openid = session.getOpenid();
|
|
|
|
- String sessionKey = session.getSessionKey();
|
|
|
|
- // 单机锁
|
|
|
|
- synchronized (openid.intern()) {
|
|
|
|
- // 查询用户是否已存在
|
|
|
|
- User user = this.getOne(Wrappers.<User>lambdaQuery().eq(User::getOpenid, openid).eq(User::getDelFlag, 0));
|
|
|
|
- // 用户不存在则创建
|
|
|
|
- if (user == null) {
|
|
|
|
- user = new User();
|
|
|
|
- user.setOpenid(openid);
|
|
|
|
- user.setUserAccount(IdUtil.getSnowflakeNextIdStr());
|
|
|
|
- String encryptPassword = DigestUtils.md5DigestAsHex((SALTA_APP).getBytes());
|
|
|
|
- user.setUserPassword(encryptPassword);
|
|
|
|
- user.setUserAvatar(userAvatar);
|
|
|
|
- user.setUserName(userName);
|
|
|
|
- user.setGender(gender);
|
|
|
|
- boolean result = this.save(user);
|
|
|
|
- if (!result) {
|
|
|
|
- throw new JeecgBootException("登录失败", SC_INTERNAL_SERVER_ERROR_500);
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- // 记录用户的登录态
|
|
|
|
- request.getSession().setAttribute(USER_LOGIN_STATE, user);
|
|
|
|
- return generateLoginUserVO(user);
|
|
|
|
- }
|
|
|
|
- } catch (WxErrorException e) {
|
|
|
|
- log.error("微信登录失败: {}"+ e.getMessage());
|
|
|
|
- throw new JeecgBootException("小程序登录失败:" + e, SC_INTERNAL_SERVER_ERROR_500);
|
|
|
|
- } finally {
|
|
|
|
- WxMaConfigHolder.remove(); // 清理ThreadLocal
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
@Override
|
|
@Override
|
|
public LoginUserVO wechatLogin(String code) {
|
|
public LoginUserVO wechatLogin(String code) {
|
|
try {
|
|
try {
|
|
WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
|
|
WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
|
|
String openid = session.getOpenid();
|
|
String openid = session.getOpenid();
|
|
// 通过openId获取在系统中是否是已经绑定过的用户
|
|
// 通过openId获取在系统中是否是已经绑定过的用户
|
|
- User user = this.getOne(Wrappers.<User>lambdaQuery().eq(User::getOpenid, openid).eq(User::getDelFlag, 0));
|
|
|
|
|
|
+ SysUser user = sysUserMapper.selectOne(Wrappers.<SysUser>lambdaQuery()
|
|
|
|
+ .eq(SysUser::getOpenid, openid)
|
|
|
|
+ .eq(SysUser::getDelFlag, 0));
|
|
if (null == user) {
|
|
if (null == user) {
|
|
// 用户不存在则创建
|
|
// 用户不存在则创建
|
|
- user = new User();
|
|
|
|
- user.setOpenid(openid);
|
|
|
|
- user.setUserAccount(IdUtil.getSnowflakeNextIdStr());
|
|
|
|
- String encryptPassword = DigestUtils.md5DigestAsHex((SALTA_APP).getBytes());
|
|
|
|
- user.setUserPassword(encryptPassword);
|
|
|
|
- user.setUserName("微信用户");
|
|
|
|
- boolean result = this.save(user);
|
|
|
|
|
|
+ user = new SysUser()
|
|
|
|
+ .setOpenid(openid)
|
|
|
|
+ .setRealname("微信用户")
|
|
|
|
+ .setUsername("微信用户")
|
|
|
|
+ .setOrgCode("A03");
|
|
|
|
+ boolean result = sysUserMapper.insert(user) > 0;
|
|
if (!result) {
|
|
if (!result) {
|
|
throw new JeecgBootException("登录失败", SC_INTERNAL_SERVER_ERROR_500);
|
|
throw new JeecgBootException("登录失败", SC_INTERNAL_SERVER_ERROR_500);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return generateLoginUserVO(user);
|
|
return generateLoginUserVO(user);
|
|
} catch (WxErrorException e) {
|
|
} catch (WxErrorException e) {
|
|
- log.error("微信登录失败: " + e.getMessage());
|
|
|
|
|
|
+ log.error("微信登录失败: {}", e.getMessage());
|
|
throw new JeecgBootException("小程序登录失败:" + e, SC_INTERNAL_SERVER_ERROR_500);
|
|
throw new JeecgBootException("小程序登录失败:" + e, SC_INTERNAL_SERVER_ERROR_500);
|
|
} finally {
|
|
} finally {
|
|
WxMaConfigHolder.remove(); // 清理ThreadLocal
|
|
WxMaConfigHolder.remove(); // 清理ThreadLocal
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- private LoginUserVO generateLoginUserVO(User user) {
|
|
|
|
- String userAccount = user.getUserAccount();
|
|
|
|
- String userPassword = user.getUserPassword();
|
|
|
|
- // 1.生成token
|
|
|
|
- String token = JwtUtil.sign(userAccount, userPassword);
|
|
|
|
- // 设置token缓存有效时间
|
|
|
|
- redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, token);
|
|
|
|
- redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
|
|
|
|
- LoginUserVO loginUserVO = getLoginUserVO(user);
|
|
|
|
- loginUserVO.setToken(token);
|
|
|
|
- return loginUserVO;
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public MsgVO getMsg() {
|
|
|
|
+ LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
|
|
|
|
+ sysAnnouncementSendMapper.selectList(Wrappers.<SysAnnouncementSend>lambdaQuery()
|
|
|
|
+ .eq(SysAnnouncementSend::getUserId, user.getId())).forEach(sysAnnouncementSend -> {
|
|
|
|
+
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ return null;
|
|
}
|
|
}
|
|
|
|
|
|
- @Override
|
|
|
|
- public LoginUserVO getLoginUserVO(User user) {
|
|
|
|
- if (user == null) {
|
|
|
|
- return null;
|
|
|
|
|
|
+ private LoginUserVO generateLoginUserVO(SysUser user) {
|
|
|
|
+ String orgCode = user.getOrgCode().substring(0, 3);
|
|
|
|
+ String userAccount = "";
|
|
|
|
+ String userPassword = "";
|
|
|
|
+ if(orgCode.equals("A03") || user.getOpenid() != null){
|
|
|
|
+ userAccount = user.getUsername();
|
|
|
|
+ userPassword = user.getOpenid();
|
|
|
|
+ }else if (orgCode.equals("A04")){
|
|
|
|
+ userAccount = user.getUsername();
|
|
|
|
+ userPassword = user.getPassword();
|
|
}
|
|
}
|
|
- LoginUserVO loginUserVO = new LoginUserVO();
|
|
|
|
- BeanUtils.copyProperties(user, loginUserVO);
|
|
|
|
- return loginUserVO;
|
|
|
|
|
|
+ // 1.生成token
|
|
|
|
+ String token = JwtUtil.sign(userAccount, userPassword);
|
|
|
|
+ // 设置token缓存有效时间
|
|
|
|
+ redisUtil.set(PREFIX_USER_TOKEN + token, token);
|
|
|
|
+ redisUtil.expire(PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);
|
|
|
|
+ return new LoginUserVO().setToken(token)
|
|
|
|
+ .setId(user.getId())
|
|
|
|
+ .setUserName(user.getUsername())
|
|
|
|
+ .setUserAvatar(user.getAvatar());
|
|
}
|
|
}
|
|
}
|
|
}
|