# 租户端(机构管理端)全面优化记录 > 所属端:租户端(机构管理员视角) > 状态:已优化 > 创建日期:2026-03-31 > 最后更新:2026-04-09 --- ## 概述 以广东省立中山图书馆(gdlib)为典型租户,从机构管理员/运营人员视角全面审查并优化了租户端的所有模块。 ## Day5 (2026-03-31) — 优化内容 ### 基础设施 - [x] 数据隔离验证:确认活动/报名/作品查询全部带 tenantId 过滤 - [x] 日志菜单权限修复:补充 log:read 权限 - [x] 公告权限修复:补充 notice:update / notice:delete 权限 - [x] 403 报错修复:fetchTenants 调用加 isSuperAdmin 守卫(contests/Index, system/users/Index) - [x] 评审规则组件映射修复:contests/ReviewRules 指向正确的 reviews/Index.vue - [x] 作品详情路由权限修复:work:read 改为 contest:work:read ### 工作台(新增) - [x] 新增租户端工作台页面(TenantDashboard.vue) - [x] 欢迎信息 + 机构标识(时段问候、管理员姓名、机构名称/类型) - [x] 6个统计卡片(可见活动/进行中/总报名/待审核报名/总作品/今日报名),可点击跳转 - [x] 空数据新手引导(三步:创建活动→添加成员→邀请评委) - [x] 快捷操作按权限动态显示(固定四项:活动列表、报名管理、作品管理、评委管理;不含「用户管理」,用户管理从系统设置进入) - [x] 待办提醒(待审核报名 + 即将截止的活动) - [x] 最近活动列表 + 查看全部入口 - [x] 后端 GET /contests/dashboard 接口 ### 机构信息(新增) - [x] 新增机构信息管理页面(tenant-info/Index.vue) - [x] 查看/编辑机构名称和描述 - [x] 复制登录地址 - [x] 后端 GET/PATCH /tenants/my-tenant 接口 ### 活动列表 - [x] 租户端加统计概览(6个阶段卡片,后端 getStats 加 tenantId 过滤) - [x] 精简表格列(去掉主办方/可见范围/公开机构,加活动阶段列) - [x] 筛选自动查询(下拉 @change) - [x] 报名/作品数可点击跳转 - [x] 修复发布弹窗机构选择 bug(租户端用 my-tenant 接口获取自己信息) - [x] 操作按钮逻辑优化(未发布:发布/编辑/删除;已发布:查看/评委/编辑/取消发布) ### 创建/编辑活动 - [x] 重构页面布局:去掉 card 嵌套,改为独立分区卡片 - [x] 修复 form layout 冲突(vertical + labelCol) - [x] 去掉固定宽度,改用栅格响应式 - [x] 4 个分区:主办信息、活动信息、图片附件、时间配置 ### 评委管理 - [x] 筛选自动查询 - [x] 导入/导出改为 disabled + tooltip - [x] 主色调统一 #6366f1 - [x] 冻结/解冻二次确认 #### 赛事评委接口(`GET /contests/judges/contest/:id`) - 响应为结构化对象,包含两部分:**`assigned`**(机构在该赛事下**显式添加**的评委,对应 `t_biz_contest_judge`,每条均有 `id`、`judgeId` 等)与 **`implicitPool`**(平台评委租户下对该赛事**默认可用**、尚未写入关联表的用户,`id` 为 null,`isPlatform` 为 true)。 - **添加评委抽屉**:「已选」回显与提交时的增删差集**仅基于 `assigned`**;可选评委仍来自评委管理分页接口。 - **作品分配**:可选评委池为 **`assigned` ∪ `implicitPool`**(前端合并);表格行键与选中状态统一使用 **`judgeId`**,与分配接口提交的 `judgeIds` 一致。 ### 报名管理(Index) - [x] 去掉个人/团队 Tab,合并展示加类型列 - [x] 统计概览(总报名/待审核/已通过/已拒绝) - [x] 表格加审核状态分类计数列(并行查询每个活动的统计) - [x] 去掉手动启动/关闭报名 ### 报名记录(Records) - [x] 主色调统一 - [x] 统计概览 + 可点击筛选 - [x] 租户端去掉机构列 - [x] 筛选自动查询 - [x] 通过加二次确认 - [x] 批量审核改用后端批量接口 POST /contests/registrations/batch-review - [x] 返回按钮 - [x] 去掉「参与方式」列(子女已改为独立账号) - [x] 撤销审核功能 PATCH /contests/registrations/:id/revoke ### 作品管理(Index) - [x] 去掉 Tab,加统计概览 + 类型筛选 - [x] 递交进度彩色数字(已交/应交) - [x] 活动名可点击 ### 作品详情(WorksDetail) - [x] 返回按钮 - [x] 统计概览 - [x] 租户端去掉机构筛选 - [x] 筛选自动查询(分配状态、递交时间、机构下拉) - [x] 后端支持 assignStatus / name / submitStartTime / submitEndTime 筛选 - [x] 分配评委去掉评审时间限制(任何时候都可分配) ### 评审进度 - [x] 去掉 Tab,加统计概览 + 类型筛选 - [x] 评审状态改用实际完成率(无作品/未开始/进行中/已完成) - [x] 进度数字颜色区分 - [x] 评审进度详情页筛选修复(评审进度前端过滤生效) - 活动列表接口 `GET /contests` 为每行返回 `reviewedCount`(该活动下**已分配且全部分配均为 completed** 的作品数)与 `totalWorksCount`(最新有效作品总数),与分配表及评委端评审任务口径一致;见 [评委端评审任务](../judge-portal/review-tasks.md#与租户端评审进度的口径对齐)。 ### 评审规则 - [x] 组件映射修复 - [x] 主色调统一 - [x] 表格加评委数/计算方式列 - [x] 修复规则描述列数据展示错误 - [x] 已关联活动删除保护提示 - [x] Drawer 标题区分新建/编辑 ### 成果发布(Index) - [x] 去掉 Tab,加统计概览(全部/已发布/未发布) - [x] 加发布状态筛选 + 类型筛选 - [x] 活动名可点击 - [x] 操作按钮文案优化(查看成果/发布成果) ### 成果发布详情(Detail)— 功能补全 - [x] 统计摘要(总作品/已评分/已排名/已设奖/平均分) - [x] 三步操作流程(计算得分→计算排名→设置奖项) - [x] 排名列(金银铜色徽章) - [x] 奖项列(彩色标签) - [x] 奖项筛选(动态从数据提取) - [x] 单个设奖(combobox,选项来自自动设奖配置 + 已有数据) - [x] 自动设奖改为自定义奖项(动态添加行:奖项名称+人数) - [x] 后端 AutoSetAwardsDto 改为 awards 数组格式 - [x] 发布按钮二次确认 ### 通知公告 - [x] 主色调统一 - [x] 发布/取消发布二次确认 - [x] 操作逻辑优化(未发布:发布/编辑/删除;已发布:查看/取消发布) - [x] 发布状态筛选 - [x] 日期改为时间范围选择器 - [x] 创建时间列 + 按创建时间倒序 - [x] 后端支持 publishStartDate / publishEndDate 范围查询 ### 新增 API ``` GET /contests/dashboard — 租户端仪表盘 GET /contests/stats (加 tenantId) — 活动统计支持租户过滤 GET /tenants/my-tenant — 获取当前租户信息 PATCH /tenants/my-tenant — 更新当前租户信息 POST /contests/registrations/batch-review — 批量审核报名 PATCH /contests/registrations/:id/revoke — 撤销报名审核 GET /contests/registrations/stats (加 tenantId) — 报名统计支持租户过滤 ``` ### 成果发布详情(Detail)— 功能补全 - [x] 统计摘要(总作品/已评分/已排名/已设奖/平均分) - [x] 三步操作流程(计算得分→计算排名→设置奖项) - [x] 排名列(金银铜色徽章)+ 奖项列(彩色标签)+ 奖项筛选 - [x] 自定义奖项支持(动态添加奖项名称+人数,替代硬编码一/二/三等奖) - [x] 单个设奖(combobox,选项来自自动设奖配置 + 已有数据) - [x] 后端 AutoSetAwardsDto 改为 awards 数组格式 ### 数据统计模块(新增) - [x] 后端 analytics.module / controller / service - [x] GET /analytics/overview — 核心指标+漏斗+月度趋势+活动对比 - [x] GET /analytics/review — 评审效率+评委工作量+奖项分布 - [x] 前端安装 echarts + vue-echarts - [x] analytics/Overview.vue — 6个指标卡片 + 报名转化漏斗 + ECharts月度趋势折线图 + 活动对比表 - [x] analytics/Review.vue — 4个效率卡片 + 评委工作量表 + ECharts奖项分布饼图 - [x] 菜单注册:数据统计(运营概览 + 评审分析) ### Bug 修复 - [x] 超管端重置其他租户用户密码报「用户不存在」— controller 增加超管判断跳过租户过滤 - [x] gdlib 登录快捷标签密码与实际不一致 — 更新为 admin123 ### 新增 API(完整) ``` GET /contests/dashboard — 租户端仪表盘 GET /contests/stats (加 tenantId) — 活动统计支持租户过滤 GET /tenants/my-tenant — 获取当前租户信息 PATCH /tenants/my-tenant — 更新当前租户信息 POST /contests/registrations/batch-review — 批量审核报名 PATCH /contests/registrations/:id/revoke — 撤销报名审核 GET /contests/registrations/stats (加 tenantId) — 报名统计支持租户过滤 GET /analytics/overview — 运营概览统计 GET /analytics/review — 评审分析统计 ``` ### 数据库变更 - menus 表新增:工作台(id=50)、机构信息(id=51)、数据统计(id=52)、运营概览(id=53)、评审分析(id=54) - permissions 表新增:log:read、notice:update、notice:delete(gdlib 租户) - work_tags 表新增 color 字段 - 前端依赖新增:echarts、vue-echarts