基于SSH框架的个人财务管理系统 - 源码深度解析

JavaJavaScriptSSH框架HTMLCSSMySQLJSP+Servlet
2026-03-273 浏览

文章摘要

本系统是基于SSH(Struts2 + Spring + Hibernate)框架构建的个人财务管理系统,旨在帮助个人用户高效、系统地管理日常收支流水与资产状况。其核心业务价值在于解决传统手工记账或零散电子记录带来的数据混乱、统计困难、难以追溯等痛点。系统通过标准化的数据录入与自动化的分类汇总,将碎...

在个人财务管理领域,传统的手工记账或零散的电子记录方式往往导致数据混乱、统计困难、难以追溯等痛点。为解决这些问题,基于SSH(Struts2 + Spring + Hibernate)框架构建的"智账通"个人财务管理系统应运而生。该系统通过标准化的数据录入与自动化的分类汇总,将碎片化的财务信息转化为结构化的资产视图,帮助用户清晰掌握资金流向,实现个人资产的精细化管控。

系统采用经典的三层架构设计,表现层使用Struts2框架处理用户请求与页面跳转,业务层由Spring框架的IoC容器统一管理Service组件,数据持久层则依托Hibernate实现对象关系映射。这种分层架构确保了代码的清晰性和可维护性,各层之间通过接口解耦,便于后续功能扩展与单元测试。

数据库设计深度解析

系统的数据库设计体现了高度的规范性和完整性,共包含4个核心数据表。用户表(t_user)作为系统的基础,采用自增主键设计,确保用户标识的唯一性:

