javaATM

这个Java程序实现了ATM自动取款机的功能,包括用户登录、开户、存款、取款、查询、改密、销户、转账以及记录管理。系统使用了JDBC进行数据库操作,确保了账户和交易的安全。用户可以查看自己的交易记录,并有详细的异常处理和错误提示。

包名:Work

class Atm

package Work;


import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Scanner;

/*******用户交易类*****/

public class Atm {

    //账户
    String id;
    //密码
    String password;
    //余额
    int account;
    //数据库
    Jdbc data;
    //结果集
    ResultSet resultSet;
    //输入流
    Scanner sc = new Scanner(System.in);
    //获取结果集
    ArrayList<User> userList = new ArrayList<>();
    //获取记录
    ArrayList<Message> messageList = new ArrayList<>();


    public Atm(Jdbc data) {
        this.data = data;
        init();
    }

    //初始化
    public void init(){
        try {
            this.resultSet = data.state.executeQuery("SELECT * FROM USER");
            while(this.resultSet.next()){
                User user = new User(resultSet.getString("id"), resultSet.getString("password"), Integer.parseInt(resultSet.getString("money")));
                userList.add(user);
            }
        } catch (SQLException E) {
            E.printStackTrace();
        }
    }


    //登录
    public void login() {

        //初始化
        init();



        String id,pwd;
        boolean flag = true;
        System.out.println("========登录功能========");
        System.out.println("输入账号(八位以上纯数字)");
        id = sc.next();

        for (User user : userList) {
            if(user.getId().equals(id)){
                System.out.println("请输入密码");
                pwd = sc.next();
                if(pwd.equals(user.getPwd())){
                    System.out.println("登陆成功");
                    this.id = id;
                    this.password = pwd;
                    this.account = user.getAccount();

                    //获取该账户记录
                    try {
                        ResultSet rs = this.data.state.executeQuery("SELECT * FROM MESSAGE");
                        while(rs.next()){
                            if(rs.getString("userId").equals(id)){
                                Message message = new Message(rs.getString("userId"), rs.getString("type"), rs.getString("time"), rs.getString("info"));
                                messageList.add(message);
                            }
                        }
                    } catch (SQLException E) {
                        E.printStackTrace();
                    }

                    recordMessage(id, "登录", "正常登录");

                    //业务栏
                    menu();

                }else{
                    System.out.println("密码错误");
                    System.out.println("========================");
                    return;
                }
            }
        }

        System.out.println("账号不存在");
        System.out.println("========================");

    }


    //开户
    public void kaiNew() {
        String id,pwd,pwdTwo;
        System.out.println("========开户功能========");
        System.out.println("输入账号(八位以上纯数字)");
        id = sc.next();
        //重复性检测
        for (User user : userList) {
            if(id.equals(user.getId())){
                System.out.println("账号重复");
                System.out.println("========================");
                return;
            }
        }

        while(!idTest(id)){
            System.out.println("输入账号(八位以上纯数字)");
            id = sc.next();
        }
        System.out.println("请输入密码");
        pwd = sc.next();
        while(!pwdTest(pwd)){
            System.out.println("请输入密码");
            pwd = sc.next();
        }
        System.out.println("请重复密码");
        pwdTwo = sc.next();
        while(!pwd.equals(pwdTwo)){
            System.out.println("密码不一致请重新输入");
            pwdTwo = sc.next();
        }

        try {
            this.data.state.execute("INSERT INTO USER VALUES ('" + id + "', '" + pwd + "', 0)");
            System.out.println("开户成功");

            recordMessage(id, "开户", "正常开户");

            //跳转登录界面
            login();
        } catch (SQLException e) {
            System.out.println("开户失败");
            e.printStackTrace();
        }
        System.out.println("========================");

    }

    //菜单页面
    public void menu(){
        while(true){
            System.out.println("========菜单功能========");
            System.out.println("1.存款             2.取款");
            System.out.println("3.查询             4.改密");
            System.out.println("5.销户             6.转账");
            System.out.println("7.重登             8.退出");
            System.out.println("9.记录");
            System.out.println("10.退出登录");
            System.out.println("      请选择服务项目");
            switch (sc.nextInt()){
                case 1:save();
                    break;
                case 2:draw();
                    break;
                case 3:search();
                    break;
                case 4:changeNew();
                    break;
                case 5:close();
                    break;
                case 6:send();
                    break;
                case 7:login();
                    break;
                case 8:new Menu();
                    break;
                case 9:viewRecord();
                    break;
                case 10:return;
                default:System.exit(0);
                    break;
            }
        }
    }


