Banking system simulation (comprehensive knowledge points)

package com.uncle.test_io.atmsystem;
/**
 * 1.实现一个银行业务系统---->网上银行
 * 	2.要求有如下的业务功能
 * 		登录
 * 		查询余额
 * 		存款
 * 		取款
 * 		转账
 * 		开户
 * 		销户
 * 	3.记录银行的用户信息
 * 		账号--密码--余额	BufferedReader  readLine
 *
 * 	分析如上的小任务
 * 	1.底层数据如何存储	采用文件形式.txt    每一行记录一个人的所有信息  账号-密码-余额
 * 		文件存储在一个固定的位置   C://test
 * 		文件存储在当前工程的内部
 */

import java.util.Scanner;

public class TestMain {
    
    

    public static void main(String[] args){
    
    
        AtmService service = new AtmService();
        Scanner input = new Scanner(System.in);
        System.out.println("欢迎您使用银行自助服务系统\n请输入账号:");
        String aname = input.nextLine();
        System.out.println("请输入密码:");
        String apassword = input.nextLine();
        String loginResult = service.login(aname,apassword);
        if(loginResult.equals("登录成功")){
    
    
            System.out.println("恭喜您登录成功,请您输入操作项");
            System.out.println("查询请输入1\n存款请输入2\n取款请输入3\n转账请输入4\n退出请输入5\n如需帮助请拨打电话1234567890");
            String option= input.nextLine();
            switch(option){
    
    
                case "1":
                    Float abalance = service.queryBalance(aname);
                    System.out.println("尊敬的"+aname+"用户,您的可用余额为:"+abalance);
                    break;
            }
        }else{
    
    
            System.out.println("对不起,"+loginResult);
        }
    }
}

package com.uncle.test_io.atmsystem;

import java.util.HashMap;

public class AtmDao {
    
    

    //DAO作为一个层次---持久层   操作数据  读写数据
    //dao中还有一个小弟 负责加载文件 更新文件数据
    private FileLoaderAndCommit flac = new FileLoaderAndCommit("src\\com\\uncle\\test_io\\atmsystem\\User.txt");

    //发现登录的方法 每一次调用都需要创建流管道 读取文件的信息
    //内存中操作登录的业务 文件不在一个地方 认为读取的过程很慢
    //想到一个解决方案 创建一个map集合充当缓存 将文件中的数据全都读出来 读一次
    //一行记录 创建一个对象存起来  一个人  一个对象  三个属性
    //集合除了可以充当缓存 增强执行性能以外 还能用来做记录的修改
    private HashMap<String,User> userBox = flac.loadFile();

    //设计一个方法  目的是为了我的所有业务服务
    //有参数  账号名  返回值 一个对象User
    public User selectOne(String aname){
    
    
        return userBox.get(aname);//这里是一行 以后如果不是一行的时候 只需要改变这个方法
    }
    //设计一个方法 目的是为了将某一个修改完毕的对象存入集合
    public void update(User user){
    
    
        userBox.put(user.getAname(),user);//集合做了修改
        flac.commit(userBox);
    }


}

package com.uncle.test_io.atmsystem;


public class AtmService {
    
    

    //这一个类都是负责处理业务逻辑  需要底层数据的支持
    private AtmDao dao = new AtmDao();

    //网络银行的业务
    //所有的业务方法 按照我们之前的优化结构设计
    //只有业务逻辑  判断 比较 计算等等
    //看不见任何数据的操作  从哪儿查出来的 存在哪儿
    //设计一个业务方法  登录
    public String login(String aname,String apassword){
    
    
        User user = dao.selectOne(aname);
        if(user!=null && user.getApassword().equals(apassword)){
    
    
            return "登录成功";
        }
        return "用户名或密码错误";
    }
    //设计一个业务方法  查询余额
    public Float queryBalance(String aname){
    
    
        User user = dao.selectOne(aname);
        return user.getAbalance();
    }
    //设计一个业务方法  存款  数据库中做修改 某一行记录
    public void deposit(String aname,Float depositMoney){
    
    
        //先将集合内的数据做修改  找到某一个user对象 对象中的balance属性修改
        User user = dao.selectOne(aname);
        user.setAbalance(user.getAbalance()+depositMoney);
        dao.update(user);
        //dao.commit();//提交  将临时的数据永久的写入文件  事务
    }
    //设计一个业务方法  取款
    public void withdrawal(String aname,Float withdrawalMoney){
    
    
        //先将集合内的数据做修改  找到某一个user对象 对象中的balance属性修改
        User user = dao.selectOne(aname);
        if(user.getAbalance()>withdrawalMoney){
    
    
            user.setAbalance(user.getAbalance()-withdrawalMoney);
            dao.update(user);
            //this.commit();//提交  将临时的数据永久的写入文件  事务
        }else{
    
    
            System.out.println("对不起"+aname+",您的账户余额不足");
        }
    }
    //设计一个业务方法  转账
    public void transfer(String outName,String inName,Float transferMoney){
    
    
        //先将集合内的数据做修改  找到某一个user对象 对象中的balance属性修改
        User outUser = dao.selectOne(outName);
        if(outUser.getAbalance()>transferMoney){
    
    
            User inUser = dao.selectOne(inName);
            if(inUser!=null){
    
    //转入账户是存在的
                outUser.setAbalance(outUser.getAbalance()-transferMoney);
                inUser.setAbalance(inUser.getAbalance()+transferMoney);
                dao.update(outUser);
                //this.update(inUser);
                //this.commit();//提交  将临时的数据永久的写入文件  事务
            }else{
    
    
                System.out.println("对不起,您输入的转入账户不存在");
            }
        }else{
    
    
            System.out.println("对不起"+outName+",您的账户余额不足");
        }
    }
}

