首页 > 编程语言 > 详细

Python基础篇===》《《第二次考试 ATM+购物车》》 [2021/4/10]

时间:2021-04-17 11:08:18      阅读:24      评论:0      收藏:0      [点我收藏+]

                       ATM

 

技术分享图片

 

 

readme:

 

技术分享图片
#项目说明
##ATM+购物车
#项目需求
    1,额度 15000或自定义 -->登录功能
    2,实现购物商城,买东西加入购物车,调用信用卡接口结账 -->购物功能  支付功能
    3,可以提现,手续费5% -->提现功能
    4,支持多账户登录 -->登录功能
    5,支持账户间转账 -->转账功能
    6,记录每月日常消费流水 -->查看流水功能
    7,提供还款接口 -->还款功能
    8,ATM记录操作日志 -->记录日志功能 
    9,提供管理接口,包括添加账户、用户额度,冻结账户等。。。-->管理员功能
    10,用户认证用装饰器 -->登录认证装饰器

##  用户视图层展示给用户可选择的功能
    1,注册功能 
    2,登录功能
    3,查看余额
    4,转账功能
    5,取款款功能
    6,还款功能
    7,查流水功能
    8,购物功能
    9,查看购物车


#一个项目是如何从无到有
## 一 需求分析
    1,拿到项目,会先在客户端那里一起讨论需求,
    商量项目的功能是否能实现,得到一个需求文档。
    2,最后在公司内部需要开一次会议,最终得到一个开发文档,
    交给不同程序员进行开发。
    - python:后端 ,爬虫

    -不同岗位:
        - UI界面设计:
        - 前端:
        - 后端:
        - 测试:
        - 运维:
## 二 程序的架构设计
## 三 分任务开发
## 四 测试
## 五 上线
View Code

 

start

 

技术分享图片
 1 import sys
 2 from  conf import setting
 3 from core import src
 4 
 5 # 将程序根路径搭建好
 6 path=setting.BASE_DIR
 7 sys.path.append(path)
 8 
 9 if __name__ == ‘__main__‘:
10     src.run()
View Code

  

conf-->setting

 

技术分享图片
import os
BASE_DIR=os.path.dirname(os.path.dirname(__file__))
View Code

 

lib-->common

 

技术分享图片
# 用户登录状态验证装饰器
from core import src
def logging_auth(func):
    def wrapper(*args,**kwargs):
        if src.user_auth[‘is_auth‘]:
            return func(*args,**kwargs)
        else:
            print(‘请先登录‘)
            src.logging()
    return wrapper


import logging

def write_logger(name):
    return logging.info(name)
View Code

 

db-->db_handler

 

技术分享图片
import json,os
from conf import setting

# 查看用户信息
def select(user_name):
    path=setting.BASE_DIR
    path_file=os.path.join(path,‘db‘,‘%s.json‘%user_name)
    # 判断用户是否存在
    if os.path.exists(path_file):
        with open(path_file,mode=‘r‘,encoding=‘utf-8‘)as f:
            user_dic=json.load(f)
            # print(user_dic)
            return user_dic
    else:
        return False


# 更改用户信息
def update(user_dic):
    path = setting.BASE_DIR
    path_file = os.path.join(path, ‘db‘, ‘%s.json‘ %user_dic[‘name‘])
    with open(path_file,mode=‘wt‘,encoding=‘utf-8‘)as f:
        json.dump(user_dic,f)
        f.flush()
View Code

 

interface:

user

 

技术分享图片
from db import db_handler

# 用户信息
def user_info_interface(user_name):
    user_dic=db_handler.select(user_name)
    return user_dic


# 注册接口
def register_interface(user_name,pwd):
    user_dic={‘name‘:user_name,‘pwd‘:pwd,‘locked‘:False,‘balance‘:20000,‘shopping_car‘:{},‘bank_flow‘:[]}
    db_handler.update(user_dic)
