111
k94314517
2023-08-11 081102af72c623e9b7da1d69cf71e486c7842d43
111
已添加4个文件
已修改12个文件
489 ■■■■■ 文件已修改
server/src/main/java/doumeemes/api/system/SystemController.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/config/shiro/ShiroConfig.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/config/shiro/ShiroCredentialsMatcher.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/config/shiro/ShiroToken.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/core/utils/Constants.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/core/utils/HttpsUtil.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/business/model/CompanyUser.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/dto/WxLoginDTO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/dao/ext/vo/WxLoginVO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/business/impl/WorkorderCheckServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/ext/impl/WorkorderRecordStandardServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/SystemLoginService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/WxLoginService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/impl/SystemLoginServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/service/system/impl/WxLoginServiceImpl.java 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/src/main/java/doumeemes/api/system/SystemController.java
@@ -8,9 +8,12 @@
import doumeemes.core.model.LoginUserInfo;
import doumeemes.core.utils.Constants;
import doumeemes.dao.business.dto.CompanyInitDataDTO;
import doumeemes.dao.ext.dto.WxLoginDTO;
import doumeemes.dao.ext.vo.WxLoginVO;
import doumeemes.dao.system.dto.LoginDTO;
import doumeemes.dao.system.dto.UpdatePwdDto;
import doumeemes.service.system.SystemLoginService;
import doumeemes.service.system.WxLoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -46,22 +49,38 @@
    @Autowired
    private SystemLoginService systemLoginService;
    @Autowired
    private WxLoginService wxLoginService;
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("登录")
    @PostMapping("/login")
    public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, HttpServletRequest request) {
//        dto.setCompanyId(Constants.de);
        return ApiResponse.success(systemLoginService.loginByPassword(dto, request));
    }
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("平台登录")
    @PostMapping("/platform/login")
    public ApiResponse<String> platformLogin (@Validated @RequestBody LoginDTO dto, HttpServletRequest request) {
//        dto.setCompanyId(Constants.de);
        return ApiResponse.success(systemLoginService.platformLogin(dto, request));
    }
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("微信登录")
    @GetMapping("/wxLogin")
    public ApiResponse<WxLoginVO> wxLogin (@RequestParam String code, HttpServletRequest request) {
        return ApiResponse.success(wxLoginService.wxLogin(code, request));
    }
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("微信登录账号密码")
    @PostMapping("/wxAccountLogin")
    public ApiResponse<String> wxAccountLogin (@Validated @RequestBody WxLoginDTO dto, HttpServletRequest request) {
        return ApiResponse.success(wxLoginService.wxLoginByPassword(dto, request));
    }
    @ApiOperation("退出登录")
    @PostMapping("/logout")
    public ApiResponse logout () {
server/src/main/java/doumeemes/config/shiro/ShiroConfig.java
@@ -71,6 +71,8 @@
        Map<String, String> map = new LinkedHashMap<>();
        // è·¯å¾„拦截配置
        map.put("/system/login", "anon");
        map.put("/system/wxLogin", "anon");
        map.put("/system/wxAccountLogin", "anon");
        map.put("/system/initCompany", "anon");
        map.put("/system/logout", "anon");
        map.put("/common/captcha", "anon");
server/src/main/java/doumeemes/config/shiro/ShiroCredentialsMatcher.java
@@ -35,6 +35,9 @@
        if(usernamePasswordToken.getDdLogin()){
            return Boolean.TRUE;
        }
        if(usernamePasswordToken.getWxLogin()){
            return Boolean.TRUE;
        }
        // åŠ å¯†å¯†ç 
        String pwd = Utils.Secure.encryptPassword(new String(usernamePasswordToken.getPassword()), systemUser.getSalt());
        // æ¯”较密码
server/src/main/java/doumeemes/config/shiro/ShiroToken.java
@@ -36,13 +36,15 @@
     */
    Integer companyId;
    Boolean isDdLogin;
    Boolean isWxLogin;
    public ShiroToken() {
    }
    public  ShiroToken(Integer companyId,String username, String password,boolean isDdLogin) {
    public  ShiroToken(Integer companyId,String username, String password,boolean isDdLogin,boolean isWxLogin) {
        super(username,  password, false, (String)null);
        this.companyId = companyId;
        this.isDdLogin = isDdLogin;
        this.isWxLogin = isWxLogin;
    }
    public Boolean getDdLogin() {
@@ -53,6 +55,15 @@
        isDdLogin = ddLogin;
    }
    public Boolean getWxLogin() {
        return isWxLogin;
    }
    public void setWxLogin(Boolean wxLogin) {
        isWxLogin = wxLogin;
    }
    public Integer getCompanyId() {
        return companyId;
    }
server/src/main/java/doumeemes/core/utils/Constants.java
@@ -27,6 +27,11 @@
    public static final String ACCESS_ID="ACCESS_ID";
    public static final String BUCKETNAME = "BUCKETNAME";
    public static final String OSS = "OSS";
    public static final String WX_CONFIG = "WX_CONFIG";
    public static final String APPID = "APPID";
    public static final String APPSECRET = "APPSECRET";
    public static final String WX_TOKEN = "WX_TOKEN";
    public static final String ACCESS_KEY = "ACCESS_KEY";
    public static final String ENDPOINT = "ENDPOINT";
    public static final String RESOURCE_PATH = "RESOURCE_PATH";
server/src/main/java/doumeemes/core/utils/HttpsUtil.java
@@ -15,7 +15,12 @@
import org.apache.http.util.EntityUtils;
import org.springframework.web.util.UriComponentsBuilder;
import javax.net.ssl.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
@@ -24,6 +29,10 @@
import java.util.Map;
public class HttpsUtil {
    public static String get(String url,boolean ignoreSSL) {
        return connection(url, "GET", null, null,ignoreSSL);
    }
    public static String sendPostByHttps(String url, Map<String, String> body, String token) {
@@ -126,6 +135,64 @@
        return null;
    }
    public static String connection(String url,String method,String data,String contentType,boolean ignoreSSL){
        HttpsURLConnection connection = null;
        try {
            URL _url = new URL(url);
            connection = (HttpsURLConnection) _url.openConnection();
            connection.setRequestMethod(method);
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            if(contentType != null){
                connection.setRequestProperty("Content-Type", contentType);
            }
            if(ignoreSSL){
                //信任所有ssl证书和主机
                TrustManager[] trustManagers = {new HttpsTrustManager()};
                SSLContext context = SSLContext.getInstance("TLS");
                context.init(null, trustManagers, new SecureRandom());
                connection.setSSLSocketFactory(context.getSocketFactory());
                connection.setHostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                });
            }
            connection.connect();
            if(data != null){
                OutputStream outputStream = connection.getOutputStream();
                outputStream.write(data.getBytes("utf-8"));
                outputStream.close();
            }
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpsURLConnection.HTTP_OK) {
                InputStream is = connection.getInputStream();
                byte[] b = new byte[4096];
                ByteArrayOutputStream baos = new ByteArrayOutputStream(b.length);
                int len;
                while ((len = is.read(b)) != -1) {
                    baos.write(b, 0, len);
                }
                is.close();
                return baos.toString("utf-8");
            }
            return connection.getResponseMessage();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if(connection != null){
                connection.disconnect();
            }
        }
        return null;
    }
    public static void main(String[] args) {
@@ -136,5 +203,43 @@
    }
}
class HttpsTrustManager implements X509TrustManager {
    private static TrustManager[] trustManagers = {new HttpsTrustManager()};
    @Override
    public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
        // TODO Auto-generated method stub
    }
    @Override
    public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
        // TODO Auto-generated method stub
    }
    @Override
    public X509Certificate[] getAcceptedIssuers() {
        // TODO Auto-generated method stub
        return null;
    }
    public static void allowAllSSL() {
        try {
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, trustManagers, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() {
                @Override
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            e.printStackTrace();
        }
    }
}
server/src/main/java/doumeemes/dao/business/model/CompanyUser.java
@@ -148,4 +148,10 @@
    @ExcelColumn(name="是否是主账户:0=否;1=是;")
    private Integer isMaster;
    @ApiModelProperty(value = "微信openid")
    private String openid;
    @ApiModelProperty(value = "微信unionid")
    private String unionid;
}
server/src/main/java/doumeemes/dao/ext/dto/WxLoginDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package doumeemes.dao.ext.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/8/11 10:10
 */
