feat: 会议提交剩余时间+解冻 + 会务/劳务材料批量下载 + 多角色人员/账号模块完善

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
郭庆泰
2026-08-25 06:53:18 +08:00
co-authored by Claude
parent 0c882ae846
commit 591a43fe61
126 changed files with 3789 additions and 1334 deletions
+13 -8
View File
@@ -28,6 +28,7 @@ const routes = [
{ path: 'projects', name: 'admin-projects', component: () => import('@/views/manager/Projects.vue'), meta: { title: '项目管理' } },
{ path: 'meetings', name: 'admin-meetings', component: () => import('@/views/meetings/Meetings.vue'), meta: { title: '会议管理' } },
{ path: 'meetings/detail/:meetingId', name: 'admin-meetings-detail', component: () => import('@/views/meetings/MeetingDetail.vue'), meta: { title: '会议详情' } },
{ path: 'meetings/view/:meetingId', name: 'admin-meetings-view', component: () => import('@/views/meetings/MeetingDetail.vue'), meta: { title: '会议详情', readonly: true } },
{ path: 'meetings/new', name: 'admin-meetings-new', component: () => import('@/views/meetings/MeetingNew.vue'), meta: { title: '新建会议' } },
{ path: 'department', name: 'admin-department', component: () => import('@/views/admin/Department.vue'), meta: { title: '科室管理' } },
{ path: 'title', name: 'admin-title', component: () => import('@/views/admin/Title.vue'), meta: { title: '职称管理' } },
@@ -36,12 +37,12 @@ const routes = [
{ path: 'experts/edit/:id', name: 'admin-experts-edit', component: () => import('@/views/expert/ExpertNew.vue'), meta: { title: '编辑专家' } },
{ path: 'experts/view/:id', name: 'admin-experts-view', component: () => import('@/views/admin/ExpertDetail.vue'), meta: { title: '专家详情' } },
{ path: 'sponsor-orgs', name: 'admin-sponsor-orgs', component: () => import('@/views/sponsor-orgs/SponsorOrgs.vue'), meta: { title: '支持单位管理' } },
{ path: 'executor-orgs', name: 'admin-executor-orgs', component: () => import('@/views/executor-orgs/ExecutorOrgs.vue'), meta: { title: '服务机构管理' } },
{ path: 'executor-orgs', name: 'admin-executor-orgs', component: () => import('@/views/executor-orgs/ExecutorOrgs.vue'), meta: { title: '执行单位管理' } },
{ path: 'sponsor-people', name: 'admin-sponsor-people', component: () => import('@/views/sponsor-people/SponsorPeople.vue'), meta: { title: '支持单位下人员' } },
{ path: 'sponsor-people/new', name: 'admin-sponsor-people-new', component: () => import('@/views/sponsor-people/SponsorPersonNew.vue'), meta: { title: '新建人员' } },
{ path: 'sponsor-people/edit/:id', name: 'admin-sponsor-people-edit', component: () => import('@/views/sponsor-people/SponsorPersonNew.vue'), meta: { title: '编辑人员' } },
{ path: 'sponsor-people/view/:id', name: 'admin-sponsor-people-view', component: () => import('@/views/sponsor-people/SponsorPersonDetail.vue'), meta: { title: '人员详情' } },
{ path: 'executor-people', name: 'admin-executor-people', component: () => import('@/views/executor-people/ExecutorPeople.vue'), meta: { title: '服务机构下人员' } },
{ path: 'executor-people', name: 'admin-executor-people', component: () => import('@/views/executor-people/ExecutorPeople.vue'), meta: { title: '执行单位下人员' } },
{ path: 'executor-people/new', name: 'admin-executor-people-new', component: () => import('@/views/executor-people/ExecutorPersonNew.vue'), meta: { title: '新建人员' } },
{ path: 'executor-people/edit/:id', name: 'admin-executor-people-edit', component: () => import('@/views/executor-people/ExecutorPersonNew.vue'), meta: { title: '编辑人员' } },
{ path: 'executor-people/view/:id', name: 'admin-executor-people-view', component: () => import('@/views/executor-people/ExecutorPersonDetail.vue'), meta: { title: '人员详情' } },
@@ -60,7 +61,8 @@ const routes = [
{ path: '/manager', component: AdminLayout, meta: { role: 'manager' }, children: [
{ path: '', redirect: { name: 'manager-workbench' } },
{ path: 'workbench', name: 'manager-workbench', component: () => import('@/views/manager/Workbench.vue'), meta: { title: '工作台' } },
{ path: 'plans', name: 'manager-plans', component: () => import('@/views/manager/Plans.vue'), meta: { title: '项目策划方案' } },
{ path: 'plans', name: 'manager-plans', component: () => import('@/views/manager/Plans.vue'), meta: { title: '策划方案管理' } },
{ path: 'plans/edit/:planId', name: 'manager-plans-edit', component: () => import('@/views/manager/PlanEdit.vue'), meta: { title: '修改策划方案' } },
{ path: 'projects', name: 'manager-projects', component: () => import('@/views/manager/Projects.vue'), meta: { title: '项目管理' } },
{ path: 'projects/new', name: 'manager-projects-new', component: () => import('@/views/manager/ProjectsNew.vue'), meta: { title: '新建项目' } },
{ path: 'projects/edit/:projectId', name: 'manager-projects-edit', component: () => import('@/views/manager/ProjectsNew.vue'), meta: { title: '编辑项目' } },
@@ -68,18 +70,19 @@ const routes = [
{ path: 'projects/assign', name: 'manager-projects-assign', component: () => import('@/views/manager/ManagerProjectsAssign.vue'), meta: { title: '项目分配' } },
{ path: 'meetings', name: 'manager-meetings', component: () => import('@/views/meetings/Meetings.vue'), meta: { title: '会议管理' } },
{ path: 'meetings/detail/:meetingId', name: 'manager-meetings-detail', component: () => import('@/views/meetings/MeetingDetail.vue'), meta: { title: '会议详情' } },
{ path: 'meetings/view/:meetingId', name: 'manager-meetings-view', component: () => import('@/views/meetings/MeetingDetail.vue'), meta: { title: '会议详情', readonly: true } },
{ path: 'meetings/new', name: 'manager-meetings-new', component: () => import('@/views/meetings/MeetingNew.vue'), meta: { title: '新建会议' } },
{ path: 'experts', name: 'manager-experts', component: () => import('@/views/expert/Experts.vue'), meta: { title: '专家审核' } },
{ path: 'experts/new', name: 'manager-experts-new', component: () => import('@/views/expert/ExpertNew.vue'), meta: { title: '新建专家' } },
{ path: 'experts/edit/:id', name: 'manager-experts-edit', component: () => import('@/views/expert/ExpertNew.vue'), meta: { title: '编辑专家' } },
{ path: 'experts/view/:id', name: 'manager-experts-view', component: () => import('@/views/admin/ExpertDetail.vue'), meta: { title: '专家详情' } },
{ path: 'sponsor-orgs', name: 'manager-sponsor-orgs', component: () => import('@/views/sponsor-orgs/SponsorOrgs.vue'), meta: { title: '支持单位管理' } },
{ path: 'executor-orgs', name: 'manager-executor-orgs', component: () => import('@/views/executor-orgs/ExecutorOrgs.vue'), meta: { title: '服务机构管理' } },
{ path: 'executor-orgs', name: 'manager-executor-orgs', component: () => import('@/views/executor-orgs/ExecutorOrgs.vue'), meta: { title: '执行单位管理' } },
{ path: 'sponsor-people', name: 'manager-sponsor-people', component: () => import('@/views/sponsor-people/SponsorPeople.vue'), meta: { title: '支持单位下人员' } },
{ path: 'sponsor-people/new', name: 'manager-sponsor-people-new', component: () => import('@/views/sponsor-people/SponsorPersonNew.vue'), meta: { title: '新建人员' } },
{ path: 'sponsor-people/edit/:id', name: 'manager-sponsor-people-edit', component: () => import('@/views/sponsor-people/SponsorPersonNew.vue'), meta: { title: '编辑人员' } },
{ path: 'sponsor-people/view/:id', name: 'manager-sponsor-people-view', component: () => import('@/views/sponsor-people/SponsorPersonDetail.vue'), meta: { title: '人员详情' } },
{ path: 'executor-people', name: 'manager-executor-people', component: () => import('@/views/executor-people/ExecutorPeople.vue'), meta: { title: '服务机构下人员' } },
{ path: 'executor-people', name: 'manager-executor-people', component: () => import('@/views/executor-people/ExecutorPeople.vue'), meta: { title: '执行单位下人员' } },
{ path: 'executor-people/new', name: 'manager-executor-people-new', component: () => import('@/views/executor-people/ExecutorPersonNew.vue'), meta: { title: '新建人员' } },
{ path: 'executor-people/edit/:id', name: 'manager-executor-people-edit', component: () => import('@/views/executor-people/ExecutorPersonNew.vue'), meta: { title: '编辑人员' } },
{ path: 'executor-people/view/:id', name: 'manager-executor-people-view', component: () => import('@/views/executor-people/ExecutorPersonDetail.vue'), meta: { title: '人员详情' } },
@@ -106,15 +109,16 @@ const routes = [
]
},
{ path: '/executor', component: AdminLayout, meta: { role: 'executor' }, children: [
{ path: '', redirect: { name: 'executor-overview' } },
{ path: '', redirect: { name: 'executor-submissions' } },
{ path: 'overview', name: 'executor-overview', component: () => import('@/views/executor/Overview.vue'), meta: { title: '首页' } },
{ path: 'submissions', name: 'executor-submissions', component: () => import('@/views/doctor/Submissions.vue'), meta: { title: '我的项目策划方案' } },
{ path: 'submission/new', name: 'executor-submission-new', component: () => import('@/views/doctor/SubmissionNew.vue'), meta: { title: '新建项目策划方案' } },
{ path: 'submission/detail/:planId', name: 'executor-submission-detail', component: () => import('@/views/doctor/SubmissionDetail.vue'), meta: { title: '策划方案详情' } },
{ path: 'submission/edit/:planId', name: 'executor-submission-edit', component: () => import('@/views/doctor/SubmissionNew.vue'), meta: { title: '修改项目策划方案' } },
{ path: 'meetings', name: 'executor-meetings', component: () => import('@/views/executor/Meetings.vue'), meta: { title: '会议执行' } },
{ path: 'meetings', name: 'executor-meetings', component: () => import('@/views/executor/Meetings.vue'), meta: { title: '会议列表' } },
{ path: 'meetings/new', name: 'executor-meetings-new', component: () => import('@/views/meetings/MeetingNew.vue'), meta: { title: '新建会议' } },
{ path: 'meetings/detail/:meetingId', name: 'executor-meetings-detail', component: () => import('@/views/meetings/MeetingDetail.vue'), meta: { title: '会议详情' } },
{ path: 'meetings/view/:meetingId', name: 'executor-meetings-view', component: () => import('@/views/meetings/MeetingDetail.vue'), meta: { title: '会议详情', readonly: true } },
{ path: 'projects', name: 'executor-projects', component: () => import('@/views/executor/Projects.vue'), meta: { title: '项目列表' } },
{ path: 'projects/detail/:projectId', name: 'executor-projects-detail', component: () => import('@/views/manager/ManagerProjectDetail.vue'), meta: { title: '项目详情' } },
{ path: 'people', name: 'executor-people', component: () => import('@/views/executor/People.vue'), meta: { title: '人员管理' } },
@@ -138,6 +142,7 @@ const routes = [
{ path: 'projects/detail/:projectId', name: 'sponsor-projects-detail', component: () => import('@/views/manager/ManagerProjectDetail.vue'), meta: { title: '项目详情' } },
{ path: 'meetings', name: 'sponsor-meetings', component: () => import('@/views/meetings/Meetings.vue'), meta: { title: '会议列表' } },
{ path: 'meetings/detail/:meetingId', name: 'sponsor-meetings-detail', component: () => import('@/views/meetings/MeetingDetail.vue'), meta: { title: '会议详情' } },
{ path: 'meetings/view/:meetingId', name: 'sponsor-meetings-view', component: () => import('@/views/meetings/MeetingDetail.vue'), meta: { title: '会议详情', readonly: true } },
{ path: 'people', name: 'sponsor-people', component: () => import('@/views/sponsor/SponsorPeople.vue'), meta: { title: '人员管理' } },
{ path: 'people/new', name: 'sponsor-people-new', component: () => import('@/views/sponsor/NewPerson.vue'), meta: { title: '新建人员' } },
{ path: 'people/edit/:id', name: 'sponsor-people-edit', component: () => import('@/views/sponsor/NewPerson.vue'), meta: { title: '编辑人员' } },
@@ -155,7 +160,7 @@ const router = createRouter({
})
router.beforeEach((to, from, next) => {
document.title = (to.meta?.title || 'BAHIM') + ' - BAHIM 项目管理系统'
document.title = (to.meta?.title || 'BAHIM') + ' - 合规系统'
// 公开路由 (无 role meta) 不拦截
if (!to.meta?.role) return next()
// 需要登录的路由: 未登录跳登录 (带 redirect)