python+mysql基础项目:商场购物+管理系统

看过我上一篇文章的朋友都知道,我已经不满足于仅在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的方法肯定会更简便,但用仅学的知识,这已经是很大的突破了。

这个代码还可以更完善和更简洁,用户的电话信息和注册日期还没用上,有能力的朋友们可以拿来玩一下。

  • 10
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值