diff --git a/miniapp/components/matchmaker-card/index.wxml b/miniapp/components/matchmaker-card/index.wxml index e78bcdf..821eccb 100644 --- a/miniapp/components/matchmaker-card/index.wxml +++ b/miniapp/components/matchmaker-card/index.wxml @@ -20,7 +20,7 @@ - + () Page({ data: { - services: [] as Array<{ type: string; name: string; description: string; icon: string }> + services: [] as Array<{ type: string; name: string; description: string; iconAsset: string }>, + loading: true, + serviceEnabled: false, + disabledReason: '', }, onLoad() { @@ -16,17 +19,46 @@ Page({ header: { 'Authorization': `Bearer ${app.globalData.token}` } }); if (res.statusCode === 200 && res.data.success) { - this.setData({ services: res.data.data }); + const iconMap: Record = { + relationship_guidance: '/assets/icons/home/counseling.png', + emotional_support: '/assets/icons/home/matchmaker.png', + premarital_guidance: '/assets/icons/home/premarital.png', + anti_fraud_guidance: '/assets/icons/home/anti-fraud.png', + }; + this.setData({ + services: (res.data.data || []).map((item: any) => ({ + ...item, + iconAsset: iconMap[item.type] || '/assets/icons/home/counseling.png', + })), + loading: false, + serviceEnabled: true, + }); + return; } + this.setData({ loading: false, serviceEnabled: false, disabledReason: res.data?.message || '服务暂不可用' }); } catch (e) { console.error('加载咨询介绍失败', e); + this.setData({ loading: false, serviceEnabled: false, disabledReason: '暂时无法获取服务状态' }); } }, onSelectService(e: any) { + if (!this.data.serviceEnabled) { + wx.showToast({ title: this.data.disabledReason || '服务暂不可用', icon: 'none' }); + return; + } const type = e.currentTarget.dataset.type; wx.navigateTo({ url: `/pages/counseling-request/counseling-request?type=${type}` }); + }, + + onBook() { + const type = this.data.services[0]?.type || 'relationship_guidance'; + this.onSelectService({ currentTarget: { dataset: { type } } }); + }, + + onMyServices() { + wx.navigateTo({ url: '/pages/my-counseling/my-counseling' }); } }); diff --git a/miniapp/pages/counseling-intro/counseling-intro.wxml b/miniapp/pages/counseling-intro/counseling-intro.wxml index b83d73b..bbdae79 100644 --- a/miniapp/pages/counseling-intro/counseling-intro.wxml +++ b/miniapp/pages/counseling-intro/counseling-intro.wxml @@ -1 +1,19 @@ -U55 公益婚恋咨询当关系让你困扰,可以认真谈一谈由婚恋咨询人员提供关系与情绪支持;咨询服务与公益红娘服务彼此独立。我们可以提供的帮助选择最接近当前需要的方向{{index+1}}{{item.name}}{{item.description}}›咨询内容会按敏感信息保护。公益红娘不能查看咨询正文,咨询人员也只能处理明确分配给自己的服务。 \ No newline at end of file + + + + 服务状态{{loading ? '获取中' : (serviceEnabled ? '可预约' : disabledReason)}} + + 我们可以提供的帮助选择最接近当前需要的方向 + + + + + {{item.name}}{{item.description}} + + + + + 咨询内容按敏感信息保护。公益红娘不能查看咨询正文,咨询人员仅处理明确分配给自己的服务。 + + 我的咨询预约咨询 + diff --git a/miniapp/pages/matchmaker/matchmaker.json b/miniapp/pages/matchmaker/matchmaker.json index 683ee46..456c54f 100644 --- a/miniapp/pages/matchmaker/matchmaker.json +++ b/miniapp/pages/matchmaker/matchmaker.json @@ -7,6 +7,7 @@ "ui-matchmaker-card": "/components/matchmaker-card/index", "ui-button": "/components/button/index", "ui-loading": "/components/loading/index", - "ui-empty": "/components/empty/index" + "ui-empty": "/components/empty/index", + "ui-service-hero": "/components/service-hero/index" } } diff --git a/miniapp/pages/matchmaker/matchmaker.wxml b/miniapp/pages/matchmaker/matchmaker.wxml index 4039bb0..8c8b4fa 100644 --- a/miniapp/pages/matchmaker/matchmaker.wxml +++ b/miniapp/pages/matchmaker/matchmaker.wxml @@ -1,89 +1,39 @@ - - - + + + - - - + + 公益免费不收取服务费用 + 真实匹配基于审核资料推荐 + 隐私保护由你本人决定意向 + - - - - - - - - - - - - - {{activeService ? '提交新的红娘需求' : '申请红娘帮助'}} + + + 暂未申请红娘服务提交需求后,工作人员会根据你的择偶条件提供公益协助 - - - - - - - {{item}} - - - - 公益服务,全程免费。 - + + + {{item}} - - - - 公益红娘服务 - {{item.statusText || item.status}} - - - 红娘:{{item.matchmakerName}} - - - 最近跟进:{{item.lastFollowUpAtText || item.lastFollowUpAt}} - + + 公益红娘服务红娘:{{item.matchmakerName}} + {{item.statusText || item.status}} + + + {{activeService ? '提交新的红娘需求' : '申请红娘服务'}} diff --git a/miniapp/pages/matchmaker/matchmaker.wxss b/miniapp/pages/matchmaker/matchmaker.wxss index 973e51a..ecd11a1 100644 --- a/miniapp/pages/matchmaker/matchmaker.wxss +++ b/miniapp/pages/matchmaker/matchmaker.wxss @@ -1,113 +1 @@ -/** - * 公益红娘服务页 U33 - */ - -.mm-page { - min-height: 100vh; - background: var(--color-bg-page); - padding-bottom: var(--spacing-section); -} - -/* ============ 加载 ============ */ -.mm-loading { - padding: var(--spacing-3) var(--spacing-page-x); -} - -.mm-body { - padding-top: var(--spacing-2); -} - -.mm-section { - padding: var(--spacing-2) var(--spacing-page-x); -} - -/* ============ 空状态 ============ */ -.mm-empty { - padding-top: 80rpx; -} - -/* ============ 红娘能力说明 ============ */ -.mm-cap { - margin-top: var(--spacing-2); -} - -.mm-cap__list { - margin-top: var(--spacing-3); -} - -.mm-cap__item { - display: flex; - align-items: flex-start; - gap: var(--spacing-2); - padding: var(--spacing-1) 0; -} - -.mm-cap__dot { - width: 12rpx; - height: 12rpx; - margin-top: 14rpx; - border-radius: 50%; - background: var(--color-primary); - flex-shrink: 0; -} - -.mm-cap__text { - flex: 1; - font-size: var(--font-size-sm); - color: var(--color-text-secondary); - line-height: var(--line-height-relaxed); -} - -.mm-cap__note { - margin-top: var(--spacing-3); - padding-top: var(--spacing-3); - border-top: var(--border-width) solid var(--color-divider); - font-size: var(--font-size-xs); - color: var(--color-success); -} - -/* ============ 历史服务 ============ */ -.mm-history { - display: flex; - flex-direction: column; - gap: var(--spacing-2); - margin-top: var(--spacing-2); -} - -.mm-history__item { - padding: var(--spacing-3); -} - -.mm-history__row { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: var(--spacing-1); -} - -.mm-history__title { - font-size: var(--font-size-md); - font-weight: var(--font-weight-semibold); - color: var(--color-text-primary); -} - -.mm-history__status { - font-size: var(--font-size-xs); - padding: var(--spacing-1) var(--spacing-2); - border-radius: var(--radius-sm); - background: var(--color-bg-disabled); - color: var(--color-text-tertiary); -} - -.mm-history__status--completed, -.mm-history__status--cancelled { - background: var(--color-bg-disabled); - color: var(--color-text-disabled); -} - -.mm-history__meta { - font-size: var(--font-size-xs); - color: var(--color-text-tertiary); - line-height: var(--line-height-normal); - margin-top: var(--spacing-1); -} +.mm-page{min-height:100vh;padding-bottom:calc(136rpx + env(safe-area-inset-bottom));background:#F4F5FA}.mm-promises{position:relative;z-index:2;display:grid;grid-template-columns:repeat(3,1fr);margin:-22rpx 24rpx 0;padding:22rpx 8rpx;border-radius:28rpx;background:#fff;box-shadow:var(--mini-shadow)}.mm-promise{display:flex;flex-direction:column;align-items:center;padding:0 8rpx;text-align:center;color:#8A8FA4;font-size:17rpx;line-height:1.35}.mm-promise image{width:46rpx;height:46rpx;margin-bottom:8rpx}.mm-promise__title{margin-bottom:4rpx;color:#303654;font-size:21rpx;font-weight:650}.mm-loading{padding:30rpx 24rpx}.mm-body{padding-top:8rpx}.mm-section{padding:8rpx 24rpx}.mm-no-service{display:flex;align-items:center;gap:18rpx;margin-top:10rpx;padding:24rpx;border-radius:26rpx;background:#fff;box-shadow:0 8rpx 28rpx rgba(35,35,95,.06)}.mm-no-service image{width:68rpx;height:68rpx}.mm-no-service>view{display:flex;flex:1;flex-direction:column}.mm-no-service__title{color:#283056;font-size:25rpx;font-weight:650}.mm-no-service__desc{margin-top:7rpx;color:#858A9E;font-size:20rpx;line-height:1.5}.mm-capability-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:14rpx;margin-top:10rpx}.mm-capability{display:flex;align-items:center;gap:12rpx;min-height:88rpx;padding:16rpx;border-radius:22rpx;background:#fff;color:#555D79;font-size:20rpx;line-height:1.4;box-shadow:0 8rpx 24rpx rgba(35,35,95,.05)}.mm-capability image{width:36rpx;height:36rpx;flex:none}.mm-history{overflow:hidden;margin-top:10rpx;border-radius:24rpx;background:#fff}.mm-history__item{display:flex;align-items:center;min-height:92rpx;padding:0 20rpx;border-bottom:1rpx solid #EFF0F5}.mm-history__item:last-child{border-bottom:0}.mm-history__item>view{display:flex;flex:1;flex-direction:column}.mm-history__title{color:#303654;font-size:23rpx;font-weight:600}.mm-history__meta{margin-top:5rpx;color:#8A8FA4;font-size:18rpx}.mm-history__status{margin-right:8rpx;color:#8A6F91;font-size:19rpx}.mm-history__item>image{width:24rpx;height:24rpx}.mm-fixed-action{position:fixed;z-index:100;right:0;bottom:0;left:0;padding:18rpx 24rpx calc(18rpx + env(safe-area-inset-bottom));border-top:1rpx solid #EFF0F5;background:rgba(255,255,255,.96)}.mm-apply{display:flex;align-items:center;justify-content:center;height:88rpx;border-radius:44rpx;background:linear-gradient(135deg,var(--mini-accent-coral),var(--mini-accent-pink));color:#fff;font-size:28rpx;font-weight:650;box-shadow:0 10rpx 24rpx rgba(255,92,130,.22)} diff --git a/miniapp/pages/premarital-intro/premarital-intro.json b/miniapp/pages/premarital-intro/premarital-intro.json index 3df4be7..38d079a 100644 --- a/miniapp/pages/premarital-intro/premarital-intro.json +++ b/miniapp/pages/premarital-intro/premarital-intro.json @@ -1,4 +1,6 @@ { - "usingComponents": {}, + "usingComponents": { + "ui-service-hero": "/components/service-hero/index" + }, "navigationBarTitleText": "婚前辅导" } diff --git a/miniapp/pages/premarital-intro/premarital-intro.ts b/miniapp/pages/premarital-intro/premarital-intro.ts index 45aaef4..891f625 100644 --- a/miniapp/pages/premarital-intro/premarital-intro.ts +++ b/miniapp/pages/premarital-intro/premarital-intro.ts @@ -1,5 +1,52 @@ +import { request } from '../../utils/requestPromise' + +const app = getApp<{ globalData: { apiBase: string; token: string } }>() + Page({ + data: { + topics: [ + { title: '沟通与期望', description: '表达需求、倾听差异,形成共同约定', iconAsset: '/assets/icons/home/counseling.png' }, + { title: '家庭与责任', description: '讨论家庭角色与双方家庭关系', iconAsset: '/assets/icons/home/premarital.png' }, + { title: '财务与规划', description: '了解消费习惯并讨论未来安排', iconAsset: '/assets/icons/home/classroom.png' }, + { title: '冲突与修复', description: '学习处理分歧并建立修复方式', iconAsset: '/assets/icons/home/anti-fraud.png' }, + ], + loading: true, + serviceEnabled: false, + disabledReason: '', + }, + + onLoad() { + this.loadAvailability() + }, + + async loadAvailability() { + try { + const res = await request({ + url: `${app.globalData.apiBase}/counseling/services/intro`, + header: { Authorization: `Bearer ${app.globalData.token}` }, + }) + const services = res.statusCode === 200 && res.data.success ? (res.data.data || []) : [] + const serviceEnabled = services.some((item: any) => item.type === 'premarital_guidance') + this.setData({ + loading: false, + serviceEnabled, + disabledReason: serviceEnabled ? '' : (res.data?.message || '服务暂不可用'), + }) + } catch (error) { + console.error('加载婚前辅导服务状态失败', error) + this.setData({ loading: false, serviceEnabled: false, disabledReason: '暂时无法获取服务状态' }) + } + }, + onApply() { - wx.navigateTo({ url: '/pages/premarital-request/premarital-request' }); - } -}); + if (!this.data.serviceEnabled) { + wx.showToast({ title: this.data.disabledReason || '服务暂不可用', icon: 'none' }) + return + } + wx.navigateTo({ url: '/pages/premarital-request/premarital-request?type=premarital_guidance' }) + }, + + onMyServices() { + wx.navigateTo({ url: '/pages/my-counseling/my-counseling' }) + }, +}) diff --git a/miniapp/pages/premarital-intro/premarital-intro.wxml b/miniapp/pages/premarital-intro/premarital-intro.wxml index 3a82936..2c200d9 100644 --- a/miniapp/pages/premarital-intro/premarital-intro.wxml +++ b/miniapp/pages/premarital-intro/premarital-intro.wxml @@ -1 +1,18 @@ -U58 婚前辅导在进入婚姻前,把重要的事认真谈清楚帮助双方讨论共同生活、家庭责任与沟通方式,可邀请伴侣共同参与。辅导内容沟沟通与期望表达需求、倾听差异,形成可以共同遵守的约定家家庭与责任讨论家庭角色、财务安排与双方家庭关系伴共同生活对生活方式、未来计划和冲突处理建立共识双方共同参与效果更好,但必须基于自愿,不会因为一方申请而自动通知或要求另一方参加。申请婚前辅导 \ No newline at end of file + + + + 服务状态{{loading ? '获取中' : (serviceEnabled ? '可预约' : disabledReason)}} + + 辅导内容科学指导,走向更稳的幸福 + + + + {{item.title}}{{item.description}} + + + + + 双方共同参与效果更好,但必须基于自愿;不会因为一方申请而自动通知或要求另一方参加。 + + 服务记录预约辅导 + diff --git a/miniapp/styles/service-page.wxss b/miniapp/styles/service-page.wxss index 7148733..d77bc3f 100644 --- a/miniapp/styles/service-page.wxss +++ b/miniapp/styles/service-page.wxss @@ -1 +1,3 @@ -page{background:var(--color-bg-page)}.service-page{min-height:100vh;padding-bottom:calc(140rpx + env(safe-area-inset-bottom))}.hero{padding:44rpx 32rpx 54rpx;background:linear-gradient(140deg,var(--color-primary-lighter),#FFF8EE);position:relative;overflow:hidden}.hero:after{content:'缘';position:absolute;right:24rpx;top:-34rpx;font-size:180rpx;font-weight:700;color:rgba(233,107,107,.08)}.eyebrow{display:inline-flex;padding:7rpx 14rpx;border-radius:999rpx;background:rgba(255,255,255,.72);color:var(--color-primary);font-size:21rpx}.hero-title{display:block;margin-top:18rpx;font-size:40rpx;font-weight:700;line-height:1.35}.hero-desc{display:block;width:82%;margin-top:14rpx;font-size:25rpx;color:var(--color-text-secondary);line-height:1.7}.content{padding:0 var(--spacing-page-x)}.block{margin-top:var(--spacing-section)}.block-title{display:block;font-size:31rpx;font-weight:650}.block-subtitle{display:block;margin-top:8rpx;font-size:23rpx;color:var(--color-text-tertiary)}.card{margin-top:18rpx;padding:28rpx;background:var(--color-bg-card);border:1rpx solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-card)}.feature-row,.menu-row,.record-row{display:flex;align-items:center;gap:20rpx;min-height:112rpx;padding:18rpx 0;border-bottom:1rpx solid var(--color-divider)}.feature-row:last-child,.menu-row:last-child,.record-row:last-child{border-bottom:0}.feature-icon{width:72rpx;height:72rpx;display:flex;align-items:center;justify-content:center;flex:none;border-radius:22rpx;background:var(--color-primary-light);color:var(--color-primary);font-weight:700}.feature-copy{flex:1;min-width:0}.feature-title{display:block;font-size:28rpx;font-weight:600}.feature-desc,.meta{display:block;margin-top:7rpx;font-size:23rpx;color:var(--color-text-tertiary);line-height:1.55}.arrow{font-size:40rpx;color:var(--color-text-disabled)}.tag{display:inline-flex;margin-right:10rpx;margin-top:10rpx;padding:6rpx 13rpx;border-radius:999rpx;background:var(--color-success-light);color:var(--color-success);font-size:20rpx}.tag.warning{background:var(--color-warning-light);color:var(--color-warning)}.primary-btn,.secondary-btn{height:88rpx;display:flex;align-items:center;justify-content:center;border-radius:44rpx;font-size:28rpx;font-weight:600}.primary-btn{background:var(--color-primary);color:var(--color-text-inverse)}.secondary-btn{background:var(--color-primary-light);color:var(--color-primary)}.fixed-action{position:fixed;left:0;right:0;bottom:0;padding:18rpx var(--spacing-page-x) calc(18rpx + env(safe-area-inset-bottom));background:rgba(255,255,255,.96);border-top:1rpx solid var(--color-divider);z-index:100}.field{margin-top:26rpx}.label{display:block;margin-bottom:12rpx;font-size:25rpx;font-weight:600}.input,.select-box,.textarea{width:100%;box-sizing:border-box;background:#FCFAF8;border:1rpx solid var(--color-border);border-radius:var(--radius-md);font-size:26rpx}.input,.select-box{height:88rpx;padding:0 24rpx;display:flex;align-items:center}.textarea{min-height:180rpx;padding:22rpx}.notice{margin-top:20rpx;padding:22rpx;border-radius:var(--radius-md);background:#F3F7FC;color:var(--color-text-secondary);font-size:23rpx;line-height:1.65}.empty-panel{text-align:center;padding:70rpx 30rpx}.empty-symbol{width:96rpx;height:96rpx;margin:auto;display:flex;align-items:center;justify-content:center;border-radius:30rpx;background:var(--color-primary-light);color:var(--color-primary);font-size:36rpx;font-weight:700}.empty-title{display:block;margin-top:22rpx;font-size:30rpx;font-weight:600}.article-card{margin-top:18rpx;background:var(--color-bg-card);border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-card)}.article-cover{height:220rpx;padding:24rpx;background:linear-gradient(135deg,#F5E5DE,#F9F1E8);display:flex;align-items:flex-end}.article-cover text{font-size:42rpx;color:rgba(125,76,63,.52);font-weight:700}.article-body{padding:24rpx}.article-title{display:block;font-size:29rpx;font-weight:650;line-height:1.45}.article-meta{display:block;margin-top:10rpx;font-size:22rpx;color:var(--color-text-tertiary)}.article-content{padding:32rpx;background:var(--color-bg-card);font-size:28rpx;line-height:1.9;color:var(--color-text-secondary)}.article-content .lead{display:block;font-size:31rpx;color:var(--color-text-primary);font-weight:600;margin-bottom:24rpx}.danger-card{background:#FFF8F4;border-color:#F5DED2}.danger-card .feature-icon{background:#FFF0EA;color:#C85D43}@media(max-width:340px){.hero-title{font-size:36rpx}.hero-desc{width:92%}} \ No newline at end of file +page{background:var(--color-bg-page)}.service-page{min-height:100vh;padding-bottom:calc(140rpx + env(safe-area-inset-bottom))}.hero{padding:44rpx 32rpx 54rpx;background:linear-gradient(140deg,var(--color-primary-lighter),#FFF8EE);position:relative;overflow:hidden}.eyebrow{display:inline-flex;padding:7rpx 14rpx;border-radius:999rpx;background:rgba(255,255,255,.72);color:var(--color-primary);font-size:21rpx}.hero-title{display:block;margin-top:18rpx;font-size:40rpx;font-weight:700;line-height:1.35}.hero-desc{display:block;width:82%;margin-top:14rpx;font-size:25rpx;color:var(--color-text-secondary);line-height:1.7}.content{padding:0 var(--spacing-page-x)}.block{margin-top:var(--spacing-section)}.block-title{display:block;font-size:31rpx;font-weight:650}.block-subtitle{display:block;margin-top:8rpx;font-size:23rpx;color:var(--color-text-tertiary)}.card{margin-top:18rpx;padding:28rpx;background:var(--color-bg-card);border:1rpx solid var(--color-border);border-radius:var(--radius-lg);box-shadow:var(--shadow-card)}.feature-row,.menu-row,.record-row{display:flex;align-items:center;gap:20rpx;min-height:112rpx;padding:18rpx 0;border-bottom:1rpx solid var(--color-divider)}.feature-row:last-child,.menu-row:last-child,.record-row:last-child{border-bottom:0}.feature-icon{width:72rpx;height:72rpx;display:flex;align-items:center;justify-content:center;flex:none;border-radius:22rpx;background:var(--color-primary-light);color:var(--color-primary);font-weight:700}.feature-copy{flex:1;min-width:0}.feature-title{display:block;font-size:28rpx;font-weight:600}.feature-desc,.meta{display:block;margin-top:7rpx;font-size:23rpx;color:var(--color-text-tertiary);line-height:1.55}.arrow{font-size:40rpx;color:var(--color-text-disabled)}.tag{display:inline-flex;margin-right:10rpx;margin-top:10rpx;padding:6rpx 13rpx;border-radius:999rpx;background:var(--color-success-light);color:var(--color-success);font-size:20rpx}.tag.warning{background:var(--color-warning-light);color:var(--color-warning)}.primary-btn,.secondary-btn{height:88rpx;display:flex;align-items:center;justify-content:center;border-radius:44rpx;font-size:28rpx;font-weight:600}.primary-btn{background:linear-gradient(135deg,var(--mini-accent-coral),var(--mini-accent-pink));color:var(--color-text-inverse);box-shadow:0 10rpx 24rpx rgba(255,92,130,.22)}.primary-btn.disabled{background:#E6E8EF;color:#989DAF;box-shadow:none}.secondary-btn{background:var(--color-primary-light);color:var(--color-primary)}.fixed-action{position:fixed;left:0;right:0;bottom:0;padding:18rpx var(--spacing-page-x) calc(18rpx + env(safe-area-inset-bottom));background:rgba(255,255,255,.96);border-top:1rpx solid var(--color-divider);z-index:100}.field{margin-top:26rpx}.label{display:block;margin-bottom:12rpx;font-size:25rpx;font-weight:600}.input,.select-box,.textarea{width:100%;box-sizing:border-box;background:#FCFAF8;border:1rpx solid var(--color-border);border-radius:var(--radius-md);font-size:26rpx}.input,.select-box{height:88rpx;padding:0 24rpx;display:flex;align-items:center}.textarea{min-height:180rpx;padding:22rpx}.notice{margin-top:20rpx;padding:22rpx;border-radius:var(--radius-md);background:#F3F7FC;color:var(--color-text-secondary);font-size:23rpx;line-height:1.65}.empty-panel{text-align:center;padding:70rpx 30rpx}.empty-symbol{width:96rpx;height:96rpx;margin:auto;display:flex;align-items:center;justify-content:center;border-radius:30rpx;background:var(--color-primary-light);color:var(--color-primary);font-size:36rpx;font-weight:700}.empty-title{display:block;margin-top:22rpx;font-size:30rpx;font-weight:600}.article-card{margin-top:18rpx;background:var(--color-bg-card);border-radius:var(--radius-lg);overflow:hidden;box-shadow:var(--shadow-card)}.article-cover{height:220rpx;padding:24rpx;background:linear-gradient(135deg,#F5E5DE,#F9F1E8);display:flex;align-items:flex-end}.article-cover text{font-size:42rpx;color:rgba(125,76,63,.52);font-weight:700}.article-body{padding:24rpx}.article-title{display:block;font-size:29rpx;font-weight:650;line-height:1.45}.article-meta{display:block;margin-top:10rpx;font-size:22rpx;color:var(--color-text-tertiary)}.article-content{padding:32rpx;background:var(--color-bg-card);font-size:28rpx;line-height:1.9;color:var(--color-text-secondary)}.article-content .lead{display:block;font-size:31rpx;color:var(--color-text-primary);font-weight:600;margin-bottom:24rpx}.danger-card{background:#FFF8F4;border-color:#F5DED2}.danger-card .feature-icon{background:#FFF0EA;color:#C85D43}@media(max-width:340px){.hero-title{font-size:36rpx}.hero-desc{width:92%}} + +.service-shell{min-height:100vh;padding-bottom:calc(136rpx + env(safe-area-inset-bottom));background:#F4F5FA}.service-content{padding:8rpx 24rpx 36rpx}.service-status{display:flex;align-items:center;justify-content:space-between;margin-top:24rpx;padding:20rpx 24rpx;border-radius:22rpx;background:#fff;box-shadow:0 8rpx 26rpx rgba(35,35,95,.06)}.service-status__label{color:#7B8198;font-size:21rpx}.service-status__value{padding:6rpx 14rpx;border-radius:18rpx;background:#EAF8F2;color:#329472;font-size:19rpx;font-weight:650}.service-status__value.disabled{background:#FFF0F0;color:#D45A60}.service-topics{display:grid;grid-template-columns:repeat(2,1fr);gap:16rpx;margin-top:18rpx}.service-topic{min-height:148rpx;padding:20rpx;border-radius:24rpx;background:#fff;box-shadow:0 8rpx 26rpx rgba(35,35,95,.06)}.service-topic__icon{display:flex;align-items:center;justify-content:center;width:54rpx;height:54rpx;border-radius:17rpx;background:#FFF0F5}.service-topic__icon image{width:34rpx;height:34rpx}.service-topic__title{display:block;margin-top:13rpx;color:#283056;font-size:24rpx;font-weight:650}.service-topic__desc{display:block;margin-top:6rpx;color:#858A9E;font-size:19rpx;line-height:1.45}.service-actions{display:flex;gap:14rpx}.service-actions .secondary-btn{width:190rpx;flex:none}.service-actions .primary-btn{flex:1}.privacy-note{display:flex;align-items:flex-start;gap:14rpx;margin-top:22rpx;padding:20rpx;border-radius:22rpx;background:#F1F4FF;color:#69718E;font-size:20rpx;line-height:1.55}.privacy-note image{width:34rpx;height:34rpx;flex:none} diff --git a/ui-tests/miniapp-reference-contracts.mjs b/ui-tests/miniapp-reference-contracts.mjs index 77d6689..353ed7b 100644 --- a/ui-tests/miniapp-reference-contracts.mjs +++ b/ui-tests/miniapp-reference-contracts.mjs @@ -84,6 +84,25 @@ for (const label of ['我的红娘', '我的咨询', '我的活动', '我的预 assert.ok(mineTemplate.includes(label), `我的页缺少入口 ${label}`) } +const matchmakerTemplate = read('miniapp/pages/matchmaker/matchmaker.wxml') +const matchmakerLogic = read('miniapp/pages/matchmaker/matchmaker.js') +const counselingTemplate = read('miniapp/pages/counseling-intro/counseling-intro.wxml') +const premaritalTemplate = read('miniapp/pages/premarital-intro/premarital-intro.wxml') +for (const template of [matchmakerTemplate, counselingTemplate, premaritalTemplate]) { + assert.match(template, /ui-service-hero/, 'B 组服务页必须统一使用 service-hero') +} +for (const label of ['公益免费', '真实匹配', '隐私保护']) { + assert.ok(matchmakerTemplate.includes(label), `红娘页缺少服务承诺 ${label}`) +} +assert.match(matchmakerTemplate, /activeService|申请状态/, '红娘页缺少申请状态') +assert.doesNotMatch(matchmakerLogic, /matchStore\.(?:like|pass)\s*\(/, '红娘不得替用户 Like 或 Pass') +assert.match(counselingTemplate, /service-topics/, '咨询页缺少四项咨询主题') +assert.match(counselingTemplate, /预约咨询/, '咨询页缺少预约按钮') +assert.match(counselingTemplate, /服务状态/, '咨询页缺少服务状态') +assert.match(premaritalTemplate, /service-topics/, '婚前辅导页缺少四项辅导主题') +assert.match(premaritalTemplate, /预约辅导/, '婚前辅导页缺少预约按钮') +assert.match(premaritalTemplate, /服务状态/, '婚前辅导页缺少服务状态') + const theme = read('miniapp/app.wxss') for (const token of [ '--mini-night-start',