View Code

 

bank

 

技术分享图片
# 查看余额接口
from db import  db_handler
from lib import common

def check_balance_interface(user_name):

    user_dic=db_handler.select(user_name)
    balance=user_dic[‘balance‘]
    return balance


# 查看流水

def check_bank_flow(user_name):

    user_dic = db_handler.select(user_name)
    bank_flow = user_dic[‘bank_flow‘]

    for i in bank_flow:
        print(i)



# 取款接口

def withdraw_interface(money,name):
    user_dic = db_handler.select(name)
    balance = user_dic[‘balance‘]

    if balance >= money * 1.01:
        balance -= money * 1.01
        user_dic[‘balance‘] = balance

        # 记录流水
        user_dic[‘bank_flow‘].append("%s 取款 %s元" % (name, money))

        # 取款日志
        common.write_logger("%s 还款 %s元" % (name, money))

        db_handler.update(user_dic)
    else:
        print(‘余额不足‘)


# 转账接口

def transfer_interface(from_user,to_user,money):
    from_user_dic = db_handler.select(from_user)
    from_user_balance = from_user_dic[‘balance‘]

    to_user_dic = db_handler.select(to_user)
    to_user_balance = to_user_dic[‘balance‘]


    if from_user_balance>=money:

        from_user_balance -=money
        to_user_balance +=money

        from_user_dic[‘balance‘]=from_user_balance
        to_user_dic[‘balance‘]=to_user_balance

        # 记录转账流水
        from_user_dic[‘bank_flow‘].append(‘%s 向 %s 转了 %s 元‘ % (from_user, to_user, money))
        to_user_dic[‘bank_flow‘].append(‘%s 收 %s 的 %s元‘ % (to_user, from_user, money))

        # 记录转账日志
        common.write_logger(‘%s 向 %s 转了 %s 元‘ % (from_user, to_user, money))
        common.write_logger(‘%s 收到来自 %s 的 %s元‘ % (to_user, from_user, money))

        # 更新用户信息
        db_handler.update(from_user_dic)
        db_handler.update(to_user_dic)

        print(‘转账成功‘)

    else:
        print(‘余额不足‘)
        return


# 付款接口
from interface import user
def repay_interface(name, money):

        # 获取用户信息
        user_dic = user.user_info_interface(name)

        if user_dic[‘balance‘]>=money:

            user_dic[‘balance‘] -= money

            # 记录流水
            user_dic[‘bank_flow‘].append("%s 还款 %s元" % (name, money))
             # 取款日志
            common.write_logger("%s 还款 %s元" % (name, money))

            db_handler.update(user_dic)


        else:
            print(‘余额不足‘)
View Code

 

shop

 

技术分享图片
from db import db_handler
from interface import user

def add_shopping_car_interface(name, shopping_cart):
    user_dic = user.user_info_interface(name)

    # 把购物车数据存入到用户信息中
    user_dic[‘shopping_car‘] = shopping_cart  # {"tea":{"price":200,"count":2}}

    db_handler.update(user_dic)


def check_shopping_car_interface(name):

    user_dic=user.user_info_interface(name)

    pro_list=user_dic[‘shopping_car‘]

    for key in pro_list:
        print(key)
View Code

 

 

core-->src

 

