zoukankan      html  css  js  c++  java
  • python练习_购物车(2)

    用python写了一个购物车程序,主要是练习,代码如下

    主入口文件:main.py

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 #先调用用户登录函数,在进行逻辑模块的循环
     5 #入口程序
     6 
     7 import enter,operate
     8 if __name__ == '__main__':
     9     print("33[35m----------------------------请输入用户名密码----------------------------33[0m")
    10     enter.user()
    11     while True:
    12         operate.welcome()
    入口

    逻辑处理文件operate.py

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    #逻辑结构
    #主要判断用户的输入,根据输入的关键字,来调用不同功能的函数
    
    #初始化商品
    huowu = {
            "iphone6splus" : 6000,
            "huaweimate8" :3700,
            "asus" :4299,
            "alienware" :21999,
            "strix-gtx970" :3649,
        }
    #初始化个空的购物车
    huo = {
        }
    #初始化话空的列表,保存当前登录用户
    name = []
    #功能判断函数
    def welcome():
        import enter,os,lists
        s_1 = raw_input("请输入操作:")#捕获用户操作
        if s_1 == 'car':
            enter.catg()
        elif s_1  == 'help':
            print('''33[31m
                           car___________________商品
                           help__________________帮助
                           buy___________________添加至购物车
                           shop__________________购物车结算
                           und___________________购物车移除商品
                           top___________________充值
                           bal___________________余额
                           enr___________________注册用户
                           exit__________________返回
           33[0m''')
        elif s_1  == 'buy':
            enter.mone()
        elif s_1  == 'shop':
            print ("33[35m-------------------------------已进入购物车-------------------------------33[0m")
            enter.shopp()
        elif s_1  == 'und':
            enter.dele()
        elif s_1  == 'top':
            enter.topup()
        elif s_1  == 'bal':
            b_1 = "33[36m---------------------当前用户:{b_2},余额为:{b_3}----------------------33[0m"
            print  b_1.format(b_2 = name[0],b_3 = lists.die[2])
        elif s_1 == 'enr':
            enter.login()
        elif s_1 == 'exit':
            os._exit(0)
    逻辑处理

    函数模块enter.py

      1 #!/usr/bin/env python
      2 # -*- coding:utf-8 -*-
      3 #读出当前存在的用户名和密码,并生成字典
      4 with open('users','rU')as u_1 :
      5             ss =  u_1.readlines()
      6             dic = dict()
      7             for lind in ss:
      8                 lind = lind.strip().split(':')
      9                 dic[lind[0]] = lind[1]
     10 #用户登录欢迎模块
     11 def welcome(wel):
     12     sent = "!33[31m{users}33[0m!Welcome to the shopping mall"#设置欢迎信息
     13     aa = (sent.format(users=wel)) #欢迎信息
     14     scr = 80    #设置一个长度
     15     text = len(aa)-9    #读出语言的长度,并减去9
     16     box = text  #设置变量
     17     left = (scr - box) // 2     #设置前方空格的空隙
     18     #下方输出的内容可以根据输入字符串的长度进行变化
     19     print   #输出空
     20     print ' ' * left + '+'+ '-'*(box) + '+'
     21     print ' ' * left + '|'+ ' '*text + '|'
     22     print ' ' * left + '|'+aa + '|'
     23     print ' ' * left + '|'+ ' '*text + '|'
     24     print ' ' * left + '+'+ '-'*(box) + '+'
     25 
     26 
     27 #用户登录验证模块
     28 def user():
     29     import operate #加载operate文件
     30     while True: #设置循环
     31         user_1 = raw_input("请输入你要登录的用户名:") #获取用户名密码
     32         user_2 = raw_input("请输入你要登录的密码:")
     33         operate.name.append(user_1) #将用户名写入operate.name,方便以后调用
     34         if user_1 in dic.keys():    #判断当前用户是否存在,根据前面生成的所有用户名密码的列表
     35             passw = dic[user_1]     #如果用户存在则,根据字典的值传入变量
     36             if user_2 == passw:     #判断字典中密码和用户输入是否一致
     37                 welcome(user_1)     #一致则调用用户欢迎模块
     38                 break               #登录成功退出循环
     39             else:
     40                 print("33[35m您输入的账号或密码错误33[0m")#不匹配则重新输出
     41                 print("")
     42         else:
     43                 print("33[35m您输入的账号或密码错误33[0m")#不匹配则重新输出
     44                 print("")
     45 
     46 
     47 #购买模块
     48 def shopp():
     49     import operate  #加载operate
     50     if not operate.huo: #判断huo是否为空,huo是设置为空的字典,存放当前用户所添加的东西,
     51         print("33[35m-------------------------------购物车没货物-------------------------------33[0m")#如果是空这输出
     52     else: #不为空则结算
     53         cart() #加载显示购物车物品的函数
     54         shop_1 = raw_input("是否进行结算(y/n):") #是否结算
     55         if shop_1 == "y" :#判断用户输入
     56             deal()  #调用结算模块
     57         elif shop_1 == "n" :#判断用户输入
     58             print ("33[35m-------------------------------已退出购物车-------------------------------33[0m")
     59 #显示购物车内容
     60 def cart():
     61     import operate  #加载operate
     62     shop_1 = 1  #为物品编号设置
     63     for sho_1 in operate.huo.keys():    #从用户的存放货物的字典逐个读取货物名称
     64         if sho_1 in operate.huowu.keys():   ##分别读取货物的键值对,这里的逻辑不太好没时间更改,后续更改
     65             #设置中间的下划线长度
     66             sh_2 = len(sho_1)   #计算长度
     67             sh_3 = 50-sh_2      #设置下划线长度
     68             ca_4 = ("[{s_1}]商品名称:{s_2}"+"_"*sh_3+"{s_3}元")#设置提示信息
     69             print ca_4.format(s_1=shop_1,s_2=sho_1,s_3=operate.huo[sho_1])#设置提示信息
     70             shop_1 += 1#将货物编号加一
     71 
     72 
     73 
     74 #支付模块
     75 def deal():
     76     import operate,lists #加载operate,lists
     77 
     78     #支付过程
     79     aas = int(lists.die[2])   #将lists的2索引(金额),转换成int类型
     80     for sa in operate.huo.keys(): #sa从字典huo取key
     81         sa_1 = int(operate.huo[sa])     #sa_1等于转换类型后的huo[sa]的值(购物车商品金额)
     82         if aas >= sa_1:       #判断文件中的当前用户金额是否大于等于huo[sa]的值
     83             aas = aas - sa_1   #如果大于则进行运算用已存金额减去商品金额
     84             lists.die[2] = aas       #并将列表爹die[2](也就是用户的资金)更新成买完商品的钱
     85             del operate.huo[sa]    #然后删除该商品
     86             ss_1 = '支付商品33[35m{n}33[0m成功,实付金额为:33[31m{n_1}33[0m元!' #设置提示信息
     87             print ss_1.format(n=sa,n_1=sa_1)   #设置提示信息
     88         else:#当金钱不足的时候进行
     89             ss_2 = '支付商品33[35m{n}33[0m失败,应付金额为:33[31m{n_1}33[0m元!请充值!'#设置提示信息
     90             print ss_2.format(n=sa,n_1=sa_1)#设置提示信息
     91     #写入文件过程,创建一个当前所有存在用户的列表,这样就可以判断当前用户在文件的第几行
     92     clo = lists.dia.index(lists.aaa)    #判断当前用户所在列表的位置
     93     f=open('users','r+')    #打开文件
     94     flist=f.readlines()     #按行读取
     95     aa = '{a_1}:{a_2}:{a_3}
    '  #设置文件内容
     96     flist[clo]= aa.format(a_1=lists.die[0],a_2=lists.die[1],a_3=lists.die[2])#clo就是当前用户所在的文件行数,后面加上内容,a_1 当前用户 a_2 当前用户密码 a_3 当前用户余额
     97     f=open('users','w') #以w的方式打开文件
     98     f.writelines(flist) #写入
     99     f.close()#关闭
    100     print ("33[35m-------------------------------已退出购物车-------------------------------33[0m")
    101 
    102 #从购物车删除模块
    103 def dele():
    104     import operate  #加载模块
    105     if not operate.huo: #如果为空则输出没有货物
    106         print("购物车没有物品")
    107     else:
    108         cart()  #否则调用显示购物车模块
    109         while True:#循环
    110             saa = raw_input("请输入删除商品的名称:")#删除的物品名称
    111             if saa == 'exit':#判断输入exit为退出
    112                 break
    113             elif saa in operate.huo.keys():#判断用户输入名称是否正确
    114                 del operate.huo[saa]    #正确则删除
    115                 print('33[35m-------------------------------删除商品成功!!--------------------------------33[0m')
    116                 #退出删除判断
    117                 saa_1 = raw_input("是否退出(y/n):")
    118                 if saa_1 == 'y':
    119                     break
    120             else:
    121                 print "33[31m您输入有误请重新输入33[0m"
    122 
    123 #充值模块这里还可以写只有admin可以充值,或者验证充值用户的密码
    124 def topup():
    125     import lists#加载模块主要加载当前用户名
    126     clb = lists.dia.index(lists.aaa)    #判断当前用户所在列表的位置
    127     while True:
    128         q_1 = raw_input("请输入充值金额以整数为单位(元):")    #输入充值金额
    129         q_2 = str.isdigit(q_1)  #判断是否是数字
    130         if q_1 == 'exit' :  #exit退出充值
    131             break
    132         if q_2 == True: #是数字则进行充值
    133             q_1 = int(q_1)  #转换类型
    134             q_3 = type(q_1) #判断类型,主要通过长整形限制充值金额
    135             if q_3 == int:  #判断类型
    136                 lists.die[2] = int(lists.die[2])    #调用lists(当前用户的信息,账号,密码,余额),转换类型
    137                 lists.die[2] = lists.die[2] + q_1   #进行余额和充值金额相加
    138                 f=open('users','r+')    #打开文件
    139                 flist=f.readlines()     #按行读取
    140                 aa = '{a_1}:{a_2}:{a_3}
    '  #设置文件内容
    141                 flist[clb]= aa.format(a_1=lists.die[0],a_2=lists.die[1],a_3=lists.die[2])#clo就是当前用户所在的文件行数,后面加上内容,a_1 当前用户 a_2 当前用户密码 a_3 当前用户金额
    142                 f=open('users','w') #以w的方式打开文件
    143                 f.writelines(flist) #写入
    144                 f.close()  #关闭文件
    145                 vv_1 = ('充值成功,充值金额为33[31m{vv}33[0m,当前余额为33[31m{v_1}33[0m')
    146                 print(vv_1.format(vv=q_1,v_1=lists.die[2]))
    147                 break
    148             else:#如果不是整形数字,是长整形数字则金额过大
    149                 print("33[31m您输入的金额过大33[0m")
    150         else:#输入不是数字则输入有误
    151             print("33[31m---------------------------------输入有误---------------------------------33[0m")
    152 
    153 
    154 #商品模块
    155 def catg():
    156     import operate#读取模块
    157     print("33[35m---------------------------------购物商品---------------------------------33[0m")#输出
    158     car = 1#设置商品编号
    159     for ca_1 in operate.huowu:#分别读取货物的键值对
    160         ca_2 = len(ca_1)    #读出键值对的长度
    161         ca_3 = 50-ca_2  #中间下划线长度
    162         ca_4 = ("[{s_1}]商品名称:{s_2}"+"_"*ca_3+"{s_3}元")#输出信息
    163         print ca_4.format(s_1=car,s_2=ca_1,s_3=operate.huowu[ca_1])#输出信息
    164         car += 1
    165     print("33[35m---------------------------------购物商品---------------------------------33[0m")
    166 
    167 
    168 #添加模块
    169 def mone():
    170     import operate
    171     while True:#添加购物车模块
    172         mon = raw_input("请输入加入购物车产品的名称:")#输入物品名称
    173         if mon in operate.huo.keys():   #判断货物是否存在
    174             print("33[31m------------------------商品已经添加请先到购物车结算----------------------------33[0m")
    175         elif mon in operate.huowu.keys():#如果货物存在
    176             print("33[35m---------------------------添加成功请到购物车结算-------------------------------33[0m")
    177             operate.huo[mon] = operate.huowu[mon] #则添加至购物车的字典中
    178         elif mon == "exit":#exit退出
    179             print("33[35m---------------------------------退出购物---------------------------------33[0m")
    180             break
    181         else:#名称不对添加失败
    182             print("33[31m添加失败请核对产品名称33[0m")
    183 
    184 #注册用户模块,这里还可以写只有admin可以创建用户
    185 def login():
    186     import  lists
    187     #为了防止在运行中能够创建多个相同名称的用户
    188     while True:
    189         with open('users','rU')as u_3:  #过程如上
    190             ads = u_3.readlines()
    191             diz = []
    192             for lin in ads:
    193                 lin = lin.strip().split(':')
    194                 diz.append(lin[0])
    195         w_1 = raw_input("请输入创建的用户名:")#创建的用户名称
    196         if w_1 in diz:#判断用户是否存在
    197             print('33[31m----------------------------用户已存在请重新输入------------------------------33[0m')
    198         elif w_1 == "exit":
    199             break
    200         else:
    201             w_2 = raw_input("请输入用户密码(大于5位数)")#设置的密码这里可以做更安全的双向认证,因为PYcharm对隐身的密码模块支持不好所以没使用
    202             w_3 = len(w_2)#计算密码长度
    203             if w_3 > 5 :#密码长度大于5
    204                 output = open('users', 'a') #打开文件以a的方式
    205                 aa = '{a_1}:{a_2}:{a_3}
    '  #设置文件内容
    206                 flist= aa.format(a_1=w_1,a_2=w_2,a_3=10000)#clo就是当前用户所在的文件行数,后面加上内容,a_1 当前用户 a_2 当前用户密码 a_3 当前用户余额
    207                 output.write(flist) #写入
    208                 output.close()#关闭文件
    209                 ll = "33[31m--------------------------成功创建用户:{l_1}------------------------------33[0m"
    210                 print ll.format(l_1=w_1)
    211                 break
    212             else:
    213                 print("33[31m----------------------------密码长度过短------------------------------33[0m") #密码过短从新设置
    函数模块

    全局调用模块lists.py

     1 #!/usr/bin/env python
     2 # -*- coding:utf-8 -*-
     3 
     4 import operate
     5 aaa = operate.name[0]
     6 
     7 
     8 
     9 #生成当前用户,信息的列表
    10 with open('users','rU')as u_2 :     #打开文件users
    11         ss =  u_2.readlines()      #设置变量ss等于按行读取的u_2
    12         die = []                    #设置空列表,保存登录用户的信息
    13         for line in ss:             #for循环从ss按行拿区内容
    14             if aaa in line:         #判断登录用户是否在line中,当line包含用户的时候则进行一下处理
    15                 line = line.strip().split(':')  #分割字符串
    16                 die.append(line[0])     #在列表中添加元素 0索引代表用户
    17                 die.append(line[1])     #在列表中添加元素 1索引代表密码
    18                 die.append(line[2])     #在列表中添加元素 2索引代表金额
    19 #生成
    20 with open('users','rU')as u_3:  #过程如上
    21     ads = u_3.readlines()
    22     dia = []
    23     for lin in ads:
    24         lin = lin.strip().split(':')
    25         dia.append(lin[0])
    全局调用

    用户数据保存文件:users

    文件格式为:

    admin:123.com:10000

    主要实现思路:

    (1)所有的用户数据存在users上,默认admin,123.com user,123.com
    (2)实现思路在程序中捕获用户输入的关键字,借鉴linux,根据命令不同调用不同的
      函数。
      ①商品展示功能,通过一个字典为商品,然后for循环,进行格式的输出前面的编
      号利用计数器原理
      ②添加至购物车,主要当用户登录的时候生成一个空的字典,然后根据用户输入名称
      与商品字典进行匹配,成功匹配后就加入空的字典,这里没使用序号加入
      ③购物车结算,在登录函数中将验证成功的用户名传入一个空的列表,通过将users
      文件的数据读取出来,然后以:进行分割,转换成字典,这样就可以匹配当前登录
      用户的余额,然后进行减的操作,并在购物车字典中删除此商品在写入的时候,
      没学awk,所以采用指定的方法,为了获取用户在文件的行数,我先将所有用户
      生成一个列表,然后进行匹配读出下标这样就可以正常的执行了
      ④删除商品,将匹配的用户输入,跟用户的购物车的字典匹配,然后删除
      ⑤充值,根据保存的用户列表,匹配文件中的用户余额,然后根据用户输入的金额进
      行相加,写入文件,这里可以做只有admin才可以充值,限定单词充值金额啥的
      ⑥余额,根据前面生成的当前登录用户的信息列表进行输出
      ⑦注册用户,因为数据结构users就是,用户名,密码,金额,所以只需捕获用户名
      密码就可,这里加入用户验证,不能生成相同名称,密码最短6位,为了防止重
      副生成相同用户,在这里吧读取电当前用户名加入while循环,生成一次,下次
      生成用户就加载一次。
    (3)使用help可以输出帮助



  • 相关阅读:
    HTML5开发 桌面提醒功能
    自然框架总体设计
    Inversion of Logging
    Wind.js在移动跨平台框架PhoneGap中的异步体验
    MSBuild基本概念
    PortalBasic Web 应用开发框架:应用篇
    检测常见ASP.NET配置安全漏洞
    线程与进程的比较
    多层架构下的一个进销存项目
    Model Driven Architecture
  • 原文地址:https://www.cnblogs.com/bj-xy/p/5132519.html
Copyright © 2011-2022 走看看