From 8f63d5ce747106195b279e1c158fd12f9997a770 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期二, 18 三月 2025 19:08:40 +0800
Subject: [PATCH] 检验任务代码迁移&爱尚平台对接测试

---
 inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java             |   20 
 ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoUserInfoModel.java                     |   40 ++
 ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoOauthTokenModel.java                   |   20 +
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsByOpenIdServiceImpl.java |   46 +++
 notice-server/src/main/java/com/ruoyi/notice/mapper/InformationNotificationMapper.java            |    3 
 ruoyi-admin/src/main/resources/application.yml                                                    |   12 
 notice-server/src/main/java/com/ruoyi/notice/controller/InformationNotificationController.java    |   81 +++++
 ruoyi-common/pom.xml                                                                              |    6 
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java         |   18 
 cnas-require/src/main/java/com/ruoyi/require/controller/DeviceController.java                     |    4 
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java                |  208 +++++++++++++
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationProvider.java  |   42 ++
 ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationToken.java     |   63 ++++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java                 |   35 ++
 inspect-server/src/main/java/com/ruoyi/inspect/dto/InspectionOrderDTO.java                        |   51 +++
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java              |   10 
 inspect-server/src/main/java/com/ruoyi/inspect/dto/UpInsOrderDTO.java                             |    3 
 inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java                        |    6 
 ruoyi-admin/src/main/resources/i18n/messages.properties                                           |   71 ++--
 ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java   |   37 +
 ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java                                |    3 
 ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java                      |   26 +
 ruoyi-common/src/main/java/com/ruoyi/common/config/SsoBean.java                                   |   37 ++
 23 files changed, 767 insertions(+), 75 deletions(-)

diff --git a/cnas-require/src/main/java/com/ruoyi/require/controller/DeviceController.java b/cnas-require/src/main/java/com/ruoyi/require/controller/DeviceController.java
index 5215778..6db6457 100644
--- a/cnas-require/src/main/java/com/ruoyi/require/controller/DeviceController.java
+++ b/cnas-require/src/main/java/com/ruoyi/require/controller/DeviceController.java
@@ -160,7 +160,7 @@
     }
 
     @ApiOperation(value = "閫氳繃椤圭洰鑾峰彇璁惧鍒楄〃")
-    @PostMapping("/selectDeviceByCategory")
+    @GetMapping("/selectDeviceByCategory")
     public Result selectDeviceByCategory(String inspectionItem, String inspectionItemSubclass,String sonLaboratory) {
         return Result.success(deviceService.selectDeviceByCategory(inspectionItem, inspectionItemSubclass,sonLaboratory));
     }
@@ -192,7 +192,7 @@
 
     @ApiOperation(value = "鍒ゆ柇璇ヨ澶囨槸鍚﹀彲浠ユ暟閲�")
     @GetMapping("/determineWhetherToCollectData")
