一  需求

模拟实现一个ATM + 购物商城程序

  1. 额度 15000或自定义
  2. 实现购物商城,买东西加入 购物车,调用信用卡接口结账
  3. 可以提现,手续费5%
  4. 每月22号出账单,每月10号为还款日,过期未还,按欠款总额 万分之5 每日计息(暂时未做)
  5. 支持多账户登录
  6. 支持账户间转账
  7. 记录每月日常消费流水
  8. 提供还款接口
  9. ATM记录操作日志
  10. 提供管理接口,包括添加账户、用户额度,冻结账户等
  11. 用户认证用装饰器

二 代码实现

2.1 框架

 #项目名称:
ATM + 购物商城程序 #作者:
Terry #博客地址
https://www.cnblogs.com/Terrypython/ #实现功能
模拟实现一个ATM + 购物商城程序
额度 15000或自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
支持多账户登录,登录错误三次以后会有提示,是否继续,并且保存到日志里边
支持账户间转账
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器 #目录结构:
├── ATM
├── bin #入口程序目录
│ ├── __init__.py
│ └── atm.py #入口程序(启动程序)
├── conf #配置文件目录
│ ├── __init__.py
│ └── setting.py
├── core #程序核心目录
│ ├── __init__.py
│ ├── admincenter.py #管理模块
│ ├── authentication.py #认证模块
│ ├── creditcard.py #信用卡模块
│ ├── shopping.py #购物模块
├── database #程序数据库
│ ├── creditcard_dict #信用卡数据库
│ ├── creditcard_record #信用卡流水记录数据库
│ ├── details_tip #提示信息
│ ├── product_list #商城产品数据库
│ └── shopping_car #购物车数据库
│ ├── shopping_record #购物记录
│ └── users_dict #用户数据库
└── log
├── __init__.py
└── rz.py
├── README.md #运行说明:
见我的博客详解

README

2.2 启动模块(bin)

#__author__:小辉
#DATE:2018/7/3 import sys,os #程序主目录
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#添加环境变量
sys.path.append(BASE_DIR) from core import admincenter,shopping,authentication,creditcard while True:
print("\33[36;1m欢迎进入信用卡购物模拟程序\33[0m".center(50, "#"),
"\n 1 购物中心\n",
"2 信用卡中心\n",
"3 后台管理\n",
"q 退出程序\n")
choice_id = input("\33[34;0m请选择要进入项目\33[0m:")
if choice_id == "":
res = authentication.user_auth()
if res != None :
if res[0] == "True":# 认证模块返回的是True
current_user = res[1]#持有者姓名
shopping.Empty_shopping_car()
while True:
print("\33[36;1m欢迎进入购物中心\33[0m".center(50,"*"),
"\n 1 购物商场\n",
"2 查看购物车\n",
"3 购物结算\n",
"4 个人中心\n",
"b 返回\n")
choice_id = input("\33[34;0m选择要进入模式的ID\33[0m:")
if choice_id == "":
shopping.Shopping_mall()
elif choice_id == "":
shopping.Shopping_car()
elif choice_id == "":
shopping.Pay_shopping(current_user)
elif choice_id == "":
while True:
print("\33[33;1m个人中心\33[0m".center(50, "*"),
"\n1 购物历史记录\n"
"2 修改登录密码\n"
"3 修改个人信息\n"
"4 修改行用卡绑定\n"
"b 返回\n")
choice_id = input("\33[34;0m选择要进入的项目\33[0m:")
if choice_id == "":
shopping.Catcar_record(current_user)
elif choice_id == "":
shopping.Updata_password(current_user)
elif choice_id == "":
shopping.Updata_address(current_user)
elif choice_id == "":
shopping.Link_creditcard(current_user)
elif choice_id == "b":
break
else:
print("\33[31;0m输入的ID无效,请重新选择\33[0m")
elif choice_id == "b":
break
else:
print("\33[31;0m输入的ID无效,请重新选择\33[0m")
else:
print("您已经错误输入多次,还想继续尝试吗")
login_again=input('请输入您的选择:【c】继续/【b】退出')
if login_again=='c':
continue
elif login_again=='b':
break
else:
print('您输入的字符无效')
elif choice_id == "":
res = authentication.creditcard_auth()
if res != None:
if res[0] == "True":
current_creditcard= res[1]
while True:
print("\33[36;1m信用卡中心\33[0m".center(50, "*"),
"\n1 我的信用卡\n"
"2 提现\n"
"3 转账\n"
"4 还款\n"
"5 流水记录\n"
"b 返回\n")
choice_id = input("\33[34;0m选择要进入项目\33[0m:")
if choice_id == "":
creditcard.My_creditcard(current_creditcard)
elif choice_id == "":
creditcard.Cash_advance(current_creditcard)
elif choice_id == "":
creditcard.Transfer(current_creditcard)
elif choice_id == "":
creditcard.Repayment(current_creditcard)
elif choice_id == "":
creditcard.Catcard_record(current_creditcard)
elif choice_id == "b":
break
else:
print("\33[31;0m输入的ID无效,请重新选择\33[0m")
elif choice_id == "":
res = authentication.admincenter_auth()
if res != None:
while True:
print("\33[36;1m管理中心\33[0m".center(50, "*"),
"\n1 创建账号\n"
"2 锁定账号\n"
"3 解锁账号\n"
"4 发行信用卡\n"
"5 冻结信用卡\n"
"6 解冻信用卡\n"
"7 提升信用卡额度\n"
"b 返回\n")
choice_id = input("\33[34;0m选择要进入模式的ID\33[0m:")
if choice_id == "":
admincenter.User_create()
elif choice_id == "":
admincenter.Lock_user()
elif choice_id == "":
admincenter.Unlock_user()
elif choice_id == "":
admincenter.Creditcard_create()
elif choice_id == "":
admincenter.Lock_creditcard()
elif choice_id == "":
admincenter.Unlock_creditcard()
elif choice_id == "":
admincenter.Updata_limit()
elif choice_id == "b":
break
else:
print("\33[31;0m输入的ID无效,请重新选择\33[0m") elif choice_id == "q":
break else:
print("\33[31;0m输入的ID无效,请重新选择\33[0m")

atm.py

2.3 核心模块(core)

