From 95982fad232357258b2bd01e210d206a761ec685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B5=85=E5=BF=B5?= Date: Mon, 26 Oct 2026 11:18:45 +0800 Subject: [PATCH] upgrade: adopt V8.32.0-dev.1 (theme preview iframe fix, editor simple mode) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Overlay 46 upstream items; full patch set re-applied (all patched files reset by overlay regardless of upstream change status — lesson recorded). Verified: theme suites 35/35; dual-baseline 418 passed vs pristine 389+29 ours, FAILED-set diff EMPTY (same 10 Windows env fails). Live: container 8.32.0-dev.1 healthy, hesupipe 192 entries intact, trade-pro build 203 pages 0 errors. Co-Authored-By: Claude Code --- .updiff.txt | 200 ------------------ README.md | 6 + README_V8_32.md | 55 +++++ app/core.py | 1 - app/main.py | 8 +- app/static/editor.css | 15 ++ app/static/editor.js | 38 +++- app/static/workspace.js | 2 +- app/templates/editor.html | 10 +- app/templates/theme-gallery.html | 47 ++++- app/theme_pro.py | 6 +- app/version.py | 2 +- compose.enterprise.yaml | 4 +- reports/v8311-regression/result.json | 204 +++++++++++++++++++ reports/v832/V8_32_主题预览与编辑器验收.html | 1 + reports/v832/V8_32_验收数据.json | 29 +++ reports/v832/editor-desktop.png | Bin 0 -> 307994 bytes reports/v832/editor-mobile.png | Bin 0 -> 107878 bytes reports/v832/full-regression.exit | 1 + reports/v832/isolated-regression.exit | 1 + scripts/browser_v832_editor.py | 81 ++++++++ scripts/browser_v832_gallery.py | 32 +++ scripts/verify_release.py | 2 +- tests/test_theme_pro_v3.py | 2 +- tests/test_v832_preview_easy_editor.py | 46 +++++ 25 files changed, 561 insertions(+), 232 deletions(-) delete mode 100644 .updiff.txt create mode 100644 README_V8_32.md create mode 100644 reports/v8311-regression/result.json create mode 100644 reports/v832/V8_32_主题预览与编辑器验收.html create mode 100644 reports/v832/V8_32_验收数据.json create mode 100644 reports/v832/editor-desktop.png create mode 100644 reports/v832/editor-mobile.png create mode 100644 reports/v832/full-regression.exit create mode 100644 reports/v832/isolated-regression.exit create mode 100644 scripts/browser_v832_editor.py create mode 100644 scripts/browser_v832_gallery.py create mode 100644 tests/test_v832_preview_easy_editor.py diff --git a/.updiff.txt b/.updiff.txt deleted file mode 100644 index 196cf35..0000000 --- a/.updiff.txt +++ /dev/null @@ -1,200 +0,0 @@ -Files ./.github/workflows/ci.yml and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/.github/workflows/ci.yml differ -Files ./.gitignore and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/.gitignore differ -Files ./README.md and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/README.md differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1: README_V8_26.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1: README_V8_28.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1: README_V8_29.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1: README_V8_30.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1: README_V8_31.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1: README_V8_31_1.md -Only in .: SHA256SUMS.txt -Files ./app/blueprints.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/blueprints.py differ -Files ./app/builder.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/builder.py differ -Files ./app/core.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/core.py differ -Files ./app/factory_api.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/factory_api.py differ -Files ./app/main.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/main.py differ -Files ./app/multilingual.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/multilingual.py differ -Files ./app/reusables.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/reusables.py differ -Files ./app/site_design_v87.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/site_design_v87.py differ -Files ./app/static/admin.js and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static/admin.js differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static: auto31.js -Files ./app/static/editor-helpers.js and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static/editor-helpers.js differ -Files ./app/static/editor.css and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static/editor.css differ -Files ./app/static/editor.js and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static/editor.js differ -Files ./app/static/factory-v2.js and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static/factory-v2.js differ -Files ./app/static/pro.js and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static/pro.js differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static: studio-canvas-bridge.js -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static: studio-experience-v829.js -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static: workspace-guide.js -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static: workspace-launch.js -Files ./app/static/workspace.css and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static/workspace.css differ -Files ./app/static/workspace.js and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/static/workspace.js differ -Files ./app/templates/admin.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/templates/admin.html differ -Files ./app/templates/editor.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/templates/editor.html differ -Files ./app/templates/theme-gallery.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/templates/theme-gallery.html differ -Files ./app/templates/workspace.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/templates/workspace.html differ -Files ./app/theme_pro.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/theme_pro.py differ -Files ./app/theme_store.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/theme_store.py differ -Files ./app/v8_workflows.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/v8_workflows.py differ -Files ./app/version.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/app/version.py differ -Files ./compose.enterprise.yaml and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/compose.enterprise.yaml differ -Files ./compose.yaml and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/compose.yaml differ -Only in ./docs: COMPLETION_PLAN.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/docs: V8_22_ADVANCED_VISUAL_STUDIO.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/docs: V8_23_ADVANCED_STUDIO.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/docs: V8_24_DEEP_NESTED_STUDIO.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/docs: V8_25_SHARED_DESIGN_SYSTEM.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/docs: V8_26_GLOBAL_DESIGN.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/docs: V8_27_USER_FRIENDLY_WORKSPACE.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/docs: V8_28_GUIDED_LAUNCH_CENTER.md -Only in ./docs: superpowers -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: Studio_V8_22_画布级可视化编辑器_交互演示.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: Studio_V8_23_嵌套组件编辑器_可交互预览.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: Studio_V8_24_深层嵌套可视化编辑器_交互演示.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: V8_25_公共组件_版本与同步演示.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: V8_26_全站设计与导航_交互预览.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: V8_27_新手友好建站工作台_交互演示.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: V8_28_简洁上线操作中心_交互演示.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: V8_29_主题与可视化编辑_离线操作演示.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: V8_30_四套主题_真实页面交互预览.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: V8_31_1_汽车主题性能与语义化图标_离线演示.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: V8_31_汽车主题_完整页面交互预览.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/examples: v830-built-sites -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: V8_22_验收报告.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: V8_22_验收报告.json -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: V8_22_验收报告.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: V8_23_集成验收.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: V8_25_summary.json -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: V8_25_验收报告.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: V8_25_验收报告.md -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: V8_30_mobile_browser_audit.json -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: V8_30_主题设计与兼容验收.html -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: V8_31_汽车主题验收报告.html -Only in ./reports: mobile-v8213-browser-console.log -Only in ./reports: v8213-final-regression_logs -Only in ./reports: v8213-regression_logs -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v823-regression -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v824-regression -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v825-regression -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v826 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v826-regression -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v827 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v828 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v829 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v829-browser -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v829-regression -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v830-regression -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v831 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v8311 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v8311-regression -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v8311-regression-part1.log -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/reports: v8311_regression_run.log -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: browser_guide_v827.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: browser_launch_v828.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: browser_studio_v829.py -Files ./scripts/check.ps1 and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts/check.ps1 differ -Files ./scripts/check.sh and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts/check.sh differ -Files ./scripts/init_config.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts/init_config.py differ -Files ./scripts/install_into_art_design_pro.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts/install_into_art_design_pro.py differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: make_theme_demo_v830.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: make_theme_demo_v8311.py -Files ./scripts/regression_v821.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts/regression_v821.py differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: regression_v823.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: regression_v824.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: regression_v825.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: regression_v826.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: regression_v827.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: regression_v828.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: regression_v829.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: regression_v830.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: regression_v8311.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: report_v825.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: report_v828.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: studio_canvas_isolated_browser_v822.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: studio_canvas_smoke_v822.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: studio_nested_browser_v823.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts: studio_nested_browser_v824.py -Files ./scripts/verify_art_design_pro_v819.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts/verify_art_design_pro_v819.py differ -Files ./scripts/verify_release.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/scripts/verify_release.py differ -Files ./tests/test_core_v4.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests/test_core_v4.py differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_deep_nested_v824.py -Files ./tests/test_editor_easy_v8212.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests/test_editor_easy_v8212.py differ -Files ./tests/test_factory_v2.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests/test_factory_v2.py differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_nested_helpers_v823.cjs -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_nested_v823.py -Files ./tests/test_theme_pro_v3.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests/test_theme_pro_v3.py differ -Only in ./tests: test_theme_registry.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_v822_canvas.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_v825_shared_components.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_v826_global_design.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_v827_guided_workspace.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_v828_launch_center.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_v829_theme_studio.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_v830_real_pages.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_v8311_performance_icons.py -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests: test_v831_automotive_ref.py -Files ./tests/test_workspace_v810.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests/test_workspace_v810.py differ -Files ./tests/test_workspace_v812.py and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests/test_workspace_v812.py differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests_js: deep_nested_v824.test.cjs -Files ./tests_js/editor_ux.test.cjs and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests_js/editor_ux.test.cjs differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests_js: studio-experience-v829.test.cjs -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests_js: workspace_guide_v827.test.cjs -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/tests_js: workspace_launch_v828.test.cjs -Files ./themes/_professional_components.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/_professional_components.html differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive: auto-icons.svg -Files ./themes/automotive/manifest.json and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/manifest.json differ -Files ./themes/automotive/pages/about.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/about.html differ -Files ./themes/automotive/pages/article.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/article.html differ -Files ./themes/automotive/pages/brand.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/brand.html differ -Files ./themes/automotive/pages/case.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/case.html differ -Files ./themes/automotive/pages/category.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/category.html differ -Files ./themes/automotive/pages/contact.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/contact.html differ -Files ./themes/automotive/pages/faq.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/faq.html differ -Files ./themes/automotive/pages/home.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/home.html differ -Files ./themes/automotive/pages/listing.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/listing.html differ -Files ./themes/automotive/pages/notfound.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/notfound.html differ -Files ./themes/automotive/pages/product.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/product.html differ -Files ./themes/automotive/pages/service.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/service.html differ -Files ./themes/automotive/pages/standard.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pages/standard.html differ -Files ./themes/automotive/pro.css and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pro.css differ -Files ./themes/automotive/pro.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/pro.html differ -Files ./themes/automotive/theme.css and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/theme.css differ -Files ./themes/automotive/versions/1.0.0/pro.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/versions/1.0.0/pro.html differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/versions: 1.1.0 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/versions: 1.2.0 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/versions: 1.3.0 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/automotive/versions: 1.4.0 -Files ./themes/corporate/manifest.json and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/corporate/manifest.json differ -Files ./themes/corporate/pages/about.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/corporate/pages/about.html differ -Files ./themes/corporate/pages/article.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/corporate/pages/article.html differ -Files ./themes/corporate/pages/contact.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/corporate/pages/contact.html differ -Files ./themes/corporate/pages/home.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/corporate/pages/home.html differ -Files ./themes/corporate/pages/listing.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/corporate/pages/listing.html differ -Files ./themes/corporate/pages/product.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/corporate/pages/product.html differ -Files ./themes/corporate/pro.css and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/corporate/pro.css differ -Files ./themes/corporate/theme.css and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/corporate/theme.css differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/corporate/versions: 1.1.0 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/corporate/versions: 1.2.0 -Files ./themes/industrial/manifest.json and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/industrial/manifest.json differ -Files ./themes/industrial/pages/about.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/industrial/pages/about.html differ -Files ./themes/industrial/pages/article.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/industrial/pages/article.html differ -Files ./themes/industrial/pages/contact.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/industrial/pages/contact.html differ -Files ./themes/industrial/pages/home.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/industrial/pages/home.html differ -Files ./themes/industrial/pages/listing.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/industrial/pages/listing.html differ -Files ./themes/industrial/pages/product.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/industrial/pages/product.html differ -Files ./themes/industrial/pro.css and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/industrial/pro.css differ -Files ./themes/industrial/theme.css and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/industrial/theme.css differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/industrial/versions: 1.1.0 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/industrial/versions: 1.2.0 -Files ./themes/minimal/manifest.json and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/minimal/manifest.json differ -Files ./themes/minimal/pages/about.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/minimal/pages/about.html differ -Files ./themes/minimal/pages/article.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/minimal/pages/article.html differ -Files ./themes/minimal/pages/contact.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/minimal/pages/contact.html differ -Files ./themes/minimal/pages/home.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/minimal/pages/home.html differ -Files ./themes/minimal/pages/listing.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/minimal/pages/listing.html differ -Files ./themes/minimal/pages/product.html and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/minimal/pages/product.html differ -Files ./themes/minimal/pro.css and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/minimal/pro.css differ -Files ./themes/minimal/theme.css and C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/minimal/theme.css differ -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/minimal/versions: 1.1.0 -Only in C:/Users/30997/Downloads/SiteForge_Factory_V5_Web_Docker/SiteForge_Enterprise_V8_31_1/themes/minimal/versions: 1.2.0 -Only in ./themes: trade-pro diff --git a/README.md b/README.md index bf3cd56..c5062c0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,9 @@ +# SiteForge Enterprise V8.32.0-dev.1 + +本轮修复后台主题预览空白、改进主题图库失败提示,并将可视化编辑器调整为**默认简洁模式**。完整变更、验证与限制见 [README_V8_32.md](README_V8_32.md) 和 [验收报告](reports/v832/V8_32_主题预览与编辑器验收.html)。 + +--- + # SiteForge Enterprise V8.31.0-dev.1 本轮汽车主题按 [Magic Bridge Auto](https://magicbridgeauto.com/) 的导航及选车体验进行行业化重设计,完整说明见 [`README_V8_31.md`](README_V8_31.md)。保留汽车旧主题快照及其他三套主题。 diff --git a/README_V8_32.md b/README_V8_32.md new file mode 100644 index 0000000..b1f7220 --- /dev/null +++ b/README_V8_32.md @@ -0,0 +1,55 @@ +# SiteForge Enterprise V8.32.0-dev.1 + +## 本版定位 + +在 V8.31.1 **完整源码**基础上,修复后台主题预览空白,并让页面编辑器对非技术使用者更加直观。保留四套主题、历史版本、公共组件、迁移、SEO、审批、Worker 构建等既有功能。 + +### 一、主题预览故障与修复 + +**根因:** 后端此前对所有非编辑器页面统一返回 `X-Frame-Options: DENY`,但主题图库和编辑器弹窗使用 iframe 展示 `/api/factory/themes//preview`。接口即使返回 HTTP 200,浏览器仍可能拒绝展示。 + +**修复机制:** + +- 只对匹配 `^/api/factory/themes/[A-Za-z0-9_-]+/preview$` 的只读预览页面返回 `X-Frame-Options: SAMEORIGIN`,并限定 `Content-Security-Policy: frame-ancestors 'self'`。其他后台页面仍保留 `DENY`。 +- 编辑器弹窗采用接口响应的 `srcdoc` 展示:iframe 继续使用 `sandbox="allow-scripts"`,**不允许 `allow-same-origin`**,所以主题脚本无法读取编辑器页面的 DOM 或会话;同时减少重复获取完整 HTML。 +- 主题图库按主题和页面加载,并先检查 HTTP 状态;失败时显示错误码、重试按钮及“单独打开预览”。提供每张主题卡片直达其预览的入口 `?theme=automotive` 等。 +- 展示预览不改变主题版本锁定,也不保存、发布网站。 + +### 二、可视化编辑器易用性 + +- 默认仅显示 **内容** 属性;复杂的样式与平板/手机设置通过“**更多设计设置**”展开,随时可收回。 +- 顶部动态提示当前最应该做的动作:选区块、添加内容、编辑区块或保存草稿。 +- 图片型组件在内容编辑区直接支持“**从图片素材库选择**”与“**上传新图片**”,包含内层已选中的图片组件。 +- 小屏增加“关闭”编辑面板按钮,并验证 390px 下可操作且无横向溢出。 +- 维持保存草稿与发布设计的区别:**保存/发布设计不会直接部署线上站点**,上线仍需构建和部署。 + +### 三、普通使用者操作指南 + +1. 登录后台,进入网站工作台的 **外观与设计**,在主题卡片点击 **预览页面效果**。亦可访问 `/theme-gallery`。 +2. 选择主题、页面类型、电脑/平板/手机进行比较。需要看交互功能时在完整图库中操作。 +3. 确定后回到工作台选择 **使用此主题**。预览本身**不会应用主题**。 +4. 进入 **编辑页面**;点击中间画布或左侧区块,在右侧改文字与图片。 +5. 更多排版参数点击 **更多设计设置**;完成后点击 **保存草稿**,核对后再 **发布设计**。 +6. 之后到构建/交付中心构建静态网站,完成审批及正式部署。 + +### 四、验证与已知限制 + +- 400 项 Python 测试:18 个独立隔离批次覆盖全部 53 个模块;批次 15 初次因新增按钮文案断言未同步而失败,修正后 17 项重新通过;原始日志保留。 +- 39 项历史 JavaScript 测试通过;全静态脚本 `node --check` 及版本检查通过。 +- HTTP + Worker 路径:登录/CSRF → 创建站点和页面 → Worker 构建 → ZIP 下载 → 预览,通过。 +- Chromium 隔离交互:简洁/高级切换、主题弹窗成功/失败、390px 小屏、面板关闭和主题图库错误重试,通过,JS 错误 0。 +- **不能宣称生产上线验收完成:** 当前 Chromium 运行环境无法直接访问本地 HTTP 后台地址(策略拦截),浏览器测试使用真实页面脚本配模拟接口。正式生产环境还需验证登录态、反向代理安全响应头、Art Design Pro 官方工程编译、真实 PostgreSQL/Redis 与发布回滚。 + +### 五、验收命令 + +```bash +python -m pytest -q tests/test_v832_preview_easy_editor.py +python -m pytest -q tests/test_theme_pro_v3.py tests/test_professional_ui_v811.py +node --test tests_js/*.test.cjs +python scripts/http_end_to_end.py +python scripts/browser_v832_editor.py +python scripts/browser_v832_gallery.py +python scripts/verify_release.py +``` + +验收记录、截图、单批次复测及安全说明位于 `reports/v832/`。 diff --git a/app/core.py b/app/core.py index ff65c02..6c0f1b2 100644 --- a/app/core.py +++ b/app/core.py @@ -18,7 +18,6 @@ def discover_themes(): raise RuntimeError(f'themes directory missing: {themes_dir}') found = [] for entry in sorted(themes_dir.iterdir()): - # Underscore prefix marks non-theme assets (e.g. _professional_components.html). if not entry.is_dir() or entry.name.startswith('_'): continue try: diff --git a/app/main.py b/app/main.py index 6bf2907..7a031d0 100644 --- a/app/main.py +++ b/app/main.py @@ -133,7 +133,13 @@ async def require_login(request:Request, call_next): data=_json.loads(raw) response=JSONResponse([x for x in data if x['id'] in ids]) response.headers['X-Content-Type-Options']='nosniff' - response.headers['X-Frame-Options']='SAMEORIGIN' if path.startswith('/editor/') else 'DENY' + # Only read-only theme previews (and the existing editor) may be framed by this origin. + # All other application pages stay protected from clickjacking. + is_theme_preview=bool(__import__('re').fullmatch(r'/api/factory/themes/[A-Za-z0-9_-]+/preview',path)) + response.headers['X-Frame-Options']='SAMEORIGIN' if (path.startswith('/editor/') or is_theme_preview) else 'DENY' + if is_theme_preview: + response.headers['Content-Security-Policy']="frame-ancestors 'self'" + response.headers['Cache-Control']='no-store' response.headers['Referrer-Policy']='strict-origin-when-cross-origin' response.headers['Cache-Control']='no-store' if path.startswith('/api/auth/') else response.headers.get('Cache-Control','no-cache') return response diff --git a/app/static/editor.css b/app/static/editor.css index 047c1cd..5b72af8 100644 --- a/app/static/editor.css +++ b/app/static/editor.css @@ -156,3 +156,18 @@ iframe{min-height:590px;height:calc(100vh - 224px)} .studio-body .left-pane,.studio-body .right-pane{top:140px!important} .studio-actions-menu{right:0;max-width:calc(100vw - 18px)} } + +/* V8.32: first-use focused studio without removing advanced capabilities. */ +.sf-next-action{margin-left:auto;font-size:12px;color:#30516b;font-weight:650;background:#eef4f8;padding:6px 10px;border-radius:7px;white-space:normal} +.sf-inspector-mode{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:9px 14px 12px;border-bottom:1px solid #eef1f4;color:#66798a;font-size:11px} +.sf-inspector-mode button{background:#f5f8fb;border:1px solid #dce5ee;border-radius:7px;padding:8px 10px;color:#285276;font-weight:700;cursor:pointer;font-size:11px} +body:not(.sf-advanced-mode) #tabStyle,body:not(.sf-advanced-mode) #tabResponsive{display:none!important} +.sf-photo-action{border:1px solid #dbe9f5;background:#f6fafd;border-radius:10px;display:grid;gap:7px;padding:12px;margin:14px 0} +.sf-photo-action button{width:100%;justify-content:center} +.sf-photo-action small{font-size:11px;color:#64778b;line-height:1.5} +.sf-close-inspector{display:none;background:white;border:1px solid #d8e1ea;border-radius:8px;padding:7px 10px;color:#385872;cursor:pointer;font-size:11px} +.sf-steps{justify-content:flex-start}.sf-steps .sf-guide-link{margin-left:0} +@media(max-width:1060px){.sf-close-inspector{display:inline-flex}.sf-next-action{display:none}} +@media(max-width:720px){.sf-steps .sf-guide-link{margin-left:auto}.sf-inspector-mode{padding:8px 11px}} + +.sf-photo-action strong{font-size:13px;color:#28516e}.sf-direct-upload{display:grid;gap:7px;color:#506b82;font-size:12px;font-weight:650}.sf-direct-upload input{font-size:11px;width:100%;max-width:100%} diff --git a/app/static/editor.js b/app/static/editor.js index 723ce5d..559ae99 100644 --- a/app/static/editor.js +++ b/app/static/editor.js @@ -13,6 +13,7 @@ let libraryOpen=false; let sharedPreview=null; let siteNavDraft=[],siteDesignReviewToken=null; let selectedChildId=null; +let advancedMode=false,themePreviewSeq=0,themePreviewAbort=null; let inspectorTab='content',paletteSearch='',blockSearch='',previewRequest=0,previewController=null,savePromise=null,lastContinuousEdit=0,insertAfterId=null; let snapshots=[],snapshotCursor=-1,draggedChild=null,draftRevision=0,siteDesign=null,siteDesignRevision=0,siteDesignPreview=null; @@ -284,24 +285,40 @@ const Studio={ filterPalette(value){paletteSearch=String(value||'').slice(0,70);Studio.renderPalette()}, clearPaletteSearch(){paletteSearch='';const inp=$('#paletteSearch');if(inp){inp.value='';inp.focus()}Studio.renderPalette()}, showThemePreview(){const dialog=$('#themePreviewModal');if(!dialog)return;const current=['automotive','industrial','corporate','minimal'].includes(site?.theme)?site.theme:'corporate';$('#themePreviewTheme').value=current;if(!dialog.open)dialog.showModal();Studio.themeDevice('desktop');Studio.updateThemePreview()}, - closeThemePreview(){const dialog=$('#themePreviewModal');if(dialog?.open)dialog.close();const frame=$('#themePreviewFrame');if(frame)frame.removeAttribute('src')}, + closeThemePreview(){themePreviewSeq++;themePreviewAbort?.abort();const dialog=$('#themePreviewModal');if(dialog?.open)dialog.close();const frame=$('#themePreviewFrame');if(frame){frame.removeAttribute('src');frame.removeAttribute('srcdoc')}}, themeDevice(device){ const width={desktop:'100%',tablet:'780px',phone:'390px'}[device];if(!width)return; $('#themePreviewFrameShell').style.width=width; document.querySelectorAll('[data-theme-device]').forEach(btn=>btn.setAttribute('aria-pressed',String(btn.dataset.themeDevice===device))); }, - updateThemePreview(){ + async updateThemePreview(){ const theme=$('#themePreviewTheme')?.value,page=$('#themePreviewPage')?.value; const url=window.SiteForgeStudioExperience.previewUrl(theme,page); if(!url)return; - const frame=$('#themePreviewFrame'),status=$('#themePreviewStatus');if(!frame)return; - status.textContent='正在加载主题示例…(不影响已保存的页面)'; - frame.onload=()=>{if($('#themePreviewModal')?.open)status.textContent='已加载示例。可切换主题、页面类型和设备继续比较。'}; - frame.onerror=()=>{status.textContent='示例加载失败,请稍后重试。'}; - frame.src=url; + const frame=$('#themePreviewFrame'),status=$('#themePreviewStatus'),retry=$('#themePreviewRetry');if(!frame)return; + const seq=++themePreviewSeq; + themePreviewAbort?.abort();themePreviewAbort=new AbortController(); + status.textContent='正在检查主题预览…';retry.hidden=true;frame.removeAttribute('src');frame.removeAttribute('srcdoc'); + try{ + const response=await fetch(url,{credentials:'same-origin',signal:themePreviewAbort.signal,cache:'no-store'}); + if(!response.ok||!(response.headers.get('content-type')||'').includes('text/html'))throw Error(response.status===401?'登录已过期':`服务返回 ${response.status}`); + const content=await response.text(); + if(seq!==themePreviewSeq||!$('#themePreviewModal')?.open)return; + // srcdoc keeps the preview in an opaque sandboxed origin: no allow-same-origin, + // no repeated HTML request, no frame-header conflict, and no access to editor data. + const base=new URL(url,['http:','https:'].includes(location.protocol)?location.href:'https://siteforge.invalid').href; + const safeBase=html(base); + const withBase=/]*)?>/i.test(content)?content.replace(/]*)?>/i,(match)=>match+``):``+content; + status.textContent='正在渲染主题页面…'; + frame.onload=()=>{if(seq===themePreviewSeq&&$('#themePreviewModal')?.open)status.textContent='预览已显示 · 可切换主题和设备';}; + frame.srcdoc=withBase; + }catch(error){ + if(seq!==themePreviewSeq||error.name==='AbortError')return; + status.textContent='预览失败:'+error.message+'。请点击重新加载或在完整主题图库中打开。';retry.hidden=false; + } }, toggleLibrary(force){libraryOpen=typeof force==='boolean'?force:!libraryOpen;const el=$('#sfLibraryPanel'),btn=$('#sfAddBlock');if(el)el.hidden=!libraryOpen;if(btn){btn.setAttribute('aria-expanded',String(libraryOpen));btn.textContent=libraryOpen?'× 收起区块库':'+ 添加内容区块'};Studio.updateGuidance()}, showHelp(){const dlg=$('#sfGuideDialog');if(dlg&&!dlg.open)dlg.showModal()}, - updateGuidance(){const one=$('#sfStep1'),two=$('#sfStep2'),three=$('#sfStep3');if(!one||!two||!three)return;one.classList.toggle('active',selected<0||libraryOpen);two.classList.toggle('active',selected>=0&&!dirty&&!libraryOpen);three.classList.toggle('active',dirty);}, + updateGuidance(){const one=$('#sfStep1'),two=$('#sfStep2'),three=$('#sfStep3');if(!one||!two||!three)return;one.classList.toggle('active',selected<0||libraryOpen);two.classList.toggle('active',selected>=0&&!dirty&&!libraryOpen);three.classList.toggle('active',dirty);const note=$('#sfNextAction');if(note)note.textContent=dirty?'更改尚未保存:点击右上角「保存草稿」':libraryOpen?'选择一种内容,添加后直接修改文字或图片':selected>=0?'正在编辑「'+(schema?.blocks?.[blocks[selected]?.type]?.name||'当前区块')+'」,右侧可直接修改':'先在左侧添加区块或选中页面内容';}, draw(){ const list=$('#blockList');$('#blockCount').textContent=blocks.length+' 区块'; const found=editorTools.filterBlocks(blocks,blockSearch,schema.blocks); @@ -315,6 +332,8 @@ const Studio={ blockKeydown(event,i){if(event.target!==event.currentTarget)return;if(event.key==='Enter'||event.key===' '){event.preventDefault();Studio.select(i)}else if(event.altKey && (event.key==='ArrowUp'||event.key==='ArrowDown')){event.preventDefault();Studio.moveBlock(i,event.key==='ArrowUp'?-1:1)}}, changeInspectorTab(tab){if(!['content','style','responsive'].includes(tab))return;inspectorTab=tab;Studio.applyInspectorTab()}, applyInspectorTab(){for(const key of ['content','style','responsive']){const active=key===inspectorTab;const btn=$('#tab'+key.charAt(0).toUpperCase()+key.slice(1));btn?.setAttribute('aria-selected',String(active));const pane=$('[data-inspector-section="'+key+'"]');if(pane)pane.hidden=!active}}, + toggleAdvanced(){advancedMode=!advancedMode;document.body.classList.toggle('sf-advanced-mode',advancedMode);const button=$('#studioAdvancedButton');button?.setAttribute('aria-pressed',String(advancedMode));if(button)button.textContent=advancedMode?'收起高级设置':'更多设计设置';const detail=$('#sfModeExplanation');if(detail)detail.textContent=advancedMode?'可调整布局、样式和手机显示':'当前显示常用设置';if(!advancedMode){inspectorTab='content';Studio.applyInspectorTab()}}, + closePane(){document.body.classList.remove('show-inspector','show-structure')}, togglePane(which){const type=which==='left'?'show-structure':'show-inspector';document.body.classList.toggle(type);if(type==='show-structure')document.body.classList.remove('show-inspector');else document.body.classList.remove('show-structure');}, updateHistoryButtons(){const state=editorTools.historyState(snapshots,snapshotCursor);for(const id of ['#studioUndo','#quickUndo']){const el=$(id);if(el)el.disabled=!state.canUndo}for(const id of ['#studioRedo','#quickRedo']){const el=$(id);if(el)el.disabled=!state.canRedo}}, @@ -362,6 +381,9 @@ const Studio={ if(['title','subtitle','description','image','body'].includes(field))out+='可输入 {{site.name}}、{{page.title}} 等变量。'; out+=''; } + const mediaTarget=selectedChildId?editorTools.findChildInRoot(blocks,b.id,selectedChildId)?.child:b; + const mediaFields=schema.blocks[mediaTarget?.type]?.fields||[]; + if(mediaTarget&&(['gallery','carousel'].includes(mediaTarget.type)||mediaFields.includes('image')))out+=`
图片设置预览先显示在草稿里,点击保存后才会保留。
`; if(b.type==='layout')out+=Studio.childQuickEditor(b); out+='
'; if(b.type==='layout'){ diff --git a/app/static/workspace.js b/app/static/workspace.js index 35fd141..d7b4879 100644 --- a/app/static/workspace.js +++ b/app/static/workspace.js @@ -123,7 +123,7 @@ function content(){if(!currentSite())return noSite();let arr=state.entries.filte (arr.length?`
${arr.slice(0,200).map(e=>``).join('')}
名称内容类型页面地址状态操作
${esc(e.title)}${esc(typeName[e.type]||e.type)}${esc(e.route)}${e.status==='draft'?'草稿':'已保存'} 设计页面 ↗
`:emptyState('没有找到内容','可以清除筛选条件,或者添加新内容。',actionButton('+ 添加内容','new-entry')))+ `${arr.length>200?'

当前显示前 200 条,请使用搜索缩小范围。

':''}
`; } -function design(){if(!currentSite())return noSite();const s=state.site;const cards=Object.entries(themeName).map(([id,name])=>`
${name}

${name} ${s.theme===id?'当前使用':''}

${({automotive:'适合汽车出口、车型及品牌展示',industrial:'适合制造业、产品与技术参数',corporate:'适合集团公司、服务和案例',minimal:'适合作品展示和品牌形象','trade-pro':'适合外贸 B2B 英文站点与询盘'})[id]}

`).join(''); +function design(){if(!currentSite())return noSite();const s=state.site;const cards=Object.entries(themeName).map(([id,name])=>`
${name}

${name} ${s.theme===id?'当前使用':''}

${({automotive:'适合汽车出口、车型及品牌展示',industrial:'适合制造业、产品与技术参数',corporate:'适合集团公司、服务和案例',minimal:'适合作品展示和品牌形象','trade-pro':'适合外贸 B2B 英文站点与询盘'})[id]}

预览页面效果
`).join(''); return htmlHeading('外观与设计','先选一套网站风格,再打开可视化编辑器修改图文、导航和手机端布局。')+ `

第一步 · 选择行业主题

更换主题不会删除您已经录入的业务内容和 URL。

查看完整主题预览 ↗
${cards}
`+ `

第二步 · 设计网页

挑选要修改的页面;可在设计器中编辑导航、页眉、页脚及各设备布局。

选择要设计的页面

修改先保存为草稿,正式发布设计后才会参与下一次静态构建。

${state.entries.filter(e=>e.type==='page').slice(0,8).map(e=>`▤

${esc(e.title)}

${esc(e.route)}

›
`).join('')||'
尚无页面,请先添加内容。
'}
提示:网站设置用于公司信息和域名;可视化编辑器用于调整页面外观。两者不会混在同一表单里。
`; diff --git a/app/templates/editor.html b/app/templates/editor.html index 89215af..e3d2c39 100644 --- a/app/templates/editor.html +++ b/app/templates/editor.html @@ -4,7 +4,7 @@
◈
SiteForge页面编辑
加载中页面编辑器
- +
@@ -26,7 +26,7 @@
-
只需 3 步
① 点击页面中的内容→② 直接编辑或调整布局→③ 保存并发布
+
只需 3 步
① 点击页面中的内容→② 直接编辑或调整布局→③ 保存并发布点击左侧区块或画布内容开始编辑
实时预览/单击区块或列内组件即可编辑 · 拖动 ⠿ 可排序 · 拖动列间分隔线可调宽
-