7.0 KiB
7.0 KiB
山峡化工简单文档库
当前方案(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 编辑、版本管理、审批。
开发与部署
- 执行增量 SQL
docs/sql/20261026_simple_doclib.sql。新增biz_doclib_folder、biz_doclib_file、biz_doclib_share三表,MySQL 5.7 / utf8mb4;不更改旧 Cloudreve 库。 - 使用已有
MINIO_ENDPOINT、MINIO_ACCESS_KEY、MINIO_SECRET_KEY、MINIO_SECURE。文档库新增配置:
DOCLIB_MINIO_BUCKET=shanxia-doclib-private
DOCLIB_MAX_UPLOAD_BYTES=104857600
- 私有桶必须与普通附件
MINIO_BUCKET不同,且不得有公开策略。首次使用会创建缺失的桶;检测到策略或访问异常会拒绝存储操作。运行账号需具有此专用桶的创建/检查策略/读写/清理未登记上传权限。 - 重启后端并发布前端构建。
doclib_router沿用原先在app/api/__init__.py和app/main.py的注册。 - 上传接口
/api/web/doclib/upload为 multipart 专用,沿用 Bearer 认证和审计;不参与 JSON 加密。请求体接收阶段最多接受文件限额加 64 KiB 表单开销(包括无 Content-Length 请求)。上传/下载正文不缓存进审计日志。 - 其他接口仍经过现有 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 容器访问,否则打开文件会下载失败。
验收
- 浏览器打开文档库,登录页是山峡化工文档库,看不到 Cloudreve 产品名和 Powered by。
- 测试账号能登录并看到文件列表。
- 新建或上传一份 docx,能在浏览器里打开编辑器并保存。
- 编辑器区域仍显示 OnlyOffice 标识。
- 门户任意角色登录后打开「文档库」,不再输入文档库密码;同一门户用户再次进入仍是同一个文档库账号,不同门户用户对应不同账号。
本机运行
- 文档库: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 标志。