-    public Result<?> determineWhetherToCollectData(@RequestParam("managementNumber") String managementNumber, HttpServletRequest request) {
+    public Result<?> determineWhetherToCollectData(String managementNumber, HttpServletRequest request) {
         return deviceService.determineWhetherToCollectData(managementNumber, request);
     }
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
index d33fb46..8e0992f 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/controller/InsOrderPlanController.java
@@ -102,8 +102,8 @@
 
     @ApiOperation(value = "浜ゆ帴鎸夐挳")
     @PostMapping("/upPlanUser")
-    public Result<?> upPlanUser(Integer userId, Integer orderId, String sonLaboratory) {
-        return Result.success(insOrderPlanService.upPlanUser(userId, orderId, sonLaboratory));
+    public Result<?> upPlanUser(@RequestBody UpInsOrderDTO upInsOrderDTO) {
+        return Result.success(insOrderPlanService.upPlanUser(upInsOrderDTO.getUserId(), upInsOrderDTO.getOrderId(), upInsOrderDTO.getSonLaboratory()));
     }
 
     @ApiOperation(value = "鍒ゆ柇浜ゆ帴鐨勮瘯楠屽")
@@ -142,18 +142,18 @@
     }
 
     /**
-     * @param param         妯℃澘鍐呭
-     * @param currentTable  褰撳墠妯℃澘id
-     * @param sampleId      褰撳墠鏍峰搧id
-     * @param orderId       褰撳墠璁㈠崟id
-     * @param sonLaboratory 瀛愯瘯楠屽
+     * @param inspectionOrderDTO         妫�楠屾暟鎹�
      * @return
      */
     @ApiOperation(value = "淇濆瓨妫�楠屽唴瀹�")
     @PostMapping("/saveInsContext")
-    public Result<?> saveInsContext(String param, Integer currentTable, Integer sampleId, Integer orderId, String sonLaboratory,Boolean isDelete) {
-        Map<String, Object> param2 = JSON.parseObject(param, Map.class);
-        insOrderPlanService.saveInsContext(param2, currentTable, sampleId, orderId, sonLaboratory,isDelete);
+    public Result<?> saveInsContext(@RequestBody InspectionOrderDTO inspectionOrderDTO) {
+        insOrderPlanService.saveInsContext(inspectionOrderDTO.getParam(),
+                inspectionOrderDTO.getCurrentTable(),
+                inspectionOrderDTO.getSampleId(),
+                inspectionOrderDTO.getOrderId(),
+                inspectionOrderDTO.getSonLaboratory(),
+                inspectionOrderDTO.getIsDelete());
         return Result.success();
     }
 
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/InspectionOrderDTO.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/InspectionOrderDTO.java
new file mode 100644
index 0000000..432a612
--- /dev/null
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/InspectionOrderDTO.java
@@ -0,0 +1,51 @@
+package com.ruoyi.inspect.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 妫�楠屼繚瀛樻暟鎹紶杈撳璞to
+ */
+@Data
+public class InspectionOrderDTO implements Serializable {
+
+    /**
+     * 妫�楠屽弬鏁�
+     */
+    @ApiModelProperty("妫�楠屽弬鏁�")
+    private Map<String, Object> param;
+
+    /**
+     * 褰撳墠妯℃澘id
+     */
+    @ApiModelProperty("褰撳墠妯℃澘id")
+    private Integer currentTable;
+
+    /**
+     * 鏍峰搧id
+     */
+    @ApiModelProperty("鏍峰搧id")
+    private Integer sampleId;
+
+    /**
+     * 璁㈠崟id
+     */
+    @ApiModelProperty("璁㈠崟id")
+    private Integer orderId;
+
+    /**
+     * 瀛愬疄楠屽
+     */
+    @ApiModelProperty("瀛愬疄楠屽")
+    private String sonLaboratory;
+
+    /**
+     * 鏄惁鍒犻櫎
+     */
+    @ApiModelProperty("鏄惁鍒犻櫎")
+    private Boolean isDelete;
+
+}
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/dto/UpInsOrderDTO.java b/inspect-server/src/main/java/com/ruoyi/inspect/dto/UpInsOrderDTO.java
index c8da5f7..47d047b 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/dto/UpInsOrderDTO.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/dto/UpInsOrderDTO.java
@@ -24,4 +24,7 @@
     @ApiModelProperty(value = "瀛愯瘯楠屽")
     private String sonLaboratory;
 
+    @ApiModelProperty("浜ゆ帴浜哄憳id")
+    private Integer userId;
+
 }
diff --git a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java
index ed22a65..13230c6 100644
--- a/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java
+++ b/inspect-server/src/main/java/com/ruoyi/inspect/mapper/InsSampleMapper.java
@@ -49,13 +49,13 @@
 
     List<SampleProductDto3> selectSampleProductListByOrderId3(@Param("ids") List<Integer> ids);
 
-    List<SampleProductDto> getInsOrderAndSample(Integer id, String laboratory);
+    List<SampleProductDto> getInsOrderAndSample(@Param("id")Integer id, @Param("laboratory")String laboratory);
 
     String getSampleEn(String sample);
 
-    List<InsProduct> getInsProduct1(Integer id, String laboratory);
+    List<InsProduct> getInsProduct1(@Param("id") Integer id, @Param("laboratory") String laboratory);
 
-    List<InsProduct> getInsProduct5(Integer id, String laboratory);
+    List<InsProduct> getInsProduct5(@Param("id") Integer id, @Param("laboratory") String laboratory);
 
     List<InsProduct> getInsProduct2(@Param("id") Integer id, @Param("sonLaboratory") String sonLaboratory);
 
diff --git a/notice-server/src/main/java/com/ruoyi/notice/controller/InformationNotificationController.java b/notice-server/src/main/java/com/ruoyi/notice/controller/InformationNotificationController.java
new file mode 100644
index 0000000..031ef9e
--- /dev/null
+++ b/notice-server/src/main/java/com/ruoyi/notice/controller/InformationNotificationController.java
@@ -0,0 +1,81 @@
+package com.ruoyi.notice.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.domain.Result;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.notice.pojo.InformationNotification;
+import com.ruoyi.notice.service.InformationNotificationService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 娑堟伅閫氱煡 鍓嶇鎺у埗鍣�
+ * </p>
+ *
+ * @author 姹熻嫃榈烽洀缃戠粶绉戞妧鏈夐檺鍏徃
+ * @since 2024-04-23 02:14:30
+ */
+@Api(tags = "娑堟伅閫氱煡")
+@RestController
+@RequestMapping("/informationNotification")
+public class InformationNotificationController {
+
+    @Autowired
+    private InformationNotificationService informationNotificationService;
+
+    @ApiOperation(value = "娑堟伅閫氱煡-婊氬姩鍒嗛〉鏌ヨ")
+    @GetMapping("page")
+    public Result<?> getPage(Long size, Long current, String messageType) {
+        return Result.success(informationNotificationService.getPage(new Page<>(current, size), messageType));
+    }
+
+    @ApiOperation(value = "娑堟伅閫氱煡-鏇存柊娑堟伅鐘舵�侊紙鎷掔粷銆佹帴鏀讹級")
+    @PutMapping("updateMessageStatus")
+    @Log(title = "娑堟伅閫氱煡", businessType = BusinessType.UPDATE)
+    public Result<?> updateMessageStatus(@RequestBody InformationNotification informationNotification) {
+        informationNotificationService.updateById(informationNotification);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "娑堟伅閫氱煡-鏍囪鎵�鏈変俊鎭负宸茶/鍒犻櫎鎵�鏈夊凡璇绘秷鎭�")
+    @PutMapping("informationReadOrDelete/{isMarkAllInformationRead}")
+    public Result<?> markAllInformationReadOrDeleteAllReadMessages(@PathVariable("isMarkAllInformationRead") Boolean isMarkAllInformationRead) {
+        informationNotificationService.markAllInformationReadOrDeleteAllReadMessages(isMarkAllInformationRead);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "娑堟伅閫氱煡-鍒犻櫎鏁版嵁")
+    @DeleteMapping("deleteDataBasedOnId")
+    @Log(title = "娑堟伅閫氱煡", businessType = BusinessType.DELETE)
+    public Result<?> deleteDataBasedOnId(Integer id) {
+        informationNotificationService.removeById(id);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "娑堟伅閫氱煡-鏌ヨ鏄惁瀛樺湪鏈鏁版嵁")
+    @GetMapping("checkForUnreadData")
+    public Result<?> checkForUnreadData() {
+        return Result.success(informationNotificationService.checkForUnreadData());
+    }
+
+    @ApiOperation(value = "娑堟伅閫氱煡-鐐瑰嚮璇︽儏瑙﹀彂淇敼鐘舵�佷负宸茶")
+    @PutMapping("triggerModificationStatusToRead/{id}")
+    @Log(title = "娑堟伅閫氱煡", businessType = BusinessType.UPDATE)
+    public Result<?> triggerModificationStatusToRead(@PathVariable("id") Integer id) {
+        informationNotificationService.triggerModificationStatusToRead(id);
+        return Result.success();
+    }
+
+    @ApiOperation(value = "娑堟伅閫氱煡-鑾峰彇棣栭〉鍥涚娑堟伅鏁伴噺")
+    @GetMapping("getNumberFourTypesMessagesHomePage")
+    public Result<?> getNumberFourTypesMessagesHomePage() {
+        Map<String, Object> data = informationNotificationService.getNumberFourTypesMessagesHomePage();
+        return Result.success(data);
+    }
+}
diff --git a/notice-server/src/main/java/com/ruoyi/notice/mapper/InformationNotificationMapper.java b/notice-server/src/main/java/com/ruoyi/notice/mapper/InformationNotificationMapper.java
index 50525b8..6ce4c80 100644
--- a/notice-server/src/main/java/com/ruoyi/notice/mapper/InformationNotificationMapper.java
+++ b/notice-server/src/main/java/com/ruoyi/notice/mapper/InformationNotificationMapper.java
@@ -6,6 +6,7 @@
 import com.ruoyi.notice.dto.InformationNotificationDto;
 import com.ruoyi.notice.pojo.InformationNotification;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -18,5 +19,5 @@
 @Mapper
 public interface InformationNotificationMapper extends BaseMapper<InformationNotification> {
 
-    IPage<InformationNotificationDto> getPage(Page page, String messageType, Integer userId);
+    IPage<InformationNotificationDto> getPage(Page page, @Param("messageType") String messageType, @Param("userId")Integer userId);
 }
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
index f61208e..30c7a70 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
@@ -67,6 +67,16 @@
     }
 
     /**
+     * 鏍规嵁瀛楀吀鍚嶇О鏌ヨ瀛楀吀鏁版嵁
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:query')")
+    @GetMapping(value = "/selectDictDataByName/{dictName}")
+    public AjaxResult selectDictDataByName(@PathVariable String dictName)
+    {
+        return success(dictTypeService.selectDictDataByName(dictName));
+    }
+
+    /**
      * 鏂板瀛楀吀绫诲瀷
      */
     @PreAuthorize("@ss.hasPermi('system:dict:add')")
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
index 73768ba..19000a3 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -2,7 +2,9 @@
 
 import java.util.List;
 import java.util.Set;
