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; 
 | 
import com.doumee.core.exception.BusinessException; 
 | 
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; 
 | 
import org.springframework.beans.factory.annotation.Autowired; 
 | 
import org.springframework.beans.factory.annotation.Value; 
 | 
import org.springframework.stereotype.Service; 
 | 
  
 | 
import javax.servlet.http.HttpServletRequest; 
 | 
import java.util.Date; 
 | 
import java.util.Objects; 
 | 
  
 | 
@Slf4j 
 | 
@Service 
 | 
public class SystemLoginServiceImpl implements SystemLoginService { 
 | 
  
 | 
    @Value("${project.version}") 
 | 
    private String systemVersion; 
 | 
    @Value("${debug_model}") 
 | 
    private Boolean debugModel; 
 | 
    @Autowired 
 | 
    private SmsEmailMapper smsEmailMapper; 
 | 
    @Autowired 
 | 
    private CaptchaService captchaService; 
 | 
  
 | 
    @Autowired 
 | 
    private SystemLoginLogService systemLoginLogService; 
 | 
  
 | 
    @Autowired 
 | 
    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)); 
 | 
// 
 | 
//                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()); 
 | 
                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 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(),"微信登录异常!请联系管理员"); 
 | 
            } 
 | 
        } 
 | 
        if(StringUtils.isBlank(wxMiniLoginDTO.getUsername()) 
 | 
                || StringUtils.isBlank(wxMiniLoginDTO.getPassword())){ 
 | 
            throw new BusinessException(ResponseStatus.BAD_REQUEST); 
 | 
        } 
 | 
        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()); 
 | 
        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()); 
 | 
        // 校验验证码 
 | 
        try { 
 | 
            if(!debugModel&&checkCaptcha){ 
 | 
                captchaService.check(dto.getUuid(), dto.getCode()); 
 | 
            } 
 | 
        } catch (Exception e) { 
 | 
            log.error(e.getMessage(), e); 
 | 
            loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage()); 
 | 
            loginLog.setSuccess(Boolean.FALSE); 
 | 
            systemLoginLogService.create(loginLog); 
 | 
            throw e; 
 | 
        } 
 | 
        // 校验用户名和密码 
 | 
        Subject subject = SecurityUtils.getSubject(); 
 | 
        ShiroToken token = new ShiroToken(dto.getUsername(), dto.getPassword(),true,type); 
 | 
        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); 
 | 
            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()); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    @Override 
 | 
    public String loginByPhone (LoginPhoneDTO dto, int type,Boolean checkSmsCode, HttpServletRequest request) { 
 | 
        SystemLoginLog loginLog = new SystemLoginLog(); 
 | 
        loginLog.setLoginUsername(dto.getPhone()); 
 | 
        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()); 
 | 
        // 校验验证码 
 | 
        try { 
 | 
            if(!debugModel&& checkSmsCode){ 
 | 
                SmsEmailServiceImpl.isCaptcheValide(smsEmailMapper,dto.getPhone(), dto.getCode()); 
 | 
            } 
 | 
        } catch (Exception e) { 
 | 
            log.error(e.getMessage(), e); 
 | 
            loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage()); 
 | 
            loginLog.setSuccess(Boolean.FALSE); 
 | 
            systemLoginLogService.create(loginLog); 
 | 
            throw e; 
 | 
        } 
 | 
        // 校验用户名和密码 
 | 
        Subject subject = SecurityUtils.getSubject(); 
 | 
        ShiroToken token = new ShiroToken(dto.getPhone(), null,false,type); 
 | 
        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()); 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
} 
 |