2.3.1 购物模块(shopping)
#__author__:小辉
#DATE:2018/7/4 import json,os,time
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) '''数据库文件相对路径'''
__db_product = BASE_DIR + r"\db\product_list"
__db_shoping_car = BASE_DIR + r"\db\shopping_car"
__db_users_dict = BASE_DIR + r"\db\users_dict"
__db_creditcard_dict = BASE_DIR + r"\db\creditcard_dict"
__db_shopping_record = BASE_DIR + r"\db\shopping_record"
__db_creditcard_record = BASE_DIR + r"\db\creditcard_record" '''购物商城'''
def Shopping_mall():
shopping_list,pro_list = [],[]
with open(__db_product, "r", encoding="utf-8") as f_product:
for item in f_product:
pro_list.append(item.strip("\n").split())
def pro_inf():
print("编号\t商品\t\t价格")
for index, item in enumerate(pro_list):
print("%s\t\t%s\t\t%s" % (index, item[0], item[1]))
while True:
print(("\33[32;0m目前商城在售的商品信息\33[0m").center(40, "-"))
pro_inf()
choice_id = input("\n\33[34;0m选择要购买的商品编号 【购买 ID】/【返回 b】\33[0m:")
if choice_id.isdigit():
choice_id = int(choice_id)
if choice_id < len(pro_list) and choice_id >=0:
pro_item = pro_list[choice_id]
print("\33[31;0m商品%s加入购物车 价格%s\33[0m"%(pro_item[0],pro_item[1]))
shopping_list.append(pro_item)#商品在shopping__list当中 else:
print("\33[31;0m错误:没有相应的编号 请重新输入:\33[0m\n")
elif choice_id == "b":
with open(__db_shoping_car, "r+") as f_shopping_car:
list = json.loads(f_shopping_car.read())
list.extend(shopping_list)
f_shopping_car.seek(0)
f_shopping_car.truncate(0)
list = json.dumps(list)
f_shopping_car.write(list)
break
else:
print("\33[31;0m错误:没有相应的编号 请重新输入:\33[0m\n") '''清空购物车'''
def Empty_shopping_car():
with open(__db_shoping_car, "w") as f_shopping_car:
list = json.dumps([])
f_shopping_car.write(list) '''购物车'''
def Shopping_car():
while True:
with open(__db_shoping_car, "r+") as f_shopping_car:
list = json.loads(f_shopping_car.read())
sum = 0
print("\33[32;0m购物车信息清单\33[0m".center(40,"-"))
for index,item in enumerate(list):
print(index,item[0],item[1])
sum +=int(item[1])
print("\33[31;1m商品总额共计: %s\33[0m"%(sum))
if_buy = input("\n\33[34;0m选择要进行的操作 返回【b】/清空【f】\33[0m:")
if if_buy == "b" :
break
if if_buy == "f":
Empty_shopping_car() '''购物记录'''
def Shoppingcar_record(current_user,value):
with open(__db_shopping_record, "r+") as f_shoppingcar_record:
record_dict = json.loads(f_shoppingcar_record.read())
month = time.strftime('%Y-%m-%d', time.localtime())
times = time.strftime("%H:%M:%S")
if str(current_user) not in record_dict.keys():
record_dict[current_user]={month:{times:value}}
else:
if month not in record_dict[current_user].keys():
record_dict[current_user][month] = {times: value}
else:
record_dict[current_user][month][times] = value
dict = json.dumps(record_dict)
f_shoppingcar_record.seek(0)
f_shoppingcar_record.truncate(0)
f_shoppingcar_record.write(dict) '''查看购物记录'''
def Catcar_record(current_user):
while True:
print("\33[32;0m用户 %s 购物记录\33[0m".center(40, "-")%(current_user))
with open(__db_shopping_record, "r+") as f_shoppingcar_record:
record_dict = json.loads(f_shoppingcar_record.read())
if current_user not in record_dict.keys():
print("\33[31;0m用户 %s 还没有进行过消费\33[0m\n" % (current_user))
else:
data = sorted(record_dict[current_user])#排序
for d in data:
times = sorted(record_dict[current_user][d])
for t in times:
print("\33[31;0m【时间】 %s %s\33[0m"%(d, t))
items =record_dict[current_user][d][t]
print("\33[31;0m【商品】 【价格】\33[0m")
for v in items:
print("\33[31;0m %s\t\t%s\33[0m"%(v[0],v[1]))
if_back = input("\n\33[34;0m是否返回 返回【b】\33[0m:")
if if_back == "b":
break #信用卡记录
def Creditcard_record(creditcard,value):
with open(__db_creditcard_record, "r+") as f_creditcard_record:
record_dict = json.loads(f_creditcard_record.read())
month = time.strftime('%Y-%m-%d', time.localtime())
times = time.strftime("%H:%M:%S")
if str(creditcard) not in record_dict.keys():
record_dict[creditcard]={month:{times:value}}
else:
if month not in record_dict[creditcard].keys():
record_dict[creditcard][month] = {times: value}
else:
record_dict[creditcard][month][times] = value
dict = json.dumps(record_dict)
f_creditcard_record.seek(0)
f_creditcard_record.truncate(0)
f_creditcard_record.write(dict) '''信用卡密码认证'''
def Auth_creditcard(creditcard):
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
passwd = input("\33[34;0m当前信用卡【%s】 请输入支付密码:\33[0m:"%(creditcard))
if passwd == creditcard_dict[creditcard]["password"]:
return True
else:
print("\33[31;0m密码输入错误,支付失败\33[0m") '''购物结算'''
def Pay_shopping(current_user):
while True:
sum = 0
print("\33[32;0m购物结算\33[0m".center(40, "-"))
with open(__db_shoping_car, "r+") as f_shopping_car:
list = json.loads(f_shopping_car.read())
for item in list:
sum += int(item[1])
if_pay = input("\n\n\33[34;0m当前商品总额:%s 是否进行支付 确定【y】/返回【b】\33[0m:"%(sum))
if if_pay == "y":
with open(__db_users_dict, "r+") as f_users_dict:
users_dict = json.loads(f_users_dict.read())
creditcard=users_dict[current_user]["creditcard"]
if creditcard == 0:
print("\33[31;0m账号 %s未绑定信用卡,请到个人中心里修改信用卡绑定\33[0m\n"%(current_user))
else:
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
limit = creditcard_dict[creditcard]["limit"]
limit_new = limit - sum
if limit_new >=0:
res = Auth_creditcard(creditcard) #信用卡认证
if res == True:#认证成功
creditcard_dict[creditcard]["limit"]=limit_new
dict=json.dumps(creditcard_dict)
f_creditcard_dict.seek(0)
f_creditcard_dict.truncate(0)
f_creditcard_dict.write(dict)
value = "购物支付 %s"%(sum)
print("\33[31;om支付成功,当前余额 %s元\33[0m\n"%(limit_new))
Shoppingcar_record(current_user,list)
Creditcard_record(creditcard, value)
Empty_shopping_car()
else:
print("\33[31;0m当前信用卡额度 %s元 不足以支付购物款 可绑定其他信用卡支付\33[0m\n"%(limit))
if if_pay == "b":
break '''修改信用卡绑定'''
def Link_creditcard(current_user):
while True:
print("\33[32;0m修改信用卡绑定\33[0m".center(40, "-"))
with open(__db_users_dict, "r+") as f_users_dict:
users_dict = json.loads(f_users_dict.read())
creditcard = users_dict[current_user]["creditcard"]
if creditcard == 0 :
print("当前账号: \t%s"%(current_user))
print("信用卡绑定:\33[31;0m未绑定\33[0m\n")
else:
print("当前账号: \t%s" %(current_user))
print("绑定的信用卡: %s\n"%(creditcard))
if_updata = input("\33[34;0m是否要修改信用卡绑定 确定【y】/返回【b】\33[0m:")
if if_updata == "y":
creditcard_new = input("\33[34;0m输入新的信用卡卡号(6位数字)\33[0m:")
if creditcard_new.isdigit() and len(creditcard_new) ==6:
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
if creditcard_new in creditcard_dict.keys():
users_dict[current_user]["creditcard"]=creditcard_new
dict = json.dumps(users_dict)
f_users_dict.seek(0)
f_users_dict.truncate(0)
f_users_dict.write(dict)
print("\33[31;1m信用卡绑定成功\33[0m\n")
else:
print("\33[31;0m输入信用卡卡号不存在(未发行)\33[0m\n")
else:
print("\33[31;0m输入信用卡格式错误\33[0m\n")
if if_updata == "b":
break '''修改登录密码'''
def Updata_password(current_user):
while True:
print("\33[32;0m修改登录密码\33[0m".center(40, "-"))
print("当前账号:\t%s\n当前密码:\t**\n"%(current_user))
if_updata = input("\33[34;0m是否要修改 % s登录密码 确定【y】/返回【b】\33[0m:"%(current_user))
if if_updata == "y":
with open(__db_users_dict, "r+") as f_users_dict:
users_dict = json.loads(f_users_dict.read())
password = users_dict[current_user]["password"]
old_pwd = input("\33[34;0m输入原来的密码\33[0m:")
if old_pwd == password:
new_pwd = input("\33[34;0m输入新的密码\33[0m:")
agin_pwd = input("\33[34;0m再输入新的密码\33[0m:")
if new_pwd == agin_pwd:
users_dict[current_user]["password"]=new_pwd
dict = json.dumps(users_dict)
f_users_dict.seek(0)
f_users_dict.truncate(0)
f_users_dict.write(dict)
print("\33[31;1m密码修改成功\33[0m\n")
else:
print("\33[31;0m两次密码不一致\33[0m\n")
else:
print("\33[31;0m密码不正确\33[0m\n")
if if_updata == "b":
break '''修改收货地址'''
def Updata_address(current_user):
while True:
print("\33[32;0m修改个人资料\33[0m".center(40, "-"))
with open(__db_users_dict, "r+") as f_users_dict:
users_dict = json.loads(f_users_dict.read())
address = users_dict[current_user]["address"]
print("当前账号:\t%s\n当前收货地址:\t%s\n" % (current_user,address))
if_updata = input("\33[34;0m是否要修改 % s收货地址 确定【y】/返回【b】\33[0m:" % (current_user))
if if_updata == "y":
new_address = input("\33[34;0m输入新的收货地址\33[0m:")
users_dict[current_user]["address"]=new_address
dict = json.dumps(users_dict)
f_users_dict.seek(0)
f_users_dict.truncate(0)
f_users_dict.write(dict)
print("\33[31;1m收货地址修改成功\33[0m\n")
if if_updata == "b":
break