CREATE TABLE t_user (
  userId int(11) NOT NULL AUTO_INCREMENT,
  userName varchar(20) DEFAULT NULL,
  userPw varchar(20) DEFAULT NULL,
  userType int(11) DEFAULT NULL,
  userRealname varchar(20) DEFAULT NULL,
  userAddress varchar(20) DEFAULT NULL,
  userSex varchar(20) DEFAULT NULL,
  userTel varchar(20) DEFAULT NULL,
  userEmail varchar(20) DEFAULT NULL,
  userQq varchar(20) DEFAULT NULL,
  PRIMARY KEY (userId)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

收支记录表(t_jizhang)是系统的核心业务表,通过外键与用户表关联,记录详细的财务流水信息:

CREATE TABLE t_jizhang (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(20) DEFAULT NULL,
  leixing varchar(20) DEFAULT NULL,
  shijian varchar(20) DEFAULT NULL,
  jine varchar(20) DEFAULT NULL,
  beizhu varchar(20) DEFAULT NULL,
  userId int(11) DEFAULT NULL,
  PRIMARY KEY (id),
  KEY userId (userId),
  CONSTRAINT t_jizhang_ibfk_1 FOREIGN KEY (userId) REFERENCES t_user (userId)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

这种设计支持完整的CRUD操作,并通过外键约束确保数据的一致性。leixing字段区分收入与支出类型,shijian字段记录交易时间,为后续的时间段查询和统计分析提供数据基础。

核心功能实现与技术细节

用户身份验证模块采用Struts2的Action类处理登录请求,通过Spring依赖注入业务逻辑组件:

public class UserLoginAction extends ActionSupport {
    private User user;
    private UserService userService;
    
    public String execute() {
        try {
            User loginUser = userService.userLogin(user.getUserName(), user.getUserPw());
            if (loginUser != null) {
                Map session = ActionContext.getContext().getSession();
                session.put("user", loginUser);
                return SUCCESS;
            } else {
                this.addActionError("用户名或密码错误!");
                return INPUT;
            }
        } catch (Exception e) {
            this.addActionError("登录异常:" + e.getMessage());
            return ERROR;
        }
    }
    
    // Getter和Setter方法
    public User getUser() { return user; }
    public void setUser(User user) { this.user = user; }
    public void setUserService(UserService userService) { 
        this.userService = userService; 
    }
}

记账管理功能通过Hibernate实现数据持久化,支持复杂的查询操作。以下是记账记录的查询实现:

public class JizhangDAO extends HibernateDaoSupport {
    public List findByUserId(Integer userId) {
        try {
            String queryString = "from Jizhang as model where model.userId = ?";
            return getHibernateTemplate().find(queryString, userId);
        } catch (RuntimeException re) {
            throw re;
        }
    }
    
    public List findByProperty(String propertyName, Object value) {
        try {
            String queryString = "from Jizhang as model where model." 
                + propertyName + "= ?";
            return getHibernateTemplate().find(queryString, value);
        } catch (RuntimeException re) {
            throw re;
        }
    }
}

记账管理界面

收支统计分析模块提供多维度数据视图,支持按月、按年统计收入支出情况。系统通过HQL实现复杂的数据聚合查询:

public class TongjiService {
    public Map<String, Double> getMonthIncomeExpense(Integer userId, String yearMonth) {
        String hqlIncome = "select sum(jine) from Jizhang where userId = ? 
            and leixing = '收入' and shijian like ?";
        String hqlExpense = "select sum(jine) from Jizhang where userId = ? 
            and leixing = '支出' and shijian like ?";
        
        Double income = (Double) getHibernateTemplate()
            .find(hqlIncome, userId, yearMonth + "%").get(0);
        Double expense = (Double) getHibernateTemplate()
            .find(hqlExpense, userId, yearMonth + "%").get(0);
        
        Map<String, Double> result = new HashMap<>();
        result.put("income", income != null ? income : 0.0);
        result.put("expense", expense != null ? expense : 0.0);
        return result;
    }
}

月度收支查询

实体模型与业务逻辑

系统的实体模型严格遵循JavaBean规范,通过Hibernate注解实现对象关系映射:

@Entity
@Table(name = "t_jizhang")
public class Jizhang implements java.io.Serializable {
    private Integer id;
    private String name;
    private String leixing;
    private String shijian;
    private String jine;
    private String beizhu;
    private Integer userId;
    
    public Jizhang() {}
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public Integer getId() { return this.id; }
    public void setId(Integer id) { this.id = id; }
    
    @Column(name = "name", length = 20)
    public String getName() { return this.name; }
    public void setName(String name) { this.name = name; }
    
    // 其他属性的getter和setter方法
}

Spring的配置管理通过applicationContext.xml实现依赖注入和事务管理:

<bean id="userService" class="com.finance.service.impl.UserServiceImpl">
    <property name="userDAO" ref="userDAO"/>
</bean>

<bean id="jizhangService" class="com.finance.service.impl.JizhangServiceImpl">
    <property name="jizhangDAO" ref="jizhangDAO"/>
</bean>

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED"/>
        <tx:method name="update*" propagation="REQUIRED"/>
        <tx:method name="delete*" propagation="REQUIRED"/>
        <tx:method name="*" read-only="true"/>
    </tx:attributes>
</tx:advice>

功能展望与优化方向

系统在现有功能基础上,可以考虑以下优化方向:

  1. 移动端适配:开发响应式前端界面或独立的移动应用,通过RESTful API与后端交互,使用Spring MVC重构控制器层,为移动端提供JSON格式的数据接口。

  2. 数据可视化增强:集成ECharts或D3.js等可视化库,提供更丰富的图表类型,如消费趋势图、类别占比饼图、地理分布图等,帮助用户更直观理解财务数据。

  3. 智能分析预警:引入机器学习算法,基于历史消费数据构建预测模型,实现异常消费检测、预算超支预警、消费习惯分析等智能功能。

  4. 多维度标签体系:扩展现有的分类系统,支持用户自定义标签,实现更精细化的财务分类管理,通过多对多关系表记录记账条目与标签的关联。

  5. 数据导入导出:增加Excel、CSV格式的数据导入导出功能,支持与银行流水、第三方支付平台的数据对接,减少手动录入工作量。

年度收支统计

用户管理与权限控制

系统采用基于角色的访问控制模型,区分普通用户和管理员权限。用户管理功能实现如下:

public class UserServiceImpl implements UserService {
    private UserDAO userDAO;
    
    public List<User> findAllUsers() {
        return userDAO.findAll();
    }
    
    public void saveUser(User user) {
        userDAO.save(user);
    }
    
    public void deleteUser(Integer userId) {
        User user = userDAO.findById(userId);
        if (user != null) {
            userDAO.delete(user);
        }
    }
    
    public User findUserById(Integer userId) {
        return userDAO.findById(userId);
    }
}

用户管理界面

系统的前端界面采用JSP技术结合CSS样式实现,确保界面的美观性和易用性。个人信息管理模块允许用户维护基本资料:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<div class="user-info-form">
    <form action="updateUserInfo.action" method="post">
        <div class="form-group">
            <label>真实姓名:</label>
            <input type="text" name="user.userRealname" value="${user.userRealname}">
        </div>
        <div class="form-group">
            <label>联系电话:</label>
            <input type="text" name="user.userTel" value="${user.userTel}">
        </div>
        <div class="form-group">
            <label>电子邮箱:</label>
            <input type="email" name="user.userEmail" value="${user.userEmail}">
        </div>
        <button type="submit" class="btn btn-primary">保存修改</button>
    </form>
</div>

个人信息管理

系统通过Struts2的拦截器实现安全控制,确保用户必须登录后才能访问受保护的资源:

<package name="secure" namespace="/secure" extends="struts-default">
    <interceptors>
        <interceptor name="authentication" 
            class="com.finance.interceptor.AuthenticationInterceptor"/>
        <interceptor-stack name="secureStack">
            <interceptor-ref name="authentication"/>
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>
    </interceptors>
    
    <default-interceptor-ref name="secureStack"/>
    
    <action name="userInfo" class="userAction" method="showUserInfo">
        <result>/secure/userInfo.jsp</result>
    </action>
</package>

系统的异常处理机制通过统一的异常处理器实现,确保系统的稳定性和用户体验:

public class GlobalExceptionHandler implements ExceptionHandler {
    public void execute(Exception exception, ActionInvocation invocation) {
        String errorMessage = "系统发生异常:" + exception.getMessage();
        HttpServletRequest request = ServletActionContext.getRequest();
        request.setAttribute("errorMessage", errorMessage);
        
        try {
            invocation.getResult().execute(invocation);
        } catch (Exception e) {
            // 记录日志
            Logger.error("异常处理失败", e);
        }
    }
}

在数据持久化层面,系统利用Hibernate的缓存机制提升查询性能:

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">
    org.hibernate.cache.ehcache.EhCacheRegionFactory
</property>
<property name="hibernate.cache.use_query_cache">true</property>

系统还实现了数据备份与恢复功能,通过Spring的定时任务定期执行数据库备份:

@Component
public class DatabaseBackupTask {
    @Scheduled(cron = "0 0 2 * * ?") // 每天凌晨2点执行
    public void backupDatabase() {
        try {
            String backupPath = "/backup/finance_" 
                + new SimpleDateFormat("yyyyMMdd").format(new Date()) + ".sql";
            String command = "mysqldump -u root -p password finance > " + backupPath;
            Runtime.getRuntime().exec(command);
        } catch (IOException e) {
            Logger.error("数据库备份失败", e);
        }
    }
}

系统的架构设计充分考虑了可扩展性和可维护性。通过接口抽象和依赖注入,各个模块之间的耦合度降到最低。业务逻辑层通过服务接口定义契约,数据访问层通过DAO模式封装持久化操作,这种设计使得系统能够轻松应对需求变化和技术演进。

在性能优化方面,系统采用了数据库连接池技术,通过配置C3P0连接池提高数据库访问效率:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver"/>
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/finance"/>
    <property name="user" value="root"/>
    <property name="password" value="password"/>
    <property name="maxPoolSize" value="20"/>
    <property name="minPoolSize" value="5"/>
    <property name="initialPoolSize" value="10"/>
    <property name="maxIdleTime" value="300"/>
</bean>

系统的安全机制还包括密码加密存储,使用MD5算法对用户密码进行加密处理:

public class SecurityUtil {
    public static String encryptPassword(String password) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(password.getBytes());
            return new BigInteger(1, digest).toString(16);
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("密码加密失败", e);
        }
    }
}

在用户体验方面,系统提供了丰富的交互反馈机制。通过Struts2的标签库和AJAX技术,实现无刷新数据更新和实时验证:

<%@ taglib prefix="s" uri="/struts-tags" %>
<script>
function checkBalance() {
    var amount = document.getElementById('amount').value;
    $.ajax({
        url: 'checkBalance.action',
        data: {amount: amount},
        success: function(response) {
            if (response.valid) {
                $('#balanceMsg').html('余额充足').css('color', 'green');
            } else {
                $('#balanceMsg').html('余额不足').css('color', 'red');
            }
        }
    });
}
</script>

系统的国际化支持通过Struts2的i18n机制实现,支持多语言界面切换:

<constant name="struts.custom.i18n.resources" value="message"/>
<constant name="struts.locale" value="zh_CN"/>

通过以上技术实现和架构设计,系统不仅满足了基本的个人财务管理需求,还为后续的功能扩展和技术升级奠定了坚实基础。系统的模块化设计和清晰的代码结构使得新功能的添加和现有功能的修改都变得简单高效。

本文关键词
SSH框架个人财务管理源码解析数据库设计Struts2

上下篇

上一篇
没有更多文章
下一篇
没有更多文章