三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Vue3+Django构建中药材资源共享平台实践

Vue3+Django构建中药材资源共享平台实践

1. 项目背景与核心价值

这个数字中药材资源共享平台项目,是我去年为一个中医药研究机构开发的线上资源管理系统。当时客户面临的主要痛点是:全国各地的中药材种植基地、研究机构和药企之间缺乏统一的数据共享渠道,导致大量优质药材信息和研究成果分散在各个单位的Excel表格和纸质档案里。

这个平台的核心价值在于:

  • 实现了中药材基础数据(如道地产区、采收季节、有效成分含量)的标准化录入
  • 打通了从种植端到研究端的全链条数据共享
  • 通过可视化分析帮助决策者发现区域药材资源优势
  • 为中医药研究提供了结构化的数据支撑

技术栈选择上,前端采用Vue3+Element Plus的组合,主要看中其:

  1. Composition API对复杂业务逻辑的更好封装
  2. 更小的打包体积(相比Vue2减少约40%)
  3. 更好的TypeScript支持(这对后期维护很重要)

后端选择Python 3.9(项目代号python127),主要基于:

  • 丰富的科学计算库(Pandas处理药材检测数据)
  • Django REST framework的快速开发能力
  • 与中药材图像识别算法的无缝集成

2. 前端架构设计与实现

2.1 Vue3项目初始化

使用Vite创建项目比传统webpack快很多:

npm create vite@latest chinese-herb-platform --template vue-ts

关键配置项说明:

  • 选择TypeScript模板(中药数据字段多,类型检查很有必要)
  • 添加ESLint+Prettier(团队协作必备)
  • 配置alias简化导入路径(@/代替../../)

2.2 核心功能模块拆解

平台主要包含以下功能模块:

  1. 药材档案管理

    • 采用树形结构展示药材分类(根茎类、果实类等)
    • 自定义表单生成器(不同药材有不同字段)
  2. 资源共享中心

    • 类似知识库的文档管理系统
    • 集成Office Online实现文档预览
  3. 数据可视化

    • 使用ECharts展示药材分布热力图
    • 基于时间轴的成分含量变化曲线

2.3 典型组件实现示例

以药材详情页为例,关键实现点:

<script setup lang="ts"> // 使用Composition API组织逻辑 const route = useRoute() const herbId = computed(() => route.params.id) const { data } = await useFetch(`/api/herbs/${herbId.value}`) </script> <template> <el-card> <el-tabs> <el-tab-pane label="基础信息"> <HerbBasicInfo :data="data.basic" /> </el-tab-pane> <el-tab-pane label="成分分析"> <ECharts :option="compositionChartOption" /> </el-tab-pane> </el-tabs> </el-card> </template>

注意:实际项目中需要处理加载状态和错误边界,这里做了简化

3. 后端API开发要点

3.1 Django模型设计

中药材数据模型示例:

class Herb(models.Model): class Category(models.TextChoices): ROOT = 'root', '根茎类' LEAF = 'leaf', '叶类' FRUIT = 'fruit', '果实类' name = models.CharField(max_length=100, unique=True) category = models.CharField(max_length=10, choices=Category.choices) geo_json = models.JSONField() # 地理分布数据 created_at = models.DateTimeField(auto_now_add=True) class HerbComponent(models.Model): herb = models.ForeignKey(Herb, on_delete=models.CASCADE) name = models.CharField(max_length=50) content = models.DecimalField(max_digits=5, decimal_places=2) # 含量百分比

3.2 性能优化实践

  1. 查询优化
# 错误做法:N+1查询 herbs = Herb.objects.all() for herb in herbs: print(herb.components.all()) # 每次循环都查询数据库 # 正确做法:使用select_related/prefetch_related herbs = Herb.objects.prefetch_related('herbcomponent_set').all()
  1. 缓存策略
  • 使用Redis缓存热门药材数据
  • 对GIS查询结果设置15分钟缓存

4. 典型业务场景实现

4.1 药材溯源二维码生成

from qrcode import make from io import BytesIO def generate_herb_qrcode(herb_id): herb = Herb.objects.get(pk=herb_id) url = f"https://herb-platform.com/herbs/{herb_id}" img = make(url) buffer = BytesIO() img.save(buffer) return buffer.getvalue()

前端调用方式:

const downloadQRCode = async (herbId) => { const res = await axios.get(`/api/herbs/${herbId}/qrcode`, { responseType: 'blob' }) const url = URL.createObjectURL(new Blob([res.data])) const link = document.createElement('a') link.href = url link.download = 'qrcode.png' document.body.appendChild(link) link.click() }

4.2 药材相似度推荐

基于scikit-learn实现:

from sklearn.metrics.pairwise import cosine_similarity from sklearn.feature_extraction.text import TfidfVectorizer def find_similar_herbs(target_herb_id, top_n=5): herbs = Herb.objects.all() descriptions = [h.description for h in herbs] vectorizer = TfidfVectorizer() tfidf_matrix = vectorizer.fit_transform(descriptions) target_idx = next(i for i,h in enumerate(herbs) if h.id==target_herb_id) similarities = cosine_similarity(tfidf_matrix[target_idx], tfidf_matrix) similar_indices = similarities.argsort()[0][-top_n-1:-1][::-1] return [herbs[i] for i in similar_indices]

5. 部署与运维实践

5.1 容器化部署

Docker-compose示例:

version: '3.8' services: web: build: . command: gunicorn core.wsgi:application --bind 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" depends_on: - redis - db db: image: postgres:13 environment: POSTGRES_PASSWORD: herb123 volumes: - postgres_data:/var/lib/postgresql/data redis: image: redis:6 volumes: postgres_data:

5.2 性能监控

使用Prometheus+Grafana监控:

  1. Django侧配置:
INSTALLED_APPS += ['django_prometheus'] MIDDLEWARE = [ 'django_prometheus.middleware.PrometheusBeforeMiddleware', # ...其他中间件 'django_prometheus.middleware.PrometheusAfterMiddleware' ]
  1. 前端监控(使用Sentry):
import * as Sentry from "@sentry/vue" Sentry.init({ app, dsn: "your-dsn", integrations: [ new Sentry.BrowserTracing({ routingInstrumentation: Sentry.vueRouterInstrumentation(router) }), ], tracesSampleRate: 0.2 })

6. 项目经验总结

在实际开发中,有几个关键经验值得分享:

  1. 药材数据标准化
  • 提前制定《中药材数据录入规范》
  • 对重要字段(如成分含量)设置数据校验规则
  • 建立数据质量监控看板
  1. 地图可视化优化
// 使用Web Worker处理大型地理JSON数据 const worker = new Worker('./geoDataProcessor.js') worker.postMessage(largeGeoJson) worker.onmessage = (e) => { chart.setOption({ geo: e.data }) }
  1. 权限系统设计
  • 基于RBAC模型
  • 区分药材查看权限(公开/内部)
  • 敏感操作(如数据导出)需要二次验证

这个项目让我深刻体会到,传统行业与现代Web技术的结合能产生巨大价值。通过这个平台,某药材种植基地成功对接了3家省级研究机构,促成了多个合作项目。技术层面上,Vue3的Composition API确实大幅提升了复杂业务逻辑的组织效率,而Python在数据处理方面的优势也为平台提供了坚实后盾。

← 返回列表