云ATM架构设计

说明

https://www.processon.com/view/link/62ca68ee5653bb74ddcdd582 点击连接可查看项目流程图,帮助小伙伴们开发

启动程序(Start.java)

public class Start {
public static void main(String[] args) {
MainView viewObj = new MainView();
viewObj.mainView();
}
}

视图层(View)

1、主菜单(MainView)
// 主菜单
// 温馨提示,当用户进入小功能后在输入窗口输入 Q/q 可以退出当前功能
public class MainView {
/*
打印菜单
无参数、无返回值
根据原型图 打印主菜单
接收用户输入,并作简单判断 (如用户输入超出选择范围。返回重新输入)
根据用户输入的编号调用相应接口
*/
public static void mainView() {} /*
注册
无参数、无返回值
让用户输入 用户名,调用 service.UserService.login(name); 参数:用户名 返回值:0:存在 1:不存在 2: 被冻结, 先判断用户名是否存在,是否被冻结
再输入密码,确认密码,并判断两次密码是否一致,输入的用户名密码是否符合规定,这部分逻辑自己处理
打印密保问题,让用户输入答案(密保不强制用户设置,可以为空)
调用 service.UserService.register(); // 接收参数:用户名、密码、密保答案1、密保答案2 返回值 0:注册成功, 1:未知错误
通过返回值做逻辑处理
*/
public static void registerView() {} /*
登录
无参数、无返回值
让用户输入 用户名 调用 service.UserService.login(name); 参数:用户名 返回值:0:存在 1:不存在 3: 被冻结, 先判断用户名是否存在,是否被冻结
再输入密码 调用 service.UserService.login(name, password); 接收参数:用户名、密码 返回值 0:登录成功, 1:密码有误
通过返回值做逻辑处理
若连续三次密码输入错误 则调用 AdminService.lockUser(name) 锁定账户
登录成功 将用户名赋值给 view.UserView.currentUser 属性,调用用户界面 view.UserView.userView() 进入用户菜单界面
*/
public static void loginView() {} /*
忘记密码
被 mainView()调用、无参数、无返回值
让用户输入 用户名,调用 service.UserService.login(name); 参数:用户名 返回值:0:存在 1:不存在 3: 被冻结, 先判断用户名是否存在,是否被冻结
打印密保问题,让用户输入答案,
调用 service.UserService.forgetPwd(name, 答案1, 答案2);根据返回值做相应处理
若连续输入三次密保答案均不正确 则调用 service.AdminService.lockUser(name) 锁定账户
再输入密码,确认密码,并判断两次密码是否一致,
调用 service.AdminService.resetService(name, newPassword) // 无返回值
若密保未设置 则提示若要找回密码请联系管理员
*/
public static void forgetPwdView() {} /*
管理员登录
被 mainView()调用、无参数,无返回值
让用户输入用户名,调用 service.AdminService.adminLogin(name);
adminLogin可先判断管理员用户名是否存在,// 返回值: 0:用户名存在 1:用户名不存在
再输入密码 service.AdminService.adminLogin(name, password); // 返回值: 0:登录成功 1:密码不正确
若密码连续输入三次错误,则让界面睡1分钟,让用户无法操作
若登录成功 将用户名赋值给 view.AdminView.currentAdmin; 并返回返回管理员界面 view.AdminView.adminView();
*/
public static void adminLoginView(String name, String password) {}
}
2、用户菜单(UserView)
// 用户菜单层
public class UserView {
// 定义
public static String currentUser;
public static boolean isLoop = true;
/*
打印用户菜单 (参照原型图)
无参数、无返回值
接收用户输入。并作简单判断
根据用户输入的编号调用对应方法 若查看余额,直接调用 String balance = dao.Data.showBalance(currentUser);// 参数: 当前用户名 返回用户余额
若查看流水 直接调用 String flowNew = dao.Data.flowNew(currentUser); //参数: 当前用户名 返回流水信息
*/
public static void userView() {} /*
转账
被 userView() 调用, 无参数,无返回值
让用户输入转账对象,调用 service.UserService.login(name); 参数:目标用户名 返回值:0:存在 1:不存在 3: 被冻结, 先判断用户名是否存在,是否被冻结
让用户输入转账金额, 调用 service.CoreService.transfer(currentUser, 转账对象,转账金额);
根据返回值再做处理
*/
public static void transferView(){} /*
预约存款
输入预约的时间,这里使用正则来匹配时间,判断时间输入的是否符合规定
做一个 random 随机数(0和1) 若为0则打印已预约,为1打印此时间已被预约,重新输入
输入存款金额,对输入进行处理,是否为数字且>0, 若不是则提醒并返回重新输入
调用 service.CoreService.reserve() // 参数: 当前用户, 存款金额, 预约时间 返回值(int): 存款码
返回存款码,打印给用户
*/
public static void reserveView(){} /*
预约取款
输入预约的时间,这里使用正则来匹配时间,判断时间输入的是否符合规定
做一个 random 随机数(0和1) 若为0则打印已预约,为1打印此时间已被预约,重新输入
输入取款金额,对输入进行处理,是否为数字且>0, 若不是则提醒并返回重新输入
调用 service.CoreService.withdraw() // 参数: 当前用户, 存款金额, 预约时间 返回值: 取钱码 ,-1: 余额不足
根据返回做逻辑处理
若返回值不为 -1 则返回取款码,并将取款码打印给用户查看
*/
public static void withdrawView(){} /*
用户修改密码
输入原密码, 调用 service.UserService.login(currentUser, password);
若返回 1 则原密码输入有误,若连续三次输入错误,则调用 service.AdminService.lockUser(name) 锁定账户 并返回至主菜单
若返回 0,则原密码输入正确,再输入新密码,确认密码,并判断两次密码是否一致,
调用 service.AdminService.resetService(currentUser, newPassword) 修改密码,无返回值
*/
public static void setPwdView(){} /*
退出登录
将 currentUser 置为null, 让循环条件 isLoop = false;
并返回到主菜单
*/
public static void loginView(){}
}
3、管理员菜单(AdminView)
// 管理员菜单层
public class AdminView {
// 当前登录的管理员
public static String currentAdmin;
// 循环条件
public static boolean isLoop = true;
/*
打印管理员用户菜单 (参照原型图)
无参数、无返回值
接收用户输入。并作简单判断
根据用户输入的编号调用对应方法 若用户选择开通账户 则调用 view.MainView.registerView(); // 无参数无返回值
*/
public static void adminView(){} /*
冻结用户
让管理员输入需要冻结的用户名
调用 service.AdminService.lockUser(name);
若返回1则用户名不存在,让用户重新输入
若为0则冻结成功
*/
public static void lockView(){} /*
修改用户余额
输入用户名,调用 service.UserService.login(name); 参数:目标用户名 返回值:0:存在 1:不存在 3: 被冻结, 先判断用户名是否存在,是否被冻结
若存在,则调用 double balance = dao.Data.showBalance(currentUser); 打印当前余额
提示管理员输入 修改额度为多少,调用 service.AdminService.setBalance(name, balance);
打印修改额度成功!
*/
public static void setBalanceView(){} /*
开通管理员账户
用户输入注册的用户名,判断用户名是否符合规定
若符合,调用 service.AdminService.adminRegister(name);
adminRegister 来判断该用户名是否已被注册 // 返回值: 0:未被注册 1:已被注册
若未被注册 则提示输入密码,再次输入确认密码,判断两次密码是否一致,并判断是否符合规定
若一致,则调用 service.AdminService.adminRegister(name, password); // 无返回值
完成注册
*/
public static void adminRegisterView(){} /*
重置用户密码
让管理员输入需要重置密码的用户名
调用 service.AdminView.resetService(name); // 返回值: 0:重置成功 1:用户名不存在
根据返回值做逻辑处理
若重置成功,则打印密码重置成功,新密码为 000000 请尽快修改该密码
*/
public static void resetView(){} /*
退出登录
将 currentAdmin 置为null, 让循环条件 isLoop = false;
并返回 主菜单
*/
public static void loginView(){}
}

