fix: 审核模式 runtime 同步、邀请码与小端 tabBar/个人中心及管理端用户页
- api: AppConfig runtime 返回 reviewMode;Invite/Settings/AppUser 等调整 - 微信小程序与抖音:app 与 tabBar、enterprise/camera/index/upload/profile 对齐审核与邀请逻辑 - 管理端:Dashboard、Settings、Users、UserDetailDialog 等更新 Made-with: Cursor
This commit is contained in:
@@ -47,8 +47,8 @@ App({
|
||||
// 超管配置的默认企业 ID(无 scene/eid 等入口参数时回落)
|
||||
defaultEnterpriseId: null,
|
||||
// API基础地址(开发时用本地,生产环境替换为实际域名)
|
||||
//apiBase: 'https://mbtiapi.quwanzhi.com',
|
||||
apiBase: 'http://mbti.com',
|
||||
apiBase: 'https://mbtiapi.quwanzhi.com',
|
||||
//apiBase: 'http://mbti.com',
|
||||
// VIP信息
|
||||
vipInfo: null,
|
||||
// 测试次数
|
||||
@@ -401,8 +401,10 @@ App({
|
||||
if (data.siteTitle) this.globalData.siteTitle = data.siteTitle
|
||||
if (data.textConfig) this.globalData.textConfig = data.textConfig
|
||||
if (data.maintenanceMode !== undefined) this.globalData.maintenanceMode = !!data.maintenanceMode
|
||||
if (typeof data.reviewMode === 'boolean') {
|
||||
this.globalData.reviewMode = data.reviewMode
|
||||
if (data.reviewMode !== undefined) {
|
||||
this.globalData.reviewMode = !!data.reviewMode
|
||||
} else if (data.maintenanceMode !== undefined) {
|
||||
this.globalData.reviewMode = !!data.maintenanceMode
|
||||
}
|
||||
if (data.defaultEnterpriseId != null && Number(data.defaultEnterpriseId) > 0) {
|
||||
this.globalData.defaultEnterpriseId = Number(data.defaultEnterpriseId)
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
Component({
|
||||
data: {
|
||||
selected: 0,
|
||||
/** 审核模式:为 true 时隐藏中间「拍摄」入口(与 globalData.reviewMode / maintenanceMode 一致) */
|
||||
reviewMode: false,
|
||||
list: [
|
||||
{ pagePath: '/pages/index/index', text: '首页', textKey: 'home', icon: 'home' },
|
||||
{ pagePath: '/pages/index/camera', text: '拍摄', textKey: 'camera', icon: 'camera' },
|
||||
@@ -26,6 +28,8 @@ Component({
|
||||
const currentPage = pages[pages.length - 1]
|
||||
if (!currentPage || !currentPage.route) return
|
||||
const url = currentPage.route
|
||||
const gd = getApp().globalData || {}
|
||||
const reviewMode = !!(gd.reviewMode || gd.maintenanceMode)
|
||||
let selected = 0
|
||||
if (url === 'pages/index/index' || url === 'pages/enterprise/index') {
|
||||
selected = 0
|
||||
@@ -34,16 +38,21 @@ Component({
|
||||
} else if (url === 'pages/profile/index') {
|
||||
selected = 2
|
||||
}
|
||||
this.setData({ selected })
|
||||
this.setData({ selected, reviewMode })
|
||||
} catch (error) {
|
||||
console.error('updateSelected error:', error)
|
||||
this.setData({ selected: 0 })
|
||||
this.setData({ selected: 0, reviewMode: false })
|
||||
}
|
||||
},
|
||||
switchTab(e) {
|
||||
const index = parseInt(e.currentTarget.dataset.index, 10)
|
||||
let url = e.currentTarget.dataset.path
|
||||
|
||||
const gd = getApp().globalData || {}
|
||||
if (index === 1 && !!(gd.reviewMode || gd.maintenanceMode)) {
|
||||
return
|
||||
}
|
||||
|
||||
if (index === 0) {
|
||||
try {
|
||||
const app = getApp()
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<!-- 自定义 tabBar:顶部分割线 + 三栏;中间单独一列避免浮钮与左右叠层 -->
|
||||
<view class="tab-bar">
|
||||
<view class="tab-bar-line"></view>
|
||||
<view class="tab-bar-inner">
|
||||
<view class="tab-bar-inner {{reviewMode ? 'tab-bar-inner--audit' : ''}}">
|
||||
<view
|
||||
class="tab-item {{selected === 0 ? 'active' : ''}}"
|
||||
data-index="0"
|
||||
@@ -12,8 +12,8 @@
|
||||
<text class="tab-text">首页</text>
|
||||
</view>
|
||||
|
||||
<!-- 中间列:与审核态无关,固定「拍摄」+ 始终进 camera -->
|
||||
<view class="tab-slot-middle">
|
||||
<!-- 中间列:非审核模式显示「拍摄」 -->
|
||||
<view class="tab-slot-middle" wx:if="{{!reviewMode}}">
|
||||
<view
|
||||
class="middle-fab {{selected === 1 ? 'active' : ''}}"
|
||||
data-index="1"
|
||||
|
||||
@@ -25,6 +25,13 @@
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
/* 审核模式仅「首页」「我的」两栏时,左右均匀留白 */
|
||||
.tab-bar-inner--audit {
|
||||
justify-content: space-between;
|
||||
padding-left: 56rpx;
|
||||
padding-right: 56rpx;
|
||||
}
|
||||
|
||||
.tab-item {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
|
||||
@@ -61,7 +61,7 @@ Page({
|
||||
const statusBarHeightRpx = (statusBarHeight * 750) / screenWidth
|
||||
const navbarHeightRpx = statusBarHeightRpx + 88
|
||||
const gd = app.globalData
|
||||
const maintenanceMode = !!(gd.maintenanceMode)
|
||||
const maintenanceMode = !!(gd.reviewMode || gd.maintenanceMode)
|
||||
this.setData({
|
||||
statusBarHeight: statusBarHeightRpx,
|
||||
navbarHeight: navbarHeightRpx,
|
||||
@@ -87,8 +87,11 @@ Page({
|
||||
app.globalData.siteTitle = cfg.siteTitle
|
||||
this.setData({ siteTitle: cfg.siteTitle })
|
||||
}
|
||||
const maintenanceMode = !!(cfg.maintenanceMode)
|
||||
if (cfg.maintenanceMode !== undefined) app.globalData.maintenanceMode = maintenanceMode
|
||||
const maintenanceMode = !!(cfg.maintenanceMode || cfg.reviewMode)
|
||||
if (cfg.maintenanceMode !== undefined) app.globalData.maintenanceMode = !!cfg.maintenanceMode
|
||||
if (cfg.reviewMode !== undefined || cfg.maintenanceMode !== undefined) {
|
||||
app.globalData.reviewMode = !!(cfg.reviewMode || cfg.maintenanceMode)
|
||||
}
|
||||
this.setData({
|
||||
startButtonEnterprise: maintenanceMode ? '开始性格测试' : (cfg.textConfig && cfg.textConfig.startButtonEnterprise || '开始面部测试'),
|
||||
aiAnalysisText: (cfg.textConfig && cfg.textConfig.aiAnalysisText) || '智能分析',
|
||||
@@ -112,8 +115,11 @@ Page({
|
||||
this.setData({ siteTitle: cfg.siteTitle })
|
||||
}
|
||||
if (cfg.textConfig) app.globalData.textConfig = cfg.textConfig
|
||||
const maintenanceMode = !!(cfg && cfg.maintenanceMode)
|
||||
if (cfg.maintenanceMode !== undefined) app.globalData.maintenanceMode = maintenanceMode
|
||||
const maintenanceMode = !!(cfg && (cfg.maintenanceMode || cfg.reviewMode))
|
||||
if (cfg.maintenanceMode !== undefined) app.globalData.maintenanceMode = !!cfg.maintenanceMode
|
||||
if (cfg.reviewMode !== undefined || cfg.maintenanceMode !== undefined) {
|
||||
app.globalData.reviewMode = !!(cfg.reviewMode || cfg.maintenanceMode)
|
||||
}
|
||||
this.setData({
|
||||
startButtonEnterprise: maintenanceMode ? '开始性格测试' : (cfg.textConfig && cfg.textConfig.startButtonEnterprise || '开始面部测试'),
|
||||
aiAnalysisText: (cfg.textConfig && cfg.textConfig.aiAnalysisText) || '智能分析',
|
||||
@@ -151,11 +157,13 @@ Page({
|
||||
onShow() {
|
||||
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
|
||||
const tabBar = this.getTabBar()
|
||||
tabBar.setData({ selected: 0, maintenanceMode: !!getApp().globalData.maintenanceMode })
|
||||
const gd = getApp().globalData || {}
|
||||
const audit = !!(gd.reviewMode || gd.maintenanceMode)
|
||||
tabBar.setData({ selected: 0, reviewMode: audit })
|
||||
}
|
||||
try { getApp().globalData.appScope = 'enterprise' } catch (e) {}
|
||||
const gd = getApp().globalData
|
||||
const maintenanceMode = !!(gd.maintenanceMode)
|
||||
const maintenanceMode = !!(gd.reviewMode || gd.maintenanceMode)
|
||||
this.setData({
|
||||
siteTitle: gd.siteTitle || '神仙团队AI性格测试',
|
||||
startButtonEnterprise: maintenanceMode ? '开始性格测试' : ((gd.textConfig && gd.textConfig.startButtonEnterprise) || '开始面部测试'),
|
||||
|
||||
@@ -14,35 +14,43 @@ Page({
|
||||
reviewMode: true
|
||||
},
|
||||
|
||||
_audit() {
|
||||
return !!(app.globalData.reviewMode || app.globalData.maintenanceMode)
|
||||
},
|
||||
|
||||
onLoad() {
|
||||
this.setData({ reviewMode: !!app.globalData.reviewMode })
|
||||
this.setData({ reviewMode: this._audit() })
|
||||
const tc = app.globalData.textConfig
|
||||
if (tc && tc.aiAnalysisText) {
|
||||
this.setData({ aiAnalysisText: tc.aiAnalysisText })
|
||||
}
|
||||
app.getRuntimeConfig().then((cfg) => {
|
||||
if (cfg) {
|
||||
if (typeof cfg.reviewMode === 'boolean') {
|
||||
app.globalData.reviewMode = cfg.reviewMode
|
||||
}
|
||||
if (cfg.reviewMode !== undefined) app.globalData.reviewMode = !!cfg.reviewMode
|
||||
else if (cfg.maintenanceMode !== undefined) app.globalData.reviewMode = !!cfg.maintenanceMode
|
||||
if (cfg.maintenanceMode !== undefined) app.globalData.maintenanceMode = !!cfg.maintenanceMode
|
||||
if (cfg.textConfig) {
|
||||
app.globalData.textConfig = cfg.textConfig
|
||||
this.setData({
|
||||
aiAnalysisText: cfg.textConfig.aiAnalysisText || '分析',
|
||||
reviewMode: !!app.globalData.reviewMode
|
||||
reviewMode: this._audit()
|
||||
})
|
||||
try {
|
||||
const tb = typeof this.getTabBar === 'function' ? this.getTabBar() : null
|
||||
if (tb && typeof tb.updateSelected === 'function') tb.updateSelected()
|
||||
} catch (e) {}
|
||||
return
|
||||
}
|
||||
}
|
||||
this.setData({ reviewMode: !!app.globalData.reviewMode })
|
||||
this.setData({ reviewMode: this._audit() })
|
||||
}).catch(() => {
|
||||
this.setData({ reviewMode: !!app.globalData.reviewMode })
|
||||
this.setData({ reviewMode: this._audit() })
|
||||
})
|
||||
},
|
||||
|
||||
/** 非审核模式且相机在页上时再创建上下文 */
|
||||
onReady() {
|
||||
if (!app.globalData.reviewMode) {
|
||||
if (!this._audit()) {
|
||||
this.initCameraContext()
|
||||
}
|
||||
},
|
||||
@@ -63,11 +71,11 @@ Page({
|
||||
},
|
||||
|
||||
onShow() {
|
||||
const rm = !!app.globalData.reviewMode
|
||||
const rm = this._audit()
|
||||
this.setData({ reviewMode: rm })
|
||||
|
||||
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
|
||||
this.getTabBar().setData({ selected: 1 })
|
||||
this.getTabBar().setData({ selected: 1, reviewMode: rm })
|
||||
}
|
||||
|
||||
// 审核模式:只展示本页引导,不再强跳 navigateTo(失败时曾导致白屏且无拍摄区)
|
||||
|
||||
@@ -24,20 +24,24 @@ Page({
|
||||
|
||||
const userInfo = getApp().globalData.userInfo || wx.getStorageSync('userInfo') || {}
|
||||
const gd = getApp().globalData
|
||||
const rm0 = !!(gd.reviewMode || gd.maintenanceMode)
|
||||
this.setData({
|
||||
statusBarHeight: statusBarHeightRpx,
|
||||
navbarHeight: navbarHeightRpx,
|
||||
showEnterpriseEntry: userInfo.hasEnterprise === true,
|
||||
siteTitle: gd.reviewMode ? (gd.siteTitle || '神仙团队性格测试').replace(/AI/gi, '') : (gd.siteTitle || '神仙团队性格测试'),
|
||||
startButtonText: gd.reviewMode ? '开始性格测试' : ((gd.textConfig && gd.textConfig.startButtonText) || '拍摄'),
|
||||
aiAnalysisText: gd.reviewMode ? '分析' : ((gd.textConfig && gd.textConfig.aiAnalysisText) || '分析'),
|
||||
reviewMode: !!gd.reviewMode
|
||||
siteTitle: rm0 ? (gd.siteTitle || '神仙团队性格测试').replace(/AI/gi, '') : (gd.siteTitle || '神仙团队性格测试'),
|
||||
startButtonText: rm0 ? '开始性格测试' : ((gd.textConfig && gd.textConfig.startButtonText) || '拍摄'),
|
||||
aiAnalysisText: rm0 ? '分析' : ((gd.textConfig && gd.textConfig.aiAnalysisText) || '分析'),
|
||||
reviewMode: rm0
|
||||
})
|
||||
// 预加载站点名称与文案配置
|
||||
app.getRuntimeConfig().then((cfg) => {
|
||||
if (cfg) {
|
||||
const rm = !!cfg.reviewMode
|
||||
const rm = !!(cfg.reviewMode || cfg.maintenanceMode)
|
||||
getApp().globalData.reviewMode = rm
|
||||
if (cfg.maintenanceMode !== undefined) {
|
||||
getApp().globalData.maintenanceMode = !!cfg.maintenanceMode
|
||||
}
|
||||
if (cfg.siteTitle) {
|
||||
getApp().globalData.siteTitle = cfg.siteTitle
|
||||
this.setData({ siteTitle: rm ? cfg.siteTitle.replace(/AI/gi, '') : cfg.siteTitle })
|
||||
@@ -50,6 +54,10 @@ Page({
|
||||
})
|
||||
}
|
||||
this.setData({ reviewMode: rm })
|
||||
try {
|
||||
const tb = typeof this.getTabBar === 'function' ? this.getTabBar() : null
|
||||
if (tb && typeof tb.updateSelected === 'function') tb.updateSelected()
|
||||
} catch (e) {}
|
||||
}
|
||||
}).catch(() => {})
|
||||
// ── 解析入参(兼容扫码 scene / 分享链接 options)──
|
||||
@@ -88,20 +96,22 @@ Page({
|
||||
},
|
||||
|
||||
onShow() {
|
||||
const gd0 = getApp().globalData || {}
|
||||
const audit = !!(gd0.reviewMode || gd0.maintenanceMode)
|
||||
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
|
||||
this.getTabBar().setData({ selected: 0 })
|
||||
this.getTabBar().setData({ selected: 0, reviewMode: audit })
|
||||
}
|
||||
// 个人版首页:固定 scope=personal,并清除企业来源上下文
|
||||
try {
|
||||
getApp().globalData.appScope = 'personal'
|
||||
getApp().globalData.enterpriseIdFromScene = null
|
||||
} catch (e) {}
|
||||
const gd = getApp().globalData
|
||||
const rm = !!gd.reviewMode
|
||||
const g = getApp().globalData
|
||||
const rm = !!(g.reviewMode || g.maintenanceMode)
|
||||
this.setData({
|
||||
siteTitle: rm ? (gd.siteTitle || '神仙团队性格测试').replace(/AI/gi, '') : (gd.siteTitle || '神仙团队性格测试'),
|
||||
startButtonText: rm ? '开始性格测试' : ((gd.textConfig && gd.textConfig.startButtonText) || '拍摄'),
|
||||
aiAnalysisText: rm ? '分析' : ((gd.textConfig && gd.textConfig.aiAnalysisText) || '分析'),
|
||||
siteTitle: rm ? (g.siteTitle || '神仙团队性格测试').replace(/AI/gi, '') : (g.siteTitle || '神仙团队性格测试'),
|
||||
startButtonText: rm ? '开始性格测试' : ((g.textConfig && g.textConfig.startButtonText) || '拍摄'),
|
||||
aiAnalysisText: rm ? '分析' : ((g.textConfig && g.textConfig.aiAnalysisText) || '分析'),
|
||||
reviewMode: rm
|
||||
})
|
||||
const userInfo = getApp().globalData.userInfo || wx.getStorageSync('userInfo') || {}
|
||||
@@ -124,9 +134,14 @@ Page({
|
||||
}
|
||||
},
|
||||
|
||||
// 与底栏中间一致:始终进入拍摄 Tab(审核态在 camera 页内展示问卷引导)
|
||||
// 审核态:主按钮进问卷选测试;否则进拍摄 Tab
|
||||
startCamera() {
|
||||
try { getApp().globalData.appScope = 'personal' } catch (e) {}
|
||||
const gd = getApp().globalData
|
||||
if (gd.reviewMode || gd.maintenanceMode) {
|
||||
wx.navigateTo({ url: '/pages/test-select/index' })
|
||||
return
|
||||
}
|
||||
wx.switchTab({ url: '/pages/index/camera' })
|
||||
},
|
||||
|
||||
|
||||
@@ -34,8 +34,8 @@ Page({
|
||||
},
|
||||
|
||||
onShow() {
|
||||
// 审核模式下重定向到测试选择页
|
||||
if (app.globalData.reviewMode) {
|
||||
const audit = !!(app.globalData.reviewMode || app.globalData.maintenanceMode)
|
||||
if (audit) {
|
||||
wx.navigateTo({ url: '/pages/test-select/index' })
|
||||
return
|
||||
}
|
||||
@@ -43,7 +43,7 @@ Page({
|
||||
return
|
||||
}
|
||||
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
|
||||
this.getTabBar().setData({ selected: 1 })
|
||||
this.getTabBar().setData({ selected: 1, reviewMode: audit })
|
||||
}
|
||||
this.setData({ needPhoneAuth: !hasPhone() })
|
||||
const tc = app.globalData.textConfig
|
||||
|
||||
@@ -48,15 +48,17 @@ Page({
|
||||
this.runLoginThenLoad()
|
||||
},
|
||||
onShow() {
|
||||
// 同步审核模式
|
||||
this.setData({ reviewMode: !!app.globalData.reviewMode })
|
||||
// 同步审核模式(与 runtime maintenanceMode / reviewMode 一致)
|
||||
const gd = app.globalData
|
||||
this.setData({ reviewMode: !!(gd.reviewMode || gd.maintenanceMode) })
|
||||
// 如果是从其他页面返回,且已经登录,则只刷新数据而不重新执行登录流程
|
||||
if (this.data.hasLogin) {
|
||||
this.loadData()
|
||||
}
|
||||
|
||||
if (typeof this.getTabBar === 'function' && this.getTabBar()) {
|
||||
this.getTabBar().setData({ selected: 2 })
|
||||
const audit = !!(gd.reviewMode || gd.maintenanceMode)
|
||||
this.getTabBar().setData({ selected: 2, reviewMode: audit })
|
||||
}
|
||||
},
|
||||
|
||||
@@ -143,9 +145,10 @@ Page({
|
||||
|
||||
/** 从 /api/test/recent 拉取各类型最新记录 */
|
||||
_loadRecentFromAPI() {
|
||||
const scope = app.globalData.appScope || 'personal'
|
||||
// 固定 scope=all:与 appScope 无关。个人/企业 scope 会按 enterpriseId 过滤,若提交时写过
|
||||
// enterpriseId 而此处仍用 personal,会导致库里有记录却显示「未测评」。
|
||||
request({
|
||||
url: `/api/test/recent?scope=${scope}`,
|
||||
url: '/api/test/recent?scope=all',
|
||||
method: 'GET',
|
||||
success: (res) => {
|
||||
// res 是 wx.request 原始响应:{ statusCode, data: { code, data, message } }
|
||||
|
||||
@@ -178,12 +178,31 @@
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 推广入口:置底弱化,避免与主服务抢注意力(开关与标题仍来自管理端) -->
|
||||
<view class="promo-section-subtle" wx:if="{{hasLogin && promoDistributionEnabled}}">
|
||||
<view class="promo-row-subtle" bindtap="goToPromo">
|
||||
<text class="promo-row-label">{{promoCenterTitle}}</text>
|
||||
<text class="promo-row-meta">邀请{{promoTotalInvite}} · 可提¥{{promoWithdrawable}}</text>
|
||||
<text class="promo-row-chevron">›</text>
|
||||
<!-- 推广中心(与管理端开关、标题配置一致;卡片样式与其他区块统一) -->
|
||||
<view class="section px-section" wx:if="{{hasLogin && promoDistributionEnabled && !reviewMode}}">
|
||||
<view class="promo-card" bindtap="goToPromo">
|
||||
<view class="promo-header">
|
||||
<view class="promo-title-wrap">
|
||||
<text class="promo-icon">📈</text>
|
||||
<text class="promo-title">{{promoCenterTitle}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="promo-stats">
|
||||
<view class="promo-stat-item">
|
||||
<text class="promo-stat-label">邀请好友</text>
|
||||
<text class="promo-stat-value">{{promoTotalInvite}}</text>
|
||||
</view>
|
||||
<view class="promo-stat-divider"></view>
|
||||
<view class="promo-stat-item">
|
||||
<text class="promo-stat-label">累计收益</text>
|
||||
<text class="promo-stat-value">¥{{promoTotalEarned}}</text>
|
||||
</view>
|
||||
<view class="promo-stat-divider"></view>
|
||||
<view class="promo-stat-item">
|
||||
<text class="promo-stat-label">可提现</text>
|
||||
<text class="promo-stat-value promo-highlight">¥{{promoWithdrawable}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
|
||||
@@ -493,39 +493,75 @@ custom-tab-bar {
|
||||
color: #D1D5DB;
|
||||
}
|
||||
|
||||
/* ===== 推广入口(弱化:置底、小字、低对比) ===== */
|
||||
.promo-section-subtle {
|
||||
margin-top: 12rpx;
|
||||
padding: 0 32rpx 8rpx;
|
||||
/* ===== 推广中心(白底圆角卡片,与深度解析整块风格一致) ===== */
|
||||
.promo-card {
|
||||
background: #FFFFFF;
|
||||
border-radius: 24rpx;
|
||||
padding: 36rpx 32rpx 40rpx;
|
||||
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
|
||||
border: 1rpx solid rgba(0, 0, 0, 0.04);
|
||||
}
|
||||
|
||||
.promo-row-subtle {
|
||||
.promo-card:active {
|
||||
opacity: 0.92;
|
||||
}
|
||||
|
||||
.promo-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 16rpx 8rpx 20rpx;
|
||||
border-top: 1rpx solid rgba(0, 0, 0, 0.06);
|
||||
margin-bottom: 32rpx;
|
||||
}
|
||||
|
||||
.promo-row-label {
|
||||
font-size: 24rpx;
|
||||
font-weight: 500;
|
||||
color: #9CA3AF;
|
||||
letter-spacing: 0.5rpx;
|
||||
.promo-title-wrap {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 12rpx;
|
||||
}
|
||||
|
||||
.promo-row-meta {
|
||||
.promo-icon {
|
||||
font-size: 32rpx;
|
||||
}
|
||||
|
||||
.promo-title {
|
||||
font-size: 32rpx;
|
||||
font-weight: 700;
|
||||
color: #1F2937;
|
||||
}
|
||||
|
||||
.promo-stats {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.promo-stat-item {
|
||||
flex: 1;
|
||||
text-align: right;
|
||||
font-size: 22rpx;
|
||||
color: #D1D5DB;
|
||||
margin-right: 4rpx;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 8rpx;
|
||||
}
|
||||
|
||||
.promo-stat-label {
|
||||
font-size: 24rpx;
|
||||
color: #9CA3AF;
|
||||
}
|
||||
|
||||
.promo-stat-value {
|
||||
font-size: 34rpx;
|
||||
font-weight: 700;
|
||||
color: #111827;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
|
||||
.promo-row-chevron {
|
||||
font-size: 26rpx;
|
||||
color: #E5E7EB;
|
||||
font-weight: 300;
|
||||
.promo-stat-divider {
|
||||
width: 1rpx;
|
||||
height: 60rpx;
|
||||
background: #F3F4F6;
|
||||
}
|
||||
|
||||
.promo-highlight {
|
||||
color: #F43F5E;
|
||||
}
|
||||
|
||||
/* ===== 服务菜单 ===== */
|
||||
|
||||
Reference in New Issue
Block a user