upgrade: adopt V8.31.1 (theme 1.3/1.4 redesigns, editor deep-canvas, guided launch, component library)

Overlay 190 upstream items (V8.22→8.31) preserving trade-pro theme,
registry tests, and design docs. Re-applied full patch set on identical
anchors (discovery/env_for/blocks.css/type-mapping/locale-override/
theme_color/frontend entries/test_theme_pro_v3 mods) plus compose pins.

Verified: theme suites 35/35; dual-baseline full run 415 passed vs
pristine 386+29 ours, FAILED-set diff EMPTY (same 10 Windows env fails).
Live: container 8.31.1-dev.1 healthy, hesupipe 192 entries intact,
trade-pro build 203 pages 0 errors.

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
浅念
2026-10-26 09:43:17 +08:00
parent a63548c645
commit 8884e100f9
647 changed files with 20853 additions and 271 deletions
+31
View File
@@ -0,0 +1,31 @@
# V8.22 高级可视化编辑器 — 开发实现说明
**继承基线**:SiteForge V8.21.3,四套主题与移动端导航不变。
## 文件
- `app/static/studio-canvas-bridge.js`:注入 sandbox iframe 的独立画布工具层。浏览器只传受限指令到上级编辑器;禁止执行任意 HTML/JS 指令。
- `app/static/editor-helpers.js`:纯函数校验、按 ID 排序、列宽边界、画布命令白名单。
- `app/static/editor.js`:受信 iframe 来源检查、按区块 ID 查找并操作草稿,撤销与版本继续复用原有机制。
- `app/main.py`:编辑器预览 HTML 注入上述脚本,不向真实静态构建添加编辑工具。
- `app/templates/editor.html`、`app/static/editor.css`:更清晰的引导和插入反馈。
- `tests/test_v822_canvas.py`、`tests_js/editor_ux.test.cjs`:新增专项测试。
- `scripts/studio_canvas_smoke_v822.py`:需要本机 HTTP 访问许可的真实 Chromium E2E。
- `scripts/studio_canvas_isolated_browser_v822.py`:无需网络的真实 Chromium iframe 交互检查。
- `examples/Studio_V8_22_画布级可视化编辑器_交互演示.html`:完全独立可打开、模拟数据。
## 操作
1. 登录后台选站点、打开「页面设计」。
2. 点击画布区块显示橙色边框;顶部黑色工具栏可直接移动/拖拽、插入、复制或删除。
3. 双击顶层区块标题(如 Hero 标题)改文字,Enter 确认、Esc 取消。
4. 桌面端选择多列布局,用相邻列之间的橙色握柄拖动列宽,也可用方向键逐步调整。
5. 切换平板/手机预览后检查样式,按原流程「保存草稿」→「发布设计」→「构建」→「部署」。
## 限制
- 保留声明式区块模型:不允许任意像素绝对定位和任意脚本插入。
- 画布内层子组件尚不支持直接双击修改,需右侧属性编辑。
- 列宽拖拽仅针对桌面端;平板/手机采用既有响应式字段。
- 草稿发布到内容库并非直接上线,需要构建并通过发布审批。
- 最终验收详情:`reports/V8_22_验收报告.md`。
+50
View File
@@ -0,0 +1,50 @@
# SiteForge V8.23 — 高级可视化编辑器第二阶段
**版本**:`8.23.0-dev.1`
**基线**:V8.22.0-dev.1 完整源码
**阶段**:开发集成版;未通过生产环境验收
## 1. 用户操作方式
在站点工作台打开 `/editor/{site_id}/{entry_id}`,添加一个「多列自由布局」区块,并在任一列添加标题、图文组合或行动号召等子组件。
- 点击中间预览中的**列内组件**,右侧「内容」自动显示相应组件的普通属性表单。
- 在组件上悬浮显示快捷工具条,允许复制、删除、同列上下排序。选中态使用蓝绿色边框与顶层橙色选中态区分。
- 对支持纯文本编辑的标题/描述双击,直接输入。富文本 HTML 内容仍使用安全受控的富文本配置,不直接将 DOM 反写到数据模型。
- 选中顶层多列布局,切换右侧「手机/平板」,可选择均分、左宽右窄、左窄右宽,并设置列间距、手机及平板列数、跨列、顺序和显隐。
- 更改均属于未保存草稿。保存草稿后可以发布设计,但正式站点还需构建、审批与部署。
## 2. 实际文件修改
| 文件 | 改动 |
| --- | --- |
| `app/static/studio-canvas-bridge.js` | 列内直接子组件工具栏、选中与文字修改事件,继续使用 sandbox iframe |
| `app/static/editor-helpers.js` | 查找/校验父子 ID、子组件移动、布局预设等纯函数 |
| `app/static/editor.js` | 嵌套操作命令接收、内容属性卡片、列宽预设、草稿状态更新 |
| `app/static/editor.css` | 嵌套编辑卡片与预设按钮样式 |
| `app/templates/editor.html` | 画布帮助文案 |
| `tests/test_nested_v823.py` | 嵌套区块 Schema、草稿接口和安全界面回归 |
| `tests/test_nested_helpers_v823.cjs` | 过期 ID、拒绝非法操作、列宽、移动及复制安全检查 |
| `scripts/studio_nested_browser_v823.py` | Chromium 沙箱 `srcdoc` 直接交互验证 |
| `scripts/regression_v823.py` | 43 个测试模块独立分批执行及原始日志 |
| `scripts/check.sh`、`scripts/check.ps1`、CI | 加入新版回归入口、升级版本标识 |
## 3. 兼容性与安全边界
1. 不改变已有 SQL Schema,不启用任意 HTML/JavaScript 组件,不修改静态站发布器对安全媒体与链接的控制。
2. 父组件 ID 与子组件 ID 必须同时匹配当前页面内的真实布局。不存在的组件、非法字段与未知操作在父编辑器拒绝。
3. 目前 **只支持多列布局直接子组件的画布操作**。更深层嵌套允许在后端声明式模型中存在,但尚不提供多层画布操作路径。
4. 布局预设限于 2 列的左宽/右宽;1–4 列可使用等宽。当前未实现任意绝对定位、多组件跨列拖放或像素级自由布局。
5. 组件库仍然是「复制一个快照到页面」模式,**不是跨站点引用、自动同步或协作编辑**;这部分不能算作完成。
6. 浏览器传递操作通过 `iframe.contentWindow` 来源验证;沙箱仅设置 `allow-scripts`,不授予同源访问权限。保存/发布仍走已有认证、CSRF、修订冲突验证。
## 4. 验收记录
- 完整 Python 历史和新增回归:**43 个测试模块、352 项用例、15 个隔离批次,全部通过**,详见 `reports/v823-regression/`。
- JavaScript 历史测试:9 项通过;另有嵌套 JS 专项断言脚本通过。
- Chromium 隔离画布:点击子组件、复制、双击修改标题的事件链路通过。
- HTML 离线交互演示:通过 Chromium `set_content` 执行检查,组件点击、标题编辑、列宽预设和设备切换无脚本错误。
- HTTP + Worker:真实启动服务、登录/CSRF、建站、构建、ZIP 下载与预览全部通过。
- **未通过/未执行**:Chromium 导航到 localhost 的真实后台 E2E,被运行环境管理员策略阻止;真实 Docker、PostgreSQL/Redis、生产服务器和官方 Art Design Pro 完整编译未在本轮执行。
**建议下一步**:完善复杂多层节点定位、可视化布局栅格和跨页面共享组件版本引用,然后把 Art Design Pro 官方工程加入真实集成编译和自动化浏览器测试。
+59
View File
@@ -0,0 +1,59 @@
# SiteForge Enterprise V8.24 — 深层布局编辑与内层组件复用
**版本:** 8.24.0-dev.1
**状态:** 开发集成版。无需数据库结构迁移。来源:V8.23 完整项目源码。
## 1. 改造目标与边界
使使用者在编辑器中**看得到、选得中、改得了**两层多列布局:
- 在顶层「多列布局」的第 1 层列中增加「内层布局」;
- 内层布局的各列可直接添加富文本、图文、优势、行动号召组件;
- 点击第二层组件(画布或右侧结构卡片),可以直接修改文字、复制、排序、删除;
- 内层布局本身支持等宽 / 左宽右窄 / 左窄右宽、列间距、手机和平板列数;
- 从站点媒体库选择图片时,应用到**正在选中的组件**,不误改上层布局;
- 可以将当前选中的列内组件保存到本站复用组件库,并在选中列内组件时将组件副本插入其后。
**限制:** 当前支持「外层 layout → 内层 layout → 内容块」,不开放第三层 layout(遵循原服务端 `blueprints.validate_blocks` 的嵌套深度限制)。组件库使用**复制入页**,不是跨页自动同步。不会添加任意 HTML、JavaScript、自由绝对定位、数据库新表或新的发布捷径。
## 2. 编辑器操作
1. 进入 `/editor/{site_id}/{entry_id}`,选中或添加「多列自由布局」。
2. 在某一列点击「+ 内层布局」,右侧「画布组件」列表会显示内层布局。
3. 选中内层布局,用「+ 富文本」「+ 图文组合」「+ 核心优势」「+ 行动号召」添加内容。
4. 点击中间画布中的第二层组件、修改标题与描述。可点复制、上移、下移、删除。
5. 选中内层布局,选择布局比例与手机/平板列数。更改外层设置不会覆写内层布局数据。
6. 需要重复利用时,选中子组件,点击「☆ 保存当前组件到组件库」;再次选择组件库条目,复制进入所选列内。
7. 保存草稿 → 审核设计 → 发布设计 → 执行静态构建;**仅点击发布设计不会直接更新正式网站**。
## 3. 代码变化
- `app/static/editor-helpers.js`:ID 安全定位(`findNestedChild`、`findChildInRoot`、`findLayout`),限制从画布传来的非法操作;客户端从不接受事件中夹带的数据库位置索引。
- `app/static/editor.js`:任意已支持层级的点击编辑与树状卡片、内层响应式控件和添加操作、子组件素材选择及复用组件保存/插入。
- `app/static/studio-canvas-bridge.js`:继续在受限 iframe 中分发可靠的 ID 消息,保留事件源比对和区块高亮。
- `tests/test_deep_nested_v824.py`:静态渲染、草稿、预览、安全嵌套深度及组件库行为。
- `tests_js/deep_nested_v824.test.cjs`:深层定位、非法命令、列宽和 ID 复制校验。
- `scripts/studio_nested_browser_v824.py`:离线 Chromium 交互演示验收,**不是已登录后台浏览器 E2E**。
- `scripts/regression_v824.py`:独立分批自动化回归、超时与原始日志。
## 4. 验证命令
```bash
python -m compileall -q app
node --check app/static/editor.js
node --test tests_js/*.test.cjs
python -m pytest tests/test_deep_nested_v824.py -q
python scripts/http_end_to_end.py
python scripts/studio_nested_browser_v824.py
python scripts/regression_v824.py --timeout 65 --group-size 2
```
查看 `reports/v824-regression/result.json`。各模块进程相互隔离,但这不代替 Docker、PostgreSQL/Redis 及生产备份/发布验收。
## 5. 上线前阻断项
- 使用真实后台会话与正式 iframe,在常规浏览器完成点击、拖拽、撤销、保存、版本回滚流程;本轮的隔离 Chromium 演示不足以关闭此项。
- 确认四套主题在全部页面的桌面/手机实际效果,尤其是内外层栅格混用与窄屏折行。
- 测试大型页面接近 120 个区块上限、重复 ID、非法媒体 URL 与编辑冲突。
- 官方 Art Design Pro 完整工程尚未随本项目提供,安装器不等于官方工程已完成编译。
- 企业级 PostgreSQL、Redis、多 Worker、远端发布与恢复仍需部署环境的独立验收。
+91
View File
@@ -0,0 +1,91 @@
# SiteForge Enterprise V8.25 — 公共组件与选择性同步
**版本:** `8.25.0-dev.1`
**状态:** 开发集成版;在 V8.24 完整源码基础上增量开发。
**生产约束:** 未经 PostgreSQL/Redis、正式浏览器登录和远程部署验收,不得标记为生产可上线。
## 目标和本轮交付
将原先的“复制一次、以后完全独立”的组件库升级为两个明确选项:
- **复制插入:** 区块是当前页面的独立副本,未来不会随源组件更新。
- **关联插入:** 页面保存一个合法的 `shared_ref`,用于之后**预检、挑选页面、生成新草稿**。不会在页面构建时远程引用组件,也不会在源组件修改时自动更改任何已发布页面。
新增源组件不可变版本快照、历史版本查询与恢复为新版、引用页面列表、本地修改检测、过期预检保护、跨站点隔离、事务式选择性同步、解除关联按钮。保留原四套主题、移动端抽屉导航与可选 Tabs、两层安全布局、URL/SEO、历史版本及独立静态发布。
## 管理入口与操作
1. 选择网站和页面 → 打开原来的 `/editor/{site_id}/{entry_id}`。
2. 选中一个区块(也可以是双层多列布局中的列内组件) → “保存当前组件到组件库”。
3. 左侧“添加内容” → “从我的组件库添加”,根据需要选择“复制”或“关联插入”。
4. 顶部“更多 → 管理公共组件”,或左侧高级设置中的同名按钮。
5. 选中公共组件 → 查看历史版本、查看引用/同步;可使用当前选中区块的内容创建新版本,也可以将一个历史快照“恢复为新版本”。历史版本不被覆盖。
6. 检查引用页。**存在本地修改、发布冲突或已是最新版的页面不可直接勾选**。
7. 选择允许同步的页面 → 确认 → 这些页面生成新的设计草稿;逐页预览、保存与发布。网站仍然需要重新构建、执行正式审批部署。
8. 需要完全独立时,在属性栏点击“解除关联、保留当前内容”。
演示:[公共组件版本与同步的离线交互页](../examples/V8_25_公共组件_版本与同步演示.html)。该演示使用模拟数据,不连接 SiteForge 后台。
## 数据与接口
### 增量 Schema
沿用 `reusable_components`,新增:
`reusable_component_versions(component_id, version, block_json, snapshot_hash, created_at)`,主键 `(component_id, version)`。针对现存旧组件仅能为**当时当前版本**补快照,无法凭空还原过去没有保存的历史版本。
页面区块新增一个**可选、严格验证**的 `shared_ref`:
```json
{"id":"source_component_id","version":2,"hash":"sha256_64_hex"}
```
引用元数据随安全区块数据一同保存,不产生运行时动态远程引用。指纹排除拷贝后重新生成的块 ID 和来源引用,比较实际区块内容。不能通过本功能执行任意 HTML/JS。
### API(所有接口要求登录/CSRF 和相应站点权限)
| 方法 | 路径 | 权限 | 功能 |
|---|---|---|---|
| GET | `/api/sites/{site}/components` | Viewer | 本站组件与当前快照 SHA |
| POST | `/api/sites/{site}/components` | Editor | 新建组件,初始版本 v1 |
| PUT | `/api/sites/{site}/components/{id}` | Editor | 按 `expected_version` 乐观锁创建下一版本 |
| GET | `/api/sites/{site}/components/{id}/versions` | Viewer | 查询不可变版本列表 |
| GET | `/api/sites/{site}/components/{id}/versions/{version}` | Viewer | 读取已校验 SHA 的历史快照 |
| GET | `/api/sites/{site}/components/{id}/usage` | Viewer | 预检被引用页面、版本、冲突、`plan_token` |
| POST | `/api/sites/{site}/components/{id}/sync` | Editor | 按 `plan_token` 和页面 ID 列表同步到草稿 |
| DELETE | `/api/sites/{site}/components/{id}` | Editor | 无任何引用时允许删除 |
同步请求样例:
```json
{"plan_token":"64位预检SHA256","entry_ids":["页面ID1","页面ID2"]}
```
### 同步安全边界
- 源组件版本发生变化、预检结果不一致、被选页面出现本地修改或页面草稿乐观锁冲突 → 409 拒绝。
- 所选页面最多 100 个;事务内重新核对完整页面哈希与草稿修订号。
- `BEGIN IMMEDIATE` 的读/比较/写窗口和事务性快照日志;在 SQLite 下启用写锁,在 PostgreSQL 兼容层中使用事务顾问锁。
- 事务任一页面失败会整体回滚。只有新草稿变化,发布的 `entries.meta_json` 不变。
- 对于一个页面中的同一组件多个引用,同步所有满足条件的该组件实例;任何一个已在本地编辑都会拒绝整页,避免部分覆盖。
- 原页面的 URL、SEO、正文等未更改,组件源只在设计层按明确操作应用。
## 验收与运行
```bash
python -m pytest -q tests/test_v825_shared_components.py
node --check app/static/editor.js
node --test tests_js/*.test.cjs
python scripts/http_end_to_end.py
python scripts/verify_release.py
python scripts/regression_v825.py --timeout 55 --group-size 2
```
本轮已完成:23 批共 370 项 Python 回归;13 项 Node JavaScript 回归;HTTP + Worker E2E;隔离 Chromium HTML 演示的 PC 和 390px 手机布局。参见 [`V8_25_验收报告.html`](../reports/V8_25_验收报告.html)。
## 尚未完成
- 当前同步是**选择性草稿更新**,不是一个“所有页面实时引用同一可变组件”的无版本动态系统。设计成这样是为了防止意外批量改动已发布站点。
- 全站页眉、页脚、导航仍由现有 `site_design_v87` 管理,尚未纳入本次公共组件源版本与跨页面同步模型。
- 没有完成多人实时协同编辑、视觉差异对比、正式 Art Design Pro 官方工程编译或真实 HTTPS 已登录 Chromium 后台验收。
- PostgreSQL/Redis 多 Worker、真实 S3/SFTP/Agent 发布、灾备恢复仍需独立生产化测试。
+32
View File
@@ -0,0 +1,32 @@
# V8.26 全站设计管理 — 实现与验收
**基线:** SiteForge V8.25.0-dev.1。当前源码版本:V8.26.0-dev.1。
## 核心架构
已有 `site_design_drafts` 与 `site_design_publications` 保存全站草稿与发布快照。本轮**不改变数据库 Schema**,主要在 `app/site_design_v87.py` 增加审核差异、审核令牌、历史快照查询与安全恢复。前端主要在 `app/templates/editor.html`、`app/static/editor.js`、`app/static/editor.css`。
- 导航采用树形数据,层级不超过 3,总元素不超过 48、同层最多 18;仍执行原 URL 白名单校验。
- `GET /api/sites/{site}/site-design/review` 将已发布配置与当前草稿逐字段比较,返回变更清单、影响范围及绑定 site_id、草稿版本、当前站点设置哈希的 `plan_token`。
- `POST /api/sites/{site}/site-design/publish-reviewed` 仅 Owner 可调用;在同一数据库事务内校验草稿版本和 token 后发布。旧发布接口为兼容保留,但当前编辑器改用审核发布接口。
- `GET /api/sites/{site}/site-design/publications/{id}` 返回所属站点历史版本及结构化差异。
- `GET /api/sites/{site}/site-design/live-hash` 返回当前已发布站点设置哈希。
- `POST /api/sites/{site}/site-design/publications/{id}/restore` 在单一事务中检查历史归属、当前正式配置哈希、预期草稿版本及目标快照是否合法,然后写入新的全站草稿。不会直接修改 `sites.settings_json`。
## 安全保证
1. **跨站点隔离**:历史记录必须属于当前 site_id,否则返回 404;鉴权由 `enterprise.require` 处理。
2. **审核过期保护**:草稿版本或站点已发布 settings 变化,审核令牌失效;`publish-reviewed` 返回 409。
3. **原子发布与恢复**:读/校验/更新使用 `BEGIN IMMEDIATE` 事务窗口,降低读写竞态。
4. **原有发布安全不变**:全站设计发布只影响内容库和下一次静态构建,不会替换线上目录或跳过正式发布审批。
5. **前端差异防 XSS**:所有用户输入展示均使用 `textContent`,不将差异数据当作 HTML 执行。
## 验收结果与限制
- 23 个隔离 Python 测试批次:376 项通过,0 失败、0 超时。
- JavaScript:13 项通过;`node --check` 通过。
- HTTP + Worker:健康检查、登录、CSRF、站点/页面创建、异步构建、ZIP 下载和预览通过。
- Chromium:离线页面通过 `set_content` 隔离加载验证新增导航、子菜单、保存、审核与历史模拟(0 脚本错误);**没有完成真实登录后台的浏览器 E2E**。
- **未执行**真实 PostgreSQL/Redis、远程正式部署与 Art Design Pro 官方工程编译。
**兼容提醒:** 历史发布快照恢复不会修改已经发布的网站;为了让恢复内容上线,必须在站点设计审核后重新发布、构建和部署。
+73
View File
@@ -0,0 +1,73 @@
# SiteForge Enterprise V8.27 — 易上手工作台与操作指引
## 本轮交付性质
V8.27.0-dev.1 是 V8.26 完整源码上的**增量集成版**,不替换原后台 API,也不改变原数据库结构和静态构建引擎。历史版本功能继续保留。
## 改动范围
| 位置 | 已实现的操作 |
|---|---|
| 网站创建弹窗 | 拆成三步:基本信息 → 选择行业风格 → 预览和确认;支持上一步、必填校验、避免重复提交 |
| 当前网站操作指引 | 根据已保存内容、构建状态、Worker 任务与远程发布历史生成步骤;逐项有“开始操作”跳转 |
| 网站概览 | 突出“下一步应该做什么”,常用操作缩减为内容、设计、生成与预览 |
| 术语说明 | 区分内容保存、静态构建、检查与审批、正式部署;不把下载 ZIP、发布设计误称为上线 |
| 数据状态 | 仅自动建立的示例首页不会使“内容准备”自动完成;用户主动修改初始首页或添加正式内容才计入 |
| 手机界面 | 创建设计向导与引导列表适配窄屏,侧栏默认关闭,不增加底部固定遮挡 |
### 操作路径
1. 登录 → 工作台 → 创建网站。
2. 分三步填写网站名称、模式、主题和可选域名。
3. 系统创建项目,自动切换到“建站操作指引”。
4. 根据引导准备内容(旧站模式自动跳转迁移入口),可进入可视化编辑器修改样式。
5. 执行静态构建,进入构建页面查看任务、预览和质量报告。
6. 人工检查后由审批人员批准,再发起正式环境发布;必须核查实际域名。
### 使用者可读的状态定义
- **已保存**:写入 SiteForge 内容数据库;访客网站可能尚未变化。
- **已构建**:成功生成了一个静态版本;不能推断质量检查或发布已通过。
- **正式发布记录**:有成功记录;仍需要在实际域名核实当前可用性。
- **构建可能过期**:已保存内容/站点在最近完成构建之后变更,提示人工复核。
- **设计**:始终视为可优化,不因为选择主题自动声明设计验收完成。
## 代码结构
- `app/templates/workspace.html`:三步创建表单、引导导航入口。
- `app/static/workspace-guide.js`:纯函数 `SiteForgeJourney.plan`;无本地跨用户数据缓存、无额外业务接口。
- `app/static/workspace.js`:向导控制、流程状态渲染、已有 API 调用。
- `app/static/workspace.css`:清晰的步骤条、状态列表、移动端布局。
- `tests_js/workspace_guide_v827.test.cjs`:引导状态单元测试。
- `tests/test_v827_guided_workspace.py`:真实测试客户端页面/接口联通。
- `scripts/browser_guide_v827.py`:实际工作台 JS 的 Chromium 隔离交互检查(模拟 API,不经过用户真实账号)。
- `scripts/regression_v827.py`:原项目分批 pytest 入口。
## 本轮测试及证据
- 原项目 Python 测试模块合计 **379 条用例通过**(24 批运行,其中 22 批直接通过;第 10 批组合运行超时、两模块拆开后 7+7 通过;第 22 批原断言对老结构写死而失败,更新以新模块校验后重新运行 21 项通过)。**一键回归稳定性未通过**。
- Node.js JavaScript 测试 **23 项通过**(原有 13 项 + 新增 10 项)。
- 原项目 `scripts/http_end_to_end.py` 已通过真实 Web + Worker 隔离端到端链路。
- `scripts/browser_guide_v827.py`:实际 V8.27 workspace 代码,模拟网络接口在 Chromium 隔离页测试,验证三步表单、空名称阻断、只在最后创建、创建后显示状态、手机不溢出、0 页面脚本错误。
- `scripts/verify_release.py`、`python -m compileall -q app` 和 `node --check` 通过。
## 尚未完成/生产上线限制
- 正式 Art Design Pro 官方工程的 `pnpm build` 及统一 SSO 登录未验收。
- 已登录真实服务器浏览器 E2E、真实手机测试尚未完成;Chromium 测试使用了模拟 API。
- PostgreSQL/Redis 多 Worker 真实压力及灾备、远程发布/回滚尚未在真实生产环境完整验收。
- 生产上线路径需要继续按原 P5 发布审批执行;本轮**不绕过**角色、审批或安全检查。
- 因原回归执行器存在组合批次偶发停滞,**不得将本轮 Python 回归描述为一键全绿**。
## 推荐复核命令
```bash
python -m pytest -q tests/test_v827_guided_workspace.py tests/test_workspace_v812.py
node --test tests_js/*.test.cjs
python scripts/http_end_to_end.py
python scripts/browser_guide_v827.py
python scripts/verify_release.py
python scripts/regression_v827.py --group-size 2 --timeout 35
```
> 最后一条命令的运行环境可能出现分组超时,查看 `reports/v827-regression/result.json` 与原始批次日志。正式发布前仍需要真实 Web/Art/PG/Redis/发布服务器的独立验收。
+67
View File
@@ -0,0 +1,67 @@
# SiteForge Enterprise V8.28 — 新手友好上线操作中心
**版本**:8.28.0-dev.1
**交付类型**:V8.27 完整源码的增量集成版(开发验收,不是生产验收)
**设计原则**:用户只看到当前应执行的操作;用日常中文解释状态;不能把构建、审批或任务排队错误地称为“已上线”。
## 1. 打开方式
登录工作台 → 选择当前网站 → 左侧 **检查并上线**。也可从网站概览的快捷卡片、建站操作指引(审核并上线)进入。
## 2. 六个步骤
| 步骤 | 使用者要做的事 | 系统做的检查 | 常见问题 |
|---|---|---|---|
| 1. 选择网站版本 | 选择已完成的静态构建;如果没有则点击“开始构建” | 只列出 `status=complete` 的构建 | 网站保存成功不代表已构建 |
| 2. 预览并检查质量 | 打开预览、核对图片和 SEO;勾选本地检查框 | 人工确认只存在于当前页面会话,不是服务器审批 | 检查不同设备和关键链接 |
| 3. 提交审批 | 向另一位审核人提交申请 | 读取服务器审批状态;重复 pending/approved 不重新申请 | 自己不能审批自己提交的申请 |
| 4. 发布前检查 | 审批通过后点击“执行发布前检查” | 调用既有 `/api/production/sites/{site}/preflight/{build}` | 会重新校验构建、质量、迁移和审批 |
| 5. 提交部署 | 选择测试或正式环境,再提交 | 只有前述条件全部满足且目标已配置时才启用;服务器仍重新校验 | 未配置目标时联系运维配置 Agent/SFTP/S3 |
| 6. 真实网址核查 | 等待 Worker 完成,再到网站地址检查 | 读取发布记录,但**不**把发布记录视为外网验收成功 | 检查 DNS、TLS、CDN 缓存、主页、联系表单 |
**请注意正确顺序**:先提交审批、由其他有权限的人员通过,再执行发布前检查。之前页面中“检查发布条件”放在“提交审批”之前,实际服务器会因为缺乏审批而拒绝,是本版修正的重要体验问题。
## 3. 安全边界及兼容性
- **没有新开任何发布后门**。申请、检查、部署都调用原有服务端端点,继续受登录、CSRF、站点角色、质量检查、独立审核、Worker 任务与安全出网限制。
- 所有临时确认与发布前检查结果仅用于当前会话的按钮状态,不写入业务数据库;浏览器刷新后需重新操作。换站、换构建或换环境会清除相关确认,防止复用错误状态。
- 发布前检查与部署存在时间差,服务端部署操作必须再次校验。客户端按钮仅用于简化引导,不能替代后端检查。
- 读取审批状态失败时不宣称“未申请”或者“已批准”;读取目标配置失败时不宣称目标已经配置。
- 只显示当前网站对应版本的审批/发布记录,跳过不属于所选站点的结果。
- 已有“构建与交付”的专业管理功能继续保留在高级折叠区域,原有 API、数据库 Schema、URL、构建产物和发布审批策略均未改变。
- 正式域名按钮只接受符合 HTTPS 格式的地址;在离线演示中使用 example.com 占位地址,不会访问生产环境。
## 4. 非技术使用者视角的改善
原流程需要在“建站指引、构建、审批中心、质量报告、部署记录”之间来回跳转,也容易把构建成功当作上线。现在正常日常操作可以在一个页面内完成,进阶操作仍可进入专业工具。
导航明确命名为 **“生成与预览”** 和 **“检查并上线”**,避免技术用户和普通用户混淆。移动端在 390px 宽度验证按钮、表单自适应,无横向溢出。
## 5. 模块与回归入口
- `app/static/workspace-launch.js`:可单独测试的发布流程状态模型。
- `app/static/workspace.js`:上线操作中心 UI、API 操作、审批状态读取及站点切换保护。
- `app/templates/workspace.html`、`app/static/workspace.css`:统一入口与响应式布局。
- `tests_js/workspace_launch_v828.test.cjs`:上线流程前置条件、防跨站/跨版本、目标环境、是否真正上线等场景。
- `tests/test_v828_launch_center.py`:页面/脚本/API 连接检查。
- `scripts/browser_launch_v828.py`:使用真实工作台 JS 的隔离 Chromium 测试(模拟 API,不触碰生产)。
- `scripts/regression_v828.py`:独立 pytest 批次回归执行器,保留原始结果。
- `examples/V8_28_简洁上线操作中心_交互演示.html`:双击即可打开的模拟数据界面,可点击“模拟另一位审核人批准”。
### 本地检查命令
```bash
python -m pytest -q tests/test_v828_launch_center.py tests/test_v827_guided_workspace.py
node --test tests_js/*.test.cjs
python scripts/browser_launch_v828.py
python scripts/http_end_to_end.py
python scripts/verify_release.py
python scripts/regression_v828.py --group-size 2 --timeout 25
```
## 6. 未关闭的正式交付门槛
- Chromium 本次模拟原始后台 Web/API,不能代替真实账号登录、真正不同账号审批、实际公网部署与回滚的端到端演练。
- Art Design Pro 官方完整工程未随项目提供,官方 `pnpm build` 尚无实测证据。
- PostgreSQL/Redis 多 Worker、多实例、真实 Agent/SFTP/S3 与备份恢复、CDN、公网 DNS/TLS 仍需独立验收。
- 复杂 WordPress 站点的全量 URL/SEO/图片及插件迁移还不能直接宣称 1:1 全部完成。