业务逻辑层 (service)

1、用户登录注册相关业务处理 (UserService)
/*
注册、登录、忘记密码、管理员登录
预约存款、预约取款、转账、查看余额、查看流水、修改密码,退出登录
开通账户、冻结账户、修改额度、开通管理员账户、重置用户密码,退出登录
*/ // 用户相关业务处理
public class UserService {
/*
1、注册
接收参数:用户名、密码、密保答案1、密保答案2
返回值 0:注册成功, 1:未知错误
对密码进行加密处理
判断传入的密保答案是否为空,如果为空,不做处理 (密保不强制用户一定要设置)
创建用户对象,并加入集合
*/
public static int register(String name, String password, String pwdProtectO, String pwdProtectT) {
// 返回值 0:注册成功, 1:未知错误
return 0;
} /*
2、登录
接收参数:用户名、密码
返回值 0:登录成功, 1:密码有误
对密码加密,再进行比较
*/
public static int login(String name, String password) {
// 返回值 0:登录成功, 1:密码有误
return 0;
} /*
登录,先判断用户名是否存在
参数:用户名
返回值:0:存在 1:不存在, 2: 被冻结
*/
public static int login(String name) {
// 返回值:0:存在 1:不存在 2: 被冻结
return 0;
} /*
3、忘记密码
接收参数:用户名, 密保答案1、密保答案2
返回值(int): 0:输入正确, 1、密保答案不正确 2:用户未设置密保
判断用户是否设置密保
判断密保答案是否正确
*/
public static void forgetPwd(String name, String pwdProtect0, String pwdProtect1) {}
}
2、管理员用户相关业务处理(AdminService)
public class AdminService {
/*
管理员登录
参数:用户名
返回值: 0:用户名存在 1:用户名不存在
*/
public static int adminLogin(String name) {
// 返回值: 0:用户名存在 1:用户名不存在
return 0;
} /*
管理员登录
参数:用户名,密码
返回值: 0:登录成功 1:密码不正确
对密码进行加密后比对
*/
public static int adminLogin(String name, String password) {
// 返回值: 0:登录成功 1:密码不正确
return 0;
} /*
冻结账户
参数:用户名
修改 isLock 属性
判断用户名是否存在,不存在返回 1
存在即冻结, 并更新记录 管理员对象.record += “(记录)”;
返回值: 0:用户冻结成功 1:用户名不存在
*/
public static void lockUser(String name) {} /*
修改用户额度
参数:用户名, 修改的额度
无返回值
遍历集合找到用户对象,修改其额度
并更新记录 管理员对象.record += “(记录)”;
*/
public static void setBalance(String name, double balance){} /*
开通管理员账户
参数:用户名,密码
new一个管理员对象,并添加到管理员集合中
*/
public static void adminRegister(String name, String password) {} /*
判断该用户名是否已被注册
参数:用户名难
返回值: 0:未被注册 1:已被注册
通过遍历管理员集合来判断
并更新记录 管理员对象.record += “(记录)”;
*/
public static int adminRegister(String name) {
// 返回值: 0:未被注册 1:已被注册
return 0;
} /*
重置重置用户密码
参数 用户名
返回值: 0:重置成功 1:用户名不存在
先判断用户是否存在,若存在则将用户密码改为 000000 并加密
并更新记录 管理员对象.record += “(记录)”;
*/
public static int resetService(String name){
// 返回值: 0:重置成功 1:用户名不存在
return 0;
} /*
管理员修改用户密码
参数 用户名,新密码 无返回值
把密码加密后更新到用户对象
并更新记录 管理员对象.record += “(记录)”;
*/
public static void resetService(String name, String newPassword){}
}
3、核心业务逻辑处理(CoreService)
// 核心业务逻辑处理
public class CoreService {
/*
转账
参数: 当前用户, 转账对象, 转账金额
返回值: 0: 转账成功 1、余额不足
判断当前用户余额是否充足
当前用户余额 -= sal, 转帐对象余额 += sal
记录流水
return int;
*/
public static int transfer(String currentUser, String targetUser, double sal) {
// 返回值: 0: 转账成功 1、余额不足
return 0;
}; /*
预约存款
参数: 当前用户, 存款金额, 预约时间
遍历集合找到用户对象,balance += sal (可以与线下ATM数据库做一个同步更新, 这里我直接给他加上了)
用 random 随机数生成一个6位数的存款码
并将 对象中的 存款码,预约时间更新
并记录流水
返回值(int): 存款码
*/
public static int reserve(String currentUser, double sal, String date){
// 返回值(int): 存款码
return 123456;
} /*
预约取款
参数: 当前用户, 存款金额, 预约时间
返回值: 取钱码 ,-1: 余额不足
判断余额是否够用,若余额不足返回 -1,
充足则更新余额,balance -= sal (这里同存款业务)
用 random 随机数生成一个6位数的取款码
并将 对象中的 取款码,预约时间更新
并记录流水
并返回取钱码
*/
public static int withdraw(String currentUser, double sal, String date){
// 返回值: 取钱码 ,-1: 余额不足
return -1;
}
}

