看过我上一篇文章的朋友都知道,我已经不满足于仅在python里输入输出了。前辈也告诉我,只是把货物写死在python里是没有前途的,所以我这次在上一篇文章的基础上,把商品数据和用户数据写进数据库,下面我就来实现它吧。
需求分析:
"""
1.将商品、用户连入到mysql中(完成)
2.建立管理员的管理系统:
功能1:查看数据库中的商品(完成)
功能2:在控制台增加数据库中的商品(完成)
功能3:在控制台删除数据库中的商品(完成)
功能4:退出商品管理系统(完成)
3.用户操作系统:
功能1:用户的账户信息,mysql实现(完成)
功能2:每个用户的登录(完成)
功能3:购买商品,并计算总价(完成)
功能4:钱包付款功能
"""
完整代码:
import pymysql
conn = pymysql.connect('***')
#conn这部分连接数据库,'***'的部分就填写数据库的相关信息,这里不让放出来,大家可以去找模式套
def login(): #用来区分顾客、管理员和退出操作
print('==========Welcome to Shopping Center==========')
user=input("顾客请按1,管理员请按2,退出请按0:")
if user == '2':
login_administrator()
if user == '0':
return 0
else:
login_menber()
def login_menber(): #顾客登录
user_name = input("请顾客输入登录号码:") #输入顾客登录号码
try: #用try是由于刚开始写的时候总是报错,直接就把报错弄到except里去,好处是没有报错了,坏处是错了你也不知道在哪
cursor = conn.cursor()
cursor.execute("select Mpassword from Menber where Mnum = %s", user_name)
Password = cursor.fetchone()
Password = Password[0] #刚开始写的时候,这里当你输入一个数据库里没有的账号时,报错我没办法解决,后面用try后,找不到账号时就会到except里去,并且不会报错
try:
password = input("请输入密码:") #输入的类型为字符型
password = int(password) #我们要将输入的密码的类型从字符型改为int型
if Password == password: #输入的密码和数据库里的密码对上了,就将账户信息输出
cursor = conn.cursor()
cursor.execute("select Mnum,Mname,Mbalance from Menber where Mnum = %s", user_name)
menber = cursor.fetchall()
for row in menber: #这里遍历了账户的三个信息,用数组分为三份输出
Mnum = row[0]
Mname = row[1]
Mbalance = row[2]
print("卡号=%s,姓名=%s,剩余金额=%s" % (Mnum, Mname, Mbalance)) #将卡号、姓名、剩余金额输出
cursor=conn.cursor()
cursor.execute("update 中转金额 set Nnum = %s where id = 1",Mnum) #最最重要的地方,因为只用python和mysql,所以把卡主编号弄到另一张表来避免了函数的调用问题
conn.commit()
userwork()
else: #输入的密码和数据库里的对不上,密码错误,重新再输入,有能力的朋友可以设置允许输入的次数,超过次数锁定账户
print("密码错误,请重新输入")
login_menber()
except:
print("出错了!")
except:
print("没有查询到数据,请重新输入")
login()
def login_administrator(): #管理员输入
user_name = input("请输入管理员登录名:") #输入管理员的用户名,我这里就弄了一个管理员,我就直接写死了,有能力的朋友可以像顾客那样弄到数据库里
if user_name == "admin":
password = input("请输入密码:")
if password == "1": # 这里不能用while来写,不然在adminwork()中没法break
print("欢迎您,伟大的管理员") #为了方便调试,我就将密码改成1
adminwork() #然后就跑adminwork()这个函数了
else:
print("密码错误,请重新输入") #密码错了就再输密码呗
login_administrator()
else:
print("账号输入错误哦!请重新输入") #账号错了,你是不是假的管理员,直接退出去分顾客和管理员
login()
def adminwork(): #管理员的功能分流函数,显而易懂
over = "结束"
print('==========Welcome! The Greatest Administrator===========')
info='''
==========欢迎来到购物商场管理系统==========
输入功能编号,你可以选择相应的功能:
输入“1”:显示商品信息
输入“2”:添加新商品的信息
输入“3”:删除商品的信息
输入“4”:退出购物商场管理系统
========================================
'''
print(info)
while True:
code = input("请输入功能编号:")
if code == "1":
showgood()
if code == "2":
addgood()
if code == "3":
deletegood()
if code == "4":
print("感谢您使用购物商场管理系统!")
conn.close()
break
def userwork(): #顾客的没什么用函数,这里是前期写的,后面就懒得改了,略显臃肿,这里可以和后面buygood()整合。
print('==========尊贵的顾客您好!快去买东西吧==========')
showgood()
buygood()
def showgood(): #展示所有货物的函数
cursor = conn.cursor()
cursor.execute("select Gnum,Gname,Gtype,Gprice,Gstock from Goods;") #将商品的编号、名称、类别、售价和库存量选择
result = cursor.fetchall() #存到result
print("--商品编号--名称---类别---售价--库存量--")
for i in result: #遍历了一遍result
print(i) #输出result里的内容
cursor.close()
def addgood(): #添加商品,用了很笨的方法,将商品的信息分别input进5个参数内,再用数据库增删改查中的增,弄进数据库对应的表中
cursor = conn.cursor()
Gnum=input("请输入新添加的商品编号:")
Gname=input("请输入新添加的商品名称:")
Gtype=input("请输入新添加的商品的类别:")
Gprice=float(input("请输入新添加的商品价格:"))
Gstock=input("请输入新添加的商品数量:")
param=(Gnum,Gname,Gtype,Gprice,Gstock)
sql=("insert into Goods values(%s,%s,%s,%s,%s);")
cursor.execute(sql,param) #execute刚开始用的时候我在","右边直接弄进5个值,嘎嘎报错,这里逗号只能右边放一个参数,要把它们封装好再弄进去
conn.commit()
cursor.close()
def deletegood(): #删除商品信息的函数
showgood()
num = input("请输入要删除的商品编号:")
cursor=conn.cursor()
cursor.execute("select Gnum,Gname,Gtype,Gprice,Gstock from Goods where Gnum =%s;",num) #选择并展示要删除的商品的信息
result = cursor.fetchall()
for i in result:
print(i)
answer = input("你确定删除此商品吗?确定请按'y'或'Y',否则请按'n'或'N':") #判断是否删除,毕竟删库就得跑路,慎重点好..
while True:
if answer == 'n' or answer == 'N':
print("删除失败!")
break
elif answer == 'y' or answer == 'Y':
cursor.execute("delete from Goods where Gnum = %s;",num)
conn.commit()
print("删除成功!")
break
else:
print("请重新规范输入!")
break
def buygood(): #重头戏,顾客购物的函数,最难写的部分
total=0 #先定义并给累计的金额total赋值
cursor=conn.cursor()
while True: #循环,罪恶的开始
num = input("请输入选择购买商品的编号(退出结算请输入end):") #input一个要购买的商品编号
if num != 'end': #判断input的值是否等于'end',我们设置输入'end'为结束购买的标志
try:
cursor.execute("select Gname,Gtype,Gprice,Gstock from Goods where Gnum=%s;",num) #我们用sql语句选择出购买商品编号的名称、类型、单价、库存量
result = cursor.fetchone()
name=result[0]
type=result[1]
price=result[2]
stock=result[3]
print('该商品的名称:',name,'类型:',type,'单价:',price,'库存量:',stock)
except:
print("输入的商品编号有误") #这里没想到好的办法,小白能力有限,原意是想当输入编号有误,重新输入,但之前已经选好的商品不变,希望有大佬能提供点思路。
return 0
number = input("请输入要购买的数量:")
cursor.execute("select Gstock from Goods where Gnum = %s;", num) #选取被选中商品的存货量
stocks = cursor.fetchone()
stocks = stocks[0]
if float(stocks) >= float(number): #被选中商品的存货量与要购买的数量比较
cursor.execute("select Gprice from Goods where Gnum=%s;", num)
price = cursor.fetchone()
price = price[0]
total = float(price) * float(number) + float(total) #计算目前要支付的金额总和
print("目前要支付:", total, "元")
cursor.execute("update 中转金额 set total = %s", total) #将目前要支付的金额总和存到中转金额这张表中
s = (number, num)
cursor.execute("update Goods set Gstock=Gstock-%s where Gnum = %s;", s) #库存量减去被购买的商品数量
showgood()
else:
print("没有那么多商品!")
else:
balance1 = 0
cursor.execute("select total from 中转金额 where id = 1") #因为每次使用这个系统只有一个人,所以中转金额这张表的id写死的只有1,方便调用和存储数据
total1 =cursor.fetchone()
total1 = total1[0]
print('总共消费:',total1,'元')
cursor = conn.cursor()
cursor.execute("select Nnum from 中转金额 where id = 1") #前面把用户的编号写进中转金额这张表的用处,可以随时提取用户编号进行增删改查
Nnum =cursor.fetchone()
Nnum=Nnum[0]
cursor = conn.cursor()
cursor.execute("select Mbalance from Menber where Mnum = %s", Nnum) #将用户账户里的金额拿出来相减
Mbalance=cursor.fetchone()
Mbalance=Mbalance[0]
balance1 = float(Mbalance) - float(total)
if balance1 < 0:
print("您的余额不足,请理智消费") #没钱搞毛啊,总不能赊账吧
break #余额不足直接弹出,此时货物没有commit,先前选择的货物放回原处
else:
print("剩余金额为:", balance1)
s = (balance1, Nnum)
cursor = conn.cursor()
cursor.execute("update Menber set Mbalance=%s where Mnum=%s", s) #把用户的剩余金额改回来
cursor = conn.cursor()
cursor.execute("update 中转金额 set total=0 where id = 1") #把中转金额表中的累计金额清零,防止下一个用户进来不买东西也扣钱
conn.commit()
break
cursor = conn.cursor()
cursor.execute("update 中转金额 set total=0 where id = 1")
conn.commit() #按流程最后将顾客购买的累计金额清零,避免下一位顾客成为冤大头(顾客进入程序,但没买东西,直接end,会扣除中转金额中的total)
cursor.close()
if __name__ == "__main__":
login()
数据库方面的信息:
Menber的信息:
Menber的设计结构:
Goods的信息:
Goods的设计结构:
中转金额的信息:
中转金额的设计结构:
写这些代码的中途也遇到各种各样的问题,感谢很多大佬给我的支持!
一个还没入门的学习者,写代码最大的动力便是在运行的时候能正确的输出想要的内容。在学习的过程中亲身悟到的知识更是难能可贵。我印象最深的就是创造中转金额的这张表。当时我在前面函数input的用户编号没办法用到后面的函数中,这一度让我两三天难以突破、毫无进展,但我后面想到再设计一张表,只存当前操作的用户的信息,到后面函数直接提取这条信息就能解决这个问题时,得到了前辈确认我这种思路是对的后,我真的很兴奋!当然现实的办法更多,解决这种小case的方法肯定会更简便,但用仅学的知识,这已经是很大的突破了。
这个代码还可以更完善和更简洁,用户的电话信息和注册日期还没用上,有能力的朋友们可以拿来玩一下。