shopping.py

2.3.2信用卡模块(creditcard)
#__author__:小辉
#DATE:2018/7/4 import json,os,datetime,time
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) '''数据库文件相对路径'''
__db_creditcard_dict = BASE_DIR + r"\db\creditcard_dict"
__db_detail_tip = BASE_DIR + r"\db\detail_tip"
__db_creditcard_record = BASE_DIR + r"\db\creditcard_record" '''取现需知'''
def detail_tip():
with open(__db_detail_tip,"r",encoding="utf-8") as f_detail_tip:
print(f_detail_tip.read()) '''我的信用卡'''
def My_creditcard(current_creditcard):
while True:
print("\33[32;0m我的信用卡信息\33[0m".center(40, "-"))
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
print("卡号:\t【%s】\n额度:\t【¥%s】\n提现额度:\t【¥%s】\n持卡人:\t【%s】\n"%(current_creditcard,
creditcard_dict[current_creditcard]["limit"],creditcard_dict[current_creditcard]["limitcash"],
creditcard_dict[current_creditcard]["personinfo"]))
if_back = input("\33[34;0m是否退出 返回【b】\33[0m:")
if if_back == "b":
break '''信用卡流水记录'''
def Creditcard_record(creditcard,value):
with open(__db_creditcard_record, "r+") as f_creditcard_record:
record_dict = json.loads(f_creditcard_record.read())
month = time.strftime('%Y-%m-%d', time.localtime())
times = time.strftime("%H:%M:%S")
if str(creditcard) not in record_dict.keys():
record_dict[creditcard]={month:{times:value}}
else:
if month not in record_dict[creditcard].keys():
record_dict[creditcard][month] = {times: value}
else:
record_dict[creditcard][month][times] = value
dict = json.dumps(record_dict)
f_creditcard_record.seek(0)
f_creditcard_record.truncate(0)
f_creditcard_record.write(dict) '''提现'''
def Cash_advance(current_creditcard):
while True:
print("\33[32;0m提现\33[0m".center(40, "-"))
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
limit = creditcard_dict[current_creditcard]["limit"]
limitcash = creditcard_dict[current_creditcard]["limitcash"]
print("信用卡号:\t【%s】\n提现额度:\t【¥%s】" % (current_creditcard, limitcash))
if limit >= limitcash:
print("可提现金额:\t【¥%s】\n" % (limitcash))
detail_tip()
if_adv = input("\n\33[34;0m是否进行提现 确定【y】/返回【b】\33[0m:")
if if_adv == "y":
cash = input("\33[34;0m输入要提现的金额 收取%5手续费\33[0m:")
if cash.isdigit():
cash=int(cash)
if cash != 0:
if cash <= limitcash:
limitcash = limitcash - int(cash*1.05)
limit = limit - int(cash*1.05)
creditcard_dict[current_creditcard]["limit"]=limit
creditcard_dict[current_creditcard]["limitcash"] = limitcash
f_creditcard_dict.seek(0)
f_creditcard_dict.truncate(0)
dict = json.dumps(creditcard_dict)
f_creditcard_dict.write(dict)
record = "\33[31;1m提现¥%s 手续费¥%s\33[0m"%(cash,int(cash*0.05))
print(record,"\n")
Creditcard_record(current_creditcard,record)
else:
print("\33[31;0m超出信用卡提现额度\33[0m\n")
else:
print("\33[31;0m提现额度不能为空\33[0m\n")
if if_adv == "b":
break if limit < limitcash:
print("可提现金额:\t¥【%s】\n" % (int(limit*0.95)))
detail_tip()
if_adv = input("\n\33[34;0m是否进行提现 确定【y】/返回【b】\33[0m:")
if if_adv == "y":
cash = input("\33[34;0m输入要提现的金额 收取%5手续费\33[0m:")
if cash.isdigit():
cash = int(cash)
if cash != 0:
if cash <= int(limit*0.95):
limit = limit - int(cash * 1.05)
limitcash = limitcash - int(cash * 1.05)
creditcard_dict[current_creditcard]["limitcash"] = limitcash
creditcard_dict[current_creditcard]["limit"] = limit
f_creditcard_dict.seek(0)
f_creditcard_dict.truncate(0)
dict = json.dumps(creditcard_dict)
f_creditcard_dict.write(dict)
record= "\33[31;1m提现¥%s 手续费¥%s\33[0m" % (cash, int(cash * 0.05))
print(record,"\n")
Creditcard_record(current_creditcard, record)
else:
print("\33[31;0m信用卡没有足够的额度去支付提现,请去【我的信用卡】查看当前额度\33[0m\n")
else:
print("\33[31;0m提现额度不能为空\33[0m\n")
if if_adv == "b":
break '''转账'''
def Transfer(current_creditcard):
while True:
print("\33[32;0m转账\33[0m".center(40, "-"))
if_trans = input("\n\33[34;0m是否进行转账 确定【y】/返回【b】\33[0m:")
if if_trans == "y":
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
current_limit = creditcard_dict[current_creditcard]["limit"]
transfer_creditcard = input("\33[34;0m输入转账的银行卡卡号\33[0m:")
if transfer_creditcard.isdigit():
if len(transfer_creditcard) == 6:
if transfer_creditcard in creditcard_dict.keys():
again_creditcard = input("\33[34;0m再次确认转账的银行卡卡号\33[0m:")
if transfer_creditcard == again_creditcard:
transfer_cash = input("\33[34;0m输入转账的金额\33[0m:")
if transfer_cash.isdigit():
transfer_cash=int(transfer_cash)
if transfer_cash <= current_limit:
transfer_limit = creditcard_dict[current_creditcard]["limit"]
creditcard_dict[current_creditcard]["limit"] = current_limit-transfer_cash
creditcard_dict[transfer_creditcard]["limit"] = transfer_limit+transfer_cash
f_creditcard_dict.seek(0)
f_creditcard_dict.truncate(0)
dict = json.dumps(creditcard_dict)
f_creditcard_dict.write(dict)
record="\33[31;1m转账卡号 %s 金额 ¥%s 转账成功\33[0m"%(transfer_creditcard,transfer_cash)
print(record,"\n")
Creditcard_record(current_creditcard, record)
else:
print("\33[31;0m金额不足 转账失败\33[0m\n")
else:
print("\33[31;0m输入金额有误\33[0m\n")
else:
print("\33[31;0m两次输入银行卡卡号不一致\33[0m\n")
else:
print("\33[31;0m输入银行卡不存在\33[0m\n")
else:
print("\33[31;0m输入银行卡有误\33[0m\n")
else:
print("\33[31;0m输入银行卡有误\33[0m\n")
if if_trans == "b":
break '''还款'''
def Repayment(current_creditcard):
while True:
print("\33[32;0m还款\33[0m".center(40, "-"))
if_repay = input("\n\33[34;0m是否进行还款 确定【y】/返回【b】\33[0m:")
if if_repay == "y":
repay_cash = input("\33[34;0m输入要还款的金额\33[0m:")
if repay_cash.isdigit():
repay_cash=int(repay_cash)
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
limit = creditcard_dict[current_creditcard]["limit"]
limit = limit+repay_cash
creditcard_dict[current_creditcard]["limit"]=limit
f_creditcard_dict.seek(0)
f_creditcard_dict.truncate(0)
dict = json.dumps(creditcard_dict)
f_creditcard_dict.write(dict)
record="\33[31;1m信用卡 %s 还款金额 ¥%s 还款成功\33[0m" % (current_creditcard, repay_cash)
print(record,"\n")
Creditcard_record(current_creditcard, record)
else:
print("\33[31;0m输入金额格式有误\33[0m\n")
if if_repay == "b":
break '''查看信用卡流水'''
def Catcard_record(current_creditcard):
while True:
print("\33[32;0m信用卡流水单\33[0m".center(40, "-"))
with open(__db_creditcard_record, "r+") as f_creditcard_record:
f_creditcard_record.seek(0)
record_dict = json.loads(f_creditcard_record.read())
#print(record_dict)
print("\33[34;0m流水单日期\33[0m:")
if current_creditcard in record_dict.keys():
for key in record_dict[current_creditcard]:
print(key)
date = input("\n\33[34;0m流水单查询 返回【b】 / 输入流水单的日期【2000-01-01】\33[0m:")
if date == "b":
break
if date in record_dict[current_creditcard].keys():
keys = sorted(record_dict[current_creditcard][date])
print("\33[31;1m当前信用卡【%s】 交易记录-》》\33[0m"%(current_creditcard))
for key in keys:
print("\33[31;1m时间:%s %s\33[0m"%(key,record_dict[current_creditcard][date][key]))
print("")
else:
print("\33[31;0m输入的日期有误\33[0m\n")
else:
print("\33[31;0m信用卡 %s 还没有进行过消费\33[0m\n"%(current_creditcard))
break

