2 커밋 4d4d264827 ... 13bc106ded

작성자 SHA1 메시지 날짜
  liyanbo 13bc106ded 剥离AI诗词课,单独给出入口:配套后端的所有逻辑 4 주 전
  liyanbo 36c3cebd27 后台登录需要输入租户,校验逻辑需要根据租户id校验,并给出提示,前太不限制(前台无需输入租户) 4 주 전

+ 2 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/userwebexpiretime/vo/UserWebExpireTimeSaveReqVO.java

@@ -21,4 +21,6 @@ public class UserWebExpireTimeSaveReqVO {
     @Schema(description = "AI实验课权限过期时间")
     private LocalDateTime aiCourseExpireTime;
 
+    @Schema(description = "AI诗词权限过期时间")
+    private LocalDateTime aiPoetryExpireTime;
 }

+ 4 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/dal/dataobject/userwebexpiretime/UserWebExpireTimeDO.java

@@ -40,6 +40,10 @@ public class UserWebExpireTimeDO extends BaseDO {
      * AI实验课权限过期时间
      */
     private LocalDateTime aiCourseExpireTime;
+    /**
+     * AI诗词权限过期时间
+     */
+    private LocalDateTime aiPoetryExpireTime;
 
 
 }

+ 2 - 1
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/enums/ErrorCodeConstants.java

@@ -18,6 +18,7 @@ public interface ErrorCodeConstants {
     ErrorCode AUTH_REGISTER_CAPTCHA_CODE_ERROR = new ErrorCode(1_002_000_008, "验证码不正确,原因:{}");
     ErrorCode AUTH_LOGIN_IP_NOT_AUTHORIZED = new ErrorCode(1_002_000_009, "登录IP未被授权,请使用手机号校验登录!");
     ErrorCode AUTH_LOGIN_IP_NOT_AUTHORIZED_NOT_MOBILE_NOT_EXISTS = new ErrorCode(1_002_000_010, "登录IP未被授权,账号未绑定手机号,请联系管理员绑定手机号!");
+    ErrorCode AUTH_LOGIN_TENANT_NOT_EXISTS = new ErrorCode(1_002_000_011, "登录失败,此租户下账号不存在!");
 
     // ========== 菜单模块 1-002-001-000 ==========
     ErrorCode MENU_NAME_DUPLICATE = new ErrorCode(1_002_001_000, "已经存在该名字的菜单");
@@ -181,4 +182,4 @@ public interface ErrorCodeConstants {
     // ========== 站内信发送 1-002-028-000 ==========
     ErrorCode NOTIFY_SEND_TEMPLATE_PARAM_MISS = new ErrorCode(1_002_028_000, "模板参数({})缺失");
 
-}
+}

+ 12 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/service/auth/AdminAuthServiceImpl.java

