Forráskód Böngészése

1、单点登录
2、课程、试题、课程配置自定义查询分页功能

liyanbo 9 hónapja
szülő
commit
e288b170ef
15 módosított fájl, 146 hozzáadás és 69 törlés
  1. 2 2
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/controller/admin/questionnaire/vo/ConfigQuestionRespVO.java
  2. 3 4
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/dal/mysql/course/CourseMapper.java
  3. 2 3
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/dal/mysql/courseconfig/CourseConfigMapper.java
  4. 6 4
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/dal/mysql/questionnaire/QuestionnaireMapper.java
  5. 4 2
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/service/course/CourseServiceImpl.java
  6. 18 17
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/service/courseconfig/CourseConfigServiceImpl.java
  7. 3 2
      byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/service/questionnaire/QuestionnaireServiceImpl.java
  8. 16 28
      byzs-course/src/main/resources/mapper/course/CourseMapper.xml
  9. 23 0
      byzs-course/src/main/resources/mapper/courseconfig/CourseConfigMapper.xml
  10. 22 0
      byzs-course/src/main/resources/mapper/questionnaire/QuestionnaireMapper.xml
  11. 7 0
      byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java
  12. 11 0
      byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java
  13. 25 0
      byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/service/oauth2/OAuth2TokenServiceImpl.java
  14. 4 7
      byzs-web/src/main/java/cn/iocoder/byzs/module/web/service/questionnaire/WebQuestionnaireServiceImpl.java
  15. 0 0
      byzs-web/src/main/java/cn/iocoder/byzs/web/service/VideoProcessingService.java

+ 2 - 2
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/controller/admin/questionnaire/vo/ConfigQuestionRespVO.java

@@ -1,8 +1,8 @@
 package cn.iocoder.byzs.module.bjdx.controller.admin.questionnaire.vo;
 
+import cn.iocoder.byzs.framework.common.pojo.PageParam;
 import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursequestoption.CourseQuestOptionDO;
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
-import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -11,7 +11,7 @@ import java.util.List;
 @Schema(description = "管理后台 - 课程-试题 Response VO")
 @Data
 @ExcelIgnoreUnannotated
