一个面向影视工作室的 Java 控制台租赁系统。项目以真实租赁流程为主线,覆盖器材库存、客户信用、租赁订单、归还计费、维修记录和经营统计,并通过 Controller / Service / DAO 分层与 JDBC 事务保证核心业务一致性。
项目来源于课程作业,后续按可复现、可测试、可讲解的求职项目标准完成了工程化整理。
- 完整业务闭环:器材入库与检索、客户管理、租赁下单、归还、逾期费用、信用积分、维修与统计。
- 事务一致性:订单、明细、库存和信用变更由 Service 统一编排,失败时整体回滚。
- 并发库存保护:库存扣减使用带上下界条件的原子 SQL,并检查受影响行数,避免超租和负库存。
- 分段租金计算:按
[开始日期, 归还日期)逐日计费,支持普通日、周末上浮与特殊日期费率,统一使用BigDecimal。 - 权限与密码安全:普通用户只能操作本人订单;密码采用随机盐 PBKDF2-HMAC-SHA256 哈希,兼容旧账号首次登录迁移。
- 可验证质量:JUnit 5 覆盖日期边界、租金规则和密码哈希;数据库脚本包含外键、检查约束和常用查询索引。
Controller 控制台菜单、输入输出、角色路由
↓
Service 业务校验、租金与信用规则、事务编排
↓
DAO JDBC、PreparedStatement、数据映射
↓
MySQL 9 张业务表、外键、约束与索引
数据库实体关系如下:
- 校验客户、器材、数量和租赁日期。
- 拦截信用积分低于 60 的客户和不可租器材。
- 读取租赁区间内的特殊费率,逐日计算订单金额。
- 原子扣减可租库存,写入订单与订单明细。
- 任一步骤失败则回滚整个事务。
系统校验订单状态与客户归属,计算逾期费用,恢复库存,并根据是否逾期、是否损坏调整信用积分和记录变更日志。
| 类别 | 技术 |
|---|---|
| 语言与构建 | Java 11、Maven |
| 数据库 | MySQL 8.0、InnoDB、utf8mb4 |
| 数据访问 | JDBC、PreparedStatement |
| 日志 | SLF4J、Logback |
| 测试 | JUnit 5、Maven Surefire |
| 安全 | PBKDF2-HMAC-SHA256、随机盐、订单归属校验 |
video_rent/
├─ src/main/java/com/dong/rental/
│ ├─ controller/ # 管理员与普通用户菜单
│ ├─ service/ # 业务接口与事务实现
│ ├─ dao/ # JDBC 数据访问
│ ├─ entity/ # 领域实体
│ ├─ constant/ # 状态与信用等级枚举
│ ├─ exception/ # 业务异常
│ └─ util/ # 数据库、日期、计价、密码等工具
├─ src/main/resources/
│ ├─ sql/init.sql # 表结构、约束、索引和演示数据
│ └─ db.properties.example
├─ src/test/java/ # JUnit 与手工业务场景
├─ drawio/ # 架构、ER 与流程图源文件
└─ md/DESIGN.md # 完整设计文档
- JDK 11 或更高版本
- Maven 3.8+
- MySQL 8.0+
先创建并选择数据库,再执行初始化脚本:
CREATE DATABASE IF NOT EXISTS video_rent
DEFAULT CHARACTER SET utf8mb4;
USE video_rent;
SOURCE src/main/resources/sql/init.sql;复制示例配置:
Copy-Item src/main/resources/db.properties.example src/main/resources/db.properties然后在本地 db.properties 中填写数据库账号和密码。该文件已加入 .gitignore,不会提交真实凭据。
mvn clean test
mvn exec:java -Dexec.mainClass="com.dong.rental.App"也可以直接在 IDE 中运行 com.dong.rental.App。
演示账号的初始密码均为 123456:
| 角色 | 用户名 |
|---|---|
| 管理员 | admin |
| 普通用户 | zhangwei、lina、wangqiang 等 |
mvn test自动化测试重点覆盖:
- 周末日期边界及非法日期区间;
- 周末上浮、特殊费率优先级与数量计价;
- 密码随机盐、正确匹配和错误密码拒绝。
src/test/java/com/dong/rental/service 中还保留了可连接演示数据库运行的完整业务场景。
更完整的数据表设计、事务边界、业务规则和演进建议见 系统设计文档。
- 把剩余数据库场景迁移为可隔离运行的集成测试;
- 引入连接池和构造器依赖注入;
- 完善订单付款、取消、逾期扫描等状态迁移;
- 在现有 Service/DAO 基础上增加 Web API 或前端界面。



