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 || '')