-public class ConfigQuestionRespVO {
+public class ConfigQuestionRespVO extends PageParam {
 
     @Schema(description = "租户编号")
     private Long tenantId;

+ 3 - 4
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/dal/mysql/course/CourseMapper.java

@@ -1,13 +1,11 @@
 package cn.iocoder.byzs.module.bjdx.dal.mysql.course;
 
-import cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO;
 import cn.iocoder.byzs.framework.common.pojo.PageResult;
-import cn.iocoder.byzs.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.byzs.framework.mybatis.core.mapper.BaseMapperX;
-import cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.CourseConfigPageReqVO;
+import cn.iocoder.byzs.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO;
 import cn.iocoder.byzs.module.bjdx.dal.dataobject.course.CourseDO;
 import org.apache.ibatis.annotations.Mapper;
-import cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.*;
 
 import java.util.List;
 
@@ -37,4 +35,5 @@ public interface CourseMapper extends BaseMapperX<CourseDO> {
 
     List<CoursePageReqVO> selectCoursePage(CoursePageReqVO reqVO);
     List<CoursePageReqVO> selectCourseList(CoursePageReqVO reqVO);
+    int selectCoursePageCount(CoursePageReqVO reqVO);
 }

+ 2 - 3
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/dal/mysql/courseconfig/CourseConfigMapper.java

@@ -1,9 +1,7 @@
 package cn.iocoder.byzs.module.bjdx.dal.mysql.courseconfig;
 
-import cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.CourseConfigPageReqVO;
-import cn.iocoder.byzs.framework.common.pojo.PageResult;
-import cn.iocoder.byzs.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.byzs.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.CourseConfigPageReqVO;
 import cn.iocoder.byzs.module.bjdx.dal.dataobject.courseconfig.CourseConfigDO;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -27,5 +25,6 @@ public interface CourseConfigMapper extends BaseMapperX<CourseConfigDO> {
 //    }
 
     List<CourseConfigPageReqVO> selectCourseConfigPage(CourseConfigPageReqVO reqVO);
+    Integer selectCourseConfigCount(CourseConfigPageReqVO reqVO);
 
 }

+ 6 - 4
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/dal/mysql/questionnaire/QuestionnaireMapper.java

@@ -1,13 +1,14 @@
 package cn.iocoder.byzs.module.bjdx.dal.mysql.questionnaire;
 
-import java.util.*;
-
 import cn.iocoder.byzs.framework.common.pojo.PageResult;
-import cn.iocoder.byzs.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.byzs.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.byzs.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaire.vo.ConfigQuestionRespVO;
+import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaire.vo.QuestionnairePageReqVO;
 import cn.iocoder.byzs.module.bjdx.dal.dataobject.questionnaire.QuestionnaireDO;
 import org.apache.ibatis.annotations.Mapper;
-import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaire.vo.*;
+
+import java.util.List;
 
 /**
  * 问卷 Mapper
@@ -30,6 +31,7 @@ public interface QuestionnaireMapper extends BaseMapperX<QuestionnaireDO> {
     }
 
     List<ConfigQuestionRespVO> selectConfigQuestionList(ConfigQuestionRespVO configQuestionRespVO);
+    Integer selectConfigQuestionCount(ConfigQuestionRespVO configQuestionRespVO);
 
     List<ConfigQuestionRespVO> selectConfigQuestionNoList(ConfigQuestionRespVO configQuestionRespVO);
 

+ 4 - 2
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/service/course/CourseServiceImpl.java

@@ -135,15 +135,17 @@ public class CourseServiceImpl implements CourseService {
 
     @Override
     public PageResult<CourseRespVO> getCoursePage(CoursePageReqVO pageReqVO) {
-        pageReqVO.setPageNo(pageReqVO.getPageNo() - 1);
+        pageReqVO.setPageNo((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize());
         List<CoursePageReqVO> coursePageReqVOS = courseMapper.selectCoursePage(pageReqVO);
 
+        // 获取总记录数
+        int total = courseMapper.selectCoursePageCount(pageReqVO);
         // 调用服务层方法获取分页结果
         return new PageResult<>(
                 coursePageReqVOS.stream()
                         .map(doItem -> BeanUtils.toBean(doItem, CourseRespVO.class))
                         .collect(Collectors.toList()),
-                (long) coursePageReqVOS.size()
+                (long) total
         );
     }
 

+ 18 - 17
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/service/courseconfig/CourseConfigServiceImpl.java

@@ -1,32 +1,29 @@
 package cn.iocoder.byzs.module.bjdx.service.courseconfig;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.byzs.framework.common.pojo.PageParam;
+import cn.iocoder.byzs.framework.common.pojo.PageResult;
+import cn.iocoder.byzs.framework.common.util.object.BeanUtils;
 import cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.CourseConfigPageReqVO;
+import cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.CourseConfigRespVO;
 import cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.CourseConfigSaveReqVO;
-import cn.iocoder.byzs.module.bjdx.controller.admin.coursequestion.vo.CourseQuestionPageReqVO;
 import cn.iocoder.byzs.module.bjdx.controller.admin.coursequestion.vo.CourseQuestionRespVO;
-import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursequestion.CourseQuestionDO;
+import cn.iocoder.byzs.module.bjdx.dal.dataobject.courseconfig.CourseConfigDO;
 import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursequestoption.CourseQuestOptionDO;
+import cn.iocoder.byzs.module.bjdx.dal.mysql.courseconfig.CourseConfigMapper;
 import cn.iocoder.byzs.module.bjdx.dal.mysql.coursequestion.CourseQuestionMapper;
 import cn.iocoder.byzs.module.bjdx.dal.mysql.coursequestoption.CourseQuestOptionMapper;
-import org.springframework.stereotype.Service;
 import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
-import java.sql.Wrapper;
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
-import cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.*;
-import cn.iocoder.byzs.module.bjdx.dal.dataobject.courseconfig.CourseConfigDO;
-import cn.iocoder.byzs.framework.common.pojo.PageResult;
-import cn.iocoder.byzs.framework.common.util.object.BeanUtils;
-
-import cn.iocoder.byzs.module.bjdx.dal.mysql.courseconfig.CourseConfigMapper;
-
 import static cn.iocoder.byzs.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.byzs.framework.common.util.collection.CollectionUtils.convertList;
-import static cn.iocoder.byzs.module.bjdx.enums.ErrorCodeConstants.*;
+import static cn.iocoder.byzs.module.bjdx.enums.ErrorCodeConstants.COURSE_CONFIG_NOT_EXISTS;
 
 /**
  * 课程配置 Service 实现类
@@ -98,9 +95,11 @@ public class CourseConfigServiceImpl implements CourseConfigService {
 
     @Override
     public List<CourseConfigRespVO> getCourseConfigQuestion(Long ccCourseId) {
-
         //课程配置列表
-        List<CourseConfigPageReqVO> courseConfigPageReqVOS = courseConfigMapper.selectCourseConfigPage(new CourseConfigPageReqVO().setCcCourseId(Math.toIntExact(ccCourseId)));
+        CourseConfigPageReqVO courseConfigPageReqVO = new CourseConfigPageReqVO();
+        courseConfigPageReqVO.setCcCourseId(Math.toIntExact(ccCourseId))
+                .setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<CourseConfigPageReqVO> courseConfigPageReqVOS = courseConfigMapper.selectCourseConfigPage(courseConfigPageReqVO);
 
         //课程配置列表转VO
         List<CourseConfigRespVO> courseConfigList = courseConfigPageReqVOS.stream()
@@ -144,14 +143,16 @@ public class CourseConfigServiceImpl implements CourseConfigService {
 
     @Override
     public PageResult<CourseConfigPageReqVO> getCourseConfigPage(CourseConfigPageReqVO pageReqVO) {
+        pageReqVO.setPageNo((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize());
         List<CourseConfigPageReqVO> courseConfigPageReqVOS = courseConfigMapper.selectCourseConfigPage(pageReqVO);
+        Integer count = courseConfigMapper.selectCourseConfigCount(pageReqVO);
 
         // 调用服务层方法获取分页结果
         return new PageResult<>(
                 courseConfigPageReqVOS.stream()
                        .map(doItem -> BeanUtils.toBean(doItem, CourseConfigPageReqVO.class))
                        .collect(Collectors.toList()),
-                (long) courseConfigPageReqVOS.size()
+                (long) count
         );
     }
 

+ 3 - 2
byzs-course/src/main/java/cn/iocoder/byzs/module/bjdx/service/questionnaire/QuestionnaireServiceImpl.java

@@ -90,14 +90,15 @@ public class QuestionnaireServiceImpl implements QuestionnaireService {
 
     @Override
     public PageResult<ConfigQuestionRespVO> getConfigQuestPage(ConfigQuestionRespVO configQuestionRespVO) {
+        configQuestionRespVO.setPageNo((configQuestionRespVO.getPageNo() - 1) * configQuestionRespVO.getPageSize());
         List<ConfigQuestionRespVO> configQuestionRespVOList = questionnaireMapper.selectConfigQuestionList(configQuestionRespVO);
-
+        Integer count = questionnaireMapper.selectConfigQuestionCount(configQuestionRespVO);
         // 调用服务层方法获取分页结果
         return new PageResult<ConfigQuestionRespVO>(
                 configQuestionRespVOList.stream()
                         .map(doItem -> BeanUtils.toBean(doItem, ConfigQuestionRespVO.class))
                         .collect(Collectors.toList()),
-                (long) configQuestionRespVOList.size()
+                (long) count
         );
     }
 

+ 16 - 28
byzs-course/src/main/resources/mapper/course/CourseMapper.xml

@@ -2,11 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.iocoder.byzs.module.bjdx.dal.mysql.course.CourseMapper">
 
-    <select id="selectCoursePage" parameterType="cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO"
-            resultType="cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO">
-
-        SELECT c.tenant_id as tenantId,c.id, c.course_name courseName, c.course_image_path courseImagePath, c.course_music_path courseMusicPath, c.course_video_path courseVideoPath, c.course_content_type courseContentType, c.course_author courseAuthor, c.course_teacher courseTeacher, c.course_size courseSize,
-        c.course_time courseTime, c.course_is_inspect courseIsInspect, c.course_label courseLabel, c.course_order courseOrder, c.course_status courseStatus, ct.ct_type courseTypeName
+    <sql id="selectCourseList">
         FROM bjdx_course c
         LEFT JOIN bjdx_course_type ct ON c.course_type = ct.id
         <where>
@@ -28,33 +24,25 @@
             </if>
         </where>
         ORDER BY ct.ct_type_sort, c.course_order
-        limit #{pageNo}, #{pageSize}
+    </sql>
+    <select id="selectCoursePageCount" parameterType="cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO"
+            resultType="int">
+        SELECT COUNT(*)
+        <include refid="selectCourseList"/>
+    </select>
+    <select id="selectCoursePage" parameterType="cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO"
+            resultType="cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO">
+        SELECT c.tenant_id as tenantId,c.id, c.course_name courseName, c.course_image_path courseImagePath, c.course_music_path courseMusicPath, c.course_video_path courseVideoPath, c.course_content_type courseContentType, c.course_author courseAuthor, c.course_teacher courseTeacher, c.course_size courseSize,
+        c.course_time courseTime, c.course_is_inspect courseIsInspect, c.course_label courseLabel, c.course_order courseOrder, c.course_status courseStatus, ct.ct_type courseTypeName
+        <include refid="selectCourseList"/>
+        <if test="pageSize != null and pageSize != -1">
+            limit #{pageNo}, #{pageSize}
+        </if>
     </select>
     <select id="selectCourseList" parameterType="cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO"
             resultType="cn.iocoder.byzs.module.bjdx.controller.admin.course.vo.CoursePageReqVO">
-
         SELECT c.tenant_id as tenantId,c.id, c.course_name courseName, c.course_image_path courseImagePath, c.course_music_path courseMusicPath, c.course_video_path courseVideoPath, c.course_content_type courseContentType, c.course_author courseAuthor, c.course_teacher courseTeacher, c.course_size courseSize,
         c.course_time courseTime, c.course_is_inspect courseIsInspect, c.course_label courseLabel, c.course_order courseOrder, c.course_status courseStatus, ct.ct_type courseTypeName
-        FROM bjdx_course c
-        LEFT JOIN bjdx_course_type ct ON c.course_type = ct.id
-        <where>
-            c.deleted = 0
-            <if test="courseName != null and courseName != ''">
-                AND c.course_name LIKE CONCAT('%', #{courseName}, '%')
-            </if>
-            <if test="courseTeacher!= null and courseTeacher!= ''">
-                AND c.course_teacher LIKE CONCAT('%', #{courseTeacher}, '%')
-            </if>
-            <if test="courseStatus!= null and courseStatus!= ''">
-                AND c.course_status = #{courseStatus}
-            </if>
-            <if test="courseType!= null and courseType!= ''">
-                AND c.course_type = #{courseType}
-            </if>
-            <if test="courseContentType!= null and courseContentType!= ''">
-                AND c.course_content_type = #{courseContentType}
-            </if>
-        </where>
-        ORDER BY ct.ct_type_sort, c.course_order
+        <include refid="selectCourseList"/>
     </select>
 </mapper>

+ 23 - 0
byzs-course/src/main/resources/mapper/courseconfig/CourseConfigMapper.xml

@@ -29,5 +29,28 @@
                 AND cc.cc_answer_judge = #{ccAnswerJudge}
             </if>
         </where>
+        <if test="pageSize != null and pageSize != -1">
+            limit #{pageNo}, #{pageSize}
+        </if>
+    </select>
+    <select id="selectCourseConfigCount" parameterType="cn.iocoder.byzs.module.bjdx.controller.admin.courseconfig.vo.CourseConfigPageReqVO" resultType="java.lang.Integer">
+        SELECT count(*)
+        FROM bjdx_course_config cc
+        LEFT JOIN bjdx_course c ON cc.cc_course_id = c.id
+        <where>
+            c.deleted = 0 and cc.deleted = 0
+            <if test="ccCourseId != null and ccCourseId != ''">
+                AND cc.cc_course_id  = #{ccCourseId}
+            </if>
+            <if test="ccQuestContent != null and ccQuestContent != ''">
+                AND cc.cc_quest_content LIKE CONCAT('%', #{ccQuestContent}, '%')
+            </if>
+            <if test="ccTime != null and ccTime != ''">
+                AND cc.cc_time LIKE CONCAT('%', #{ccTime}, '%')
+            </if>
+            <if test="ccAnswerJudge != null and ccAnswerJudge != ''">
+                AND cc.cc_answer_judge = #{ccAnswerJudge}
+            </if>
+        </where>
     </select>
 </mapper>

+ 22 - 0
byzs-course/src/main/resources/mapper/questionnaire/QuestionnaireMapper.xml

@@ -27,6 +27,28 @@
             <if test="cqQuestion != null">
                 AND cq.cq_question LIKE CONCAT('%', #{cqQuestion}, '%')
             </if>
+        order by qc.bq_order
+        <if test="pageSize != null and pageSize != -1">
+            limit #{pageNo}, #{pageSize}
+        </if>
+    </select>
+
+    <select id="selectConfigQuestionCount" resultType="java.lang.Integer">
+        SELECT count(*)
+        FROM bjdx_questionnaire_config qc
+        LEFT JOIN bjdx_questionnaire q ON q.id = qc.bqc_questionnaire_id
+        LEFT JOIN bjdx_course_question cq ON qc.bqc_question_id = cq.id
+        WHERE
+        <if test="questionnaireId != null">
+            q.id = #{questionnaireId}
+        </if>
+        <if test="cqQuestType != null">
+            AND cq.cq_quest_type = #{cqQuestType}
+        </if>
+        <if test="cqQuestion != null">
+            AND cq.cq_question LIKE CONCAT('%', #{cqQuestion}, '%')
+        </if>
+        order by qc.bq_order
     </select>
 
     <select id="selectConfigQuestionNoList"

+ 7 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/dal/mysql/oauth2/OAuth2AccessTokenMapper.java

@@ -23,6 +23,13 @@ public interface OAuth2AccessTokenMapper extends BaseMapperX<OAuth2AccessTokenDO
         return selectList(OAuth2AccessTokenDO::getRefreshToken, refreshToken);
     }
 
+    // 添加根据用户ID和用户类型查询令牌列表的方法
+    default List<OAuth2AccessTokenDO> selectListByUserIdAndUserType(Long userId, Integer userType) {
+        return selectList(new LambdaQueryWrapperX<OAuth2AccessTokenDO>()
+                .eq(OAuth2AccessTokenDO::getUserId, userId)
+                .eq(OAuth2AccessTokenDO::getUserType, userType));
+    }
+
     default PageResult<OAuth2AccessTokenDO> selectPage(OAuth2AccessTokenPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<OAuth2AccessTokenDO>()
                 .eqIfPresent(OAuth2AccessTokenDO::getUserId, reqVO.getUserId())

+ 11 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/dal/mysql/oauth2/OAuth2RefreshTokenMapper.java

@@ -6,6 +6,8 @@ import cn.iocoder.byzs.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.byzs.module.system.dal.dataobject.oauth2.OAuth2RefreshTokenDO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Set;
+
 @Mapper
 public interface OAuth2RefreshTokenMapper extends BaseMapperX<OAuth2RefreshTokenDO> {
 
@@ -14,6 +16,15 @@ public interface OAuth2RefreshTokenMapper extends BaseMapperX<OAuth2RefreshToken
                 .eq(OAuth2RefreshTokenDO::getRefreshToken, refreshToken));
     }
 
+    // 添加根据刷新令牌集合删除的方法
+    default int deleteByRefreshTokens(Set<String> refreshTokens) {
+        if (refreshTokens == null || refreshTokens.isEmpty()) {
+            return 0;
+        }
+        return delete(new LambdaQueryWrapperX<OAuth2RefreshTokenDO>()
+                .in(OAuth2RefreshTokenDO::getRefreshToken, refreshTokens));
+    }
+
     @TenantIgnore // 获取 token 的时候,需要忽略租户编号。原因是:一些场景下,可能不会传递 tenant-id 请求头,例如说文件上传、积木报表等等
     default OAuth2RefreshTokenDO selectByRefreshToken(String refreshToken) {
         return selectOne(OAuth2RefreshTokenDO::getRefreshToken, refreshToken);

+ 25 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/service/oauth2/OAuth2TokenServiceImpl.java

@@ -31,6 +31,7 @@ import java.time.LocalDateTime;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import static cn.iocoder.byzs.framework.common.exception.util.ServiceExceptionUtil.exception0;
 import static cn.iocoder.byzs.framework.common.util.collection.CollectionUtils.convertSet;
@@ -61,12 +62,36 @@ public class OAuth2TokenServiceImpl implements OAuth2TokenService {
     @Transactional(rollbackFor = Exception.class)
     public OAuth2AccessTokenDO createAccessToken(Long userId, Integer userType, String clientId, List<String> scopes) {
         OAuth2ClientDO clientDO = oauth2ClientService.validOAuthClientFromCache(clientId);
+
+        // 删除用户之前的所有令牌,实现单点登录
+        removeUserTokens(userId, userType);
+
         // 创建刷新令牌
         OAuth2RefreshTokenDO refreshTokenDO = createOAuth2RefreshToken(userId, userType, clientDO, scopes);
         // 创建访问令牌
         return createOAuth2AccessToken(refreshTokenDO, clientDO);
     }
 
+    /**
+     * 删除指定用户的所有令牌
+     *
+     * @param userId 用户ID
+     * @param userType 用户类型
+     */
+    private void removeUserTokens(Long userId, Integer userType) {
+        // 查询用户的所有访问令牌
+        List<OAuth2AccessTokenDO> accessTokenDOs = oauth2AccessTokenMapper.selectListByUserIdAndUserType(userId, userType);
+        if (CollUtil.isNotEmpty(accessTokenDOs)) {
+            // 删除访问令牌
+            oauth2AccessTokenMapper.deleteByIds(convertSet(accessTokenDOs, OAuth2AccessTokenDO::getId));
+            oauth2AccessTokenRedisDAO.deleteList(convertSet(accessTokenDOs, OAuth2AccessTokenDO::getAccessToken));
+
+            // 删除对应的刷新令牌
+            Set<String> refreshTokens = convertSet(accessTokenDOs, OAuth2AccessTokenDO::getRefreshToken);
+            oauth2RefreshTokenMapper.deleteByRefreshTokens(refreshTokens);
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public OAuth2AccessTokenDO refreshAccessToken(String refreshToken, String clientId) {

+ 4 - 7
byzs-web/src/main/java/cn/iocoder/byzs/module/web/service/questionnaire/WebQuestionnaireServiceImpl.java

@@ -1,12 +1,8 @@
 package cn.iocoder.byzs.module.web.service.questionnaire;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.DateTime;
-import cn.iocoder.byzs.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.byzs.framework.common.pojo.PageParam;
 import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaire.vo.ConfigQuestionRespVO;
-import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaireresult.vo.QuestionnaireResultSaveReqVO;
-import cn.iocoder.byzs.module.bjdx.controller.admin.questionnaireresultdetails.vo.QuestionnaireResultDetailsSaveReqVO;
-import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursequestion.CourseQuestionDO;
 import cn.iocoder.byzs.module.bjdx.dal.dataobject.coursequestoption.CourseQuestOptionDO;
 import cn.iocoder.byzs.module.bjdx.dal.dataobject.questionnaire.QuestionnaireDO;
 import cn.iocoder.byzs.module.bjdx.dal.dataobject.questionnaireresult.QuestionnaireResultDO;
@@ -21,7 +17,6 @@ import cn.iocoder.byzs.module.web.controller.admin.questionnaire.vo.WebQuestionn
 import cn.iocoder.byzs.module.web.controller.admin.questionnaire.vo.WebQuestionnaireShowVo;
 import cn.iocoder.byzs.module.web.controller.admin.questionnaire.vo.WebQuestionnaireVo;
 import jakarta.annotation.Resource;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -77,7 +72,9 @@ public class WebQuestionnaireServiceImpl {
         questionnaireVo.setQrQuestIds(questionnaire.getBqQuestIds());
 
         // 问题列表处理
-        List<ConfigQuestionRespVO> configQuestionRespVOList = questionnaireMapper.selectConfigQuestionList(new ConfigQuestionRespVO().setQuestionnaireId(qrId));
+        ConfigQuestionRespVO configQuestionList = new ConfigQuestionRespVO();
+        configQuestionList.setQuestionnaireId(qrId).setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<ConfigQuestionRespVO> configQuestionRespVOList = questionnaireMapper.selectConfigQuestionList(configQuestionList);
         if (CollUtil.isNotEmpty(configQuestionRespVOList)) {
             Set<Long> qustionIdSet = configQuestionRespVOList.stream().map(ConfigQuestionRespVO::getId).collect(Collectors.toSet());
 

+ 0 - 0
byzs-web/src/main/java/cn/iocoder/byzs/web/service/VideoProcessingService.java