1. 项目背景与核心需求
老中医传承药材信息系统是一个典型的传统行业数字化转型案例。在中医药领域,药材信息的准确记录、快速检索和科学管理一直是行业痛点。许多老中医的宝贵经验和药材知识仍停留在纸质笔记或口头传授阶段,存在信息丢失、查询不便、传承困难等问题。
这个系统需要解决三个核心问题:
- 药材信息的结构化存储:将分散的药材属性(性味归经、功效主治、用法用量等)转化为可检索的数据库记录
- 知识传承的数字化:实现老中医经验方的电子化记录和智能检索
- 业务流程的线上化:从药材采购、库存管理到处方开立的全流程追踪
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术选型与架构设计
2.1 前端技术栈:Vue.js生态
选择Vue 3作为前端框架主要考虑:
- 组件化开发优势:药材信息展示、处方编辑等模块高度复用
- 渐进式框架特性:适合从简单功能开始逐步扩展
- 丰富的UI库支持:使用Element Plus构建管理后台界面
关键配置示例:
javascript复制// vue.config.js
module.exports = {
devServer: {
proxy: {
'/api': {
target: 'http://localhost:3000',
changeOrigin: true
}
}
}
}
2.2 后端技术栈:Node.js + Express
选择这套组合的原因:
- 全JavaScript技术栈:前后端开发语言统一
- Express的轻量级特性:适合中小型业务系统
- 丰富的中间件生态:可快速实现鉴权、日志等功能
基础服务架构:
code复制├── controllers/ # 业务逻辑
├── models/ # 数据模型
├── routes/ # 路由定义
├── middlewares/ # 自定义中间件
└── app.js # 主入口
2.3 数据库设计:MongoDB + Redis
药材核心数据模型示例:
javascript复制// models/herb.js
const mongoose = require('mongoose');
const HerbSchema = new mongoose.Schema({
name: { type: String, required: true, unique: true }, // 药材名称
pinyin: { type: String, index: true }, // 拼音检索
category: { type: String }, // 药材类别
properties: { // 四气五味
qi: { type: String }, // 四气
wei: { type: String } // 五味
},
efficacy: [{ type: String }], // 功效
contraindications: { type: String } // 禁忌
});
3. 核心功能模块实现
3.1 药材智能检索系统
实现要点:
- 多维度检索:支持名称、拼音首字母、功效等多字段联合查询
- 相关性排序:基于搜索关键词的TF-IDF算法实现
- 联想输入:使用Redis缓存热门搜索词
核心搜索API示例:
javascript复制// controllers/search.js
exports.searchHerbs = async (req, res) => {
const { keyword, category } = req.query;
const query = {};
if (keyword) {
query.$or = [
{ name: new RegExp(keyword, 'i') },
{ pinyin: new RegExp(keyword, 'i') },
{ efficacy: new RegExp(keyword, 'i') }
];
}
if (category) query.category = category;
try {
const results = await Herb.find(query)
.sort({ _score: -1 })
.limit(20);
res.json(results);
} catch (err) {
res.status(500).json({ error: err.message });
}
};
3.2 处方配伍分析模块
关键技术点:
- 药材配伍禁忌检测:基于规则引擎实现
- 剂量安全校验:设置各类药材的常规用量范围
- 功效协同分析:使用图数据库存储药材关系
配伍检测算法示例:
javascript复制function checkCompatibility(herbs) {
const conflicts = [];
const herbIds = herbs.map(h => h._id);
// 检查十八反十九畏
for (const group of ANTAGONISM_GROUPS) {
const matches = group.filter(id => herbIds.includes(id));
if (matches.length > 1) {
conflicts.push(`配伍禁忌: ${matches.join('与')}属于${group.name}`);
}
}
// 检查重复功效
const efficacyCount = {};
herbs.forEach(herb => {
herb.efficacy.forEach(eff => {
efficacyCount[eff] = (efficacyCount[eff] || 0) + 1;
});
});
for (const [eff, count] of Object.entries(efficacyCount)) {
if (count > EFFICACY_THRESHOLD) {
conflicts.push(`功效过度叠加: ${eff}出现${count}次`);
}
}
return conflicts;
}
4. 系统部署与性能优化
4.1 服务端性能调优
关键优化措施:
- 接口缓存:对高频查询接口添加Redis缓存
- 数据库索引:为所有查询字段建立合适索引
- 连接池配置:优化MongoDB连接参数
Express性能配置示例:
javascript复制// app.js
app.use(compression()); // 启用Gzip压缩
app.use(helmet()); // 安全防护
app.use(express.json({ limit: '10kb' })); // 限制请求体大小
// MongoDB连接优化
mongoose.connect(process.env.DB_URI, {
poolSize: 10,
socketTimeoutMS: 30000,
connectTimeoutMS: 30000
});
4.2 前端性能优化方案
实施策略:
- 路由懒加载:按需加载功能模块
- 资源压缩:使用Webpack进行代码分割
- 静态资源CDN加速
Vue优化配置:
javascript复制// vite.config.js
export default defineConfig({
build: {
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
return 'vendor';
}
}
}
}
}
});
5. 安全防护措施
5.1 认证授权体系
实现方案:
- JWT无状态认证
- RBAC权限模型
- 敏感操作日志审计
认证中间件示例:
javascript复制// middlewares/auth.js
const jwt = require('jsonwebtoken');
module.exports = (requiredRole) => {
return async (req, res, next) => {
try {
const token = req.header('Authorization')?.replace('Bearer ', '');
if (!token) throw new Error('请提供认证令牌');
const decoded = jwt.verify(token, process.env.JWT_SECRET);
if (requiredRole && decoded.role !== requiredRole) {
throw new Error('权限不足');
}
req.user = decoded;
next();
} catch (err) {
res.status(401).json({ error: err.message });
}
};
};
5.2 数据安全防护
关键措施:
- 敏感字段加密:使用AES加密患者隐私信息
- SQL注入防护:使用mongoose内置的查询过滤
- XSS防护:前端使用DOMPurify过滤输入
加密工具类示例:
javascript复制// utils/crypto.js
const crypto = require('crypto');
const ALGORITHM = 'aes-256-cbc';
const KEY = crypto.scryptSync(process.env.ENC_KEY, 'salt', 32);
const IV = Buffer.alloc(16, 0);
exports.encrypt = (text) => {
const cipher = crypto.createCipheriv(ALGORITHM, KEY, IV);
let encrypted = cipher.update(text, 'utf8', 'hex');
encrypted += cipher.final('hex');
return encrypted;
};
exports.decrypt = (encrypted) => {
const decipher = crypto.createDecipheriv(ALGORITHM, KEY, IV);
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
};
6. 项目开发经验总结
6.1 中医药知识建模要点
- 属性标准化:参考《中国药典》建立统一的数据标准
- 关系网络构建:使用图结构表示药材间的相须相使关系
- 剂量浮动处理:针对不同体质设置剂量调整系数
6.2 全栈开发实践心得
-
接口设计规范:
- 统一响应格式:
- 错误码标准化
- 版本控制:/api/v1/...
-
前后端协作技巧:
- 使用Swagger生成API文档
- 约定枚举值常量
- 建立Mock数据服务
-
调试技巧:
bash复制# 查看MongoDB慢查询 db.setProfilingLevel(1, { slowms: 100 }) db.system.profile.find().sort({ ts: -1 }).limit(10)
6.3 典型问题解决方案
-
中文检索优化:
- 使用pinyin插件实现拼音检索
- 对名称字段建立text索引
- 实现模糊搜索容错
-
复杂表单处理:
- 使用Vue的v-model与自定义指令
- 实现分步保存机制
- 添加草稿自动保存功能
-
大数据量导出:
- 使用stream流式处理
- 分批次查询避免内存溢出
- 后台任务+WebSocket进度通知
7. 项目扩展方向
-
智能推荐系统:
- 基于患者症状的药材推荐
- 相似处方推荐
- 季节养生方案生成
-
移动端适配:
- 开发微信小程序版本
- 实现扫码识别药材功能
- 离线数据同步方案
-
知识图谱构建:
- 药材-功效-症状关系网络
- 可视化交互查询
- 智能问答系统
-
物联网集成:
- 智能药柜库存管理
- 煎药设备状态监控
- 药材种植环境监测
实际开发中发现,将传统中医药知识与现代信息技术结合时,最重要的是保持专业性与实用性的平衡。比如在实现配伍禁忌检查时,既需要严格遵守中医理论,又要考虑实际临床中的特殊情况处理。我们最终采用了"严格校验+人工复核"的机制,在系统给出警告后仍允许经验丰富的老中医 override 系统建议。
