编程语言
首页 > 编程语言> > Python语法进阶(3)- 综合项目实战:抽奖系统

Python语法进阶(3)- 综合项目实战:抽奖系统

作者:互联网

common/consts.py

1 # coding:utf-8
2 
3 ROLES=['admin','normal']
4 FIRSTLEVEL=['level1','level2','level3','level4']
5 SECONDLEVEL=['level1','level2','level3']

common/error.py

 1 # coding:utf-8
 2 
 3 class NotPathError(Exception):
 4     def __init__(self,message):
 5         self.message=message
 6 
 7 class FormatError(Exception):
 8     def __init__(self,message):
 9         self.message=message
10 
11 class NotFileError(Exception):
12     def __init__(self,message):
13         self.meaage=message
14 
15 
16 class UserExistsError(Exception):
17     def __init__(self,message):
18         self.message=message
19 
20 
21 class RoleError(Exception):
22     def __init__(self,message):
23         self.message=message
24 
25 
26 class LevelError(Exception):
27     def __init__(self,message):
28         self.message=message
29 
30 
31 class NegativeNumberError(Exception):
32     def __init__(self,message):
33         self.message=message
34 
35 class NotUserError(Exception):
36     def __init__(self,message):
37         self.message=message
38 
39 
40 class UserActiveError(Exception):
41     def __init__(self,message):
42         self.message=message
43 
44 
45 class CountError(Exception):
46     def __init__(self,message):
47         self.message=message

common/utils.py

 1 # coding:utf-8
 2 import os
 3 import time
 4 
 5 from .error import NotFileError,NotPathError,FormatError
 6 
 7 def timestamp_to_string(timestamp):
 8     time_obj=time.localtime(timestamp)
 9     time_str=time.strftime('%Y-%m-%d %H:%M:%S',time_obj)
10     return time_str
11 
12 def check_file(path):
13     if not os.path.exists(path):
14         raise NotPathError("not found %s" % path)
15 
16     if not path.endswith('.json'):
17         raise FormatError("need json format")
18 
19     if not os.path.isfile(path):
20         raise NotFileError('this is a not file')

storage/gift.json

{"level1": {"level1": {"糖豆": {"name": "糖豆", "count": 118}}, "level2": {"ipad": {"name": "ipad", "count": 2}}, "level3": {}}, "level2": {"level1": {}, "level2": {}, "level3": {"itouch": {"name": "itouch", "count": 1}}}, "level3": {"level1": {}, "level2": {}, "level3": {}}, "level4": {"level1": {}, "level2": {}, "level3": {}}}

storage/user.json

{"张三": {"username": "张三", "role": "admin", "active": true, "create_time": 1642058199.4055276, "update_time": 1642058199.4055276, "gifts": []}, "张": {"username": "张", "role": "admin", "active": true, "create_time": 1642307860.5210323, "update_time": 1642313986.935938, "gifts": []}, "李四": {"username": "李四", "role": "normal", "active": true, "create_time": 1642313383.1195645, "update_time": 1642313383.1195645, "gifts": ["糖豆", "糖豆", "糖豆", "糖豆", "糖豆", "ipad"]}, "李四2": {"username": "李四2", "role": "admin", "active": true, "create_time": 1642313470.9079525, "update_time": 1642313470.9079525, "gifts": []}, "李四3": {"username": "李四3", "role": "normal", "active": true, "create_time": 1642313498.6640847, "update_time": 1642313498.6640847, "gifts": []}, "王五": {"username": "王五", "role": "normal", "active": true, "create_time": 1642313584.7395563, "update_time": 1642313584.7395563, "gifts": ["糖豆"]}}