package com.uncle.test_io.atmsystem;

import java.io.*;
import java.util.HashMap;
import java.util.Iterator;

public class FileLoaderAndCommit {
    
    

    private String fileName = null;
    public FileLoaderAndCommit(String fileName){
    
    
        this.fileName=fileName;
    }

    //程序块的目的在对象创建之前 给集合进行赋值操作
    public HashMap<String,User> loadFile(){
    
    
        HashMap<String,User> userBox = new HashMap<String,User>();
        FileReader fileReader = null;
        BufferedReader bufferedReader = null;
        try {
    
    
            //创建一个输入流  读取真实文件的记录
            File file = new File(fileName);
            fileReader  = new FileReader(file);
            bufferedReader = new BufferedReader(fileReader);
            String value = bufferedReader.readLine();
            while(value!=null){
    
    
                //value的信息拆分成三段  构建一个User对象  三个属性刚好存储  对象存入集合
                String[] userValue = value.split("-");
                User user = new User(userValue[0],userValue[1],Float.parseFloat(userValue[2]));
                userBox.put(user.getAname(),user);//put(账号,User对象)
                value = bufferedReader.readLine();
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally{
    
    
            try {
    
    
                if(fileReader!=null) {
    
    
                    fileReader.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
            try {
    
    
                if(bufferedReader!=null) {
    
    
                    bufferedReader.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
        return userBox;
    }

    //设计一个方法 目的是为了将集合内的所有数据写入文件
    public void commit(HashMap<String,User> userBox){
    
    //数据库--->commit提交--->事务
        FileWriter fileWriter = null;
        BufferedWriter bufferedWriter = null;
        try {
    
    
            //创建一个字符型文件输出流
            File file = new File(fileName);
            fileWriter  = new FileWriter(file);
            bufferedWriter = new BufferedWriter(fileWriter);
            Iterator<String> names = userBox.keySet().iterator();
            while(names.hasNext()){
    
    
                String name = names.next();//集合内获取的某一个人名
                User user = userBox.get(name);//记录一个人的真实数据
                //将user对象中的真实数据拼接成一行字符串
                StringBuilder builder = new StringBuilder(user.getAname());
                builder.append("-");
                builder.append(user.getApassword());
                builder.append("-");
                builder.append(user.getAbalance());
                //字符型文件输出流将拼接好的builder写入文件
                bufferedWriter.write(builder.toString());
                bufferedWriter.newLine();
                bufferedWriter.flush();
            }
        } catch (IOException e) {
    
    
            e.printStackTrace();
        } finally{
    
    
            try {
    
    
                if(fileWriter!=null) {
    
    
                    fileWriter.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
            try {
    
    
                if(bufferedWriter!=null) {
    
    
                    bufferedWriter.close();
                }
            } catch (IOException e) {
    
    
                e.printStackTrace();
            }
        }
    }


}

package com.uncle.test_io.atmsystem;

import java.io.Serializable;

public class User implements Serializable {
    
    

    //建议除了私有属性  无参数有参数构造方法  属性对应的get、set方法
    //建议类实现一个序列化接口 添加一个序列化版本号
    private static final long serialVersionUID = 1406005760612010227L;

    //只是为了记录数据库中的一行信息   账号 密码 余额
    private String aname;
    private String apassword;
    private Float abalance;

    public User() {
    
    }
    public User(String aname, String apassword, Float abalance) {
    
    
        this.aname = aname;
        this.apassword = apassword;
        this.abalance = abalance;
    }

    public String getAname() {
    
    
        return aname;
    }
    public void setAname(String aname) {
    
    
        this.aname = aname;
    }
    public String getApassword() {
    
    
        return apassword;
    }
    public void setApassword(String apassword) {
    
    
        this.apassword = apassword;
    }
    public Float getAbalance() {
    
    
        return abalance;
    }
    public void setAbalance(Float abalance) {
    
    
        this.abalance = abalance;
    }
}

  • My file content

  • 步尔斯特-123-800 大叔-666-1000 Java-888-888

  • Initial Understanding of MVC Three-tier Architecture
    Insert picture description here

Guess you like

Origin blog.csdn.net/m0_51945027/article/details/112989278