云ATM架构设计
云ATM架构设计
启动程序(Start.java)
public class Start {
public static void main(String[] args) {
MainView viewObj = new MainView();
viewObj.mainView();
}
}
视图层(View)
1、主菜单(MainView)
// 主菜单
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 "返回一个字符串";
}
}
云ATM架构设计的更多相关文章
- Java实现ATM架构设计
云ATM架构设计 说明 https://www.processon.com/view/link/62ca68ee5653bb74ddcdd582 点击连接可查看项目流程图,帮助小伙伴们开发 启动程序( ...
- 基于 Angularjs&Node.js 云编辑器架构设计及开发实践
基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...
- 【原创】基于Docker的CaaS容器云平台架构设计及市场分析
基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...
- 微服务架构:基于微服务和Docker容器技术的PaaS云平台架构设计(微服务架构实施原理)
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程 ...
- Docker容器技术的PaaS云平台架构设计***
基于微服务架构和Docker容器技术的PaaS云平台建设目标是给我们的开发人员提供一套服务快速开发.部署.运维管理.持续开发持续集成的流程.平台提供基础设施.中间件.数据服务.云服务器等资源,开发人员 ...
- 一面数据: Hadoop 迁移云上架构设计与实践
背景 一面数据创立于 2014 年,是一家领先的数据智能解决方案提供商,通过解读来自电商平台和社交媒体渠道的海量数据,提供实时.全面的数据洞察.长期服务全球快消巨头(宝洁.联合利华.玛氏等),获得行业 ...
- .NET Core/.NET5/.NET6 开源项目汇总6:框架与架构设计(DDD、云原生/微服务/容器/DevOps/CICD等)项目
系列目录 [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...
- .NET 云原生架构师训练营(设计原则与模式)--学习笔记
在复杂系统的架构设计中引入设计原则与模式,能够极大降低复杂系统开发.和维护的成本 目录 几个问题 为什么要学习设计模式 优良架构设计的具体指标 理解复杂系统 面向对象思想(指导复杂系统的分析.设计.实 ...
- .NET 云原生架构师训练营(权限系统 RGCA 架构设计)--学习笔记
目录 项目核心内容 实战目标 RGCA 四步架构法 项目核心内容 无代码埋点实现对所有 API Action 访问控制管理 对 EF Core 实体新增.删除.字段级读写控制管理 与 Identity ...
随机推荐
- UniApp文件上传(SpringBoot+Minio)
UniApp文件上传(SpringBoot+Minio) 一.Uni文件上传 (1).文件上传的问题 UniApp文件上传文档 uni.uploadFile({ url: 'https://www.e ...
- 常问的MySQL面试题集合
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 除了基础题部分,本文还收集整理的MySQL面试题还包括如下知识点或题型: MySQL高性能索引 ...
- REST APIs
REST APIs 旨在通过HTTP 的动作语义METHOD, 以替代各种传统CRUD 操作所带来的命名问题,例如 "/userAdd"."/userDelete&quo ...
- 1903021121-刘明伟-java十一周作业-java面向对象编程
项目 内容 课程班级博客链接 19级信计班(本) 作业要求链接 第十一周作业 博客名称 1903021121-刘明伟-java十一周作业-java面向对象 要求 每道题要有题目,代码(使用插入代码,不 ...
- CSAPP 之 CacheLab 详解
前言 本篇博客将会介绍 CSAPP 之 CacheLab 的解题过程,分为 Part A 和 Part B 两个部分,其中 Part A 要求使用代码模拟一个高速缓存存储器,Part B 要求优化矩阵 ...
- 镜头随人物而动,视频编辑服务让用户稳站C位
现如今,视频是用户记录生活最热门的方式,各种App在发布视频界面都提供了视频简单剪辑的功能.除了增加音乐.滤镜.贴纸这些基础功能以外,用户越来越追求镜头感,这往往需要通过专业的视频剪辑软件手动打上关键 ...
- MMDeploy安装笔记
MMDeploy的TensorRT教程 Step1: 创建虚拟环境并且安装MMDetection conda create -n openmmlab python=3.7 -y conda activ ...
- 基于云服务MRS构建DolphinScheduler2调度系统
摘要:本文介绍如何搭建DolphinScheduler并运行MRS作业. 本文分享自华为云社区<基于云服务MRS构建DolphinScheduler2调度系统>,作者: 啊喔YeYe . ...
- 在 .NET 中使用 FixedTimeEquals 应对计时攻击
计时攻击 在计算机安全中,计时攻击(Timing attack)是旁道攻击 (Side-channel attack) 的一种,而旁道攻击是根据计算机处理过程发出的信息进行分析,包括耗时,声音,功耗等 ...
- iview 酸爽debug: subMenu默认选中无效的解决方法
一. 在iview中写一个submenu <Col span="3" type="flex" v-if="showCids"> ...