Java项目实训药店管理系统怎么做?从需求分析到部署的全流程指南
在当今信息化快速发展的时代,医药行业的数字化转型已成为必然趋势。作为Java开发学习者或高校学生,在进行项目实训时,选择一个贴近实际业务场景的系统进行开发,不仅能提升编程能力,还能积累真实项目经验。本文将以药店管理系统为案例,详细讲解如何通过Java技术栈(如Spring Boot、MyBatis、MySQL等)完成一个完整的项目实训流程,涵盖需求分析、数据库设计、模块划分、代码实现、测试验证以及最终部署上线。
一、为什么选择药店管理系统作为Java项目实训课题?
药店管理系统是一个典型的中小型企业管理信息系统,具有以下特点:
- 功能清晰明确:包括药品入库、销售、库存管理、用户权限控制等功能,便于分模块开发和调试。
- 数据结构简单但实用:涉及药品信息、订单记录、员工账号等核心数据表,适合初学者理解ORM映射与SQL语句优化。
- 贴近生活且易扩展:可以结合移动端接口、报表统计、扫码录入等功能拓展为完整的企业级应用。
- 符合课程教学目标:能全面覆盖Java Web开发的核心技能点,如前后端分离、RESTful API设计、异常处理机制等。
因此,药店管理系统不仅是Java项目实训的理想选题,也是未来从事医疗信息化、电商后台系统开发的良好起点。
二、项目需求分析与功能规划
在开始编码前,必须明确系统的业务逻辑和用户角色,这是决定后续架构设计的关键一步。
1. 用户角色定义
- 管理员(Admin):负责药品管理、员工账号分配、库存预警设置、数据备份等高级操作。
- 店员(Staff):主要完成日常药品销售、顾客信息登记、退货处理等前台工作。
- 普通用户(Customer):仅限于查看药品信息和下单购买(若接入前端页面)。
2. 核心功能模块划分
根据角色权限,我们将系统划分为以下几个核心模块:
- 药品管理模块:新增、编辑、删除、查询药品信息;支持按名称、类别、生产厂商筛选。
- 库存管理模块:实时更新库存数量,设置最低库存阈值并触发报警通知。
- 销售管理模块:记录每笔销售订单,自动计算总价、找零金额,生成销售日报表。
- 员工管理模块:注册、登录、权限分配、密码修改等基础功能。
- 日志审计模块:记录关键操作日志(如药品增删改),用于追踪问题来源。
三、数据库设计与建模
良好的数据库设计是系统稳定运行的基础。我们使用MySQL作为关系型数据库,并采用ER图方式梳理实体关系。
1. 主要数据表结构
CREATE TABLE drug (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
category VARCHAR(50),
manufacturer VARCHAR(100),
price DECIMAL(10,2),
stock_quantity INT DEFAULT 0,
min_stock_threshold INT DEFAULT 10,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE employee (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
role ENUM('admin','staff') DEFAULT 'staff',
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE sale_record (
id INT PRIMARY KEY AUTO_INCREMENT,
drug_id INT,
quantity INT NOT NULL,
total_price DECIMAL(10,2),
seller_id INT,
sale_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (drug_id) REFERENCES drug(id),
FOREIGN KEY (seller_id) REFERENCES employee(id)
);
2. 设计要点说明
- 采用外键约束确保数据一致性,防止非法插入。
- 为常用字段添加索引(如药品名称、销售时间),提升查询效率。
- 预留字段如create_time、update_time,方便日后做审计跟踪。
四、后端开发框架选型与技术栈搭建
为了高效开发和维护,建议采用当前主流的Java后端框架组合:
- Spring Boot 2.x / 3.x:简化配置、自动装配、内嵌Tomcat服务器,极大提高开发效率。
- MyBatis / MyBatis-Plus:轻量级ORM框架,灵活编写SQL语句,适合复杂查询场景。
- MySQL 8.0+:高性能关系型数据库,支持JSON类型和窗口函数。
- JWT + Spring Security:实现无状态认证机制,保障接口安全。
- Logback + Lombok:日志输出标准化、减少样板代码。
项目结构示例
src/main/java/com/pharmacy/ ├── config/ # 配置类(数据库连接、拦截器、跨域等) ├── controller/ # RESTful接口控制器 ├── service/ # 业务逻辑层(含Service接口与Impl实现) ├── mapper/ # 数据访问层(MyBatis XML或注解方式) ├── model/ # 实体类(POJO) ├── dto/ # 数据传输对象(DTO) ├── exception/ # 自定义异常处理类 └── util/ # 工具类(日期格式化、加密、工具方法)
五、核心功能实现细节
1. 登录认证模块实现
使用JWT(JSON Web Token)进行身份验证,避免Session共享问题:
@PostMapping("/login")
public ResponseEntity<Map<String, Object>> login(@RequestBody LoginRequest request) {
Employee emp = employeeService.findByUsername(request.getUsername());
if (emp == null || !passwordEncoder.matches(request.getPassword(), emp.getPassword())) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(Map.of("msg", "用户名或密码错误"));
}
String token = JwtUtil.generateToken(emp.getId(), emp.getRole());
Map<String, Object> response = new HashMap<>();
response.put("token", token);
response.put("role", emp.getRole());
return ResponseEntity.ok(response);
}
2. 药品库存预警功能
通过定时任务检测低库存药品,并发送邮件或短信提醒管理员:
@Component
public class StockWarningTask {
@Autowired
private DrugMapper drugMapper;
@Scheduled(cron = "0 0 9 * * ?") // 每天上午9点执行
public void checkStock() {
List<Drug> lowStockDrugs = drugMapper.selectLowStockDrugs();
if (!lowStockDrugs.isEmpty()) {
// 发送预警通知(此处省略具体实现)
System.out.println("发现低库存药品:" + lowStockDrugs.stream().map(Drug::getName).collect(Collectors.toList()));
}
}
}
3. 销售模块的事务控制
确保一笔销售操作要么全部成功,要么回滚,防止数据不一致:
@Service
@Transactional
public class SaleServiceImpl implements SaleService {
@Autowired
private DrugMapper drugMapper;
@Autowired
private SaleRecordMapper saleRecordMapper;
@Override
public boolean sellDrug(Long drugId, int quantity, Long sellerId) {
Drug drug = drugMapper.selectById(drugId);
if (drug.getStockQuantity() < quantity) {
throw new RuntimeException("库存不足");
}
drug.setStockQuantity(drug.getStockQuantity() - quantity);
drugMapper.updateById(drug);
SaleRecord record = new SaleRecord();
record.setDrugId(drugId);
record.setQuantity(quantity);
record.setTotalPrice(drug.getPrice() * quantity);
record.setSellerId(sellerId);
saleRecordMapper.insert(record);
return true;
}
}
六、前端交互设计与测试策略
虽然本项目以Java后端为主,但可配合Vue.js或React构建简单的Web界面,增强用户体验。推荐使用Postman进行API测试,确保每个接口返回正确响应码和数据结构。
1. 常见接口示例
GET /api/drugs:获取所有药品列表(分页)POST /api/sales:提交销售记录(需携带JWT令牌)PUT /api/drugs/{id}:更新药品信息DELETE /api/drugs/{id}:删除药品(需管理员权限)
2. 单元测试与集成测试
使用JUnit 5编写单元测试,例如:
@Test
void testSellDrug_Success() {
// 准备测试数据
Drug drug = new Drug();
drug.setId(1L);
drug.setStockQuantity(5);
drug.setPrice(BigDecimal.valueOf(10));
drugMapper.insert(drug);
// 执行销售操作
saleService.sellDrug(1L, 2, 1L);
// 断言库存变化
Drug updated = drugMapper.selectById(1L);
assertEquals(3, updated.getStockQuantity());
}
七、部署上线与运维建议
完成开发后,可通过Docker容器化部署,简化环境依赖,提高迁移效率:
# Dockerfile 示例 FROM openjdk:11-jre-slim COPY target/pharmacy-system.jar app.jar EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"]
同时建议配置Nginx反向代理、日志集中收集(ELK)、监控指标(Prometheus+Grafana)等基础设施,便于后期运维和性能调优。
八、总结与进阶方向
通过本次Java项目实训,学生不仅掌握了Spring Boot + MyBatis的基本开发流程,还深入理解了企业级项目的分层架构、权限控制、事务管理等关键技术点。对于希望进一步提升的同学,可以尝试以下进阶方向:
- 引入Redis缓存热门药品数据,降低数据库压力。
- 集成微信小程序或支付宝服务窗,打造移动购药入口。
- 加入AI智能推荐算法,根据历史销量预测补货计划。
- 开发可视化仪表盘(ECharts + Vue),展示销售趋势和库存状态。
总之,药店管理系统是一个既实用又富有挑战性的Java项目实训案例,值得每一位开发者认真投入实践。