+import java.util.UUID;
 
+import com.ruoyi.common.config.SsoBean;
 import com.ruoyi.common.core.vo.SysUserVO;
 import com.ruoyi.system.mapper.UserMapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -44,6 +46,9 @@
 
     @Autowired
     private UserMapper userMapper;
+
+    @Autowired
+    private SsoBean ssoBean;
 
     /**
      * 鐧诲綍鏂规硶
@@ -103,4 +108,34 @@
         List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
         return AjaxResult.success(menuService.buildMenus(menus));
     }
+
+
+    /**
+     * 鑾峰彇缁熶竴鐧诲綍骞冲彴鑾峰彇CODE鍦板潃
+     *
+     * @return
+     */
+
+    @GetMapping("/getSsoAuthUrl")
+    public AjaxResult getSsoAuthUrl() {
+        String uuid = UUID.randomUUID().toString();
+        return AjaxResult.success("鎿嶄綔鎴愬姛", ssoBean.getUrl() + "/oauth2/auth?response_type=code&scope=openid&client_id=" + ssoBean.getClientId() + "&redirect_uri=" + ssoBean.getCallbackUrl() + "&state=" + uuid);
+    }
+
+    /**
+     * 鍗曠偣鐧诲綍
+     *
+     * @param code 鐧诲綍淇℃伅
+     * @return 缁撴灉
+     */
+    @PostMapping("/loginBySSO")
+    public AjaxResult loginBySSO(String code)
+    {
+        AjaxResult ajax = AjaxResult.success();
+        // 鐢熸垚浠ょ墝
+        String token = loginService.loginBySSO(code);
+        ajax.put(Constants.TOKEN, token);
+        return ajax;
+    }
+
 }
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 482ab87..5812b05 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -36,6 +36,7 @@
   level:
     com.ruoyi: debug
     org.springframework: warn
+    com.deepoove: off #鍏抽棴poi-tl鏃ュ織
 
 # 鐢ㄦ埛閰嶇疆
 user:
@@ -47,6 +48,11 @@
 
 # Spring閰嶇疆
 spring:
+  jackson: # 鍏ㄥ眬鏃堕棿澶勭悊 LocalDateTime鏃堕棿搴忓垪鍙�
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
+    serialization:
+      write-dates-as-timestamps: false
   #rabbitmq閰嶇疆
   rabbitmq:
     host: 127.0.0.1