admin.py

 1 # coding:utf-8
 2 import os
 3 
 4 from base import Base
 5 from common.error import NotUserError,UserActiveError,RoleError
 6 '''
 7     1:admin类的搭建
 8     2:获取用户函数(包含获取身份)
 9     3:添加用户(判断当前身份是否是管理员)
10     4:冻结与恢复用户
11     5:修改用户身份
12     6:admin的验证(只有admin的用户才能用这个类)
13     7:任何函数都应该动态的更新getuser
14     8:奖品的添加
15     9:奖品的删除
16     10:奖品数量的更新(同步base调整)
17 '''
18 
19 class Admin(Base):
20     def __init__(self,username,user_json,gift_json):
21         self.username=username
22         super().__init__(user_json,gift_json)
23         self.get_user()
24 
25     def get_user(self):
26         users=self._Base__read_users()
27         current_user = users.get(self.username)
28         if current_user == None:
29             raise NotUserError('not user %s'% self.username)
30 
31         if current_user.get('active') == False:
32             raise UserActiveError('the user %s had not use'% self.username)
33 
34         if current_user.get('role') != 'admin':
35             raise RoleError('permission by admin')
36 
37         self.user=current_user
38         self.role=current_user.get('role')
39         self.name=current_user.get('username')
40         self.active=current_user.get('active')
41 
42     def __check(self,message):
43         self.get_user()
44         if self.role != 'admin':
45             raise Exception(message)
46 
47     def add_user(self,username,role):
48         self.__check('permission')
49         self._Base__write_user(username=username,role=role)
50 
51     def update_user_active(self,username):
52         self.__check('permission')
53         self._Base__change_active(username=username)
54 
55     def update_user_role(self,username,role):
56         self.__check('permission')
57         self._Base__change_role(username,role)
58 
59     def add_gift(self,first_level,second_level,gift_name,gift_count):
60         self.__check('permission')
61         self._Base__write_gift(first_level=first_level,second_level=second_level,gift_name=gift_name,gift_count=gift_count)
62 
63     def delete_gift(self,first_level,second_level,gift_name):
64         self.__check('permission')
65         self._Base__delete_gift(first_level=first_level,second_level=second_level,gift_name=gift_name)
66 
67     def update_gift(self,first_level,second_level,gift_name,gift_count):
68         self.__check('permission')
69         self._Base__gift_update(first_level=first_level,second_level=second_level,gift_name=gift_name,gift_count=gift_count,is_admin=True)
70 
71 if __name__=='__main__':
72     store_path=os.getcwd()
73     user_path=os.path.join(store_path,'storage','user.json')
74     gift_path=os.path.join(store_path,'storage','gift.json')
75     admin=Admin('张三',user_path,gift_path)
76     admin.update_gift(first_level='level1',second_level='level1',gift_name='糖豆',gift_count=123)

