81 lines
7.4 KiB
Markdown
81 lines
7.4 KiB
Markdown
# 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 原文证据,管理入口保持隐藏 |
|
||
|
||
管理员检索画面:
|
||
|
||

|
||
|
||
普通用户检索与菜单:
|
||
|
||

|
||
|
||
普通用户访问管理路由后的角色状态:
|
||
|
||

|
||
|
||
## 本轮修正
|
||
|
||
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、浏览器改密和历史知识元数据修订页面。既有后端自动化已覆盖改密、撤销和重启持久化,本轮未将它们称作浏览器操作。生成模型、已核验领域资料/独立问题集和领域质量实验继续保留后续范围。
|