# 山峡化工简单文档库 ## 当前方案(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 标志。