    //存款
    public void save(){
        int money;
        System.out.println("========存款功能========");
        System.out.println("请输入存款金额:");
        money = sc.nextInt();
        //存款金额合法性验证(大于0并且是整百)
        if(money <= 0 || money % 100 !=0){
            System.out.println("金额必须大于0且是100的整数倍");
            System.out.println("========================");
            return;
        }
        try {
            this.data.state.execute("UPDATE USER SET money = money + " + money + " WHERE id = '" + id + "'");
            System.out.println("存款成功");
            this.account += money;
            System.out.println("account: " + account + ".00元");

            recordMessage(id, "存款", "存款金额: " + money + ".00元");

        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("========================");
    }

    /**
     * @param id 存款账号(转账)
     * @param money 存款金额(转账)
     * @return 返回该次存款是否成功。考虑条件包括:存款金额是否合法以及存款(转账)对象是否存在
     */
    //转账存款
    public boolean save(String id,int money){
        //存款金额合法性验证(大于0并且是整百)
        if(money <= 0 || money % 100 !=0){
            return false;
        }
        try {
            this.data.state.execute("UPDATE USER SET money = money + " + money + " WHERE id = '" + id + "'");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return true;
    }

    //取款
    public void draw(){
        int money;
        System.out.println("========取款功能========");
        System.out.println("请输入存款金额:");
        money = sc.nextInt();
        //取款金额合法性验证(大于0并且是整百而且大于余额)
        if(money <=0 || money % 100 != 0 || money > account){
            System.out.println("金额必须大于0且是100的整数倍不超过余额");
            System.out.println("========================");
            return;
        }
        try {
            this.data.state.execute("UPDATE USER SET money = money - " + money + " WHERE id = '" + id + "'");
            System.out.println("取款成功");
            this.account -= money;
            System.out.println("account: " + account + ".00元");

            recordMessage(id, "取款", "取款金额: " + money + ".00元");

        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("========================");
    }

    /**
     * @param money 取款金额(转账)
     * @return 返回该取款操作是否成功。考虑条件为取款金额是否合法
     */
    //转账取款
    public boolean draw(int money){
        //取款金额合法性验证(大于0并且是整百而且大于余额)
        if(money <=0 || money % 100 != 0 || money > account){
            return false;
        }
        try {
            this.data.state.execute("UPDATE USER SET money = money - " + money + " WHERE id = '" + id + "'");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return true;
    }

    //查询
    public void search(){
        System.out.println("========查询功能========");
        System.out.println("id: " + id);
        System.out.println("password: " + password);
        System.out.println("account: " + account + ".00元");
        System.out.println("========================");
    }

    //修改
    public void changeNew(){
        String pwd,newPwdOne,newPwdTwo;
        Scanner sc = new Scanner(System.in);
        System.out.println("========改密功能========");
        System.out.println("请输入密码");
        pwd = sc.next();
        if(pwd.equals(password)){
            System.out.println("请输入新密码");
            newPwdOne = sc.next();
            while(!pwdTest(newPwdOne)){
                System.out.println("请输入新密码");
                newPwdOne = sc.next();
            }

            System.out.println("请重复新密码");
            newPwdTwo = sc.next();
            if(newPwdOne.equals(newPwdTwo)){
                try {
                    this.data.state.execute("UPDATE USER SET password = '" + newPwdOne + "' WHERE id = '" + id + "'");
                    System.out.println("改密成功");
                    System.out.println("========================");
                    this.password = newPwdOne;

                    recordMessage(id, "改密", "正常修改密码");

                    //跳转登录页面
                    login();
                    return;
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }else{
                System.out.println("两次密码不同");
            }
        }

        System.out.println("密码错误");
        System.out.println("========================");
    }


    //销户
    public void close(){
        System.out.println("========销户功能========");
        System.out.println("是否确定销户(Y/y)");
        if(sc.next().equalsIgnoreCase("y")){
            System.out.println("是否确定销户(Y/y)");
            if(sc.next().equalsIgnoreCase("y")){
                System.out.println("是否确定销户(Y/y)");
                if(sc.next().equalsIgnoreCase("y")){
                    try {
                        this.data.state.execute("DELETE FROM USER WHERE id = '" + id + "'");
                        System.out.println("销户成功");
                        System.out.println("account: " + account + ".00元");
                        System.out.println("========================");

                        recordMessage(id, "销户", "正常销户,余额已取");

                        /****返回到初始页面****/
                        new Menu();

                        return;
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }

                }
            }
        }
        System.out.println("销户取消");
        System.out.println("========================");
    }

    /***转账函数的查询有问题***/

    //转账
    public void send(){
        String idSave;
        int money;
        System.out.println("========转账功能========");
        System.out.println("请输入转账对象账户");
        idSave = sc.next();
        System.out.println("请输入转账金额");
        money = sc.nextInt();
        //不能转给自己
        if(id.equals(idSave)){
            System.out.println("请勿转账给自己");
            System.out.println("========================");
            return;
        }
        //转账账户存在性检测
        boolean flag = false;
        for (User user : userList) {
            if(user.getId().equals(idSave)){
                flag = true;
                break;
            }
        }
        //转账对象不存在
        if(!flag){
            System.out.println("转账对象不存在");
            System.out.println("========================");
            return;
        }
        //转账就是一个取款一个存款,先取,能取成功才可能存成功
        if(draw(money)) {
            save(idSave, money);
            System.out.println("转账成功");
            this.account -= money;
            System.out.println("account: " + account + ".00元");
            recordMessage(id, "转出", "转至 -> " + idSave + "; 转出金额: " + money + ".00元");
            recordMessage(idSave, "转入", "转自 -> " + id + "; 转入金额: " + money + ".00元");
            System.out.println("========================");
            return;
        }
        System.out.println("转账失败");
        System.out.println("========================");

    }


    /**
     * @param id 账号
     * @return 返回该账号是否合法
     */
    //账号合法性和密码合法性检测功能封装
    public boolean idTest(String id){
        //长度检测(长度8-10)
        if(id.length() < 8 || id.length() > 10){
            System.out.println("长度不符");
            return false;
        }

        char[] chars = id.toCharArray();

        //字符类型检测(只能是数字)
        for(Character c:chars){
            if(c <48 || c > 57){
                System.out.println("请使用纯数字");
                return false;
            }
        }

        return true;

    }

    /**
     * @param pwd 密码
     * @return 返回该密码是否合法
     */
    public boolean pwdTest(String pwd){
        //长度检测(只能是8位)
        if(pwd.length()!=8){
            System.out.println("长度不符");
            return false;
        }

        char[] chars = pwd.toCharArray();
        int length = chars.length;

        //字符类型检测(只能是数字)
        for(Character c:chars){
            if(c < 48 || c > 57){
                System.out.println("请使用纯数字");
                return false;
            }
        }

        //简易性测试

        //一个字符组成
        for(int i=0;i<length-1;i++){
            if(chars[i] == chars[i + 1] && i == length - 2){
                System.out.println("密码不得只有一种字符");
                return false;
            }else if(chars[i] != chars[i + 1]){
                break;
            }
        }
        //等差数列
        for(int i=0;i<length-2;i++){
            int temp1 = chars[i] - chars[i + 1], temp2 = chars[i + 1] - chars[i + 2];
            if(temp1 == temp2 && i == length - 3){
                System.out.println("密码不得是等差数列");
                return false;
            }else if(temp1 == temp2){
                break;
            }
        }
        return true;

    }

    /************************************************/

    //清空数据
    public void deleteData(){
        System.out.println("========清空功能========");
        System.out.println("请确定清空数据(Y/y)");
        if(sc.next().equalsIgnoreCase("y")){
            System.out.println("请再次确定清空数据(Y/y)");
            if(sc.next().equalsIgnoreCase("y")){
                System.out.println("请最后确定清空数据(Y/y)");
                if(sc.next().equalsIgnoreCase("y")){
                    try {
                        this.data.state.execute("DELETE FROM USER");
                        this.data.state.execute("DELETE FROM MESSAGE");
                        System.out.println("清空成功");
                        System.out.println("========================");
                        return;
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        System.out.println("清空取消");
        System.out.println("========================");
    }

    //创建demo数据
    public void createDemoData(){
        System.out.println("========导入数据========");
        try {
            String str = String.valueOf(Calendar.getInstance().getTime());
            this.data.state.execute("DELETE FROM USER");
            this.data.state.execute("DELETE FROM MESSAGE");
            this.data.state.execute("INSERT INTO USER VALUES ('11111111', '12121212', 0), ('22222222', '23232323', 10000), ('33333333', '34343434', 100000000)");
            this.data.state.execute("INSERT INTO MESSAGE VALUES ('11111111', '开户', '" + str + "', 'demo')");
            this.data.state.execute("INSERT INTO MESSAGE VALUES ('22222222', '开户', '" + str + "', 'demo')");
            this.data.state.execute("INSERT INTO MESSAGE VALUES ('33333333', '开户', '" + str + "', 'demo')");
            //this.data.state.execute("INSERT INTO MESSAGE VALUES ('11111111', '开户', '" + str + "', 'demo'), ('22222222', '开户', '" + str + "', 'demo'), ('33333333', '开户', '" + str + "', 'demo'");
            System.out.println("导入数据成功");
            System.out.println("========================");
            return;
        } catch (SQLException e) {
            e.printStackTrace();
        }
        System.out.println("导入数据失败");
        System.out.println("========================");
    }



    //记录
    private void recordMessage(String userId, String type, String info){
        try {
            String str = String.valueOf(Calendar.getInstance().getTime());
            this.data.state.execute("INSERT INTO MESSAGE VALUES ('" + userId + "', '" + type + "', '" + str + "', '" + info + "')");
            Message message = new Message(userId, type, str, info);
            messageList.add(message);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    //查看记录
    private void viewRecord(){
        System.out.println("========记录查询========");
        System.out.println("id: " + id);
        System.out.println("========================");
        System.out.println("类型\t\t时间\t\t\t\t\t\t\t\t信息");
        System.out.println("================================================");
        for (Message message : messageList) {
            System.out.print(message.getType() + "\t\t");
            System.out.print(message.getTime() + "\t");
            System.out.println(message.getInfo());
        }
        System.out.println("================================================");
    }


    //慈善

}

class Jdbc

package Work;
/*
* 数据库创建:
* 表1:user
*       id char(10)
*       password char(10)
*       money int
*
* 表2:message
*       userId char(10)
*       type char(10)
*       time char(255)
*       info char(255)
* */
import java.sql.*;

public class Jdbc {

    private String path;//数据库地址及设置

    private String id;//数据库账号

    private  String password;//数据库密码

    public Connection con;//连接对象

    public Statement state;//执行对象

    public Jdbc(String path, String id, String password) {

        //1.导入jar包,在项目内创建libs目录,将jar包复制到libs目录下
        //在idea内右键libs目录选择 Add As Library

        //注册数据库驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        this.path = path;
        this.id = id;
        this.password = password;

        dataBase();

        /*
        String[] strBase = {
                "CREATE DATABASE if not exists AtmData DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;",
                "use AtmData",
                "CREATE TABLE if not exists 'user' (id varchar(20), password varchar(20), money double, vip varchar(5));",
                "CREATE TABLE if not exists 'message' (id INT AUTO_INCREMENT, PRIMARY KEY (id), userId varchar(20), type varchar(30), time varchar(30), info varchar(255));"
               };

        */

    }


    //创建连接对象和执行对象
    private void dataBase() {
        //获取连接对象
        try {
            this.con = DriverManager.getConnection( this.path, this.id, this.password);
            //获取执行对象
            this.state = this.con.createStatement();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

class Menu

package Work;

import java.util.Scanner;

/**
 * 初始登录或者开户菜单页面
 * 在此类中创建数据库连接对象
 */
public class Menu {

    //数据库连接
    //数据库地址
    String path = "jdbc:mysql://localhost:3306" +
            "/AtmData?useUnicode=true&characterEncoding" +
            "=utf-8&useSSL=false&serverTimezone = GMT";
    //数据库账号
    String dataId = "root";
    //数据库密码
    String dataPwd = "root";
    //数据库连接对象
    Jdbc data = new Jdbc(path, dataId, dataPwd);

    //输入
    Scanner sc = new Scanner(System.in);


    public Menu() {
        init();
    }


    private void init() {
        while(true){
            Atm atm = new Atm(data);
            System.out.println("========JavaATM========");
            System.out.println("         1.登录");
            System.out.println("         2.开户");
            System.out.println("         3.清空数据");
            System.out.println("         4.导入demo数据(导入demo数据会先清空原始数据)");
            System.out.println("         5.退出");
            System.out.println("        请选择业务:");
            switch (sc.nextInt()){
                case 1:atm.login();
                    break;
                case 2:atm.kaiNew();
                    break;
                case 3:atm.deleteData();
                    break;
                case 4:atm.createDemoData();
                    break;
                default:System.exit(0);
                    break;
            }
        }

    }
}

class Message

package Work;

/******记录信息类*****/

public class Message {

    private String userId;
    private String type;
    private String time;
    private String info;

    public Message(String userId, String type, String time, String info) {

        this.userId = userId;
        this.type = type;
        this.time = time;
        this.info = info;
    }

    public Message() {
    }


    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return "Message{" +
                ", userId='" + userId + '\'' +
                ", type='" + type + '\'' +
                ", time='" + time + '\'' +
                ", info='" + info + '\'' +
                '}';
    }
}

class  User

package Work;

/*****无效类*****/
/*******用户类*****/

public class User {

    //用户属性
    //账户
    private String id;
    //密码
    private String pwd;
    //余额
    private int account;


    public User() {
        this.account = 0;
    }

    public User(String id, String pwd, int money) {
        this.id = id;
        this.pwd = pwd;
        this.account = money;
    }


    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public int getAccount() {
        return account;
    }

    public void setAccount(int account) {
        this.account = (Math.max(account, 0));
    }

    @Override
    public String toString() {
        return "User{" +
                "id='" + id + '\'' +
                ", pwd='" + pwd + '\'' +
                ", money=" + account;
    }
}

程序入口:

class Main

package Work;

public class Main {
    public static void main(String[] args) {
        new Menu();
    }
}

以后可能会有可视化版(javaSwing和javaweb)

需要请自行提取:链接:https://pan.baidu.com/s/176pbBM513ejcipVQsyeMvg 
提取码:xrbw

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值