base.py

  1 # coding:utf-8
  2 import json
  3 import os
  4 import time
  5 from common.error import UserExistsError,RoleError,LevelError,NegativeNumberError,CountError
  6 from common.utils import timestamp_to_string
  7 from common.consts import ROLES,FIRSTLEVEL,SECONDLEVEL
  8 from common.utils import check_file
  9 
 10 '''
 11     1:导入user.json 文件检查
 12     2:导入gift.json 文件检查
 13     用户操作
 14     1:确定用户表中每个用户的信息字段
 15             username 姓名
 16             role normal or admin
 17             active True or False
 18             creat_time timestamp
 19             update_time timestamp
 20             gifts[]
 21              
 22             username:{username,role,active}
 23     2:读取userjson文件
 24     3:写入userjson文件(检测用户是否存在),存在则不可写入
 25     4:role的修改
 26     5:active的修改
 27     6:delete_user
 28     礼物操作
 29     1:gifts 奖品结构的确定
 30     2:gifts 奖品的读取
 31     3:gifts 添加
 32     4:gifts 初始化
 33     5:gifts 修改(数量递减)
 34     6:gifts 奖品删除
 35     {
 36         level1:{
 37             level1:{
 38                 gift_name1:{
 39                     name:xx
 40                     cout:xx
 41                 }
 42                 gift_name2:{}
 43             }
 44             level2:{}
 45             level3:{}
 46         }
 47         level2:{
 48             level1:{}
 49             level2:{}
 50             level3:{}
 51         }
 52         level3:{
 53             level1:{}
 54             level2:{}
 55             level3:{}
 56         }
 57         level4:{
 58             level1:{}
 59             level2:{}
 60             level3:{}
 61         }
 62     }
 63     
 64 '''
 65 
 66 class Base(object):
 67     def __init__(self,user_json,gift_json):
 68         self.user_json = user_json
 69         self.gift_json=gift_json
 70         self.__check_user_json()
 71         self.__check_gift_json()
 72         self.__init_gifts()
 73 
 74     def __check_user_json(self):
 75         check_file(self.user_json)
 76 
 77     def __check_gift_json(self):
 78         check_file(self.gift_json)
 79 
 80     def __read_users(self,time_to_str=False):
 81         with open(self.user_json,'r') as f:
 82             data=json.loads(f.read())
 83         if time_to_str ==True:
 84             for username,v in data.items():
 85                 v['create_time']=timestamp_to_string(v['create_time'])
 86                 v['update_time']=timestamp_to_string(v['update_time'])
 87                 data[username]=v
 88         return data
 89 
 90     def __save(self,data,path):
 91         json_data = json.dumps(data,ensure_ascii=False) #json.dumps()方法会默认将其中unicode码以ascii编码的方式输入到string。在json.dumps()方法中加入一个参数,并把值设置为False(默认为True),中文即可正常显示
 92         with open(path, 'w') as f:
 93             f.write(json_data)
 94 
 95     def __write_user(self,**user):
 96         if 'username' not in user:
 97             raise ValueError('missing username')
 98         if 'role' not in user:
 99             raise ValueError('missing role')
