From 69f1c36bfdfd3dc2ed19a31ad3bf1d6e0c6be98d Mon Sep 17 00:00:00 2001 From: jingrow Date: Sat, 1 Nov 2025 15:03:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96pagetype=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=A1=B5Link=E5=AD=97=E6=AE=B5title=5Ffield=E4=B8=BA=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/core/pagetype/GenericListPage.vue | 134 ++++++++++-------- 1 file changed, 74 insertions(+), 60 deletions(-) diff --git a/apps/jingrow/frontend/src/core/pagetype/GenericListPage.vue b/apps/jingrow/frontend/src/core/pagetype/GenericListPage.vue index d068145..2be2c9c 100644 --- a/apps/jingrow/frontend/src/core/pagetype/GenericListPage.vue +++ b/apps/jingrow/frontend/src/core/pagetype/GenericListPage.vue @@ -330,83 +330,97 @@ async function getPageTypeConfig(pagetype: string) { } } -// 获取记录的标题字段值 -async function getRecordTitle(pagetype: string, recordName: string): Promise { - 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 - } -} - -// 预加载Link字段的title_field值 +// 预加载Link字段的title_field值(优化:按pagetype分组批量请求) 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() + // 按pagetype分组收集需要加载的记录名,使用Map去重 + const pagetypeGroups = new Map>() 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 + + // 如果标题字段就是name或未启用show_title_field_in_link,直接缓存 + if (titleField === 'name' || !showTitleFieldInLink) { + recordNames.forEach(name => { + const cacheKey = `${pagetype}_${name}` + if (!linkTitleCache.value[cacheKey]) { + linkTitleCache.value[cacheKey] = name + } + }) + return + } + + // 批量获取记录(使用列表API,通过filters传入多个name) + const namesToLoad = Array.from(recordNames).filter(name => { + const cacheKey = `${pagetype}_${name}` + return !linkTitleCache.value[cacheKey] + }) + + if (namesToLoad.length === 0) return + + try { + // 使用列表API批量获取(name 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 + } + }) + } + }) ) }