From 8a6ac48d59b82a4f1ed5494cba37b00afd801e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=82=B9=E6=96=B9=E6=88=90?= Date: Mon, 15 Dec 2025 20:16:47 +0800 Subject: [PATCH] feat: Overhaul homepage UI with new activity sections and add dedicated activity, shop, and registration pages. --- components/FlipGrid.vue | 143 +++- components/PaymentPopup.vue | 135 +++- components/YifanSelector.vue | 160 ++-- pages.json | 99 ++- pages/activity/duiduipeng/index.vue | 53 +- pages/activity/list/index.vue | 233 ++++++ pages/activity/pata/index.vue | 374 +++++++++ pages/activity/wuxianshang/index.vue | 143 ++-- pages/activity/yifanshang/index.vue | 422 ++++++++-- pages/address/edit.vue | 77 +- pages/address/index.vue | 140 +++- pages/cabinet/index.vue | 238 ++++-- pages/index/index.vue | 605 +++++++++++--- pages/login/index.vue | 495 +++++++----- pages/mine/index.vue | 1107 +++++++++++--------------- pages/orders/index.vue | 138 +++- pages/register/register.vue | 156 ++++ pages/shop/detail.vue | 127 +++ pages/shop/index.vue | 615 +++++++++----- project.config.json | 25 + project.private.config.json | 14 + uni.scss | 201 +++-- 22 files changed, 4118 insertions(+), 1582 deletions(-) create mode 100644 pages/activity/list/index.vue create mode 100644 pages/activity/pata/index.vue create mode 100644 pages/register/register.vue create mode 100644 pages/shop/detail.vue create mode 100644 project.config.json create mode 100644 project.private.config.json diff --git a/components/FlipGrid.vue b/components/FlipGrid.vue index 816bd8e..7e447bf 100644 --- a/components/FlipGrid.vue +++ b/components/FlipGrid.vue @@ -65,19 +65,132 @@ defineExpose({ revealResults, reset }) diff --git a/components/PaymentPopup.vue b/components/PaymentPopup.vue index 0af85e9..820b4d9 100644 --- a/components/PaymentPopup.vue +++ b/components/PaymentPopup.vue @@ -134,13 +134,18 @@ function handleConfirm() { diff --git a/components/YifanSelector.vue b/components/YifanSelector.vue index ed55465..8384761 100644 --- a/components/YifanSelector.vue +++ b/components/YifanSelector.vue @@ -34,8 +34,8 @@ - - + + @@ -291,121 +291,163 @@ async function onPaymentConfirm(paymentData) { diff --git a/pages.json b/pages.json index 9bae1d2..87d8fda 100644 --- a/pages.json +++ b/pages.json @@ -5,105 +5,108 @@ "style": { "navigationBarTitleText": "uni-app" } - } - , + }, { "path": "pages/login/index", "style": { "navigationBarTitleText": "登录" } - } - , + }, { "path": "pages/shop/index", "style": { "navigationBarTitleText": "商城" } - } - , + }, { "path": "pages/shop/detail", "style": { "navigationBarTitleText": "商品详情" } - } - , + }, { "path": "pages/cabinet/index", "style": { "navigationBarTitleText": "货柜" } - } - , + }, { "path": "pages/mine/index", "style": { "navigationBarTitleText": "我的" } - } - , + }, { "path": "pages/points/index", "style": { "navigationBarTitleText": "积分记录" } - } - , + }, { "path": "pages/orders/index", "style": { "navigationBarTitleText": "我的订单" } - } - , + }, { "path": "pages/address/index", "style": { "navigationBarTitleText": "地址管理" } - } - , + }, { "path": "pages/address/edit", "style": { "navigationBarTitleText": "编辑地址" } - } - , + }, { "path": "pages/help/index", "style": { "navigationBarTitleText": "使用帮助" } - } - , + }, { "path": "pages/agreement/user", "style": { "navigationBarTitleText": "用户协议" } - } - , + }, { "path": "pages/agreement/purchase", "style": { "navigationBarTitleText": "购买协议" } - } - , + }, { "path": "pages/activity/yifanshang/index", - "style": { "navigationBarTitleText": "一番赏" } - } - , + "style": { + "navigationBarTitleText": "一番赏" + } + }, { "path": "pages/activity/wuxianshang/index", - "style": { "navigationBarTitleText": "无限赏" } - } - , + "style": { + "navigationBarTitleText": "无限赏" + } + }, { "path": "pages/activity/duiduipeng/index", - "style": { "navigationBarTitleText": "对对碰" } + "style": { + "navigationBarTitleText": "对对碰" + } + }, + { + "path": "pages/activity/list/index", + "style": { + "navigationBarTitleText": "活动列表" + } + }, + { + "path": "pages/activity/pata/index", + "style": { + "navigationBarTitleText": "爬塔" + } }, { "path": "pages/register/register", @@ -118,10 +121,30 @@ "backgroundColor": "#FFFFFF", "borderStyle": "black", "list": [ - { "pagePath": "pages/index/index", "text": "首页", "iconPath": "static/tab/home.png", "selectedIconPath": "static/tab/home_active.png" }, - { "pagePath": "pages/shop/index", "text": "商城", "iconPath": "static/tab/shop.png", "selectedIconPath": "static/tab/shop_active.png" }, - { "pagePath": "pages/cabinet/index", "text": "货柜", "iconPath": "static/tab/box.png", "selectedIconPath": "static/tab/box_active.png" }, - { "pagePath": "pages/mine/index", "text": "我的", "iconPath": "static/tab/profile.png", "selectedIconPath": "static/tab/profile_active.png" } + { + "pagePath": "pages/index/index", + "text": "首页", + "iconPath": "static/tab/home.png", + "selectedIconPath": "static/tab/home_active.png" + }, + { + "pagePath": "pages/shop/index", + "text": "商城", + "iconPath": "static/tab/shop.png", + "selectedIconPath": "static/tab/shop_active.png" + }, + { + "pagePath": "pages/cabinet/index", + "text": "货柜", + "iconPath": "static/tab/box.png", + "selectedIconPath": "static/tab/box_active.png" + }, + { + "pagePath": "pages/mine/index", + "text": "我的", + "iconPath": "static/tab/profile.png", + "selectedIconPath": "static/tab/profile_active.png" + } ] }, "globalStyle": { @@ -131,4 +154,4 @@ "backgroundColor": "#F8F8F8" }, "uniIdRouter": {} -} +} \ No newline at end of file diff --git a/pages/activity/duiduipeng/index.vue b/pages/activity/duiduipeng/index.vue index a66117f..5fcd4ce 100644 --- a/pages/activity/duiduipeng/index.vue +++ b/pages/activity/duiduipeng/index.vue @@ -293,39 +293,38 @@ onLoad((opts) => { diff --git a/pages/activity/list/index.vue b/pages/activity/list/index.vue new file mode 100644 index 0000000..67cfed8 --- /dev/null +++ b/pages/activity/list/index.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/pages/activity/pata/index.vue b/pages/activity/pata/index.vue new file mode 100644 index 0000000..8a0f0d7 --- /dev/null +++ b/pages/activity/pata/index.vue @@ -0,0 +1,374 @@ + + + + + diff --git a/pages/activity/wuxianshang/index.vue b/pages/activity/wuxianshang/index.vue index a81f871..62e9f62 100644 --- a/pages/activity/wuxianshang/index.vue +++ b/pages/activity/wuxianshang/index.vue @@ -1,25 +1,62 @@ @@ -56,98 +79,32 @@ import { ref, computed } from 'vue' import { request, authRequest } from '../../utils/request.js' const products = ref([]) -const columns = ref([[], []]) -const colHeights = ref([0, 0]) const CACHE_KEY = 'products_cache_v1' const TTL_MS = 10 * 60 * 1000 const loading = ref(false) const keyword = ref('') const minPrice = ref('') const maxPrice = ref('') -const displayCount = computed(() => (columns.value[0].length + columns.value[1].length)) -const loadedMap = ref({}) const showNotice = ref(false) const hideForever = ref(false) const skipReloadOnce = ref(false) -function getKey(p) { return String((p && p.id) ?? '') + '|' + String((p && p.image) ?? '') } -function unwrap(list) { - if (Array.isArray(list)) return list - const obj = list || {} - const data = obj.data || {} - const arr = obj.list || obj.items || data.list || data.items || data - return Array.isArray(arr) ? arr : [] -} -function cleanUrl(u) { - const s = String(u || '').trim() - const m = s.match(/https?:\/\/[^\s'"`]+/) - if (m && m[0]) return m[0] - return s.replace(/[`'\"]/g, '').trim() -} + function apiGet(url, data = {}) { const token = uni.getStorageSync('token') const fn = token ? authRequest : request return fn({ url, method: 'GET', data }) } -function getCachedProducts() { - try { - const obj = uni.getStorageSync(CACHE_KEY) - if (obj && Array.isArray(obj.data) && typeof obj.ts === 'number') { - const fresh = Date.now() - obj.ts < TTL_MS - if (fresh) return obj.data - } - } catch (_) {} - return null -} - -function setCachedProducts(list) { - try { - uni.setStorageSync(CACHE_KEY, { data: Array.isArray(list) ? list : [], ts: Date.now() }) - } catch (_) {} -} - -function estimateHeight(p) { - const base = 220 - const len = String(p.title || '').length - const lines = Math.min(2, Math.ceil(len / 12)) - const titleH = lines * 36 - const stockH = p.stock !== null && p.stock !== undefined ? 34 : 0 - const padding = 28 - return base + titleH + stockH + padding -} - -function distributeToColumns(list) { - const arr = Array.isArray(list) ? list : [] - const cols = Array.from({ length: 2 }, () => []) - const hs = [0, 0] - for (let i = 0; i < arr.length; i++) { - const h = estimateHeight(arr[i]) - const idx = hs[0] <= hs[1] ? 0 : 1 - cols[idx].push(arr[i]) - hs[idx] += h - } - columns.value = cols - colHeights.value = hs - const presentKeys = new Set(arr.map(getKey)) - const next = {} - const prev = loadedMap.value || {} - for (const k in prev) { if (presentKeys.has(k)) next[k] = prev[k] } - loadedMap.value = next -} - -function extractListAndTotal(payload) { - if (Array.isArray(payload)) return { list: payload, total: payload.length } - const obj = payload || {} - const data = obj.data || {} - const list = obj.list || obj.items || data.list || data.items || [] - const totalRaw = obj.total ?? data.total - const total = typeof totalRaw === 'number' ? totalRaw : (Array.isArray(list) ? list.length : 0) - return { list: Array.isArray(list) ? list : [], total } +function cleanUrl(u) { + const s = String(u || '').trim() + const m = s.match(/https?:\/\/[^\s'"`]+/) + if (m && m[0]) return m[0] + return s.replace(/[`'\"]/g, '').trim() } function normalizeProducts(list) { - const arr = unwrap(list) - return arr.map((i, idx) => ({ + if (!Array.isArray(list)) return [] + return list.map((i, idx) => ({ id: i.id ?? i.productId ?? i._id ?? i.sku_id ?? String(idx), image: cleanUrl(i.main_image ?? i.imageUrl ?? i.image_url ?? i.image ?? i.img ?? i.pic ?? ''), title: i.title ?? i.name ?? i.product_name ?? i.sku_name ?? '', @@ -169,14 +126,18 @@ function onProductTap(p) { } } +// Filter logic +const allProducts = ref([]) // Store all fetched products for client-side filtering + function applyFilters() { const k = String(keyword.value || '').trim().toLowerCase() const min = Number(minPrice.value) const max = Number(maxPrice.value) const hasMin = !isNaN(min) && String(minPrice.value).trim() !== '' const hasMax = !isNaN(max) && String(maxPrice.value).trim() !== '' - const list = Array.isArray(products.value) ? products.value : [] - const filtered = list.filter(p => { + + const list = allProducts.value + products.value = list.filter(p => { const title = String(p.title || '').toLowerCase() if (k && !title.includes(k)) return false const priceNum = typeof p.price === 'number' ? p.price : Number(p.price) @@ -190,7 +151,6 @@ function applyFilters() { } return true }) - distributeToColumns(filtered) } function onSearchConfirm() { applyFilters() } @@ -198,56 +158,50 @@ function onApplyFilters() { applyFilters() } async function loadProducts() { try { - const cached = getCachedProducts() - if (cached) { - products.value = cached - distributeToColumns(cached) - return + const cached = uni.getStorageSync(CACHE_KEY) + if (cached && cached.data && Date.now() - cached.ts < TTL_MS) { + allProducts.value = cached.data + applyFilters() + return } + const first = await apiGet('/api/app/products', { page: 1 }) - const { list: firstList, total } = extractListAndTotal(first) + // Simple extraction + let list = [] + let total = 0 + if (first && first.list) { list = first.list; total = first.total } + else if (first && first.data && first.data.list) { list = first.data.list; total = first.data.total } + + // If not too many, fetch all for better client UX const pageSize = 20 - const totalPages = Math.max(1, Math.ceil(((typeof total === 'number' ? total : 0)) / pageSize)) - if (totalPages <= 1) { - const normalized = normalizeProducts(firstList) - products.value = normalized - distributeToColumns(normalized) - setCachedProducts(normalized) - return + const totalPages = Math.ceil((total || 0) / pageSize) + + if (totalPages > 1) { + const tasks = [] + for (let p = 2; p <= totalPages; p++) { + tasks.push(apiGet('/api/app/products', { page: p })) + } + const results = await Promise.allSettled(tasks) + results.forEach(r => { + if (r.status === 'fulfilled') { + const val = r.value + const subList = (val && val.list) || (val && val.data && val.data.list) || [] + if (Array.isArray(subList)) list = list.concat(subList) + } + }) } - const tasks = [] - for (let p = 2; p <= totalPages; p++) { - tasks.push(apiGet('/api/app/products', { page: p })) - } - const results = await Promise.allSettled(tasks) - const restLists = results.map(r => { - if (r.status === 'fulfilled') { - const { list } = extractListAndTotal(r.value) - return Array.isArray(list) ? list : [] - } - return [] - }) - const merged = [firstList, ...restLists].flat() - const normalized = normalizeProducts(merged) - products.value = normalized - distributeToColumns(normalized) - setCachedProducts(normalized) + + const normalized = normalizeProducts(list) + allProducts.value = normalized + applyFilters() + uni.setStorageSync(CACHE_KEY, { data: normalized, ts: Date.now() }) + } catch (e) { + console.error(e) products.value = [] - columns.value = [[], []] - colHeights.value = [0, 0] - const presentKeys = new Set([]) - const next = {} - const prev = loadedMap.value || {} - for (const k in prev) { if (presentKeys.has(k)) next[k] = prev[k] } - loadedMap.value = next } } -function isLoaded(p) { return !!(loadedMap.value && loadedMap.value[getKey(p)]) } -function onImageLoad(p) { const k = getKey(p); if (!k) return; loadedMap.value = { ...(loadedMap.value || {}), [k]: true } } -function onImageError(p) { const k = getKey(p); if (!k) return; const prev = { ...(loadedMap.value || {}) }; delete prev[k]; loadedMap.value = prev } - onShow(async () => { const token = uni.getStorageSync('token') const phoneBound = !!uni.getStorageSync('phone_bound') @@ -264,21 +218,16 @@ onShow(async () => { }) return } + + // Notice logic try { const sess = String(uni.getStorageSync('app_session_id') || '') const hiddenSess = String(uni.getStorageSync('shop_notice_hidden_session_id') || '') const hiddenThisSession = !!(sess && hiddenSess && hiddenSess === sess) showNotice.value = !hiddenThisSession hideForever.value = hiddenThisSession - } catch (_) { showNotice.value = true; hideForever.value = false } - try { - const skip = !!uni.getStorageSync('shop_skip_reload_once') - if (skipReloadOnce.value || skip) { - skipReloadOnce.value = false - uni.setStorageSync('shop_skip_reload_once', '') - return - } - } catch (_) {} + } catch (_) { showNotice.value = true } + loading.value = true await loadProducts() loading.value = false @@ -297,44 +246,318 @@ function onDismissNotice() { diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..c87ee04 --- /dev/null +++ b/project.config.json @@ -0,0 +1,25 @@ +{ + "setting": { + "es6": true, + "postcss": true, + "minified": true, + "uglifyFileName": false, + "enhance": true, + "packNpmRelationList": [], + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "useCompilerPlugins": false, + "minifyWXML": true + }, + "compileType": "miniprogram", + "simulatorPluginLibVersion": {}, + "packOptions": { + "ignore": [], + "include": [] + }, + "appid": "wx26ad074017e1e63f", + "editorSetting": {} +} \ No newline at end of file diff --git a/project.private.config.json b/project.private.config.json new file mode 100644 index 0000000..e93e819 --- /dev/null +++ b/project.private.config.json @@ -0,0 +1,14 @@ +{ + "libVersion": "3.12.1", + "projectname": "bindbox-mini", + "setting": { + "urlCheck": true, + "coverView": true, + "lazyloadPlaceholderEnable": false, + "skylineRenderEnable": false, + "preloadBackgroundData": false, + "autoAudits": false, + "showShadowRootInWxmlPanel": true, + "compileHotReLoad": true + } +} \ No newline at end of file diff --git a/uni.scss b/uni.scss index b9249e9..0196bd1 100644 --- a/uni.scss +++ b/uni.scss @@ -1,76 +1,175 @@ /** - * 这里是uni-app内置的常用样式变量 - * - * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 - * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App - * + * 奇盒潮玩 - 全局样式系统 + * + * 基于潮玩盲盒风格的设计系统,采用暖橙渐变色调 + * 传递惊喜、期待、活力的品牌调性 */ -/** - * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 - * - * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 - */ +/* ============================================ + 🎨 品牌色彩系统 - 潮玩暖色调 + ============================================ */ -/* 颜色变量 */ +/* 主色 - 暖橙渐变 */ +$primary-orange: #FF9F43; // 活力橙 +$primary-deep: #FF6B35; // 深橙红 +$primary-light: #FFB366; // 浅橙 -/* 行为相关颜色 */ -$uni-color-primary: #007aff; -$uni-color-success: #4cd964; -$uni-color-warning: #f0ad4e; -$uni-color-error: #dd524d; +/* 辅助色 */ +$accent-gold: #FFD166; // 金币黄 +$accent-pink: #FF8FAB; // 少女粉 +$accent-coral: #FF7B7B; // 珊瑚红 +$accent-purple: #A78BFA; // 梦幻紫 + +/* 功能色 */ +$success-color: #10B981; // 成功绿 +$warning-color: #FBBF24; // 警告黄 +$error-color: #EF4444; // 错误红 +$info-color: #3B82F6; // 信息蓝 + +/* 中性色 */ +$text-primary: #1F2937; // 主要文字 +$text-secondary: #6B7280; // 次要文字 +$text-tertiary: #9CA3AF; // 辅助文字 +$text-inverse: #FFFFFF; // 反色文字 + +/* 背景色 */ +$bg-page: #FFF8F3; // 页面暖白底 +$bg-card: #FFFFFF; // 卡片白 +$bg-warm: #FFF4E6; // 暖色面板 +$bg-grey: #F9FAFB; // 冷灰面板 + +/* 边框色 */ +$border-light: #F3F4F6; +$border-normal: #E5E7EB; +$border-warm: rgba(255, 159, 67, 0.2); + +/* ============================================ + ✨ 渐变预设 + ============================================ */ + +/* 注意:Sass变量不能存储CSS渐变值用于直接引用 + 以下为文档记录,使用时直接写CSS */ + +// 主渐变:linear-gradient(135deg, #FF9F43, #FF6B35) +// 金色渐变:linear-gradient(135deg, #FFD166, #FF9F43) +// 粉色渐变:linear-gradient(135deg, #FF8FAB, #FF6B81) +// 卡片高光:linear-gradient(145deg, #FFFFFF, #FFF8F3) + +/* ============================================ + 📐 间距与圆角 + ============================================ */ + +/* 间距 */ +$spacing-xs: 8rpx; +$spacing-sm: 12rpx; +$spacing-md: 16rpx; +$spacing-lg: 24rpx; +$spacing-xl: 32rpx; +$spacing-2xl: 48rpx; + +/* 圆角 */ +$radius-sm: 8rpx; +$radius-md: 12rpx; +$radius-lg: 16rpx; +$radius-xl: 24rpx; +$radius-full: 999rpx; + +/* ============================================ + 🔤 字体系统 + ============================================ */ + +$font-size-xs: 22rpx; +$font-size-sm: 24rpx; +$font-size-base: 28rpx; +$font-size-md: 30rpx; +$font-size-lg: 32rpx; +$font-size-xl: 36rpx; +$font-size-2xl: 44rpx; +$font-size-3xl: 56rpx; + +$font-weight-normal: 400; +$font-weight-medium: 500; +$font-weight-semibold: 600; +$font-weight-bold: 700; + +/* ============================================ + 🌟 阴影效果 + ============================================ */ + +$shadow-sm: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); +$shadow-md: 0 8rpx 24rpx rgba(0, 0, 0, 0.08); +$shadow-lg: 0 16rpx 48rpx rgba(0, 0, 0, 0.12); +$shadow-warm: 0 8rpx 24rpx rgba(255, 107, 53, 0.15); +$shadow-glow: 0 4rpx 16rpx rgba(255, 159, 67, 0.4); + +/* ============================================ + 🔄 动画时长 + ============================================ */ + +$transition-fast: 0.15s; +$transition-normal: 0.25s; +$transition-slow: 0.35s; +$ease-out: cubic-bezier(0.4, 0, 0.2, 1); +$ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55); + +/* ============================================ + 📱 兼容uni-app官方变量 + ============================================ */ + +/* 行为相关颜色 - 使用新配色 */ +$uni-color-primary: $primary-orange; +$uni-color-success: $success-color; +$uni-color-warning: $warning-color; +$uni-color-error: $error-color; /* 文字基本颜色 */ -$uni-text-color:#333;//基本色 -$uni-text-color-inverse:#fff;//反色 -$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 -$uni-text-color-placeholder: #808080; -$uni-text-color-disable:#c0c0c0; +$uni-text-color: $text-primary; +$uni-text-color-inverse: $text-inverse; +$uni-text-color-grey: $text-tertiary; +$uni-text-color-placeholder: $text-tertiary; +$uni-text-color-disable: #D1D5DB; /* 背景颜色 */ -$uni-bg-color:#ffffff; -$uni-bg-color-grey:#f8f8f8; -$uni-bg-color-hover:#f1f1f1;//点击状态颜色 -$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 +$uni-bg-color: $bg-card; +$uni-bg-color-grey: $bg-grey; +$uni-bg-color-hover: #FFF0E6; +$uni-bg-color-mask: rgba(0, 0, 0, 0.5); /* 边框颜色 */ -$uni-border-color:#c8c7cc; +$uni-border-color: $border-normal; /* 尺寸变量 */ +$uni-font-size-sm: 12px; +$uni-font-size-base: 14px; +$uni-font-size-lg: 16px; -/* 文字尺寸 */ -$uni-font-size-sm:12px; -$uni-font-size-base:14px; -$uni-font-size-lg:16px; - -/* 图片尺寸 */ -$uni-img-size-sm:20px; -$uni-img-size-base:26px; -$uni-img-size-lg:40px; +$uni-img-size-sm: 20px; +$uni-img-size-base: 26px; +$uni-img-size-lg: 40px; /* Border Radius */ -$uni-border-radius-sm: 2px; -$uni-border-radius-base: 3px; -$uni-border-radius-lg: 6px; +$uni-border-radius-sm: 4px; +$uni-border-radius-base: 8px; +$uni-border-radius-lg: 12px; $uni-border-radius-circle: 50%; /* 水平间距 */ -$uni-spacing-row-sm: 5px; -$uni-spacing-row-base: 10px; -$uni-spacing-row-lg: 15px; +$uni-spacing-row-sm: 6px; +$uni-spacing-row-base: 12px; +$uni-spacing-row-lg: 16px; /* 垂直间距 */ -$uni-spacing-col-sm: 4px; -$uni-spacing-col-base: 8px; -$uni-spacing-col-lg: 12px; +$uni-spacing-col-sm: 6px; +$uni-spacing-col-base: 10px; +$uni-spacing-col-lg: 14px; /* 透明度 */ -$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 +$uni-opacity-disabled: 0.4; /* 文章场景相关 */ -$uni-color-title: #2C405A; // 文章标题颜色 -$uni-font-size-title:20px; -$uni-color-subtitle: #555555; // 二级标题颜色 -$uni-font-size-subtitle:26px; -$uni-color-paragraph: #3F536E; // 文章段落颜色 -$uni-font-size-paragraph:15px; +$uni-color-title: $text-primary; +$uni-font-size-title: 20px; +$uni-color-subtitle: $text-secondary; +$uni-font-size-subtitle: 16px; +$uni-color-paragraph: $text-secondary; +$uni-font-size-paragraph: 15px; \ No newline at end of file