creditcard.py

2.3.3 认证模块(authentication)
#__author__:小辉
#DATE:2018/7/4 import json
import os from ATM.log import rz BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) '''数据库文件相对路径'''
__db_users_dict = BASE_DIR + r"\db\users_dict"
__db_creditcard_dict = BASE_DIR + r"\db\creditcard_dict" '''认证装饰器'''
def auth(auth_type):#带参数的装饰器
def outer_wrapper(func):
if auth_type == "user_auth":
def wrapper():
res = func()
count=0
while True:
if count>2:
# new_logger= rz.loggers('account or password mistake at least three times')
new_logger=rz.loggers()
new_logger.warning('account or password mistake at least three times')
return False,username
username = input("\33[34;0m请输入用户名:\33[0m")
password = input("\33[34;0m请输入密码:\33[0m")
if len(username.strip()) > 0:
with open(__db_users_dict, "r+",encoding='utf8') as f_users_dict:#打开文件,可以不用f.close()语句 r+从头开始读,写的内容在文件内容之后
users_dict = json.loads(f_users_dict.read())
if username in users_dict.keys():# 查操作
if password == users_dict[username]["password"]:
if users_dict[username]["locked"] == 0:
print("\33[31;0m用户 %s 认证成功\33[0m"%(username))
return res,username
else:
print("\33[31;0m用户 %s 已经被锁定 认证失败\33[0m" % (username))
else:
print("\33[31;0m输入的密码不匹配 认证失败\33[0m")
else:
print("\33[31;0m输入的用户名不存在 认证失败\33[0m")
else:
print("\33[31;0m输入的用户名为空 认证失败\33[0m")
count+=1
return wrapper if auth_type == "creditcard_auth":
def wrapper():
res = func()
creditcard = input("\33[34;0m输入信用卡卡号(6位数字):\33[0m")
password = input("\33[34;0m输入信用卡的密码:\33[0m")
if len(creditcard.strip()) > 0:
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
if creditcard in creditcard_dict.keys():
if password == creditcard_dict[creditcard]["password"]:
if creditcard_dict[creditcard]["locked"] == 0:
print("\33[31;0m信用卡 %s 认证成功\33[0m" % (creditcard))
return res,creditcard
else:
print("\33[31;0m信用卡 %s 已经被冻结 认证失败\33[0m" % (creditcard))
else:
print("\33[31;0m输入的密码不匹配 认证失败\33[0m")
else:
print("\33[31;0m输入的信用卡卡号不存在 认证失败\33[0m")
else:
print("\33[31;0m输入的信用卡卡号为空 认证失败\33[0m")
return wrapper if auth_type == "admincenter_auth":
def wrapper():
res = func()
admincenter_dict ={"admin":"admin"}
username = input("\33[34;0m请输入管理用户名:\33[0m")
password = input("\33[34;0m请输入管理密码:\33[0m")
if len(username.strip()) > 0:
if username in admincenter_dict.keys():
if password == admincenter_dict[username]:
print("\33[31;0m管理用户 %s 认证成功\33[0m" % (username))
return res, username
else:
print("\33[31;0m输入的密码不匹配 认证失败\33[0m")
else:
print("\33[31;0m输入的用户名不存在 认证失败\33[0m")
else:
print("\33[31;0m输入的用户名为空 认证失败\33[0m") return wrapper
return outer_wrapper '''用户登录认证'''
@auth(auth_type="user_auth")
def user_auth():
print("\33[32;0m用户登录认证\33[0m".center(40,"-"))
return "True" '''信用卡认证'''
@auth(auth_type="creditcard_auth")
def creditcard_auth():
print("\33[32;0m信用卡登录认证\33[0m".center(40,"-"))
return "True" '''后台管理认证'''
@auth(auth_type="admincenter_auth")
def admincenter_auth():
print("\33[32;0m后台管理登录认证\33[0m".center(40,"-"))
return "True"

