Jelajahi Sumber

切换学校

LIVE_YE 8 bulan lalu
induk
melakukan
5411b1aa65

+ 2 - 2
ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java

@@ -26,6 +26,7 @@ import org.dromara.common.social.config.properties.SocialProperties;
 import org.dromara.common.social.utils.SocialUtils;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.system.domain.SysClient;
+import org.dromara.system.domain.admin.LoginVo;
 import org.dromara.system.domain.app.AppletLoginForm;
 import org.dromara.system.domain.bo.SysTenantBo;
 import org.dromara.system.domain.school.bo.SysSchoolNameBo;
@@ -36,12 +37,11 @@ import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.mapper.SysRoleMapper;
 import org.dromara.system.mapper.SysUserMapper;
 import org.dromara.system.service.*;
+import org.dromara.system.service.impl.SysLoginService;
 import org.dromara.system.service.school.ISysSchoolNameService;
 import org.dromara.web.domain.vo.LoginTenantVo;
-import org.dromara.web.domain.vo.LoginVo;
 import org.dromara.web.domain.vo.TenantListVo;
 import org.dromara.web.service.IAuthStrategy;
-import org.dromara.web.service.SysLoginService;
 import org.dromara.web.service.SysRegisterService;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;

+ 1 - 1
ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java

@@ -6,11 +6,11 @@ import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.exception.base.BaseException;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.system.domain.admin.LoginVo;
 import org.dromara.system.domain.app.AppletLoginForm;
 import org.dromara.system.domain.SysClient;
 import org.dromara.system.domain.app.AppletSessionDTO;
 import org.dromara.system.utils.WxCodeSessionUtil;
