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查询用户信息