【项目】购物车系统(学习1个月的项目)
自学已近一个月,做的第一个项目,虽然写的时候磕磕碰碰,但还是写出来了。代码有好多不够完善的,在各位大佬面前就像是小孩子的玩具,但是我能力有限,相信我会慢慢强大起来的,这算是第一版,我的目标是:等后面知识学到位,做个真淘宝出来。
下面先附图片功能,再附源代码
代码:
# 导入模块 import os # 系统模块 from datetime import * # 时间模块 import pymysql # 数据库模块 import qrcode # 支付二维码模块 # 定义变量 is_login = False # 定义登录状态 info = [] # 记录登录后信息 sql = '' # sql语句 cursor = '' # 游标 connect = '' # 数据库连接参数 # ============================================= 主模块 =============================================# # 启动 def start(): # :start启动 tag_map = { # 定义启动选项的字典 '0': exit, # 退出 '1': login, # 登录 '2': register, # 注册 '3': forget_pwd # 忘记密码 } while True: os.system('cls') os.system('color 3E&title 欢迎使用购物车系统 V2.0') os.system('mode con cols=75 lines=25') print('''\n\n 【================== 欢迎使用淘宝系统 ==================】 请选择功能: 0.退出 1.登录 2.注册 3.忘记密码 ''') tag = input('请选择====>>').strip() tag_map[tag]() if (tag in tag_map) else print('您输入有误,请重新输入!') # ==================================== 1.登录 ====================================# # ====================定制数据库连接 connect ====================## def connect_sql(): # 连接数据库 global cursor, connect try: host = '106.75.31.89' user = 'root' password = '123456' data = 'data' port = 3306 connect = pymysql.connect(host, user, password, data, port, charset='utf8') # 数据库连接参数 cursor = connect.cursor() # 获取一个游标 print('连接成功!') except Exception: print('发生异常!') exit() # =============================获取文件=========================## def get_file(usr): # 获取登录用户的相关文件,返回取到的data数据 global sql, cursor sql = 'select *from info where usr ="%s"' % usr cursor.execute(sql) data = cursor.fetchone() return data # 执行sql语句 def execute_sql(sql): global cursor, connect cursor.execute(sql) connect.commit() # ========================获取用户名===========================## def get_usr(): # get获取 usr用户名 输入用户名,判断,返回 while True: usr = input('请输入用户名====>>').strip() if usr == '0': start() if not ((usr.isalpha() or usr.isnumeric()) and len(usr) >= 3): print('用户名输入错误') else: break get_info(usr) return usr # 获取新的info登录信息 def get_info(usr): global info info = get_file(usr) return get_file(usr) # ========================验证用户名===========================# def check_usr(): # check 核对 usr 用户名 global info usr = get_usr() if not info: input('没有此用户,请注册,按任意键返回。。。') start() #有问题 return usr # ==========================获取密码==========================## def get_pwd(usr): # get 取得 pwd 密码 while True: pwd = input('请输入密 码====>>').strip() if not len(pwd) >= 3: print('密码格式输入错误!') else: return pwd # =====================获取锁定相差时间=======================# # 获取当前时间 def at_time(): tim = datetime.now().strftime('%Y-%m-%d %H:%M:%S') # 当前时间 tim1 = datetime.strptime(tim, '%Y-%m-%d %H:%M:%S') # 转换统一格式 return tim1 # 获取锁定相差时间 def time_n(usr): tim1 = at_time() tim2 = datetime.strptime(get_file(usr)[6], '%Y-%m-%d %H:%M:%S') # 存在数据库时间格式 n = tim1 - tim2 n = 600 - n.seconds # 差额为秒 return n # ==================判断用户是否锁定状态=====================# # 判断用户是否锁定状态,时间到达10分钟后自定解锁 def lock_NY(usr): n = time_n(usr) if int(get_file(usr)[3]) < 0: if n > 0: input('您的账号已被锁定,还有%s秒解除,按任意键返回。。。' % n) return False elif n < 0: sql = 'update info set num=2 where usr="%s"' % (usr) execute_sql(sql) # ===============密码错误,写入数据库次数===================# # 密码错误,写入数据库次数 def check_pwd(usr): global info, cursor, sql, connect sql = 'update info set num=(num-1) where usr="%s"' % (usr) # 错误写入数据库 execute_sql(sql) # 执行sql语句 num = int(get_file(usr)[3]) # 获取还可以输入的次数 if num < 0: tim1 = at_time() sql = 'update info set time="%s" where usr="%s"' % (tim1, usr) # 锁定 用户,把时间插入数据库 execute_sql(sql) input('输入密码次数已达三次,用户将锁定10分钟!') else: input('密码错误,用户%s还有%s次机会!' % (usr, num + 1)) # ======================== 登录判断 ========================# # 登录判断 def login(): # 验证密码 while True: os.system('cls') global is_login, info print('''\n\n 【====================== 用户登录 ======================】 按 0 退出登录界面。。。 ''') usr = check_usr() # 获取用户名 if lock_NY(usr) == False: # 判断是否是锁定状态 start() pwd = get_pwd(usr) # 获取密码 if pwd == info[2]: if usr == 'admin': admin() else: is_login = True shop_start() else: check_pwd(usr) # ==================================== 2.注册 ====================================# # ======================= 获取手机号 =======================# def get_phone(phone): global sql, cursor sql = 'select *from info where phone ="%s"' % phone cursor.execute(sql) data = cursor.fetchone() return data # ==========================手机号=========================# # 注册手机号,并核对手机号是否重复 def check_phone(): while True: phone = input('请输入手机号:') if len(phone) == 11 and phone.isnumeric(): data = get_phone(phone) if data: print('您输入的手机号已被" %s "注册,请重新输入!' % data[1]) else: return phone else: print('您输入的格式错误!') # =====================验证注册用户=======================# # 验证注册用户 def check_reg_usr(): while True: usr = get_usr() if not info: print('用户未被注册,合法!') return usr else: print('用户已被注册,请重新输入!') # =======================注册用户=========================# # 注册用户 def register(): os.system('cls') print('''\n\n 【====================== 注册用户 ======================】 按 0 退出注册界面。。。 ''') global info usr = check_reg_usr() pwd = get_pwd(usr) phone = check_phone() tim1 = at_time() sql = 'insert into info (usr,pwd,num,money,phone,time) values ("%s","%s","2","10000","%s","%s")' % ( usr, pwd, phone, tim1) execute_sql(sql) input('注册成功,按任意键返回。。。') # ================================== 3.找回密码 ==================================# # ===================核对找回密码手机号====================# def check_for_phone(): global info while True: phone = input('请输入手机号:') if len(phone) == 11 and phone.isnumeric(): if phone == info[5]: break else: print('手机号核对错误,请重新输入!') else: print('您输入的格式错误!') print('手机号核对成功!') return phone # =======================输入新密码========================# # 输入新密码 def now_pwd(usr): while True: now_pwd1 = get_pwd(usr) now_pwd2 = get_pwd(usr) if now_pwd1 != now_pwd2: print('您输入两次的密码不一致,请重新输入!') else: return True # ========================找回密码=========================# # 找回密码 def forget_pwd(): os.system('cls') print('''\n\n 【====================== 找回密码 ======================】 按 0 退出找回界面。。。 ''') usr = check_usr() check_for_phone() input('找回成功!') if now_pwd(usr) == True else input('找回失败!') # ========================================华丽丽的分割线========================================# # =========================================启动购物系统========================================# # 启动购物车系统 def shop_start(): os.system('cls') print('''\n\n 【================ 欢迎使用淘宝购物系统 ================】 【 客户版 】 0.退出 4.购物车 1.查询余额 5.查看已购买过的商品 2.充值 8.注销 3.查看商品 9.修改客户密码 ''') tag_map = { '0': exit, '1': money, '2': top_up, '3': look_shop, '4': shop_cart, '5': bill, '8': logout, '9': change_pwd } while True: tag = input('请选择====>>') tag_map[tag]() if tag in tag_map else print('输入错误,请重新输入!') # 1、查询余额 def money(): global info get_info(info[1]) moneys = int(info[4]) if moneys < 2000: print('您的余额还有 %s 元,请及时充值,以免影响您的购物!' % moneys) input('按任意键继续。。。') shop_start() else: print('您的余额还有 %s 元 !' % moneys) input('按任意键继续。。。') shop_start() # 2、充值 def top_up(): os.system('cls') print('''\n\n 【======================= 充 值 ========================】 请选择支付方式: 0.取消支付 1.微信支付 2.支付宝支付 ''') tag_map = { '0': shop_start, '1': wechat_top_up, '2': Alipay_top_up } while True: tag = input('请选择====>>').strip() if tag in tag_map: tag_map[tag]() else: print('非法输入,请重新输入!') # 2.1、微信支付 def wechat_top_up(): while True: moneys = input('请输入您要充值的金额====>>').strip() if moneys.isnumeric(): break else: print('非法输入,请重新输入!') text = 'wxp://f2f0k4kxD8gJHD1YQNWKoRynRuntpiQ_g7ks' img = qrcode.make(text) img.show() print('正在支付中。。。') read_money(moneys) # print('充值成功%s元。。。')%str(moneys) money() top_up() # 2.2、支付宝支付 def Alipay_top_up(): while True: moneys = input('请输入您要充值的金额====>>').strip() if moneys.isnumeric(): break else: print('非法输入,请重新输入!') text = 'https://qr.alipay.com/fkx045285gzeelj8gjxze0a' img = qrcode.make(text) img.show() print('正在支付中。。。') read_money(moneys) # print('充值成功%s元。。。')%moneys money() top_up() # 2.9、修改支付金额 def read_money(moneys): global info usr = info[1] money_new = int(info[4]) + int(moneys) sql = 'update info set money="%s" where usr="%s"' % (money_new, usr) execute_sql(sql) # 3、查看商品 def look_shop(): os.system('cls') print("查看商品信息!") print('''\n\n 【==================== 选择商品类别 ====================】 0.返回上一级 5.电脑 1.零食 6.手机 2.汽车 7.珠宝 3.水果 8.餐厨 4.百货 9.奶粉辅食 ''') # 3.1、零食 snack # 3.2、汽车 car # 3.3、水果 fruit # 3.4、百货 general_goods # 3.5、电脑 computer # 3.6、手机 phone # 3.7、珠宝 jewelry # 3.8、餐厨 ware # 3.9、奶粉辅食 milk tag_mpa = { '0': shop_start, '1': '零食', '2': '汽车', '3': '水果', '4': '百货', '5': '电脑', '6': '手机', '7': '珠宝', '8': '餐厨', '9': '奶粉辅食' } while True: tag = input('请选择要购买的商品类型====>>').strip() if tag == '0': shop_start() # 返回上级菜单函数 elif tag in tag_mpa: sort = tag_mpa[tag] show_shop(sort) # 调用查看商品信息函数 while True: tag_num = input('\n\n\n详情请按序号,返回上一级按【0】=====>>').strip().lower() if tag_num == '0': look_shop() elif tag_num.isnumeric(): num_shop(tag_num, sort) # 调用选择商品函数 break else: print('您输入的有误,请重新输入!') else: print('您输入的有误,请重新输入!') # 3.1、查询商品详细信息 def demand_shop(b, l, sort): global cursor sql = 'select *from %s where %s="%s"' % (b, l, sort) execute_sql(sql) data = cursor.fetchall() return data # 3.2、显示商品信息 def show_shop(sort): os.system('cls') data = demand_shop('shop', 'sort', sort) print('' '\n\n 【================== 您正在查看 %s 类商品 ==================】\n\n' % sort) print('序号| 名称 | 金额 | 库存 | 描 述 |') for i in data: id, sort, name, cost, QTY, units, detail, *_ = i print('%s|【%s】|%s 元| %s%s|%s|' % (str(id).center(4), name.center(6, ' '), cost.rjust(7), QTY.rjust(6), units, detail.ljust(9, ' '))) # 3.3、选择商品 def num_shop(tag_num, sort): global cursor try: sql = 'select pic from shop where sort="%s" and id="%s"' % (sort, tag_num) cursor.execute(sql) # 打开商品图片 output = open('image.png', 'wb') output.write(cursor.fetchone()[0]) output.close() print('正在打开详情。。。') os.startfile('image.png') # 选择商品 join_shop(tag_num, sort) return True except Exception: print('您选择的商品序号错误,请重新选择!') show_shop(sort) # 3.4、加入购物车 def join_shop(tag_num, sort): while True: l = input('是否满意 [y / n] ====>>').lower().strip() if l == 'y': while True: l = input('是否加入购物车 [y / n] ====>>').lower().strip() if l == 'y': while True: sort, name, cost, QTY, units = look_QTY(tag_num, sort) inp_num = input('输入需要加入的数量,库存还有%s%s====>>' % (QTY, units)).lower().strip() if inp_num.isnumeric(): if int(inp_num) > int(QTY) or int(inp_num) <= 0: print('您输入的数量大于库存,请输入%s%s以内的数量!' % (QTY, units)) else: break else: print('输入不合法,请重新输入!') print('加入成功,可以在购物车中查看。') inp_num_1 = int(QTY) - int(inp_num) amend_QTY(inp_num_1, sort, tag_num) join_shop_cart(sort, name, cost, units, inp_num) input('按任意键返回继续购物。。。').lower().strip() look_shop() else: look_shop() else: print('滚犊子') # 3.5、查询库存 def look_QTY(tag_num, sort): global cursor sql = 'select sort,name,cost,QTY,units from shop where sort = "%s" and id = "%s"' % (sort, tag_num) execute_sql(sql) sort, name, cost, QTY, units = cursor.fetchone() print(QTY, units) return sort, name, cost, QTY, units # 3.6、修改库存 def amend_QTY(QTY, sort, tag_num): sql = 'update shop set QTY="%s" where sort ="%s" and id = "%s" ' % (QTY, sort, tag_num) execute_sql(sql) # 3.7、加入购物车 def join_shop_cart(sort, name, cost, units, inp_num): global info info_name = info[1] moneys = int(cost) * int(inp_num) print(moneys) sql = 'insert into shop_cart (sort,name,cost,QTY,units,moneys,info_name)' \ ' VALUES ("%s","%s","%s","%s","%s","%s","%s")' % (sort, name, cost, inp_num, units, moneys, info_name) execute_sql(sql) # 4、购物车 def shop_cart(): global info get_info(info[1]) moneys = int(info[4]) add = shop_detail() tag = input(''' 0.返回 1.清空购物车 2.结账 请选择====>>''').lower().strip() if tag == '2': if add <= moneys: account(info[1]) money_old = get_info(info[1])[4] money_new = int(money_old) - add sql = 'update info set money = "%s"' % money_new execute_sql(sql) print('结账成功,请亲耐心等待发货哦!') money() else: input('您的余额不足,请充值!') shop_start() elif tag == '1': empty() input('已清空购物车,按任意键返回。。。') else: shop_start() # 4.1、查看购物车明细 def shop_detail(): os.system('cls') print('\n\n' ' 【===================== 查看购物车 =====================】\n\n') global info usr = info[1] data = demand_shop('shop_cart', 'info_name', usr) if data: n = add = 0 print('' '序号| 名称 | 金额 | 数量 | 小计金额 |') for i in data: n += 1 id, sort, name, cost, QTY, units, moneys, info_name = i add = add + int(moneys) print('%s|【%s】|%s 元| %s%s|%s 元|' % (str(n).center(4), name.center(6, ' '), cost.rjust(7), QTY.rjust(6), units, moneys.rjust(8))) print('\n\n您购物车中的商品总计:%s件,%s元:' % (n, add)) return add else: input('您在购物车无商品,按任意键去购买。。。') look_shop() # 4.2、结账 def account(usr): global cursor, connect # 写入数据库buy_record表 data = demand_shop('shop_cart', 'info_name', usr) buy_time = at_time() for i in data: print(i) id, sort, name, cost, QTY, units, moneys, info_name = i sql = 'insert into buy_record (sort, name, cost, QTY, units, moneys, info_name, buy_time) ' \ 'VALUES ("%s","%s","%s","%s","%s","%s","%s","%s")' % ( sort, name, cost, QTY, units, moneys, info_name, buy_time) cursor.execute(sql) connect.commit() sql = '' empty(usr) def empty(usr): # 清除数据库shop_cart表中符信息 sql = 'delete from shop_cart where info_name = "%s"' % usr execute_sql(sql) # ============================== 5、查看已购买过的商品 ==================== # 5、查看已购买过的商品 def bill(): os.system('cls') print('\n\n' ' 【===================== 查看已够买 =====================】\n\n') global info usr = info[1] data = demand_shop('buy_record', 'info_name', usr) if data: n = add = 0 print('序 号| 名称 | 金额 | 数量 | 小计金额 | 购买日期 |') for i in data: n += 1 id, sort, name, cost, QTY, units, moneys, info_name, buy_time = i add = add + int(moneys) print('%s|【%s】|%s 元| %s%s|%s 元|%s|' % (str(n).center(5), name.center(6, ' '), cost.rjust(7), QTY.rjust(6), units, moneys.rjust(8), buy_time.rjust(20))) input('\n\n您消费总计:%s件,%s元。按任意键返回。。。' % (n, add)) shop_start() return add else: input('您无购买记录,按任意键去购买。。。') look_shop() # ============================== 8、注销 ================================== # 8、注销 def logout(): global info, is_login is_login = False info = '' input('注销成功,按任意键重新登录!') start() # ============================== 9、修改密码 ============================== # 9、修改密码 def change_pwd(): os.system('cls') print('''\n\n 【======================= 修改密码 =====================】 按 0 退出修改界面。。。 ''') global info usr = info[1] check_for_phone() input('修改成功!') if now_pwd(usr) == True else input('修改失败!') # ========================================== 管理员 ================================================$ def admin(): os.system('cls') print('''\n\n 【================ 欢迎使用淘宝购物系统 ================】 【 管理员版 】 0.退出 1.管理客户 2.管理商品 8.注销 9.修改管理员密码 ''') while True: tag = input('请选择功能=====>>').strip() tap_map = { '0': exit, '1': client_usr, # 管理客户 '2': shop_admin, '7': logout, '8': change_pwd, '9': contact_way, } tap_map[tag]() if tag in tap_map else print('您输入有误,请重新输入!') # 1、管理客户 def client_usr(): os.system('cls') global cursor print('''\n\n 【====================== 管理客户 ======================】 客户列表: |序 号| 客户名 | 客户余额 | 手机号 |''') # 查询客户信息 sql = 'select id,usr,money,phone from info' cursor.execute(sql) data = cursor.fetchall() for i in data: id, usr, money, phone = i print(' | %s |%s|%s元|%s|' % (str(id).center(3), usr.center(12), money.rjust(10), phone.rjust(12))) # 删除客户信息 usr_id = input('\n\n请输入需要操作客户的序号 [按 0 返回]====>>').strip() if usr_id == '0': admin() else: print('''请选择: 1.修改客户名称 2.修改客户手机号 3.注销客户账户 ''') while True: tag = input('请选择功能=====>>').strip() tap_map = { '1': amend_usr, # 管理客户 '2': amend_phone, '3': del_usr } tap_map[tag](usr_id) if tag in tap_map else print('您输入有误,请重新输入!') # 1.1、修改客户名称 def amend_usr(usr_id): res = input('请输入新客户名称====>>').strip() rest('usr', res, usr_id) # 1.2、修改客户手机号 def amend_phone(usr_id): res = check_phone() rest('phone', res, usr_id) # 1.3、注销客户账户 def del_usr(usr_id): res = input('请确认是否[ y / n ]删除,删除无法找回!').strip().lower() if res == 'y': sql = 'delete from info where id = "%s"' % usr_id execute_sql(sql) input('修改成功按任意键返回。。。') admin() else: admin() # 1.9 def rest(field, res, usr_id): sql = 'update info set %s = "%s" where id = "%s"' % (field, res, usr_id) execute_sql(sql) input('修改成功按任意键返回。。。') admin() # 2、管理商品 def shop_admin(): os.system('cls') global cursor print(''' 【===================== 全部商品 =====================】 ''') print('序号| 名称 | 金额 | 库存 | 描 述 |') sql = 'select *from shop' execute_sql(sql) data = cursor.fetchall() for i in data: id, sort, name, cost, QTY, units, detail, *_ = i print('%s|【%s】|%s 元| %s%s|%s|' % (str(id).center(4), name.center(6, ' '), cost.rjust(7), QTY.rjust(6), units, detail.ljust(9, ' '))) input('如需修改库存,请到数据库修改,按任意键返回。。。') admin() # 9、联系我 def contact_way(): print(''' 如有任何问题,请联系我! QQ:1206709430 微信:15536582917 ''') connect_sql() start()