1 line
88 KiB
Plaintext
1 line
88 KiB
Plaintext
{"version":3,"sources":["pages/main/index.uvue","pages/user/login.uvue","uni_modules/ak-req/ak-req.uts"],"sourcesContent":["<!-- pages/main/index.uvue -->\r\n<template>\r\n\t<view class=\"medic-home\">\r\n\t\t<!-- 智能顶部导航栏 - 添加滚动隐藏效果 -->\r\n\t\t<view \r\n\t\t\tclass=\"smart-navbar\" \r\n\t\t\t:style=\"{ \r\n\t\t\t\tpaddingTop: statusBarHeight + 'px',\r\n\t\t\t\ttransform: showNavbar ? 'translateY(0)' : 'translateY(-100%)'\r\n\t\t\t}\"\r\n\t\t>\r\n\t\t\t<view class=\"search-container\" :style=\"{ paddingRight: (navBarRight > 0 ? navBarRight : 16) + 'px' }\">\r\n\t\t\t\t<view class=\"search-box\" @click=\"navigateToSearch\" :style=\"{ height: '30px' }\">\r\n\t\t\t\t\t<!-- 模拟输入框 -->\r\n\t\t\t\t\t<text class=\"search-placeholder\">请输入商品名称、店铺</text>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 扫码图标 -->\r\n\t\t\t\t\t<view class=\"nav-icon-btn\" @click.stop=\"onScan\">\r\n\t\t\t\t\t\t<text class=\"nav-icon\">🔳</text>\r\n\t\t\t\t\t</view>\r\n\r\n\t\t\t\t\t<!-- 相机图标 -->\r\n\t\t\t\t\t<view class=\"nav-camera-btn\" @click.stop=\"onCamera\">\r\n\t\t\t\t\t\t<text class=\"nav-camera-icon\">📷</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t\r\n\t\t\t\t\t<!-- 搜索按钮 -->\r\n\t\t\t\t\t<view class=\"nav-inner-search-btn\" :style=\"{ height: '22px' }\">\r\n\t\t\t\t\t\t<text class=\"nav-inner-search-text\">搜索</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 导航栏占位符 - 移除,改为使用 margin-top -->\r\n\t\t<!-- <view class=\"navbar-placeholder\" :style=\"{ height: (statusBarHeight + 44) + 'px' }\"></view> -->\r\n\t\t\r\n\t\t<!-- 主内容区 -->\r\n\t\t<scroll-view \r\n\t\t\tdirection=\"vertical\" \r\n\t\t\tclass=\"main-scroll\"\r\n\t\t\trefresher-enabled\r\n\t\t\t:refresher-triggered=\"refreshing\"\r\n\t\t\t:lower-threshold=\"50\"\r\n\t\t\t@refresherrefresh=\"onRefresh\"\r\n\t\t\t@scrolltolower=\"loadMore\"\r\n\t\t\t@scroll=\"handleScroll\"\r\n\t\t>\r\n\t\t\t<!-- 健康资讯轮播 (Moved Up) -->\r\n\t\t\t<!-- 健康资讯轮播 (Hidden) -->\r\n <!-- \r\n\t\t\t<view class=\"health-news\">\r\n\t\t\t\t...\r\n\t\t\t</view>\r\n -->\r\n\r\n\t\t\t<!-- 智能健康卡片 (Hidden) -->\r\n\t\t\t<!-- <view class=\"smart-health-card\" :style=\"{ marginTop: (statusBarHeight + 44 + 10) + 'px' }\">\r\n\t\t\t\t<view class=\"health-content\">\r\n\t\t\t\t\t<view class=\"health-header\">\r\n\t\t\t\t\t\t<text class=\"health-title\">智能健康助手</text>\r\n\t\t\t\t\t\t<text class=\"health-subtitle\">根据您的健康数据推荐</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"health-tips\">\r\n\t\t\t\t\t\t<text class=\"tip-item\">💡 按时用药提醒</text>\r\n\t\t\t\t\t\t<text class=\"tip-item\">📋 健康记录跟踪</text>\r\n\t\t\t\t\t\t<text class=\"tip-item\">🩺 在线问诊咨询</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view> -->\r\n\r\n\t\t\t<!-- 智能分类网格 - 完全响应式 -->\r\n\t\t\t<view class=\"smart-categories\" :style=\"{ marginTop: (statusBarHeight + 44 + 10) + 'px' }\">\r\n\t\t\t\t<view class=\"section-header\">\r\n <view class=\"category-tabs-pills\">\r\n\t\t\t\t\t <view :class=\"['tab-pill', { active: categoryTab == 'category' }]\" @click=\"categoryTab = 'category'\">\r\n <text class=\"tab-text\">智能分类</text>\r\n </view>\r\n <view :class=\"['tab-pill', { active: categoryTab == 'brand' }]\" @click=\"categoryTab = 'brand'\">\r\n <text class=\"tab-text\">品牌甄选</text>\r\n </view>\r\n </view>\r\n\t\t\t\t\t<text class=\"section-desc\">快速定位</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t<view class=\"category-grid\" v-if=\"categoryTab === 'category'\">\r\n\t\t\t\t\t<!-- 一级分类 -->\r\n\t\t\t\t\t<view \r\n\t\t\t\t\t\tv-for=\"category in parentCategories\" \r\n\t\t\t\t\t\t:key=\"category.id\"\r\n\t\t\t\t\t\tclass=\"category-card\"\r\n\t\t\t\t\t\t@click=\"onParentCategoryClick(category)\"\r\n\t\t\t\t\t\t:style=\"{ '--card-color': category.color }\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<view class=\"card-icon\">\r\n\t\t\t\t\t\t\t<text class=\"card-icon-text\">{{ category.icon }}</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<text class=\"card-name\">{{ category.name }}</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t\r\n\t\t\t\t<!-- 二级分类 -->\r\n\t\t\t\t<view v-if=\"categoryTab === 'category' && showSubCategories && subCategories.length > 0\" class=\"sub-category-grid\">\r\n\t\t\t\t\t<view class=\"sub-category-header\">\r\n\t\t\t\t\t\t<text class=\"sub-category-title\">{{ selectedParentCategory?.name }}分类</text>\r\n\t\t\t\t\t\t<text class=\"sub-category-close\" @click=\"showSubCategories = false\">✕</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"sub-category-wrapper\">\r\n\t\t\t\t\t\t<view \r\n\t\t\t\t\t\t\tv-for=\"subCat in subCategories\" \r\n\t\t\t\t\t\t\t:key=\"subCat.id\"\r\n\t\t\t\t\t\t\tclass=\"sub-category-card\"\r\n\t\t\t\t\t\t\t@click=\"onSubCategoryClick(subCat)\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t<view class=\"card-icon\">\r\n\t\t\t\t\t\t\t\t<text class=\"card-icon-text\">{{ subCat.icon }}</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t\t<text class=\"card-name\">{{ subCat.name }}</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n \r\n <!-- 品牌列表 -->\r\n <view class=\"category-grid\" v-if=\"categoryTab === 'brand'\">\r\n\t\t\t\t\t<view \r\n\t\t\t\t\t\tv-for=\"brand in brands\" \r\n\t\t\t\t\t\t:key=\"brand.id\"\r\n\t\t\t\t\t\tclass=\"category-card\"\r\n\t\t\t\t\t\t@click=\"switchBrand(brand)\"\r\n\t\t\t\t\t\tstyle=\"--card-color: #5785e5\"\r\n\t\t\t\t\t>\r\n <view class=\"card-icon\" v-if=\"brand.logo_url == null || brand.logo_url == ''\">\r\n\t\t\t\t\t\t\t<text class=\"card-icon-text\">{{ getBrandIcon(brand.name) }}</text>\r\n\t\t\t\t\t\t</view>\r\n <image v-else :src=\"brand.logo_url\" mode=\"aspectFit\" class=\"brand-logo\" style=\"width: 40px; height: 40px; border-radius: 20px;\" />\r\n\t\t\t\t\t\t<text class=\"card-name\">{{ brand.name }}</text>\r\n\t\t\t\t\t</view>\r\n </view>\r\n\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 健康资讯轮播 (Original Position - Removed) -->\r\n\r\n\t\t\t<!-- 智能服务入口 (Hidden) -->\r\n\t\t\t<!-- <view class=\"smart-services\">\r\n\t\t\t\t<view class=\"services-grid\">\r\n\t\t\t\t\t<view class=\"service-card\" @click=\"navigateToConsultation\">\r\n\t\t\t\t\t\t<view class=\"service-icon\" style=\"background: #2196F3;\">\r\n\t\t\t\t\t\t\t<text class=\"service-icon-text\">👨⚕️</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<text class=\"service-name\">在线问诊</text>\r\n\t\t\t\t\t\t<text class=\"service-desc\">三甲医生在线</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"service-card\" @click=\"navigateToPrescription\">\r\n\t\t\t\t\t\t<view class=\"service-icon\" style=\"background: #ff5000;\">\r\n\t\t\t\t\t\t\t<text class=\"service-icon-text\">📋</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<text class=\"service-name\">电子处方</text>\r\n\t\t\t\t\t\t<text class=\"service-desc\">医生开方购药</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"service-card\" @click=\"navigateToOTC\">\r\n\t\t\t\t\t\t<view class=\"service-icon\" style=\"background: #FF9800;\">\r\n\t\t\t\t\t\t\t<text class=\"service-icon-text\">💊</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<text class=\"service-name\">非处方药</text>\r\n\t\t\t\t\t\t<text class=\"service-desc\">安全自主选购</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"service-card\" @click=\"navigateToHealthTools\">\r\n\t\t\t\t\t\t<view class=\"service-icon\" style=\"background: #9C27B0;\">\r\n\t\t\t\t\t\t\t<text class=\"service-icon-text\">🩺</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<text class=\"service-name\">健康工具</text>\r\n\t\t\t\t\t\t<text class=\"service-desc\">健康管理助手</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view> -->\r\n\r\n\t\t\t\t<!-- 热销药品专区 -->\r\n\t\t\t<view class=\"hot-products\">\r\n\t\t\t\t<view class=\"section-header\">\r\n\t\t\t\t\t<view class=\"title-section\">\r\n\t\t\t\t\t\t<text class=\"section-icon\">🔥</text>\r\n\t\t\t\t\t\t<text class=\"section-title\">热销商品</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"sort-tabs\">\r\n\t\t\t\t\t\t<text \r\n\t\t\t\t\t\t\tv-for=\"tab in sortTabs\" \r\n\t\t\t\t\t\t\t:key=\"tab.id\"\r\n\t\t\t\t\t\t\t:class=\"['sort-tab', { active: activeSort === tab.id }]\"\r\n\t\t\t\t\t\t\t@click=\"switchSort(tab.id)\"\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t{{ tab.name }}\r\n\t\t\t\t\t\t</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t\t\r\n\t\t\t\t<view class=\"products-grid\">\r\n\t\t\t\t\t<view \r\n\t\t\t\t\t\tv-for=\"product in hotProducts\" \r\n\t\t\t\t\t\t:key=\"product.id\"\r\n\t\t\t\t\t\tclass=\"product-card\"\r\n\t\t\t\t\t\t@click=\"navigateToProduct(product)\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<image \r\n\t\t\t\t\t\t\tclass=\"product-image\" \r\n\t\t\t\t\t\t\t:src=\"product.main_image_url\" \r\n\t\t\t\t\t\t\tmode=\"aspectFill\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t<text class=\"product-name\" :lines=\"2\">{{ product.name }}</text>\r\n\t\t\t\t\t\t<view class=\"product-bottom\">\r\n\t\t\t\t\t\t\t<text class=\"product-price\">¥{{ product.price }}</text>\r\n\t\t\t\t\t\t\t<view class=\"product-add-btn\" @click.stop=\"addToCart(product)\">\r\n\t\t\t\t\t\t\t\t<text class=\"add-icon\">+</text>\r\n\t\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n <!-- 加载状态提示 -->\r\n\t\t\t\t<view class=\"load-more-status\" v-if=\"loading || showLoadMore\">\r\n\t\t\t\t\t<text class=\"loading-text\">正在加载更多商品...</text>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 家庭常备药 (Hidden) -->\r\n\t\t\t<!-- <view class=\"family-medicine\">\r\n\t\t\t\t<view class=\"section-header\">\r\n\t\t\t\t\t<view class=\"title-section\">\r\n\t\t\t\t\t\t<text class=\"section-icon\">🏠</text>\r\n\t\t\t\t\t\t<text class=\"section-title\">家庭常备药</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<text class=\"section-subtitle\">守护全家健康</text>\r\n\t\t\t\t</view>\r\n\t\t\t\t\r\n\t\t\t\t<view class=\"family-grid\">\r\n\t\t\t\t\t<view \r\n\t\t\t\t\t\tv-for=\"item in familyItems\" \r\n\t\t\t\t\t\t:key=\"item.id\"\r\n\t\t\t\t\t\tclass=\"family-item\"\r\n\t\t\t\t\t\t@click=\"navigateToCategory(item)\"\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<view class=\"family-icon\" :style=\"{ backgroundColor: item.color }\">\r\n\t\t\t\t\t\t\t<text class=\"family-icon-text\">{{ item.icon }}</text>\r\n\t\t\t\t\t\t</view>\r\n\t\t\t\t\t\t<text class=\"family-name\">{{ item.name }}</text>\r\n\t\t\t\t\t\t<text class=\"family-desc\">{{ item.desc }}</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view> -->\r\n\r\n\t\t\t<!-- 智能推荐模块已隐藏 -->\r\n\r\n\t\t\t<!-- 健康提醒 (Hidden) -->\r\n\t\t\t<!-- <view class=\"health-reminder\">\r\n\t\t\t\t<view class=\"reminder-content\">\r\n\t\t\t\t\t<text class=\"reminder-icon\">⏰</text>\r\n\t\t\t\t\t<view class=\"reminder-text\">\r\n\t\t\t\t\t\t<text class=\"reminder-title\">健康提醒</text>\r\n\t\t\t\t\t\t<text class=\"reminder-desc\">您有1个待用药提醒,点击查看详情</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t\t<view class=\"reminder-action\" @click=\"navigateToReminders\">\r\n\t\t\t\t\t\t<text class=\"action-text\">查看</text>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view> -->\r\n\r\n\t\t\t<!-- 底部安全区域 -->\r\n\t\t\t<view class=\"safe-area\"></view>\r\n\t\t</scroll-view>\r\n\t</view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref, reactive, onMounted } from 'vue'\r\nimport { onShow, onLoad } from '@dcloudio/uni-app'\r\nimport supabaseService from '@/utils/supabaseService.uts'\r\nimport type { Product, Category, Brand } from '@/utils/supabaseService.uts'\r\nimport { getCurrentUser } from '@/utils/store.uts'\r\n\r\n// 响应式数据\r\nconst statusBarHeight = ref(0)\r\nconst scrollHeight = ref(0)\r\nconst refreshing = ref(false)\r\nconst loading = ref(false)\r\nconst isFirstShow = ref(true)\r\nconst hasMore = ref(true)\r\nconst activeSort = ref('recommend') // 默认展示智能推荐\r\nconst activeFilter = ref('recommend')\r\nconst currentPage = ref(1)\r\nconst priceAscending = ref(true) // 价格排序方向:true=升序,false=降序\r\n\r\n// 小程序胶囊按钮信息类型\r\ntype CapsuleButtonInfo = {\r\n\tleft: number,\r\n\ttop: number,\r\n\tright: number,\r\n\tbottom: number,\r\n\twidth: number,\r\n\theight: number\r\n}\r\n\r\n// 小程序胶囊按钮信息\r\nconst capsuleButtonInfo = ref<CapsuleButtonInfo | null>(null)\r\nconst navBarRight = ref(0) // 导航栏右侧预留空间\r\n\r\n// 数据源\r\nconst hotProducts = ref<Product[]>([])\r\nconst recommendedProducts = ref<Product[]>([])\r\nconst hotKeywords = ref<string[]>([])\r\n\r\n// 屏幕尺寸检测\r\nconst isMobile = ref(false)\r\nconst showLoadMore = ref(false)\r\n\r\n// 导航栏显示控制\r\nconst showNavbar = ref(true)\r\nconst lastScrollTop = ref(0)\r\nconst scrollThreshold = 30 // 降低滚动阈值,使其更灵敏\r\nconst scrollingUp = ref(false)\r\n\r\n// 分类数据 - 从Supabase获取\r\nconst categoryTab = ref<string>('category')\r\nconst categories = ref<Category[]>([])\r\nconst brands = ref<Brand[]>([])\r\n\r\n// 一级分类和二级分类\r\nconst parentCategories = ref<Category[]>([])\r\nconst subCategories = ref<Category[]>([])\r\nconst selectedParentCategory = ref<Category | null>(null)\r\nconst showSubCategories = ref(false)\r\n\r\n\r\ntype SortTab = {\r\n\tid: string\r\n\tname: string\r\n}\r\n\r\n// 排序标签\r\nconst sortTabs: SortTab[] = [\r\n\t{ id: 'recommend', name: '智能推荐' },\r\n\t{ id: 'sales', name: '销量' },\r\n\t{ id: 'price', name: '价格' },\r\n\t{ id: 'new', name: '新品' },\r\n\t{ id: 'discount', name: '特价' }\r\n]\r\n\r\n\r\n// 健康资讯\r\nconst healthNews = [\r\n\t{\r\n\t\tid: 'news1',\r\n\t\ttitle: '秋季流感预防指南,科学防护健康过冬',\r\n\t\ttag: '健康科普',\r\n\t\timage: 'https://picsum.photos/800/400?random=health1'\r\n\t},\r\n\t{\r\n\t\tid: 'news2',\r\n\t\ttitle: '家庭常备药清单,为家人健康保驾护航',\r\n\t\ttag: '家庭用药',\r\n\t\timage: 'https://picsum.photos/800/400?random=health2'\r\n\t},\r\n\t{\r\n\t\tid: 'news3',\r\n\t\ttitle: '慢性病科学管理,提高生活质量',\r\n\t\ttag: '健康管理',\r\n\t\timage: 'https://picsum.photos/800/400?random=health3'\r\n\t}\r\n]\r\n\r\n// 获取一级分类数据\r\nconst loadCategories = async (): Promise<void> => {\r\n try {\r\n const categoriesData = await supabaseService.getParentCategories()\r\n parentCategories.value = categoriesData\r\n // 兼容其他使用 categories 的地方\r\n categories.value = categoriesData\r\n console.log('一级分类数据:', JSON.stringify(parentCategories.value))\r\n } catch (error) {\r\n console.error('加载分类数据失败:', error)\r\n parentCategories.value = []\r\n categories.value = []\r\n }\r\n}\r\n\r\n// 获取二级分类数据\r\nconst loadSubCategories = async (parentId: string): Promise<void> => {\r\n try {\r\n console.log('[loadSubCategories] 开始加载二级分类, parentId:', parentId)\r\n const subData = await supabaseService.getSubCategories(parentId)\r\n console.log('[loadSubCategories] 获取到二级分类数量:', subData.length)\r\n console.log('[loadSubCategories] 二级分类数据:', JSON.stringify(subData))\r\n subCategories.value = subData\r\n } catch (error) {\r\n console.error('加载子分类数据失败:', error)\r\n subCategories.value = []\r\n }\r\n}\r\n\r\n// 点击一级分类\r\nconst onParentCategoryClick = async (category: Category): Promise<void> => {\r\n console.log('[onParentCategoryClick] 点击一级分类:', category.name, 'id:', category.id)\r\n \r\n // 如果已经选中,则切换显示/隐藏二级分类\r\n if (selectedParentCategory.value != null && selectedParentCategory.value.id === category.id) {\r\n console.log('[onParentCategoryClick] 切换显示状态')\r\n showSubCategories.value = !showSubCategories.value\r\n return\r\n }\r\n \r\n // 选中新的分类\r\n selectedParentCategory.value = category\r\n showSubCategories.value = true\r\n console.log('[onParentCategoryClick] showSubCategories 设置为 true')\r\n \r\n // 加载二级分类\r\n await loadSubCategories(category.id)\r\n \r\n // 如果没有二级分类,直接跳转到分类页\r\n if (subCategories.value.length == 0) {\r\n console.log('[onParentCategoryClick] 没有二级分类,直接跳转到分类页')\r\n uni.setStorageSync('selectedCategory', category.id)\r\n uni.switchTab({\r\n url: '/pages/main/category'\r\n })\r\n }\r\n}\r\n\r\n// 点击二级分类\r\nconst onSubCategoryClick = (category: Category): void => {\r\n // 跳转到分类页面\r\n uni.setStorageSync('selectedCategory', category.id)\r\n const timestamp = Date.now()\r\n const randomParam = Math.random().toString(36).substring(2, 8)\r\n const url = `/pages/main/category?categoryId=${category.id}&name=${encodeURIComponent(category.name)}×tamp=${timestamp}&random=${randomParam}`\r\n \r\n uni.switchTab({\r\n url: '/pages/main/category'\r\n })\r\n}\r\n\r\n// 获取品牌数据\r\nconst loadBrands = async (): Promise<void> => {\r\n try {\r\n const brandsData = await supabaseService.getBrands()\r\n brands.value = brandsData\r\n } catch (e) {\r\n console.error('加载品牌失败:', e)\r\n brands.value = []\r\n }\r\n}\r\n\r\n// 根据品牌名称获取图标\r\nconst getBrandIcon = (name: string): string => {\r\n if (name == null || name === '') {\r\n return '🏢'\r\n }\r\n // 常见品牌图标映射(使用数组方式避免 Object.keys 问题)\r\n const iconKeys = [\r\n '感冒', '发烧', '咳嗽', '消炎', '维生素', '钙片', '胃药', '止痛', '过敏', '皮肤', '眼药水', '口腔', '血压', '血糖', '血脂', '保健', '养生', '减肥', '美容', '母婴', '儿童', '老人', '男性', '女性', '维生素C', '维生素D', '蛋白粉', '鱼油', '蜂胶', '阿胶', '红枣', '枸杞', '菊花', '金银花', '口罩', '消毒液', '体温计', '创可贴', '棉签',\r\n '九芝堂', '同仁堂', '云南白药', '东阿阿胶', '太极', '江中', '三九', '华素制药', '汤臣倍健', '白云山', '修正', '葵花', '哈药', '扬子江', '恒瑞', '复星', '辉瑞', '阿斯利康', '罗氏', '默沙东', '赛诺菲', '诺华', '雅培', '雀巢', '蒙牛', '伊利', '海尔', '美的', '飞利浦', '西门子', '松下', '苏泊尔', '九阳', '华为', '小米', '苹果', '三星'\r\n ]\r\n const iconValues = [\r\n '💊', '🌡️', '😷', '🔬', '💊', '🦴', '🫁', '💉', '🌸', '🧴', '👁️', '🦷', '❤️', '🩸', '💓', '🧬', '🍵', '⚖️', '💅', '👶', '🧒', '👴', '♂️', '♀️', '🍊', '☀️', '🥛', '🐟', '🐝', '🍯', '🫘', '🌿', '🌼', '🌸', '😷', '🧴', '🌡️', '🩹', '🧺',\r\n '📜', '🏛️', '⛰️', '🍯', '☯️', '🌿', '9️⃣', '💊', '💪', '⛰️', '🩹', '🌻', '🧪', '🚢', '🔬', '⭐', '🧬', '🧪', '🧬', '💊', '🧬', '🔬', '🏥', '🥣', '🐄', '🥛', '🏠', '❄️', '🪒', '⚡', '🔋', '🍳', '🥛', '📱', '🍚', '🍎', '📱'\r\n ]\r\n \r\n // 尝试精确匹配\r\n for (let i = 0; i < iconKeys.length; i++) {\r\n if (name === iconKeys[i]) {\r\n return iconValues[i]\r\n }\r\n }\r\n // 尝试模糊匹配\r\n for (let i = 0; i < iconKeys.length; i++) {\r\n if (name.indexOf(iconKeys[i]) !== -1) {\r\n return iconValues[i]\r\n }\r\n }\r\n // 默认返回品牌图标\r\n return '🏢'\r\n}\r\n\r\n// 默认加载商品数量\r\nconst defaultLoadLimit: number = 6\r\n\r\n// 前置声明内部加载函数\r\nconst doLoadHotProducts = async (targetLimit: number, resolve: (value: void) => void, reject: (reason?: any) => void): Promise<void> => {\r\n try {\r\n let products: Product[] = []\r\n const limit = targetLimit\r\n \r\n console.log('加载热销商品,当前排序方式:', activeSort.value, 'limit:', limit)\r\n \r\n switch (activeSort.value) {\r\n case 'sales':\r\n console.log('调用 getProductsBySales')\r\n products = await supabaseService.getProductsBySales(limit)\r\n break\r\n case 'price':\r\n console.log('调用 getProductsByPrice, 升序:', priceAscending.value)\r\n products = await supabaseService.getProductsByPrice(limit, priceAscending.value)\r\n break\r\n case 'new':\r\n console.log('调用 getProductsByNewest')\r\n products = await supabaseService.getProductsByNewest(limit)\r\n break\r\n case 'recommend':\r\n console.log('调用 getSmartRecommendations')\r\n products = await supabaseService.getSmartRecommendations(limit)\r\n break\r\n case 'discount':\r\n console.log('调用 getDiscountProducts')\r\n products = await supabaseService.getDiscountProducts(limit)\r\n break\r\n default:\r\n console.log('调用默认 getProductsBySales')\r\n products = await supabaseService.getProductsBySales(limit)\r\n }\r\n \r\n\t\tconsole.log('加载到的商品数量:', products.length)\r\n\t\tif (products.length > 0) {\r\n\t\t\tconsole.log('Sample Product Merchant IDs:')\r\n\t\t\tfor (let i = 0; i < Math.min(products.length, 3); i++) {\r\n\t\t\t\tconst p = products[i]\r\n\t\t\t\tconsole.log(` - Product: ${p.name}, MerchantID: ${p.merchant_id}`)\r\n\t\t\t}\r\n\t\t}\r\n\t\thotProducts.value = products\r\n } catch (error) {\r\n console.error('加载热销商品失败:', error)\r\n hotProducts.value = []\r\n }\r\n}\r\n\r\n// 获取热销商品(根据当前排序方式)\r\nfunction loadHotProducts(targetLimit: number): Promise<void> {\r\n return new Promise<void>((resolve, reject) => {\r\n doLoadHotProducts(targetLimit, resolve, reject)\r\n })\r\n}\r\n\r\n// 前置声明推荐商品加载函数\r\nconst doLoadRecommendedProducts = async (limit: number, resolve: (value: void) => void, reject: (reason?: any) => void): Promise<void> => {\r\n recommendedProducts.value = await supabaseService.getRecommendedProducts(limit)\r\n resolve()\r\n}\r\n\r\n// 获取推荐商品\r\nfunction loadRecommendedProducts(limit: number): Promise<void> {\r\n return new Promise<void>((resolve, reject) => {\r\n doLoadRecommendedProducts(limit, resolve, reject)\r\n })\r\n}\r\n\r\n// 加载热搜词\r\nconst loadHotKeywords = async (): Promise<void> => {\r\n try {\r\n const keywords = await supabaseService.getHotKeywords(10)\r\n hotKeywords.value = keywords\r\n console.log('加载热搜词:', keywords.length, '个')\r\n } catch (error) {\r\n console.error('加载热搜词失败:', error)\r\n hotKeywords.value = []\r\n }\r\n}\r\n\r\n// 点击热搜词进行搜索\r\nconst searchByKeyword = (keyword: string): void => {\r\n uni.navigateTo({\r\n url: `/pages/mall/consumer/search?keyword=${encodeURIComponent(keyword)}`\r\n })\r\n}\r\n\r\n// 初始化数据\r\nconst initData = async () => {\r\n\t// 首先确保用户资料已加载\r\n\ttry {\r\n\t\tawait getCurrentUser()\r\n\t\tconsole.log('主页初始化:用户资料加载完成')\r\n\t} catch (error) {\r\n\t\tconsole.error('加载用户资料失败:', error)\r\n\t}\r\n\tawait loadCategories()\r\n await loadBrands()\r\n\tawait loadHotKeywords()\r\n\tawait loadHotProducts(defaultLoadLimit)\r\n\tawait loadRecommendedProducts(defaultLoadLimit)\r\n}\r\n\r\n\r\n// 家庭常备药\r\nconst familyItems = [\r\n\t{\r\n\t\tid: 'family1',\r\n\t\tname: '创可贴',\r\n\t\tdesc: '伤口护理',\r\n\t\ticon: '🩹',\r\n\t\tcolor: '#FF5722',\r\n\t\tcategoryId: 'external'\r\n\t},\r\n\t{\r\n\t\tid: 'family2',\r\n\t\tname: '体温计',\r\n\t\tdesc: '健康监测',\r\n\t\ticon: '🌡️',\r\n\t\tcolor: '#2196F3',\r\n\t\tcategoryId: 'device'\r\n\t},\r\n\t{\r\n\t\tid: 'family3',\r\n\t\tname: '消毒酒精',\r\n\t\tdesc: '环境消毒',\r\n\t\ticon: '🧪',\r\n\t\tcolor: '#ff5000',\r\n\t\tcategoryId: 'external'\r\n\t},\r\n\t{\r\n\t\tid: 'family4',\r\n\t\tname: '口罩',\r\n\t\tdesc: '日常防护',\r\n\t\ticon: '😷',\r\n\t\tcolor: '#607D8B',\r\n\t\tcategoryId: 'device'\r\n\t},\r\n\t{\r\n\t\tid: 'family5',\r\n\t\tname: '退热贴',\r\n\t\tdesc: '物理降温',\r\n\t\ticon: '🧊',\r\n\t\tcolor: '#00BCD4',\r\n\t\tcategoryId: 'cold'\r\n\t},\r\n\t{\r\n\t\tid: 'family6',\r\n\t\tname: '棉签纱布',\r\n\t\tdesc: '伤口处理',\r\n\t\ticon: '🩹',\r\n\t\tcolor: '#FF9800',\r\n\t\tcategoryId: 'external'\r\n\t}\r\n]\r\n\r\n// 初始化页面\r\nconst initPage = () => {\r\n\tconst systemInfo = uni.getSystemInfoSync()\r\n\tstatusBarHeight.value = systemInfo.statusBarHeight\r\n\t\r\n\t// 获取小程序胶囊按钮信息\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\r\n\tnavBarRight.value = 0 // 非小程序不需要预留空间\r\n\r\n\t\r\n\t// 计算滚动区域高度 - 不再需要手动计算,使用 Flex 布局自动撑开\r\n\t// scrollHeight.value = windowHeight - 50 \r\n\t\r\n\t// 检测屏幕尺寸\r\n\tconst screenWidth = systemInfo.screenWidth\r\n\tisMobile.value = screenWidth < 768 // 小于768px为小屏幕\r\n}\r\n\r\n// 生命周期\r\nonMounted(() => {\r\n\tinitPage()\r\n\tinitData()\r\n})\r\n\r\n// 页面显示时重置状态\r\nonShow(() => {\r\n\tconsole.log('=== index页面onShow被调用 ===')\r\n\tconsole.log('主页重新显示,重置页面状态')\r\n\t\r\n\t// 重置导航栏显示状态\r\n\tshowNavbar.value = true\r\n\tlastScrollTop.value = 0\r\n\t\r\n\t// 重置滚动位置到顶部\r\n\t// 注意:这里不能直接操作scroll-view的滚动位置\r\n\t// 但可以重置一些页面状态\r\n\t\r\n\t// 注意:这里不再清除selectedCategory\r\n\t// 让分类页面在成功读取后自行清除\r\n\t// 这样可以确保分类页面能正确读取到传递的数据\r\n\t\r\n\t// 每次页面显示时尝试更新用户资料\r\n\tif (!isFirstShow.value) {\r\n\t\tgetCurrentUser().then(profile => {\r\n\t\t\tif (profile != null) {\r\n\t\t\t\tconsole.log('主页onShow:用户资料更新成功')\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log('主页onShow:用户资料为空,可能未登录')\r\n\t\t\t}\r\n\t\t}).catch(error => {\r\n\t\t\tconsole.error('主页onShow:加载用户资料失败:', error)\r\n\t\t})\r\n\t} else {\r\n\t\tisFirstShow.value = false\r\n\t\tconsole.log('主页首次显示,跳过onShow中的用户资料检查,交由initData处理')\r\n\t}\r\n\t\r\n\tconsole.log('=== index页面onShow执行完成 ===')\r\n})\r\n\r\n// 处理滚动事件\r\nconst handleScroll = (event: any) => {\r\n\ttry {\r\n\t\tconst eventObj = event as UTSJSONObject\r\n\t\tconst detailRaw = eventObj.get('detail')\r\n\t\tif (detailRaw == null) return\r\n\t\tconst detail = detailRaw as UTSJSONObject\r\n\t\tconst scrollTop = detail.getNumber('scrollTop') ?? 0\r\n\t\tconst currentTime = Date.now()\r\n\t\t\r\n\t\t// 判断滚动方向\r\n\t\tif (scrollTop > lastScrollTop.value) {\r\n\t\t\t// 向下滚动\r\n\t\t\tscrollingUp.value = false\r\n\t\t\t// 向下滚动超过阈值时隐藏导航栏\r\n\t\t\tif (scrollTop > scrollThreshold && showNavbar.value) {\r\n\t\t\t\tshowNavbar.value = false\r\n\t\t\t}\r\n\t\t} else if (scrollTop < lastScrollTop.value) {\r\n\t\t\t// 向上滚动\r\n\t\t\tscrollingUp.value = true\r\n\t\t\t// 向上滚动时显示导航栏\r\n\t\t\tif (!showNavbar.value) {\r\n\t\t\t\tshowNavbar.value = true\r\n\t\t\t}\r\n\t\t}\r\n\t\t\r\n\t\t// 滚动到顶部时强制显示导航栏\r\n\t\tif (scrollTop <= 10) {\r\n\t\t\tshowNavbar.value = true\r\n\t\t}\r\n\t\t\r\n\t\tlastScrollTop.value = scrollTop\r\n\t\t\r\n\t\t// 调试信息(开发时可启用)\r\n\t\t// console.log(`Scroll: ${scrollTop}, ShowNavbar: ${showNavbar.value}, ScrollingUp: ${scrollingUp.value}`)\r\n\t} catch (e) {\r\n\t\t// 忽略滚动事件处理错误\r\n\t}\r\n}\r\n\r\n// 重置导航栏显示状态(例如点击回到顶部时)\r\nconst resetNavbar = () => {\r\n\tshowNavbar.value = true\r\n\tlastScrollTop.value = 0\r\n}\r\n\r\n// 切换分类 - 跳转到分类页面并传递分类ID\r\nconst switchCategory = (category: any) => {\r\n\tconsole.log('=== switchCategory函数开始执行 ===')\r\n\t\r\n\t// 将 category 转换为 UTSJSONObject 以访问属性\r\n\tconst catObj = (category instanceof UTSJSONObject) ? (category as UTSJSONObject) : (JSON.parse(JSON.stringify(category)) as UTSJSONObject)\r\n\tconst categoryId = catObj.getString('id') ?? ''\r\n\tconst categoryName = catObj.getString('name') ?? ''\r\n\t\r\n\tconsole.log('分类ID:', categoryId, '分类名称:', categoryName)\r\n\t\r\n\t// 使用Storage传递参数,确保switchTab后能被读取\r\n\tuni.setStorageSync('selectedCategory', categoryId)\r\n\t\r\n\t// 生成唯一的时间戳和随机参数,确保每次跳转都是新的页面\r\n\tconst timestamp = Date.now()\r\n\tconst randomParam = Math.random().toString(36).substring(2, 8)\r\n\t\r\n\t// 构建带参数的URL,直接通过URL传递分类信息\r\n\tconst url = `/pages/main/category?categoryId=${categoryId}&name=${encodeURIComponent(categoryName)}×tamp=${timestamp}&random=${randomParam}`\r\n\r\n uni.switchTab({\r\n url: '/pages/main/category',\r\n success: () => {\r\n // 通过 Storage 传递参数已在上面设置\r\n console.log('跳转分类页面成功,categoryId:', categoryId)\r\n }\r\n })\r\n}\r\n\r\nconst switchBrand = (brand: Brand) => {\r\n // 假设跳转到搜索结果页或者分类页带 filter\r\n uni.navigateTo({\r\n url: `/pages/mall/consumer/search?keyword=${encodeURIComponent(brand.name)}&type=brand&brandId=${brand.id}`\r\n })\r\n}\r\n\r\n// 切换排序\r\nconst switchSort = (sortId: string) => {\r\n\t// 如果点击的是价格排序,切换升序/降序\r\n\tif (sortId === 'price' && activeSort.value === 'price') {\r\n\t\tpriceAscending.value = !priceAscending.value\r\n\t\tconsole.log('切换价格排序方向,升序:', priceAscending.value)\r\n\t} else {\r\n\t\t// 切换到其他排序时,重置价格排序为升序\r\n\t\tif (sortId !== 'price') {\r\n\t\t\tpriceAscending.value = true\r\n\t\t}\r\n\t\tactiveSort.value = sortId\r\n\t}\r\n\thasMore.value = true // 重置加载更多状态\r\n\t// 重新加载热销商品,排序由 Supabase 服务处理\r\n\tloadHotProducts(defaultLoadLimit)\r\n}\r\n\r\n// 切换筛选器\r\nconst switchFilter = (filterId: string) => {\r\n\tactiveFilter.value = filterId\r\n\t// 重新加载推荐商品,筛选由 Supabase 服务处理\r\n\tloadRecommendedProducts(defaultLoadLimit)\r\n}\r\n\r\n// 查看新闻详情\r\nconst viewNewsDetail = (news: any) => {\r\n\tuni.navigateTo({\r\n\t\turl: `/pages/news/detail?id=${news.id}`\r\n\t})\r\n}\r\n\r\n// 下拉刷新\r\nconst onRefresh = async () => {\r\n\trefreshing.value = true\r\n\t\r\n\ttry {\r\n\t\t// 重新加载数据\r\n\t\tawait initData()\r\n\t} catch (e) {\r\n\t\tconsole.error('刷新数据失败:', e)\r\n\t} finally {\r\n\t\t// 延迟关闭刷新动画,确保用户能看到刷新过程\r\n\t\tsetTimeout(() => {\r\n\t\t\trefreshing.value = false\r\n\t\t\t// 延迟显示提示,避免与动画冲突\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: '刷新成功',\r\n\t\t\t\t\ticon: 'success'\r\n\t\t\t\t})\r\n\t\t\t}, 200)\r\n\t\t}, 800)\r\n\t}\r\n}\r\n\r\n// 加载更多\r\nconst loadMore = async () => {\r\n\tconsole.log('=== 触发触底事件 ===')\r\n\tif (loading.value) {\r\n\t\tconsole.log('正在加载中,跳过')\r\n\t\treturn \r\n\t}\r\n\t\r\n\tshowLoadMore.value = true\r\n\tloading.value = true\r\n\ttry {\r\n\t\t// 获取当前热销商品的数量\r\n\t\tconst currentCount = hotProducts.value.length\r\n\t\tconst nextPage = Math.floor(currentCount / 6) + 1\r\n\t\tconst additionalLimit = 6\r\n\t\t\r\n\t\tconsole.log('开始加载更多,当前数量:', currentCount, '页码:', nextPage)\r\n\t\t\r\n\t\t// 加载更多商品\r\n\t\tlet newProducts: Product[] = []\r\n\t\tswitch (activeSort.value) {\r\n\t\t\tcase 'sales':\r\n\t\t\t\tnewProducts = await supabaseService.getProductsBySales(currentCount + additionalLimit)\r\n\t\t\t\tbreak\r\n\t\t\tcase 'price':\r\n\t\t\t\tnewProducts = await supabaseService.getProductsByPrice(currentCount + additionalLimit, priceAscending.value)\r\n\t\t\t\tbreak\r\n\t\t\tcase 'new':\r\n\t\t\t\tnewProducts = await supabaseService.getProductsByNewest(currentCount + additionalLimit)\r\n\t\t\t\tbreak\r\n\t\t\tcase 'recommend':\r\n\t\t\t\tnewProducts = await supabaseService.getSmartRecommendations(currentCount + additionalLimit)\r\n\t\t\t\tbreak\r\n\t\t\tcase 'discount':\r\n\t\t\t\tnewProducts = await supabaseService.getDiscountProducts(currentCount + additionalLimit)\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tnewProducts = await supabaseService.getProductsBySales(currentCount + additionalLimit)\r\n\t\t}\r\n\t\t\r\n\t\tconsole.log('加载到的新商品数量:', newProducts.length)\r\n\t\t\r\n\t\t// 检查是否还有更多数据\r\n\t\tif (newProducts.length <= currentCount) {\r\n\t\t\thasMore.value = false\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '没有更多了',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t} else {\r\n\t\t\t// 更新商品列表\r\n\t\t\thotProducts.value = newProducts\r\n\t\t}\r\n\t} catch (error) {\r\n\t\tconsole.error('加载更多失败:', error)\r\n\t} finally {\r\n\t\tloading.value = false\r\n\t\t// 稍微延迟隐藏加载条,让用户看到\r\n\t\tsetTimeout(() => {\r\n\t\t\tshowLoadMore.value = false\r\n\t\t}, 500)\r\n\t}\r\n}\r\n\r\n// 添加到购物车\r\nconst addToCart = async (product: any) => {\r\n\tuni.showLoading({ title: '检查商品...' })\r\n\ttry {\r\n\t\t// 将 product 转换为 UTSJSONObject 以访问属性\r\n\t\tconst prodObj = (product instanceof UTSJSONObject) ? (product as UTSJSONObject) : (JSON.parse(JSON.stringify(product)) as UTSJSONObject)\r\n\t\tconst productId = prodObj.getString('id') ?? ''\r\n\t\tconst merchantId = prodObj.getString('merchant_id') ?? ''\r\n\t\t\r\n\t\t// 检查商品是否有SKU\r\n\t\tconst skus = await supabaseService.getProductSkus(productId)\r\n\t\tuni.hideLoading()\r\n\t\t\r\n\t\tif (skus.length > 0) {\r\n\t\t\t// 有规格,提示并跳转到商品详情页选择规格\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '请选择规格',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tuni.navigateTo({\r\n\t\t\t\t\turl: '/pages/mall/consumer/product-detail?id=' + productId\r\n\t\t\t\t})\r\n\t\t\t}, 500)\r\n\t\t} else {\r\n\t\t\t// 无规格,直接加入购物车\r\n\t\t\tuni.showLoading({ title: '添加中...' })\r\n\t\t\tconst success = await supabaseService.addToCart(productId, 1, '', merchantId)\r\n\t\t\tuni.hideLoading()\r\n\t\t\tif (success) {\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: '已添加到购物车',\r\n\t\t\t\t\ticon: 'success'\r\n\t\t\t\t})\r\n\t\t\t} else {\r\n\t\t\t\tuni.showToast({\r\n\t\t\t\t\ttitle: '添加失败,请先登录',\r\n\t\t\t\t\ticon: 'none'\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\t} catch (e) {\r\n\t\tconsole.error('添加到购物车异常', e)\r\n\t\tuni.hideLoading()\r\n\t\tuni.showToast({\r\n\t\t\ttitle: '操作异常',\r\n\t\t\ticon: 'none'\r\n\t\t})\r\n\t}\r\n}\r\n\r\n// 扫码功能\r\nconst onScan = (): void => {\r\n uni.scanCode({\r\n success: (res) => {\r\n console.log('扫码成功:', res)\r\n uni.showToast({\r\n title: '扫码成功: ' + res.result,\r\n icon: 'none'\r\n })\r\n },\r\n fail: (err) => {\r\n console.error('扫码失败:', err)\r\n }\r\n })\r\n}\r\n\r\n// 相机功能\r\nconst onCamera = (): void => {\r\n uni.chooseImage({\r\n count: 1,\r\n sourceType: ['camera'],\r\n success: (res) => {\r\n console.log('相机拍摄成功:', res.tempFilePaths[0])\r\n uni.showToast({\r\n title: '已拍摄,正在识别...',\r\n icon: 'loading'\r\n })\r\n setTimeout(() => {\r\n uni.showToast({\r\n title: '识别成功',\r\n icon: 'success'\r\n })\r\n }, 1000)\r\n },\r\n fail: (err) => {\r\n console.error('相机调用失败:', err)\r\n }\r\n })\r\n}\r\n\r\n// 导航函数\r\nconst navigateToSearch = (): void => { uni.navigateTo({ url: '/pages/mall/consumer/search' }) }\r\nconst navigateToNews = (): void => { uni.navigateTo({ url: '/pages/news/list' }) }\r\nconst navigateToProduct = (product: any) => {\r\n\t// 将 product 转换为 UTSJSONObject 以访问属性\r\n\tconst prodObj = (product instanceof UTSJSONObject) ? (product as UTSJSONObject) : (JSON.parse(JSON.stringify(product)) as UTSJSONObject)\r\n\t\r\n\t// 使用productId(如果存在)作为跳转的商品ID,否则使用id\r\n\tconst productId = prodObj.getString('productId') ?? prodObj.getString('id') ?? ''\r\n\tconst name = prodObj.getString('name') ?? ''\r\n\t// 使用 main_image_url\r\n\tconst image = prodObj.getString('main_image_url') ?? prodObj.getString('image') ?? '/static/images/default-product.png'\r\n\tconst price = (prodObj.getNumber('base_price') ?? prodObj.getNumber('price') ?? 0).toString()\r\n\tconst marketPrice = prodObj.getNumber('market_price') ?? prodObj.getNumber('original_price') ?? (parseFloat(price) * 1.2)\r\n\tconst originalPrice = marketPrice.toString()\r\n \r\n // 手动构建URL,避免双重编码问题\r\n\tuni.navigateTo({ \r\n\t\turl: `/pages/mall/consumer/product-detail?id=${productId}&price=${price}&originalPrice=${originalPrice}&name=${encodeURIComponent(name)}&image=${encodeURIComponent(image)}` \r\n\t})\r\n}\r\nconst navigateToCategory = (item: any) => {\r\n\tuni.navigateTo({\r\n\t\turl: `/pages/mall/consumer/search?keyword=${encodeURIComponent(item.name)}&type=family`\r\n\t})\r\n}\r\nconst navigateToConsultation = () => uni.navigateTo({ url: '/pages/medicine/consultation' })\r\nconst navigateToPrescription = () => uni.navigateTo({ url: '/pages/medicine/prescription' })\r\nconst navigateToOTC = () => uni.navigateTo({ url: '/pages/medicine/otc' })\r\nconst navigateToHealthTools = () => uni.navigateTo({ url: '/pages/medicine/tools' })\r\nconst navigateToReminders = () => uni.navigateTo({ url: '/pages/user/reminders' })\r\n</script>\r\n\r\n<style>\r\n/* 全局重置 removed - uniapp-x does not support * selector */\r\n/* .medic-home * {\r\n\tbox-sizing: border-box;\r\n\tmargin: 0;\r\n\tpadding: 0;\r\n} */\r\n\r\n.medic-home {\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\toverflow: hidden;\r\n\tbackground: #f8fafc;\r\n\tfont-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', sans-serif;\r\n\tline-height: 1.5;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n}\r\n\r\n.main-scroll {\r\n\tflex: 1;\r\n\theight: 1px; /* 让 flex 生效并允许滚动 */\r\n\twidth: 100%;\r\n}\r\n\r\n/* 智能导航栏 - 重新设计布局 */\r\n.smart-navbar {\r\n\tposition: fixed;\r\n\ttop: 0;\r\n\tleft: 0;\r\n\tright: 0;\r\n\tbackground-color: #ff5000;\r\n\tz-index: 1000;\r\n\tbox-shadow: 0 2px 12px rgba(255, 80, 0, 0.15);\r\n\ttransition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n/* 导航栏搜索框容器内边距调整 */\r\n.search-container {\r\n\theight: 44px;\r\n\tpadding: 0 16px;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tmax-width: 1400px;\r\n\tmargin: 0 auto;\r\n\twidth: 100%;\r\n}\r\n\r\n/* 搜索框 hover 效果 */\r\n.search-box:hover {\r\n\tbox-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n/* 导航栏搜索框容器内边距调整 */\r\n.search-box {\r\n\tflex: 1;\r\n\tmax-width: 600px;\r\n\tbackground: #f0f0f0;\r\n\tborder-radius: 20px;\r\n\tpadding: 0 4px 0 12px;\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* UVUE 显式设置 row */\r\n\talign-items: center;\r\n\t/* cursor: pointer; removed for uniapp-x support */\r\n\ttransition: all 0.3s ease;\r\n\twidth: 100%;\r\n\theight: 32px; /* 减小高度,与顶部高度44px适配,略小于顶部高度 */\r\n}\r\n\r\n.search-placeholder {\r\n\tfont-size: 14px;\r\n\tcolor: #999;\r\n\tflex: 1;\r\n\twhite-space: nowrap;\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n}\r\n\r\n.nav-icon-btn {\r\n\tpadding: 4px 8px 4px 4px;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tborder-right: 1px solid #ddd;\r\n\tmargin-right: 8px;\r\n}\r\n\r\n.nav-icon {\r\n\tfont-size: 18px;\r\n}\r\n\r\n/* 搜索按钮高度微调 */\r\n.nav-inner-search-btn {\r\n\tpadding: 0 12px; /* 减小内边距 */\r\n\tbackground-color: #87CEEB; /* 天空蓝 */\r\n\tborder-radius: 16px;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\theight: 24px; /* 随搜索框高度减小而减小 */\r\n}\r\n\r\n.nav-inner-search-text {\r\n\tfont-size: 12px;\r\n\tcolor: #ffffff;\r\n\tfont-weight: normal;\r\n}\r\n\r\n/* 导航栏占位符 */\r\n.navbar-placeholder {\r\n\twidth: 100%;\r\n\tflex-shrink: 0;\r\n}\r\n\r\n.nav-camera-btn {\r\n\tpadding: 4px 8px 4px 4px;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tborder-right-width: 1px;\r\n\tborder-right-style: solid;\r\n\tborder-right-color: #ddd;\r\n\tborder-right: 1px solid #ddd; /* 修复UVUE样式 */\r\n\tmargin-right: 8px;\r\n}\r\n\r\n.nav-camera-icon {\r\n\tfont-size: 20px;\r\n}\r\n\r\n/* 主内容区域 */\r\n.main-scroll {\r\n\tflex: 1;\r\n\tpadding: 0 16px 16px;\r\n\tmax-width: 1400px;\r\n\tmargin-left: auto;\r\n\tmargin-right: auto;\r\n\twidth: 100%;\r\n}\r\n\r\n/* 智能健康卡片 */\r\n.smart-health-card {\r\n\tbackground: linear-gradient(135deg, #2196F3 0%, #1976D2 100%);\r\n\tborder-radius: 16px;\r\n\tpadding: 20px;\r\n\tmargin-bottom: 20px;\r\n\t/* margin-top 由 style 动态控制 */\r\n\tcolor: white;\r\n}\r\n\r\n.health-content {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\t/* gap: 12px; removed for uniapp-x support */\r\n}\r\n\r\n.health-header {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\t/* gap: 4px; removed for uniapp-x support */\r\n\tmargin-bottom: 12px; /* acts as gap for health-content */\r\n}\r\n\r\n.health-title {\r\n\tfont-size: 20px;\r\n\tfont-weight: bold;\r\n\tmargin-bottom: 4px; /* acts as gap for health-header */\r\n}\r\n\r\n.health-subtitle {\r\n\tfont-size: 14px;\r\n\topacity: 0.9;\r\n}\r\n\r\n.health-tips {\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n\t/* gap: 12px; removed for uniapp-x support */\r\n\tmargin-top: 8px;\r\n}\r\n\r\n.tip-item {\r\n\tfont-size: 13px;\r\n\tpadding: 6px 12px;\r\n\tbackground: rgba(255, 255, 255, 0.2);\r\n\tborder-radius: 20px;\r\n\t/* backdrop-filter: blur(10px); removed for uniapp-x support */\r\n\tmargin-right: 12px;\r\n\tmargin-bottom: 12px; /* acts as gap for health-tips */\r\n}\r\n\r\n/* 智能分类网格 */\r\n.smart-categories {\r\n\tbackground: white;\r\n\tborder-radius: 16px;\r\n\tpadding: 20px;\r\n\tmargin-bottom: 20px;\r\n\tbox-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n.section-header {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: flex-start;\r\n\tmargin-bottom: 20px;\r\n}\r\n\r\n.category-tabs-pills {\r\n display: flex;\r\n flex-direction: row;\r\n background-color: #f0f2f5;\r\n padding: 3px;\r\n border-radius: 20px;\r\n align-items: center;\r\n}\r\n\r\n.tab-pill {\r\n padding: 6px 18px;\r\n border-radius: 17px;\r\n transition: all 0.3s;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n.tab-pill.active {\r\n background-color: #fff;\r\n box-shadow: 0 2px 8px rgba(0,0,0,0.08);\r\n}\r\n\r\n.tab-text {\r\n font-size: 14px;\r\n color: #888;\r\n font-weight: normal;\r\n}\r\n\r\n.tab-pill.active .tab-text {\r\n color: #ff5000;\r\n font-weight: bold;\r\n}\r\n\r\n.section-title {\r\n\tfont-size: 18px;\r\n\tfont-weight: bold;\r\n\tcolor: #666;\r\n transition: color 0.3s;\r\n}\r\n\r\n.section-title.active {\r\n color: #ff5000;\r\n font-size: 20px;\r\n}\r\n\r\n.section-desc {\r\n\tfont-size: 14px;\r\n\tcolor: #666;\r\n}\r\n\r\n/* 分类网格布局 */\r\n.category-grid {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* Ensure items are in row */\r\n\tflex-wrap: wrap;\r\n\t/* gap: 16px; removed for uniapp-x support */\r\n\tmargin: 0 -1.5%;\r\n}\r\n\r\n.category-card {\r\n\twidth: 18%; /* 一行5个 */\r\n\tmargin: 0 1% 12px 1%;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tpadding: 10px;\r\n\tbackground: #f8f9fa;\r\n\tborder-radius: 10px;\r\n\t/* cursor: pointer; removed for uniapp-x support */\r\n\ttransition: all 0.3s ease;\r\n\tborder: 1px solid transparent;\r\n\tposition: relative;\r\n}\r\n\r\n.category-card:hover {\r\n\ttransform: translateY(-2px);\r\n\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\r\n\tborder-color: var(--card-color, #ff5000);\r\n}\r\n\r\n/* 二级分类样式 */\r\n.sub-category-grid {\r\n\tbackground: #f8f9fa;\r\n\tborder-radius: 12px;\r\n\tpadding: 16px;\r\n\tmargin-top: 16px;\r\n}\r\n\r\n.sub-category-header {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 12px;\r\n\tpadding-bottom: 8px;\r\n\tborder-bottom: 1px solid #e0e0e0;\r\n}\r\n\r\n.sub-category-title {\r\n\tfont-size: 14px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n}\r\n\r\n.sub-category-close {\r\n\tfont-size: 16px;\r\n\tcolor: #999;\r\n\tpadding: 4px 8px;\r\n}\r\n\r\n.sub-category-wrapper {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tflex-wrap: wrap;\r\n\tjustify-content: flex-start;\r\n}\r\n\r\n.sub-category-card {\r\n\twidth: 23%;\r\n\tbackground: white;\r\n\tborder-radius: 8px;\r\n\tpadding: 10px 4px;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tborder: 1px solid #eee;\r\n\tmargin-right: 2%;\r\n\tmargin-bottom: 10px;\r\n}\r\n\r\n.sub-category-card .card-icon {\r\n\twidth: 36px;\r\n\theight: 36px;\r\n\tborder-radius: 18px;\r\n\tmargin-bottom: 6px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.sub-category-card .card-icon-text {\r\n\tfont-size: 18px;\r\n}\r\n\r\n.sub-category-card .card-name {\r\n\tfont-size: 11px;\r\n\tcolor: #333;\r\n\ttext-align: center;\r\n\tlines: 1;\r\n\ttext-overflow: ellipsis;\r\n}\r\n\r\n.card-icon {\r\n\twidth: 44px;\r\n\theight: 44px;\r\n\tborder-radius: 22px;\r\n\tbackground: var(--card-color, #ff5000);\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n.card-icon-text {\r\n\tfont-size: 20px;\r\n\tcolor: white;\r\n}\r\n\r\n.card-name {\r\n\tfont-size: 12px;\r\n\tfont-weight: normal;\r\n\tcolor: #333;\r\n\tmargin-bottom: 4px;\r\n\ttext-align: center;\r\n\twidth: 100%;\r\n}\r\n\r\n.card-desc {\r\n\tfont-size: 12px;\r\n\tcolor: #666;\r\n\ttext-align: center;\r\n}\r\n\r\n/* 二级分类样式 */\r\n.sub-category-grid {\r\n\tbackground: #f8f9fa;\r\n\tborder-radius: 12px;\r\n\tpadding: 16px;\r\n\tmargin-top: 16px;\r\n}\r\n\r\n.sub-category-header {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 12px;\r\n\tpadding-bottom: 8px;\r\n\tborder-bottom: 1px solid #e0e0e0;\r\n}\r\n\r\n.sub-category-title {\r\n\tfont-size: 14px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n}\r\n\r\n.sub-category-close {\r\n\tfont-size: 16px;\r\n\tcolor: #999;\r\n\tpadding: 4px 8px;\r\n}\r\n\r\n.sub-category-wrapper {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tflex-wrap: wrap;\r\n\tjustify-content: flex-start;\r\n}\r\n\r\n.sub-category-card {\r\n\twidth: 23%;\r\n\tbackground: white;\r\n\tborder-radius: 8px;\r\n\tpadding: 10px 4px;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tborder: 1px solid #eee;\r\n\tmargin-right: 2%;\r\n\tmargin-bottom: 10px;\r\n}\r\n\r\n.sub-category-card .card-icon {\r\n\twidth: 36px;\r\n\theight: 36px;\r\n\tborder-radius: 18px;\r\n\tmargin-bottom: 6px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.sub-category-card .card-icon-text {\r\n\tfont-size: 18px;\r\n}\r\n\r\n.sub-category-card .card-name {\r\n\tfont-size: 11px;\r\n\tcolor: #333;\r\n\ttext-align: center;\r\n\tlines: 1;\r\n\ttext-overflow: ellipsis;\r\n}\r\n\r\n/* 健康资讯 */\r\n.health-news {\r\n\tbackground: white;\r\n\tborder-radius: 16px;\r\n\tpadding: 20px;\r\n\tmargin-bottom: 20px;\r\n\tbox-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n.news-header {\r\n\tdisplay: flex;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tmargin-bottom: 16px;\r\n}\r\n\r\n.news-title {\r\n\tfont-size: 18px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n}\r\n\r\n.news-more {\r\n\tfont-size: 14px;\r\n\tcolor: #ff5000;\r\n\t/* cursor: pointer; removed for uvue support */\r\n}\r\n\r\n.news-swiper {\r\n\theight: 200px;\r\n\tborder-radius: 12px;\r\n\toverflow: hidden;\r\n}\r\n\r\n.news-content {\r\n\tposition: relative;\r\n\theight: 100%;\r\n\tborder-radius: 12px;\r\n\toverflow: hidden;\r\n}\r\n\r\n.news-image {\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tdisplay: flex;\r\n}\r\n\r\n.news-caption {\r\n\tfont-size: 16px;\r\n\tfont-weight: bold;\r\n\tline-height: 1.4;\r\n\tdisplay: flex;\r\n}\r\n\r\n/* 智能服务 */\r\n.smart-services {\r\n\tbackground: white;\r\n\tborder-radius: 16px;\r\n\tpadding: 20px;\r\n\tmargin-bottom: 20px;\r\n\tbox-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n.services-grid {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* Ensure items are in row */\r\n\tflex-wrap: wrap;\r\n\t/* gap: 20px; removed for uniapp-x support */\r\n\tmargin: 0 -1.5%;\r\n}\r\n\r\n.service-card {\r\n\twidth: 47%; /* 50 - 3 */\r\n\tmargin: 0 1.5% 20px 1.5%;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tpadding: 20px;\r\n\tbackground: #f8f9fa;\r\n\tborder-radius: 12px;\r\n\t/* cursor: pointer; removed for uvue support */\r\n\ttransition: all 0.3s ease;\r\n}\r\n\r\n.service-card:hover {\r\n\ttransform: translateY(-4px);\r\n\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.service-icon {\r\n\twidth: 60px;\r\n\theight: 60px;\r\n\tborder-radius: 30px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n.service-icon-text {\r\n\tfont-size: 28px;\r\n\tcolor: white;\r\n}\r\n\r\n.service-name {\r\n\tfont-size: 15px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n\tmargin-bottom: 4px;\r\n}\r\n\r\n.service-desc {\r\n\tfont-size: 12px;\r\n\tcolor: #666;\r\n}\r\n\r\n/* 热搜词区域 */\r\n.hot-keywords-section {\r\n\tbackground: white;\r\n\tborder-radius: 16px;\r\n\tpadding: 20px;\r\n\tmargin-bottom: 20px;\r\n}\r\n\r\n.keywords-list {\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n\tmargin-top: 15px;\r\n}\r\n\r\n.keyword-item {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tpadding: 8px 16px;\r\n\tbackground: #f5f5f5;\r\n\tborder-radius: 20px;\r\n\ttransition: all 0.2s ease;\r\n}\r\n\r\n.keyword-item:hover {\r\n\tbackground: #fff0f0;\r\n}\r\n\r\n.keyword-rank {\r\n\twidth: 20px;\r\n\theight: 20px;\r\n\tborder-radius: 10px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tfont-size: 12px;\r\n\tfont-weight: bold;\r\n\tcolor: #999;\r\n\tbackground: #eee;\r\n\tmargin-right: 8px;\r\n}\r\n\r\n.keyword-rank.top-three {\r\n\tbackground: #ff4757;\r\n\tcolor: white;\r\n}\r\n\r\n.keyword-text {\r\n\tfont-size: 14px;\r\n\tcolor: #333;\r\n}\r\n\r\n/* 热销药品 */\r\n.hot-products {\r\n\tbackground: white;\r\n\tborder-radius: 16px;\r\n\tpadding: 20px;\r\n\tmargin-bottom: 20px;\r\n\tbox-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n.section-header {\r\n\tdisplay: flex;\r\n\tflex-direction: column; /* 标题和筛选器垂直排列 */\r\n\talign-items: flex-start;\r\n\tmargin-bottom: 20px;\r\n\twidth: 100%;\r\n}\r\n\r\n.title-section {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\t/* gap: 8px; removed */\r\n\twidth: 100%;\r\n}\r\n\r\n.section-icon {\r\n\tfont-size: 20px;\r\n\tcolor: #ff5000;\r\n margin-right: 8px; /* Replacement for gap */\r\n}\r\n\r\n.sort-tabs {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* UVUE 显式设置 row */\r\n\t/* gap: 8px; removed */\r\n\talign-items: center;\r\n\tflex-wrap: wrap; /* 允许换行,实现自适应 */\r\n\tjustify-content: flex-start;\r\n\twidth: 100%;\r\n\tmargin-top: 12px;\r\n}\r\n\r\n.sort-tab {\r\n\tfont-size: 13px;\r\n\tcolor: #666;\r\n\tpadding: 8px 12px; /* 增加左右内边距 */\r\n\tborder-radius: 20px;\r\n\tborder: 1px solid #e0e0e0;\r\n\t/* cursor: pointer; removed for uvue support */\r\n\ttransition: all 0.2s ease;\r\n\twhite-space: nowrap;\r\n\tflex: 1; /* 均分宽度 */\r\n\tmin-width: 70px; /* 设置最小宽度防止过窄 */\r\n\ttext-align: center;\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\talign-items: center;\r\n margin-right: 8px; /* Replacement for gap */\r\n}\r\n\r\n.sort-tab.active {\r\n\tbackground: #ff5000;\r\n\tcolor: white;\r\n\tborder-color: #ff5000;\r\n}\r\n\r\n.sort-tab:hover {\r\n\tbackground: #f5f5f5;\r\n}\r\n\r\n.sort-tab.active:hover {\r\n\tbackground: #e64a00;\r\n}\r\n\r\n/* 产品网格 */\r\n.products-grid {\r\n\tdisplay: flex; /* 替换 block 为 flex */\r\n\tflex-direction: row; /* 确保横向排列 */\r\n\tflex-wrap: wrap; /* 确保网格布局 */\r\n\t/* gap: 10px; removed for uniapp-x support */\r\n justify-content: space-between; /* use space-between instead of gap */\r\n\tmargin-top: 20px;\r\n\tmin-height: 500px; /* 确保有足够高度触发滚动 */\r\n\tpadding-bottom: 20px;\r\n}\r\n\r\n.product-card {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tbackground: #fff;\r\n\tborder-radius: 8px;\r\n\toverflow: hidden;\r\n\twidth: 48%;\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n.product-image {\r\n\twidth: 100%;\r\n\theight: 170px;\r\n\tborder-radius: 8px;\r\n\tmargin-bottom: 8px;\r\n\tbackground: #f5f5f5;\r\n}\r\n\r\n.product-name {\r\n\tfont-size: 13px;\r\n\tcolor: #333;\r\n\tmargin-bottom: 5px;\r\n\tline-height: 1.4;\r\n\theight: 36px;\r\n\toverflow: hidden;\r\n\ttext-overflow: ellipsis;\r\n\tpadding: 0 8px;\r\n}\r\n\r\n.product-bottom {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tjustify-content: space-between;\r\n\talign-items: center;\r\n\tpadding: 0 8px 8px;\r\n}\r\n\r\n.product-price {\r\n\tfont-size: 15px;\r\n\tcolor: #ff5000;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.product-add-btn {\r\n\twidth: 24px;\r\n\theight: 24px;\r\n\tbackground-color: #ff5000;\r\n\tborder-radius: 12px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.add-icon {\r\n\tcolor: #fff;\r\n\tfont-size: 16px;\r\n\tfont-weight: bold;\r\n}\r\n\r\n.cart-btn {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\t/* gap: 6px; removed */\r\n\tbackground: #ff5000;\r\n\tcolor: white;\r\n\tpadding: 8px 12px;\r\n\tborder-radius: 8px;\r\n\tfont-size: 13px;\r\n\tfont-weight: bold;\r\n\t/* cursor: pointer; removed for uvue support */\r\n\ttransition: all 0.2s ease;\r\n}\r\n\r\n.cart-btn:hover {\r\n\tbackground: #388E3C;\r\n}\r\n\r\n.cart-icon {\r\n\tfont-size: 14px;\r\n margin-right: 6px; /* Replacement for gap */\r\n}\r\n\r\n.cart-text {\r\n\tfont-size: 13px;\r\n}\r\n\r\n/* 家庭常备药 */\r\n.family-medicine {\r\n\tbackground: white;\r\n\tborder-radius: 16px;\r\n\tpadding: 20px;\r\n\tmargin-bottom: 20px;\r\n\tbox-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n.section-subtitle {\r\n\tfont-size: 14px;\r\n\tcolor: #666;\r\n\tmargin-left: 12px;\r\n}\r\n\r\n.family-grid {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* Ensure items are in row */\r\n\tflex-wrap: wrap;\r\n\t/* gap: 16px; removed for uniapp-x support */\r\n\tmargin: 0 -1.5%;\r\n\tmargin-top: 20px;\r\n}\r\n\r\n.family-item {\r\n\twidth: 47%; /* 50 - 3 */\r\n\tmargin: 0 1.5% 16px 1.5%;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tpadding: 16px;\r\n\tbackground: #f8f9fa;\r\n\tborder-radius: 12px;\r\n\t/* cursor: pointer; removed for uvue support */\r\n\ttransition: all 0.3s ease;\r\n}\r\n\r\n.family-item:hover {\r\n\ttransform: translateY(-2px);\r\n\tbox-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\r\n}\r\n\r\n.family-icon {\r\n\twidth: 48px;\r\n\theight: 48px;\r\n\tborder-radius: 24px;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n.family-icon-text {\r\n\tfont-size: 20px;\r\n\tcolor: white;\r\n}\r\n\r\n.family-name {\r\n\tfont-size: 14px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n\tmargin-bottom: 4px;\r\n}\r\n\r\n.family-desc {\r\n\tfont-size: 12px;\r\n\tcolor: #666;\r\n}\r\n\r\n/* 智能推荐 */\r\n.smart-recommend {\r\n\tbackground: white;\r\n\tborder-radius: 16px;\r\n\tpadding: 20px;\r\n\tmargin-bottom: 20px;\r\n\tbox-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);\r\n}\r\n\r\n.recommend-filters {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* UVUE 显式设置 row */\r\n\t/* gap: 8px; removed for uniapp-x support */\r\n\talign-items: center;\r\n\tflex-wrap: wrap; /* 允许换行,实现自适应 */\r\n\tjustify-content: flex-start;\r\n\twidth: 100%;\r\n\tmargin-top: 12px;\r\n}\r\n\r\n.filter-item {\r\n\tfont-size: 13px;\r\n\tcolor: #666;\r\n\tpadding: 8px 12px; /* 增加左右内边距 */\r\n\tborder-radius: 20px;\r\n\tborder: 1px solid #e0e0e0;\r\n\t/* cursor: pointer; removed for uvue support */\r\n\ttransition: all 0.2s ease;\r\n\twhite-space: nowrap;\r\n\tflex: 1; /* 均分宽度 */\r\n\tmin-width: 80px; /* 设置最小宽度防止过窄 */\r\n\ttext-align: center;\r\n\tdisplay: flex;\r\n\tjustify-content: center;\r\n\talign-items: center;\r\n\tmargin-right: 8px;\r\n\tmargin-bottom: 8px;\r\n}\r\n\r\n.filter-item.active {\r\n\tbackground: #ff5000;\r\n\tcolor: white;\r\n\tborder-color: #ff5000;\r\n}\r\n\r\n.filter-item:hover {\r\n\tbackground: #f5f5f5;\r\n}\r\n\r\n.filter-item.active:hover {\r\n\tbackground: #e64a00;\r\n}\r\n\r\n.recommend-grid {\r\n\tdisplay: flex;\r\n\tflex-direction: row; /* Ensure items are in row */\r\n\tflex-wrap: wrap;\r\n\t/* gap: 20px; removed for uniapp-x support */\r\n\tmargin: 0 -1.5%;\r\n\tmargin-top: 20px;\r\n}\r\n\r\n.recommend-product {\r\n\twidth: 97%; /* 1 col */\r\n\tmargin: 0 1.5% 20px 1.5%;\r\n\tbackground: #f8f9fa;\r\n\tborder-radius: 12px;\r\n\toverflow: hidden;\r\n\t/* cursor: pointer; removed for uvue support */\r\n\ttransition: all 0.3s ease;\r\n\tborder: 1px solid #e0e0e0;\r\n}\r\n\r\n.recommend-product:hover {\r\n\ttransform: translateY(-4px);\r\n\tbox-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);\r\n}\r\n\r\n.product-image-container {\r\n\tposition: relative;\r\n\theight: 180px;\r\n}\r\n\r\n.product-image-container .product-image {\r\n\twidth: 100%;\r\n\theight: 100%;\r\n\tbackground: white;\r\n}\r\n\r\n.product-tags {\r\n\tposition: absolute;\r\n\ttop: 12px;\r\n\tleft: 12px;\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\t/* gap: 8px; removed */\r\n}\r\n\r\n.product-tag, .featured-tag {\r\n\tpadding: 4px 10px;\r\n\tborder-radius: 10px;\r\n\tfont-size: 11px;\r\n\tfont-weight: bold;\r\n\tcolor: white;\r\n\tmargin-right: 8px;\r\n}\r\n\r\n.product-tag {\r\n\tbackground: rgba(76, 175, 80, 0.9);\r\n}\r\n\r\n.featured-tag {\r\n\tbackground: rgba(255, 87, 34, 0.9);\r\n}\r\n\r\n.product-details {\r\n\tpadding: 16px;\r\n}\r\n\r\n.product-title {\r\n\tfont-size: 16px;\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n\tmargin-bottom: 4px;\r\n\tline-height: 1.4;\r\n\tdisplay: flex;\r\n}\r\n\r\n.product-specification {\r\n\tfont-size: 13px;\r\n\tcolor: #666;\r\n\tmargin-bottom: 12px;\r\n\tdisplay: flex;\r\n}\r\n\r\n.product-rating {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\t/* gap: 8px; removed */\r\n\tmargin-bottom: 12px;\r\n\tfont-size: 13px;\r\n}\r\n\r\n.rating-stars {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\t/* gap: 4px; removed */\r\n\tmargin-right: 8px;\r\n}\r\n\r\n.star-icon {\r\n\tfont-size: 14px;\r\n\tcolor: #FFC107;\r\n\tmargin-right: 2px;\r\n}\r\n\r\n.rating-value {\r\n\tfont-weight: bold;\r\n\tcolor: #333;\r\n}\r\n\r\n.reviews-count {\r\n\tcolor: #666;\r\n}\r\n\r\n.product-actions {\r\n\tdisplay: flex;\r\n\tjustify-content: flex-end;\r\n\tmargin-top: 12px;\r\n}\r\n\r\n.add-to-cart {\r\n\twidth: 36px;\r\n\theight: 36px;\r\n\tborder-radius: 18px;\r\n\tbackground: #ff5000;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\t/* cursor: pointer; removed for uvue support */\r\n\ttransition: all 0.2s ease;\r\n}\r\n\r\n.add-to-cart:hover {\r\n\tbackground: #e64a00;\r\n\ttransform: scale(1.1);\r\n}\r\n\r\n.cart-icon {\r\n\tfont-size: 16px;\r\n\tcolor: white;\r\n}\r\n\r\n/* 健康提醒 */\r\n.health-reminder {\r\n\tbackground: linear-gradient(135deg, #FF9800 0%, #F57C00 100%);\r\n\tborder-radius: 16px;\r\n\tpadding: 16px 20px;\r\n\tmargin-bottom: 20px;\r\n\tcolor: white;\r\n}\r\n\r\n.reminder-content {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\talign-items: center;\r\n\t/* gap: 12px; removed */\r\n}\r\n\r\n.reminder-icon {\r\n\tfont-size: 24px;\r\n\tmargin-right: 12px;\r\n}\r\n\r\n.reminder-text {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\t/* gap: 4px; removed */\r\n}\r\n\r\n.reminder-title {\r\n\tfont-size: 15px;\r\n\tfont-weight: bold;\r\n\tmargin-bottom: 4px;\r\n}\r\n\r\n.reminder-desc {\r\n\tfont-size: 13px;\r\n\topacity: 0.9;\r\n}\r\n\r\n.reminder-action {\r\n\tpadding: 6px 16px;\r\n\tbackground: rgba(255, 255, 255, 0.2);\r\n\tborder-radius: 20px;\r\n\t/* cursor: pointer; removed for uvue support */\r\n\ttransition: all 0.2s ease;\r\n}\r\n\r\n.reminder-action:hover {\r\n\tbackground: rgba(255, 255, 255, 0.3);\r\n}\r\n\r\n.action-text {\r\n\tfont-size: 13px;\r\n\tfont-weight: bold;\r\n}\r\n\r\n/* 加载状态 */\r\n.loading-state {\r\n\tpadding: 40px 0;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.loading-spinner {\r\n\twidth: 32px;\r\n\theight: 32px;\r\n\tborder: 3px solid #f0f0f0;\r\n\tborder-top-color: #ff5000;\r\n\tborder-radius: 16px;\r\n\tmargin-bottom: 12px;\r\n}\r\n\r\n.loading-text {\r\n\tfont-size: 14px;\r\n\tcolor: #666;\r\n}\r\n\r\n.no-more {\r\n\tpadding: 30px 0;\r\n\ttext-align: center;\r\n\tborder-top: 1px solid #f0f0f0;\r\n\tmargin-top: 10px;\r\n}\r\n\r\n.no-more-text {\r\n\tfont-size: 13px;\r\n\tcolor: #999;\r\n}\r\n\r\n/* 安全区域 */\r\n.safe-area {\r\n\theight: 20px;\r\n\twidth: 100%;\r\n}\r\n\r\n/* ===== 响应式设计 ===== */\r\n\r\n/* 小屏手机 (小于414px) */\r\n@media screen and (max-width: 414px) {\r\n\t.search-container {\r\n\t\tpadding: 0 12px;\r\n\t\theight: 44px;\r\n\t}\r\n\t\r\n\t.search-box {\r\n\t\tpadding: 0 4px 0 12px;\r\n\t\tmargin: 0;\r\n\t}\r\n\t\r\n\t.main-scroll {\r\n\t\tpadding: 0 12px 12px;\r\n\t}\r\n\t\r\n\t.category-grid {\r\n\t\tmargin: 0 -1%;\r\n\t\tpadding: 0 4px;\r\n\t}\r\n\t\r\n\t.category-grid .category-card {\r\n\t\twidth: 18%;\r\n\t\tmargin: 0 1% 6px 1%;\r\n\t\tpadding: 4px 0;\r\n\t\tbackground: transparent;\r\n\t\tbox-shadow: none;\r\n\t\tborder: none;\r\n\t}\r\n\t\r\n\t.category-card:hover {\r\n\t\ttransform: none;\r\n\t\tbox-shadow: none;\r\n\t}\r\n\t\r\n\t.card-icon {\r\n\t\twidth: 36px;\r\n\t\theight: 36px;\r\n\t\tborder-radius: 18px;\r\n\t\tmargin-bottom: 4px;\r\n\t}\r\n\t\r\n\t.card-icon-text {\r\n\t\tfont-size: 18px;\r\n\t}\r\n\t\r\n\t.card-name {\r\n\t\tfont-size: 10px;\r\n\t\tfont-weight: normal;\r\n\t\tcolor: #333;\r\n\t}\r\n\t\r\n\t.card-desc {\r\n\t\tdisplay: none;\r\n\t}\r\n\t\r\n\t.services-grid .service-card {\r\n\t\twidth: 23%; /* 4 cols */\r\n\t\tmargin: 0 1% 8px 1%;\r\n\t}\r\n\t\r\n\t.service-card {\r\n\t\tpadding: 10px 4px;\r\n\t\tbackground: #f8f9fa; /* 保持淡色背景 */\r\n\t}\r\n\t\r\n\t.service-icon {\r\n\t\twidth: 40px;\r\n\t\theight: 40px;\r\n\t\tborder-radius: 20px;\r\n\t\tmargin-bottom: 8px;\r\n\t}\r\n\t\r\n\t.service-icon-text {\r\n\t\tfont-size: 20px;\r\n\t}\r\n\t\r\n\t.service-name {\r\n\t\tfont-size: 11px;\r\n\t}\r\n\t\r\n\t.service-desc {\r\n\t\tdisplay: none; /* 隐藏描述 */\r\n\t}\r\n\t\r\n\t.load-more-status {\r\n\t\tpadding: 20px;\r\n\t\tdisplay: flex;\r\n\t\tjustify-content: center;\r\n\t\talign-items: center;\r\n\t\twidth: 100%;\r\n\t}\r\n\t\r\n\t.loading-text {\r\n\t\tcolor: #888;\r\n\t\tfont-size: 14px;\r\n\t}\r\n\r\n\t.products-grid {\r\n\t\t/* column-count: 2; removed for flex */\r\n\t\t/* column-gap: 8px; removed */\r\n\t}\r\n\t\r\n\t.recommend-grid .recommend-product {\r\n\t\twidth: 48%;\r\n\t\tmargin: 0 1% 8px 1%;\r\n\t}\r\n\r\n\t.product-info,\r\n\t.product-details {\r\n\t\tpadding: 6px; /* 极小内边距 */\r\n\t}\r\n\r\n\t.product-name,\r\n\t.product-title {\r\n\t\tfont-size: 13px; /* 调整字体大小 */\r\n\t\theight: 36px; /* 限制高度,防止参差不齐 */\r\n\t\toverflow: hidden;\r\n\t\ttext-overflow: ellipsis;\r\n /* display: webkit-box removed for compatibility */\r\n display: flex;\r\n white-space: nowrap;\r\n\t}\r\n\r\n\t.product-image,\r\n\t.product-image-container {\r\n\t\theight: 140px; /* 稍微减小图片高度适配双列 */\r\n\t}\r\n\r\n\t/* 手机端商品卡片极简模式(热销 & 推荐) */\r\n\t.hot-products .product-spec,\r\n\t.hot-products .manufacturer,\r\n\t.hot-products .original-price,\r\n\t.hot-products .cart-text,\r\n\t.hot-products .sales-info,\r\n\t.hot-products .product-action, /* 隐藏热销区加购按钮 */\r\n\t.smart-recommend .product-specification,\r\n\t.smart-recommend .product-rating,\r\n\t.smart-recommend .original-price,\r\n\t.smart-recommend .product-actions /* 隐藏推荐区加购按钮 */\r\n\t{\r\n\t\tdisplay: none;\r\n\t}\r\n\t\r\n\t.hot-products .product-info,\r\n\t.smart-recommend .product-details {\r\n\t\tpadding: 6px; /* 极小内边距 */\r\n\t}\r\n\t\r\n\t.hot-products .product-image,\r\n\t.hot-products .product-image-container,\r\n\t.smart-recommend .product-image,\r\n\t.smart-recommend .product-image-container {\r\n\t\theight: 110px; /* 进一步减小图片高度 */\r\n\t}\r\n\t\r\n\t.hot-products .product-name,\r\n\t.smart-recommend .product-title {\r\n\t\tmargin-bottom: 2px;\r\n\t\tfont-size: 12px;\r\n\t\tline-height: 1.3;\r\n\t\theight: 32px; /* 限制2行高度 */\r\n\t}\r\n\t\r\n\t.hot-products .price-section,\r\n\t.smart-recommend .price-section {\r\n\t\tmargin-bottom: 0;\r\n\t\tmargin-top: 4px;\r\n\t}\r\n\t\r\n\t.hot-products .price-symbol,\r\n\t.smart-recommend .price-symbol {\r\n\t\tfont-size: 10px;\r\n\t\tcolor: #FF5722;\r\n\t}\r\n\t\r\n\t.hot-products .price-value,\r\n\t.smart-recommend .price-value {\r\n\t\tfont-size: 14px; /* 字体变小 */\r\n\t\tfont-weight: bold;\r\n\t}\r\n\t\r\n\t.family-grid .family-item {\r\n\t\twidth: 23%; /* 4 cols */\r\n\t\tmargin: 0 1% 8px 1%;\r\n\t\tpadding: 8px 4px;\r\n\t\tbackground: #f8f9fa;\r\n\t}\r\n\t\r\n\r\n\t\r\n\t.family-icon {\r\n\t\twidth: 36px;\r\n\t\theight: 36px;\r\n\t\tborder-radius: 18px;\r\n\t\tmargin-bottom: 6px;\r\n\t}\r\n\t\r\n\t.family-icon-text {\r\n\t\tfont-size: 18px;\r\n\t}\r\n\t\r\n\t.family-name {\r\n\t\tfont-size: 11px;\r\n\t}\r\n\t\r\n\t.family-desc {\r\n\t\tdisplay: none;\r\n\t}\r\n\t\r\n\t.news-swiper {\r\n\t\theight: 160px;\r\n\t}\r\n\t\r\n\t.sort-tabs,\r\n\t.recommend-filters {\r\n\t\t/* gap: 8px; removed */\r\n\t\tjustify-content: flex-start; /* 保持左对齐 */\r\n\t\t/* overflow-x: auto; REMOVED for uniapp-x support - use generic view wrapping instead */\r\n\t\t/* flex-wrap: nowrap; REMOVED to allow wrapping on mobile since overflow-x not supported on view */\r\n\t\tpadding-bottom: 4px; /* 滚动条空间 */\r\n\t}\r\n\t\r\n\t.sort-tab,\r\n\t.filter-item {\r\n\t\tpadding: 5px 12px;\r\n\t\tfont-size: 12px;\r\n\t\tflex-shrink: 0; /* 防止被压缩 */\r\n\t\tmin-width: 0; /* CHANGED from auto to 0 */\r\n\t\tflex: 0 0 auto; /* 取消均分 */\r\n\t\tmargin-right: 8px;\r\n\t\tmargin-bottom: 8px; /* Added spacing for wrapped items */\r\n\t}\r\n\t\r\n\t.section-header {\r\n\t\tflex-direction: column;\r\n\t\talign-items: stretch;\r\n\t\t/* gap: 12px; removed */\r\n\t}\r\n\t\r\n\t.title-section {\r\n\t\tjustify-content: center;\r\n\t\tmargin-bottom: 12px;\r\n\t}\r\n\t\r\n\t.sort-tabs,\r\n\t.recommend-filters {\r\n\t\twidth: 100%;\r\n\t\tjustify-content: center;\r\n\t}\r\n}\r\n\r\n/* 中屏手机/小平板 (415px-768px) */\r\n@media screen and (min-width: 415px) and (max-width: 768px) {\r\n\t.search-container {\r\n\t\tpadding: 0 16px;\r\n\t\theight: 44px;\r\n\t}\r\n\t\r\n\t.main-scroll {\r\n\t\t/* 移除 margin-top */\r\n\t}\r\n\t\r\n\t.category-grid .category-card {\r\n\t\twidth: 30.33%;\r\n\t}\r\n\t\r\n\t.services-grid .service-card {\r\n\t\twidth: 47%;\r\n\t}\r\n\t\r\n\t.products-grid {\r\n\t\t/* column-count: 2; removed */\r\n\t}\r\n\t\r\n\t.recommend-grid .recommend-product {\r\n\t\twidth: 47%;\r\n\t}\r\n\t\r\n\t.family-grid .family-item {\r\n\t\twidth: 30.33%;\r\n\t}\r\n\t\r\n\t.sort-tabs,\r\n\t.recommend-filters {\r\n\t\t/* gap: 10px; removed */\r\n\t\tjustify-content: flex-start;\r\n\t}\r\n\t\r\n\t.sort-tab,\r\n\t.filter-item {\r\n\t\tpadding: 6px 14px;\r\n\t\tfont-size: 12px;\r\n\t\tflex-grow: 0;\r\n\t\tmargin-right: 10px;\r\n\t}\r\n\t\r\n\t.section-header {\r\n\t\tflex-direction: column;\r\n\t\talign-items: stretch;\r\n\t\t/* gap: 12px; removed */\r\n\t}\r\n\t\r\n\t.title-section {\r\n\t\tjustify-content: center;\r\n\t\tmargin-bottom: 12px;\r\n\t}\r\n\t\r\n\t.sort-tabs,\r\n\t.recommend-filters {\r\n\t\twidth: 100%;\r\n\t\tjustify-content: center;\r\n\t}\r\n}\r\n\r\n/* 平板设备 (769px-1024px) */\r\n@media screen and (min-width: 769px) and (max-width: 1024px) {\r\n\t.search-container {\r\n\t\tpadding: 0 24px;\r\n\t\theight: 44px;\r\n\t}\r\n\t\r\n\t.nav-search-tools .nav-tool-item {\r\n\t\tdisplay: none;\r\n\t}\r\n\t\r\n\t.main-scroll {\r\n\t\tpadding: 0 24px 20px;\r\n\t}\r\n\t\r\n\t.category-grid .category-card {\r\n\t\twidth: 22%;\r\n\t}\r\n\t\r\n\t.services-grid .service-card {\r\n\t\twidth: 22%;\r\n\t}\r\n\t\r\n\t.product-card {\r\n\t\t/* width: calc((100% - 20px) / 3); */\r\n width: 32%; /* Fallback for calc */\r\n /* margin-right: 1.33%; */\r\n\t}\r\n\t\r\n\t.recommend-grid .recommend-product {\r\n\t\twidth: 47%;\r\n\t}\r\n\t\r\n\t.family-grid .family-item {\r\n\t\twidth: 30.33%;\r\n\t}\r\n\t\r\n\t.news-swiper {\r\n\t\theight: 240px;\r\n\t}\r\n}\r\n\r\n/* 桌面端 (1025px以上) */\r\n@media screen and (min-width: 1025px) {\r\n\t.search-container {\r\n\t\tpadding: 0 32px;\r\n\t\theight: 44px;\r\n\t}\r\n\t\r\n\t.main-scroll {\r\n\t\tpadding: 0 32px 24px;\r\n\t}\r\n\t\r\n\t.category-grid .category-card {\r\n\t\twidth: 13.66%;\r\n\t}\r\n\t\r\n\t.services-grid .service-card {\r\n\t\twidth: 22%;\r\n\t}\r\n\t\r\n\t.product-card {\r\n\t\t/* width: calc((100% - 30px) / 4); */\r\n width: 23%;\r\n /* margin-right: 2%; */\r\n\t}\r\n\t\r\n\t.recommend-grid .recommend-product {\r\n\t\twidth: 30.33%;\r\n\t}\r\n\t\r\n\t.family-grid .family-item {\r\n\t\twidth: 30.33%;\r\n\t}\r\n\t\r\n\t.news-swiper {\r\n\t\theight: 260px;\r\n\t}\r\n}\r\n\r\n/* 大桌面端 (1400px以上) */\r\n@media screen and (min-width: 1400px) {\r\n\t.category-grid {\r\n\t\tmargin-right: -24px;\r\n\t}\r\n\t.category-grid .category-card {\r\n\t\twidth: 17%;\r\n\t\tmargin: 0 1.5% 24px 1.5%;\r\n\t}\r\n\t\r\n\t.product-card {\r\n\t\t/* width: calc((100% - 30px) / 4); */\r\n width: 23%;\r\n /* margin-right: 2%; */\r\n\t}\r\n\t\r\n\t.recommend-grid .recommend-product {\r\n\t\twidth: 22%;\r\n\t}\r\n}\r\n\r\n/* 暗黑模式适配 */\r\n@media (prefers-color-scheme: dark) {\r\n\t.medic-home {\r\n\t\tbackground: #121212;\r\n\t}\r\n\t\r\n\t.smart-categories,\r\n\t.health-news,\r\n\t.smart-services,\r\n\t.hot-products,\r\n\t.family-medicine,\r\n\t.smart-recommend {\r\n\t\tbackground: #1e1e1e;\r\n\t\tborder-color: #333;\r\n\t}\r\n\t\r\n\t.nav-search-box {\r\n\t\tbackground: rgba(30, 30, 30, 0.95);\r\n\t\tborder-color: #444;\r\n\t}\r\n\t\r\n\t.category-card,\r\n\t.service-card,\r\n\t.product-card,\r\n\t.family-item,\r\n\t.recommend-product {\r\n\t\tbackground: #2d2d2d;\r\n\t\tborder-color: #444;\r\n\t}\r\n\t\r\n\t.section-title,\r\n\t.card-name,\r\n\t.service-name,\r\n\t.product-name,\r\n\t.family-name,\r\n\t.product-title,\r\n\t.section-desc,\r\n\t.card-desc,\r\n\t.service-desc,\r\n\t.product-spec,\r\n\t.product-specification,\r\n\t.family-desc {\r\n\t\tcolor: #aaa;\r\n\t}\r\n\t\r\n\t.sort-tab,\r\n\t.filter-item {\r\n\t\tbackground: #333;\r\n\t\tborder-color: #444;\r\n\t\tcolor: #ccc;\r\n\t}\r\n\t\r\n\t.sort-tab.active,\r\n\t.filter-item.active {\r\n\t\tbackground: #ff5000;\r\n\t\tcolor: white;\r\n\t}\r\n\t\r\n\t.sort-tab:hover,\r\n\t.filter-item:hover {\r\n\t\tbackground: #444;\r\n\t}\r\n\t\r\n\t.sort-tab.active:hover,\r\n\t.filter-item.active:hover {\r\n\t\tbackground: #e64a00;\r\n\t}\r\n\t\r\n\t.nav-tool-item {\r\n\t\tbackground: rgba(255, 80, 0, 0.2);\r\n\t\tcolor: #ff5000;\r\n\t}\r\n\t\r\n\t.manufacturer,\r\n\t.sales-count,\r\n\t.reviews-count,\r\n\t.original-price {\r\n\t\tcolor: #888;\r\n\t}\r\n}\r\n</style>\r\n\r\n",null,null],"names":[],"mappings":"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"} |