万叶集 |
---|
🎉 隐约雷鸣,阴霾天空。 🎉 |
🎉 但盼风雨来,能留你在此。 🎉 |
文章目录前言:
✌ 作者简介:渴望力量的哈士奇,大家可以叫我 🐶哈士奇🐶 。(我真的有一只哈士奇)
🏆 CSDN博客专家认证、新星计划第三季全栈赛道 top_1 、华为云享专家、阿里云专家博主 🏆
📫 如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
💬 人生格言:优于别人,并不高贵,真正的高贵应该是优于过去的自己。💬
🔥 如果感觉博主的文章还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦
📕 系列专栏:
⛽️ Python全栈系列 - [更新中] 【 本文在该系列】
🍎 Python零基础入门篇
🍎 Python语法进阶篇
👋 网安之路系列
🍋 网安之路踩坑篇
🍋 网安知识扫盲篇
🍋 Vulhub 漏洞复现篇
🍋 Shell脚本编程篇
🍋 Web攻防篇 2021年9月3日停止更新,转战先知等安全社区
🍋 渗透工具使用集锦 2021年9月3日停止更新,转战先知等安全社区
⭐️ 点点点工程师系列
🍹 测试神器 - Charles 篇
🍹 测试神器 - Fiddler 篇
🍹 测试神器 - Jmeter 篇
🍹 自动化 - RobotFrameWork 系列
🍹 自动化 - 基于 JAVA 实现的WEB端UI自动化
🍹 自动化 - 基于 MonkeyRunner 实现的APP端UI自动化
- 🐳 admin的验证
- 🐳 调用 get_user() 函数时进行动态的更新
- 🐳 奖品的添加
- 🐳 奖品的删除
- 🐳 奖品的数量更新
- 🐳 源码 - base.py 模块的源码如下
- 🐳 源码 - admin.py 模块的源码如下
- 🐳 源码 - error.py 模块的源码如下
该章节我们继续
admin.py
模块的相关开发,接下来有5个功能需要实现。
🐳 admin的验证1、admin的验证(只有 admin 用户才能使用 Admin 类,在get_user() 函数里完善,否则将抛出异常)
2、任何函数都应该动态的更新 get_user()
3、奖品的添加
4、奖品的删除
5、奖品的更新(同步 Base 调整)
上文我们提到 只有 admin 权限的用户才能使用 Admin 类, 否则将抛出异常。
其实在上一章节的 get_user()
函数中就已经考虑到了这个问题,通过获取 role
标签判断是否是 admin
即可,否则抛出 error.py 模块 自定义的 RoleError 异常
代码示例如下:
if current_user.get('role') != 'admin':
raise RoleError('permission by admin')
🐳 调用 get_user() 函数时进行动态的更新
我们编写的很多函数中都要动态的去使用 get_user()
,【 self._Base__read_users()
函数在动态的获取 user.json
文件里的数据】。比如在调用 add_user()
、update_user_active()
、update_user_role()
的时候,如果不是 admin
权限,也可以调用这些函数,那岂不是乱套了。所以这里也需要去判断执行调用这些函数的用户是不是 admin
的权限。
在 add_user()
、update_user_active()
、update_user_role()
函数内,调用 self.get_user()
代码示例如下:
def add_user(self, username, role): # 添加用户函数
self.get_user() # 动态调整更新 get_user()
self.__check('permission')
self._Base__write_user(username=username, role=role) # 调用 Base 类的 "__write_user()" 函数添加用户
def update_user_active(self, username): # 变更用户的 active 状态
self.get_user()
self.__check('permission')
self._Base__change_acitve(username=username) # 调用 Base 类的 "__change_acitve" 函数变更用户的 active 状态
def update_user_role(self, username, role): # 变更用户的 role 状态 (权限
self.get_user()
self.__check('permission')
self._Base__change_role(username=username, role=role) # 调用 Base 类的 "__change_role" 函数变更用户的 role 状态
OK,这一步我们也完成了。
🐳 奖品的添加接下来继续奖品的添加 - add_gift()
,在这之前,先看一下 base.py
模块的 __write_gift() 函数
都需要传那些参数,然后对照这些参数来编写 admin.py
模块的 add_gift()
函数。
代码示例如下:
# coding:utf-8
import os
from base import Base
from common.error import NotUserError, UserActiveError, RoleError
"""
***************************************************************************************************************
1、admin 类的搭建(继承 Base 类)
2、获取当前用户函数(包含获取身份)
3、添加用户(判断当前身份是否是管理员)
4、冻结与恢复用户(active 标签判断用户是否可用的标识)
5、修改用户身份(管理员 *** 作修改 role为 "admin" 或者 "normal" ;"normal"用户可参与抽奖,"admin"用户只能是为普通用户服务的角色)
***************************************************************************************************************
6、admin的验证(只有 admin 用户才能使用 Admin 类,在get_user() 函数里完善,否则将抛出异常)
7、任何函数都应该动态的更新 get_user()
8、奖品的添加
9、奖品的删除
10、奖品的更新(同步 Base 调整)
***************************************************************************************************************
"""
class Admin(Base):
def __init__(self, username, user_json, gift_json): # 定义构造函数,同时也利用super()函数继承并使用 Base 类的构造函数
self.username = username
super().__init__(user_json, gift_json)
self.get_user()
def get_user(self):
users = self._Base__read_users() # 注意 "__read_users()" 是 Base 类的私有函数,不能直接调用 "self.__read_users()"
current_user = users.get(self.username)
if current_user is None: # 判断用户是否存在,不存在则抛出自定义 "error.py" 模块的 NotUserError 异常
raise NotUserError('not user %s' % self.username)
if current_user.get('active') == False: # 判断用户可用状态,不可用则抛出自定义 "error.py" 模块的 UserActiveError 异常
raise UserActiveError('the user %s had not use' % self.username)
if current_user.get('role') != 'admin': # 判断是否是 admin 权限,不是则抛出自定义 "error.py" 模块的 RoleError 异常
raise RoleError('permission by admin')
self.user = current_user
self.role = current_user.get('role')
self.name = current_user.get('username')
self.active = current_user.get('active')
def __check(self, message): # 判断是否是管理员身份
self.get_user()
if self.role != 'admin':
raise Exception(message)
def add_user(self, username, role): # 添加用户函数
self.get_user() # 动态调整更新 get_user()
self.__check('permission')
self._Base__write_user(username=username, role=role) # 调用 Base 类的 "__write_user()" 函数添加用户
def update_user_active(self, username): # 变更用户的 active 状态
self.get_user()
self.__check('permission')
self._Base__change_acitve(username=username) # 调用 Base 类的 "__change_acitve" 函数变更用户的 active 状态
def update_user_role(self, username, role): # 变更用户的 role 状态 (权限
self.get_user()
self.__check('permission')
self._Base__change_role(username=username, role=role) # 调用 Base 类的 "__change_role" 函数变更用户的 role 状态
def add_gift(self, prize_level, level_num, gift_name, gift_count):
self.get_user()
self.__check('permission')
self._Base__write_gift(prize_level=prize_level, level_num=level_num,
gift_name=gift_name, gift_count=gift_count)
if __name__ == '__main__':
gift_path = os.path.join(os.getcwd(), 'storage', 'gift.json')
user_path = os.path.join(os.getcwd(), 'storage', 'user.json')
admin = Admin('Neo', user_path, gift_path)
# admin.get_user()
# print(admin.name, admin.role)
# admin.update_user_active(username="Adem")
#
# admin.update_user_role(username='Adem', role='admin')
admin.add_gift(prize_level='SecondPrize', level_num='level1', gift_name='CSDN定制T恤', gift_count=20)
执行结果如下:
🐳 奖品的删除
接下来就是奖品的删除 - delete_gift()
,传入的参数依然是 add_gift()
函数的参数,只不过少了 gift_count
这个参数。
代码示例如下:
该处仅是 delete_gift()
函数,Admin 类的删除奖品方法。
def delete_gift(self, prize_level, level_num, gift_name):
self.get_user()
self.__check('permission')
self._Base__delete_gift(prize_level, level_num, gift_name)
运行结果如下:
🐳 奖品的数量更新
接下来是 奖品的数量更新
,在做数量更新之前先要将 base.py
模块的 __update_gift()
函数做一下调整,增加一个 is_admin=False
参数,同时还要增加一个判断, 判断 gift_count 数量是否小于等于0;否则抛出自定义 “error.py” 模块的 CountError
异常。
base.py
模块 修改 __update_gift()
函数如下:
def __update_gift(self, prize_level, level_num, gift_name, gift_count=1, is_admin=False): # 定义写入奖品信息函数,传入奖品的两个层级和奖品信息
assert isinstance(gift_count, int), 'gift count is a int' # 断言;判断传入的 gift_count 是否是 int 类型
data = self.__check_and_getgift(prize_level, level_num, gift_name)
if data == False:
return data
current_gift_prize_level_pool = data.get('level_one')
current_gift_lever_num_pool = data.get('level_two')
gifts = data.get('gifts')
current_gift_count = current_gift_lever_num_pool[gift_name] # 将 current_gift_lever_num_pool[gift_name] 的值赋值
print('gift_count', gift_count)
print('current_gift_count', current_gift_count)
if is_admin == True: # 判断 is_admin 是否为 True
if gift_count <= 0: # 为 True 的情况下判断 gift_count 数量是否小于等于0;否则抛出自定义 "error.py" 模块的 CountError 异常
raise CountError('gift count not 0')
current_gift_count['count'] = gift_count # 将 gift_count 重新赋值
else:
if current_gift_count['count'] - gift_count < 0: # 判断递减后的奖品数量是否为负数,为负数则抛出 NegativeNumberError 异常
raise NegativeNumberError('gift count can not negative')
current_gift_count['count'] -= gift_count # 反之则进行递减后的赋值 【第二层级】
current_gift_lever_num_pool[gift_name] = current_gift_count # 赋值完成之后再分别赋值第二层级、第一层级还原回来
current_gift_prize_level_pool[level_num] = current_gift_lever_num_pool
gifts[prize_level] = current_gift_prize_level_pool
self.__save(gifts, self.gift_json)
base.py
模块 的 __update_gift()
函数调整后,我们再来编写 admin.py
模块 的 update_gift()
函数,代码示例如下:
def update_gift(self, prize_level, level_num,
gift_name, gift_count):
self.__check('permission')
self._Base__update_gift(prize_level=prize_level, level_num=level_num,
gift_name=gift_name, gift_count=gift_count, is_admin=True)
运行结果如下:
以上我们今天所需要实现的5个功能就全部完成了,至此 admin.py
模块的相关功能算是基本完成了。
现阶段 base.py 模块的源码如下
:
# coding:utf-8
import os
import json
import time
from common.consts import ROLES, PRIZELEVELS, LEVELNUMS
from common.error import UserExistsError, RoleError, UserNameNotExist, LevelError, NegativeNumberError, CountError
from common.utils import check_file, timestamp_to_string
'''
*******************************************************
1:导入 user.json ,文件检查 "__check_user_json() 函数"
2:导入 gift.json ,文件检查 "__check_gift_json() 函数"
*******************************************************
3、确定用户表中每个用户的信息字段(见下方的用户信息字段)
4、读取 `user.json` 文件 "__read_users() 函数"
5、写入 `user.json` 文件(检测该用户是否存在),存在则不可写入;"__write_user() 函数" ,这里方便调试,先使用 write_user()
************************************************************************************************************
6、对于某个用户 `role` 权限的修改(或者说是身份的修改) `__change_role() 函数`; 同样方便调试,先试用 change_role()
7、对于 acitve 用户的活跃度的修改; `__change_acitve() 函数`; 同样方便调试,先使用 change_acitve()
8、delete_user 删除某个用户的修改; "__delete_user() 函数"; 同样方便调试,先使用 delete_user()
************************************************************************************************************
9、gifts 奖池奖品结构的确定(见下方的gift.json 文件格式)
10、gifts 奖品信息的读取 "__read_gift() 函数";为了方便调试,先使用 read_gift()
11、gifts 奖品的添加 "__write_gift() 函数";为了方便调试,先使用 write_gift();传入奖品的两个层级和奖品信息
12、gifts 奖品的初始化 "__init_gifts() 函数"; 为了方便调试,先使用 init_gift();初始化奖品信息,定义奖品结构
**************************************************************************************************************
13、gifts的修改(数量的递减) "__update_gift"函数; 为了方便调试,先使用 update_gift()
14、gifts的删除 "__delete_gift"函数; 为了方便调试,先使用 delete_gift()
*********************************************************************************
'''
"""
用户信息的字段:
- username:姓名
- role:角色(normal 或 admin)
- active:活跃度(身份是否有效:True or False)
- create_time:创建时间(timestamp)
- update_time:更新时间(timestamp)
- gifts:奖品列表(用以存储用户抽到了哪些奖品)
"""
"""
gift.json 文件格式:
{
"FourthPrize":{
"lever1":{
"gift_name":{
"name":"xxx",
"count":999
}
},
"lever2":{
"gift_name":{
"name":"xxx",
"count":999
}
},
"lever3":{
"gift_name":{
"name":"xxx",
"count":999
}
}
},
"ThirdPrize":{
"lever1":{
"gift_name":{
"name":"xxx",
"count":999
}
},
"lever2":{
"gift_name":{
"name":"xxx",
"count":999
}
},
"lever3":{
"gift_name":{
"name":"xxx",
"count":999
}
}
},
"SecondPrize":{
"lever1":{
"gift_name":{
"name":"xxx",
"count":999
}
},
"lever2":{
"gift_name":{
"name":"xxx",
"count":999
}
}
},
"FirstPrize":{
"lever1":{
"gift_name":{
"name":"xxx",
"count":999
}
}
}
}
"""
class Base(object):
def __init__(self, user_json, gift_json):
self.user_json = user_json
self.gift_json = gift_json
self.__check_user_json()
self.__check_gift_json()
self.__init_gifts()
print('Base 类的 \'__init__()\' 被调用')
def __check_user_json(self): # 调用 utils 模块的公共函数 check_file 检查 user.json 文件
check_file(self.user_json)
print('Base 类的 \'__check_user_json()\' 被调用')
def __check_gift_json(self): # 调用 utils 模块的公共函数 check_file 检查 gift.json 文件
check_file(self.gift_json)
def __read_users(self, time_to_str=False): # 读取 user.json 文件;
# timestamp_to_string 修改为 True 时时间戳为可读的格式(调试)
with open(self.user_json, 'r') as f:
data = json.loads(f.read())
if time_to_str == True:
for username, t in data.items():
t['create_time'] = timestamp_to_string(t['create_time'])
# print(t['create_time']) # (调试)打印输出时间格式是否改为 可读的 "%Y-%m-%d %H:%M:%S" 格式
t['update_time'] = timestamp_to_string(t['update_time'])
data[username] = t
print(data) # 调试打印输出 __read_user() 的用户信息
return data
def __write_user(self, **user): # 写入用户信息(进行写入时的判断)
if "username" not in user:
raise ValueError("missing username") # 缺少 username 信息
if "role" not in user:
raise ValueError("missing role") # 缺少角色信息(缺少权限信息)
user['active'] = True # 初始化用户基础信息
user['create_time'] = time.time()
user['update_time'] = time.time()
user['gifts'] = []
users = self.__read_users() # 读取 user.json
# print(users) # 打印输出 users 是为了调试
# return # 打印输出调试 users ,return 是为了不在执行后面的代码
if user['username'] in users: # 判断用户信息是否存在,如果存在则抛出 'error.py' 模块自定义的 UserExistsError
raise UserExistsError('username {} had existe'.format(user['username']))
users.update(
{user['username']: user}
)
# json_users = json.dumps(users)
# with open(self.user_json, 'w') as f:
# f.write(json_users)
self.__save(users, self.user_json) # 调用 __save() 函数 ,添加用户后保存 user_json 文件
print(users) # 调试打印输出 users 的用户信息
def __change_role(self, username, role): # 定义修改用户 role 信息函数
users = self.__read_users() # 获取当前所有用户信息
user = users.get(username) # 根据传入的 username 获取该用户的信息
if not user: # 判断用户是否存在 user.json 文件内,若不合法则抛出自定义 "error.py" 模块的 UserNameNotExist 异常
raise UserNameNotExist('username \'{}\' not exist'.format(username))
if role not in ROLES: # 判断用户角色信息是否合法,若不合法则抛出自定义 "error.py" 模块的 RoleError 异常
# "consts.py" 模块的 "ROLES"的值是写死的: ROLES = ['admin', 'normal']
raise RoleError('not use role {}'.format(role))
user['role'] = role
user['update_time'] = time.time()
users[username] = user
# json_data = json.dumps(users) # 将 change_role 更新后的内容写入 user_json 文件
# with open(self.user_json, 'w') as f:
# f.write(json_data)
# print(json_data)
self.__save(users, self.user_json) # 调用 __save() 函数 ,修改用户信息后保存 user_json 文件
return '\'{}\' 的 \'role\' 信息已变更为 \'{}\''.format(user['username'], user['role'])
def __change_acitve(self, username): # 定义修改用户 active 函数,只需要传入 username 即可;
# 因为 active 只有两种状态, True 或 False ,这里默认为 True ,取反即可
users = self.__read_users()
user = users.get(username)
if not user: # 判断用户是否存在 user.json 文件内,若不合法则抛出自定义 "error.py" 模块的 UserNameNotExist 异常
raise UserNameNotExist('username \'{}\' not exist'.format(username))
user['active'] = not user['active'] # 当前用户的 active 状态取反
user['update_time'] = time.time() # 更新当前用户的 update_time 的更新时间
users[username] = user
# json_data = json.dumps(users) # 将 change_acitve 更新后的内容写入 user_json 文件
# with open(self.user_json, 'w') as f:
# f.write(json_data)
# print(json_data)
self.__save(users, self.user_json) # 调用 __save() 函数 ,修改用户信息后保存 user_json 文件
return '\'{}\' 的 \'active\' 信息已变更为 \'{}\''.format(user['username'], user['active'])
def __delete_user(self, username): # 定义删除用户的函数,只需要传入 username 即可
users = self.__read_users()
user = users.get(username)
if not user: # 判断用户是否存在 user.json 文件内,若不合法则抛出自定义 "error.py" 模块的 UserNameNotExist 异常
raise UserNameNotExist('username \'{}\' not exist'.format(username))
delete_user = users.pop(username) # 删除用户
# json_data = json.dumps(users) # 将 change_acitve 更新后的内容写入 user_json 文件
# with open(self.user_json, 'w') as f:
# f.write(json_data)
# print(json_data)
# print(delete_user)
self.__save(users, self.user_json) # 调用 __save() 函数 ,删除用户后保存 user_json 文件
return '\'{}\' 的信息已删除'.format(user['username'])
def __read_gifts(self): # 定义读取 gift.json 文件的函数(就是读取文件)
# [TODO]读取 gift.json 文件的函数,与上面几个函数的读取文件的方法相同,后续可以考虑进行封装减少代码量
with open(self.gift_json) as f:
data = json.loads(f.read())
return data
def __init_gifts(self): # 定义 __init_gifts() 函数,初始化奖品信息,定义奖品结构
data = { # 奖品信息结构初始化信息有两个层级,分别对应奖品的等级及对应等级下的若干奖品
'FourthPrize': {
'level1': {},
'level2': {},
'level3': {}
},
'ThirdPrize': {
'level1': {},
'level2': {},
'level3': {}
},
'SecondPrize': {
'level1': {},
'level2': {}
},
'FirstPrize': {
'level1': {}
}
}
gifts = self.__read_gifts() # 读取奖品信息并进行判断,如果奖品信息不为空(长度不为0)则直接 return
if len(gifts) != 0:
return
# json_data = json.dumps(data) # 将 初始化的奖品结构写入 gift.json 文件
# with open(self.gift_json, 'w') as f:
# f.write(json_data)
# print(json_data) # 调试 奖品信息结构初始化信息
self.__save(data, self.gift_json) # 调用 __save() 函数 ,将初始化的奖品结构写入 gift.json 文件
def __write_gift(self, prize_level, level_num, gift_name, gift_count): # 定义写入奖品信息函数,传入奖品的两个层级和奖品信息
if prize_level not in PRIZELEVELS: # "consts.py" 模块的 "FIRSTLEVELS"的值是写死的,如下:
# PRIZELEVELS = ['FourthPrize', 'ThirdPrize', 'SecondPrize', 'FirstPrize']
raise LevelError('prize_level not exists')
if level_num not in LEVELNUMS: # "consts.py" 模块的 "FIRSTLEVELS"的值是写死的,如下:
# LEVELNUMS = LEVELNUMS = ['level1', 'level2', 'level3']
raise LevelError('level_num not exists')
gifts = self.__read_gifts()
current_gift_prize_level_pool = gifts[prize_level] # 获取奖品池奖品的第一个层级的value
# print(current_gift_prize_level_pool) # 调试:获取第一个层级的value
current_gift_lever_num_pool = current_gift_prize_level_pool[level_num] # 获取奖品池奖品的第二个层级的奖品信息
# print(current_gift_lever_num_pool) # 调试:获取第二个层级的value
if gift_count <= 0: # 判断奖品数量,若数量小于等于 0,给一个默认值 1
gift_count = 1
if gift_name in current_gift_lever_num_pool: # 判断奖品信息是否存在,存在则更新奖品数量;反之,则将奖品信息添加至第二层级
current_gift_lever_num_pool[gift_name]['count'] = current_gift_lever_num_pool[gift_name]['count'] + gift_count
else:
current_gift_lever_num_pool[gift_name] = {
'name': gift_name,
'count': gift_count
}
current_gift_prize_level_pool[level_num] = current_gift_lever_num_pool # 将最终的奖品信息放到第二层级
gifts[prize_level] = current_gift_prize_level_pool # 再将第二层级的奖品信息赋值给第一层级
# json_data = json.dumps(gifts) # 将 初始化的奖品结构写入 gift.json 文件
# with open(self.gift_json, 'w') as f:
# f.write(json_data)
# print(json_data) # 调试 奖品信息结构初始化信息
self.__save(gifts, self.gift_json) # 调用 __save() 函数 ,将初始化的奖品结构写入 gift.json 文件
def __update_gift(self, prize_level, level_num, gift_name, gift_count=1, is_admin=False): # 定义写入奖品信息函数,传入奖品的两个层级和奖品信息
# TODO:下面这一块的判断奖品层级与获取奖品层级、信息的代码与 "__delete_gift()" 函数一致,也可以考虑做个单独函数进行封装
"""
if prize_level not in PRIZELEVELS: # "consts.py" 模块的 "FIRSTLEVELS"的值是写死的,如下:
# PRIZELEVELS = ['FourthPrize', 'ThirdPrize', 'SecondPrize', 'FirstPrize']
raise LevelError('prize_level not exists')
if level_num not in LEVELNUMS: # "consts.py" 模块的 "FIRSTLEVELS"的值是写死的,如下:
# LEVELNUMS = LEVELNUMS = ['level1', 'level2', 'level3']
raise LevelError('level_num not exists')
gifts = self.__read_gifts()
current_gift_prize_level_pool = gifts[prize_level] # 获取奖品池奖品的第一个层级的value
current_gift_lever_num_pool = current_gift_prize_level_pool[level_num] # 获取奖品池奖品的第二个层级的奖品信息
if gift_name not in current_gift_lever_num_pool: # 判断传入的 gift_name 是否存在,不存在则返回错误提示信息
return 'gift_name \'{}\' 的信息不存在'.format(gift_name)
"""
assert isinstance(gift_count, int), 'gift count is a int' # 断言;判断传入的 gift_count 是否是 int 类型
data = self.__check_and_getgift(prize_level, level_num, gift_name)
if data == False:
return data
current_gift_prize_level_pool = data.get('level_one')
current_gift_lever_num_pool = data.get('level_two')
gifts = data.get('gifts')
current_gift_count = current_gift_lever_num_pool[gift_name] # 将 current_gift_lever_num_pool[gift_name] 的值赋值
print('gift_count', gift_count)
print('current_gift_count', current_gift_count)
if is_admin == True: # 判断 is_admin 是否为 True
if gift_count <= 0: # 为 True 的情况下判断 gift_count 数量是否小于等于0;否则抛出自定义 "error.py" 模块的 CountError 异常
raise CountError('gift count not 0')
current_gift_count['count'] = gift_count # 将 gift_count 重新赋值
else:
if current_gift_count['count'] - gift_count < 0: # 判断递减后的奖品数量是否为负数,为负数则抛出 NegativeNumberError 异常
raise NegativeNumberError('gift count can not negative')
current_gift_count['count'] -= gift_count # 反之则进行递减后的赋值 【第二层级】
current_gift_lever_num_pool[gift_name] = current_gift_count # 赋值完成之后再分别赋值第二层级、第一层级还原回来
current_gift_prize_level_pool[level_num] = current_gift_lever_num_pool
gifts[prize_level] = current_gift_prize_level_pool
self.__save(gifts, self.gift_json)
def __delete_gift(self, prize_level, level_num, gift_name): # 定义删除奖品的函数,传入奖品的两个层级和奖品名称
"""
if prize_level not in PRIZELEVELS: # "consts.py" 模块的 "FIRSTLEVELS"的值是写死的,如下:
# PRIZELEVELS = ['FourthPrize', 'ThirdPrize', 'SecondPrize', 'FirstPrize']
raise LevelError('prize_level not exists')
if level_num not in LEVELNUMS: # "consts.py" 模块的 "FIRSTLEVELS"的值是写死的,如下:
# LEVELNUMS = LEVELNUMS = ['level1', 'level2', 'level3']
raise LevelError('level_num not exists')
gifts = self.__read_gifts()
current_gift_prize_level_pool = gifts[prize_level] # 获取奖品池奖品的第一个层级的value
current_gift_lever_num_pool = current_gift_prize_level_pool[level_num] # 获取奖品池奖品的第二个层级的奖品信息
if gift_name not in current_gift_lever_num_pool: # 判断传入的 gift_name 是否存在,不存在则返回错误提示信息
# return 'gift_name \'{}\' 的信息不存在'.format(gift_name)
return False
"""
data = self.__check_and_getgift(prize_level, level_num, gift_name)
if data == False:
return data
current_gift_prize_level_pool = data.get('level_one')
current_gift_lever_num_pool = data.get('level_two')
gifts = data.get('gifts')
delete_gift_data = current_gift_lever_num_pool.pop(gift_name)
current_gift_prize_level_pool[level_num] = current_gift_lever_num_pool
gifts[prize_level] = current_gift_prize_level_pool
self.__save(gifts, self.gift_json)
print(delete_gift_data, '已删除') # 调试 删除奖品信息
return delete_gift_data
def __check_and_getgift(self, prize_level, level_num, gift_name):
if prize_level not in PRIZELEVELS: # "consts.py" 模块的 "FIRSTLEVELS"的值是写死的,如下:
# PRIZELEVELS = ['FourthPrize', 'ThirdPrize', 'SecondPrize', 'FirstPrize']
raise LevelError('prize_level not exists')
if level_num not in LEVELNUMS: # "consts.py" 模块的 "FIRSTLEVELS"的值是写死的,如下:
# LEVELNUMS = LEVELNUMS = ['level1', 'level2', 'level3']
raise LevelError('level_num not exists')
gifts = self.__read_gifts()
current_gift_prize_level_pool = gifts[prize_level] # 获取奖品池奖品的第一个层级的value
current_gift_lever_num_pool = current_gift_prize_level_pool[level_num] # 获取奖品池奖品的第二个层级的奖品信息
if gift_name not in current_gift_lever_num_pool: # 判断传入的 gift_name 是否存在,不存在则返回错误提示信息
# return 'gift_name \'{}\' 的信息不存在'.format(gift_name)
return False
return {
'level_one': current_gift_prize_level_pool,
'level_two': current_gift_lever_num_pool,
'gifts': gifts
}
def __save(self, data, path):
json_data = json.dumps(data)
with open(path, 'w') as f:
f.write(json_data)
if __name__ == '__main__':
user_path = os.path.join(os.getcwd(), "storage", "user.json")
gift_path = os.path.join(os.getcwd(), "storage", "gift.json")
base = Base(user_json=user_path, gift_json=gift_path)
# base.write_user(username='Neo', role='admin')
# result = base.change_role(username='Neo', role='normal')
# print(result)
# result = base.change_acitve(username='Neo')
# print(result)
# result = base.delete_user(username='Neo')
# print(result)
# result = base.read_gifts()
# print(result)
# base.init_gifts() # 调试 奖品信息结构初始化信息
# base.write_gift(prize_level='FourthPrize', level_num='level1', gift_name='谢谢参与',gift_count=99)
# base.write_gift(prize_level='FourthPrize', level_num='level1', gift_name='太可惜了', gift_count=99)
# base.write_gift(prize_level='FourthPrize', level_num='level2', gift_name='再接再厉', gift_count=99)
# base.write_gift(prize_level='FourthPrize', level_num='level3', gift_name='很遗憾,未中奖', gift_count=99)
#
# base.write_gift(prize_level='ThirdPrize', level_num='level1', gift_name='CSDN定向流量包', gift_count=30)
# base.update_gift(prize_level='ThirdPrize', level_num='level1', gift_name='CSDN定向流量包', gift_count=3)
# base.write_gift(prize_level='ThirdPrize', level_num='level2', gift_name='CSDN DIY手机壳', gift_count=20)
# base.update_gift(prize_level='ThirdPrize', level_num='level2', gift_name='CSDN DIY手机壳', gift_count=2)
# base.write_gift(prize_level='ThirdPrize', level_num='level3', gift_name='CSDN定制流沙摆件', gift_count=10)
# base.update_gift(prize_level='ThirdPrize', level_num='level3', gift_name='CSDN定制流沙摆件', gift_count=1)
# base.delete_gift(prize_level='FourthPrize', level_num='level1', gift_name='太可惜了')
# base.update_gift(prize_level='ThirdPrize', level_num='level2', gift_name='CSDN DIY手机壳', gift_count=3)
PS:调试完成后,记得将函数改为私有函数。
🐳 源码 - admin.py 模块的源码如下现阶段 admin.py 模块的源码如下
:
# coding:utf-8
import os
from base import Base
from common.error import NotUserError, UserActiveError, RoleError
"""
***************************************************************************************************************
1、admin 类的搭建(继承 Base 类)
2、获取当前用户函数(包含获取身份)
3、添加用户(判断当前身份是否是管理员)
4、冻结与恢复用户(active 标签判断用户是否可用的标识)
5、修改用户身份(管理员 *** 作修改 role为 "admin" 或者 "normal" ;"normal"用户可参与抽奖,"admin"用户只能是为普通用户服务的角色)
***************************************************************************************************************
6、admin的验证(只有 admin 用户才能使用 Admin 类,在get_user() 函数里完善,否则将抛出异常)
7、任何函数都应该动态的更新 get_user()
8、奖品的添加
9、奖品的删除
10、奖品的更新(同步 Base 调整)
***************************************************************************************************************
"""
class Admin(Base):
def __init__(self, username, user_json, gift_json): # 定义构造函数,同时也利用super()函数继承并使用 Base 类的构造函数
self.username = username
super().__init__(user_json, gift_json)
self.get_user()
def get_user(self):
users = self._Base__read_users() # 注意 "__read_users()" 是 Base 类的私有函数,不能直接调用 "self.__read_users()"
current_user = users.get(self.username)
if current_user is None: # 判断用户是否存在,不存在则抛出自定义 "error.py" 模块的 NotUserError 异常
raise NotUserError('not user %s' % self.username)
if current_user.get('active') == False: # 判断用户可用状态,不可用则抛出自定义 "error.py" 模块的 UserActiveError 异常
raise UserActiveError('the user %s had not use' % self.username)
if current_user.get('role') != 'admin': # 判断是否是 admin 权限,不是则抛出自定义 "error.py" 模块的 RoleError 异常
raise RoleError('permission by admin')
self.user = current_user
self.role = current_user.get('role')
self.name = current_user.get('username')
self.active = current_user.get('active')
def __check(self, message): # 判断是否是管理员身份
self.get_user()
if self.role != 'admin':
raise Exception(message)
def add_user(self, username, role): # 添加用户函数
self.get_user() # 动态调整更新 get_user()
self.__check('permission')
self._Base__write_user(username=username, role=role) # 调用 Base 类的 "__write_user()" 函数添加用户
def update_user_active(self, username): # 变更用户的 active 状态
self.get_user()
self.__check('permission')
self._Base__change_acitve(username=username) # 调用 Base 类的 "__change_acitve" 函数变更用户的 active 状态
def update_user_role(self, username, role): # 变更用户的 role 状态 (权限
self.get_user()
self.__check('permission')
self._Base__change_role(username=username, role=role) # 调用 Base 类的 "__change_role" 函数变更用户的 role 状态
def add_gift(self, prize_level, level_num, gift_name, gift_count):
self.get_user()
self.__check('permission')
self._Base__write_gift(prize_level=prize_level, level_num=level_num,
gift_name=gift_name, gift_count=gift_count)
def delete_gift(self, prize_level, level_num, gift_name):
self.get_user()
self.__check('permission')
self._Base__delete_gift(prize_level, level_num, gift_name)
def update_gift(self, prize_level, level_num,
gift_name, gift_count):
self.__check('permission')
self._Base__update_gift(prize_level=prize_level, level_num=level_num,
gift_name=gift_name, gift_count=gift_count, is_admin=True)
if __name__ == '__main__':
gift_path = os.path.join(os.getcwd(), 'storage', 'gift.json')
user_path = os.path.join(os.getcwd(), 'storage', 'user.json')
admin = Admin('Neo', user_path, gift_path)
# admin.get_user()
# print(admin.name, admin.role)
# admin.update_user_active(username="Adem")
#
# admin.update_user_role(username='Adem', role='admin')
# admin.add_gift(prize_level='SecondPrize', level_num='level1', gift_name='CSDN定制T恤', gift_count=20)
# admin.delete_gift(prize_level='SecondPrize', level_num='level1', gift_name='CSDN定制T恤')
admin.update_gift(prize_level='ThirdPrize', level_num='level3', gift_name='CSDN定制流沙摆件', gift_count=66)
PS:调试完成之后,记得加上注释并修改调试的函数为私有函数。
🐳 源码 - error.py 模块的源码如下现阶段 error.py 模块的源码如下
:
# coding:utf-8
class NotPathError(Exception):
def __init__(self, message):
self.message = message
class FormatError(Exception):
def __init__(self, message="file need json format"):
self.message = message
class NotFileError(Exception):
def __init__(self, message="It's not file"):
self.message = message
class UserExistsError(Exception):
def __init__(self, message):
self.message = message
class UserNameNotExist(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
** 下一章节我们将开始 "user.py" 模块的相关功能开发。
**
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)