@@ -145,3 +151,9 @@
     cache-enabled: false
     log-impl: # org.apache.ibatis.logging.stdout.StdOutImpl
 
+#闆嗗洟缁熶竴鐧诲綍
+sso:
+  url: https://ztt-sso.asuncloud.net
+  clientId: 47ded514-f447-43b4-afdf-181c10e2222d
+  clientSecret: ea93d26a68863da5d71a6e3355ec22df
+  callbackUrl: https://ztzb-lims.ztt.cn/thirdpartylogin
diff --git a/ruoyi-admin/src/main/resources/i18n/messages.properties b/ruoyi-admin/src/main/resources/i18n/messages.properties
index 93de005..b182920 100644
--- a/ruoyi-admin/src/main/resources/i18n/messages.properties
+++ b/ruoyi-admin/src/main/resources/i18n/messages.properties
@@ -1,38 +1,41 @@
-#閿欒娑堟伅
-not.null=* 蹇呴』濉啓
-user.jcaptcha.error=楠岃瘉鐮侀敊璇�
-user.jcaptcha.expire=楠岃瘉鐮佸凡澶辨晥
-user.not.exists=鐢ㄦ埛涓嶅瓨鍦�/瀵嗙爜閿欒
-user.password.not.match=鐢ㄦ埛涓嶅瓨鍦�/瀵嗙爜閿欒
-user.password.retry.limit.count=瀵嗙爜杈撳叆閿欒{0}娆�
-user.password.retry.limit.exceed=瀵嗙爜杈撳叆閿欒{0}娆★紝甯愭埛閿佸畾{1}鍒嗛挓
-user.password.delete=瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿宸茶鍒犻櫎
-user.blocked=鐢ㄦ埛宸插皝绂侊紝璇疯仈绯荤鐞嗗憳
-role.blocked=瑙掕壊宸插皝绂侊紝璇疯仈绯荤鐞嗗憳
-login.blocked=寰堥仐鎲撅紝璁块棶IP宸茶鍒楀叆绯荤粺榛戝悕鍗�
-user.logout.success=閫�鍑烘垚鍔�
+#\u9519\u8BEF\u6D88\u606F
+not.null=* \u5FC5\u987B\u586B\u5199
+user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF
+user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548
+user.not.exists=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF
+user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF
+user.sso.not.match=\u5355\u70B9\u767B\u5F55\u9A8C\u8BC1\u5931\u8D25
+user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21
+user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F
+user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\u5DF2\u88AB\u5220\u9664
+user.blocked=\u7528\u6237\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
+role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458
+login.blocked=\u5F88\u9057\u61BE\uFF0C\u8BBF\u95EEIP\u5DF2\u88AB\u5217\u5165\u7CFB\u7EDF\u9ED1\u540D\u5355
+user.logout.success=\u9000\u51FA\u6210\u529F
+user.sso.logout.success=\u5355\u70B9\u767B\u5F55\u9000\u51FA\u6210\u529F
 
-length.not.valid=闀垮害蹇呴』鍦▄min}鍒皗max}涓瓧绗︿箣闂�
+length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4
 
-user.username.not.valid=* 2鍒�20涓眽瀛椼�佸瓧姣嶃�佹暟瀛楁垨涓嬪垝绾跨粍鎴愶紝涓斿繀椤讳互闈炴暟瀛楀紑澶�
-user.password.not.valid=* 5-50涓瓧绗�
- 
-user.email.not.valid=閭鏍煎紡閿欒
-user.mobile.phone.number.not.valid=鎵嬫満鍙锋牸寮忛敊璇�
-user.login.success=鐧诲綍鎴愬姛
-user.register.success=娉ㄥ唽鎴愬姛
-user.notfound=璇烽噸鏂扮櫥褰�
-user.forcelogout=绠$悊鍛樺己鍒堕��鍑猴紝璇烽噸鏂扮櫥褰�
-user.unknown.error=鏈煡閿欒锛岃閲嶆柊鐧诲綍
+user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934
+user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26
 
-##鏂囦欢涓婁紶娑堟伅
-upload.exceed.maxSize=涓婁紶鐨勬枃浠跺ぇ灏忚秴鍑洪檺鍒剁殑鏂囦欢澶у皬锛�<br/>鍏佽鐨勬枃浠舵渶澶уぇ灏忔槸锛歿0}MB锛�
-upload.filename.exceed.length=涓婁紶鐨勬枃浠跺悕鏈�闀縶0}涓瓧绗�
+user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF
+user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF
+user.login.success=\u767B\u5F55\u6210\u529F
+user.sso.login.success=\u5355\u70B9\u767B\u5F55\u6210\u529F
+user.register.success=\u6CE8\u518C\u6210\u529F
+user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55
+user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55
+user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55
 
-##鏉冮檺
-no.permission=鎮ㄦ病鏈夋暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
-no.create.permission=鎮ㄦ病鏈夊垱寤烘暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
-no.update.permission=鎮ㄦ病鏈変慨鏀规暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
-no.delete.permission=鎮ㄦ病鏈夊垹闄ゆ暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
-no.export.permission=鎮ㄦ病鏈夊鍑烘暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
-no.view.permission=鎮ㄦ病鏈夋煡鐪嬫暟鎹殑鏉冮檺锛岃鑱旂郴绠$悊鍛樻坊鍔犳潈闄� [{0}]
+##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F
+upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01<br/>\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01
+upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26
+
+##\u6743\u9650
+no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
+no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}]
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index ef7ea58..33fc965 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -16,7 +16,11 @@
     </description>
 
     <dependencies>