-import org.dromara.web.domain.vo.LoginVo;
 
 /**
  * 授权策略

+ 2 - 2
ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java

@@ -23,11 +23,11 @@ import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.system.domain.SysClient;
 import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.admin.LoginVo;
 import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.mapper.SysUserMapper;
-import org.dromara.web.domain.vo.LoginVo;
+import org.dromara.system.service.impl.SysLoginService;
 import org.dromara.web.service.IAuthStrategy;
-import org.dromara.web.service.SysLoginService;
 import org.springframework.stereotype.Service;
 
 /**

+ 2 - 2
ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java

@@ -30,11 +30,11 @@ import org.dromara.sms4j.core.factory.SmsFactory;
 import org.dromara.sms4j.provider.enumerate.SupplierType;
 import org.dromara.system.domain.SysClient;
 import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.admin.LoginVo;
 import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.mapper.SysUserMapper;
-import org.dromara.web.domain.vo.LoginVo;
+import org.dromara.system.service.impl.SysLoginService;
 import org.dromara.web.service.IAuthStrategy;
-import org.dromara.web.service.SysLoginService;
 import org.springframework.stereotype.Service;
 
 import java.util.LinkedHashMap;

+ 2 - 2
ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java

@@ -23,11 +23,11 @@ import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.system.domain.SysClient;
 import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.admin.LoginVo;
 import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.mapper.SysUserMapper;
-import org.dromara.web.domain.vo.LoginVo;
+import org.dromara.system.service.impl.SysLoginService;
 import org.dromara.web.service.IAuthStrategy;
-import org.dromara.web.service.SysLoginService;
 import org.springframework.stereotype.Service;
 
 /**

+ 2 - 2
ruoyi-admin/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java

@@ -27,13 +27,13 @@ import org.dromara.common.social.utils.SocialUtils;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.system.domain.SysClient;
 import org.dromara.system.domain.SysUser;
+import org.dromara.system.domain.admin.LoginVo;
 import org.dromara.system.domain.vo.SysSocialVo;
 import org.dromara.system.domain.vo.SysUserVo;
 import org.dromara.system.mapper.SysUserMapper;
 import org.dromara.system.service.ISysSocialService;
-import org.dromara.web.domain.vo.LoginVo;
+import org.dromara.system.service.impl.SysLoginService;
 import org.dromara.web.service.IAuthStrategy;
-import org.dromara.web.service.SysLoginService;
 import org.springframework.stereotype.Service;
 
 /**

+ 2 - 2
ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java

@@ -14,10 +14,10 @@ import org.dromara.common.core.utils.ValidatorUtils;
 import org.dromara.common.core.validate.auth.WechatGroup;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.system.domain.SysClient;
+import org.dromara.system.domain.admin.LoginVo;
 import org.dromara.system.domain.vo.SysUserVo;
-import org.dromara.web.domain.vo.LoginVo;
+import org.dromara.system.service.impl.SysLoginService;
 import org.dromara.web.service.IAuthStrategy;
-import org.dromara.web.service.SysLoginService;
 import org.springframework.stereotype.Service;
 
 /**

+ 7 - 7
ruoyi-admin/src/main/resources/application-dev.yml

@@ -63,13 +63,13 @@ spring:
           username: root
           password: Boman123
         # 从库数据源
-        slave:
-          lazy: true
-          type: ${spring.datasource.type}
-          driverClassName: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
-          username:
-          password:
+          #slave:
+          #lazy: false
+          #type: ${spring.datasource.type}
+          #driverClassName: com.mysql.cj.jdbc.Driver
+          #url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
+          #username:
+          #password:
 
       hikari:
         # 最大连接池数量

+ 5 - 0
ruoyi-modules/ruoyi-system/pom.xml

@@ -115,6 +115,11 @@
             <version>3.1.0</version>
         </dependency>
 
+        <dependency>
+            <groupId>me.zhyd.oauth</groupId>
+            <artifactId>JustAuth</artifactId>
+        </dependency>
+
     </dependencies>
     <properties>
         <maven.compiler.source>17</maven.compiler.source>

+ 19 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/system/SysTenantController.java

@@ -2,6 +2,8 @@ package org.dromara.system.controller.system;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaCheckRole;
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.lock.annotation.Lock4j;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
@@ -10,10 +12,13 @@ import jakarta.validation.constraints.NotBlank;
 import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
+import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.constant.TenantConstants;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.core.domain.model.LoginBody;
 import org.dromara.common.core.domain.model.LoginUser;
 import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.MessageUtils;
 import org.dromara.common.core.validate.AddGroup;
 import org.dromara.common.core.validate.EditGroup;
 import org.dromara.common.excel.utils.ExcelUtil;
@@ -25,6 +30,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.common.web.core.BaseController;
+import org.dromara.system.domain.admin.LoginVo;
 import org.dromara.system.domain.bo.SysTenantBo;
 import org.dromara.system.domain.vo.SysTenantVo;
 import org.dromara.system.domain.vo.SysUserVo;
@@ -155,11 +161,23 @@ public class SysTenantController extends BaseController {
      */
     //@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
     @GetMapping("/dynamic/{tenantId}")
-    public R<Void> dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) {
+    public R<LoginVo> dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) {
         TenantHelper.setDynamic(tenantId);
         return R.ok();
     }
 
+    /**
+     * 动态切换租户
+     *
+     * @param
+     */
+    //@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
+    @PostMapping("/dynamic/loginBody")
+    public R<LoginVo> dynamicTenant(@Validated @RequestBody LoginBody loginBody) {
+        LoginVo loginVo = tenantService.getLoginVo(loginBody);
+        return R.ok(loginVo);
+    }
+
     /**
      * 清除动态租户
      */

+ 1 - 1
ruoyi-admin/src/main/java/org/dromara/web/domain/vo/LoginVo.java → ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/admin/LoginVo.java

@@ -1,4 +1,4 @@
-package org.dromara.web.domain.vo;
+package org.dromara.system.domain.admin;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import lombok.Data;

+ 0 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/RegisterTeacherMapper.java

@@ -33,7 +33,6 @@ public interface RegisterTeacherMapper extends BaseMapperPlus<RegisterTeacher, R
     @InterceptorIgnore(tenantLine = "true")
     Long updateMapperById(RegisterTeacher update);
 
