Files

81 lines
7.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 2026-10-16 浏览器与后端联调验收
本轮在真实浏览器中访问 Vite 页面,经同源 `/api` 代理连接默认生命周期 FastAPI 和隔离 PostgreSQL 16 + pgvector,验证合成资料的录入、审核、发布、检索以及 Cookie/CSRF/角色权限。数据仅用于功能验收,不代表那拉提文旅事实、领域质量或生产性能。
## 代码基线与范围
- [PR #17](https://gitea.kronecker.cc/saint/border-red-post-nalati/pulls/17) 的上下文阶段经真正 merged 的 [替代 PR #23](https://gitea.kronecker.cc/saint/border-red-post-nalati/pulls/23) 合入 `dev`。重放产生新 SHA,不能只看旧 AGit PR 是否仍打开。本轮核对替代 head/merge 均为最新 dev 的祖先;完整 backend 文件树、RAG 调用类型与专用契约文档和原实现一致,前端依赖 JSON 相同、锁文件对应版本与完整性值相同,通用说明保留集成后的更新。
- 从最新 dev 创建 `test/backend-browser-acceptance`,没有叠加待审功能;实际生成模型仍延期,没有调用生成模型或配置其凭据。
- 使用真实固定 BGE small 中文 Embedding(revision `7999e1d3359715c523056ef9478215996d62a620`、512 维)及现有离线缓存;不是用坐标 fixture 生成本轮页面上的检索结果。自动化回归中的坐标 fixture 仍只用于协议/数据库边界测试。
- 浏览器、SQL 实例、测试账号和原始检查记录属于本机隔离环境;仓库仅保留步骤、结果摘要及明确含有合成资料的截图,不提交运行环境、日志、凭据或个人数据。
## 真实浏览器操作与结果
| 验收路径 | 观察结果 |
|---|---|
| 匿名打开受保护页面 | 跳转登录页,保留回跳路径 |
| 管理员登录后刷新页面 | Cookie 会话恢复,管理员身份和受保护列表正常读取 |
| 来源登记 | 经浏览器提交来源、网址和合成备注,成功后列表显示 1 条 |
| 知识录入 | 保存为 pending,不能直接进入检索 |
| 缺失采集时间时审核 | 后端拒绝通过,页面如实显示须补全来源与真实采集时间 |
| 完整元数据知识审核 | 填入明确采集时间、来源、合成核验人和说明后审核保存成功 |
| 文本快照构建与发布 | 仅 1 条已核验知识进入 1 个 chunk;另一待审条目被排除;ready 后显式发布、代数递增 |
| 真实向量构建与发布 | 本地固定模型编码后保存向量,ready 后显式发布;页面显示真实向量版本 |
| 管理员 RRF 查询 | 关键词与向量各命中 1 条同一合成依据,页面展示原文与来源链接,说明尚未生成模型答案 |
| 文档登记 | 选择已登记来源并填入采集时间,创建成功;来源关联、正文和第一页列表可读取 |
| 管理员用户列表 | 数据来自服务端;只有一页时前后翻页按钮正确禁用。本轮未验证多页/大规模表现 |
| 退出登录 | 返回登录页;再次访问受保护页面仍跳转登录 |
| 普通用户注册及登录 | 服务端返回 user,界面不显示任何管理菜单 |
| 普通用户直接访问管理路由及登录回跳 | `/admin` 与 `/indexes` 均跳转个人中心的 forbidden 状态,没有获得管理页面 |
| 普通用户查询 | 重新发布当前资料快照后,普通用户仍能收到真实 RRF 原文证据,管理入口保持隐藏 |
管理员检索画面:
![管理员真实浏览器检索](assets/browser-acceptance/rrf-browser.jpg)
普通用户检索与菜单:
![普通用户检索](assets/browser-acceptance/user-retrieval-browser.jpg)
普通用户访问管理路由后的角色状态:
![普通用户角色拦截](assets/browser-acceptance/user-role-browser.jpg)
## 本轮修正
1. 知识录入原表单没有采集时间字段,导致从页面新建的知识无法满足后端审核前置条件。增加可选的采集时间输入,转换为带时区的 ISO 字符串提交;未填写仍可登记为待审,审核通过的后端约束继续有效,不自动猜测采集时间。
2. 主工作台缺少审核与文档管理入口。增加仅管理员可见的导航按钮,沿用已有路由和服务端授权,普通用户菜单验收通过。
3. 首页仍显示“尚未接入检索”,来源页仍称文档工作台待接入。按实际状态改为已接入检索证据、生成式回答未启用及已有文档管理入口;README 不再把尚未确定的生成模型供应商写成已选择。
## API 与数据库交叉核对
以下为独立 HTTP 检查,和上表的浏览器操作分别记录,不把 API 检查冒充浏览器动作:
- 匿名读取管理资源返回 401;普通用户读取知识、来源、文档、文本/向量索引、用户、检索历史和 RAG 准备历史八类管理资源均返回 403。
- 管理员写入缺少 CSRF 返回 403;使用正确 CSRF 但 Origin 不在允许列表仍返回 403。浏览器真实写入成功,说明正常代理调用携带了会话和 CSRF。
- 真实登录响应含 HttpOnly 与 SameSite=Lax;本次仅为隔离 HTTP test 环境关闭 Secure,生产默认配置未改。本轮没有 HTTPS/Secure Cookie 浏览器验收结论。
- 退出后 `/api/auth/me` 返回 401。浏览器刷新恢复及退出跳转与服务端会话状态一致。
- 文档等目录写入后,旧向量查询明确返回 409;API 重新构建/发布后恢复查询,仍只命中那条已核验知识。这是现有保守失效策略,不自动使用旧快照。
- 持久化记录为 1 条来源、2 条知识(其中 1 条未审核)、1 条关联文档。真实模型的空间、版本和归一化契约沿用 [VECTOR_API.md](VECTOR_API.md)。
- 最新检索记录可准备 RAG 上下文,状态 prepared 且 `model_called=false`;没有以准备结果冒充生成式回答。
## 复现路径
1. 使用单独测试数据库或隔离 Schema,启用 public 的 vector 扩展,执行 `alembic upgrade head`。不要把合成验收资料写入业务库。
2. 依 [AUTH_API.md](AUTH_API.md) 初始化本机测试管理员;真实密码、环境文件与日志不入库。前后端 Origin、Cookie 的开发设置按该文档配置。
3. 依 [VECTOR_API.md](VECTOR_API.md) 配置固定本地模型的离线缓存,启动默认生命周期后端及 Vite。
4. 从浏览器执行上表步骤,先验证缺失元数据被拒绝,再录入有明确采集时间的合成资料并审核、发布文本和向量、查询证据。
5. 使用独立普通用户核对菜单、直接路由拦截与退出;同时用 HTTP 核对服务端授权、CSRF 和失效行为。
6. 保存验收摘要与合成截图后,关闭本次测试服务并清理隔离 Schema;本次运行环境与原始记录仅保存在 Git 元数据目录。
## 本轮回归验证
- `pytest -q backend/tests`:**224 passed, 1 skipped**;使用隔离 PostgreSQL,skip 为必须显式启用的真实 Embedding 专项。
- `ruff check backend`、`ruff format --check backend`:通过。
- 前端 `npm run build`(含 `vue-tsc -b`):通过。
- 本轮真实固定 BGE small 的运行证据来自上述浏览器/HTTP 验收,和常规自动化的坐标 fixture 分开记录;没有生成模型调用。
## 尚未完成的验收
本轮不替代 Docker 容器验收、多浏览器/设备回归、生产 HTTPS、浏览器改密和历史知识元数据修订页面。既有后端自动化已覆盖改密、撤销和重启持久化,本轮未将它们称作浏览器操作。生成模型、已核验领域资料/独立问题集和领域质量实验继续保留后续范围。