diff --git a/mini-program-test/.eslintrc.js b/mini-program-test/.eslintrc.js
new file mode 100755
index 000000000..115cc02b0
--- /dev/null
+++ b/mini-program-test/.eslintrc.js
@@ -0,0 +1,31 @@
+/*
+ * Eslint config file
+ * Documentation: https://eslint.org/docs/user-guide/configuring/
+ * Install the Eslint extension before using this feature.
+ */
+module.exports = {
+  env: {
+    es6: true,
+    browser: true,
+    node: true,
+  },
+  ecmaFeatures: {
+    modules: true,
+  },
+  parserOptions: {
+    ecmaVersion: 2018,
+    sourceType: 'module',
+  },
+  globals: {
+    wx: true,
+    App: true,
+    Page: true,
+    getCurrentPages: true,
+    getApp: true,
+    Component: true,
+    requirePlugin: true,
+    requireMiniProgram: true,
+  },
+  // extends: 'eslint:recommended',
+  rules: {},
+}
diff --git a/mini-program-test/README.md b/mini-program-test/README.md
new file mode 100644
index 000000000..4e5737ccb
--- /dev/null
+++ b/mini-program-test/README.md
@@ -0,0 +1 @@
+临时项目,作为测试微信小程序登陆之用
diff --git a/mini-program-test/app.js b/mini-program-test/app.js
new file mode 100755
index 000000000..1ed57c47f
--- /dev/null
+++ b/mini-program-test/app.js
@@ -0,0 +1,19 @@
+// app.js
+App({
+  onLaunch() {
+    // 展示本地存储能力
+    const logs = wx.getStorageSync('logs') || []
+    logs.unshift(Date.now())
+    wx.setStorageSync('logs', logs)
+
+    // 登录
+    wx.login({
+      success: res => {
+        // 发送 res.code 到后台换取 openId, sessionKey, unionId
+      }
+    })
+  },
+  globalData: {
+    userInfo: null
+  }
+})
diff --git a/mini-program-test/app.json b/mini-program-test/app.json
new file mode 100755
index 000000000..3d7616ff4
--- /dev/null
+++ b/mini-program-test/app.json
@@ -0,0 +1,14 @@
+{
+  "pages":[
+    "pages/index/index",
+    "pages/logs/logs"
+  ],
+  "window":{
+    "backgroundTextStyle":"light",
+    "navigationBarBackgroundColor": "#fff",
+    "navigationBarTitleText": "Weixin",
+    "navigationBarTextStyle":"black"
+  },
+  "style": "v2",
+  "sitemapLocation": "sitemap.json"
+}
diff --git a/mini-program-test/app.wxss b/mini-program-test/app.wxss
new file mode 100755
index 000000000..06c6fc9ce
--- /dev/null
+++ b/mini-program-test/app.wxss
@@ -0,0 +1,10 @@
+/**app.wxss**/
+.container {
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: space-between;
+  padding: 200rpx 0;
+  box-sizing: border-box;
+} 
diff --git a/mini-program-test/pages/index/index.js b/mini-program-test/pages/index/index.js
new file mode 100755
index 000000000..eadb684cf
--- /dev/null
+++ b/mini-program-test/pages/index/index.js
@@ -0,0 +1,91 @@
+// index.js
+
+const common=require('../../utils/common.js')
+// 获取应用实例
+const app = getApp()
+
+Page({
+  data: {
+    motto: 'Hello World',
+    userInfo: {},
+    hasUserInfo: false,
+    canIUse: wx.canIUse('button.open-type.getUserInfo'),
+    canIUseGetUserProfile: false,
+    canIUseOpenData: wx.canIUse('open-data.type.userAvatarUrl') && wx.canIUse('open-data.type.userNickName'), // 如需尝试获取用户信息可改为false
+    holderText: 'to be auth'
+  },
+  // 事件处理函数
+  bindViewTap() {
+    wx.navigateTo({
+      url: '../logs/logs'
+    })
+  },
+  onLoad() {
+    if (wx.getUserProfile) {
+      this.setData({
+        canIUseGetUserProfile: true
+      })
+    }
+  },
+  getUserProfile(e) {
+    // 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需用户确认,开发者妥善保管用户快速填写的头像昵称,避免重复弹窗
+    wx.getUserProfile({
+      desc: '展示用户信息', // 声明获取用户个人信息后的用途,后续会展示在弹窗中,请谨慎填写
+      success: (res) => {
+        console.log(res)
+        this.setData({
+          userInfo: res.userInfo,
+          hasUserInfo: true
+        })
+      }
+    })
+  },
+  getUserInfo(e) {
+    // 不推荐使用getUserInfo获取用户信息,预计自2021年4月13日起,getUserInfo将不再弹出弹窗,并直接返回匿名的用户个人信息
+    console.log(e)
+    this.setData({
+      userInfo: e.detail.userInfo,
+      hasUserInfo: true
+    })
+  },
+  // 小程序登录 https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
+  wxLogin(e){
+    let page=this;
+    wx.login({
+      success (res) {
+        console.log("res:")
+        console.log(res)
+        if (res.code) {
+          //发起网络请求
+          console.log('发起网络请求'+common.baseurl)
+          wx.request({
+            url: common.baseurl+'/api/social-login2',
+            method: "POST",
+            data: {
+              code: res.code,
+              state: 'empty',
+              type: 33,
+              username: '15601691300',
+              password: 'admin123'
+            },
+            header: {
+              'content-type': 'application/json' // 默认值
+            },
+            success: function(res) {
+              console.log(res.data)
+              let holder="auth success, token:"+res.data.data.token
+              page.setData({holderText: holder})
+            },
+            fail: function(data){
+              console.error("请求出错");
+              console.error(data)
+            }
+            
+          })
+        } else {
+          console.log('登录失败!' + res.errMsg)
+        }
+      }
+    })
+  }
+})
diff --git a/mini-program-test/pages/index/index.json b/mini-program-test/pages/index/index.json
new file mode 100755
index 000000000..8835af069
--- /dev/null
+++ b/mini-program-test/pages/index/index.json
@@ -0,0 +1,3 @@
+{
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/mini-program-test/pages/index/index.wxml b/mini-program-test/pages/index/index.wxml
new file mode 100755
index 000000000..e3243c3e0
--- /dev/null
+++ b/mini-program-test/pages/index/index.wxml
@@ -0,0 +1,29 @@
+<!--index.wxml-->
+<view class="container">
+  <view class="userinfo">
+    <block wx:if="{{canIUseOpenData}}">
+
+
+    </block>
+    <block wx:elif="{{!hasUserInfo}}">
+      <button wx:if="{{canIUseGetUserProfile}}" bindtap="getUserProfile"> 获取头像昵称 </button>
+      <button wx:elif="{{canIUse}}" open-type="getUserInfo" bindgetuserinfo="getUserInfo"> 获取头像昵称 </button>
+      <view wx:else> 请使用1.4.4及以上版本基础库 </view>
+    </block>
+    <block wx:else>
+      <image bindtap="bindViewTap" class="userinfo-avatar" src="{{userInfo.avatarUrl}}" mode="cover"></image>
+      <text class="userinfo-nickname">{{userInfo.nickName}}</text>
+    </block>
+  </view>
+  <view class="usermotto">
+    
+  </view>
+
+
+
+  <text style="position: relative; left: 1rpx; top: -476rpx">授权登录测试1024</text>
+
+  <button style="position: relative; left: 0rpx; top: -361rpx" type="primary" id="login-button" bindtap="wxLogin">点击授权登录</button>
+
+  <text style="position: relative; left: 1rpx; top: -272rpx" id="login-user-id">{{holderText}}</text>
+</view>
diff --git a/mini-program-test/pages/index/index.wxss b/mini-program-test/pages/index/index.wxss
new file mode 100755
index 000000000..eb642035f
--- /dev/null
+++ b/mini-program-test/pages/index/index.wxss
@@ -0,0 +1,19 @@
+/**index.wxss**/
+.userinfo {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  color: #aaa;
+}
+
+.userinfo-avatar {
+  overflow: hidden;
+  width: 128rpx;
+  height: 128rpx;
+  margin: 20rpx;
+  border-radius: 50%;
+}
+
+.usermotto {
+  margin-top: 200px;
+}
\ No newline at end of file
diff --git a/mini-program-test/pages/logs/logs.js b/mini-program-test/pages/logs/logs.js
new file mode 100755
index 000000000..85f6aac5a
--- /dev/null
+++ b/mini-program-test/pages/logs/logs.js
@@ -0,0 +1,18 @@
+// logs.js
+const util = require('../../utils/util.js')
+
+Page({
+  data: {
+    logs: []
+  },
+  onLoad() {
+    this.setData({
+      logs: (wx.getStorageSync('logs') || []).map(log => {
+        return {
+          date: util.formatTime(new Date(log)),
+          timeStamp: log
+        }
+      })
+    })
+  }
+})
diff --git a/mini-program-test/pages/logs/logs.json b/mini-program-test/pages/logs/logs.json
new file mode 100755
index 000000000..3ee76c183
--- /dev/null
+++ b/mini-program-test/pages/logs/logs.json
@@ -0,0 +1,4 @@
+{
+  "navigationBarTitleText": "查看启动日志",
+  "usingComponents": {}
+}
\ No newline at end of file
diff --git a/mini-program-test/pages/logs/logs.wxml b/mini-program-test/pages/logs/logs.wxml
new file mode 100755
index 000000000..0b6b6456f
--- /dev/null
+++ b/mini-program-test/pages/logs/logs.wxml
@@ -0,0 +1,6 @@
+<!--logs.wxml-->
+<view class="container log-list">
+  <block wx:for="{{logs}}" wx:key="timeStamp" wx:for-item="log">
+    <text class="log-item">{{index + 1}}. {{log.date}}</text>
+  </block>
+</view>
diff --git a/mini-program-test/pages/logs/logs.wxss b/mini-program-test/pages/logs/logs.wxss
new file mode 100755
index 000000000..94d4b88a2
--- /dev/null
+++ b/mini-program-test/pages/logs/logs.wxss
@@ -0,0 +1,8 @@
+.log-list {
+  display: flex;
+  flex-direction: column;
+  padding: 40rpx;
+}
+.log-item {
+  margin: 10rpx;
+}
diff --git a/mini-program-test/project.config.json b/mini-program-test/project.config.json
new file mode 100755
index 000000000..2fbe955c6
--- /dev/null
+++ b/mini-program-test/project.config.json
@@ -0,0 +1,75 @@
+{
+  "description": "项目配置文件",
+  "packOptions": {
+    "ignore": [
+      {
+        "type": "file",
+        "value": ".eslintrc.js"
+      }
+    ]
+  },
+  "setting": {
+    "bundle": false,
+    "userConfirmedBundleSwitch": false,
+    "urlCheck": true,
+    "scopeDataCheck": false,
+    "coverView": true,
+    "es6": true,
+    "postcss": true,
+    "compileHotReLoad": false,
+    "lazyloadPlaceholderEnable": false,
+    "preloadBackgroundData": false,
+    "minified": true,
+    "autoAudits": false,
+    "newFeature": false,
+    "uglifyFileName": false,
+    "uploadWithSourceMap": true,
+    "useIsolateContext": true,
+    "nodeModules": false,
+    "enhance": true,
+    "useMultiFrameRuntime": true,
+    "useApiHook": true,
+    "useApiHostProcess": true,
+    "showShadowRootInWxmlPanel": true,
+    "packNpmManually": false,
+    "enableEngineNative": false,
+    "packNpmRelationList": [],
+    "minifyWXSS": true,
+    "showES6CompileOption": false,
+    "minifyWXML": true
+  },
+  "compileType": "miniprogram",
+  "libVersion": "2.19.4",
+  "appid": "wx44d047d87e6284d8",
+  "appid1": "wx63c280fe3248a3e7",
+  "projectname": "mini-program-test",
+  "debugOptions": {
+    "hidedInDevtools": []
+  },
+  "scripts": {},
+  "staticServerOptions": {
+    "baseURL": "",
+    "servePath": ""
+  },
+  "isGameTourist": false,
+  "condition": {
+    "search": {
+      "list": []
+    },
+    "conversation": {
+      "list": []
+    },
+    "game": {
+      "list": []
+    },
+    "plugin": {
+      "list": []
+    },
+    "gamePlugin": {
+      "list": []
+    },
+    "miniprogram": {
+      "list": []
+    }
+  }
+}
\ No newline at end of file
diff --git a/mini-program-test/sitemap.json b/mini-program-test/sitemap.json
new file mode 100755
index 000000000..ca02add20
--- /dev/null
+++ b/mini-program-test/sitemap.json
@@ -0,0 +1,7 @@
+{
+  "desc": "关于本文件的更多信息,请参考文档 https://developers.weixin.qq.com/miniprogram/dev/framework/sitemap.html",
+  "rules": [{
+  "action": "allow",
+  "page": "*"
+  }]
+}
\ No newline at end of file
diff --git a/mini-program-test/utils/common.js b/mini-program-test/utils/common.js
new file mode 100755
index 000000000..a52d72520
--- /dev/null
+++ b/mini-program-test/utils/common.js
@@ -0,0 +1,3 @@
+module.exports = {
+  baseurl: "http://127.0.0.1:28080"
+}
diff --git a/mini-program-test/utils/util.js b/mini-program-test/utils/util.js
new file mode 100755
index 000000000..764bc2ce2
--- /dev/null
+++ b/mini-program-test/utils/util.js
@@ -0,0 +1,19 @@
+const formatTime = date => {
+  const year = date.getFullYear()
+  const month = date.getMonth() + 1
+  const day = date.getDate()
+  const hour = date.getHours()
+  const minute = date.getMinutes()
+  const second = date.getSeconds()
+
+  return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}`
+}
+
+const formatNumber = n => {
+  n = n.toString()
+  return n[1] ? n : `0${n}`
+}
+
+module.exports = {
+  formatTime
+}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java
index b87deaca9..16130e17e 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/SysAuthController.java
@@ -8,10 +8,11 @@ import cn.iocoder.yudao.adminserver.modules.system.enums.permission.MenuTypeEnum
 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
 import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
@@ -132,7 +133,7 @@ public class SysAuthController {
     @DeleteMapping("/social-unbind")
     @ApiOperation("取消社交绑定")
     public CommonResult<Boolean> socialUnbind(@RequestBody SysAuthSocialUnbindReqVO reqVO) {
-        socialService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId());
+        socialService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId(), UserTypeEnum.ADMIN);
         return CommonResult.success(true);
     }
 
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java
index 66d05cedf..e92d3fc50 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialBindReqVO.java
@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth;
 
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
 import cn.iocoder.yudao.framework.common.validation.InEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java
index bedf8ba3e..13aaa71cc 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLogin2ReqVO.java
@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth;
 
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
 import cn.iocoder.yudao.framework.common.validation.InEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java
index b34022d4f..71d19685d 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialLoginReqVO.java
@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth;
 
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
 import cn.iocoder.yudao.framework.common.validation.InEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java
index 71cdc6fbb..096164ed7 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/auth/vo/auth/SysAuthSocialUnbindReqVO.java
@@ -1,6 +1,6 @@
 package cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth;
 
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
 import cn.iocoder.yudao.framework.common.validation.InEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java
index 523359b08..48236a7ab 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/controller/user/SysUserProfileController.java
@@ -8,15 +8,16 @@ import cn.iocoder.yudao.adminserver.modules.system.convert.user.SysUserConvert;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysDeptService;
 import cn.iocoder.yudao.adminserver.modules.system.service.dept.SysPostService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysRoleService;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import io.swagger.annotations.Api;
@@ -77,7 +78,7 @@ public class SysUserProfileController {
             resp.setPosts(SysUserConvert.INSTANCE.convertList02(posts));
         }
         // 获得社交用户信息
-        List<SysSocialUserDO> socialUsers = socialService.getSocialUserList(user.getId());
+        List<SysSocialUserDO> socialUsers = socialService.getSocialUserList(user.getId(), UserTypeEnum.ADMIN);
         resp.setSocialUsers(SysUserConvert.INSTANCE.convertList03(socialUsers));
         return success(resp);
     }
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java
index dbe5b365f..d25ce02ad 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/convert/user/SysUserConvert.java
@@ -7,7 +7,7 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.user.vo.user.*;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysDeptDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.dept.SysPostDO;
 import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.permission.SysRoleDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java
index e7c484bb0..e9d3373b2 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/SysRedisKeyConstants.java
@@ -19,12 +19,5 @@ public interface SysRedisKeyConstants {
             "captcha_code:%s", // 参数为 uuid
             STRING, String.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC);
 
-    RedisKeyDefine SOCIAL_AUTH_USER = new RedisKeyDefine("社交的授权用户",
-            "social_auth_user:%d:%s", // 参数为 type,code
-            STRING, AuthUser.class, Duration.ofDays(1));
-
-    RedisKeyDefine SOCIAL_AUTH_STATE = new RedisKeyDefine("社交的 state",
-            "social_auth_state:%s", // 参数为 state
-            STRING, String.class, Duration.ofHours(24)); // 值为 state
 
 }
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java
index 0fad26be8..7da1f4239 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/SysErrorCodeConstants.java
@@ -89,8 +89,6 @@ public interface SysErrorCodeConstants {
     ErrorCode ERROR_CODE_NOT_EXISTS = new ErrorCode(1002013000, "错误码不存在");
     ErrorCode ERROR_CODE_DUPLICATE = new ErrorCode(1002013001, "已经存在编码为【{}】的错误码");
 
-    // ========== 社交模块 1002014000 ==========
-    ErrorCode SOCIAL_AUTH_FAILURE = new ErrorCode(1002014000, "社交授权失败,原因是:{}");
-    ErrorCode SOCIAL_UNBIND_NOT_SELF = new ErrorCode(1002014001, "社交解绑失败,非当前用户绑定");
+
 
 }
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/social/SysSocialTypeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/social/SysSocialTypeEnum.java
deleted file mode 100644
index 87d762dce..000000000
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/enums/social/SysSocialTypeEnum.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package cn.iocoder.yudao.adminserver.modules.system.enums.social;
-
-import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.util.ArrayUtil;
-import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 社交平台的类型枚举
- *
- * @author 芋道源码
- */
-@Getter
-@AllArgsConstructor
-public enum SysSocialTypeEnum implements IntArrayValuable {
-
-    GITEE(10, "GITEE"), // https://gitee.com/api/v5/oauth_doc#/
-    DINGTALK(20, "DINGTALK"), // https://developers.dingtalk.com/document/app/obtain-identity-credentials
-    WECHAT_ENTERPRISE(30, "WECHAT_ENTERPRISE"), // https://xkcoding.com/2019/08/06/use-justauth-integration-wechat-enterprise.html
-    ;
-
-    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysSocialTypeEnum::getType).toArray();
-
-    public static final List<Integer> WECHAT_ALL = ListUtil.toList(WECHAT_ENTERPRISE.type);
-
-    /**
-     * 类型
-     */
-    private final Integer type;
-    /**
-     * 类型的标识
-     */
-    private final String source;
-
-    @Override
-    public int[] array() {
-        return ARRAYS;
-    }
-
-    public static SysSocialTypeEnum valueOfType(Integer type) {
-        return ArrayUtil.firstMatch(o -> o.getType().equals(type), values());
-    }
-
-    public static List<Integer> getRelationTypes(Integer type) {
-        if (WECHAT_ALL.contains(type)) {
-            return WECHAT_ALL;
-        }
-        return ListUtil.toList(type);
-    }
-
-}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
index d5fb91f95..558967c2e 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
+++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
@@ -6,18 +6,18 @@ import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAu
 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLogin2ReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.controller.auth.vo.auth.SysAuthSocialLoginReqVO;
 import cn.iocoder.yudao.adminserver.modules.system.convert.auth.SysAuthConvert;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginLogTypeEnum;
 import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEnum;
 import cn.iocoder.yudao.adminserver.modules.system.service.auth.SysAuthService;
 import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
@@ -75,6 +75,9 @@ public class SysAuthServiceImpl implements SysAuthService {
     @Resource
     private SysSocialService socialService;
 
+    // TODO @timfruit:静态枚举类,需要都大写,例如说 USER_TYPE_ENUM;静态变量,放在普通变量前面;这个实践不错哈。
+    private static final UserTypeEnum userTypeEnum = UserTypeEnum.ADMIN;
+
     @Override
     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
         // 获取 username 对应的 SysUserDO
@@ -198,7 +201,7 @@ public class SysAuthServiceImpl implements SysAuthService {
 
         // 如果未绑定 SysSocialUserDO 用户,则无法自动登录,进行报错
         String unionId = socialService.getAuthUserUnionId(authUser);
-        List<SysSocialUserDO> socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId);
+        List<SysSocialUserDO> socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, userTypeEnum);
         if (CollUtil.isEmpty(socialUsers)) {
             throw exception(AUTH_THIRD_LOGIN_NOT_BIND);
         }
@@ -212,11 +215,10 @@ public class SysAuthServiceImpl implements SysAuthService {
 
         // 创建 LoginUser 对象
         LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user);
-        // TODO 芋艿:需要改造下,增加各种登录方式
         loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表
 
         // 绑定社交用户(更新)
-        socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser);
+        socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, userTypeEnum);
 
         // 缓存登录用户到 Redis 中,返回 sessionId 编号
         return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
@@ -233,7 +235,7 @@ public class SysAuthServiceImpl implements SysAuthService {
         loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表
 
         // 绑定社交用户(新增)
-        socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser);
+        socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, userTypeEnum);
 
         // 缓存登录用户到 Redis 中,返回 sessionId 编号
         return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
@@ -246,7 +248,7 @@ public class SysAuthServiceImpl implements SysAuthService {
         Assert.notNull(authUser, "授权用户不为空");
 
         // 绑定社交用户(新增)
-        socialService.bindSocialUser(userId, reqVO.getType(), authUser);
+        socialService.bindSocialUser(userId, reqVO.getType(), authUser, userTypeEnum);
     }
 
     @Override
@@ -267,7 +269,7 @@ public class SysAuthServiceImpl implements SysAuthService {
         reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType());
         reqDTO.setTraceId(TracerUtils.getTraceId());
         reqDTO.setUserId(userId);
-        reqDTO.setUserType(UserTypeEnum.ADMIN.getValue());
+        reqDTO.setUserType(userTypeEnum.getValue());
         reqDTO.setUsername(username);
         reqDTO.setUserAgent(ServletUtils.getUserAgent());
         reqDTO.setUserIp(ServletUtils.getClientIP());
diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java
index 51e59dc0a..c09a194aa 100644
--- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java
+++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/auth/SysAuthServiceImplTest.java
@@ -7,11 +7,11 @@ import cn.iocoder.yudao.adminserver.modules.system.enums.logger.SysLoginResultEn
 import cn.iocoder.yudao.adminserver.modules.system.service.auth.impl.SysAuthServiceImpl;
 import cn.iocoder.yudao.adminserver.modules.system.service.common.SysCaptchaService;
 import cn.iocoder.yudao.adminserver.modules.system.service.permission.SysPermissionService;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.coreservice.modules.system.service.user.SysUserCoreService;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.security.core.LoginUser;
diff --git a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialServiceTest.java b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialServiceTest.java
index badaf0e76..cec84c1ed 100644
--- a/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialServiceTest.java
+++ b/yudao-admin-server/src/test/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialServiceTest.java
@@ -1,11 +1,11 @@
 package cn.iocoder.yudao.adminserver.modules.system.service.social;
 
 import cn.iocoder.yudao.adminserver.BaseDbAndRedisUnitTest;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.social.SysSocialUserMapper;
-import cn.iocoder.yudao.adminserver.modules.system.dal.redis.social.SysSocialAuthUserRedisDAO;
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.impl.SysSocialServiceImpl;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.social.SysSocialUserMapper;
+import cn.iocoder.yudao.coreservice.modules.system.dal.redis.social.SysSocialAuthUserRedisDAO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.impl.SysSocialServiceImpl;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import com.xkcoding.justauth.AuthRequestFactory;
 import me.zhyd.oauth.model.AuthUser;
@@ -23,6 +23,7 @@ import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId
 import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+// TODO @timfruit:这个单元测试,挪到 yudao-core-service
 /**
  * {@link SysSocialServiceImpl} 的单元测试类
  *
@@ -53,7 +54,7 @@ public class SysSocialServiceTest extends BaseDbAndRedisUnitTest {
         // mock 方法
 
         // 调用
-        socialService.bindSocialUser(userId, type, authUser);
+        socialService.bindSocialUser(userId, type, authUser, UserTypeEnum.ADMIN);
         // 断言
         List<SysSocialUserDO> socialUsers = socialUserMapper.selectList("user_id", userId);
         assertEquals(1, socialUsers.size());
@@ -78,7 +79,7 @@ public class SysSocialServiceTest extends BaseDbAndRedisUnitTest {
         // mock 方法
 
         // 调用
-        socialService.bindSocialUser(userId, type, authUser);
+        socialService.bindSocialUser(userId, type, authUser, UserTypeEnum.ADMIN);
         // 断言
         List<SysSocialUserDO> socialUsers = socialUserMapper.selectList("user_id", userId);
         assertEquals(1, socialUsers.size());
@@ -103,7 +104,7 @@ public class SysSocialServiceTest extends BaseDbAndRedisUnitTest {
         // mock 方法
 
         // 调用
-        socialService.bindSocialUser(userId, type, authUser);
+        socialService.bindSocialUser(userId, type, authUser, UserTypeEnum.ADMIN);
         // 断言
         List<SysSocialUserDO> socialUsers = socialUserMapper.selectList("user_id", userId);
         assertEquals(1, socialUsers.size());
@@ -140,7 +141,7 @@ public class SysSocialServiceTest extends BaseDbAndRedisUnitTest {
         String newUnionId = oldSocialUser.getUnionId();
 
         // 调用
-        socialService.unbindOldSocialUser(userId, type, newUnionId);
+        socialService.unbindOldSocialUser(userId, type, newUnionId, UserTypeEnum.ADMIN);
         // 断言
         assertEquals(1L, socialUserMapper.selectCount(null).longValue());
     }
@@ -163,7 +164,7 @@ public class SysSocialServiceTest extends BaseDbAndRedisUnitTest {
         String newUnionId = randomString(10);
 
         // 调用
-        socialService.unbindOldSocialUser(userId, type, newUnionId);
+        socialService.unbindOldSocialUser(userId, type, newUnionId, UserTypeEnum.ADMIN);
         // 断言
         assertEquals(0L, socialUserMapper.selectCount(null).longValue());
     }
diff --git a/yudao-core-service/pom.xml b/yudao-core-service/pom.xml
index 1182227d6..4fd85c0aa 100644
--- a/yudao-core-service/pom.xml
+++ b/yudao-core-service/pom.xml
@@ -95,6 +95,13 @@
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
+
+        <!-- 三方云服务相关 -->
+        <dependency>
+            <groupId>com.xkcoding.justauth</groupId>
+            <artifactId>justauth-spring-boot-starter</artifactId>
+        </dependency>
+
     </dependencies>
 
 </project>
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendSource.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendSource.java
new file mode 100644
index 000000000..e005114ac
--- /dev/null
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendSource.java
@@ -0,0 +1,33 @@
+package cn.iocoder.yudao.coreservice.modules.system.compent.justauth;
+
+import me.zhyd.oauth.config.AuthSource;
+
+public enum AuthExtendSource implements AuthSource {
+
+    /**
+     * 微信小程序授权登录
+     */
+    WECHAT_MINI_PROGRAM{
+        @Override
+        public String authorize() {
+            // https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
+            throw new UnsupportedOperationException("不支持获取授权url, 请使用小程序内置函数wx.login()登录获取code");
+        }
+
+        @Override
+        public String accessToken() {
+            // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
+            // 获取openid, unionid , session_key
+            return "https://api.weixin.qq.com/sns/jscode2session";
+        }
+
+        @Override
+        public String userInfo() {
+            //https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html
+            throw new UnsupportedOperationException("不支持获取用户信息url, 请使用小程序内置函数wx.getUserProfile()获取用户信息");
+        }
+    }
+
+    ;
+
+}
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendToken.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendToken.java
new file mode 100644
index 000000000..2ecb0d461
--- /dev/null
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthExtendToken.java
@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.coreservice.modules.system.compent.justauth;
+
+import lombok.*;
+import me.zhyd.oauth.model.AuthToken;
+
+/**
+ * TODO @timfruit:类注释
+ * @author timfruit
+ * @date 2021-10-29
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class AuthExtendToken extends AuthToken {
+
+    /**
+     * 微信小程序 会话密钥
+     */
+    private String miniSessionKey;
+
+}
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthWeChatMiniProgramRequest.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthWeChatMiniProgramRequest.java
new file mode 100644
index 000000000..664f9157f
--- /dev/null
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/compent/justauth/AuthWeChatMiniProgramRequest.java
@@ -0,0 +1,90 @@
+package cn.iocoder.yudao.coreservice.modules.system.compent.justauth;
+
+import com.alibaba.fastjson.JSONObject;
+import me.zhyd.oauth.cache.AuthStateCache;
+import me.zhyd.oauth.config.AuthConfig;
+import me.zhyd.oauth.exception.AuthException;
+import me.zhyd.oauth.model.AuthCallback;
+import me.zhyd.oauth.model.AuthToken;
+import me.zhyd.oauth.model.AuthUser;
+import me.zhyd.oauth.request.AuthDefaultRequest;
+import me.zhyd.oauth.utils.HttpUtils;
+import me.zhyd.oauth.utils.UrlBuilder;
+
+// TODO @timfruit:新建一个 yudao-spring-boot-starter-biz-social 包,把这个拓展拿进去哈。另外,可以思考下。
+// 1. application-local.yaml 的配置里,justauth.extend.enum-class 能否不配置,而是自动配置好
+// 2. application-local.yaml 的配置里,justauth.extend.extend.config.WECHAT_MINI_PROGRAM 有办法和 justauth.type.WECHAT_MP 持平
+/**
+ * 微信小程序登陆
+ *
+ * @author timfruit
+ * @date 2021-10-29
+ */
+public class AuthWeChatMiniProgramRequest extends AuthDefaultRequest {
+
+    public AuthWeChatMiniProgramRequest(AuthConfig config) {
+        super(config, AuthExtendSource.WECHAT_MINI_PROGRAM);
+    }
+
+    public AuthWeChatMiniProgramRequest(AuthConfig config, AuthStateCache authStateCache) {
+        super(config, AuthExtendSource.WECHAT_MINI_PROGRAM, authStateCache);
+    }
+
+    @Override
+    protected AuthToken getAccessToken(AuthCallback authCallback) {
+        // https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html
+        String response = new HttpUtils(config.getHttpConfig()).get(accessTokenUrl(authCallback.getCode()));
+        JSONObject accessTokenObject = JSONObject.parseObject(response); // TODO @timfruit:使用 JsonUtils,项目尽量避免直接使用某个 json 库
+
+        this.checkResponse(accessTokenObject);
+
+        AuthExtendToken token = new AuthExtendToken();
+        token.setMiniSessionKey(accessTokenObject.getString("session_key"));
+        token.setOpenId(accessTokenObject.getString("openid"));
+        token.setUnionId(accessTokenObject.getString("unionid"));
+        return token;
+    }
+
+    @Override
+    protected AuthUser getUserInfo(AuthToken authToken) {
+        // https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserProfile.html
+        // 如果需要用户信息,需要在小程序调用函数后传给后端
+        return AuthUser.builder()
+                .uuid(authToken.getOpenId())
+                //TODO 是使用默认值,还是有小程序获取用户信息 和 code 一起传过来
+                .nickname("")
+                .avatar("")
+                .token(authToken)
+                .source(source.toString())
+                .build();
+    }
+
+    /**
+     * 检查响应内容是否正确
+     *
+     * @param object 请求响应内容
+     */
+    private void checkResponse(JSONObject object) {
+        int code = object.getIntValue("errcode");
+        if(code != 0){ // TODO @timfruit:if (code != 0) { ,注意空格
+            throw new AuthException(object.getIntValue("errcode"), object.getString("errmsg"));
+        }
+    }
+
+    /**
+     * 返回获取 accessToken 的 url
+     *
+     * @param code 授权码
+     * @return 返回获取 accessToken 的 url
+     */
+    @Override
+    protected String accessTokenUrl(String code) {
+        return UrlBuilder.fromBaseUrl(source.accessToken())
+                .queryParam("appid", config.getClientId())
+                .queryParam("secret", config.getClientSecret())
+                .queryParam("js_code", code)
+                .queryParam("grant_type", "authorization_code")
+                .build();
+    }
+
+}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/social/SysSocialUserDO.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/social/SysSocialUserDO.java
similarity index 96%
rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/social/SysSocialUserDO.java
rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/social/SysSocialUserDO.java
index 7e998b8fc..d1772a132 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/dataobject/social/SysSocialUserDO.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/dataobject/social/SysSocialUserDO.java
@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social;
+package cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social;
 
 import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/social/SysSocialUserMapper.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/social/SysSocialUserMapper.java
similarity index 85%
rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/social/SysSocialUserMapper.java
rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/social/SysSocialUserMapper.java
index b5762ec7f..ee8db4eac 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/mysql/social/SysSocialUserMapper.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/mysql/social/SysSocialUserMapper.java
@@ -1,6 +1,6 @@
-package cn.iocoder.yudao.adminserver.modules.system.dal.mysql.social;
+package cn.iocoder.yudao.coreservice.modules.system.dal.mysql.social;
 
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import org.apache.ibatis.annotations.Mapper;
@@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Mapper;
 import java.util.Collection;
 import java.util.List;
 
+// TODO @timfruit:SysSocialUserCoreMapper 改名,方便区分
 @Mapper
 public interface SysSocialUserMapper extends BaseMapperX<SysSocialUserDO> {
 
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java
index fb4118874..5db3e9fd4 100644
--- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/SysRedisKeyCoreConstants.java
@@ -2,6 +2,9 @@ package cn.iocoder.yudao.coreservice.modules.system.dal.redis;
 
 import cn.iocoder.yudao.framework.redis.core.RedisKeyDefine;
 import cn.iocoder.yudao.framework.security.core.LoginUser;
+import me.zhyd.oauth.model.AuthUser;
+
+import java.time.Duration;
 
 import static cn.iocoder.yudao.framework.redis.core.RedisKeyDefine.KeyTypeEnum.STRING;
 
@@ -16,4 +19,11 @@ public interface SysRedisKeyCoreConstants {
             "login_user:%s", // 参数为 sessionId
             STRING, LoginUser.class, RedisKeyDefine.TimeoutTypeEnum.DYNAMIC);
 
+    RedisKeyDefine SOCIAL_AUTH_USER = new RedisKeyDefine("社交登陆的授权用户",
+            "social_auth_user:%d:%s", // 参数为 type,code
+            STRING, AuthUser.class, Duration.ofDays(1));
+
+    RedisKeyDefine SOCIAL_AUTH_STATE = new RedisKeyDefine("社交登陆的 state",
+            "social_auth_state:%s", // 参数为 state
+            STRING, String.class, Duration.ofHours(24)); // 值为 state
 }
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java
similarity index 77%
rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java
rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java
index d5e84e62d..514281071 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/dal/redis/social/SysSocialAuthUserRedisDAO.java
@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.adminserver.modules.system.dal.redis.social;
+package cn.iocoder.yudao.coreservice.modules.system.dal.redis.social;
 
 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import me.zhyd.oauth.model.AuthCallback;
@@ -8,10 +8,11 @@ import org.springframework.stereotype.Repository;
 
 import javax.annotation.Resource;
 
-import static cn.iocoder.yudao.adminserver.modules.system.dal.redis.SysRedisKeyConstants.SOCIAL_AUTH_USER;
+import static cn.iocoder.yudao.coreservice.modules.system.dal.redis.SysRedisKeyCoreConstants.SOCIAL_AUTH_USER;
 
+// TODO @timfruit,这里的 AuthUser 还是保留全路径,主要想体现出来,不是自己定义的
 /**
- * 社交 {@link me.zhyd.oauth.model.AuthUser} 的 RedisDAO
+ * 社交 {@link AuthUser} 的 RedisDAO
  *
  * @author 芋道源码
  */
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java
index 2fada1651..173287e52 100644
--- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/SysErrorCodeConstants.java
@@ -18,4 +18,8 @@ public interface SysErrorCodeConstants {
     ErrorCode FILE_PATH_EXISTS = new ErrorCode(1006001000, "文件路径已存在");
     ErrorCode FILE_NOT_EXISTS = new ErrorCode(1006001002, "文件不存在");
 
+    // ========== 社交模块 1006002000 ==========
+    ErrorCode SOCIAL_AUTH_FAILURE = new ErrorCode(1006002000, "社交授权失败,原因是:{}");
+    ErrorCode SOCIAL_UNBIND_NOT_SELF = new ErrorCode(1006002001, "社交解绑失败,非当前用户绑定");
+
 }
diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/social/SysSocialTypeEnum.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/social/SysSocialTypeEnum.java
new file mode 100644
index 000000000..3dba5bda0
--- /dev/null
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/enums/social/SysSocialTypeEnum.java
@@ -0,0 +1,84 @@
+package cn.iocoder.yudao.coreservice.modules.system.enums.social;
+
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.util.ArrayUtil;
+import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 社交平台的类型枚举
+ *
+ * @author 芋道源码
+ */
+@Getter
+@AllArgsConstructor
+public enum SysSocialTypeEnum implements IntArrayValuable {
+
+    /**
+     * Gitee
+     * 文档链接:https://gitee.com/api/v5/oauth_doc#/
+     */
+    GITEE(10, "GITEE"),
+    /**
+     * 钉钉
+     * 文档链接:https://developers.dingtalk.com/document/app/obtain-identity-credentials
+     */
+    DINGTALK(20, "DINGTALK"),
+
+    /**
+     * 企业微信
+     * 文档链接:https://xkcoding.com/2019/08/06/use-justauth-integration-wechat-enterprise.html
+     */
+    WECHAT_ENTERPRISE(30, "WECHAT_ENTERPRISE"),
+    /**
+     * 微信公众平台 - 移动端 H5
+     * 文档链接:https://www.cnblogs.com/juewuzhe/p/11905461.html
+     */
+    WECHAT_MP(31, "WECHAT_MP"),
+    /**
+     * 微信开放平台 - 网站应用 PC 端扫码授权登录
+     * 文档链接:https://justauth.wiki/guide/oauth/wechat_open/#_2-申请开发者资质认证
+     */
+    WECHAT_OPEN(32, "WECHAT_OPEN"),
+    /**
+     * 微信小程序
+     * 文档链接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html
+     */
+    WECHAT_MINI_PROGRAM(33, "WECHAT_MINI_PROGRAM"),
+    ;
+
+    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysSocialTypeEnum::getType).toArray();
+
+    public static final List<Integer> WECHAT_ALL = ListUtil.toList(WECHAT_ENTERPRISE.type, WECHAT_MP.type, WECHAT_OPEN.type,
+            WECHAT_MINI_PROGRAM.type);
+
+    /**
+     * 类型
+     */
+    private final Integer type;
+    /**
+     * 类型的标识
+     */
+    private final String source;
+
+    @Override
+    public int[] array() {
+        return ARRAYS;
+    }
+
+    public static SysSocialTypeEnum valueOfType(Integer type) {
+        return ArrayUtil.firstMatch(o -> o.getType().equals(type), values());
+    }
+
+    public static List<Integer> getRelationTypes(Integer type) {
+        if (WECHAT_ALL.contains(type)) {
+            return WECHAT_ALL;
+        }
+        return ListUtil.toList(type);
+    }
+
+}
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialService.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialService.java
similarity index 78%
rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialService.java
rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialService.java
index 44dfad63a..8a8df27d6 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/SysSocialService.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/SysSocialService.java
@@ -1,8 +1,9 @@
-package cn.iocoder.yudao.adminserver.modules.system.service.social;
+package cn.iocoder.yudao.coreservice.modules.system.service.social;
 
 import cn.hutool.core.util.StrUtil;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import me.zhyd.oauth.model.AuthUser;
 
@@ -14,6 +15,7 @@ import java.util.List;
  *
  * @author 芋道源码
  */
+// TODO @timfruit:SysSocialCoreService 改名,方便区分
 public interface SysSocialService {
 
     /**
@@ -49,7 +51,7 @@ public interface SysSocialService {
      * @param unionId 社交平台的 unionId
      * @return 社交用户列表
      */
-    List<SysSocialUserDO> getAllSocialUserList(Integer type, String unionId);
+    List<SysSocialUserDO> getAllSocialUserList(Integer type, String unionId, UserTypeEnum userTypeEnum);
 
     /**
      * 获得指定用户的社交用户列表
@@ -57,7 +59,7 @@ public interface SysSocialService {
      * @param userId 用户编号
      * @return 社交用户列表
      */
-    List<SysSocialUserDO> getSocialUserList(Long userId);
+    List<SysSocialUserDO> getSocialUserList(Long userId, UserTypeEnum userTypeEnum);
 
     /**
      * 绑定社交用户
@@ -66,7 +68,7 @@ public interface SysSocialService {
      * @param type 社交平台的类型 {@link SysSocialTypeEnum}
      * @param authUser 授权用户
      */
-    void bindSocialUser(Long userId, Integer type, AuthUser authUser);
+    void bindSocialUser(Long userId, Integer type, AuthUser authUser, UserTypeEnum userTypeEnum);
 
     /**
      * 取消绑定社交用户
@@ -75,6 +77,7 @@ public interface SysSocialService {
      * @param type 社交平台的类型 {@link SysSocialTypeEnum}
      * @param unionId 社交平台的 unionId
      */
-    void unbindSocialUser(Long userId, Integer type, String unionId);
+    void unbindSocialUser(Long userId, Integer type, String unionId,UserTypeEnum userTypeEnum);
+    // TODO @timfruit:逗号后面要有空格;缺少了 @userTypeEnum 的注释,都补充下哈。
 
 }
diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/impl/SysSocialServiceImpl.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/impl/SysSocialServiceImpl.java
similarity index 84%
rename from yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/impl/SysSocialServiceImpl.java
rename to yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/impl/SysSocialServiceImpl.java
index 28e33c617..bde40c3c4 100644
--- a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/system/service/social/impl/SysSocialServiceImpl.java
+++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/system/service/social/impl/SysSocialServiceImpl.java
@@ -1,11 +1,11 @@
-package cn.iocoder.yudao.adminserver.modules.system.service.social.impl;
+package cn.iocoder.yudao.coreservice.modules.system.service.social.impl;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.iocoder.yudao.adminserver.modules.system.dal.dataobject.social.SysSocialUserDO;
-import cn.iocoder.yudao.adminserver.modules.system.dal.mysql.social.SysSocialUserMapper;
-import cn.iocoder.yudao.adminserver.modules.system.dal.redis.social.SysSocialAuthUserRedisDAO;
-import cn.iocoder.yudao.adminserver.modules.system.enums.social.SysSocialTypeEnum;
-import cn.iocoder.yudao.adminserver.modules.system.service.social.SysSocialService;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.mysql.social.SysSocialUserMapper;
+import cn.iocoder.yudao.coreservice.modules.system.dal.redis.social.SysSocialAuthUserRedisDAO;
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
@@ -25,8 +25,8 @@ import javax.annotation.Resource;
 import java.util.List;
 import java.util.Objects;
 
-import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SOCIAL_AUTH_FAILURE;
-import static cn.iocoder.yudao.adminserver.modules.system.enums.SysErrorCodeConstants.SOCIAL_UNBIND_NOT_SELF;
+import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.SOCIAL_AUTH_FAILURE;
+import static cn.iocoder.yudao.coreservice.modules.system.enums.SysErrorCodeConstants.SOCIAL_UNBIND_NOT_SELF;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
 
@@ -75,25 +75,25 @@ public class SysSocialServiceImpl implements SysSocialService {
     }
 
     @Override
-    public List<SysSocialUserDO> getAllSocialUserList(Integer type, String unionId) {
+    public List<SysSocialUserDO> getAllSocialUserList(Integer type, String unionId,UserTypeEnum userTypeEnum) {
         List<Integer> types = SysSocialTypeEnum.getRelationTypes(type);
-        return socialUserMapper.selectListByTypeAndUnionId(UserTypeEnum.ADMIN.getValue(), types, unionId);
+        return socialUserMapper.selectListByTypeAndUnionId(userTypeEnum.getValue(), types, unionId);
     }
 
     @Override
-    public List<SysSocialUserDO> getSocialUserList(Long userId) {
-        return socialUserMapper.selectListByUserId(UserTypeEnum.ADMIN.getValue(), userId);
+    public List<SysSocialUserDO> getSocialUserList(Long userId,UserTypeEnum userTypeEnum) {
+        return socialUserMapper.selectListByUserId(userTypeEnum.getValue(), userId);
     }
 
     @Override
     @Transactional
-    public void bindSocialUser(Long userId, Integer type, AuthUser authUser) {
+    public void bindSocialUser(Long userId, Integer type, AuthUser authUser, UserTypeEnum userTypeEnum) {
         // 获得 unionId 对应的 SysSocialUserDO 列表
         String unionId = getAuthUserUnionId(authUser);
-        List<SysSocialUserDO> socialUsers = this.getAllSocialUserList(type, unionId);
+        List<SysSocialUserDO> socialUsers = this.getAllSocialUserList(type, unionId, userTypeEnum);
 
         // 逻辑一:如果 userId 之前绑定过该 type 的其它账号,需要进行解绑
-        this.unbindOldSocialUser(userId, type, unionId);
+        this.unbindOldSocialUser(userId, type, unionId, userTypeEnum);
 
         // 逻辑二:如果 socialUsers 指定的 userId 改变,需要进行更新
         // 例如说,一个微信 unionId 对应了多个社交账号,结果其中有个关联了新的 userId,则其它也要跟着修改
@@ -112,7 +112,7 @@ public class SysSocialServiceImpl implements SysSocialService {
                 .nickname(authUser.getNickname()).avatar(authUser.getAvatar()).rawUserInfo(toJsonString(authUser.getRawUserInfo()))
                 .build();
         if (socialUser == null) {
-            saveSocialUser.setUserId(userId).setUserType(UserTypeEnum.ADMIN.getValue())
+            saveSocialUser.setUserId(userId).setUserType(userTypeEnum.getValue())
                     .setType(type).setOpenid(authUser.getUuid()).setUnionId(unionId);
             socialUserMapper.insert(saveSocialUser);
         } else {
@@ -122,9 +122,9 @@ public class SysSocialServiceImpl implements SysSocialService {
     }
 
     @Override
-    public void unbindSocialUser(Long userId, Integer type, String unionId) {
+    public void unbindSocialUser(Long userId, Integer type, String unionId, UserTypeEnum userTypeEnum) {
         // 获得 unionId 对应的所有 SysSocialUserDO 社交用户
-        List<SysSocialUserDO> socialUsers = this.getAllSocialUserList(type, unionId);
+        List<SysSocialUserDO> socialUsers = this.getAllSocialUserList(type, unionId, userTypeEnum);
         if (CollUtil.isEmpty(socialUsers)) {
             return;
         }
@@ -140,10 +140,10 @@ public class SysSocialServiceImpl implements SysSocialService {
     }
 
     @VisibleForTesting
-    public void unbindOldSocialUser(Long userId, Integer type, String newUnionId) {
+    public void unbindOldSocialUser(Long userId, Integer type, String newUnionId, UserTypeEnum userTypeEnum) {
         List<Integer> types = SysSocialTypeEnum.getRelationTypes(type);
         List<SysSocialUserDO> oldSocialUsers = socialUserMapper.selectListByTypeAndUserId(
-                UserTypeEnum.ADMIN.getValue(), types, userId);
+                userTypeEnum.getValue(), types, userId);
         // 如果新老的 unionId 是一致的,说明无需解绑
         if (CollUtil.isEmpty(oldSocialUsers) || Objects.equals(newUnionId, oldSocialUsers.get(0).getUnionId())) {
             return;
diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml
index 5a0991087..fba394150 100644
--- a/yudao-dependencies/pom.xml
+++ b/yudao-dependencies/pom.xml
@@ -410,7 +410,6 @@
                 <artifactId>yunpian-java-sdk</artifactId>
                 <version>${yunpian-java-sdk.version}</version>
             </dependency>
-
             <dependency>
                 <groupId>com.aliyun</groupId>
                 <artifactId>aliyun-java-sdk-core</artifactId>
@@ -435,7 +434,7 @@
 
             <dependency>
                 <groupId>com.xkcoding.justauth</groupId>
-                <artifactId>justauth-spring-boot-starter</artifactId>
+                <artifactId>justauth-spring-boot-starter</artifactId> <!-- 社交登陆(例如说,个人微信、企业微信等等) -->
                 <version>${justauth.version}</version>
             </dependency>
 
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/social/SysSocialTypeEnum.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/social/SysSocialTypeEnum.java
deleted file mode 100644
index fe93f39c8..000000000
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/member/enums/social/SysSocialTypeEnum.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package cn.iocoder.yudao.userserver.modules.member.enums.social;
-
-import cn.hutool.core.collection.ListUtil;
-import cn.hutool.core.util.ArrayUtil;
-import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 社交平台的类型枚举
- *
- * @author 芋道源码
- */
-@Getter
-@AllArgsConstructor
-public enum SysSocialTypeEnum implements IntArrayValuable {
-
-    GITEE(10, "GITEE"), // https://gitee.com/api/v5/oauth_doc#/
-    DINGTALK(20, "DINGTALK"), // https://developers.dingtalk.com/document/app/obtain-identity-credentials
-    WECHAT_ENTERPRISE(30, "WECHAT_ENTERPRISE"), // https://xkcoding.com/2019/08/06/use-justauth-integration-wechat-enterprise.html
-    ;
-
-    public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(SysSocialTypeEnum::getType).toArray();
-
-    public static final List<Integer> WECHAT_ALL = ListUtil.toList(WECHAT_ENTERPRISE.type);
-
-    /**
-     * 类型
-     */
-    private final Integer type;
-    /**
-     * 类型的标识
-     */
-    private final String source;
-
-    @Override
-    public int[] array() {
-        return ARRAYS;
-    }
-
-    public static SysSocialTypeEnum valueOfType(Integer type) {
-        return ArrayUtil.firstMatch(o -> o.getType().equals(type), values());
-    }
-
-    public static List<Integer> getRelationTypes(Integer type) {
-        if (WECHAT_ALL.contains(type)) {
-            return WECHAT_ALL;
-        }
-        return ListUtil.toList(type);
-    }
-
-}
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java
index 2b1fd6161..6d18d53be 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/SysAuthController.java
@@ -1,9 +1,12 @@
 package cn.iocoder.yudao.userserver.modules.system.controller.auth;
 
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
+import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.*;
 import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService;
 import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService;
+import com.alibaba.fastjson.JSON;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -13,11 +16,13 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
 import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getUserAgent;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 @Api(tags = "认证")
 @RestController
@@ -30,6 +35,9 @@ public class SysAuthController {
     private SysAuthService authService;
     @Resource
     private SysSmsCodeService smsCodeService;
+    @Resource
+    private SysSocialService socialService;
+
 
     @PostMapping("/login")
     @ApiOperation("使用手机 + 密码登录")
@@ -70,42 +78,51 @@ public class SysAuthController {
     })
     public CommonResult<String> socialAuthRedirect(@RequestParam("type") Integer type,
                                                    @RequestParam("redirectUri") String redirectUri) {
-//        return CommonResult.success(socialService.getAuthorizeUrl(type, redirectUri));
-        return null;
+        return CommonResult.success(socialService.getAuthorizeUrl(type, redirectUri));
+    }
+
+    // TODO @timfruit:这个接口,是要删除的么?
+    @GetMapping("/social-login-get")
+    @ApiOperation("微信公众号授权回调地址,输出social-login2的必要参数用于测试,使用 code 授权码")
+    @ResponseBody
+    @Deprecated
+    public CommonResult<MbrAuthSocialLoginReqVO> socialLoginGet(HttpServletRequest request,String code,String state) {
+        // 返回结果
+        MbrAuthSocialLoginReqVO reqVO = MbrAuthSocialLoginReqVO.builder().state(state).code(code).build();
+        reqVO.setType(12);
+        //输出social-login2的必要参数用于测试
+        System.out.println(JSON.toJSON(reqVO));
+        return success(reqVO);
     }
 
     @PostMapping("/social-login")
     @ApiOperation("社交登录,使用 code 授权码")
-        public CommonResult<SysAuthLoginRespVO> socialLogin(@RequestBody @Valid MbrAuthSocialLoginReqVO reqVO) {
-//        String token = authService.socialLogin(reqVO, getClientIP(), getUserAgent());
-//        // 返回结果
-//        return success(MbrAuthLoginRespVO.builder().token(token).build());
-        return null;
+    public CommonResult<SysAuthLoginRespVO> socialLogin(@RequestBody @Valid MbrAuthSocialLoginReqVO reqVO) {
+        String token = authService.socialLogin(reqVO, getClientIP(), getUserAgent());
+        return success(SysAuthLoginRespVO.builder().token(token).build());
     }
 
+    // TODO @timfruit:社交登陆时,使用手机验证码来验证哈。这块我当时没设计好,改改,嘿嘿。
+
     @PostMapping("/social-login2")
     @ApiOperation("社交登录,使用 code 授权码 + 账号密码")
     public CommonResult<SysAuthLoginRespVO> socialLogin2(@RequestBody @Valid MbrAuthSocialLogin2ReqVO reqVO) {
-//        String token = authService.socialLogin2(reqVO, getClientIP(), getUserAgent());
-//        // 返回结果
-//        return success(MbrAuthLoginRespVO.builder().token(token).build());
-        return null;
+        String token = authService.socialLogin2(reqVO, getClientIP(), getUserAgent());
+        return success(SysAuthLoginRespVO.builder().token(token).build());
     }
 
     @PostMapping("/social-bind")
     @ApiOperation("社交绑定,使用 code 授权码")
     public CommonResult<Boolean> socialBind(@RequestBody @Valid MbrAuthSocialBindReqVO reqVO) {
-//        authService.socialBind(getLoginUserId(), reqVO);
-//        return CommonResult.success(true);
-        return null;
+        authService.socialBind(getLoginUserId(), reqVO);
+        return CommonResult.success(true);
     }
 
     @DeleteMapping("/social-unbind")
     @ApiOperation("取消社交绑定")
     public CommonResult<Boolean> socialUnbind(@RequestBody MbrAuthSocialUnbindReqVO reqVO) {
-//        socialService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId());
-//        return CommonResult.success(true);
-        return null;
+        socialService.unbindSocialUser(getLoginUserId(), reqVO.getType(), reqVO.getUnionId(), UserTypeEnum.MEMBER);
+        return CommonResult.success(true);
     }
 
 }
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java
index d866411d2..767446b5f 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialBindReqVO.java
@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
 
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
 import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java
index 371e7e9b3..584df7ed1 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLogin2ReqVO.java
@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
 
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
 import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java
index 5fdd424c1..cb430231a 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialLoginReqVO.java
@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
 
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
 import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java
index ea9050a29..75e31701d 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/controller/auth/vo/MbrAuthSocialUnbindReqVO.java
@@ -1,7 +1,7 @@
 package cn.iocoder.yudao.userserver.modules.system.controller.auth.vo;
 
+import cn.iocoder.yudao.coreservice.modules.system.enums.social.SysSocialTypeEnum;
 import cn.iocoder.yudao.framework.common.validation.InEnum;
-import cn.iocoder.yudao.userserver.modules.member.enums.social.SysSocialTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java
index e5f4ac678..f24be9cc6 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/enums/SysErrorCodeConstants.java
@@ -14,6 +14,7 @@ public interface SysErrorCodeConstants {
     ErrorCode AUTH_LOGIN_USER_DISABLED = new ErrorCode(1005000001, "登录失败,账号被禁用");
     ErrorCode AUTH_LOGIN_FAIL_UNKNOWN = new ErrorCode(1005000002, "登录失败"); // 登录失败的兜底,未知原因
     ErrorCode AUTH_TOKEN_EXPIRED = new ErrorCode(1005000003, "Token 已经过期");
+    ErrorCode AUTH_THIRD_LOGIN_NOT_BIND = new ErrorCode(1005000004, "未绑定账号,需要进行绑定");
 
     // ========== SMS CODE 模块 1005001000 ==========
     ErrorCode USER_SMS_CODE_NOT_FOUND = new ErrorCode(1005001000, "验证码不存在");
@@ -22,4 +23,7 @@ public interface SysErrorCodeConstants {
     ErrorCode USER_SMS_CODE_NOT_CORRECT = new ErrorCode(1005001003, "验证码不正确");
     ErrorCode USER_SMS_CODE_EXCEED_SEND_MAXIMUM_QUANTITY_PER_DAY = new ErrorCode(1005001004, "超过每日短信发送数量");
     ErrorCode USER_SMS_CODE_SEND_TOO_FAST = new ErrorCode(1005001005, "短信发送过于频率");
+
+    // ========== 用户模块 1005002000 ==========
+    ErrorCode USER_NOT_EXISTS = new ErrorCode(1005002001, "用户不存在");
 }
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java
index b35d1c27a..628f95c80 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/SysAuthService.java
@@ -1,8 +1,7 @@
 package cn.iocoder.yudao.userserver.modules.system.service.auth;
 
 import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService;
-import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthLoginReqVO;
-import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthSmsLoginReqVO;
+import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.*;
 
 import javax.validation.Valid;
 
@@ -35,4 +34,33 @@ public interface SysAuthService extends SecurityAuthFrameworkService {
      */
     String smsLogin(@Valid SysAuthSmsLoginReqVO reqVO, String userIp, String userAgent);
 
+
+    /**
+     * 社交登录,使用 code 授权码
+     *
+     * @param reqVO 登录信息
+     * @param userIp 用户 IP
+     * @param userAgent 用户 UA
+     * @return 身份令牌,使用 JWT 方式
+     */
+    String socialLogin(@Valid MbrAuthSocialLoginReqVO reqVO, String userIp, String userAgent);
+
+    /**
+     * 社交登录,使用 code 授权码 + 账号密码
+     *
+     * @param reqVO 登录信息
+     * @param userIp 用户 IP
+     * @param userAgent 用户 UA
+     * @return 身份令牌,使用 JWT 方式
+     */
+    String socialLogin2(@Valid MbrAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent);
+
+    /**
+     * 社交绑定,使用 code 授权码
+     *
+     * @param userId 用户编号
+     * @param reqVO 绑定信息
+     */
+    void socialBind(Long userId, @Valid MbrAuthSocialBindReqVO reqVO);
+
 }
diff --git a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
index 0199c078e..2394cd03a 100644
--- a/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
+++ b/yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/system/service/auth/impl/SysAuthServiceImpl.java
@@ -1,25 +1,28 @@
 package cn.iocoder.yudao.userserver.modules.system.service.auth.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.lang.Assert;
 import cn.iocoder.yudao.coreservice.modules.member.dal.dataobject.user.MbrUserDO;
+import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.social.SysSocialUserDO;
 import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginLogTypeEnum;
 import cn.iocoder.yudao.coreservice.modules.system.enums.logger.SysLoginResultEnum;
 import cn.iocoder.yudao.coreservice.modules.system.service.auth.SysUserSessionCoreService;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.SysLoginLogCoreService;
 import cn.iocoder.yudao.coreservice.modules.system.service.logger.dto.SysLoginLogCreateReqDTO;
+import cn.iocoder.yudao.coreservice.modules.system.service.social.SysSocialService;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
 import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
 import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
 import cn.iocoder.yudao.framework.security.core.LoginUser;
 import cn.iocoder.yudao.userserver.modules.member.service.user.MbrUserService;
-import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthLoginReqVO;
-import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.SysAuthSmsLoginReqVO;
+import cn.iocoder.yudao.userserver.modules.system.controller.auth.vo.*;
 import cn.iocoder.yudao.userserver.modules.system.convert.auth.SysAuthConvert;
 import cn.iocoder.yudao.userserver.modules.system.enums.sms.SysSmsSceneEnum;
 import cn.iocoder.yudao.userserver.modules.system.service.auth.SysAuthService;
 import cn.iocoder.yudao.userserver.modules.system.service.sms.SysSmsCodeService;
 import lombok.extern.slf4j.Slf4j;
+import me.zhyd.oauth.model.AuthUser;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.BadCredentialsException;
@@ -33,6 +36,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
+import java.util.List;
 import java.util.Objects;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -59,6 +63,9 @@ public class SysAuthServiceImpl implements SysAuthService {
     private SysLoginLogCoreService loginLogCoreService;
     @Resource
     private SysUserSessionCoreService userSessionCoreService;
+    @Resource
+    private SysSocialService socialService;
+    private static final UserTypeEnum userTypeEnum = UserTypeEnum.MEMBER;
 
     @Override
     public UserDetails loadUserByUsername(String mobile) throws UsernameNotFoundException {
@@ -99,6 +106,63 @@ public class SysAuthServiceImpl implements SysAuthService {
         return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
     }
 
+    @Override
+    public String socialLogin(MbrAuthSocialLoginReqVO reqVO, String userIp, String userAgent) {
+        // 使用 code 授权码,进行登录
+        AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState());
+        org.springframework.util.Assert.notNull(authUser, "授权用户不为空");
+
+        // 如果未绑定 SysSocialUserDO 用户,则无法自动登录,进行报错
+        String unionId = socialService.getAuthUserUnionId(authUser);
+        List<SysSocialUserDO> socialUsers = socialService.getAllSocialUserList(reqVO.getType(), unionId, userTypeEnum);
+        if (CollUtil.isEmpty(socialUsers)) {
+            throw exception(AUTH_THIRD_LOGIN_NOT_BIND);
+        }
+
+        // 自动登录
+        MbrUserDO user = userService.getUser(socialUsers.get(0).getUserId());
+        if (user == null) {
+            throw exception(USER_NOT_EXISTS);
+        }
+        this.createLoginLog(user.getMobile(), SysLoginLogTypeEnum.LOGIN_SOCIAL, SysLoginResultEnum.SUCCESS);
+
+        // 创建 LoginUser 对象
+        LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user);
+
+        // 绑定社交用户(更新)
+        socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, userTypeEnum);
+
+        // 缓存登录用户到 Redis 中,返回 sessionId 编号
+        return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
+    }
+
+    @Override
+    public String socialLogin2(MbrAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent) {
+        // 使用 code 授权码,进行登录
+        AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState());
+        org.springframework.util.Assert.notNull(authUser, "授权用户不为空");
+
+        // 使用账号密码,进行登录。
+        LoginUser loginUser = this.login0(reqVO.getUsername(), reqVO.getPassword());
+//        loginUser.setRoleIds(this.getUserRoleIds(loginUser.getId())); // 获取用户角色列表
+
+        // 绑定社交用户(新增)
+        socialService.bindSocialUser(loginUser.getId(), reqVO.getType(), authUser, userTypeEnum);
+
+        // 缓存登录用户到 Redis 中,返回 sessionId 编号
+        return userSessionCoreService.createUserSession(loginUser, userIp, userAgent);
+    }
+
+    @Override
+    public void socialBind(Long userId, MbrAuthSocialBindReqVO reqVO) {
+        // 使用 code 授权码,进行登录
+        AuthUser authUser = socialService.getAuthUser(reqVO.getType(), reqVO.getCode(), reqVO.getState());
+        org.springframework.util.Assert.notNull(authUser, "授权用户不为空");
+
+        // 绑定社交用户(新增)
+        socialService.bindSocialUser(userId, reqVO.getType(), authUser, userTypeEnum);
+    }
+
     private LoginUser login0(String username, String password) {
         final SysLoginLogTypeEnum logTypeEnum = SysLoginLogTypeEnum.LOGIN_USERNAME;
         // 用户验证
@@ -207,7 +271,7 @@ public class SysAuthServiceImpl implements SysAuthService {
         reqDTO.setLogType(SysLoginLogTypeEnum.LOGOUT_SELF.getType());
         reqDTO.setTraceId(TracerUtils.getTraceId());
         reqDTO.setUserId(userId);
-        reqDTO.setUserType(UserTypeEnum.MEMBER.getValue());
+        reqDTO.setUserType(userTypeEnum.getValue());
         reqDTO.setUsername(username);
         reqDTO.setUserAgent(ServletUtils.getUserAgent());
         reqDTO.setUserIp(ServletUtils.getClientIP());
diff --git a/yudao-user-server/src/main/resources/application-dev.yaml b/yudao-user-server/src/main/resources/application-dev.yaml
index 6cbd627f8..858e97739 100644
--- a/yudao-user-server/src/main/resources/application-dev.yaml
+++ b/yudao-user-server/src/main/resources/application-dev.yaml
@@ -141,3 +141,30 @@ yudao:
   pay:
     pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify
     refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify
+
+
+justauth:
+  enabled: true
+  type: # TODO @timfruit:GITEE、DINGTALK、WECHAT_ENTERPRISE 这个几个,对于用户端是不需要的哈,可以删除噢
+    GITEE: # Gitee
+      client-id: ee61f0374a4c6c404a8717094caa7a410d76950e45ff60348015830c519ba5c1
+      client-secret: 7c044a5671be3b051414db0cf2cec6ad702dd298d2416ba24ceaf608e6fa26f9
+      ignore-check-redirect-uri: true
+    DINGTALK: # 钉钉
+      client-id: dingvrnreaje3yqvzhxg
+      client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
+      ignore-check-redirect-uri: true
+    WECHAT_ENTERPRISE: # 企业微信
+      client-id: wwd411c69a39ad2e54
+      client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
+      agent-id: 1000004
+      ignore-check-redirect-uri: true
+    WECHAT_MP: # 微信公众平台 - H5  https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
+      client-id: wxa5a05b85ac361f96
+      client-secret: 247073c7cebb67f27f0e769195c2a57e
+      ignore-check-redirect-uri: true
+  cache:
+    type: REDIS
+    prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
+    timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
+
diff --git a/yudao-user-server/src/main/resources/application-local.yaml b/yudao-user-server/src/main/resources/application-local.yaml
index ac20815c4..c39a7cb1b 100644
--- a/yudao-user-server/src/main/resources/application-local.yaml
+++ b/yudao-user-server/src/main/resources/application-local.yaml
@@ -155,3 +155,28 @@ yudao:
   pay:
     pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify
     refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify
+
+justauth:
+  enabled: true
+  type:
+    WECHAT_MP: # 微信公众平台 - 移动端 H5 https://www.yuque.com/docs/share/a795bef6-ee8a-494a-8dc4-2ef41927743b?#%20%E3%80%8A%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7%E6%B5%8B%E8%AF%95%E3%80%8B
+      client-id: wxa5a05b85ac361f96
+      client-secret: 247073c7cebb67f27f0e769195c2a57e
+#      client-id: wx5b23ba7a5589ecbb # TODO 芋艿:自己的测试,后续可以删除
+#      client-secret: 2a7b3b20c537e52e74afd395eb85f61f
+      ignore-check-redirect-uri: true
+  extend:
+    enum-class: cn.iocoder.yudao.coreservice.modules.system.compent.justauth.AuthExtendSource
+    config:
+      WECHAT_MINI_PROGRAM: # 微信小程序 https://www.yuque.com/docs/share/88e3d30a-6830-45fc-8c25-dae485aef3aa?#%20%E3%80%8A%E5%B0%8F%E7%A8%8B%E5%BA%8F%E6%8E%88%E6%9D%83%E7%99%BB%E5%BD%95%E3%80%8B
+        request-class: cn.iocoder.yudao.coreservice.modules.system.compent.justauth.AuthWeChatMiniProgramRequest
+        client-id: wx44d047d87e6284d8
+        client-secret: 21c3b7a8a51ee1b8f5cf875848ed4466
+#        client-id: wx63c280fe3248a3e7  # TODO 芋艿:自己的测试,后续可以删除
+#        client-secret: 6f270509224a7ae1296bbf1c8cb97aed
+        ignore-check-redirect-uri: true
+        ignore-check-state: true
+  cache:
+    type: REDIS
+    prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
+    timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
diff --git a/yudao-user-server/src/main/resources/static/social-login.html b/yudao-user-server/src/main/resources/static/social-login.html
new file mode 100644
index 000000000..2570d7084
--- /dev/null
+++ b/yudao-user-server/src/main/resources/static/social-login.html
@@ -0,0 +1,36 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
+    <title>社交登陆测试页</title>
+    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
+</head>
+<body>
+<div>点击如下按钮,发起登陆的测试</div>
+<div>
+    <button id="wx_pub">微信公众号</button>
+</div>
+</body>
+<script>
+    let server = 'http://127.0.0.1:28080';
+
+    // 微信公众号
+    $( "#wx_pub").on( "click", function() {
+        // 获得授权链接
+        $.ajax({
+            url: server + "/api/social-auth-redirect?type=31&redirectUri=" +
+                encodeURIComponent(server + '/api/social-login-get'),
+            method: 'GET',
+            success: function( result ) {
+                if (result.code !== 0) {
+                    alert('获得授权链接失败,原因:' + result.msg)
+                    return;
+                }
+                // 跳转重定向
+                document.location.href = result.data;
+            }
+        })
+    });
+</script>
+</html>
diff --git a/更新日志.md b/更新日志.md
index f66a804cd..cd0c94006 100644
--- a/更新日志.md
+++ b/更新日志.md
@@ -15,6 +15,7 @@ TODO
 
 * 支付
 * 用户前台的社交登陆
+* 用户前台的修改手机、修改密码、忘记密码
 
 ## [v1.1.0] 2021.10.25