设计一个银行系统 实现功能
开户 登录 查询余额 存款 转账 取款 销户
银行的用户:Person类
public class Person{
//Person类只是包含一些属性 每一个对象 就好比是一个小容器 存储信息
//这样可以增加可读性
//这种类称为 POJO 或 JavaBean
private String name;//姓名
private String myNum;//身份证
private String userNum;//账号
private String password;//密码
private Float myMoney;//余额
public Person(){}
public Person(String name,String myNum,String userNum,String password,Float myMoney){
this.name = name;
this.myNum = myNum;
this.userNum = userNum;
this.password = password;
this.myMoney = myMoney;
}
public void setName(String name){
this.name = name;
}
public void setMyNum(String myNum){
this.myNum = myNum;
}
public void setUserNum(String userNum){
this.userNum = userNum;
}
public void setPassword(String password){
this.password = password;
}
public void setMyMoney(Float myMoney){
this.myMoney = myMoney;
}
public String getName(){
return this.name;
}
public String getUserNum(){
return this.userNum;
}
public String getMyNum(){
return this.myNum;
}
public String getPassword(){
return this.password;
}
public Float getMyMoney(){
return this.myMoney;
}
}
银行系统:BankService类—->业务层
public class BankService implements Serializable{
private static long serialVersionUID = 4568794L;
//这个类 都是负责处理业务逻辑的 需要底层数据的支持
private BankDao dao = new BankDao();
//银行的业务 ----> 业务层
//这里只有业务逻辑 这里看不到任何关于数据的操作 比如数据从哪来 把数据存到哪
//通过身份证号 判断该用户账号是否存在
private boolean userIsExist(String myNum){
Person p =dao.getPerson(myNum);
if(p==null){
return true;
}
return false;
}
//设计一个方法 用来登录银行系统
public String login(String myNum,String userNum,String password){
Person p = dao.getPerson(myNum);
if(p!=null){
if(p.getUserNum().equals(userNum) && p.getPassword().equals(password)){
return "登录成功!";
}
}
return "用户名或密码错误";
}
//开户
public void setMyBox(String myNum){
Person p = dao.getPerson(myNum);
if(userIsExist(myNum)) {
Scanner input = new Scanner(System.in);
System.out.println("请您告诉我您的姓名:");
String userName = input.nextLine();
System.out.println("系统即将为您开户,请稍后!");
String userNum = "";
for (int i = 0; i < 6; i++) {
userNum = userNum + (new Random().nextInt(10)) + "";
}
try {
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("您的账号为" + userNum + ",现在请您为您的账号设置密码");
String password = input.nextLine();
System.out.println("您是否需要往卡里存钱?是请按1,不是请按2");
String value = input.nextLine();
if (value.equals("1")) {
System.out.println("请您输入您要存入的金额数:");
String money = input.nextLine();
Person newp = new Person(userName, myNum, userNum, password, Float.parseFloat(money));
dao.addUserMag(newp);
dao.updateBox(newp);
try {
Thread.sleep(3000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("存入成功,您当前的余额为" + money + "元,请你保管好您的账号密码,切勿轻易交给他人使用,欢迎您下次光临!");
} else {
Person newp1 = new Person(userName, myNum, userNum, password, 0.0F);
dao.addUserMag(newp1);
dao.updateBox(newp1);
System.out.println("您的账户已经创建完毕!当前的账户余额为0元,感谢您对我们的支持,欢迎下次光临!");
}
}else {
System.out.println("账户已存在,创建失败!");
}
}
//存钱 需要找到数据库中的文件 修改后 再重新将数据写入文件
public void setMoney(String myNum,Float money) {
Person p = dao.getPerson(myNum);
p.setMyMoney(p.getMyMoney() + money);
dao.updateBox(p);
System.out.println("您已存入" + money + "元," + "您当前余额为" + p.getMyMoney() + "元!欢迎您下次光临!");
}
//取钱
public void getMoney(String myNum,Float money) {
Person p = dao.getPerson(myNum);
if (p.getMyMoney() >= money) {
p.setMyMoney(p.getMyMoney() - money);
dao.updateBox(p);
System.out.println("取款成功!您当前账户余额为:" + p.getMyMoney() + "元。");
} else {
System.out.println("对不起,您的账户余额不足!");
}
}
//查询余额
public void checkMoney(String myNum){
Person p = dao.getPerson(myNum);
System.out.println("您当前账户余额为:" + p.getMyMoney() + "元。");
}
//转账 转完账后集合后的数据要发生改变 然后再将改变的集合存入文件
public void giveMoney(String myNum,String otherNum,Float money){
Person outP = dao.getPerson(myNum);
Person inP = dao.getPerson(otherNum);
if(inP!=null){
if(outP.getMyMoney()>=money){
outP.setMyMoney(outP.getMyMoney()-money);
inP.setMyMoney(inP.getMyMoney()+money);
dao.updateBox(outP);
dao.updateBox(inP);
System.out.println("转账成功!您当前账户余额为:" + outP.getMyMoney() + "元。");
}
else{
System.out.println("对不起,您的余额不足!");
}
}else{
System.out.println("对不起,您的转账账户不存在!");
}
}
//销户
public void deleteMyBox(String myNum) {
Person p = dao.getPerson(myNum);
dao.deleteUserMag(p);
System.out.println("销户成功!");
}
}
操作数据:BankDao类 ——> 数据持久层
public class BankDao {
//Dao叫数据传输对象 作为一个层次--->持久层 只负责操作数据 即操作集合
//dao的小弟负责读写数据
private FileLoaderAndCommit flac = new FileLoaderAndCommit();
//因为每一次调用登录方法 都要创建流管道 读取文件信息
//而在内存中操作登录的业务 和文件不在一个地方 读取会很慢
//缓存机制 创建一个map集合当缓存 将文件里的数据一次性全部读出来 这样系统只需访问集合里的元素即可 不需频繁的和文件 架设流管道
//这样就不用每一个人登录时都要读一次文件
private HashMap<String, Person> userBox = flac.loaderFile();//记录用户信息
//String代表的是身份证号码 Person里记录的是用户的信息 这样每一个键就只对应一个人 方便查询
//Person里存的是 姓名-身份证号-银行账号-密码-余额
//返回 身份证号码 对应的Person信息
public Person getPerson(String myNum) {
return userBox.get(myNum);
}
//往集合中添加 Person
public void addUserMag(Person person) {
userBox.put(person.getMyNum(),person);
}
//删除集合中 身份证号码 对应的Person信息
public void deleteUserMag(Person person) {
userBox.remove(person.getMyNum());
flac.commit(userBox);
}
//更新数据库
public void updateBox(Person person) {
//里面重复的数据会被覆盖
userBox.put(person.getMyNum(), person);
flac.commit(userBox);
}
}
读写数据:FileLoaderAndCommit
public class FileLoaderAndCommit {
//这个类负责读写文件 即操作文件
//从文件中读取用户数据 再将数据读入userBox中
public HashMap<String,Person> loaderFile(){
HashMap<String,Person> userBox = new HashMap<String,Person>();
FileReader fr = null;
BufferedReader br = null;
try {
//创建输入流 读取文件记录
fr = new FileReader("E://test//userBox.txt");
br = new BufferedReader(fr);
String value = br.readLine();//一次读一行
while(value!=null){
//value分成五段 分别代表姓名 身份证号 银行卡号 密码 余额
String[] userMsg = value.split("-");
//创建对象
Person p = new Person();
p.setName(userMsg[0]);
p.setMyNum(userMsg[1]);
p.setUserNum(userMsg[2]);
p.setPassword(userMsg[3]);
p.setMyMoney(Float.parseFloat(userMsg[4]));
//把对象放进集合里
userBox.put(userMsg[1],p);
value = br.readLine();
}
} catch (Exception e) {
e.printStackTrace();
}
finally {
try {
if(fr!=null) {
fr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(br!=null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return userBox;
}
//将用户数据存入文件 commit 提交
public void commit(HashMap<String,Person> userBox){
FileWriter fw = null;
BufferedWriter bw = null;
try {
fw = new FileWriter("E://test//userBox.txt");
bw = new BufferedWriter(fw);
Iterator<String> nums = userBox.keySet().iterator();
while(nums.hasNext()){
String num = nums.next();//获取到的身份证信息 再通过身份证信息对应到每个人的信息
//将Person对象的真实数据拼接成字符串
Person p = userBox.get(num);
StringBuilder sb = new StringBuilder(p.getName());
sb.append("-");
sb.append(p.getMyNum());
sb.append("-");
sb.append(p.getUserNum());
sb.append("-");
sb.append(p.getPassword());
sb.append("-");
sb.append(p.getMyMoney());
//将数据写入文件
bw.write(sb.toString());
//一个数据一行
bw.newLine();
bw.flush();
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(fw!=null) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(bw!=null) {
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
主方法:
public static void main(String[] args){
BankService bs = new BankService();
Scanner input = new Scanner(System.in);
System.out.println("欢迎光临xx银行!xx银行很高兴为您服务!");
System.out.println("请问您是否有我们银行的银行卡? 是请按1 否请按2");
String choose = input.nextLine();
if(choose.equals("1")){
System.out.println("请您输入您的身份证号码:");
String myNum = input.nextLine();
System.out.println("请您输入您的账号:");
String userNum = input.nextLine();
System.out.println("请您输入您的密码:");
String password = input.nextLine();
String msg = bs.login(myNum,userNum,password);
System.out.println(msg);
if(msg.equals("登录成功!")){
System.out.println("请选择您要办理什么业务?");
System.out.println("1.存钱\t2.取钱\t3.查询余额\t4.转账\t5.销户");
String value = input.nextLine();
switch (value){
case "1":
System.out.println("请输入您要存入的金额:");
Float setMoney = Float.parseFloat(input.nextLine());
bs.setMoney(myNum,setMoney);
break;
case "2":
System.out.println("请输入您要取出的金额:");
Float money = Float.parseFloat(input.nextLine());
bs.getMoney(myNum,money);
break;
case "3":
bs.checkMoney(myNum);
break;
case "4":
System.out.println("请您告诉我您要转账人的身份证!");
String otherNum = input.nextLine();
System.out.println("请你输入转账金额:");
Float giveMoney = Float.parseFloat(input.nextLine());
bs.giveMoney(myNum,otherNum,giveMoney);
break;
case "5":
bs.deleteMyBox(myNum);
break;
}
}
}else{
System.out.println("感谢您选择我们银行,我们将竭尽全力为您提供优质的服务!");
System.out.println("请输入您的身份证号码:");
String myNum1 = input.nextLine();
bs.setMyBox(myNum1);
}
}