From 0935ec5ec512084b2d7b4012d0f29a84efc06404 Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Thu, 30 Oct 2025 17:59:04 +0800 Subject: [PATCH] =?UTF-8?q?fix=20=E9=80=89=E6=8B=A9=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/study/task/LearningTaskService.java | 4 +- .../java/org/xyzh/common/vo/PermissionVO.java | 14 + .../controller/LearningTaskController.java | 2 +- .../impl/SCLearningTaskServiceImpl.java | 44 +- .../resources/mapper/PermissionMapper.xml | 2 + schoolNewsWeb/src/apis/study/learning-task.ts | 4 +- schoolNewsWeb/src/apis/system/role.ts | 6 +- .../src/assets/imgs/calendar-icon.svg | 6 + schoolNewsWeb/src/assets/imgs/dept-icon.svg | 6 + schoolNewsWeb/src/assets/imgs/usermange.svg | 6 + schoolNewsWeb/src/assets/styles/common.scss | 462 +++++++ .../src/components/base/GenericSelector.vue | 21 + schoolNewsWeb/src/main.ts | 3 + schoolNewsWeb/src/types/permission/index.ts | 1 + .../admin/manage/logs/OperationLogsView.vue | 4 +- .../src/views/admin/manage/study/TaskCard.vue | 354 +++++ .../admin/manage/study/TaskManageView.vue | 1169 ++++++++++++++++- .../src/views/admin/manage/study/index.ts | 1 + .../admin/manage/system/DeptManageView.vue | 11 +- .../system/ModulePermissionManageView.vue | 10 +- .../admin/manage/system/RoleManageView.vue | 12 +- .../src/views/public/task/LearningTaskAdd.vue | 296 +++-- 22 files changed, 2313 insertions(+), 125 deletions(-) create mode 100644 schoolNewsWeb/src/assets/imgs/calendar-icon.svg create mode 100644 schoolNewsWeb/src/assets/imgs/dept-icon.svg create mode 100644 schoolNewsWeb/src/assets/imgs/usermange.svg create mode 100644 schoolNewsWeb/src/assets/styles/common.scss create mode 100644 schoolNewsWeb/src/views/admin/manage/study/TaskCard.vue create mode 100644 schoolNewsWeb/src/views/admin/manage/study/index.ts diff --git a/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/task/LearningTaskService.java b/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/task/LearningTaskService.java index 1321602..c29933c 100644 --- a/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/task/LearningTaskService.java +++ b/schoolNewsServ/api/api-study/src/main/java/org/xyzh/api/study/task/LearningTaskService.java @@ -32,11 +32,11 @@ public interface LearningTaskService { * @description 获取学习任务列表分页 * @param filter 过滤条件 * @param pageParam 分页参数 - * @return ResultDomain 任务列表 + * @return ResultDomain 任务列表(包含统计信息) * @author yslg * @since 2025-10-15 */ - ResultDomain getTaskPage(TbLearningTask filter, PageParam pageParam); + ResultDomain getTaskPage(TbLearningTask filter, PageParam pageParam); /** * @description 根据ID获取任务详情 diff --git a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/PermissionVO.java b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/PermissionVO.java index e329999..c644ffa 100644 --- a/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/PermissionVO.java +++ b/schoolNewsServ/common/common-dto/src/main/java/org/xyzh/common/vo/PermissionVO.java @@ -98,6 +98,12 @@ public class PermissionVO extends BaseDTO{ */ private String menuID; + /** + * @description 父菜单ID(用于权限绑定菜单查询) + * @author yslg + * @since 2025-10-30 + */ + private String parentID; /** * @description 菜单名称(用于权限绑定菜单查询) * @author yslg @@ -304,6 +310,14 @@ public class PermissionVO extends BaseDTO{ this.menuID = menuID; } + public String getParentID() { + return parentID; + } + + public void setParentID(String parentID) { + this.parentID = parentID; + } + public String getMenuName() { return menuName; } diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningTaskController.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningTaskController.java index 5e42088..a24c34e 100644 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningTaskController.java +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/controller/LearningTaskController.java @@ -49,7 +49,7 @@ public class LearningTaskController { * 获取任务列表分页 */ @PostMapping("/page") - public ResultDomain getTaskPage(@RequestBody PageRequest pageRequest) { + public ResultDomain getTaskPage(@RequestBody PageRequest pageRequest) { TbLearningTask filter = pageRequest.getFilter(); PageParam pageParam = pageRequest.getPageParam(); return learningTaskService.getTaskPage(filter, pageParam); diff --git a/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningTaskServiceImpl.java b/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningTaskServiceImpl.java index 6387b54..1893c2b 100644 --- a/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningTaskServiceImpl.java +++ b/schoolNewsServ/study/src/main/java/org/xyzh/study/service/impl/SCLearningTaskServiceImpl.java @@ -109,16 +109,52 @@ public class SCLearningTaskServiceImpl implements LearningTaskService { } @Override - public ResultDomain getTaskPage(TbLearningTask filter, PageParam pageParam) { - ResultDomain resultDomain = new ResultDomain<>(); + public ResultDomain getTaskPage(TbLearningTask filter, PageParam pageParam) { + ResultDomain resultDomain = new ResultDomain<>(); // 获取当前用户的部门角色 List userDeptRoles = LoginUtil.getCurrentDeptRole(); List taskList = learningTaskMapper.selectLearningTasksPage(filter, pageParam, userDeptRoles); long total = learningTaskMapper.countLearningTasks(filter, userDeptRoles); pageParam.setTotalElements(total); pageParam.setTotalPages((int) Math.ceil((double) total / pageParam.getPageSize())); - PageDomain pageDomain = new PageDomain<>(); - pageDomain.setDataList(taskList); + + // 将TbLearningTask转换为TaskVO,并添加统计信息 + List taskVOList = new ArrayList<>(); + for (TbLearningTask task : taskList) { + TaskVO taskVO = new TaskVO(); + taskVO.setLearningTask(task); + + String taskID = task.getTaskID(); + // 获取任务的用户列表并统计各状态人数 + List taskUsers = taskUserMapper.selectByTaskId(taskID); + int totalUserNum = taskUsers.size(); + int completedUserNum = 0; + int learningUserNum = 0; + int notStartUserNum = 0; + + for (TbTaskUser taskUser : taskUsers) { + Integer status = taskUser.getStatus(); + if (status != null) { + if (status == 2) { + completedUserNum++; + } else if (status == 1) { + learningUserNum++; + } else if (status == 0) { + notStartUserNum++; + } + } + } + + taskVO.setTotalTaskNum(totalUserNum); + taskVO.setCompletedTaskNum(completedUserNum); + taskVO.setLearningTaskNum(learningUserNum); + taskVO.setNotStartTaskNum(notStartUserNum); + + taskVOList.add(taskVO); + } + + PageDomain pageDomain = new PageDomain<>(); + pageDomain.setDataList(taskVOList); pageDomain.setPageParam(pageParam); resultDomain.success("获取任务列表分页成功", pageDomain); return resultDomain; diff --git a/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml b/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml index 23b6440..00f090a 100644 --- a/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml +++ b/schoolNewsServ/system/src/main/resources/mapper/PermissionMapper.xml @@ -55,6 +55,7 @@ + @@ -301,6 +302,7 @@ tsm.id, tsm.menu_id, tsm.name AS menu_name, + tsm.parent_id AS parent_id, tsm.url AS menu_url FROM tb_sys_menu tsm INNER JOIN tb_sys_menu_permission tsmp ON tsmp.menu_id = tsm.menu_id diff --git a/schoolNewsWeb/src/apis/study/learning-task.ts b/schoolNewsWeb/src/apis/study/learning-task.ts index b0dbadd..8f665d6 100644 --- a/schoolNewsWeb/src/apis/study/learning-task.ts +++ b/schoolNewsWeb/src/apis/study/learning-task.ts @@ -53,8 +53,8 @@ export const learningTaskApi = { * @param filter 过滤条件 * @returns Promise> */ - async getTaskPage(pageParam: PageParam, filter: LearningTask): Promise> { - const response = await api.post(`${this.learningTaskPrefix}/page`, {pageParam, filter}); + async getTaskPage(pageParam: PageParam, filter: LearningTask): Promise> { + const response = await api.post(`${this.learningTaskPrefix}/page`, {pageParam, filter}); return response.data; }, /** diff --git a/schoolNewsWeb/src/apis/system/role.ts b/schoolNewsWeb/src/apis/system/role.ts index 534c6fd..4bec4b0 100644 --- a/schoolNewsWeb/src/apis/system/role.ts +++ b/schoolNewsWeb/src/apis/system/role.ts @@ -5,7 +5,7 @@ */ import { api } from '@/apis/index'; -import type { SysPermission, SysRole, SysRolePermission, ResultDomain } from '@/types'; +import type { SysPermission, SysRole, SysRolePermission, ResultDomain, UserDeptRoleVO } from '@/types'; /** * 角色API服务 @@ -17,8 +17,8 @@ export const roleApi = { * @author yslg * @ since 2025-10-09 */ - async getAllRoles(): Promise> { - const response = await api.post('/roles/all'); + async getAllRoles(): Promise> { + const response = await api.post('/roles/all'); return response.data; }, diff --git a/schoolNewsWeb/src/assets/imgs/calendar-icon.svg b/schoolNewsWeb/src/assets/imgs/calendar-icon.svg new file mode 100644 index 0000000..cf07f77 --- /dev/null +++ b/schoolNewsWeb/src/assets/imgs/calendar-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/schoolNewsWeb/src/assets/imgs/dept-icon.svg b/schoolNewsWeb/src/assets/imgs/dept-icon.svg new file mode 100644 index 0000000..e08b972 --- /dev/null +++ b/schoolNewsWeb/src/assets/imgs/dept-icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/schoolNewsWeb/src/assets/imgs/usermange.svg b/schoolNewsWeb/src/assets/imgs/usermange.svg new file mode 100644 index 0000000..09ada96 --- /dev/null +++ b/schoolNewsWeb/src/assets/imgs/usermange.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/schoolNewsWeb/src/assets/styles/common.scss b/schoolNewsWeb/src/assets/styles/common.scss new file mode 100644 index 0000000..65b2cac --- /dev/null +++ b/schoolNewsWeb/src/assets/styles/common.scss @@ -0,0 +1,462 @@ +/** + * @description 全局通用样式 + * @author yslg + * @since 2025-10-30 + * @figma https://www.figma.com/design/4aM0yqyoAjtW2jTZcqPAtN + */ + +// ============ 设计令牌 (Design Tokens) ============ + +// 颜色 +$color-primary: #C62828; // 主色(红色) +$color-primary-hover: #B71C1C; // 主色悬停 +$color-text-primary: #1D2129; // 主要文字 +$color-text-secondary: #4E5969; // 次要文字 +$color-text-disabled: #C9CDD4; // 禁用文字/图标 +$color-bg-secondary: #F2F3F5; // 次要背景 +$color-bg-white: #FFFFFF; // 白色背景 +$color-border: #dcdfe6; // 边框 + +// 字体 +$font-family-cn: 'PingFang SC', 'Microsoft YaHei', sans-serif; +$font-family-en: 'Nunito Sans', sans-serif; +$font-size-base: 14px; +$line-height-base: 1.571428571em; + +// 圆角 +$border-radius-small: 2px; +$border-radius-medium: 4px; +$border-radius-large: 8px; + +// 间距 +$spacing-xs: 4px; +$spacing-sm: 8px; +$spacing-md: 12px; +$spacing-lg: 16px; +$spacing-xl: 20px; +$spacing-xxl: 24px; + +// ============ 按钮样式 ============ + +// 主要操作按钮 +.btn-primary { + display: flex; + align-items: center; + gap: $spacing-xs; + padding: $spacing-sm $spacing-xl; + background: #409eff; + border: none; + border-radius: $border-radius-medium; + color: $color-bg-white; + font-size: $font-size-base; + font-weight: 500; + cursor: pointer; + transition: all 0.3s; + + &:hover { + background: #66b1ff; + } + + &:disabled { + cursor: not-allowed; + opacity: 0.5; + } +} + +// 创建/新增按钮(红色主题) +.btn-create { + display: flex; + align-items: center; + gap: $spacing-xs; + padding: $spacing-sm $spacing-lg; + background: #E7000B; + border: none; + border-radius: $border-radius-large; + color: $color-bg-white; + font-size: $font-size-base; + font-weight: 500; + cursor: pointer; + transition: all 0.3s; + + .icon { + font-size: 16px; + font-weight: bold; + } + + &:hover { + background: #C70009; + } + + &:disabled { + cursor: not-allowed; + opacity: 0.5; + } +} + +// 搜索按钮 +.btn-search { + padding: $spacing-sm $spacing-xl; + border-radius: $border-radius-medium; + font-size: $font-size-base; + cursor: pointer; + transition: all 0.3s; + border: none; + background: #409eff; + color: $color-bg-white; + + &:hover { + background: #66b1ff; + } +} + +// 重置按钮 +.btn-reset { + padding: $spacing-sm $spacing-xl; + border-radius: $border-radius-medium; + font-size: $font-size-base; + cursor: pointer; + transition: all 0.3s; + border: 1px solid $color-border; + background: $color-bg-white; + color: #606266; + + &:hover { + color: #409eff; + border-color: #409eff; + } +} + +// 危险操作按钮 +.btn-danger { + padding: $spacing-sm $spacing-xl; + border-radius: $border-radius-medium; + font-size: $font-size-base; + cursor: pointer; + transition: all 0.3s; + border: none; + background: #f56c6c; + color: $color-bg-white; + + &:hover { + background: #f78989; + } +} + +// 链接样式按钮(用于表格操作列) +.btn-link { + border: none; + padding: 6px 12px; + font-size: 13px; + cursor: pointer; + transition: all 0.3s; + border-radius: $border-radius-medium; + min-width: 64px; + text-align: center; + white-space: nowrap; + color: $color-bg-white; + + &:hover { + opacity: 0.8; + } + + &.btn-primary { + background: #409eff; + } + + &.btn-warning { + background: #e6a23c; + } + + &.btn-success { + background: #67c23a; + } + + &.btn-danger { + background: #f56c6c; + } + + &.btn-info { + background: #909399; + } +} + +// ============ 分页样式 (基于Figma设计) ============ + +// 分页容器 +.pagination-container { + display: flex; + justify-content: flex-end; + align-items: center; + padding: $spacing-md 0; + margin-top: 32px; + background: #F9FAFB; + border-radius: $border-radius-large; + + // Element Plus 分页组件自定义样式 + :deep(.el-pagination) { + display: flex; + align-items: center; + gap: $spacing-sm; + padding: 0 $spacing-xxl; + + // 总条数文本 + .el-pagination__total { + font-family: $font-family-cn; + font-size: $font-size-base; + font-weight: 400; + line-height: $line-height-base; + color: $color-text-primary; + margin-right: 0; + } + + // 每页条数选择器 + .el-pagination__sizes { + margin: 0; + + .el-select { + .el-select__wrapper { + background: $color-bg-secondary; + border: none; + border-radius: $border-radius-small; + padding: $spacing-xs $spacing-md; + min-height: 32px; + box-shadow: none; + + .el-select__selected-item { + font-family: $font-family-cn; + font-size: $font-size-base; + font-weight: 400; + line-height: $line-height-base; + color: $color-text-primary; + } + + .el-select__suffix { + .el-icon { + color: $color-text-secondary; + } + } + + &:hover { + background: darken($color-bg-secondary, 3%); + } + } + } + } + + // 上一页/下一页按钮 + .btn-prev, + .btn-next { + background: transparent; + border: none; + padding: 10px; + min-width: auto; + width: 32px; + height: 32px; + border-radius: $border-radius-small; + + .el-icon { + color: $color-text-secondary; + } + + &:hover:not(:disabled) { + background: rgba($color-primary, 0.08); + + .el-icon { + color: $color-primary; + } + } + + &:disabled { + background: transparent; + cursor: not-allowed; + + .el-icon { + color: $color-text-disabled; + } + } + } + + // 页码列表 + .el-pager { + display: flex; + align-items: center; + gap: $spacing-xs; + + li { + background: transparent; + border: none; + border-radius: $border-radius-small; + padding: $spacing-xs; + min-width: 32px; + height: 32px; + line-height: 24px; + font-family: $font-family-en; + font-size: $font-size-base; + font-weight: 600; + color: $color-text-secondary; + text-align: center; + margin: 0; + + &:hover:not(.is-active):not(.is-disabled) { + background: rgba($color-primary, 0.08); + color: $color-primary; + } + + &.is-active { + background: $color-primary; + color: $color-bg-white; + } + + &.is-disabled { + color: $color-text-disabled; + cursor: not-allowed; + } + + // 更多页省略号 + &.more { + background: transparent; + color: $color-text-secondary; + + &:hover { + color: $color-primary; + } + } + } + } + + // 跳转输入框 + .el-pagination__jump { + margin-left: 0; + font-family: $font-family-cn; + font-size: $font-size-base; + color: $color-text-primary; + + .el-input { + .el-input__wrapper { + background: $color-bg-white; + border: 1px solid $color-border; + border-radius: $border-radius-small; + padding: $spacing-xs $spacing-sm; + box-shadow: none; + width: 60px; + + .el-input__inner { + font-family: $font-family-en; + font-size: $font-size-base; + font-weight: 600; + color: $color-text-primary; + text-align: center; + } + + &:hover { + border-color: $color-primary; + } + + &.is-focus { + border-color: $color-primary; + box-shadow: none; + } + } + } + } + } +} + +// ============ 加载状态 ============ + +.loading-container, +.empty-container { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 100px 20px; + color: #909399; +} + +.loading-spinner { + width: 40px; + height: 40px; + border: 4px solid #f3f3f3; + border-top: 4px solid $color-primary; + border-radius: 50%; + animation: spin 1s linear infinite; + margin-bottom: $spacing-lg; +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} + +.empty-icon { + font-size: 64px; + margin-bottom: $spacing-lg; +} + +// ============ 表格加载和空状态 ============ + +.loading-cell, +.empty-cell { + text-align: center; + padding: 60px 20px !important; + color: #909399; +} + +// ============ 搜索栏 ============ + +.search-bar { + background: $color-bg-white; + padding: $spacing-xl; + border-radius: $border-radius-large; + margin-bottom: $spacing-xl; + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); + display: flex; + gap: $spacing-lg; + flex-wrap: wrap; + align-items: flex-end; +} + +.search-group { + display: flex; + flex-direction: column; + gap: $spacing-sm; + min-width: 180px; +} + +.search-label { + font-size: $font-size-base; + font-weight: 500; + color: #606266; +} + +.search-input, +.search-select { + padding: $spacing-sm $spacing-md; + border: 1px solid $color-border; + border-radius: $border-radius-medium; + font-size: $font-size-base; + color: #606266; + transition: border-color 0.3s; + + &:focus { + outline: none; + border-color: #409eff; + } +} + +.search-select { + cursor: pointer; +} + +.search-actions { + display: flex; + gap: $spacing-md; + margin-left: auto; +} + +// ============ 工具栏 ============ + +.toolbar { + margin-bottom: $spacing-xl; +} diff --git a/schoolNewsWeb/src/components/base/GenericSelector.vue b/schoolNewsWeb/src/components/base/GenericSelector.vue index a068ff3..7c5b411 100644 --- a/schoolNewsWeb/src/components/base/GenericSelector.vue +++ b/schoolNewsWeb/src/components/base/GenericSelector.vue @@ -818,14 +818,21 @@ function moveBackSelected() { selectedTarget.value.includes(getItemId(item)) ); + // 添加回可选列表 availableList.value.push(...itemsToMoveBack); + + // 从已选列表中移除 targetList.value = targetList.value.filter(item => !selectedTarget.value.includes(getItemId(item)) ); // 如果是树形模式,重新构建树 if (props.useTree && props.treeTransform) { + // 清空展开状态 + expandedKeys.value.clear(); + // 重新构建树结构 treeData.value = props.treeTransform(availableList.value); + // 重新展开所有节点 expandAllNodes(treeData.value); } @@ -836,12 +843,19 @@ function moveBackSelected() { function moveBackToAvailable(itemId: string) { const item = targetList.value.find(i => getItemId(i) === itemId); if (item) { + // 添加回可选列表 availableList.value.push(item); + + // 从已选列表中移除 targetList.value = targetList.value.filter(i => getItemId(i) !== itemId); // 如果是树形模式,重新构建树 if (props.useTree && props.treeTransform) { + // 清空展开状态 + expandedKeys.value.clear(); + // 重新构建树结构 treeData.value = props.treeTransform(availableList.value); + // 重新展开所有节点 expandAllNodes(treeData.value); } } @@ -849,12 +863,19 @@ function moveBackToAvailable(itemId: string) { // 移回所有项到可选区域 function moveBackAll() { + // 添加回可选列表 availableList.value.push(...targetList.value); + + // 清空已选列表 targetList.value = []; // 如果是树形模式,重新构建树 if (props.useTree && props.treeTransform) { + // 清空展开状态 + expandedKeys.value.clear(); + // 重新构建树结构 treeData.value = props.treeTransform(availableList.value); + // 重新展开所有节点 expandAllNodes(treeData.value); } diff --git a/schoolNewsWeb/src/main.ts b/schoolNewsWeb/src/main.ts index 7d7b2b0..432b373 100644 --- a/schoolNewsWeb/src/main.ts +++ b/schoolNewsWeb/src/main.ts @@ -11,6 +11,9 @@ import { setupPermissionDirectives } from "@/directives/permission"; // 引入 Quill 富文本编辑器样式(全局) import "quill/dist/quill.snow.css"; +// 引入全局通用样式 +import "@/assets/styles/common.scss"; + // 初始化应用 async function initApp() { const app = createApp(App); diff --git a/schoolNewsWeb/src/types/permission/index.ts b/schoolNewsWeb/src/types/permission/index.ts index 11b06cf..81d1318 100644 --- a/schoolNewsWeb/src/types/permission/index.ts +++ b/schoolNewsWeb/src/types/permission/index.ts @@ -22,6 +22,7 @@ export interface SysPermission extends BaseDTO { moduleCode?: string; moduleDescription?: string; menuID?: string; + parentID?: string; menuName?: string; menuUrl?: string; roleID?: string; diff --git a/schoolNewsWeb/src/views/admin/manage/logs/OperationLogsView.vue b/schoolNewsWeb/src/views/admin/manage/logs/OperationLogsView.vue index bf87e94..44fee68 100644 --- a/schoolNewsWeb/src/views/admin/manage/logs/OperationLogsView.vue +++ b/schoolNewsWeb/src/views/admin/manage/logs/OperationLogsView.vue @@ -276,10 +276,10 @@ -
+

响应结果

-
{{ currentLog.responseResult }}
+
{{ currentLog.responseData }}
diff --git a/schoolNewsWeb/src/views/admin/manage/study/TaskCard.vue b/schoolNewsWeb/src/views/admin/manage/study/TaskCard.vue new file mode 100644 index 0000000..0fd558d --- /dev/null +++ b/schoolNewsWeb/src/views/admin/manage/study/TaskCard.vue @@ -0,0 +1,354 @@ + + + + + + diff --git a/schoolNewsWeb/src/views/admin/manage/study/TaskManageView.vue b/schoolNewsWeb/src/views/admin/manage/study/TaskManageView.vue index 95c703c..bb5f7a2 100644 --- a/schoolNewsWeb/src/views/admin/manage/study/TaskManageView.vue +++ b/schoolNewsWeb/src/views/admin/manage/study/TaskManageView.vue @@ -1,51 +1,806 @@