@@ -91,17 +91,29 @@ public class AdminAuthServiceImpl implements AdminAuthService {
 
     @Override
     public AdminUserDO authenticate(String username, String password) {
+
+        Long tenantId = TenantContextHolder.getTenantId();
+
         final LoginLogTypeEnum logTypeEnum = LoginLogTypeEnum.LOGIN_USERNAME;
 
         // 校验账号是否存在
         List<AdminUserDO> userList = TenantUtils.executeIgnore(() ->
                 userService.getUserListByUsername(username)
         );
+
         if (userList.isEmpty()) {
             createLoginLog(null, username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
             throw exception(AUTH_LOGIN_BAD_CREDENTIALS);
         }
 
+        if (Objects.nonNull(tenantId)) {
+            userList.removeIf(userDO -> !userDO.getTenantId().equals(tenantId));
+            if (userList.isEmpty()) {
+                createLoginLog(null, username, logTypeEnum, LoginResultEnum.BAD_CREDENTIALS);
+                throw exception(AUTH_LOGIN_TENANT_NOT_EXISTS);
+            }
+        }
+
         AdminUserDO user = userList.get(0);
         boolean isMatch = true;
         for (AdminUserDO userDO : userList) {

+ 16 - 0
byzs-web/src/main/java/cn/iocoder/byzs/module/web/service/aiCourseProgress/WebAiCourseProgressServiceImpl.java

@@ -92,6 +92,22 @@ public class WebAiCourseProgressServiceImpl {
                     }
                 }
                 break;
+
+            case "aiPoetry":// blocklu诗词通关
+                progressLambdaQueryWrapperX
+                        .eqIfPresent(WebAiCourseProgressDO::getArpCtId, progress.getArpCtId())
+                        .eqIfPresent(WebAiCourseProgressDO::getArpCourseId, progress.getArpCourseId());
+                WebAiCourseProgressDO aiPoetryProgressDo = progressMapper.selectOne(progressLambdaQueryWrapperX);
+
+                if (aiPoetryProgressDo == null) {
+                    progressMapper.insert(progress);
+                }else {
+                    if (progress.getArpProgress() > aiPoetryProgressDo.getArpProgress()){
+                        aiPoetryProgressDo.setArpProgress(progress.getArpProgress());
+                        progressMapper.updateById(aiPoetryProgressDo);
+                    }
+                }
+                break;
         }
     }
 

+ 11 - 1
byzs-web/src/main/java/cn/iocoder/byzs/module/web/service/login/WebLoginServiceImpl.java

@@ -118,6 +118,9 @@ public class WebLoginServiceImpl {
             if (roleWebMap.contains("aiCourse")){
                 userWebExpireTime.setAiCourseExpireTime(userWebExpireTime.getAiCourseExpireTime().plusDays(inviteCode.getValidTime()));
             }
+            if (roleWebMap.contains("aiPoetry")){
+                userWebExpireTime.setAiPoetryExpireTime(userWebExpireTime.getAiPoetryExpireTime().plusDays(inviteCode.getValidTime()));
+            }
 
             // 更新用户web过期时间
             userWebExpireTimeService.updateUserWebExpireTime(BeanUtils.toBean(userWebExpireTime, UserWebExpireTimeSaveReqVO.class));
@@ -133,6 +136,10 @@ public class WebLoginServiceImpl {
             if (roleWebMap.contains("aiCourse")){
                 userWebExpireTimeDO.setAiCourseExpireTime(LocalDateTime.now().plusDays(inviteCode.getValidTime()));
             }
+            if (roleWebMap.contains("aiPoetry")){
+                userWebExpireTimeDO.setAiPoetryExpireTime(LocalDateTime.now().plusDays(inviteCode.getValidTime()));
+            }
+
             userWebExpireTimeService.createUserWebExpireTime(userWebExpireTimeDO);
         }
         // 用户id
@@ -182,13 +189,16 @@ public class WebLoginServiceImpl {
                 if(userWebExpireTime.getAiCourseExpireTime() == null || userWebExpireTime.getAiCourseExpireTime().isBefore(now)){
                     roleRouteSet.remove("aiCourse");
                 }
+                if(userWebExpireTime.getAiPoetryExpireTime() == null || userWebExpireTime.getAiPoetryExpireTime().isBefore(now)){
+                    roleRouteSet.remove("aiPoetry");
+                }
             }
         }
 
         //封装路由配置
         webRoleRouteVO.setRouteList(roleRouteSet);
         //存在课程就填充通识课路由权限
-        if (roleRouteSet.stream().anyMatch(s -> s.equals("course"))) {
+        if (roleRouteSet.stream().anyMatch(s -> s.equals("course") || s.equals("aiPoetry"))) {
             if (!roleRouteMenuSet.isEmpty()){
                 webRoleRouteVO.setCourseRouteMenuList(roleRouteMenuSet);
             }else{

+ 10 - 0
byzs-web/src/main/java/cn/iocoder/byzs/module/web/service/user/WebUserInfoServiceImpl.java

@@ -130,6 +130,13 @@ public class WebUserInfoServiceImpl {
                 }
                 userWebExpireTime.setAiCourseExpireTime(aiCourseExpireTime.plusDays(inviteCodeDo.getValidTime()));
             }
+            if (roleWebMap.contains("aiPoetry")){
+                LocalDateTime aiPoetryExpireTime = userWebExpireTime.getAiPoetryExpireTime();
+                if(aiPoetryExpireTime == null){
+                    aiPoetryExpireTime = LocalDateTime.now();
+                }
+                userWebExpireTime.setAiPoetryExpireTime(aiPoetryExpireTime.plusDays(inviteCodeDo.getValidTime()));
+            }
 
             // 更新用户web过期时间
             userWebExpireTimeService.updateUserWebExpireTime(BeanUtils.toBean(userWebExpireTime, UserWebExpireTimeSaveReqVO.class));
@@ -145,6 +152,9 @@ public class WebUserInfoServiceImpl {
             if (roleWebMap.contains("aiCourse")){
                 userWebExpireTimeDO.setAiCourseExpireTime(LocalDateTime.now().plusDays(inviteCodeDo.getValidTime()));
             }
+            if (roleWebMap.contains("aiPoetry")){
+                userWebExpireTimeDO.setAiPoetryExpireTime(LocalDateTime.now().plusDays(inviteCodeDo.getValidTime()));
+            }
             userWebExpireTimeService.createUserWebExpireTime(userWebExpireTimeDO);
         }