From 2a5685605bb0e604b80714092e8e8aa67556e0f9 Mon Sep 17 00:00:00 2001 From: Your Name Date: Sat, 18 Apr 2026 14:23:54 +0800 Subject: [PATCH] refactor: improve template notes readability --- .../DomainBatchImportTemplateHelper.php | 41 +++++++++++------- .../DomainSupplyBatchTemplateHelper.php | 20 ++++----- .../site-domain-import-template.xlsx | Bin 8911 -> 10616 bytes .../domain-supply-batch-template.xlsx | Bin 0 -> 11011 bytes 4 files changed, 35 insertions(+), 26 deletions(-) create mode 100644 code/public/_admin_templates/domain-supply-batch/domain-supply-batch-template.xlsx diff --git a/code/app/common/helper/DomainBatchImportTemplateHelper.php b/code/app/common/helper/DomainBatchImportTemplateHelper.php index 9421cd5..373105e 100644 --- a/code/app/common/helper/DomainBatchImportTemplateHelper.php +++ b/code/app/common/helper/DomainBatchImportTemplateHelper.php @@ -10,6 +10,13 @@ use PhpOffice\PhpSpreadsheet\Writer\Xlsx; class DomainBatchImportTemplateHelper { + public static function buildNoteDisplayLabel(string $field): string + { + $label = self::getHeaderLabels()[$field] ?? $field; + + return $label . '(' . $field . ')'; + } + public static function getHeaderLabels(): array { return [ @@ -120,11 +127,13 @@ class DomainBatchImportTemplateHelper $notesSheet = $spreadsheet->createSheet(); $notesSheet->setTitle('notes'); - $notesSheet->setCellValue('A1', 'column'); - $notesSheet->setCellValue('B1', 'note'); + $notesSheet->setCellValue('A1', '字段'); + $notesSheet->setCellValue('B1', '说明'); $notesSheet->getStyle('A1:B1')->getFont()->setBold(true); - $notesSheet->getColumnDimension('A')->setWidth(28); - $notesSheet->getColumnDimension('B')->setWidth(80); + $notesSheet->getColumnDimension('A')->setWidth(42); + $notesSheet->getColumnDimension('B')->setWidth(120); + $notesSheet->getStyle('A:B')->getAlignment()->setWrapText(true); + $notesSheet->getStyle('A:B')->getAlignment()->setVertical(\PhpOffice\PhpSpreadsheet\Style\Alignment::VERTICAL_TOP); $rowNo = 2; foreach ($columnNotes as $column => $note) { @@ -172,26 +181,26 @@ class DomainBatchImportTemplateHelper return [ 'd_domain' => '必填。填写站点正式域名,不要带 https:// 。示例:jingxifa.com。只有做泛域名时,才填 *.example.com。', 'd_name' => '必填。填写站点前台展示名称,会用于页头、页脚和基础 SEO 文案。示例:鲸溪发影视。', - 't_id' => '通常直接填 1。只有明确知道要换模板时才改;不确定就不要改。', + 't_id' => "通常直接填 1。\n可选值说明:\n- 1:当前默认模板。绝大多数 GPT 模板站都填这个。\n- 其他数字:代表后台另外配置过的模板 ID,只有你明确知道该站要切到别的模板时才改。\n不会判断时就保持 1,不要猜。", 'd_index_title' => '建议填写。首页给搜索引擎看的标题,尽量自然,不要堆词。建议 28 到 40 字。', 'd_index_keywords' => '建议填写。首页核心关键词,多个词用逗号分隔。示例:短剧推荐,热播短剧,高清短剧。', 'd_index_description' => '建议填写。首页一句话简介,建议 40 到 80 字,写自然一点。', - 'strategy_profile' => '通常不用改,默认 standard。只有明确知道要做流量型、扩展型站点时,才改成 traffic 或 expand。', + 'strategy_profile' => "SEO 策略档位,默认 standard。\n可选值说明:\n- standard:标准站,最常用默认值。普通内容站、普通影视站、先求稳定收录时选它。\n- traffic:流量型。更强调关键词覆盖、流量页铺量,适合明确要做流量词扩展的站。\n- expand:扩展型。更适合泛域名、子站扩展、批量铺设场景。\n- closed:收缩/关闭型。通常用于不再继续扩张或只保留最小发布动作的站。\n不确定就填 standard。", 'd_keywords' => '可选。不填也能跑;如要补充站点级关键词,可填在这里。', 'd_description' => '可选。不填时系统会按站点名称自动兜底一版简介。', 'd_baidu_token' => '可选。只有需要百度主动推送时才填写。', - 'd_match_type' => '可选。默认 exact。普通单域名站保持默认即可;只有泛域名场景才需要改。', - 'd_parent_domain' => '只有 wildcard 泛域名场景才需要填根域名。普通单域名站留空即可。', - 'd_seed_scope' => '可选。默认 domain。普通单域名站不用改;只有特殊 host 级种子策略才改。', + 'd_match_type' => "域名匹配方式,默认 exact。\n可选值说明:\n- exact:精确匹配。普通单域名站使用这个,例如 jingxifa.com。\n- wildcard:泛匹配。只有泛域名场景才用,例如 *.example.com。\n如果你填的是普通单域名,就保持 exact。", + 'd_parent_domain' => "父域名只在 wildcard 泛域名场景下填写。\n填写规则:\n- 如果 d_domain 是 *.example.com,这里填 example.com。\n- 如果 d_domain 是普通单域名,例如 jingxifa.com,这里留空。\n不要把 https:// 或路径带进来。", + 'd_seed_scope' => "种子范围,默认 domain。\n可选值说明:\n- domain:按整域名范围处理,普通站点默认用这个。\n- host:按具体 host 处理,常见于泛域名、子站单独铺设的场景。\n不确定就用 domain。", 'd_statis' => '可选。统计代码区,运营通常不用填。', - 'd_logo_type' => '通常填 0。普通站点不用改;如果是纯图片 LOGO 再按技术要求调整。', + 'd_logo_type' => "LOGO 类型,通常填 0。\n可选值说明:\n- 0:文字 LOGO 优先。最常用,普通站点直接用这个。\n- 1:图片 LOGO 优先。只有明确要展示图片 LOGO,且 d_img_logo 已准备好时才用。\n不确定就填 0。", 'd_text_logo' => '可选。填写前台显示的文字 LOGO;不填时可按站点名称兜底。', 'd_img_logo' => '可选。只有要使用图片 LOGO 时才填写。', - 'd_content_encode' => '通常填 0。普通运营不用改。', - 'info_id' => '通常填 0。普通运营不用改。', - 'd_seo_cfg' => '可选。高级配置区,通常给技术同学使用。运营不需要填写;只有明确要覆盖默认 SEO 策略时再填 JSON。', - 'tkd_mode' => '可选。一般不用填。留空时系统会根据首页三要素是否导入自动选择模式。', - 'tkd_provider' => '可选。一般保持 local,不需要运营修改。', + 'd_content_encode' => "内容编码,通常填 0。\n可选值说明:\n- 0:默认编码方式。普通站直接用这个。\n- 其他值:特殊历史兼容场景才会用,运营不要自行改。\n不会判断就填 0。", + 'info_id' => "信息 ID,通常填 0。\n可选值说明:\n- 0:默认即可。\n- 其他数字:通常是历史数据联动或特殊资源绑定才会用。\n普通新站不要改。", + 'd_seo_cfg' => "高级 SEO 配置 JSON。普通运营通常留空。\n适用场景:\n- 要覆盖默认 SEO 行为\n- 要补结构化数据\n- 要定制 forge / route_group 等技术项\n注意:必须填写合法 JSON,例如 {\"forge\":{\"route_group\":\"film\"}}。\n如果看不懂,就留空。", + 'tkd_mode' => "TKD 模式。一般可留空,由系统自动判断。\n常见可选值说明:\n- 留空:推荐。系统按当前导入内容自动选择。\n- 1:偏向使用导入内容/现成内容。\n- 2:偏向使用系统生成或增强策略。\n不同环境里数字语义可能有历史兼容差异,所以运营不建议手改;只有技术明确要求时再填。", + 'tkd_provider' => "TKD 来源。一般保持 local 或留空。\n可选值说明:\n- local:本地默认来源,最稳,常规就用它。\n- openai:走 AI 生成或 AI 优化链路,只有明确开了这套能力时才填。\n- 其他值:属于技术兼容项,不建议运营手填。\n不确定就留空或填 local。", ]; } @@ -317,7 +326,7 @@ class DomainBatchImportTemplateHelper ); $displayNotes = []; foreach (self::getColumnNotes() as $field => $note) { - $displayNotes[$headerLabels[$field] ?? $field] = $note; + $displayNotes[self::buildNoteDisplayLabel($field)] = $note; } self::writeWorkbook( diff --git a/code/app/common/helper/DomainSupplyBatchTemplateHelper.php b/code/app/common/helper/DomainSupplyBatchTemplateHelper.php index 4233f68..961548d 100644 --- a/code/app/common/helper/DomainSupplyBatchTemplateHelper.php +++ b/code/app/common/helper/DomainSupplyBatchTemplateHelper.php @@ -128,11 +128,11 @@ class DomainSupplyBatchTemplateHelper return [ 'host' => '必填。填写站点正式域名,不要带 https:// 。示例:jingxifa.com。只有做泛域名时,才填 *.example.com。', 'site_name' => '必填。填写站点前台展示名称,会用于页头、页脚和基础 SEO 文案。示例:鲸溪发影视。', - 'template_id' => '通常直接填 1。只有确认要换模板时才改;不确定就不要改。', + 'template_id' => "通常直接填 1。\n可选值说明:\n- 1:当前默认 GPT 模板。绝大多数站都用这个。\n- 其他数字:代表后台另有模板配置,只有技术明确指定时才改。\n不确定就填 1。", 'site_index_title' => '建议填写。首页给搜索引擎看的标题,尽量自然,不要堆词。建议 28 到 40 字。', 'site_index_keywords' => '建议填写。首页核心关键词,多个词用逗号分隔。示例:短剧推荐,热播短剧,高清短剧。', 'site_index_description' => '建议填写。首页一句话简介,建议 40 到 80 字,写自然一点。', - 'strategy_profile' => '通常不用改,默认 standard。只有明确知道要做流量型、扩展型站点时,才改成 traffic 或 expand。', + 'strategy_profile' => "SEO 策略档位,默认 standard。\n可选值说明:\n- standard:标准站,最常用默认值,先求稳定收录和正常运营时选它。\n- traffic:流量型,更偏向做关键词覆盖和流量页扩展。\n- expand:扩展型,更适合泛域名、子站批量扩展。\n- closed:收缩/关闭型,通常用于只保留最小更新动作的站。\n不确定就填 standard。", 'detail_id' => '通常不用手填。站点部署成功后,系统会优先通过自动样本发现,从当前站点可用内容里自动提取。只有域名还没部署成功、当前只是试跑库、或自动发现失败时,才人工补填真实详情视频 ID。', 'detail_slug' => '通常不用手填。会和详情样本 ID 一起自动获取。若人工填写,必须和详情样本 ID 对应,不能乱配。', 'search_keyword' => '通常不用手填。系统会优先从站点名称、视频 SEO 词、视频标题里自动挑一个可搜索关键词。只有自动发现失败时,再人工填写一个能搜出结果的词。', @@ -141,13 +141,13 @@ class DomainSupplyBatchTemplateHelper 'site_keywords' => '可选。不填也能跑;如要补充站点级关键词,可填在这里。', 'site_description' => '可选。不填时系统会按站点名称自动兜底一版简介。', 'baidu_token' => '可选。只有需要百度主动推送时才填写。', - 'match_type' => '可选。默认 exact。普通单域名站保持默认即可;只有泛域名场景才需要改。', - 'parent_domain' => '只有 wildcard 泛域名场景才需要填根域名。普通单域名站留空即可。', - 'seed_scope' => '可选。默认 domain。普通单域名站不用改;只有特殊 host 级种子策略才改。', - 'play_type' => '可选。默认 douban。自动样本发现成功时通常也能自动带出,不需要运营关心。', - 'play_index' => '可选。默认 1。通常不用改。', - 'forge_index' => '可选。默认 1。通常不用改。', - 'rank_slug' => '可选。默认 daily。通常不用改。', + 'match_type' => "域名匹配方式,默认 exact。\n可选值说明:\n- exact:精确匹配。普通单域名站使用这个,例如 jingxifa.com。\n- wildcard:泛匹配。只有泛域名场景才用,例如 *.example.com。\n不确定就保持 exact。", + 'parent_domain' => "父域名只在 wildcard 泛域名场景下填写。\n填写规则:\n- host 是 *.example.com 时,这里填 example.com。\n- host 是普通单域名时留空。\n不要填协议、路径或 www。", + 'seed_scope' => "种子范围,默认 domain。\n可选值说明:\n- domain:按整域名范围处理,普通站点默认用这个。\n- host:按具体 host 处理,常见于泛域名、子站拆分运营场景。\n不确定就填 domain。", + 'play_type' => "播放类型。通常可留空,自动样本成功时系统会自动带出。\n常见可选值说明:\n- douban:常见默认线路,绝大多数站留空后最终也会落到它。\n- youzhi:另一种播放线路标识,只有样本明确属于这条线路时才填。\n- 其他值:必须与站内真实播放线路一致,不能凭感觉乱写。\n不确定就留空,优先让系统自动发现。", + 'play_index' => "播放序号,默认 1。\n可选值说明:\n- 1:第一条播放线路下的第一集/第一入口,最常用。\n- 2、3、4...:只有你明确知道该样本要绑定到第几集或第几个入口时才改。\n不确定就填 1 或留空。", + 'forge_index' => "锻造序号,默认 1。\n可选值说明:\n- 1:默认主锻造位,绝大多数站都用这个。\n- 其他数字:只有技术明确安排了多锻造位时才改。\n运营通常保持 1 即可。", + 'rank_slug' => "榜单 slug,默认 daily。\n可选值说明:\n- daily:日榜,最常用默认值。\n- weekly:周榜,只有明确要挂周榜时才用。\n- monthly:月榜,只有明确要挂月榜时才用。\n- 其他 slug:必须后台已有对应榜单配置,否则不要乱填。\n不确定就填 daily。", 'base_url' => '可选。默认自动按 https://域名 生成。只有特殊环境才手填。', 'bundle_name' => '可选。一般留空,系统会按域名自动生成 bundle 目录名。', 'seo_cfg_json' => '可选。高级配置区,通常给技术同学使用。运营不需要填写;只有明确要覆盖默认 SEO 策略时再填 JSON。', @@ -305,7 +305,7 @@ class DomainSupplyBatchTemplateHelper ); $displayNotes = []; foreach (self::getColumnNotes() as $field => $note) { - $displayNotes[$headerLabels[$field] ?? $field] = $note; + $displayNotes[DomainBatchImportTemplateHelper::buildNoteDisplayLabel($field)] = $note; } DomainBatchImportTemplateHelper::writeWorkbook( diff --git a/code/public/_admin_templates/domain-import/site-domain-import-template.xlsx b/code/public/_admin_templates/domain-import/site-domain-import-template.xlsx index 98ed4ce284f4ad8bf434fa1d1e87819ea4ef7a58..06fd0cccdefc77bbb1c36ccf13eafc733d6e02b3 100644 GIT binary patch delta 6215 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 diff --git a/code/public/_admin_templates/domain-supply-batch/domain-supply-batch-template.xlsx b/code/public/_admin_templates/domain-supply-batch/domain-supply-batch-template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5fc17873f376da390a3d532747cdfcc139466647 GIT binary patch literal 11011 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 E1CguJwEzGB literal 0 HcmV?d00001