From fed531a1ef6ed1db4eca448a6437353e611c603b Mon Sep 17 00:00:00 2001
From: zzs <hi@vio.vin>
Date: Tue, 14 Jan 2025 15:21:43 +0800
Subject: [PATCH] feat:yunzhijia openid login

---
 .../system/enums/ErrorCodeConstants.java      |  1 +
 .../controller/admin/auth/AuthController.java |  7 ++++++
 .../admin/auth/vo/AuthOpenIdLoginReqVO.java   | 22 ++++++++++++++++++
 .../admin/user/vo/user/UserSaveReqVO.java     |  3 +++
 .../dal/dataobject/user/AdminUserDO.java      |  5 ++++
 .../system/service/auth/AdminAuthService.java |  1 +
 .../service/auth/AdminAuthServiceImpl.java    | 12 ++++++++++
 .../system/service/user/AdminUserService.java | 22 ++++++++++++++----
 .../service/user/AdminUserServiceImpl.java    | 23 +++++++++++++++----
 9 files changed, 87 insertions(+), 9 deletions(-)
 create mode 100644 ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/auth/vo/AuthOpenIdLoginReqVO.java

diff --git a/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/enums/ErrorCodeConstants.java b/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/enums/ErrorCodeConstants.java
index ade32bf..779abfd 100644
--- a/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/enums/ErrorCodeConstants.java
+++ b/ensign-module-system/ensign-module-system-api/src/main/java/com/ensign/crm/module/system/enums/ErrorCodeConstants.java
@@ -15,6 +15,7 @@ public interface ErrorCodeConstants {
     ErrorCode AUTH_LOGIN_CAPTCHA_CODE_ERROR = new ErrorCode(1_002_000_004, "验证码不正确,原因:{}");
     ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1_002_000_005, "未绑定账号,需要进行绑定");
     ErrorCode AUTH_MOBILE_NOT_EXISTS = new ErrorCode(1_002_000_007, "手机号不存在");
+    ErrorCode AUTH_OPEN_ID_NOT_EXISTS = new ErrorCode(1_002_000_008, "未找到对应用户");
 
     // ========== 菜单模块 1-002-001-000 ==========
     ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1_002_001_000, "已经存在该名字的菜单");
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/auth/AuthController.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/auth/AuthController.java
index 787f64b..3c80d4c 100644
--- a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/auth/AuthController.java
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/auth/AuthController.java
@@ -69,6 +69,13 @@ public class AuthController {
         return success(authService.login(reqVO));
     }
 
+    @PostMapping("/login-open-id")
+    @PermitAll
+    @Operation(summary = "使用云之家OpenId登录")
+    public CommonResult<AuthLoginRespVO> openIdLogin(@RequestBody @Valid AuthOpenIdLoginReqVO reqVO) {
+        return success(authService.loginWithOpenId(reqVO));
+    }
+
     @PostMapping("/logout")
     @PermitAll
     @Operation(summary = "登出系统")
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/auth/vo/AuthOpenIdLoginReqVO.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/auth/vo/AuthOpenIdLoginReqVO.java
new file mode 100644
index 0000000..829ade6
--- /dev/null
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/auth/vo/AuthOpenIdLoginReqVO.java
@@ -0,0 +1,22 @@
+package com.ensign.crm.module.system.controller.admin.auth.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Description: 云之家登录参数
+ * @Date: 2025/1/14 14:24
+ * @Created: by ZZSLL
+ */
+
+@Schema(description = "管理后台 - 云之家OpenId登录 Request VO")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Builder
+public class AuthOpenIdLoginReqVO {
+    private String openId;
+}
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/user/vo/user/UserSaveReqVO.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/user/vo/user/UserSaveReqVO.java
index 89a0df1..08bf39f 100644
--- a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/user/vo/user/UserSaveReqVO.java
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/controller/admin/user/vo/user/UserSaveReqVO.java
@@ -103,4 +103,7 @@ public class UserSaveReqVO {
     @Schema(description = "用户部门拼接", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
     private String deptIdColl;
 
+    @Schema(description = "云之家OpenId", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
+    private String openId;
+
 }
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/dal/dataobject/user/AdminUserDO.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/dal/dataobject/user/AdminUserDO.java
index c69ed92..9a4ac27 100644
--- a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/dal/dataobject/user/AdminUserDO.java
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/dal/dataobject/user/AdminUserDO.java
@@ -115,4 +115,9 @@ public class AdminUserDO extends TenantBaseDO {
      * 部门id,拼接
      */
     private String deptIdColl;
+
+    /**
+     * 云之家OpenId
+     */
+    private String openId;
 }
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/auth/AdminAuthService.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/auth/AdminAuthService.java
index d19ffff..6c8bc1d 100644
--- a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/auth/AdminAuthService.java
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/auth/AdminAuthService.java
@@ -70,4 +70,5 @@ public interface AdminAuthService {
      */
     AuthLoginRespVO refreshToken(String refreshToken);
 
+    AuthLoginRespVO loginWithOpenId(@Valid AuthOpenIdLoginReqVO reqVO);
 }
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/auth/AdminAuthServiceImpl.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/auth/AdminAuthServiceImpl.java
index 3602a44..0fc8776 100644
--- a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/auth/AdminAuthServiceImpl.java
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/auth/AdminAuthServiceImpl.java
@@ -247,4 +247,16 @@ public class AdminAuthServiceImpl implements AdminAuthService {
         return UserTypeEnum.ADMIN;
     }
 
+    /**
+     * 通过云之家OpenId登录
+     */
+    @Override
+    public AuthLoginRespVO loginWithOpenId(AuthOpenIdLoginReqVO reqVO) {
+
+        AdminUserDO user = userService.getUserByOpenId(reqVO.getOpenId());
+        if (user == null) {
+            throw exception(AUTH_OPEN_ID_NOT_EXISTS) ;
+        }
+        return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL);
+    }
 }
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/user/AdminUserService.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/user/AdminUserService.java
index 3203d76..9b36a0b 100644
--- a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/user/AdminUserService.java
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/user/AdminUserService.java
@@ -1,18 +1,22 @@
 package com.ensign.crm.module.system.service.user;
 
 import cn.hutool.core.collection.CollUtil;
