邵邵。

导航

ATM部分

什么是包?什么是模块?
一个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

posted on 2021-11-30 18:13  邵邵。  阅读(39)  评论(0)    收藏  举报