包
什么是包?什么是模块?
一个py文件就是一个模块
# 包就是多个模块功能的结合体
如何创建包?
包和文件夹的区别?包下有一个__init__.py文件
而文件夹是没有的
"""
模块首次被导入发生了3件事?
1. 产生一个名称空间
2. 执行被导入的py文件,然后把执行的数据都丢到名称空间
3. 执行文件中产生一个变量指向这个名称空间
包首次被导入发生了3件事?
1. 产生一个包的名称空间
2. 执行被导入包下的__init__.py文件,然后把执行的数据都丢到包的名称空间
3. 执行文件中产生一个变量aaa指向这个包的名称空间
"""
ATM项目讲解
1. 开发项目的模式:
# 瀑布模式
项目开发完成之后,一并提测 禅道
# 敏捷开发
开发一个功能,测试一个功能
ATM使用瀑布模式
1. 需求分析
产品经理
模拟实现一个ATM + 购物商城程序
'''
额度 15000或自定义
实现购物商城,买东西加入 购物车,调用信用卡接口结账
可以提现,手续费5%
支持多账户登录
支持账户间转账
记录每月日常消费流水
提供还款接口
ATM记录操作日志
提供管理接口,包括添加账户、用户额度,冻结账户等。。。
用户认证用装饰器
'''
2. 程序设计或者架构设计
需求转为功能
1. 注册
2. 登录
3. 转账
4. 提现
5. 充值
6. 查看
7. 查看流水
8. 加入购物车
9. 查看购物车
# 软件开发目录规范
bin
start.py启动文件
core
主要逻辑
def login():
pass
...
conf : config
settings.py
db:
db.py
lib: library
common.py
log:
日志文件
log.log
interface:
接口
bank.py
user.py
shopping.py
readme
3. 分任务分模块开发
4. 测试
5. 上线
# 启动文件一般放在bin目录,或者项目跟目录
bin
import os
import sys
USER_PATH = os.path.dirname(os.path.dirname(__file__))
sys.path.append(USER_PATH)
from core.src import user_dic_choose_md
if __name__ == '__main__':
user_dic_choose_md()
conf
core
import os
import json
from bin.start import USER_PATH
from lib.common import user_log
from lib.common import user_hashlib
# 创建一个全局变量,记录登录情况
whole_dic = {'username':None,
'login':False}
# user_path = os.path.join(USER_PATH,'db','%s.json'%whole_dic.get('username'))
# 登录模块
def login():
if whole_dic.get('login'):
print('您已经登录。')
return 1
while True:
user_name = input('请输入用户名:').strip()
if user_name == '0':
return 1
password = input('请输入密码:').strip()
from lib.common import user_hashlib
password = user_hashlib(password)
user_path = os.path.join(USER_PATH,'db','%s.json'%user_name)
if not os.path.exists(user_path):
print('用户名或密码错误')
print('按0退出程序。')
continue
with open(user_path,'r',encoding='utf8') as f:
user_dic = json.load(f)
if user_dic['password'] == password:
whole_dic['username'] = user_name
whole_dic['login'] = True
print('登录成功!')
return 1
# 注册模块
def register():
if whole_dic.get('login'):
print('请先退出在注册。')
return 1
while True:
user_name = input('请输入注册用户名:').strip()
if user_name == '0':
return 1
if not user_name:
print('请输入正规内容。')
continue
# 判断用户名是否存在,直接拼接路径判断
user_path = os.path.join(USER_PATH,'db','%s.json'%user_name)
if os.path.exists(user_path):
print('用户名重复,请重新输入!')
print('按0退出程序')
continue
password = input('请输入密码:').strip()
if not password:continue
if not password.isdigit():
print('请输入数字。')
print('按0退出程序')
continue
# 哈希盐
password = user_hashlib(password)
# 用户信息储存到字典,在保存到文件
user_name_dic = {'user_name':user_name,'password':password,'money':10000,'mode':False}
with open(user_path,'w',encoding='utf8') as f:
json.dump(user_name_dic,f,ensure_ascii=False)
print('注册成功!')
return 1
# 充值模块
@user_log
def pay():
while True:
# 充值。需要判断用户是否登录。用户没有登录就要登录。做成语法糖,多个位置使用
money = input('请输入输入金额:').strip()
if not money:continue
if int(money.isdigit()) <= 0:
print('请输入正确金额')
continue
user_path = os.path.join(USER_PATH,'db','%s.json'%whole_dic.get('username'))
with open(user_path,'r',encoding='utf8') as f:
dic = json.load(f)
dic['money'] += int(money)
with open(user_path,'w',encoding='utf8') as f1:
json.dump(dic,f1)
print('账户余额:%s' % dic.get('money'))
print('充值成功')
return 1
# 提现模块
@user_log
def withdraw():
while True:
money = input('请输入提现金额:').strip()
if not money:continue
if int(money.isdigit()) <= 0:
print('请输入正确信息。')
continue
user_path = os.path.join(USER_PATH,'db','%s.json'%whole_dic.get('username'))
with open(user_path,'r',encoding='utf8') as f:
dic = json.load(f)
if dic.get('money') < int(money) *1.05:
print('金额不足。无法提现')
return 1
dic['money'] -= int(money)*1.05
with open(user_path,'w',encoding='utf8') as f1:
json.dump(dic,f1)
print('账户余额:%s'%dic.get('money'))
print('提现成功')
return 1
# 查看余额模块
@user_log
def balance():
user_path = os.path.join(USER_PATH, 'db', '%s.json' %whole_dic.get('username'))
with open(user_path,'r',encoding='utf8') as f:
dic = json.load(f)
print('目前余额:%s'%dic.get('money'))
return 1
# 退出模块
def log_out():
if whole_dic.get('login'):
whole_dic['login'] = False
print('退出成功')
return 1
else:
print('您还没有登录。')
return 1
# 功能字典选择
def user_dic_choose_md():
while True:
user_dic_choose = {'0':['退出',log_out],
'1':['注册',register],
'2':['登录',login],
'3':['充值',pay],
'4':['提现',withdraw],
'5':['余额',balance]}
for i in range(len(user_dic_choose)):
print(i,user_dic_choose.get(str(i))[0])
choice = input('请选择:').strip()
# if choice == '0':
# print('再见')
# return
while choice.isdigit() and choice in user_dic_choose:
res = user_dic_choose[choice][1]()
if res:
break
else:
print('请输入正确内容。')
continue
lib
import hashlib
from core import src
def user_hashlib(pswd,yan='123abc' ):
md5 = hashlib.md5()
md5.update(pswd.encode('utf8'))
md5.update(yan.encode('utf8'))
md5 = md5.hexdigest()
return md5
def user_log(func):
def index(*args,**kwargs):
if src.whole_dic.get('login'):
res = func(*args,**kwargs)
return res
else:
print('还没有登录,请先登录。')
src.login()
return 1
return index