[update]partnership页面接入后端
This commit is contained in:
@@ -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,
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<template>
|
||||
<div class="default-main partnership-page">
|
||||
<div v-loading="loading" class="default-main partnership-page">
|
||||
<section class="setting-grid">
|
||||
<div class="panel setting-panel">
|
||||
<div class="panel-title">{{ t('embed.partnership.settingTitle') }}</div>
|
||||
@@ -39,7 +39,7 @@
|
||||
</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') }}
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -148,8 +148,9 @@
|
||||
<script setup lang="ts">
|
||||
import type { FormInstance, FormRules, UploadFile } 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 { partnership, savePartnershipSet } from '/@/api/backend/embed'
|
||||
|
||||
defineOptions({
|
||||
name: 'embed/partnership',
|
||||
@@ -166,6 +167,33 @@ interface PartnerRow {
|
||||
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'
|
||||
|
||||
const { t } = useI18n()
|
||||
@@ -277,14 +305,88 @@ const embedCode = ref(`<div style="position: relative;max-width: 1000px;margin:
|
||||
</div>`)
|
||||
|
||||
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 {
|
||||
if (settings.footerConfig) JSON.parse(settings.footerConfig)
|
||||
if (settings.customConfig) JSON.parse(settings.customConfig)
|
||||
ElMessage.success(t('embed.partnership.saved'))
|
||||
const response = await partnership()
|
||||
const data = response.data ?? response
|
||||
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 {
|
||||
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 dialogMode = ref<'create' | 'edit'>('create')
|
||||
const editingId = ref<number>()
|
||||
|
||||
Reference in New Issue
Block a user