100 
101         user['active']=True
102         user['create_time']=time.time()
103         user['update_time']=time.time()
104         user['gifts']=[]
105 
106         users=self.__read_users()
107 
108         if user['username'] in users:
109             raise UserExistsError('username %s had exists'% user['username'])
110 
111         users.update(
112             {user['username']:user}
113         )
114         self.__save(users,self.user_json)
115 
116     def __change_role(self,username,role):
117         users = self.__read_users()
118         user=users.get(username)
119         if not user:
120             return False
121 
122         if role not in ROLES:
123             raise RoleError('not use role %s' % role)
124 
125         user['role']=role
126         user['update_time']=time.time()
127         users[username]=user
128         self.__save(users,self.user_json)
129         return True
130 
131     def __change_active(self,username):
132         users = self.__read_users()
133         user=users.get(username)
134         if not user:
135             return False
136         user['active'] = not user['active']
137         user['update_time']=time.time()
138         users[username] =user
139 
140         self.__save(users,self.user_json)
141         return True
142 
143     def __delete_user(self,username):
144         users = self.__read_users()
145         user=users.get(username)
146         if not user:
147             return False
148         delete_user= users.pop(username)
149         self.__save(users,self.user_json)
150         return delete_user
151 
152     def __read_gifts(self):
153         with open(self.gift_json) as f:
154             data=json.loads(f.read())
155         return data
156 
157     def __init_gifts(self):
158         data={
159             'level1':{
160                 'level1':{},
161                 'level2':{},
162                 'level3':{}
163             },
164             'level2': {
165                 'level1': {},
166                 'level2': {},
167                 'level3': {}
168             },
169             'level3': {
170                 'level1': {},
171                 'level2': {},
172                 'level3': {}
173             },
174             'level4': {
175                 'level1': {},
176                 'level2': {},
177                 'level3': {}
178             }
179         }
180         gifts = self.__read_gifts()
181         if len(gifts) !=0:
182             return
183         self.__save(data,self.gift_json)
184 
185     def __write_gift(self,first_level,second_level,gift_name,gift_count):
186         if first_level not in FIRSTLEVEL:
187             raise LevelError('firstlevel not exists')
188         if second_level not in SECONDLEVEL:
189             raise LevelError('secondlevel not exists')
190 
191         gifts=self.__read_gifts()
192 
193         current_gift_pool=gifts[first_level]
194         current_sencond_gift_pool=current_gift_pool[second_level]
195 
196         if gift_count <=0:
197             gift_count = 1
198 
199         if gift_name in current_sencond_gift_pool:
200             current_sencond_gift_pool[gift_name]['count']=current_sencond_gift_pool[gift_name]['count']+gift_count
201         else:
202             current_sencond_gift_pool[gift_name]={
203                 'name':gift_name,
204                 'count':gift_count
205             }
206 
207         current_gift_pool[second_level]=current_sencond_gift_pool
208         gifts[first_level]=current_gift_pool
209         self.__save(gifts,self.gift_json)
210 
211     def __check_and_getgift(self,first_level,second_level,gift_name):
212         if first_level not in FIRSTLEVEL:
213             raise LevelError('firstlevel not exists')
214         if second_level not in SECONDLEVEL:
215             raise LevelError('secondlevel not exists')
216 
217         gifts=self.__read_gifts()
218 
219         level_one=gifts[first_level]
220         level_two=level_one[second_level]
221 
222         if gift_name not in level_two:
223             return False
224 
225         return {
226             'level_one':level_one,
227             'level_two':level_two,
228             'gifts':gifts
229         }
230 
231 
232     def __gift_update(self,first_level,second_level,gift_name,gift_count=1,is_admin=False):
233         data = self.__check_and_getgift(first_level, second_level, gift_name)
234         assert isinstance(gift_count,int),'gift count is a int'
235         if data == False:
236             return data
237         current_gift_pool = data.get('level_one')
238         current_second_gift_pool = data.get('level_two')
239         gifts = data.get('gifts')
240 
241         current_gift=current_second_gift_pool[gift_name]
242 
243         if is_admin==True:
244             if gift_count<=0:
245                 raise CountError('gift count not 0')
246             current_gift['count']=gift_count
247         else:
248              if current_gift['count']-gift_count < 0 :
249                 raise NegativeNumberError("gift count can not nagative")
250              current_gift['count']-=gift_count
251 
252         current_second_gift_pool[gift_name]=current_gift
253         current_gift_pool[second_level]=current_second_gift_pool
254         gifts[first_level]=current_gift_pool
255         self.__save(gifts,self.gift_json)
256 
257     def __delete_gift(self,first_level,second_level,gift_name):
258         data = self.__check_and_getgift(first_level,second_level,gift_name)
259         if data == False:
260             return data
261         current_gift_pool=data.get('level_one')
262         current_second_gift_pool=data.get('level_two')
263         gifts=data.get('gifts')
264         delete_gift_data=current_second_gift_pool.pop(gift_name)
265         current_gift_pool[second_level]=current_second_gift_pool
266         gifts[first_level]=current_gift_pool
267         self.__save(gifts,self.gift_json)
268         return delete_gift_data
269 
270 if __name__=='__main__':
271     store_path=os.getcwd()
272     user_path=os.path.join(store_path,'storage','user.json')
273     gift_path=os.path.join(store_path,'storage','gift.json')
274     base=Base(user_path,gift_path)
275     base.delete_gift(first_level='level1',second_level='level2',gift_name='iphone')

