Java项目开发【小小零钱卡(控制台版)】

【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

user表-小小零钱卡(控制台版)

unused_account:

CREATE TABLE `unused_account` (
  `account` bigint(11) unsigned zerofill NOT NULL,
  PRIMARY KEY (`account`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

unused_account表-小小零钱卡(控制台版)

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

identitying_table表-小小零钱卡(控制台版)

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;  //验证失败
}

三、效果展示

效果图1-小小零钱卡(控制台版)
效果图2-小小零钱卡(控制台版)
!效果图3-小小零钱卡(控制台版)
效果图4-小小零钱卡(控制台版0


相关

项目下载地址:百度网盘下载

欢迎在观看的各位留言和根据自己想法重新完成项目并进一步完善扩展!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦年华a

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值