版权声明:本文为博主原创文章,未经博主允许不得转载。
一、功能模块介绍
二、三大区域介绍
2.1 common 模块
2.2 storage 模块/文件夹
三、代码结构介绍
四、效果展示
五、代码实现
5.1 过程
一、Base 类
'''
1:导入user.json 文件检查
2:导入gift.json 文件检查
'''
二、
'''
1. 确定用户表中每个用户的信息字段
2. 读取 user.json文件
3. 写入 user.json 文件(检测该用户是否存在),存在不写入——username 不能重名
username:姓名
role:权限 normal(抽奖者) or admin(管理员)
active:活跃度 True or False(身份是否有效:身份无效,无法进行相关身份的操作)
create_time:创建时间 timestamp(时间戳)
update_time:修改时间 timestamp
gifts [] 记录用户抽过那些奖
username: {username, role, active}
'''
三、
'''
1. role 的修改
2. active 的修改
3. delete_user
username 姓名
role normal or admin
active True or False
create_time timestamp
update_time timestamp
gifts []
'''
四、
'''
1:gifts 奖品结构的确定
2:gifts 奖品的读取
3:gifts 添加
4:gifts 初始化
{
# 一级 level
level1:{
# 耳机 level
level1:{
gift_name_01: {name:xx, count:xx},
gift_name_02: {name:xx, count:xx}
},
level2:{},
level3:{},
},
level2{
level1:{},
level2:{},
level3:{}
},
level3{
level1:{},
level2:{},
level3:{}
},
level4{
level1:{},
level2:{},
level3:{}
}
}
'''
五、添加gifts相关功能:
'''
1:gifts 修改(数量递减)
2:gifts 奖品删除
'''
六、admin
'''
1. admin 类的搭建
2. 获取用户函数
3. 添加用户(判断当前用户身份是否是管理员)
4. 冻结与恢复用户 (只有管理员才可以操作)
5. 修改用户身份 (只有管理员才可以操作)
注意:只有 normal 用户才可以参加抽奖,admin 只为普通用户提供服务
'''
七、
'''
1. admin 的验证(只有admin的用户才能用这个类)
2. 任何函数都应该动态的更新 getuser
3. 奖品的添加 (只有admin 有这个权限)
4. 奖品的删除 (只有admin 有这个权限)
5. 奖品数量的更新(同步base调整)
'''
八、user
'''
1.user 类的初始化
2.get_user(时间的转变)
3.查看奖品列表
'''
九、user 抽奖
'''
1. 抽奖函数 随机判断第一层(level1)[1-50]:50% [51-80]:30% [81-95]:15% [96-100]:5%
2. 抽奖函数 随机判断第二层(level2)[1-80]:80% [81-95]:15% [96-100]:5%
3. 抽奖函数 获取到对应层级的真实奖品,并随机一个奖品,查看奖品count是否为0
count不为0 中奖,提示用户,并奖品数量 -1,并为用户更新奖品到user表中的gifts中
count为0,则未中奖
'''
十、课后作业
'''
1. 防止并发操作 user_json 与 gift_json
2. 用__gift_update 替代抽奖函数中手动更改奖品数量
3. 登录体系优化:regist(username,password)
base 获取所有 active 为False的用户 __check_by_active(active)
user:get_user
增加难度:password: 111111 ——> hashlib md5 sha1 加密
4. 每日抽奖次数限制:user_json、count 每次抽奖次数
检查抽奖次数函数:check_gift_count
'''
5.2 代码
consts.py
# coding: utf-8
# 本文件:长期使用,并且不会变化的
ROLES = ['admin', 'normal']
FIRST_LEVELS = ['level1', 'level2', 'level3', 'level4']
SECOND_LEVELS = ['level1', 'level2', 'level3']
error.py
# conding: utf-8
class NotPathError(Exception):
def __init__(self, message):
self.message = message
class FormatError(Exception):
def __init__(self, message):
self.message = message
class NotFileError(Exception):
def __init__(self, message):
self.message = message
class UserExistsError(Exception):
def __init__(self, message):
self.message = message
class RoleError(Exception):
def __init__(self, message):
self.message = message
class LevelError(Exception):
def __init__(self, message):
self.message = message
class NegativeNumberError(Exception):
def __init__(self, message):
self.message = message
class NotUserError(Exception):
def __init__(self, message):
self.message = message
class UserActiveError(Exception):
def __init__(self, message):
self.message = message
class CountError(Exception):
def __init__(self, message):
self.message = message
utils.py
# coding: utf-8
import os
import time
from .error import NotPathError, FormatError, NotFileError
# 做文件检测
def check_file(path):
# 判断文件是否存在
if not os.path.exists(path):
raise NotPathError('not found %s' % path)
# 判断文件是否为json文件
if not path.endswith('.json'):
raise FormatError('need json format')
# 判断是不是一个文件
if not os.path.isfile(path):
raise NotFileError('this is not file')
# 时间戳转换函数
def timestamp_to_string(timestamp):
time_obj = time.localtime(timestamp)
# 把时间对象转成字符串穿
time_str = time.strftime('%Y-%m-%d %H:%M:%S', time_obj)
return time_str
gift.json
{
"level1": {
"level1": {
}, "level2": {
"iphone12": {
"name": "iphone12", "count": 299}}, "level3": {
}}, "level2": {
"level1": {
}, "level2": {
}, "level3": {
}}, "level3": {
"level1": {
}, "level2": {
}, "level3": {
}}, "level4": {
"level1": {
}, "level2": {
}, "level3": {
}}}
user.json
{
"dewei": {
"username": "dewei", "role": "admin", "active": true, "create_time": 1627983558