From 218f01d6b16c9d0220ec55c9e0cef8f0fd2ea6c9 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 17 Jan 2026 11:33:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=AD=9B=E9=80=89=E7=BB=84?= =?UTF-8?q?=E4=BB=B6UI=EF=BC=9A=E6=B7=B1=E7=81=B0=E8=89=B2=E8=83=8C?= =?UTF-8?q?=E6=99=AF=E3=80=81=E7=BB=BF=E8=89=B2=E9=80=89=E4=B8=AD=E6=96=87?= =?UTF-8?q?=E5=AD=97=E3=80=81=E6=B7=BB=E5=8A=A0label=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/TaskFilters.vue | 600 +++++++++++++++ frontend/src/types/components.d.ts | 1 + frontend/src/views/TaskHall.vue | 955 +++++------------------- 3 files changed, 808 insertions(+), 748 deletions(-) create mode 100644 frontend/src/components/TaskFilters.vue diff --git a/frontend/src/components/TaskFilters.vue b/frontend/src/components/TaskFilters.vue new file mode 100644 index 0000000..511f177 --- /dev/null +++ b/frontend/src/components/TaskFilters.vue @@ -0,0 +1,600 @@ + + + + + diff --git a/frontend/src/types/components.d.ts b/frontend/src/types/components.d.ts index b9f0977..d738a2a 100644 --- a/frontend/src/types/components.d.ts +++ b/frontend/src/types/components.d.ts @@ -69,5 +69,6 @@ declare module 'vue' { RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] TaskCard: typeof import('./../components/TaskCard.vue')['default'] + TaskFilters: typeof import('./../components/TaskFilters.vue')['default'] } } diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index 8f47fd7..e3cc591 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -58,173 +58,23 @@ - -
- -
- - - 最新发布 - 积分最高 - 时效最短 - 最热门 - - 共 {{ total }} 个任务 -
- - -
- + - 全部待接 - 待接单 - 待部门审核 - - - - - {{ type.name }} - - - - - - {{ subType.name }} - - - - - - {{ brand.name }} - - - - - - {{ category.name }} - - - - - - {{ platform.name }} - - - - - - - {{ dept.deptName }} - - - - - 今天 - 本周 - 本月 - - -
- - - - -
- - 重置 -
-
+ @reset="handleReset" + />
@@ -441,146 +291,28 @@
- + -
- -
- - - 最新提交 - 积分最高 - - 共 {{ reviewTotal }} 个待审核任务 -
- - -
- - 全部待审核 - 待需求审核 - 待接单审核 - - - - - {{ type.name }} - - - - - - {{ brand.name }} - - - - - - {{ category.name }} - - - - - - {{ platform.name }} - - - - - 今天 - 本周 - 本月 - -
- - -
- - - - - - 重置 - -
-
+ +
@@ -809,150 +541,29 @@
- + -
- -
- - - 最新发布 - 截止最近 - 进度最低 - - 共 {{ inProgressTotal }} 个进行中任务 -
- - -
- - 全部 - 进行中 - 待接单 - 待前置完成 - - - - - {{ type.name }} - - - - - - {{ brand.name }} - - - - - - {{ category.name }} - - - - - - {{ platform.name }} - - - - - 今天 - 本周 - 本月 - -
- - -
- - - - - - 重置 - -
-
+ +
@@ -1233,150 +844,26 @@
- + -
- -
- - - 最新完成 - 积分最高 - - 共 {{ completedTotal }} 个已完成任务 -
- - -
- - - {{ type.name }} - - - - - - {{ subType.name }} - - - - - - {{ brand.name }} - - - - - - {{ category.name }} - - - - - - {{ platform.name }} - - - - - 今天 - 本周 - 本月 - -
- - -
- - - - - - 重置 - -
-
+ +
@@ -1665,145 +1152,22 @@ -
- -
- - - 最新发布 - 积分最高 - 时效最短 - - 共 {{ publishedTotal }} 个任务 -
- - -
- - 全部 - 待接单 - 进行中 - 待审核 - 已完成 - 已驳回 - - - - - {{ type.name }} - - - - - - {{ brand.name }} - - - - - - {{ category.name }} - - - - - - {{ platform.name }} - - - - - 今天 - 本周 - 本月 - -
- - -
- - - - - - 重置 - -
-
+ +
@@ -2120,27 +1484,23 @@ -
-
- -
- 排序: - - 最新创建 - 最早创建 - -
-
- 共 {{ draftsTotal }} 个草稿 -
-
-
+ +
@@ -2774,6 +2134,7 @@ import { useRouter } from 'vue-router' import { message, Modal, InputNumber, Textarea, Radio, RadioGroup, Button, Select, Space, Tag } from 'ant-design-vue' import DefaultLayout from '@/layouts/DefaultLayout.vue' import Icon from '@/components/Icon.vue' +import TaskFilters from '@/components/TaskFilters.vue' import * as taskApi from '@/api/task' import * as userApi from '@/api/user' import * as configApi from '@/api/config' @@ -3198,6 +2559,75 @@ const reviewFilters = reactive({ maxScore: undefined as number | undefined }) +// ========== 筛选组件配置选项 ========== +// 可接任务 - 排序选项 +const availableSortOptions = [ + { value: 'latest', label: '最新发布' }, + { value: 'score', label: '积分最高' }, + { value: 'deadline', label: '时效最短' }, + { value: 'hot', label: '最热门' } +] +// 可接任务 - 状态选项 +const availableStatusOptions = [ + { value: '', label: '全部待接' }, + { value: 'pending', label: '待接单' }, + { value: 'pending_receiving_approval', label: '待部门审核' } +] + +// 待审核任务 - 排序选项 +const reviewSortOptions = [ + { value: 'latest', label: '最新提交' }, + { value: 'score', label: '积分最高' } +] +// 待审核任务 - 状态选项 +const reviewStatusOptions = [ + { value: '', label: '全部待审核' }, + { value: 'pending_demand_approval', label: '待需求审核' }, + { value: 'pending_receiving_approval', label: '待接单审核' } +] + +// 进行中任务 - 排序选项 +const inProgressSortOptions = [ + { value: 'latest', label: '最新接单' }, + { value: 'deadline', label: '截止时间' }, + { value: 'progress', label: '完成进度' } +] +// 进行中任务 - 状态选项 +const inProgressStatusOptions = [ + { value: '', label: '全部进行中' }, + { value: 'in_progress', label: '进行中' }, + { value: 'submitted', label: '已提交待确认' } +] + +// 已完成任务 - 排序选项 +const completedSortOptions = [ + { value: 'latest', label: '最新完成' }, + { value: 'score', label: '积分最高' } +] + +// 我发起的任务 - 排序选项 +const publishedSortOptions = [ + { value: 'latest', label: '最新发布' }, + { value: 'score', label: '积分最高' }, + { value: 'deadline', label: '截止时间' } +] +// 我发起的任务 - 状态选项 +const publishedStatusOptions = [ + { value: '', label: '全部状态' }, + { value: 'pending', label: '待接单' }, + { value: 'pending_demand_approval', label: '待需求审核' }, + { value: 'pending_receiving_approval', label: '待接单审核' }, + { value: 'in_progress', label: '进行中' }, + { value: 'submitted', label: '已提交' }, + { value: 'completed', label: '已完成' } +] + +// 草稿箱 - 排序选项 +const draftsSortOptions = [ + { value: 'latest', label: '最新编辑' }, + { value: 'oldest', label: '最早编辑' } +] + // 分页 const pagination = reactive({ page: 1, @@ -3670,7 +3100,11 @@ const loadTasks = async (forceReload = false) => { } // 筛选变更 -const handleFilterChange = () => { +const handleFilterChange = (newFilters?: any) => { + // 如果传入了新的筛选值,合并到 filters 对象 + if (newFilters) { + Object.assign(filters, newFilters) + } pagination.page = 1 loadTasks(true) // 强制重新加载 } @@ -3702,7 +3136,12 @@ const handlePageChange = () => { // - 需求部门用户:看到自己发起的已完成的母任务 // - 接单部门用户:看到自己完成的子任务 // - 管理员:看到所有已完成任务 -const loadCompletedTasks = async () => { +const loadCompletedTasks = async (newFilters?: any) => { + // 如果传入了新的筛选值,合并到 completedFilters 对象 + if (newFilters && typeof newFilters === 'object') { + Object.assign(completedFilters, newFilters) + completedPagination.page = 1 // 重置分页 + } completedLoading.value = true try { const params: any = { @@ -4551,7 +3990,12 @@ const reviewPagination = reactive({ }) // 加载我发起的任务 -const loadPublishedTasks = async () => { +const loadPublishedTasks = async (newFilters?: any) => { + // 如果传入了新的筛选值,合并到 publishedFilters 对象 + if (newFilters && typeof newFilters === 'object') { + Object.assign(publishedFilters, newFilters) + publishedPagination.page = 1 // 重置分页 + } publishedLoading.value = true try { const response = await taskApi.getMyTasks({ @@ -4581,7 +4025,12 @@ const handlePublishedPageChange = (page: number) => { } // 加载草稿箱任务 -const loadDraftTasks = async () => { +const loadDraftTasks = async (newFilters?: any) => { + // 如果传入了新的筛选值,合并到 draftsFilters 对象 + if (newFilters && typeof newFilters === 'object') { + Object.assign(draftsFilters, newFilters) + draftsPagination.page = 1 // 重置分页 + } draftsLoading.value = true try { const response = await taskApi.getMyTasks({ @@ -4729,7 +4178,12 @@ const handleCreateTask = () => { // - 需求部门用户:只看母任务卡片(自己发起的任务) // - 接单部门用户:只看子任务卡片(自己接单的任务) // - 管理员:看到所有任务 -const loadInProgressTasks = async () => { +const loadInProgressTasks = async (newFilters?: any) => { + // 如果传入了新的筛选值,合并到 inProgressFilters 对象 + if (newFilters && typeof newFilters === 'object') { + Object.assign(inProgressFilters, newFilters) + inProgressPagination.page = 1 // 重置分页 + } inProgressLoading.value = true try { const params: any = { @@ -5051,7 +4505,12 @@ const mapTaskItemToTask = (item: any) => { } // 加载待审核任务(所有处于审批流程中的任务 + 部门负责人的子任务组) -const loadReviewTasks = async () => { +const loadReviewTasks = async (newFilters?: any) => { + // 如果传入了新的筛选值,合并到 reviewFilters 对象 + if (newFilters && typeof newFilters === 'object') { + Object.assign(reviewFilters, newFilters) + reviewPagination.page = 1 // 重置分页 + } reviewLoading.value = true try { const params: any = {