-    @InterceptorIgnore(tenantLine = "true")
     Page<RegisterTeacherVo> selectVoMapperPage(@Param("page")Page<Object> build, @Param(Constants.WRAPPER)LambdaQueryWrapper<RegisterTeacher> lqw);
 
     @InterceptorIgnore(tenantLine = "true")

+ 0 - 1
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/TeacherInfoMapper.java

@@ -23,7 +23,6 @@ public interface TeacherInfoMapper extends BaseMapperPlus<TeacherInfo, TeacherIn
     @InterceptorIgnore(tenantLine = "1")
     TeacherInfoVo selectVoMapperById(Long id);
 
-    @InterceptorIgnore(tenantLine = "1")
     Page<TeacherInfoVo> selectVoMapperPage(@Param("page")Page<Object> build, @Param(Constants.WRAPPER)QueryWrapper<TeacherInfo> lqw);
 
     @InterceptorIgnore(tenantLine = "1")

+ 4 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantService.java

@@ -1,5 +1,7 @@
 package org.dromara.system.service;
 
+import org.dromara.common.core.domain.model.LoginBody;
+import org.dromara.system.domain.admin.LoginVo;
 import org.dromara.system.domain.vo.SysTenantVo;
 import org.dromara.system.domain.bo.SysTenantBo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
@@ -81,4 +83,6 @@ public interface ISysTenantService {
     Boolean syncTenantPackage(String tenantId, Long packageId);
 
     List<SysTenantVo> usernameList();
+
+    LoginVo getLoginVo(LoginBody loginBody);
 }

+ 25 - 3
ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java → ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysLoginService.java

@@ -1,9 +1,10 @@
-package org.dromara.web.service;
+package org.dromara.system.service.impl;
 
 import cn.dev33.satoken.exception.NotLoginException;
 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 lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import me.zhyd.oauth.model.AuthUser;
@@ -24,11 +25,13 @@ import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
 import org.dromara.common.tenant.exception.TenantException;
 import org.dromara.common.tenant.helper.TenantHelper;
+import org.dromara.system.domain.SysTenant;
 import org.dromara.system.domain.SysUser;
 import org.dromara.system.domain.bo.SysSocialBo;
 import org.dromara.system.domain.vo.SysSocialVo;
 import org.dromara.system.domain.vo.SysTenantVo;
 import org.dromara.system.domain.vo.SysUserVo;
+import org.dromara.system.mapper.SysTenantMapper;
 import org.dromara.system.mapper.SysUserMapper;
 import org.dromara.system.service.ISysPermissionService;
 import org.dromara.system.service.ISysSocialService;
