新增合作与反馈入口配置

This commit is contained in:
yml2213
2026-08-15 16:37:30 +08:00
parent 134d6fa05e
commit d9f552577a
14 changed files with 332 additions and 36 deletions
@@ -4,10 +4,7 @@ import { ElMessage } from 'element-plus'
import { ref, watch } from 'vue'
import { uploadAdminFile } from '@/shared/api/files'
import {
defaultAWRecycleConfig,
type AWRecycleConfig,
} from '@/features/listings/api/homeConfig'
import type { AWRecycleConfig } from '@/features/listings/api/homeConfig'
import { updateSystemConfig, type SystemConfig } from '@/features/admin/api/systemConfigs'
import { safeParseJSON } from '@/shared/utils/json'
import AuthImage from '@/shared/components/business/AuthImage.vue'
@@ -15,6 +12,10 @@ import AuthImage from '@/shared/components/business/AuthImage.vue'
const props = defineProps<{
modelValue: boolean
config: SystemConfig
defaults: AWRecycleConfig
dialogTitle: string
uploadScene: string
imageHint: string
}>()
const emit = defineEmits<{
@@ -25,31 +26,31 @@ const emit = defineEmits<{
const submitting = ref(false)
const uploading = ref(false)
const description = ref('')
const draft = ref<AWRecycleConfig>({ ...defaultAWRecycleConfig })
const draft = ref<AWRecycleConfig>({ ...props.defaults })
watch(
() => props.modelValue,
val => {
if (!val) return
draft.value = parseAWRecycle(props.config.value)
draft.value = parseImageEntry(props.config.value)
description.value = props.config.description || ''
},
{ immediate: true }
)
function parseAWRecycle(raw: string): AWRecycleConfig {
const parsed = safeParseJSON(raw, defaultAWRecycleConfig)
function parseImageEntry(raw: string): AWRecycleConfig {
const parsed = safeParseJSON(raw, props.defaults)
return {
title:
typeof parsed.title === 'string' && parsed.title.trim()
? parsed.title.trim()
: defaultAWRecycleConfig.title,
: props.defaults.title,
subtitle:
typeof parsed.subtitle === 'string' && parsed.subtitle.trim()
? parsed.subtitle.trim()
: defaultAWRecycleConfig.subtitle,
: props.defaults.subtitle,
image_url: typeof parsed.image_url === 'string' ? parsed.image_url.trim() : '',
enabled: typeof parsed.enabled === 'boolean' ? parsed.enabled : true,
enabled: typeof parsed.enabled === 'boolean' ? parsed.enabled : props.defaults.enabled,
}
}
@@ -60,7 +61,7 @@ async function handleUpload(event: Event) {
if (!file) return
uploading.value = true
try {
const uploaded = await uploadAdminFile(file, 'aw-recycle')
const uploaded = await uploadAdminFile(file, props.uploadScene)
draft.value.image_url = uploaded.url
ElMessage.success('图片已上传')
} catch (error) {
@@ -75,8 +76,8 @@ async function handleSave() {
try {
const value = JSON.stringify(
{
title: draft.value.title.trim() || defaultAWRecycleConfig.title,
subtitle: draft.value.subtitle.trim() || defaultAWRecycleConfig.subtitle,
title: draft.value.title.trim() || props.defaults.title,
subtitle: draft.value.subtitle.trim() || props.defaults.subtitle,
image_url: draft.value.image_url.trim(),
enabled: draft.value.enabled,
},
@@ -101,7 +102,7 @@ async function handleSave() {
<template>
<el-dialog
:model-value="modelValue"
title="编辑 AW炫彩回收"
:title="dialogTitle"
width="640px"
@update:model-value="emit('update:modelValue', $event)"
>
@@ -115,10 +116,10 @@ async function handleSave() {
<el-switch v-model="draft.enabled" active-text="显示" inactive-text="隐藏" />
</el-form-item>
<el-form-item label="标题">
<el-input v-model="draft.title" maxlength="32" placeholder="AW炫彩回收" />
<el-input v-model="draft.title" maxlength="32" :placeholder="defaults.title" />
</el-form-item>
<el-form-item label="副标题">
<el-input v-model="draft.subtitle" maxlength="64" placeholder="点击查看回收说明" />
<el-input v-model="draft.subtitle" maxlength="64" :placeholder="defaults.subtitle" />
</el-form-item>
<el-form-item label="展示图片">
<div class="image-editor">
@@ -143,8 +144,7 @@ async function handleSave() {
</label>
</div>
<p class="hint">
走后台通用上传(scene=aw-recycle,公开可访问)。首页点击入口后展示此图,建议竖图或说明海报。
若旧图路径含 misc/ 且无法预览,请重新上传。
{{ imageHint }}
</p>
</div>
</el-form-item>