@Data
public class WxLoginDTO {
    @ApiModelProperty(value = "企业编码")
    private Integer companyId;
    @NotBlank(message = "用户名不能为空")
    @ApiModelProperty(value = "用户名")
    private String username;
    @NotBlank(message = "密码不能为空")
    @ApiModelProperty(value = "密码")
    private String password;
    @ApiModelProperty(value = "微信 openid")
    private String openid;
    @ApiModelProperty(value = "微信 unionid")
    private String unionid;
}
server/src/main/java/doumeemes/dao/ext/vo/WxLoginVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package doumeemes.dao.ext.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/8/11 11:22
 */
@Data
public class WxLoginVO {
    @ApiModelProperty(value = "登录状态:0=微信登录成功;1=微信登录失败")
    private Integer loginStatus;
    @ApiModelProperty(value = "微信 openid")
    private String openid ;
    @ApiModelProperty(value = "微信 unionid")
    private String unionid ;
    @ApiModelProperty(value = "session")
    private String session ;
}
server/src/main/java/doumeemes/service/business/impl/WorkorderCheckServiceImpl.java
@@ -401,7 +401,7 @@
        //工单对象
        Workorder workorder=workorderExtMapper.selectById(wc.getWorkorderId());
        if(workorder==null || workorder.getStatus()==Constants.WORKORDER_STATUS.done||workorder.getStatus()==Constants.WORKORDER_STATUS.baogong
        if(workorder==null || workorder.getStatus()==Constants.WORKORDER_STATUS.done || workorder.getStatus()==Constants.WORKORDER_STATUS.done||workorder.getStatus()==Constants.WORKORDER_STATUS.baogong
                ||workorder.getStatus()==Constants.WORKORDER_STATUS.instock ||workorder.getStatus()==Constants.WORKORDER_STATUS.cancel){
            return ApiResponse.failed("工单不允许检验");
        }
server/src/main/java/doumeemes/service/ext/impl/WorkorderRecordStandardServiceImpl.java
@@ -389,9 +389,6 @@
            dealAppliancePro(mp,user,allRecordList,updateApplianceList,updateApplianceProList, outboundDetailList,stockList);
        }
        if(1==1){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"123");
        }
        //如果有没bom配置,检查产出(包含检验的不良和报废品)和投料数量是否相等匹配,不一致提示错误
        if(bdparam==null){
@@ -512,6 +509,7 @@
            //如果需要投料的物料集合,在库存中寻找投料来源
            for(WStock model : materialList){
                for(WStock ts : allList){
                    if(Constants.equalsInteger(model.getMaterialId(),ts.getMaterialId())){
                        //还需要投料数量
                        BigDecimal actNum = Constants.formatBigdecimal(model.getNum()).subtract(Constants.formatBigdecimal(model.getTNum()));
@@ -527,6 +525,10 @@
                            //如果已经满足剩余需求量
                            isfull =true;
                        }
                        //添加投料记录
                        workorderRecordExtMapper.insert(getWorkrecordModel(user,ts,mp,actNum));
                        //更新已经投料数量
                        model.setTNum(Constants.formatBigdecimal(model.getTNum()).add(actNum));
                        WOutbound outbound = getFromOutboundList(ts.getWarehouseId(),outboundList);
server/src/main/java/doumeemes/service/system/SystemLoginService.java
@@ -18,6 +18,7 @@
     * @date 2022/04/18 18:12
     */
    String loginByPassword (LoginDTO dto, HttpServletRequest request);
    String platformLogin(LoginDTO dto, HttpServletRequest request);
    String loginByDingdingCode(Integer companyId ,String code, HttpServletRequest request);
    String loginAutoBylingyangToken(  String token, HttpServletRequest request,boolean isDemo);
server/src/main/java/doumeemes/service/system/WxLoginService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package doumeemes.service.system;
import doumeemes.dao.ext.dto.WxLoginDTO;
import doumeemes.dao.ext.vo.WxLoginVO;
import doumeemes.dao.system.dto.LoginDTO;
import javax.servlet.http.HttpServletRequest;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/8/11 10:13
 */
public interface WxLoginService {
    WxLoginVO wxLogin(String code, HttpServletRequest request);
    String wxLoginByPassword (WxLoginDTO dto, HttpServletRequest request);
}
server/src/main/java/doumeemes/service/system/impl/SystemLoginServiceImpl.java
@@ -2,6 +2,7 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.iflytek.antelope.other.client.dto.resp.UserDTO;
import doumeemes.biz.system.SystemDictDataBiz;
import doumeemes.config.shiro.ShiroToken;
@@ -93,9 +94,10 @@
                throw e;
            }
        }
        // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
        Subject subject = SecurityUtils.getSubject();
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), dto.getPassword(),false);
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), dto.getPassword(),false,false);
        try {
            subject.login(token);
            LoginUserInfo loginUser = ((LoginUserInfo)subject.getPrincipal());
@@ -149,7 +151,7 @@
        }
        // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
        Subject subject = SecurityUtils.getSubject();
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), dto.getPassword(),false);
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), dto.getPassword(),false,false);
        try {
            subject.login(token);
            LoginUserInfo loginUser = ((LoginUserInfo)subject.getPrincipal());
@@ -229,7 +231,7 @@
            // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
            Subject subject = SecurityUtils.getSubject();
            // é’‰é’‰ç™»å½•
            ShiroToken token = new ShiroToken(companyId,mobile, null,true);
            ShiroToken token = new ShiroToken(companyId,mobile, null,true,false);
            subject.login(token);
            LoginUserInfo loginUser =(LoginUserInfo)subject.getPrincipal();
@@ -295,7 +297,7 @@
            // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
            Subject subject = SecurityUtils.getSubject();
            // é’‰é’‰ç™»å½•
            ShiroToken atoken = new ShiroToken(companyId,mobile, null,true);
            ShiroToken atoken = new ShiroToken(companyId,mobile, null,true,false);
            subject.login(atoken);
            LoginUserInfo loginUser =(LoginUserInfo)subject.getPrincipal();
            loginUser.getCompanyUser().setName(user.getName());
@@ -366,7 +368,7 @@
            // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
            Subject subject = SecurityUtils.getSubject();
            // é’‰é’‰ç™»å½•
            ShiroToken atoken = new ShiroToken(companyId,mobile, null,true);
            ShiroToken atoken = new ShiroToken(companyId,mobile, null,true,false);
            subject.login(atoken);
            LoginUserInfo loginUser =(LoginUserInfo)subject.getPrincipal();
            loginLog.setUserId(loginUser.getId());
@@ -451,7 +453,7 @@
            // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
            Subject subject = SecurityUtils.getSubject();
            // é’‰é’‰ç™»å½•
            ShiroToken atoken = new ShiroToken(com.getId(),mobile, null,true);
            ShiroToken atoken = new ShiroToken(com.getId(),mobile, null,true,false);
            subject.login(atoken);
            LoginUserInfo loginUser =(LoginUserInfo)subject.getPrincipal();
            loginUser.getCompanyUser().setName(user.getName());
@@ -522,7 +524,7 @@
            // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
            Subject subject = SecurityUtils.getSubject();
            // é’‰é’‰ç™»å½•
            ShiroToken atoken = new ShiroToken(com.getId(),mobile, null,true);
            ShiroToken atoken = new ShiroToken(com.getId(),mobile, null,true,false);
            subject.login(atoken);
            LoginUserInfo loginUser =(LoginUserInfo)subject.getPrincipal();
            loginUser.getCompanyUser().setName(user.getName());
@@ -554,4 +556,7 @@
        }
    }
}
server/src/main/java/doumeemes/service/system/impl/WxLoginServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,215 @@
package doumeemes.service.system.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import doumeemes.biz.system.SystemDictDataBiz;
import doumeemes.config.shiro.ShiroToken;
import doumeemes.core.constants.ResponseStatus;
import doumeemes.core.exception.BusinessException;
import doumeemes.core.model.LoginUserInfo;
import doumeemes.core.utils.Constants;
import doumeemes.core.utils.HttpsUtil;
import doumeemes.core.utils.Utils;
import doumeemes.dao.business.model.CompanyUser;
import doumeemes.dao.business.model.Department;
import doumeemes.dao.ext.CompanyExtMapper;
import doumeemes.dao.ext.CompanyUserExtMapper;
import doumeemes.dao.ext.DepartmentExtMapper;
import doumeemes.dao.ext.dto.QueryCompanyUserExtDTO;
import doumeemes.dao.ext.dto.WxLoginDTO;
import doumeemes.dao.ext.vo.CompanyUserExtListVO;
import doumeemes.dao.ext.vo.WxLoginVO;
import doumeemes.dao.system.SystemUserMapper;
import doumeemes.dao.system.dto.LoginDTO;
import doumeemes.dao.system.model.SystemLoginLog;
import doumeemes.dao.system.model.SystemUser;
import doumeemes.service.common.CaptchaService;
import doumeemes.service.ext.CompanyExtService;
import doumeemes.service.ext.CompanyUserExtService;
import doumeemes.service.system.SystemLoginLogService;
import doumeemes.service.system.WxLoginService;
import lombok.extern.slf4j.Slf4j;
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.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Objects;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/8/11 10:14
 */
