这个基于Spring Boot的个人记账系统是一个面向个人用户的财务管理解决方案。作为一名长期从事Java开发的工程师,我发现很多朋友都在为个人财务管理的混乱而苦恼。市面上的记账软件要么功能过于复杂,要么存在隐私风险,于是萌生了开发一个轻量级、可自定义的个人记账系统的想法。
系统采用Spring Boot作为基础框架,结合MyBatis-Plus进行数据持久化操作,前端使用Thymeleaf模板引擎渲染页面。整个系统从需求分析到部署上线历时3个月,期间经历了多次架构调整和功能迭代,最终形成了一个稳定可用的版本。
提示:这个项目非常适合作为计算机相关专业的毕业设计选题,因为它涵盖了企业级应用开发的核心技术栈,同时业务逻辑清晰易懂,不会让评审老师觉得过于简单或复杂。
选择Spring Boot作为基础框架主要基于以下几点考虑:
数据库选用MySQL 8.0,主要考虑到:
前端选择Thymeleaf而非前后端分离架构,主要是为了:
系统采用经典的三层架构:
这种分层设计使得各层职责清晰,便于维护和扩展。例如当需要更换数据库时,只需修改数据访问层的实现,不会影响其他层。
采用Spring Security实现用户认证和授权功能。考虑到个人记账系统的特点,我们实现了以下安全特性:
java复制@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/static/**").permitAll()
.antMatchers("/register").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.defaultSuccessUrl("/dashboard")
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/login?logout")
.permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
这是系统的核心功能模块,主要包含以下特性:
数据库表设计如下:
sql复制CREATE TABLE `financial_record` (
`id` bigint NOT NULL AUTO_INCREMENT,
`user_id` bigint NOT NULL,
`type` tinyint NOT NULL COMMENT '1-收入 2-支出',
`amount` decimal(10,2) NOT NULL,
`category_id` int NOT NULL,
`remark` varchar(255) DEFAULT NULL,
`record_date` date NOT NULL,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_user_date` (`user_id`,`record_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
使用ECharts实现收支数据的可视化展示,主要包括:
前端通过Ajax请求获取后端提供的JSON数据,然后使用ECharts进行渲染:
javascript复制function loadCategoryPieChart() {
$.get('/api/statistics/category', function(data) {
var chart = echarts.init(document.getElementById('category-chart'));
var option = {
title: { text: '支出类别分布' },
tooltip: { trigger: 'item' },
series: [{
name: '支出类别',
type: 'pie',
radius: '50%',
data: data,
emphasis: { itemStyle: { shadowBlur: 10 } }
}]
};
chart.setOption(option);
});
}
系统运行需要以下环境:
推荐使用Docker进行部署,可以避免环境配置问题。我们提供了docker-compose.yml文件,一键启动所有服务:
yaml复制version: '3'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: finance
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
app:
build: .
ports:
- "8080:8080"
depends_on:
- mysql
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/finance
volumes:
mysql_data:
针对个人记账系统的特点,我们做了以下性能优化:
问题1:日期查询性能差
初期实现使用MySQL的DATE_FORMAT函数对记录日期进行格式化后比较,导致无法使用索引。优化后改为直接使用日期范围查询:
sql复制-- 优化前(性能差)
SELECT * FROM financial_record
WHERE DATE_FORMAT(record_date, '%Y-%m') = '2023-01'
-- 优化后(性能好)
SELECT * FROM financial_record
WHERE record_date BETWEEN '2023-01-01' AND '2023-01-31'
问题2:并发修改冲突
多个浏览器标签同时修改同一条记录时可能产生冲突。解决方案:
java复制@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@Version
private Integer version;
这个基础版本完成后,还可以考虑以下扩展方向:
实际开发中,我发现最大的挑战不是技术实现,而是如何设计出符合用户直觉的操作流程。经过多次用户测试和调整,最终形成了一个既功能完整又易于使用的界面设计。