1. 项目背景与核心价值
这个中草药科普网站项目(编号60307)最初源于我在中医药文化推广工作中遇到的实际需求。在基层义诊活动中,我发现普通群众对中草药知识的了解非常有限,很多人甚至分不清常见药材的功效和禁忌。市面上虽然有一些中医药网站,但要么专业性太强难以理解,要么内容零散不成体系。
这个项目的核心价值在于:
- 构建一个免费开放的中草药知识库,降低公众获取专业信息的门槛
- 通过可视化方式展示药材特征和配伍关系
- 提供实用的养生方案查询功能
- 完整开源的设计让同行可以快速搭建类似平台
提示:项目采用MIT开源协议,所有源码均可自由使用和修改,但需保留原始作者信息。
2. 技术架构设计解析
2.1 前端技术选型
采用Vue3+Element Plus的组合主要基于以下考虑:
- 组件化开发便于复用药材展示卡片等UI元素
- Composition API更适合复杂的状态管理(如药材配伍关系图)
- Element Plus的表格和表单组件能快速构建后台管理系统
实测中发现需要特别注意:
- 药材图片懒加载优化(平均页面加载时间从3.2s降至1.4s)
- 移动端适配需要额外处理药材对比表格的响应式布局
2.2 后端服务搭建
使用Spring Boot配合MyBatis-Plus主要考虑到:
- 需要处理复杂的药材功效关联查询(如"清热"类药材的多表联查)
- 中药配伍禁忌检查需要事务支持
- 后期可能接入智能推荐算法
数据库设计关键点:
sql复制-- 药材基础表
CREATE TABLE herb (
id BIGINT PRIMARY KEY,
name VARCHAR(50) NOT NULL COMMENT '药材名',
alias VARCHAR(100) COMMENT '别名',
category TINYINT COMMENT '分类:1根茎类 2果实类...',
image_url VARCHAR(255),
is_toxic BOOLEAN DEFAULT false
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 药材功效关联表(多对多)
CREATE TABLE herb_effect (
herb_id BIGINT,
effect_id INT,
PRIMARY KEY (herb_id, effect_id)
);
3. 核心功能实现细节
3.1 智能搜索功能
搜索算法采用Elasticsearch实现以下特性:
- 拼音搜索(输入"gq"可匹配"枸杞")
- 同义词扩展(搜索"感冒"自动包含"伤风"相关结果)
- 功效组合搜索("清热+解毒")
搜索接口示例:
java复制@GetMapping("/search")
public Result searchHerbs(
@RequestParam String keyword,
@RequestParam(required = false) List<String> effects) {
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
// 构建多条件查询
BoolQueryBuilder boolQuery = QueryBuilders.boolQuery()
.should(QueryBuilders.matchQuery("name", keyword).boost(2))
.should(QueryBuilders.matchQuery("pinyin", keyword));
if (effects != null) {
effects.forEach(effect ->
boolQuery.must(QueryBuilders.termQuery("effects", effect)));
}
return Result.success(elasticsearchTemplate.search(
queryBuilder.withQuery(boolQuery).build(),
HerbDocument.class));
}
3.2 配伍禁忌检查器
实现原理:
- 建立药材配伍规则库(十八反、十九畏等)
- 用户选择药材时实时检查组合
- 高风险组合触发显眼警告
核心校验逻辑:
javascript复制function checkCompatibility(selectedHerbs) {
const conflicts = [];
const herbIds = selectedHerbs.map(h => h.id);
// 检查十八反组合
antagonisticPairs.forEach(pair => {
if (herbIds.includes(pair.herbA) && herbIds.includes(pair.herbB)) {
conflicts.push(`${pair.herbA.name}与${pair.herbB.name}属于十八反`);
}
});
// 检查十九畏组合
inhibitingPairs.forEach(pair => {
if (herbIds.includes(pair.herbA) && herbIds.includes(pair.herbB)) {
conflicts.push(`${pair.herbA.name}畏${pair.herbB.name}`);
}
});
return conflicts;
}
4. 内容管理系统设计
4.1 多角色权限控制
采用RBAC模型设计以下角色:
- 超级管理员:可管理用户和所有内容
- 药材编辑:只能编辑指定分类的药材信息
- 内容审核员:审核用户提交的偏方
权限拦截实现:
java复制@PreAuthorize("hasRole('HERB_EDITOR') &&
@permissionService.canEditHerb(#herbId, authentication)")
@PostMapping("/herb/{herbId}")
public Result updateHerb(@PathVariable Long herbId, @RequestBody HerbDTO dto) {
// 更新逻辑
}
4.2 版本控制与审核流程
为解决多人编辑冲突问题:
- 采用乐观锁控制并发修改
- 重要字段变更需要审核
- 保留完整修改历史
数据库设计新增:
sql复制ALTER TABLE herb ADD COLUMN version INT DEFAULT 1;
CREATE TABLE herb_history LIKE herb;
ALTER TABLE herb_history
ADD COLUMN modify_time DATETIME,
ADD COLUMN operator VARCHAR(50);
5. 部署与性能优化
5.1 容器化部署方案
Docker-compose配置要点:
yaml复制version: '3'
services:
app:
image: herb-web:1.0
ports:
- "8080:8080"
depends_on:
- redis
- mysql
environment:
- SPRING_PROFILES_ACTIVE=prod
mysql:
image: mysql:5.7
volumes:
- ./mysql-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=yourpassword
5.2 缓存策略优化
采用多级缓存架构:
- 本地Caffeine缓存高频访问的药材基础信息(TTL 5分钟)
- Redis缓存复杂查询结果(如功效组合查询,TTL 30分钟)
- CDN缓存静态资源和图片
配置示例:
properties复制# application.properties
spring.cache.type=caffeine
spring.cache.caffeine.spec=maximumSize=500,expireAfterWrite=5m
spring.redis.host=redis-server
spring.redis.timeout=3000
6. 项目扩展方向
在实际使用中,我们发现了几个有价值的扩展点:
-
药材识别API:通过手机拍照识别常见药材
- 可采用轻量级CNN模型(如MobileNetV3)
- 需要构建包含5万+张药材图片的训练集
-
个性化推荐系统:
python复制# 基于用户浏览历史的协同过滤 def recommend_herbs(user_id): viewed = get_view_history(user_id) similar_users = find_similar_users(viewed) return aggregate_top_herbs(similar_users) -
中医药知识图谱:
- 使用Neo4j构建药材-功效-病症关系网
- 支持智能问答:"什么药材适合失眠伴有心悸?"
这个项目最让我意外的收获是:很多基层医疗机构直接使用我们的开源代码搭建了自己的科普平台。一位村医反馈说,通过这个系统,当地老人误服中药的情况减少了近70%。这也让我更加坚信,技术赋能传统医学有着巨大的社会价值。
