onlyoffice: # 浏览器加载编辑器 api.js 的地址。注意这是**浏览器视角**的地址,不是容器视角—— # 容器名 cx-onlyoffice 浏览器解析不了,本机开发走 override 发布的 20000 端口。 # 交付环境改为 Nginx 反代的 https://<域名>/onlyoffice(方案 §8.4)。 ds-public-url: ${ONLYOFFICE_DS_PUBLIC_URL:http://localhost:20000} # 给 DS 回源拉原始文档用(DS 视角)。路径 /api/file/Image/** 在 GatewayWhite # 硬编码白名单内,DS 无登录态也能取,靠 URL 上的 securityKey 票据鉴权。 # 宿主 java -jar 栈需覆盖为 http://host.docker.internal:30000(DS 在容器、网关在宿主)。 file-fetch-base-url: ${ONLYOFFICE_FILE_FETCH_BASE_URL:http://cx-gateway:30000} # 给 DS 回调后端用(DS 视角)。必须经网关——直连 30015 按 L042 会被 inner-auth 拒, # 而 DS 不是 JNPF 服务、注入不了 SA-SAME-TOKEN。回调路径已进网关白名单(平台补丁 #9)。 callback-base-url: ${ONLYOFFICE_CALLBACK_BASE_URL:http://cx-gateway:30000} # 后端反向拉取 DS 产物的地址(后端视角)。保存回调里 DS 给的下载 url 用的是它自己 # 视角的主机名,后端不一定能直连;配了本项就只保留其 path+query 换到这个主机上。 # 留空则原样使用 DS 给的 url。宿主 java -jar 栈需覆盖为 http://localhost:20000。 ds-internal-url: ${ONLYOFFICE_DS_INTERNAL_URL:http://cx-onlyoffice} # 与 DS 容器的 JWT_SECRET 同源(都读 .env 的 ONLYOFFICE_JWT_SECRET)。 # 后端用它签发编辑器 config,并校验 DS 回调的 Authorization: Bearer。 # 🔴 回调端点匿名可达(白名单放行),这个 secret 是它唯一的安全边界。 # 无默认值:缺失即启动失败,避免用空串静默跑起来后回调全被拒、且日志不明显。 jwt-secret: ${ONLYOFFICE_JWT_SECRET} # 编辑锁的心跳超时(分钟)。锁正常由 status 2/4 回调释放;浏览器崩溃等异常 # 场景下靠这个兜底,否则文档会永久锁死。见方案 §6.2。 lock-timeout-minutes: ${ONLYOFFICE_LOCK_TIMEOUT_MINUTES:30} # 编辑器里是否给下载/打印入口(「文件 → 下载为」「文件 → 打印」与顶栏右侧那两个图标)。 # 默认全关。 # ⚠️ 这两项只收界面入口,**不是安全边界**:/api/file/Image/** 在网关白名单内、只靠 # securityKey 票据鉴权,知道 URL 的人照样能把原文件拉走。真正的下载管控要落在文件服务层。 # 需要按人区分时,用 edit-permission 那套 bizModule→moduleId 登记表判 # moduleId::btn_download / btn_batchPrint(PermissionConst 里已有这两个码),机制现成。 allow-download: ${ONLYOFFICE_ALLOW_DOWNLOAD:false} allow-print: ${ONLYOFFICE_ALLOW_PRINT:false} # ELN 模板标注插件。公网基础地址从部署环境注入,release 由不可变发布目录决定。 plugins: definitions: eln-template-annotator: guid: asc.{2D6D6CB6-F6FC-45B7-8EC7-0CC1940F1A6F} version: 0.1.0 public-base-url: ${ONLYOFFICE_PLUGIN_PUBLIC_BASE_URL:http://localhost:4173/onlyoffice-plugins} release: ${ONLYOFFICE_PLUGIN_RELEASE:0.1.0-dev} api-base-url: ${ONLYOFFICE_PLUGIN_API_BASE_URL:http://localhost:30000} eln-template-filler: guid: asc.{7F4E8F35-5D66-47F8-A5B4-6AB3FAACF565} version: 0.1.0 public-base-url: ${ONLYOFFICE_PLUGIN_PUBLIC_BASE_URL:http://localhost:4173/onlyoffice-plugins} release: ${ONLYOFFICE_PLUGIN_RELEASE:0.1.0-dev} api-base-url: ${ONLYOFFICE_PLUGIN_API_BASE_URL:http://localhost:30000} scenes: - biz-scene: eln.template.annotate biz-module: eln.template plugin-codes: - eln-template-annotator autostart-plugin-code: eln-template-annotator disabled-plugin-guids: - asc.{AA2EA9B6-9EC2-415F-9762-634EE8D9A95E} - biz-scene: eln.template.fill biz-module: eln.template plugin-codes: - eln-template-filler autostart-plugin-code: eln-template-filler disabled-plugin-guids: - asc.{AA2EA9B6-9EC2-415F-9762-634EE8D9A95E} # ── 谁能编辑(里程碑 4,方案 §6.1)─────────────────────────────────────────── # 粒度是**菜单/按钮级**,和平台在线表单的单条更新端点一个口径(那边也只做 # StpUtil.checkPermission,数据范围只用于列表 WHERE)。权限码登录时已进 Sa-Token # 会话,判定纯本地、无远程调用。 # # 做不到「记录级」(这一条检验单该不该给这个人改)是有意为之:那要读业务表的班组/ # 负责人/流程状态,属于业务规则,biz-common 的准入规则禁止它含单一业务模块的专属逻辑。 # 需要记录级时,由业务模块自己判完再打开编辑器。 edit-permission: # 未登记的 bizModule(或请求压根没带 bizModule)时的取向。 # false(默认)= 放行编辑 + 一条 warn。兼容默认值:前端最简调用 # onlineUtils.openOfficeDocument({ file }) 并不传 bizModule,一上来就严格会 # 让所有既有调用方突然全变只读。 # true = 一律只读。**该登记的都登记完之后应当打开它**——否则「漏登记」的表现是 # 悄悄放行编辑,而不是能被人发现的报错。 strict: ${ONLYOFFICE_EDIT_PERMISSION_STRICT:false} # bizModule → 在线表单 moduleId 的登记表。业务侧自助加行,不用改 biz-common 代码。 # 用 List 不用 Map:Spring Boot Binder 对 Map 是合并语义、对 List 是整体替换, # 写成 Map 的话删掉一条登记根本不生效(audit 的 layer0 注册表踩过这个坑)。 # # ⚠️ require-btn-edit 是陷阱位:在线表单只有勾了「启用按钮权限」,用户权限表里才会有 # ::btn_edit。没启用却留 true,结果是**所有人都被降级只读**。 # 该表单没启用按钮权限时填 false,此时只校验菜单级权限。 # # modules: # - biz-module: lims_jianyan_baogao # module-id: '507748874527276549' # base_module.f_id # require-btn-edit: true modules: [] # ══ 2026-08-11:由 jnpf-audit.yaml 迁移而来 ══ # audit 搬入 biz-common、jnpf-audit-server 退役后,原 config/shared/jnpf-audit.yaml 已删除。 # 该文件里唯一的活配置就是下面这行日志级别,**必须跟着服务名一起迁移**: # logback-spring.xml 取的是 `log.level.` # (jnpf-biz-common-server/src/main/resources/logback-spring.xml:14 # ), # 服务名从 jnpf-audit 变成 jnpf-biz-common,原来那行 `log.level.jnpf-audit` 就再也不会被读到—— # 表现不是报错,而是**审计消费/落库链路的 log.info 被共享 logger.yaml 的 root: ERROR 静默压掉**。 # # 原 jnpf-audit.yaml 中另一段(AUDIT_EVENT 的 Spring Cloud Stream binding 为何必须移除) # 已随降级链第一级 MQ 一并作废,其历史论证转记于 # docs/handoff-2026-08-11-audit-into-biz-common.md,不在配置文件里留存。 log: level: # 共享 logger.yaml 把 log.level.root 压到 ERROR;本文件在 application.yml 的 # spring.config.import 列表里排在 logger.yaml 之后,优先级更高,这里覆盖回 INFO # 让审计消费/落库链路的 log.info 可见,不动共享文件。 jnpf-biz-common: INFO