authentication.py

2.3.4 管理员模块(admincenter)
#__author__:小辉
#DATE:2018/7/4 import os,json BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) '''数据库文件相对路径'''
__db_users_dict = BASE_DIR + r"\db\users_dict"
__db_creditcard_dict = BASE_DIR + r"\db\creditcard_dict" '''创建用户'''
def User_create(address="None",locked=0,creditcard=0):
while True:
print("开始创建用户".center(50,"-"))
with open(__db_users_dict, "r+") as f_users_dict:
users_dict = json.loads(f_users_dict.read())
for key in users_dict:
print("系统已有用户 【%s】" % (key))
if_create = input("\n\33[34;0m是否创建新的用户 确定【y】/返回【b】\33[0m:")
if if_create == "y":
username = input("\33[34;0m输入要添加账户的用户名:\33[0m")
password = input("\33[34;0m输入添加账户的密码:\33[0m")
if username not in users_dict.keys():
if len(username.strip()) > 0:
if len(password.strip()) > 0:
users_dict[username] = {"username":username,"password":password,"creditcard":creditcard,"address":address,
"locked":locked}
dict = json.dumps(users_dict)
f_users_dict.seek(0)
f_users_dict.truncate(0)
f_users_dict.write(dict)
print("\33[31;1m创建用户 %s 成功\33[0m\n"%(username))
else:
print("\33[31;0m输入的密码为空\33[0m\n")
else:
print("\33[31;0m输入的用户名为空\33[0m\n")
else:
print("\33[31;0m用户名 %s 已经存在\33[0m\n"%(username))
if if_create == "b":
break '''发行信用卡'''
def Creditcard_create(limit=15000,locked=0):
while True:
print("发行信用卡".center(50, "-"))
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
for key in creditcard_dict:
print("系统已有信用卡 【%s】 \t持卡人 【%s】" % (key,creditcard_dict[key]["personinfo"]))
if_create = input("\n\33[34;0m是否发行新的信用卡 确定【y】/返回【b】\33[0m:")
if if_create == "y":
creditcard = input("\33[34;0m输入要发行信用卡卡号(6位数字):\33[0m")
if creditcard not in creditcard_dict.keys():
if creditcard.isdigit() and len(creditcard) == 6:
password = input("\33[34;0m输入要发行信用卡的密码:\33[0m")
if len(password.strip()) > 0:
personinfo = input("\33[34;0m输入要发行信用卡申请人:\33[0m")
if len(personinfo.strip()) > 0:
creditcard_dict[creditcard] = {"creditcard":creditcard, "password":password, "personinfo":personinfo,
"limit":limit,"limitcash":limit//2,"locked":locked,"deflimit":limit}
dict = json.dumps(creditcard_dict)
f_creditcard_dict.seek(0)
f_creditcard_dict.truncate(0)
f_creditcard_dict.write(dict)
print("\33[31;0m发行信用卡 %s 成功 额度 %s\33[0m\n"%(creditcard,limit))
else:
print("\33[31;0m信用卡申请人不能为空\33[0m\n")
else:
print("\33[31;0m输入的密码为空\33[0m\n")
else:
print("\33[31;0m信用卡 %s 卡号不符合规范\33[0m\n" % (creditcard))
else:
print("\33[31;0m信用卡 %s 已经存在\33[0m\n" % (creditcard))
if if_create == "b":
break '''锁定用户'''
def Lock_user():
while True:
print("\33[32;0m锁定用户\33[0m".center(50, "-"))
with open(__db_users_dict, "r+") as f_users_dict:
users_dict = json.loads(f_users_dict.read())
for key in users_dict:
if users_dict[key]["locked"] == 0:
print("系统用户 【%s】\t\t锁定状态:【未锁定】"%(key))
else:
print("系统用户 【%s】\t\t锁定状态:\33[7m【已锁定】\33[0m" % (key))
if_lock = input("\n\33[34;0m是否进行用户锁定 确定【y】/返回【b】\33[0m:")
if if_lock == "y":
lock_user = input("\33[34;0m输入要锁定的用户名\33[0m:")
if lock_user in users_dict.keys():
if users_dict[lock_user]["locked"] == 0:
users_dict[lock_user]["locked"] = 1
dict = json.dumps(users_dict)
f_users_dict.seek(0)
f_users_dict.truncate(0)
f_users_dict.write(dict)
print("\33[31;1m用户 %s 锁定成功\33[0m\n" % (lock_user))
else:
print("\33[31;0m用户 %s 锁定失败 之前已经被锁定\33[0m\n" % (lock_user))
else:
print("\33[31;0m用户 %s 不存在\33[0m\n"%(lock_user))
if if_lock == "b":
break '''解锁用户'''
def Unlock_user():
while True:
print("\33[32;0m解锁用户\33[0m".center(50, "-"))
with open(__db_users_dict, "r+") as f_users_dict:
users_dict = json.loads(f_users_dict.read())
for key in users_dict:
if users_dict[key]["locked"] == 0:
print("系统用户 【%s】\t\t锁定状态:【未锁定】" % (key))
else:
print("系统用户 【%s】\t\t锁定状态:\33[7m【已锁定】\33[0m" % (key))
if_lock = input("\n\33[34;0m是否进行用户解锁 确定【y】/返回【b】\33[0m:")
if if_lock == "y":
unlock_user = input("\33[34;0m输入要解锁的用户名\33[0m:")
if unlock_user in users_dict.keys():
if users_dict[unlock_user]["locked"] == 1:
users_dict[unlock_user]["locked"] = 0
dict = json.dumps(users_dict)
f_users_dict.seek(0)
f_users_dict.truncate(0)
f_users_dict.write(dict)
print("\33[31;1m用户 %s 解锁成功\33[0m\n" % (unlock_user))
else:
print("\33[31;0m用户 %s 解锁失败 用户未被锁定\33[0m\n" % (unlock_user))
else:
print("\33[31;0m用户 %s 不存在\33[0m\n"%(unlock_user))
if if_lock == "b":
break '''冻结信用卡'''
def Lock_creditcard():
while True:
print("\33[32;0m冻结信用卡\33[0m".center(50, "-"))
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
for key in creditcard_dict:
if creditcard_dict[key]["locked"] == 0:
print("信用卡 【%s】\t\t冻结状态:【未冻结】" % (key))
else:
print("信用卡 【%s】\t\t冻结状态:\33[7m【已冻结】\33[0m" % (key))
if_Unlock = input("\n\33[34;0m是否进行信用卡冻结 确定【y】/返回【b】\33[0m:")
if if_Unlock == "y":
creditcard = input("\33[34;0m输入要冻结的信用卡卡号\33[0m:")
if creditcard in creditcard_dict.keys():
if creditcard_dict[creditcard]["locked"] == 0:
creditcard_dict[creditcard]["locked"] = 1
dict = json.dumps(creditcard_dict)
f_creditcard_dict.seek(0)
f_creditcard_dict.truncate(0)
f_creditcard_dict.write(dict)
print("\33[31;1m信用卡 %s 冻结成功\33[0m\n" % (creditcard))
else:
print("\33[31;0m信用卡 %s 冻结失败 之前已经被冻结\33[0m\n" % (creditcard))
else:
print("\33[31;0m信用卡 %s 不存在\33[0m\n" %(creditcard))
if if_Unlock == "b":
break '''解冻信用卡'''
def Unlock_creditcard():
while True:
print("\33[32;0m解冻信用卡\33[0m".center(50, "-"))
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
for key in creditcard_dict:
if creditcard_dict[key]["locked"] == 0:
print("信用卡 【%s】\t\t冻结状态:【未冻结】" % (key))
else:
print("信用卡 【%s】\t\t冻结状态:\33[7m【已冻结】\33[0m" % (key))
if_Unlock = input("\n\33[34;0m是否进行信用卡解冻 确定【y】/返回【b】\33[0m:")
if if_Unlock == "y":
creditcard = input("\33[34;0m输入要解冻的信用卡卡号\33[0m:")
if creditcard in creditcard_dict.keys():
if creditcard_dict[creditcard]["locked"] == 1:
creditcard_dict[creditcard]["locked"] = 0
dict = json.dumps(creditcard_dict)
f_creditcard_dict.seek(0)
f_creditcard_dict.truncate(0)
f_creditcard_dict.write(dict)
print("\33[31;1m信用卡 %s 解冻成功\33[0m\n" % (creditcard))
else:
print("\33[31;0m信用卡 %s 解冻失败 之前未被冻结\33[0m\n" % (creditcard))
else:
print("\33[31;0m信用卡 %s 不存在\33[0m\n" % (creditcard))
if if_Unlock == "b":
break '''修改信用卡额度'''
def Updata_limit():
while True:
print("\33[32;0m修改信用卡额度\33[0m".center(70, "-"))
with open(__db_creditcard_dict, "r+") as f_creditcard_dict:
creditcard_dict = json.loads(f_creditcard_dict.read())
for key in creditcard_dict:
limitcash = creditcard_dict[key]["limitcash"]
print("信用卡 【%s】\t目前可用额度:【¥%s】\t取现额度:【¥%s】" %
(key,creditcard_dict[key]["limit"],limitcash))
if_Updata = input("\n\33[34;0m是否进行信用卡额度调整 确定【y】/返回【b】\33[0m:")
if if_Updata == "y":
creditcard = input("\33[34;0m输入要修改额度的信用卡卡号\33[0m:")
if creditcard in creditcard_dict.keys():
limit = input("\33[34;0m输入额度修改后的金额(至少¥5000)\33[0m:")
if limit.isdigit():
limit_default = creditcard_dict[creditcard]["deflimit"]
limit = int(limit)
if limit >=5000:
updata = limit - limit_default
creditcard_dict[creditcard]["limit"] +=updata
creditcard_dict[creditcard]["limitcash"] += updata//2
creditcard_dict[creditcard]["deflimit"]=limit
dict = json.dumps(creditcard_dict)
f_creditcard_dict.seek(0)
f_creditcard_dict.truncate(0)
f_creditcard_dict.write(dict)
print("\33[31;1m信用卡 %s 额度修改成功 额度 %s \33[0m\n" % (creditcard,limit))
else:
print("\33[31;0m输入金额 ¥%s 小于¥5000\33[0m\n" % (limit))
else:
print("\33[31;0m输入金额 ¥%s 格式错误\33[0m\n" % (limit))
else:
print("\33[31;0m信用卡 【%s】 不存在\33[0m\n" % (creditcard))
if if_Updata == "b":
break

admincenter.py

2.4 日志模块(log)

#__author__:小辉
#DATE:2018/7/5
#__author__:小辉
#DATE:2018/7/5 import os,logging
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
__db_logger_dict=BASE_DIR+r"\db\logger_dict" def loggers():
logger = logging.getLogger()
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler(__db_logger_dict)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)
return logger

