diff --git a/miniprogram/src/app.config.js b/miniprogram/src/app.config.js index 67137bf..4a00ab4 100644 --- a/miniprogram/src/app.config.js +++ b/miniprogram/src/app.config.js @@ -22,7 +22,24 @@ export default { 'pages/my-park/index', 'pages/my-cert/index', 'pages/compute/index', - 'pages/pay/index' + 'pages/pay/index', + 'pages/ops-dashboard/index', + 'pages/ops-parks/index', + 'pages/ops-content/index', + 'pages/ops-tasks/index', + 'pages/ops-users/index', + 'pages/ops-companies/index', + 'pages/park-companies/index', + 'pages/park-transfers/index', + 'pages/ent-company/index', + 'pages/ent-members/index', + 'pages/event-edit/index', + 'pages/my-events/index', + 'pages/pay-qr/index', + 'pages/park-screens/index', + 'pages/park-tasks/index', + 'pages/park-screen-ctl/index', + 'pages/park-users/index' ], window: { backgroundTextStyle: 'light', diff --git a/miniprogram/src/app.scss b/miniprogram/src/app.scss index 79723de..451d053 100644 --- a/miniprogram/src/app.scss +++ b/miniprogram/src/app.scss @@ -417,21 +417,12 @@ page { -ms-overflow-style: none; scrollbar-width: none; } } .page-navbar-col { display: flex; flex-direction: column; } .page-navbar-no { font-family: 'BubbledotICG', monospace; color: #a3abc9; font-size: 26rpx; letter-spacing: 2rpx; line-height: 1.15; } +/* 类别标签行:返回按钮在类别标签左侧,与标签文字同大小同颜色(沉浸式导航下唯一返回入口) */ +.page-navbar-norow { display: flex; align-items: center; gap: 10rpx; line-height: 1.15; } +.page-navbar-back-hit { display: flex; align-items: center; padding: 8rpx; margin: -8rpx 0 -8rpx -8rpx; } /* 扩大点击热区,视觉不变 */ +.page-navbar-back-ic { width: 26rpx; height: 26rpx; background: #a3abc9; } +.page-navbar-back-hit.pressed { opacity: 0.65; } .page-navbar-titlerow { display: flex; align-items: center; gap: 16rpx; line-height: 1.15; } -/* 标题区返回按钮:玻璃圆形 + 线性箭头(沉浸式导航下唯一返回入口) */ -.page-navbar-back { - width: 56rpx; height: 56rpx; border-radius: 50%; - display: flex; align-items: center; justify-content: center; - background: rgba(255, 255, 255, 0.55); - backdrop-filter: blur(20rpx) saturate(160%); - -webkit-backdrop-filter: blur(20rpx) saturate(160%); - border: 1px solid rgba(99, 132, 255, 0.22); - color: #5a6aa3; - box-shadow: 0 4rpx 14rpx rgba(59, 79, 125, 0.10); - flex-shrink: 0; -} -.page-navbar-back .ic { width: 30rpx; height: 30rpx; } -.page-navbar-back.pressed { opacity: 0.65; } .page-navbar-title { font-size: 40rpx; font-weight: 800; letter-spacing: -0.5rpx; line-height: 1.15; background: linear-gradient(120deg, #8fc3ff 0%, #a8a0ff 45%, #e0a0ff 80%, #7fe0ff 100%); diff --git a/miniprogram/src/assets/huodong-square.png b/miniprogram/src/assets/huodong-square.png new file mode 100644 index 0000000..0f2cbd7 Binary files /dev/null and b/miniprogram/src/assets/huodong-square.png differ diff --git a/miniprogram/src/assets/huodong-wide.png b/miniprogram/src/assets/huodong-wide.png new file mode 100644 index 0000000..7221630 Binary files /dev/null and b/miniprogram/src/assets/huodong-wide.png differ diff --git a/miniprogram/src/components/TopInset.jsx b/miniprogram/src/components/TopInset.jsx index 4bdda3b..d2c7328 100644 --- a/miniprogram/src/components/TopInset.jsx +++ b/miniprogram/src/components/TopInset.jsx @@ -54,13 +54,17 @@ export function PageHeader({ no, title, en, sub, back }) { <> - {no ? {no} : null} + {no || back ? ( + + {back ? ( + + + + ) : null} + {no ? {no} : null} + + ) : null} - {back ? ( - - - - ) : null} {title} {sub ? {sub} : null} diff --git a/miniprogram/src/pages/booking/index.jsx b/miniprogram/src/pages/booking/index.jsx index 4291c2c..c59c3cf 100644 --- a/miniprogram/src/pages/booking/index.jsx +++ b/miniprogram/src/pages/booking/index.jsx @@ -1,21 +1,28 @@ import { View, Text, Button, Image } from '@tarojs/components'; import Taro from '@tarojs/taro'; import { useState, useEffect } from 'react'; -import { getBookableEvents, fmtEvt } from '@/utils/booking'; +import { getBookableEvents, fmtEvt, priceText } from '@/utils/booking'; import { cachedRequest } from '@/utils/api'; import { useTabIndex } from '@/utils/tab'; import Skeleton from '@/components/skeleton'; import CountdownBox from '@/components/CountdownBox'; import './index.scss'; import { PageHeader } from '@/components/TopInset'; +import coverWide from '@/assets/huodong-wide.png'; +/* 类型筛选(活动体系:全部 + 六大类型;线下/线上按 mode) */ const FILTERS = [ { key: 'all', label: '全部' }, - { key: 'free', label: '公益课' }, - { key: 'salon', label: '沙龙' }, + { key: '峰会', label: '峰会' }, + { key: '竞赛', label: '竞赛' }, + { key: '沙龙', label: '沙龙' }, + { key: '培训', label: '培训' }, + { key: '展会', label: '展会' }, + { key: '投融资', label: '投融资' }, { key: 'offline', label: '线下' }, { key: 'online', label: '线上' } ]; +const MODE_TEXT = { online: '线上', offline: '线下', both: '线上/线下' }; /* 标签配色:按 type/mode */ const tagCls = (e) => (e.type === 'salon' ? ' alt' : ''); @@ -56,30 +63,26 @@ export default function Booking() { const nextTime = next && (next.startAt || next.start_at); const nextTitle = next && next.title; - /* 筛选 */ + /* 筛选:类型(category)优先,线下/线上按模式 */ const filtered = events.filter((e) => { - if (filter === 'free') return e.type === 'free'; - if (filter === 'salon') return e.type === 'salon'; if (filter === 'offline') return e.mode !== 'online'; if (filter === 'online') return e.mode === 'online'; - return true; + if (filter === 'all') return true; + return (e.category || '') === filter; }); /* 单张海报卡片(双列) */ const renderCard = (e) => ( goDetail(e.id)}> - {e.image ? ( - - ) : ( - - {e.type === 'salon' ? '沙龙' : '公益课'} - {e.title} - - )} + {}} /> - {e.type === 'salon' ? '沙龙' : '公益课'} - {e.mode === 'online' ? '线上' : '线下'} + {e.category + ? {e.category} + : {e.type === 'salon' ? '沙龙' : '公益课'}} + {MODE_TEXT[e.mode] || '线下'} + {e.region && e.region !== '其他' ? {e.region} : null} @@ -91,7 +94,7 @@ export default function Booking() { 名额 {e.enrolled || 0} / {e.capacity} )} - 免费 + 0 ? ' paid' : ''}`}>{priceText(e.priceFen)} {STATUS_TEXT[e.status] || '报名中'} diff --git a/miniprogram/src/pages/booking/index.scss b/miniprogram/src/pages/booking/index.scss index ba4a957..03d8c47 100644 --- a/miniprogram/src/pages/booking/index.scss +++ b/miniprogram/src/pages/booking/index.scss @@ -16,8 +16,12 @@ /* 筛选 tab(吸顶:实心背景,滚动时下方卡片不透过,无顶部间隙) */ .ev-tabs { display: flex; + flex-wrap: nowrap; /* 单行横滑,绝不换行 */ + overflow-x: auto; + -webkit-overflow-scrolling: touch; + scrollbar-width: none; gap: 16rpx; - padding: 16rpx 8rpx; + padding: 16rpx 16rpx; margin-top: 0; position: sticky; top: 0; /* 运行时由内联 style 覆盖为标题区实测高度 */ @@ -39,6 +43,8 @@ } .ev-tab { font-size: 26rpx; color: #8a94c0; padding: 10rpx 30rpx; + white-space: nowrap; /* 文字绝不允许换行显示 */ + flex-shrink: 0; /* 超出一行时横向滚动而非压缩换行 */ border-radius: 999px; border: 1rpx solid rgba(99,132,255,0.14); background: rgba(255,255,255,0.72); backdrop-filter: blur(8px); } @@ -100,6 +106,7 @@ .cell-cap { display: block; font-size: 21rpx; color: #a8c4ff; margin-top: 6rpx; line-height: 1.5; } .cell-foot { display: flex; align-items: center; justify-content: space-between; margin-top: 12rpx; } .cell-price { display: inline-block; font-size: 24rpx; font-weight: 700; color: #3fb68b; } +.cell-price.paid { color: #e8830c; } .cell-status { font-size: 20rpx; padding: 4rpx 16rpx; border-radius: 999px; color: #3fb68b; background: rgba(63,182,139,0.14); border: 1rpx solid rgba(63,182,139,0.4); } .cell-status.full { color: #f5c451; background: rgba(245,196,81,0.12); border-color: rgba(245,196,81,0.4); } .cell-status.done { color: #9aa4c6; background: rgba(154,164,198,0.12); border-color: rgba(154,164,198,0.3); } diff --git a/miniprogram/src/pages/content-detail/index.jsx b/miniprogram/src/pages/content-detail/index.jsx index 4d341dc..860cb6f 100644 --- a/miniprogram/src/pages/content-detail/index.jsx +++ b/miniprogram/src/pages/content-detail/index.jsx @@ -4,6 +4,7 @@ import { useState, useEffect } from 'react'; import { getContent, getComments, addComment, toggleLike, reportShare } from '@/utils/content'; import { isAuthed } from '@/utils/auth'; import './index.scss'; +import coverWide from '@/assets/huodong-wide.png'; const rw = (s) => (s || '').replace('T', ' ').replace('Z', '').slice(0, 16); @@ -133,8 +134,8 @@ const pubBadge = badgeOf(item); {!isSmall && (item.video ?