【Java项目开发】小小零钱卡(控制台版)
提示:项目启动前,请建立数据库表(如果需要预先导入数据,请先导入数据),导入所需的外部包,并调整项目中部分值。欢迎在评论区提出错误或建议。
项目介绍
一个控制台版的收入或支出账单记录系统,包含用户注册、登录、记账、查看账单等功能,整个项目是基于类似过程化编程,属于新手入门项目,此项目主要涉及JDBC、正则表达式、日期时间处理、邮件发送等知识点。在完成此项目过程中,有过许多疑问,也学会更多知识,零零散散的最终完成这个项目。在此分享记录下来,Java学习之旅中一段路途。Java学习旅途很长,还有许多未知路程等着我。加油吧!
一、项目功能
二、项目具体实现
1.导外部包
2.数据库表
- user:用户表
- unused_account:预分配账号表(需要预先导入数据)
- identifying_table:验证码记录表
user:
CREATE TABLE `user` (
`id` bigint(11) unsigned zerofill NOT NULL,
`password` varchar(25) NOT NULL,
`createTime` datetime DEFAULT NULL,
`deleteTime` datetime DEFAULT NULL,
`vipEnd` datetime DEFAULT NULL,
`idCard` char(18) DEFAULT NULL,
`name` varchar(12) DEFAULT NULL,
`phone` char(11) DEFAULT NULL,
`email` varchar(45) NOT NULL,
`balance` decimal(20,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
unused_account:
CREATE TABLE `unused_account` (
`account` bigint(11) unsigned zerofill NOT NULL,
PRIMARY KEY (`account`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
identifying_table:
CREATE TABLE `identifying_table` (
`id` char(14) NOT NULL,
`identify_code` char(6) NOT NULL,
`startTime` datetime NOT NULL,
`endTime` datetime NOT NULL,
`type` varchar(30) NOT NULL,
`user_id` bigint(11) unsigned zerofill NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
3.代码展示(部分)
收入或支出记录加入账单:
/**
* 收入或支出记录加入到账单
* @param account_id 用户id
* @param amount 收入或支出的金额,正数表示收入,负数表示支出,0时记录会加入失败
* @param type 收入的途径或支出的用途
* @return 是否加入成功
* @throws SQLException
*/
public static boolean inputBill(String account_id,BigDecimal amount, String type) throws SQLException {
if(amount.signum() == 0) { //金额为0的记录不加入账单
return false;
}
//关闭数据库事务自动提交
conn.setAutoCommit(false);
//将收入或支出记录加入账单
String sqlInsert = "insert into bill_" + account_id + "(id,income_or_expense,number,time,content) values(?,?,?,?,?)";
pstat = conn.prepareStatement(sqlInsert);
//pstat.setLong(1,account_id);
if(amount.doubleValue() > 0) {
pstat.setString(2,"收入");
} else {
pstat.setString(2,"支出");
//查询数据库中该用户vip结束日期时间
String sqlSelect = "select vipEnd from user where id=?";
pstat_Select = conn.prepareStatement(sqlSelect);
pstat_Select.setString(1,account_id);
ResultSet rs = pstat_Select.executeQuery();
Timestamp database_vipEnd = null;
if(!rs.next() || (database_vipEnd = rs.getTimestamp("vipEnd")) == null) { //vip查询失败或为空,支出记录加入账单失败
rs.close();
pstat_Select.close();
pstat.close();
return false;
}
//获得当前时间的时间戳变量
Timestamp current = new Timestamp(System.currentTimeMillis());
//判断用户是否为vip
if(database_vipEnd.getTime() - current.getTime() <= 0) { //非vip情况
Init.viewBalance(account_id); //查看用户余额
if(Init.balance.doubleValue() + amount.doubleValue() < 0) { //如果用户余额小于支出金额,支出记录加入账单失败
System.out.println("您的余额不够!");
rs.close();
pstat_Select.close();
pstat.close();
return false;
}
}
}
验证码匹配:
/**
* 用户进行验证
* @param codeId
* @return 是否验证成功
* @throws SQLException
*/
public static boolean identifyCode(String codeId) throws SQLException {
//查询对应验证码
String sqlSelect = "select identify_code from identifying_table where id=?";
pstat = conn.prepareStatement(sqlSelect);
pstat.setString(1,codeId);
ResultSet rs = pstat.executeQuery();
if(!rs.next()) {
rs.close();
pstat.close();
return false;
}
//用户输入验证码,进行验证,最多输入验证码9次
int i = 0;
System.out.print("请输入验证码:");
String user_input_code = sc.next();
String database_identify_code = rs.getString("identify_code");
while(i<9) {
if(StringUtils.nullSafeEqual(user_input_code,database_identify_code)) { //验证成功,返回true
rs.close();
pstat.close();
return true;
}
System.out.print("验证码输入错误,请重新输入:");
user_input_code = sc.next();
i++;
}
rs.close();
pstat.close();
return false; //验证失败
}
三、效果展示
!
相关
项目下载地址:百度网盘下载
欢迎在观看的各位留言和根据自己想法重新完成项目并进一步完善扩展!