Compare commits

..

8 Commits

Author SHA1 Message Date
lrs 2944987428 Further improvement of teacher functions
1 year ago
lrs cc79137b3c Further improvement of teacher functions
1 year ago
lrs f0f04b1320 Further improvement of teacher functions
1 year ago
lrs 7bc09e1bc6 Further improvement of teacher functions
1 year ago
lrs 1fa138dd24 Further improvement of teacher functions
1 year ago
lrs fd5e26b71a Further improvement of teacher functions
1 year ago
lrs d2b971806f Further improvement of teacher functions
1 year ago
lrs e2f26fff22 update code
1 year ago

@ -1,5 +1,3 @@
from django.contrib import admin from django.contrib import admin
# Register your models here. # Register your models here.

@ -1,48 +1,23 @@
import jwt
from django.http import JsonResponse from django.http import JsonResponse
from EduSystemServer.settings import TOKEN_KEY
from EduSystemServer.utils import ResponseUtil
from Eduadmin.models import Admin
from Student.models import Student
from teacher.models import Teacher
class JWTMiddleware: class AuthMiddleware:
""" """
JWT中间件验证用户是否登录 验证权限登录中间件
""" """
def __init__(self, get_response): def __init__(self, get_response):
self.get_response = get_response self.get_response = get_response
def __call__(self, request): def __call__(self, request):
# 检查请求的路径是否是登录路由,如果是,放行 path = request.path
if request.path == '/login' \ if path in [
or request.path == "/index" \ "/login",
or request.path == "/" \ ]:
or request.path.startswith("/admin")\
or request.path.startswith("/static"):
response = self.get_response(request) response = self.get_response(request)
return response return response
# 从请求头中获取 Token
token = request.META.get('HTTP_AUTHORIZATION', '') session = request.session
try: if not session.get("username") and not session.get("type"):
# 验证 Token return JsonResponse({"code": -1, "msg": "not login!"}, status=401)
payload = jwt.decode(token, TOKEN_KEY, algorithms=['HS256'])
# 将解码后的 Token 数据存储在 request 中,以便视图可以访问
if payload.get("type") == "student":
if not Student.objects.filter(username=payload.get("username")).exists():
return JsonResponse(ResponseUtil.error("用户不存在!"), status=401)
if payload.get("type") == "teacher":
if not Teacher.objects.filter(username=payload.get("username")).exists():
return JsonResponse(ResponseUtil.error("用户不存在!"), status=401)
if payload.get("type") == "admin":
if not Admin.objects.filter(username=payload.get("username")).exists():
return JsonResponse(ResponseUtil.error("用户不存在!"), status=401)
request.jwt_payload = payload
except jwt.ExpiredSignatureError:
return JsonResponse(ResponseUtil.error("Token 失效,请重新登录!"), status=401)
except jwt.DecodeError:
return JsonResponse(ResponseUtil.error("Token Error"), status=401)
# 继续处理请求
response = self.get_response(request) response = self.get_response(request)
return response return response

@ -0,0 +1,16 @@
def jwt_response_payload_handler(token, user=None, request=None, role=None):
if user.username:
name = user.username
else:
name = user.username
return {
"authenticated": True,
'id': user.id,
"role": role,
'name': name,
'username': user.username,
'token': token,
}

@ -1,70 +1,48 @@
import json import json
from datetime import datetime, timedelta
import jwt from django.shortcuts import render
from django.http import JsonResponse, HttpResponse
# Create your views here.
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from Student.models import * from Student.models import *
from teacher.models import Teacher from teacher.models import Teacher
from EduSystemServer.settings import TOKEN_KEY from EduSystemServer.utils import ResponseUtil
from EduSystemServer.utils import *
# 用户登录成功后生成 JWT Token
def generate_jwt_token(user, _type):
# 设置 Token 的有效期
expiration_time = datetime.utcnow() + timedelta(hours=1)
print(datetime.utcnow())
print(expiration_time)
# 构建 Token 数据
payload = {
'type': _type,
'username': user.username,
'exp': expiration_time
}
# 使用密钥对数据进行签名生成 Token
token = jwt.encode(payload, TOKEN_KEY, algorithm='HS256')
return token
@csrf_exempt @csrf_exempt
def login(request): def login(request):
""" username = json.loads(request.body).get("username")
登录 password = json.loads(request.body).get("password")
""" _type = json.loads(request.body).get("type")
username = request.POST.get("username")
password = request.POST.get("password")
_type = request.POST.get("type")
if _type == "student": if _type == "student":
student = Student.objects.filter(username=username, student = Student.objects.filter(username=username,
password=password).first() password=password).first()
if student: if student:
result = student.to_dict() request.session["username"] = student.username
result = ResponseUtil.ok(result, "login success!") request.session["type"] = "student"
result["token"] = generate_jwt_token(student, "student").decode("utf-8") result = ResponseUtil.ok(student.to_dict(), "login success!")
result = {"code": 0, "message": "login success!"}
else: else:
result = {"code": -1, "message": "username or password error!"} result = {"code": -1, "message": "username or password error!"}
elif _type == "teacher": elif _type == "teacher":
teacher = Teacher.objects.filter(username=username, teacher = Teacher.objects.filter(username=username,
password=password).first() password=password).first()
if teacher: if teacher:
result = teacher.to_dict() request.session["username"] = teacher.username
result = ResponseUtil.ok(result, "login success!") request.session["type"] = "teacher"
result["token"] = generate_jwt_token(teacher, "teacher").decode("utf-8") result = ResponseUtil.ok(teacher.to_dict(), "login success!")
result = {"code": 0, "message": "login success!"}
else: else:
result = ResponseUtil.error("username or password error!") result = ResponseUtil.error("username or password error!")
else: else:
result = ResponseUtil.error("type error!") result = ResponseUtil.error("type error!")
response = JsonResponse(result) return JsonResponse(result)
return response
@csrf_exempt @csrf_exempt
def get_user_info(request): def get_user_info(request):
""" _type = request.GET.get("type")
返回用户信息 username = request.GET.get("username")
"""
_type = request.jwt_payload.get("type")
username = request.jwt_payload.get("username")
if _type == "student": if _type == "student":
student = Student.objects.filter(username=username).first() student = Student.objects.filter(username=username).first()
result = ResponseUtil.ok(student.to_dict()) result = ResponseUtil.ok(student.to_dict())

