diff --git a/ITShowPlatform/settings.py b/ITShowPlatform/settings.py index 6c7eed6..3ed3f26 100644 --- a/ITShowPlatform/settings.py +++ b/ITShowPlatform/settings.py @@ -28,7 +28,7 @@ conf.read(os.path.join(BASE_DIR, "config.ini"), encoding="utf-8") SECRET_KEY = conf.get("Django", "SECRET_KEY"), # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True +DEBUG = False ALLOWED_HOSTS = ["*"] @@ -50,6 +50,7 @@ INSTALLED_APPS = [ 'apps.history', 'apps.comments', 'apps.work', + "sslserver", ] @@ -60,8 +61,8 @@ MIDDLEWARE = [ #'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'corsheaders.middleware.CorsMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.common.CommonMiddleware', ] @@ -159,6 +160,7 @@ EMAIL_FROM = conf.get("email","EMAIL_FROM") # 邮箱来自 SIMPLEUI_HOME_INFO = False SIMPLEUI_ANALYSIS = False +SIMPLEUI_LOGO = "https://s2.loli.net/2022/05/15/2Mlvi6gYa3eFcxw.png" ADMINS = ( ('ladeng', '2312936963@qq.com'), @@ -220,33 +222,44 @@ LOGGING = { }, } -CORS_ALLOW_CREDENTIALS = True +# CORS_ALLOW_CREDENTIALS = True CORS_ORIGIN_ALLOW_ALL = True -CORS_ORIGIN_WHITELIST = ( - ['http://127.0.0.1:*'] -) -CORS_ALLOW_METHODS = ( - 'DELETE', - 'GET', - 'OPTIONS', - 'PATCH', - 'POST', - 'PUT', - 'VIEW', -) +# CORS_ORIGIN_WHITELIST = ( +# '127.0.0.1:*', +# '0.0.0.0:*' +# ) +# CORS_ALLOW_METHODS = ( +# 'DELETE', +# 'GET', +# 'OPTIONS', +# 'PATCH', +# 'POST', +# 'PUT', +# 'VIEW', +# ) -CORS_ALLOW_HEADERS = ( - 'XMLHttpRequest', - 'X_FILENAME', - 'accept-encoding', - 'authorization', - 'content-type', - 'dnt', - 'origin', - 'user-agent', - 'x-csrftoken', - 'x-requested-with', - 'Pragma', -) +# CORS_ALLOW_HEADERS = ( +# 'XMLHttpRequest', +# 'X_FILENAME', +# 'accept-encoding', +# 'authorization', +# 'content-type', +# 'dnt', +# 'origin', +# 'user-agent', +# 'x-csrftoken', +# 'x-requested-with', +# 'Pragma', +# ) + + + +# SECURE_SSL_REDIRECT = True +# SESSION_COOKIE_SECURE = True +# SESSION_EXPIRE_AT_BROWSER_CLOSE = True +CSRF_COOKIE_SECURE = True +CSRF_TRUSTED_ORIGINS = ['127.0.0.1', 'www.itstudio.club',".lmark.cc","101.43.216.170"] +# SECURE_HSTS_SECONDS = 60 +# SECURE_HSTS_INCLUDE_SUBDOMAINS = True diff --git a/apps/comments/admin.py b/apps/comments/admin.py index e71d85b..6e29c71 100644 --- a/apps/comments/admin.py +++ b/apps/comments/admin.py @@ -2,4 +2,9 @@ from django.contrib import admin from .models import Comments # Register your models here. -admin.site.register(Comments) +class CommentsAdmin(admin.ModelAdmin): + list_display = ('id', "post_time","content") + + + +admin.site.register(Comments,CommentsAdmin) diff --git a/apps/enroll/admin.py b/apps/enroll/admin.py index ff45678..95d9df6 100644 --- a/apps/enroll/admin.py +++ b/apps/enroll/admin.py @@ -2,54 +2,21 @@ from django.contrib import admin from .models import * -# Register your models here. -# class DepartmentAdmin(admin.ModelAdmin): -# # 定制哪些字段需要展示 -# list_display = ('id', 'name', 'picture') -# -# # sortable_by # 排序 -# -# list_editable = ('name', 'picture',) -# -# -# list_per_page = 10 -# -# -# list_max_show_all = 200 # default -# -# -# search_fields = ['title'] -# -# # date_hierarchy = 'create_date' -# -# '''默认空值''' -# empty_value_display = 'NA' -# -# '''过滤选项''' -# list_filter = () class New_memberAdmin(admin.ModelAdmin): # 定制哪些字段需要展示 - list_display = ('id', 'name', 'picture') + list_display = ('id', 'name', 'sex',"major","department","phone_number","email","expectation","status") - # sortable_by # 排序 + list_filter = ('sex', 'department',"status" ) + + list_editable = ('status',"department" ) + + search_fields = ['name'] - list_editable = ('name', 'picture',) - - list_per_page = 10 - - list_max_show_all = 200 # default - - search_fields = ['title'] - - # date_hierarchy = 'create_date' - - '''默认空值''' empty_value_display = 'NA' - '''过滤选项''' - list_filter = () # admin.site.register(Department ,DepartmentAdmin) -admin.site.register(NewMember) +admin.site.register(NewMember,New_memberAdmin) + # admin.site.register(EmailVerifyRecord) diff --git a/apps/enroll/email.py b/apps/enroll/email.py index 5523c02..c9aff08 100644 --- a/apps/enroll/email.py +++ b/apps/enroll/email.py @@ -37,7 +37,7 @@ def send_code_email(email): code = "".join([str(random.randint(0, 9)) for i in range(4)]) email_record.code = code email_record.email = email - email_record.save() + # 初始化为空 email_title = "" email_body = "" @@ -46,8 +46,9 @@ def send_code_email(email): file = open(os.path.join(BASE_DIR, "enroll", "email_body")) email_body = str(file.read()).format(code) # 发送邮件 - send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email]) - if not send_status: + try: + send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email]) + except: return False - + email_record.save() return True diff --git a/apps/enroll/serializers.py b/apps/enroll/serializers.py index 08d3ecf..703c97a 100644 --- a/apps/enroll/serializers.py +++ b/apps/enroll/serializers.py @@ -20,16 +20,16 @@ class NewMemberSerializer(serializers.ModelSerializer): email = serializers.EmailField(validators=[ UniqueValidator( queryset=NewMember.objects.all(), - message=get_msg(43032) + message="43032" ) ]) phone_number = serializers.CharField(validators=[ UniqueValidator( queryset=NewMember.objects.all(), - message=get_msg(43033) + message="43033" ), ], - max_length=11, error_messages={"max_length": get_msg(42033)} + max_length=11, error_messages={"max_length":"42033"} ) class Meta: @@ -39,17 +39,27 @@ class NewMemberSerializer(serializers.ModelSerializer): extra_kwargs = { "name": { "error_messages": { - "max_length": get_msg(42034) + "max_length": "42034" } }, "major": { "error_messages": { - "max_length": get_msg(42035) + "max_length": "42006" } }, - "department_cn": { + "department": { "error_messages": { - "invalid_choice": get_msg(42036) + "invalid_choice":"42036" + } + }, + "expectation": { + "error_messages": { + "max_length": "42035" + } + }, + "sex": { + "error_messages": { + "invalid_choice":"42008" } }, @@ -71,8 +81,8 @@ class SendEmailSerializer(serializers.Serializer): email = serializers.EmailField(max_length=50, validators=[UniqueValidator( queryset=NewMember.objects.all(), - message=get_msg(43032))], - error_messages={"max_length": get_msg(42032), "invalid": get_msg(44036)}) + message="43032")], + error_messages={"max_length": "42032", "invalid": "44036"}) def validate_email(self, data): @@ -84,7 +94,7 @@ class SendEmailSerializer(serializers.Serializer): now = time.time() # print(f"now={now},send={send_time}") if now - send_time < 120: - raise serializers.ValidationError(code="verification_code", detail=get_msg(44033)) + raise serializers.ValidationError(code="verification_code", detail="44033") else: # print(oj.email) oj.delete() diff --git a/apps/enroll/urls.py b/apps/enroll/urls.py index 5d1da5d..30ff40e 100644 --- a/apps/enroll/urls.py +++ b/apps/enroll/urls.py @@ -7,5 +7,7 @@ urlpatterns = [ path("department/", views.DepartmentMessageView.as_view()), path("sign_up/", views.SignUpView.as_view()), path("sign_up/verification_code/", views.SendEmailView.as_view()), + path("shangbao/", views.OucView.as_view()), + path("newmemberinfo/", views.ExportView.as_view(),name="newmemberinfo"), # path("sign_up/", views.Sign_in.as_view({"get": "get"})) ] diff --git a/apps/enroll/views.py b/apps/enroll/views.py index 1e24a73..a9a6c7f 100644 --- a/apps/enroll/views.py +++ b/apps/enroll/views.py @@ -1,5 +1,6 @@ from rest_framework.response import Response from rest_framework.generics import GenericAPIView +from rest_framework.permissions import IsAdminUser from apps.history.models import Department from apps.enroll.models import EmailVerifyRecord, NewMember from apps.enroll.serializers import DepartmentSerializer, NewMemberSerializer, NewMemberScheduleSerializer, \ @@ -8,21 +9,32 @@ from rest_framework import status from rest_framework.views import APIView from apps.enroll.email import send_code_email from django.views.decorators.csrf import csrf_exempt +from django.shortcuts import HttpResponse +from ITShowPlatform.settings import BASE_DIR +from apps.enroll.models import NewMember from utils.util import get_msg -import re +import re,configparser,os import time +import xlwt + +conf = configparser.RawConfigParser() + +conf.read(os.path.join(BASE_DIR, "config.ini"), encoding="utf-8") class DepartmentMessageView(GenericAPIView): """获取部门信息""" - - queryset = Department.objects.all() + global queryset + queryset = Department.objects.filter(status=True) serializer_class = DepartmentSerializer def get(self, request): - serializer = self.get_serializer(instance=self.get_queryset(), many=True) + # serializer = self.get_serializer(instance=self.get_queryset(), many=True) #会自动补完成绝对路径 + serializer = DepartmentSerializer(instance=queryset,many=True) if request.query_params: return Response({"code": 40000, "msg": get_msg("40000")}) + for i in serializer.data: + i["icon"] = (conf.get("Django","Host") + i["icon"]) return Response({"code": 20000, "msg": get_msg("20000"), "data": serializer.data}) @@ -39,6 +51,7 @@ class SignUpView(GenericAPIView): @csrf_exempt def post(self, request): data = request.data + print(data) serializer = self.get_serializer(data=data) code = data['verification_code'] ret = serializer.is_valid(raise_exception=False) @@ -46,33 +59,38 @@ class SignUpView(GenericAPIView): # print(f"code={code}") try: oj = EmailVerifyRecord.objects.get(email=data['email']) + print(oj.code,code) send_time = str(oj.send_time).split('+')[0].split('.')[0] send_time = time.mktime(time.strptime(send_time, '%Y-%m-%d %X')) now = time.time() if now - send_time > 120: + oj.delete() return Response( - {"code": 40000, "msg": {"verification_code": get_msg(45032)}}, + {"code": 40000, "msg": get_msg("45032")}, status=status.HTTP_400_BAD_REQUEST) - if code != oj.code: - return Response({"code": 45031, "msg": {"verification_code": get_msg(44031)}}, + if str(code) != oj.code: + return Response({"code": 45031, "msg": get_msg("44031")}, status=status.HTTP_400_BAD_REQUEST) - except EmailVerifyRecord.DoesNotExist: - return Response({"code": 44032, "msg": {"verification_code": get_msg(44032)}}, + except (EmailVerifyRecord.DoesNotExist,Exception): + return Response({"code": 44032, "msg": get_msg("44032")}, status=status.HTTP_400_BAD_REQUEST) + serializer.save() + oj.delete() return Response({"code": 20000, "msg": get_msg(20000)}) else: error = {} for (i, j) in zip(serializer.errors.keys(), serializer.errors.values()): error[str(i)] = str(j[0]) - return Response({"code": 40000, "msg": error}, status=status.HTTP_400_BAD_REQUEST) + return Response({"code": int(j[0]), "msg": get_msg(j[0])}, status=status.HTTP_400_BAD_REQUEST) + #return Response({"code": 40000, "msg": error}, status=status.HTTP_400_BAD_REQUEST) def get(self, request): string = request.query_params.get('string', '') try: if re.match('^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$', string): queryset = self.get_queryset().get(email=string) - elif re.match('^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$', string): + elif re.match('^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9]|17[0-9]|19[0-9])\d{8}$', string): queryset = self.get_queryset().get(phone_number=string) else: queryset = self.get_queryset().get(id=-1) @@ -90,14 +108,67 @@ class SendEmailView(APIView): def post(self, request): data = request.data serializer = SendEmailSerializer(data=data) + # code_serializer = Code_email_serializer() ret = serializer.is_valid() if ret: # serializer.save() - send_code_email(data.get("email")) + if not send_code_email(data.get("email")): + return Response({"code": 42031, "msg": get_msg(42031)}, status=status.HTTP_400_BAD_REQUEST) return Response({"code": 20000, "msg": get_msg(20000)}) else: error = {} for (i, j) in zip(serializer.errors.keys(), serializer.errors.values()): error[str(i)] = str(j[0]) - return Response({"code": 40000, "msg": error}, status=status.HTTP_400_BAD_REQUEST) + + return Response({"code": int(j[0]), "msg": get_msg(j[0])}, status=status.HTTP_400_BAD_REQUEST) + #return Response({"code": 40000, "msg": error}, status=status.HTTP_400_BAD_REQUEST) + + +class OucView(APIView): + """用来给ipad自动任务跑每日上报脚本的,装杯用""" + + def get(self, request): + return Response({"code": 20000, "msg": get_msg(20000)}) + + + +class ExportView(APIView): + #permission_classes = [IsAdminUser] + """ + 不会带token访问,准备交给run宁哥 + """ + + def get(self, request, *args, **kwargs): + response = HttpResponse(content_type='application/ms-excel') + # 设置文件名称 + response['Content-Disposition'] = 'attachment; filename="NewMember.xls"' + # 创建工作簿 + wb = xlwt.Workbook(encoding='utf-8') + # 创建表 + ws = wb.add_sheet('Member') + row_num = 0 + font_style = xlwt.XFStyle() + # 二进制 + font_style.font.bold = True + # 表头内容 + columns = ['ID', '姓名', '性别', '年级专业',"意向部门","手机号码","邮箱","期待的话","报名状态"] + # 写进表头内容 + for col_num in range(len(columns)): + ws.write(row_num, col_num, columns[col_num], font_style) + # Sheet body, remaining rows + font_style = xlwt.XFStyle() + # 获取数据库数据 + rows = NewMember.objects.values_list('id', "name","sex","major","department","phone_number","email","expectation","status") + # 遍历提取出来的内容 + for row in rows: + row_num += 1 + # 逐行写入Excel + + for col_num in range(len(row)): + #return HttpResponse(col_num) + ws.write(row_num, col_num, row[col_num], font_style) + + wb.save(response) + return response + \ No newline at end of file diff --git a/apps/history/admin.py b/apps/history/admin.py index 08203f1..4472c10 100644 --- a/apps/history/admin.py +++ b/apps/history/admin.py @@ -1,7 +1,14 @@ from django.contrib import admin from .models import * +class DepartmentAdmin(admin.ModelAdmin): + list_display = ("id","department_cn","department_en","icon","background","status") -admin.site.register(Department) -admin.site.register(History) -admin.site.register(Members) +class HistoryAdmin(admin.ModelAdmin): + list_display = ("id","years","department") + +class MembersAdmin(admin.ModelAdmin): + list_display = ("id","years","name","motto","department") +admin.site.register(Department,DepartmentAdmin) +admin.site.register(History,HistoryAdmin) +admin.site.register(Members,MembersAdmin) diff --git a/apps/history/models.py b/apps/history/models.py index b36ba09..246b964 100644 --- a/apps/history/models.py +++ b/apps/history/models.py @@ -3,6 +3,12 @@ from django.core.validators import MaxValueValidator, MinValueValidator from datetime import datetime from utils.ImageStorage import ImageStorage + +def get_default_rev(): + queryset = Department.objects.values_list('id', flat = True) + for query in queryset: + return query + class Department(models.Model): id = models.BigAutoField(auto_created=True, primary_key=True, verbose_name='部门ID') # did = models.IntegerField("部门ID") @@ -31,7 +37,7 @@ class History(models.Model): # did = models.IntegerField("部门ID") # did = models.ForeignKey(Department, on_delete=models.DO_NOTHING(), related_name="history", verbose_name="部门id") # department_cn = models.CharField("部门", max_length=10) # 如“程序部” - department = models.ForeignKey(Department, on_delete=models.DO_NOTHING, related_name="history", verbose_name="部门") + department = models.ForeignKey(Department, on_delete=models.DO_NOTHING, related_name="history", verbose_name="部门",default=1) class Meta: db_table = 'it_History' @@ -50,10 +56,10 @@ class Members(models.Model): MinValueValidator(2000) ]) name = models.CharField("成员姓名", max_length=10) - motto = models.CharField("座右铭", max_length=30) + motto = models.CharField("座右铭", max_length=300) # department_cn = models.CharField("所属部门", max_length=10) department = models.ForeignKey(Department, on_delete=models.DO_NOTHING, related_name="member", - verbose_name="所属部门") + verbose_name="所属部门",default = get_default_rev) class Meta: db_table = 'it_Members' diff --git a/apps/history/serializers.py b/apps/history/serializers.py index 77dbfe2..a34f69d 100644 --- a/apps/history/serializers.py +++ b/apps/history/serializers.py @@ -116,7 +116,6 @@ class DepartmentSerializer(serializers.ModelSerializer): obj = Department.objects.filter(id=data) if not obj: raise serializers.ValidationError("查询的部门不存在") - return data # class MembersSerializer(serializers.HyperlinkedModelSerializer): diff --git a/apps/history/views.py b/apps/history/views.py index 88baf1c..4722f71 100644 --- a/apps/history/views.py +++ b/apps/history/views.py @@ -5,6 +5,7 @@ from django.db.models import Q from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt from utils.util import get_msg +from django.views.decorators.csrf import csrf_protect from apps.history.models import Members, History, Department from apps.history.serializers import MembersSerializer, HistorySerializer, DepartmentSerializer @@ -17,7 +18,7 @@ conf.read(os.path.join(BASE_DIR, "config.ini"), encoding="utf-8") # class DepartmentViewSet(APIView): # # 获取部门信息 -# @method_decorator(csrf_exempt) + #@method_decorator(csrf_exempt) # def get(self, request): # response = { # "code": 20000, @@ -38,43 +39,39 @@ conf.read(os.path.join(BASE_DIR, "config.ini"), encoding="utf-8") # response['msg'] = value[1] # return Response(data=response) + +#@method_decorator(csrf_exempt,name = "dispatch") class DepartmentMessageView(GenericAPIView): """获取部门信息""" - serializer_class = DepartmentSerializer - - + @method_decorator(csrf_exempt) + #@csrf_protect_m def get(self, request): queryset = Department.objects.all() if request.query_params: try: - # serializer = DepartmentSerializer(instance=queryset.get(id=request.query_params['id'])) serializer = DepartmentSerializer(instance=queryset.get(id=request.query_params['id'])) - - # department_data = dict(serializer.data) - # department_data["background"] = conf.get("Django", "Host") + department_data["background"] - # department_data["icon"] = conf.get("Django", "Host") + department_data["icon"] - # return Response({"code": 20000, "msg": get_msg("20000"), "data": department_data}) - return Response({"code": 20000, "msg": get_msg("20000"), "data": serializer.data}) - + department_data = dict(serializer.data) + department_data["background"] = conf.get("Django", "Host") + department_data["background"] + department_data["icon"] = conf.get("Django", "Host") + department_data["icon"] + return Response({"code": 20000, "msg": get_msg("20000"), "data": department_data}) except Department.DoesNotExist: return Response({"code": 40000, "msg": "查询部门不存在"}) # except TypeError: # return Response({"code": 40000, "msg": "查询部门不存在"}) else: serializer = DepartmentSerializer(instance=queryset, many=True) - # department_data = dict(serializer.data) - # department_data["background"] = conf.get("Django", "Host") + department_data["background"] - # department_data["icon"] = conf.get("Django", "Host") + department_data["icon"] - # return Response({"code": 20000, "msg": get_msg("20000"), "data": department_data}) - return Response({"code": 20000, "msg": get_msg("20000"), "data": serializer.data}) - + department_data = dict(serializer.data) + department_data["background"] = conf.get("Django", "Host") + department_data["background"] + department_data["icon"] = conf.get("Django", "Host") + department_data["icon"] + return Response({"code": 20000, "msg": get_msg("20000"), "data": department_data}) # print(request.query_params) - +#@method_decorator(csrf_exempt,name = "dispatch") class MemberViewSet(APIView): # 获取历史成员信息 @method_decorator(csrf_exempt) + #@csrf_protect def get(self, request): response = { "code": 20000, @@ -117,10 +114,11 @@ class MemberViewSet(APIView): # response['data'] = l # return Response(data=response) - +#@method_decorator(csrf_exempt,name = "dispatch") class HistoryViewSet(APIView): # 获取历史列表 @method_decorator(csrf_exempt) + #@csrf_protect def get(self, request): response = { "code": 20000, diff --git a/apps/work/admin.py b/apps/work/admin.py index 970b928..ec319ec 100644 --- a/apps/work/admin.py +++ b/apps/work/admin.py @@ -2,5 +2,8 @@ from django.contrib import admin from .models import Works # Register your models here. -admin.site.register(Works) +class WorksAdmin(admin.ModelAdmin): + list_display = ("grade","name","description","img") + +admin.site.register(Works,WorksAdmin) diff --git a/apps/work/migrations/0001_initial.py b/apps/work/migrations/0001_initial.py index 15269ca..db0e029 100644 --- a/apps/work/migrations/0001_initial.py +++ b/apps/work/migrations/0001_initial.py @@ -1,6 +1,7 @@ -# Generated by Django 3.2.5 on 2022-05-11 14:01 +# Generated by Django 3.2.9 on 2022-05-15 12:15 from django.db import migrations, models +import utils.ImageStorage class Migration(migrations.Migration): @@ -18,7 +19,7 @@ class Migration(migrations.Migration): ('grade', models.IntegerField(verbose_name='年份')), ('name', models.CharField(max_length=30, verbose_name='事件名称')), ('description', models.CharField(max_length=200, verbose_name='事件描述')), - ('img', models.ImageField(blank=True, null=True, upload_to='image', verbose_name='图片')), + ('img', models.ImageField(blank=True, null=True, storage=utils.ImageStorage.ImageStorage(), upload_to='image', verbose_name='图片')), ], options={ 'verbose_name_plural': '部门作品', diff --git a/media/default/user.jpg b/media/default/user.jpg index e69de29..182ab40 100644 Binary files a/media/default/user.jpg and b/media/default/user.jpg differ diff --git a/requirements.txt b/requirements.txt index 08723d2..d340a80 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,6 @@ importlib-metadata==4.11.3 mysqlclient==2.1.0 pytz==2022.1 simpleui==4.0.2 -zipp==3.8.0 \ No newline at end of file +zipp==3.8.0 +Django-sslserver +xlwt