Files
danyang-match/miniapp/pages/contact-consent/contact-consent.wxml
T
WorkBuddy d3735e3afa feat(matchmaker,contactauth): 受控联系授权机制立项落地(OQ-MATCHMAKER-003 / DEC-MATCHMAKER-003 B1 例外通道)
后端:
- V056 matchmaker_contact_authorizations 表:channel CHECK(phone/offline_meeting/full_contact)、六态状态机(pending_approval→pending_consent→active→expired/revoked, →rejected)、部分唯一索引 uq_mm_contact_auth_active 防同红娘-同用户-同渠道多 ACTIVE、双态惰性收敛(active 过期 + pending_consent 超同意窗口)
- ContactAuthorizationConfig 五 canonical key(matchmaker.contact.*):enabled 代码缺省 false fail-safe(yml 显式 true)/approver-authorities 双岗并列/consent-deadline-hours 72/default-validity-days 7/retention-days 365,全部 DEFAULT+CONFIG 待产品+法务终审
- ContactAuthorizationPolicy.assertContactAllowed(404 化 deny 先审计后 404) + canContact 徽标查询
- ContactAuthorizationService:request(须有效分配+purpose 必填)/approve(权限码动态判定∈配置+组长组织范围)/consent(用户本人,仅 pending_consent)/decline/revoke(reason 必填)/disclose(唯一披露出口:enabled fail-safe→assertActiveAssignment→assertContactAllowed→仅返回 phone/disclosedAt/authorizationId 三键,每次落 SensitiveAccessLog user_phone_disclosure,phone 不落应用日志)
- 双控制器:运营端 /operator/matchmaker/contact-authorizations + C 端 /contact-authorizations(UserPrincipal 归属校验,独立端点无预同意参数),不碰 SecurityConfig

守卫翻转(机械锁强制复审机制按设计生效):
- MatchmakerContactGuardTest 由「锁不存在」翻转为「锁新契约」五条:回显白名单类收敛/端点前缀收敛(受治理三包)/到期语义/consent 独立性三端扫描(后端+miniapp+admin-web,修复原只扫后端的预同意参数逃逸缺口)/ReferralService 白名单与无 @Scheduled 保留
- run-backend-contracts CURATED 18→20

前端:
- miniapp 新页 pages/contact-consent(目的/渠道/窗口明示+独立同意拒绝按钮无预勾选,app.json 第 64 页) + 红娘工作台申请/列表/撤销
- admin-web「联系授权审批」tab(审批岗队列+本人授权撤销,枚举码中文映射)

验证:mvn verify 895/895(3 skip)、UI 契约 24/24(64 页)、后端契约门禁 228/CURATED 20、小程序真编译 87 WXML 0 失败;负向注入 5(工程师)+2(QA 不同落点)判红→还原复绿;QA 抓 disclose 键数收敛断言缺口已补并回归;QA fresh eyes PASS 0 P0/P1
2026-10-11 13:08:02 +08:00

40 lines
2.0 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- 联系授权确认页(ZC-MM-003 / B1:单独明示同意,无预勾选、无捆绑) -->
<view class="page">
<view class="intro">
<view class="intro-title">红娘联系授权</view>
<view class="intro-text">红娘经平台审批后向你发起联系授权申请。你可以单独决定同意或拒绝,同意后授权在有效期内生效,到期自动失效,也可随时被撤销。</view>
</view>
<!-- 待确认队列 -->
<view class="section" wx:if="{{pendingConsent.length > 0}}">
<view class="section-title">待你确认({{pendingConsent.length}})</view>
<view class="card" wx:for="{{pendingConsent}}" wx:key="id">
<view class="row"><text class="label">授权渠道</text><text class="value strong">{{item.channelLabel}}</text></view>
<view class="row"><text class="label">授权目的</text><text class="value">{{item.purpose}}</text></view>
<view class="row"><text class="label">确认截止</text><text class="value">{{item.expireText}}</text></view>
<view class="actions">
<button class="btn decline" data-id="{{item.id}}" bindtap="onDecline">拒绝</button>
<button class="btn consent" data-id="{{item.id}}" bindtap="onConsent">同意</button>
</view>
</view>
</view>
<view class="empty" wx:if="{{!loading && pendingConsent.length === 0}}">
<view class="empty-text">暂无待确认的授权申请</view>
</view>
<!-- 历史记录 -->
<view class="section" wx:if="{{history.length > 0}}">
<view class="section-title">历史记录</view>
<view class="card slim" wx:for="{{history}}" wx:key="id">
<view class="row"><text class="label">渠道</text><text class="value">{{item.channelLabel}}</text></view>
<view class="row"><text class="label">目的</text><text class="value">{{item.purpose}}</text></view>
<view class="row"><text class="label">状态</text><text class="value">{{item.statusLabel}}</text></view>
</view>
</view>
<view class="loading-wrap" wx:if="{{loading}}">
<text class="loading-text">加载中...</text>
</view>
</view>