作业三 ATM
模拟实现一个ATM+购物商场程序
1.额度15000自定义 商城和银行两个帐户
2.实现购物商城,买东西加入购物车,调用信用卡接口结账
3.可以提现,手续费5%,提现额度不能超过50%
4.每月22日出帐单,每月10日为还款日,过期没还,按欠款总额万分之5 每日计息。 免费用48天,借2000,还1000也用2000*万分之5的利息。
5.支持多帐户登录
6.支持帐户间转账
7.记录每月日常消费流水
8.提供还款接口
9.ATM记录操作日志
10.提供管理接口,包括添加帐户、用户额度、冻结帐户等。。。
作业要求:
ATM:
- 指定最大透支额度
- 可取款
- 定期还款(每月指定日期还款,如15号)
- 可存款
- 定期出账单
- 支持多用户登陆,用户间转帐
- 支持多用户
- 管理员可添加账户、指定用户额度、冻结用户等
目录结构:
bin目录 执行文件 主程序在此目录 每个程序不超过10行
atm.py start
shopping.py
不写任何业务逻辑
conf目录 配置文件
user_db
log文件路径和格式
log目录 日志
db目录 数据库
modules/core 模块和核心目录 存放业务逻辑
功能独立的就应该使用一个单独的文件
帐户等信息必须用json或pickle存,不要追加文件要清掉重新写,覆盖。确保只dump,load一次。
此作业经过思路的梳理,最后终于基本写出,过程中还感冒,休息了几天,期间用到了不少文件夹和配置文件,个人感觉要是学到数据库就方便多了。
一、流程图:
二、readme:
系统分为两部分(模块):
一、商城购物
1.用户登录
2.显示商品列表
3.选购的商品加入购物车
4.调用信用卡模块判断额度及帐户余额
5.购物及消费记录
二、信用卡中心
1.用户登录(管理员、普通用户)
2.权限管理
3.普通用户的增、删、改,额度管理(增加用户目录及记录相关文件)
4.提现、转账
5.手续费用管理
6.时间日期处理
三、数据存储
1.bin目录 执行文件 主程序在此目录 每个程序不超过10行shop.py 和 atm.py start 不包含任何业务逻辑
2.conf目录 配置文件 费率等信息
3.userinfo目录 存储user基本信息和信用、消费记录
4.log目录 日志
5.core 模块和核心目录 存放业务逻辑
目录结构:
代码如下:
bin目录下包含main.py和atm.py:
main.py
!/usr/bin/env python
-- encoding:utf-8 --
Author:'liudong'
import sys
sys.path.append('..\bin')
import atm
import os
if name == 'main':
if len(sys.argv) != 2:
print('Please input args')
elif sys.argv[1] != 'start':
print('use 'python3 main start' to run program:')
exit()
else:
print('Welcome to ATM system'.center(50, '*'))
atm.main()
atm.py
-- conding:utf-8 --
Author:'liudong'
import sys, os, pickle
sys.path.append('..\core')
sys.path.append('..\config\')
import user_manage,login, user_func
login_username = '' # 保存当前登录用户名
def main():
admin_logined = False
user_logined = False
user_locked = False
while True:
user_choice_menu = input('\n1.查看信息\n2.存款\n3.取款\n4.还款\n5.转帐\n6.管理功能\n7.Q[q] = Exit')
if user_choice_menu == '7' or user_choice_menu == 'Q' or user_choice_menu == 'q':
quit()
elif user_choice_menu == '6':
print('login as Administrator first')
username = input('please input your username:')
password = input('please input your password:')
admin_logined = login.admin_login(username, password)
if admin_logined:
print('welcome administrator %s'.center(50, '_') % username)
admin_choice = input('1.增加用户\n2.删除用户\n3.锁定用户\n4.额度管理'
'\nQ[q]=Exit')
if admin_choice == 'Q' or admin_choice == 'q':
exit()
elif admin_choice == '1': #增加用户
user_manage.add_user()
elif admin_choice == '2':
user_manage.del_user()
elif admin_choice == '3':
user_manage.lock_user()
elif admin_choice == '4':
user_func.credit_set()
else:
print('Please log in as administrator first!')
else:
if not user_logined:
print('login as user first')
user = input('please input your username:')
passwd = input('please input your password:')
user_logined = login.user_login(user, passwd)
login_username = user
else:
if user_choice_menu == '1': # 显示用户信息
print('%s用户信息:' % user)
user_list_file = open('..\\db\\user.db', 'rb')
user_list = pickle.load(user_list_file)
print(user_list[user])
continue
# else:
# print('invalid input.')
if user_choice_menu == '2': # 存款
print('-' * 50)
save_amount = input('请输入存款金额')
save_result = user_func.save_money(user, save_amount)
if save_result:
print('Save successed!')
else:
print('save failed!')
if user_choice_menu == '3': # 取款
print('-' * 50)
withdraw_money = input('请输入取款金额')
withdraw_result = user_func.withdraw_money(user, withdraw_money)
if withdraw_result:
print('withdraw successed!')
else:
print('withdraw failed!')
if user_choice_menu == '4': # 还款
print('-' * 50)
payback = input('请输入还款数额')
payback_result = user_func.payback_money(user, payback)
if payback_result:
print('payback successed!')
else:
print('payback failed!')
if user_choice_menu == '5': # 转帐
print('-' * 50)
tran_user = input('请输入接收用户名')
amount = input('请输入金额')
tran_result = user_func.transfor_money(user, tran_user, amount)
if tran_result:
print('transfor successed!')
else:
print('transfor failed!')
core目录下包含login.py、user_func.py、user_manage.py
login.py
!/usr/bin/env python
-- conding:utf-8 --
Author:'liudong'
import sys
import os
import pickle
LOGIN_USER = {'is_login': False} # 判断用户登录成功与否
USER_TYPE = {'is_admin': False} # 判断用户类型
user_base_info = {'username': 'rain',
'card': card_num,
'password': commons.md5('8888'),
'credit': 15000, # 信用卡额度
'balance': 15000, # 本月可用额度
'saving': 0, # 储蓄金额
"enroll_date": "2016-01-01", # 注册时间
'expire_date': "2021-01-01",
'status': 0, # 0=normal,1=locked,2=disabled
"debt": [], # 欠款记录,如:[{'date':"2015_4_10","total}]
}
pickle.dump(user_base_info,open('..\db\user.db','wb'))
def admin_login(user, passwd):
user_password = [] # 保存用户、密码列表
user_list = []
with open('..\db\admins.db') as admin_file:
for u in admin_file: # 取出用户名和密码
user_password = u.split()
user_list.append(user_password[0]) # 保存用户名到user_list
user_list.append(user_password[1]) # 保存密码到user_list
# print(user_password)
for user_login in user_list: # 判断用户输入的用户名存在?
passwd_index = user_list.index(user) + 1 # 取出用户名下标
# print(passwd_index)
if passwd == user_list[passwd_index]: # 判断用户名对应的密码
print('You login as administrator>>>%s<<<' % user)
LOGIN_USER['is_login'] = True
USER_TYPE['is_admin'] = True
return True
else:
print('Invalid username or password')
return False
def user_login(user,passwd):
"""
普通用户登录程序
:param user:
:param passwd:
:return:
"""
user_list_file = open('..\\db\\user.db','rb') #读取用户基本信息
user_list = pickle.load(user_list_file)
# print(user_list,type(user_list))
# for user_loop in user_list:
# # print(user_list[user][1])
while True:
if user in user_list and passwd == user_list[user][1] :
if user_list[user][7] == '1':
print('your account is locked, please contact administrator!')
else:
print('Welcome user %s' %user)
return True
else:
print('Invalid username or password!')
return False
continue
user_func.py
!/usr/bin/env python
-- conding:utf-8 --
Author:'liudong'
import os,logging
import pickle
import sys
sys.path.append('..\core\')
import show_log
def save_money(user, amount):
"""
存款功能
:param user:用户名
:param amount: 存款额
:return:
"""
save_file = open('..\db\user.db', 'rb') # 打开文件读取用户信息
save_user_userinfo = pickle.load(save_file)
# print(save_user_userinfo,type(save_user_userinfo))
save_file.close()
save_user_userinfo[user][4] += str(int(save_user_userinfo[user][4])+int(amount))
new_save_file = open('..\db\newuser.db', 'wb')
pickle.dump(save_user_userinfo, new_save_file)
new_save_file.close()
os.remove('..\db\user.db')
os.renames('..\db\newuser.db', '..\db\user.db')
dir_card = str(save_user_userinfo[user][0]) #获取用户卡号,用于进入该目录
os.chdir('..\db\' + dir_card )
logging.basicConfig(filename='userlog.txt', level=logging.INFO, format='%(asctime)s%(message)s',
datefmt='%m/%d/%Y %I:%M:%S %p')
logging.info('user money saved $%s' % amount + '\n')
return True
def withdraw_money(user, amount):
"""
用户取款功能
:param user:
:param amount:
:return:
"""
withdraw_file = open('..\db\user.db', 'rb') # 打开文件读取用户信息
withdraw_userinfo = pickle.load(withdraw_file)
# print(save_user_userinfo,type(save_user_userinfo))
withdraw_file.close()
if not amount >= withdraw_userinfo[user][3]:
withdraw_userinfo[user][3] = str(int(withdraw_userinfo[user][3]) - int(amount))
new_save_file = open('..\db\newuser.db', 'wb')
pickle.dump(withdraw_userinfo, new_save_file)
new_save_file.close()
os.remove('..\db\user.db')
os.renames('..\db\newuser.db', '..\db\user.db')
dir_card = str(withdraw_userinfo[user][0])
os.chdir('..\db\' + dir_card)
logging.basicConfig(filename='userlog.txt', level=logging.INFO, format='%(asctime)s%(message)s',
datefmt='%m/%d/%Y %I:%M:%S %p')
logging.info('withdraw money $%s' % amount + '\n')
return True
def payback_money(user, amount):
"""
用户还款功能
:param user:
:param amount:
:return:
"""
payback_file = open('..\db\user.db', 'rb') # 打开文件读取用户信息
payback_userinfo = pickle.load(payback_file)
# print(save_user_userinfo,type(save_user_userinfo))
payback_file.close()
payback_userinfo[user][3] = str(int(payback_userinfo[user][3])+int(amount))
new_payback_file = open('..\db\newuser.db', 'wb')
pickle.dump(payback_userinfo, new_payback_file)
new_payback_file.close()
os.remove('..\db\user.db')
os.renames('..\db\newuser.db', '..\db\user.db')
dir_card = str(payback_userinfo[user][0])
os.chdir('..\db\' + dir_card)
logging.basicConfig(filename='userlog.txt', level=logging.INFO, format='%(asctime)s%(message)s',
datefmt='%m/%d/%Y %I:%M:%S %p')
logging.info('withdraw money $%s' % amount + '\n')
return True
def transfor_money(user_out, user_in, amount):
"""
转账功能
:param user_out:
:param user_in:
:param amount:
:return:
"""
tran_file = open('..\db\user.db', 'rb') # 打开文件读取用户信息
tran_userinfo = pickle.load(tran_file)
tran_file.close()
if not amount >= tran_userinfo[user_out]:
tran_userinfo[user_out][2] = str(int(tran_userinfo[user_out][2]) - int(amount))
tran_userinfo[user_in][2] = str(int(tran_userinfo[user_in][2]) + int(amount))
new_tran_file = open('..\db\newuser.db', 'wb')
pickle.dump(tran_userinfo, new_tran_file)
new_tran_file.close()
os.remove('..\db\user.db')
os.renames('..\db\newuser.db', '..\db\user.db')
dir_card_out = str(tran_userinfo[user_out][0])
dir_card_in = str(tran_userinfo[user_in][0])
os.chdir('..\db\' + dir_card_out)
logging.basicConfig(filename='userlog.txt', level=logging.INFO, format='%(asctime)s%(message)s',
datefmt='%m/%d/%Y %I:%M:%S %p')
logging.info('withdraw money $%s' % amount + '\n')
os.chdir('..\db\' + dir_card_in)
logging.basicConfig(filename='userlog.txt', level=logging.INFO, format='%(asctime)s%(message)s',
datefmt='%m/%d/%Y %I:%M:%S %p')
logging.info('withdraw money $%s' % amount + '\n')
return True
user_manage.py
!/usr/bin/env python
-- conding:utf-8 --
Author:'liudong'
import pickle, os,time,logging
all_user_info = {} # 保存文件所有用户信息
def add_user():
old_file = open('..\db\user.db', 'rb')
all_user_info = pickle.load(old_file)
old_file.close()
add_username = input('please input username you want add.')
other_information = input('please input basic information, like this: ' # 输入的内容是字符串
"""
信用卡号,密码,信用卡额度,本月可用额度,储蓄金额,注册时间,到期日,状态 0=normal,1=locked
""")
list_other_information = list(other_information.split(','))
# print(list_other_information, type(list_other_information))
all_user_info[add_username] = list_other_information
# print(add_user_key, type(add_user_key))
user_card_no = all_user_info[add_username][0] # 获取用户卡号
# print(user_card_no)
user_db_file = open('..\db\usernew.db', 'wb')
pickle.dump(all_user_info, user_db_file)
user_db_file.close()
os.remove('..\db\user.db')
os.renames('..\db\usernew.db', '..\db\user.db')
os.chdir('..\db') # 切换到db目录
os.mkdir(user_card_no) # 创建该用户卡号为名称的文件夹
print('%s user created' % add_username)
logging.basicConfig(filename='timelog.txt', level=logging.INFO, format='%(asctime)s%(message)s',
datefmt='%m/%d/%Y %I:%M:%S %p')
logging.info('add user %s' % add_username + '\n') #记录用户增加日志
def del_user():
print('_' * 50)
del_username = input('please input username you want to delete.')
confirm = input('please confirm? y[Y]')
if confirm == 'y' or confirm == 'Y':
os.chdir('..\db\')
del_user_file = open('..\DB\user.db', 'rb') # 打开用户基本信息文件
del_uesr_list = pickle.load(del_user_file) # 读取文件所有用户基本信息到del_user_list
del_user_file.close()
dir_del = str(del_uesr_list[del_username][0]) # 保存要删除用户目录的名字
del del_uesr_list[del_username] # 从字典del_user_list中删除用户输入的用户名为key的所有信息
os.rmdir(dir_del) # 删除目录
# print(del_uesr_list,type(del_uesr_list))
new_file = open('..\DB\usernew.db', 'wb') # 打开新的文件用于写入新用户字典信息
pickle.dump(del_uesr_list, new_file) # 将新的字典信息序列化后写入usernew.db文件
new_file.close() # 关闭文件
os.remove('..\db\user.db') # 将原文件删除
os.renames('..\db\usernew.db', '..\db\user.db')
logging.basicConfig(filename='timelog.txt', level=logging.INFO, format='%(asctime)s%(message)s',
datefmt='%m/%d/%Y %I:%M:%S %p')
logging.info('delete user %s' % del_username + '\n')
def lock_user():
print('' * 50)
lock_username = input('please input username you want to delete.')
confirm = input('please confirm? y[Y]')
if confirm == 'y' or confirm == 'Y':
os.chdir('..\db\')
lock_user_file = open('..\DB\user.db', 'rb') # 打开用户基本信息文件
lock_user_list = pickle.load(lock_user_file) # 读取文件所有用户基本信息到del_user_list
lock_user_file.close()
lock_user_list[lock_username][7] = '1'
new_file = open('..\DB\usernew.db', 'wb') # 打开新的文件用于写入新用户字典信息
pickle.dump(lock_uesr_list, new_file) # 将新的字典信息序列化后写入usernew.db文件
new_file.close() # 关闭文件
os.remove('..\db\user.db') # 将原文件删除
os.renames('..\db\usernew.db', '..\db\user.db') #新文件改名
logging.basicConfig(filename='timelog.txt', level=logging.INFO, format='%(asctime)s%(message)s',
datefmt='%m/%d/%Y %I:%M:%S %p')
logging.info('lock user %s' % lock_username + '\n')
def credit_set():
print('' * 50)
credit_user = input('please input the username you want to set credit:')
credit_amount = input('please input credit amount:')
credit_user_file = open('..\DB\user.db', 'rb') # 打开用户基本信息文件
credit_user_list = pickle.load(credit_user_file) # 读取文件所有用户基本信息到del_user_list
credit_user_file.close()
credit_user_list[credit_user][2] = credit_amount
new_file = open('..\DB\usernew.db', 'wb') # 打开新的文件用于写入新用户字典信息
pickle.dump(credit_user_list, new_file) # 将新的字典信息序列化后写入usernew.db文件
new_file.close() # 关闭文件
os.remove('..\db\user.db') # 将原文件删除
os.renames('..\db\usernew.db', '..\db\user.db') # 新文件改名
logging.basicConfig(filename='timelog.txt', level=logging.INFO, format='%(asctime)s%(message)s',
datefmt='%m/%d/%Y %I:%M:%S %p')
logging.info('user %s credit is set %s' % (credit_user,credit_amount) + '\n')
编辑界面上怎么找不到插入代码呢。还有很多待完善的地方,但急于申请后续课程的学习啊,没办法,先完成,后续再改善吧。
作业三 ATM的更多相关文章
- 个人作业三——ATM管理系统
一 作业信息 博客班级 https://edu.cnblogs.com/campus/ahgc/AHPU-se-JSJ18/ 作业要求 https://edu.cnblogs.com/campus/a ...
- Python-S13作业-day5-之 ATM
Python-S13作业-day5-之 ATM 需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 其实是两 ...
- JAVA作业三
(一)学习总结 1.阅读下面程序,分析是否能编译通过?如果不能,说明原因.应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Gr ...
- jQuery 作业三个按钮
作业三个按钮 <!--声明 文档--> <!DOCTYPE html> <!--定义字符集--> <html lang="zh-CN"&g ...
- 作业三:LINUX内核的启动过程
作业三:LINUX内核的启动过程 一.使用GDB跟踪内核从start_kernel到init进程启动(附实验截图) (一)使用自己的Linux系统环境搭建MenuOS的过程 下载内核源代码编译内核 c ...
- 20155303狄惟佳预备作业三Linux学习笔记
20155303狄惟佳预备作业三Linux学习笔记 初次接触Ubuntu系统以及Linux内核,了解了其产生的历史,从感性来讲,深深吸引我的是其中蕴含的珍贵的开源精神,以及Stallman等人对&qu ...
- 20165301 预备作业三:Linux安装及命令入门
预备作业三:Linux安装及命令入门 VirtualBox虚拟机的安装 在进行安装之前,原本以为有了娄老师的安装教程会是一件很容易的事情.万万没想到,在自己实际动手操作中,还是遇到了许多困难.通过与同 ...
- 機器學習基石(Machine Learning Foundations) 机器学习基石 作业三 课后习题解答
今天和大家分享coursera-NTU-機器學習基石(Machine Learning Foundations)-作业三的习题解答.笔者在做这些题目时遇到非常多困难,当我在网上寻找答案时却找不到,而林 ...
- Day5作业,商城+ATM机+后台管理
晚来了....东西太多,需要写的blog内容太多,re讲的渣渣,不明白为什么oldboy经常换老师,吐槽下吧,真心不爱了.... github地址在这:https://github.com/ccorz ...
随机推荐
- IP V4地址分类
IP V4地址 共分为五类: A类地址范围:1.0.0.1---126.255.255.254 B类地址范围:128.0.0.1---191.255.255.254 C类地址范围:192.0.0.1- ...
- 用CAGradientLayer实现渐变色动画
效果图: github:https://github.com/RinpeChen/CAGradientLayerBasicDemo
- PHP Cookies
PHP Cookies cookie 常用于识别用户. Cookie 是什么? cookie 常用于识别用户.cookie 是一种服务器留在用户计算机上的小文件.每当同一台计算机通过浏览器请求页面时, ...
- 单点登录CAS使用记(六):单点登出、单点注销
单点登出基本上没有啥配置 直接在原来logout的时候,重定向到Cas-Server的logout方法 @RequestSecurity @RequestMapping(value = "l ...
- JNDI--Java命名和目录接口
JNDI主要用于在容器中配置某些资源,让所有项目可以使用.JNDI可以提供: 1:数据库连接池. 自定义连接池 第三方连接池 Dbcp ...
- CClientDC
CClientDC(客户区设备上下文)用于客户区的输出,它在构造函数中封装了GetDC(),在析构函数中封装了ReleaseDC()函数.一般在响应非窗口重画消息(如键盘输入时绘制文本.鼠标绘图)绘图 ...
- extjs中grid中行内文本或图片居中显示
我是看了网上写的方法调试自己的代码来实现的,实现的方式是当加载store数据时改变grid的行样式,源码如下: html代码: <div id="weatherP_grid-body& ...
- Facebook和Google如何激发工程师的创造力
http://taiwen.lofter.com/post/664ff_ad8a15 今天终于“朝圣”了两个伟大的公司——Facebook和Google,对创造力和驱动力的来源有了更多的理解,尤其是对 ...
- ural 1348 Goat in the Garden 2
http://acm.timus.ru/problem.aspx?space=1&num=1348 #include <cstdio> #include <cstring&g ...
- C51与汇编混合编程详解
C51和汇编混合编程(1)-C语言中嵌入汇编 1.在 C文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ;Assembler Code Here #pragma ENDASM ...