基于SSM框架的药品信息管理平台 - 源码深度解析
在医疗信息化快速发展的今天,药品管理作为医疗机构运营的核心环节,其效率与准确性直接关系到医疗质量与患者安全。传统的人工记录或Excel表格管理方式已难以满足现代医疗机构对药品信息实时性、准确性和安全性的高标准要求。药品信息管理平台应运而生,通过数字化手段彻底解决药品信息分散、更新滞后、查询困难等痛点,为医疗机构提供全面的药品数据管理解决方案。
系统架构与技术栈
该平台采用经典的SSM(Spring+SpringMVC+MyBatis)框架组合,构建了层次清晰、易于维护的企业级应用架构。
架构优势分析
- Spring框架:作为核心容器,通过依赖注入(DI)和面向切面编程(AOP)实现组件解耦,其声明式事务管理确保了药品数据操作的原子性和一致性
- SpringMVC:负责请求分发和视图解析,采用注解驱动的控制器设计简化了开发流程,支持RESTful风格的API设计
- MyBatis:作为数据持久层框架,通过灵活的SQL映射提供了高效的数据库访问能力,支持动态SQL和存储过程
技术栈配置详情
<!-- Spring核心容器依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
<!-- SpringMVC Web框架依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.18</version>
</dependency>
<!-- MyBatis与Spring整合依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.7</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
项目采用Maven进行依赖管理,确保第三方库版本的一致性。前端使用HTML5+CSS3+JavaScript技术栈,结合JSP实现动态页面渲染,形成了完整的前后端分离架构。
数据库设计亮点
药品类型表(t_medicinetype)的设计优化
CREATE TABLE `t_medicinetype` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`t_mtype` varchar(255) DEFAULT NULL COMMENT '药品类型',
`t_bz` longtext DEFAULT NULL COMMENT '备注',
`addTime` datetime DEFAULT NULL COMMENT '插入数据库时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='药品类型表'
设计亮点分析:
- 字符集优化:使用utf8mb4字符集支持完整的Unicode字符,确保特殊药品名称(如含生僻字的中药名)的正确存储
- 时间精度:
addTime字段采用datetime类型精确记录操作时间,支持审计追踪 - 主键设计:自增主键保证数据唯一性和插入性能
- 索引优化:为
t_mtype字段添加唯一索引防止重复药品类型
CREATE UNIQUE INDEX idx_medicinetype_mtype ON t_medicinetype(t_mtype);
用户权限关联设计
公告管理表(t_gonggao)通过外键关联用户表,实现数据完整性约束:
CREATE TABLE `t_gonggao` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`t_title` varchar(255) DEFAULT NULL COMMENT '标题',
`t_content` varchar(255) DEFAULT NULL COMMENT '内容',
`t_shijian` varchar(255) DEFAULT NULL COMMENT '发布时间',
`user_id` int(11) DEFAULT NULL COMMENT '对应User表的ID,在这里作为外键',
PRIMARY KEY (`id`),
KEY `FK2B14C9A92D852AE4` (`user_id`),
CONSTRAINT `FK2B14C9A92D852AE4` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='公告管理表'
关联设计优势:
- 数据完整性:外键约束确保公告数据与用户数据的引用完整性,避免孤儿记录的产生
- 查询性能:索引优化显著提升了基于用户ID的查询性能
- 级联操作:支持级联删除和更新,确保数据一致性
出库管理的事务安全性
t_medicineout表设计包含完整的审计字段和业务关联:
CREATE TABLE `t_medicineout` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`t_outNo` varchar(255) DEFAULT NULL COMMENT '出库编号',
`t_outDate` varchar(255) DEFAULT NULL COMMENT '出库时间',
`t_outNum` int(11) DEFAULT NULL COMMENT '出库数量',
`medicineManage_id` int(11) DEFAULT NULL COMMENT '药品管理ID外键',
`user_id` int(11) DEFAULT NULL COMMENT '操作用户ID外键',
PRIMARY KEY (`id`),
KEY `FKCC9877492D852AE4` (`user_id`),
KEY `FKCC9877498B398204` (`medicineManage_id`),
CONSTRAINT `FKCC9877492D852AE4` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`),
CONSTRAINT `FKCC9877498B398204` FOREIGN KEY (`medicineManage_id`) REFERENCES `t_medicinemanage` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='出库管理表'
事务安全设计:
- 双外键关联:实现药品出库与库存管理、用户权限的紧密关联
- 事务一致性:为复杂的业务事务提供了数据一致性保障
- 审计追踪:完整的操作记录支持事后审计和问题追踪
核心功能实现
顾客信息管理模块
顾客信息管理是药品销售环节的重要基础,系统提供了完整的CRUD操作功能。
控制器层设计:
@Controller
@RequestMapping(value = "Customer")
public class CustomerController {
@Autowired
private CustomerService customerService;
/**
* 初始化页面请求处理
*/
@RequestMapping(value = "/initPage.do")
public String initPage(HttpServletRequest request, Model model) {
return "Customer/saveOrUpdate";
}
/**
* 根据ID查询顾客信息
*/
@RequestMapping(value = "/selectList.do")
public String selectList(HttpServletRequest request, Customer customer, Model model) {
customer = customerService.getById(customer.getId());
model.addAttribute("util", customer);
return "Customer/saveOrUpdate";
}
}
业务逻辑层实现:
@Service
public class CustomerServiceImpl implements CustomerService {
@Autowired
private CustomerMapper customerMapper;
/**
* 根据ID查询顾客信息(只读事务)
*/
@Override
@Transactional(readOnly = true)
public Customer getById(Integer id) {
return customerMapper.selectByPrimaryKey(id);
}
/**
* 保存顾客信息(写事务)
*/
@Override
@Transactional
public int saveCustomer(Customer customer) {
customer.setAddTime(new Date());
return customerMapper.insert(customer);
}
}

分页查询与条件筛选
系统实现了高效的分页查询机制,支持多条件组合筛选,确保在大数据量下的查询性能。
分页查询控制器实现:
@RequestMapping(value = "/getAllDataInPage.do")
public String getAllDataInPage(HttpServletRequest request, Model model) {
String field = request.getParameter("field");
String fieldValue = request.getParameter("fieldValue");
// 处理中文参数编码
try {
fieldValue = new String(fieldValue.getBytes("UTF-8"), "UTF-8");
} catch (Exception e) {
// 编码异常处理
logger.error("参数编码转换异常", e);
}
String pageNo = request.getParameter("pageModel.currentPageNo");
int currentPageNo = 1;
try {
currentPageNo = Integer.parseInt(pageNo);
} catch(Exception e) {
// 页码解析异常处理
logger.warn("页码参数解析异常,使用默认页码");
}
// 分页查询逻辑实现
PageModel pageModel = new PageModel();
pageModel.setCurrentPageNo(currentPageNo);
// 执行分页查询
List<Customer> customerList = customerService.getByPage(field, fieldValue, pageModel);
model.addAttribute("customerList", customerList);
model.addAttribute("pageModel", pageModel);
return "Customer/list";
}
分页查询的技术特点:
- 编码安全:支持中文字符的正确传输和显示
- 参数验证:完善的异常处理机制确保系统稳定性
- 性能优化:数据库层面的分页查询减少内存占用
- 灵活性:支持动态字段的条件筛选
总结
该药品信息管理平台通过SSM框架的有机结合,实现了高内聚低耦合的系统架构。数据库设计充分考虑了业务需求和性能要求,核心功能模块的实现体现了企业级应用的最佳实践。平台不仅解决了传统药品管理方式的痛点,更为医疗机构的数字化转型提供了可靠的技术支撑。