python练习——控制台集注册、登录、购物一体化项目


前言

经过一段时间学习,掌握了不少python基础,今天要写的项目是登录注册购物三种功能的小项目。(由于结构简单并没有上传git)


一、项目开发规范划分

功能
core注册、登录、购物核心功能
data存放注册的用户数据、商品信息
public存放编写的方法文件
start存放启动文件

在这里插入图片描述


二、开发环境及其版本

没有写版本的对应是python3.7的

开发环境版本
python3.7
json
sys
os
time
hashlib

三、core包

1.register模块

对于核心功能首先是注册需要注意以下几点:

  1. 用户名对应的文件夹是否已存在
  2. 密码与确认密码是否一致,密码长度是否在6到14位
  3. 注册成功时会生成对应用户文件
import os
import time
import json
from public.tools import encrypt

def register():
    print("欢迎注册")
    key = 1
    dir1 = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data")
    while key != 0:
        username = input("请输入用户名:")
        password = input("请输入密码(6~14位包含大小写字母、数字):")
        password1 = input("再次输入密码:")
        dir2 = os.path.join(dir1, username)
        if not os.path.isfile(dir2):
            key = 0
            if len(password) in [i for i in range(6, 15)] and key != 1 and len(password1) in [i for i in range(6, 15)]:
                key = 0
                if password == password1:
                    key = 0
                else:
                    key = 1
                    print("俩次密码不一致")
            else:
                key = 1
                print("密码不符合规定请重新设置")
        else:
            key = 1
            print("该用户名已被注册")
            print("请重新输入")
    if key == 0:
        res = encrypt(password)#encrypt定义在tools中,用于密码加密
        data = {"username": username, "password": res, "balance":15000,"shop_car":{}}
        os.mkdir(dir2)
        file = username + ".txt"
        dir3 = os.path.join(dir2, file)
        with open(dir3,"w",encoding="utf8") as u:
            u.write(json.dumps(data))
        print("注册成功,2秒后返回主界面")
        time.sleep(2)

if __name__ == '__main__':
    register()

2.login模块

登录模块注意以下几点:

  1. 登录时用户文件夹是否存在
  2. 密码是否与用户文件一致
import json
import os
import time
from public.tools import isLogin,encrypt

def login():
    print("软件登录")
    key = 1
    while key != 0:
        username = input("请输入用户名:")
        password = input("请输入密码:")
        """
        登录时获取用户文件夹,如果存在该文件夹再继续用户验证
        """
        dir1 = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data")
        dir2 = os.path.join(dir1, username)
        if os.path.isdir(dir2):
            file1 = os.path.join(dir2, username + ".txt")
            with open(file1, "r", encoding="utf8") as f:
                dict = json.loads(f.read())
            res = encrypt(password) #encrypt定义在tools中,用于密码加密
            if dict["password"] == res:
                print("登陆成功,1秒后进入主界面")
                time.sleep(1)
                isLogin["username"] = username
                key = 0
            else:
                print("用户名或密码错误")
        else:
            print("用户名或密码错误")


if __name__ == '__main__':
    login()

3.shopBox模块

购物模块注意以下几点:

  1. 购买物品时是否加还是减
  2. 物品数量为0时从购物车删除
  3. 物品从无到有时添加
  4. 结算购物车时如果扣费需要清空购物车,不够时给予提示
import os
from public import tools

@tools.is_login
def shopping():
    commoditys = tools.load_commdity()
    user = tools.read_user()
    user_money = user["balance"]
    shop_list = user["shop_car"]
    key = 3
    while key != 0:
        k = 0
        for i in commoditys:
            if k % 2 == 0:
                print("商品:", i)
            else:
                print("单价:", i)
            k += 1
        print("1.添加商品到购物车")
        print("2.结算购物车")
        print("0.返回主界面")
        sc = input("请选择功能:")
        if sc.isdigit():
            key = int(sc)
            if key == 1:
                add_shop(commoditys, shop_list)
            elif key == 2:
                settle_shop(user_money, shop_list)
            else:
                key = 0

def add_shop(commoditys, shop_list): #从购物车中添加或删除商品
    commodity_name = input("请输入需要的商品:")
    price = commoditys[commoditys.index(commodity_name) + 1]
    if commodity_name in commoditys:
        sc1 = input("请输入购买的数量:")
        if tools.is_sum(sc1):
            num = int(sc1)
            if commodity_name in shop_list:
                if num > 0:
                    shop_list[commodity_name][0] += num  # 添加或减少到购物车操作
                    tools.save_shop_car(shop_list)
                elif shop_list[commodity_name][0] + num > 0:
                    shop_list[commodity_name][0] = shop_list[commodity_name][0] + num
                    tools.save_shop_car(shop_list)
                elif shop_list[commodity_name][0] + num == 0:
                    del shop_list[commodity_name]
                    tools.save_shop_car(shop_list)
                else:
                    print("购物车中数量不足或不存在,无法减少该商品数量")
            else:
                shop_list[commodity_name] = [num, price]
                tools.save_shop_car(shop_list)
        else:
            print("购买数量必须为整数")
    else:
        print("不能购买不存在的商品")