@ -9,10 +9,15 @@ https://docs.djangoproject.com/en/2.2/topics/settings/
For the full list of settings and their values, see For the full list of settings and their values, see
https://docs.djangoproject.com/en/2.2/ref/settings/ https://docs.djangoproject.com/en/2.2/ref/settings/
""" """
import datetime
import os import os
CORS_ALLOW_ORIGIN_WHITELIST = [
"http://localhost:8080", # 允许访问的来源
"http://localhost:8000", # 允许访问的来源
# 可以继续添加其他允许的来源
]
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
@ -31,8 +36,6 @@ DEBUG = True
ALLOWED_HOSTS = ["*"] ALLOWED_HOSTS = ["*"]
# Application definition # Application definition
INSTALLED_APPS = [ INSTALLED_APPS = [
'django.contrib.admin', 'django.contrib.admin',
@ -41,7 +44,7 @@ INSTALLED_APPS = [
'django.contrib.sessions', 'django.contrib.sessions',
'django.contrib.messages', 'django.contrib.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'corsheaders', # 'corsheaders',
'API', 'API',
'Student', 'Student',
'teacher', 'teacher',
@ -57,29 +60,26 @@ MIDDLEWARE = [
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',
'corsheaders.middleware.CorsMiddleware', # 'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'API.middle.JWTMiddleware', # 'API.middle.AuthMiddleware',
] ]
LOGGING = { CORS_ALLOW_CREDENTIALS = True
'version': 1, CORS_ORIGIN_ALLOW_ALL = True
'disable_existing_loggers': False, CORS_ALLOW_HEADERS = (
'handlers': { 'XMLHttpRequest',
'console': { 'X_FILENAME',
'level': 'DEBUG', # 调整日志级别为 DEBUG 以记录 SQL 查询 'accept-encoding',
'class': 'logging.StreamHandler', 'authorization',
}, 'content-type',
}, 'dnt',
'loggers': { 'origin',
'django.db.backends': { 'user-agent',
'handlers': ['console'], 'x-csrftoken',
'level': 'DEBUG', 'x-requested-with',
'propagate': False, 'Pragma',
}, )
},
}
ROOT_URLCONF = 'EduSystemServer.urls' ROOT_URLCONF = 'EduSystemServer.urls'
@ -87,7 +87,7 @@ ROOT_URLCONF = 'EduSystemServer.urls'
TEMPLATES = [ TEMPLATES = [
{ {
'BACKEND': 'django.template.backends.django.DjangoTemplates', 'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'dist')], 'DIRS': [],
'APP_DIRS': True, 'APP_DIRS': True,
'OPTIONS': { 'OPTIONS': {
'context_processors': [ 'context_processors': [
@ -154,25 +154,3 @@ USE_TZ = False
# https://docs.djangoproject.com/en/2.2/howto/static-files/ # https://docs.djangoproject.com/en/2.2/howto/static-files/
STATIC_URL = '/static/' STATIC_URL = '/static/'
MEDIA_URL = '/media/'
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'dist'),
)
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_HEADERS = (
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-requested-with',
'Cookie', # 添加Cookie到允许的头部
)
# token密钥
TOKEN_KEY = "eduSystem"

@ -14,20 +14,18 @@ Including another URLconf
2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
""" """
from django.contrib import admin from django.contrib import admin
from django.urls import path, include, re_path from django.urls import path, include
from django.views.generic import TemplateView
from API.views import login, get_user_info from API.views import login, get_user_info
urlpatterns = [ urlpatterns = [
path(r'', TemplateView.as_view(template_name='index.html')), path('Eduadmin/', admin.site.urls),
path('admin/', admin.site.urls),
path('api/', include(("API.urls", "api"), namespace="api")), path('api/', include(("API.urls", "api"), namespace="api")),
path('teacher/', include(("teacher.urls", "teacher"), namespace="teacher")), path('teacher/', include(("teacher.urls", "teacher"), namespace="teacher")),
path('student/', include(("Student.urls", "student"), namespace="student")), path('student/', include(("Student.urls", "student"), namespace="student")),
path('course/', include(("course.urls", "course"), namespace="course")), path('course/', include(("course.urls", "course"), namespace="course")),
path('login', login), path('login', login),
path('userinfo', get_user_info), path('userinfo', get_user_info),
path('admin/', include(("Eduadmin.urls", "admin"), namespace="admin")),
] ]

@ -1,21 +1,3 @@
from functools import wraps
from django.http import JsonResponse
def permission(allowed_roles):
"""
装饰器权限控制
使用装饰器对路由视图进行权限控制
"""
def decorator(view_func):
@wraps(view_func)
def _wrapped_view(request, *args, **kwargs):
if request.jwt_payload.get("type") in allowed_roles:
return view_func(request, *args, **kwargs)
else:
return JsonResponse(ResponseUtil.error("你没有权限访问该接口!"))
return _wrapped_view
return decorator
class ResponseUtil: class ResponseUtil:
@ -25,4 +7,4 @@ class ResponseUtil:
@staticmethod @staticmethod
def error(message="error!"): def error(message="error!"):
return {"code": -1, "message": str(message)} return {"code": -1, "message": message}

@ -0,0 +1,15 @@
# -*- coding: utf-8 -*-
# Time : 2023/9/12 9:37
# Author : lirunsheng
# User : l'r's
# Software: PyCharm
# File : urls.py
from django.urls import path
from .views import *
urlpatterns = [
path("teacher/", teacher_manage),
path('course/',course_selection)
]

@ -1,3 +1,216 @@
from django.shortcuts import render from django.shortcuts import render
# Create your views here. # Create your views here.
from django.http import JsonResponse, HttpResponseBadRequest, HttpResponse
from teacher.models import Teacher
from django.views.decorators.csrf import csrf_exempt
from io import BytesIO
from django.http.multipartparser import MultiPartParser
from django.http import QueryDict
from course.models import Course, SC
from Student.models import Student
from django.db.models import Q
from django.db.models import Subquery, OuterRef
from django.core.exceptions import ObjectDoesNotExist
from ast import literal_eval
from MySQLdb import IntegrityError
from EduSystemServer.utils import ResponseUtil
@csrf_exempt
def teacher_manage(request): # 教师个人信息修改
if request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
name = request.POST.get('name')
sex = request.POST.get('sex')
title = request.POST.get('title')
education = request.POST.get('education')
dept = request.POST.get('dept')
if (username and password and name and sex
and title and education and dept):
try:
teacher = Teacher()
teacher.username = username
teacher.password = password
teacher.name = name
teacher.sex = sex
teacher.title = title
teacher.education = education
teacher.dept = dept
teacher.save()
response = ResponseUtil.ok(teacher.to_dict(), "老师信息插入成功")
return JsonResponse(response)
except:
response = ResponseUtil.error("老师信息插入未成功,用户名重复!")
return JsonResponse(response)
else:
response = ResponseUtil.error("老师信息插入未成功,存在空值,请你仔细检测并上传")
return JsonResponse(response)
elif request.method == "GET":
name = request.GET.get('name')
sex = request.GET.get('sex')
title = request.GET.get('title')
education = request.GET.get('education')
dept = request.GET.get('dept')
# 定义空查询条件
conditions = Q()
if name:
conditions &= Q(name=name)
if sex:
conditions &= Q(sex=sex)
if title:
conditions &= Q(title=title)
if education:
conditions &= Q(education=education)
if dept:
conditions &= Q(dept=dept)
# 添加非空查询条件至基本查询集
query = Teacher.objects.filter(conditions)
data = query.values() # 将 QuerySet 对象转换为字典列表
data = list(data) # 转换为列表以便序列化为 JSON
print(query)
response = ResponseUtil.ok(data, "老师信息查询成功")
return JsonResponse(response)
elif request.method == "DELETE":
# parser = MultiPartParser(request.META, BytesIO(request.body), request.upload_handlers, request.encoding)
# posdict = parser.parse()
# print(posdict)
# tid = int(posdict[0]['tid'])
# print(tid)
# try:
# info = Teacher.objects.filter(tid=tid).get().to_dict()
# Teacher.objects.filter(tid=tid).delete()
# response = ResponseUtil.ok(info, "老师信息删除成功")
# return JsonResponse(response)
# except:
# response = ResponseUtil.error("删除失败,未找到老师信息!")
# return JsonResponse(response)
parser = MultiPartParser(request.META, BytesIO(request.body), request.upload_handlers, request.encoding)
posdict = parser.parse()
# print(posdict)
tids = posdict[0]['tids']
# print(tids)
tids = literal_eval(tids)
# print(tids)
try:
info = Teacher.objects.filter(tid__in=tids).values()
data = list(info)
if len(data) > 0:
Teacher.objects.filter(tid__in=tids).delete()
response = ResponseUtil.ok(data, "老师信息删除成功")
return JsonResponse(response)
else:
response = ResponseUtil.error("老师未找到")
return JsonResponse(response)
except:
response = ResponseUtil.ok("未查询到老师信息,删除失败")
return JsonResponse(response)
elif request.method == 'PUT':
put = MultiPartParser(request.META, request, request.upload_handlers, request.encoding).parse()
# request.PUT = put[0]
print(put)
tid = put[0]['tid']
name = put[0]['name']
sex = put[0]['sex']
title = put[0]['title']
education = put[0]['education']
dept = put[0]['dept']
if name and sex and title and education and dept:
Teacher.objects.filter(tid=tid).update(name=name,sex=sex,title=title)
Teacher.objects.filter(tid=tid).update(education=education,dept=dept)
data = Teacher.objects.filter(tid=tid)[0].to_dict()
response = ResponseUtil.ok(data, "修改老师信息成功!")
return JsonResponse(response)
else:
response = ResponseUtil.error("修改信息有误!")
return JsonResponse(response)
@csrf_exempt
def course_selection(request): # 选课管理
if request.method == 'POST':
# 假设需要将 tid 为 1 的老师赋值给某个课程的 tid 字段
teacher_id = request.POST.get('tid')
name = request.POST.get('name')
type = request.POST.get('type')
credit = request.POST.get('credit')
if name and type and credit:
try:
teacher_id = int(teacher_id)
course = Course()
course.name = name
course.type = type
course.credit = int(credit)
course.tid = Teacher.objects.get(tid=teacher_id) # 将 Teacher 对象赋给 Course.tid 字段
course.save()
response = ResponseUtil.ok(course.tid_dict(), "课程信息插入成功")
return JsonResponse(response)
except ObjectDoesNotExist:
response = ResponseUtil.error("找不到 id 为 " + str(teacher_id)+" 的老师")
return JsonResponse(response)
except ValueError:
response = ResponseUtil.error("插入数据失败: tid_id 列不能为 null")
return JsonResponse(response)
if request.method == 'GET':
cid = request.GET.get('cid')
name = request.GET.get('name')
type = request.GET.get('type')
credit = request.GET.get('credit')
tid = request.GET.get('tid')
# 定义空查询条件
conditions = Q()
if cid:
conditions &= Q(cid=int(cid))
if name:
conditions &= Q(name=name)
if type:
conditions &= Q(type=type)
if credit:
conditions &= Q(credit=credit)
if tid:
tid = int(tid)
conditions &= Q(tid=tid)
# 添加非空查询条件至基本查询集
query = Course.objects.filter(conditions)
data = query.values() # 将 QuerySet 对象转换为字典列表
data = list(data) # 转换为列表以便序列化为 JSON
print(query)
response = ResponseUtil.ok(data, "课程信息查询成功")
return JsonResponse(response)
if request.method == 'DELETE':
parser = MultiPartParser(request.META, BytesIO(request.body), request.upload_handlers, request.encoding)
posdict = parser.parse()
cids = posdict[0]['cids']
cids = literal_eval(cids)
print(cids)
try:
info = Course.objects.filter(cid__in=cids).values()
data = list(info)
if len(data)>0:
Course.objects.filter(cid__in=cids).delete()
response = ResponseUtil.ok(data, "课程信息删除成功")
return JsonResponse(response)
else:
response = ResponseUtil.error("课程未找到")
return JsonResponse(response)
except:
response = ResponseUtil.ok("未查询到课程,删除失败")
return JsonResponse(response)
if request.method == 'PUT':
put = MultiPartParser(request.META, request, request.upload_handlers, request.encoding).parse()
# request.PUT = put[0]
print(put)
cid = put[0]['cid']
name = put[0]['name']
type = put[0]['type']
credit = put[0]['credit']
tid = put[0]['tid']
if cid and name and type and credit and tid:
Course.objects.filter(cid=cid).update(name=name, type=type, credit=credit)
Course.objects.filter(cid=cid).update(tid=Teacher.objects.get(tid=tid))
data = Course.objects.filter(cid=cid)[0].tid_dict()
response = ResponseUtil.ok(data, "课程信息修改成功")
return JsonResponse(response)
else:
response = ResponseUtil.error("课程信息修改失败,信息不全")
return JsonResponse(response)

@ -1,14 +1,3 @@
from django.contrib import admin from django.contrib import admin
from django.core.paginator import Paginator
from Student.models import Student
# Register your models here. # Register your models here.
class StudentAdmin(admin.ModelAdmin):
list_display = ("username", "password", "name", "sex", "grade", "class_name", "major")
list_per_page = 5
list_filter = ('sex', 'grade', 'class_name', "major")
search_fields = ("name", "sex", "grade", "class_name", "major")
admin.site.register(Student, StudentAdmin)

@ -12,37 +12,37 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.AlterField( migrations.AlterField(
model_name='student', model_name='student',
name='s_class_name', name='class_name',
field=models.CharField(blank=True, max_length=50, verbose_name='班级'), field=models.CharField(blank=True, max_length=50, verbose_name='班级'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='student', model_name='student',
name='s_grade', name='grade',
field=models.CharField(blank=True, max_length=20, verbose_name='年级'), field=models.CharField(blank=True, max_length=20, verbose_name='年级'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='student', model_name='student',
name='s_major', name='major',
field=models.CharField(blank=True, max_length=50, verbose_name='专业名称'), field=models.CharField(blank=True, max_length=50, verbose_name='专业名称'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='student', model_name='student',
name='s_name', name='name',
field=models.CharField(blank=True, max_length=100, verbose_name='姓名'), field=models.CharField(blank=True, max_length=100, verbose_name='姓名'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='student', model_name='student',
name='s_password', name='password',
field=models.CharField(blank=True, max_length=100, verbose_name='密码'), field=models.CharField(blank=True, max_length=100, verbose_name='密码'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='student', model_name='student',
name='s_sex', name='sex',
field=models.CharField(blank=True, max_length=4, verbose_name='性别'), field=models.CharField(blank=True, max_length=4, verbose_name='性别'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='student', model_name='student',
name='s_username', name='username',
field=models.CharField(blank=True, max_length=30, verbose_name='用户名称'), field=models.CharField(blank=True, max_length=30, verbose_name='用户名称'),
), ),
migrations.AlterField( migrations.AlterField(

@ -0,0 +1,41 @@
# Generated by Django 3.2.13 on 2023-09-08 11:57
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('Student', '0002_auto_20230907_0916'),
]
operations = [
migrations.RemoveField(
model_name='student',
name='class_name',
),
migrations.RemoveField(
model_name='student',
name='grade',
),
migrations.RemoveField(
model_name='student',
name='major',
),
migrations.RemoveField(
model_name='student',
name='name',
),
migrations.RemoveField(
model_name='student',
name='password',
),
migrations.RemoveField(
model_name='student',
name='sex',
),
migrations.RemoveField(
model_name='student',
name='username',
),
]

@ -3,9 +3,6 @@ from django.urls import path
from .views import * from .views import *
urlpatterns = [ urlpatterns = [
path("search", search_student), path("", studnets),
path("selectCourse", select_course), path("selectCourse", get_select_course_by_id)
path("add", add_student),
path("delete", del_student),
path("getGrade", get_grade),
] ]

@ -1,29 +1,24 @@
import json
from django.core import serializers
from django.shortcuts import render from django.shortcuts import render
# Create your views here. # Create your views here.
from django.http import JsonResponse
from course.models import SC, Course from .models import Student
from EduSystemServer.utils import ResponseUtil
from EduSystemServer.utils import * from Student.models import Student
from .models import Student from .models import Student
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.http import QueryDict
from io import BytesIO
from django.http.multipartparser import MultiPartParser
import json
@csrf_exempt @csrf_exempt
@permission(allowed_roles=["admin", "teacher"]) def studnets(request):
def add_student(request): if request.method == "POST":
"""
添加学生
"""
if not request.method == "POST":
return JsonResponse(ResponseUtil.error("request method error!"))
try: try:
request_data = request.POST request_data = json.loads(request.body)
student = Student() print(request_data)
student = Student.objects.filter(sid=request_data.get("sid")).first()
student.username = request_data.get("username") student.username = request_data.get("username")
student.password = request_data.get("password") student.password = request_data.get("password")
student.name = request_data.get("name") student.name = request_data.get("name")
@ -32,104 +27,90 @@ def add_student(request):
student.class_name = request_data.get("class_name") student.class_name = request_data.get("class_name")
student.major = request_data.get("major") student.major = request_data.get("major")
student.save() student.save()
result = ResponseUtil.ok(student.to_dict(), "添加成功!") response = ResponseUtil.ok(student.to_dict(), "更新成功!")
return JsonResponse(response)
except Exception as E: except Exception as E:
result = ResponseUtil.error(E) return JsonResponse(ResponseUtil.error(E))
return JsonResponse(result) elif request.method == "GET":
sid = request.GET.get('sid')
@csrf_exempt s_name = request.GET.get('s_name')
@permission(allowed_roles=["admin", "teacher"]) s_sex = request.GET.get('s_sex')
def search_student(request): s_grade = request.GET.get('s_grade')
""" s_class_name = request.GET.get('s_class_name')
根据表单对学生进行模糊查询以及将查询的数据进行分页 s_major = request.GET.get('s_major')
""" data = []
currentPage = request.GET.get("currentPage") if sid:
pageSize = request.GET.get("pageSize") filtered = Student.objects.filter(sid=sid)
request_data = request.POST for student in filtered:
search_students = Student.objects.all() data.append(student.to_dict())
if not request_data.get("sid") == "": elif s_name:
search_students =search_students.filter(sid=request_data.get("sid")) filtered = Student.objects.filter(s_name=s_name)
if not request_data.get("name") == "": for student in filtered:
search_students =search_students.filter(name__contains=request_data.get("name")) data.append(student.to_dict())
if not request_data.get("sex") == "": elif s_sex:
search_students =search_students.filter(sex=request_data.get("sex")) filtered = Student.objects.filter(s_sex=s_sex)
if not request_data.get("class_name") == "": for student in filtered:
search_students =search_students.filter(class_name__contains=request_data.get("class_name")) data.append(student.to_dict())
if not request_data.get("major") == "": elif s_grade:
search_students =search_students.filter(major__contains=request_data.get("major")) filtered = Student.objects.filter(s_grade=s_grade)
paginator = Paginator(search_students, pageSize) for student in filtered:
try: data.append(student.to_dict())
students = paginator.page(currentPage).object_list elif s_class_name:
except PageNotAnInteger: filtered = Student.objects.filter(s_class_name=s_class_name)
students = paginator.page(1) for student in filtered:
except EmptyPage: data.append(student.to_dict())
students = paginator.page(paginator.num_pages).object_list elif s_major:
result = ResponseUtil.ok(json.loads(serializers.serialize("json", students)), "success!") filtered = Student.objects.filter(s_major=s_major)
result["pageTotal"] = paginator.count for student in filtered:
result["pageNum"] = paginator.num_pages data.append(student.to_dict())
return JsonResponse(result) else:
all_objects = Student.objects.all()
for studnet in all_objects:
@csrf_exempt data.append(studnet.to_dict())
@permission(allowed_roles=["admin", "teacher"]) return JsonResponse({'code': 200, 'msg': 'success', 'data': data}, safe=False)
def del_student(request): elif request.method == "DELETE":
""" parser = MultiPartParser(request.META, BytesIO(request.body), request.upload_handlers, request.encoding)
根据学生ID删除学生 post_dict = parser.parse()
""" sid = post_dict[0]['sid']
if not request.method == "GET":
return JsonResponse(ResponseUtil.error("request method error!"))
try: try:
sid = request.GET.get("sid") info = Student.objects.filter(sid=sid).get().to_dict()
student = Student.objects.filter(sid=sid).first() Student.objects.filter(sid=sid).delete()
student.delete() response = {"code": 200, "message": "删除成功!", "data": info}
result = ResponseUtil.ok(None, "删除成功!") return JsonResponse(response)
except Exception as E: except:
result = ResponseUtil.error(E) response = {"code": 200, "message": "删除失败,未找到学生信息!"}
return JsonResponse(result) return JsonResponse(response)
elif request.method == "PUT":
put = MultiPartParser(request.META, request, request.upload_handlers, request.encoding).parse()
@csrf_exempt sid = put[0]['sid']
@permission(allowed_roles=["admin", "student", "teacher"]) s_username = put[0]['s_username']
def select_course(request): s_name = put[0]['s_name']
""" s_sex = put[0]['s_sex']
选课 s_grade = put[0]['s_grade']
""" s_class_name = put[0]['s_class_name']
if not request.method == "POST": s_major = put[0]['s_major']
return JsonResponse(ResponseUtil.error("request method error!"))
try: try:
request_data = request.POST Student.objects.filter(sid=sid).update(s_username=s_username, s_name=s_name, s_sex=s_sex, s_grade=s_grade,
cid = request_data.get("cid") s_class_name=s_class_name,
username = request.jwt_payload.get("username") s_major=s_major)
student = Student.objects.filter(username=username).first() except:
if SC.objects.filter(cid=cid, sid=student.sid).exists(): Student.objects.create(sid=sid, s_username=s_username, s_name=s_name, s_sex=s_sex, s_grade=s_grade,
return JsonResponse(ResponseUtil.error("该课程已经选择!")) s_class_name=s_class_name,
sc = SC() s_major=s_major)
sc.sid = student data = Student.objects.filter(sid=sid)[0].to_dict()
sc.cid = Course.objects.filter(cid=cid).first() return JsonResponse({'code': 200, 'msg': 'success', 'data': data}, safe=False)
sc.middle_grade = 0 student_list = Student.objects.all()
sc.end_grade = 0 response_json = {"code": 200, "message": "success", "data": []}
sc.save() for student in student_list:
return JsonResponse(ResponseUtil.ok(None, "选课成功!")) response_json["data"].append(student.to_dict())
except Exception as E: return JsonResponse(response_json)
print(E) elif request.method == 'DELETE':
return JsonResponse(ResponseUtil.error(str(E))) params = QueryDict(request.body)
key = next(iter(params.keys())) # 获取键名
value = params.get(key) # 获取值
xx = str(value).split('-')[0]
print(xx.split('\r\n'))
return JsonResponse({'code': 200, 'msg': 'success'}, safe=False)
@permission(allowed_roles=["student"]) def get_select_course_by_id(request):
def get_grade(request): pass
"""
获取学生成绩
"""
if not request.method == "GET":
return ResponseUtil.error("request method error!")
try:
username = request.jwt_payload.get("username")
student = Student.objects.filter(username=username).first()
grade__all = SC.objects.filter(sid=student.sid).values("sid", "sid__name", "cid__name", "cid__type", "cid__credit",
"cid__tid__name", "middle_grade", "end_grade").all()
grades = []
for grade in grade__all:
grades.append(grade)
return JsonResponse(ResponseUtil.ok(grades))
except Exception as E:
return JsonResponse(ResponseUtil.error(E))

@ -1,45 +1,3 @@
from django.contrib import admin from django.contrib import admin
from .models import Course, SC
# Register your models here. # Register your models here.
admin.site.site_header = '教务系统管理端'
class CourseAdmin(admin.ModelAdmin):
'''设置列表可显示的字段'''
list_display = ('cid', 'name', 'type', 'credit', "tid")
'''设置过滤选项'''
list_filter = ('name', 'credit', 'type')
'''每页显示条目数'''
list_per_page = 5
'''设置可编辑字段'''
list_editable = ('name', 'type', 'credit', "tid")
'''按发布日期排序'''
ordering = ('-credit',)
search_fields = ('name', 'type', 'credit', "tid")
class ScAdmin(admin.ModelAdmin):
list_display = ('student_name', 'course_name', 'middle_grade', 'end_grade')
list_per_page = 5
def student_name(self, obj):
print(obj)
return obj.sid.name
def course_name(self, obj):
return obj.cid.name
list_editable = ('middle_grade', "end_grade")
ordering = ('-end_grade',)
admin.site.register(Course, CourseAdmin)
admin.site.register(SC, ScAdmin)

@ -12,12 +12,12 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.AlterField( migrations.AlterField(
model_name='course', model_name='course',
name='c_name', name='name',
field=models.CharField(blank=True, max_length=255, verbose_name='课程名称'), field=models.CharField(blank=True, max_length=255, verbose_name='课程名称'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='course', model_name='course',
name='c_type', name='type',
field=models.CharField(blank=True, max_length=128, verbose_name='课程类型'), field=models.CharField(blank=True, max_length=128, verbose_name='课程类型'),
), ),
] ]

@ -12,15 +12,18 @@ class Course(models.Model):
credit = models.IntegerField(verbose_name="课程学分", name="credit") credit = models.IntegerField(verbose_name="课程学分", name="credit")
tid = models.ForeignKey(Teacher, to_field="tid", on_delete=models.CASCADE, name="tid") tid = models.ForeignKey(Teacher, to_field="tid", on_delete=models.CASCADE, name="tid")
def to_dict(self):
return {"cid": self.cid, "c_name": self.name, "type": self.type, "credit": self.credit,
"tid": self.tid}
def tid_dict(self):
return {"cid": self.cid, "c_name": self.name, "type": self.type, "credit": self.credit,
"tid": self.tid.tid}
class Meta: class Meta:
db_table = "course" db_table = "course"
verbose_name = "课程" verbose_name = "课程"
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
def to_dict(self):
return {"cid": self.cid, "c_name": self.name, "type": self.type, "credit": self.credit,
"tid": self.tid}
class SC(models.Model): class SC(models.Model):
sid = models.ForeignKey(Student, to_field="sid", on_delete=models.CASCADE, name="sid") sid = models.ForeignKey(Student, to_field="sid", on_delete=models.CASCADE, name="sid")
@ -33,6 +36,6 @@ class SC(models.Model):
class Meta: class Meta:
db_table = "sc" db_table = "sc"
verbose_name = "选课" verbose_name = "管理员"
verbose_name_plural = verbose_name verbose_name_plural = verbose_name
unique_together = ("sid", "cid") unique_together = ("sid", "cid")

@ -3,9 +3,5 @@ from django.urls import path
from course.views import * from course.views import *
urlpatterns = [ urlpatterns = [
path("getCourseById", get_course_by_student_id), path("", courses),
path("deleteSelectCourse", delete_select_course),
path("seacherCourse", search_course),
path("getStudentCourse", get_student_select_course),
path("editGrade", edit_grade)
] ]

@ -1,145 +1,68 @@
import json
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.db.models import F, Subquery, Max
from django.shortcuts import render from django.shortcuts import render
# Create your views here.
from EduSystemServer.utils import * from django.http import JsonResponse
from course.models import * from course.models import *
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from io import BytesIO
from django.http.multipartparser import MultiPartParser
def search_course(request):
"""
通过条件查询课程并且分页显示
"""
if not request.method == "GET":
return JsonResponse(ResponseUtil.error("request method error!"))
teacher_name = request.GET.get("tName")
course_name = request.GET.get("cName")
course_type = request.GET.get("cType")
current_page = request.GET.get("currentPage")
filter_course = Course.objects
if not teacher_name == "" and teacher_name is not None:
filter_course = Course.objects.filter(tid__name__contains=teacher_name)
if not course_name == "" and course_name is not None:
filter_course = Course.objects.filter(name__contains=course_name)
if not course_type == "" and course_type is not None:
filter_course = Course.objects.filter(type__contains=course_type)
filter_course = filter_course.values("name", "tid__name", "type", "credit",
"tid__title", "tid__education", "tid__dept", "cid").all()
paginator = Paginator(filter_course, 10)
try:
courses = paginator.page(current_page).object_list
except PageNotAnInteger:
courses = paginator.page(1).object_list
except EmptyPage:
courses = paginator.page(paginator.num_pages).object_list
courses_data = []
for course in courses:
courses_data.append(course)
result = ResponseUtil.ok(courses_data, "success!")
result["pageTotal"] = paginator.count
result["pageNum"] = paginator.num_pages
return JsonResponse(result)
@permission(allowed_roles=["student"])
def get_course_by_student_id(request):
"""
通过学生ID获取学生的选课
"""
if not request.method == "GET":
return JsonResponse(ResponseUtil.error("request method error!"))
s_username = request.jwt_payload.get("username")
student = Student.objects.filter(username=s_username).first()
sc_list = SC.objects.filter(sid=student.sid).values("sid__name", "cid__name", "cid__tid__name", "sid", "cid",
"cid__credit", "cid__tid__title", "cid__tid__dept", "cid__type").all()
data = []
for sc in sc_list:
data.append(sc)
result = ResponseUtil.ok(data)
return JsonResponse(result)
@permission(allowed_roles=["student"])
def delete_select_course(request):
"""
删除选课
"""
if not request.method == "GET":
return JsonResponse(ResponseUtil.error("request method error!"))
try:
sid = request.GET.get("sid")
cid = request.GET.get("cid")
sc = SC.objects.filter(cid=cid, sid=sid).first()
sc.delete()
return JsonResponse(ResponseUtil.ok(None, "退出选课成功!"))
except Exception as E:
return JsonResponse(ResponseUtil.error(E))
@csrf_exempt @csrf_exempt
@permission(allowed_roles=["teacher", "admin"]) def courses(request):
def get_student_select_course(request): if request.method == "POST":
""" course = Course()
获取所有学生的所有选课 course.c_name = request.POST.get("c_name")
""" course.type = request.POST.get('type')
if not request.method == "POST": course.credit = request.POST.get("credit")
return JsonResponse(ResponseUtil.error("request method error!")) course.tid = request.POST.get('tid')
current_page = request.GET.get("currentPage") course.save()
sname = request.POST.get("sname") response = {"code": 200, "message": "添加成功!", "data": course.to_dict()}
className = request.POST.get("className") return JsonResponse(response)
courseName = request.POST.get("courseName") elif request.method == "GET":
courseType = request.POST.get("courseType") cid = request.GET.get('cid')
sc_list = SC.objects.all().filter( c_name = request.GET.get('c_name')
sid__name__contains=sname, c_type = request.GET.get('type')
sid__class_name__contains=className, tid = request.GET.get('tid')
cid__name__contains=courseName,
cid__type__contains=courseType
).annotate(
sname=F("sid__name"),
className=F("sid__class_name"),
cname=F("cid__name"), ctype=F("cid__type"),
endGrade=F("end_grade"),
middleGrade=F("middle_grade")
).values(
"sname", "className", "cname",
"ctype", "endGrade", "middleGrade",
"sid", "cid"
).distinct()
paginator = Paginator(sc_list, 10)
try:
sc_list = paginator.page(current_page).object_list
except PageNotAnInteger:
sc_list = paginator.page(1)
except EmptyPage:
sc_list = paginator.page(paginator.num_pages).object_list
data = [] data = []
for student in sc_list: if cid:
data.append(student) filtered = Course.objects.filter(cid=cid)
result = ResponseUtil.ok(data, "success!") for item in filtered:
result["pageTotal"] = paginator.count data.append(item.to_dict())
result["pageNum"] = paginator.num_pages elif c_name:
return JsonResponse(result) filtered = Course.objects.filter(name=c_name)
for item in filtered:
@permission(allowed_roles=["teacher", "admin"]) data.append(item.to_dict())
@csrf_exempt elif c_type:
def edit_grade(request): filtered = Course.objects.filter(type=c_type)
""" for item in filtered:
成绩录入 data.append(item.to_dict())
""" elif tid:
if not request.method == "POST": filtered = Course.objects.filter(tid=tid)
return JsonResponse(ResponseUtil.error("request method error!")) for item in filtered:
data.append(item.to_dict())
else:
all_objects = Course.objects.all()
for item in all_objects:
data.append(item.to_dict())
return JsonResponse({'code': 200, 'msg': 'success', 'data': data}, safe=False)
elif request.method == "DELETE":
delete = MultiPartParser(request.META, BytesIO(request.body), request.upload_handlers, request.encoding).parse()
cid = delete[0]['cid']
try: try:
sid = request.POST.get("sid") info = Course.objects.filter(cid=cid).get().to_dict()
cid = request.POST.get("cid") Course.objects.filter(cid=cid).delete()
sc = SC.objects.filter(sid=sid, cid=cid).first() response = {"code": 200, "message": "删除成功!", "data": info}
sc.middle_grade = request.POST.get("middleGrade") return JsonResponse(response)
sc.end_grade = request.POST.get("endGrade") except:
sc.save() response = {"code": 200, "message": "删除失败,未找到课程信息!"}
return JsonResponse(ResponseUtil.ok(None, "成绩修改成功!")) return JsonResponse(response)
except Exception as E: elif request.method == "PUT":
return JsonResponse(ResponseUtil.error(str(E))) put = MultiPartParser(request.META, request, request.upload_handlers, request.encoding).parse()
cid = put[0]['cid']
c_name = put[0]['c_name']
c_type = put[0]['type']
credit = put[0]['credit']
tid = put[0]['tid']
Course.objects.filter(cid=cid).update(c_name=c_name, type=c_type, credit=credit, tid=tid)
data = Course.objects.filter(cid=cid)[0].to_dict()
return JsonResponse({'code': 200, 'msg': 'success', 'data': data}, safe=False)

@ -1 +0,0 @@
.login-module{margin-top:60px;position:absolute;right:500px;text-align:center;width:30%}.el-header{background-color:#b3c0d1;color:#333;line-height:60px}.transfer-footer{margin-left:20px;padding:6px 5px}

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

@ -1,19 +0,0 @@
<!doctype html>
<html lang="">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="icon" href="/static/favicon.ico">
<title>front</title>
<script defer="defer" src="/static/js/chunk-vendors.0bcf2d54.js"></script>
<script defer="defer" src="/static/js/app.8637dce5.js"></script>
<link href="/static/css/chunk-vendors.10dd4e95.css" rel="stylesheet">
<link href="/static/css/app.34ccc13b.css" rel="stylesheet">
</head>
<body>
<noscript><strong>We're sorry but front doesn't work properly without JavaScript enabled. Please enable it to
continue.</strong></noscript>
<div id="app"></div>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

@ -1,16 +1,3 @@
from django.contrib import admin from django.contrib import admin
from teacher.models import Teacher
# Register your models here. # Register your models here.
class TeacherAdmin(admin.ModelAdmin):
list_display = ("username", "password", "name", "sex", "title", "education", "dept")
list_per_page = 5
list_filter = ("sex", "title", "education", "dept")
search_fields = ("name", "sex", "title", "education", "dept")
admin.site.register(Teacher, TeacherAdmin)

@ -12,27 +12,27 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.AlterField( migrations.AlterField(
model_name='teacher', model_name='teacher',
name='t_dept', name='dept',
field=models.CharField(blank=True, max_length=128, verbose_name='教师所属院系'), field=models.CharField(blank=True, max_length=128, verbose_name='教师所属院系'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='teacher', model_name='teacher',
name='t_education', name='education',
field=models.CharField(blank=True, max_length=128, verbose_name='教师学历'), field=models.CharField(blank=True, max_length=128, verbose_name='教师学历'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='teacher', model_name='teacher',
name='t_name', name='name',
field=models.CharField(blank=True, max_length=255, verbose_name='教师名称'), field=models.CharField(blank=True, max_length=255, verbose_name='教师名称'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='teacher', model_name='teacher',
name='t_sex', name='sex',
field=models.CharField(blank=True, max_length=128, verbose_name='教师性别'), field=models.CharField(blank=True, max_length=128, verbose_name='教师性别'),
), ),
migrations.AlterField( migrations.AlterField(
model_name='teacher', model_name='teacher',
name='t_title', name='title',
field=models.CharField(blank=True, max_length=128, verbose_name='教师职称'), field=models.CharField(blank=True, max_length=128, verbose_name='教师职称'),
), ),
] ]

@ -10,5 +10,12 @@ from django.urls import path
from .views import * from .views import *
urlpatterns = [ urlpatterns = [
path("", teacher),
path('delete/',delete),
path('student/',student_performance_management),
path('query/',query_student_information),
path('course/',teaching_resources),
path('selection/',course_selection),
path('management/',student_management),
path('select/',SC_selection)
] ]

@ -1,11 +1,10 @@
from MySQLdb import IntegrityError
from django.shortcuts import render from django.shortcuts import render
# Create your views here. # Create your views here.
# Create your views here. # Create your views here.
from django.http import JsonResponse from django.http import JsonResponse
from EduSystemServer.utils import ResponseUtil
from .models import Teacher from .models import Teacher
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from io import BytesIO from io import BytesIO
@ -13,4 +12,485 @@ from django.http.multipartparser import MultiPartParser
from django.http import QueryDict from django.http import QueryDict
from course.models import Course, SC from course.models import Course, SC
from Student.models import Student from Student.models import Student
import json from django.db.models import Q
from django.db.models import Subquery, OuterRef
from django.core.exceptions import ObjectDoesNotExist
from EduSystemServer.utils import ResponseUtil
@csrf_exempt
def teacher(request): # 教师个人信息修改
if request.method == "POST":
teacher_information = Teacher()
teacher_information.username = request.POST.get('username')
teacher_information.password = request.POST.get('password')
teacher_information.name = request.POST.get('name')
teacher_information.sex = request.POST.get('sex')
teacher_information.title = request.POST.get('title')
teacher_information.education = request.POST.get('education')
teacher_information.dept = request.POST.get('dept')
teacher_information.save()
response = ResponseUtil.ok(teacher_information.to_dict(), "老师信息插入成功")
return JsonResponse(response)
elif request.method == "GET":
name = request.GET.get('name')
sex = request.GET.get('sex')
title = request.GET.get('title')
education = request.GET.get('education')
dept = request.GET.get('dept')
# 定义空查询条件
conditions = Q()
if name:
conditions &= Q(name=name)
if sex:
conditions &= Q(sex=sex)
if title:
conditions &= Q(title=title)
if education:
conditions &= Q(education=education)
if dept:
conditions &= Q(dept=dept)
# 添加非空查询条件至基本查询集
query = Teacher.objects.filter(conditions)
data = query.values() # 将 QuerySet 对象转换为字典列表
data = list(data) # 转换为列表以便序列化为 JSON
print(query)
response = ResponseUtil.ok(data, "老师信息查询成功")
return JsonResponse(response)
elif request.method == "DELETE":
parser = MultiPartParser(request.META, BytesIO(request.body), request.upload_handlers, request.encoding)
posdict = parser.parse()
print(posdict)
tid = int(posdict[0]['tid'])
print(tid)
try:
info = Teacher.objects.filter(tid=tid).get().to_dict()
Teacher.objects.filter(tid=tid).delete()
response = {"code": 200, "message": "删除成功!", "data": info}
return JsonResponse(response)
except:
response = ResponseUtil.ok("")
return JsonResponse(response)
elif request.method == 'PUT':
put = MultiPartParser(request.META, request, request.upload_handlers, request.encoding).parse()
# request.PUT = put[0]
print(put)
tid = put[0]['tid']
name = put[0]['name']
sex = put[0]['sex']
title = put[0]['title']
education = put[0]['education']
dept = put[0]['dept']
Teacher.objects.filter(tid=tid).update(name=name,sex=sex,title=title)
Teacher.objects.filter(tid=tid).update(education=education,dept=dept)
data = Teacher.objects.filter(tid=tid)[0].to_dict()
return JsonResponse({'code': 200, 'msg': 'success','data':data}, safe=False)
def delete(request):
tid = request.GET.get('tid')
try:
Teacher.objects.filter(tid = tid).delete()
return JsonResponse({'code': 200, 'msg': 'success'}, safe=False)
except:
return JsonResponse({'code': 200, 'msg': '删除失败'}, safe=False)
@csrf_exempt
def teaching_resources(request): # 课程查询
if request.method == 'POST':
cid = request.POST.get('cid')
name = request.POST.get('name')
type = request.POST.get('type')
credit = request.POST.get('credit')
tid = request.POST.get('tid')
teacher_name = request.POST.get('t_name')
# 定义空子字典查询条件
conditions = {}
if cid:
conditions.update({'cid': int(cid)}) # 追加信息
if name:
conditions.update({'name': name})
if type:
conditions.update({'type': type})
if credit:
conditions.update({'credit': credit})
if tid:
conditions.update({'tid': int(tid)})
if teacher_name:
conditions.update({'teacher_name': teacher_name})
def check_subdict_exists(dictionary, subdict): # 判断子字典是否存在字典
for key, value in subdict.items():
if key not in dictionary or dictionary[key] != value:
return False
return True
# 获取第一个查询表的数据
table1_result = Teacher.objects.values('tid', 'name', 'title', 'dept')
# 获取第二个查询表的数据
table2_result = Course.objects.values('tid', 'cid', 'name', 'type', 'credit')
# 构建子查询,获取第一个查询表的结果并注入到第二个查询表中
table2_result = table2_result.annotate(teacher_name=Subquery(
table1_result.filter(tid=OuterRef('tid')).values('name')[:1]
), teacher_title=Subquery(
table1_result.filter(tid=OuterRef('tid')).values('title')[:1]
), teacher_dept=Subquery(
table1_result.filter(tid=OuterRef('tid')).values('dept')[:1]
))
# 合并两个查询表的结果
merged_result =list(table2_result)
combined_data = []
print(conditions)
# 输出合并结果
for item in merged_result:
# 判断子字典是否存在于字典中
print(item)
if check_subdict_exists(item, conditions):
combined_data.append(item)
response = ResponseUtil.ok(combined_data, "课程信息查询成功")
return JsonResponse(response)
elif request.method == "GET":
# 获取第一个查询表的数据
table1_result = Teacher.objects.values('tid', 'name', 'title', 'dept')
# 获取第二个查询表的数据
table2_result = Course.objects.values('tid', 'cid', 'name', 'type', 'credit')
# 构建子查询,获取第一个查询表的结果并注入到第二个查询表中
table2_result = table2_result.annotate(teacher_name=Subquery(
table1_result.filter(tid=OuterRef('tid')).values('name')[:1]
), teacher_title=Subquery(
table1_result.filter(tid=OuterRef('tid')).values('title')[:1]
), teacher_dept=Subquery(
table1_result.filter(tid=OuterRef('tid')).values('dept')[:1]
))
data = list(table2_result) # 转换为列表以便序列化为 JSON
response = ResponseUtil.ok(data, "课程信息查询成功")
return JsonResponse(response)
@csrf_exempt
def query_student_information(request): # 学生信息查询
if request.method == 'POST':
name = request.POST.get('name')
sid = request.POST.get('sid')
sex = request.POST.get('sex')
grade = request.POST.get('grade')
class_name = request.POST.get('class_name')
major = request.POST.get('major')
# 定义空查询条件
conditions = Q()
if name:
conditions &= Q(name=name)
if sid:
conditions &= Q(sid=int(sid))
if sex:
conditions &= Q(sex=sex)
if grade:
conditions &= Q(grade=grade)
if class_name:
conditions &= Q(class_name=class_name)
if major:
conditions &= Q(major=major)
# 添加非空查询条件至基本查询集
query = Student.objects.filter(conditions)
data = query.values() # 将 QuerySet 对象转换为字典列表
data = list(data) # 转换为列表以便序列化为 JSON
print(query)
response = ResponseUtil.ok(data, "学生信息查询成功")
return JsonResponse(response)
elif request.method == "GET":
query = Student.objects.all()
data = query.values() # 将 QuerySet 对象转换为字典列表
data = list(data) # 转换为列表以便序列化为 JSON
response = ResponseUtil.ok(data, "学生信息查询成功")
return JsonResponse(response)
@csrf_exempt
def student_performance_management(request): # 学生成绩管理
if request.method == "POST": # 学生成绩录入
sid = int(request.POST.get('sid'))
cid = int(request.POST.get('cid'))
middle_grade = float(request.POST.get('middle_grade'))
end_grade = float(request.POST.get('end_grade'))
if middle_grade <= 100 and middle_grade >= 0 and end_grade <= 100 and end_grade >= 0:
query = SC.objects.filter(sid = sid, cid =cid)
if query.exists(): # 如果学生存在,则修改学生成绩
query.update(middle_grade = middle_grade, end_grade= end_grade)
else: # 如果学生成绩不存在,则插入学生成绩信息
sc = SC()
sid = Student.objects.get(sid=sid)
cid = Course.objects.get(cid=cid)
sc.sid = sid
sc.cid = cid
sc.middle_grade = middle_grade
sc.end_grade=end_grade
sc.save()
filtered = SC.objects.filter(sid = sid, cid =cid)
data = filtered.values()# 将 QuerySet 对象转换为字典列表
data = list(data) # 转换为列表以便序列化为 JSON
response = ResponseUtil.ok(data,"学生成绩录入成功")
return JsonResponse(response)
else:
response = ResponseUtil.error("成绩输入有误")
return JsonResponse(response)
elif request.method == "GET":
cid = request.GET.get('cid')
c_name = request.GET.get('c_name')
sid = request.GET.get('sid')
s_name = request.GET.get('s_name')
data = []
if c_name:
data.append(SC.objects.filter(cid__name=c_name))
elif s_name:
data.append(SC.objects.filter(sid__name=s_name))
elif sid and cid:
data.append(SC.objects.filter(sid=int(sid), cid=int(cid)))
elif sid:
data.append(SC.objects.filter(sid=int(sid)))
elif cid:
data.append(SC.objects.filter(cid=int(cid)))
else:
data.append(SC.objects.all())
response = ResponseUtil.ok(list(data[0].values()), "成绩查询成功")
return JsonResponse(response)
elif request.method == "DELETE":
put = MultiPartParser(request.META, request, request.upload_handlers, request.encoding).parse()
sid = put[0]['sid']
cid = put[0]['cid']
print(sid,cid)
try:
SC.objects.filter(sid=sid, cid=cid).update(middle_grade=0,end_grade=0)
data = SC.objects.filter(sid=sid).values()# 将 QuerySet 对象转换为字典列表
data = list(data) # 转换为列表以便序列化为 JSON
response = ResponseUtil.ok(data,"删除成功!")
return JsonResponse(response)
except:
response = ResponseUtil.error("未找到学生成绩")
return JsonResponse(response)
elif request.method == 'PUT':
put = MultiPartParser(request.META, request, request.upload_handlers, request.encoding).parse()
# request.PUT = put[0]
print(put)
sid = put[0]['sid']
cid = put[0]['cid']
middle_grade = put[0]['middle_grade']
end_grade = put[0]['end_grade']
SC.objects.filter(sid=sid, cid=cid).update(middle_grade=middle_grade)
SC.objects.filter(sid=sid, cid=cid).update(end_grade=end_grade)
filtered = SC.objects.filter(sid=sid, cid=cid)
data = filtered.values() # 将 QuerySet 对象转换为字典列表
data = list(data) # 转换为列表以便序列化为 JSON
response = ResponseUtil.ok(data, "学生成绩修改成功")
return JsonResponse(response)
@csrf_exempt
def course_selection(request): # 选课管理
if request.method == 'POST':
# 假设需要将 tid 为 1 的老师赋值给某个课程的 tid 字段
teacher_id = request.POST.get('tid')
name = request.POST.get('name')
type = request.POST.get('type')
credit = request.POST.get('credit')
if name and type and credit:
try:
teacher_id = int(teacher_id)
course = Course()
course.name = name
course.type = type
course.credit = int(credit)
course.tid = Teacher.objects.get(tid=teacher_id) # 将 Teacher 对象赋给 Course.tid 字段
course.save()
response = ResponseUtil.ok(course.tid_dict(), "课程信息插入成功")
return JsonResponse(response)
except ObjectDoesNotExist:
response = ResponseUtil.error("找不到 id 为 " + str(teacher_id)+" 的老师")
return JsonResponse(response)
except ValueError:
response = ResponseUtil.error("插入数据失败tid_id 列不能为 null")
return JsonResponse(response)
if request.method == 'GET':
cid = request.GET.get('cid')
name = request.GET.get('name')
type = request.GET.get('type')
credit = request.GET.get('credit')
tid = request.GET.get('tid')
# 定义空查询条件
conditions = Q()
if cid:
conditions &= Q(cid=int(cid))
if name:
conditions &= Q(name=name)
if type:
conditions &= Q(type=type)
if credit:
conditions &= Q(credit=credit)
if tid:
tid = int(tid)
conditions &= Q(tid=tid)
# 添加非空查询条件至基本查询集
query = Course.objects.filter(conditions)
data = query.values() # 将 QuerySet 对象转换为字典列表
data = list(data) # 转换为列表以便序列化为 JSON
print(query)
response = ResponseUtil.ok(data, "课程信息查询成功")
return JsonResponse(response)
if request.method == 'DELETE':
parser = MultiPartParser(request.META, BytesIO(request.body), request.upload_handlers, request.encoding)
posdict = parser.parse()
print(posdict)
cid = int(posdict[0]['cid'])
print(cid)
try:
data = Course.objects.filter(cid=cid).get()
Course.objects.filter(cid=cid).delete()
response = ResponseUtil.ok(data.tid_dict, "删除课程成功!")
return JsonResponse(response)
except:
response = ResponseUtil.ok("未查询到课程,删除失败")
return JsonResponse(response)
if request.method == 'PUT':
put = MultiPartParser(request.META, request, request.upload_handlers, request.encoding).parse()
# request.PUT = put[0]
print(put)
cid = put[0]['cid']
name = put[0]['name']
type = put[0]['type']
credit = put[0]['credit']
tid = put[0]['tid']
if cid and name and type and credit and tid:
Course.objects.filter(cid=cid).update(name=name, type=type, credit=credit)
Course.objects.filter(cid=cid).update(tid=Teacher.objects.get(tid=tid))
data = Course.objects.filter(cid=cid)[0].tid_dict()
response = ResponseUtil.ok(data, "课程信息修改成功")
return JsonResponse(response)
else:
response = ResponseUtil.error("课程信息修改失败,信息不全")
return JsonResponse(response)
@csrf_exempt
def student_management(request):
if request.method == 'GET':
tid = int(request.GET.get('tid'))
# 获取第1个查询表的数据
table1_result = Course.objects.filter(tid__tid=tid)
cids = [item.cid for item in table1_result]
# 获取第二个查询表的数据
table2_result = SC.objects.filter(cid__in=cids)
# for item in table2_result:
# print(item.sid.sid)
# 获取第三个查询表的数据
# 提取查询结果中的 sid 值
sids = [item.sid.sid for item in table2_result]
table3_result = Student.objects.filter(sid__in=sids).values('sid', 'name', 'sex', 'grade', 'class_name', 'major')
table = list(table3_result)
response = ResponseUtil.ok(table,"选课学生信息")
return JsonResponse(response)
if request.method == 'POST':
cid = request.POST.get('cid')
tid = request.POST.get('tid')
grade = request.POST.get('grade')
class_name = request.POST.get('class_name')
major = request.POST.get('major')
# 定义空查询条件
data = []
if cid:
cid = int(cid)
data.append(SC.objects.filter(cid=cid))
else:
# 获取第1个查询表的数据
tid = int(tid)
table1_result = Course.objects.filter(tid__tid=tid)
cids = [item.cid for item in table1_result]
# 获取第二个查询表的数据
data.append(SC.objects.filter(cid__in=cids))
# for item in table2_result:
# print(item.sid.sid)
# 获取第三个查询表的数据
# 提取查询结果中的 sid 值
print(data)
sids = [item.sid.sid for item in data[0]]
conditions = Q(sid__in=sids)
if grade:
conditions &= Q(grade=grade)
if class_name:
class_name &= Q(class_name=class_name)
if major:
conditions &= Q(major=major)
table3_result = Student.objects.filter(conditions).values('sid', 'name', 'sex', 'grade', 'class_name',
'major')
table = list(table3_result)
response = ResponseUtil.ok(table, "选课学生查询成功")
return JsonResponse(response)
if request.method == 'DELETE':
put = MultiPartParser(request.META, request, request.upload_handlers, request.encoding).parse()
sid = put[0]['sid']
cid = put[0]['cid']
print(sid)
try:
info = SC.objects.filter(sid=sid)
data = info.values() # 将 QuerySet 对象转换为字典列表
data = list(data) # 转换为列表以便序列化为 JSON
print(info)
SC.objects.filter(sid=sid,cid=cid).delete()
response = ResponseUtil.ok(data, "学生选课删除成功!")
return JsonResponse(response)
except:
response = ResponseUtil.error("未找到学生成绩")
return JsonResponse(response)
@csrf_exempt
def SC_selection(request):
if request.method == 'GET':
cid = int(request.GET.get('cid'))
table2_result = SC.objects.filter(cid__in=cid)
# for item in table2_result:
# print(item.sid.sid)
# 获取第三个查询表的数据
# 提取查询结果中的 sid 值
sids = [item.sid.sid for item in table2_result]
table3_result = Student.objects.filter(sid__in=sids).values('sid', 'name', 'sex', 'grade', 'class_name',
'major')
table = list(table3_result)
response = ResponseUtil.ok(table, "选课学生信息")
return JsonResponse(response)
if request.method == 'POST':
cid = request.POST.get('cid')
grade = request.POST.get('grade')
class_name = request.POST.get('class_name')
major = request.POST.get('major')
# 定义空查询条件
data = []
data.append(SC.objects.filter(cid=int(cid)))
# 获取第三个查询表的数据
# 提取查询结果中的 sid 值
print(data)
sids = [item.sid.sid for item in data[0]]
conditions = Q(sid__in=sids)
if grade:
conditions &= Q(grade=grade)
if class_name:
class_name &= Q(class_name=class_name)
if major:
conditions &= Q(major=major)
table3_result = Student.objects.filter(conditions).values('sid', 'name', 'sex', 'grade', 'class_name',
'major')
table = list(table3_result)
response = ResponseUtil.ok(table, "选课学生查询成功")
return JsonResponse(response)
if request.method == 'DELETE':
put = MultiPartParser(request.META, request, request.upload_handlers, request.encoding).parse()
sid = put[0]['sid']
cid = put[0]['cid']
print(sid)
try:
info = SC.objects.filter(sid=sid)
data = info.values() # 将 QuerySet 对象转换为字典列表
data = list(data) # 转换为列表以便序列化为 JSON
print(info)
SC.objects.filter(sid=sid, cid=cid).delete()
response = ResponseUtil.ok(data, "学生选课删除成功!")
return JsonResponse(response)
except:
response = ResponseUtil.error("未找到学生成绩")
return JsonResponse(response)

@ -1,63 +1,2 @@
# EduSystem # EduSystem
### 使用手册
1. 创建数据库
```sql
create database edu_sys;
```
2. 修改`EduSystemServer/setting.py`文件中的配置
```python
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': "edu_sys",
'USER': "用户名",
'PASSWORD': "密码",
'HOST': "localhost",
'PORT': 3306,
}
}
```
3. 迁移模型至数据库
1. 生成迁移文件
```shell
python manage.py makemigrations Eduadmin
python manage.py makemigrations Student
python manage.py makemigrations teacher
python manage.py makemigrations course
```
2. 迁移
```python
python manage.py migrate
```
4. 创建admin用户
```python
python manage.py createsuperuser
# 输入用户名,邮箱,密码
```
5. 运行程序
```python
python manage.py runserver
```
### 访问网址
管理端http://127.0.0.1:8000/admin/
用户端http://127.0.0.1:8000

Loading…
Cancel
Save