Ver código fonte

1、新增blockly课程权限配置,登录查询配置操作

liyanbo 4 meses atrás
pai
commit
ae31e2a566

+ 10 - 4
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/permission/PermissionController.java

@@ -2,10 +2,7 @@ package cn.iocoder.byzs.module.system.controller.admin.permission;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.byzs.framework.common.pojo.CommonResult;
-import cn.iocoder.byzs.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleCourseScopeReqVO;
-import cn.iocoder.byzs.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleDataScopeReqVO;
-import cn.iocoder.byzs.module.system.controller.admin.permission.vo.permission.PermissionAssignRoleMenuReqVO;
-import cn.iocoder.byzs.module.system.controller.admin.permission.vo.permission.PermissionAssignUserRoleReqVO;
+import cn.iocoder.byzs.module.system.controller.admin.permission.vo.permission.*;
 import cn.iocoder.byzs.module.system.service.permission.PermissionService;
 import cn.iocoder.byzs.module.system.service.tenant.TenantService;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -72,6 +69,15 @@ public class PermissionController {
         return success(true);
     }
 
+
+    @PostMapping("/assign-role-blockly-scope")
+    @Operation(summary = "赋予角色blockly权限")
+    @PreAuthorize("@ss.hasPermission('system:permission:assign-role-data-scope')")//后续改成blockly单独权限,目前没办法测试并更改租户默认管理员的权限
+    public CommonResult<Boolean> assignRoleBlocklyScope(@Valid @RequestBody PermissionAssignRoleBlocklyScopeReqVO reqVO) {
+        permissionService.assignRoleBlocklyScope(reqVO.getRoleId(), reqVO.getDataScopeBlocklyIds());
+        return success(true);
+    }
+
     @Operation(summary = "获得管理员拥有的角色编号列表")
     @Parameter(name = "userId", description = "用户编号", required = true)
     @GetMapping("/list-user-roles")

+ 21 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleBlocklyScopeReqVO.java

@@ -0,0 +1,21 @@
+package cn.iocoder.byzs.module.system.controller.admin.permission.vo.permission;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+
+import java.util.Collections;
+import java.util.Set;
+
+@Schema(description = "管理后台 - 赋予角色blockly权限 Request VO")
+@Data
+public class PermissionAssignRoleBlocklyScopeReqVO {
+
+    @Schema(description = "角色编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "角色编号不能为空")
+    private Long roleId;
+
+    @Schema(description = "blockly课程编号列表,只有范围类型为 BLOCKLY_CUSTOM 时,该字段才需要", example = "1,3,5")
+    private Set<Long> dataScopeBlocklyIds = Collections.emptySet(); // 兜底
+
+}

+ 3 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/controller/admin/permission/vo/role/RoleRespVO.java

@@ -56,6 +56,9 @@ public class RoleRespVO {
     @Schema(description = "课程范围(指定课程数组)", example = "1")
     private Set<Long> dataScopeCourseIds;
 
+    @Schema(description = "课程范围(指定blockly课程数组)", example = "1")
+    private Set<Long> dataScopeBlocklyIds;
+
 
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "时间戳格式")

+ 7 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/dal/dataobject/permission/RoleDO.java

@@ -81,5 +81,12 @@ public class RoleDO extends TenantBaseDO {
      */
     @TableField(typeHandler = JacksonTypeHandler.class)
     private Set<Long> dataScopeCourseIds;
+    /**
+     * 数据范围(指定blockly课程数组)
+     *
+     * 适用于 {@link #dataScope} 的值为 {@link DataScopeEnum#BLOCKLY_CUSTOM} 时
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private Set<Long> dataScopeBlocklyIds;
 
 }

+ 8 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/service/permission/PermissionService.java

@@ -143,6 +143,14 @@ public interface PermissionService {
      */
     void assignRoleCourseScope(Long roleId, Set<Long> dataScopeCourseIds);
 
+    /**
+     * 设置角色的blockly权限
+     *
+     * @param roleId           角色编号
+     * @param dataScopeBlocklyIds blockly编号数组
+     */
+    void assignRoleBlocklyScope(Long roleId, Set<Long> dataScopeBlocklyIds);
+
     /**
      * 获得登陆用户的部门数据权限
      *

+ 5 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/service/permission/PermissionServiceImpl.java

@@ -277,6 +277,11 @@ public class PermissionServiceImpl implements PermissionService {
         roleService.updateRoleCourseScope(roleId, dataScopeCourseIds);
     }
 
+    @Override
+    public void assignRoleBlocklyScope(Long roleId, Set<Long> dataScopeBlocklyIds) {
+        roleService.updateRoleBlocklyScope(roleId, dataScopeBlocklyIds);
+    }
+
     @Override
     @DataPermission(enable = false) // 关闭数据权限,不然就会出现递归获取数据权限的问题
     public DeptDataPermissionRespDTO getDeptDataPermission(Long userId) {

+ 7 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/service/permission/RoleService.java

@@ -55,6 +55,13 @@ public interface RoleService {
      * @param dataScopeCourseIds 课程编号数组
      */
     void updateRoleCourseScope(Long id, Set<Long> dataScopeCourseIds);
+    /**
+     * 设置角色的blockly权限
+     *
+     * @param id 角色编号
+     * @param dataScopeBlocklyIds blockly编号数组
+     */
+    void updateRoleBlocklyScope(Long id, Set<Long> dataScopeBlocklyIds);
 
     /**
      * 获得角色

+ 13 - 0
byzs-module-system/src/main/java/cn/iocoder/byzs/module/system/service/permission/RoleServiceImpl.java

@@ -120,6 +120,19 @@ public class RoleServiceImpl implements RoleService {
         roleMapper.updateById(updateObject);
     }
 
+    @Override
+    public void updateRoleBlocklyScope(Long id, Set<Long> dataScopeBlocklyIds) {
+
+        // 校验是否可以更新
+        validateRoleForUpdate(id);
+
+        // 更新课程权限
+        RoleDO updateObject = new RoleDO();
+        updateObject.setId(id);
+        updateObject.setDataScopeBlocklyIds(dataScopeBlocklyIds);
+        roleMapper.updateById(updateObject);
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     @CacheEvict(value = RedisKeyConstants.ROLE, key = "#id")

+ 18 - 28
byzs-web/src/main/java/cn/iocoder/byzs/module/web/controller/admin/blockly/WebBlocklyController.java

@@ -45,8 +45,6 @@ public class WebBlocklyController {
 
     @GetMapping("/getTypeTheme")
     @Operation(summary = "获得blockly主题")
-    @TenantIgnore
-    @PermitAll
     public CommonResult<List<BlocklyTypeRespVO>> getTypeTheme() {
         BlocklyTypeListReqVO listReqVO = new BlocklyTypeListReqVO().setCtTypeNode("0");
         List<BlocklyTypeDO> list = blocklyTypeService.getBlocklyTypeList(listReqVO);
@@ -56,8 +54,6 @@ public class WebBlocklyController {
 
     @GetMapping("/getTypeByThemeId")
     @Operation(summary = "获得blockly课程类型-根据主题id")
-    @TenantIgnore
-    @PermitAll
     public CommonResult<List<WebBlocklyTypeVO>> getTypeByThemeId(@RequestParam("id") Integer themeId) {
         List<WebBlocklyTypeVO> list = webBlocklyService.getTypeByThemeId(themeId);
         return success(list);
@@ -65,8 +61,6 @@ public class WebBlocklyController {
 
     @GetMapping("/getBlocklyByTypeId")
     @Operation(summary = "获得blockly课程-根据课程类型id")
-    @TenantIgnore
-    @PermitAll
     public CommonResult<List<WebBlocklyVO>> getBlocklyByTypeId(@RequestParam("typeId") Long typeId) {
         List<WebBlocklyVO> blocklyVoList = webBlocklyService.getBlocklyVoByTypeId(typeId);
         return success(blocklyVoList);
@@ -74,13 +68,11 @@ public class WebBlocklyController {
 
     @GetMapping("/getBlocklyTypeTree")
     @Operation(summary = "获取课程类型树结构(配置权限使用)")
-    @TenantIgnore
-    @PermitAll
     public CommonResult<List<TreeNode>> getBlocklyTypeTree() {
         // 获取所有课程类型
         List<BlocklyTypeDO> allBlocklyTypes = blocklyTypeService.getBlocklyTypeList(new BlocklyTypeListReqVO());
         // 获取所有课程
-        List<BlocklyPageReqVO> allBlocklys = blocklyService.getBlocklyList(new BlocklyPageReqVO());
+//        List<BlocklyPageReqVO> allBlocklys = blocklyService.getBlocklyList(new BlocklyPageReqVO());
         
         // 构建课程类型ID到课程类型的映射
         Map<Long, BlocklyTypeDO> blocklyTypeMap = new HashMap<>();
@@ -97,15 +89,15 @@ public class WebBlocklyController {
                 TreeNode node = new TreeNode();
                 node.setId(blocklyType.getId());
                 node.setParentId(blocklyType.getCtParentId());
-                node.setName(blocklyType.getCtType() + "(年级)");
-                node.setType("年级");
+                node.setName(blocklyType.getCtType() + "(主题)");
+                node.setType("主题");
                 treeNodes.add(node);
             }
         }
         
         // 递归添加子节点
         for (TreeNode node : treeNodes) {
-            addChildNodes(node, allBlocklyTypes, allBlocklys, blocklyTypeMap);
+            addChildNodes(node, allBlocklyTypes, blocklyTypeMap);
         }
         
         return success(treeNodes);
@@ -114,8 +106,7 @@ public class WebBlocklyController {
     /**
      * 递归添加子节点
      */
-    private void addChildNodes(TreeNode parentNode, List<BlocklyTypeDO> allBlocklyTypes, 
-                             List<BlocklyPageReqVO> allBlocklys, Map<Long, BlocklyTypeDO> blocklyTypeMap) {
+    private void addChildNodes(TreeNode parentNode, List<BlocklyTypeDO> allBlocklyTypes, Map<Long, BlocklyTypeDO> blocklyTypeMap) {
         List<TreeNode> children = new ArrayList<>();
         
         // 添加子课程类型
@@ -124,27 +115,26 @@ public class WebBlocklyController {
                 TreeNode childNode = new TreeNode();
                 childNode.setId(blocklyType.getId());
                 childNode.setParentId(blocklyType.getCtParentId());
-                String nodeType = blocklyType.getCtTypeNode().equals("1") ? "通识课" : "实操课";
-                childNode.setName(blocklyType.getCtType() + "(类型)");
-                childNode.setType(nodeType);
+                childNode.setName(blocklyType.getCtType());
+                childNode.setType("blocklyType");
                 children.add(childNode);
                 
                 // 递归添加子节点的子节点
-                addChildNodes(childNode, allBlocklyTypes, allBlocklys, blocklyTypeMap);
+//                addChildNodes(childNode, allBlocklyTypes, allBlocklys, blocklyTypeMap);
             }
         }
         
         // 添加关联的课程
-        for (BlocklyPageReqVO blockly : allBlocklys) {
-            if (parentNode.getId().equals(blockly.getBcType())) {
-                TreeNode childNode = new TreeNode();
-                childNode.setId(blockly.getId()*100);
-                childNode.setParentId(blockly.getBcType());
-                childNode.setName(blockly.getBcName());
-                childNode.setType("blockly");
-                children.add(childNode);
-            }
-        }
+//        for (BlocklyPageReqVO blockly : allBlocklys) {
+//            if (parentNode.getId().equals(blockly.getBcType())) {
+//                TreeNode childNode = new TreeNode();
+//                childNode.setId(blockly.getId());
+//                childNode.setParentId(blockly.getBcType());
+//                childNode.setName(blockly.getBcName());
+//                childNode.setType("blockly");
+//                children.add(childNode);
+//            }
+//        }
         
         parentNode.setChildren(children);
     }

+ 8 - 0
byzs-web/src/main/java/cn/iocoder/byzs/module/web/controller/admin/login/WebLoginController.java

@@ -109,16 +109,24 @@ public class WebLoginController {
 
         // 将所有角色的dataScopeCourseIds拼接成一个Set集合
         Set<Long> allDataScopeCourseIds = new HashSet<>();
+        Set<Long> allDataScopeBlocklyIds = new HashSet<>();
         for (RoleDO role : roles) {
+            // 填充课程数据权限
             Set<Long> dataScopeCourseIds = role.getDataScopeCourseIds();
             if (dataScopeCourseIds != null && !dataScopeCourseIds.isEmpty()) {
                 allDataScopeCourseIds.addAll(dataScopeCourseIds);
             }
+            //blocklu课程数据权限
+            Set<Long> dataScopeBlocklyIds = role.getDataScopeBlocklyIds();
+            if (dataScopeBlocklyIds != null && !dataScopeBlocklyIds.isEmpty()) {
+                allDataScopeBlocklyIds.addAll(dataScopeBlocklyIds);
+            }
         }
 
         //填充课程数据权限
         AuthLoginVO authLoginVO = BeanUtils.toBean(login, AuthLoginVO.class);
         authLoginVO.setCourseDataScope(allDataScopeCourseIds);
+        authLoginVO.setBlocklyDataScope(allDataScopeBlocklyIds);
         return authLoginVO;
     }
 }

+ 3 - 0
byzs-web/src/main/java/cn/iocoder/byzs/module/web/controller/admin/login/vo/AuthLoginVO.java

@@ -24,4 +24,7 @@ public class AuthLoginVO {
 
     @Schema(description = "课程权限")
     private Set<Long> courseDataScope;
+
+    @Schema(description = "blockly课程权限")
+    private Set<Long> blocklyDataScope;
 }

+ 5 - 4
byzs-web/src/main/resources/mapper/blockly/WebBlocklyMapper.xml

@@ -14,12 +14,13 @@
             ROUND(COALESCE((SUM(brp.brp_progress) * 1.0 / NULLIF(COUNT(bct.ct_type) * 100, 0)) * 5, 0), 0) AS progress
         FROM
             blockly_course_type bct
-                LEFT JOIN blockly_report_progress brp ON bct.id = brp.brp_ct_id
-                AND bct.ct_parent_id = brp.brp_zt_id
+                LEFT JOIN blockly_report_progress brp
+                          ON bct.id = brp.brp_ct_id
+                              AND bct.ct_parent_id = brp.brp_zt_id
+                              AND brp.brp_user_id = #{userId}
+                              AND brp.brp_course_config_id IS NULL
         WHERE
             bct.ct_parent_id = #{ctParentId}
-              AND brp.brp_user_id = #{userId}
-              AND brp.brp_course_config_id IS NULL
         GROUP BY id, ctType, ctParentId, ctTypeImage, ctTypeSort;
     </select>
 </mapper>