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

8319

被折叠的 条评论
为什么被折叠?



