111
k94314517
2024-03-14 cb96c5493ebbb0767cf4d5b83544e131294225cb
server/service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -1,5 +1,8 @@
package com.doumee.service.system.impl;
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;
@@ -7,15 +10,21 @@
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.dao.business.SmsEmailMapper;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.dto.LoginDTO;
import com.doumee.dao.system.dto.LoginPhoneDTO;
import com.doumee.dao.system.dto.WxMiniLoginDTO;
import com.doumee.dao.system.model.SystemLoginLog;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.impl.SmsEmailServiceImpl;
import com.doumee.service.common.CaptchaService;
import com.doumee.service.system.SystemLoginLogService;
import com.doumee.service.system.SystemLoginService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.subject.Subject;
@@ -43,8 +52,77 @@
    @Autowired
    private SystemLoginLogService systemLoginLogService;
    @Autowired
    private SystemUserMapper systemUserMapper;
    /**
     * 微信授权(登录后)
     * @param code
     */
    @Override
    public String loginByPassword(LoginDTO dto, int type,HttpServletRequest request) {
    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(),"微信登录异常!请联系管理员");
        }
    }
    @Override
    public String loginByWxMini (WxMiniLoginDTO wxMiniLoginDTO, HttpServletRequest request){
        if(StringUtils.isNotBlank(wxMiniLoginDTO.getCode())){
            try{
                WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(wxMiniLoginDTO.getCode());
                String openId = session.getOpenid();
                if (StringUtils.isNotBlank(openId)&&StringUtils.isBlank(wxMiniLoginDTO.getUsername())) {
                    SystemUser systemUser = systemUserMapper.selectOne(new QueryWrapper<SystemUser>()
                            .lambda().eq(SystemUser::getOpenid,openId)
                            .eq(SystemUser::getDeleted,Constants.ZERO)
                            .eq(SystemUser::getType,Constants.UserType.COMPANY.getKey())
                            .orderByDesc(SystemUser::getCreateTime)
                            .last(" limit 1")
                    );
                    if(Objects.nonNull(systemUser)){
                        LoginPhoneDTO dto = new LoginPhoneDTO();
                        dto.setPhone(systemUser.getMobile());
                        return this.loginByPhone(dto,Constants.ZERO,false,request);
                    }
                }
            } catch (WxErrorException e) {
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"微信登录异常!请联系管理员");
            }
        }
        if(StringUtils.isBlank(wxMiniLoginDTO.getUsername())
                || 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);
    }
    @Override
    public String loginByPassword(LoginDTO dto, int type,Boolean checkCaptcha,HttpServletRequest request) {
        SystemLoginLog loginLog = new SystemLoginLog();
        loginLog.setLoginUsername(dto.getUsername());
        loginLog.setLoginTime(new Date());
@@ -57,7 +135,7 @@
        loginLog.setServerIp(Utils.Server.getIP());
        // 校验验证码
        try {
            if(!debugModel){
            if(!debugModel&&checkCaptcha){
                captchaService.check(dto.getUuid(), dto.getCode());
            }
        } catch (Exception e) {
@@ -84,8 +162,9 @@
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), Objects.isNull(e.getCause())?ResponseStatus.ACCOUNT_INCORRECT.getMessage():e.getCause().getMessage());
        }
    }
    @Override
    public String loginByPhone (LoginPhoneDTO dto, int type, HttpServletRequest request) {
    public String loginByPhone (LoginPhoneDTO dto, int type,Boolean checkSmsCode, HttpServletRequest request) {
        SystemLoginLog loginLog = new SystemLoginLog();
        loginLog.setLoginUsername(dto.getPhone());
        loginLog.setLoginTime(new Date());
@@ -99,7 +178,7 @@
        // 校验验证码
        if(type!= Constants.TWO){
            try {
                if(!debugModel){
                if(!debugModel&& checkSmsCode){
                    SmsEmailServiceImpl.isCaptcheValide(smsEmailMapper,dto.getPhone(), dto.getCode());
                }
            } catch (Exception e) {
@@ -127,4 +206,10 @@
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), Objects.isNull(e.getCause())?ResponseStatus.ACCOUNT_INCORRECT.getMessage():e.getCause().getMessage());
        }
    }
}