面版式购物车
购物车程序:
应该实现的功能:
1. 注册
2. 登陆
3. 购物
4. 支付
5. 充值
大概实现思路:
要求用函数封装功能
while True:
print("""
0. 退出
1. 注册
2. 登陆
3. 购物
4. 支付
5. 充值
""")
choice=input('>>>: ').strip()
if choice == '0':break
if choice == '1':
register()
elif choice == '2':
login()
....
1 # 存储文件中用户信息 2 # "abc|123|0,qwe|123|1000" 3 # 将文件信息读取到内存中,以变量存储,后期需要大量与这些信息交互 4 # 如何设计存储用户信息的集合变量 5 # 以用户名为key的dict,value为{} 6 users_dic = {} # 从文件中读取来 7 ''' 8 { 9 'abc': {'ps': '123', 'money': 0}, 10 'qwe': {'ps': '000', 'money': 1000} 11 } 12 ''' 13 # 存储当前登录成功的用户的信息 14 user = {} 15 # {'usr': 'abc', 'ps': '123', 'money': 0} 16 17 # 获取所有已注册的用户,存放到user_dic 18 # 获取文件中用户信息 19 def get_users(): 20 # 如果用户集合已经有值,代表用户信息已经读取过了,不需要重复读取|当值为none,0,空时,为False 21 if users_dic:#不为空,说明已经读取文件 22 return users_dic 23 # 为空,读文件,存用户们 24 with open('usr.info', 'rt', encoding='utf-8') as f: 25 # "abc|123|0,qwe|123|1000" or "abc|123|0" or none 26 data = f.read() 27 if not data: 28 # 文件中并没有用户信息,那么用户集合也不需要存储,可以直接返回 29 return users_dic 30 # 'abc|123|0, qwe|123|1000' or 'abc|123|0',一个用户也可以用,进行分割 31 data_list = data.split(',') 32 for d in data_list: 33 # ['abc', '123', '0'] 34 user_info = d.split('|') 35 usr = user_info[0] 36 ps = user_info[1] 37 # 文件中读取的money为字符串,将money以数字存储在内存,分别购物等的运算 38 money = int(user_info[2]) 39 # 按照 'abc': {'ps': '123', 'money': 0} 存储到 users_dic 40 users_dic[usr] = {'ps': ps, 'money': money} 41 return users_dic 42 43 # 注册 44 def regist(): 45 print("注册界面...") 46 # 获取所有用户信息 47 users = get_users()#获得返回的用户信息字典 48 # 账号输入操作 49 temp_info = "请" 50 #输入用户名阶段 51 while True: 52 usr = input(temp_info + "输入账号:").strip() 53 # 输入的用户名有格式问题 54 if not usr: # 用户名为空 55 print("账号不能为空!") 56 temp_info = "请重新" 57 continue 58 # 用户已存在 59 if usr in users: 60 print("用户已存在,请更换用户名!") 61 temp_info = "请重新" 62 continue 63 # 用户不存在,可以进入输入密码阶段 64 break 65 # 密码输入操作 66 temp_info = "请" 67 while True: 68 ps = input(temp_info + "输入密码:").strip() 69 # 输入的密码有格式问题 70 if len(ps) < 3: 71 print("密码过短!") 72 temp_info = "请重新" 73 continue 74 # ... 添加其他密码安全判断 75 break 76 # 账号密码均满足条件,可以注册(写入文件) 77 with open('usr.info', 'at', encoding='utf-8') as f: 78 # 文件是否为空 79 # 为空;不为空abc|123|0 ,qwe|123|0 80 # users是否为空可以直接反映文件是否为空 81 if users:#不为空 82 user_info = ',%s|%s|%d' % (usr, ps, 0) 83 else:#为空 84 user_info = '%s|%s|%d' % (usr, ps, 0) 85 f.write(user_info) 86 # 文件操作完代表信息更新到文件中了, 87 # 还需要将信息更新到内存字典中 88 users[usr] = {'ps': ps, 'money': 0} #key对应value进行存值 89 print('注册成功!') 90 91 92 # 登录 93 def login(): 94 global user 95 print("登录界面...") 96 # 获取所有用户信息 97 users = get_users() 98 # 当前是否为登录状态 99 # 可以通过user(存储已登录账号)来反映是否为登录状态 100 if user: 101 print("系统已经处于登录状态!") 102 return#结束登录函数 103 # 用户名输入 104 temp_info = "请" 105 while True: 106 usr = input(temp_info + '输入账号:').strip() 107 # 输入账号为空 108 if not usr: 109 print("账号不能为空!") 110 temp_info = "请重新" 111 continue 112 # 账号不存在 113 if not usr in users: 114 print("输入用户名不存在") 115 # 文件为空,没有必要继续,不为空,可以让用户重新输入 116 if users: 117 temp_info = "请重新" 118 continue 119 #文件为空 120 return 121 #账号输入正确,结束循环 122 break 123 # 输入密码操作 125 count = 0 126 while count < 3: 127 ps = input(temp_info + '输入密码:').strip() 128 #密码正确 129 if users[usr]['ps'] == ps: 130 print('登录成功!') 131 # money在二次以后操作文件可能已经拥有金额 132 money = users[usr]['money'] 133 # 直接赋值代表覆盖,方法内不能直接覆盖全局变量,需要做global处理 134 user = {'usr': usr, 'ps': ps, 'money': money} 135 break 136 #密码错误 137 print('密码输入错误!') 138 temp_info = "请重新" 139 count += 1 140 141 # # 登录状态验证 142 # def not_login(): 143 # if not user: 144 # print('系统未登录!') 145 # return True 146 147 # 账户 148 def account(): 149 #未登录 150 if not user: 151 print('系统未登录!') 152 return #结束函数 153 #已登录 154 user_info = '账户:%s | 密码:%s | 金额:%d ' % (user['usr'], user['ps'], user['money']) 155 print(user_info) 156 157 # 注销 158 def logout(): 159 if not user: 160 print('系统未登录!') 161 return 162 #已登录 163 user.clear() 164 print('注销成功') 165 166 # 登录成功后,对于商品的一系列操作 167 # 商品列表 168 goods_dic = {'1': 'iPhone', '2': 'Mac', '3': 'iPad'} 169 price_dic = {'iPhone': 100, 'Mac': 200, 'iPad': 50} 170 # 购物车 171 shop_car = {} 172 # {'iPhone': 3, 'iPad': 1} 173 goods_msg = ''' 174 请添加商品到购物车: 175 1.iPhone | 2.Mac | 3.iPad | 0.退出购买''' 176 177 # 充值 178 def top_up(): 179 if not user: 180 print('系统未登录!') 181 return 182 temp_info = "请" 183 while True: 184 money = input(temp_info + '输入充值金额:').strip() 185 if not money.isdigit(): 186 print('输入金额有误!') 187 temp_info = "请重新" 188 continue 189 money = int(money) 190 break 191 # 更新金额 192 update_info('money', money) 193 print("充值完毕!") 194 195 # 对密码或金额进行修改 196 def update_info(k, v): 197 # 需要更新的内容有: 198 # 1.当前登录状态下的用户 199 # 2.内存中的用户们 200 # 3.文件中的用户信息 201 202 # 更新1号位 203 # 区分更新的类型 204 if k == 'money': 205 user[k] += v 206 else:#改密码 207 user[k] = v 208 # 通过1号位更新2号位 209 users = get_users() 210 #users['abc']['money'] = user['money'] 211 users[user['usr']][k] = user[k] 212 # 通过2号位更新3号位 213 # 将 214 # {'abc': {'ps': '123', 'money': 0},'qwe': {'ps': '000', 'money': 1000}} 215 # 转换为 216 # "abc|123|0,qwe|123|1000" 217 # 写入文件 218 # dict 转换为 str 219 users_info = '' 220 for k, v in users.items(): 221 usr = k 222 ps = v['ps'] 223 #写入文件时是字符串 224 money = str(v['money']) 225 if not users_info:#拼接第一个用户 226 users_info += '|'.join((usr, ps, money))#覆盖 227 else:#拼接第二及以后用户时,文件已经写入第一个用户 228 users_info += ',' + '|'.join((usr, ps, money)) 229 # 转换完毕后便可以写入文件 230 with open('usr.info', 'wt', encoding='utf-8') as f: 231 f.write(users_info) 232 233 # 购物 234 def shopping(): 235 if not user: 236 print('系统未登录!') 237 return 238 print(goods_msg) 239 while True: 240 # 商品编号 241 goods_num = input("商品编号:").strip() 242 if goods_num == '0': 243 print('退出购买!') 244 break 245 if not goods_num in goods_dic: 246 print('商品不存在!') 247 continue 248 249 while True: 250 # 商品数 251 count = input('商品个数:').strip() 252 if not count.isdigit(): 253 print('个数有误!') 254 continue 255 count = int(count) 256 # 编号与个数均正确 257 # 加入购物车:{商品名: 个数} 258 goods = goods_dic[goods_num]#商品名 259 # 通过商品与购物车进行匹配,判断商品个数是累加还是赋值 260 if not goods in shop_car: 261 shop_car[goods] = count 262 else: 263 shop_car[goods] += count 264 # 更新完购物车后代表一次购物车添加完毕 265 # 查看一下当前购物车信息 266 shop_cart_info() 267 break 268 # 进入支付:余额充足直接付款,不足充值 269 pay_money() 270 271 # 购物车 272 def shop_cart_info(): 273 if not shop_car: 274 print("购物车为空,可前往购物!!!") 275 return 276 print("购物车: ", shop_car) 277 278 # 支付 279 def pay_money(): 280 if not user: 281 print('系统未登录!') 282 return 283 # 由购物来到支付,也可能主动调用支付 284 if not shop_car: 285 print("购物车为空,请前往购物!") 286 return 287 # 计算购物车内商品总价 288 total = 0 289 for goods in shop_car: 290 total += price_dic[goods] * shop_car[goods] # 名称*价格 291 # 判断余额与商品总价大小 292 if user['money'] >= total: 293 print('余额充足,购买成功!') 294 # 更新信息 295 reduce = 0 - total 296 update_info('money', reduce) 297 # 支付成功后,需要清空购物车 298 shop_car.clear() 299 else: 300 print('余额不足,请充值!') 301 top_up() 302 303 304 # 系统功能提示信息 305 sys_msg = ''' 306 欢迎使用购物车简单系统,请选择: 307 1.注册 | 2.登录 | 3.账户 | 4.充值 | 5.购物 | 6.支付 | 7.购物车 | 10.注销 | 0.退出 308 >>>''' 309 # 功能字典 310 method_dic = { 311 '1': regist, 312 '2': login, 313 '3': account, 314 '4': top_up, 315 '5': shopping, 316 '6': pay_money, 317 '7': shop_cart_info, 318 '10': logout 319 } 320 321 # 系统入口 322 def system(): 323 while True: 324 choice = input(sys_msg).strip() 325 # 退出选项 326 if choice == '0': 327 print("退出系统!") 328 return 329 # 错误选项 330 if not choice in method_dic: 331 print("功能输入有误,请重新输入") 332 continue 333 # 正确选项: eg: '1'-> regist 334 method_dic[choice]() 335 336 system()