@Slf4j
@Service
public class WxLoginServiceImpl implements WxLoginService {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Value("${project.version}")
    private String systemVersion;
    @Autowired
    private CompanyUserExtMapper companyUserExtMapper;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Autowired
    private DepartmentExtMapper departmentExtMapper;
    @Autowired
    private SystemLoginLogService systemLoginLogService;
    /**
     * å¾®ä¿¡å…¬ä¼—号获取TOKEN地址
     */
    public static final String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
    /**
     * å¾®ä¿¡å…¬ä¼—号获取USERINFO信息地址
     */
    public static final String GET_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    @Override
    public WxLoginVO wxLogin(String code, HttpServletRequest request) {
        WxLoginVO wxLoginVO = new WxLoginVO();
        String appId = systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.APPID).getCode();
        String appSecret = systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.APPSECRET).getCode();
        String getTokenUrl = GET_ACCESS_TOKEN_URL.replace("CODE", code).replace("APPID", appId).replace("SECRET", appSecret);
        JSONObject tokenJson = JSONObject.parseObject(HttpsUtil.get(getTokenUrl,true));
        if(Objects.isNull(tokenJson.get("access_token"))){
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),tokenJson.getString("errmsg"));
        }
        String accessToken = tokenJson.getString("access_token");
        String openId = tokenJson.getString("openid");
        String getUserInfoUrl = GET_USER_INFO_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
        JSONObject userInfoJson = JSONObject.parseObject(HttpsUtil.get(getUserInfoUrl,true));
        wxLoginVO.setOpenid(openId);
        wxLoginVO.setUnionid(userInfoJson.getString("unionid"));
        CompanyUser companyUser = companyUserExtMapper.selectOne(new QueryWrapper<CompanyUser>().eq("openid",openId).last(" limit 1 "));
        if(Objects.isNull(companyUser)){
            wxLoginVO.setLoginStatus(Constants.ONE);
            return wxLoginVO;
        }
        Department department = departmentExtMapper.selectById(companyUser.getRootDepartId());
        if(Objects.isNull(department)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到绑定部门信息");
        }
        SystemUser systemUser = systemUserMapper.selectById(companyUser.getUserId());
        //查询用户数据
        LoginDTO dto = new LoginDTO();
        dto.setCompanyId(department.getCompanyId());
        dto.setUsername(systemUser.getUsername());
        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());
        // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
        Subject subject = SecurityUtils.getSubject();
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), null,false,true);
        try {
            subject.login(token);
            LoginUserInfo loginUser = ((LoginUserInfo)subject.getPrincipal());
            loginLog.setUserId(loginUser.getId());
            loginLog.setCompanyId(loginUser.getCompany()!=null?loginUser.getCompany().getId():null);
            loginLog.setCompanyUserId(loginUser.getCompanyUser()!=null?loginUser.getCompanyUser().getId():null);
            loginLog.setSuccess(Boolean.TRUE);
            systemLoginLogService.create(loginLog);
            String session = (String)subject.getSession().getId();
            wxLoginVO.setLoginStatus(Constants.ONE);
            wxLoginVO.setSession(session);
            return wxLoginVO;
        }catch (AuthenticationException e) {
            BusinessException ee = null;
            loginLog.setSuccess(Boolean.FALSE);
            if(e.getCause()!=null && e.getCause() instanceof  BusinessException){
                ee =   (BusinessException)e.getCause();
                loginLog.setReason(ee.getMessage().length() > 200 ? (ee.getMessage().substring(0, 190) + "...") : ee.getMessage());
                log.error(ee.getMessage(), e);
            }else{
                log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e);
                loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
                ee = new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
            }
            systemLoginLogService.create(loginLog);
            throw  ee;
        }
    }
    @Override
    public String wxLoginByPassword(WxLoginDTO dto, 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());
        // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
        Subject subject = SecurityUtils.getSubject();
        ShiroToken token = new ShiroToken(dto.getCompanyId(),dto.getUsername(), dto.getPassword(),false,false);
        try {
            subject.login(token);
            LoginUserInfo loginUser = ((LoginUserInfo)subject.getPrincipal());
            loginLog.setUserId(loginUser.getId());
            loginLog.setCompanyId(loginUser.getCompany()!=null?loginUser.getCompany().getId():null);
            loginLog.setCompanyUserId(loginUser.getCompanyUser()!=null?loginUser.getCompanyUser().getId():null);
            loginLog.setSuccess(Boolean.TRUE);
            systemLoginLogService.create(loginLog);
            //登录携带微信openid信息
            if(StringUtils.isNotBlank(dto.getOpenid())){
                CompanyUser companyUser = companyUserExtMapper.selectById(loginLog.getCompanyUserId());
                if(StringUtils.isBlank(companyUser.getOpenid())||!companyUser.getOpenid().equals(dto.getOpenid())){
                    //1、绑定微信openid到companyUser表信息
                    companyUser.setOpenid(dto.getOpenid());
                    companyUser.setUnionid(dto.getUnionid());
                    companyUserExtMapper.updateById(companyUser);
                    //2、清空同用户其余companyUser表openid与 unionid
                    companyUserExtMapper.update(null,new UpdateWrapper<CompanyUser>()
                            .ne("ID",companyUser.getId()).set("UNIONID","").set("OPENID","")
                            .eq("USER_ID",companyUser.getUserId())
                    );
                }
            }
            return (String)subject.getSession().getId();
        }catch (AuthenticationException e) {
            BusinessException ee = null;
            loginLog.setSuccess(Boolean.FALSE);
            if(e.getCause()!=null && e.getCause() instanceof  BusinessException){
                ee =   (BusinessException)e.getCause();
                loginLog.setReason(ee.getMessage().length() > 200 ? (ee.getMessage().substring(0, 190) + "...") : ee.getMessage());
                log.error(ee.getMessage(), e);
            }else{
                log.error(ResponseStatus.ACCOUNT_INCORRECT.getMessage(), e);
                loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
                ee = new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
            }
            systemLoginLogService.create(loginLog);
            throw  ee;
        }
    }
}
server/src/main/resources/application.yml
@@ -10,7 +10,7 @@
#  application:
#    name: doumeemes
  profiles:
    active: standardPro
    active: standard
  # JSON返回配置
  jackson:
    # é»˜è®¤æ—¶åŒº