[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>
|
<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>()
|
||||||
|
|||||||
Reference in New Issue
Block a user