+import com.ensign.crm.framework.common.pojo.PageResult;
 import com.ensign.crm.framework.common.util.collection.CollectionUtils;
 import com.ensign.crm.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
 import com.ensign.crm.module.system.controller.admin.user.vo.profile.UserProfileUpdateReqVO;
-import com.ensign.crm.module.system.controller.admin.user.vo.user.*;
-import com.ensign.crm.framework.common.pojo.PageResult;
+import com.ensign.crm.module.system.controller.admin.user.vo.user.UserImportExcelVO;
+import com.ensign.crm.module.system.controller.admin.user.vo.user.UserImportRespVO;
+import com.ensign.crm.module.system.controller.admin.user.vo.user.UserPageReqVO;
+import com.ensign.crm.module.system.controller.admin.user.vo.user.UserSaveReqVO;
 import com.ensign.crm.module.system.dal.dataobject.user.AdminUserDO;
 
 import javax.validation.Valid;
-import java.io.IOException;
 import java.io.InputStream;
-import java.net.URISyntaxException;
-import java.util.*;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 后台用户 Service 接口
@@ -202,4 +206,12 @@ public interface AdminUserService {
      * @return 是否匹配
      */
     boolean isPasswordMatch(String rawPassword, String encodedPassword);
+
+    /**
+     * 通过云之家OpenId查找用户
+     * @param openId 云之家OpenId
+     * @return 用户
+     */
+    AdminUserDO getUserByOpenId(String openId);
+
 }
diff --git a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/user/AdminUserServiceImpl.java b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/user/AdminUserServiceImpl.java
index c8b3b58..b4a2ff1 100644
--- a/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/user/AdminUserServiceImpl.java
+++ b/ensign-module-system/ensign-module-system-biz/src/main/java/com/ensign/crm/module/system/service/user/AdminUserServiceImpl.java
@@ -11,6 +11,7 @@ import com.ensign.crm.framework.common.util.collection.CollectionUtils;
 import com.ensign.crm.framework.common.util.object.BeanUtils;
 import com.ensign.crm.framework.common.util.validation.ValidationUtils;
 import com.ensign.crm.framework.datapermission.core.util.DataPermissionUtils;
+import com.ensign.crm.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.ensign.crm.module.infra.api.config.ConfigApi;
 import com.ensign.crm.module.infra.api.file.FileApi;
 import com.ensign.crm.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
@@ -34,8 +35,6 @@ import com.mzt.logapi.context.LogRecordContext;
 import com.mzt.logapi.service.impl.DiffParseFunction;
 import com.mzt.logapi.starter.annotation.LogRecord;
 import lombok.extern.slf4j.Slf4j;
-import org.jetbrains.annotations.NotNull;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
@@ -43,9 +42,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import javax.validation.ConstraintViolationException;
-import java.io.IOException;
 import java.io.InputStream;
-import java.net.URISyntaxException;
 import java.time.LocalDateTime;
 import java.util.*;
 
@@ -511,4 +508,22 @@ public class AdminUserServiceImpl implements AdminUserService {
     private String encodePassword(String password) {
         return passwordEncoder.encode(password);
     }
+
+    @Override
+    public AdminUserDO getUserByOpenId(String openId) {
+        LambdaQueryWrapperX<AdminUserDO> queryWrapperX = new LambdaQueryWrapperX<>();
+        queryWrapperX.eq(AdminUserDO::getOpenId, openId);
+        List<AdminUserDO> users = userMapper.selectList(queryWrapperX);
+        if (users.isEmpty()) {
+            return null;
+        }
+        AdminUserDO user = users.get(0);
+        Integer status = user.getStatus();
+
+        if (Objects.equals(status, CommonStatusEnum.DISABLE.getStatus())) {
+            throw exception(AUTH_LOGIN_USER_DISABLED);
+        } else {
+            return user;
+        }
+    }
 }