feat: migrate static pages to native tabbar

This commit is contained in:
2026-04-23 21:25:24 +08:00
parent f3cd0c3a98
commit cd30f57f2c
116 changed files with 7143 additions and 311 deletions

View File

@@ -0,0 +1,52 @@
const { resolveScene } = require('../../../../utils/static-ux/shared')
const { ROUTES, openStaticRoute } = require('../../../../utils/static-ux/route-map')
function createMingliBaziPageData(rawScene) {
const scene = resolveScene(rawScene, ['default', 'result'], 'default')
return {
title: '八字排盘',
scene,
form: {
name: '张三',
gender: '男',
birthDate: '1990-01-01',
birthTime: '08:30'
},
result:
scene === 'result'
? {
headline: '学习型排盘结果',
subline: '以静态四柱结果承接旧页面的结果层级,不迁移旧排盘引擎。',
pillars: [
{ key: 'year', label: '年柱', value: '庚午' },
{ key: 'month', label: '月柱', value: '戊寅' },
{ key: 'day', label: '日柱', value: '甲辰' },
{ key: 'time', label: '时柱', value: '丁卯' }
]
}
: null,
primaryActionText: scene === 'result' ? '重新排盘' : '开始排盘',
secondaryActionText: '命理解读'
}
}
Page({
data: createMingliBaziPageData('default'),
onLoad(options) {
this.setData(createMingliBaziPageData(options.scene))
},
handlePrimaryTap() {
this.setData(createMingliBaziPageData(this.data.scene === 'result' ? 'default' : 'result'))
},
handleSecondaryTap() {
openStaticRoute(`${ROUTES.mingli.interpret}?scene=result`, wx)
}
})
module.exports = {
createMingliBaziPageData
}

View File

@@ -0,0 +1,5 @@
{
"navigationBarTitleText": "八字排盘",
"navigationBarBackgroundColor": "#f8f0ee",
"navigationBarTextStyle": "black"
}

View File

@@ -0,0 +1,63 @@
<view class="bazi-page">
<view class="hero-card">
<text class="hero-card__eyebrow">命理练习台</text>
<text class="hero-card__title">{{title}}</text>
<text class="hero-card__desc">
排盘页当前只保留输入层级、四柱结果和跳转关系,并把阅读节奏整体放大。
</text>
<view class="hero-card__meta">
<text class="hero-card__meta-item">静态录入</text>
<text class="hero-card__meta-item">四柱结果</text>
<text class="hero-card__meta-item">命理解读</text>
</view>
</view>
<view class="form-card">
<view class="panel-header">
<text class="panel-header__title">基础信息</text>
<text class="panel-header__desc">保留排盘必需字段,用更大的信息卡呈现当前静态示例。</text>
</view>
<view class="field-row">
<view class="field-block">
<text class="field-block__label">姓名</text>
<view class="field-block__value">{{form.name}}</view>
</view>
<view class="field-block">
<text class="field-block__label">性别</text>
<view class="field-block__value">{{form.gender}}</view>
</view>
</view>
<view class="field-row">
<view class="field-block">
<text class="field-block__label">出生日期</text>
<view class="field-block__value">{{form.birthDate}}</view>
</view>
<view class="field-block">
<text class="field-block__label">出生时间</text>
<view class="field-block__value">{{form.birthTime}}</view>
</view>
</view>
<view class="action-group">
<view class="action-button" bindtap="handlePrimaryTap">{{primaryActionText}}</view>
<view class="action-button action-button--ghost" bindtap="handleSecondaryTap">
{{secondaryActionText}}
</view>
</view>
</view>
<view wx:if="{{result}}" class="result-card">
<view class="panel-header panel-header--result">
<text class="panel-header__title">{{result.headline}}</text>
<text class="panel-header__desc">{{result.subline}}</text>
</view>
<view class="result-card__grid">
<view class="pillar-card" wx:for="{{result.pillars}}" wx:key="key">
<view class="pillar-card__inner">
<text class="pillar-card__label">{{item.label}}</text>
<text class="pillar-card__value">{{item.value}}</text>
</view>
</view>
</view>
<text class="result-card__hint">结果区保留静态展示,可继续进入命理解读页查看后续层级。</text>
</view>
</view>

View File