rz.py

2.5 db数据库(db)

2.5.1 用户数据库(user_dict)
{"zhaosi": {"password": "", "locked": 0, "username": "zhaosi", "creditcard": 0, "address": "None"}, "wangwu": {"password": "", "locked": 0, "username": "wangwu", "creditcard": 0, "address": "None"}, "laoqiqi": {"password": "", "locked": 1, "username": "laoqiqi", "creditcard": 0, "address": "None"}, "Terry": {"password": "", "locked": 0, "username": "Terry", "creditcard": 0, "address": "None"}, "zhangsan": {"password": "", "locked": 0, "username": "zhangsan", "creditcard": "", "address": "\u4e2d\u539f\u5de5\u5b66\u9662"}}

user_dict

2.5.2 信用卡数据库(credictcard_dict)
{"": {"locked": 0, "deflimit": 15000, "personinfo": "\u5218\u96e8\u6674", "creditcard": "", "password": "", "limit": 15000, "limitcash": 7500}, "": {"locked": 0, "deflimit": 15000, "personinfo": "\u5929\u68da\u5143\u5e05", "creditcard": "", "password": "", "limit": 16288, "limitcash": 7500}, "": {"locked": 1, "deflimit": 15000, "personinfo": "\u94f6\u89d2\u5927\u738b", "creditcard": "", "password": "", "limit": 13696, "limitcash": 7500}, "": {"locked": 0, "deflimit": 20000, "personinfo": "\u5218\u5c0f\u8f89", "creditcard": "", "password": "", "limit": 13596, "limitcash": 7480}}

