优化pagetype列表页Link字段title_field为批量获取

This commit is contained in:
jingrow 2025-11-01 15:03:15 +08:00
parent c9c2d6ec62
commit 69f1c36bfd

View File

@ -330,83 +330,97 @@ async function getPageTypeConfig(pagetype: string) {
}
}
//
async function getRecordTitle(pagetype: string, recordName: string): Promise<string> {
if (!pagetype || !recordName) return recordName || ''
//
const cacheKey = `${pagetype}_${recordName}`
if (linkTitleCache.value[cacheKey]) {
return linkTitleCache.value[cacheKey]
}
try {
//
const config = await getPageTypeConfig(pagetype)
const titleField = config.title_field || 'name'
const showTitleFieldInLink = config.show_title_field_in_link || false
// name
if (titleField === 'name') {
linkTitleCache.value[cacheKey] = recordName
return recordName
}
// show_title_field_in_link
if (!showTitleFieldInLink) {
linkTitleCache.value[cacheKey] = recordName
return recordName
}
//
const response = await axios.get(`/api/data/${encodeURIComponent(pagetype)}/${encodeURIComponent(recordName)}`, {
headers: get_session_api_headers(),
withCredentials: true
})
const recordData = response.data?.data || {}
const titleValue = recordData[titleField] || recordName
//
linkTitleCache.value[cacheKey] = titleValue
return titleValue
} catch (error) {
console.error('获取记录标题失败:', error)
return recordName
}
}
// Linktitle_field
// Linktitle_fieldpagetype
async function preloadLinkTitles() {
// Link
const linkFields = metaFields.value.filter(f => f.fieldtype === 'Link' && f.options)
if (linkFields.length === 0) return
// Link使Map
const linkMap = new Map<string, {pagetype: string, recordName: string}>()
// pagetype使Map
const pagetypeGroups = new Map<string, Set<string>>()
rows.value.forEach(row => {
linkFields.forEach(field => {
const value = row[field.fieldname]
if (value) {
const key = `${field.options}::${value}`
if (!linkMap.has(key)) {
linkMap.set(key, {
pagetype: field.options,
recordName: value
})
const pagetype = field.options
if (!pagetypeGroups.has(pagetype)) {
pagetypeGroups.set(pagetype, new Set())
}
pagetypeGroups.get(pagetype)!.add(value)
}
})
})
// title_field
// pagetype使API
await Promise.all(
Array.from(linkMap.values()).map(({ pagetype, recordName }) =>
getRecordTitle(pagetype, recordName).catch(() => recordName)
)
Array.from(pagetypeGroups.entries()).map(async ([pagetype, recordNames]) => {
// title_field
const config = await getPageTypeConfig(pagetype)
const titleField = config.title_field || 'name'
const showTitleFieldInLink = config.show_title_field_in_link || false
// nameshow_title_field_in_link
if (titleField === 'name' || !showTitleFieldInLink) {
recordNames.forEach(name => {
const cacheKey = `${pagetype}_${name}`
if (!linkTitleCache.value[cacheKey]) {
linkTitleCache.value[cacheKey] = name
}
})
return
}
// 使APIfiltersname
const namesToLoad = Array.from(recordNames).filter(name => {
const cacheKey = `${pagetype}_${name}`
return !linkTitleCache.value[cacheKey]
})
if (namesToLoad.length === 0) return
try {
// 使APIname in [...]
const filters = [['name', 'in', namesToLoad]]
const fields = ['name', titleField]
const result = await axios.get(`/api/data/${encodeURIComponent(pagetype)}`, {
params: {
fields: JSON.stringify(fields),
filters: JSON.stringify(filters),
limit_page_length: namesToLoad.length
},
headers: get_session_api_headers(),
withCredentials: true
})
//
const records = result.data?.data || []
records.forEach((record: any) => {
const name = record.name
const titleValue = record[titleField] || name
const cacheKey = `${pagetype}_${name}`
linkTitleCache.value[cacheKey] = titleValue
})
// API
namesToLoad.forEach(name => {
const cacheKey = `${pagetype}_${name}`
if (!linkTitleCache.value[cacheKey]) {
linkTitleCache.value[cacheKey] = name
}
})
} catch (error) {
console.error(`批量加载${pagetype}的标题失败:`, error)
//
namesToLoad.forEach(name => {
const cacheKey = `${pagetype}_${name}`
if (!linkTitleCache.value[cacheKey]) {
linkTitleCache.value[cacheKey] = name
}
})
}
})
)
}