diff --git a/backend/src/main/java/com/designhub/service/SystemConfigService.java b/backend/src/main/java/com/designhub/service/SystemConfigService.java index d761bcd..b7bc601 100644 --- a/backend/src/main/java/com/designhub/service/SystemConfigService.java +++ b/backend/src/main/java/com/designhub/service/SystemConfigService.java @@ -230,6 +230,11 @@ public class SystemConfigService { createConfigIfNotExists("navbar.action.checkin", "true", "navbar", "显示签到按钮", "是否在导航栏显示每日签到按钮", "boolean", 1); createConfigIfNotExists("navbar.action.achievement", "true", "navbar", "显示成就按钮", "是否在导航栏显示成就中心按钮", "boolean", 1); createConfigIfNotExists("navbar.action.settings", "true", "navbar", "显示设置按钮", "是否在导航栏显示设置按钮", "boolean", 1); + + // 任务发布类型配置 + createConfigIfNotExists("task.release_type.default", "true", "task", "显示默认模式按钮", "是否显示「默认模式」发布类型按钮", "boolean", 1); + createConfigIfNotExists("task.release_type.recruitment", "true", "task", "显示招募任务按钮", "是否显示「招募任务」发布类型按钮", "boolean", 1); + createConfigIfNotExists("task.release_type.assigned", "true", "task", "显示指定任务按钮", "是否显示「指定任务」发布类型按钮", "boolean", 1); } /** diff --git a/frontend/src/views/CreateTask.vue b/frontend/src/views/CreateTask.vue index 8f57b68..1cdf962 100644 --- a/frontend/src/views/CreateTask.vue +++ b/frontend/src/views/CreateTask.vue @@ -25,12 +25,14 @@ :rules="formRules" layout="vertical" > - +
@@ -329,6 +331,7 @@
- + +
+ + +
+
+

任务发布类型配置

+

管理发起任务页面中可用的发布类型选项

+
+ + + + + 发布类型按钮 + + +
+
+
+ + 默认模式 +
+
系统自动分配给主管,由主管负责分配
+ +
+ +
+
+ + 招募任务 +
+
发布到任务大厅,设计师可自行抢单
+ +
+ +
+
+ + 指定任务 +
+
指定特定设计师接收任务
+ +
+
+ + + + + + + + 保存配置 + + + + 恢复默认 + + + +
+
+
+
@@ -2780,6 +2859,74 @@ const handleResetNavbarConfig = () => { }) } +// ==================== 任务发布类型配置 ==================== +const taskReleaseConfig = ref({ + default: true, + recruitment: true, + assigned: true +}) + +const savingTaskReleaseConfig = ref(false) + +// 加载任务发布类型配置 +const loadTaskReleaseConfig = async () => { + try { + const response = await getSystemConfigsByGroup('task') + const configs = response.data || [] + + const defaultConfig = configs.find((c: any) => c.configKey === 'task.release_type.default') + const recruitmentConfig = configs.find((c: any) => c.configKey === 'task.release_type.recruitment') + const assignedConfig = configs.find((c: any) => c.configKey === 'task.release_type.assigned') + + taskReleaseConfig.value = { + default: defaultConfig?.configValue !== 'false', + recruitment: recruitmentConfig?.configValue !== 'false', + assigned: assignedConfig?.configValue !== 'false' + } + } catch (error) { + console.error('加载任务发布类型配置失败:', error) + } +} + +// 保存任务发布类型配置 +const handleSaveTaskReleaseConfig = async () => { + // 检查至少保留一个选项 + if (!taskReleaseConfig.value.default && !taskReleaseConfig.value.recruitment && !taskReleaseConfig.value.assigned) { + message.warning('至少需要保留一个发布类型,已自动启用默认模式') + taskReleaseConfig.value.default = true + } + + savingTaskReleaseConfig.value = true + try { + await batchUpdateSystemConfigs({ + 'task.release_type.default': taskReleaseConfig.value.default.toString(), + 'task.release_type.recruitment': taskReleaseConfig.value.recruitment.toString(), + 'task.release_type.assigned': taskReleaseConfig.value.assigned.toString() + }) + message.success('任务发布类型配置保存成功') + } catch (error: any) { + message.error(error.message || '保存失败') + } finally { + savingTaskReleaseConfig.value = false + } +} + +// 恢复默认任务发布类型配置 +const handleResetTaskReleaseConfig = () => { + Modal.confirm({ + title: '确认恢复默认配置?', + content: '此操作将显示所有发布类型选项', + onOk: async () => { + taskReleaseConfig.value = { + default: true, + recruitment: true, + assigned: true + } + await handleSaveTaskReleaseConfig() + } + }) +} + // 加载网站设置 const loadSiteSettings = async () => { loadingSiteSettings.value = true @@ -2948,6 +3095,8 @@ onMounted(() => { loadSiteSettings() // 加载钉钉配置 loadDingTalkConfig() + // 加载任务发布类型配置 + loadTaskReleaseConfig() }) // S3配置相关方法 @@ -3820,6 +3969,8 @@ watch(activeTab, (value) => { display: flex; align-items: center; justify-content: space-between; + flex-wrap: wrap; + gap: 8px; padding: 16px 20px; background: $bg-tertiary; border: 1px solid $border-primary; @@ -3842,6 +3993,14 @@ watch(activeTab, (value) => { font-weight: 500; } } + + .config-item-desc { + width: 100%; + color: $text-secondary; + font-size: 12px; + margin-top: -4px; + padding-left: 36px; + } } .section-description {