1. 项目背景与核心功能
校园卡管理系统是高校信息化建设的基础设施之一,它直接关系到师生的日常学习和生活。传统的校园卡管理往往存在以下几个痛点:
- 人工操作效率低下:充值、挂失等业务需要窗口排队办理
- 消费记录不透明:学生难以及时查询消费明细
- 安全隐患:卡片丢失后无法快速冻结账户
- 数据孤岛:与教务、门禁等系统缺乏联动
基于SSM(Spring+SpringMVC+MyBatis)框架开发的校园卡管理系统,通过以下核心功能模块解决上述问题:
- 账户管理:学生信息录入、修改、注销
- 电子钱包:在线充值、余额查询、消费记录
- 安全中心:卡片挂失、解挂、密码修改
- 数据统计:消费报表、充值记录分析
提示:系统采用B/S架构,前端使用Bootstrap+jQuery实现响应式布局,后端基于Java 8开发,数据库选用MySQL 5.7,这些技术选型确保了系统的稳定性和扩展性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构解析
2.1 SSM框架整合方案
本系统采用经典的三层架构设计:
code复制表现层(SpringMVC) ←→ 业务层(Spring) ←→ 持久层(MyBatis)
Spring配置要点:
xml复制<!-- 开启注解驱动 -->
<context:annotation-config/>
<!-- 组件扫描路径 -->
<context:component-scan base-package="com.campuscard"/>
<!-- 事务管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
MyBatis关键配置:
java复制@MapperScan("com.campuscard.mapper")
public class MyBatisConfig {
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setTypeAliasesPackage("com.campuscard.entity");
return sessionFactory.getObject();
}
}
2.2 数据库设计规范
主要表结构设计遵循第三范式(3NF):
| 表名 | 主键 | 关键字段 | 索引 |
|---|---|---|---|
| student_info | student_id | name, class, department | student_id(唯一) |
| card_account | card_id | student_id, balance | student_id(外键) |
| transaction_log | log_id | card_id, amount, type | card_id, create_time |
注意:金额字段使用DECIMAL(10,2)类型,避免浮点数精度问题。交易记录表采用水平分表策略,按月拆分提升查询性能。
3. 核心业务实现
3.1 充值业务流程
java复制@Transactional
public Result recharge(String cardId, BigDecimal amount) {
// 1. 验证卡片状态
Card card = cardMapper.selectById(cardId);
if(card == null || card.getStatus() == CardStatus.LOST) {
return Result.error("卡片无效或已挂失");
}
// 2. 更新余额
card.setBalance(card.getBalance().add(amount));
cardMapper.updateById(card);
// 3. 记录交易
TransactionLog log = new TransactionLog();
log.setCardId(cardId);
log.setAmount(amount);
log.setType(TransactionType.RECHARGE);
logMapper.insert(log);
// 4. 发送短信通知
smsService.sendRechargeSuccess(card.getStudentId(), amount);
return Result.success(card.getBalance());
}
并发控制方案:
- 数据库层面:对card表使用乐观锁(version字段)
- 应用层面:对充值操作加分布式锁(Redis实现)
3.2 消费防重设计
消费场景需要特别注意重复扣款问题,系统采用"预扣款+确认"机制:
- 前端生成唯一订单号(UUID)
- 服务端校验订单号是否已处理(Redis缓存)
- 执行扣款操作
- 记录交易日志(包含订单号)
java复制public Result consume(String cardId, BigDecimal amount, String orderNo) {
// Redis校验订单号
String key = "order:" + orderNo;
if(redisTemplate.opsForValue().setIfAbsent(key, "1", 5, TimeUnit.MINUTES)) {
return processPayment(cardId, amount, orderNo);
}
return Result.error("重复交易请求");
}
4. 安全防护措施
4.1 密码安全策略
- 存储:使用BCryptPasswordEncoder加密
java复制@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
- 传输:HTTPS+前端RSA加密
- 验证:错误次数限制(5次锁定30分钟)
4.2 日志审计系统
关键操作记录详细日志:
java复制@Aspect
@Component
public class OperationLogAspect {
@AfterReturning(pointcut = "@annotation(operLog)", returning = "result")
public void afterReturning(JoinPoint joinPoint, OperationLog operLog, Object result) {
SysLog sysLog = new SysLog();
sysLog.setOperation(operLog.value());
sysLog.setParams(JsonUtils.toJson(joinPoint.getArgs()));
sysLog.setResult(JsonUtils.toJson(result));
logMapper.insert(sysLog);
}
}
审计日志包含:操作人、时间、IP、参数、返回结果等字段,保留180天。
5. 系统部署方案
5.1 环境要求
| 组件 | 版本 | 配置要求 |
|---|---|---|
| JDK | 1.8+ | 建议OpenJDK 11 |
| Tomcat | 9.0+ | 线程池调整至200+ |
| MySQL | 5.7+ | 内存≥4GB,innodb_buffer_pool_size=2G |
| Redis | 5.0+ | 持久化开启,内存≥2GB |
5.2 高可用设计
- 负载均衡:Nginx轮询多台Tomcat实例
- 数据库:主从复制+读写分离
- 缓存:Redis哨兵模式
- 会话保持:Spring Session + Redis
部署架构示例:
code复制客户端 → Nginx → [Tomcat1, Tomcat2] → MySQL主库
↓ ↗
Redis ←→ MySQL从库
6. 开发注意事项
- 事务边界:涉及金额操作必须添加@Transactional注解
- 异常处理:自定义BusinessException区分系统异常和业务异常
- 参数校验:使用Hibernate Validator进行表单验证
- 性能优化:
- 高频查询添加缓存(@Cacheable)
- 批量操作使用MyBatis的batch模式
- 报表查询使用定时任务预计算
典型问题排查:
java复制// 错误示例:N+1查询问题
List<Student> students = studentMapper.selectAll();
for(Student s : students) {
Card card = cardMapper.selectByStudentId(s.getId()); // 循环查询
}
// 正确做法:关联查询
<select id="selectStudentsWithCard" resultMap="studentCardMap">
SELECT s.*, c.* FROM student_info s
LEFT JOIN card_account c ON s.student_id = c.student_id
</select>
7. 扩展功能建议
- 移动端对接:开发微信小程序/APP端
- 扫码充值
- 消费推送通知
- 数据分析:
- 消费热点时段分析
- 异常消费行为预警
- 多系统集成:
- 对接门禁系统
- 图书馆借阅联动
- 无卡化升级:
- 人脸识别支付
- 虚拟校园卡(二维码)
实际开发中,我们发现在高峰期(如开学充值季)系统面临的主要挑战是数据库IO瓶颈。通过以下优化显著提升了性能:
- 将交易记录表改为按月分表
- 对余额查询接口添加Redis缓存(5秒过期)
- 充值操作采用异步队列处理
- 数据库连接池调整为HikariCP,配置如下:
properties复制spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
