Python语法进阶篇 - 82 - 综合实战 - 抽奖系统之admin模块 - 抽奖系统之admin模块 - 实现对奖品的增删改 *** 作

Python语法进阶篇 - 82 - 综合实战 - 抽奖系统之admin模块 - 抽奖系统之admin模块 - 实现对奖品的增删改 *** 作,第1张

万叶集
🎉 隐约雷鸣,阴霾天空。 🎉
🎉 但盼风雨来,能留你在此。 🎉

前言:
✌ 作者简介:渴望力量的哈士奇,大家可以叫我 🐶哈士奇🐶 。(我真的有一只哈士奇)
🏆 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个功能需要实现。

1、admin的验证(只有 admin 用户才能使用 Admin 类,在get_user() 函数里完善,否则将抛出异常)

2、任何函数都应该动态的更新 get_user()

3、奖品的添加

4、奖品的删除

5、奖品的更新(同步 Base 调整)

🐳 admin的验证

上文我们提到 只有 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 模块的源码如下

现阶段 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" 模块的相关功能开发。 **

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/797466.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-06
下一篇 2022-05-06

发表评论

登录后才能评论

评论列表(0条)

保存