-
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-common</artifactId>
+            <version>4.1.0</version>
+        </dependency>
         <!-- Spring妗嗘灦鍩烘湰鐨勬牳蹇冨伐鍏� -->
         <dependency>
             <groupId>org.springframework</groupId>
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/SsoBean.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/SsoBean.java
new file mode 100644
index 0000000..3d2f30b
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/SsoBean.java
@@ -0,0 +1,37 @@
+package com.ruoyi.common.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.stereotype.Component;
+
+/**
+ * zhuo
+ */
+
+@Configuration
+@Component
+@ConfigurationProperties(prefix = "sso")
+@Data
+public class SsoBean {
+
+    /**
+     * 鍗曠偣鐧诲綍搴旂敤id
+     */
+    private String clientId;
+
+    /**
+     * 鍗曠偣鐧诲綍搴旂敤绉橀挜
+     */
+    private String clientSecret;
+
+    /**
+     * 鍗曠偣鐧诲綍鏈嶅姟鍦板潃
+     */
+    private String url;
+
+    /**
+     * 鍗曠偣鐧诲綍鍥炶皟鍦板潃
+     */
+    private String callbackUrl;
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java
index f463e6f..5ab9b30 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/JackSonUtil.java
@@ -5,6 +5,7 @@
 import com.fasterxml.jackson.databind.JsonMappingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectWriter;
+import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
 import org.springframework.stereotype.Component;
 
@@ -20,7 +21,7 @@
  */
 @Component
 public class JackSonUtil {
-    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
+    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper().registerModule(new JavaTimeModule()).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
     private static final ObjectWriter OBJECT_WRITER = OBJECT_MAPPER.writerWithDefaultPrettyPrinter();
 
     public static void marshal(File file, Object value) throws Exception {
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
index 878b673..4fdc0b2 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -1,10 +1,13 @@
 package com.ruoyi.framework.config;
 
+import com.ruoyi.framework.web.ssoAuth.SsoCodeAuthenticationProvider;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.http.HttpMethod;
 import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.AuthenticationProvider;
 import org.springframework.security.authentication.ProviderManager;
 import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
 import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
@@ -21,6 +24,9 @@
 import com.ruoyi.framework.security.handle.AuthenticationEntryPointImpl;
 import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * spring security閰嶇疆
  *
@@ -34,7 +40,14 @@
      * 鑷畾涔夌敤鎴疯璇侀�昏緫
      */
     @Autowired
+    @Qualifier("UserDetailsServiceImpl")
     private UserDetailsService userDetailsService;
+    /**
+     * 鑷畾涔夌敤鎴疯璇侀�昏緫
+     */
+    @Autowired
+    @Qualifier("UserDetailsByOpenIdServiceImpl")
+    private UserDetailsService userDetailsServiceByOpenId;
 
     /**
      * 璁よ瘉澶辫触澶勭悊绫�
@@ -75,7 +88,16 @@
         DaoAuthenticationProvider daoAuthenticationProvider = new DaoAuthenticationProvider();
         daoAuthenticationProvider.setUserDetailsService(userDetailsService);
         daoAuthenticationProvider.setPasswordEncoder(bCryptPasswordEncoder());
-        return new ProviderManager(daoAuthenticationProvider);
+
+        // sso鐧婚檰閴存潈 Provider
+        SsoCodeAuthenticationProvider wxCodeAuthenticationProvider = new SsoCodeAuthenticationProvider();
+        wxCodeAuthenticationProvider.setUserDetailsService(userDetailsServiceByOpenId);
+        List<AuthenticationProvider> providers = new ArrayList<>();
+
+        providers.add(wxCodeAuthenticationProvider);
+        providers.add(daoAuthenticationProvider);
+
+        return new ProviderManager(providers);
     }
 
     /**
@@ -111,7 +133,7 @@
                 .authorizeHttpRequests((requests) -> {
                     permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll());
                     // 瀵逛簬鐧诲綍login 娉ㄥ唽register 楠岃瘉鐮乧aptchaImage 鍏佽鍖垮悕璁块棶
-                    requests.antMatchers("/login", "/register", "/captchaImage").permitAll()
+                    requests.antMatchers("/login", "/register", "/captchaImage","/getSsoAuthUrl","/loginBySSO").permitAll()
                             // 闈欐�佽祫婧愶紝鍙尶鍚嶈闂�
                             .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**", "/img/**", "/word/**").permitAll()
                             .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoOauthTokenModel.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoOauthTokenModel.java
new file mode 100644
index 0000000..f7e69e1
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoOauthTokenModel.java
@@ -0,0 +1,20 @@
+package com.ruoyi.framework.model;
+
+import lombok.Data;
+
+/**
+ * zhuo
+ */
+@Data
+public class SsoOauthTokenModel {
+
+    private String access_token;
+
+    private String expires_in;
+
+    private String id_token;
+
+    private String scope;
+
+    private String token_type;
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoUserInfoModel.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoUserInfoModel.java
new file mode 100644
index 0000000..e5a50f4
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/model/SsoUserInfoModel.java
@@ -0,0 +1,40 @@
+package com.ruoyi.framework.model;
+
+import com.alibaba.fastjson2.annotation.JSONField;
+import lombok.Data;
+
+/**
+ * zhuo
+ */
+@Data
+public class SsoUserInfoModel {
+    private String avatar;
+
+    @JSONField(name="nick_name")
+    private String nickName;
+
+    private String openid;
+
+    @JSONField(name="org_id")
+    private String orgId;
+
+    @JSONField(name="org_name")
+    private String orgName;
+
+    @JSONField(name="org_role")
+    private String orgRole;
+
+    @JSONField(name="phone_number")
+    private String phoneNumber;
+
+    private String sid;
+
+
+    private String sub;
+
+    @JSONField(name="employee_id")
+    private String employeeId;
+
+    @JSONField(name="department_code")
+    private String departmentCode;
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
index ba23910..732dd36 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
@@ -1,14 +1,7 @@
 package com.ruoyi.framework.security.handle;
 
-import java.io.IOException;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
 import com.alibaba.fastjson2.JSON;
+import com.ruoyi.common.config.SsoBean;
 import com.ruoyi.common.constant.Constants;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.model.LoginUser;
@@ -18,6 +11,16 @@
 import com.ruoyi.framework.manager.AsyncManager;
 import com.ruoyi.framework.manager.factory.AsyncFactory;
 import com.ruoyi.framework.web.service.TokenService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 /**
  * 鑷畾涔夐��鍑哄鐞嗙被 杩斿洖鎴愬姛
@@ -29,6 +32,10 @@
 {
     @Autowired
     private TokenService tokenService;
+    @Autowired
+    private RedisTemplate redisTemplate;
+    @Autowired
+    private SsoBean ssoBean;
 
     /**
      * 閫�鍑哄鐞�
@@ -40,14 +47,24 @@
             throws IOException, ServletException
     {
         LoginUser loginUser = tokenService.getLoginUser(request);
+        String loginOutUrl = null;
         if (StringUtils.isNotNull(loginUser))
         {
             String userName = loginUser.getUsername();
             // 鍒犻櫎鐢ㄦ埛缂撳瓨璁板綍
             tokenService.delLoginUser(loginUser.getToken());
             // 璁板綍鐢ㄦ埛閫�鍑烘棩蹇�
-            AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, MessageUtils.message("user.logout.success")));
+            // 娓呴櫎鍗曠偣鐧诲綍淇℃伅
+            Object idToken = redisTemplate.opsForValue().get("ssoOauthToken:idToken:" + userName);
+            if (idToken != null) {
+                loginOutUrl = ssoBean.getUrl() + "/oauth2/sessions/logout?id_token_hint=" + idToken;
+                redisTemplate.delete("ssoOauthToken:idToken:" + userName);
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, MessageUtils.message("user.sso.logout.success")));
+            } else {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, MessageUtils.message("user.logout.success")));
+            }
+
         }
-        ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success(MessageUtils.message("user.logout.success"))));
+        ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success(MessageUtils.message("user.logout.success"), loginOutUrl)));
     }
 }
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
index fe16427..40581ba 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -1,7 +1,29 @@
 package com.ruoyi.framework.web.service;
 
 import javax.annotation.Resource;
+import javax.net.ssl.SSLContext;
+
+import com.alibaba.fastjson.JSON;
+import com.ruoyi.common.config.SsoBean;
+import com.ruoyi.framework.model.SsoOauthTokenModel;
+import com.ruoyi.framework.model.SsoUserInfoModel;
+import com.ruoyi.framework.web.ssoAuth.SsoCodeAuthenticationToken;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.ssl.TrustStrategy;
+import org.apache.http.util.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.apache.http.NameValuePair;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -29,11 +51,23 @@
 import com.ruoyi.system.service.ISysConfigService;
 import com.ruoyi.system.service.ISysUserService;
 
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
 /**
  * 鐧诲綍鏍¢獙鏂规硶
  * 
  * @author ruoyi
  */
+@Slf4j
 @Component
 public class SysLoginService
 {
@@ -47,10 +81,17 @@
     private RedisCache redisCache;
     
     @Autowired
-    private ISysUserService userService;
+    private ISysUserService sysUserService;
 
     @Autowired
     private ISysConfigService configService;
+
+    @Autowired
+    private SsoBean ssoBean;
+
+    @Autowired
+    private RedisTemplate redisTemplate;
+
 
     /**
      * 鐧诲綍楠岃瘉
@@ -176,6 +217,169 @@
         sysUser.setUserId(userId);
         sysUser.setLoginIp(IpUtils.getIpAddr());
         sysUser.setLoginDate(DateUtils.getNowDate());
-        userService.updateUserProfile(sysUser);
+        sysUserService.updateUserProfile(sysUser);
     }
+
+    /**
+     * 鍗曠偣鐧诲綍
+     * @param code
+     * @return
+     */
+    public String loginBySSO(String code) {
+
+        // 鑾峰彇鍗曠偣鐧诲綍token
+        SsoOauthTokenModel tokenModel = this.getSsoAccessToken(code);
+        if (tokenModel == null) {
+            throw new RuntimeException("鍗曠偣鐧诲綍楠岃瘉澶辫触");
+        }
+
+        // 鑾峰彇鍗曠偣鐧诲綍鐢ㄦ埛淇℃伅
+        SsoUserInfoModel userInfo = this.getSsoUserInfo(tokenModel.getAccess_token());
+        if (userInfo == null) {
+            throw new RuntimeException("鍗曠偣鐧诲綍楠岃瘉澶辫触");
+        }
+
+        // 鏌ヨ鏈湴鐢ㄦ埛淇℃伅
+        LoginUser loginUser = this.getSsoLoginToken(userInfo.getEmployeeId());
+        recordLoginInfo(loginUser.getUserId());
+
+        // 鍒涘缓鐧诲綍淇℃伅
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(userInfo.getEmployeeId(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.sso.login.success")));
+        redisTemplate.opsForValue().set("ssoOauthToken:idToken:" + userInfo.getEmployeeId(), tokenModel.getId_token(), 3, TimeUnit.DAYS);
+        // 鐢熸垚token
+        return tokenService.createToken(loginUser);
+    }
+
+    /**
+     * ***** 鑾峰彇鏈湴鐢ㄦ埛淇℃伅 *****
+     * @param username
+     * @return
+     */
+    public LoginUser getSsoLoginToken(String username) {
+        // 鐢ㄦ埛楠岃瘉
+        Authentication authentication = null;
+        SysUser sysUser = sysUserService.selectUserByUserName(username);
+        if (sysUser == null) {
+            throw new ServiceException("褰撳墠绯荤粺娌℃湁璇ョ敤鎴�");
+        }
+        try
+        {
+            // 鏃犻渶瀵嗙爜鑾峰彇鐢ㄦ埛淇℃伅
+            authentication = authenticationManager.authenticate(new SsoCodeAuthenticationToken(username));
+        }
+        catch (Exception e)
+        {
+            if (e instanceof BadCredentialsException)
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.sso.not.match")));
+                throw new UserPasswordNotMatchException();
+            }
+            else
+            {
+                AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));
+                throw new ServiceException(e.getMessage());
+            }
+        }
+        finally
+        {
+            AuthenticationContextHolder.clearContext();
+        }
+        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.sso.login.success")));
+        return (LoginUser) authentication.getPrincipal();
+
+    }
+
+
+    /**
+     * **** 鑾峰彇鍗曠偣鐧诲綍token ****
+     * @param code
+     * @return
+     */
+    public SsoOauthTokenModel getSsoAccessToken(String code) {
+        List<NameValuePair> list = new LinkedList<>();
+        list.add(new BasicNameValuePair("grant_type", "authorization_code"));
+        list.add(new BasicNameValuePair("code", code));
+        list.add(new BasicNameValuePair("client_id", ssoBean.getClientId()));
+        list.add(new BasicNameValuePair("client_secret", ssoBean.getClientSecret()));
+        list.add(new BasicNameValuePair("redirect_uri", ssoBean.getCallbackUrl()));
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Content-Type", "application/x-www-form-urlencoded");
+        headers.put("Accept", "application/json");
+        String result = doPost(ssoBean.getUrl() + "/oauth2/token", headers, list);
+        if (org.apache.commons.lang3.StringUtils.isBlank(result)) {
+            return null;
+        }
+        return JSON.parseObject(result, SsoOauthTokenModel.class);
+    }
+
+    /**
+     * ***鑾峰彇鍗曠偣鐧诲綍鐢ㄦ埛淇℃伅***
+     * @param accessToken
+     * @return
+     */
+    public SsoUserInfoModel getSsoUserInfo(String accessToken) {
+        Map<String, String> headers = new HashMap<>();
+        headers.put("Authorization", "Bearer " + accessToken);
+        String result = doPost(ssoBean.getUrl() + "/userinfo", headers, null);
+        if (org.apache.commons.lang3.StringUtils.isBlank(result)) {
+            return null;
+        }
+        return JSON.parseObject(result, SsoUserInfoModel.class);
+    }
+
+    public static String doPost(String url, Map<String, String> headers, List<NameValuePair> params) {
+        CloseableHttpClient client = createSSLClientDefault();
+        CloseableHttpResponse response = null;
+        try {
+            HttpPost method = new HttpPost(url);
+            headers.forEach(method::setHeader);
+            if (params != null) {
+                method.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
+            }
+
+            response = client.execute(method);
+            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+                HttpEntity entity = response.getEntity();
+                return EntityUtils.toString(entity);
+            }
+        } catch (Exception e) {
+            log.error("缁熶竴鐧诲綍璇锋眰鍑虹幇寮傚父", e.getMessage());
+        } finally {
+            try {
+                if (client != null) {
+                    client.close();
+                }
+                if (response != null) {
+                    response.close();
+                }
+            } catch (Exception e) {
+                log.error("缁熶竴鐧诲綍璇锋眰鍑虹幇寮傚父", e.getMessage());
+            }
+        }
+        return null;
+    }
+//
+//
+    private static CloseableHttpClient createSSLClientDefault() {
+        try {
+            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
+                //淇′换鎵�鏈�
+                @Override
+                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
+                    return true;
+                }
+            }).build();
+            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);
+            return HttpClients.custom().setSSLSocketFactory(sslsf).build();
+        } catch (KeyManagementException e) {
+            e.printStackTrace();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (KeyStoreException e) {
+            e.printStackTrace();
+        }
+        return HttpClients.createDefault();
+    }
+
 }
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsByOpenIdServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsByOpenIdServiceImpl.java
new file mode 100644
index 0000000..070f002
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsByOpenIdServiceImpl.java
@@ -0,0 +1,46 @@
+package com.ruoyi.framework.web.service;
+
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.enums.UserStatus;
+import com.ruoyi.common.exception.base.BaseException;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.system.service.ISysUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
+
+@Service("UserDetailsByOpenIdServiceImpl")
+public class UserDetailsByOpenIdServiceImpl implements UserDetailsService {
+
+
+
+    @Autowired
+    private ISysUserService userService;
+
+    @Autowired
+    private SysPermissionService permissionService;
+
+    @Override
+    public UserDetails loadUserByUsername(String openId) throws UsernameNotFoundException {
+        SysUser user = userService.selectUserByUserName(openId);
+        if (StringUtils.isNull(user)) {
+
+            throw new UsernameNotFoundException("鐧诲綍鐢ㄦ埛锛�" + openId + " 涓嶅瓨鍦�");
+        } else if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
+
+            throw new BaseException("瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿锛�" + openId + " 宸茶鍒犻櫎");
+        } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
+
+            throw new BaseException("瀵逛笉璧凤紝鎮ㄧ殑璐﹀彿锛�" + openId + " 宸插仠鐢�");
+        }
+  		// 鍜岃嫢渚濈殑鍖哄埆 鏄病鏈夐獙璇佸瘑鐮�
+        return createLoginUser(user);
+    }
+
+    public UserDetails createLoginUser(SysUser user) {
+        return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
+    }
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
index 5dcdf90..2733d23 100644
--- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
@@ -1,12 +1,5 @@
 package com.ruoyi.framework.web.service;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.enums.UserStatus;
