data-preheating-astro 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -0
- package/dist/apis/paginate.js +103 -0
- package/dist/apis/query.js +21 -0
- package/dist/apis/request.js +132 -0
- package/dist/cache/keywordHitCache.js +202 -0
- package/dist/cli.js +460 -0
- package/dist/config/app.config.js +150 -0
- package/dist/config/keywords.js +47 -0
- package/dist/config/modules/bannerSetting.js +121 -0
- package/dist/config/modules/cases.js +74 -0
- package/dist/config/modules/categories.js +99 -0
- package/dist/config/modules/companies.js +42 -0
- package/dist/config/modules/contact.js +56 -0
- package/dist/config/modules/contactSidebar.js +86 -0
- package/dist/config/modules/download.js +56 -0
- package/dist/config/modules/honor.js +72 -0
- package/dist/config/modules/insertCode.js +37 -0
- package/dist/config/modules/keywords.js +29 -0
- package/dist/config/modules/languages.js +33 -0
- package/dist/config/modules/menu.js +33 -0
- package/dist/config/modules/mobileMenu.js +51 -0
- package/dist/config/modules/news.js +74 -0
- package/dist/config/modules/partner.js +56 -0
- package/dist/config/modules/products.js +79 -0
- package/dist/config/modules/robot.js +41 -0
- package/dist/config/modules/seo.js +102 -0
- package/dist/config/modules/singlepages.js +57 -0
- package/dist/config/modules/siteConfiguration.js +128 -0
- package/dist/config/modules/template.js +38 -0
- package/dist/config/modules/types.js +10 -0
- package/dist/config/modules/video.js +75 -0
- package/dist/config/modules/websites.js +40 -0
- package/dist/exporter/buildModuleOutput.js +352 -0
- package/dist/exporter/combo.js +21 -0
- package/dist/exporter/fetchAll.js +29 -0
- package/dist/exporter/keywordRules.js +19 -0
- package/dist/exporter/languages.js +26 -0
- package/dist/exporter/outputUtils.js +48 -0
- package/dist/exporter/strapiExtract.js +59 -0
- package/dist/monitor/progress.js +244 -0
- package/dist/prereq/italkinForm.js +185 -0
- package/dist/tools/exportCountsCsv.js +146 -0
- package/dist/tools/httpTrace.js +152 -0
- package/dist/tools/monitorFormat.js +46 -0
- package/dist/tools/robotsTxt.js +69 -0
- package/dist/transform/images.js +142 -0
- package/dist/transform/objectPath.js +188 -0
- package/dist/transform/pathNormalize.js +51 -0
- package/dist/transform/richtext.js +468 -0
- package/dist/transform/slug.js +38 -0
- package/dist/write/index.js +123 -0
- package/dist/write/output.js +60 -0
- package/package.json +34 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 模块配置模板(复制后按真实接口填写)。
|
|
4
|
+
*
|
|
5
|
+
* 注意:
|
|
6
|
+
* - 这里只提供结构与注释,不包含任何模拟数据或演示接口地址。
|
|
7
|
+
* - endpoint 需要是 Strapi 的真实 REST 路径(例如 /api/products)。
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.languages = void 0;
|
|
11
|
+
exports.languages = {
|
|
12
|
+
// 模块目录名:最终会输出到 data/**/[name]/index.json
|
|
13
|
+
name: "languages",
|
|
14
|
+
// Strapi REST API 路径(不含 baseUrl)
|
|
15
|
+
endpoint: "/api/huazhi-common-plugin/language-settings",
|
|
16
|
+
// 前置接口:必须先于内容接口拉取(用于推导语言列表)
|
|
17
|
+
isPrerequisite: true,
|
|
18
|
+
prerequisiteOrder: 10,
|
|
19
|
+
// 接口级国际化:内容型接口通常为 true;语言列表等接口为 false
|
|
20
|
+
i18n: { enabled: false },
|
|
21
|
+
// 分页大小(limit)
|
|
22
|
+
pageSize: 100,
|
|
23
|
+
// Strapi query 对象:用于维护 populate/fields/filters/sort 等复杂参数
|
|
24
|
+
query: {
|
|
25
|
+
// populate: "*"
|
|
26
|
+
},
|
|
27
|
+
// 列表提取路径:该接口返回 data.languageSettings(数组),不是 data: []
|
|
28
|
+
listPath: "data.languageSettings",
|
|
29
|
+
// slug 字段路径(从单条记录对象取值,例如 attributes.slug)
|
|
30
|
+
slugPath: "localeCode",
|
|
31
|
+
// 富文本字段路径列表(从单条记录对象取值)
|
|
32
|
+
richTextFieldPaths: [],
|
|
33
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 菜单接口(前置接口)。
|
|
4
|
+
*
|
|
5
|
+
* 说明:
|
|
6
|
+
* - 该接口用于生成菜单数据,必须优先加载。
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.menu = void 0;
|
|
10
|
+
exports.menu = {
|
|
11
|
+
name: "menu",
|
|
12
|
+
endpoint: "/api/huazhi-tree-content-plugin/query-menu-tree-data",
|
|
13
|
+
// 是否为前置接口:
|
|
14
|
+
// - 当前设置为 false:菜单不作为其它接口的强依赖前置数据。
|
|
15
|
+
isPrerequisite: false,
|
|
16
|
+
prerequisiteOrder: 30,
|
|
17
|
+
// 该接口数据按语言区分,因此启用 i18n
|
|
18
|
+
i18n: { enabled: true },
|
|
19
|
+
pageSize: 100,
|
|
20
|
+
query: {
|
|
21
|
+
contentType: "api::menu-manage.menu-manage",
|
|
22
|
+
status: "published",
|
|
23
|
+
isTreeFormat: true,
|
|
24
|
+
isFilterZeroCount: true,
|
|
25
|
+
isFillCount: true
|
|
26
|
+
},
|
|
27
|
+
// 菜单条目标识字段路径(用于导出 index.json 内的标识字段)
|
|
28
|
+
// 注意:这里使用 link 字段作为标识,若出现空值请在接口侧保证稳定值。
|
|
29
|
+
slugPath: "link",
|
|
30
|
+
// 菜单接口不输出富文本 html
|
|
31
|
+
richTextFieldPaths: [],
|
|
32
|
+
removeFields: ["ts_status_txt", "ts_at", "ts_status", "custom_updated_at", "parent", "is_auto_translate", "_is_auto_generated", "_source_document_type", "_source_document_id", "children.ts_status_txt", "children.ts_at", "children.ts_status", "children.custom_updated_at", "children.is_auto_translate", "children._is_auto_generated", "children._source_document_type", "children._source_document_id"]
|
|
33
|
+
};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mobileMenu = void 0;
|
|
4
|
+
exports.mobileMenu = {
|
|
5
|
+
/** 模块目录名:最终会输出到 data/<lang>/mobile-menu/index.json */
|
|
6
|
+
name: "mobile-menu",
|
|
7
|
+
/** Strapi REST API 路径(不含 baseUrl) */
|
|
8
|
+
endpoint: "/api/shoujiduandibucaidan",
|
|
9
|
+
/** 该接口按语言区分(locale) */
|
|
10
|
+
i18n: { enabled: true },
|
|
11
|
+
/** 分页大小:单例配置通常很小,保持默认安全值即可 */
|
|
12
|
+
pageSize: 100,
|
|
13
|
+
/**
|
|
14
|
+
* 查询参数(对应前端 getMobileMenuApi 的 fields + populate)。
|
|
15
|
+
*
|
|
16
|
+
* 注意:
|
|
17
|
+
* - locale/pagination 由导出器统一补齐,这里只维护业务 query
|
|
18
|
+
*/
|
|
19
|
+
query: {
|
|
20
|
+
fields: ["documentId", "title", "createdAt", "publishedAt", "locale"],
|
|
21
|
+
populate: {
|
|
22
|
+
shoujiduandibucaidan: {
|
|
23
|
+
fields: ["field_neirong", "field_zidingyilianjie", "field_liebiao", "Inline_address"],
|
|
24
|
+
populate: {
|
|
25
|
+
icon: {
|
|
26
|
+
fields: ["alt"],
|
|
27
|
+
populate: {
|
|
28
|
+
media: {
|
|
29
|
+
fields: ["url", "name", "mime", "width", "height"]
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
/** 该接口通常为单条配置,使用 id 做稳定标识 */
|
|
38
|
+
slugPath: "id",
|
|
39
|
+
/** 配置类:index.json 输出对象,且多条时取第一条(对应 data[0]) */
|
|
40
|
+
indexJsonAsObject: true,
|
|
41
|
+
indexJsonObjectMode: "first",
|
|
42
|
+
/** 不输出富文本 html(如后续确认 field_neirong 是富文本,再补充) */
|
|
43
|
+
richTextFieldPaths: [],
|
|
44
|
+
fieldMappings: {
|
|
45
|
+
"shoujiduandibucaidan": "list",
|
|
46
|
+
"shoujiduandibucaidan[field_neirong]": "title",
|
|
47
|
+
"shoujiduandibucaidan[field_zidingyilianjie]": "custom_link",
|
|
48
|
+
"shoujiduandibucaidan[field_liebiao]": "key",
|
|
49
|
+
"shoujiduandibucaidan[Inline_address]": "link",
|
|
50
|
+
}
|
|
51
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 模块配置模板(复制后按真实接口填写)。
|
|
4
|
+
*
|
|
5
|
+
* 注意:
|
|
6
|
+
* - 这里只提供结构与注释,不包含任何模拟数据或演示接口地址。
|
|
7
|
+
* - endpoint 需要是 Strapi 的真实 REST 路径(例如 /api/news)。
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.news = void 0;
|
|
11
|
+
exports.news = {
|
|
12
|
+
// 模块目录名:最终会输出到 data/**/[name]/index.json
|
|
13
|
+
name: "news",
|
|
14
|
+
// Strapi REST API 路径(不含 baseUrl)
|
|
15
|
+
endpoint: "/api/news",
|
|
16
|
+
// 接口级国际化:内容型接口通常为 true;语言列表等接口为 false
|
|
17
|
+
i18n: { enabled: true },
|
|
18
|
+
/**
|
|
19
|
+
* 分页大小(limit)。
|
|
20
|
+
*
|
|
21
|
+
* 说明:
|
|
22
|
+
* - 后端接口存在响应耗时与超时风险(客户端默认 30s 超时)
|
|
23
|
+
* - limit 过大(例如 500)会显著放大单次响应体与服务端计算成本,容易触发 Abort/超时
|
|
24
|
+
* - 因此这里保持 100,避免单次请求过重导致失败
|
|
25
|
+
*/
|
|
26
|
+
pageSize: 100,
|
|
27
|
+
// Strapi query 对象:用于维护 populate/fields/filters/sort 等复杂参数
|
|
28
|
+
query: {
|
|
29
|
+
sort: 'createdAt:desc',
|
|
30
|
+
populate: {
|
|
31
|
+
keyword: {
|
|
32
|
+
fields: '*',
|
|
33
|
+
},
|
|
34
|
+
news_category: {
|
|
35
|
+
fields: 'url_slug,title',
|
|
36
|
+
},
|
|
37
|
+
seoSetting: {
|
|
38
|
+
fields: 'title,description',
|
|
39
|
+
},
|
|
40
|
+
picture: {
|
|
41
|
+
populate: {
|
|
42
|
+
media: { fields: 'url' },
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
// slug 字段路径(从单条记录对象取值,例如 attributes.slug)
|
|
48
|
+
slugPath: "url_slug",
|
|
49
|
+
// 是否启用富文本关键词内链转换(不是所有接口都需要)
|
|
50
|
+
// - true:对 richTextFieldPaths 指定字段做关键词内链严格转换
|
|
51
|
+
// - false:仅输出 html,不做关键词处理
|
|
52
|
+
enableKeywordLinking: true,
|
|
53
|
+
// 富文本字段路径列表(从单条记录对象取值)
|
|
54
|
+
richTextFieldPaths: [
|
|
55
|
+
// product_detail_set 为“详情集合”(数组组件):导出时会把其 details_content 拼接成一个 html 文件
|
|
56
|
+
'news_detail',
|
|
57
|
+
],
|
|
58
|
+
// 仅 content(由 product_detail_set 转换而来)需要关键词内链,其它富文本不做内链替换
|
|
59
|
+
keywordLinkingFieldPaths: ["news_detail"],
|
|
60
|
+
/**
|
|
61
|
+
* 字段映射(接口字段名 -> 最终导出字段名)
|
|
62
|
+
*
|
|
63
|
+
* 说明:
|
|
64
|
+
* - 只需要在这里维护映射表,不要在代码里手动一个个 rename/delete
|
|
65
|
+
* - 支持点号路径(例如 seoSetting.title -> seo.title)
|
|
66
|
+
*/
|
|
67
|
+
fieldMappings: {
|
|
68
|
+
"url_slug": "slug",
|
|
69
|
+
"news_category": "category",
|
|
70
|
+
"keyword": "seoSetting.keywords",
|
|
71
|
+
"news_detail": "content",
|
|
72
|
+
},
|
|
73
|
+
removeFields: ["auto_slug", "category.id", "category.documentId"]
|
|
74
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.partner = void 0;
|
|
4
|
+
exports.partner = {
|
|
5
|
+
/** 模块目录名:最终会输出到 data/<lang>/partner/index.json */
|
|
6
|
+
name: "partner",
|
|
7
|
+
/** Strapi REST API 路径(不含 baseUrl) */
|
|
8
|
+
endpoint: "/api/cooperative-partners",
|
|
9
|
+
/** 该接口按语言区分(locale) */
|
|
10
|
+
i18n: { enabled: true },
|
|
11
|
+
/** 分页大小:保持与其它内容模块一致 */
|
|
12
|
+
pageSize: 100,
|
|
13
|
+
/**
|
|
14
|
+
* 查询参数(对应前端 loader 的 fields + populate + sort)。
|
|
15
|
+
*
|
|
16
|
+
* 注意:
|
|
17
|
+
* - locale/pagination 由导出器统一补齐,这里只维护业务 query
|
|
18
|
+
*/
|
|
19
|
+
query: {
|
|
20
|
+
sort: "createdAt:desc",
|
|
21
|
+
fields: ["documentId", "title", "details", "sort", "createdAt", "publishedAt", "locale", "url_slug", "tuijiandaoshouye"],
|
|
22
|
+
populate: {
|
|
23
|
+
keyword: {
|
|
24
|
+
fields: ["id", "keyword"]
|
|
25
|
+
},
|
|
26
|
+
picture: {
|
|
27
|
+
fields: ["alt"],
|
|
28
|
+
populate: {
|
|
29
|
+
media: {
|
|
30
|
+
fields: ["url", "width", "height"]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
seoSetting: {
|
|
35
|
+
fields: ["title", "description"]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
/** 使用 url_slug 作为标识(导出器会统一 trim 前后 `/`) */
|
|
40
|
+
slugPath: "url_slug",
|
|
41
|
+
/** details 为富文本:输出为 html 文件 */
|
|
42
|
+
enableKeywordLinking: true,
|
|
43
|
+
richTextFieldPaths: ["details"],
|
|
44
|
+
keywordLinkingFieldPaths: ["details"],
|
|
45
|
+
/**
|
|
46
|
+
* 字段映射:
|
|
47
|
+
* - url_slug -> slug(字段名统一)
|
|
48
|
+
* - details -> content(与前端 schema 命名一致;值为 html 文件名字符串)
|
|
49
|
+
* - keyword -> seoSetting.keywords(结构对齐)
|
|
50
|
+
*/
|
|
51
|
+
fieldMappings: {
|
|
52
|
+
url_slug: "slug",
|
|
53
|
+
details: "content",
|
|
54
|
+
keyword: "seoSetting.keywords"
|
|
55
|
+
}
|
|
56
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 模块配置模板(复制后按真实接口填写)。
|
|
4
|
+
*
|
|
5
|
+
* 注意:
|
|
6
|
+
* - 这里只提供结构与注释,不包含任何模拟数据或演示接口地址。
|
|
7
|
+
* - endpoint 需要是 Strapi 的真实 REST 路径(例如 /api/products)。
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.products = void 0;
|
|
11
|
+
exports.products = {
|
|
12
|
+
// 模块目录名:最终会输出到 data/**/[name]/index.json
|
|
13
|
+
name: "products",
|
|
14
|
+
// Strapi REST API 路径(不含 baseUrl)
|
|
15
|
+
endpoint: "/api/product-manages",
|
|
16
|
+
// 接口级国际化:内容型接口通常为 true;语言列表等接口为 false
|
|
17
|
+
i18n: { enabled: true },
|
|
18
|
+
/**
|
|
19
|
+
* 分页大小(limit)。
|
|
20
|
+
*
|
|
21
|
+
* 说明:
|
|
22
|
+
* - 后端接口存在响应耗时与超时风险(客户端默认 30s 超时)
|
|
23
|
+
* - limit 过大(例如 500)会显著放大单次响应体与服务端计算成本,容易触发 Abort/超时
|
|
24
|
+
* - 因此这里保持 100,避免单次请求过重导致失败
|
|
25
|
+
*/
|
|
26
|
+
pageSize: 100,
|
|
27
|
+
// Strapi query 对象:用于维护 populate/fields/filters/sort 等复杂参数
|
|
28
|
+
query: {
|
|
29
|
+
sort: "sort:desc",
|
|
30
|
+
populate: {
|
|
31
|
+
keyword: {
|
|
32
|
+
fields: "*"
|
|
33
|
+
},
|
|
34
|
+
product_detail_set: {
|
|
35
|
+
fields: 'details_name,details_content'
|
|
36
|
+
},
|
|
37
|
+
product_category: {
|
|
38
|
+
fields: 'url_slug,title'
|
|
39
|
+
},
|
|
40
|
+
seoSetting: {
|
|
41
|
+
fields: 'title,description'
|
|
42
|
+
},
|
|
43
|
+
picture: {
|
|
44
|
+
populate: {
|
|
45
|
+
media: {
|
|
46
|
+
fields: 'url'
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
// slug 字段路径(从单条记录对象取值,例如 attributes.slug)
|
|
53
|
+
slugPath: "url_slug",
|
|
54
|
+
// 是否启用富文本关键词内链转换(不是所有接口都需要)
|
|
55
|
+
// - true:对 richTextFieldPaths 指定字段做关键词内链严格转换
|
|
56
|
+
// - false:仅输出 html,不做关键词处理
|
|
57
|
+
enableKeywordLinking: true,
|
|
58
|
+
// 富文本字段路径列表(从单条记录对象取值)
|
|
59
|
+
richTextFieldPaths: [
|
|
60
|
+
// product_detail_set 为“详情集合”(数组组件):导出时会把其 details_content 拼接成一个 html 文件
|
|
61
|
+
'product_detail_set',
|
|
62
|
+
'product_advantage'
|
|
63
|
+
],
|
|
64
|
+
// 仅 content(由 product_detail_set 转换而来)需要关键词内链,其它富文本不做内链替换
|
|
65
|
+
keywordLinkingFieldPaths: ["product_detail_set"],
|
|
66
|
+
/**
|
|
67
|
+
* 字段映射(接口字段名 -> 最终导出字段名)
|
|
68
|
+
*
|
|
69
|
+
* 说明:
|
|
70
|
+
* - 只需要在这里维护映射表,不要在代码里手动一个个 rename/delete
|
|
71
|
+
* - 支持点号路径(例如 seoSetting.title -> seo.title)
|
|
72
|
+
*/
|
|
73
|
+
fieldMappings: {
|
|
74
|
+
"url_slug": "slug",
|
|
75
|
+
"product_category": "category",
|
|
76
|
+
"keyword": "seoSetting.keywords",
|
|
77
|
+
},
|
|
78
|
+
removeFields: ["auto_slug",]
|
|
79
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* robots 配置(/api/robot)。
|
|
4
|
+
*
|
|
5
|
+
* 需求:
|
|
6
|
+
* - 接口返回字段 `is_open`:用于判断是否需要生成 robots.txt
|
|
7
|
+
* - 接口返回字段 `robots`:robots.txt 内容来源
|
|
8
|
+
*
|
|
9
|
+
* 输出说明:
|
|
10
|
+
* - 模块自身仍会输出到 `data/shared/robot/index.json`
|
|
11
|
+
* - robots.txt 的生成逻辑在 cli 写盘阶段额外处理(见 `src/tools/robotsTxt.ts`)
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.robot = void 0;
|
|
15
|
+
exports.robot = {
|
|
16
|
+
// 模块目录名:最终会输出到 data/**/[name]/index.json
|
|
17
|
+
name: "robot",
|
|
18
|
+
// Strapi REST API 路径(不含 baseUrl)
|
|
19
|
+
endpoint: "/api/robot",
|
|
20
|
+
// 该接口是全局配置,不区分语言
|
|
21
|
+
i18n: { enabled: false },
|
|
22
|
+
// single type 通常不分页,但导出器逻辑统一,这里给安全默认值
|
|
23
|
+
pageSize: 100,
|
|
24
|
+
/**
|
|
25
|
+
* query 参数。
|
|
26
|
+
*
|
|
27
|
+
* 说明:
|
|
28
|
+
* - 该接口对 fields 参数校验较严格(可能不接受 `is_open` 这种字段名)
|
|
29
|
+
* - 为保证稳定性,这里不传 fields 约束,直接取接口返回的完整对象
|
|
30
|
+
*/
|
|
31
|
+
query: {},
|
|
32
|
+
// single type 通常含 id:用于写入 index.json 的标识字段
|
|
33
|
+
slugPath: "id",
|
|
34
|
+
// 配置类:index.json 输出对象(不是数组)
|
|
35
|
+
indexJsonAsObject: true,
|
|
36
|
+
// 若后端返回数组,这里取第一条(对应常见 data[0] 用法)
|
|
37
|
+
indexJsonObjectMode: "first",
|
|
38
|
+
// 不输出富文本 html
|
|
39
|
+
enableKeywordLinking: false,
|
|
40
|
+
richTextFieldPaths: []
|
|
41
|
+
};
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SEO 相关接口配置(合并在一个文件里维护)。
|
|
4
|
+
*
|
|
5
|
+
* 设计说明:
|
|
6
|
+
* - 当前导出器的“模块”语义是:一个模块对应一个 endpoint(最简单、最稳定,不引入额外自定义流程)
|
|
7
|
+
* - 但你提到“4 个接口放一起维护更方便”:因此这里在同一个文件里导出 4 个 ModuleConfig
|
|
8
|
+
* - app.config.ts 已支持自动加载 modules 目录下所有导出对象,无需手动 import
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.seoClassSetting = exports.seoCentralPageSettings = exports.seoHomepageSetting = exports.seoGlobalSetting = void 0;
|
|
12
|
+
/**
|
|
13
|
+
* 构建一个最简模块配置。
|
|
14
|
+
*
|
|
15
|
+
* 说明:
|
|
16
|
+
* - 把重复的固定字段收敛到一个函数里,减少拷贝粘贴
|
|
17
|
+
* - slugPath 统一用 id:兼容 collection/single(cli.ts 会把 number 转为 string)
|
|
18
|
+
*/
|
|
19
|
+
function buildSeoModule(params) {
|
|
20
|
+
return {
|
|
21
|
+
name: params.name,
|
|
22
|
+
endpoint: params.endpoint,
|
|
23
|
+
// SEO 配置按语言区分,因此启用 i18n(locale 会由程序自动补齐)
|
|
24
|
+
i18n: { enabled: true },
|
|
25
|
+
// 单次请求不要过大,避免响应体过重导致超时(客户端默认 30s 超时)
|
|
26
|
+
pageSize: 100,
|
|
27
|
+
query: params.query,
|
|
28
|
+
slugPath: "id",
|
|
29
|
+
// SEO 设置默认属于配置类数据:index.json 用对象结构更易读、更符合使用习惯
|
|
30
|
+
indexJsonAsObject: typeof params.indexJsonAsObject === "boolean" ? params.indexJsonAsObject : true,
|
|
31
|
+
// SEO 配置不输出富文本 html,也不做关键词内链
|
|
32
|
+
enableKeywordLinking: false,
|
|
33
|
+
richTextFieldPaths: [],
|
|
34
|
+
// 字段映射(可选):用于把接口字段统一为导出字段名
|
|
35
|
+
fieldMappings: params.fieldMappings
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 全局 SEO 设置。
|
|
40
|
+
*/
|
|
41
|
+
exports.seoGlobalSetting = buildSeoModule({
|
|
42
|
+
name: "seo-global-setting",
|
|
43
|
+
endpoint: "/api/global-seo-setting",
|
|
44
|
+
query: {
|
|
45
|
+
fields: ["title", "prefixes"],
|
|
46
|
+
populate: {
|
|
47
|
+
postLongKeyword: "*",
|
|
48
|
+
websiteMainKeyword: "*"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* 首页 SEO 设置。
|
|
54
|
+
*/
|
|
55
|
+
exports.seoHomepageSetting = buildSeoModule({
|
|
56
|
+
name: "seo-homepage-setting",
|
|
57
|
+
endpoint: "/api/homepage-seo-setting",
|
|
58
|
+
query: {
|
|
59
|
+
fields: ["title", "description"],
|
|
60
|
+
populate: {
|
|
61
|
+
keyword: "*",
|
|
62
|
+
picture: {
|
|
63
|
+
fields: "alt",
|
|
64
|
+
populate: {
|
|
65
|
+
media: { fields: "name,url,width,height" }
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
/**
|
|
72
|
+
* 中心页 SEO 设置(可能为集合:central-page-seo-settings)。
|
|
73
|
+
*/
|
|
74
|
+
exports.seoCentralPageSettings = buildSeoModule({
|
|
75
|
+
name: "seo-central-page-settings",
|
|
76
|
+
endpoint: "/api/central-page-seo-settings",
|
|
77
|
+
// 该接口为集合:需要输出数组(不是配置对象)
|
|
78
|
+
indexJsonAsObject: false,
|
|
79
|
+
query: {
|
|
80
|
+
fields: ["title", "description"],
|
|
81
|
+
populate: {
|
|
82
|
+
keyword: "*",
|
|
83
|
+
picture: {
|
|
84
|
+
fields: "alt",
|
|
85
|
+
populate: {
|
|
86
|
+
media: { fields: "name,url,width,height" }
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
/**
|
|
93
|
+
* 分类页 SEO 设置。
|
|
94
|
+
*/
|
|
95
|
+
exports.seoClassSetting = buildSeoModule({
|
|
96
|
+
name: "seo-class-setting",
|
|
97
|
+
endpoint: "/api/class-seo-setting",
|
|
98
|
+
query: {},
|
|
99
|
+
fieldMappings: {
|
|
100
|
+
"ProductCenterPageDescriptionTemplate": "productCenterPageDescriptionTemplate",
|
|
101
|
+
}
|
|
102
|
+
});
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.singlepages = void 0;
|
|
4
|
+
exports.singlepages = {
|
|
5
|
+
// 模块目录名:最终会输出到 data/[lang]/[name]/index.json(或 data/shared/[name]/index.json)
|
|
6
|
+
name: "singlepages",
|
|
7
|
+
// Strapi REST API 路径(不含 baseUrl)
|
|
8
|
+
endpoint: "/api/singlepages",
|
|
9
|
+
// 该接口按语言区分,因此启用 i18n(locale 会由程序自动补齐)
|
|
10
|
+
i18n: { enabled: true },
|
|
11
|
+
// 分页大小(limit):保持安全默认值即可
|
|
12
|
+
pageSize: 100,
|
|
13
|
+
/**
|
|
14
|
+
* Strapi query:按你提供的 sort/fields/populate 原样表达(不生成任何演示数据)。
|
|
15
|
+
*
|
|
16
|
+
* 注意:
|
|
17
|
+
* - fields 使用数组写法,序列化后更稳定(fields[0]=...)
|
|
18
|
+
*/
|
|
19
|
+
query: {
|
|
20
|
+
sort: "createdAt:desc",
|
|
21
|
+
fields: ["documentId", "title", "details", "createdAt", "publishedAt", "url_slug", "locale", "sort"],
|
|
22
|
+
populate: {
|
|
23
|
+
keyword: { fields: "*" },
|
|
24
|
+
custom_category: { fields: ["title", "url_slug"] },
|
|
25
|
+
seoSetting: { fields: ["title", "description"] },
|
|
26
|
+
picture: {
|
|
27
|
+
fields: ["alt"],
|
|
28
|
+
populate: {
|
|
29
|
+
media: {
|
|
30
|
+
fields: ["name", "url", "width", "height"]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
// slug 字段路径:接口字段为 url_slug
|
|
37
|
+
slugPath: "url_slug",
|
|
38
|
+
/**
|
|
39
|
+
* 富文本关键词内链:
|
|
40
|
+
* - 与 news/cases 保持一致:对 details 做关键词内链转换(若不需要可后续再关)
|
|
41
|
+
*/
|
|
42
|
+
enableKeywordLinking: true,
|
|
43
|
+
richTextFieldPaths: ["details"],
|
|
44
|
+
keywordLinkingFieldPaths: ["details"],
|
|
45
|
+
/**
|
|
46
|
+
* 字段映射(接口字段名 -> 最终导出字段名)
|
|
47
|
+
*
|
|
48
|
+
* 说明:
|
|
49
|
+
* - 将 url_slug 统一导出为 slug,便于前端消费
|
|
50
|
+
*/
|
|
51
|
+
fieldMappings: {
|
|
52
|
+
"url_slug": "slug",
|
|
53
|
+
"custom_category": "category",
|
|
54
|
+
"keyword": "seoSetting.keywords",
|
|
55
|
+
"details": "content",
|
|
56
|
+
}
|
|
57
|
+
};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 站点配置(Site Configuration)。
|
|
4
|
+
*
|
|
5
|
+
* 来源:
|
|
6
|
+
* - 对应你现有项目里的 `/site-configuration` 请求(带 locale/fields/populate)。
|
|
7
|
+
*
|
|
8
|
+
* 设计说明:
|
|
9
|
+
* - 本导出器的“模块 = 一个 endpoint”,这里保持最简:一个模块对应一个接口
|
|
10
|
+
* - query 只维护“业务字段/关联”部分;pagination 与 locale 会在运行时自动补齐
|
|
11
|
+
* - 站点配置通常是单条数据(single type),但导出器会统一按“列表”处理:
|
|
12
|
+
* { data: { ... } } 会被当成 1 条记录导出到 index.json
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.siteConfiguration = void 0;
|
|
16
|
+
exports.siteConfiguration = {
|
|
17
|
+
// 模块目录名:最终会输出到 data/**/[name]/index.json
|
|
18
|
+
name: "site-configuration",
|
|
19
|
+
// Strapi REST API 路径(不含 baseUrl)
|
|
20
|
+
endpoint: "/api/site-configuration",
|
|
21
|
+
// 该接口按语言区分,因此启用 i18n(locale 会由程序自动补齐)
|
|
22
|
+
i18n: { enabled: true },
|
|
23
|
+
/**
|
|
24
|
+
* 分页大小(limit)。
|
|
25
|
+
*
|
|
26
|
+
* 说明:
|
|
27
|
+
* - single type 通常不分页,但导出器逻辑是统一的,这里给一个安全默认值即可
|
|
28
|
+
* - 保持 100,避免单次请求体过大导致超时风险
|
|
29
|
+
*/
|
|
30
|
+
pageSize: 100,
|
|
31
|
+
/**
|
|
32
|
+
* Strapi query 对象:用于维护 populate/fields 等复杂参数。
|
|
33
|
+
*
|
|
34
|
+
* 注意:
|
|
35
|
+
* - fields 这里用数组,qs 会按 indices 序列化为 fields[0]=...,兼容性更稳定
|
|
36
|
+
* - populate 按你提供的请求参数原样表达(不生成任何演示数据)
|
|
37
|
+
*/
|
|
38
|
+
query: {
|
|
39
|
+
fields: [
|
|
40
|
+
"field_zhandiandingbuyouxiang",
|
|
41
|
+
"field_zhandiandingbu",
|
|
42
|
+
"field_whatsapplianjie",
|
|
43
|
+
"field_chanpinxiangqingwhatsapp",
|
|
44
|
+
"field_chanpinxiangqingyeshifouxi",
|
|
45
|
+
"locale",
|
|
46
|
+
"title",
|
|
47
|
+
"inquiry_form_button_text"
|
|
48
|
+
],
|
|
49
|
+
populate: {
|
|
50
|
+
field_logo: {
|
|
51
|
+
populate: {
|
|
52
|
+
media: {
|
|
53
|
+
fields: ["url", "name", "mime", "width", "height"]
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
field_footercompany: {
|
|
58
|
+
fields: ["field_dibu", "field_mingchengb", "field_gongsixinxi"]
|
|
59
|
+
},
|
|
60
|
+
field_socialplatform: {
|
|
61
|
+
fields: ["field_pingtai", "field_url"],
|
|
62
|
+
populate: {
|
|
63
|
+
field_picture: {
|
|
64
|
+
populate: {
|
|
65
|
+
media: {
|
|
66
|
+
fields: ["url", "name", "mime", "width", "height"]
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
copyright_settings: {
|
|
73
|
+
fields: "*"
|
|
74
|
+
},
|
|
75
|
+
field_ico: {
|
|
76
|
+
fields: ["alt"],
|
|
77
|
+
populate: {
|
|
78
|
+
media: {
|
|
79
|
+
fields: ["url", "name", "mime", "width", "height"]
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
},
|
|
85
|
+
/**
|
|
86
|
+
* 导出器需要一个“标识字段”写入 index.json。
|
|
87
|
+
*
|
|
88
|
+
* 说明:
|
|
89
|
+
* - single type 的 data 通常含有 id,因此用 id 最稳
|
|
90
|
+
* - cli.ts 内会把 number id 转成 string,满足 slug 字段要求
|
|
91
|
+
*/
|
|
92
|
+
slugPath: "id",
|
|
93
|
+
/**
|
|
94
|
+
* index.json 输出为对象(single type 更符合直觉)。
|
|
95
|
+
*
|
|
96
|
+
* 说明:
|
|
97
|
+
* - 若接口最终只有 1 条记录:index.json 直接写该对象(不是数组)
|
|
98
|
+
*/
|
|
99
|
+
indexJsonAsObject: true,
|
|
100
|
+
// 站点配置不输出富文本 html
|
|
101
|
+
enableKeywordLinking: false,
|
|
102
|
+
richTextFieldPaths: [],
|
|
103
|
+
fieldMappings: {
|
|
104
|
+
"field_zhandiandingbuyouxiang": "email",
|
|
105
|
+
"field_zhandiandingbu": "phone",
|
|
106
|
+
"field_whatsapplianjie": "whatsapp",
|
|
107
|
+
"field_chanpinxiangqingwhatsapp": "detail_whatsapp",
|
|
108
|
+
"field_chanpinxiangqingyeshifouxi": "product_detail_why_us",
|
|
109
|
+
"field_logo": "logo",
|
|
110
|
+
"field_guanzh": "",
|
|
111
|
+
"field_footercompany": "footer_company",
|
|
112
|
+
// 数组子项字段重命名:对 field_footercompany 的每个元素执行 child -> newKey
|
|
113
|
+
"field_footercompany[field_dibu]": "title",
|
|
114
|
+
"field_footercompany[field_mingchengb]": "key",
|
|
115
|
+
"field_footercompany[field_gongsixinxi]": "value",
|
|
116
|
+
"field_socialplatform": "socialplatform",
|
|
117
|
+
// 数组子项字段重命名:对 field_socialplatform 的每个元素执行 child -> newKey
|
|
118
|
+
"field_socialplatform[field_pingtai]": "key",
|
|
119
|
+
"field_socialplatform[field_url]": "value",
|
|
120
|
+
"field_socialplatform[field_picture]": "image",
|
|
121
|
+
"copyright_settings": "copyright",
|
|
122
|
+
"field_ico": "icon",
|
|
123
|
+
// 子级字段重命名:避免点号路径在 parent 改名后失效
|
|
124
|
+
// - 先在 field_ico 内把 media -> image
|
|
125
|
+
// - 再由 "field_ico" -> "icon" 把整个对象迁移为 icon(因此最终为 icon.image)
|
|
126
|
+
"field_ico[media]": "image",
|
|
127
|
+
},
|
|
128
|
+
};
|