数据层(dao)

/*
用户存储数据采用 HashMap 集合 (普通用户,管理员用户各使用一个集合), 以用户名作为 key ,用户对象为 value
普通用户数据 创建用户对象
用户名 String name
密码 (加密) String password
是否被冻结 boolean isLock
余额 double balance
预约存款时间 String appointmentCTime
预约取款时间 String appointmentQTime
存款金额 double deposit
取款金额 double withdraw
存钱码 int depositCode
取钱码 int withdrawCode
流水信息 String flowNew
密保问题一答案 String pwdProtectO
密保问题二答案 String pwdProtectT 管理员用户 管理员对象
用户名 String name
密码 (加密) String password
操作记录 String record */
public class User {
private String name;
private String password;
private boolean isLock = false;
private double balance;
private String appointmentCTime;
private String appointmentQTime;
private double deposit;
private double withdraw;
private int depositCode;
private int withdrawCode;
private String flowNew;
private String pwdProtectO;
private String pwdProtectT; public User(String name, String password) {
this.name = name;
this.password = password;
} public User(String name, String password, String pwdProtectO, String pwdProtectT) {
this.name = name;
this.password = password;
this.pwdProtectO = pwdProtectO;
this.pwdProtectT = pwdProtectT;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public boolean isLock() {
return isLock;
} public void setLock(boolean lock) {
isLock = lock;
} public double getBalance() {
return balance;
} public void setBalance(double balance) {
this.balance = balance;
} public String getAppointmentCTime() {
return appointmentCTime;
} public void setAppointmentCTime(String appointmentCTime) {
this.appointmentCTime = appointmentCTime;
} public String getAppointmentQTime() {
return appointmentQTime;
} public void setAppointmentQTime(String appointmentQTime) {
this.appointmentQTime = appointmentQTime;
} public double getDeposit() {
return deposit;
} public void setDeposit(double deposit) {
this.deposit = deposit;
} public double getWithdraw() {
return withdraw;
} public void setWithdraw(double withdraw) {
this.withdraw = withdraw;
} public int getDepositCode() {
return depositCode;
} public void setDepositCode(int depositCode) {
this.depositCode = depositCode;
} public int getWithdrawCode() {
return withdrawCode;
} public void setWithdrawCode(int withdrawCode) {
this.withdrawCode = withdrawCode;
} public String getFlowNew() {
return flowNew;
} public void setFlowNew(String flowNew) {
this.flowNew = flowNew;
} public String getPwdProtectO() {
return pwdProtectO;
} public void setPwdProtectO(String pwdProtectO) {
this.pwdProtectO = pwdProtectO;
} public String getPwdProtectT() {
return pwdProtectT;
} public void setPwdProtectT(String pwdProtectT) {
this.pwdProtectT = pwdProtectT;
}
} public class SuperUser {
private String name;
private String password;
private String record; public SuperUser(String name, String password) {
this.name = name;
this.password = password;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public String getRecord() {
return record;
} public void setRecord(String record) {
this.record = record;
}
} public class Data {
public static HashMap<Object, Object> userMap = new HashMap<>();// 普通用户集合
public static HashMap<Object, Object> adminMap = new HashMap<>();// 管理员用户集合 static {
// 初始化一个管理员账户
SuperUser james = new SuperUser("james", "heisgoat");
adminMap.put("james", james);
} /*
展示用户余额
参数: 当前用户名
返回值: double balance
遍历用户集合获得用户对象, 取出用户余额
*/
public static double showBalance(String currentUser) {
// 返回用户余额
return 0;
} /*
查看用户流水
参数: 当前用户名
返回值: String类型的记录
遍历用户集合获得用户对象, 取出用户流水信息
*/
public static String flowNew(String name) {
return "返回一个字符串";
}
}

Java实现ATM架构设计的更多相关文章

