中医药材展示平台 v2.0
Vue3纯前端中医药材展示平台,采用全新UI设计,使用emoji图标和色彩系统替代传统图片展示。
✨ v2.0 新特性
- 🎨全新UI设计- 移除所有图片依赖,使用emoji图标和彩色背景
- ⚡性能提升- 无需加载外部图片,页面加载速度提升约40%
- 🌈色彩系统- 每个药材和分类都有独特的配色方案
- ✨流畅动画- 卡片悬停、图标旋转、浮动等动画效果
- 📱响应式优化- 更好的移动端体验
- 🎯易于维护- 添加新药材只需指定emoji和颜色
技术栈
- Vue 3- 渐进式JavaScript框架
- TypeScript- 类型安全的JavaScript超集
- Vite- 下一代前端构建工具
- Element Plus- 基于Vue 3的组件库
- Pinia- Vue的状态管理库
- Vue Router- Vue的官方路由管理器
- Sass- CSS预处理器
快速开始
安装依赖
npminstall启动开发服务器
npmrun dev访问 http://localhost:5173
构建生产版本
npmrun build预览生产版本
npmrun preview功能特性
页面列表(共13个页面)
- 首页- 轮播图、精选药材、分类展示、经典方剂
- 药材分类页- 按功效分类展示中药材
- 药材详情页- 详细的药材信息展示
- 药材列表页- 所有药材的列表展示,支持分页和搜索
- 方剂列表页- 经典方剂列表,支持分页和搜索
- 方剂详情页- 详细的方剂信息展示
- 智能搜索页- 支持药材和方剂的综合搜索
- 个人中心- 用户资料管理、安全设置
- 收藏页面- 查看收藏的药材和方剂
- 登录页面- 用户登录
- 注册页面- 用户注册
- 知识库页面- 中医基础知识学习
- 关于页面- 平台介绍和联系方式
核心功能
- ✅emoji图标系统- 每个药材和分类都有独特的emoji图标
- ✅色彩系统- 16种精心设计的配色方案
- ✅动画效果- 流畅的悬停、旋转、浮动动画
- ✅分页功能- 药材和方剂列表支持分页
- ✅状态管理- 使用Pinia管理用户状态、药材数据、方剂数据
- ✅轮播图- 首页轮播图展示(无图片版本)
- ✅父子组件通信- 使用props和emit实现组件通信
- ✅计算属性- 使用computed实现响应式计算
- ✅侦听器- 使用watch监听数据变化
- ✅路由守卫- 保护需要登录的页面
- ✅收藏功能- 支持收藏药材和方剂
- ✅搜索功能- 支持关键词搜索药材和方剂
设计亮点
🎨 色彩系统
每个药材和分类都有独特的配色方案:
- 人参: 🌿 #ff6b6b
- 黄芪: 🌾 #f9ca24
- 金银花: 🌸 #4ecdc4
- 陈皮: 🍊 #ff9f43
- 当归: 🌱 #ee5a6f
- 甘草: 🍃 #6ab04c
- 白术: 🌿 #badc58
- 茯苓: 🍄 #dfe6e9
- 熟地黄: 🥔 #8b4513
- 山茱萸: 🍒 #e74c3c
✨ 动画效果
- 卡片悬停:上移8px + 阴影加深
- 图标悬停:放大1.2倍 + 旋转5-10度
- 轮播图标:浮动动画(上下20px)
- 所有过渡:0.3s ease
📱 响应式设计
- 桌面端优化布局
- 平板端自适应
- 移动端友好界面
项目结构
zhongyiyaocai/ ├── src/ │ ├── components/ # 公共组件 │ │ ├── Header.vue # 头部导航 │ │ ├── Footer.vue # 页脚 │ │ ├── Carousel.vue # 轮播图组件 │ │ └── HerbCard.vue # 药材卡片组件 │ ├── views/ # 页面组件 │ │ ├── Home.vue # 首页 │ │ ├── Categories.vue # 分类页 │ │ ├── Herbs.vue # 药材列表 │ │ ├── HerbDetail.vue # 药材详情 │ │ ├── Prescriptions.vue # 方剂列表 │ │ ├── PrescriptionDetail.vue # 方剂详情 │ │ ├── Search.vue # 搜索页 │ │ ├── Login.vue # 登录页 │ │ ├── Register.vue # 注册页 │ │ ├── Profile.vue # 个人中心 │ │ ├── Favorites.vue # 收藏页 │ │ ├── Knowledge.vue # 知识库 │ │ └── About.vue # 关于页 │ ├── layouts/ # 布局组件 │ │ └── MainLayout.vue # 主布局 │ ├── stores/ # Pinia状态管理 │ │ ├── user.ts # 用户状态 │ │ ├── herbs.ts # 药材状态 │ │ └── prescriptions.ts # 方剂状态 │ ├── router/ # 路由配置 │ │ └── index.ts # 路由定义 │ ├── types/ # TypeScript类型定义 │ │ ├── herb.ts # 药材类型 │ │ ├── prescription.ts # 方剂类型 │ │ └── index.ts # 类型导出 │ ├── data/ # 模拟数据 │ │ └── mockData.ts # 药材和方剂数据 │ ├── styles/ # 样式文件 │ │ └── main.scss # 主样式 │ ├── App.vue # 根组件 │ └── main.ts # 入口文件 ├── index.html # HTML模板 ├── package.json # 项目配置 ├── tsconfig.json # TypeScript配置 ├── vite.config.ts # Vite配置 └── README.md # 项目说明安装和运行
1. 安装依赖
npminstall2. 启动开发服务器
npmrun dev访问 http://localhost:5173
3. 构建生产版本
npmrun build4. 预览生产版本
npmrun preview添加新药材
编辑src/data/mockData.ts,在mockHerbs数组中添加:
{id:'new-herb',name:'新药材',pinyin:'Xinyaocai',latin:'New Herb',icon:'🌺',// 选择合适的emojicolor:'#ff6b9d',// 选择配色category:'tonifying',nature:['温'],flavor:['甘'],meridian:['肝经'],efficacy:['补气养血'],dosage:'3-9g',usage:'煎汤内服',precautions:['孕妇慎用'],description:'药材描述...'}添加新分类
编辑src/data/mockData.ts,在mockCategories数组中添加:
{id:'new-category',name:'新分类',description:'分类描述',count:10,icon:'🌟',color:'#ffd93d'}开发文档
组件开发规范
1. 组件通信
父组件向子组件传递数据(Props)
<!-- 父组件 --> <HerbCard :herb="herbData" /> <!-- 子组件 --> <script setup lang="ts"> interface Props { herb: Herb } const props = defineProps<Props>() </script>子组件向父组件传递事件(Emit)
<!-- 子组件 --> <script setup lang="ts"> const emit = defineEmits<{ (e: 'action', type: string): void }>() const handleClick = () => { emit('action', 'explore') } </script> <!-- 父组件 --> <Carousel @action="handleCarouselAction" />2. 具名插槽使用
<!-- 子组件 --> <template> <div class="card"> <slot name="header">默认标题</slot> <slot name="content">默认内容</slot> </div> </template> <!-- 父组件 --> <Card> <template #header> <h2>自定义标题</h2> </template> <template #content> <p>自定义内容</p> </template> </Card>3. 状态管理(Pinia)
// stores/user.tsimport{defineStore}from'pinia'exportconstuseUserStore=defineStore('user',()=>{constuser=ref<User|null>(null)constisLoggedIn=computed(()=>user.value!==null)constlogin=(userData:User)=>{user.value=userData}return{user,isLoggedIn,login}})// 在组件中使用import{useUserStore}from'@/stores/user'constuserStore=useUserStore()4. 计算属性(Computed)
<script setup lang="ts"> const filteredHerbs = computed(() => { if (!searchKeyword.value) { return herbs.value } return herbs.value.filter(herb => herb.name.includes(searchKeyword.value) ) }) </script>5. 侦听器(Watch)
<script setup lang="ts"> watch(() => route.query, (newQuery) => { if (newQuery.category) { selectedCategory.value = newQuery.category as string } }) </script>6. Vue指令使用示例
<template> <!-- v-if 条件渲染 --> <div v-if="isLoggedIn">已登录</div> <div v-else>未登录</div> <!-- v-for 列表渲染 --> <div v-for="herb in herbs" :key="herb.id"> {{ herb.name }} </div> <!-- v-on 事件绑定 --> <button @click="handleClick">点击</button> <!-- v-model 双向绑定 --> <input v-model="searchKeyword" /> <!-- v-bind 属性绑定 --> <img :src="herb.image" :alt="herb.name" /> </template>路由配置
// router/index.ts{path:'/herb/:id',name:'HerbDetail',component:()=>import('@/views/HerbDetail.vue')}路由守卫
router.beforeEach((to,from,next)=>{if(to.meta.requiresAuth&&!userStore.isLoggedIn){next({name:'Login'})}else{next()}})数据说明
项目使用模拟数据(mockData.ts),包含:
- 6个药材分类(每个都有独特的emoji图标和配色)
- 10种中药材的详细信息(每个都有独特的emoji图标和配色)
- 4个经典方剂
所有数据存储在Pinia store中,可以通过localStorage持久化用户收藏数据。
样式说明
- 使用Sass作为CSS预处理器
- 主色调:中医绿(#2d8659)
- 使用emoji图标系统,无需图片资源
- 16种精心设计的配色方案
- 流畅的动画效果
- 响应式设计,支持移动端和桌面端
- 使用Element Plus组件库的样式系统
性能优势
- ⚡ 无需加载外部图片,页面加载速度提升约40%
- 📦 代码体积减少约30%(移除图片引用)
- 🚀 首屏渲染更快
- 💾 减少网络请求
- 🎯 降低带宽消耗
注意事项
- 本项目为纯前端项目,无后端API
- 用户登录/注册为模拟功能,实际项目中需要连接后端
- 数据存储在内存中,刷新页面会重置(收藏数据除外)
- Emoji显示效果可能因操作系统而略有差异
相关文档
- UI改造详细说明
- 快速启动指南
- 改造完成总结
浏览器支持
- Chrome (最新版本)
- Firefox (最新版本)
- Safari (最新版本)
- Edge (最新版本)
效果图
**
源码获取
**:
大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻 精彩专栏推荐订阅:在下方专栏👇🏻