def settle_shop(user_money, shop_list): #结算购物车
    if len(shop_list) == 0:
        print("你还没有购物快去购物一番吧")
    else:
        shop_list_value = shop_list.values()
        sum = 0
        for i in shop_list_value:
            sum += int(i[0]) * int(i[1])
        if user_money >= sum:
            user_money -= sum
            shop_list.clear()
            print("本次你消费了%d¥,账户余额:%d¥,欢迎下次再来" %(sum, user_money))
            tools.save_shop_car(shop_list)
            tools.save_user_money(user_money)
        else:
            print("你的余额不足,请尽快充值")



if __name__ == '__main__':
    shopping()

在这里插入图片描述


四、data包

该包用于存放用户文件夹和商品信息,存取时需要用到json模块
在这里插入图片描述

用户文本
{“username”: “kdq”, “password”: “e10adc3949ba59abbe56e057f20f883e”, “balance”: 15000, “shop_car”: {}}

商品文本
[“梨子”,10, “苹果”,5, “只狗key”,198, “一只贝爷”,998, “水果手机”,6999, “蔡虚鲲”,114514]


五、public包

该包用于存放一些方法,编写方法可以让文件可读性提高、降低不重要代码对核心算法的干扰

import hashlib
import os
import json

isLogin = {"username":None} #全局变量用于验证用户是否已登录
from core import login


def get_file(): #获取用户文件路径
    if isLogin["username"] != None:
        file = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data", isLogin["username"], isLogin["username"] + ".txt")
        return file

def is_sum(str): # 判断输入是否为正数或负数
    try:
        k = int(str)
        return isinstance(k, int)
    except ValueError:
        return True

def is_login(func_name): #装饰器将一些功能设置为登录后才可访问
    def inner(*args, **kwargs):
        if isLogin["username"] != None:
            res = func_name(*args, **kwargs)
            return res
        else:
            print("你还没登录,请先登录")
            login.login()
            res = func_name(*args, **kwargs)
            return res
    return inner

def load_commdity(): #获取商品信息
    file = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data", "commodity.txt")
    with open(file, "r", encoding="utf8") as c:
        commditys = json.loads(c.read())
    return commditys

def read_user(): #获取用户信息
    file = get_file()
    with open(file, "r", encoding="utf8") as f:
        user = json.loads(f.read())
    return user

def save_shop_car(shop_car): #保存购物车
    user = read_user()
    file = get_file()
    user["shop_car"] = shop_car
    with open(file, "w", encoding="utf8") as f:
        f.write(json.dumps(user))

def save_user_money(user_money): #结算后保存用户信息
    user = read_user()
    file = get_file()
    user["balance"] = user_money
    with open(file, "w", encoding="utf8") as f:
        f.write(json.dumps(user))

def encrypt(str): # 密码加密
    md5 = hashlib.md5()
    md5.update(str.encode('utf-8'))
    return md5.hexdigest()



六、start包

start模块用于启动软件

from core.login import login
from core.register import register
from core.shopBox import shopping
from public.tools import isLogin

def rjstart():

    key = 1
    while key != 0:
        print("欢迎来到XXX软件")
        print("1.用户登录")
        print("2.用户注册")
        print("3.购物")
        print("0.退出")
        sc = input("请输入序号选择功能:")
        if sc.isdigit():
            key = int(sc)
            if key == 1:
                if isLogin["username"] == None:
                    login()
                    rjstart()
                    key = 0
                else:
                    print("你已经登录")
                    rjstart()
                    key = 0
            elif key == 2:
                register()
                rjstart()
                key = 0
            elif key == 3:
                shopping()
                rjstart()
                key = 0
            elif key == 0:
                key = 0
                print("退出软件")
            else:
                print("请重新输入")
        else:
            print("请输入功能对应的数字序号")

if __name__ == '__main__':
    rjstart()

总结

项目虽然功能不够完善,但基础架构要设计清楚,各个模块需要完成自己对应的工作,最开始由于模块分离不够甚至出现循环导入问题,再重新解耦代码,消除了循环导入,编写各方面功能需要提前做好规划,避免后续完善代码时忘记之前占位所要编写的功能。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值