@@ -14,20 +7,27 @@
 import com.ruoyi.common.utils.MessageUtils;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.service.ISysUserService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.stereotype.Service;
 
 /**
  * 鐢ㄦ埛楠岃瘉澶勭悊
  *
  * @author ruoyi
  */
-@Service
+@Service("UserDetailsServiceImpl")
 public class UserDetailsServiceImpl implements UserDetailsService
 {
     private static final Logger log = LoggerFactory.getLogger(UserDetailsServiceImpl.class);
 
     @Autowired
     private ISysUserService userService;
-    
+
     @Autowired
     private SysPasswordService passwordService;
 
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationProvider.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationProvider.java
new file mode 100644
index 0000000..fdf3603
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationProvider.java
@@ -0,0 +1,42 @@
+package com.ruoyi.framework.web.ssoAuth;
+
+import org.springframework.security.authentication.AuthenticationProvider;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UserDetailsService;
+public class SsoCodeAuthenticationProvider implements AuthenticationProvider {
+
+    private UserDetailsService userDetailsService;
+
+    @Override
+    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
+        SsoCodeAuthenticationToken authenticationToken = (SsoCodeAuthenticationToken) authentication;
+
+        String openId = (String) authenticationToken.getPrincipal();
+
+        UserDetails userDetails = userDetailsService.loadUserByUsername(openId);
+
+        // 姝ゆ椂閴存潈鎴愬姛鍚庯紝搴斿綋閲嶆柊 new 涓�涓嫢鏈夐壌鏉冪殑 authenticationResult 杩斿洖
+        SsoCodeAuthenticationToken authenticationResult = new SsoCodeAuthenticationToken(userDetails, userDetails.getAuthorities());
+
+        authenticationResult.setDetails(authenticationToken.getDetails());
+
+        return authenticationResult;
+    }
+
+
+    @Override
+    public boolean supports(Class<?> authentication) {
+        // 鍒ゆ柇 authentication 鏄笉鏄� WxCodeAuthenticationToken 鐨勫瓙绫绘垨瀛愭帴鍙�
+        return SsoCodeAuthenticationToken.class.isAssignableFrom(authentication);
+    }
+
+    public UserDetailsService getUserDetailsService() {
+        return userDetailsService;
+    }
+
+    public void setUserDetailsService(UserDetailsService userDetailsService) {
+        this.userDetailsService = userDetailsService;
+    }
+}
diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationToken.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationToken.java
new file mode 100644
index 0000000..b783f36
--- /dev/null
+++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/ssoAuth/SsoCodeAuthenticationToken.java
@@ -0,0 +1,63 @@
+package com.ruoyi.framework.web.ssoAuth;
+
+import org.springframework.security.authentication.AbstractAuthenticationToken;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.SpringSecurityCoreVersion;
+
+import java.util.Collection;
+
+public class SsoCodeAuthenticationToken extends AbstractAuthenticationToken {
+
+    private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;
+
+    /**
+     * 鍦� UsernamePasswordAuthenticationToken 涓瀛楁浠h〃鐧诲綍鐨勭敤鎴峰悕锛�
+     * 鍦ㄨ繖閲屽氨浠h〃鐧诲綍鐨刼penId
+     */
+    private final Object principal;
+
+    /**
+     * 鏋勫缓涓�涓病鏈夐壌鏉冪殑 SsoCodeAuthenticationToken
+     */
+    public SsoCodeAuthenticationToken(Object principal) {
+        super(null);
+        this.principal = principal;
+        setAuthenticated(false);
+    }
+
+    /**
+     * 鏋勫缓鎷ユ湁閴存潈鐨� SsoCodeAuthenticationToken
+     */
+    public SsoCodeAuthenticationToken(Object principal, Collection<? extends GrantedAuthority> authorities) {
+        super(authorities);
+        this.principal = principal;
+        // must use super, as we override
+        super.setAuthenticated(true);
+    }
+
+    @Override
+    public Object getCredentials() {
+        return null;
+    }
+
+    @Override
+    public Object getPrincipal() {
+        return this.principal;
+    }
+
+    @Override
+    public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
+        if (isAuthenticated) {
+            throw new IllegalArgumentException(
+                    "Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead");
+        }
+
+        super.setAuthenticated(false);
+    }
+
+    @Override
+    public void eraseCredentials() {
+        super.eraseCredentials();
+    }
+
+}

--
Gitblit v1.9.3