credictcard_dict

2.5.3 商品信息数据库(product_list)
iPhone    1299
iWatch 2999
MacBo 1999
iPad 2199
Bicyc 999
X-box 1199
Letv 819
Book 599

product_list

2.5.4 购物车数据库(shopping_car)
[]

shopping_car

2.5.5 取款注意事项(detail_tip)
信用卡取现需知-》》
①信用卡默认取现额度为信用卡额度的50%(此系统默认取现额度为7500)
②信用卡进行消费时(未取现),取现额度不会变化
③信用卡额度低于取现额度时,可取现金额以当前额度为准(可取现金额=当前额度*0.95)
④取现额度只有两种状况会发生变化,一种进行取现,第二是对信用卡额度进行调整
⑤每次取现扣除5%的手续费

detail_tip

2.5.6 日志库(logger_dict)
2018-07-05 10:53:09,269 - root - WARNING - account or password mistake at least three times
2018-07-05 11:01:34,437 - root - WARNING - account or password mistake at least three times
2018-07-05 11:03:49,550 - root - WARNING - account or password mistake at least three times
2018-07-05 11:10:16,636 - root - WARNING - account or password mistake at least three times

logger_dict

2.5.7 信用卡变动记录库(credictcard_record)
{"": {"2018-07-04": {"21:39:28": "\u001b[31;1m\u4fe1\u7528\u5361 888888 \u8fd8\u6b3e\u91d1\u989d \uffe5100 \u8fd8\u6b3e\u6210\u529f\u001b[0m", "21:32:03": "\u001b[31;1m\u63d0\u73b0\uffe5100 \u624b\u7eed\u8d39\uffe55\u001b[0m", "20:52:16": "\u8d2d\u7269\u652f\u4ed8 1299", "21:37:57": "\u001b[31;1m\u8f6c\u8d26\u5361\u53f7 222222 \u91d1\u989d \uffe5100 \u8f6c\u8d26\u6210\u529f\u001b[0m"}}}

