-
4app.json
-
7pages/home/home.js
-
2pages/home/home.wxml
-
BINpagesA/images/5.png
-
BINpagesA/images/6.jpg
-
BINpagesA/images/amxl.png
-
BINpagesA/images/blf.png
-
BINpagesA/images/lh.png
-
BINpagesA/images/wc.png
-
7pagesA/pages/expert/expert.wxml
-
4pagesA/pages/expert/expert.wxss
-
616pagesA/pages/medicine/medicine.js
-
4pagesA/pages/medicine/medicine.json
-
155pagesA/pages/medicine/medicine.wxml
-
410pagesA/pages/medicine/medicine.wxss
-
605pagesA/pages/medicineDetails/medicineDetails.js
-
4pagesA/pages/medicineDetails/medicineDetails.json
-
175pagesA/pages/medicineDetails/medicineDetails.wxml
-
450pagesA/pages/medicineDetails/medicineDetails.wxss
|
After Width: 300 | Height: 200 | Size: 21 KiB |
|
After Width: 600 | Height: 394 | Size: 37 KiB |
|
After Width: 305 | Height: 271 | Size: 107 KiB |
|
After Width: 605 | Height: 513 | Size: 271 KiB |
|
After Width: 366 | Height: 337 | Size: 123 KiB |
|
After Width: 605 | Height: 528 | Size: 340 KiB |
@ -0,0 +1,616 @@ |
|||||
|
Page({ |
||||
|
data: { |
||||
|
// 原始药品列表数据
|
||||
|
medicineList: [], |
||||
|
// 筛选后的列表
|
||||
|
filteredList: [], |
||||
|
|
||||
|
// 搜索相关
|
||||
|
searchKeyword: '', |
||||
|
|
||||
|
// 筛选相关
|
||||
|
currentCategory: 'all', |
||||
|
|
||||
|
// 分页相关
|
||||
|
page: 1, |
||||
|
pageSize: 12, |
||||
|
hasMore: true, |
||||
|
loading: false, |
||||
|
|
||||
|
// 弹窗控制
|
||||
|
showDetailModal: false, |
||||
|
currentMedicine: null, |
||||
|
|
||||
|
// 滚动相关
|
||||
|
showBackToTop: false, |
||||
|
scrollTop: 0 |
||||
|
}, |
||||
|
|
||||
|
onLoad: function() { |
||||
|
this.initData(); |
||||
|
}, |
||||
|
|
||||
|
onShow: function() { |
||||
|
// 页面显示时刷新数据
|
||||
|
this.refreshList(); |
||||
|
}, |
||||
|
|
||||
|
onPullDownRefresh: function() { |
||||
|
// 下拉刷新
|
||||
|
this.refreshList(); |
||||
|
}, |
||||
|
|
||||
|
onReachBottom: function() { |
||||
|
// 上拉加载更多
|
||||
|
if (this.data.hasMore && !this.data.loading) { |
||||
|
this.loadMore(); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
onPageScroll: function(e) { |
||||
|
// 显示/隐藏返回顶部按钮
|
||||
|
if (e.scrollTop > 300 && !this.data.showBackToTop) { |
||||
|
this.setData({ showBackToTop: true }); |
||||
|
} else if (e.scrollTop <= 300 && this.data.showBackToTop) { |
||||
|
this.setData({ showBackToTop: false }); |
||||
|
} |
||||
|
|
||||
|
this.setData({ scrollTop: e.scrollTop }); |
||||
|
}, |
||||
|
|
||||
|
// 初始化数据
|
||||
|
initData: function() { |
||||
|
const mockData = this.getMockData(); |
||||
|
this.setData({ |
||||
|
medicineList: mockData, |
||||
|
filteredList: mockData |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 获取模拟数据
|
||||
|
getMockData: function() { |
||||
|
return [ |
||||
|
{ |
||||
|
id: 1, |
||||
|
name: "阿莫西林胶囊", |
||||
|
manufacturer: "华北制药股份有限公司", |
||||
|
specification: "0.25g*24粒/盒", |
||||
|
category: "prescription", |
||||
|
categoryText: "处方药", |
||||
|
indication: "用于敏感菌所致的呼吸道感染、泌尿系统感染等", |
||||
|
price: 25.8, |
||||
|
originalPrice: 32.0, |
||||
|
isHot: true, |
||||
|
salesCount: 1280, |
||||
|
stock: 150, |
||||
|
image: "https://via.placeholder.com/300x300/3a7ff3/ffffff?text=阿莫西林", |
||||
|
|
||||
|
expert: { |
||||
|
name: "张明华", |
||||
|
title: "主任医师", |
||||
|
hospital: "北京协和医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/3a7ff3/ffffff?text=张", |
||||
|
reason: "本品为广谱抗生素,对多数革兰氏阳性菌和革兰氏阴性菌均有良好的抗菌作用,是临床常用的一线抗生素。", |
||||
|
expertise: "呼吸内科", |
||||
|
years: 15, |
||||
|
recommendTime: "2024-01-15" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "仁和堂大药房", |
||||
|
address: "北京市朝阳区建国路88号", |
||||
|
phone: "010-88888888", |
||||
|
businessHours: "8:00-22:00", |
||||
|
features: "24小时营业,专业药师咨询,医保定点药店", |
||||
|
distance: "1.2", |
||||
|
latitude: 39.9042, |
||||
|
longitude: 116.4074, |
||||
|
rating: 4.8, |
||||
|
images: [ |
||||
|
"https://via.placeholder.com/400x300/4CAF50/ffffff?text=药店外观", |
||||
|
"https://via.placeholder.com/400x300/2196F3/ffffff?text=店内环境" |
||||
|
] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。成人一次0.5g,每6~8小时1次,一日剂量不超过4g。", |
||||
|
precautions: "青霉素过敏者禁用,用药期间可能出现腹泻、恶心等胃肠道反应。", |
||||
|
storage: "密封,在干燥处保存。", |
||||
|
validity: "24个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 2, |
||||
|
name: "连花清瘟胶囊", |
||||
|
manufacturer: "石家庄以岭药业股份有限公司", |
||||
|
specification: "0.35g*24粒/盒", |
||||
|
category: "chinese", |
||||
|
categoryText: "中成药", |
||||
|
indication: "用于治疗流行性感冒属热毒袭肺证", |
||||
|
price: 28.5, |
||||
|
originalPrice: 35.0, |
||||
|
isHot: true, |
||||
|
salesCount: 2560, |
||||
|
stock: 89, |
||||
|
image: "https://via.placeholder.com/300x300/4CAF50/ffffff?text=连花清瘟", |
||||
|
|
||||
|
expert: { |
||||
|
name: "李芳", |
||||
|
title: "副主任医师", |
||||
|
hospital: "上海瑞金医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/4CAF50/ffffff?text=李", |
||||
|
reason: "在新冠肺炎疫情防控中显示出良好效果,具有清瘟解毒、宣肺泄热的功效,适用于流感治疗。", |
||||
|
expertise: "中医科", |
||||
|
years: 12, |
||||
|
recommendTime: "2024-01-14" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "同济堂药店", |
||||
|
address: "上海市黄浦区南京东路100号", |
||||
|
phone: "021-66666666", |
||||
|
businessHours: "9:00-21:00", |
||||
|
features: "中药配方齐全,提供代煎服务,老字号药店", |
||||
|
distance: "2.5", |
||||
|
latitude: 31.2304, |
||||
|
longitude: 121.4737, |
||||
|
rating: 4.7, |
||||
|
images: [ |
||||
|
"https://via.placeholder.com/400x300/FF9800/ffffff?text=中药柜台" |
||||
|
] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。一次4粒,一日3次。", |
||||
|
precautions: "风寒感冒者不适用,高血压、心脏病患者慎用。", |
||||
|
storage: "密封,置阴凉干燥处。", |
||||
|
validity: "36个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 3, |
||||
|
name: "维生素C片", |
||||
|
manufacturer: "养生堂药业有限公司", |
||||
|
specification: "100mg*60片/瓶", |
||||
|
category: "health", |
||||
|
categoryText: "保健品", |
||||
|
indication: "用于预防和治疗维生素C缺乏症", |
||||
|
price: 18.9, |
||||
|
originalPrice: 24.0, |
||||
|
isHot: false, |
||||
|
salesCount: 890, |
||||
|
stock: 320, |
||||
|
image: "https://via.placeholder.com/300x300/FF9800/ffffff?text=维生素C", |
||||
|
|
||||
|
expert: { |
||||
|
name: "王建国", |
||||
|
title: "执业药师", |
||||
|
hospital: "广州中医药大学附属医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/FF9800/ffffff?text=王", |
||||
|
reason: "增强免疫力,促进铁吸收,抗氧化作用明显,适合日常保健和预防感冒。", |
||||
|
expertise: "临床药学", |
||||
|
years: 8, |
||||
|
recommendTime: "2024-01-13" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "老百姓大药房", |
||||
|
address: "广州市天河区体育西路189号", |
||||
|
phone: "020-77777777", |
||||
|
businessHours: "7:30-23:00", |
||||
|
features: "连锁品牌,价格实惠,会员优惠,支持医保", |
||||
|
distance: "0.8", |
||||
|
latitude: 23.1358, |
||||
|
longitude: 113.3269, |
||||
|
rating: 4.6, |
||||
|
images: [] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。成人一次1片,一日1次。", |
||||
|
precautions: "不宜长期过量服用,肾功能不全者慎用。", |
||||
|
storage: "避光,密封保存。", |
||||
|
validity: "24个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 4, |
||||
|
name: "布洛芬缓释胶囊", |
||||
|
manufacturer: "中美天津史克制药有限公司", |
||||
|
specification: "0.3g*20粒/盒", |
||||
|
category: "otc", |
||||
|
categoryText: "非处方药", |
||||
|
indication: "用于缓解轻至中度疼痛如头痛、关节痛、偏头痛等", |
||||
|
price: 22.5, |
||||
|
originalPrice: 28.0, |
||||
|
isHot: true, |
||||
|
salesCount: 1870, |
||||
|
stock: 120, |
||||
|
image: "https://via.placeholder.com/300x300/9C27B0/ffffff?text=布洛芬", |
||||
|
|
||||
|
expert: { |
||||
|
name: "陈晓东", |
||||
|
title: "主任医师", |
||||
|
hospital: "武汉同济医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/9C27B0/ffffff?text=陈", |
||||
|
reason: "解热镇痛效果确切,缓释剂型作用持久,胃肠道刺激小,适合各种疼痛的缓解。", |
||||
|
expertise: "疼痛科", |
||||
|
years: 20, |
||||
|
recommendTime: "2024-01-12" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "九州通大药房", |
||||
|
address: "武汉市江汉区解放大道688号", |
||||
|
phone: "027-55555555", |
||||
|
businessHours: "8:30-21:30", |
||||
|
features: "药品齐全,支持线上订购,送货上门", |
||||
|
distance: "3.2", |
||||
|
latitude: 30.5928, |
||||
|
longitude: 114.3052, |
||||
|
rating: 4.9, |
||||
|
images: [ |
||||
|
"https://via.placeholder.com/400x300/3F51B5/ffffff?text=现代药店", |
||||
|
"https://via.placeholder.com/400x300/E91E63/ffffff?text=专业服务" |
||||
|
] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。成人一次1粒,一日2次。", |
||||
|
precautions: "胃肠道溃疡患者禁用,不宜长期服用。", |
||||
|
storage: "密封,在阴凉干燥处保存。", |
||||
|
validity: "36个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 5, |
||||
|
name: "盐酸左氧氟沙星片", |
||||
|
manufacturer: "浙江医药股份有限公司", |
||||
|
specification: "0.5g*6片/盒", |
||||
|
category: "prescription", |
||||
|
categoryText: "处方药", |
||||
|
indication: "用于敏感细菌引起的呼吸系统、泌尿系统感染", |
||||
|
price: 42.8, |
||||
|
originalPrice: 56.0, |
||||
|
isHot: false, |
||||
|
salesCount: 560, |
||||
|
stock: 75, |
||||
|
image: "https://via.placeholder.com/300x300/2196F3/ffffff?text=左氧氟沙星", |
||||
|
|
||||
|
expert: { |
||||
|
name: "刘涛", |
||||
|
title: "副主任医师", |
||||
|
hospital: "南京鼓楼医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/2196F3/ffffff?text=刘", |
||||
|
reason: "抗菌谱广,对多种革兰氏阴性菌和阳性菌有效,特别适用于泌尿系统感染的治疗。", |
||||
|
expertise: "泌尿外科", |
||||
|
years: 10, |
||||
|
recommendTime: "2024-01-11" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "金陵大药房", |
||||
|
address: "南京市鼓楼区中山路321号", |
||||
|
phone: "025-44444444", |
||||
|
businessHours: "8:00-21:00", |
||||
|
features: "专业处方药房,药师驻店咨询", |
||||
|
distance: "1.8", |
||||
|
latitude: 32.0603, |
||||
|
longitude: 118.7969, |
||||
|
rating: 4.5, |
||||
|
images: [] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。一次1片,一日1次。", |
||||
|
precautions: "18岁以下患者禁用,孕妇及哺乳期妇女禁用。", |
||||
|
storage: "遮光,密封保存。", |
||||
|
validity: "24个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 6, |
||||
|
name: "板蓝根颗粒", |
||||
|
manufacturer: "广州白云山和记黄埔中药有限公司", |
||||
|
specification: "10g*20袋/盒", |
||||
|
category: "chinese", |
||||
|
categoryText: "中成药", |
||||
|
indication: "清热解毒,凉血利咽,用于肺胃热盛所致的咽喉肿痛", |
||||
|
price: 15.9, |
||||
|
originalPrice: 19.9, |
||||
|
isHot: true, |
||||
|
salesCount: 3200, |
||||
|
stock: 450, |
||||
|
image: "https://via.placeholder.com/300x300/FF5722/ffffff?text=板蓝根", |
||||
|
|
||||
|
expert: { |
||||
|
name: "孙丽", |
||||
|
title: "主治医师", |
||||
|
hospital: "成都中医药大学附属医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/FF5722/ffffff?text=孙", |
||||
|
reason: "传统经典方剂,清热解毒效果显著,特别适合预防和治疗感冒初期症状。", |
||||
|
expertise: "中医内科", |
||||
|
years: 6, |
||||
|
recommendTime: "2024-01-10" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "康恩贝大药房", |
||||
|
address: "成都市锦江区春熙路58号", |
||||
|
phone: "028-33333333", |
||||
|
businessHours: "9:00-22:00", |
||||
|
features: "连锁品牌,中药西药齐全", |
||||
|
distance: "0.5", |
||||
|
latitude: 30.6578, |
||||
|
longitude: 104.0657, |
||||
|
rating: 4.4, |
||||
|
images: [] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "开水冲服。一次1袋,一日3次。", |
||||
|
precautions: "风寒感冒者不适用,糖尿病患者慎用。", |
||||
|
storage: "密封,防潮。", |
||||
|
validity: "36个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 7, |
||||
|
name: "复方甘草片", |
||||
|
manufacturer: "北京双鹤药业股份有限公司", |
||||
|
specification: "100片/瓶", |
||||
|
category: "prescription", |
||||
|
categoryText: "处方药", |
||||
|
indication: "用于镇咳祛痰,适用于感冒咳嗽", |
||||
|
price: 12.5, |
||||
|
originalPrice: 16.0, |
||||
|
isHot: false, |
||||
|
salesCount: 780, |
||||
|
stock: 200, |
||||
|
image: "https://via.placeholder.com/300x300/673AB7/ffffff?text=甘草片", |
||||
|
|
||||
|
expert: { |
||||
|
name: "赵国强", |
||||
|
title: "主任医师", |
||||
|
hospital: "天津医科大学总医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/673AB7/ffffff?text=赵", |
||||
|
reason: "传统止咳良药,镇咳祛痰效果确切,价格实惠,适合普通感冒咳嗽。", |
||||
|
expertise: "呼吸内科", |
||||
|
years: 18, |
||||
|
recommendTime: "2024-01-09" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "天津医药大药房", |
||||
|
address: "天津市和平区南京路128号", |
||||
|
phone: "022-22222222", |
||||
|
businessHours: "8:00-21:30", |
||||
|
features: "国营药店,药品质量有保障", |
||||
|
distance: "2.0", |
||||
|
latitude: 39.1172, |
||||
|
longitude: 117.2056, |
||||
|
rating: 4.3, |
||||
|
images: [] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。一次3-4片,一日3次。", |
||||
|
precautions: "不宜长期服用,孕妇及哺乳期妇女慎用。", |
||||
|
storage: "密封,在干燥处保存。", |
||||
|
validity: "36个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 8, |
||||
|
name: "葡萄糖酸钙口服液", |
||||
|
manufacturer: "哈药集团制药六厂", |
||||
|
specification: "10ml*12支/盒", |
||||
|
category: "otc", |
||||
|
categoryText: "非处方药", |
||||
|
indication: "用于预防和治疗钙缺乏症", |
||||
|
price: 35.0, |
||||
|
originalPrice: 42.0, |
||||
|
isHot: true, |
||||
|
salesCount: 1560, |
||||
|
stock: 180, |
||||
|
image: "https://via.placeholder.com/300x300/00BCD4/ffffff?text=葡萄糖酸钙", |
||||
|
|
||||
|
expert: { |
||||
|
name: "周敏", |
||||
|
title: "副主任医师", |
||||
|
hospital: "西安交通大学第一附属医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/00BCD4/ffffff?text=周", |
||||
|
reason: "钙吸收好,口感适宜,特别适合儿童、孕妇和老年人补钙。", |
||||
|
expertise: "儿科", |
||||
|
years: 14, |
||||
|
recommendTime: "2024-01-08" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "西安医药大药房", |
||||
|
address: "西安市碑林区南大街58号", |
||||
|
phone: "029-11111111", |
||||
|
businessHours: "8:30-21:00", |
||||
|
features: "专业儿科用药,儿童健康咨询", |
||||
|
distance: "1.5", |
||||
|
latitude: 34.2583, |
||||
|
longitude: 108.9426, |
||||
|
rating: 4.7, |
||||
|
images: [] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。一次1-2支,一日3次。", |
||||
|
precautions: "肾功能不全者慎用,不宜与洋地黄类药物同时使用。", |
||||
|
storage: "密封,置阴凉处。", |
||||
|
validity: "24个月" |
||||
|
} |
||||
|
} |
||||
|
]; |
||||
|
}, |
||||
|
|
||||
|
// 获取简短文本(修复undefined问题)
|
||||
|
getShortText: function(text, maxLength) { |
||||
|
if (!text || typeof text !== 'string') { |
||||
|
return ''; |
||||
|
} |
||||
|
if (text.length <= maxLength) { |
||||
|
return text; |
||||
|
} |
||||
|
return text.substring(0, maxLength) + '...'; |
||||
|
}, |
||||
|
|
||||
|
// 搜索输入处理(输入时自动搜索)
|
||||
|
onSearchInput: function(e) { |
||||
|
const keyword = e.detail.value; |
||||
|
this.setData({ |
||||
|
searchKeyword: keyword |
||||
|
}, () => { |
||||
|
// 输入后立即执行筛选
|
||||
|
this.filterList(); |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 清除搜索
|
||||
|
clearSearch: function() { |
||||
|
this.setData({ |
||||
|
searchKeyword: '' |
||||
|
}, () => { |
||||
|
this.filterList(); |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 分类筛选切换
|
||||
|
onCategoryChange: function(e) { |
||||
|
const category = e.currentTarget.dataset.category; |
||||
|
this.setData({ |
||||
|
currentCategory: category |
||||
|
}, () => { |
||||
|
this.filterList(); |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 筛选列表
|
||||
|
filterList: function() { |
||||
|
const { searchKeyword, currentCategory, medicineList } = this.data; |
||||
|
let filteredList = [...medicineList]; |
||||
|
|
||||
|
// 搜索筛选
|
||||
|
if (searchKeyword && searchKeyword.trim()) { |
||||
|
const keyword = searchKeyword.trim().toLowerCase(); |
||||
|
filteredList = filteredList.filter(item => { |
||||
|
// 搜索药品名称
|
||||
|
if (item.name && item.name.toLowerCase().includes(keyword)) { |
||||
|
return true; |
||||
|
} |
||||
|
// 搜索专家姓名
|
||||
|
if (item.expert && item.expert.name && item.expert.name.toLowerCase().includes(keyword)) { |
||||
|
return true; |
||||
|
} |
||||
|
// 搜索适用症状
|
||||
|
if (item.indication && item.indication.toLowerCase().includes(keyword)) { |
||||
|
return true; |
||||
|
} |
||||
|
// 搜索生产厂家
|
||||
|
if (item.manufacturer && item.manufacturer.toLowerCase().includes(keyword)) { |
||||
|
return true; |
||||
|
} |
||||
|
return false; |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
// 分类筛选
|
||||
|
if (currentCategory !== 'all') { |
||||
|
filteredList = filteredList.filter(item => item.category === currentCategory); |
||||
|
} |
||||
|
|
||||
|
this.setData({ |
||||
|
filteredList: filteredList, |
||||
|
page: 1, |
||||
|
hasMore: filteredList.length > this.data.pageSize |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 刷新列表
|
||||
|
refreshList: function() { |
||||
|
wx.showLoading({ |
||||
|
title: '刷新中...', |
||||
|
}); |
||||
|
|
||||
|
// 模拟网络请求
|
||||
|
setTimeout(() => { |
||||
|
const mockData = this.getMockData(); |
||||
|
this.setData({ |
||||
|
medicineList: mockData |
||||
|
}, () => { |
||||
|
// 刷新后重新筛选
|
||||
|
this.filterList(); |
||||
|
}); |
||||
|
|
||||
|
wx.hideLoading(); |
||||
|
wx.stopPullDownRefresh(); |
||||
|
}, 800); |
||||
|
}, |
||||
|
|
||||
|
// 加载更多
|
||||
|
loadMore: function() { |
||||
|
if (!this.data.hasMore) return; |
||||
|
|
||||
|
this.setData({ loading: true }); |
||||
|
|
||||
|
// 模拟网络请求
|
||||
|
setTimeout(() => { |
||||
|
const currentList = this.data.filteredList; |
||||
|
|
||||
|
// 这里简化为直接追加数据(实际项目中应该从服务器获取新数据)
|
||||
|
if (currentList.length < this.data.medicineList.length) { |
||||
|
const allData = this.data.medicineList; |
||||
|
const startIndex = currentList.length; |
||||
|
const endIndex = Math.min(startIndex + 4, allData.length); |
||||
|
const newData = allData.slice(startIndex, endIndex); |
||||
|
|
||||
|
const updatedList = [...currentList, ...newData]; |
||||
|
|
||||
|
this.setData({ |
||||
|
filteredList: updatedList, |
||||
|
hasMore: updatedList.length < allData.length, |
||||
|
loading: false |
||||
|
}); |
||||
|
} else { |
||||
|
this.setData({ |
||||
|
hasMore: false, |
||||
|
loading: false |
||||
|
}); |
||||
|
} |
||||
|
}, 1000); |
||||
|
}, |
||||
|
|
||||
|
// 显示药品详情
|
||||
|
showMedicineDetail: function(e) { |
||||
|
const medId = e.currentTarget.dataset.id; |
||||
|
// const medicine = this.data.filteredList[index];
|
||||
|
// this.setData({
|
||||
|
// showDetailModal: true,
|
||||
|
// currentMedicine: medicine
|
||||
|
// });
|
||||
|
|
||||
|
wx.navigateTo({ |
||||
|
url: `/pagesA/pages/medicineDetails/medicineDetails?id=${medId}`, |
||||
|
}) |
||||
|
}, |
||||
|
|
||||
|
// 详情弹窗关闭
|
||||
|
onDetailModalClose: function() { |
||||
|
this.setData({ |
||||
|
showDetailModal: false |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 返回顶部
|
||||
|
scrollToTop: function() { |
||||
|
wx.pageScrollTo({ |
||||
|
scrollTop: 0, |
||||
|
duration: 300 |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1,4 @@ |
|||||
|
{ |
||||
|
"navigationBarTitleText": "药品推荐", |
||||
|
"usingComponents": {} |
||||
|
} |
||||
@ -0,0 +1,155 @@ |
|||||
|
<!-- 药品推荐主页面 --> |
||||
|
<view class="page-container"> |
||||
|
<!-- 顶部搜索和筛选栏 --> |
||||
|
<view class="top-bar"> |
||||
|
<!-- 搜索框 --> |
||||
|
<view class="search-container"> |
||||
|
<view class="search-box"> |
||||
|
<view class="search-icon">🔍</view> |
||||
|
<input |
||||
|
class="search-input" |
||||
|
placeholder="搜索药品名称、专家或症状" |
||||
|
bindinput="onSearchInput" |
||||
|
value="{{searchKeyword}}" |
||||
|
/> |
||||
|
<view class="search-clear" wx:if="{{searchKeyword}}" bindtap="clearSearch"> |
||||
|
✕ |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 快捷分类筛选 --> |
||||
|
<view class="category-filters"> |
||||
|
<scroll-view class="filters-scroll" scroll-x="true"> |
||||
|
<view class="filter-tag {{currentCategory === 'all' ? 'active' : ''}}" |
||||
|
data-category="all" bindtap="onCategoryChange"> |
||||
|
全部推荐 |
||||
|
</view> |
||||
|
<view class="filter-tag {{currentCategory === 'prescription' ? 'active' : ''}}" |
||||
|
data-category="prescription" bindtap="onCategoryChange"> |
||||
|
处方药 |
||||
|
</view> |
||||
|
<view class="filter-tag {{currentCategory === 'otc' ? 'active' : ''}}" |
||||
|
data-category="otc" bindtap="onCategoryChange"> |
||||
|
非处方药 |
||||
|
</view> |
||||
|
<view class="filter-tag {{currentCategory === 'chinese' ? 'active' : ''}}" |
||||
|
data-category="chinese" bindtap="onCategoryChange"> |
||||
|
中成药 |
||||
|
</view> |
||||
|
<view class="filter-tag {{currentCategory === 'health' ? 'active' : ''}}" |
||||
|
data-category="health" bindtap="onCategoryChange"> |
||||
|
保健品 |
||||
|
</view> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 药品列表 - 网格布局 --> |
||||
|
<view class="medicine-grid"> |
||||
|
<!-- 空状态 --> |
||||
|
<view class="empty-state" wx:if="{{filteredList.length === 0 && !loading}}"> |
||||
|
<image class="empty-image" src="/images/empty-medicine.png" mode="aspectFit" /> |
||||
|
<view class="empty-text" wx:if="{{searchKeyword}}"> |
||||
|
未找到"{{searchKeyword}}"相关的药品 |
||||
|
</view> |
||||
|
<view class="empty-text" wx:else> |
||||
|
暂无药品推荐 |
||||
|
</view> |
||||
|
<button class="empty-btn" bindtap="refreshList">刷新推荐</button> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 药品卡片 --> |
||||
|
<block wx:for="{{filteredList}}" wx:key="id"> |
||||
|
<view class="medicine-card" bindtap="showMedicineDetail" data-id="{{item.id}}"> |
||||
|
<!-- 药品图片 --> |
||||
|
<view class="card-image"> |
||||
|
<image |
||||
|
src="{{item.image || '/images/default-medicine.png'}}" |
||||
|
mode="aspectFill" |
||||
|
class="medicine-img" |
||||
|
/> |
||||
|
<!-- 药品标签 --> |
||||
|
<view class="card-tag {{item.category}}"> |
||||
|
{{item.categoryText}} |
||||
|
</view> |
||||
|
<!-- 热销标签 --> |
||||
|
<view class="hot-tag" wx:if="{{item.isHot}}"> |
||||
|
热销 |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 药品基本信息 --> |
||||
|
<view class="card-content"> |
||||
|
<!-- 药品名称 --> |
||||
|
<view class="medicine-name">{{item.name}}</view> |
||||
|
|
||||
|
<!-- 适用症状(简短) --> |
||||
|
<view class="medicine-indication" wx:if="{{item.indication}}"> |
||||
|
{{getShortText(item.indication, 12)}} |
||||
|
</view> |
||||
|
|
||||
|
<!-- 生产厂家 --> |
||||
|
<view class="manufacturer" wx:if="{{item.manufacturer}}"> |
||||
|
{{getShortText(item.manufacturer, 14)}} |
||||
|
</view> |
||||
|
|
||||
|
<!-- 价格和推荐信息 --> |
||||
|
<view class="card-footer"> |
||||
|
<!-- 价格 --> |
||||
|
<view class="price-section"> |
||||
|
<view class="current-price"> |
||||
|
<text class="price-symbol">¥</text> |
||||
|
<text class="price-value">{{item.price}}</text> |
||||
|
</view> |
||||
|
<view class="original-price" wx:if="{{item.originalPrice}}"> |
||||
|
¥{{item.originalPrice}} |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 推荐专家 --> |
||||
|
<view class="expert-brief"> |
||||
|
<image |
||||
|
src="{{item.expert.avatar || '/images/default-avatar.png'}}" |
||||
|
class="expert-avatar" |
||||
|
mode="aspectFill" |
||||
|
/> |
||||
|
<text class="expert-name">{{item.expert.name}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 店铺信息 --> |
||||
|
<view class="store-brief"> |
||||
|
<view class="store-icon">🏪</view> |
||||
|
<text class="store-name">{{item.store.name}}</text> |
||||
|
<view class="distance" wx:if="{{item.store.distance}}"> |
||||
|
{{item.store.distance}}km |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</block> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 加载更多 --> |
||||
|
<view class="load-more" wx:if="{{hasMore && !loading}}"> |
||||
|
<view class="load-text">上拉加载更多</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 加载中 --> |
||||
|
<view class="loading-container" wx:if="{{loading}}"> |
||||
|
<view class="loading-spinner"></view> |
||||
|
<text>加载中...</text> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 没有更多 --> |
||||
|
<view class="no-more" wx:if="{{!hasMore && filteredList.length > 0}}"> |
||||
|
<text>没有更多药品了</text> |
||||
|
</view> |
||||
|
|
||||
|
|
||||
|
<!-- 返回顶部按钮 --> |
||||
|
<view class="back-to-top {{showBackToTop ? 'show' : ''}}" bindtap="scrollToTop"> |
||||
|
↑ |
||||
|
</view> |
||||
|
</view> |
||||
@ -0,0 +1,410 @@ |
|||||
|
/* 页面容器 */ |
||||
|
.page-container { |
||||
|
background-color: #f8f9fa; |
||||
|
min-height: 100vh; |
||||
|
padding-bottom: 40rpx; |
||||
|
} |
||||
|
|
||||
|
/* 顶部栏 */ |
||||
|
.top-bar { |
||||
|
background-color: white; |
||||
|
position: sticky; |
||||
|
top: 0; |
||||
|
z-index: 100; |
||||
|
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05); |
||||
|
} |
||||
|
|
||||
|
/* 搜索容器 */ |
||||
|
.search-container { |
||||
|
padding: 20rpx 30rpx; |
||||
|
} |
||||
|
|
||||
|
.search-box { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
background-color: #f8f9fa; |
||||
|
border-radius: 50rpx; |
||||
|
padding: 18rpx 30rpx; |
||||
|
} |
||||
|
|
||||
|
.search-icon { |
||||
|
font-size: 32rpx; |
||||
|
color: #999; |
||||
|
margin-right: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.search-input { |
||||
|
flex: 1; |
||||
|
font-size: 28rpx; |
||||
|
color: #333; |
||||
|
height: 40rpx; |
||||
|
} |
||||
|
|
||||
|
.search-clear { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
border-radius: 50%; |
||||
|
background-color: #e0e0e0; |
||||
|
color: #666; |
||||
|
font-size: 24rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
|
||||
|
/* 分类筛选 */ |
||||
|
.category-filters { |
||||
|
padding: 0 20rpx 20rpx; |
||||
|
} |
||||
|
|
||||
|
.filters-scroll { |
||||
|
white-space: nowrap; |
||||
|
height: 70rpx; |
||||
|
} |
||||
|
|
||||
|
.filter-tag { |
||||
|
display: inline-flex; |
||||
|
align-items: center; |
||||
|
padding: 0 30rpx; |
||||
|
height: 60rpx; |
||||
|
line-height: 60rpx; |
||||
|
border-radius: 30rpx; |
||||
|
background-color: #f8f9fa; |
||||
|
color: #666; |
||||
|
font-size: 26rpx; |
||||
|
margin-right: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.filter-tag.active { |
||||
|
background-color: #3a7ff3; |
||||
|
color: white; |
||||
|
font-weight: 500; |
||||
|
} |
||||
|
|
||||
|
.filter-icon { |
||||
|
margin-right: 8rpx; |
||||
|
} |
||||
|
|
||||
|
/* 药品网格布局 */ |
||||
|
.medicine-grid { |
||||
|
display: grid; |
||||
|
grid-template-columns: repeat(2, 1fr); |
||||
|
gap: 20rpx; |
||||
|
padding: 30rpx; |
||||
|
} |
||||
|
|
||||
|
/* 药品卡片 */ |
||||
|
.medicine-card { |
||||
|
background-color: white; |
||||
|
border-radius: 20rpx; |
||||
|
overflow: hidden; |
||||
|
box-shadow: 0 4rpx 15rpx rgba(0, 0, 0, 0.05); |
||||
|
transition: transform 0.3s ease, box-shadow 0.3s ease; |
||||
|
} |
||||
|
|
||||
|
.medicine-card:active { |
||||
|
transform: translateY(-4rpx); |
||||
|
box-shadow: 0 8rpx 25rpx rgba(0, 0, 0, 0.1); |
||||
|
} |
||||
|
|
||||
|
/* 卡片图片区域 */ |
||||
|
.card-image { |
||||
|
position: relative; |
||||
|
width: 100%; |
||||
|
height: 320rpx; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.medicine-img { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
.card-tag { |
||||
|
position: absolute; |
||||
|
top: 20rpx; |
||||
|
left: 20rpx; |
||||
|
padding: 6rpx 16rpx; |
||||
|
border-radius: 20rpx; |
||||
|
font-size: 22rpx; |
||||
|
color: white; |
||||
|
background-color: #3a7ff3; |
||||
|
} |
||||
|
|
||||
|
.card-tag.prescription { |
||||
|
background-color: #f44336; |
||||
|
} |
||||
|
|
||||
|
.card-tag.otc { |
||||
|
background-color: #4CAF50; |
||||
|
} |
||||
|
|
||||
|
.card-tag.chinese { |
||||
|
background-color: #FF9800; |
||||
|
} |
||||
|
|
||||
|
.card-tag.health { |
||||
|
background-color: #9C27B0; |
||||
|
} |
||||
|
|
||||
|
.card-tag.other { |
||||
|
background-color: #607D8B; |
||||
|
} |
||||
|
|
||||
|
.hot-tag { |
||||
|
position: absolute; |
||||
|
top: 20rpx; |
||||
|
right: 20rpx; |
||||
|
padding: 6rpx 16rpx; |
||||
|
border-radius: 20rpx; |
||||
|
font-size: 22rpx; |
||||
|
color: white; |
||||
|
background-color: #ff4444; |
||||
|
} |
||||
|
|
||||
|
/* 卡片内容区域 */ |
||||
|
.card-content { |
||||
|
padding: 25rpx; |
||||
|
} |
||||
|
|
||||
|
.medicine-name { |
||||
|
font-size: 30rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333; |
||||
|
margin-bottom: 10rpx; |
||||
|
line-height: 1.4; |
||||
|
display: -webkit-box; |
||||
|
-webkit-line-clamp: 2; |
||||
|
-webkit-box-orient: vertical; |
||||
|
overflow: hidden; |
||||
|
min-height: 84rpx; |
||||
|
} |
||||
|
|
||||
|
.medicine-indication { |
||||
|
font-size: 24rpx; |
||||
|
color: #666; |
||||
|
margin-bottom: 15rpx; |
||||
|
line-height: 1.4; |
||||
|
} |
||||
|
|
||||
|
.manufacturer { |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
margin-bottom: 20rpx; |
||||
|
} |
||||
|
|
||||
|
/* 卡片底部 */ |
||||
|
.card-footer { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
margin-bottom: 15rpx; |
||||
|
} |
||||
|
|
||||
|
.price-section { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.current-price { |
||||
|
color: #ff4444; |
||||
|
font-weight: bold; |
||||
|
display: flex; |
||||
|
align-items: baseline; |
||||
|
} |
||||
|
|
||||
|
.price-symbol { |
||||
|
font-size: 24rpx; |
||||
|
margin-right: 2rpx; |
||||
|
} |
||||
|
|
||||
|
.price-value { |
||||
|
font-size: 36rpx; |
||||
|
} |
||||
|
|
||||
|
.original-price { |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
text-decoration: line-through; |
||||
|
margin-left: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.expert-brief { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.expert-avatar { |
||||
|
width: 40rpx; |
||||
|
height: 40rpx; |
||||
|
border-radius: 50%; |
||||
|
margin-right: 8rpx; |
||||
|
} |
||||
|
|
||||
|
.expert-name { |
||||
|
font-size: 24rpx; |
||||
|
color: #666; |
||||
|
} |
||||
|
|
||||
|
/* 店铺信息 */ |
||||
|
.store-brief { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
font-size: 24rpx; |
||||
|
color: #666; |
||||
|
padding-top: 15rpx; |
||||
|
border-top: 1rpx solid #f0f0f0; |
||||
|
} |
||||
|
|
||||
|
.store-icon { |
||||
|
margin-right: 8rpx; |
||||
|
} |
||||
|
|
||||
|
.store-name { |
||||
|
flex: 1; |
||||
|
overflow: hidden; |
||||
|
text-overflow: ellipsis; |
||||
|
white-space: nowrap; |
||||
|
} |
||||
|
|
||||
|
.distance { |
||||
|
color: #3a7ff3; |
||||
|
font-size: 22rpx; |
||||
|
} |
||||
|
|
||||
|
/* 空状态 */ |
||||
|
.empty-state { |
||||
|
grid-column: 1 / -1; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
padding: 100rpx 0; |
||||
|
} |
||||
|
|
||||
|
.empty-image { |
||||
|
width: 200rpx; |
||||
|
height: 200rpx; |
||||
|
margin-bottom: 30rpx; |
||||
|
opacity: 0.5; |
||||
|
} |
||||
|
|
||||
|
.empty-text { |
||||
|
font-size: 32rpx; |
||||
|
color: #999; |
||||
|
margin-bottom: 15rpx; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.empty-subtext { |
||||
|
font-size: 28rpx; |
||||
|
color: #ccc; |
||||
|
margin-bottom: 40rpx; |
||||
|
} |
||||
|
|
||||
|
.empty-btn { |
||||
|
width: 300rpx; |
||||
|
height: 80rpx; |
||||
|
line-height: 80rpx; |
||||
|
background-color: #3a7ff3; |
||||
|
color: white; |
||||
|
border-radius: 12rpx; |
||||
|
font-size: 30rpx; |
||||
|
} |
||||
|
|
||||
|
/* 加载更多 */ |
||||
|
.load-more, |
||||
|
.no-more { |
||||
|
grid-column: 1 / -1; |
||||
|
text-align: center; |
||||
|
padding: 40rpx 0; |
||||
|
color: #999; |
||||
|
font-size: 26rpx; |
||||
|
} |
||||
|
|
||||
|
.load-text { |
||||
|
position: relative; |
||||
|
display: inline-block; |
||||
|
padding: 0 40rpx; |
||||
|
} |
||||
|
|
||||
|
.load-text::before, |
||||
|
.load-text::after { |
||||
|
content: ''; |
||||
|
position: absolute; |
||||
|
top: 50%; |
||||
|
width: 30rpx; |
||||
|
height: 1rpx; |
||||
|
background-color: #ddd; |
||||
|
} |
||||
|
|
||||
|
.load-text::before { |
||||
|
left: 0; |
||||
|
} |
||||
|
|
||||
|
.load-text::after { |
||||
|
right: 0; |
||||
|
} |
||||
|
|
||||
|
/* 加载中 */ |
||||
|
.loading-container { |
||||
|
grid-column: 1 / -1; |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
padding: 40rpx 0; |
||||
|
} |
||||
|
|
||||
|
.loading-spinner { |
||||
|
width: 60rpx; |
||||
|
height: 60rpx; |
||||
|
border: 6rpx solid #f3f3f3; |
||||
|
border-top: 6rpx solid #3a7ff3; |
||||
|
border-radius: 50%; |
||||
|
animation: spin 1s linear infinite; |
||||
|
margin-bottom: 20rpx; |
||||
|
} |
||||
|
|
||||
|
@keyframes spin { |
||||
|
0% { transform: rotate(0deg); } |
||||
|
100% { transform: rotate(360deg); } |
||||
|
} |
||||
|
|
||||
|
/* 返回顶部按钮 */ |
||||
|
.back-to-top { |
||||
|
position: fixed; |
||||
|
bottom: 120rpx; |
||||
|
right: 30rpx; |
||||
|
width: 80rpx; |
||||
|
height: 80rpx; |
||||
|
border-radius: 50%; |
||||
|
background-color: #3a7ff3; |
||||
|
color: white; |
||||
|
font-size: 36rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
box-shadow: 0 4rpx 15rpx rgba(58, 127, 243, 0.3); |
||||
|
opacity: 0; |
||||
|
transform: translateY(20rpx); |
||||
|
transition: all 0.3s ease; |
||||
|
z-index: 99; |
||||
|
} |
||||
|
|
||||
|
.back-to-top.show { |
||||
|
opacity: 1; |
||||
|
transform: translateY(0); |
||||
|
} |
||||
|
|
||||
|
/* 响应式调整 */ |
||||
|
@media (max-width: 700rpx) { |
||||
|
.medicine-grid { |
||||
|
grid-template-columns: 1fr; |
||||
|
padding: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.card-image { |
||||
|
height: 400rpx; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,605 @@ |
|||||
|
Page({ |
||||
|
data: { |
||||
|
// 药品数据
|
||||
|
medicineData: null, |
||||
|
// 是否收藏
|
||||
|
isFavorite: false, |
||||
|
// 加载状态
|
||||
|
loading: true, |
||||
|
// 分享配置
|
||||
|
shareTitle: '', |
||||
|
sharePath: '', |
||||
|
shareImageUrl: '' |
||||
|
}, |
||||
|
|
||||
|
onLoad: function(options) { |
||||
|
// 获取传递过来的药品ID
|
||||
|
const medicineId = options.id; |
||||
|
|
||||
|
if (medicineId) { |
||||
|
// 根据ID加载药品数据
|
||||
|
this.loadMedicineData(medicineId); |
||||
|
} else { |
||||
|
wx.showToast({ |
||||
|
title: '药品信息不存在', |
||||
|
icon: 'error', |
||||
|
duration: 2000, |
||||
|
complete: () => { |
||||
|
setTimeout(() => { |
||||
|
wx.navigateBack(); |
||||
|
}, 1500); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
onShow: function() { |
||||
|
// 检查收藏状态
|
||||
|
this.checkFavoriteStatus(); |
||||
|
}, |
||||
|
|
||||
|
onShareAppMessage: function() { |
||||
|
// 分享配置
|
||||
|
return { |
||||
|
title: this.data.shareTitle || '专家推荐药品', |
||||
|
path: this.data.sharePath || '/pages/index/index', |
||||
|
imageUrl: this.data.shareImageUrl || '/images/share-default.jpg' |
||||
|
}; |
||||
|
}, |
||||
|
|
||||
|
// 根据ID加载药品数据
|
||||
|
loadMedicineData: function(id) { |
||||
|
this.setData({ loading: true }); |
||||
|
|
||||
|
// 模拟网络请求,实际项目中应该从服务器获取
|
||||
|
setTimeout(() => { |
||||
|
const mockData = this.getMockData(); |
||||
|
const medicine = mockData.find(item => item.id == id); |
||||
|
|
||||
|
if (medicine) { |
||||
|
this.setData({ |
||||
|
medicineData: medicine, |
||||
|
loading: false, |
||||
|
shareTitle: `${medicine.name} - ${medicine.expert.name}专家推荐`, |
||||
|
sharePath: `/pages/detail/detail?id=${medicine.id}`, |
||||
|
shareImageUrl: medicine.image |
||||
|
}); |
||||
|
|
||||
|
// 更新页面标题
|
||||
|
wx.setNavigationBarTitle({ |
||||
|
title: medicine.name |
||||
|
}); |
||||
|
} else { |
||||
|
this.setData({ loading: false }); |
||||
|
wx.showToast({ |
||||
|
title: '药品信息加载失败', |
||||
|
icon: 'error', |
||||
|
duration: 2000, |
||||
|
complete: () => { |
||||
|
setTimeout(() => { |
||||
|
wx.navigateBack(); |
||||
|
}, 1500); |
||||
|
} |
||||
|
}); |
||||
|
} |
||||
|
}, 500); |
||||
|
}, |
||||
|
|
||||
|
// 获取模拟数据(应与列表页保持一致)
|
||||
|
getMockData: function() { |
||||
|
return [ |
||||
|
{ |
||||
|
id: 1, |
||||
|
name: "阿莫西林胶囊", |
||||
|
manufacturer: "华北制药股份有限公司", |
||||
|
specification: "0.25g*24粒/盒", |
||||
|
category: "prescription", |
||||
|
categoryText: "处方药", |
||||
|
indication: "用于敏感菌所致的呼吸道感染、泌尿系统感染等", |
||||
|
price: 25.8, |
||||
|
originalPrice: 32.0, |
||||
|
isHot: true, |
||||
|
salesCount: 1280, |
||||
|
stock: 150, |
||||
|
image: "https://via.placeholder.com/300x300/3a7ff3/ffffff?text=阿莫西林", |
||||
|
|
||||
|
expert: { |
||||
|
name: "张明华", |
||||
|
title: "主任医师", |
||||
|
hospital: "北京协和医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/3a7ff3/ffffff?text=张", |
||||
|
reason: "本品为广谱抗生素,对多数革兰氏阳性菌和革兰氏阴性菌均有良好的抗菌作用,是临床常用的一线抗生素。", |
||||
|
expertise: "呼吸内科", |
||||
|
years: 15, |
||||
|
recommendTime: "2024-01-15" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "仁和堂大药房", |
||||
|
address: "北京市朝阳区建国路88号", |
||||
|
phone: "010-88888888", |
||||
|
businessHours: "8:00-22:00", |
||||
|
features: "24小时营业,专业药师咨询,医保定点药店", |
||||
|
distance: "1.2", |
||||
|
latitude: 39.9042, |
||||
|
longitude: 116.4074, |
||||
|
rating: 4.8, |
||||
|
images: [ |
||||
|
"/pagesA/images/5.png", |
||||
|
"/pagesA/images/6.jpg", |
||||
|
"/pagesA/images/6.jpg" |
||||
|
] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。成人一次0.5g,每6~8小时1次,一日剂量不超过4g。", |
||||
|
precautions: "青霉素过敏者禁用,用药期间可能出现腹泻、恶心等胃肠道反应。", |
||||
|
storage: "密封,在干燥处保存。", |
||||
|
validity: "24个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 2, |
||||
|
name: "连花清瘟胶囊", |
||||
|
manufacturer: "石家庄以岭药业股份有限公司", |
||||
|
specification: "0.35g*24粒/盒", |
||||
|
category: "chinese", |
||||
|
categoryText: "中成药", |
||||
|
indication: "用于治疗流行性感冒属热毒袭肺证", |
||||
|
price: 28.5, |
||||
|
originalPrice: 35.0, |
||||
|
isHot: true, |
||||
|
salesCount: 2560, |
||||
|
stock: 89, |
||||
|
image: "https://via.placeholder.com/300x300/4CAF50/ffffff?text=连花清瘟", |
||||
|
|
||||
|
expert: { |
||||
|
name: "李芳", |
||||
|
title: "副主任医师", |
||||
|
hospital: "上海瑞金医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/4CAF50/ffffff?text=李", |
||||
|
reason: "在新冠肺炎疫情防控中显示出良好效果,具有清瘟解毒、宣肺泄热的功效,适用于流感治疗。", |
||||
|
expertise: "中医科", |
||||
|
years: 12, |
||||
|
recommendTime: "2024-01-14" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "同济堂药店", |
||||
|
address: "上海市黄浦区南京东路100号", |
||||
|
phone: "021-66666666", |
||||
|
businessHours: "9:00-21:00", |
||||
|
features: "中药配方齐全,提供代煎服务,老字号药店", |
||||
|
distance: "2.5", |
||||
|
latitude: 31.2304, |
||||
|
longitude: 121.4737, |
||||
|
rating: 4.7, |
||||
|
images: [ |
||||
|
"https://via.placeholder.com/400x300/FF9800/ffffff?text=中药柜台" |
||||
|
] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。一次4粒,一日3次。", |
||||
|
precautions: "风寒感冒者不适用,高血压、心脏病患者慎用。", |
||||
|
storage: "密封,置阴凉干燥处。", |
||||
|
validity: "36个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 3, |
||||
|
name: "维生素C片", |
||||
|
manufacturer: "养生堂药业有限公司", |
||||
|
specification: "100mg*60片/瓶", |
||||
|
category: "health", |
||||
|
categoryText: "保健品", |
||||
|
indication: "用于预防和治疗维生素C缺乏症", |
||||
|
price: 18.9, |
||||
|
originalPrice: 24.0, |
||||
|
isHot: false, |
||||
|
salesCount: 890, |
||||
|
stock: 320, |
||||
|
image: "https://via.placeholder.com/300x300/FF9800/ffffff?text=维生素C", |
||||
|
|
||||
|
expert: { |
||||
|
name: "王建国", |
||||
|
title: "执业药师", |
||||
|
hospital: "广州中医药大学附属医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/FF9800/ffffff?text=王", |
||||
|
reason: "增强免疫力,促进铁吸收,抗氧化作用明显,适合日常保健和预防感冒。", |
||||
|
expertise: "临床药学", |
||||
|
years: 8, |
||||
|
recommendTime: "2024-01-13" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "老百姓大药房", |
||||
|
address: "广州市天河区体育西路189号", |
||||
|
phone: "020-77777777", |
||||
|
businessHours: "7:30-23:00", |
||||
|
features: "连锁品牌,价格实惠,会员优惠,支持医保", |
||||
|
distance: "0.8", |
||||
|
latitude: 23.1358, |
||||
|
longitude: 113.3269, |
||||
|
rating: 4.6, |
||||
|
images: [] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。成人一次1片,一日1次。", |
||||
|
precautions: "不宜长期过量服用,肾功能不全者慎用。", |
||||
|
storage: "避光,密封保存。", |
||||
|
validity: "24个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 4, |
||||
|
name: "布洛芬缓释胶囊", |
||||
|
manufacturer: "中美天津史克制药有限公司", |
||||
|
specification: "0.3g*20粒/盒", |
||||
|
category: "otc", |
||||
|
categoryText: "非处方药", |
||||
|
indication: "用于缓解轻至中度疼痛如头痛、关节痛、偏头痛等", |
||||
|
price: 22.5, |
||||
|
originalPrice: 28.0, |
||||
|
isHot: true, |
||||
|
salesCount: 1870, |
||||
|
stock: 120, |
||||
|
image: "https://via.placeholder.com/300x300/9C27B0/ffffff?text=布洛芬", |
||||
|
|
||||
|
expert: { |
||||
|
name: "陈晓东", |
||||
|
title: "主任医师", |
||||
|
hospital: "武汉同济医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/9C27B0/ffffff?text=陈", |
||||
|
reason: "解热镇痛效果确切,缓释剂型作用持久,胃肠道刺激小,适合各种疼痛的缓解。", |
||||
|
expertise: "疼痛科", |
||||
|
years: 20, |
||||
|
recommendTime: "2024-01-12" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "九州通大药房", |
||||
|
address: "武汉市江汉区解放大道688号", |
||||
|
phone: "027-55555555", |
||||
|
businessHours: "8:30-21:30", |
||||
|
features: "药品齐全,支持线上订购,送货上门", |
||||
|
distance: "3.2", |
||||
|
latitude: 30.5928, |
||||
|
longitude: 114.3052, |
||||
|
rating: 4.9, |
||||
|
images: [ |
||||
|
"https://via.placeholder.com/400x300/3F51B5/ffffff?text=现代药店", |
||||
|
"https://via.placeholder.com/400x300/E91E63/ffffff?text=专业服务" |
||||
|
] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。成人一次1粒,一日2次。", |
||||
|
precautions: "胃肠道溃疡患者禁用,不宜长期服用。", |
||||
|
storage: "密封,在阴凉干燥处保存。", |
||||
|
validity: "36个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 5, |
||||
|
name: "盐酸左氧氟沙星片", |
||||
|
manufacturer: "浙江医药股份有限公司", |
||||
|
specification: "0.5g*6片/盒", |
||||
|
category: "prescription", |
||||
|
categoryText: "处方药", |
||||
|
indication: "用于敏感细菌引起的呼吸系统、泌尿系统感染", |
||||
|
price: 42.8, |
||||
|
originalPrice: 56.0, |
||||
|
isHot: false, |
||||
|
salesCount: 560, |
||||
|
stock: 75, |
||||
|
image: "https://via.placeholder.com/300x300/2196F3/ffffff?text=左氧氟沙星", |
||||
|
|
||||
|
expert: { |
||||
|
name: "刘涛", |
||||
|
title: "副主任医师", |
||||
|
hospital: "南京鼓楼医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/2196F3/ffffff?text=刘", |
||||
|
reason: "抗菌谱广,对多种革兰氏阴性菌和阳性菌有效,特别适用于泌尿系统感染的治疗。", |
||||
|
expertise: "泌尿外科", |
||||
|
years: 10, |
||||
|
recommendTime: "2024-01-11" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "金陵大药房", |
||||
|
address: "南京市鼓楼区中山路321号", |
||||
|
phone: "025-44444444", |
||||
|
businessHours: "8:00-21:00", |
||||
|
features: "专业处方药房,药师驻店咨询", |
||||
|
distance: "1.8", |
||||
|
latitude: 32.0603, |
||||
|
longitude: 118.7969, |
||||
|
rating: 4.5, |
||||
|
images: [] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。一次1片,一日1次。", |
||||
|
precautions: "18岁以下患者禁用,孕妇及哺乳期妇女禁用。", |
||||
|
storage: "遮光,密封保存。", |
||||
|
validity: "24个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 6, |
||||
|
name: "板蓝根颗粒", |
||||
|
manufacturer: "广州白云山和记黄埔中药有限公司", |
||||
|
specification: "10g*20袋/盒", |
||||
|
category: "chinese", |
||||
|
categoryText: "中成药", |
||||
|
indication: "清热解毒,凉血利咽,用于肺胃热盛所致的咽喉肿痛", |
||||
|
price: 15.9, |
||||
|
originalPrice: 19.9, |
||||
|
isHot: true, |
||||
|
salesCount: 3200, |
||||
|
stock: 450, |
||||
|
image: "https://via.placeholder.com/300x300/FF5722/ffffff?text=板蓝根", |
||||
|
|
||||
|
expert: { |
||||
|
name: "孙丽", |
||||
|
title: "主治医师", |
||||
|
hospital: "成都中医药大学附属医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/FF5722/ffffff?text=孙", |
||||
|
reason: "传统经典方剂,清热解毒效果显著,特别适合预防和治疗感冒初期症状。", |
||||
|
expertise: "中医内科", |
||||
|
years: 6, |
||||
|
recommendTime: "2024-01-10" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "康恩贝大药房", |
||||
|
address: "成都市锦江区春熙路58号", |
||||
|
phone: "028-33333333", |
||||
|
businessHours: "9:00-22:00", |
||||
|
features: "连锁品牌,中药西药齐全", |
||||
|
distance: "0.5", |
||||
|
latitude: 30.6578, |
||||
|
longitude: 104.0657, |
||||
|
rating: 4.4, |
||||
|
images: [] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "开水冲服。一次1袋,一日3次。", |
||||
|
precautions: "风寒感冒者不适用,糖尿病患者慎用。", |
||||
|
storage: "密封,防潮。", |
||||
|
validity: "36个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 7, |
||||
|
name: "复方甘草片", |
||||
|
manufacturer: "北京双鹤药业股份有限公司", |
||||
|
specification: "100片/瓶", |
||||
|
category: "prescription", |
||||
|
categoryText: "处方药", |
||||
|
indication: "用于镇咳祛痰,适用于感冒咳嗽", |
||||
|
price: 12.5, |
||||
|
originalPrice: 16.0, |
||||
|
isHot: false, |
||||
|
salesCount: 780, |
||||
|
stock: 200, |
||||
|
image: "https://via.placeholder.com/300x300/673AB7/ffffff?text=甘草片", |
||||
|
|
||||
|
expert: { |
||||
|
name: "赵国强", |
||||
|
title: "主任医师", |
||||
|
hospital: "天津医科大学总医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/673AB7/ffffff?text=赵", |
||||
|
reason: "传统止咳良药,镇咳祛痰效果确切,价格实惠,适合普通感冒咳嗽。", |
||||
|
expertise: "呼吸内科", |
||||
|
years: 18, |
||||
|
recommendTime: "2024-01-09" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "天津医药大药房", |
||||
|
address: "天津市和平区南京路128号", |
||||
|
phone: "022-22222222", |
||||
|
businessHours: "8:00-21:30", |
||||
|
features: "国营药店,药品质量有保障", |
||||
|
distance: "2.0", |
||||
|
latitude: 39.1172, |
||||
|
longitude: 117.2056, |
||||
|
rating: 4.3, |
||||
|
images: [] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。一次3-4片,一日3次。", |
||||
|
precautions: "不宜长期服用,孕妇及哺乳期妇女慎用。", |
||||
|
storage: "密封,在干燥处保存。", |
||||
|
validity: "36个月" |
||||
|
} |
||||
|
}, |
||||
|
{ |
||||
|
id: 8, |
||||
|
name: "葡萄糖酸钙口服液", |
||||
|
manufacturer: "哈药集团制药六厂", |
||||
|
specification: "10ml*12支/盒", |
||||
|
category: "otc", |
||||
|
categoryText: "非处方药", |
||||
|
indication: "用于预防和治疗钙缺乏症", |
||||
|
price: 35.0, |
||||
|
originalPrice: 42.0, |
||||
|
isHot: true, |
||||
|
salesCount: 1560, |
||||
|
stock: 180, |
||||
|
image: "https://via.placeholder.com/300x300/00BCD4/ffffff?text=葡萄糖酸钙", |
||||
|
|
||||
|
expert: { |
||||
|
name: "周敏", |
||||
|
title: "副主任医师", |
||||
|
hospital: "西安交通大学第一附属医院", |
||||
|
avatar: "https://via.placeholder.com/100x100/00BCD4/ffffff?text=周", |
||||
|
reason: "钙吸收好,口感适宜,特别适合儿童、孕妇和老年人补钙。", |
||||
|
expertise: "儿科", |
||||
|
years: 14, |
||||
|
recommendTime: "2024-01-08" |
||||
|
}, |
||||
|
|
||||
|
store: { |
||||
|
name: "西安医药大药房", |
||||
|
address: "西安市碑林区南大街58号", |
||||
|
phone: "029-11111111", |
||||
|
businessHours: "8:30-21:00", |
||||
|
features: "专业儿科用药,儿童健康咨询", |
||||
|
distance: "1.5", |
||||
|
latitude: 34.2583, |
||||
|
longitude: 108.9426, |
||||
|
rating: 4.7, |
||||
|
images: [] |
||||
|
}, |
||||
|
|
||||
|
details: { |
||||
|
usage: "口服。一次1-2支,一日3次。", |
||||
|
precautions: "肾功能不全者慎用,不宜与洋地黄类药物同时使用。", |
||||
|
storage: "密封,置阴凉处。", |
||||
|
validity: "24个月" |
||||
|
} |
||||
|
} |
||||
|
]; |
||||
|
}, |
||||
|
|
||||
|
// 检查收藏状态
|
||||
|
checkFavoriteStatus: function() { |
||||
|
const medicineData = this.data.medicineData; |
||||
|
if (!medicineData) return; |
||||
|
|
||||
|
try { |
||||
|
const favorites = wx.getStorageSync('medicineFavorites') || []; |
||||
|
const isFavorite = favorites.some(item => item.id === medicineData.id); |
||||
|
this.setData({ isFavorite }); |
||||
|
} catch (e) { |
||||
|
console.error('读取收藏失败', e); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 切换收藏状态
|
||||
|
toggleFavorite: function() { |
||||
|
const medicineData = this.data.medicineData; |
||||
|
if (!medicineData) return; |
||||
|
|
||||
|
const newFavorite = !this.data.isFavorite; |
||||
|
this.setData({ isFavorite: newFavorite }); |
||||
|
|
||||
|
// 保存到本地缓存
|
||||
|
this.saveFavorite(newFavorite); |
||||
|
|
||||
|
wx.showToast({ |
||||
|
title: newFavorite ? '已收藏' : '已取消收藏', |
||||
|
icon: 'success', |
||||
|
duration: 1500 |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 保存收藏状态到本地缓存
|
||||
|
saveFavorite: function(isFavorite) { |
||||
|
const medicineData = this.data.medicineData; |
||||
|
if (!medicineData) return; |
||||
|
|
||||
|
try { |
||||
|
let favorites = wx.getStorageSync('medicineFavorites') || []; |
||||
|
|
||||
|
if (isFavorite) { |
||||
|
// 添加收藏
|
||||
|
if (!favorites.some(item => item.id === medicineData.id)) { |
||||
|
favorites.push({ |
||||
|
id: medicineData.id, |
||||
|
name: medicineData.name, |
||||
|
price: medicineData.price, |
||||
|
image: medicineData.image, |
||||
|
expert: medicineData.expert.name, |
||||
|
store: medicineData.store.name, |
||||
|
time: new Date().getTime() |
||||
|
}); |
||||
|
} |
||||
|
} else { |
||||
|
// 取消收藏
|
||||
|
favorites = favorites.filter(item => item.id !== medicineData.id); |
||||
|
} |
||||
|
|
||||
|
wx.setStorageSync('medicineFavorites', favorites); |
||||
|
} catch (e) { |
||||
|
console.error('保存收藏失败', e); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 打开位置地图
|
||||
|
openLocation: function() { |
||||
|
const { store } = this.data.medicineData; |
||||
|
if (store.latitude && store.longitude) { |
||||
|
wx.openLocation({ |
||||
|
latitude: parseFloat(store.latitude), |
||||
|
longitude: parseFloat(store.longitude), |
||||
|
name: store.name, |
||||
|
address: store.address, |
||||
|
scale: 18 |
||||
|
}); |
||||
|
} else { |
||||
|
wx.showToast({ |
||||
|
title: '位置信息不可用', |
||||
|
icon: 'none' |
||||
|
}); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 拨打电话
|
||||
|
makePhoneCall: function() { |
||||
|
const phone = this.data.medicineData.store.phone; |
||||
|
if (phone) { |
||||
|
wx.makePhoneCall({ |
||||
|
phoneNumber: phone |
||||
|
}) |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 预览主图片
|
||||
|
previewMainImage: function() { |
||||
|
const url = this.data.medicineData.image; |
||||
|
if (url) { |
||||
|
wx.previewImage({ |
||||
|
current: url, |
||||
|
urls: [url] |
||||
|
}); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 预览轮播图片
|
||||
|
previewImage: function(e) { |
||||
|
const index = parseInt(e.currentTarget.dataset.index); |
||||
|
const images = this.data.medicineData.store.images || []; |
||||
|
const urls = [this.data.medicineData.image, ...images]; |
||||
|
|
||||
|
wx.previewImage({ |
||||
|
current: urls[index + 1], // +1 因为第一个是主图
|
||||
|
urls: urls |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 预览店铺图片
|
||||
|
previewStoreImage: function(e) { |
||||
|
const index = parseInt(e.currentTarget.dataset.index); |
||||
|
const images = this.data.medicineData.store.images || []; |
||||
|
|
||||
|
wx.previewImage({ |
||||
|
current: images[index], |
||||
|
urls: images |
||||
|
}); |
||||
|
}, |
||||
|
|
||||
|
// 分享给朋友
|
||||
|
onShareToFriend: function() { |
||||
|
wx.showShareMenu({ |
||||
|
withShareTicket: true, |
||||
|
menus: ['shareAppMessage', 'shareTimeline'] |
||||
|
}); |
||||
|
} |
||||
|
}); |
||||
@ -0,0 +1,4 @@ |
|||||
|
{ |
||||
|
"navigationBarTitleText": "药品详情", |
||||
|
"usingComponents": {} |
||||
|
} |
||||
@ -0,0 +1,175 @@ |
|||||
|
<!-- 药品详情页 --> |
||||
|
<view class="detail-page"> |
||||
|
<!-- 药品图片轮播 --> |
||||
|
<view class="medicine-images"> |
||||
|
<swiper |
||||
|
class="detail-swiper" |
||||
|
indicator-dots="{{medicineData.store.images && medicineData.store.images.length > 0}}" |
||||
|
indicator-color="rgba(255, 255, 255, 0.5)" |
||||
|
indicator-active-color="#3a7ff3" |
||||
|
autoplay="true" |
||||
|
interval="3000" |
||||
|
duration="500" |
||||
|
> |
||||
|
<block wx:for="{{medicineData.store.images}}" wx:key="index"> |
||||
|
<swiper-item> |
||||
|
<image |
||||
|
src="{{item}}" |
||||
|
class="detail-image" |
||||
|
mode="aspectFill" |
||||
|
bindtap="previewImage" |
||||
|
data-index="{{index}}" |
||||
|
/> |
||||
|
</swiper-item> |
||||
|
</block> |
||||
|
</swiper> |
||||
|
|
||||
|
<!-- 药品标签 --> |
||||
|
<view class="detail-tag {{medicineData.category}}"> |
||||
|
{{medicineData.categoryText}} |
||||
|
<view class="hot-badge" wx:if="{{medicineData.isHot}}">热销</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 药品基本信息 --> |
||||
|
<view class="basic-info-section"> |
||||
|
<view class="medicine-name">{{medicineData.name}}</view> |
||||
|
<view class="medicine-spec">{{medicineData.specification}}</view> |
||||
|
<view class="manufacturer">{{medicineData.manufacturer}}</view> |
||||
|
|
||||
|
<!-- 价格信息 --> |
||||
|
<view class="price-info"> |
||||
|
<view class="current-price"> |
||||
|
<text class="price-symbol">¥</text> |
||||
|
<text class="price-value">{{medicineData.price}}</text> |
||||
|
</view> |
||||
|
<view class="original-price" wx:if="{{medicineData.originalPrice}}"> |
||||
|
原价:¥{{medicineData.originalPrice}} |
||||
|
</view> |
||||
|
<view class="sales-count"> |
||||
|
已售:{{medicineData.salesCount}}件 |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 适用症状 --> |
||||
|
<view class="info-section"> |
||||
|
<view class="section-title">适用症状</view> |
||||
|
<view class="section-content">{{medicineData.indication}}</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 专家推荐信息 --> |
||||
|
<view class="expert-section"> |
||||
|
<view class="section-title">专家推荐</view> |
||||
|
<view class="expert-card"> |
||||
|
<view class="expert-header"> |
||||
|
<image |
||||
|
src="{{medicineData.expert.avatar || '/images/default-avatar.png'}}" |
||||
|
class="expert-avatar" |
||||
|
mode="aspectFill" |
||||
|
/> |
||||
|
<view class="expert-info"> |
||||
|
<view class="expert-name">{{medicineData.expert.name}}<text class="expert-title"> | {{medicineData.expert.title}}</text></view> |
||||
|
<view class="expert-hospital">{{medicineData.expert.hospital}}</view> |
||||
|
<view class="expert-experience"> |
||||
|
<text class="experience-label">专业:</text>{{medicineData.expert.expertise}} |
||||
|
<text class="experience-label">从业:</text>{{medicineData.expert.years}}年 |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
<view class="expert-reason"> |
||||
|
<view class="reason-title">推荐理由</view> |
||||
|
<view class="reason-content">{{medicineData.expert.reason}}</view> |
||||
|
</view> |
||||
|
<view class="recommend-time">推荐时间:{{medicineData.expert.recommendTime}}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 店铺信息 --> |
||||
|
<view class="store-section"> |
||||
|
<view class="section-title">推荐店铺</view> |
||||
|
<view class="store-card"> |
||||
|
<view class="store-header"> |
||||
|
<view class="store-name">{{medicineData.store.name}}</view> |
||||
|
<view class="store-rating" wx:if="{{medicineData.store.rating}}"> |
||||
|
<text class="rating-value">{{medicineData.store.rating}}</text> |
||||
|
<text class="rating-star">★</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="store-info"> |
||||
|
<view class="info-item"> |
||||
|
<text class="info-icon">📍</text> |
||||
|
<text class="info-text">{{medicineData.store.address}}</text> |
||||
|
<view class="store-distance" wx:if="{{medicineData.store.distance}}"> |
||||
|
距离:{{medicineData.store.distance}}km |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="info-item"> |
||||
|
<text class="info-icon">📞</text> |
||||
|
<text class="info-text">{{medicineData.store.phone}}</text> |
||||
|
</view> |
||||
|
|
||||
|
<view class="info-item"> |
||||
|
<text class="info-icon">🕒</text> |
||||
|
<text class="info-text">{{medicineData.store.businessHours}}</text> |
||||
|
</view> |
||||
|
|
||||
|
<view class="info-item" wx:if="{{medicineData.store.features}}"> |
||||
|
<text class="info-icon">⭐</text> |
||||
|
<text class="info-text">{{medicineData.store.features}}</text> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 店铺图片 --> |
||||
|
<view class="store-images" wx:if="{{medicineData.store.images && medicineData.store.images.length > 0}}"> |
||||
|
<scroll-view class="store-images-scroll" scroll-x="true"> |
||||
|
<block wx:for="{{medicineData.store.images}}" wx:key="index"> |
||||
|
<view class="store-image-item" bindtap="previewStoreImage" data-index="{{index}}"> |
||||
|
<image src="{{item}}" class="store-image" mode="aspectFill" /> |
||||
|
</view> |
||||
|
</block> |
||||
|
</scroll-view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 店铺操作按钮 --> |
||||
|
<view class="store-actions"> |
||||
|
<button class="action-btn map-btn" bindtap="openLocation"> |
||||
|
<text class="btn-icon">🗺️</text> |
||||
|
<text class="btn-text">查看位置</text> |
||||
|
</button> |
||||
|
<button class="action-btn call-btn" bindtap="makePhoneCall"> |
||||
|
<text class="btn-icon">📱</text> |
||||
|
<text class="btn-text">联系店铺</text> |
||||
|
</button> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
|
||||
|
<!-- 药品详细信息 --> |
||||
|
<view class="details-section"> |
||||
|
<view class="section-title">药品详情</view> |
||||
|
<view class="details-grid"> |
||||
|
<view class="detail-item"> |
||||
|
<view class="item-label">用法用量</view> |
||||
|
<view class="item-value">{{medicineData.details.usage}}</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="detail-item"> |
||||
|
<view class="item-label">注意事项</view> |
||||
|
<view class="item-value">{{medicineData.details.precautions}}</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="detail-item"> |
||||
|
<view class="item-label">贮藏方式</view> |
||||
|
<view class="item-value">{{medicineData.details.storage}}</view> |
||||
|
</view> |
||||
|
|
||||
|
<view class="detail-item"> |
||||
|
<view class="item-label">有效期</view> |
||||
|
<view class="item-value">{{medicineData.details.validity}}</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
|
</view> |
||||
@ -0,0 +1,450 @@ |
|||||
|
/* 详情页样式 */ |
||||
|
.detail-page { |
||||
|
background-color: #f8f9fa; |
||||
|
min-height: 100vh; |
||||
|
padding-bottom: 120rpx; |
||||
|
} |
||||
|
|
||||
|
/* 药品图片轮播 */ |
||||
|
.medicine-images { |
||||
|
position: relative; |
||||
|
height: 500rpx; |
||||
|
} |
||||
|
|
||||
|
.detail-swiper { |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
.detail-image { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/* 药品标签 */ |
||||
|
.detail-tag { |
||||
|
position: absolute; |
||||
|
top: 30rpx; |
||||
|
right: 30rpx; |
||||
|
padding: 10rpx 20rpx; |
||||
|
border-radius: 25rpx; |
||||
|
font-size: 24rpx; |
||||
|
color: white; |
||||
|
background-color: #3a7ff3; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
z-index: 10; |
||||
|
} |
||||
|
|
||||
|
.detail-tag.prescription { |
||||
|
background-color: #f44336; |
||||
|
} |
||||
|
|
||||
|
.detail-tag.otc { |
||||
|
background-color: #4CAF50; |
||||
|
} |
||||
|
|
||||
|
.detail-tag.chinese { |
||||
|
background-color: #FF9800; |
||||
|
} |
||||
|
|
||||
|
.detail-tag.health { |
||||
|
background-color: #9C27B0; |
||||
|
} |
||||
|
|
||||
|
.hot-badge { |
||||
|
margin-left: 10rpx; |
||||
|
padding: 4rpx 10rpx; |
||||
|
background-color: #ff4444; |
||||
|
border-radius: 15rpx; |
||||
|
font-size: 20rpx; |
||||
|
} |
||||
|
|
||||
|
/* 基本信息区域 */ |
||||
|
.basic-info-section { |
||||
|
background-color: white; |
||||
|
padding: 30rpx; |
||||
|
margin-bottom: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.medicine-name { |
||||
|
font-size: 38rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333; |
||||
|
margin-bottom: 15rpx; |
||||
|
line-height: 1.4; |
||||
|
} |
||||
|
|
||||
|
.medicine-spec { |
||||
|
font-size: 28rpx; |
||||
|
color: #666; |
||||
|
margin-bottom: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.manufacturer { |
||||
|
font-size: 26rpx; |
||||
|
color: #999; |
||||
|
margin-bottom: 25rpx; |
||||
|
} |
||||
|
|
||||
|
/* 价格信息 */ |
||||
|
.price-info { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: space-between; |
||||
|
padding-top: 20rpx; |
||||
|
border-top: 2rpx solid #f8f9fa; |
||||
|
} |
||||
|
|
||||
|
.current-price { |
||||
|
color: #ff4444; |
||||
|
font-weight: bold; |
||||
|
display: flex; |
||||
|
align-items: baseline; |
||||
|
} |
||||
|
|
||||
|
.price-symbol { |
||||
|
font-size: 28rpx; |
||||
|
margin-right: 4rpx; |
||||
|
} |
||||
|
|
||||
|
.price-value { |
||||
|
font-size: 48rpx; |
||||
|
} |
||||
|
|
||||
|
.original-price { |
||||
|
font-size: 26rpx; |
||||
|
color: #999; |
||||
|
text-decoration: line-through; |
||||
|
} |
||||
|
|
||||
|
.sales-count { |
||||
|
font-size: 26rpx; |
||||
|
color: #666; |
||||
|
} |
||||
|
|
||||
|
/* 信息区块通用样式 */ |
||||
|
.info-section, |
||||
|
.expert-section, |
||||
|
.store-section, |
||||
|
.details-section, |
||||
|
.safety-tips { |
||||
|
background-color: white; |
||||
|
margin-bottom: 20rpx; |
||||
|
padding: 30rpx; |
||||
|
} |
||||
|
|
||||
|
.section-title { |
||||
|
font-size: 34rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333; |
||||
|
margin-bottom: 20rpx; |
||||
|
padding-bottom: 15rpx; |
||||
|
border-bottom: 2rpx solid #f8f9fa; |
||||
|
} |
||||
|
|
||||
|
.section-content { |
||||
|
font-size: 28rpx; |
||||
|
color: #666; |
||||
|
line-height: 1.6; |
||||
|
} |
||||
|
|
||||
|
/* 专家卡片 */ |
||||
|
.expert-card { |
||||
|
background-color: #f8f9fa; |
||||
|
border-radius: 15rpx; |
||||
|
padding: 25rpx; |
||||
|
margin-top: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.expert-header { |
||||
|
display: flex; |
||||
|
margin-bottom: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.expert-avatar { |
||||
|
width: 100rpx; |
||||
|
height: 100rpx; |
||||
|
border-radius: 50%; |
||||
|
margin-right: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.expert-info { |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.expert-name { |
||||
|
font-size: 32rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333; |
||||
|
margin-bottom: 8rpx; |
||||
|
} |
||||
|
|
||||
|
.expert-title { |
||||
|
font-size: 26rpx; |
||||
|
color: #666; |
||||
|
font-weight: normal; |
||||
|
} |
||||
|
|
||||
|
.expert-hospital { |
||||
|
font-size: 26rpx; |
||||
|
color: #3a7ff3; |
||||
|
margin-bottom: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.expert-experience { |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
} |
||||
|
|
||||
|
.experience-label { |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.expert-reason { |
||||
|
background-color: white; |
||||
|
border-radius: 10rpx; |
||||
|
padding: 20rpx; |
||||
|
margin-bottom: 15rpx; |
||||
|
} |
||||
|
|
||||
|
.reason-title { |
||||
|
font-size: 28rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333; |
||||
|
margin-bottom: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.reason-content { |
||||
|
font-size: 26rpx; |
||||
|
color: #666; |
||||
|
line-height: 1.6; |
||||
|
} |
||||
|
|
||||
|
.recommend-time { |
||||
|
font-size: 24rpx; |
||||
|
color: #999; |
||||
|
text-align: right; |
||||
|
} |
||||
|
|
||||
|
/* 店铺卡片 */ |
||||
|
.store-card { |
||||
|
background-color: #f8f9fa; |
||||
|
border-radius: 15rpx; |
||||
|
padding: 25rpx; |
||||
|
margin-top: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.store-header { |
||||
|
display: flex; |
||||
|
justify-content: space-between; |
||||
|
align-items: center; |
||||
|
margin-bottom: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.store-name { |
||||
|
font-size: 32rpx; |
||||
|
font-weight: bold; |
||||
|
color: #333; |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.store-rating { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
color: #ff9900; |
||||
|
} |
||||
|
|
||||
|
.rating-value { |
||||
|
font-size: 28rpx; |
||||
|
font-weight: bold; |
||||
|
margin-right: 5rpx; |
||||
|
} |
||||
|
|
||||
|
.rating-star { |
||||
|
font-size: 24rpx; |
||||
|
} |
||||
|
|
||||
|
.store-info { |
||||
|
margin-bottom: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.info-item { |
||||
|
display: flex; |
||||
|
align-items: flex-start; |
||||
|
margin-bottom: 15rpx; |
||||
|
font-size: 26rpx; |
||||
|
color: #666; |
||||
|
line-height: 1.5; |
||||
|
} |
||||
|
|
||||
|
.info-icon { |
||||
|
margin-right: 15rpx; |
||||
|
flex-shrink: 0; |
||||
|
font-size: 28rpx; |
||||
|
} |
||||
|
|
||||
|
.info-text { |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.store-distance { |
||||
|
color: #3a7ff3; |
||||
|
font-size: 24rpx; |
||||
|
margin-left: 20rpx; |
||||
|
flex-shrink: 0; |
||||
|
} |
||||
|
|
||||
|
/* 店铺图片 */ |
||||
|
.store-images { |
||||
|
margin-bottom: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.store-images-scroll { |
||||
|
white-space: nowrap; |
||||
|
height: 200rpx; |
||||
|
} |
||||
|
|
||||
|
.store-image-item { |
||||
|
display: inline-block; |
||||
|
width: 300rpx; |
||||
|
height: 200rpx; |
||||
|
border-radius: 10rpx; |
||||
|
overflow: hidden; |
||||
|
margin-right: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.store-image { |
||||
|
width: 100%; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
/* 店铺操作按钮 */ |
||||
|
.store-actions { |
||||
|
display: flex; |
||||
|
gap: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.action-btn { |
||||
|
flex: 1; |
||||
|
height: 80rpx; |
||||
|
border-radius: 10rpx; |
||||
|
font-size: 26rpx; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
} |
||||
|
|
||||
|
.map-btn { |
||||
|
background-color: #3a7ff3; |
||||
|
color: white; |
||||
|
} |
||||
|
|
||||
|
.call-btn { |
||||
|
background-color: #4CAF50; |
||||
|
color: white; |
||||
|
} |
||||
|
|
||||
|
.btn-icon { |
||||
|
margin-right: 10rpx; |
||||
|
font-size: 30rpx; |
||||
|
} |
||||
|
|
||||
|
/* 药品详细信息网格 */ |
||||
|
.details-grid { |
||||
|
display: grid; |
||||
|
grid-template-columns: repeat(2, 1fr); |
||||
|
gap: 20rpx; |
||||
|
margin-top: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.detail-item { |
||||
|
background-color: #f8f9fa; |
||||
|
border-radius: 10rpx; |
||||
|
padding: 20rpx; |
||||
|
} |
||||
|
|
||||
|
.item-label { |
||||
|
font-size: 26rpx; |
||||
|
color: #999; |
||||
|
margin-bottom: 10rpx; |
||||
|
} |
||||
|
|
||||
|
.item-value { |
||||
|
font-size: 26rpx; |
||||
|
color: #333; |
||||
|
line-height: 1.5; |
||||
|
} |
||||
|
|
||||
|
/* 加载状态 */ |
||||
|
.loading-container { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
height: 60vh; |
||||
|
} |
||||
|
|
||||
|
.loading-spinner { |
||||
|
width: 80rpx; |
||||
|
height: 80rpx; |
||||
|
border: 8rpx solid #f3f3f3; |
||||
|
border-top: 8rpx solid #3a7ff3; |
||||
|
border-radius: 50%; |
||||
|
animation: spin 1s linear infinite; |
||||
|
margin-bottom: 30rpx; |
||||
|
} |
||||
|
|
||||
|
@keyframes spin { |
||||
|
0% { transform: rotate(0deg); } |
||||
|
100% { transform: rotate(360deg); } |
||||
|
} |
||||
|
|
||||
|
/* 错误状态 */ |
||||
|
.error-container { |
||||
|
display: flex; |
||||
|
flex-direction: column; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
height: 60vh; |
||||
|
padding: 0 50rpx; |
||||
|
} |
||||
|
|
||||
|
.error-icon { |
||||
|
font-size: 120rpx; |
||||
|
color: #ff4444; |
||||
|
margin-bottom: 30rpx; |
||||
|
} |
||||
|
|
||||
|
.error-text { |
||||
|
font-size: 32rpx; |
||||
|
color: #666; |
||||
|
margin-bottom: 40rpx; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.error-btn { |
||||
|
width: 300rpx; |
||||
|
height: 80rpx; |
||||
|
line-height: 80rpx; |
||||
|
background-color: #3a7ff3; |
||||
|
color: white; |
||||
|
border-radius: 12rpx; |
||||
|
font-size: 30rpx; |
||||
|
} |
||||
|
|
||||
|
/* 响应式调整 */ |
||||
|
@media (max-width: 700rpx) { |
||||
|
.details-grid { |
||||
|
grid-template-columns: 1fr; |
||||
|
} |
||||
|
|
||||
|
.bottom-action-bar { |
||||
|
padding: 15rpx 20rpx; |
||||
|
} |
||||
|
|
||||
|
.action-bar-btn { |
||||
|
font-size: 26rpx; |
||||
|
height: 80rpx; |
||||
|
} |
||||
|
} |
||||