From d52b2bdc62a5722a96d3999a9ed96640f3945f91 Mon Sep 17 00:00:00 2001
From: k94314517 <8417338+k94314517@user.noreply.gitee.com>
Date: 星期五, 11 八月 2023 18:14:41 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 server/src/main/java/doumeemes/service/system/impl/WxLoginServiceImpl.java |  215 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 215 insertions(+), 0 deletions(-)

diff --git a/server/src/main/java/doumeemes/service/system/impl/WxLoginServiceImpl.java b/server/src/main/java/doumeemes/service/system/impl/WxLoginServiceImpl.java
new file mode 100644
index 0000000..8a1ca5c
--- /dev/null
+++ b/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;
+
+
+    /**
+     * 寰俊鍏紬鍙疯幏鍙朤OKEN鍦板潃
+     */
+    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";
+
+    /**
+     * 寰俊鍏紬鍙疯幏鍙朥SERINFO淇℃伅鍦板潃
+     */
+    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銆佺粦瀹氬井淇penid鍒癱ompanyUser琛ㄤ俊鎭�
+                    companyUser.setOpenid(dto.getOpenid());
+                    companyUser.setUnionid(dto.getUnionid());
+                    companyUserExtMapper.updateById(companyUser);
+                    //2銆佹竻绌哄悓鐢ㄦ埛鍏朵綑companyUser琛╫penid涓� 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;
+        }
+    }
+
+}

--
Gitblit v1.9.3