用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("\033[35m----------------------------请输入用户名密码----------------------------\033[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('''\033[31m car___________________商品 help__________________帮助 buy___________________添加至购物车 shop__________________购物车结算 und___________________购物车移除商品 top___________________充值 bal___________________余额 enr___________________注册用户 exit__________________返回 \033[0m''') elif s_1 == 'buy': enter.mone() elif s_1 == 'shop': print ("\033[35m-------------------------------已进入购物车-------------------------------\033[0m") enter.shopp() elif s_1 == 'und': enter.dele() elif s_1 == 'top': enter.topup() elif s_1 == 'bal': b_1 = "\033[36m---------------------当前用户:{b_2},余额为:{b_3}----------------------\033[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 = "!\033[31m{users}\033[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("\033[35m您输入的账号或密码错误\033[0m")#不匹配则重新输出 41 print("") 42 else: 43 print("\033[35m您输入的账号或密码错误\033[0m")#不匹配则重新输出 44 print("") 45 46 47 #购买模块 48 def shopp(): 49 import operate #加载operate 50 if not operate.huo: #判断huo是否为空,huo是设置为空的字典,存放当前用户所添加的东西, 51 print("\033[35m-------------------------------购物车没货物-------------------------------\033[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 ("\033[35m-------------------------------已退出购物车-------------------------------\033[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 = '支付商品\033[35m{n}\033[0m成功,实付金额为:\033[31m{n_1}\033[0m元!' #设置提示信息 87 print ss_1.format(n=sa,n_1=sa_1) #设置提示信息 88 else:#当金钱不足的时候进行 89 ss_2 = '支付商品\033[35m{n}\033[0m失败,应付金额为:\033[31m{n_1}\033[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}\n' #设置文件内容 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 ("\033[35m-------------------------------已退出购物车-------------------------------\033[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('\033[35m-------------------------------删除商品成功!!--------------------------------\033[0m') 116 #退出删除判断 117 saa_1 = raw_input("是否退出(y/n):") 118 if saa_1 == 'y': 119 break 120 else: 121 print "\033[31m您输入有误请重新输入\033[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}\n' #设置文件内容 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 = ('充值成功,充值金额为\033[31m{vv}\033[0m,当前余额为\033[31m{v_1}\033[0m') 146 print(vv_1.format(vv=q_1,v_1=lists.die[2])) 147 break 148 else:#如果不是整形数字,是长整形数字则金额过大 149 print("\033[31m您输入的金额过大\033[0m") 150 else:#输入不是数字则输入有误 151 print("\033[31m---------------------------------输入有误---------------------------------\033[0m") 152 153 154 #商品模块 155 def catg(): 156 import operate#读取模块 157 print("\033[35m---------------------------------购物商品---------------------------------\033[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("\033[35m---------------------------------购物商品---------------------------------\033[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("\033[31m------------------------商品已经添加请先到购物车结算----------------------------\033[0m") 175 elif mon in operate.huowu.keys():#如果货物存在 176 print("\033[35m---------------------------添加成功请到购物车结算-------------------------------\033[0m") 177 operate.huo[mon] = operate.huowu[mon] #则添加至购物车的字典中 178 elif mon == "exit":#exit退出 179 print("\033[35m---------------------------------退出购物---------------------------------\033[0m") 180 break 181 else:#名称不对添加失败 182 print("\033[31m添加失败请核对产品名称\033[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('\033[31m----------------------------用户已存在请重新输入------------------------------\033[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}\n' #设置文件内容 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 = "\033[31m--------------------------成功创建用户:{l_1}------------------------------\033[0m" 210 print ll.format(l_1=w_1) 211 break 212 else: 213 print("\033[31m----------------------------密码长度过短------------------------------\033[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可以输出帮助