66from django .contrib .auth .decorators import login_required # 登录需求装饰器
77from django .core .paginator import Paginator ,PageNotAnInteger ,EmptyPage ,InvalidPage # 后端分页
88from app_admin .decorators import superuser_only ,open_register
9- import json ,datetime ,hashlib
9+ from django .core .exceptions import ObjectDoesNotExist
10+ import json ,datetime ,hashlib ,random
1011from app_doc .models import *
1112from app_admin .models import *
1213from app_admin .utils import *
@@ -68,20 +69,29 @@ def register(request):
6869 email = request .POST .get ('email' ,None )
6970 password = request .POST .get ('password' ,None )
7071 checkcode = request .POST .get ("check_code" ,None )
72+ register_code = request .POST .get ("register_code" ,None )
73+ is_register_code = SysSetting .objects .filter (types = 'basic' , name = 'enable_register_code' , value = 'on' )
74+ if is_register_code .count () > 0 : # 开启了注册码设置
75+ try :
76+ register_code_value = RegisterCode .objects .get (code = register_code ,status = 1 )
77+ except ObjectDoesNotExist :
78+ errormsg = '注册码无效!'
79+ return render (request , 'register.html' , locals ())
80+ # 判断是否输入了用户名、邮箱和密码
7181 if username and email and password :
7282 if '@' in email :
7383 email_exit = User .objects .filter (email = email )
7484 username_exit = User .objects .filter (username = username )
75- if email_exit .count () > 0 :
85+ if email_exit .count () > 0 : # 验证电子邮箱
7686 errormsg = '此电子邮箱已被注册!'
7787 return render (request , 'register.html' , locals ())
78- elif username_exit .count () > 0 :
88+ elif username_exit .count () > 0 : # 验证用户名
7989 errormsg = '用户名已被使用!'
8090 return render (request , 'register.html' , locals ())
81- elif len (password ) < 6 :
91+ elif len (password ) < 6 : # 验证密码长度
8292 errormsg = '密码必须大于等于6位!'
8393 return render (request , 'register.html' , locals ())
84- elif checkcode != request .session ['CheckCode' ].lower ():
94+ elif checkcode != request .session ['CheckCode' ].lower (): # 验证验证码
8595 errormsg = "验证码错误"
8696 return render (request , 'register.html' , locals ())
8797 else :
@@ -90,11 +100,27 @@ def register(request):
90100 user .save ()
91101 # 登录用户
92102 user = authenticate (username = username , password = password )
103+ # 注册码数据更新
104+ if is_register_code .count () > 0 :
105+ r_all_cnt = register_code_value .all_cnt # 注册码的最大使用次数
106+ r_used_cnt = register_code_value .used_cnt + 1 # 更新注册码的已使用次数
107+ r_use_user = register_code_value .user_list # 注册码的使用用户
108+ if r_used_cnt >= r_all_cnt : # 如果注册码已使用次数大于等于注册码的最大使用次数,则注册码失效
109+ RegisterCode .objects .filter (code = register_code ).update (
110+ status = 0 ,# 注册码状态设为失效
111+ used_cnt = r_used_cnt , # 更新注册码的已使用次数
112+ user_list = r_use_user + email + ',' ,
113+ )
114+ else :
115+ RegisterCode .objects .filter (code = register_code ).update (
116+ used_cnt = r_used_cnt , # 更新注册码的已使用次数
117+ user_list = r_use_user + email + ',' ,
118+ )
93119 if user .is_active :
94120 login (request , user )
95121 return redirect ('/' )
96122 else :
97- errormsg = '用户被禁用!'
123+ errormsg = '用户被禁用,请联系管理员 !'
98124 return render (request , 'register.html' , locals ())
99125 else :
100126 errormsg = '请输入正确的电子邮箱格式!'
@@ -388,6 +414,62 @@ def admin_doctemp(request):
388414 return render (request ,'app_admin/admin_doctemp.html' ,locals ())
389415
390416
417+ # 管理员后台 - 注册邀请码管理
418+ @superuser_only
419+ def admin_register_code (request ):
420+ # 返回注册邀请码管理页面
421+ if request .method == 'GET' :
422+ register_codes = RegisterCode .objects .all ()
423+ paginator = Paginator (register_codes , 10 )
424+ page = request .GET .get ('page' , 1 )
425+ try :
426+ codes = paginator .page (page )
427+ except PageNotAnInteger :
428+ codes = paginator .page (1 )
429+ except EmptyPage :
430+ codes = paginator .page (paginator .num_pages )
431+ return render (request ,'app_admin/admin_register_code.html' ,locals ())
432+ elif request .method == 'POST' :
433+ types = request .POST .get ('types' ,None )
434+ if types is None :
435+ return JsonResponse ({'status' :False ,'data' :'参数错误' })
436+ # types表示注册码操作的类型,1表示新增、2表示删除
437+ if int (types ) == 1 :
438+ try :
439+ all_cnt = int (request .POST .get ('all_cnt' ,1 )) # 注册码的最大使用次数
440+ is_code = False
441+ while is_code is False :
442+ code_str = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM'
443+ random_code = '' .join (random .choices (code_str , k = 10 ))
444+ random_code_used = RegisterCode .objects .filter (code = random_code ).count ()
445+ if random_code_used > 0 : # 已存在此注册码,继续生成一个注册码
446+ is_code = False
447+ else :# 数据库中不存在此注册码,跳出循环
448+ is_code = True
449+ # 创建一个注册码
450+ RegisterCode .objects .create (
451+ code = random_code ,
452+ all_cnt = all_cnt ,
453+ create_user = request .user
454+ )
455+ return JsonResponse ({'status' :True ,'data' :'新增成功' })
456+ except Exception as e :
457+ return JsonResponse ({'status' : False ,'data' :'系统异常' })
458+ elif int (types ) == 2 :
459+ code_id = request .POST .get ('code_id' ,None )
460+ try :
461+ register_code = RegisterCode .objects .get (id = int (code_id ))
462+ register_code .delete ()
463+ return JsonResponse ({'status' :True ,'data' :'删除成功' })
464+ except ObjectDoesNotExist :
465+ return JsonResponse ({'status' :False ,'data' :'注册码不存在' })
466+ except :
467+ return JsonResponse ({'status' :False ,'data' :'系统异常' })
468+ else :
469+ return JsonResponse ({'status' :False ,'data' :'类型错误' })
470+ else :
471+ return JsonResponse ({'status' : False ,'data' :'方法错误' })
472+
391473# 普通用户修改密码
392474@login_required ()
393475def change_pwd (request ):
@@ -429,11 +511,12 @@ def admin_setting(request):
429511 types = request .POST .get ('type' ,None )
430512 # 基础设置
431513 if types == 'basic' :
432- close_register = request .POST .get ('close_register' ,None )
433- static_code = request .POST .get ('static_code' ,None )
434- ad_code = request .POST .get ('ad_code' ,None )
435- beian_code = request .POST .get ('beian_code' ,None )
436- enbale_email = request .POST .get ("enable_email" ,None )
514+ close_register = request .POST .get ('close_register' ,None ) # 禁止注册
515+ static_code = request .POST .get ('static_code' ,None ) # 统计代码
516+ ad_code = request .POST .get ('ad_code' ,None ) # 广告代码
517+ beian_code = request .POST .get ('beian_code' ,None ) # 备案号
518+ enbale_email = request .POST .get ("enable_email" ,None ) # 启用邮箱
519+ enable_register_code = request .POST .get ('enable_register_code' ,None ) # 注册邀请码
437520 # 更新开放注册状态
438521 SysSetting .objects .update_or_create (
439522 name = 'close_register' ,
@@ -459,6 +542,11 @@ def admin_setting(request):
459542 name = 'enable_email' ,
460543 defaults = {'value' : enbale_email , 'types' : 'basic' }
461544 )
545+ # 更新注册码启停状态
546+ SysSetting .objects .update_or_create (
547+ name = 'enable_register_code' ,
548+ defaults = {'value' : enable_register_code , 'types' :'basic' }
549+ )
462550
463551 return render (request ,'app_admin/admin_setting.html' ,locals ())
464552 elif types == 'email' :
0 commit comments