diff --git a/code/app/admin/controller/Site.php b/code/app/admin/controller/Site.php index 58a453e..5dcafaf 100644 --- a/code/app/admin/controller/Site.php +++ b/code/app/admin/controller/Site.php @@ -2302,11 +2302,11 @@ class Site extends BaseController public function getDomainExternalSeoSearchConsolePropertyMapTemplate(Request $Request, ?AdminUserModel $AdminUserModel) { try { - $strOutputDir = $this->bootstrapCodeRoot() . '/public/_admin_templates/domain-seo-external/search-console'; + $strOutputDir = $this->bootstrapCodeRoot() . '/storage/external-seo/search-console'; $arrTemplate = DomainExternalSeoSearchConsoleConfigHelper::writeTemplate($strOutputDir); return $this->success([ 'file_name' => (string)($arrTemplate['file_name'] ?? ''), - 'file_path' => $this->publicRelativePath((string)($arrTemplate['file_path'] ?? '')), + 'file_path' => $this->storageRelativePath((string)($arrTemplate['file_path'] ?? '')), 'summary' => (array)($arrTemplate['summary'] ?? []), ]); } catch (\Throwable $Throwable) { @@ -2970,7 +2970,7 @@ class Site extends BaseController $arrTemplate = DomainExternalSeoManualImportHelper::writeTemplate($this->domainExternalSeoManualImportRoot()); return $this->success([ 'file_name' => (string)($arrTemplate['file_name'] ?? ''), - 'file_path' => $this->publicRelativePath((string)($arrTemplate['file_path'] ?? '')), + 'file_path' => $this->storageRelativePath((string)($arrTemplate['file_path'] ?? '')), 'summary' => $arrTemplate['summary'] ?? [], ]); } catch (\Throwable $Throwable) { @@ -3021,12 +3021,12 @@ class Site extends BaseController } return $this->success([ - 'uploaded_excel_path' => $this->publicRelativePath($strUploadedPath), - 'uploaded_report_path' => $this->publicRelativePath($strUploadedPath), - 'csv_path' => $this->publicRelativePath((string)($arrResult['csv_path'] ?? '')), - 'run_root' => $this->publicRelativePath($strRunRoot), - 'run_csv_path' => $this->publicRelativePath((string)($arrResult['run_csv_path'] ?? '')), - 'run_uploaded_report_path' => $this->publicRelativePath($strRunUploadedPath), + 'uploaded_excel_path' => $this->storageRelativePath($strUploadedPath), + 'uploaded_report_path' => $this->storageRelativePath($strUploadedPath), + 'csv_path' => $this->storageRelativePath((string)($arrResult['csv_path'] ?? '')), + 'run_root' => $this->storageRelativePath($strRunRoot), + 'run_csv_path' => $this->storageRelativePath((string)($arrResult['run_csv_path'] ?? '')), + 'run_uploaded_report_path' => $this->storageRelativePath($strRunUploadedPath), 'rows_total' => (int)($arrResult['rows_total'] ?? 0), 'imported_count' => (int)($arrResult['imported_count'] ?? 0), 'real_summary_status' => (string)($arrRealSummary['status'] ?? ''), diff --git a/code/app/admin/controller/Video.php b/code/app/admin/controller/Video.php index 9b71d15..72e0c27 100644 --- a/code/app/admin/controller/Video.php +++ b/code/app/admin/controller/Video.php @@ -152,9 +152,9 @@ class Video extends BaseController $arrSummary = VideoMetadataMissingWorkbenchHelper::writeArtifacts($this->metadataMissingWorkbenchRoot(), $arrSummary); } - $arrSummary['summary_json_path'] = $this->publicRelativePath((string)($arrSummary['summary_json_path'] ?? '')); - $arrSummary['summary_html_path'] = $this->publicRelativePath((string)($arrSummary['summary_html_path'] ?? '')); - $arrSummary['prompt_markdown_path'] = $this->publicRelativePath((string)($arrSummary['prompt_markdown_path'] ?? '')); + $arrSummary['summary_json_path'] = $this->storageRelativePath((string)($arrSummary['summary_json_path'] ?? '')); + $arrSummary['summary_html_path'] = $this->storageRelativePath((string)($arrSummary['summary_html_path'] ?? '')); + $arrSummary['prompt_markdown_path'] = $this->storageRelativePath((string)($arrSummary['prompt_markdown_path'] ?? '')); return $this->success($arrSummary); } catch (\Throwable $Throwable) { @@ -176,7 +176,7 @@ class Video extends BaseController return $this->success([ 'prompt' => (string)($arrSummary['codex_dispatch_prompt'] ?? ''), - 'prompt_markdown_path' => $this->publicRelativePath((string)($arrSummary['prompt_markdown_path'] ?? '')), + 'prompt_markdown_path' => $this->storageRelativePath((string)($arrSummary['prompt_markdown_path'] ?? '')), 'generated_at' => (string)($arrSummary['generated_at'] ?? ''), ]); } catch (\Throwable $Throwable) { @@ -214,8 +214,8 @@ class Video extends BaseController $arrSummary = VideoMetadataMissingTaskPoolHelper::writeArtifacts($this->metadataMissingTaskPoolRoot(), $arrSummary); } - $arrSummary['summary_json_path'] = $this->publicRelativePath((string)($arrSummary['summary_json_path'] ?? '')); - $arrSummary['summary_html_path'] = $this->publicRelativePath((string)($arrSummary['summary_html_path'] ?? '')); + $arrSummary['summary_json_path'] = $this->storageRelativePath((string)($arrSummary['summary_json_path'] ?? '')); + $arrSummary['summary_html_path'] = $this->storageRelativePath((string)($arrSummary['summary_html_path'] ?? '')); return $this->success($arrSummary); } catch (\Throwable $Throwable) { @@ -231,10 +231,10 @@ class Video extends BaseController $this->metadataMissingTaskPoolRoot() ); - $arrSummary['workbench']['summary_json_path'] = $this->publicRelativePath((string)($arrSummary['workbench']['summary_json_path'] ?? '')); - $arrSummary['workbench']['summary_html_path'] = $this->publicRelativePath((string)($arrSummary['workbench']['summary_html_path'] ?? '')); - $arrSummary['task_pool']['summary_json_path'] = $this->publicRelativePath((string)($arrSummary['task_pool']['summary_json_path'] ?? '')); - $arrSummary['task_pool']['summary_html_path'] = $this->publicRelativePath((string)($arrSummary['task_pool']['summary_html_path'] ?? '')); + $arrSummary['workbench']['summary_json_path'] = $this->storageRelativePath((string)($arrSummary['workbench']['summary_json_path'] ?? '')); + $arrSummary['workbench']['summary_html_path'] = $this->storageRelativePath((string)($arrSummary['workbench']['summary_html_path'] ?? '')); + $arrSummary['task_pool']['summary_json_path'] = $this->storageRelativePath((string)($arrSummary['task_pool']['summary_json_path'] ?? '')); + $arrSummary['task_pool']['summary_html_path'] = $this->storageRelativePath((string)($arrSummary['task_pool']['summary_html_path'] ?? '')); return $this->success($arrSummary); } catch (\Throwable $Throwable) { @@ -250,10 +250,10 @@ class Video extends BaseController $this->metadataMissingTaskPoolRoot() ); - $arrSummary['workbench']['summary_json_path'] = $this->publicRelativePath((string)($arrSummary['workbench']['summary_json_path'] ?? '')); - $arrSummary['workbench']['summary_html_path'] = $this->publicRelativePath((string)($arrSummary['workbench']['summary_html_path'] ?? '')); - $arrSummary['task_pool']['summary_json_path'] = $this->publicRelativePath((string)($arrSummary['task_pool']['summary_json_path'] ?? '')); - $arrSummary['task_pool']['summary_html_path'] = $this->publicRelativePath((string)($arrSummary['task_pool']['summary_html_path'] ?? '')); + $arrSummary['workbench']['summary_json_path'] = $this->storageRelativePath((string)($arrSummary['workbench']['summary_json_path'] ?? '')); + $arrSummary['workbench']['summary_html_path'] = $this->storageRelativePath((string)($arrSummary['workbench']['summary_html_path'] ?? '')); + $arrSummary['task_pool']['summary_json_path'] = $this->storageRelativePath((string)($arrSummary['task_pool']['summary_json_path'] ?? '')); + $arrSummary['task_pool']['summary_html_path'] = $this->storageRelativePath((string)($arrSummary['task_pool']['summary_html_path'] ?? '')); return $this->success([ 'summary' => $arrSummary, @@ -383,8 +383,8 @@ class Video extends BaseController $arrSummary = VideoMetadataMissingTaskPoolHelper::buildSummary($arrWorkbenchSummary, $intBatchSize, $intBatchLimit); $arrSummary = VideoMetadataMissingTaskPoolHelper::writeArtifacts($this->metadataMissingTaskPoolRoot(), $arrSummary); - $arrSummary['summary_json_path'] = $this->publicRelativePath((string)($arrSummary['summary_json_path'] ?? '')); - $arrSummary['summary_html_path'] = $this->publicRelativePath((string)($arrSummary['summary_html_path'] ?? '')); + $arrSummary['summary_json_path'] = $this->storageRelativePath((string)($arrSummary['summary_json_path'] ?? '')); + $arrSummary['summary_html_path'] = $this->storageRelativePath((string)($arrSummary['summary_html_path'] ?? '')); return $this->success([ 'status' => 'success', @@ -458,9 +458,9 @@ class Video extends BaseController $arrSummary = VideoMetadataMissingWorkbenchHelper::buildSummary($intSample, $intQueueLimit, $intPromptLimit); $arrSummary = VideoMetadataMissingWorkbenchHelper::writeArtifacts($this->metadataMissingWorkbenchRoot(), $arrSummary); - $arrSummary['summary_json_path'] = $this->publicRelativePath((string)($arrSummary['summary_json_path'] ?? '')); - $arrSummary['summary_html_path'] = $this->publicRelativePath((string)($arrSummary['summary_html_path'] ?? '')); - $arrSummary['prompt_markdown_path'] = $this->publicRelativePath((string)($arrSummary['prompt_markdown_path'] ?? '')); + $arrSummary['summary_json_path'] = $this->storageRelativePath((string)($arrSummary['summary_json_path'] ?? '')); + $arrSummary['summary_html_path'] = $this->storageRelativePath((string)($arrSummary['summary_html_path'] ?? '')); + $arrSummary['prompt_markdown_path'] = $this->storageRelativePath((string)($arrSummary['prompt_markdown_path'] ?? '')); return $this->success([ 'status' => 'success', @@ -473,7 +473,7 @@ class Video extends BaseController protected function metadataMissingWorkbenchRoot(): string { - return rtrim((string)root_path(), '/') . '/app/public/_admin_templates/video-metadata-missing-workbench'; + return rtrim((string)root_path(), '/') . '/storage/video-metadata-missing/workbench'; } protected function metadataMissingWorkbenchRunRoot(): string @@ -483,15 +483,15 @@ class Video extends BaseController protected function metadataMissingTaskPoolRoot(): string { - return rtrim((string)root_path(), '/') . '/app/public/_admin_templates/video-metadata-missing-task-pool'; + return rtrim((string)root_path(), '/') . '/storage/video-metadata-missing/task-pool'; } - protected function publicRelativePath(string $strPath): string + protected function storageRelativePath(string $strPath): string { - $strPublicRoot = rtrim(str_replace('\\', '/', rtrim((string)root_path(), '/') . '/app/public/'), '/'); + $strStorageRoot = rtrim(str_replace('\\', '/', rtrim((string)root_path(), '/') . '/storage/'), '/'); $strPath = str_replace('\\', '/', $strPath); - if ($strPath !== '' && str_starts_with($strPath, $strPublicRoot . '/')) { - return substr($strPath, strlen($strPublicRoot . '/')); + if ($strPath !== '' && str_starts_with($strPath, $strStorageRoot . '/')) { + return substr($strPath, strlen($strStorageRoot . '/')); } return $strPath; diff --git a/code/app/command/VideoMetadataMissingWorkbenchCommand.php b/code/app/command/VideoMetadataMissingWorkbenchCommand.php index 9f5222c..8d999e7 100644 --- a/code/app/command/VideoMetadataMissingWorkbenchCommand.php +++ b/code/app/command/VideoMetadataMissingWorkbenchCommand.php @@ -26,7 +26,7 @@ class VideoMetadataMissingWorkbenchCommand extends Command $intSample = max(1, min(100, (int)$input->getOption('sample'))); $intQueueLimit = max(1, min(500, (int)$input->getOption('queue-limit'))); $intPromptLimit = max(1, min(100, (int)$input->getOption('prompt-limit'))); - $strOutputRoot = rtrim((string)root_path(), '/') . '/app/public/_admin_templates/video-metadata-missing-workbench'; + $strOutputRoot = rtrim((string)root_path(), '/') . '/storage/video-metadata-missing/workbench'; $arrSummary = VideoMetadataMissingWorkbenchHelper::buildSummary($intSample, $intQueueLimit, $intPromptLimit); $arrSummary = VideoMetadataMissingWorkbenchHelper::writeArtifacts($strOutputRoot, $arrSummary); diff --git a/code/app/common/helper/DomainExternalSeoManualImportHelper.php b/code/app/common/helper/DomainExternalSeoManualImportHelper.php index efe15e7..401ee87 100644 --- a/code/app/common/helper/DomainExternalSeoManualImportHelper.php +++ b/code/app/common/helper/DomainExternalSeoManualImportHelper.php @@ -10,7 +10,7 @@ class DomainExternalSeoManualImportHelper { public static function defaultRoot(string $strCodeRoot): string { - return rtrim($strCodeRoot, '/') . '/public/_admin_templates/domain-seo-external/manual-import'; + return rtrim($strCodeRoot, '/') . '/storage/external-seo/manual-import'; } public static function getHeaders(): array diff --git a/code/app/common/helper/DomainExternalSeoManualImportRunIndexHelper.php b/code/app/common/helper/DomainExternalSeoManualImportRunIndexHelper.php index f7051a6..efe7e2a 100644 --- a/code/app/common/helper/DomainExternalSeoManualImportRunIndexHelper.php +++ b/code/app/common/helper/DomainExternalSeoManualImportRunIndexHelper.php @@ -6,12 +6,12 @@ namespace app\common\helper; class DomainExternalSeoManualImportRunIndexHelper { - protected static function publicRelativePath(string $strPath): string + protected static function storageRelativePath(string $strPath): string { - $strPublicRoot = str_replace('\\', '/', rtrim(dirname(__DIR__, 3) . '/public', '/')); + $strStorageRoot = str_replace('\\', '/', rtrim(dirname(__DIR__, 3) . '/storage', '/')); $strPath = str_replace('\\', '/', $strPath); - if (str_starts_with($strPath, $strPublicRoot . '/')) { - return substr($strPath, strlen($strPublicRoot . '/')); + if (str_starts_with($strPath, $strStorageRoot . '/')) { + return substr($strPath, strlen($strStorageRoot . '/')); } return $strPath; @@ -47,16 +47,16 @@ class DomainExternalSeoManualImportRunIndexHelper $arrItems[] = [ 'run_id' => basename($strRunRoot), - 'run_root_public' => self::publicRelativePath($strRunRoot), + 'run_root_public' => self::storageRelativePath($strRunRoot), 'status' => (string)($arrSummary['status'] ?? 'empty'), 'provider_key' => (string)($arrSummary['provider_key'] ?? 'manual_csv_import'), 'rows_total' => self::countCsvRows($strCsvPath), 'hosts_count' => self::countCsvHosts($strCsvPath), 'metrics' => (array)($arrSummary['metrics'] ?? []), - 'uploaded_report_path' => $strUploadedPath !== '' ? self::publicRelativePath($strUploadedPath) : '', - 'csv_path' => is_file($strCsvPath) ? self::publicRelativePath($strCsvPath) : '', - 'summary_json_path' => self::publicRelativePath($strSummaryPath), - 'summary_html_path' => is_file($strRunRoot . '/seo-external-real.summary.html') ? self::publicRelativePath($strRunRoot . '/seo-external-real.summary.html') : '', + 'uploaded_report_path' => $strUploadedPath !== '' ? self::storageRelativePath($strUploadedPath) : '', + 'csv_path' => is_file($strCsvPath) ? self::storageRelativePath($strCsvPath) : '', + 'summary_json_path' => self::storageRelativePath($strSummaryPath), + 'summary_html_path' => is_file($strRunRoot . '/seo-external-real.summary.html') ? self::storageRelativePath($strRunRoot . '/seo-external-real.summary.html') : '', 'updated_at' => date(DATE_ATOM, (int)(filemtime($strSummaryPath) ?: time())), ]; } @@ -69,16 +69,16 @@ class DomainExternalSeoManualImportRunIndexHelper $arrSummary = is_array($arrDecoded) ? $arrDecoded : []; array_unshift($arrItems, [ 'run_id' => 'latest_manual_import', - 'run_root_public' => self::publicRelativePath($strLatestDir), + 'run_root_public' => self::storageRelativePath($strLatestDir), 'status' => (string)($arrSummary['status'] ?? 'empty'), 'provider_key' => (string)($arrSummary['provider_key'] ?? 'manual_csv_import'), 'rows_total' => self::countCsvRows($strLatestDir . '/manual-seo-import.csv'), 'hosts_count' => self::countCsvHosts($strLatestDir . '/manual-seo-import.csv'), 'metrics' => (array)($arrSummary['metrics'] ?? []), 'uploaded_report_path' => '', - 'csv_path' => self::publicRelativePath($strLatestDir . '/manual-seo-import.csv'), - 'summary_json_path' => self::publicRelativePath($strLatestSummaryJsonPath), - 'summary_html_path' => self::publicRelativePath(dirname($strRoot) . '/latest/seo-external-real.summary.html'), + 'csv_path' => self::storageRelativePath($strLatestDir . '/manual-seo-import.csv'), + 'summary_json_path' => self::storageRelativePath($strLatestSummaryJsonPath), + 'summary_html_path' => self::storageRelativePath(dirname($strRoot) . '/latest/seo-external-real.summary.html'), 'updated_at' => date(DATE_ATOM, (int)(filemtime($strLatestSummaryJsonPath) ?: time())), ]); } diff --git a/code/app/common/helper/VideoMetadataMissingRefreshHelper.php b/code/app/common/helper/VideoMetadataMissingRefreshHelper.php index 8f2734a..552d4eb 100644 --- a/code/app/common/helper/VideoMetadataMissingRefreshHelper.php +++ b/code/app/common/helper/VideoMetadataMissingRefreshHelper.php @@ -14,9 +14,9 @@ class VideoMetadataMissingRefreshHelper $intBatchSize = max(5, min(100, (int)($arrOptions['batch_size'] ?? 20))); $intBatchLimit = max(1, min(50, (int)($arrOptions['batch_limit'] ?? 10))); - $strPublicRoot = rtrim((string)root_path(), '/') . '/app/public'; - $strWorkbenchRoot = $strPublicRoot . '/_admin_templates/video-metadata-missing-workbench'; - $strTaskPoolRoot = $strPublicRoot . '/_admin_templates/video-metadata-missing-task-pool'; + $strStorageRoot = rtrim((string)root_path(), '/') . '/storage/video-metadata-missing'; + $strWorkbenchRoot = $strStorageRoot . '/workbench'; + $strTaskPoolRoot = $strStorageRoot . '/task-pool'; $arrWorkbenchSummary = VideoMetadataMissingWorkbenchHelper::buildSummary( $intSample, diff --git a/code/app/common/helper/VideoMetadataMissingTaskPoolHelper.php b/code/app/common/helper/VideoMetadataMissingTaskPoolHelper.php index dd0a297..e1d8f27 100644 --- a/code/app/common/helper/VideoMetadataMissingTaskPoolHelper.php +++ b/code/app/common/helper/VideoMetadataMissingTaskPoolHelper.php @@ -413,11 +413,11 @@ class VideoMetadataMissingTaskPoolHelper ); self::writeFile($strPromptPath, (string)($arrBatch['codex_prompt'] ?? '')); - $arrSummary['batches'][$intIndex]['detail_json_path'] = self::publicRelativePath($strDetailPath); - $arrSummary['batches'][$intIndex]['prompt_markdown_path'] = self::publicRelativePath($strPromptPath); + $arrSummary['batches'][$intIndex]['detail_json_path'] = self::storageRelativePath($strDetailPath); + $arrSummary['batches'][$intIndex]['prompt_markdown_path'] = self::storageRelativePath($strPromptPath); $arrSummary['batches'][$intIndex]['history_json_path'] = is_file($strHistoryPath) - ? self::publicRelativePath($strHistoryPath) - : self::publicRelativePath($strHistoryPath); + ? self::storageRelativePath($strHistoryPath) + : self::storageRelativePath($strHistoryPath); } return $arrSummary; @@ -437,12 +437,12 @@ class VideoMetadataMissingTaskPoolHelper return 'video-metadata-missing-task-pool-' . date('Ymd-His'); } - protected static function publicRelativePath(string $strPath): string + protected static function storageRelativePath(string $strPath): string { - $strPublicRoot = str_replace('\\', '/', rtrim(dirname(__DIR__, 2) . '/public', '/')); + $strStorageRoot = str_replace('\\', '/', rtrim(dirname(__DIR__, 3) . '/storage', '/')); $strPath = str_replace('\\', '/', $strPath); - if (str_starts_with($strPath, $strPublicRoot . '/')) { - return substr($strPath, strlen($strPublicRoot . '/')); + if (str_starts_with($strPath, $strStorageRoot . '/')) { + return substr($strPath, strlen($strStorageRoot . '/')); } return $strPath; diff --git a/code/app/common/helper/VideoMetadataMissingWorkbenchIndexHelper.php b/code/app/common/helper/VideoMetadataMissingWorkbenchIndexHelper.php index 1c1c913..c36f7d9 100644 --- a/code/app/common/helper/VideoMetadataMissingWorkbenchIndexHelper.php +++ b/code/app/common/helper/VideoMetadataMissingWorkbenchIndexHelper.php @@ -53,9 +53,9 @@ class VideoMetadataMissingWorkbenchIndexHelper 'top_field_missing_count' => (int)(($arrTopFields[0] ?? [])['missing_count'] ?? 0), 'health_label' => $strHealthLabel, 'health_reason' => $strHealthReason, - 'summary_json_path' => self::publicRelativePath($strSummaryPath), - 'summary_html_path' => self::publicRelativePath($strRunDir . '/video-metadata-missing-workbench.summary.html'), - 'prompt_markdown_path' => self::publicRelativePath($strRunDir . '/prompt.md'), + 'summary_json_path' => self::storageRelativePath($strSummaryPath), + 'summary_html_path' => self::storageRelativePath($strRunDir . '/video-metadata-missing-workbench.summary.html'), + 'prompt_markdown_path' => self::storageRelativePath($strRunDir . '/prompt.md'), ]; } @@ -86,12 +86,12 @@ class VideoMetadataMissingWorkbenchIndexHelper return ['steady', '当前缺字段问题相对可控,适合按优先队列持续收敛。']; } - protected static function publicRelativePath(string $strPath): string + protected static function storageRelativePath(string $strPath): string { - $strPublicRoot = str_replace('\\', '/', rtrim(dirname(__DIR__, 2) . '/public', '/')); + $strStorageRoot = str_replace('\\', '/', rtrim(dirname(__DIR__, 3) . '/storage', '/')); $strPath = str_replace('\\', '/', $strPath); - if (str_starts_with($strPath, $strPublicRoot . '/')) { - return substr($strPath, strlen($strPublicRoot . '/')); + if (str_starts_with($strPath, $strStorageRoot . '/')) { + return substr($strPath, strlen($strStorageRoot . '/')); } return $strPath; diff --git a/docs/2026-04-18-PHP与Vue收口交付总结.md b/docs/2026-04-18-PHP与Vue收口交付总结.md index 47c7907..d14ccf2 100644 --- a/docs/2026-04-18-PHP与Vue收口交付总结.md +++ b/docs/2026-04-18-PHP与Vue收口交付总结.md @@ -50,6 +50,46 @@ - sitemap 入队 - starter published copy +### 2.1 运行产物存储口径补充 + +从 `2026-04-19` 开始,新增一条更严格的后端存储口径: + +1. 后台运行产物 +2. 工作台快照 +3. 任务池快照 +4. 手工导入中间文件 +5. Search Console 模板 +6. 站外 SEO latest / snapshot 摘要 + +以上这类数据,统一视为: + +- 私有数据 +- 运行时数据 +- 不应默认纳入 Git 的数据 + +所以默认都应落在: + +- `code/storage/...` + +而不是: + +- `code/public/...` +- `code/app/public/...` + +当前已完成的收口包括: + +1. `domain-seo-external latest / snapshot / snapshot-validate` 已迁到 `storage/external-seo/...` +2. `video-metadata-missing-workbench` 已迁到 `storage/video-metadata-missing/workbench` +3. `video-metadata-missing-task-pool` 已迁到 `storage/video-metadata-missing/task-pool` +4. `domain-seo-external/manual-import` 已迁到 `storage/external-seo/manual-import` +5. `domain-seo-external/search-console` 模板目录已迁到 `storage/external-seo/search-console` + +以后如果再新增类似后台产物目录,优先原则是: + +1. 先想能不能放 `storage` +2. 默认不要放 `public` +3. 只有明确需要前台公开访问的静态资源,才考虑进入 `public` + ### 3. 公共规则侧 已确立为全项目公共主线的内容: diff --git a/docs/README.md b/docs/README.md index 63e3a7f..62bb076 100644 --- a/docs/README.md +++ b/docs/README.md @@ -56,6 +56,7 @@ 2. 需要分清哪些是 `SEONexus`、哪些是 `SEONexusAdmin` 3. 需要确认后台真实页面入口现在在 Vue,而不是 PHP 直出页 4. 需要同步今天补上的 `Spider MD 异步任务消费器`、`GitHub 推送`、`主表一键复制MD` 这些后台能力 +5. 需要同步“所有后台运行产物、工作台快照、手工导入中间文件默认落 `storage`,不要再放 `public`”这条新口径 ### 1.3 AI文案与视频元数据公共规则