From e4b405491fa2ba0ede349b8f92b5b86172e2da3a Mon Sep 17 00:00:00 2001
From: thiszhc <2029364173@qq.com>
Date: Sat, 10 Jun 2023 21:39:31 +0800
Subject: [PATCH 1/6] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=A0=E7=AC=AC?=
=?UTF-8?q?=E4=B8=89=E6=96=B9=E7=99=BB=E5=BD=95=E6=8E=88=E6=9D=83=E5=8A=9F?=
=?UTF-8?q?=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 8 ++
ruoyi-admin/pom.xml | 15 +++
.../web/controller/AuthController.java | 83 +++++++++++++
.../dromara/web/service/SysLoginService.java | 65 ++++++++++
ruoyi-common/pom.xml | 1 +
ruoyi-common/ruoyi-common-auth/pom.xml | 22 ++++
.../utils/AuthUtils.java | 112 ++++++++++++++++++
.../dromara/common/core/enums/DeviceType.java | 4 +-
.../dromara/system/domain/SysAuthUser.java | 40 +++++++
.../dromara/system/mapper/SysUserMapper.java | 45 ++++++-
.../mapper/system/SysAuthUserMapper.xml | 60 ++++++++++
script/AuthSQL/sys_auth_user.sql | 14 +++
12 files changed, 466 insertions(+), 3 deletions(-)
create mode 100644 ruoyi-common/ruoyi-common-auth/pom.xml
create mode 100644 ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
create mode 100644 script/AuthSQL/sys_auth_user.sql
diff --git a/pom.xml b/pom.xml
index b20e7f059..a1e7524b6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,6 +41,7 @@
1.72
2.7.0
+ 1.15.6
1.33
@@ -291,6 +292,13 @@
${snakeyaml.version}
+
+
+ me.zhyd.oauth
+ JustAuth
+ ${justauth.version}
+
+
org.bouncycastle
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index af5f23967..dd4fc58e7 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -75,6 +75,21 @@
spring-boot-starter-test
test
+
+ me.zhyd.oauth
+ JustAuth
+
+
+ org.dromara
+ ruoyi-common-auth
+ 5.1.0-SNAPSHOT
+
+
+ com.aliyun
+ credentials-java
+ 0.2.4
+ compile
+
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index bba6113da..6d0ef7bce 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -2,9 +2,21 @@ package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSON;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
+import me.zhyd.oauth.cache.AuthDefaultStateCache;
+import me.zhyd.oauth.cache.AuthStateCache;
+import me.zhyd.oauth.model.AuthCallback;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthUser;
+import me.zhyd.oauth.request.AuthRequest;
+import me.zhyd.oauth.utils.AuthStateUtils;
+import org.dromara.common.auth.utils.AuthUtils;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.EmailLoginBody;
import org.dromara.common.core.domain.model.LoginBody;
@@ -16,6 +28,8 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysTenantVo;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysTenantService;
import org.dromara.web.domain.vo.LoginTenantVo;
@@ -26,8 +40,11 @@ import org.dromara.web.service.SysRegisterService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
+import java.io.IOException;
import java.net.URL;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* 认证
@@ -41,10 +58,18 @@ import java.util.List;
@RequestMapping("/auth")
public class AuthController {
+ private AuthStateCache authStateCache;
private final SysLoginService loginService;
private final SysRegisterService registerService;
private final ISysConfigService configService;
private final ISysTenantService tenantService;
+ private final SysUserMapper userMapper;
+ private final Map auths = new HashMap<>();
+ {
+ auths.put("gitee", "{\"clientId\":\"38eaaa1b77b5e064313057a2f5745ce3a9f3e7686d9bd302c7df2f308ef6db81\",\"clientSecret\":\"2e633af8780cb9fe002c4c7291b722db944402e271efb99b062811f52d7da1ff\",\"redirectUri\":\"http://127.0.0.1:8888/social-login?source=gitee\"}");
+ auths.put("github", "{\"clientId\":\"Iv1.1be0cdcd71aca63b\",\"clientSecret\":\"0d59d28b43152bc8906011624db37b0fed88d154\",\"redirectUri\":\"http://127.0.0.1:80/social-login?source=github\"}");
+ authStateCache = AuthDefaultStateCache.INSTANCE;// 使用默认的缓存
+ }
/**
* 登录方法
@@ -115,6 +140,64 @@ public class AuthController {
return R.ok(loginVo);
}
+
+
+
+ /**
+ * 认证授权
+ * @param source
+ * @throws IOException
+ */
+ @GetMapping("/binding/{source}")
+ @ResponseBody
+ public R authBinding(@PathVariable("source") String source, HttpServletRequest request){
+ SysUserVo userLoding = new SysUserVo();
+ if (ObjectUtil.isNull(userLoding)) {
+ return R.fail("授权失败,请先登录再绑定");
+ }
+ if (userMapper.checkAuthUser(userLoding.getUserId(),source) > 0)
+ {
+ return R.fail(source + "平台账号已经绑定");
+ }
+ String obj = auths.get(source);
+ if (StringUtils.isEmpty(obj))
+ {
+ return R.fail(source + "平台账号暂不支持");
+ }
+ JSONObject json = JSONUtil.parseObj(obj);
+ AuthRequest authRequest = AuthUtils.getAuthRequest(source,
+ json.getStr("clientId"),
+ json.getStr("clientSecret"),
+ json.getStr("redirectUri"), authStateCache);
+ String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
+ return R.ok(authorizeUrl);
+ }
+
+ /**
+ * @param source
+ * @param callback
+ * @param request
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ @GetMapping("/social-login/{source}")
+ public R socialLogin(@PathVariable("source") String source, AuthCallback callback, HttpServletRequest request) throws IOException {
+ String obj = auths.get(source);
+ if (StringUtils.isEmpty(obj))
+ {
+ return R.fail("第三方平台系统不支持或未提供来源");
+ }
+ JSONObject json = JSONUtil.parseObj(obj);
+ AuthRequest authRequest = AuthUtils.getAuthRequest(source,
+ json.getStr("clientId"),
+ json.getStr("clientSecret"),
+ json.getStr("redirectUri"), authStateCache);
+ AuthResponse response = authRequest.login(callback);
+ return loginService.socialLogin(source, response, request);
+ }
+
+
+
/**
* 退出登录
*/
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index 689a55de1..b152710cb 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -6,11 +6,15 @@ import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthUser;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.TenantConstants;
+import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.XcxLoginUser;
@@ -28,6 +32,7 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.exception.TenantException;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.config.properties.CaptchaProperties;
+import org.dromara.system.domain.SysAuthUser;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.domain.vo.SysUserVo;
@@ -37,6 +42,7 @@ import org.dromara.system.service.ISysTenantService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import java.io.IOException;
import java.time.Duration;
import java.util.Date;
import java.util.List;
@@ -154,6 +160,65 @@ public class SysLoginService {
return StpUtil.getTokenValue();
}
+
+ /**
+ * 认证授权登录
+ * @param source
+ * @throws IOException
+ */
+ /**
+ * 社交登录
+ * @param source 登录来源
+ * @param authUser 授权响应实体
+ * @param request Http请求对象
+ * @return 统一响应实体
+ * @throws IOException
+ */
+ public R socialLogin(String source, AuthResponse authUser, HttpServletRequest request) throws IOException {
+ // 判断授权响应是否成功
+ if (!authUser.ok()) {
+ return R.fail("对不起,授权信息验证不通过,请联系管理员");
+ }
+ AuthUser authUserData = authUser.getData();
+ // 判断数据库中是否已存在该用户
+ SysUserVo user = userMapper.selectAuthUserByUuid(source + authUserData.getUuid());
+ if (ObjectUtil.isNotNull(user)) {
+ checkTenant(user.getTenantId());
+ SysUserVo dbUser = loadUserByUsername(user.getTenantId(), user.getUserName());
+ // 登录
+ LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.auth);
+ recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ recordLoginInfo(user.getUserId());
+ return R.ok(StpUtil.getTokenValue());
+ } else {
+ if (LoginHelper.getUserId() == null) {
+ return R.fail("授权失败,请先登录再绑定");
+ }
+ // 组装授权用户信息
+ SysAuthUser sysAuthUser = new SysAuthUser();
+ sysAuthUser.setAvatar(authUserData.getAvatar());
+ sysAuthUser.setUuid(source + authUserData.getUuid());
+ sysAuthUser.setUserId(LoginHelper.getUserId());
+ sysAuthUser.setUserName(authUserData.getUsername());
+ sysAuthUser.setNickName(authUserData.getNickname());
+ sysAuthUser.setEmail(authUserData.getEmail());
+ sysAuthUser.setSource(source);
+ sysAuthUser.setCreateTime(new Date().toString());
+ // 新用户,绑定第三方账号
+ userMapper.insertAuthUser(sysAuthUser);
+ SysUserVo lodingData = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
+ checkTenant(lodingData.getTenantId());
+ LoginHelper.loginByDevice(buildLoginUser(lodingData), DeviceType.auth);
+ recordLogininfor(lodingData.getTenantId(), sysAuthUser.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ recordLoginInfo(sysAuthUser.getUserId());
+ return R.ok(StpUtil.getTokenValue());
+ }
+ }
+
+
+
+
+
/**
* 退出登录
*/
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 0428aea78..4813f7985 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -11,6 +11,7 @@
ruoyi-common-bom
+ ruoyi-common-auth
ruoyi-common-core
ruoyi-common-doc
ruoyi-common-excel
diff --git a/ruoyi-common/ruoyi-common-auth/pom.xml b/ruoyi-common/ruoyi-common-auth/pom.xml
new file mode 100644
index 000000000..9af89e612
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-auth/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ org.dromara
+ ruoyi-common
+ ${revision}
+ ../pom.xml
+
+ 4.0.0
+ ruoyi-common-auth
+
+ ruoyi-common-auth 认证模块
+
+
+
+ me.zhyd.oauth
+ JustAuth
+
+
+
diff --git a/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java b/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
new file mode 100644
index 000000000..981b3be6d
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
@@ -0,0 +1,112 @@
+package org.dromara.common.auth.utils;
+import me.zhyd.oauth.cache.AuthStateCache;
+import me.zhyd.oauth.config.AuthConfig;
+import me.zhyd.oauth.exception.AuthException;
+import me.zhyd.oauth.request.*;
+
+/**
+ * 认证授权工具类
+ *
+ * @author ruoyi
+ */
+public class AuthUtils {
+ public static AuthRequest getAuthRequest(String source, String clientId, String clientSecret, String redirectUri,
+ AuthStateCache authStateCache)
+ {
+ AuthRequest authRequest = null;
+ switch (source.toLowerCase()) {
+ case "dingtalk" ->
+ authRequest = new AuthDingTalkRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "baidu" ->
+ authRequest = new AuthBaiduRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "github" ->
+ authRequest = new AuthGithubRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "gitee" ->
+ authRequest = new AuthGiteeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "weibo" ->
+ authRequest = new AuthWeiboRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "coding" ->
+ authRequest = new AuthCodingRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).codingGroupName("").build(), authStateCache);
+ case "oschina" ->
+ authRequest = new AuthOschinaRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "alipay" ->
+ // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip
+ authRequest = new AuthAlipayRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .alipayPublicKey("").redirectUri(redirectUri).build(), authStateCache);
+ case "qq" ->
+ authRequest = new AuthQqRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "wechat_open" -> authRequest = new AuthWeChatOpenRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
+ case "csdn" ->
+ authRequest = new AuthCsdnRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "taobao" ->
+ authRequest = new AuthTaobaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "douyin" ->
+ authRequest = new AuthDouyinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "linkedin" ->
+ authRequest = new AuthLinkedinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "microsoft" -> authRequest = new AuthMicrosoftRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
+ case "mi" ->
+ authRequest = new AuthMiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "toutiao" ->
+ authRequest = new AuthToutiaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "teambition" -> authRequest = new AuthTeambitionRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
+ case "pinterest" -> authRequest = new AuthPinterestRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
+ case "renren" ->
+ authRequest = new AuthRenrenRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "stack_overflow" -> authRequest = new AuthStackOverflowRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).stackOverflowKey("").build(),
+ authStateCache);
+ case "huawei" ->
+ authRequest = new AuthHuaweiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "wechat_enterprise" ->
+ authRequest = new AuthWeChatEnterpriseRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).agentId("").build(), authStateCache);
+ case "kujiale" ->
+ authRequest = new AuthKujialeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "gitlab" ->
+ authRequest = new AuthGitlabRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "meituan" ->
+ authRequest = new AuthMeituanRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "eleme" ->
+ authRequest = new AuthElemeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "wechat_mp" ->
+ authRequest = new AuthWeChatMpRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ case "aliyun" ->
+ authRequest = new AuthAliyunRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build(), authStateCache);
+ default -> {
+ }
+ }
+ if (null == authRequest)
+ {
+ throw new AuthException("未获取到有效的Auth配置");
+ }
+ return authRequest;
+ }
+}
+
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
index 09bf44b6d..7127bbb83 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
@@ -26,7 +26,9 @@ public enum DeviceType {
/**
* 小程序端
*/
- XCX("xcx");
+ XCX("xcx"),
+
+ auth("auth");
private final String device;
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
new file mode 100644
index 000000000..5008786e3
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
@@ -0,0 +1,40 @@
+package org.dromara.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@TableName("sys_auth_user")
+public class SysAuthUser {
+
+ private static final long serialVersionUID = 1L;
+
+ /** 授权ID */
+ private Long authId;
+
+ /** 第三方平台用户唯一ID */
+ private String uuid;
+
+ /** 系统用户ID */
+ private Long userId;
+
+ /** 登录账号 */
+ private String userName;
+
+ /** 用户昵称 */
+ private String nickName;
+
+ /** 头像地址 */
+ private String avatar;
+
+ /** 用户邮箱 */
+ private String email;
+
+ /** 用户来源 */
+ private String source;
+
+ private String createTime;
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
index 81bd1ff3d..94c9c1e75 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.system.domain.SysAuthUser;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysUserVo;
import org.apache.ibatis.annotations.Param;
@@ -123,8 +124,8 @@ public interface SysUserMapper extends BaseMapperPlus {
* @return 用户对象信息
*/
@DataPermission({
- @DataColumn(key = "deptName", value = "d.dept_id"),
- @DataColumn(key = "userName", value = "u.user_id")
+ @DataColumn(key = "deptName", value = "d.dept_id"),// 部门权限
+ @DataColumn(key = "userName", value = "u.user_id")// 用户权限
})
SysUserVo selectUserById(Long userId);
@@ -142,4 +143,44 @@ public interface SysUserMapper extends BaseMapperPlus {
})
int updateById(@Param(Constants.ENTITY) SysUser user);
+ /**
+ * 根据用户编号查询授权列表
+ *
+ * @param userId 用户编号
+ * @return 授权列表
+ */
+ public List selectAuthUserListByUserId(Long userId);
+
+ /**
+ * 根据uuid查询用户信息
+ *
+ * @param uuid 唯一信息
+ * @return 结果
+ */
+ public SysUserVo selectAuthUserByUuid(String uuid);
+
+ /**
+ * 校验source平台是否绑定
+ *
+ * @param userId 用户编号
+ * @param source 绑定平台
+ * @return 结果
+ */
+ public int checkAuthUser(@Param("userId") Long userId, @Param("source") String source);
+
+ /**
+ * 新增第三方授权信息
+ *
+ * @param authUser 用户信息
+ * @return 结果
+ */
+ public int insertAuthUser(SysAuthUser authUser);
+
+ /**
+ * 根据编号删除第三方授权信息
+ *
+ * @param authId 授权编号
+ * @return 结果
+ */
+ public int deleteAuthUser(Long authId);
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
new file mode 100644
index 000000000..864b3ba32
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ insert into sys_auth_user(
+ uuid,
+ user_id,
+ user_name,
+ nick_name,
+ avatar,
+ email,
+ source,
+ create_time
+ )values(
+ #{uuid},
+ #{userId},
+ #{userName},
+ #{nickName},
+ #{avatar},
+ #{email},
+ #{source},
+ now()
+ )
+
+
+
+ delete from sys_auth_user where auth_id = #{authId}
+
+
+
diff --git a/script/AuthSQL/sys_auth_user.sql b/script/AuthSQL/sys_auth_user.sql
new file mode 100644
index 000000000..4a416753b
--- /dev/null
+++ b/script/AuthSQL/sys_auth_user.sql
@@ -0,0 +1,14 @@
+CREATE TABLE `sys_auth_user` (
+ `auth_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '授权ID',
+ `uuid` varchar(500) NOT NULL COMMENT '第三方平台用户唯一ID',
+ `user_id` bigint(20) unsigned NOT NULL COMMENT '系统用户ID',
+ `user_name` varchar(30) NOT NULL COMMENT '登录账号',
+ `nick_name` varchar(30) DEFAULT '' COMMENT '用户昵称',
+ `avatar` varchar(500) DEFAULT '' COMMENT '头像地址',
+ `email` varchar(255) DEFAULT '' COMMENT '用户邮箱',
+ `source` varchar(255) DEFAULT '' COMMENT '用户来源',
+ ` tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户id',
+ `create_time` datetime DEFAULT NULL COMMENT '创建时间',
+ `tenant_id` varchar(25) NOT NULL DEFAULT '000000',
+ PRIMARY KEY (`auth_id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8mb4 COMMENT='第三方平台授权用户信息表';
From 2d894c13096c43ae6d6cf6a4462e1153881ab864 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E4=B8=89=E4=B8=AA=E4=B8=89?= <2029364173@qq.com>
Date: Sun, 11 Jun 2023 19:26:14 +0000
Subject: [PATCH 2/6] =?UTF-8?q?Revert=20"=E6=96=B0=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E7=99=BB=E5=BD=95=E6=8E=88=E6=9D=83?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This reverts commit e4b405491fa2ba0ede349b8f92b5b86172e2da3a.
---
pom.xml | 8 --
ruoyi-admin/pom.xml | 15 ---
.../web/controller/AuthController.java | 83 -------------
.../dromara/web/service/SysLoginService.java | 65 ----------
ruoyi-common/pom.xml | 1 -
ruoyi-common/ruoyi-common-auth/pom.xml | 22 ----
.../utils/AuthUtils.java | 112 ------------------
.../dromara/common/core/enums/DeviceType.java | 4 +-
.../dromara/system/domain/SysAuthUser.java | 40 -------
.../dromara/system/mapper/SysUserMapper.java | 45 +------
.../mapper/system/SysAuthUserMapper.xml | 60 ----------
script/AuthSQL/sys_auth_user.sql | 14 ---
12 files changed, 3 insertions(+), 466 deletions(-)
delete mode 100644 ruoyi-common/ruoyi-common-auth/pom.xml
delete mode 100644 ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
delete mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
delete mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
delete mode 100644 script/AuthSQL/sys_auth_user.sql
diff --git a/pom.xml b/pom.xml
index a1e7524b6..b20e7f059 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,7 +41,6 @@
1.72
2.7.0
- 1.15.6
1.33
@@ -292,13 +291,6 @@
${snakeyaml.version}
-
-
- me.zhyd.oauth
- JustAuth
- ${justauth.version}
-
-
org.bouncycastle
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index dd4fc58e7..af5f23967 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -75,21 +75,6 @@
spring-boot-starter-test
test
-
- me.zhyd.oauth
- JustAuth
-
-
- org.dromara
- ruoyi-common-auth
- 5.1.0-SNAPSHOT
-
-
- com.aliyun
- credentials-java
- 0.2.4
- compile
-
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index 6d0ef7bce..bba6113da 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -2,21 +2,9 @@ package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.json.JSONObject;
-import cn.hutool.json.JSONUtil;
-import com.alibaba.fastjson.JSON;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
-import me.zhyd.oauth.cache.AuthDefaultStateCache;
-import me.zhyd.oauth.cache.AuthStateCache;
-import me.zhyd.oauth.model.AuthCallback;
-import me.zhyd.oauth.model.AuthResponse;
-import me.zhyd.oauth.model.AuthUser;
-import me.zhyd.oauth.request.AuthRequest;
-import me.zhyd.oauth.utils.AuthStateUtils;
-import org.dromara.common.auth.utils.AuthUtils;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.EmailLoginBody;
import org.dromara.common.core.domain.model.LoginBody;
@@ -28,8 +16,6 @@ import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysTenantVo;
-import org.dromara.system.domain.vo.SysUserVo;
-import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysTenantService;
import org.dromara.web.domain.vo.LoginTenantVo;
@@ -40,11 +26,8 @@ import org.dromara.web.service.SysRegisterService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
-import java.io.IOException;
import java.net.URL;
-import java.util.HashMap;
import java.util.List;
-import java.util.Map;
/**
* 认证
@@ -58,18 +41,10 @@ import java.util.Map;
@RequestMapping("/auth")
public class AuthController {
- private AuthStateCache authStateCache;
private final SysLoginService loginService;
private final SysRegisterService registerService;
private final ISysConfigService configService;
private final ISysTenantService tenantService;
- private final SysUserMapper userMapper;
- private final Map auths = new HashMap<>();
- {
- auths.put("gitee", "{\"clientId\":\"38eaaa1b77b5e064313057a2f5745ce3a9f3e7686d9bd302c7df2f308ef6db81\",\"clientSecret\":\"2e633af8780cb9fe002c4c7291b722db944402e271efb99b062811f52d7da1ff\",\"redirectUri\":\"http://127.0.0.1:8888/social-login?source=gitee\"}");
- auths.put("github", "{\"clientId\":\"Iv1.1be0cdcd71aca63b\",\"clientSecret\":\"0d59d28b43152bc8906011624db37b0fed88d154\",\"redirectUri\":\"http://127.0.0.1:80/social-login?source=github\"}");
- authStateCache = AuthDefaultStateCache.INSTANCE;// 使用默认的缓存
- }
/**
* 登录方法
@@ -140,64 +115,6 @@ public class AuthController {
return R.ok(loginVo);
}
-
-
-
- /**
- * 认证授权
- * @param source
- * @throws IOException
- */
- @GetMapping("/binding/{source}")
- @ResponseBody
- public R authBinding(@PathVariable("source") String source, HttpServletRequest request){
- SysUserVo userLoding = new SysUserVo();
- if (ObjectUtil.isNull(userLoding)) {
- return R.fail("授权失败,请先登录再绑定");
- }
- if (userMapper.checkAuthUser(userLoding.getUserId(),source) > 0)
- {
- return R.fail(source + "平台账号已经绑定");
- }
- String obj = auths.get(source);
- if (StringUtils.isEmpty(obj))
- {
- return R.fail(source + "平台账号暂不支持");
- }
- JSONObject json = JSONUtil.parseObj(obj);
- AuthRequest authRequest = AuthUtils.getAuthRequest(source,
- json.getStr("clientId"),
- json.getStr("clientSecret"),
- json.getStr("redirectUri"), authStateCache);
- String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
- return R.ok(authorizeUrl);
- }
-
- /**
- * @param source
- * @param callback
- * @param request
- * @return
- */
- @SuppressWarnings("unchecked")
- @GetMapping("/social-login/{source}")
- public R socialLogin(@PathVariable("source") String source, AuthCallback callback, HttpServletRequest request) throws IOException {
- String obj = auths.get(source);
- if (StringUtils.isEmpty(obj))
- {
- return R.fail("第三方平台系统不支持或未提供来源");
- }
- JSONObject json = JSONUtil.parseObj(obj);
- AuthRequest authRequest = AuthUtils.getAuthRequest(source,
- json.getStr("clientId"),
- json.getStr("clientSecret"),
- json.getStr("redirectUri"), authStateCache);
- AuthResponse response = authRequest.login(callback);
- return loginService.socialLogin(source, response, request);
- }
-
-
-
/**
* 退出登录
*/
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index b152710cb..689a55de1 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -6,15 +6,11 @@ import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import me.zhyd.oauth.model.AuthResponse;
-import me.zhyd.oauth.model.AuthUser;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.TenantConstants;
-import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.XcxLoginUser;
@@ -32,7 +28,6 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.exception.TenantException;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.config.properties.CaptchaProperties;
-import org.dromara.system.domain.SysAuthUser;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.domain.vo.SysUserVo;
@@ -42,7 +37,6 @@ import org.dromara.system.service.ISysTenantService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
-import java.io.IOException;
import java.time.Duration;
import java.util.Date;
import java.util.List;
@@ -160,65 +154,6 @@ public class SysLoginService {
return StpUtil.getTokenValue();
}
-
- /**
- * 认证授权登录
- * @param source
- * @throws IOException
- */
- /**
- * 社交登录
- * @param source 登录来源
- * @param authUser 授权响应实体
- * @param request Http请求对象
- * @return 统一响应实体
- * @throws IOException
- */
- public R socialLogin(String source, AuthResponse authUser, HttpServletRequest request) throws IOException {
- // 判断授权响应是否成功
- if (!authUser.ok()) {
- return R.fail("对不起,授权信息验证不通过,请联系管理员");
- }
- AuthUser authUserData = authUser.getData();
- // 判断数据库中是否已存在该用户
- SysUserVo user = userMapper.selectAuthUserByUuid(source + authUserData.getUuid());
- if (ObjectUtil.isNotNull(user)) {
- checkTenant(user.getTenantId());
- SysUserVo dbUser = loadUserByUsername(user.getTenantId(), user.getUserName());
- // 登录
- LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.auth);
- recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
- recordLoginInfo(user.getUserId());
- return R.ok(StpUtil.getTokenValue());
- } else {
- if (LoginHelper.getUserId() == null) {
- return R.fail("授权失败,请先登录再绑定");
- }
- // 组装授权用户信息
- SysAuthUser sysAuthUser = new SysAuthUser();
- sysAuthUser.setAvatar(authUserData.getAvatar());
- sysAuthUser.setUuid(source + authUserData.getUuid());
- sysAuthUser.setUserId(LoginHelper.getUserId());
- sysAuthUser.setUserName(authUserData.getUsername());
- sysAuthUser.setNickName(authUserData.getNickname());
- sysAuthUser.setEmail(authUserData.getEmail());
- sysAuthUser.setSource(source);
- sysAuthUser.setCreateTime(new Date().toString());
- // 新用户,绑定第三方账号
- userMapper.insertAuthUser(sysAuthUser);
- SysUserVo lodingData = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
- checkTenant(lodingData.getTenantId());
- LoginHelper.loginByDevice(buildLoginUser(lodingData), DeviceType.auth);
- recordLogininfor(lodingData.getTenantId(), sysAuthUser.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
- recordLoginInfo(sysAuthUser.getUserId());
- return R.ok(StpUtil.getTokenValue());
- }
- }
-
-
-
-
-
/**
* 退出登录
*/
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 4813f7985..0428aea78 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -11,7 +11,6 @@
ruoyi-common-bom
- ruoyi-common-auth
ruoyi-common-core
ruoyi-common-doc
ruoyi-common-excel
diff --git a/ruoyi-common/ruoyi-common-auth/pom.xml b/ruoyi-common/ruoyi-common-auth/pom.xml
deleted file mode 100644
index 9af89e612..000000000
--- a/ruoyi-common/ruoyi-common-auth/pom.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-
-
-
- org.dromara
- ruoyi-common
- ${revision}
- ../pom.xml
-
- 4.0.0
- ruoyi-common-auth
-
- ruoyi-common-auth 认证模块
-
-
-
- me.zhyd.oauth
- JustAuth
-
-
-
diff --git a/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java b/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
deleted file mode 100644
index 981b3be6d..000000000
--- a/ruoyi-common/ruoyi-common-auth/src/main/java/org.dromara.common.auth/utils/AuthUtils.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.dromara.common.auth.utils;
-import me.zhyd.oauth.cache.AuthStateCache;
-import me.zhyd.oauth.config.AuthConfig;
-import me.zhyd.oauth.exception.AuthException;
-import me.zhyd.oauth.request.*;
-
-/**
- * 认证授权工具类
- *
- * @author ruoyi
- */
-public class AuthUtils {
- public static AuthRequest getAuthRequest(String source, String clientId, String clientSecret, String redirectUri,
- AuthStateCache authStateCache)
- {
- AuthRequest authRequest = null;
- switch (source.toLowerCase()) {
- case "dingtalk" ->
- authRequest = new AuthDingTalkRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "baidu" ->
- authRequest = new AuthBaiduRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "github" ->
- authRequest = new AuthGithubRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "gitee" ->
- authRequest = new AuthGiteeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "weibo" ->
- authRequest = new AuthWeiboRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "coding" ->
- authRequest = new AuthCodingRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).codingGroupName("").build(), authStateCache);
- case "oschina" ->
- authRequest = new AuthOschinaRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "alipay" ->
- // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip
- authRequest = new AuthAlipayRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .alipayPublicKey("").redirectUri(redirectUri).build(), authStateCache);
- case "qq" ->
- authRequest = new AuthQqRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "wechat_open" -> authRequest = new AuthWeChatOpenRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
- case "csdn" ->
- authRequest = new AuthCsdnRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "taobao" ->
- authRequest = new AuthTaobaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "douyin" ->
- authRequest = new AuthDouyinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "linkedin" ->
- authRequest = new AuthLinkedinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "microsoft" -> authRequest = new AuthMicrosoftRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
- case "mi" ->
- authRequest = new AuthMiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "toutiao" ->
- authRequest = new AuthToutiaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "teambition" -> authRequest = new AuthTeambitionRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
- case "pinterest" -> authRequest = new AuthPinterestRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).build(), authStateCache);
- case "renren" ->
- authRequest = new AuthRenrenRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "stack_overflow" -> authRequest = new AuthStackOverflowRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).stackOverflowKey("").build(),
- authStateCache);
- case "huawei" ->
- authRequest = new AuthHuaweiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "wechat_enterprise" ->
- authRequest = new AuthWeChatEnterpriseRequest(AuthConfig.builder().clientId(clientId)
- .clientSecret(clientSecret).redirectUri(redirectUri).agentId("").build(), authStateCache);
- case "kujiale" ->
- authRequest = new AuthKujialeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "gitlab" ->
- authRequest = new AuthGitlabRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "meituan" ->
- authRequest = new AuthMeituanRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "eleme" ->
- authRequest = new AuthElemeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build());
- case "wechat_mp" ->
- authRequest = new AuthWeChatMpRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- case "aliyun" ->
- authRequest = new AuthAliyunRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
- .redirectUri(redirectUri).build(), authStateCache);
- default -> {
- }
- }
- if (null == authRequest)
- {
- throw new AuthException("未获取到有效的Auth配置");
- }
- return authRequest;
- }
-}
-
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
index 7127bbb83..09bf44b6d 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
@@ -26,9 +26,7 @@ public enum DeviceType {
/**
* 小程序端
*/
- XCX("xcx"),
-
- auth("auth");
+ XCX("xcx");
private final String device;
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
deleted file mode 100644
index 5008786e3..000000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysAuthUser.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.dromara.system.domain;
-
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.Data;
-import lombok.NoArgsConstructor;
-
-@Data
-@NoArgsConstructor
-@TableName("sys_auth_user")
-public class SysAuthUser {
-
- private static final long serialVersionUID = 1L;
-
- /** 授权ID */
- private Long authId;
-
- /** 第三方平台用户唯一ID */
- private String uuid;
-
- /** 系统用户ID */
- private Long userId;
-
- /** 登录账号 */
- private String userName;
-
- /** 用户昵称 */
- private String nickName;
-
- /** 头像地址 */
- private String avatar;
-
- /** 用户邮箱 */
- private String email;
-
- /** 用户来源 */
- private String source;
-
- private String createTime;
-
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
index 94c9c1e75..81bd1ff3d 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
@@ -7,7 +7,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.dromara.common.mybatis.annotation.DataColumn;
import org.dromara.common.mybatis.annotation.DataPermission;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
-import org.dromara.system.domain.SysAuthUser;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.vo.SysUserVo;
import org.apache.ibatis.annotations.Param;
@@ -124,8 +123,8 @@ public interface SysUserMapper extends BaseMapperPlus {
* @return 用户对象信息
*/
@DataPermission({
- @DataColumn(key = "deptName", value = "d.dept_id"),// 部门权限
- @DataColumn(key = "userName", value = "u.user_id")// 用户权限
+ @DataColumn(key = "deptName", value = "d.dept_id"),
+ @DataColumn(key = "userName", value = "u.user_id")
})
SysUserVo selectUserById(Long userId);
@@ -143,44 +142,4 @@ public interface SysUserMapper extends BaseMapperPlus {
})
int updateById(@Param(Constants.ENTITY) SysUser user);
- /**
- * 根据用户编号查询授权列表
- *
- * @param userId 用户编号
- * @return 授权列表
- */
- public List selectAuthUserListByUserId(Long userId);
-
- /**
- * 根据uuid查询用户信息
- *
- * @param uuid 唯一信息
- * @return 结果
- */
- public SysUserVo selectAuthUserByUuid(String uuid);
-
- /**
- * 校验source平台是否绑定
- *
- * @param userId 用户编号
- * @param source 绑定平台
- * @return 结果
- */
- public int checkAuthUser(@Param("userId") Long userId, @Param("source") String source);
-
- /**
- * 新增第三方授权信息
- *
- * @param authUser 用户信息
- * @return 结果
- */
- public int insertAuthUser(SysAuthUser authUser);
-
- /**
- * 根据编号删除第三方授权信息
- *
- * @param authId 授权编号
- * @return 结果
- */
- public int deleteAuthUser(Long authId);
}
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
deleted file mode 100644
index 864b3ba32..000000000
--- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysAuthUserMapper.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- insert into sys_auth_user(
- uuid,
- user_id,
- user_name,
- nick_name,
- avatar,
- email,
- source,
- create_time
- )values(
- #{uuid},
- #{userId},
- #{userName},
- #{nickName},
- #{avatar},
- #{email},
- #{source},
- now()
- )
-
-
-
- delete from sys_auth_user where auth_id = #{authId}
-
-
-
diff --git a/script/AuthSQL/sys_auth_user.sql b/script/AuthSQL/sys_auth_user.sql
deleted file mode 100644
index 4a416753b..000000000
--- a/script/AuthSQL/sys_auth_user.sql
+++ /dev/null
@@ -1,14 +0,0 @@
-CREATE TABLE `sys_auth_user` (
- `auth_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '授权ID',
- `uuid` varchar(500) NOT NULL COMMENT '第三方平台用户唯一ID',
- `user_id` bigint(20) unsigned NOT NULL COMMENT '系统用户ID',
- `user_name` varchar(30) NOT NULL COMMENT '登录账号',
- `nick_name` varchar(30) DEFAULT '' COMMENT '用户昵称',
- `avatar` varchar(500) DEFAULT '' COMMENT '头像地址',
- `email` varchar(255) DEFAULT '' COMMENT '用户邮箱',
- `source` varchar(255) DEFAULT '' COMMENT '用户来源',
- ` tenant_id` varchar(20) DEFAULT '000000' COMMENT '租户id',
- `create_time` datetime DEFAULT NULL COMMENT '创建时间',
- `tenant_id` varchar(25) NOT NULL DEFAULT '000000',
- PRIMARY KEY (`auth_id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8mb4 COMMENT='第三方平台授权用户信息表';
From 76dc2398757a4038f1930fb475a55983a9a8077a Mon Sep 17 00:00:00 2001
From: thiszhc <2029364173@qq.com>
Date: Thu, 15 Jun 2023 00:58:01 +0800
Subject: [PATCH 3/6] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E7=AC=AC?=
=?UTF-8?q?=E4=B8=89=E6=96=B9=E6=8E=88=E6=9D=83=E7=99=BB=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 8 +
ruoyi-admin/pom.xml | 10 +
.../dromara/web/service/SysLoginService.java | 90 +-
ruoyi-common/pom.xml | 1 +
ruoyi-common/ruoyi-common-social/pom.xml | 38 +
.../common/social/config/SocialConfig.java | 24 +
.../config/properties/SocialProperties.java | 39 +
.../common/social/utils/SocialUtils.java | 119 ++
.../system/SocialUserController.java | 105 ++
.../org/dromara/system/domain/SocialUser.java | 136 ++
.../system/domain/bo/SocialUserBo.java | 141 ++
.../system/domain/vo/SocialUserVo.java | 162 ++
.../system/mapper/SocialUserMapper.java | 23 +
.../system/service/ISocialUserService.java | 71 +
.../service/impl/SocialUserServiceImpl.java | 162 ++
.../mapper/system/SocialUserMapper.xml | 68 +
script/sql/ry_vue_5.X.sql | 1622 +++++++++++------
17 files changed, 2223 insertions(+), 596 deletions(-)
create mode 100644 ruoyi-common/ruoyi-common-social/pom.xml
create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SocialUser.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SocialUserBo.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SocialUserVo.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SocialUserMapper.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
create mode 100644 ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
diff --git a/pom.xml b/pom.xml
index b20e7f059..e69ab1532 100644
--- a/pom.xml
+++ b/pom.xml
@@ -39,6 +39,7 @@
0.2.0
1.18.26
1.72
+ 1.16.5
2.7.0
@@ -111,6 +112,13 @@
import
+
+
+ me.zhyd.oauth
+ JustAuth
+ ${justauth.version}
+
+
org.dromara
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index af5f23967..e57c444a7 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -75,6 +75,16 @@
spring-boot-starter-test
test
+
+ me.zhyd.oauth
+ JustAuth
+
+
+ org.dromara
+ ruoyi-common-social
+ 5.1.0-SNAPSHOT
+ compile
+
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index 689a55de1..3628b05d7 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -6,11 +6,15 @@ import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthUser;
import org.dromara.common.core.constant.Constants;
import org.dromara.common.core.constant.GlobalConstants;
import org.dromara.common.core.constant.TenantConstants;
+import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.dto.RoleDTO;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.domain.model.XcxLoginUser;
@@ -29,14 +33,21 @@ import org.dromara.common.tenant.exception.TenantException;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.bo.SocialUserBo;
+import org.dromara.system.domain.bo.SysUserBo;
+import org.dromara.system.domain.vo.SocialUserVo;
import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.mapper.SocialUserMapper;
import org.dromara.system.mapper.SysUserMapper;
+import org.dromara.system.service.ISocialUserService;
import org.dromara.system.service.ISysPermissionService;
import org.dromara.system.service.ISysTenantService;
+import org.dromara.system.service.ISysUserService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
+import java.io.IOException;
import java.time.Duration;
import java.util.Date;
import java.util.List;
@@ -53,6 +64,8 @@ import java.util.function.Supplier;
public class SysLoginService {
private final SysUserMapper userMapper;
+ private final ISocialUserService socialUserService;
+ private final ISysUserService userService;
private final CaptchaProperties captchaProperties;
private final ISysPermissionService permissionService;
private final ISysTenantService tenantService;
@@ -154,6 +167,44 @@ public class SysLoginService {
return StpUtil.getTokenValue();
}
+ /**
+ * 社交登录
+ *
+ * @param source 登录来源
+ * @param authUser 授权响应实体
+ * @param request Http请求对象
+ * @return 统一响应实体
+ */
+ public R socialLogin(String source, AuthResponse authUser, HttpServletRequest request) throws IOException {
+ // 判断授权响应是否成功
+ if (!authUser.ok()) {
+ return R.fail("对不起,授权信息验证不通过,请退出重试!");
+ }
+ AuthUser authUserData = authUser.getData();
+ // 查询社交用户信息,判断是否已经绑定,如果已经绑定则直接登录,否则验证是否登录,未登录则先登录再绑定
+ SocialUserVo user = socialUserService.selectSocialUserByAuthId(source + authUserData.getUuid());
+ if (ObjectUtil.isNotNull(user)) {
+ checkTenant(user.getTenantId());
+ SysUserVo dbUser = loadUserByUsername(user.getTenantId(), user.getUserName());
+ LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.SOCIAL);
+ recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ recordLoginInfo(user.getUserId());
+ } else {
+ // 判断是否已登录
+ if (LoginHelper.getUserId() == null) {
+ return R.fail("授权失败,请先登录再绑定");
+ }
+ SocialUserBo socialUserBo = new SocialUserBo();
+ socialUserService.insertByBo(setAuthUserData(authUserData, socialUserBo));
+ SysUserVo lodingData = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
+ checkTenant(lodingData.getTenantId());
+ LoginHelper.loginByDevice(buildLoginUser(lodingData), DeviceType.SOCIAL);
+ recordLogininfor(lodingData.getTenantId(), socialUserBo.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ recordLoginInfo(socialUserBo.getUserId());
+ }
+ return R.ok(StpUtil.getTokenValue());
+ }
+
/**
* 退出登录
*/
@@ -235,9 +286,9 @@ public class SysLoginService {
private SysUserVo loadUserByUsername(String tenantId, String username) {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper()
- .select(SysUser::getUserName, SysUser::getStatus)
- .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
- .eq(SysUser::getUserName, username));
+ .select(SysUser::getUserName, SysUser::getStatus)
+ .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
+ .eq(SysUser::getUserName, username));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", username);
throw new UserException("user.not.exists", username);
@@ -253,9 +304,9 @@ public class SysLoginService {
private SysUserVo loadUserByPhonenumber(String tenantId, String phonenumber) {
SysUser user = userMapper.selectOne(new LambdaQueryWrapper()
- .select(SysUser::getPhonenumber, SysUser::getStatus)
- .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
- .eq(SysUser::getPhonenumber, phonenumber));
+ .select(SysUser::getPhonenumber, SysUser::getStatus)
+ .eq(TenantHelper.isEnable(), SysUser::getTenantId, tenantId)
+ .eq(SysUser::getPhonenumber, phonenumber));
if (ObjectUtil.isNull(user)) {
log.info("登录用户:{} 不存在.", phonenumber);
throw new UserException("user.not.exists", phonenumber);
@@ -383,10 +434,35 @@ public class SysLoginService {
log.info("登录租户:{} 已被停用.", tenantId);
throw new TenantException("tenant.blocked");
} else if (ObjectUtil.isNotNull(tenant.getExpireTime())
- && new Date().after(tenant.getExpireTime())) {
+ && new Date().after(tenant.getExpireTime())) {
log.info("登录租户:{} 已超过有效期.", tenantId);
throw new TenantException("tenant.expired");
}
}
+
+ public SocialUserBo setAuthUserData(AuthUser authUserData, SocialUserBo socialUser) {
+ socialUser.setUserId(LoginHelper.getUserId());
+ socialUser.setAuthId(authUserData.getSource() + authUserData.getUuid());
+ socialUser.setSource(authUserData.getSource());
+ socialUser.setUserName(authUserData.getUsername());
+ socialUser.setNickName(authUserData.getNickname());
+ socialUser.setAvatar(authUserData.getAvatar());
+ socialUser.setEmail(authUserData.getEmail());
+ socialUser.setOpenId(authUserData.getUuid());
+ socialUser.setAccessToken(authUserData.getToken().getAccessToken());
+ socialUser.setExpireIn(authUserData.getToken().getExpireIn());
+ socialUser.setRefreshToken(authUserData.getToken().getRefreshToken());
+ socialUser.setAccessCode(authUserData.getToken().getAccessCode());
+ socialUser.setUnionId(authUserData.getToken().getUnionId());
+ socialUser.setScope(authUserData.getToken().getScope());
+ socialUser.setTokenType(authUserData.getToken().getTokenType());
+ socialUser.setIdToken(authUserData.getToken().getIdToken());
+ socialUser.setMacAlgorithm(authUserData.getToken().getMacAlgorithm());
+ socialUser.setMacKey(authUserData.getToken().getMacKey());
+ socialUser.setCode(authUserData.getToken().getCode());
+ socialUser.setOauthToken(authUserData.getToken().getOauthToken());
+ socialUser.setOauthTokenSecret(authUserData.getToken().getOauthTokenSecret());
+ return socialUser;
+ }
}
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 0428aea78..45493d3e9 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -11,6 +11,7 @@
ruoyi-common-bom
+ ruoyi-common-social
ruoyi-common-core
ruoyi-common-doc
ruoyi-common-excel
diff --git a/ruoyi-common/ruoyi-common-social/pom.xml b/ruoyi-common/ruoyi-common-social/pom.xml
new file mode 100644
index 000000000..b87479b4b
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/pom.xml
@@ -0,0 +1,38 @@
+
+
+
+ org.dromara
+ ruoyi-common
+ ${revision}
+ ../pom.xml
+
+ 4.0.0
+ ruoyi-common-social
+
+ ruoyi-common-auth 认证模块
+
+
+
+ me.zhyd.oauth
+ JustAuth
+
+
+ org.projectlombok
+ lombok
+
+
+ org.springframework.boot
+ spring-boot
+
+
+ org.springframework.boot
+ spring-boot-autoconfigure
+
+
+ org.dromara
+ ruoyi-common-redis
+
+
+
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
new file mode 100644
index 000000000..c50c56038
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
@@ -0,0 +1,24 @@
+package org.dromara.common.social.config;
+
+import me.zhyd.oauth.cache.AuthStateCache;
+import org.dromara.common.social.config.properties.SocialProperties;
+import org.dromara.common.social.utils.AuthRedisStateCache;
+import org.springframework.boot.autoconfigure.AutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+
+/**
+ * Social 配置属性
+ * @author thiszhc
+ */
+@AutoConfiguration
+@EnableConfigurationProperties(SocialProperties.class)
+public class SocialConfig {
+
+ @Bean
+ public AuthStateCache redis() {
+ return new AuthRedisStateCache();
+ }
+
+}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
new file mode 100644
index 000000000..4240ebabd
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
@@ -0,0 +1,39 @@
+package org.dromara.common.social.config.properties;
+
+import lombok.Data;
+import org.springframework.boot.autoconfigure.cache.CacheProperties;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * Social 配置属性
+ * @author thiszhc
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "justauth")
+public class SocialProperties {
+
+ /**
+ * 是否启用
+ */
+ private boolean enabled;
+
+ /**
+ * 授权类型
+ */
+ private Map type;
+
+ /**
+ * 授权过期时间
+ */
+ private long timeout;
+
+ /**
+ * 授权缓存配置
+ */
+ private CacheProperties cache = new CacheProperties();
+
+}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
new file mode 100644
index 000000000..b3a1cd1f4
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
@@ -0,0 +1,119 @@
+package org.dromara.common.social.utils;
+
+import me.zhyd.oauth.cache.AuthStateCache;
+import me.zhyd.oauth.config.AuthConfig;
+import me.zhyd.oauth.exception.AuthException;
+import me.zhyd.oauth.request.*;
+
+/**
+ * 认证授权工具类
+ *
+ * @author thiszhc
+ */
+public class SocialUtils {
+
+ public static AuthRequest getAuthRequest(String source,
+ String clientId,
+ String clientSecret,
+ String redirectUri) throws AuthException {
+ AuthRequest authRequest = null;
+ switch (source.toLowerCase()) {
+ case "dingtalk" ->
+ authRequest = new AuthDingTalkRequest(AuthConfig.builder().
+ clientId(clientId).
+ clientSecret(clientSecret)
+ .redirectUri(redirectUri).
+ build());
+ case "baidu" ->
+ authRequest = new AuthBaiduRequest(AuthConfig.builder().
+ clientId(clientId).
+ clientSecret(clientSecret)
+ .redirectUri(redirectUri).
+ build());
+ case "github" ->
+ authRequest = new AuthGithubRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "gitee" ->
+ authRequest = new AuthGiteeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "weibo" ->
+ authRequest = new AuthWeiboRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "coding" ->
+ authRequest = new AuthCodingRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "oschina" ->
+ authRequest = new AuthOschinaRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "alipay" ->
+ // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip
+ authRequest = new AuthAlipayRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .alipayPublicKey("").redirectUri(redirectUri).build());
+ case "qq" ->
+ authRequest = new AuthQqRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "wechat_open" -> authRequest = new AuthWeChatOpenRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build());
+ case "csdn" ->
+ authRequest = new AuthCsdnRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "taobao" ->
+ authRequest = new AuthTaobaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "douyin" ->
+ authRequest = new AuthDouyinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "linkedin" ->
+ authRequest = new AuthLinkedinRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "microsoft" -> authRequest = new AuthMicrosoftRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build());
+ case "mi" ->
+ authRequest = new AuthMiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "toutiao" ->
+ authRequest = new AuthToutiaoRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "teambition" -> authRequest = new AuthTeambitionRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build());
+ case "pinterest" -> authRequest = new AuthPinterestRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).build());
+ case "renren" ->
+ authRequest = new AuthRenrenRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "stack_overflow" -> authRequest = new AuthStackOverflowRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).stackOverflowKey("").build());
+ case "huawei" ->
+ authRequest = new AuthHuaweiRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "wechat_enterprise" ->
+ authRequest = new AuthWeChatEnterpriseQrcodeRequest(AuthConfig.builder().clientId(clientId)
+ .clientSecret(clientSecret).redirectUri(redirectUri).agentId("").build());
+ case "kujiale" ->
+ authRequest = new AuthKujialeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "gitlab" ->
+ authRequest = new AuthGitlabRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "meituan" ->
+ authRequest = new AuthMeituanRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "eleme" ->
+ authRequest = new AuthElemeRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "wechat_mp" ->
+ authRequest = new AuthWeChatMpRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ case "aliyun" ->
+ authRequest = new AuthAliyunRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
+ .redirectUri(redirectUri).build());
+ default -> {
+ }
+ }
+ if (null == authRequest) {
+ throw new AuthException("未获取到有效的Auth配置");
+ }
+ return authRequest;
+ }
+}
+
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
new file mode 100644
index 000000000..91994062f
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
@@ -0,0 +1,105 @@
+package org.dromara.system.controller.system;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.SocialUserVo;
+import org.dromara.system.domain.bo.SocialUserBo;
+import org.dromara.system.service.ISocialUserService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 社会化关系
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/socialUser")
+public class SocialUserController extends BaseController {
+
+ private final ISocialUserService socialUserService;
+
+ /**
+ * 查询社会化关系列表
+ */
+ @SaCheckPermission("system:user:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SocialUserBo bo, PageQuery pageQuery) {
+ return socialUserService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出社会化关系列表
+ */
+ @SaCheckPermission("system:user:export")
+ @Log(title = "社会化关系", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(SocialUserBo bo, HttpServletResponse response) {
+ List list = socialUserService.queryList(bo);
+ ExcelUtil.exportExcel(list, "社会化关系", SocialUserVo.class, response);
+ }
+
+ /**
+ * 获取社会化关系详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("system:user:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(socialUserService.queryById(id));
+ }
+
+ /**
+ * 新增社会化关系
+ */
+ @SaCheckPermission("system:user:add")
+ @Log(title = "社会化关系", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody SocialUserBo bo) {
+ return toAjax(socialUserService.insertByBo(bo));
+ }
+
+ /**
+ * 修改社会化关系
+ */
+ @SaCheckPermission("system:user:edit")
+ @Log(title = "社会化关系", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody SocialUserBo bo) {
+ return toAjax(socialUserService.updateByBo(bo));
+ }
+
+ /**
+ * 删除社会化关系
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("system:user:remove")
+ @Log(title = "社会化关系", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(socialUserService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SocialUser.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SocialUser.java
new file mode 100644
index 000000000..5258b36cc
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SocialUser.java
@@ -0,0 +1,136 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 社会化关系对象 social_user
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("social_user")
+public class SocialUser extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id")
+ private Long id;
+
+ /**
+ * 的唯一ID
+ */
+ private String authId;
+
+ /**
+ * 用户来源
+ */
+ private String source;
+
+ /**
+ * 用户的授权令牌
+ */
+ private String accessToken;
+
+ /**
+ * 用户的授权令牌的有效期,部分平台可能没有
+ */
+ private int expireIn;
+
+ /**
+ * 刷新令牌,部分平台可能没有
+ */
+ private String refreshToken;
+
+ /**
+ * 用户的 open id
+ */
+ private String openId;
+
+ /**
+ * 用户的 ID
+ */
+ private Long userId;
+
+ /**
+ * 授权的第三方账号
+ */
+ private String userName;
+
+ /**
+ * 授权的第三方昵称
+ */
+ private String nickName;
+
+ /**
+ * 授权的第三方邮箱
+ */
+ private String email;
+
+ /**
+ * 授权的第三方头像地址
+ */
+ private String avatar;
+
+ /**
+ * 平台的授权信息,部分平台可能没有
+ */
+ private String accessCode;
+
+ /**
+ * 用户的 unionid
+ */
+ private String unionId;
+
+ /**
+ * 授予的权限,部分平台可能没有
+ */
+ private String scope;
+
+ /**
+ * 个别平台的授权信息,部分平台可能没有
+ */
+ private String tokenType;
+
+ /**
+ * id token,部分平台可能没有
+ */
+ private String idToken;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ private String macAlgorithm;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ private String macKey;
+
+ /**
+ * 用户的授权code,部分平台可能没有
+ */
+ private String code;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ private String oauthToken;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ private String oauthTokenSecret;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SocialUserBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SocialUserBo.java
new file mode 100644
index 000000000..8d9ae6099
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SocialUserBo.java
@@ -0,0 +1,141 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import org.dromara.system.domain.SocialUser;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 社会化关系业务对象 social_user
+ *
+ * @author Lion Li
+ * @date 2023-06-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SocialUser.class, reverseConvertGenerate = false)
+public class SocialUserBo extends TenantEntity {
+
+ /**
+ * 主键
+ */
+ @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+ private Long id;
+
+ /**
+ * 的唯一ID
+ */
+ @NotBlank(message = "的唯一ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String authId;
+
+ /**
+ * 用户来源
+ */
+ @NotBlank(message = "用户来源不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String source;
+
+ /**
+ * 用户的授权令牌
+ */
+ @NotBlank(message = "用户的授权令牌不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String accessToken;
+
+ /**
+ * 用户的授权令牌的有效期,部分平台可能没有
+ */
+ private int expireIn;
+
+ /**
+ * 刷新令牌,部分平台可能没有
+ */
+ private String refreshToken;
+
+ /**
+ * 用户的 open id
+ */
+ @NotBlank(message = "用户的 open id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String openId;
+
+ /**
+ * 用户的 ID
+ */
+ @NotBlank(message = "用户的 ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long userId;
+
+ /**
+ * 平台的授权信息,部分平台可能没有
+ */
+ private String accessCode;
+
+ /**
+ * 用户的 unionid
+ */
+ private String unionId;
+
+ /**
+ * 授予的权限,部分平台可能没有
+ */
+ private String scope;
+
+ /**
+ * 授权的第三方账号
+ */
+ private String userName;
+
+ /**
+ * 授权的第三方昵称
+ */
+ private String nickName;
+
+ /**
+ * 授权的第三方邮箱
+ */
+ private String email;
+
+ /**
+ * 授权的第三方头像地址
+ */
+ private String avatar;
+
+ /**
+ * 个别平台的授权信息,部分平台可能没有
+ */
+ private String tokenType;
+
+ /**
+ * id token,部分平台可能没有
+ */
+ private String idToken;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ private String macAlgorithm;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ private String macKey;
+
+ /**
+ * 用户的授权code,部分平台可能没有
+ */
+ private String code;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ private String oauthToken;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ private String oauthTokenSecret;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SocialUserVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SocialUserVo.java
new file mode 100644
index 000000000..77643ac96
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SocialUserVo.java
@@ -0,0 +1,162 @@
+package org.dromara.system.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import org.dromara.common.tenant.core.TenantEntity;
+import org.dromara.system.domain.SocialUser;
+
+import java.io.Serial;
+
+
+
+/**
+ * 社会化关系视图对象 social_user
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SocialUser.class)
+public class SocialUserVo extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long id;
+
+ /**
+ * 的唯一ID
+ */
+ @ExcelProperty(value = "授权UUID")
+ private String authId;
+
+ /**
+ * 用户来源
+ */
+ @ExcelProperty(value = "用户来源")
+ private String source;
+
+ /**
+ * 用户的授权令牌
+ */
+ @ExcelProperty(value = "用户的授权令牌")
+ private String accessToken;
+
+ /**
+ * 用户的授权令牌的有效期,部分平台可能没有
+ */
+ @ExcelProperty(value = "用户的授权令牌的有效期,部分平台可能没有")
+ private int expireIn;
+
+ /**
+ * 刷新令牌,部分平台可能没有
+ */
+ @ExcelProperty(value = "刷新令牌,部分平台可能没有")
+ private String refreshToken;
+
+ /**
+ * 用户的 open id
+ */
+ @ExcelProperty(value = "用户的 open id")
+ private String openId;
+
+ /**
+ * 用户的 ID
+ */
+ @ExcelProperty(value = "用户的 ID")
+ private Long userId;
+
+ /**
+ * 授权的第三方账号
+ */
+ @ExcelProperty(value = "授权的第三方账号")
+ private String userName;
+
+ /**
+ * 授权的第三方昵称
+ */
+ @ExcelProperty(value = "授权的第三方昵称")
+ private String nickName;
+
+ /**
+ * 授权的第三方邮箱
+ */
+ @ExcelProperty(value = "授权的第三方邮箱")
+ private String email;
+
+ /**
+ * 授权的第三方头像地址
+ */
+ @ExcelProperty(value = "授权的第三方头像地址")
+ private String avatar;
+
+
+ /**
+ * 平台的授权信息,部分平台可能没有
+ */
+ @ExcelProperty(value = "平台的授权信息,部分平台可能没有")
+ private String accessCode;
+
+ /**
+ * 用户的 unionid
+ */
+ @ExcelProperty(value = "用户的 unionid")
+ private String unionId;
+
+ /**
+ * 授予的权限,部分平台可能没有
+ */
+ @ExcelProperty(value = "授予的权限,部分平台可能没有")
+ private String scope;
+
+ /**
+ * 个别平台的授权信息,部分平台可能没有
+ */
+ @ExcelProperty(value = "个别平台的授权信息,部分平台可能没有")
+ private String tokenType;
+
+ /**
+ * id token,部分平台可能没有
+ */
+ @ExcelProperty(value = "id token,部分平台可能没有")
+ private String idToken;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ @ExcelProperty(value = "小米平台用户的附带属性,部分平台可能没有")
+ private String macAlgorithm;
+
+ /**
+ * 小米平台用户的附带属性,部分平台可能没有
+ */
+ @ExcelProperty(value = "小米平台用户的附带属性,部分平台可能没有")
+ private String macKey;
+
+ /**
+ * 用户的授权code,部分平台可能没有
+ */
+ @ExcelProperty(value = "用户的授权code,部分平台可能没有")
+ private String code;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ @ExcelProperty(value = "Twitter平台用户的附带属性,部分平台可能没有")
+ private String oauthToken;
+
+ /**
+ * Twitter平台用户的附带属性,部分平台可能没有
+ */
+ @ExcelProperty(value = "Twitter平台用户的附带属性,部分平台可能没有")
+ private String oauthTokenSecret;
+
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SocialUserMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SocialUserMapper.java
new file mode 100644
index 000000000..f110d5d2a
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SocialUserMapper.java
@@ -0,0 +1,23 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.SocialUser;
+import org.dromara.system.domain.bo.SysUserBo;
+import org.dromara.system.domain.vo.SocialUserVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 社会化关系Mapper接口
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+public interface SocialUserMapper extends BaseMapperPlus {
+
+ /**
+ * 根据authId查询SocialUser表和SysUser表,返回SocialUserAuthResult映射的对象
+ * @param authId 认证ID
+ * @return SocialUser
+ */
+ SocialUserVo selectSocialUserByAuthId(String authId);
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
new file mode 100644
index 000000000..f16cf1646
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
@@ -0,0 +1,71 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.SocialUser;
+import org.dromara.system.domain.bo.SysUserBo;
+import org.dromara.system.domain.vo.SocialUserVo;
+import org.dromara.system.domain.bo.SocialUserBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.system.domain.vo.SysUserVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 社会化关系Service接口
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+public interface ISocialUserService {
+
+ /**
+ * 查询授权关系
+ */
+ SocialUserVo queryById(Long id);
+
+ /**
+ * 查询授权列表
+ */
+ TableDataInfo queryPageList(SocialUserBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询授权列表
+ */
+ List queryList(SocialUserBo bo);
+
+ /**
+ * 新增授权关系
+ */
+ Boolean insertByBo(SocialUserBo bo);
+
+ /**
+ * 修改授权关系
+ */
+ Boolean updateByBo(SocialUserBo bo);
+
+ /**
+ * 校验并批量删除社会化关系信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+
+ /**
+ * 删除社会化关系信息
+ */
+ Boolean deleteWithValidById(Long id);
+
+
+ /**
+ * 根据用户ID查询授权关系
+ */
+ Boolean isExistByUserIdAndSource(Long userId, String source);
+
+
+ /**
+ * 根据authId查询SocialUser表和SysUser表,返回SocialUserAuthResult映射的对象
+ * @param authId 认证ID
+ * @return SocialUser
+ */
+ SocialUserVo selectSocialUserByAuthId(String authId);
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
new file mode 100644
index 000000000..c130fb7e6
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
@@ -0,0 +1,162 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.system.domain.bo.SysUserBo;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.SocialUserBo;
+import org.dromara.system.domain.vo.SocialUserVo;
+import org.dromara.system.domain.SocialUser;
+import org.dromara.system.mapper.SocialUserMapper;
+import org.dromara.system.service.ISocialUserService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 社会化关系Service业务层处理
+ *
+ * @author thiszhc
+ * @date 2023-06-12
+ */
+@RequiredArgsConstructor
+@Service
+public class SocialUserServiceImpl implements ISocialUserService {
+
+ private final SocialUserMapper baseMapper;
+
+ /**
+ * 查询社会化关系
+ */
+ @Override
+ public SocialUserVo queryById(Long id) {
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询社会化关系列表
+ */
+ @Override
+ public TableDataInfo queryPageList(SocialUserBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询社会化关系列表
+ */
+ @Override
+ public List queryList(SocialUserBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(SocialUserBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getAuthId()), SocialUser::getAuthId, bo.getAuthId());
+ lqw.eq(StringUtils.isNotBlank(bo.getSource()), SocialUser::getSource, bo.getSource());
+ lqw.eq(StringUtils.isNotBlank(bo.getAccessToken()), SocialUser::getAccessToken, bo.getAccessToken());
+ lqw.eq(bo.getExpireIn() != 0, SocialUser::getExpireIn, bo.getExpireIn());
+ lqw.eq(StringUtils.isNotBlank(bo.getRefreshToken()), SocialUser::getRefreshToken, bo.getRefreshToken());
+ lqw.eq(StringUtils.isNotBlank(bo.getOpenId()), SocialUser::getOpenId, bo.getOpenId());
+ lqw.eq(StringUtils.isNotBlank(bo.getScope()), SocialUser::getScope, bo.getScope());
+ lqw.eq(StringUtils.isNotBlank(bo.getAccessCode()), SocialUser::getAccessCode, bo.getAccessCode());
+ lqw.eq(StringUtils.isNotBlank(bo.getUnionId()), SocialUser::getUnionId, bo.getUnionId());
+ lqw.eq(StringUtils.isNotBlank(bo.getScope()), SocialUser::getScope, bo.getScope());
+ lqw.eq(StringUtils.isNotBlank(bo.getTokenType()), SocialUser::getTokenType, bo.getTokenType());
+ lqw.eq(StringUtils.isNotBlank(bo.getIdToken()), SocialUser::getIdToken, bo.getIdToken());
+ lqw.eq(StringUtils.isNotBlank(bo.getMacAlgorithm()), SocialUser::getMacAlgorithm, bo.getMacAlgorithm());
+ lqw.eq(StringUtils.isNotBlank(bo.getMacKey()), SocialUser::getMacKey, bo.getMacKey());
+ lqw.eq(StringUtils.isNotBlank(bo.getCode()), SocialUser::getCode, bo.getCode());
+ lqw.eq(StringUtils.isNotBlank(bo.getOauthToken()), SocialUser::getOauthToken, bo.getOauthToken());
+ lqw.eq(StringUtils.isNotBlank(bo.getOauthTokenSecret()), SocialUser::getOauthTokenSecret, bo.getOauthTokenSecret());
+ return lqw;
+ }
+
+ /**
+ * 新增社会化关系
+ */
+ @Override
+ public Boolean insertByBo(SocialUserBo bo) {
+ SocialUser add = MapstructUtils.convert(bo, SocialUser.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改社会化关系
+ */
+ @Override
+ public Boolean updateByBo(SocialUserBo bo) {
+ SocialUser update = MapstructUtils.convert(bo, SocialUser.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(SocialUser entity) {
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除社会化关系
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if (isValid) {
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+
+ /**
+ * 删除社会化关系
+ */
+ @Override
+ public Boolean deleteWithValidById(Long id) {
+ return baseMapper.deleteById(id) > 0;
+ }
+
+ /**
+ * 根据用户id和来源查询用户是否存在
+ *
+ * @param userId 用户id
+ * @param source 来源
+ * @return 是否存在
+ */
+ @Override
+ public Boolean isExistByUserIdAndSource(Long userId, String source) {
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(SocialUser::getUserId, userId);
+ lqw.eq(SocialUser::getSource, source);
+ return baseMapper.selectCount(lqw) > 0;
+ }
+
+ /**
+ * 根据authId查询用户信息
+ *
+ * @param authId 用户id
+ * @return 用户信息
+ */
+ @Override
+ public SocialUserVo selectSocialUserByAuthId(String authId) {
+ return baseMapper.selectSocialUserByAuthId(authId);
+ }
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
new file mode 100644
index 000000000..fb636b162
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+ select id,
+ user_id,
+ tenant_id,
+ auth_id,
+ source,
+ open_id,
+ access_token,
+ expire_in,
+ refresh_token,
+ access_code,
+ union_id,
+ scope,
+ token_type,
+ id_token,
+ mac_algorithm,
+ mac_key,
+ code,
+ oauth_token,
+ oauth_token_secret,
+ create_dept,
+ create_by,
+ create_time,
+ update_by,
+ update_time
+ from social_user
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql
index 713d962d4..8c10bb2c2 100644
--- a/script/sql/ry_vue_5.X.sql
+++ b/script/sql/ry_vue_5.X.sql
@@ -1,136 +1,208 @@
+
+-- ----------------------------
+-- 第三方平台授权表
+-- ----------------------------
+CREATE TABLE `social_user`
+(
+ `id` bigint unsigned NOT NULL COMMENT '主键',
+ `user_id` bigint NOT NULL COMMENT '用户ID',
+ `tenant_id` varchar(20) DEFAULT NULL COMMENT '租户id',
+ `auth_id` varchar(255) NOT NULL COMMENT '授权+授权openid',
+ `source` varchar(255) NOT NULL COMMENT '用户来源',
+ `open_id` varchar(255) DEFAULT NULL COMMENT '原生open id',
+ `user_name` varchar(30) NOT NULL COMMENT '登录账号',
+ `nick_name` varchar(30) DEFAULT '' COMMENT '用户昵称',
+ `email` varchar(255) DEFAULT '' COMMENT '用户邮箱',
+ `avatar` varchar(500) DEFAULT '' COMMENT '头像地址',
+ `access_token` varchar(255) NOT NULL COMMENT '用户的授权令牌',
+ `expire_in` int DEFAULT NULL COMMENT '用户的授权令牌的有效期,部分平台可能没有',
+ `refresh_token` varchar(255) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有',
+ `access_code` varchar(255) DEFAULT NULL COMMENT '平台的授权信息,部分平台可能没有',
+ `union_id` varchar(255) DEFAULT NULL COMMENT '用户的 unionid',
+ `scope` varchar(255) DEFAULT NULL COMMENT '授予的权限,部分平台可能没有',
+ `token_type` varchar(255) DEFAULT NULL COMMENT '个别平台的授权信息,部分平台可能没有',
+ `id_token` varchar(255) DEFAULT NULL COMMENT 'id token,部分平台可能没有',
+ `mac_algorithm` varchar(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+ `mac_key` varchar(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+ `code` varchar(255) DEFAULT NULL COMMENT '用户的授权code,部分平台可能没有',
+ `oauth_token` varchar(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+ `oauth_token_secret` varchar(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+ `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
+ `create_by` bigint NOT NULL COMMENT '创建人',
+ `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+ `update_by` bigint NOT NULL COMMENT '更新人',
+ `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+ `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB
+ DEFAULT CHARSET = utf8mb4
+ COLLATE = utf8mb4_general_ci
+ ROW_FORMAT = DYNAMIC COMMENT ='社会化关系表';
+
-- ----------------------------
-- 租户表
-- ----------------------------
drop table if exists sys_tenant;
create table sys_tenant
(
- id bigint(20) not null comment 'id',
- tenant_id varchar(20) not null comment '租户编号',
- contact_user_name varchar(20) comment '联系人',
- contact_phone varchar(20) comment '联系电话',
- company_name varchar(50) comment '企业名称',
- license_number varchar(30) comment '统一社会信用代码',
- address varchar(200) comment '地址',
- intro varchar(200) comment '企业简介',
- domain varchar(200) comment '域名',
- remark varchar(200) comment '备注',
- package_id bigint(20) comment '租户套餐编号',
- expire_time datetime comment '过期时间',
- account_count int default -1 comment '用户数量(-1不限制)',
- status char(1) default '0' comment '租户状态(0正常 1停用)',
- del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
- create_dept bigint(20) comment '创建部门',
- create_by bigint(20) comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) comment '更新者',
- update_time datetime comment '更新时间',
+ id bigint(20) not null comment 'id',
+ tenant_id varchar(20) not null comment '租户编号',
+ contact_user_name varchar(20) comment '联系人',
+ contact_phone varchar(20) comment '联系电话',
+ company_name varchar(50) comment '企业名称',
+ license_number varchar(30) comment '统一社会信用代码',
+ address varchar(200) comment '地址',
+ intro varchar(200) comment '企业简介',
+ domain varchar(200) comment '域名',
+ remark varchar(200) comment '备注',
+ package_id bigint(20) comment '租户套餐编号',
+ expire_time datetime comment '过期时间',
+ account_count int default -1 comment '用户数量(-1不限制)',
+ status char(1) default '0' comment '租户状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ create_dept bigint(20) comment '创建部门',
+ create_by bigint(20) comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) comment '更新者',
+ update_time datetime comment '更新时间',
primary key (id)
-) engine=innodb comment = '租户表';
+) engine = innodb comment = '租户表';
-- ----------------------------
-- 初始化-租户表数据
-- ----------------------------
-insert into sys_tenant values(1, '000000', '管理组', '15888888888', 'XXX有限公司', NULL, NULL, '多租户通用后台管理管理系统', NULL, NULL, NULL, NULL, -1, '0', '0', 103, 1, sysdate(), NULL, NULL);
+insert into sys_tenant
+values (1, '000000', '管理组', '15888888888', 'XXX有限公司', NULL, NULL, '多租户通用后台管理管理系统', NULL, NULL, NULL,
+ NULL, -1, '0', '0', 103, 1, sysdate(), NULL, NULL);
-- ----------------------------
-- 租户套餐表
-- ----------------------------
drop table if exists sys_tenant_package;
-create table sys_tenant_package (
- package_id bigint(20) not null comment '租户套餐id',
- package_name varchar(20) comment '套餐名称',
- menu_ids varchar(3000) comment '关联菜单id',
- remark varchar(200) comment '备注',
- menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示',
- status char(1) default '0' comment '状态(0正常 1停用)',
- del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
- create_dept bigint(20) comment '创建部门',
- create_by bigint(20) comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) comment '更新者',
- update_time datetime comment '更新时间',
+create table sys_tenant_package
+(
+ package_id bigint(20) not null comment '租户套餐id',
+ package_name varchar(20) comment '套餐名称',
+ menu_ids varchar(3000) comment '关联菜单id',
+ remark varchar(200) comment '备注',
+ menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示',
+ status char(1) default '0' comment '状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ create_dept bigint(20) comment '创建部门',
+ create_by bigint(20) comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) comment '更新者',
+ update_time datetime comment '更新时间',
primary key (package_id)
-) engine=innodb comment = '租户套餐表';
+) engine = innodb comment = '租户套餐表';
-- ----------------------------
-- 1、部门表
-- ----------------------------
drop table if exists sys_dept;
-create table sys_dept (
- dept_id bigint(20) not null comment '部门id',
- tenant_id varchar(20) default '000000' comment '租户编号',
- parent_id bigint(20) default 0 comment '父部门id',
- ancestors varchar(500) default '' comment '祖级列表',
- dept_name varchar(30) default '' comment '部门名称',
- order_num int(4) default 0 comment '显示顺序',
- leader varchar(20) default null comment '负责人',
- phone varchar(11) default null comment '联系电话',
- email varchar(50) default null comment '邮箱',
- status char(1) default '0' comment '部门状态(0正常 1停用)',
- del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- primary key (dept_id)
-) engine=innodb comment = '部门表';
+create table sys_dept
+(
+ dept_id bigint(20) not null comment '部门id',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ parent_id bigint(20) default 0 comment '父部门id',
+ ancestors varchar(500) default '' comment '祖级列表',
+ dept_name varchar(30) default '' comment '部门名称',
+ order_num int(4) default 0 comment '显示顺序',
+ leader varchar(20) default null comment '负责人',
+ phone varchar(11) default null comment '联系电话',
+ email varchar(50) default null comment '邮箱',
+ status char(1) default '0' comment '部门状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ primary key (dept_id)
+) engine = innodb comment = '部门表';
-- ----------------------------
-- 初始化-部门表数据
-- ----------------------------
-insert into sys_dept values(100, '000000', 0, '0', 'XXX科技', 0, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(101, '000000', 100, '0,100', '深圳总公司', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(102, '000000', 100, '0,100', '长沙分公司', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(103, '000000', 101, '0,100,101', '研发部门', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(104, '000000', 101, '0,100,101', '市场部门', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(105, '000000', 101, '0,100,101', '测试部门', 3, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(106, '000000', 101, '0,100,101', '财务部门', 4, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(107, '000000', 101, '0,100,101', '运维部门', 5, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(108, '000000', 102, '0,100,102', '市场部门', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
-insert into sys_dept values(109, '000000', 102, '0,100,102', '财务部门', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(), null, null);
+insert into sys_dept
+values (100, '000000', 0, '0', 'XXX科技', 0, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, sysdate(),
+ null, null);
+insert into sys_dept
+values (101, '000000', 100, '0,100', '深圳总公司', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (102, '000000', 100, '0,100', '长沙分公司', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (103, '000000', 101, '0,100,101', '研发部门', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (104, '000000', 101, '0,100,101', '市场部门', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (105, '000000', 101, '0,100,101', '测试部门', 3, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (106, '000000', 101, '0,100,101', '财务部门', 4, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (107, '000000', 101, '0,100,101', '运维部门', 5, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (108, '000000', 102, '0,100,102', '市场部门', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
+insert into sys_dept
+values (109, '000000', 102, '0,100,102', '财务部门', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1,
+ sysdate(), null, null);
-- ----------------------------
-- 2、用户信息表
-- ----------------------------
drop table if exists sys_user;
-create table sys_user (
- user_id bigint(20) not null comment '用户ID',
- tenant_id varchar(20) default '000000' comment '租户编号',
- dept_id bigint(20) default null comment '部门ID',
- user_name varchar(30) not null comment '用户账号',
- nick_name varchar(30) not null comment '用户昵称',
- user_type varchar(10) default 'sys_user' comment '用户类型(sys_user系统用户)',
- email varchar(50) default '' comment '用户邮箱',
- phonenumber varchar(11) default '' comment '手机号码',
- sex char(1) default '0' comment '用户性别(0男 1女 2未知)',
- avatar bigint(20) comment '头像地址',
- password varchar(100) default '' comment '密码',
- status char(1) default '0' comment '帐号状态(0正常 1停用)',
- del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
- login_ip varchar(128) default '' comment '最后登录IP',
- login_date datetime comment '最后登录时间',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (user_id)
-) engine=innodb comment = '用户信息表';
+create table sys_user
+(
+ user_id bigint(20) not null comment '用户ID',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ dept_id bigint(20) default null comment '部门ID',
+ user_name varchar(30) not null comment '用户账号',
+ nick_name varchar(30) not null comment '用户昵称',
+ user_type varchar(10) default 'sys_user' comment '用户类型(sys_user系统用户)',
+ email varchar(50) default '' comment '用户邮箱',
+ phonenumber varchar(11) default '' comment '手机号码',
+ sex char(1) default '0' comment '用户性别(0男 1女 2未知)',
+ avatar bigint(20) comment '头像地址',
+ password varchar(100) default '' comment '密码',
+ status char(1) default '0' comment '帐号状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ login_ip varchar(128) default '' comment '最后登录IP',
+ login_date datetime comment '最后登录时间',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (user_id)
+) engine = innodb comment = '用户信息表';
-- ----------------------------
-- 初始化-用户信息表数据
-- ----------------------------
-insert into sys_user values(1, '000000', 103, 'admin', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@163.com', '15888888888', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), null, null, '管理员');
-insert into sys_user values(2, '000000', 105, 'lionli', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@qq.com', '15666666666', '1', null, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1, sysdate(), null, null, '测试员');
+insert into sys_user
+values (1, '000000', 103, 'admin', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@163.com', '15888888888', '1', null,
+ '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1,
+ sysdate(), null, null, '管理员');
+insert into sys_user
+values (2, '000000', 105, 'lionli', '疯狂的狮子Li', 'sys_user', 'crazyLionLi@qq.com', '15666666666', '1', null,
+ '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '127.0.0.1', sysdate(), 103, 1,
+ sysdate(), null, null, '测试员');
-- ----------------------------
@@ -139,339 +211,626 @@ insert into sys_user values(2, '000000', 105, 'lionli', '疯狂的狮子Li', 'sy
drop table if exists sys_post;
create table sys_post
(
- post_id bigint(20) not null comment '岗位ID',
- tenant_id varchar(20) default '000000' comment '租户编号',
- post_code varchar(64) not null comment '岗位编码',
- post_name varchar(50) not null comment '岗位名称',
- post_sort int(4) not null comment '显示顺序',
- status char(1) not null comment '状态(0正常 1停用)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (post_id)
-) engine=innodb comment = '岗位信息表';
+ post_id bigint(20) not null comment '岗位ID',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ post_code varchar(64) not null comment '岗位编码',
+ post_name varchar(50) not null comment '岗位名称',
+ post_sort int(4) not null comment '显示顺序',
+ status char(1) not null comment '状态(0正常 1停用)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (post_id)
+) engine = innodb comment = '岗位信息表';
-- ----------------------------
-- 初始化-岗位信息表数据
-- ----------------------------
-insert into sys_post values(1, '000000', 'ceo', '董事长', 1, '0', 103, 1, sysdate(), null, null, '');
-insert into sys_post values(2, '000000', 'se', '项目经理', 2, '0', 103, 1, sysdate(), null, null, '');
-insert into sys_post values(3, '000000', 'hr', '人力资源', 3, '0', 103, 1, sysdate(), null, null, '');
-insert into sys_post values(4, '000000', 'user', '普通员工', 4, '0', 103, 1, sysdate(), null, null, '');
+insert into sys_post
+values (1, '000000', 'ceo', '董事长', 1, '0', 103, 1, sysdate(), null, null, '');
+insert into sys_post
+values (2, '000000', 'se', '项目经理', 2, '0', 103, 1, sysdate(), null, null, '');
+insert into sys_post
+values (3, '000000', 'hr', '人力资源', 3, '0', 103, 1, sysdate(), null, null, '');
+insert into sys_post
+values (4, '000000', 'user', '普通员工', 4, '0', 103, 1, sysdate(), null, null, '');
-- ----------------------------
-- 4、角色信息表
-- ----------------------------
drop table if exists sys_role;
-create table sys_role (
- role_id bigint(20) not null comment '角色ID',
- tenant_id varchar(20) default '000000' comment '租户编号',
- role_name varchar(30) not null comment '角色名称',
- role_key varchar(100) not null comment '角色权限字符串',
- role_sort int(4) not null comment '显示顺序',
- data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
- menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示',
- dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示',
- status char(1) not null comment '角色状态(0正常 1停用)',
- del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (role_id)
-) engine=innodb comment = '角色信息表';
+create table sys_role
+(
+ role_id bigint(20) not null comment '角色ID',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ role_name varchar(30) not null comment '角色名称',
+ role_key varchar(100) not null comment '角色权限字符串',
+ role_sort int(4) not null comment '显示顺序',
+ data_scope char(1) default '1' comment '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
+ menu_check_strictly tinyint(1) default 1 comment '菜单树选择项是否关联显示',
+ dept_check_strictly tinyint(1) default 1 comment '部门树选择项是否关联显示',
+ status char(1) not null comment '角色状态(0正常 1停用)',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (role_id)
+) engine = innodb comment = '角色信息表';
-- ----------------------------
-- 初始化-角色信息表数据
-- ----------------------------
-insert into sys_role values(1, '000000', '超级管理员', 'superadmin', 1, 1, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '超级管理员');
-insert into sys_role values(2, '000000', '普通角色', 'common', 2, 2, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '普通角色');
+insert into sys_role
+values (1, '000000', '超级管理员', 'superadmin', 1, 1, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '超级管理员');
+insert into sys_role
+values (2, '000000', '普通角色', 'common', 2, 2, 1, 1, '0', '0', 103, 1, sysdate(), null, null, '普通角色');
-- ----------------------------
-- 5、菜单权限表
-- ----------------------------
drop table if exists sys_menu;
-create table sys_menu (
- menu_id bigint(20) not null comment '菜单ID',
- menu_name varchar(50) not null comment '菜单名称',
- parent_id bigint(20) default 0 comment '父菜单ID',
- order_num int(4) default 0 comment '显示顺序',
- path varchar(200) default '' comment '路由地址',
- component varchar(255) default null comment '组件路径',
- query_param varchar(255) default null comment '路由参数',
- is_frame int(1) default 1 comment '是否为外链(0是 1否)',
- is_cache int(1) default 0 comment '是否缓存(0缓存 1不缓存)',
- menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)',
- visible char(1) default 0 comment '显示状态(0显示 1隐藏)',
- status char(1) default 0 comment '菜单状态(0正常 1停用)',
- perms varchar(100) default null comment '权限标识',
- icon varchar(100) default '#' comment '菜单图标',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default '' comment '备注',
- primary key (menu_id)
-) engine=innodb comment = '菜单权限表';
+create table sys_menu
+(
+ menu_id bigint(20) not null comment '菜单ID',
+ menu_name varchar(50) not null comment '菜单名称',
+ parent_id bigint(20) default 0 comment '父菜单ID',
+ order_num int(4) default 0 comment '显示顺序',
+ path varchar(200) default '' comment '路由地址',
+ component varchar(255) default null comment '组件路径',
+ query_param varchar(255) default null comment '路由参数',
+ is_frame int(1) default 1 comment '是否为外链(0是 1否)',
+ is_cache int(1) default 0 comment '是否缓存(0缓存 1不缓存)',
+ menu_type char(1) default '' comment '菜单类型(M目录 C菜单 F按钮)',
+ visible char(1) default 0 comment '显示状态(0显示 1隐藏)',
+ status char(1) default 0 comment '菜单状态(0正常 1停用)',
+ perms varchar(100) default null comment '权限标识',
+ icon varchar(100) default '#' comment '菜单图标',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default '' comment '备注',
+ primary key (menu_id)
+) engine = innodb comment = '菜单权限表';
-- ----------------------------
-- 初始化-菜单信息表数据
-- ----------------------------
-- 一级菜单
-insert into sys_menu values('1', '系统管理', '0', '1', 'system', null, '', 1, 0, 'M', '0', '0', '', 'system', 103, 1, sysdate(), null, null, '系统管理目录');
-insert into sys_menu values('6', '租户管理', '0', '2', 'tenant', null, '', 1, 0, 'M', '0', '0', '', 'chart', 103, 1, sysdate(), null, null, '租户管理目录');
-insert into sys_menu values('2', '系统监控', '0', '3', 'monitor', null, '', 1, 0, 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), null, null, '系统监控目录');
-insert into sys_menu values('3', '系统工具', '0', '4', 'tool', null, '', 1, 0, 'M', '0', '0', '', 'tool', 103, 1, sysdate(), null, null, '系统工具目录');
-insert into sys_menu values('4', 'PLUS官网', '0', '5', 'https://gitee.com/dromara/RuoYi-Vue-Plus', null, '', 0, 0, 'M', '0', '0', '', 'guide', 103, 1, sysdate(), null, null, 'RuoYi-Vue-Plus官网地址');
+insert into sys_menu
+values ('1', '系统管理', '0', '1', 'system', null, '', 1, 0, 'M', '0', '0', '', 'system', 103, 1, sysdate(), null, null,
+ '系统管理目录');
+insert into sys_menu
+values ('6', '租户管理', '0', '2', 'tenant', null, '', 1, 0, 'M', '0', '0', '', 'chart', 103, 1, sysdate(), null, null,
+ '租户管理目录');
+insert into sys_menu
+values ('2', '系统监控', '0', '3', 'monitor', null, '', 1, 0, 'M', '0', '0', '', 'monitor', 103, 1, sysdate(), null,
+ null, '系统监控目录');
+insert into sys_menu
+values ('3', '系统工具', '0', '4', 'tool', null, '', 1, 0, 'M', '0', '0', '', 'tool', 103, 1, sysdate(), null, null,
+ '系统工具目录');
+insert into sys_menu
+values ('4', 'PLUS官网', '0', '5', 'https://gitee.com/dromara/RuoYi-Vue-Plus', null, '', 0, 0, 'M', '0', '0', '',
+ 'guide', 103, 1, sysdate(), null, null, 'RuoYi-Vue-Plus官网地址');
-- 二级菜单
-insert into sys_menu values('100', '用户管理', '1', '1', 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 103, 1, sysdate(), null, null, '用户管理菜单');
-insert into sys_menu values('101', '角色管理', '1', '2', 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 103, 1, sysdate(), null, null, '角色管理菜单');
-insert into sys_menu values('102', '菜单管理', '1', '3', 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 103, 1, sysdate(), null, null, '菜单管理菜单');
-insert into sys_menu values('103', '部门管理', '1', '4', 'dept', 'system/dept/index', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 103, 1, sysdate(), null, null, '部门管理菜单');
-insert into sys_menu values('104', '岗位管理', '1', '5', 'post', 'system/post/index', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post', 103, 1, sysdate(), null, null, '岗位管理菜单');
-insert into sys_menu values('105', '字典管理', '1', '6', 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 103, 1, sysdate(), null, null, '字典管理菜单');
-insert into sys_menu values('106', '参数设置', '1', '7', 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 103, 1, sysdate(), null, null, '参数设置菜单');
-insert into sys_menu values('107', '通知公告', '1', '8', 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice:list', 'message', 103, 1, sysdate(), null, null, '通知公告菜单');
-insert into sys_menu values('108', '日志管理', '1', '9', 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 103, 1, sysdate(), null, null, '日志管理菜单');
-insert into sys_menu values('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, sysdate(), null, null, '在线用户菜单');
-insert into sys_menu values('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, sysdate(), null, null, '缓存监控菜单');
-insert into sys_menu values('114', '表单构建', '3', '1', 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build', 103, 1, sysdate(), null, null, '表单构建菜单');
-insert into sys_menu values('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, sysdate(), null, null, '代码生成菜单');
-insert into sys_menu values ('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, sysdate(), null, null, '租户管理菜单');
-insert into sys_menu values ('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单');
+insert into sys_menu
+values ('100', '用户管理', '1', '1', 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user',
+ 103, 1, sysdate(), null, null, '用户管理菜单');
+insert into sys_menu
+values ('101', '角色管理', '1', '2', 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list',
+ 'peoples', 103, 1, sysdate(), null, null, '角色管理菜单');
+insert into sys_menu
+values ('102', '菜单管理', '1', '3', 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list',
+ 'tree-table', 103, 1, sysdate(), null, null, '菜单管理菜单');
+insert into sys_menu
+values ('103', '部门管理', '1', '4', 'dept', 'system/dept/index', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree',
+ 103, 1, sysdate(), null, null, '部门管理菜单');
+insert into sys_menu
+values ('104', '岗位管理', '1', '5', 'post', 'system/post/index', '', 1, 0, 'C', '0', '0', 'system:post:list', 'post',
+ 103, 1, sysdate(), null, null, '岗位管理菜单');
+insert into sys_menu
+values ('105', '字典管理', '1', '6', 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict',
+ 103, 1, sysdate(), null, null, '字典管理菜单');
+insert into sys_menu
+values ('106', '参数设置', '1', '7', 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list',
+ 'edit', 103, 1, sysdate(), null, null, '参数设置菜单');
+insert into sys_menu
+values ('107', '通知公告', '1', '8', 'notice', 'system/notice/index', '', 1, 0, 'C', '0', '0', 'system:notice:list',
+ 'message', 103, 1, sysdate(), null, null, '通知公告菜单');
+insert into sys_menu
+values ('108', '日志管理', '1', '9', 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 103, 1, sysdate(), null, null,
+ '日志管理菜单');
+insert into sys_menu
+values ('109', '在线用户', '2', '1', 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list',
+ 'online', 103, 1, sysdate(), null, null, '在线用户菜单');
+insert into sys_menu
+values ('113', '缓存监控', '2', '5', 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list',
+ 'redis', 103, 1, sysdate(), null, null, '缓存监控菜单');
+insert into sys_menu
+values ('114', '表单构建', '3', '1', 'build', 'tool/build/index', '', 1, 0, 'C', '0', '0', 'tool:build:list', 'build',
+ 103, 1, sysdate(), null, null, '表单构建菜单');
+insert into sys_menu
+values ('115', '代码生成', '3', '2', 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1,
+ sysdate(), null, null, '代码生成菜单');
+insert into sys_menu
+values ('121', '租户管理', '6', '1', 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list',
+ 'list', 103, 1, sysdate(), null, null, '租户管理菜单');
+insert into sys_menu
+values ('122', '租户套餐管理', '6', '2', 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0',
+ 'system:tenantPackage:list', 'form', 103, 1, sysdate(), null, null, '租户套餐管理菜单');
-- springboot-admin监控
-insert into sys_menu values('117', 'Admin监控', '2', '5', 'Admin', 'monitor/admin/index', '', 1, 0, 'C', '0', '0', 'monitor:admin:list', 'dashboard', 103, 1, sysdate(), null, null, 'Admin监控菜单');
+insert into sys_menu
+values ('117', 'Admin监控', '2', '5', 'Admin', 'monitor/admin/index', '', 1, 0, 'C', '0', '0', 'monitor:admin:list',
+ 'dashboard', 103, 1, sysdate(), null, null, 'Admin监控菜单');
-- oss菜单
-insert into sys_menu values('118', '文件管理', '1', '10', 'oss', 'system/oss/index', '', 1, 0, 'C', '0', '0', 'system:oss:list', 'upload', 103, 1, sysdate(), null, null, '文件管理菜单');
+insert into sys_menu
+values ('118', '文件管理', '1', '10', 'oss', 'system/oss/index', '', 1, 0, 'C', '0', '0', 'system:oss:list', 'upload',
+ 103, 1, sysdate(), null, null, '文件管理菜单');
-- xxl-job-admin控制台
-insert into sys_menu values('120', '任务调度中心', '2', '5', 'XxlJob', 'monitor/xxljob/index', '', 1, 0, 'C', '0', '0', 'monitor:xxljob:list', 'job', 103, 1, sysdate(), null, null, 'Xxl-Job控制台菜单');
+insert into sys_menu
+values ('120', '任务调度中心', '2', '5', 'XxlJob', 'monitor/xxljob/index', '', 1, 0, 'C', '0', '0',
+ 'monitor:xxljob:list', 'job', 103, 1, sysdate(), null, null, 'Xxl-Job控制台菜单');
-- 三级菜单
-insert into sys_menu values('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, sysdate(), null, null, '操作日志菜单');
-insert into sys_menu values('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, sysdate(), null, null, '登录日志菜单');
+insert into sys_menu
+values ('500', '操作日志', '108', '1', 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0',
+ 'monitor:operlog:list', 'form', 103, 1, sysdate(), null, null, '操作日志菜单');
+insert into sys_menu
+values ('501', '登录日志', '108', '2', 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0',
+ 'monitor:logininfor:list', 'logininfor', 103, 1, sysdate(), null, null, '登录日志菜单');
-- 用户管理按钮
-insert into sys_menu values('1001', '用户查询', '100', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1002', '用户新增', '100', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1003', '用户修改', '100', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1004', '用户删除', '100', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1005', '用户导出', '100', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1006', '用户导入', '100', '6', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1007', '重置密码', '100', '7', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1001', '用户查询', '100', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1002', '用户新增', '100', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1003', '用户修改', '100', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1004', '用户删除', '100', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1005', '用户导出', '100', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1006', '用户导入', '100', '6', '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1007', '重置密码', '100', '7', '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 103, 1, sysdate(),
+ null, null, '');
-- 角色管理按钮
-insert into sys_menu values('1008', '角色查询', '101', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1009', '角色新增', '101', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1010', '角色修改', '101', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1011', '角色删除', '101', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1012', '角色导出', '101', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1008', '角色查询', '101', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1009', '角色新增', '101', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1010', '角色修改', '101', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1011', '角色删除', '101', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1012', '角色导出', '101', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 103, 1, sysdate(),
+ null, null, '');
-- 菜单管理按钮
-insert into sys_menu values('1013', '菜单查询', '102', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1014', '菜单新增', '102', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1015', '菜单修改', '102', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1016', '菜单删除', '102', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1013', '菜单查询', '102', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1014', '菜单新增', '102', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1015', '菜单修改', '102', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1016', '菜单删除', '102', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 103, 1, sysdate(),
+ null, null, '');
-- 部门管理按钮
-insert into sys_menu values('1017', '部门查询', '103', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1018', '部门新增', '103', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1019', '部门修改', '103', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1020', '部门删除', '103', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1017', '部门查询', '103', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1018', '部门新增', '103', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1019', '部门修改', '103', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1020', '部门删除', '103', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 103, 1, sysdate(),
+ null, null, '');
-- 岗位管理按钮
-insert into sys_menu values('1021', '岗位查询', '104', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1022', '岗位新增', '104', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1023', '岗位修改', '104', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1024', '岗位删除', '104', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1025', '岗位导出', '104', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1021', '岗位查询', '104', '1', '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1022', '岗位新增', '104', '2', '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1023', '岗位修改', '104', '3', '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1024', '岗位删除', '104', '4', '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1025', '岗位导出', '104', '5', '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 103, 1, sysdate(),
+ null, null, '');
-- 字典管理按钮
-insert into sys_menu values('1026', '字典查询', '105', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1027', '字典新增', '105', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1028', '字典修改', '105', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1029', '字典删除', '105', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1030', '字典导出', '105', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1026', '字典查询', '105', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1027', '字典新增', '105', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1028', '字典修改', '105', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1029', '字典删除', '105', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1030', '字典导出', '105', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 103, 1, sysdate(),
+ null, null, '');
-- 参数设置按钮
-insert into sys_menu values('1031', '参数查询', '106', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1032', '参数新增', '106', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1033', '参数修改', '106', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1034', '参数删除', '106', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1035', '参数导出', '106', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1031', '参数查询', '106', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1032', '参数新增', '106', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1033', '参数修改', '106', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1034', '参数删除', '106', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1035', '参数导出', '106', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 103, 1,
+ sysdate(), null, null, '');
-- 通知公告按钮
-insert into sys_menu values('1036', '公告查询', '107', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1037', '公告新增', '107', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1038', '公告修改', '107', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1039', '公告删除', '107', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1036', '公告查询', '107', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1037', '公告新增', '107', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1038', '公告修改', '107', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1039', '公告删除', '107', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 103, 1,
+ sysdate(), null, null, '');
-- 操作日志按钮
-insert into sys_menu values('1040', '操作查询', '500', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1041', '操作删除', '500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1042', '日志导出', '500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1040', '操作查询', '500', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1041', '操作删除', '500', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1042', '日志导出', '500', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 103, 1,
+ sysdate(), null, null, '');
-- 登录日志按钮
-insert into sys_menu values('1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1043', '登录查询', '501', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1044', '登录删除', '501', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1045', '日志导出', '501', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1050', '账户解锁', '501', '4', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 103, 1,
+ sysdate(), null, null, '');
-- 在线用户按钮
-insert into sys_menu values('1046', '在线查询', '109', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1047', '批量强退', '109', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1048', '单条强退', '109', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1046', '在线查询', '109', '1', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1047', '批量强退', '109', '2', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1048', '单条强退', '109', '3', '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 103, 1,
+ sysdate(), null, null, '');
-- 代码生成按钮
-insert into sys_menu values('1055', '生成查询', '115', '1', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1056', '生成修改', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1057', '生成删除', '115', '3', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1058', '导入代码', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1059', '预览代码', '115', '4', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1060', '生成代码', '115', '5', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1055', '生成查询', '115', '1', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1056', '生成修改', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 103, 1, sysdate(), null,
+ null, '');
+insert into sys_menu
+values ('1057', '生成删除', '115', '3', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1058', '导入代码', '115', '2', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1059', '预览代码', '115', '4', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1060', '生成代码', '115', '5', '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 103, 1, sysdate(), null,
+ null, '');
-- oss相关按钮
-insert into sys_menu values('1600', '文件查询', '118', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1601', '文件上传', '118', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:upload', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1602', '文件下载', '118', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:download', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1603', '文件删除', '118', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1604', '配置添加', '118', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values('1605', '配置编辑', '118', '6', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:edit', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1600', '文件查询', '118', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1601', '文件上传', '118', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:upload', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1602', '文件下载', '118', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:download', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1603', '文件删除', '118', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:remove', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1604', '配置添加', '118', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1605', '配置编辑', '118', '6', '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:edit', '#', 103, 1, sysdate(),
+ null, null, '');
-- 租户管理相关按钮
-insert into sys_menu values ('1606', '租户查询', '121', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1607', '租户新增', '121', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1608', '租户修改', '121', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1609', '租户删除', '121', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1610', '租户导出', '121', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1606', '租户查询', '121', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1607', '租户新增', '121', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1608', '租户修改', '121', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit', '#', 103, 1, sysdate(),
+ null, null, '');
+insert into sys_menu
+values ('1609', '租户删除', '121', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1610', '租户导出', '121', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export', '#', 103, 1,
+ sysdate(), null, null, '');
-- 租户套餐管理相关按钮
-insert into sys_menu values ('1611', '租户套餐查询', '122', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1612', '租户套餐新增', '122', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1613', '租户套餐修改', '122', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1614', '租户套餐删除', '122', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', '#', 103, 1, sysdate(), null, null, '');
-insert into sys_menu values ('1615', '租户套餐导出', '122', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', '#', 103, 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1611', '租户套餐查询', '122', '1', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1612', '租户套餐新增', '122', '2', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1613', '租户套餐修改', '122', '3', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', '#', 103, 1,
+ sysdate(), null, null, '');
+insert into sys_menu
+values ('1614', '租户套餐删除', '122', '4', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', '#', 103,
+ 1, sysdate(), null, null, '');
+insert into sys_menu
+values ('1615', '租户套餐导出', '122', '5', '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', '#', 103,
+ 1, sysdate(), null, null, '');
-- ----------------------------
-- 6、用户和角色关联表 用户N-1角色
-- ----------------------------
drop table if exists sys_user_role;
-create table sys_user_role (
- user_id bigint(20) not null comment '用户ID',
- role_id bigint(20) not null comment '角色ID',
- primary key(user_id, role_id)
-) engine=innodb comment = '用户和角色关联表';
+create table sys_user_role
+(
+ user_id bigint(20) not null comment '用户ID',
+ role_id bigint(20) not null comment '角色ID',
+ primary key (user_id, role_id)
+) engine = innodb comment = '用户和角色关联表';
-- ----------------------------
-- 初始化-用户和角色关联表数据
-- ----------------------------
-insert into sys_user_role values ('1', '1');
-insert into sys_user_role values ('2', '2');
+insert into sys_user_role
+values ('1', '1');
+insert into sys_user_role
+values ('2', '2');
-- ----------------------------
-- 7、角色和菜单关联表 角色1-N菜单
-- ----------------------------
drop table if exists sys_role_menu;
-create table sys_role_menu (
- role_id bigint(20) not null comment '角色ID',
- menu_id bigint(20) not null comment '菜单ID',
- primary key(role_id, menu_id)
-) engine=innodb comment = '角色和菜单关联表';
+create table sys_role_menu
+(
+ role_id bigint(20) not null comment '角色ID',
+ menu_id bigint(20) not null comment '菜单ID',
+ primary key (role_id, menu_id)
+) engine = innodb comment = '角色和菜单关联表';
-- ----------------------------
-- 初始化-角色和菜单关联表数据
-- ----------------------------
-insert into sys_role_menu values ('2', '1');
-insert into sys_role_menu values ('2', '2');
-insert into sys_role_menu values ('2', '3');
-insert into sys_role_menu values ('2', '4');
-insert into sys_role_menu values ('2', '100');
-insert into sys_role_menu values ('2', '101');
-insert into sys_role_menu values ('2', '102');
-insert into sys_role_menu values ('2', '103');
-insert into sys_role_menu values ('2', '104');
-insert into sys_role_menu values ('2', '105');
-insert into sys_role_menu values ('2', '106');
-insert into sys_role_menu values ('2', '107');
-insert into sys_role_menu values ('2', '108');
-insert into sys_role_menu values ('2', '109');
-insert into sys_role_menu values ('2', '110');
-insert into sys_role_menu values ('2', '111');
-insert into sys_role_menu values ('2', '112');
-insert into sys_role_menu values ('2', '113');
-insert into sys_role_menu values ('2', '114');
-insert into sys_role_menu values ('2', '115');
-insert into sys_role_menu values ('2', '116');
-insert into sys_role_menu values ('2', '500');
-insert into sys_role_menu values ('2', '501');
-insert into sys_role_menu values ('2', '1000');
-insert into sys_role_menu values ('2', '1001');
-insert into sys_role_menu values ('2', '1002');
-insert into sys_role_menu values ('2', '1003');
-insert into sys_role_menu values ('2', '1004');
-insert into sys_role_menu values ('2', '1005');
-insert into sys_role_menu values ('2', '1006');
-insert into sys_role_menu values ('2', '1007');
-insert into sys_role_menu values ('2', '1008');
-insert into sys_role_menu values ('2', '1009');
-insert into sys_role_menu values ('2', '1010');
-insert into sys_role_menu values ('2', '1011');
-insert into sys_role_menu values ('2', '1012');
-insert into sys_role_menu values ('2', '1013');
-insert into sys_role_menu values ('2', '1014');
-insert into sys_role_menu values ('2', '1015');
-insert into sys_role_menu values ('2', '1016');
-insert into sys_role_menu values ('2', '1017');
-insert into sys_role_menu values ('2', '1018');
-insert into sys_role_menu values ('2', '1019');
-insert into sys_role_menu values ('2', '1020');
-insert into sys_role_menu values ('2', '1021');
-insert into sys_role_menu values ('2', '1022');
-insert into sys_role_menu values ('2', '1023');
-insert into sys_role_menu values ('2', '1024');
-insert into sys_role_menu values ('2', '1025');
-insert into sys_role_menu values ('2', '1026');
-insert into sys_role_menu values ('2', '1027');
-insert into sys_role_menu values ('2', '1028');
-insert into sys_role_menu values ('2', '1029');
-insert into sys_role_menu values ('2', '1030');
-insert into sys_role_menu values ('2', '1031');
-insert into sys_role_menu values ('2', '1032');
-insert into sys_role_menu values ('2', '1033');
-insert into sys_role_menu values ('2', '1034');
-insert into sys_role_menu values ('2', '1035');
-insert into sys_role_menu values ('2', '1036');
-insert into sys_role_menu values ('2', '1037');
-insert into sys_role_menu values ('2', '1038');
-insert into sys_role_menu values ('2', '1039');
-insert into sys_role_menu values ('2', '1040');
-insert into sys_role_menu values ('2', '1041');
-insert into sys_role_menu values ('2', '1042');
-insert into sys_role_menu values ('2', '1043');
-insert into sys_role_menu values ('2', '1044');
-insert into sys_role_menu values ('2', '1045');
-insert into sys_role_menu values ('2', '1050');
-insert into sys_role_menu values ('2', '1046');
-insert into sys_role_menu values ('2', '1047');
-insert into sys_role_menu values ('2', '1048');
-insert into sys_role_menu values ('2', '1055');
-insert into sys_role_menu values ('2', '1056');
-insert into sys_role_menu values ('2', '1057');
-insert into sys_role_menu values ('2', '1058');
-insert into sys_role_menu values ('2', '1059');
-insert into sys_role_menu values ('2', '1060');
+insert into sys_role_menu
+values ('2', '1');
+insert into sys_role_menu
+values ('2', '2');
+insert into sys_role_menu
+values ('2', '3');
+insert into sys_role_menu
+values ('2', '4');
+insert into sys_role_menu
+values ('2', '100');
+insert into sys_role_menu
+values ('2', '101');
+insert into sys_role_menu
+values ('2', '102');
+insert into sys_role_menu
+values ('2', '103');
+insert into sys_role_menu
+values ('2', '104');
+insert into sys_role_menu
+values ('2', '105');
+insert into sys_role_menu
+values ('2', '106');
+insert into sys_role_menu
+values ('2', '107');
+insert into sys_role_menu
+values ('2', '108');
+insert into sys_role_menu
+values ('2', '109');
+insert into sys_role_menu
+values ('2', '110');
+insert into sys_role_menu
+values ('2', '111');
+insert into sys_role_menu
+values ('2', '112');
+insert into sys_role_menu
+values ('2', '113');
+insert into sys_role_menu
+values ('2', '114');
+insert into sys_role_menu
+values ('2', '115');
+insert into sys_role_menu
+values ('2', '116');
+insert into sys_role_menu
+values ('2', '500');
+insert into sys_role_menu
+values ('2', '501');
+insert into sys_role_menu
+values ('2', '1000');
+insert into sys_role_menu
+values ('2', '1001');
+insert into sys_role_menu
+values ('2', '1002');
+insert into sys_role_menu
+values ('2', '1003');
+insert into sys_role_menu
+values ('2', '1004');
+insert into sys_role_menu
+values ('2', '1005');
+insert into sys_role_menu
+values ('2', '1006');
+insert into sys_role_menu
+values ('2', '1007');
+insert into sys_role_menu
+values ('2', '1008');
+insert into sys_role_menu
+values ('2', '1009');
+insert into sys_role_menu
+values ('2', '1010');
+insert into sys_role_menu
+values ('2', '1011');
+insert into sys_role_menu
+values ('2', '1012');
+insert into sys_role_menu
+values ('2', '1013');
+insert into sys_role_menu
+values ('2', '1014');
+insert into sys_role_menu
+values ('2', '1015');
+insert into sys_role_menu
+values ('2', '1016');
+insert into sys_role_menu
+values ('2', '1017');
+insert into sys_role_menu
+values ('2', '1018');
+insert into sys_role_menu
+values ('2', '1019');
+insert into sys_role_menu
+values ('2', '1020');
+insert into sys_role_menu
+values ('2', '1021');
+insert into sys_role_menu
+values ('2', '1022');
+insert into sys_role_menu
+values ('2', '1023');
+insert into sys_role_menu
+values ('2', '1024');
+insert into sys_role_menu
+values ('2', '1025');
+insert into sys_role_menu
+values ('2', '1026');
+insert into sys_role_menu
+values ('2', '1027');
+insert into sys_role_menu
+values ('2', '1028');
+insert into sys_role_menu
+values ('2', '1029');
+insert into sys_role_menu
+values ('2', '1030');
+insert into sys_role_menu
+values ('2', '1031');
+insert into sys_role_menu
+values ('2', '1032');
+insert into sys_role_menu
+values ('2', '1033');
+insert into sys_role_menu
+values ('2', '1034');
+insert into sys_role_menu
+values ('2', '1035');
+insert into sys_role_menu
+values ('2', '1036');
+insert into sys_role_menu
+values ('2', '1037');
+insert into sys_role_menu
+values ('2', '1038');
+insert into sys_role_menu
+values ('2', '1039');
+insert into sys_role_menu
+values ('2', '1040');
+insert into sys_role_menu
+values ('2', '1041');
+insert into sys_role_menu
+values ('2', '1042');
+insert into sys_role_menu
+values ('2', '1043');
+insert into sys_role_menu
+values ('2', '1044');
+insert into sys_role_menu
+values ('2', '1045');
+insert into sys_role_menu
+values ('2', '1050');
+insert into sys_role_menu
+values ('2', '1046');
+insert into sys_role_menu
+values ('2', '1047');
+insert into sys_role_menu
+values ('2', '1048');
+insert into sys_role_menu
+values ('2', '1055');
+insert into sys_role_menu
+values ('2', '1056');
+insert into sys_role_menu
+values ('2', '1057');
+insert into sys_role_menu
+values ('2', '1058');
+insert into sys_role_menu
+values ('2', '1059');
+insert into sys_role_menu
+values ('2', '1060');
-- ----------------------------
-- 8、角色和部门关联表 角色1-N部门
-- ----------------------------
drop table if exists sys_role_dept;
-create table sys_role_dept (
- role_id bigint(20) not null comment '角色ID',
- dept_id bigint(20) not null comment '部门ID',
- primary key(role_id, dept_id)
-) engine=innodb comment = '角色和部门关联表';
+create table sys_role_dept
+(
+ role_id bigint(20) not null comment '角色ID',
+ dept_id bigint(20) not null comment '部门ID',
+ primary key (role_id, dept_id)
+) engine = innodb comment = '角色和部门关联表';
-- ----------------------------
-- 初始化-角色和部门关联表数据
-- ----------------------------
-insert into sys_role_dept values ('2', '100');
-insert into sys_role_dept values ('2', '101');
-insert into sys_role_dept values ('2', '105');
+insert into sys_role_dept
+values ('2', '100');
+insert into sys_role_dept
+values ('2', '101');
+insert into sys_role_dept
+values ('2', '105');
-- ----------------------------
@@ -480,46 +839,49 @@ insert into sys_role_dept values ('2', '105');
drop table if exists sys_user_post;
create table sys_user_post
(
- user_id bigint(20) not null comment '用户ID',
- post_id bigint(20) not null comment '岗位ID',
- primary key (user_id, post_id)
-) engine=innodb comment = '用户与岗位关联表';
+ user_id bigint(20) not null comment '用户ID',
+ post_id bigint(20) not null comment '岗位ID',
+ primary key (user_id, post_id)
+) engine = innodb comment = '用户与岗位关联表';
-- ----------------------------
-- 初始化-用户与岗位关联表数据
-- ----------------------------
-insert into sys_user_post values ('1', '1');
-insert into sys_user_post values ('2', '2');
+insert into sys_user_post
+values ('1', '1');
+insert into sys_user_post
+values ('2', '2');
-- ----------------------------
-- 10、操作日志记录
-- ----------------------------
drop table if exists sys_oper_log;
-create table sys_oper_log (
- oper_id bigint(20) not null comment '日志主键',
- tenant_id varchar(20) default '000000' comment '租户编号',
- title varchar(50) default '' comment '模块标题',
- business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)',
- method varchar(100) default '' comment '方法名称',
- request_method varchar(10) default '' comment '请求方式',
- operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)',
- oper_name varchar(50) default '' comment '操作人员',
- dept_name varchar(50) default '' comment '部门名称',
- oper_url varchar(255) default '' comment '请求URL',
- oper_ip varchar(128) default '' comment '主机地址',
- oper_location varchar(255) default '' comment '操作地点',
- oper_param varchar(2000) default '' comment '请求参数',
- json_result varchar(2000) default '' comment '返回参数',
- status int(1) default 0 comment '操作状态(0正常 1异常)',
- error_msg varchar(2000) default '' comment '错误消息',
- oper_time datetime comment '操作时间',
- cost_time bigint(20) default 0 comment '消耗时间',
- primary key (oper_id),
- key idx_sys_oper_log_bt (business_type),
- key idx_sys_oper_log_s (status),
- key idx_sys_oper_log_ot (oper_time)
-) engine=innodb comment = '操作日志记录';
+create table sys_oper_log
+(
+ oper_id bigint(20) not null comment '日志主键',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ title varchar(50) default '' comment '模块标题',
+ business_type int(2) default 0 comment '业务类型(0其它 1新增 2修改 3删除)',
+ method varchar(100) default '' comment '方法名称',
+ request_method varchar(10) default '' comment '请求方式',
+ operator_type int(1) default 0 comment '操作类别(0其它 1后台用户 2手机端用户)',
+ oper_name varchar(50) default '' comment '操作人员',
+ dept_name varchar(50) default '' comment '部门名称',
+ oper_url varchar(255) default '' comment '请求URL',
+ oper_ip varchar(128) default '' comment '主机地址',
+ oper_location varchar(255) default '' comment '操作地点',
+ oper_param varchar(2000) default '' comment '请求参数',
+ json_result varchar(2000) default '' comment '返回参数',
+ status int(1) default 0 comment '操作状态(0正常 1异常)',
+ error_msg varchar(2000) default '' comment '错误消息',
+ oper_time datetime comment '操作时间',
+ cost_time bigint(20) default 0 comment '消耗时间',
+ primary key (oper_id),
+ key idx_sys_oper_log_bt (business_type),
+ key idx_sys_oper_log_s (status),
+ key idx_sys_oper_log_ot (oper_time)
+) engine = innodb comment = '操作日志记录';
-- ----------------------------
@@ -528,29 +890,37 @@ create table sys_oper_log (
drop table if exists sys_dict_type;
create table sys_dict_type
(
- dict_id bigint(20) not null comment '字典主键',
- tenant_id varchar(20) default '000000' comment '租户编号',
- dict_name varchar(100) default '' comment '字典名称',
- dict_type varchar(100) default '' comment '字典类型',
- status char(1) default '0' comment '状态(0正常 1停用)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (dict_id),
- unique (tenant_id, dict_type)
-) engine=innodb comment = '字典类型表';
+ dict_id bigint(20) not null comment '字典主键',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ dict_name varchar(100) default '' comment '字典名称',
+ dict_type varchar(100) default '' comment '字典类型',
+ status char(1) default '0' comment '状态(0正常 1停用)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (dict_id),
+ unique (tenant_id, dict_type)
+) engine = innodb comment = '字典类型表';
-insert into sys_dict_type values(1, '000000', '用户性别', 'sys_user_sex', '0', 103, 1, sysdate(), null, null, '用户性别列表');
-insert into sys_dict_type values(2, '000000', '菜单状态', 'sys_show_hide', '0', 103, 1, sysdate(), null, null, '菜单状态列表');
-insert into sys_dict_type values(3, '000000', '系统开关', 'sys_normal_disable', '0', 103, 1, sysdate(), null, null, '系统开关列表');
-insert into sys_dict_type values(6, '000000', '系统是否', 'sys_yes_no', '0', 103, 1, sysdate(), null, null, '系统是否列表');
-insert into sys_dict_type values(7, '000000', '通知类型', 'sys_notice_type', '0', 103, 1, sysdate(), null, null, '通知类型列表');
-insert into sys_dict_type values(8, '000000', '通知状态', 'sys_notice_status', '0', 103, 1, sysdate(), null, null, '通知状态列表');
-insert into sys_dict_type values(9, '000000', '操作类型', 'sys_oper_type', '0', 103, 1, sysdate(), null, null, '操作类型列表');
-insert into sys_dict_type values(10, '000000', '系统状态', 'sys_common_status', '0', 103, 1, sysdate(), null, null, '登录状态列表');
+insert into sys_dict_type
+values (1, '000000', '用户性别', 'sys_user_sex', '0', 103, 1, sysdate(), null, null, '用户性别列表');
+insert into sys_dict_type
+values (2, '000000', '菜单状态', 'sys_show_hide', '0', 103, 1, sysdate(), null, null, '菜单状态列表');
+insert into sys_dict_type
+values (3, '000000', '系统开关', 'sys_normal_disable', '0', 103, 1, sysdate(), null, null, '系统开关列表');
+insert into sys_dict_type
+values (6, '000000', '系统是否', 'sys_yes_no', '0', 103, 1, sysdate(), null, null, '系统是否列表');
+insert into sys_dict_type
+values (7, '000000', '通知类型', 'sys_notice_type', '0', 103, 1, sysdate(), null, null, '通知类型列表');
+insert into sys_dict_type
+values (8, '000000', '通知状态', 'sys_notice_status', '0', 103, 1, sysdate(), null, null, '通知状态列表');
+insert into sys_dict_type
+values (9, '000000', '操作类型', 'sys_oper_type', '0', 103, 1, sysdate(), null, null, '操作类型列表');
+insert into sys_dict_type
+values (10, '000000', '系统状态', 'sys_common_status', '0', 103, 1, sysdate(), null, null, '登录状态列表');
-- ----------------------------
@@ -559,239 +929,313 @@ insert into sys_dict_type values(10, '000000', '系统状态', 'sys_common_statu
drop table if exists sys_dict_data;
create table sys_dict_data
(
- dict_code bigint(20) not null comment '字典编码',
- tenant_id varchar(20) default '000000' comment '租户编号',
- dict_sort int(4) default 0 comment '字典排序',
- dict_label varchar(100) default '' comment '字典标签',
- dict_value varchar(100) default '' comment '字典键值',
- dict_type varchar(100) default '' comment '字典类型',
- css_class varchar(100) default null comment '样式属性(其他样式扩展)',
- list_class varchar(100) default null comment '表格回显样式',
- is_default char(1) default 'N' comment '是否默认(Y是 N否)',
- status char(1) default '0' comment '状态(0正常 1停用)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (dict_code)
-) engine=innodb comment = '字典数据表';
+ dict_code bigint(20) not null comment '字典编码',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ dict_sort int(4) default 0 comment '字典排序',
+ dict_label varchar(100) default '' comment '字典标签',
+ dict_value varchar(100) default '' comment '字典键值',
+ dict_type varchar(100) default '' comment '字典类型',
+ css_class varchar(100) default null comment '样式属性(其他样式扩展)',
+ list_class varchar(100) default null comment '表格回显样式',
+ is_default char(1) default 'N' comment '是否默认(Y是 N否)',
+ status char(1) default '0' comment '状态(0正常 1停用)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (dict_code)
+) engine = innodb comment = '字典数据表';
-insert into sys_dict_data values(1, '000000', 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 103, 1, sysdate(), null, null, '性别男');
-insert into sys_dict_data values(2, '000000', 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 103, 1, sysdate(), null, null, '性别女');
-insert into sys_dict_data values(3, '000000', 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 103, 1, sysdate(), null, null, '性别未知');
-insert into sys_dict_data values(4, '000000', 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null, '显示菜单');
-insert into sys_dict_data values(5, '000000', 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '隐藏菜单');
-insert into sys_dict_data values(6, '000000', 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null, '正常状态');
-insert into sys_dict_data values(7, '000000', 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '停用状态');
-insert into sys_dict_data values(12, '000000', 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null, '系统默认是');
-insert into sys_dict_data values(13, '000000', 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '系统默认否');
-insert into sys_dict_data values(14, '000000', 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 103, 1, sysdate(), null, null, '通知');
-insert into sys_dict_data values(15, '000000', 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 103, 1, sysdate(), null, null, '公告');
-insert into sys_dict_data values(16, '000000', 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null, '正常状态');
-insert into sys_dict_data values(17, '000000', 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '关闭状态');
-insert into sys_dict_data values(29, '000000', 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null, '其他操作');
-insert into sys_dict_data values(18, '000000', 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null, '新增操作');
-insert into sys_dict_data values(19, '000000', 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null, '修改操作');
-insert into sys_dict_data values(20, '000000', 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '删除操作');
-insert into sys_dict_data values(21, '000000', 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 103, 1, sysdate(), null, null, '授权操作');
-insert into sys_dict_data values(22, '000000', 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null, '导出操作');
-insert into sys_dict_data values(23, '000000', 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null, '导入操作');
-insert into sys_dict_data values(24, '000000', 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '强退操作');
-insert into sys_dict_data values(25, '000000', 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null, '生成操作');
-insert into sys_dict_data values(26, '000000', 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '清空操作');
-insert into sys_dict_data values(27, '000000', 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 103, 1, sysdate(), null, null, '正常状态');
-insert into sys_dict_data values(28, '000000', 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '停用状态');
+insert into sys_dict_data
+values (1, '000000', 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 103, 1, sysdate(), null, null, '性别男');
+insert into sys_dict_data
+values (2, '000000', 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 103, 1, sysdate(), null, null, '性别女');
+insert into sys_dict_data
+values (3, '000000', 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 103, 1, sysdate(), null, null, '性别未知');
+insert into sys_dict_data
+values (4, '000000', 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null,
+ '显示菜单');
+insert into sys_dict_data
+values (5, '000000', 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '隐藏菜单');
+insert into sys_dict_data
+values (6, '000000', 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null,
+ '正常状态');
+insert into sys_dict_data
+values (7, '000000', 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '停用状态');
+insert into sys_dict_data
+values (12, '000000', 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null, '系统默认是');
+insert into sys_dict_data
+values (13, '000000', 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null, '系统默认否');
+insert into sys_dict_data
+values (14, '000000', 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 103, 1, sysdate(), null, null,
+ '通知');
+insert into sys_dict_data
+values (15, '000000', 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 103, 1, sysdate(), null, null,
+ '公告');
+insert into sys_dict_data
+values (16, '000000', 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 103, 1, sysdate(), null, null,
+ '正常状态');
+insert into sys_dict_data
+values (17, '000000', 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '关闭状态');
+insert into sys_dict_data
+values (29, '000000', 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null,
+ '其他操作');
+insert into sys_dict_data
+values (18, '000000', 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null, '新增操作');
+insert into sys_dict_data
+values (19, '000000', 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, sysdate(), null, null, '修改操作');
+insert into sys_dict_data
+values (20, '000000', 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '删除操作');
+insert into sys_dict_data
+values (21, '000000', 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 103, 1, sysdate(), null, null,
+ '授权操作');
+insert into sys_dict_data
+values (22, '000000', 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null,
+ '导出操作');
+insert into sys_dict_data
+values (23, '000000', 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null,
+ '导入操作');
+insert into sys_dict_data
+values (24, '000000', 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '强退操作');
+insert into sys_dict_data
+values (25, '000000', 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, sysdate(), null, null,
+ '生成操作');
+insert into sys_dict_data
+values (26, '000000', 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '清空操作');
+insert into sys_dict_data
+values (27, '000000', 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 103, 1, sysdate(), null, null,
+ '正常状态');
+insert into sys_dict_data
+values (28, '000000', 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 103, 1, sysdate(), null, null,
+ '停用状态');
-- ----------------------------
-- 13、参数配置表
-- ----------------------------
drop table if exists sys_config;
-create table sys_config (
- config_id bigint(20) not null comment '参数主键',
- tenant_id varchar(20) default '000000' comment '租户编号',
- config_name varchar(100) default '' comment '参数名称',
- config_key varchar(100) default '' comment '参数键名',
- config_value varchar(500) default '' comment '参数键值',
- config_type char(1) default 'N' comment '系统内置(Y是 N否)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (config_id)
-) engine=innodb comment = '参数配置表';
+create table sys_config
+(
+ config_id bigint(20) not null comment '参数主键',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ config_name varchar(100) default '' comment '参数名称',
+ config_key varchar(100) default '' comment '参数键名',
+ config_value varchar(500) default '' comment '参数键值',
+ config_type char(1) default 'N' comment '系统内置(Y是 N否)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (config_id)
+) engine = innodb comment = '参数配置表';
-insert into sys_config values(1, '000000', '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 103, 1, sysdate(), null, null, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow' );
-insert into sys_config values(2, '000000', '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 103, 1, sysdate(), null, null, '初始化密码 123456' );
-insert into sys_config values(3, '000000', '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 103, 1, sysdate(), null, null, '深色主题theme-dark,浅色主题theme-light' );
-insert into sys_config values(5, '000000', '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 103, 1, sysdate(), null, null, '是否开启注册用户功能(true开启,false关闭)');
-insert into sys_config values(11, '000000', 'OSS预览列表资源开关', 'sys.oss.previewListResource', 'true', 'Y', 103, 1, sysdate(), null, null, 'true:开启, false:关闭');
+insert into sys_config
+values (1, '000000', '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 103, 1, sysdate(), null, null,
+ '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow');
+insert into sys_config
+values (2, '000000', '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 103, 1, sysdate(), null, null,
+ '初始化密码 123456');
+insert into sys_config
+values (3, '000000', '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 103, 1, sysdate(), null, null,
+ '深色主题theme-dark,浅色主题theme-light');
+insert into sys_config
+values (5, '000000', '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 103, 1, sysdate(), null,
+ null, '是否开启注册用户功能(true开启,false关闭)');
+insert into sys_config
+values (11, '000000', 'OSS预览列表资源开关', 'sys.oss.previewListResource', 'true', 'Y', 103, 1, sysdate(), null, null,
+ 'true:开启, false:关闭');
-- ----------------------------
-- 14、系统访问记录
-- ----------------------------
drop table if exists sys_logininfor;
-create table sys_logininfor (
- info_id bigint(20) not null comment '访问ID',
- tenant_id varchar(20) default '000000' comment '租户编号',
- user_name varchar(50) default '' comment '用户账号',
- ipaddr varchar(128) default '' comment '登录IP地址',
- login_location varchar(255) default '' comment '登录地点',
- browser varchar(50) default '' comment '浏览器类型',
- os varchar(50) default '' comment '操作系统',
- status char(1) default '0' comment '登录状态(0成功 1失败)',
- msg varchar(255) default '' comment '提示消息',
- login_time datetime comment '访问时间',
- primary key (info_id),
- key idx_sys_logininfor_s (status),
- key idx_sys_logininfor_lt (login_time)
-) engine=innodb comment = '系统访问记录';
+create table sys_logininfor
+(
+ info_id bigint(20) not null comment '访问ID',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ user_name varchar(50) default '' comment '用户账号',
+ ipaddr varchar(128) default '' comment '登录IP地址',
+ login_location varchar(255) default '' comment '登录地点',
+ browser varchar(50) default '' comment '浏览器类型',
+ os varchar(50) default '' comment '操作系统',
+ status char(1) default '0' comment '登录状态(0成功 1失败)',
+ msg varchar(255) default '' comment '提示消息',
+ login_time datetime comment '访问时间',
+ primary key (info_id),
+ key idx_sys_logininfor_s (status),
+ key idx_sys_logininfor_lt (login_time)
+) engine = innodb comment = '系统访问记录';
-- ----------------------------
-- 17、通知公告表
-- ----------------------------
drop table if exists sys_notice;
-create table sys_notice (
- notice_id bigint(20) not null comment '公告ID',
- tenant_id varchar(20) default '000000' comment '租户编号',
- notice_title varchar(50) not null comment '公告标题',
- notice_type char(1) not null comment '公告类型(1通知 2公告)',
- notice_content longblob default null comment '公告内容',
- status char(1) default '0' comment '公告状态(0正常 1关闭)',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(255) default null comment '备注',
- primary key (notice_id)
-) engine=innodb comment = '通知公告表';
+create table sys_notice
+(
+ notice_id bigint(20) not null comment '公告ID',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ notice_title varchar(50) not null comment '公告标题',
+ notice_type char(1) not null comment '公告类型(1通知 2公告)',
+ notice_content longblob default null comment '公告内容',
+ status char(1) default '0' comment '公告状态(0正常 1关闭)',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(255) default null comment '备注',
+ primary key (notice_id)
+) engine = innodb comment = '通知公告表';
-- ----------------------------
-- 初始化-公告信息表数据
-- ----------------------------
-insert into sys_notice values('1', '000000', '温馨提醒:2018-07-01 新版本发布啦', '2', '新版本内容', '0', 103, 1, sysdate(), null, null, '管理员');
-insert into sys_notice values('2', '000000', '维护通知:2018-07-01 系统凌晨维护', '1', '维护内容', '0', 103, 1, sysdate(), null, null, '管理员');
+insert into sys_notice
+values ('1', '000000', '温馨提醒:2018-07-01 新版本发布啦', '2', '新版本内容', '0', 103, 1, sysdate(), null, null,
+ '管理员');
+insert into sys_notice
+values ('2', '000000', '维护通知:2018-07-01 系统凌晨维护', '1', '维护内容', '0', 103, 1, sysdate(), null, null,
+ '管理员');
-- ----------------------------
-- 18、代码生成业务表
-- ----------------------------
drop table if exists gen_table;
-create table gen_table (
- table_id bigint(20) not null comment '编号',
- data_name varchar(200) default '' comment '数据源名称',
- table_name varchar(200) default '' comment '表名称',
- table_comment varchar(500) default '' comment '表描述',
- sub_table_name varchar(64) default null comment '关联子表的表名',
- sub_table_fk_name varchar(64) default null comment '子表关联的外键名',
- class_name varchar(100) default '' comment '实体类名称',
- tpl_category varchar(200) default 'crud' comment '使用的模板(crud单表操作 tree树表操作)',
- package_name varchar(100) comment '生成包路径',
- module_name varchar(30) comment '生成模块名',
- business_name varchar(30) comment '生成业务名',
- function_name varchar(50) comment '生成功能名',
- function_author varchar(50) comment '生成功能作者',
- gen_type char(1) default '0' comment '生成代码方式(0zip压缩包 1自定义路径)',
- gen_path varchar(200) default '/' comment '生成路径(不填默认项目路径)',
- options varchar(1000) comment '其它生成选项',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (table_id)
-) engine=innodb comment = '代码生成业务表';
+create table gen_table
+(
+ table_id bigint(20) not null comment '编号',
+ data_name varchar(200) default '' comment '数据源名称',
+ table_name varchar(200) default '' comment '表名称',
+ table_comment varchar(500) default '' comment '表描述',
+ sub_table_name varchar(64) default null comment '关联子表的表名',
+ sub_table_fk_name varchar(64) default null comment '子表关联的外键名',
+ class_name varchar(100) default '' comment '实体类名称',
+ tpl_category varchar(200) default 'crud' comment '使用的模板(crud单表操作 tree树表操作)',
+ package_name varchar(100) comment '生成包路径',
+ module_name varchar(30) comment '生成模块名',
+ business_name varchar(30) comment '生成业务名',
+ function_name varchar(50) comment '生成功能名',
+ function_author varchar(50) comment '生成功能作者',
+ gen_type char(1) default '0' comment '生成代码方式(0zip压缩包 1自定义路径)',
+ gen_path varchar(200) default '/' comment '生成路径(不填默认项目路径)',
+ options varchar(1000) comment '其它生成选项',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (table_id)
+) engine = innodb comment = '代码生成业务表';
-- ----------------------------
-- 19、代码生成业务表字段
-- ----------------------------
drop table if exists gen_table_column;
-create table gen_table_column (
- column_id bigint(20) not null comment '编号',
- table_id bigint(20) comment '归属表编号',
- column_name varchar(200) comment '列名称',
- column_comment varchar(500) comment '列描述',
- column_type varchar(100) comment '列类型',
- java_type varchar(500) comment 'JAVA类型',
- java_field varchar(200) comment 'JAVA字段名',
- is_pk char(1) comment '是否主键(1是)',
- is_increment char(1) comment '是否自增(1是)',
- is_required char(1) comment '是否必填(1是)',
- is_insert char(1) comment '是否为插入字段(1是)',
- is_edit char(1) comment '是否编辑字段(1是)',
- is_list char(1) comment '是否列表字段(1是)',
- is_query char(1) comment '是否查询字段(1是)',
- query_type varchar(200) default 'EQ' comment '查询方式(等于、不等于、大于、小于、范围)',
- html_type varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
- dict_type varchar(200) default '' comment '字典类型',
- sort int comment '排序',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime comment '更新时间',
- primary key (column_id)
-) engine=innodb comment = '代码生成业务表字段';
+create table gen_table_column
+(
+ column_id bigint(20) not null comment '编号',
+ table_id bigint(20) comment '归属表编号',
+ column_name varchar(200) comment '列名称',
+ column_comment varchar(500) comment '列描述',
+ column_type varchar(100) comment '列类型',
+ java_type varchar(500) comment 'JAVA类型',
+ java_field varchar(200) comment 'JAVA字段名',
+ is_pk char(1) comment '是否主键(1是)',
+ is_increment char(1) comment '是否自增(1是)',
+ is_required char(1) comment '是否必填(1是)',
+ is_insert char(1) comment '是否为插入字段(1是)',
+ is_edit char(1) comment '是否编辑字段(1是)',
+ is_list char(1) comment '是否列表字段(1是)',
+ is_query char(1) comment '是否查询字段(1是)',
+ query_type varchar(200) default 'EQ' comment '查询方式(等于、不等于、大于、小于、范围)',
+ html_type varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
+ dict_type varchar(200) default '' comment '字典类型',
+ sort int comment '排序',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime comment '更新时间',
+ primary key (column_id)
+) engine = innodb comment = '代码生成业务表字段';
-- ----------------------------
-- OSS对象存储表
-- ----------------------------
drop table if exists sys_oss;
-create table sys_oss (
- oss_id bigint(20) not null comment '对象存储主键',
- tenant_id varchar(20) default '000000' comment '租户编号',
- file_name varchar(255) not null default '' comment '文件名',
- original_name varchar(255) not null default '' comment '原名',
- file_suffix varchar(10) not null default '' comment '文件后缀名',
- url varchar(500) not null comment 'URL地址',
- create_dept bigint(20) default null comment '创建部门',
- create_time datetime default null comment '创建时间',
- create_by bigint(20) default null comment '上传人',
- update_time datetime default null comment '更新时间',
- update_by bigint(20) default null comment '更新人',
- service varchar(20) not null default 'minio' comment '服务商',
- primary key (oss_id)
-) engine=innodb comment ='OSS对象存储表';
+create table sys_oss
+(
+ oss_id bigint(20) not null comment '对象存储主键',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ file_name varchar(255) not null default '' comment '文件名',
+ original_name varchar(255) not null default '' comment '原名',
+ file_suffix varchar(10) not null default '' comment '文件后缀名',
+ url varchar(500) not null comment 'URL地址',
+ create_dept bigint(20) default null comment '创建部门',
+ create_time datetime default null comment '创建时间',
+ create_by bigint(20) default null comment '上传人',
+ update_time datetime default null comment '更新时间',
+ update_by bigint(20) default null comment '更新人',
+ service varchar(20) not null default 'minio' comment '服务商',
+ primary key (oss_id)
+) engine = innodb comment ='OSS对象存储表';
-- ----------------------------
-- OSS对象存储动态配置表
-- ----------------------------
drop table if exists sys_oss_config;
-create table sys_oss_config (
- oss_config_id bigint(20) not null comment '主建',
- tenant_id varchar(20) default '000000'comment '租户编号',
- config_key varchar(20) not null default '' comment '配置key',
- access_key varchar(255) default '' comment 'accessKey',
- secret_key varchar(255) default '' comment '秘钥',
- bucket_name varchar(255) default '' comment '桶名称',
- prefix varchar(255) default '' comment '前缀',
- endpoint varchar(255) default '' comment '访问站点',
- domain varchar(255) default '' comment '自定义域名',
- is_https char(1) default 'N' comment '是否https(Y=是,N=否)',
- region varchar(255) default '' comment '域',
- access_policy char(1) not null default '1' comment '桶权限类型(0=private 1=public 2=custom)',
- status char(1) default '1' comment '是否默认(0=是,1=否)',
- ext1 varchar(255) default '' comment '扩展字段',
- create_dept bigint(20) default null comment '创建部门',
- create_by bigint(20) default null comment '创建者',
- create_time datetime default null comment '创建时间',
- update_by bigint(20) default null comment '更新者',
- update_time datetime default null comment '更新时间',
- remark varchar(500) default null comment '备注',
- primary key (oss_config_id)
-) engine=innodb comment='对象存储配置表';
+create table sys_oss_config
+(
+ oss_config_id bigint(20) not null comment '主建',
+ tenant_id varchar(20) default '000000' comment '租户编号',
+ config_key varchar(20) not null default '' comment '配置key',
+ access_key varchar(255) default '' comment 'accessKey',
+ secret_key varchar(255) default '' comment '秘钥',
+ bucket_name varchar(255) default '' comment '桶名称',
+ prefix varchar(255) default '' comment '前缀',
+ endpoint varchar(255) default '' comment '访问站点',
+ domain varchar(255) default '' comment '自定义域名',
+ is_https char(1) default 'N' comment '是否https(Y=是,N=否)',
+ region varchar(255) default '' comment '域',
+ access_policy char(1) not null default '1' comment '桶权限类型(0=private 1=public 2=custom)',
+ status char(1) default '1' comment '是否默认(0=是,1=否)',
+ ext1 varchar(255) default '' comment '扩展字段',
+ create_dept bigint(20) default null comment '创建部门',
+ create_by bigint(20) default null comment '创建者',
+ create_time datetime default null comment '创建时间',
+ update_by bigint(20) default null comment '更新者',
+ update_time datetime default null comment '更新时间',
+ remark varchar(500) default null comment '备注',
+ primary key (oss_config_id)
+) engine = innodb comment ='对象存储配置表';
-insert into sys_oss_config values (1, '000000', 'minio', 'ruoyi', 'ruoyi123', 'ruoyi', '', '127.0.0.1:9000', '','N', '', '1' ,'0', '', 103, 1, sysdate(), 1, sysdate(), NULL);
-insert into sys_oss_config values (2, '000000', 'qiniu', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 's3-cn-north-1.qiniucs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
-insert into sys_oss_config values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 'oss-cn-beijing.aliyuncs.com', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
-insert into sys_oss_config values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '', 'cos.ap-beijing.myqcloud.com', '','N', 'ap-beijing', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
-insert into sys_oss_config values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '','N', '', '1' ,'1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
+insert into sys_oss_config
+values (1, '000000', 'minio', 'ruoyi', 'ruoyi123', 'ruoyi', '', '127.0.0.1:9000', '', 'N', '', '1', '0', '', 103, 1,
+ sysdate(), 1, sysdate(), NULL);
+insert into sys_oss_config
+values (2, '000000', 'qiniu', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 's3-cn-north-1.qiniucs.com', '', 'N',
+ '', '1', '1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
+insert into sys_oss_config
+values (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 'oss-cn-beijing.aliyuncs.com', '',
+ 'N', '', '1', '1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
+insert into sys_oss_config
+values (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi-1250000000', '',
+ 'cos.ap-beijing.myqcloud.com', '', 'N', 'ap-beijing', '1', '1', '', 103, 1, sysdate(), 1, sysdate(), NULL);
+insert into sys_oss_config
+values (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '', 'N', '', '1', '1', '', 103,
+ 1, sysdate(), 1, sysdate(), NULL);
From 5110961eb98d820881a7c4a218e9e93fea07870e Mon Sep 17 00:00:00 2001
From: thiszhc <2029364173@qq.com>
Date: Thu, 15 Jun 2023 01:23:07 +0800
Subject: [PATCH 4/6] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E6=8E=88?=
=?UTF-8?q?=E6=9D=83=E7=99=BB=E5=BD=95,=E5=8A=A0=E4=B8=8A=E9=85=8D?=
=?UTF-8?q?=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../web/controller/AuthController.java | 87 ++++++++++
.../src/main/resources/application-dev.yml | 148 ++++++++++++++++++
.../dromara/common/core/enums/DeviceType.java | 7 +-
.../config/properties/ConfigProperties.java | 58 +++++++
.../social/utils/AuthRedisStateCache.java | 79 ++++++++++
5 files changed, 378 insertions(+), 1 deletion(-)
create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java
create mode 100644 ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index bba6113da..f46cbdc38 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -2,9 +2,18 @@ package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSON;
+import cn.hutool.json.JSONUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
+import me.zhyd.oauth.cache.AuthStateCache;
+import me.zhyd.oauth.model.AuthCallback;
+import me.zhyd.oauth.model.AuthResponse;
+import me.zhyd.oauth.model.AuthUser;
+import me.zhyd.oauth.request.AuthRequest;
+import me.zhyd.oauth.utils.AuthStateUtils;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.domain.model.EmailLoginBody;
import org.dromara.common.core.domain.model.LoginBody;
@@ -13,9 +22,16 @@ import org.dromara.common.core.domain.model.SmsLoginBody;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.social.config.SocialConfig;
+import org.dromara.common.social.config.properties.ConfigProperties;
+import org.dromara.common.social.config.properties.SocialProperties;
+import org.dromara.common.social.utils.AuthRedisStateCache;
+import org.dromara.common.social.utils.SocialUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysTenantVo;
+import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.service.ISocialUserService;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysTenantService;
import org.dromara.web.domain.vo.LoginTenantVo;
@@ -26,8 +42,10 @@ import org.dromara.web.service.SysRegisterService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
+import java.io.IOException;
import java.net.URL;
import java.util.List;
+import java.util.Map;
/**
* 认证
@@ -41,10 +59,14 @@ import java.util.List;
@RequestMapping("/auth")
public class AuthController {
+ private final SocialProperties socialProperties;
private final SysLoginService loginService;
private final SysRegisterService registerService;
private final ISysConfigService configService;
private final ISysTenantService tenantService;
+ private final ISocialUserService socialUserService;
+
+
/**
* 登录方法
@@ -115,6 +137,71 @@ public class AuthController {
return R.ok(loginVo);
}
+
+ /**
+ * 认证授权
+ * @param source
+ */
+ @GetMapping("/binding/{source}")
+ @ResponseBody
+ public R authBinding(@PathVariable("source") String source, HttpServletRequest request){
+ SysUserVo userLoding = new SysUserVo();
+ if (ObjectUtil.isNull(userLoding)) {
+ return R.fail("授权失败,请先登录再绑定");
+ }
+ if (socialUserService.isExistByUserIdAndSource(userLoding.getUserId(),source))
+ {
+ return R.fail(source + "平台账号已经被账号绑定");
+ }
+ ConfigProperties obj = socialProperties.getType().get(source);
+ if (ObjectUtil.isNull(obj)){
+ return R.fail(source + "平台账号暂不支持");
+ }
+ AuthRequest authRequest = SocialUtils.getAuthRequest(source,
+ obj.getClientId(),
+ obj.getClientSecret(),
+ obj.getRedirectUri());
+ String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
+ return R.ok(authorizeUrl);
+ }
+
+ /**
+ * 第三方登录回调业务处理
+ * @param source
+ * @param callback
+ * @param request
+ * @return
+ */
+ @SuppressWarnings("unchecked")
+ @GetMapping("/social-login/{source}")
+ public R socialLogin(@PathVariable("source") String source, AuthCallback callback, HttpServletRequest request) throws IOException {
+ ConfigProperties obj = socialProperties.getType().get(source);
+ if (ObjectUtil.isNull(obj)){
+ return R.fail(source + "平台账号暂不支持");
+ }
+ AuthRequest authRequest = SocialUtils.getAuthRequest(source,
+ obj.getClientId(),
+ obj.getClientSecret(),
+ obj.getRedirectUri());
+ AuthResponse response = authRequest.login(callback);
+ return loginService.socialLogin(source, response, request);
+ }
+
+ /**
+ * 取消授权
+ * @param socialId
+ */
+ @DeleteMapping(value = "/unlock/{socialId}")
+ public R unlockSocial(@PathVariable Long socialId)
+ {
+ Boolean rows = socialUserService.deleteWithValidById(socialId);
+ return rows ? R.ok() : R.fail("取消授权失败");
+ }
+
+
+
+
+
/**
* 退出登录
*/
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 92a3640e9..78cad6ed1 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -169,3 +169,151 @@ sms:
signName: 测试
# 腾讯专用
sdkAppId:
+
+justauth:
+ enabled: true
+ type:
+ QQ:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/qq/callback
+ union-id: false
+ WEIBO:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/weibo/callback
+ gitee:
+ client-id: 38eaaa1b77b5e064313057a2f5745ce3a9f3e7686d9bd302c7df2f308ef6db81
+ client-secret: 2e633af8780cb9fe002c4c7291b722db944402e271efb99b062811f52d7da1ff
+ redirect-uri: http://localhost:8888/social-login?source=gitee
+ DINGTALK:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/dingtalk/callback
+ BAIDU:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/baidu/callback
+ CSDN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/csdn/callback
+ CODING:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/coding/callback
+ coding-group-name: xx
+ OSCHINA:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/oschina/callback
+ ALIPAY:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/alipay/callback
+ alipay-public-key: MIIB**************DAQAB
+ WECHAT_OPEN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_open/callback
+ WECHAT_MP:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_mp/callback
+ WECHAT_ENTERPRISE:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_enterprise/callback
+ agent-id: 1000002
+ TAOBAO:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/taobao/callback
+ GOOGLE:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/google/callback
+ FACEBOOK:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/facebook/callback
+ DOUYIN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/douyin/callback
+ LINKEDIN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/linkedin/callback
+ MICROSOFT:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/microsoft/callback
+ MI:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/mi/callback
+ TOUTIAO:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/toutiao/callback
+ TEAMBITION:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/teambition/callback
+ RENREN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/renren/callback
+ PINTEREST:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/pinterest/callback
+ STACK_OVERFLOW:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/stack_overflow/callback
+ stack-overflow-key: asd*********asd
+ HUAWEI:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/huawei/callback
+ KUJIALE:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/kujiale/callback
+ GITLAB:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/gitlab/callback
+ MEITUAN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/meituan/callback
+ ELEME:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/eleme/callback
+ TWITTER:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/twitter/callback
+ XMLY:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/xmly/callback
+ # 设备唯一标识ID
+ device-id: xxxxxxxxxxxxxx
+ # 客户端操作系统类型,1-iOS系统,2-Android系统,3-Web
+ client-os-type: 3
+ # 客户端包名,如果 clientOsType 为1或2时必填。对Android客户端是包名,对IOS客户端是Bundle ID
+ #pack-id: xxxx
+ FEISHU:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/feishu/callback
+ JD:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/jd/callback
+
diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
index 09bf44b6d..dbadfc2de 100644
--- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
+++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/enums/DeviceType.java
@@ -26,7 +26,12 @@ public enum DeviceType {
/**
* 小程序端
*/
- XCX("xcx");
+ XCX("xcx"),
+
+ /**
+ * social第三方端
+ */
+ SOCIAL("social");
private final String device;
}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java
new file mode 100644
index 000000000..813b03a6d
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java
@@ -0,0 +1,58 @@
+package org.dromara.common.social.config.properties;
+
+import lombok.Data;
+
+@Data
+public class ConfigProperties {
+
+ /**
+ * 应用 ID
+ */
+ private String clientId;
+
+ /**
+ * 应用密钥
+ */
+ private String clientSecret;
+
+ /**
+ * 回调地址
+ */
+ private String redirectUri;
+
+ /**
+ * 是否获取unionId
+ */
+ private boolean unionId;
+
+ /**
+ * Coding 企业名称
+ */
+ private String codingGroupName;
+
+ /**
+ * 支付宝公钥
+ */
+ private String alipayPublicKey;
+
+ /**
+ * 企业微信应用ID
+ */
+ private String agentId;
+
+ /**
+ * stackoverflow api key
+ */
+ private String stackOverflowKey;
+
+ /**
+ * 设备ID
+ */
+ private String deviceId;
+
+ /**
+ * 客户端系统类型
+ */
+ private String clientOsType;
+
+}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
new file mode 100644
index 000000000..f438a1c85
--- /dev/null
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
@@ -0,0 +1,79 @@
+package org.dromara.common.social.utils;
+
+import jakarta.annotation.PostConstruct;
+import me.zhyd.oauth.cache.AuthStateCache;
+import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.social.config.properties.SocialProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+
+import java.time.Duration;
+
+public class AuthRedisStateCache implements AuthStateCache {
+
+ private final SocialProperties socialProperties;
+ private final RedisTemplate redisTemplate;
+
+ private ValueOperations valueOperations;
+
+ @PostConstruct
+ public void init() {
+ valueOperations = redisTemplate.opsForValue();
+ }
+
+
+ public AuthRedisStateCache() {
+ this.socialProperties = new SocialProperties();
+ redisTemplate = new RedisTemplate<>();
+ }
+
+ /**
+ * 存入缓存
+ *
+ * @param key 缓存key
+ * @param value 缓存内容
+ */
+ @Override
+ public void cache(String key, String value) {
+ // TODO: 自定义存入缓存
+ RedisUtils.setCacheObject(key, value, Duration.ofMillis(socialProperties.getTimeout()));
+ }
+
+ /**
+ * 存入缓存
+ *
+ * @param key 缓存key
+ * @param value 缓存内容
+ * @param timeout 指定缓存过期时间(毫秒)
+ */
+ @Override
+ public void cache(String key, String value, long timeout) {
+ // TODO: 自定义存入缓存
+ RedisUtils.setCacheObject(key, value, Duration.ofMillis(timeout));
+ }
+
+ /**
+ * 获取缓存内容
+ *
+ * @param key 缓存key
+ * @return 缓存内容
+ */
+ @Override
+ public String get(String key) {
+ // TODO: 自定义获取缓存内容
+ return RedisUtils.getCacheObject(key);
+ }
+
+ /**
+ * 是否存在key,如果对应key的value值已过期,也返回false
+ *
+ * @param key 缓存key
+ * @return true:存在key,并且value没过期;false:key不存在或者已过期
+ */
+ @Override
+ public boolean containsKey(String key) {
+ // TODO: 自定义判断key是否存在
+ return RedisUtils.hasKey(key);
+ }
+}
From 005e7df1b8d7733b459c24104bc775c52e528454 Mon Sep 17 00:00:00 2001
From: thiszhc <2029364173@qq.com>
Date: Thu, 15 Jun 2023 19:30:17 +0800
Subject: [PATCH 5/6] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=AC=AC=E4=B8=89?=
=?UTF-8?q?=E6=96=B9=E6=8E=88=E6=9D=83=E7=99=BB=E5=BD=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ruoyi-admin/pom.xml | 14 ++-
.../web/controller/AuthController.java | 12 +-
.../dromara/web/service/SysLoginService.java | 72 ++++++------
ruoyi-common/ruoyi-common-bom/pom.xml | 6 +
ruoyi-common/ruoyi-common-social/pom.xml | 23 ++--
.../common/social/config/SocialConfig.java | 2 +-
....java => SocialLoginConfigProperties.java} | 2 +-
.../config/properties/SocialProperties.java | 2 +-
.../social/utils/AuthRedisStateCache.java | 16 +--
.../common/social/utils/SocialUtils.java | 20 ++--
.../system/SocialUserController.java | 105 ------------------
.../system/service/ISocialUserService.java | 24 ----
.../service/impl/SocialUserServiceImpl.java | 69 ------------
.../mapper/system/SocialUserMapper.xml | 58 ++--------
script/sql/ry_vue_5.X.sql | 69 ++++++------
15 files changed, 113 insertions(+), 381 deletions(-)
rename ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/{ConfigProperties.java => SocialLoginConfigProperties.java} (94%)
delete mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml
index e57c444a7..39731b1aa 100644
--- a/ruoyi-admin/pom.xml
+++ b/ruoyi-admin/pom.xml
@@ -43,6 +43,12 @@
ruoyi-common-doc
+
+ org.dromara
+ ruoyi-common-social
+
+
+
org.dromara
ruoyi-system
@@ -75,16 +81,12 @@
spring-boot-starter-test
test
+
me.zhyd.oauth
JustAuth
-
- org.dromara
- ruoyi-common-social
- 5.1.0-SNAPSHOT
- compile
-
+
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index f46cbdc38..8cb96cd69 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -3,12 +3,9 @@ package org.dromara.web.controller;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.json.JSON;
-import cn.hutool.json.JSONUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
-import me.zhyd.oauth.cache.AuthStateCache;
import me.zhyd.oauth.model.AuthCallback;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
@@ -22,10 +19,8 @@ import org.dromara.common.core.domain.model.SmsLoginBody;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.social.config.SocialConfig;
-import org.dromara.common.social.config.properties.ConfigProperties;
+import org.dromara.common.social.config.properties.SocialLoginConfigProperties;
import org.dromara.common.social.config.properties.SocialProperties;
-import org.dromara.common.social.utils.AuthRedisStateCache;
import org.dromara.common.social.utils.SocialUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.bo.SysTenantBo;
@@ -45,7 +40,6 @@ import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URL;
import java.util.List;
-import java.util.Map;
/**
* 认证
@@ -153,7 +147,7 @@ public class AuthController {
{
return R.fail(source + "平台账号已经被账号绑定");
}
- ConfigProperties obj = socialProperties.getType().get(source);
+ SocialLoginConfigProperties obj = socialProperties.getType().get(source);
if (ObjectUtil.isNull(obj)){
return R.fail(source + "平台账号暂不支持");
}
@@ -175,7 +169,7 @@ public class AuthController {
@SuppressWarnings("unchecked")
@GetMapping("/social-login/{source}")
public R socialLogin(@PathVariable("source") String source, AuthCallback callback, HttpServletRequest request) throws IOException {
- ConfigProperties obj = socialProperties.getType().get(source);
+ SocialLoginConfigProperties obj = socialProperties.getType().get(source);
if (ObjectUtil.isNull(obj)){
return R.fail(source + "平台账号暂不支持");
}
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index 3628b05d7..84c554d14 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -44,6 +44,7 @@ import org.dromara.system.service.ISocialUserService;
import org.dromara.system.service.ISysPermissionService;
import org.dromara.system.service.ISysTenantService;
import org.dromara.system.service.ISysUserService;
+import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -181,27 +182,49 @@ public class SysLoginService {
return R.fail("对不起,授权信息验证不通过,请退出重试!");
}
AuthUser authUserData = authUser.getData();
- // 查询社交用户信息,判断是否已经绑定,如果已经绑定则直接登录,否则验证是否登录,未登录则先登录再绑定
- SocialUserVo user = socialUserService.selectSocialUserByAuthId(source + authUserData.getUuid());
+ String authId = source + authUserData.getUuid();
+
+ SocialUserVo user = socialUserService.selectSocialUserByAuthId(authId);
if (ObjectUtil.isNotNull(user)) {
- checkTenant(user.getTenantId());
- SysUserVo dbUser = loadUserByUsername(user.getTenantId(), user.getUserName());
- LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.SOCIAL);
- recordLogininfor(dbUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
- recordLoginInfo(user.getUserId());
+ //执行登录和记录登录信息操作
+ return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData);
} else {
// 判断是否已登录
if (LoginHelper.getUserId() == null) {
return R.fail("授权失败,请先登录再绑定");
}
SocialUserBo socialUserBo = new SocialUserBo();
- socialUserService.insertByBo(setAuthUserData(authUserData, socialUserBo));
+ socialUserBo.setUserId(LoginHelper.getUserId());
+ socialUserBo.setAuthId(authUserData.getSource() + authUserData.getUuid());
+ socialUserBo.setSource(authUserData.getSource());
+ socialUserBo.setUserName(authUserData.getUsername());
+ socialUserBo.setNickName(authUserData.getNickname());
+ socialUserBo.setAvatar(authUserData.getAvatar());
+ socialUserBo.setOpenId(authUserData.getUuid());
+ BeanUtils.copyProperties(authUserData, socialUserBo);
+ BeanUtils.copyProperties(authUserData.getToken(), socialUserBo);
+
+ socialUserService.insertByBo(socialUserBo);
SysUserVo lodingData = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername());
- checkTenant(lodingData.getTenantId());
- LoginHelper.loginByDevice(buildLoginUser(lodingData), DeviceType.SOCIAL);
- recordLogininfor(lodingData.getTenantId(), socialUserBo.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
- recordLoginInfo(socialUserBo.getUserId());
+ //执行登录和记录登录信息操作
+ return loginAndRecord(lodingData.getTenantId(), socialUserBo.getUserName(), authUserData);
}
+ }
+
+ /**
+ * 执行登录和记录登录信息操作
+ *
+ * @param tenantId 租户ID
+ * @param userName 用户名
+ * @param authUser 授权用户信息
+ * @return 统一响应实体
+ */
+ private R loginAndRecord(String tenantId, String userName, AuthUser authUser) {
+ checkTenant(tenantId);
+ SysUserVo dbUser = loadUserByUsername(tenantId, userName);
+ LoginHelper.loginByDevice(buildLoginUser(dbUser), DeviceType.SOCIAL);
+ recordLogininfor(dbUser.getTenantId(), userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+ recordLoginInfo(dbUser.getUserId());
return R.ok(StpUtil.getTokenValue());
}
@@ -440,29 +463,4 @@ public class SysLoginService {
}
}
-
- public SocialUserBo setAuthUserData(AuthUser authUserData, SocialUserBo socialUser) {
- socialUser.setUserId(LoginHelper.getUserId());
- socialUser.setAuthId(authUserData.getSource() + authUserData.getUuid());
- socialUser.setSource(authUserData.getSource());
- socialUser.setUserName(authUserData.getUsername());
- socialUser.setNickName(authUserData.getNickname());
- socialUser.setAvatar(authUserData.getAvatar());
- socialUser.setEmail(authUserData.getEmail());
- socialUser.setOpenId(authUserData.getUuid());
- socialUser.setAccessToken(authUserData.getToken().getAccessToken());
- socialUser.setExpireIn(authUserData.getToken().getExpireIn());
- socialUser.setRefreshToken(authUserData.getToken().getRefreshToken());
- socialUser.setAccessCode(authUserData.getToken().getAccessCode());
- socialUser.setUnionId(authUserData.getToken().getUnionId());
- socialUser.setScope(authUserData.getToken().getScope());
- socialUser.setTokenType(authUserData.getToken().getTokenType());
- socialUser.setIdToken(authUserData.getToken().getIdToken());
- socialUser.setMacAlgorithm(authUserData.getToken().getMacAlgorithm());
- socialUser.setMacKey(authUserData.getToken().getMacKey());
- socialUser.setCode(authUserData.getToken().getCode());
- socialUser.setOauthToken(authUserData.getToken().getOauthToken());
- socialUser.setOauthTokenSecret(authUserData.getToken().getOauthTokenSecret());
- return socialUser;
- }
}
diff --git a/ruoyi-common/ruoyi-common-bom/pom.xml b/ruoyi-common/ruoyi-common-bom/pom.xml
index 8a9e25a95..cac678c22 100644
--- a/ruoyi-common/ruoyi-common-bom/pom.xml
+++ b/ruoyi-common/ruoyi-common-bom/pom.xml
@@ -117,6 +117,12 @@
${revision}
+
+ org.dromara
+ ruoyi-common-social
+ ${revision}
+
+
org.dromara
diff --git a/ruoyi-common/ruoyi-common-social/pom.xml b/ruoyi-common/ruoyi-common-social/pom.xml
index b87479b4b..77135a6d3 100644
--- a/ruoyi-common/ruoyi-common-social/pom.xml
+++ b/ruoyi-common/ruoyi-common-social/pom.xml
@@ -1,35 +1,26 @@
-
org.dromara
ruoyi-common
${revision}
- ../pom.xml
4.0.0
+
ruoyi-common-social
+
- ruoyi-common-auth 认证模块
+ ruoyi-common-social 授权认证
+
me.zhyd.oauth
JustAuth
-
- org.projectlombok
- lombok
-
-
- org.springframework.boot
- spring-boot
-
-
- org.springframework.boot
- spring-boot-autoconfigure
-
+
org.dromara
ruoyi-common-redis
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
index c50c56038..7a9a16637 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/SocialConfig.java
@@ -17,7 +17,7 @@ import org.springframework.context.annotation.Bean;
public class SocialConfig {
@Bean
- public AuthStateCache redis() {
+ public AuthStateCache authStateCache() {
return new AuthRedisStateCache();
}
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java
similarity index 94%
rename from ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java
rename to ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java
index 813b03a6d..2b63c1eea 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/ConfigProperties.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java
@@ -3,7 +3,7 @@ package org.dromara.common.social.config.properties;
import lombok.Data;
@Data
-public class ConfigProperties {
+public class SocialLoginConfigProperties {
/**
* 应用 ID
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
index 4240ebabd..811d821ff 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java
@@ -24,7 +24,7 @@ public class SocialProperties {
/**
* 授权类型
*/
- private Map type;
+ private Map type;
/**
* 授权过期时间
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
index f438a1c85..f7f239294 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java
@@ -12,21 +12,7 @@ import java.time.Duration;
public class AuthRedisStateCache implements AuthStateCache {
- private final SocialProperties socialProperties;
- private final RedisTemplate redisTemplate;
-
- private ValueOperations valueOperations;
-
- @PostConstruct
- public void init() {
- valueOperations = redisTemplate.opsForValue();
- }
-
-
- public AuthRedisStateCache() {
- this.socialProperties = new SocialProperties();
- redisTemplate = new RedisTemplate<>();
- }
+ private SocialProperties socialProperties;
/**
* 存入缓存
diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
index b3a1cd1f4..64e84e79d 100644
--- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
+++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java
@@ -19,17 +19,17 @@ public class SocialUtils {
AuthRequest authRequest = null;
switch (source.toLowerCase()) {
case "dingtalk" ->
- authRequest = new AuthDingTalkRequest(AuthConfig.builder().
- clientId(clientId).
- clientSecret(clientSecret)
- .redirectUri(redirectUri).
- build());
+ authRequest = new AuthDingTalkRequest(AuthConfig.builder()
+ .clientId(clientId)
+ .clientSecret(clientSecret)
+ .redirectUri(redirectUri)
+ .build());
case "baidu" ->
- authRequest = new AuthBaiduRequest(AuthConfig.builder().
- clientId(clientId).
- clientSecret(clientSecret)
- .redirectUri(redirectUri).
- build());
+ authRequest = new AuthBaiduRequest(AuthConfig.builder()
+ .clientId(clientId)
+ .clientSecret(clientSecret)
+ .redirectUri(redirectUri)
+ .build());
case "github" ->
authRequest = new AuthGithubRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret)
.redirectUri(redirectUri).build());
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
deleted file mode 100644
index 91994062f..000000000
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
+++ /dev/null
@@ -1,105 +0,0 @@
-package org.dromara.system.controller.system;
-
-import java.util.List;
-
-import lombok.RequiredArgsConstructor;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.validation.constraints.*;
-import cn.dev33.satoken.annotation.SaCheckPermission;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.validation.annotation.Validated;
-import org.dromara.common.idempotent.annotation.RepeatSubmit;
-import org.dromara.common.log.annotation.Log;
-import org.dromara.common.web.core.BaseController;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.common.core.domain.R;
-import org.dromara.common.core.validate.AddGroup;
-import org.dromara.common.core.validate.EditGroup;
-import org.dromara.common.log.enums.BusinessType;
-import org.dromara.common.excel.utils.ExcelUtil;
-import org.dromara.system.domain.vo.SocialUserVo;
-import org.dromara.system.domain.bo.SocialUserBo;
-import org.dromara.system.service.ISocialUserService;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-
-/**
- * 社会化关系
- *
- * @author thiszhc
- * @date 2023-06-12
- */
-@Validated
-@RequiredArgsConstructor
-@RestController
-@RequestMapping("/system/socialUser")
-public class SocialUserController extends BaseController {
-
- private final ISocialUserService socialUserService;
-
- /**
- * 查询社会化关系列表
- */
- @SaCheckPermission("system:user:list")
- @GetMapping("/list")
- public TableDataInfo list(SocialUserBo bo, PageQuery pageQuery) {
- return socialUserService.queryPageList(bo, pageQuery);
- }
-
- /**
- * 导出社会化关系列表
- */
- @SaCheckPermission("system:user:export")
- @Log(title = "社会化关系", businessType = BusinessType.EXPORT)
- @PostMapping("/export")
- public void export(SocialUserBo bo, HttpServletResponse response) {
- List list = socialUserService.queryList(bo);
- ExcelUtil.exportExcel(list, "社会化关系", SocialUserVo.class, response);
- }
-
- /**
- * 获取社会化关系详细信息
- *
- * @param id 主键
- */
- @SaCheckPermission("system:user:query")
- @GetMapping("/{id}")
- public R getInfo(@NotNull(message = "主键不能为空")
- @PathVariable Long id) {
- return R.ok(socialUserService.queryById(id));
- }
-
- /**
- * 新增社会化关系
- */
- @SaCheckPermission("system:user:add")
- @Log(title = "社会化关系", businessType = BusinessType.INSERT)
- @RepeatSubmit()
- @PostMapping()
- public R add(@Validated(AddGroup.class) @RequestBody SocialUserBo bo) {
- return toAjax(socialUserService.insertByBo(bo));
- }
-
- /**
- * 修改社会化关系
- */
- @SaCheckPermission("system:user:edit")
- @Log(title = "社会化关系", businessType = BusinessType.UPDATE)
- @RepeatSubmit()
- @PutMapping()
- public R edit(@Validated(EditGroup.class) @RequestBody SocialUserBo bo) {
- return toAjax(socialUserService.updateByBo(bo));
- }
-
- /**
- * 删除社会化关系
- *
- * @param ids 主键串
- */
- @SaCheckPermission("system:user:remove")
- @Log(title = "社会化关系", businessType = BusinessType.DELETE)
- @DeleteMapping("/{ids}")
- public R remove(@NotEmpty(message = "主键不能为空")
- @PathVariable Long[] ids) {
- return toAjax(socialUserService.deleteWithValidByIds(List.of(ids), true));
- }
-}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
index f16cf1646..d9e87f7d7 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
@@ -19,35 +19,11 @@ import java.util.List;
*/
public interface ISocialUserService {
- /**
- * 查询授权关系
- */
- SocialUserVo queryById(Long id);
-
- /**
- * 查询授权列表
- */
- TableDataInfo queryPageList(SocialUserBo bo, PageQuery pageQuery);
-
- /**
- * 查询授权列表
- */
- List queryList(SocialUserBo bo);
-
/**
* 新增授权关系
*/
Boolean insertByBo(SocialUserBo bo);
- /**
- * 修改授权关系
- */
- Boolean updateByBo(SocialUserBo bo);
-
- /**
- * 校验并批量删除社会化关系信息
- */
- Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
/**
* 删除社会化关系信息
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
index c130fb7e6..fc342445b 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
@@ -33,56 +33,6 @@ public class SocialUserServiceImpl implements ISocialUserService {
private final SocialUserMapper baseMapper;
- /**
- * 查询社会化关系
- */
- @Override
- public SocialUserVo queryById(Long id) {
- return baseMapper.selectVoById(id);
- }
-
- /**
- * 查询社会化关系列表
- */
- @Override
- public TableDataInfo queryPageList(SocialUserBo bo, PageQuery pageQuery) {
- LambdaQueryWrapper lqw = buildQueryWrapper(bo);
- Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
- return TableDataInfo.build(result);
- }
-
- /**
- * 查询社会化关系列表
- */
- @Override
- public List queryList(SocialUserBo bo) {
- LambdaQueryWrapper lqw = buildQueryWrapper(bo);
- return baseMapper.selectVoList(lqw);
- }
-
- private LambdaQueryWrapper buildQueryWrapper(SocialUserBo bo) {
- Map params = bo.getParams();
- LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
- lqw.eq(StringUtils.isNotBlank(bo.getAuthId()), SocialUser::getAuthId, bo.getAuthId());
- lqw.eq(StringUtils.isNotBlank(bo.getSource()), SocialUser::getSource, bo.getSource());
- lqw.eq(StringUtils.isNotBlank(bo.getAccessToken()), SocialUser::getAccessToken, bo.getAccessToken());
- lqw.eq(bo.getExpireIn() != 0, SocialUser::getExpireIn, bo.getExpireIn());
- lqw.eq(StringUtils.isNotBlank(bo.getRefreshToken()), SocialUser::getRefreshToken, bo.getRefreshToken());
- lqw.eq(StringUtils.isNotBlank(bo.getOpenId()), SocialUser::getOpenId, bo.getOpenId());
- lqw.eq(StringUtils.isNotBlank(bo.getScope()), SocialUser::getScope, bo.getScope());
- lqw.eq(StringUtils.isNotBlank(bo.getAccessCode()), SocialUser::getAccessCode, bo.getAccessCode());
- lqw.eq(StringUtils.isNotBlank(bo.getUnionId()), SocialUser::getUnionId, bo.getUnionId());
- lqw.eq(StringUtils.isNotBlank(bo.getScope()), SocialUser::getScope, bo.getScope());
- lqw.eq(StringUtils.isNotBlank(bo.getTokenType()), SocialUser::getTokenType, bo.getTokenType());
- lqw.eq(StringUtils.isNotBlank(bo.getIdToken()), SocialUser::getIdToken, bo.getIdToken());
- lqw.eq(StringUtils.isNotBlank(bo.getMacAlgorithm()), SocialUser::getMacAlgorithm, bo.getMacAlgorithm());
- lqw.eq(StringUtils.isNotBlank(bo.getMacKey()), SocialUser::getMacKey, bo.getMacKey());
- lqw.eq(StringUtils.isNotBlank(bo.getCode()), SocialUser::getCode, bo.getCode());
- lqw.eq(StringUtils.isNotBlank(bo.getOauthToken()), SocialUser::getOauthToken, bo.getOauthToken());
- lqw.eq(StringUtils.isNotBlank(bo.getOauthTokenSecret()), SocialUser::getOauthTokenSecret, bo.getOauthTokenSecret());
- return lqw;
- }
-
/**
* 新增社会化关系
*/
@@ -97,15 +47,6 @@ public class SocialUserServiceImpl implements ISocialUserService {
return flag;
}
- /**
- * 修改社会化关系
- */
- @Override
- public Boolean updateByBo(SocialUserBo bo) {
- SocialUser update = MapstructUtils.convert(bo, SocialUser.class);
- validEntityBeforeSave(update);
- return baseMapper.updateById(update) > 0;
- }
/**
* 保存前的数据校验
@@ -114,16 +55,6 @@ public class SocialUserServiceImpl implements ISocialUserService {
//TODO 做一些数据校验,如唯一约束
}
- /**
- * 批量删除社会化关系
- */
- @Override
- public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
- if (isValid) {
- //TODO 做一些业务上的校验,判断是否需要校验
- }
- return baseMapper.deleteBatchIds(ids) > 0;
- }
/**
* 删除社会化关系
diff --git a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
index fb636b162..0c50ee6eb 100644
--- a/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
+++ b/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SocialUserMapper.xml
@@ -8,61 +8,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
-
- select id,
- user_id,
- tenant_id,
- auth_id,
- source,
- open_id,
- access_token,
- expire_in,
- refresh_token,
- access_code,
- union_id,
- scope,
- token_type,
- id_token,
- mac_algorithm,
- mac_key,
- code,
- oauth_token,
- oauth_token_secret,
- create_dept,
- create_by,
- create_time,
- update_by,
- update_time
- from social_user
-
-
-
-
-
-
-
-
-
diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql
index 8c10bb2c2..94b8765eb 100644
--- a/script/sql/ry_vue_5.X.sql
+++ b/script/sql/ry_vue_5.X.sql
@@ -1,43 +1,40 @@
-
-- ----------------------------
-- 第三方平台授权表
-- ----------------------------
-CREATE TABLE `social_user`
+DROP TABLE IF EXISTS social_user;
+CREATE TABLE social_user
(
- `id` bigint unsigned NOT NULL COMMENT '主键',
- `user_id` bigint NOT NULL COMMENT '用户ID',
- `tenant_id` varchar(20) DEFAULT NULL COMMENT '租户id',
- `auth_id` varchar(255) NOT NULL COMMENT '授权+授权openid',
- `source` varchar(255) NOT NULL COMMENT '用户来源',
- `open_id` varchar(255) DEFAULT NULL COMMENT '原生open id',
- `user_name` varchar(30) NOT NULL COMMENT '登录账号',
- `nick_name` varchar(30) DEFAULT '' COMMENT '用户昵称',
- `email` varchar(255) DEFAULT '' COMMENT '用户邮箱',
- `avatar` varchar(500) DEFAULT '' COMMENT '头像地址',
- `access_token` varchar(255) NOT NULL COMMENT '用户的授权令牌',
- `expire_in` int DEFAULT NULL COMMENT '用户的授权令牌的有效期,部分平台可能没有',
- `refresh_token` varchar(255) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有',
- `access_code` varchar(255) DEFAULT NULL COMMENT '平台的授权信息,部分平台可能没有',
- `union_id` varchar(255) DEFAULT NULL COMMENT '用户的 unionid',
- `scope` varchar(255) DEFAULT NULL COMMENT '授予的权限,部分平台可能没有',
- `token_type` varchar(255) DEFAULT NULL COMMENT '个别平台的授权信息,部分平台可能没有',
- `id_token` varchar(255) DEFAULT NULL COMMENT 'id token,部分平台可能没有',
- `mac_algorithm` varchar(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
- `mac_key` varchar(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
- `code` varchar(255) DEFAULT NULL COMMENT '用户的授权code,部分平台可能没有',
- `oauth_token` varchar(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
- `oauth_token_secret` varchar(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
- `create_dept` bigint DEFAULT NULL COMMENT '创建部门',
- `create_by` bigint NOT NULL COMMENT '创建人',
- `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
- `update_by` bigint NOT NULL COMMENT '更新人',
- `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
- `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
- PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB
- DEFAULT CHARSET = utf8mb4
- COLLATE = utf8mb4_general_ci
- ROW_FORMAT = DYNAMIC COMMENT ='社会化关系表';
+ id BIGINT UNSIGNED NOT NULL COMMENT '主键',
+ user_id BIGINT NOT NULL COMMENT '用户ID',
+ tenant_id VARCHAR(20) DEFAULT NULL COMMENT '租户id',
+ auth_id VARCHAR(255) NOT NULL COMMENT '授权+授权openid',
+ source VARCHAR(255) NOT NULL COMMENT '用户来源',
+ open_id VARCHAR(255) DEFAULT NULL COMMENT '原生open id',
+ user_name VARCHAR(30) NOT NULL COMMENT '登录账号',
+ nick_name VARCHAR(30) DEFAULT '' COMMENT '用户昵称',
+ email VARCHAR(255) DEFAULT '' COMMENT '用户邮箱',
+ avatar VARCHAR(500) DEFAULT '' COMMENT '头像地址',
+ access_token VARCHAR(255) NOT NULL COMMENT '用户的授权令牌',
+ expire_in INT DEFAULT NULL COMMENT '用户的授权令牌的有效期,部分平台可能没有',
+ refresh_token VARCHAR(255) DEFAULT NULL COMMENT '刷新令牌,部分平台可能没有',
+ access_code VARCHAR(255) DEFAULT NULL COMMENT '平台的授权信息,部分平台可能没有',
+ union_id VARCHAR(255) DEFAULT NULL COMMENT '用户的 unionid',
+ scope VARCHAR(255) DEFAULT NULL COMMENT '授予的权限,部分平台可能没有',
+ token_type VARCHAR(255) DEFAULT NULL COMMENT '个别平台的授权信息,部分平台可能没有',
+ id_token VARCHAR(255) DEFAULT NULL COMMENT 'id token,部分平台可能没有',
+ mac_algorithm VARCHAR(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+ mac_key VARCHAR(255) DEFAULT NULL COMMENT '小米平台用户的附带属性,部分平台可能没有',
+ code VARCHAR(255) DEFAULT NULL COMMENT '用户的授权code,部分平台可能没有',
+ oauth_token VARCHAR(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+ oauth_token_secret VARCHAR(255) DEFAULT NULL COMMENT 'Twitter平台用户的附带属性,部分平台可能没有',
+ create_dept bigint(20) comment '创建部门',
+ create_by bigint(20) comment '创建者',
+ create_time datetime comment '创建时间',
+ update_by bigint(20) comment '更新者',
+ update_time datetime comment '更新时间',
+ del_flag char(1) default '0' comment '删除标志(0代表存在 2代表删除)',
+ PRIMARY KEY (id)
+) ENGINE = InnoDB COMMENT ='社会化关系表';
-- ----------------------------
-- 租户表
From 98aa0b9f1813ee3dfe9a8be04084efc785ebf024 Mon Sep 17 00:00:00 2001
From: thiszhc <2029364173@qq.com>
Date: Sat, 17 Jun 2023 00:47:41 +0800
Subject: [PATCH 6/6] =?UTF-8?q?add=20=E6=9F=A5=E7=9C=8B=E6=8E=88=E6=9D=83?=
=?UTF-8?q?=E5=88=97=E8=A1=A8?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../web/controller/AuthController.java | 12 --
.../dromara/web/service/SysLoginService.java | 12 +-
.../src/main/resources/application-dev.yml | 149 ++++++++++++++++++
.../system/SocialUserController.java | 57 +++++++
.../system/service/ISocialUserService.java | 25 ++-
.../service/impl/SocialUserServiceImpl.java | 55 ++++---
6 files changed, 248 insertions(+), 62 deletions(-)
create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
index 8cb96cd69..515ec1b21 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java
@@ -25,7 +25,6 @@ import org.dromara.common.social.utils.SocialUtils;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.system.domain.bo.SysTenantBo;
import org.dromara.system.domain.vo.SysTenantVo;
-import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISocialUserService;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysTenantService;
@@ -139,14 +138,6 @@ public class AuthController {
@GetMapping("/binding/{source}")
@ResponseBody
public R authBinding(@PathVariable("source") String source, HttpServletRequest request){
- SysUserVo userLoding = new SysUserVo();
- if (ObjectUtil.isNull(userLoding)) {
- return R.fail("授权失败,请先登录再绑定");
- }
- if (socialUserService.isExistByUserIdAndSource(userLoding.getUserId(),source))
- {
- return R.fail(source + "平台账号已经被账号绑定");
- }
SocialLoginConfigProperties obj = socialProperties.getType().get(source);
if (ObjectUtil.isNull(obj)){
return R.fail(source + "平台账号暂不支持");
@@ -193,9 +184,6 @@ public class AuthController {
}
-
-
-
/**
* 退出登录
*/
diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
index 479c390f3..e4aec24f1 100644
--- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
+++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java
@@ -34,11 +34,9 @@ import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.config.properties.CaptchaProperties;
import org.dromara.system.domain.SysUser;
import org.dromara.system.domain.bo.SocialUserBo;
-import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SocialUserVo;
import org.dromara.system.domain.vo.SysTenantVo;
import org.dromara.system.domain.vo.SysUserVo;
-import org.dromara.system.mapper.SocialUserMapper;
import org.dromara.system.mapper.SysUserMapper;
import org.dromara.system.service.ISocialUserService;
import org.dromara.system.service.ISysPermissionService;
@@ -66,7 +64,6 @@ public class SysLoginService {
private final SysUserMapper userMapper;
private final ISocialUserService socialUserService;
- private final ISysUserService userService;
private final CaptchaProperties captchaProperties;
private final ISysPermissionService permissionService;
private final ISysTenantService tenantService;
@@ -176,22 +173,20 @@ public class SysLoginService {
* @param request Http请求对象
* @return 统一响应实体
*/
- public R socialLogin(String source, AuthResponse authUser, HttpServletRequest request) throws IOException {
+ public R socialLogin(String source, AuthResponse authUser, HttpServletRequest request) {
// 判断授权响应是否成功
if (!authUser.ok()) {
return R.fail("对不起,授权信息验证不通过,请退出重试!");
}
AuthUser authUserData = authUser.getData();
- String authId = source + authUserData.getUuid();
-
- SocialUserVo user = socialUserService.selectSocialUserByAuthId(authId);
+ SocialUserVo user = socialUserService.selectSocialUserByAuthId(authUserData.getSource() + authUserData.getUuid());
if (ObjectUtil.isNotNull(user)) {
//执行登录和记录登录信息操作
return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData);
} else {
// 判断是否已登录
if (LoginHelper.getUserId() == null) {
- return R.fail("授权失败,请先登录再绑定");
+ return R.fail("授权失败,请先登录才能绑定");
}
SocialUserBo socialUserBo = new SocialUserBo();
socialUserBo.setUserId(LoginHelper.getUserId());
@@ -201,7 +196,6 @@ public class SysLoginService {
socialUserBo.setNickName(authUserData.getNickname());
socialUserBo.setAvatar(authUserData.getAvatar());
socialUserBo.setOpenId(authUserData.getUuid());
- BeanUtils.copyProperties(authUserData, socialUserBo);
BeanUtils.copyProperties(authUserData.getToken(), socialUserBo);
socialUserService.insertByBo(socialUserBo);
diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml
index 5adc8aed8..bbd9e1734 100644
--- a/ruoyi-admin/src/main/resources/application-dev.yml
+++ b/ruoyi-admin/src/main/resources/application-dev.yml
@@ -184,3 +184,152 @@ sms:
sdkAppId: appid
#地域信息默认为 ap-guangzhou 如无特殊改变可不用设置
territory: ap-guangzhou
+
+
+
+justauth:
+ enabled: true
+ type:
+ QQ:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/qq/callback
+ union-id: false
+ WEIBO:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/weibo/callback
+ gitee:
+ client-id: 38eaaa1b77b5e064313057a2f5745ce3a9f3e7686d9bd302c7df2f308ef6db81
+ client-secret: 2e633af8780cb9fe002c4c7291b722db944402e271efb99b062811f52d7da1ff
+ redirect-uri: http://localhost:80/social-login?source=gitee
+ DINGTALK:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/dingtalk/callback
+ BAIDU:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/baidu/callback
+ CSDN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/csdn/callback
+ CODING:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/coding/callback
+ coding-group-name: xx
+ OSCHINA:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/oschina/callback
+ ALIPAY:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/alipay/callback
+ alipay-public-key: MIIB**************DAQAB
+ WECHAT_OPEN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_open/callback
+ WECHAT_MP:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_mp/callback
+ WECHAT_ENTERPRISE:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/wechat_enterprise/callback
+ agent-id: 1000002
+ TAOBAO:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/taobao/callback
+ GOOGLE:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/google/callback
+ FACEBOOK:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/facebook/callback
+ DOUYIN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/douyin/callback
+ LINKEDIN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/linkedin/callback
+ MICROSOFT:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/microsoft/callback
+ MI:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/mi/callback
+ TOUTIAO:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/toutiao/callback
+ TEAMBITION:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/teambition/callback
+ RENREN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/renren/callback
+ PINTEREST:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/pinterest/callback
+ STACK_OVERFLOW:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/stack_overflow/callback
+ stack-overflow-key: asd*********asd
+ HUAWEI:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/huawei/callback
+ KUJIALE:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/kujiale/callback
+ GITLAB:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/gitlab/callback
+ MEITUAN:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/meituan/callback
+ ELEME:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/eleme/callback
+ TWITTER:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/twitter/callback
+ XMLY:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/xmly/callback
+ # 设备唯一标识ID
+ device-id: xxxxxxxxxxxxxx
+ # 客户端操作系统类型,1-iOS系统,2-Android系统,3-Web
+ client-os-type: 3
+ # 客户端包名,如果 clientOsType 为1或2时必填。对Android客户端是包名,对IOS客户端是Bundle ID
+ #pack-id: xxxx
+ FEISHU:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/feishu/callback
+ JD:
+ client-id: 10**********6
+ client-secret: 1f7d08**********5b7**********29e
+ redirect-uri: http://oauth.xkcoding.com/demo/oauth/jd/callback
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
new file mode 100644
index 000000000..38cc14ce9
--- /dev/null
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SocialUserController.java
@@ -0,0 +1,57 @@
+package org.dromara.system.controller.system;
+
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.vo.SocialUserVo;
+import org.dromara.system.service.ISocialUserService;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 社会化关系
+ *
+ * @author thiszhc
+ * @date 2023-06-16
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/social")
+public class SocialUserController extends BaseController {
+
+ private final ISocialUserService socialUserService;
+
+ /**
+ * 查询社会化关系列表
+ */
+// 这里改成用户默认的。只能查看自己的权限更好哦
+// @SaCheckPermission("system:user:list")
+ @GetMapping("/list")
+ public R> list() {
+ return R.ok(socialUserService.queryList());
+ }
+
+
+ /**
+ * 获取社会化关系详细信息
+ *
+ * @param id 主键
+ */
+// 这里改成用户默认的。只能查看自己的权限更好哦
+// @SaCheckPermission("system:user:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable String id) {
+ return R.ok(socialUserService.queryById(id));
+ }
+
+
+
+}
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
index d9e87f7d7..00c4a5fd4 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISocialUserService.java
@@ -1,14 +1,8 @@
package org.dromara.system.service;
-import org.dromara.system.domain.SocialUser;
-import org.dromara.system.domain.bo.SysUserBo;
-import org.dromara.system.domain.vo.SocialUserVo;
import org.dromara.system.domain.bo.SocialUserBo;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.domain.vo.SocialUserVo;
-import java.util.Collection;
import java.util.List;
/**
@@ -19,6 +13,17 @@ import java.util.List;
*/
public interface ISocialUserService {
+
+ /**
+ * 查询社会化关系
+ */
+ SocialUserVo queryById(String id);
+
+ /**
+ * 查询社会化关系列表
+ */
+ List queryList();
+
/**
* 新增授权关系
*/
@@ -31,12 +36,6 @@ public interface ISocialUserService {
Boolean deleteWithValidById(Long id);
- /**
- * 根据用户ID查询授权关系
- */
- Boolean isExistByUserIdAndSource(Long userId, String source);
-
-
/**
* 根据authId查询SocialUser表和SysUser表,返回SocialUserAuthResult映射的对象
* @param authId 认证ID
diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
index fc342445b..df71064e0 100644
--- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
+++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SocialUserServiceImpl.java
@@ -1,25 +1,15 @@
package org.dromara.system.service.impl;
-import org.dromara.common.core.utils.MapstructUtils;
-import org.dromara.common.core.utils.StringUtils;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.mybatis.core.page.PageQuery;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
-import org.dromara.system.domain.bo.SysUserBo;
-import org.dromara.system.domain.vo.SysUserVo;
-import org.springframework.stereotype.Service;
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.system.domain.SocialUser;
import org.dromara.system.domain.bo.SocialUserBo;
import org.dromara.system.domain.vo.SocialUserVo;
-import org.dromara.system.domain.SocialUser;
import org.dromara.system.mapper.SocialUserMapper;
import org.dromara.system.service.ISocialUserService;
+import org.springframework.stereotype.Service;
import java.util.List;
-import java.util.Map;
-import java.util.Collection;
/**
* 社会化关系Service业务层处理
@@ -33,6 +23,25 @@ public class SocialUserServiceImpl implements ISocialUserService {
private final SocialUserMapper baseMapper;
+
+ /**
+ * 查询社会化关系
+ */
+ @Override
+ public SocialUserVo queryById(String id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 授权列表
+ */
+ @Override
+ public List queryList() {
+ return baseMapper.selectVoList();
+ }
+
+
+
/**
* 新增社会化关系
*/
@@ -42,7 +51,11 @@ public class SocialUserServiceImpl implements ISocialUserService {
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
- bo.setId(add.getId());
+ if (add != null) {
+ bo.setId(add.getId());
+ }else {
+ return false;
+ }
}
return flag;
}
@@ -64,20 +77,6 @@ public class SocialUserServiceImpl implements ISocialUserService {
return baseMapper.deleteById(id) > 0;
}
- /**
- * 根据用户id和来源查询用户是否存在
- *
- * @param userId 用户id
- * @param source 来源
- * @return 是否存在
- */
- @Override
- public Boolean isExistByUserIdAndSource(Long userId, String source) {
- LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
- lqw.eq(SocialUser::getUserId, userId);
- lqw.eq(SocialUser::getSource, source);
- return baseMapper.selectCount(lqw) > 0;
- }
/**
* 根据authId查询用户信息