@@ -57,7 +60,8 @@ public class SysLoginService {
     @Value("${user.password.lockTime}")
     private Integer lockTime;
 
-    private final ISysTenantService tenantService;
+    //private final ISysTenantService tenantService;
+    private final SysTenantMapper sysTenantMapper;
     private final ISysPermissionService permissionService;
     private final ISysSocialService sysSocialService;
     private final SysUserMapper userMapper;
@@ -150,6 +154,24 @@ public class SysLoginService {
         return loginUser;
     }
 
+    /**
+     * 构建登录用户(切换学校用)
+     */
+    public LoginUser buildLoginUser(SysUserVo user,LoginUser loginUser) {
+        loginUser.setTenantId(user.getTenantId());
+        loginUser.setUserId(user.getUserId());
+        loginUser.setDeptId(user.getDeptId());
+        loginUser.setUsername(user.getUserName());
+        loginUser.setNickname(user.getNickName());
+        loginUser.setUserType(user.getUserType());
+        loginUser.setMenuPermission(permissionService.getMenuPermission(user.getUserId()));
+        loginUser.setRolePermission(permissionService.getRolePermission(user.getUserId()));
+        loginUser.setDeptName(ObjectUtil.isNull(user.getDept()) ? "" : user.getDept().getDeptName());
+        List<RoleDTO> roles = BeanUtil.copyToList(user.getRoles(), RoleDTO.class);
+        loginUser.setRoles(roles);
+        return loginUser;
+    }
+
     /**
      * 记录登录信息
      *
@@ -210,7 +232,7 @@ public class SysLoginService {
         if (TenantConstants.DEFAULT_TENANT_ID.equals(tenantId)) {
             return;
         }
-        SysTenantVo tenant = tenantService.queryByTenantId(tenantId);
+        SysTenantVo tenant = sysTenantMapper.selectVoOne(new LambdaQueryWrapper<SysTenant>().eq(SysTenant::getTenantId, tenantId));
         if (ObjectUtil.isNull(tenant)) {
             log.info("登录租户:{} 不存在.", tenantId);
             throw new TenantException("tenant.not.exists");

+ 47 - 0
ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantServiceImpl.java

@@ -1,6 +1,9 @@
 package org.dromara.system.service.impl;
 
+import cn.dev33.satoken.context.SaHolder;
 import cn.dev33.satoken.secure.BCrypt;
+import cn.dev33.satoken.stp.SaLoginModel;
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.RandomUtil;
@@ -11,18 +14,25 @@ import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.constant.CacheNames;
 import org.dromara.common.core.constant.Constants;
 import org.dromara.common.core.constant.TenantConstants;
+import org.dromara.common.core.domain.model.LoginBody;
 import org.dromara.common.core.domain.model.LoginUser;
 import org.dromara.common.core.exception.ServiceException;
 import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.MessageUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.tenant.helper.TenantHelper;
 import org.dromara.system.domain.*;
+import org.dromara.system.domain.admin.LoginVo;
 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.*;
+import org.dromara.system.service.ISysClientService;
 import org.dromara.system.service.ISysTenantService;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
@@ -54,6 +64,8 @@ public class SysTenantServiceImpl implements ISysTenantService {
     private final SysDictTypeMapper dictTypeMapper;
     private final SysDictDataMapper dictDataMapper;
     private final SysConfigMapper configMapper;
+    private final SysLoginService loginService;
+    private final ISysClientService clientService;
 
     /**
      * 查询租户
@@ -379,4 +391,39 @@ public class SysTenantServiceImpl implements ISysTenantService {
         return tenants;
     }
 
+    @Override
+    public LoginVo getLoginVo(LoginBody loginBody) {
+
+        SysUserVo user = userMapper.selectTenantUserByUserName(LoginHelper.getLoginUser().getUsername(), loginBody.getTenantId());
+        SaHolder.getStorage().set(LoginHelper.USER_KEY, user.getUserId());
+        TenantHelper.setDynamic(loginBody.getTenantId());
+        // 此处可根据登录用户的数据不同 自行创建 loginUser
+        LoginUser loginUser = loginService.buildLoginUser(user,LoginHelper.getLoginUser());
+        String tenantId = loginBody.getTenantId();
+        String clientId = loginBody.getClientId();
+        String grantType = loginBody.getGrantType();
+        SysClient client = clientService.queryByClientId(clientId);
+        String userName = LoginHelper.getLoginUser().getUsername();
+        SaLoginModel model = new SaLoginModel();
+        model.setDevice(client.getDeviceType());
+        // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置
+        // 例如: 后台用户30分钟过期 app用户1天过期
+        model.setTimeout(client.getTimeout());
+        model.setActiveTimeout(client.getActiveTimeout());
+        model.setExtra(LoginHelper.CLIENT_KEY, clientId);
+        // 生成token
+        LoginHelper.login(loginUser, model);
+
+        loginService.recordLogininfor(loginUser.getTenantId(), userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success"));
+        loginService.recordLoginInfo(user.getUserId());
+
+        LoginVo loginVo = new LoginVo();
+        loginVo.setAccessToken(StpUtil.getTokenValue());
+        loginVo.setExpireIn(StpUtil.getTokenTimeout());
+        loginVo.setClientId(clientId);
+        //把tenantId存在redis
+        RedisUtils.setCacheObject(userName + ":login",tenantId);
+        return loginVo;
+    }
+
 }