[update]partnership页面接入后端

This commit is contained in:
2026-06-12 17:17:42 +08:00
parent 8d477c5393
commit 45330cf2d8
2 changed files with 143 additions and 7 deletions

View File

@@ -124,3 +124,35 @@ export function saveDomain(data: SaveDomainPayload) {
} }
) )
} }
export function partnership() {
return createAxios({
url: '/admin/embed.Embed/partnership',
method: 'get',
})
}
export interface SavePartnershipSetPayload {
header_image_url: string
footer_config: Record<string, unknown>
custom_config: Record<string, unknown>
base_color_1: string
base_color_2: string
border_color: string
highlight_color: string
title_color: string
text_color: string
}
export function savePartnershipSet(data: SavePartnershipSetPayload) {
return createAxios(
{
url: '/admin/embed.Embed/savePartnershipSet',
method: 'post',
data,
},
{
showSuccessMessage: true,
}
)
}

View File

@@ -1,5 +1,5 @@
<template> <template>
<div class="default-main partnership-page"> <div v-loading="loading" class="default-main partnership-page">
<section class="setting-grid"> <section class="setting-grid">
<div class="panel setting-panel"> <div class="panel setting-panel">
<div class="panel-title">{{ t('embed.partnership.settingTitle') }}</div> <div class="panel-title">{{ t('embed.partnership.settingTitle') }}</div>
@@ -39,7 +39,7 @@
</div> </div>
</div> </div>
<el-button type="success" class="save-button" @click="saveSettings"> <el-button type="success" class="save-button" :loading="savingSettings" @click="saveSettings">
{{ t('embed.partnership.save') }} {{ t('embed.partnership.save') }}
</el-button> </el-button>
</div> </div>
@@ -148,8 +148,9 @@
<script setup lang="ts"> <script setup lang="ts">
import type { FormInstance, FormRules, UploadFile } from 'element-plus' import type { FormInstance, FormRules, UploadFile } from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import { computed, reactive, ref } from 'vue' import { computed, onMounted, reactive, ref } from 'vue'
import { useI18n } from 'vue-i18n' import { useI18n } from 'vue-i18n'
import { partnership, savePartnershipSet } from '/@/api/backend/embed'
defineOptions({ defineOptions({
name: 'embed/partnership', name: 'embed/partnership',
@@ -166,6 +167,33 @@ interface PartnerRow {
status: number status: number
} }
interface PartnershipSetting {
header_image_url?: string | null
footer_config?: string | Record<string, unknown> | null
custom_config?: string | Record<string, unknown> | null
base_color_1?: string | null
base_color_2?: string | null
border_color?: string | null
highlight_color?: string | null
title_color?: string | null
text_color?: string | null
}
interface PartnerSourceRow {
id?: number | string
display_order?: number | string
displayOrder?: number | string
weigh?: number | string
partner_name?: string
name?: string
currency?: string
logo_image?: string
logoImage?: string
option?: string | Record<string, unknown> | null
config?: string | Record<string, unknown> | null
status?: number | string
}
type ColorSettingKey = 'baseColor1' | 'baseColor2' | 'borderColor' | 'highlightColor' | 'titleColor' | 'textColor' type ColorSettingKey = 'baseColor1' | 'baseColor2' | 'borderColor' | 'highlightColor' | 'titleColor' | 'textColor'
const { t } = useI18n() const { t } = useI18n()
@@ -277,14 +305,88 @@ const embedCode = ref(`<div style="position: relative;max-width: 1000px;margin:
</div>`) </div>`)
const partners = ref<PartnerRow[]>([]) const partners = ref<PartnerRow[]>([])
const loading = ref(false)
const saveSettings = () => { const formatJsonValue = (value: string | Record<string, unknown> | null | undefined) => {
if (!value) return ''
return typeof value === 'string' ? value : JSON.stringify(value, null, 2)
}
const applyPartnershipSetting = (setting?: PartnershipSetting) => {
if (!setting) return
settings.headerImage = setting.header_image_url ?? ''
settings.footerConfig = formatJsonValue(setting.footer_config)
settings.customConfig = formatJsonValue(setting.custom_config)
settings.baseColor1 = setting.base_color_1 ?? ''
settings.baseColor2 = setting.base_color_2 ?? ''
settings.borderColor = setting.border_color ?? ''
settings.highlightColor = setting.highlight_color ?? ''
settings.titleColor = setting.title_color ?? ''
settings.textColor = setting.text_color ?? ''
}
const normalizePartnerData = (value: unknown): PartnerRow[] => {
if (!Array.isArray(value)) return []
return value.map((item: PartnerSourceRow, index) => ({
id: Number(item.id) || index + 1,
displayOrder: Number(item.display_order ?? item.displayOrder ?? item.weigh) || index + 1,
name: String(item.partner_name ?? item.name ?? ''),
currency: String(item.currency ?? ''),
logoImage: String(item.logo_image ?? item.logoImage ?? ''),
option: formatJsonValue(item.option),
config: formatJsonValue(item.config),
status: Number(item.status) === 1 ? 1 : 2,
}))
}
const loadPartnership = async () => {
loading.value = true
try { try {
if (settings.footerConfig) JSON.parse(settings.footerConfig) const response = await partnership()
if (settings.customConfig) JSON.parse(settings.customConfig) const data = response.data ?? response
ElMessage.success(t('embed.partnership.saved')) applyPartnershipSetting(data?.partnership_setting)
partners.value = normalizePartnerData(data?.partner_data)
} finally {
loading.value = false
}
}
const parseJsonObject = (value: string) => {
if (!value.trim()) return {}
const parsed = JSON.parse(value)
if (!parsed || Array.isArray(parsed) || typeof parsed !== 'object') throw new Error()
return parsed as Record<string, unknown>
}
const savingSettings = ref(false)
const saveSettings = async () => {
let footerConfig: Record<string, unknown>
let customConfig: Record<string, unknown>
try {
footerConfig = parseJsonObject(settings.footerConfig)
customConfig = parseJsonObject(settings.customConfig)
} catch { } catch {
ElMessage.error(t('embed.partnership.invalidConfig')) ElMessage.error(t('embed.partnership.invalidConfig'))
return
}
savingSettings.value = true
try {
await savePartnershipSet({
header_image_url: settings.headerImage,
footer_config: footerConfig,
custom_config: customConfig,
base_color_1: settings.baseColor1,
base_color_2: settings.baseColor2,
border_color: settings.borderColor,
highlight_color: settings.highlightColor,
title_color: settings.titleColor,
text_color: settings.textColor,
})
await loadPartnership()
} finally {
savingSettings.value = false
} }
} }
@@ -297,6 +399,8 @@ const copyEmbedCode = async () => {
} }
} }
onMounted(loadPartnership)
const dialogVisible = ref(false) const dialogVisible = ref(false)
const dialogMode = ref<'create' | 'edit'>('create') const dialogMode = ref<'create' | 'edit'>('create')
const editingId = ref<number>() const editingId = ref<number>()