diff --git a/docs/membership-contract.md b/docs/membership-contract.md index 564c9e7..fa28c5c 100644 --- a/docs/membership-contract.md +++ b/docs/membership-contract.md @@ -33,9 +33,15 @@ 1. 应用迁移 `20261028090000_membership_contracts`(仅新增表与 `orders.contract_accepted_at` 列),生成 Prisma Client,再发布 shared/server。 2. 新增依赖 `pdfkit`;中文字体随服务端发布在 `packages/server/assets/fonts/NotoSansSC-Regular.otf`(SIL OFL)。可用环境变量 `CONTRACT_PDF_FONT_PATH` 指向其他字体。 3. 小程序后台「开发管理 - 服务器域名」需将 API 域名加入 **downloadFile 合法域名**,否则无法导出 PDF。 -4. 发布前由馆主在「管理中心 - 合同签署设置」填写经营者名称、统一社会信用代码、经营者、联系电话、经营场所,并手写经营者签名。未完善时学员可查看但不能签署。 +4. 发布前由馆主在「管理中心 - 合同签署设置」填写经营者名称、统一社会信用代码、经营者、联系电话、经营场所。默认合同专用章见下方,经营者手写签名选填。未完善基本信息时学员可查看但不能签署。 5. 发布新版小程序。旧版小程序购卡不会勾选同意,但仍会生成待签合同,并在新版个人中心提示签署。 +### 默认乙方合同章 + +- 场馆提供的原图保存在 `packages/server/assets/contracts/party-b-seal.jpg`,发布服务端时须连同 `assets/` 一起部署(与 PDF 字体一致)。无需新增环境变量或数据库迁移。 +- 合同设置显示默认章;购买前范本、待签合同及签署阅读页在乙方签章区展示,经营者手写签名仍可选填并同时展示。 +- 签署时合同章以 data URI 写入合同正文 `document.partyBSeal`,纳入 SHA-256 校验并冻结;详情和 PDF 只使用该快照。替换默认图片后,仅影响未签合同,已签旧合同不追补印章。 + ## 回退 - 服务端回退到上一版本即可,新增表保留不影响旧代码;不要删除 `membership_contracts`、`contract_events`,它们是签署凭证。 diff --git a/packages/app/src/components/ContractDocumentView.vue b/packages/app/src/components/ContractDocumentView.vue index d1c95e1..8004eea 100644 --- a/packages/app/src/components/ContractDocumentView.vue +++ b/packages/app/src/components/ContractDocumentView.vue @@ -24,17 +24,19 @@ {{ document.commitment }} - + 甲方(签名) - - {{ signature.signerName }} + + 待会员签署 + {{ signature.signerName }} {{ signedAtText }} 乙方(签章) - - {{ signature.partyBName }} + + + {{ partyBName }} {{ signedAtText }} @@ -59,6 +61,8 @@ const groups = computed(() => [ ]) const signedAtText = computed(() => props.signature ? `签署于 ${formatDateTimeFull(props.signature.signedAt)}` : '') +const partyBName = computed(() => props.signature?.partyBName + || props.document.partyB.find(row => row.label === '经营者名称')?.value || '')