k94314517
2025-05-14 4ddff036191a2ec6ee6f85a337c97d6f7d9471d6
server/service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -3,7 +3,6 @@
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.api.R;
import com.doumee.config.shiro.ShiroToken;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
@@ -56,39 +55,51 @@
    private SystemUserMapper systemUserMapper;
    /**
     * 微信授权(登录后)
     * @param code
     */
    @Override
    public String wxEmpower(String code,Integer userId){
        try {
            //获取微信敏感数据
            WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(code);
            String openId = session.getOpenid();
            if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(openId)) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"获取openid失败!请联系管理员");
            }
            if(Objects.nonNull(userId)){
                systemUserMapper.update(null,new UpdateWrapper<SystemUser>()
                        .lambda().set(SystemUser::getOpenid,null)
                        .eq(SystemUser::getOpenid,openId)
                        .ne(SystemUser::getId,userId));
//    /**
//     * 微信授权(登录后)
//     * @param code
//     */
//    @Override
//    public String wxEmpower(String code,Integer userId){
//        try {
//            //获取微信敏感数据
//            WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(code);
//            String openId = session.getOpenid();
//            if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isBlank(openId)) {
//                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"获取openid失败!请联系管理员");
//            }
//            if(Objects.nonNull(userId)){
//                systemUserMapper.update(null,new UpdateWrapper<SystemUser>()
//                        .lambda()
//                        .set(SystemUser::getOpenid,null)
//                        .eq(SystemUser::getOpenid,openId)
//                        .ne(SystemUser::getId,userId));
//
//                systemUserMapper.update(null,new UpdateWrapper<SystemUser>()
//                        .lambda()
//                        .set(SystemUser::getOpenid,openId)
//                        .eq(SystemUser::getId,userId));
//            }
//            return openId;
//        } catch (WxErrorException e) {
//            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"微信登录异常!请联系管理员");
//        }
//    }
                systemUserMapper.update(null,new UpdateWrapper<SystemUser>()
                        .lambda()
                        .set(SystemUser::getOpenid,openId)
                        .eq(SystemUser::getId,userId));
            }
            return openId;
        } catch (WxErrorException e) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"微信登录异常!请联系管理员");
    @Override
    public void cleaOpenid(){
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(StringUtils.isNotBlank(loginUserInfo.getOpenid())){
            systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                    .set(SystemUser::getOpenid,null)
                    .eq(SystemUser::getId,loginUserInfo.getId()));
        }
    }
    @Override
    public String loginByWxMini (WxMiniLoginDTO wxMiniLoginDTO, HttpServletRequest request){
        LoginDTO dto = new LoginDTO();
        if(StringUtils.isNotBlank(wxMiniLoginDTO.getCode())){
            try{
                WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(wxMiniLoginDTO.getCode());
@@ -102,10 +113,14 @@
                            .last(" limit 1")
                    );
                    if(Objects.nonNull(systemUser)){
                        LoginPhoneDTO dto = new LoginPhoneDTO();
                        dto.setPhone(systemUser.getMobile());
                        return this.loginByPhone(dto,Constants.ZERO,false,request);
                        LoginPhoneDTO loginPhoneDTO = new LoginPhoneDTO();
                        loginPhoneDTO.setPhone(systemUser.getMobile());
                        return  this.loginByPhone(loginPhoneDTO,Constants.ONE,false,request);
                    }else{
                        return null;
                    }
                }else{
                    dto.setOpenid(openId);
                }
            } catch (WxErrorException e) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"微信登录异常!请联系管理员");
@@ -115,7 +130,6 @@
                || StringUtils.isBlank(wxMiniLoginDTO.getPassword())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginDTO dto = new LoginDTO();
        dto.setUsername(wxMiniLoginDTO.getUsername());
        dto.setPassword(wxMiniLoginDTO.getPassword());
        return this.loginByPassword(dto,Constants.ONE,false,request);
@@ -147,12 +161,23 @@
        }
        // 校验用户名和密码
        Subject subject = SecurityUtils.getSubject();
        ShiroToken token = new ShiroToken(dto.getUsername(), dto.getPassword(),true,type);
        ShiroToken token = new ShiroToken(dto.getUsername(), dto.getPassword(),true,type,null);
        try {
            subject.login(token);
            loginLog.setUserId(((LoginUserInfo)subject.getPrincipal()).getId());
            loginLog.setSuccess(Boolean.TRUE);
            systemLoginLogService.create(loginLog);
            //更新openid所属用户信息
            if(StringUtils.isNotBlank(dto.getOpenid())){
                systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                        .set(SystemUser::getOpenid,null)
                        .eq(SystemUser::getOpenid,dto.getOpenid())
                        .ne(SystemUser::getId,loginLog.getUserId()));
                systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda()
                        .set(SystemUser::getOpenid,dto.getOpenid())
                        .eq(SystemUser::getId,loginLog.getUserId()));
            }
            return (String)subject.getSession().getId();
        } catch (AuthenticationException e) {
            log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e);
@@ -189,7 +214,7 @@
        }
        // 校验用户名和密码
        Subject subject = SecurityUtils.getSubject();
        ShiroToken token = new ShiroToken(dto.getPhone(), null,false,type);
        ShiroToken token = new ShiroToken(dto.getPhone(), null,false,type,null);
        try {
            subject.login(token);
            loginLog.setUserId(((LoginUserInfo)subject.getPrincipal()).getId());
@@ -208,6 +233,36 @@
    @Override
    public String switchCompany (LoginUserInfo loginUserInfo,Integer companyId, HttpServletRequest request) {
        SystemLoginLog loginLog = new SystemLoginLog();
        loginLog.setLoginUsername(loginUserInfo.getMobile());
        loginLog.setLoginTime(new Date());
        loginLog.setSystemVersion(systemVersion);
        loginLog.setIp(Utils.User_Client.getIP(request));
        loginLog.setLocation(Utils.Location.getLocationString(loginLog.getIp()));
        loginLog.setPlatform(Utils.User_Client.getPlatform(request));
        loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
        loginLog.setOsInfo(Utils.User_Client.getOS(request));
        loginLog.setServerIp(Utils.Server.getIP());
        // 校验用户名和密码
        Subject subject = SecurityUtils.getSubject();
        ShiroToken token = new ShiroToken(loginUserInfo.getMobile(), null,false,loginUserInfo.getType(),companyId);
        try {
            subject.login(token);
            loginLog.setUserId(((LoginUserInfo)subject.getPrincipal()).getId());
            loginLog.setSuccess(Boolean.TRUE);
            systemLoginLogService.create(loginLog);
            return (String)subject.getSession().getId();
        } catch (AuthenticationException e) {
            log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e);
            loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
            loginLog.setSuccess(Boolean.FALSE);
            systemLoginLogService.create(loginLog);
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), Objects.isNull(e.getCause())?ResponseStatus.ACCOUNT_INCORRECT.getMessage():e.getCause().getMessage());
        }
    }
}