feat: redesign public relationship services
This commit is contained in:
@@ -20,7 +20,7 @@
|
|||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<view wx:if="{{showRecommendations && service.status === 'in_service' || service.status === 'waiting_user'}}" class="ui-mm__footer">
|
<view wx:if="{{showRecommendations}}" class="ui-mm__footer">
|
||||||
<ui-button
|
<ui-button
|
||||||
variant="secondary"
|
variant="secondary"
|
||||||
size="md"
|
size="md"
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
.ui-mm {
|
.ui-mm {
|
||||||
background: var(--color-bg-card);
|
background: var(--color-bg-card);
|
||||||
border-radius: var(--radius-lg);
|
border-radius: 26rpx;
|
||||||
padding: var(--spacing-4);
|
padding: 24rpx;
|
||||||
margin-bottom: var(--spacing-3);
|
margin-top: 10rpx;
|
||||||
box-shadow: var(--shadow-card);
|
box-shadow: 0 8rpx 28rpx rgba(35,35,95,.06);
|
||||||
}
|
}
|
||||||
.ui-mm__header {
|
.ui-mm__header {
|
||||||
display: block;
|
display: block;
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
{
|
{
|
||||||
"usingComponents": {},
|
"usingComponents": {
|
||||||
|
"ui-service-hero": "/components/service-hero/index",
|
||||||
|
"ui-loading": "/components/loading/index"
|
||||||
|
},
|
||||||
"navigationBarTitleText": "公益婚恋咨询"
|
"navigationBarTitleText": "公益婚恋咨询"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,10 @@ import { request } from '../../utils/requestPromise'
|
|||||||
const app = getApp<{ globalData: { apiBase: string; token: string } }>()
|
const app = getApp<{ globalData: { apiBase: string; token: string } }>()
|
||||||
Page({
|
Page({
|
||||||
data: {
|
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() {
|
onLoad() {
|
||||||
@@ -16,17 +19,46 @@ Page({
|
|||||||
header: { 'Authorization': `Bearer ${app.globalData.token}` }
|
header: { 'Authorization': `Bearer ${app.globalData.token}` }
|
||||||
});
|
});
|
||||||
if (res.statusCode === 200 && res.data.success) {
|
if (res.statusCode === 200 && res.data.success) {
|
||||||
this.setData({ services: res.data.data });
|
const iconMap: Record<string, string> = {
|
||||||
|
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) {
|
} catch (e) {
|
||||||
console.error('加载咨询介绍失败', e);
|
console.error('加载咨询介绍失败', e);
|
||||||
|
this.setData({ loading: false, serviceEnabled: false, disabledReason: '暂时无法获取服务状态' });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
onSelectService(e: any) {
|
onSelectService(e: any) {
|
||||||
|
if (!this.data.serviceEnabled) {
|
||||||
|
wx.showToast({ title: this.data.disabledReason || '服务暂不可用', icon: 'none' });
|
||||||
|
return;
|
||||||
|
}
|
||||||
const type = e.currentTarget.dataset.type;
|
const type = e.currentTarget.dataset.type;
|
||||||
wx.navigateTo({
|
wx.navigateTo({
|
||||||
url: `/pages/counseling-request/counseling-request?type=${type}`
|
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' });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1 +1,19 @@
|
|||||||
<view class="service-page reference-page"><view class="hero"><text class="eyebrow">U55 公益婚恋咨询</text><text class="hero-title">当关系让你困扰,可以认真谈一谈</text><text class="hero-desc">由婚恋咨询人员提供关系与情绪支持;咨询服务与公益红娘服务彼此独立。</text></view><view class="content"><view class="block"><text class="block-title">我们可以提供的帮助</text><text class="block-subtitle">选择最接近当前需要的方向</text><view class="card"><view class="feature-row" wx:for="{{services}}" wx:key="type" bindtap="onSelectService" data-type="{{item.type}}"><view class="feature-icon">{{index+1}}</view><view class="feature-copy"><text class="feature-title">{{item.name}}</text><text class="feature-desc">{{item.description}}</text></view><text class="arrow">›</text></view></view></view><view class="notice">咨询内容会按敏感信息保护。公益红娘不能查看咨询正文,咨询人员也只能处理明确分配给自己的服务。</view></view></view>
|
<view class="service-shell app-page reference-page">
|
||||||
|
<ui-service-hero eyebrow="专业陪伴 · 严格保密" title="婚恋咨询" subtitle="倾听你的心声,陪你梳理关系与情绪困扰" image-src="/assets/service/counseling-hero.jpg" tone="rose" />
|
||||||
|
<view class="service-content">
|
||||||
|
<view class="service-status"><text class="service-status__label">服务状态</text><text class="service-status__value {{!serviceEnabled ? 'disabled' : ''}}">{{loading ? '获取中' : (serviceEnabled ? '可预约' : disabledReason)}}</text></view>
|
||||||
|
|
||||||
|
<view class="block"><text class="block-title">我们可以提供的帮助</text><text class="block-subtitle">选择最接近当前需要的方向</text>
|
||||||
|
<ui-loading wx:if="{{loading}}" mode="skeleton" rows="2" />
|
||||||
|
<view wx:else class="service-topics">
|
||||||
|
<view class="service-topic" wx:for="{{services}}" wx:key="type" bindtap="onSelectService" data-type="{{item.type}}">
|
||||||
|
<view class="service-topic__icon"><image src="{{item.iconAsset}}" mode="aspectFit" /></view>
|
||||||
|
<text class="service-topic__title">{{item.name}}</text><text class="service-topic__desc">{{item.description}}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="privacy-note"><image src="/assets/icons/home/anti-fraud.png" mode="aspectFit" /><text>咨询内容按敏感信息保护。公益红娘不能查看咨询正文,咨询人员仅处理明确分配给自己的服务。</text></view>
|
||||||
|
</view>
|
||||||
|
<view class="fixed-action"><view class="service-actions"><view class="secondary-btn" bindtap="onMyServices">我的咨询</view><view class="primary-btn {{!serviceEnabled ? 'disabled' : ''}}" bindtap="onBook">预约咨询</view></view></view>
|
||||||
|
</view>
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
"ui-matchmaker-card": "/components/matchmaker-card/index",
|
"ui-matchmaker-card": "/components/matchmaker-card/index",
|
||||||
"ui-button": "/components/button/index",
|
"ui-button": "/components/button/index",
|
||||||
"ui-loading": "/components/loading/index",
|
"ui-loading": "/components/loading/index",
|
||||||
"ui-empty": "/components/empty/index"
|
"ui-empty": "/components/empty/index",
|
||||||
|
"ui-service-hero": "/components/service-hero/index"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,89 +1,39 @@
|
|||||||
<!-- 公益红娘服务页 U33 -->
|
<view class="mm-page app-page reference-page">
|
||||||
<view class="mm-page reference-page">
|
<ui-nav-bar title="公益红娘" status-bar-height="{{statusBarHeight}}" nav-bar-height="{{navBarHeight}}" bind:back="onBack" />
|
||||||
<ui-nav-bar
|
<ui-service-hero eyebrow="专业牵线 · 公益助力" title="公益红娘" subtitle="认真倾听你的期待,帮助你认识更合适的人" image-src="/assets/service/matchmaker-hero.jpg" tone="rose" />
|
||||||
title="公益红娘"
|
|
||||||
status-bar-height="{{statusBarHeight}}"
|
|
||||||
nav-bar-height="{{navBarHeight}}"
|
|
||||||
bind:back="onBack"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<!-- 首次加载 -->
|
<view class="mm-promises">
|
||||||
<view wx:if="{{loading && !firstLoaded}}" class="mm-loading">
|
<view class="mm-promise"><image src="/assets/icons/home/matchmaker.png" mode="aspectFit" /><text class="mm-promise__title">公益免费</text><text>不收取服务费用</text></view>
|
||||||
<ui-loading mode="skeleton" rows="2" />
|
<view class="mm-promise"><image src="/assets/icons/home/find-object.png" mode="aspectFit" /><text class="mm-promise__title">真实匹配</text><text>基于审核资料推荐</text></view>
|
||||||
|
<view class="mm-promise"><image src="/assets/icons/home/anti-fraud.png" mode="aspectFit" /><text class="mm-promise__title">隐私保护</text><text>由你本人决定意向</text></view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
<view wx:if="{{loading && !firstLoaded}}" class="mm-loading"><ui-loading mode="skeleton" rows="2" /></view>
|
||||||
<view wx:else class="mm-body">
|
<view wx:else class="mm-body">
|
||||||
<!-- 进行中的服务 -->
|
|
||||||
<view wx:if="{{activeService}}" class="mm-section">
|
|
||||||
<ui-section-header title="我的服务" subtitle="当前进行中" />
|
|
||||||
<ui-matchmaker-card
|
|
||||||
service="{{activeService}}"
|
|
||||||
show-recommendations="{{showRecommendations}}"
|
|
||||||
bind:view="onViewService"
|
|
||||||
bind:recommendations="onViewRecommendations"
|
|
||||||
/>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 无活跃服务:空状态 + 申请入口 -->
|
|
||||||
<view wx:else class="mm-empty">
|
|
||||||
<ui-empty
|
|
||||||
title="还没有红娘服务"
|
|
||||||
description="公益红娘可以基于你的择偶条件,为你推荐合适的对象"
|
|
||||||
illustration="default"
|
|
||||||
actions="{{emptyActions}}"
|
|
||||||
bind:action="onEmptyAction"
|
|
||||||
/>
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<!-- 申请红娘帮助 CTA(无活跃服务时主入口;有活跃服务时仍可重新申请) -->
|
|
||||||
<view class="mm-section">
|
<view class="mm-section">
|
||||||
<ui-button
|
<ui-section-header title="申请状态" subtitle="红娘不会代替你表达喜欢" />
|
||||||
variant="{{activeService ? 'secondary' : 'primary'}}"
|
<ui-matchmaker-card wx:if="{{activeService}}" service="{{activeService}}" show-recommendations="{{showRecommendations}}" bind:view="onViewService" bind:recommendations="onViewRecommendations" />
|
||||||
size="lg"
|
<view wx:else class="mm-no-service"><image src="/assets/icons/home/matchmaker.png" mode="aspectFit" /><view><text class="mm-no-service__title">暂未申请红娘服务</text><text class="mm-no-service__desc">提交需求后,工作人员会根据你的择偶条件提供公益协助</text></view></view>
|
||||||
block
|
|
||||||
bind:tap="onApplyService"
|
|
||||||
>{{activeService ? '提交新的红娘需求' : '申请红娘帮助'}}</ui-button>
|
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 红娘能力说明(AGENTS 第 1 条:公益免费,无付费/会员差异化) -->
|
|
||||||
<view class="mm-section">
|
<view class="mm-section">
|
||||||
<view class="mm-cap card-base">
|
<ui-section-header title="红娘可以如何帮助" subtitle="陪伴沟通,尊重你的每次决定" />
|
||||||
<ui-section-header title="红娘能帮您什么?" />
|
<view class="mm-capability-grid">
|
||||||
<view class="mm-cap__list">
|
<view wx:for="{{capabilities}}" wx:key="*this" class="mm-capability"><image src="/assets/icons/home/counseling.png" mode="aspectFit" /><text>{{item}}</text></view>
|
||||||
<view wx:for="{{capabilities}}" wx:key="*this" class="mm-cap__item">
|
|
||||||
<view class="mm-cap__dot"></view>
|
|
||||||
<text class="mm-cap__text">{{item}}</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view class="mm-cap__note">
|
|
||||||
<text>公益服务,全程免费。</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<!-- 历史服务列表 -->
|
|
||||||
<view wx:if="{{historyServices.length}}" class="mm-section">
|
<view wx:if="{{historyServices.length}}" class="mm-section">
|
||||||
<ui-section-header title="历史服务" subtitle="共 {{historyServices.length}} 条" />
|
<ui-section-header title="历史服务" subtitle="共 {{historyServices.length}} 条" />
|
||||||
<view class="mm-history">
|
<view class="mm-history">
|
||||||
<view
|
<view wx:for="{{historyServices}}" wx:key="serviceId" class="mm-history__item" data-service-id="{{item.serviceId}}" bindtap="onHistoryTap">
|
||||||
wx:for="{{historyServices}}"
|
<view><text class="mm-history__title">公益红娘服务</text><text wx:if="{{item.matchmakerName}}" class="mm-history__meta">红娘:{{item.matchmakerName}}</text></view>
|
||||||
wx:key="serviceId"
|
<text class="mm-history__status">{{item.statusText || item.status}}</text>
|
||||||
class="mm-history__item card-base"
|
<image src="/assets/icons/ui/chevron-right.png" mode="aspectFit" />
|
||||||
data-service-id="{{item.serviceId}}"
|
|
||||||
bindtap="onHistoryTap"
|
|
||||||
>
|
|
||||||
<view class="mm-history__row">
|
|
||||||
<text class="mm-history__title">公益红娘服务</text>
|
|
||||||
<text class="mm-history__status mm-history__status--{{item.status}}">{{item.statusText || item.status}}</text>
|
|
||||||
</view>
|
|
||||||
<view wx:if="{{item.matchmakerName}}" class="mm-history__meta">
|
|
||||||
红娘:{{item.matchmakerName}}
|
|
||||||
</view>
|
|
||||||
<view wx:if="{{item.lastFollowUpAtText || item.lastFollowUpAt}}" class="mm-history__meta">
|
|
||||||
最近跟进:{{item.lastFollowUpAtText || item.lastFollowUpAt}}
|
|
||||||
</view>
|
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
|
<view class="mm-fixed-action"><view class="mm-apply" bindtap="onApplyService">{{activeService ? '提交新的红娘需求' : '申请红娘服务'}}</view></view>
|
||||||
</view>
|
</view>
|
||||||
|
|||||||
@@ -1,113 +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)}
|
||||||
* 公益红娘服务页 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);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
{
|
{
|
||||||
"usingComponents": {},
|
"usingComponents": {
|
||||||
|
"ui-service-hero": "/components/service-hero/index"
|
||||||
|
},
|
||||||
"navigationBarTitleText": "婚前辅导"
|
"navigationBarTitleText": "婚前辅导"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,52 @@
|
|||||||
|
import { request } from '../../utils/requestPromise'
|
||||||
|
|
||||||
|
const app = getApp<{ globalData: { apiBase: string; token: string } }>()
|
||||||
|
|
||||||
Page({
|
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<any>({
|
||||||
|
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() {
|
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' })
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|||||||
@@ -1 +1,18 @@
|
|||||||
<view class="service-page reference-page"><view class="hero"><text class="eyebrow">U58 婚前辅导</text><text class="hero-title">在进入婚姻前,把重要的事认真谈清楚</text><text class="hero-desc">帮助双方讨论共同生活、家庭责任与沟通方式,可邀请伴侣共同参与。</text></view><view class="content"><view class="block"><text class="block-title">辅导内容</text><view class="card"><view class="feature-row"><view class="feature-icon">沟</view><view class="feature-copy"><text class="feature-title">沟通与期望</text><text class="feature-desc">表达需求、倾听差异,形成可以共同遵守的约定</text></view></view><view class="feature-row"><view class="feature-icon">家</view><view class="feature-copy"><text class="feature-title">家庭与责任</text><text class="feature-desc">讨论家庭角色、财务安排与双方家庭关系</text></view></view><view class="feature-row"><view class="feature-icon">伴</view><view class="feature-copy"><text class="feature-title">共同生活</text><text class="feature-desc">对生活方式、未来计划和冲突处理建立共识</text></view></view></view></view><view class="notice">双方共同参与效果更好,但必须基于自愿,不会因为一方申请而自动通知或要求另一方参加。</view></view><view class="fixed-action"><view class="primary-btn" bindtap="onApply">申请婚前辅导</view></view></view>
|
<view class="service-shell app-page reference-page">
|
||||||
|
<ui-service-hero eyebrow="共同成长 · 面向未来" title="婚前辅导" subtitle="在进入婚姻前,把重要的事认真谈清楚" image-src="/assets/service/premarital-hero.jpg" tone="rose" />
|
||||||
|
<view class="service-content">
|
||||||
|
<view class="service-status"><text class="service-status__label">服务状态</text><text class="service-status__value {{!serviceEnabled ? 'disabled' : ''}}">{{loading ? '获取中' : (serviceEnabled ? '可预约' : disabledReason)}}</text></view>
|
||||||
|
|
||||||
|
<view class="block"><text class="block-title">辅导内容</text><text class="block-subtitle">科学指导,走向更稳的幸福</text>
|
||||||
|
<view class="service-topics">
|
||||||
|
<view class="service-topic" wx:for="{{topics}}" wx:key="title">
|
||||||
|
<view class="service-topic__icon"><image src="{{item.iconAsset}}" mode="aspectFit" /></view>
|
||||||
|
<text class="service-topic__title">{{item.title}}</text><text class="service-topic__desc">{{item.description}}</text>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
</view>
|
||||||
|
|
||||||
|
<view class="privacy-note"><image src="/assets/icons/home/premarital.png" mode="aspectFit" /><text>双方共同参与效果更好,但必须基于自愿;不会因为一方申请而自动通知或要求另一方参加。</text></view>
|
||||||
|
</view>
|
||||||
|
<view class="fixed-action"><view class="service-actions"><view class="secondary-btn" bindtap="onMyServices">服务记录</view><view class="primary-btn {{!serviceEnabled ? 'disabled' : ''}}" bindtap="onApply">预约辅导</view></view></view>
|
||||||
|
</view>
|
||||||
|
|||||||
@@ -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%}}
|
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}
|
||||||
|
|||||||
@@ -84,6 +84,25 @@ for (const label of ['我的红娘', '我的咨询', '我的活动', '我的预
|
|||||||
assert.ok(mineTemplate.includes(label), `我的页缺少入口 ${label}`)
|
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')
|
const theme = read('miniapp/app.wxss')
|
||||||
for (const token of [
|
for (const token of [
|
||||||
'--mini-night-start',
|
'--mini-night-start',
|
||||||
|
|||||||
Reference in New Issue
Block a user