温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片!
1. 项目背景与意义
随着移动互联网和移动支付的普及,大学生的消费场景日益丰富,从日常餐饮、学习用品到娱乐社交,资金流动频繁且分散。然而,多数大学生缺乏系统的财务管理意识和工具,容易出现以下问题:
- 消费无计划:零花钱到账后缺乏预算约束,月末常常入不敷出。
- 记账繁琐:手工记账难以坚持,账目混乱,无法清晰掌握资金去向。
- 缺乏分析:没有直观的消费分类统计,难以发现不合理的支出习惯。
- 家庭沟通不畅:家长难以了解子女的消费状况,零花钱发放缺乏依据。
基于Java的大学生零花钱智慧管理系统正是为解决上述痛点而设计。系统通过数字化手段帮助大学生记录收支、规划预算、分析消费结构,同时为家长提供透明的查看与发放渠道,培养大学生理性消费和科学理财的习惯,具有重要的现实意义和应用价值。
2. 系统技术栈
本系统采用经典的分层架构,前后端分离,技术选型兼顾稳定性、易用性和学习价值,具体如下:
| 层次 | 技术选型 | 说明 |
|---|---|---|
| 前端 | Vue.js + Element UI | 组件化开发,界面友好,适合管理类系统快速搭建 |
| 后端 | Spring Boot | 简化配置,内嵌Tomcat,快速构建RESTful API |
| 持久层 | MyBatis-Plus | 简化CRUD操作,内置分页插件,减少样板代码 |
| 数据库 | MySQL 8.0 | 关系型数据库,存储用户、账单、预算等核心数据 |
| 权限认证 | Spring Security + JWT | 无状态认证,支持角色权限控制(学生/家长/管理员) |
| 构建工具 | Maven | 依赖管理与项目构建 |
| 开发环境 | JDK 1.8 + IntelliJ IDEA | 稳定成熟的开发组合 |
3. 系统核心功能模块
系统围绕零花钱管理全流程设计,主要包含以下功能模块:
- 用户管理:学生、家长、管理员三类角色的注册、登录与信息维护。
- 收支记账:记录日常收入与支出,支持分类(餐饮、学习、娱乐、交通等)与备注。
- 预算管理:学生可设定月度预算,系统实时统计已用额度并给出超支预警。
- 零花钱发放:家长可定期向学生账户发放零花钱,并查看发放记录。
- 消费分析:按分类、时间维度生成统计图表,直观展示消费结构。
- 消息提醒:超支预警、预算不足、零花钱到账等通知推送。
4. 数据库设计
系统核心数据表包括用户表、账单表、预算表和零花钱发放记录表。以下为关键表结构设计:
-- 用户表 CREATE TABLE `user` ( `id` BIGINT PRIMARY KEY AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL UNIQUE, `password` VARCHAR(100) NOT NULL, `real_name` VARCHAR(50), `role` TINYINT NOT NULL COMMENT '1-学生 2-家长 3-管理员', `parent_id` BIGINT COMMENT '学生关联的家长ID', `balance` DECIMAL(10,2) DEFAULT 0.00 COMMENT '零花钱余额', `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 账单表 CREATE TABLE bill ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, type TINYINT NOT NULL COMMENT '1-收入 2-支出', category VARCHAR(20) COMMENT '消费分类', amount DECIMAL(10,2) NOT NULL, remark VARCHAR(200), bill_time DATETIME NOT NULL, create_time DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 预算表 CREATE TABLE budget ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, month VARCHAR(7) NOT NULL COMMENT '月份,如2026-09', total_budget DECIMAL(10,2) NOT NULL, used_amount DECIMAL(10,2) DEFAULT 0.00, UNIQUE KEY uk_user_month (user_id, month) ); -- 零花钱发放记录表 CREATE TABLE allowance_record ( id BIGINT PRIMARY KEY AUTO_INCREMENT, parent_id BIGINT NOT NULL, student_id BIGINT NOT NULL, amount DECIMAL(10,2) NOT NULL, remark VARCHAR(200), create_time DATETIME DEFAULT CURRENT_TIMESTAMP );5. 核心代码实现
以下选取系统中最具代表性的几个核心功能进行代码展示。
5.1 实体类设计
以账单实体为例,使用MyBatis-Plus注解简化映射:
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; @Data @TableName("bill") public class Bill { @TableId(type = IdType.AUTO) private Long id; private Long userId; private Integer type; // 1-收入 2-支出 private String category; // 消费分类 private BigDecimal amount; // 金额 private String remark; // 备注 private LocalDateTime billTime; private LocalDateTime createTime; }5.2 记账服务实现
记账是系统的核心操作,需要同时更新账单记录和用户余额,并校验预算情况,因此使用事务保证数据一致性:
import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; @Service public class BillService { @Resource private BillMapper billMapper; @Resource private UserMapper userMapper; @Resource private BudgetService budgetService; /** 新增账单并更新余额 */ @Transactional(rollbackFor = Exception.class) public void addBill(Bill bill) { // 1. 插入账单记录 billMapper.insert(bill); // 2. 更新用户余额 User user = userMapper.selectById(bill.getUserId()); BigDecimal newBalance; if (bill.getType() == 1) { // 收入:余额增加 newBalance = user.getBalance().add(bill.getAmount()); } else { // 支出:余额减少 newBalance = user.getBalance().subtract(bill.getAmount()); } user.setBalance(newBalance); userMapper.updateById(user); // 3. 若为支出,同步更新当月预算已用额度 if (bill.getType() == 2) { budgetService.updateUsedAmount(bill.getUserId(), bill.getAmount()); } } }5.3 预算超支预警
系统在每次支出后检查预算使用情况,当使用比例超过阈值时返回预警信息:
import java.time.LocalDate; import java.time.format.DateTimeFormatter; public class BudgetService { @Resource private BudgetMapper budgetMapper; private static final BigDecimal WARN_RATIO = new BigDecimal("0.8"); /** 更新当月已用额度,并返回是否触发预警 */ public boolean updateUsedAmount(Long userId, BigDecimal amount) { String month = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM")); Budget budget = budgetMapper.selectByUserAndMonth(userId, month); if (budget == null) { return false; } // 累加已用金额 BigDecimal used = budget.getUsedAmount().add(amount); budget.setUsedAmount(used); budgetMapper.updateById(budget); // 判断是否超过预警阈值(80%) return used.compareTo(budget.getTotalBudget().multiply(WARN_RATIO)) >= 0; } }5.4 零花钱发放接口
家长向学生发放零花钱时,需要同时增加学生余额并记录发放流水:
import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/allowance") public class AllowanceController { @Resource private AllowanceService allowanceService; /** 家长发放零花钱 */ @PostMapping("/grant") public Result grant(@RequestBody AllowanceRecord record) { allowanceService.grantAllowance(record); return Result.success("零花钱发放成功"); } }@Service public class AllowanceService { @Resource private AllowanceRecordMapper recordMapper; @Resource private UserMapper userMapper; @Transactional(rollbackFor = Exception.class) public void grantAllowance(AllowanceRecord record) { // 1. 保存发放记录 recordMapper.insert(record); // 2. 增加学生余额 User student = userMapper.selectById(record.getStudentId()); student.setBalance(student.getBalance().add(record.getAmount())); userMapper.updateById(student); } }6. 系统架构与运行流程
系统采用前后端分离架构,前端通过Axios调用后端RESTful接口,后端经Controller、Service、Mapper三层处理请求,数据统一存储在MySQL中。整体请求流程如下:
flowchart TD A[前端Vue页面] -->|Axios请求| B[Spring Boot Controller] B --> C[Service业务层] C --> D[MyBatis-Plus Mapper] D --> E[(MySQL数据库)] E --> D D --> C C --> B B -->|JSON响应| A7. 总结与展望
基于Java的大学生零花钱智慧管理系统,通过Spring Boot + Vue.js + MySQL的技术组合,实现了记账、预算、发放、分析等核心功能,帮助大学生建立科学的消费观念,也为家长提供了便捷的零花钱管理渠道。系统架构清晰、代码规范,具备良好的扩展性。
未来可以从以下方向继续优化:引入机器学习算法实现智能消费推荐;增加多账户、多币种支持;对接主流支付平台实现自动记账;开发移动端App,进一步提升使用便捷性。