管家婆项目介绍

财务记账业务

项目描述

财务记账系统是日常生活中对财务流水控制的常用工具,通过该工具可实现对账目支出,收入,转账,借出,借入,还出,还入记录进行新增,删除,模糊查询,修改,排序功能操作。该项目是运行在 windows 操作系统下,数据存储在 mysql 数据库中。操作显示在控制台中

项目思维导图

在这里插入图片描述

项目环境搭建

 apache 的 commons 组件:
 commons-dbutils-1.4.jar:封装并简化了 JDBC;
 commons-dbcp-1.4.jar:apache commons提供的数据库连接池组件,命名为DBCP;
 commons.pool-1.3.jar:DBCP 连接池依赖该 jar 包;
 mysql-connector-java-5.1.28-bin.jar:MySQL 的 JDBC 驱动包,用 JDBC 连接 MySQL
数据库必须使用该 JAR 包。

数据库准备

表一:
表名 bills 中文表名 账单信息表
主键 id
序号 字段名称 字段说明 类型 长度 属性 备注
1 id 账单 id number 10 主键 序列增长
2 title 账单标题 varchar2 50 非空
3 bill_time 记账时间 date 非空
4 type_id 账单类别 number 10 非空 引 用bill_type 表 主键
5 price 账单金额 number 10,2 非空
6 explain 账单说明 varchar2 500
表二
表名 bill_type 中文表名 账单类别表
主键 id
序号 字段名称 字段说明 类型 长度 属性 备注
1 id 类型 id number 10 主键 序列增长
2 name 类型名称 varchar2 50 非空

用到的技术点

JDK 版本为 1.8
1.键盘输入 Scanner 类
2.正则表达式 Pattern 类
3.集合 List/Map 类
4.对字符串的操作 String 类 StringBuffer 类
5.字符串与整型的转换 Integer 类
6.排序方式(比较器排序)Comparator 接口,Collections 类和 sql 排序。
7.数据库连接操作使用 dbcp 或 c3p0 连接池
8.严格按照分层

工程创建及包管理

  1. 使用 Eclipse创建 Java 工程,命名为 gjp
  2. 创建工程包
     cn.it.zw.app: 存放 main 方法类;
     cn.it.zw.domain/bean: 存放 JavaBean;
     cn.it.zw.view: 存放界面,及表现层类;
     cn.it.zw.service: 存放业务层类;
     cn.it.zw.dao: 存放数据访问层类;
     cn.it.zw.tools:存放工具类
  3. 创建 lib 文件夹,用来存储使用的 jar 包

基本流程

账目新增

描述:当账目产生收入(反对应支出) ,借入(反对应还入),借出(反对应还出)等账单时可通过该页面进行记录操作。当金额填写为非数字格式时不可提交,弹出警告框金额需填写正确格式。
在这里插入图片描述

账目删除

账目删除也是需要先从数据库中查询数据,根据数据的序号进行删除
在这里插入图片描述

账目修改

账目修改首先要从数据库中按照分页查询数据每页 5 条数据,计算总页数,使用↑选择上页使用↓查询下页数据,在任何输入时输入 0 则跳出查询,显示菜单。输入查询出的序号可进行修改。
在这里插入图片描述

账目查询

账目的查询可按照类型(类型需要通过查询数据库后显示然后选择)
按照用户名查询:可通过用户名进行模糊查询。
按照日期:可通过输入日期范围进行查询
按照标题名:可通过输入标题进行模糊查询
可查询所有

账目排序

账目排序指代使用数据库查询时(或者使用程序)进行排序
排序可按照标题,用户名称,时间,金额进行排序。

部分代码展示

规则验证视角
package cn.it.zw.view;
import java.util.Scanner;

public class RegexView {
	static Scanner sc = new Scanner(System.in);
	//------------------------------------------------验证-------------------------------------------
	//对菜单输入选项的
	public static int menuRegex (int min, int max){	
		int flag ;
		do {
			int num = sc.nextInt();
			if(num>=min&&num<=max) {
				flag = 1;
				return num;			
			}else {
				flag = 0;
				System.out.println("输入有误,请重新输入!");					
			}
		}while(flag == 0);
		return -1;	
	}
	
