文章目录
- 前言
- 一、项目开发规范划分
- 二、开发环境及其版本
- 三、core包
- 1.register模块
- 2.login模块
- 3.shopBox模块
- 四、data包
- 五、public包
- 六、start包
- 总结
前言
经过一段时间学习,掌握了不少python基础,今天要写的项目是登录注册购物三种功能的小项目。(由于结构简单并没有上传git)
一、项目开发规范划分
包 | 功能 |
core | 注册、登录、购物核心功能 |
data | 存放注册的用户数据、商品信息 |
public | 存放编写的方法文件 |
start | 存放启动文件 |
二、开发环境及其版本
没有写版本的对应是python3.7的
开发环境 | 版本 |
python | 3.7 |
json | |
sys | |
os | |
time | |
hashlib |
三、core包
1.register模块
对于核心功能首先是注册需要注意以下几点:
- 用户名对应的文件夹是否已存在
- 密码与确认密码是否一致,密码长度是否在6到14位
- 注册成功时会生成对应用户文件
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模块
登录模块注意以下几点:
- 登录时用户文件夹是否存在
- 密码是否与用户文件一致
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模块
购物模块注意以下几点:
- 购买物品时是否加还是减
- 物品数量为0时从购物车删除
- 物品从无到有时添加
- 结算购物车时如果扣费需要清空购物车,不够时给予提示
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()
总结
项目虽然功能不够完善,但基础架构要设计清楚,各个模块需要完成自己对应的工作,最开始由于模块分离不够甚至出现循环导入问题,再重新解耦代码,消除了循环导入,编写各方面功能需要提前做好规划,避免后续完善代码时忘记之前占位所要编写的功能。