lipenghui 6 сар өмнө
parent
commit
7a0194dc5b

+ 1 - 1
pom.xml

@@ -26,7 +26,7 @@
 <!--        <module>yudao-module-iot</module>-->
 <!--        <module>yudao-module-iot</module>-->
         <!-- AI 大模型的开启,请参考 https://doc.iocoder.cn/ai/build/ 文档,对 JDK 版本要要求! -->
         <!-- AI 大模型的开启,请参考 https://doc.iocoder.cn/ai/build/ 文档,对 JDK 版本要要求! -->
 <!--        <module>yudao-module-ai</module>-->
 <!--        <module>yudao-module-ai</module>-->
-        <module>yudao-module-things</module>
+<!--        <module>yudao-module-things</module>-->
     </modules>
     </modules>
 
 
     <name>${project.artifactId}</name>
     <name>${project.artifactId}</name>

+ 0 - 7
yudao-framework/yudao-spring-boot-starter-web/src/main/resources/banner.txt

@@ -8,10 +8,3 @@ Spring Boot Version: ${spring-boot.version}
 |  . `  | |  |  |  |    |   _  <  |  |  |  | |  | |_ |
 |  . `  | |  |  |  |    |   _  <  |  |  |  | |  | |_ |
 |  |\   | |  `--'  |    |  |_)  | |  `--'  | |  |__| |
 |  |\   | |  `--'  |    |  |_)  | |  `--'  | |  |__| |
 |__| \__|  \______/     |______/   \______/   \______|
 |__| \__|  \______/     |______/   \______/   \______|
-
-███╗   ██╗ ██████╗     ██████╗ ██╗   ██╗ ██████╗
-████╗  ██║██╔═══██╗    ██╔══██╗██║   ██║██╔════╝
-██╔██╗ ██║██║   ██║    ██████╔╝██║   ██║██║  ███╗
-██║╚██╗██║██║   ██║    ██╔══██╗██║   ██║██║   ██║
-██║ ╚████║╚██████╔╝    ██████╔╝╚██████╔╝╚██████╔╝
-╚═╝  ╚═══╝ ╚═════╝     ╚═════╝  ╚═════╝  ╚═════╝

+ 2 - 0
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/dto/SocialUserRespDTO.java

@@ -32,4 +32,6 @@ public class SocialUserRespDTO {
      */
      */
     private Long userId;
     private Long userId;
 
 
+    private String unionId;
+
 }
 }

+ 26 - 10
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java

@@ -14,11 +14,14 @@ import cn.iocoder.yudao.module.system.api.social.dto.SocialUserRespDTO;
 import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*;
 import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*;
 import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
 import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
 import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
+import cn.iocoder.yudao.module.system.dal.dataobject.social.SocialUserBindDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
+import cn.iocoder.yudao.module.system.dal.mysql.social.SocialUserBindMapper;
 import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum;
 import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum;
 import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum;
 import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum;
 import cn.iocoder.yudao.module.system.enums.oauth2.OAuth2ClientConstants;
 import cn.iocoder.yudao.module.system.enums.oauth2.OAuth2ClientConstants;
 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
 import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
+import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
 import cn.iocoder.yudao.module.system.service.logger.LoginLogService;
 import cn.iocoder.yudao.module.system.service.logger.LoginLogService;
 import cn.iocoder.yudao.module.system.service.member.MemberService;
 import cn.iocoder.yudao.module.system.service.member.MemberService;
 import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
 import cn.iocoder.yudao.module.system.service.oauth2.OAuth2TokenService;