@@ -0,0 +1,194 @@
page {
min-height: 100%;
background: linear-gradient(180deg, #f9f7f5 0%, #f3ebe8 100%);
}
.bazi-page {
box-sizing: border-box;
min-height: 100vh;
padding: 36rpx 24rpx 96rpx;
}
.hero-card,
.form-card,
.result-card {
margin-top: 22rpx;
padding: 34rpx 28rpx;
border: 1rpx solid rgba(139, 59, 49, 0.08);
border-radius: 32rpx;
background: rgba(255, 252, 248, 0.94);
box-shadow: 0 14rpx 34rpx rgba(139, 59, 49, 0.08);
}
.hero-card {
margin-top: 0;
}
.hero-card__eyebrow {
display: block;
color: #9f594e;
font-size: 22rpx;
font-weight: 600;
letter-spacing: 6rpx;
line-height: 1.4;
}
.hero-card__title {
display: block;
margin-top: 14rpx;
color: #2c2621;
font-family: 'STSong', 'Songti SC', serif;
font-size: 46rpx;
font-weight: 700;
line-height: 1.28;
}
.hero-card__desc {
display: block;
margin-top: 18rpx;
color: #7a6f64;
font-size: 28rpx;
line-height: 1.8;
}
.hero-card__meta {
margin: 20rpx -6rpx 0;
font-size: 0;
}
.hero-card__meta-item {
display: inline-block;
margin: 10rpx 6rpx 0;
padding: 10rpx 18rpx;
border-radius: 999rpx;
background: rgba(139, 59, 49, 0.08);
color: #8b3b31;
font-size: 22rpx;
line-height: 1.4;
}
.panel-header {
margin-bottom: 4rpx;
}
.panel-header__title {
display: block;
color: #2c2621;
font-family: 'STSong', 'Songti SC', serif;
font-size: 34rpx;
font-weight: 700;
line-height: 1.35;
}
.panel-header__desc,
.result-card__hint {
display: block;
margin-top: 12rpx;
color: #7a6f64;
font-size: 24rpx;
line-height: 1.7;
}
.panel-header--result {
margin-bottom: 8rpx;
}
.field-row {
display: flex;
margin: 0 -8rpx;
}
.field-block {
box-sizing: border-box;
width: 50%;
padding: 0 8rpx;
margin-top: 20rpx;
}
.field-block__label {
display: block;
color: #8b5a3c;
font-size: 24rpx;
line-height: 1.5;
}
.field-block__value {
box-sizing: border-box;
width: 100%;
min-height: 94rpx;
margin-top: 12rpx;
padding: 24rpx 22rpx;
border: 1rpx solid rgba(139, 90, 60, 0.1);
border-radius: 24rpx;
background: linear-gradient(180deg, #fffdfa 0%, #f7f1ec 100%);
color: #5a4335;
font-size: 30rpx;
font-weight: 600;
line-height: 1.4;
}
.action-group {
margin-top: 26rpx;
}
.action-button {
margin-top: 18rpx;
padding: 28rpx 24rpx;
border-radius: 24rpx;
background: linear-gradient(135deg, #a64e44 0%, #7a342b 100%);
color: #fff;
font-size: 30rpx;
font-weight: 600;
line-height: 1.2;
text-align: center;
}
.action-button--ghost {
background: rgba(139, 59, 49, 0.08);
color: #8b3b31;
}
.result-card__grid {
display: flex;
flex-wrap: wrap;
margin: 18rpx -8rpx 0;
}
.pillar-card {
box-sizing: border-box;
width: 50%;
padding: 0 8rpx;
margin-top: 16rpx;
}
.pillar-card__inner {
min-height: 156rpx;
padding: 24rpx 18rpx;
border-radius: 24rpx;
background: linear-gradient(180deg, #fff7f3 0%, #fff 100%);
border: 1rpx solid rgba(139, 59, 49, 0.08);
box-shadow: inset 0 1rpx 0 rgba(255, 255, 255, 0.7);
}
.pillar-card__label {
display: block;
color: #8b3b31;
font-size: 24rpx;
line-height: 1.4;
text-align: center;
}
.pillar-card__value {
display: block;
margin-top: 16rpx;
color: #5d312a;
font-family: 'STSong', 'Songti SC', serif;
font-size: 40rpx;
font-weight: 700;
line-height: 1.3;
text-align: center;
}
.result-card__hint {
margin-top: 24rpx;
}