技术分享图片
  1 # 注册功能
  2 
  3 from interface import user
  4 from lib import common
  5 def register():
  6     # 登录状态不能注册
  7     if user_auth[‘is_auth‘]:
  8         print(‘登录状态‘)
  9         return
 10     print(‘注册功能‘)
 11     while True:
 12         user_name = input(‘请输入注册用户名:‘).strip()
 13 
 14         if user_name.isalpha():
 15             ## 判断当前用户名是否已经存在,如果有用户信息,则存在。
 16             if user.user_info_interface(user_name):
 17                 print(‘用户名已存在‘)
 18                 continue
 19             else:
 20                 while True:
 21                     pwd = input(‘请输入注册密码:‘).strip()
 22                     re_pwd = input(‘请再次注册输入密码:‘).strip()
 23 
 24                     if pwd == re_pwd:
 25                         if len(pwd) >= 5:
 26                             # 调用注册接口
 27                             user.register_interface(user_name, pwd)
 28 
 29                             print(‘注册成功‘)
 30                             break
 31                         else:
 32                             print(‘注册密码长度不小于5‘)
 33                             continue
 34                     else:
 35                         print(‘两次输入密码不一样‘)
 36                         continue
 37                 break
 38         else:
 39             print(‘用户名必须是字母组合‘)
 40 
 41 
 42 # 记录用户登录状态
 43 user_auth = {‘name‘: None, ‘is_auth‘: False} # 为什么不放用户信息字典里?
 44 from db import db_handler
 45 
 46 def logging():
 47     # 登录状态不能登录
 48     if user_auth[‘is_auth‘]:
 49         print(‘登录状态‘)
 50         return
 51     print(‘登录功能‘)
 52     count=0
 53     while True:
 54         user_name = input(‘请输入登录用户名:‘).strip() # 可以将此句移动到while循环外
 55         # 校验登录用户名是否注册
 56         user_dic = user.user_info_interface(user_name)
 57         # 用户名存在
 58         if user_dic:
 59             # 如果用户名没有锁定
 60             if not user_dic[‘locked‘]:
 61                 # 用户名次数
 62                 if count!=3:
 63 
 64                     pwd=input(‘请输入密码:‘).strip()
 65 
 66                     if pwd==user_dic[‘pwd‘]:
 67                         user_auth[‘name‘]=user_name
 68                         user_auth[‘is_auth‘]=True
 69                         print(‘登录成功‘)
 70                         break
 71                     else:
 72                         # 此处有Bug,次数累加对事不对人。
 73                         count +=1
 74                         print(‘密码错误‘)
 75                 else:
 76                     user_dic[‘locked‘] = True
 77                     # 这里没必要再写用户锁定接口了
 78                     db_handler.update(user_dic)
 79                     print(‘输错次数达到三次,用户名已被锁定‘)
 80                     break
 81             else:
 82                 print(‘用户名已锁定‘)
 83         else:
 84             print(‘用户名不存在‘)
 85 
 86 
 87 
 88 # 查询余额功能
 89 
 90 @common.logging_auth
 91 def check_balance():
 92     print(‘查看余额功能‘)
 93     user_name = input(‘请输入所要查看用户名:‘).strip()
 94     # 调用查看余额功能接口
 95     balance = bank.check_balance_interface(user_name)
 96     print(balance)
 97 
 98 
 99 # 取款功能