credictcard_record

2.5.8 购物记录库(shopping_record)
{"zhangsan": {"2018-07-04": {"20:52:16": [["iPhone", ""]], "20:49:52": [["iPhone", ""]]}}}

shopping_record

2.6 配置模块(conf模块)

待扩展

settings.py

三 运行结果

运行atm.py文件,首先显示如下界面:

3.1 购物中心

3.1.1 购物商场

3.1.2 查看购物车

3.1.3 购物结算

3.1..4 个人中心

(1) 购物历史记录

(2)修改登录密码

(3)修改个人信息

(4)修改银行卡绑定

3.2 信用卡中心

3.2.1 我的信用卡

3.2.2 提现

3.2.3 转账

3.2.4 还款

3.2.5 流水记录

3.3 后台管理

3.3.1 创建账号

3.2.2 锁定账户

3.2.3 解锁账户

3.2.4 发行信用卡

3.2.5 冻结信用卡

3.2.6 解冻信用卡

3.2.7 提升信用卡额度

3.3 退出程序

参考:https://www.cnblogs.com/lianzhilei/p/5786223.html

python---信用卡ATM的更多相关文章

  1. [py]python之信用卡ATM

    python之信用卡ATM 参考: http://www.cnblogs.com/wushank/p/5248916.html 他的博客写的很ok 需求介绍 模拟实现一个ATM + 购物商城程序 额度 ...

  2. python作业ATM(第五周)

    作业需求: 额度 15000或自定义. 实现购物商城,买东西加入 购物车,调用信用卡接口结账. 可以提现,手续费5%. 支持多账户登录. 支持账户间转账. 记录每月日常消费流水. 提供还款接口. AT ...

  3. 基于python 信用卡评分系统 的数据分析

    基于python 信用卡评分系统 的数据分析 import pandas as pd import matplotlib.pyplot as plt #导入图像库 from sklearn.ensem ...

  4. python之信用卡ATM(第五天)

    本节作业 作业需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日, ...

  5. python之ATM

    每次做一点就发出来,大神不要嫌重复 2016/11/4 今天来搞ATM,反正逃不了的,说来惭愧,这个作业是我10/4号20天前拿到的,当时是万脸蒙比的,今天又做了一点,现在算是百脸蒙比吧. 一.需求: ...

  6. Python学习--------------Atm+购物车系统

    一.程序需求 模拟实现一个ATM + 购物商城程序: 1.额度 15000或自定义 2.实现购物商城,买东西加入 购物车,调用信用卡接口结账 3.可以提现,手续费5% 4.每月22号出账单,每月10号 ...

  7. Python实现ATM+购物商城

    需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠 ...

  8. python 信用卡系统+购物商城见解

    通过完成信用卡系统+购物商城 使自己在利用 字典和列表方面有了较大的提升,感悟很深, 下面将我对此次作业所展示的重点列表如下: #!/usr/bin/env python3.5 # -*-coding ...

  9. python以ATM+购物车剖析一个项目的由来及流程

    ATM+购物车 一个项目是如何从无到有的 ''' 项目的由来,几个阶段 0.采集项目需求 1.需求分析 2.程序的架构设计 3.分任务开发 4.测试 5.上线运行 ''' 需求分析: # 对项目需求进 ...

  10. python实现atm机基本操作及购物车

    一.需求分析 ATM机要为用户提供转账,提现,还款,付款,消费流水,操作记录等操作接口 ATM机要为管理员提供创建用户,冻结解冻,修改额度的功能 ATM机管理员认证使用装饰器来实现 购物车要提供管理员 ...

随机推荐

  1. CF 19E Fairy——树上差分

    题目:http://codeforces.com/contest/19/problem/E 去掉一条边,使无向图变成二分图. 该边应该被所有奇环经过,且不被偶环经过. 因为一条非树边一定只在一个环里. ...

  2. UITableView常见用法以及注意细节

    UITableView用途广泛,而且多样化,其中有一些不太常用,用到的话需要去查资料,今天边用边记录下来 *第一发:UITableViewCell 分割线 1. 分割线样式 [self.tableVi ...

  3. phyton方面相关书籍

    0基础:<简明PYTHON教程>http://linux.chinaitlab.com/manual/Python_chinese/<与孩子一起学编程>http://book. ...

  4. java中Swing编程再度练习篇

    总结: 注意理解frame的层级关系 package com.da; //添加背景图片 //我只实现了插入图片.但并没有实现是背景图片 import javax.swing.JFrame; impor ...

  5. Struts2中web.xml里面struts-cleanup作用

    struts2.1.3之后的版本均不需要配置该过滤器 参考: struts-cleanup作用 升级到struts-2.3.14.3之后涉及的改动以及ActionContextCleanUp,Stru ...

  6. 修改crushmap实验

    标签(空格分隔): ceph,ceph实验,crushmap CRUSH的全称是Controlled Replication Under Scalable Hashing,是ceph数据存储的分布式选 ...

  7. java中的死锁现象

    死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. java 死锁产生的四个必要条件: 1.互斥使用,即当资源被一个线 ...

  8. Apache Geronimo Remote Code Execute Vulnerability

    简介: Apache Geronimo 是 Apache 软件基金会的开放源码J2EE服务器,它集成了众多先进技术和设计理念. 这些技术和理念大多源自独立的项目,配置和部署模型也各不相同. Geron ...

  9. 在.net中使用redis(StackExchange.Redis)

    本文介绍如何在.net中使用redis 安装 代码使用 StackExchange.Redis基础使用 StackExchange.Redis中的事务 安装(windows平台) 安装Chocolat ...

  10. FFMPEG: avformat_find_stream_info()函数

    av_find_stream_info()中是要不断的读取数据包,解码获得相应的信息 其中: st->codec->codec_type:0:视频,1:音频,2:数据 st->cod ...