  1. 云ATM架构设计

    云ATM架构设计 启动程序(Start.java) public class Start { public static void main(String[] args) { MainView vie ...

  2. [转]轻量级 Java Web 框架架构设计

    工作闲暇之余,我想设计并开发一款轻量级 Java Web 框架,看看能否取代目前最为流行的而又越来越重的 Spring.Hibernate 等框架.请原谅在下的大胆行为与不自量力,本人不是为了重造轮子 ...

  3. java web 三层架构设计

    界面层(表示层):用户看得到的,可以通过此与服务器交互 业务逻辑层:处理业务逻辑. 数据访问层:操作数据存储文件

  4. 搭建rtmp直播流服务之3:java开发ffmpeg实现rtsp转rtmp并实现ffmpeg命令的接口化管理架构设计及代码实现

    上一篇文章简单介绍了java如何调用ffmpeg的命令:http://blog.csdn.net/eguid_1/article/details/51777716 上上一篇介绍了nginx-rtmp服 ...

  5. java设计模式--基础思想总结--抽象类与架构设计思想

    抽象类?这个东西我感觉没什么卵用啊,又不能拿来new对象,没有具体的对象的抽象类,有什么实际的意义呢?这是很多刚刚接触java抽象类语法时的第一反应(当然,包括我).确实,很多刚刚接触抽象类这个概念的 ...

  6. Atitit. servlet 与 IHttpHandler  ashx  listen 和HttpModule的区别与联系 原理理论 架构设计   实现机制    java php c#.net js javascript  c++ python

    Atitit. servlet 与 IHttpHandler  ashx  listen 和HttpModule的区别与联系 原理理论 架构设计   实现机制    java php c#.net j ...

  7. Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle

    Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle 1. 主键1 2. uniq  index2 3.  ...

  8. Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python

    Atitit  文件上传  架构设计 实现机制 解决方案  实践java php c#.net js javascript  c++ python 1. 上传的几点要求2 1.1. 本地预览2 1.2 ...

  9. 点菜网---Java开源生鲜电商平台-商品基础业务架构设计-商品分类(源码可下载)

    点菜网---Java开源生鲜电商平台-商品基础业务架构设计-商品分类 (源码可下载) 说明:我们搞过电商的人都可以体会到,搞生鲜电商是最复杂的,为什么复杂呢?我总结了有以下几个业务特性决定的: 1. ...

随机推荐

  1. Spring mvc 使用@RequestBody 500错误

    今天在使用@RequestBody的时候,遇到一个http500错误,记录一下 让我们来看看我是怎么样错的,贴上代码 @PostMapping("/User") public Us ...

  2. Linux网络重点知识总结性梳理

    一个执着于技术的公众号 1 OSI七层模型 层次 说明 功能/协议 应用层 应用程序及接口 提供应用程序的接口:FTP telnet http pop3等 表示层 对数据进行转换.加密和压缩 将上层的 ...

  3. 没错,华为开始对IoT下手了!

    最近,有很多粉丝在后台私信 想知道目前最热的技术是什么? 小编觉得,5G时代到来 物联网技术将迎来快速的发展 加上目前,国内物联网人才短缺 每年人才缺口达百万 IoT物联网将成为最热门的技术 最近,小 ...

  4. 好客租房21-react组件的两种创建方式(函数组件)

    1使用函数创建组件 函数组件:使用js的函数或者箭头函数创建的组件 约定1:函数组件名称必须以 开头 约定2:函数组件必须有返回值 表示该组件的结构 如果返回值为null 表示不渲染任何内容 2.1使 ...

  5. 安装Squid到CentOS(YUM)

    运行环境 系统版本:CentOS Linux release 7.3.1611 (Core) 软件版本:无 硬件要求:无 安装过程 1.关闭防火墙和SeLinux [root@localhost ~] ...

  6. ElasticSearch7.3学习(二十八)----聚合实战之电视案例

    一.电视案例 1.1 数据准备 创建索引及映射 建立价格.颜色.品牌.售卖日期 字段 PUT /tvs PUT /tvs/_mapping { "properties": { &q ...

  7. Pandas 分组聚合 :分组、分组对象操作

    1.概述 1.1 group语法 df.groupby(self, by=None, axis=0, level=None, as_index: bool=True, sort: bool=True, ...

  8. 【Unity Shader学习笔记】Unity光照基础-半兰伯特光照

    在光照无法达到的区域,模型的外观通常是全黑的,没有任何明暗变化,这会使模型的背光区域看起来就像一个平面. 使用半兰伯特光照可以解决这个问题. 逐顶点光照技术也被称为兰伯特光照模型.因为它符合兰伯特定律 ...

  9. JS基础二--字面量和变量

       /*       字面量,都是一些不可改变的值,       比如:1 2 3 4 5       字面量都是可以直接使用,但是我们一般不会直接使用字面量.       变量,变量可以用来保存字 ...

  10. .NET C#基础(6):命名空间 - 组织代码的利器

    0. 文章目的   面向C#新学者,介绍命名空间(namespace)的概念以及C#中的命名空间的相关内容 1. 阅读基础   理解C与C#语言的基础语法 2. 名称冲突与命名空间 2.1 一个生活例 ...