100 
101 @common.logging_auth
102 def withdraw():
103     while True:
104         money=input(‘请输入取款金额:‘).strip()
105 
106         if money.isdigit():
107             money=int(money)
108             # 调用取款接口
109             bank.withdraw_interface(money,user_auth[‘name‘])
110             print(‘取款成功‘)
111             break
112 
113         else:
114             print(‘输入金额不合法‘)
115 
116 
117 # 转账功能
118 
119 from interface import bank
120 @common.logging_auth
121 def transfer():
122     while True:
123         money=input(‘请输入转账金额:‘).strip()
124         if money.isdigit():
125             money=int(money)
126 
127             from_user=user_auth[‘name‘]
128             to_user=input(‘请输入收款人:‘).strip()
129 
130             # 判断收款人是否存在
131             if db_handler.select(to_user):
132 
133                 # 调用转账接口
134                 bank.transfer_interface(from_user,to_user,money)
135                 break
136             else:
137                 print(‘收款人不存在‘)
138                 continue
139         else:
140             print(‘输入金额不合法‘)
141             continue
142 
143 
144 
145 def repay():
146     money=input(‘请输入还款金额‘).strip()
147     if money.isdigit():
148         money=int(money)
149         bank.repay_interface(user_auth[‘name‘],money)
150 
151         print(‘还款成功‘)
152 
153 
154 
155 def check_flow():
156 
157     bank.check_bank_flow(user_auth[‘name‘])
158     print(‘查看流水成功‘)
159 
160 # 查看日志
161 from lib import common
162 def check_logging():
163     # 调记录日志接口
164     user_log=common.write_logger(user_auth[‘name‘])
165     return user_log
166 
167 
168 
169 
170 def exit():
171     return exit
172 
173 
174 
175 # 加入购物车
176 from interface import shop
177 @common.logging_auth
178 def shopping():
179     print(‘购物车功能‘)
180     # 将购物车放到用户信息中
181     shopping_car={}
182     while True:
183 
184         # 可选商品清单
185         shopping_list=[
186             [‘bicycle‘,2000],
187             [‘soccer‘,500],
188             [‘book‘,200],
189             [‘notepad‘,100]
190         ]
191 
192         # 展示商品清单
193         for i,product in enumerate(shopping_list):
194             print(i,product)
195 
196         choose_num=input(‘请输入商品编号:‘)
197 
198         # 校验商品编号是否存在
199         if choose_num.isdigit():
200             choose_num = int(choose_num)
201 
202             if choose_num < len(shopping_list):
203 
204                 # 拿到商品信息
205                 pro_name=shopping_list[choose_num][0]
206                 pro_price=shopping_list[choose_num][1]
207 
208                 # 判断商品在购物车中是否存在
209                 if pro_name not in shopping_car:
210                      shopping_car[pro_name]= {‘price‘:pro_price,‘count‘:1}
211                 else:
212 
213                     shopping_car[pro_name][‘count‘] +=1
214                     print(‘已加入购物车‘)
215             else:
216                 print(‘没有商品编号‘)
217 
218 
219         elif choose_num ==‘q‘:
220 
221             # 判断购物车是否为空
222             if shopping_car:
223 
224                 # 调用添加购物车接口
225                 shop.add_shopping_car_interface(user_auth[‘name‘],shopping_car)
226                 print(‘加入购物车成功‘)
227                 break
228 
229             else:
230                 print(‘购物车为空‘)
231                 continue
232 
233 
234 # 查看购物车
235 
236 @common.logging_auth
237 def check_shopping():
238     shop.check_shopping_car_interface(user_auth[‘name‘])
239 
240 
241 
242 
243 
244 
245 # 定义功能字典,索引对应功能。
246 func_dic = {
247 
248     ‘1‘: register,
249     ‘2‘: logging,
250     ‘3‘: check_balance,
251     ‘4‘: transfer,
252     ‘5‘: withdraw,
253     ‘6‘: repay,
254     ‘7‘: shopping,
255     ‘8‘: check_flow,
256     ‘9‘:check_logging,
257     ‘10‘: check_shopping,
258     ‘11‘:exit
259 }
260 
261 
262 # 定义主程序
263 def run():
264     while True:
265         print(‘‘‘
266         1,注册功能 
267         2,登录功能
268         3,查看余额
269         4,转账功能
270         5,取款功能
271         6,还款功能
272         7,购物功能
273         8,查流水功能
274         9,查看日志
275         10,查看购物车
276         11,退出
277         ‘‘‘)
278 
279         option = input(‘Please enter your option:‘).strip()
280 
281         if option.isdigit():
282 
283             if option in func_dic:
284                 res=func_dic[option]()
285 
286                 # 输入11退出登录
287                 if res==exit:
288                     break
289 
290             else:
291                 print(‘No this option ‘)
292                 continue
293         else:
294             print(‘Must be a number‘)
295             continue
View Code

 

Python基础篇===》《《第二次考试 ATM+购物车》》 [2021/4/10]

原文:https://www.cnblogs.com/huo-shui/p/14668805.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!