	//日期验证
	public static String timeRegex(String time) {
		int flag;
		do {
			if(time.matches("^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))?$")) {	
				flag=1;
				return time;
			}else {
				flag = 0;
				System.out.println("输入日期有误请按照2020-05-06格式输入");
			}
		}while(flag == 0);
		return null;
		
	}
	//金额验证
	public static double priceRegex() {
		int flag;
		do {
			double price = sc.nextDouble();
			if((price+"").matches("^(([1-9][0-9]*)|(([0]\\.\\d{1,2}|[1-9][0-9]*\\.\\d{1,2})))$")) {
				flag = 1;
				return price;
			}else {
				flag = 0;
				System.out.println("请输入正确数字,如3.6");
			}
			
		}while(flag == 0);
		return 0;
	}
	//翻页验证
	public static String udRegex() {
		int flag;
		do {
			String zm = sc.next();
			if(zm.matches("[ud0]")) {
				flag = 1;
				return zm;
			}else {
				flag = 0;
				System.out.println("请输入正确的格式,u或者d或者0");
			}
			
		}while(flag == 0);
		return null;
		
	}

}

分页的实现
 //分页查找全部
	@Override
	public List<ZhangWu> selectForPage(int currentPage,String[] condition,String []value,boolean flag) {
		// TODO Auto-generated method stub
		String sql="SELECT bills.`id`,bills.`yname`,bills.`title`,bills.`bill_time`,bills.`price`,bills.`explains`,bill_type.`NAME`\r\n" + 
				"FROM bill_type,bills\r\n" + 
				"WHERE bills.`type_id`=bill_type.`id`";
		if(condition != null && condition.length != 0) {
			sql += " and ";
			for (int i = 0; i < condition.length; i++) {
				sql += (condition[i]+"=?");
			}
		}
		sql += "limit "+currentPage * 5 + ",5";
		try {
			return qr.query(sql,new BeanListHandler<ZhangWu>(ZhangWu.class));
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			throw new RuntimeException("查询无结果");
		}finally {
			//归还连接
			try {
				JDBCUtils.getDataSource().getConnection().close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				
			}
		}	
	}
``

```java
static ZhangWu zw = new ZhangWu();
	static ZhangWuService zws = new ZhangWuServicesImpl();
	static Scanner sc = new Scanner(System.in);
	static Bills bills = new Bills();
	// 总条数
	public static void findBillType() {
		BillType billtype = new BillType();
		List<BillType> list = zws.findBillType(billtype);
		for (int i = 0; i < list.size(); i++) {
			System.out.print((i+1)+"."+list.get(i).getNAME());
		}
		System.out.println("");
	}
public static void all() {
		int total = zws.count();
		int totalPage = (int) Math.ceil((double) total / 5);
		int currentPage = 0;
		boolean flag = true;
		while (true) {
			if (flag) {
				if (total == 0) {
					System.out.println("没有数据!");
					break;
				} else {
					List<ZhangWu> ZahngwuList = zws.selectForPage(currentPage, null, null, false);
					print(ZahngwuList);
					flag = false;
					
				}
			
				System.out.println(
						"共计:" + totalPage + "页  当前页:" + (currentPage + 1) + "输入u查看上一页,输入d查看下一页,输入0返回上一级");
			}
			String choose = udRegex();
			if (choose.equalsIgnoreCase("u")) {
				if (currentPage == 0) {
					System.out.println("当前页为首页");
					flag = false;
				} else {
					currentPage--;
					flag = true;
				}
			}
			if (choose.equalsIgnoreCase("d")) {
				if (currentPage == totalPage - 1) {
					System.out.println("当前页为尾页");
					flag = false;
				} else {
					currentPage++;
					flag = true;
				}
			}
			if (choose.equals("0")) {
				break;
			}
			if (choose.equalsIgnoreCase("s")) {
				break;
			}

		}
	}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值