user.py

  1 # coding:utf-8
  2 
  3 from base import Base
  4 from common.error import NotUserError,RoleError,UserActiveError,CountError
  5 from common.utils import timestamp_to_string
  6 import os
  7 import random
  8 '''
  9     1:user类的初始化
 10     2:get_user(时间的转变)
 11     3:查看奖品列表
 12     4:抽奖函数 随机判断第一层(level1) 1:50%  2:30%  3:15% 4:5%
 13     5:抽奖函数 随机判断第二层(level2) 1:80%  2:15%  3:5%
 14     6:抽奖函数 获取到对应层级的真实奖品,并随即一个奖品,查看奖品count是否为0
 15               不为零  中奖,提示用户,并奖品数量-1,并为用户更新
 16               奖品到user表中的gifts中
 17               数量为0,则未中奖
 18 '''
 19 
 20 class User(Base):
 21     def __init__(self,username,user_json,gift_json):
 22         self.username=username
 23         self.gift_random = list(range(1,101))
 24         super().__init__(user_json,gift_json)
 25         self.get_user()
 26 
 27     def get_user(self):
 28         users=self._Base__read_users()
 29         if self.username not in users:
 30             raise NotUserError('not user %s'% self.username)
 31 
 32         current_user=users.get(self.username)
 33         if current_user.get('active') == False:
 34             raise UserActiveError('the user %s had not use' % self.username)
 35 
 36         if current_user.get('role') != 'normal':
 37             raise RoleError('permission by normal')
 38 
 39         self.user=current_user
 40         self.name=current_user.get('username')
 41         self.role=current_user.get('role')
 42         self.gifts=current_user.get('gifts')
 43         self.create_time=timestamp_to_string(current_user.get('create_time'))
 44 
 45     def get_gifts(self):
 46         gifts=self._Base__read_gifts()
 47         gift_lists=[]
 48         for level_one,level_one_pool in gifts.items():
 49             for level_two,level_two_pool in level_one_pool.items():
 50                 for gift_name,gift_info in level_two_pool.items():
 51                     gift_lists.append(gift_info.get('name'))
 52         return gift_lists
 53 
 54     def choice_gift(self):
 55         #level1 get
 56         first_level,second_level= None,None
 57         self.get_user()
 58         level_one_count=random.choice(self.gift_random)
 59         if 1<=level_one_count<=50:
 60             first_level = 'level1'
 61         elif 51<=level_one_count<=80:
 62             first_level = 'level2'
 63         elif 81<=level_one_count<95:
 64             first_level = 'level3'
 65         elif level_one_count>=95:
 66             first_level = 'level4'
 67         else:
 68             raise CountError("level_one_count need 0~100")
 69         gifts = self._Base__read_gifts()
 70         level_one=gifts.get(first_level)
 71 
 72         level_two_count = random.choice(self.gift_random)
 73         if 1<=level_two_count<=80:
 74             second_level = 'level1'
 75         elif 81<=level_two_count<95:
 76             second_level = 'level2'
 77         elif 95<=level_two_count<=100:
 78             second_level = 'level3'
 79         else:
 80             raise CountError("level_one_count need 0~100")
 81         level_two=level_one.get(second_level)
 82 
 83         if len(level_two)<=0:
 84             print('真可惜,您没有中奖')
 85             return
 86 
 87         gift_names=[]
 88         for k,_ in level_two.items():
 89             gift_names.append(k)
 90         gift_name=random.choice(gift_names)
 91         gift_info = level_two.get(gift_name)
 92         if gift_info.get('count') ==0:
 93             print('真可惜,您没有中奖')
 94             return
 95         gift_info['count']-=1
 96         level_two[gift_name]=gift_info
 97         level_one[second_level]=level_two
 98         gifts[first_level]=level_one
 99 
100         self._Base__save(gifts,self.gift_json)
101         self.user['gifts'].append(gift_name)
102         self.update()
103         print('恭喜您获得%s奖品'% gift_name)
104 
105 
106     def update(self):
107         users=self._Base__read_users()
108         users[self.username]=self.user
109         self._Base__save(users,self.user_json)
110 
111 
112 
113 
114 if __name__=='__main__':
115     store_path=os.getcwd()
116     user_path=os.path.join(store_path,'storage','user.json')
117     gift_path=os.path.join(store_path,'storage','gift.json')
118     user=User('王五',user_path,gift_path)
119     user.choice_gift()

 

标签:__,username,抽奖,进阶,gift,Python,self,json,user
来源: https://www.cnblogs.com/gltou/p/15810913.html