@@ -69,7 +72,8 @@ public class AdminAuthServiceImpl implements AdminAuthService {
     private CaptchaService captchaService;
     private CaptchaService captchaService;
     @Resource
     @Resource
     private SmsCodeApi smsCodeApi;
     private SmsCodeApi smsCodeApi;
-
+    @Resource
+    private SocialUserBindMapper socialUserBindMapper;
     /**
     /**
      * 验证码的开关,默认为 true
      * 验证码的开关,默认为 true
      */
      */
@@ -170,20 +174,32 @@ public class AdminAuthServiceImpl implements AdminAuthService {
     @Override
     @Override
     public AuthLoginRespVO socialLogin(AuthSocialLoginReqVO reqVO) {
     public AuthLoginRespVO socialLogin(AuthSocialLoginReqVO reqVO) {
         // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
         // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
-//        SocialUserRespDTO socialUser = socialUserService.getSocialUserByCode(UserTypeEnum.ADMIN.getValue(), reqVO.getType(),
-//                reqVO.getCode(), reqVO.getState());
-//        if (socialUser == null || socialUser.getUserId() == null) {
-//            throw exception(AUTH_THIRD_LOGIN_NOT_BIND);
-//        }
+        SocialUserRespDTO socialUser = socialUserService.getSocialUserByCode(UserTypeEnum.ADMIN.getValue(), reqVO.getType(),
+                reqVO.getCode(), reqVO.getState());
+        if (socialUser == null ) {
+            throw exception(AUTH_THIRD_LOGIN_NOT_BIND);
+        }
         try {
         try {
-            String userIdByAuthCode = DingtalkUtil.getUserIdByAuthCode(reqVO.getCode());
-            OapiV2UserGetResponse.UserGetResponse userDetail = DingtalkUtil.getUserDetail(userIdByAuthCode);
+            // 获得绑定用户
+            SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserTypeAndSocialUserId(UserTypeEnum.ADMIN.getValue(),
+                    socialUser.getUserId());
+            AdminUserDO user;
+            if (Objects.isNull(socialUserBind)) {
+                String userId = DingtalkUtil.getUserIdByUnion(socialUser.getUnionId());
+                OapiV2UserGetResponse.UserGetResponse userDetail = DingtalkUtil.getUserDetail(userId);
+                user = userService.getUserByUsername(userDetail.getJobNumber());
+                // 绑定钉钉
+                SocialUserBindDO newSocialUserBind = SocialUserBindDO.builder()
+                        .userId(user.getId()).userType(UserTypeEnum.ADMIN.getValue())
+                        .socialUserId(socialUser.getUserId()).socialType(SocialTypeEnum.DINGTALK.getType()).build();
+                socialUserBindMapper.insert(newSocialUserBind);
+            } else {
+                user = userService.getUser(socialUserBind.getUserId());
+            }
             // 获得用户
             // 获得用户
-            AdminUserDO user = userService.getUserByUsername(userDetail.getJobNumber());
             if (user == null) {
             if (user == null) {
                 throw exception(USER_NOT_EXISTS);
                 throw exception(USER_NOT_EXISTS);
             }
             }
-
             // 创建 Token 令牌,记录登录日志
             // 创建 Token 令牌,记录登录日志
             return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL);
             return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL);
         } catch (Exception e) {
         } catch (Exception e) {

+ 5 - 14
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/social/SocialUserServiceImpl.java

@@ -107,7 +107,7 @@ public class SocialUserServiceImpl implements SocialUserService {
         SocialUserDO socialUser = socialUserMapper.selectById(socialUserBind.getSocialUserId());
         SocialUserDO socialUser = socialUserMapper.selectById(socialUserBind.getSocialUserId());
         Assert.notNull(socialUser, "社交用户不能为空");
         Assert.notNull(socialUser, "社交用户不能为空");
         return new SocialUserRespDTO(socialUser.getOpenid(), socialUser.getNickname(), socialUser.getAvatar(),
         return new SocialUserRespDTO(socialUser.getOpenid(), socialUser.getNickname(), socialUser.getAvatar(),
-                socialUserBind.getUserId());
+                socialUserBind.getUserId(), "");
     }
     }
 
 
     @Override
     @Override
@@ -115,19 +115,10 @@ public class SocialUserServiceImpl implements SocialUserService {
         // 获得社交用户
         // 获得社交用户
         SocialUserDO socialUser = authSocialUser(socialType, userType, code, state);
         SocialUserDO socialUser = authSocialUser(socialType, userType, code, state);
         Assert.notNull(socialUser, "社交用户不能为空");
         Assert.notNull(socialUser, "社交用户不能为空");
-        JSONObject jsonObject = JSON.parseObject(socialUser.getRawUserInfo());
-        String dingId = String.valueOf(jsonObject.get("dingId"));
-        try {
-            OapiV2UserGetResponse.UserGetResponse userDetail = DingtalkUtil.getUserDetail(dingId);
-
-            // 获得绑定用户
-            SocialUserBindDO socialUserBind = socialUserBindMapper.selectByUserTypeAndSocialUserId(userType,
-                    socialUser.getId());
-            return new SocialUserRespDTO(socialUser.getOpenid(), userDetail.getJobNumber(), socialUser.getAvatar(),
-                    socialUserBind != null ? socialUserBind.getUserId() : null);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
+        JSONObject jsonObject = JSONObject.parseObject(socialUser.getRawUserInfo());
+        String unionid = String.valueOf(jsonObject.get("unionid"));
+            return new SocialUserRespDTO(socialUser.getOpenid(), "userId", socialUser.getAvatar(),
+                    socialUser.getId(), unionid);
     }
     }
 
 
     /**
     /**

+ 17 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/util/DingtalkUtil.java

@@ -1,17 +1,25 @@
 package cn.iocoder.yudao.module.system.util;
 package cn.iocoder.yudao.module.system.util;
 
 
+import com.alibaba.fastjson.JSONObject;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DefaultDingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.DingTalkClient;
 import com.dingtalk.api.request.OapiGettokenRequest;
 import com.dingtalk.api.request.OapiGettokenRequest;
+import com.dingtalk.api.request.OapiUserGetbyunionidRequest;
 import com.dingtalk.api.request.OapiV2UserGetRequest;
 import com.dingtalk.api.request.OapiV2UserGetRequest;
 import com.dingtalk.api.request.OapiV2UserGetuserinfoRequest;
 import com.dingtalk.api.request.OapiV2UserGetuserinfoRequest;
 import com.dingtalk.api.response.OapiGettokenResponse;
 import com.dingtalk.api.response.OapiGettokenResponse;
+import com.dingtalk.api.response.OapiUserGetbyunionidResponse;
 import com.dingtalk.api.response.OapiV2UserGetResponse;
 import com.dingtalk.api.response.OapiV2UserGetResponse;
 import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
 import com.dingtalk.api.response.OapiV2UserGetuserinfoResponse;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.annotation.Value;
 
 
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
 /**
 /**
  * @author suiyy
  * @author suiyy
  * @date 20230602
  * @date 20230602
@@ -65,6 +73,15 @@ public class DingtalkUtil {
         return response.getAccessToken();
         return response.getAccessToken();
     }
     }
 
 
+    public static String getUserIdByUnion(String union) throws Exception {
+        String accessToken = getAccessToken();
+        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/getbyunionid");
+        OapiUserGetbyunionidRequest req = new OapiUserGetbyunionidRequest();
+        req.setUnionid(union);
+        OapiUserGetbyunionidResponse rsp = client.execute(req, accessToken);
+        return rsp.getResult().getUserid();
+    }
+
     /**
     /**
      * 根据免登授权码获取用户id
      * 根据免登授权码获取用户id
      *
      *

+ 1 - 1
yudao-module-system/yudao-module-system-biz/src/test/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImplTest.java

@@ -242,7 +242,7 @@ public class AdminAuthServiceImplTest extends BaseDbUnitTest {
         // mock 方法(绑定的用户编号)
         // mock 方法(绑定的用户编号)
         Long userId = 1L;
         Long userId = 1L;
         when(socialUserService.getSocialUserByCode(eq(UserTypeEnum.ADMIN.getValue()), eq(reqVO.getType()),
         when(socialUserService.getSocialUserByCode(eq(UserTypeEnum.ADMIN.getValue()), eq(reqVO.getType()),
-                eq(reqVO.getCode()), eq(reqVO.getState()))).thenReturn(new SocialUserRespDTO(randomString(), randomString(), randomString(), userId));
+                eq(reqVO.getCode()), eq(reqVO.getState()))).thenReturn(new SocialUserRespDTO(randomString(), randomString(), randomString(), userId,""));
         // mock(用户)
         // mock(用户)
         AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setId(userId));
         AdminUserDO user = randomPojo(AdminUserDO.class, o -> o.setId(userId));
         when(userService.getUser(eq(userId))).thenReturn(user);
         when(userService.getUser(eq(userId))).thenReturn(user);