Files

96 lines
7.0 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-26)
文档库已接入现有门户 `/doclib/enter`,侧栏点击直接进入门户内页面。采用 **P04 左树右表**,参考 `web-admin/src/views/system/user/index.vue`,视觉遵循 Fresh Mint。
- 左侧同屏展示“我的文档”“分享给我”,下挂文件夹;超级管理员另有“全部文档”。右侧统一列表、搜索、分页。
- 所有登录用户可创建自己的文件夹/子文件夹、上传文件。文件夹支持重命名;仅允许创建人或超级管理员删除空目录。
- 文件默认私有。上传人或超级管理员可选择同租户有效人员分享,接收人能查看详情和下载。清空分享人员即撤回。
- 上传人或超级管理员可删除文件(支持批量、全部验证后才操作);接收人不能删除或修改分享。删除写入 `del_flag=1`,保留对象和历史。
- 租户强制隔离,超级管理员也仅管理当前租户。目录路径可见不等于目录内全部文件共享。文档按明确人员 ACL 管理,普通部门/角色范围不会扩大私人文档可见性。
- 支持多选逐个立即上传;默认单文件 100 MB。私有 MinIO 桶保存文件,下载每次通过门户认证和 ACL 校验,不对外发送永久对象地址。
- 仅文件管理、详情和下载;不含在线 Office 编辑、版本管理、审批。
## 开发与部署
1. 执行增量 SQL `docs/sql/20261026_simple_doclib.sql`。新增 `biz_doclib_folder`、`biz_doclib_file`、`biz_doclib_share` 三表,MySQL 5.7 / utf8mb4;不更改旧 Cloudreve 库。
2. 使用已有 `MINIO_ENDPOINT`、`MINIO_ACCESS_KEY`、`MINIO_SECRET_KEY`、`MINIO_SECURE`。文档库新增配置:
```dotenv
DOCLIB_MINIO_BUCKET=shanxia-doclib-private
DOCLIB_MAX_UPLOAD_BYTES=104857600
```
3. 私有桶必须与普通附件 `MINIO_BUCKET` 不同,且不得有公开策略。首次使用会创建缺失的桶;检测到策略或访问异常会拒绝存储操作。运行账号需具有此专用桶的创建/检查策略/读写/清理未登记上传权限。
4. 重启后端并发布前端构建。`doclib_router` 沿用原先在 `app/api/__init__.py` 和 `app/main.py` 的注册。
5. 上传接口 `/api/web/doclib/upload` 为 multipart 专用,沿用 Bearer 认证和审计;不参与 JSON 加密。请求体接收阶段最多接受文件限额加 64 KiB 表单开销(包括无 Content-Length 请求)。上传/下载正文不缓存进审计日志。
6. 其他接口仍经过现有 JSON 加密、认证和日志;下载为 `application/octet-stream` 附件,`Cache-Control: no-store`。代理层也应允许业务需要的 100 MB 上传。
本次已对开发 `.env` 所连数据库执行增量 SQL(已确认与 `.env.production` 不同),并创建、验证专用私有桶;本机 8000 后端已重载。**未对生产环境执行迁移或部署。**
## 验证记录
- 后端文档库、上传边界、加密/审计与既有数据权限测试:28 项通过。
- 前端模型/API 契约:7 项通过;定向 Prettier、ESLint、Stylelint 通过。
- 浏览器回归:门户内导航、树切换、目录选择、接收人权限、分享、上传锁定与失败处理、下载删除、搜索/重试/响应布局通过(隔离上下文与模拟 API)。
- 真实开发 MySQL 5.7 + MinIO 联调:上传/读取一致、匿名读取403、旧快照并发分享撤回通过;验收记录已软删除。
- `pnpm build` 成功(现有大块体积警告);全量 `vue-tsc` 仍有工作区既有错误,新文档库文件无诊断。
- 仓库未找到规范提及的 `scripts/check_field_consistency.py`,已人工核对后端序列化、请求schema、TypeScript和表单字段;元信息、上传人、存储key均不可由客户端覆盖。
## 旧文档库
Cloudreve/OnlyOffice 的旧文件和服务保留。门户不再依赖旧 SSO,但兼容接口仍在。旧文件迁移、停用服务以及历史对象回收应单独安排,不在本次实施中执行。
---
## 历史方案(留档,不再作为当前实施要求)
### 目标
在本仓库 `doclib/` 中,基于 Cloudreve 社区版与 OnlyOffice 文档社区版,做一套供内部查阅、下载和在线修改共享资料的文档库。门户已登录用户可从侧栏「文档库」进入,并按门户用户一一对应到 Cloudreve 账号。
### 范围
| 项 | 决定 |
|---|---|
| 文件库 | Cloudreve 社区版 4.19.1(GPL-3.0),源码在 `doclib/upstream/cloudreve` |
| 在线编辑 | OnlyOffice 文档社区版 10.0.0(AGPL-3.0),用官方社区版镜像,通过 WOPI 接到 Cloudreve |
| 账号 | 门户每个用户对应一个文档库账号(邮箱 `p.{门户用户名}@sso.shanxia.local`,用户名需唯一)。分享、共享权限仍在 Cloudreve 里设置。测试管理员 `test@shanxia.local` 只用于对接,不是门户用户 |
| 数据 | 测试库 MySQL 上的独立库 `cloudreve`,不写入 `shanxia2.0` |
| 门户进入 | 所有已登录角色在侧栏「文档库」打开。门户签发 60 秒一次性票据,文档库页面换成本人的 Cloudreve 会话 |
### 品牌
Cloudreve 对外界面改为山峡化工文档库:
- 站点名、登录页标题:山峡化工文档库
- Logo:沿用门户 `web-admin/public/logo.gif`
- 去掉登录页「Powered by Cloudreve」和界面里的 Cloudreve 产品名
OnlyOffice 编辑器窗口保留其自有标识。社区版协议要求保留 ONLYOFFICE 标志,去标志属于付费开发者版,本期不改编辑器本体。
### 在线编辑
用户只打开文档库。点开 docx、xlsx、pptx、pdf 时,由 OnlyOffice 在浏览器里打开和保存,文件仍存在 Cloudreve。
两边容器要能互相访问:Cloudreve 的站点地址必须能被 OnlyOffice 容器访问,否则打开文件会下载失败。
### 验收
1. 浏览器打开文档库,登录页是山峡化工文档库,看不到 Cloudreve 产品名和 Powered by。
2. 测试账号能登录并看到文件列表。
3. 新建或上传一份 docx,能在浏览器里打开编辑器并保存。
4. 编辑器区域仍显示 OnlyOffice 标识。
5. 门户任意角色登录后打开「文档库」,不再输入文档库密码;同一门户用户再次进入仍是同一个文档库账号,不同门户用户对应不同账号。
### 本机运行
- 文档库:http://127.0.0.1:5212 ,测试账号 `test@shanxia.local` / `Test123456`
- 站点地址固定为 `http://127.0.0.1:5212`。OnlyOffice 按这个地址回读、回写文件;改成 `localhost` 时,容器会解析到 IPv6 并拒绝访问。
- 两个容器重启后,执行 `doclib/scripts/office-bridge.sh`,恢复 127.0.0.1 互相转发。
- 改过 Cloudreve 前端后,在 `doclib/upstream/cloudreve/assets` 执行构建,把 `build` 整目录覆盖到 Cloudreve 数据目录的 `statics`,再重启 Cloudreve 容器,并重新执行上面的转发脚本。
已在浏览器核对:登录页为山峡化工文档库,底部是山峡化工标识;测试文档能在编辑器中打开,保存后的正文能再次打开;编辑器仍保留 ONLYOFFICE 标志。