基于SpringBoot的在线药品销售与库存管理平台 - 源码深度解析
在传统药品零售行业,依赖人工记录、信息孤岛严重以及运营效率低下是长期存在的痛点。药品作为特殊商品,其管理涉及严格的批次追踪、有效期监控和库存精准控制,任何环节的失误都可能导致经济损失或安全隐患。为了解决这些问题,我们设计并实现了一个企业级药品流通管理平台,该平台通过数字化的业务流程,将药品销售、库存追踪与数据报表深度整合,为药品经营者提供了统一、实时、精准的业务操作中枢。
系统架构与技术栈
该平台基于SpringBoot框架构建,严格遵循约定优于配置原则,采用经典的MVC分层架构。后端技术栈包括Spring Boot 2.x、Spring Data JPA、Spring Security和MySQL数据库,前端采用HTML、CSS、JavaScript技术栈,构建了响应式的用户界面。
在架构设计上,控制层(Controller)负责接收前端请求并进行参数验证;业务逻辑层(Service)封装了复杂的药品销售逻辑与库存计算规则;数据持久层(Repository)基于Spring Data JPA与数据库进行交互,通过实体类映射实现对象关系映射。
// 数据源配置示例
spring.datasource.url=jdbc:mysql://www.csbishe.cn:3306/boot_drugscsys?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=boot_drugscsys
spring.datasource.password=boot_drugscsys
# MyBatis mapper配置
mybatis.mapper-locations=classpath:mappers/*.xml
平台集成了Spring Security框架进行权限控制,确保不同角色的员工(如店员与管理员)只能访问其权限范围内的功能模块。这种分层架构不仅保证了代码的可维护性,还通过模块化设计实现了功能的高度可扩展性。
数据库设计亮点
员工表(t_employees)设计分析
员工表的设计体现了企业级应用的数据完整性要求。表结构采用自增主键uid作为唯一标识,通过username和phone字段确保账号唯一性。权限控制方面,permissions字段采用整型枚举值(0-老板,1-员工)实现角色分级。
CREATE TABLE `t_employees` (
`uid` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id',
`username` varchar(20) NOT NULL COMMENT '用户名',
`password` char(32) NOT NULL COMMENT '密码',
`salt` char(36) DEFAULT NULL COMMENT '盐值',
`gender` int(11) DEFAULT NULL COMMENT '性别,0-女性,1-男性',
`age` int(4) DEFAULT NULL COMMENT '年龄',
`phone` varchar(20) NOT NULL COMMENT '电话',
`email` varchar(50) NOT NULL COMMENT '邮箱',
`avatar` varchar(50) DEFAULT NULL COMMENT '头像',
`cardBank` varchar(50) DEFAULT NULL COMMENT '开户行',
`card` varchar(20) DEFAULT NULL COMMENT '银行账户',
`is_delete` int(11) DEFAULT 0 COMMENT '是否删除,0-未删除,1-已删除',
`permissions` int(4) DEFAULT NULL COMMENT '权限,0-老板,1-员工',
`created_user` varchar(20) DEFAULT NULL COMMENT '创建执行人',
`created_time` datetime DEFAULT NULL COMMENT '创建时间',
`modified_user` varchar(20) DEFAULT NULL COMMENT '修改执行人',
`modified_time` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='员工表'
安全设计方面,密码存储采用MD5加盐哈希机制,salt字段使用36位字符确保密码安全性。软删除机制通过is_delete字段实现,避免数据永久丢失。审计字段(created_time、modified_time等)完整记录了数据生命周期。
药品表(t_drug)业务逻辑设计
药品表的设计充分考虑药品管理的特殊性,包含完整的药品信息体系和库存管理机制。
CREATE TABLE `t_drug` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '药品id',
`drugName` varchar(20) NOT NULL COMMENT '药品名',
`barCode` varchar(15) NOT NULL COMMENT '条形码',
`referred` varchar(32) NOT NULL COMMENT '简称',
`specifications` varchar(20) NOT NULL COMMENT '规格',
`unit` varchar(20) NOT NULL COMMENT '单位',
`origin` varchar(150) NOT NULL COMMENT '产地',
`approvalNumber` varchar(100) NOT NULL COMMENT '批准文号',
`pleasedTo` float NOT NULL COMMENT '进货价',
`salesPrice` float NOT NULL COMMENT '售货价',
`inventory` int(11) NOT NULL COMMENT '库存',
`totalSales` int(11) NOT NULL COMMENT '销售总量',
`drugNote` varchar(500) NOT NULL COMMENT '药品备注',
`category_id` int(11) NOT NULL COMMENT '药品类别id',
`is_delete` int(11) DEFAULT 0 COMMENT '是否删除,0-未删除,1-已删除',
`created_user` varchar(20) DEFAULT NULL COMMENT '创建执行人',
`created_time` datetime DEFAULT NULL COMMENT '创建时间',
`modified_user` varchar(20) DEFAULT NULL COMMENT '修改执行人',
`modified_time` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
KEY `F_category_drug` (`category_id`),
CONSTRAINT `F_category_drug` FOREIGN KEY (`category_id`) REFERENCES `t_drug_category` (`categoryId`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci
关键设计亮点包括:
- 条形码唯一性约束:
barCode字段确保药品标识的唯一性,支持扫码枪快速录入 - 价格体系完善:分别记录进货价(
pleasedTo)和销售价(salesPrice),便于利润计算 - 库存实时追踪:
inventory字段与销售表联动,实现库存实时更新 - 分类管理:通过外键关联药品类别表,支持分类统计和分析
销售表(t_drug_sales)事务一致性设计
销售表的设计重点保障交易数据的一致性和完整性。
CREATE TABLE `t_drug_sales` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '销售id',
`documentNo` varchar(32) DEFAULT NULL COMMENT '销售单据号',
`inventoryQuantity` int(11) DEFAULT NULL COMMENT '销售数量',
`price` float DEFAULT NULL COMMENT '单价',
`inventory` float DEFAULT NULL COMMENT '销售金额',
`storageTime` datetime DEFAULT NULL COMMENT '销售时间',
`drugName` varchar(20) NOT NULL COMMENT '药品编号',
`customer_id` int(11) NOT NULL COMMENT '客户id',
`is_delete` int(11) DEFAULT 0 COMMENT '是否删除,0-未删除,1-已删除',
`created_user` varchar(20) DEFAULT NULL COMMENT '创建执行人',
`created_time` datetime DEFAULT NULL COMMENT '创建时间',
`modified_user` varchar(20) DEFAULT NULL COMMENT '修改执行人',
`modified_time` datetime DEFAULT NULL COMMENT '修改时间',
PRIMARY KEY (`id`),
KEY `F_customer_sales` (`customer_id`),
CONSTRAINT `F_customer_sales` FOREIGN KEY (`customer_id`) REFERENCES `t_customer` (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='药品销售表'
该表通过外键约束确保客户信息的有效性,单据号(documentNo)设计支持复杂的销售业务流程。时间戳字段为销售数据分析提供基础,金额字段采用float类型满足精确计算需求。
核心功能实现
统一的异常处理机制
平台通过基类控制器实现了统一的异常处理机制,确保系统健壮性和用户体验一致性。
@ExceptionHandler(ServiceExcepti