1. 项目概述与行业背景
中药材行业作为我国传统医药产业的重要组成部分,长期以来面临着管理粗放、信息化程度低的痛点。药材从采购到销售的全流程中,手工记录、纸质单据仍是主流方式,导致数据孤岛严重、库存周转率低、损耗难以控制等问题。这套基于SpringBoot的中药材进存销管理系统,正是针对这些行业痛点设计的全流程数字化解决方案。
我在实际开发中发现,中药材管理相比普通商品有着显著特殊性:首先,药材存在严格的批次管理和效期控制需求;其次,同种药材可能因产地、采收季节不同而存在质量差异;再者,药材的计量单位复杂(如公斤、克、甚至传统计量单位"钱")。这些特性都必须在系统设计中予以充分考虑。
系统采用B/S架构,前端使用Vue.js实现响应式布局,后端基于SpringBoot框架搭建RESTful API,数据库选用MySQL 5.7。这种技术栈的选择主要基于三点考量:一是Java生态在中大型企业系统中的稳定性和成熟度;二是SpringBoot的自动配置特性可大幅减少XML配置;三是MySQL在事务处理和并发控制上的可靠性,完全能满足年交易量百万级的中小型药材企业需求。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计与技术选型
2.1 整体技术架构解析
系统采用经典的三层架构设计,但针对药材行业特性做了特殊优化:
code复制表示层(Vue.js) → 业务逻辑层(SpringBoot) → 数据访问层(MyBatis)
↑ ↑ ↑
移动端适配 药材业务规则引擎 药材特性数据模型
在表示层,我们使用Vue CLI 4.x搭建前端工程,通过Axios与后端交互。特别开发了药材专用表单控件,如支持"克-公斤-钱"单位自动换算的输入组件。
业务逻辑层采用SpringBoot 2.3.4,其核心优势在于:
- 内嵌Tomcat简化部署
- Starter依赖自动管理JAR包版本
- Actuator提供完善的系统监控
- 与MyBatis的无缝集成
数据层使用MySQL 5.7,关键配置参数:
ini复制innodb_buffer_pool_size = 4G # 缓冲池设为物理内存70%
transaction-isolation = READ-COMMITTED
innodb_lock_wait_timeout = 120
2.2 数据库设计要点
药材管理的E-R模型需要特别关注几个核心实体:
- 药材基础信息表(herb_base)
sql复制CREATE TABLE `herb_base` (
`herb_id` varchar(20) NOT NULL COMMENT '药材编码',
`herb_name` varchar(50) NOT NULL COMMENT '药材名称',
`latin_name` varchar(100) DEFAULT NULL COMMENT '拉丁学名',
`category_id` int(11) NOT NULL COMMENT '分类ID',
`origin_place` varchar(100) DEFAULT NULL COMMENT '道地产区',
`spec_unit` enum('kg','g','qian') NOT NULL DEFAULT 'kg' COMMENT '规格单位',
`storage_condition` enum('阴凉','冷藏','常温') NOT NULL COMMENT '存储条件',
`shelf_life` int(11) DEFAULT NULL COMMENT '保质期(月)',
PRIMARY KEY (`herb_id`),
UNIQUE KEY `idx_name` (`herb_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
- 批次库存表(batch_stock)
这是系统的核心表,实现了药材特有的批次管理:
sql复制CREATE TABLE `batch_stock` (
`batch_id` varchar(30) NOT NULL COMMENT '批次号',
`herb_id` varchar(20) NOT NULL COMMENT '药材ID',
`purchase_id` varchar(20) NOT NULL COMMENT '采购单号',
`produce_date` date NOT NULL COMMENT '生产日期',
`expire_date` date NOT NULL COMMENT '失效日期',
`current_weight` decimal(12,3) NOT NULL COMMENT '当前重量',
`original_weight` decimal(12,3) NOT NULL COMMENT '原始重量',
`warehouse_id` int(11) NOT NULL COMMENT '库位ID',
`quality_level` enum('特级','一级','二级','等外') NOT NULL COMMENT '质量等级',
`status` enum('在库','锁定','已出库','报废') NOT NULL DEFAULT '在库',
PRIMARY KEY (`batch_id`),
KEY `idx_herb_expire` (`herb_id`,`expire_date`),
KEY `idx_warehouse` (`warehouse_
