commit f0389a8c8ee5eaca41550ba07009d3cb73d55272
Author: ygm1881 <2302253692@qq.com>
Date: Sun Apr 17 15:32:30 2022 +0800
enroll
diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..35410ca
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/.idea/ITShowPlatform.iml b/.idea/ITShowPlatform.iml
new file mode 100644
index 0000000..360bf94
--- /dev/null
+++ b/.idea/ITShowPlatform.iml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..5d2f836
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..e7532e7
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..ac659a7
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..288b36b
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/ITShowPlatform/__init__.py b/ITShowPlatform/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/ITShowPlatform/asgi.py b/ITShowPlatform/asgi.py
new file mode 100644
index 0000000..e0b18c8
--- /dev/null
+++ b/ITShowPlatform/asgi.py
@@ -0,0 +1,16 @@
+"""
+ASGI config for ITShowPlatform project.
+
+It exposes the ASGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ITShowPlatform.settings')
+
+application = get_asgi_application()
diff --git a/ITShowPlatform/settings.py b/ITShowPlatform/settings.py
new file mode 100644
index 0000000..cd181a2
--- /dev/null
+++ b/ITShowPlatform/settings.py
@@ -0,0 +1,134 @@
+"""
+Django settings for ITShowPlatform project.
+
+Generated by 'django-admin startproject' using Django 4.0.4.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.0/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/4.0/ref/settings/
+"""
+
+from pathlib import Path
+
+# Build paths inside the project like this: BASE_DIR / 'subdir'.
+BASE_DIR = Path(__file__).resolve().parent.parent
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/4.0/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = 'django-insecure-@i80$q(g*+fof5(s2&^r#1=2+(@f=#=1$6!7&90=8v8lxg!y8h'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = True
+
+ALLOWED_HOSTS = []
+
+
+# Application definition
+
+INSTALLED_APPS = [
+ 'django.contrib.admin',
+ 'django.contrib.auth',
+ 'django.contrib.contenttypes',
+ 'django.contrib.sessions',
+ 'django.contrib.messages',
+ 'django.contrib.staticfiles',
+ 'enroll',
+ 'rest_framework',
+]
+
+MIDDLEWARE = [
+ 'django.middleware.security.SecurityMiddleware',
+ 'django.contrib.sessions.middleware.SessionMiddleware',
+ 'django.middleware.common.CommonMiddleware',
+ 'django.middleware.csrf.CsrfViewMiddleware',
+ 'django.contrib.auth.middleware.AuthenticationMiddleware',
+ 'django.contrib.messages.middleware.MessageMiddleware',
+ 'django.middleware.clickjacking.XFrameOptionsMiddleware',
+]
+
+ROOT_URLCONF = 'ITShowPlatform.urls'
+
+TEMPLATES = [
+ {
+ 'BACKEND': 'django.template.backends.django.DjangoTemplates',
+ 'DIRS': [BASE_DIR / 'templates']
+ ,
+ 'APP_DIRS': True,
+ 'OPTIONS': {
+ 'context_processors': [
+ 'django.template.context_processors.debug',
+ 'django.template.context_processors.request',
+ 'django.contrib.auth.context_processors.auth',
+ 'django.contrib.messages.context_processors.messages',
+ ],
+ },
+ },
+]
+
+WSGI_APPLICATION = 'ITShowPlatform.wsgi.application'
+
+
+# Database
+# https://docs.djangoproject.com/en/4.0/ref/settings/#databases
+
+DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.sqlite3',
+ 'NAME': BASE_DIR / 'db.sqlite3',
+ }
+}
+
+
+# Password validation
+# https://docs.djangoproject.com/en/4.0/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+ {
+ 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+ },
+ {
+ 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+ },
+]
+
+
+# Internationalization
+# https://docs.djangoproject.com/en/4.0/topics/i18n/
+
+LANGUAGE_CODE = 'en-us'
+
+TIME_ZONE = 'UTC'
+
+USE_I18N = True
+
+USE_TZ = True
+
+
+# Static files (CSS, JavaScript, Images)
+# https://docs.djangoproject.com/en/4.0/howto/static-files/
+
+STATIC_URL = 'static/'
+
+# Default primary key field type
+# https://docs.djangoproject.com/en/4.0/ref/settings/#default-auto-field
+
+DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
+
+EMAIL_HOST = "smtp.qq.com" # 服务器
+EMAIL_PORT = 465
+EMAIL_HOST_USER = "2302253692@qq.com" # 账号
+EMAIL_HOST_PASSWORD = "idujbpdlpgbmdhjg" # 密码 (注意:这里的密码指的是授权码)
+EMAIL_USE_SSL = True # 一般都为False
+EMAIL_FROM = "2302253692@qq.com" # 邮箱来自
+
diff --git a/ITShowPlatform/urls.py b/ITShowPlatform/urls.py
new file mode 100644
index 0000000..2ef3b7c
--- /dev/null
+++ b/ITShowPlatform/urls.py
@@ -0,0 +1,21 @@
+"""ITShowPlatform URL Configuration
+
+The `urlpatterns` list routes URLs to views. For more information please see:
+ https://docs.djangoproject.com/en/4.0/topics/http/urls/
+Examples:
+Function views
+ 1. Add an import: from my_app import views
+ 2. Add a URL to urlpatterns: path('', views.home, name='home')
+Class-based views
+ 1. Add an import: from other_app.views import Home
+ 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
+Including another URLconf
+ 1. Import the include() function: from django.urls import include, path
+ 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
+"""
+from django.contrib import admin
+from django.urls import path
+
+urlpatterns = [
+ path('admin/', admin.site.urls),
+]
diff --git a/ITShowPlatform/wsgi.py b/ITShowPlatform/wsgi.py
new file mode 100644
index 0000000..3f11d41
--- /dev/null
+++ b/ITShowPlatform/wsgi.py
@@ -0,0 +1,16 @@
+"""
+WSGI config for ITShowPlatform project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/4.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ITShowPlatform.settings')
+
+application = get_wsgi_application()
diff --git a/enroll/__init__.py b/enroll/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/enroll/admin.py b/enroll/admin.py
new file mode 100644
index 0000000..8c38f3f
--- /dev/null
+++ b/enroll/admin.py
@@ -0,0 +1,3 @@
+from django.contrib import admin
+
+# Register your models here.
diff --git a/enroll/apps.py b/enroll/apps.py
new file mode 100644
index 0000000..4cfaf47
--- /dev/null
+++ b/enroll/apps.py
@@ -0,0 +1,6 @@
+from django.apps import AppConfig
+
+
+class EnrollConfig(AppConfig):
+ default_auto_field = 'django.db.models.BigAutoField'
+ name = 'enroll'
diff --git a/enroll/email.py b/enroll/email.py
new file mode 100644
index 0000000..b2b6161
--- /dev/null
+++ b/enroll/email.py
@@ -0,0 +1,60 @@
+from random import Random # 用于生成随机码
+from django.core.mail import send_mail # 发送邮件模块
+from enroll.models import EmailVerifyRecord # 邮箱验证model
+from django.conf import settings # setting.py添加的的配置信息
+import random
+import datetime
+
+
+# 生成随机字符串
+def random_str(randomlength=8):
+ """
+ 随机字符串
+ :param randomlength: 字符串长度
+ :return: String 类型字符串
+ """
+ str = ''
+ chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
+ length = len(chars) - 1
+ random = Random()
+ for i in range(randomlength):
+ str += chars[random.randint(0, length)]
+ return str
+
+
+# 发送电子邮件
+def send_code_email(email, send_type="register"):
+ """
+ 发送电子邮件
+ :param email: 要发送的邮箱
+ :param send_type: 邮箱类型
+ :return: True/False
+ """
+ email_record = EmailVerifyRecord()
+ # 将给用户发的信息保存在数据库中
+ code = "".join([str(random.randint(0, 9)) for i in range(4)])
+ email_record.code = code
+ email_record.email = email
+ email_record.send_type = send_type
+ email_record.send_time = datetime.datetime.now()
+ email_record.save()
+ # 初始化为空
+ email_title = ""
+ email_body = ""
+ # 如果为注册类型
+ if send_type == "register":
+ email_title = "注册激活"
+ # email_body = "请点击下面的链接激活你的账号:http://127.0.0.1:8000/active/{0}".format(code)
+ email_body = "您的邮箱注册验证码为:{0}, 该验证码有效时间为两分钟,请及时进行验证。".format(code)
+ # 发送邮件
+ send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email])
+ if not send_status:
+ return False
+ if send_type == "retrieve":
+ email_title = "找回密码"
+ email_body = "您的邮箱注册验证码为:{0}, 该验证码有效时间为两分钟,请及时进行验证。".format(code)
+ # 发送邮件
+ send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email])
+ if not send_status:
+ return False
+ return True
\ No newline at end of file
diff --git a/enroll/migrations/0001_initial.py b/enroll/migrations/0001_initial.py
new file mode 100644
index 0000000..752db97
--- /dev/null
+++ b/enroll/migrations/0001_initial.py
@@ -0,0 +1,46 @@
+# Generated by Django 4.0.4 on 2022-04-15 17:46
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Department',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=10, verbose_name='部门名称')),
+ ('picture', models.ImageField(upload_to='', verbose_name='部门图标')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='EmailVerifyRecord',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('code', models.CharField(max_length=20, verbose_name='验证码')),
+ ('email', models.EmailField(max_length=50, verbose_name='邮箱')),
+ ('send_time', models.DateTimeField(auto_now=True, verbose_name='发送时间')),
+ ],
+ ),
+ migrations.CreateModel(
+ name='New_member',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=20, verbose_name='姓名')),
+ ('major', models.CharField(max_length=20, verbose_name='年级专业')),
+ ('phone_number', models.CharField(max_length=11, verbose_name='手机号码')),
+ ('email', models.EmailField(max_length=254, verbose_name='邮箱')),
+ ('department', models.CharField(max_length=10, verbose_name='意向部门')),
+ ('expectation', models.CharField(max_length=10, verbose_name='期待的话')),
+ ('schedule', models.SmallIntegerField(choices=[(0, '尚未提交'), (1, '已报名'), (2, '初审中'), (3, '面试中'), (4, '笔试中'), (5, '成功录取'), (-1, '初审失败'), (-2, '面试失败'), (-3, '笔试失败'), (-4, '复试失败'), (-5, '未录取')], verbose_name='报名状态')),
+ ('verification_code', models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, to='enroll.emailverifyrecord', verbose_name='邮箱验证码')),
+ ],
+ ),
+ ]
diff --git a/enroll/migrations/0002_alter_new_member_schedule_and_more.py b/enroll/migrations/0002_alter_new_member_schedule_and_more.py
new file mode 100644
index 0000000..c89c004
--- /dev/null
+++ b/enroll/migrations/0002_alter_new_member_schedule_and_more.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.0.4 on 2022-04-15 18:20
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('enroll', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='new_member',
+ name='schedule',
+ field=models.SmallIntegerField(choices=[(0, '尚未提交'), (1, '已报名'), (2, '初审中'), (3, '面试中'), (4, '笔试中'), (5, '成功录取'), (-1, '初审失败'), (-2, '面试失败'), (-3, '笔试失败'), (-4, '复试失败'), (-5, '未录取')], default=0, verbose_name='报名状态'),
+ ),
+ migrations.AlterField(
+ model_name='new_member',
+ name='verification_code',
+ field=models.CharField(max_length=4),
+ ),
+ ]
diff --git a/enroll/migrations/0003_alter_new_member_email_alter_new_member_phone_number.py b/enroll/migrations/0003_alter_new_member_email_alter_new_member_phone_number.py
new file mode 100644
index 0000000..bf7c080
--- /dev/null
+++ b/enroll/migrations/0003_alter_new_member_email_alter_new_member_phone_number.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.0.4 on 2022-04-16 06:33
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('enroll', '0002_alter_new_member_schedule_and_more'),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name='new_member',
+ name='email',
+ field=models.EmailField(max_length=254, unique=True, verbose_name='邮箱'),
+ ),
+ migrations.AlterField(
+ model_name='new_member',
+ name='phone_number',
+ field=models.CharField(max_length=11, unique=True, verbose_name='手机号码'),
+ ),
+ ]
diff --git a/enroll/migrations/__init__.py b/enroll/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/enroll/models.py b/enroll/models.py
new file mode 100644
index 0000000..34c7a22
--- /dev/null
+++ b/enroll/models.py
@@ -0,0 +1,57 @@
+from django.db import models
+
+
+# Create your models here.
+class Department(models.Model):
+ # department = [
+ # (0, "系统维护"),
+ # (1, "APP开发"),
+ # (2, "Web开发"),
+ # (3, "程序开发"),
+ # (4, "游戏开发"),
+ # (5, "UI设计")
+ # ]
+ # id = models.IntegerField(verbose_name="部门ID", choices=department, primary_key=True)
+ name = models.CharField(max_length=10, verbose_name="部门名称")
+ picture = models.ImageField(verbose_name="部门图标")
+
+ def __str__(self):
+ return self.name
+
+
+class New_member(models.Model):
+ schedules = [
+ (0, "尚未提交"),
+ (1, "已报名"),
+ (2, "初审中"),
+ (3, "面试中"),
+ (4, "笔试中"),
+ (5, "成功录取"),
+ (-1, "初审失败"),
+ (-2, "面试失败"),
+ (-3, "笔试失败"),
+ (-4, "复试失败"),
+ (-5, "未录取")
+ ]
+ name = models.CharField(max_length=20, verbose_name="姓名")
+ major = models.CharField(max_length=20, verbose_name="年级专业")
+ phone_number = models.CharField(max_length=11, unique=True, verbose_name="手机号码")
+ email = models.EmailField(unique=True, verbose_name="邮箱")
+ department = models.CharField(max_length=10, verbose_name="意向部门")
+ expectation = models.CharField(max_length=10, verbose_name="期待的话")
+ schedule = models.SmallIntegerField(choices=schedules, default=0, verbose_name="报名状态")
+ # verification_code = models.ForeignKey("EmailVerifyRecord", on_delete=models.DO_NOTHING, verbose_name="邮箱验证码")
+ verification_code = models.CharField(max_length=4)
+
+ def __str__(self):
+ return self.name
+
+
+class EmailVerifyRecord(models.Model):
+ # 验证码
+ code = models.CharField(max_length=20, verbose_name="验证码")
+ email = models.EmailField(max_length=50, verbose_name="邮箱")
+ # 包含注册验证和找回验证
+ # send_type = models.CharField(verbose_name="验证码类型", max_length=10,
+ # choices=(("register", "注册"), ("forget", "找回密码")))
+ send_time = models.DateTimeField(verbose_name="发送时间", auto_now=True)
diff --git a/enroll/serializer.py b/enroll/serializer.py
new file mode 100644
index 0000000..ce6832a
--- /dev/null
+++ b/enroll/serializer.py
@@ -0,0 +1,61 @@
+from rest_framework import serializers
+from rest_framework.validators import UniqueValidator
+
+from enroll.models import Department, New_member
+
+
+class Department_serializer(serializers.ModelSerializer):
+ class Meta:
+ model = Department
+ fields = "__all__"
+
+
+class New_member_serializer(serializers.ModelSerializer):
+ # verification_code = serializers.CharField(source="verification_code.code")
+ email = serializers.EmailField(validators=[
+ UniqueValidator(
+ queryset=New_member.objects.all(),
+ message="该邮箱已存在"
+ )
+ ])
+ phone_number = serializers.CharField(validators=[
+ UniqueValidator(
+ queryset=New_member.objects.all(),
+ message="该手机号码已存在"
+ ),
+ ],
+ max_length=11, error_messages={"max_length": "手机号码不合规"}
+ )
+
+ class Meta:
+ model = New_member
+ exclude = ["id", "schedule"]
+
+ extra_kwargs = {
+ "name": {
+ "error_messages": {
+ "max_length": "姓名过长"
+ }
+ },
+ "major": {
+ "error_messages": {
+ "max_length": "文字过长"
+ }
+ },
+
+ }
+
+
+class New_member_schedule_serializer(serializers.ModelSerializer):
+ class Meta:
+ model = New_member
+ fields = ["name", "email", "schedule"]
+
+
+class Send_email_serializer(serializers.Serializer):
+ # code = serializers.CharField(max_length=10)
+ email = serializers.EmailField(max_length=50,
+ validators=[UniqueValidator(
+ queryset=New_member.objects.all(),
+ message="该邮箱已存在")],
+ error_messages={"max_length": "邮箱过长", "invalid": "请输入正确格式的邮箱"})
diff --git a/enroll/tests.py b/enroll/tests.py
new file mode 100644
index 0000000..7ce503c
--- /dev/null
+++ b/enroll/tests.py
@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.
diff --git a/enroll/urls.py b/enroll/urls.py
new file mode 100644
index 0000000..bf6e2c7
--- /dev/null
+++ b/enroll/urls.py
@@ -0,0 +1,16 @@
+from django.contrib import admin
+from django.urls import path, include
+from . import views
+
+# from rest_framework.routers import DefaultRouter
+
+urlpatterns = [
+ path("department/", views.Department_message.as_view()),
+ path("sign_up/", views.Sign_up.as_view()),
+ path("sign_up/verification_code/", views.Send_email.as_view()),
+ # path("sign_up/", views.Sign_in.as_view({"get": "get"}))
+]
+
+# router = DefaultRouter()
+# router.register("sign_in", views.Sign_in, "sign_in")
+# urlpatterns += router.urls
diff --git a/enroll/views.py b/enroll/views.py
new file mode 100644
index 0000000..1cdcc79
--- /dev/null
+++ b/enroll/views.py
@@ -0,0 +1,70 @@
+from rest_framework.exceptions import ValidationError
+from rest_framework.response import Response
+from rest_framework.generics import GenericAPIView
+from enroll.models import Department, EmailVerifyRecord, New_member
+from enroll.serializer import Department_serializer, New_member_serializer, New_member_schedule_serializer, \
+ Send_email_serializer
+from rest_framework import status
+from rest_framework.views import APIView
+from enroll.email import send_code_email
+import re
+
+
+class Department_message(GenericAPIView):
+ queryset = Department.objects.all()
+ serializer_class = Department_serializer
+
+ def get(self, request):
+ serializer = self.get_serializer(instance=self.get_queryset(), many=True)
+ # print(request.query_params)
+ if request.query_params:
+ return Response({"code": 40000, "msg": "请求失败"})
+ return Response({"code": 20000, "msg": "成功", "data": serializer.data}, status=status.HTTP_200_OK)
+
+
+class Sign_up(GenericAPIView):
+ serializer_class = New_member_serializer
+ queryset = New_member.objects.all()
+
+ def post(self, request):
+ data = request.data
+ serializer = self.get_serializer(data=data)
+ code = data['verification_code']
+ # print(f"code={code}")
+ try:
+ if code != EmailVerifyRecord.objects.get(email=data['email']).code:
+ return Response({"verification_code": "邮箱验证码错误"}, status=status.HTTP_400_BAD_REQUEST)
+ except EmailVerifyRecord.DoesNotExist:
+ return Response({"verification_code": "请先发送验证码"}, status=status.HTTP_400_BAD_REQUEST)
+ serializer.is_valid(raise_exception=True)
+ serializer.save()
+ # print(serializer.errors)
+ # if ret:
+ # serializer.save()
+ # else:
+ # print(f"error_messages={serializer.errors}")
+ return Response({"code": 20000, "msg": "成功"})
+
+ 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):
+ queryset = self.get_queryset().get(phone_number=string)
+ else:
+ queryset = self.get_queryset().get(id=-1)
+ except New_member.DoesNotExist:
+ return Response({"code": 40000, "msg": "信息不存在"})
+ serializer = New_member_schedule_serializer(instance=queryset)
+
+ return Response({"code": 20000, "msg": "查询成功", "data": serializer.data})
+
+
+class Send_email(APIView):
+ def post(self, request):
+ data = request.data
+ serializer = Send_email_serializer(data=data)
+ serializer.is_valid(raise_exception=True)
+ send_code_email(data.get("email"))
+ return Response({"code": 20000, "msg": "成功"})
diff --git a/manage.py b/manage.py
new file mode 100644
index 0000000..96d7941
--- /dev/null
+++ b/manage.py
@@ -0,0 +1,22 @@
+#!/usr/bin/env python
+"""Django's command-line utility for administrative tasks."""
+import os
+import sys
+
+
+def main():
+ """Run administrative tasks."""
+ os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ITShowPlatform.settings')
+ try:
+ from django.core.management import execute_from_command_line
+ except ImportError as exc:
+ raise ImportError(
+ "Couldn't import Django. Are you sure it's installed and "
+ "available on your PYTHONPATH environment variable? Did you "
+ "forget to activate a virtual environment?"
+ ) from exc
+ execute_from_command_line(sys.argv)
+
+
+if __name__ == '__main__':
+ main()