本系统将实现学员从在线报名到档案管理的完整闭环。核心功能包括:学员在线填写报名表单、管理员后台审核、学员信息自动归档、以及档案的查询与统计。我们将使用Python的Django框架,因为它内置了强大的后台管理功能,能极大减少开发量。
确保你的开发环境已安装Python 3.8或更高版本。
打开终端,执行以下命令:
``` mkdir training_archives && cd training_archives python -m venv venv ```激活虚拟环境:
Windows系统:
``` venv\Scripts\activate ```macOS/Linux系统:
``` source venv/bin/activate ```安装Django和必要的数据库驱动:
``` pip install django pymysql ```在激活的虚拟环境中,创建项目核心和应用模块:
``` django-admin startproject training_system . django-admin startapp enrollment ```修改 training_system/settings.py 文件,配置数据库和注册应用。
``` training_system/settings.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'training_db', 'USER': 'your_username', 'PASSWORD': 'your_password', 'HOST': 'localhost', 'PORT': '3306', } } INSTALLED_APPS = [ ... 'enrollment.apps.EnrollmentConfig', 添加此行 ] ```在 enrollment/models.py 中定义核心数据表。学员信息和报名记录是核心。
``` enrollment/models.py from django.db import models class Student(models.Model): """学员档案模型""" name = models.CharField(max_length=50, verbose_name='姓名') id_card = models.CharField(max_length=18, unique=True, verbose_name='身份证号') phone = models.CharField(max_length=11, verbose_name='手机号') email = models.EmailField(verbose_name='邮箱') education = models.CharField(max_length=50, verbose_name='学历') created_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') class Meta: verbose_name = '学员档案' verbose_name_plural = verbose_name def __str__(self): return self.name class Course(models.Model): """培训课程模型""" name = models.CharField(max_length=100, verbose_name='课程名称') code = models.CharField(max_length=20, unique=True, verbose_name='课程代码') price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name='价格') class Meta: verbose_name = '培训课程' verbose_name_plural = verbose_name def __str__(self): return self.name class Enrollment(models.Model): """报名记录模型,关联学员和课程""" STATUS_CHOICES = ( ('pending', '待审核'), ('approved', '已通过'), ('rejected', '已拒绝'), ) student = models.ForeignKey(Student, on_delete=models.CASCADE, verbose_name='学员') course = models.ForeignKey(Course, on_delete=models.CASCADE, verbose_name='课程') apply_time = models.DateTimeField(auto_now_add=True, verbose_name='申请时间') status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='pending', verbose_name='审核状态') notes = models.TextField(blank=True, verbose_name='备注') class Meta: verbose_name = '报名记录' verbose_name_plural = verbose_name def __str__(self): return f'{self.student.name} - {self.course.name}' ```创建数据库并生成数据表:
``` python manage.py makemigrations enrollment python manage.py migrate ```创建表单让学员填写信息。首先在 enrollment/forms.py 中定义表单结构。
``` enrollment/forms.py from django import forms from .models import Student, Course, Enrollment class EnrollmentForm(forms.ModelForm): 前端报名时,学员需填写个人信息并选择课程 course = forms.ModelChoiceField(queryset=Course.objects.all(), label='选择课程') class Meta: model = Student fields = ['name', 'id_card', 'phone', 'email', 'education'] labels = { 'name': '姓名', 'id_card': '身份证号', 'phone': '手机号', 'email': '邮箱', 'education': '学历', } widgets = { 'id_card': forms.TextInput(attrs={'placeholder': '18位身份证号码'}), 'phone': forms.TextInput(attrs={'placeholder': '11位手机号码'}), } ```
接下来创建视图处理表单提交。编辑 enrollment/views.py。
``` enrollment/views.py from django.shortcuts import render, redirect from django.http import HttpResponse from .forms import EnrollmentForm from .models import Student, Enrollment def apply(request): if request.method == 'POST': form = EnrollmentForm(request.POST) if form.is_valid(): 1. 保存或获取学员信息 student_data = {field: form.cleaned_data[field] for field in ['name', 'id_card', 'phone', 'email', 'education']} student, created = Student.objects.get_or_create(id_card=student_data['id_card'], defaults=student_data) 2. 创建报名记录 course = form.cleaned_data['course'] Enrollment.objects.create(student=student, course=course) return HttpResponse('报名申请已提交,请等待管理员审核!') else: form = EnrollmentForm() return render(request, 'enrollment/apply.html', {'form': form}) ```创建模板文件。首先在 enrollment 目录下创建 templates/enrollment 文件夹,然后新建 apply.html。
```配置URL路由。先修改项目级的 training_system/urls.py。
``` training_system/urls.py from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('enrollment/', include('enrollment.urls')), ] ```在 enrollment 应用下创建 urls.py 文件。
``` enrollment/urls.py from django.urls import path from . import views urlpatterns = [ path('apply/', views.apply, name='apply'), ] ```Django自带强大的后台,我们需要将模型注册进去,并做一些定制。编辑 enrollment/admin.py。
``` enrollment/admin.py from django.contrib import admin from .models import Student, Course, Enrollment class EnrollmentAdmin(admin.ModelAdmin): list_display = ('id', 'student_name', 'course_name', 'apply_time', 'status') list_filter = ('status', 'course') search_fields = ('student__name', 'student__id_card') actions = ['approve_enrollments', 'reject_enrollments'] def student_name(self, obj): return obj.student.name student_name.short_description = '学员姓名' def course_name(self, obj): return obj.course.name course_name.short_description = '课程名称' @admin.action(description='批量通过选中报名') def approve_enrollments(self, request, queryset): queryset.update(status='approved') @admin.action(description='批量拒绝选中报名') def reject_enrollments(self, request, queryset): queryset.update(status='rejected') admin.site.register(Student) admin.site.register(Course) admin.site.register(Enrollment, EnrollmentAdmin) ```创建一个超级用户来登录后台:
``` python manage.py createsuperuser ```按照提示输入用户名、邮箱和密码。
在视图的报名逻辑中,需要增加检查,防止同一学员对同一课程重复报名。修改 enrollment/views.py 中的 apply 视图。
``` 在 enrollment/views.py 的 apply 视图中,保存报名记录前添加检查 def apply(request): if request.method == 'POST': form = EnrollmentForm(request.POST) if form.is_valid(): student_data = {field: form.cleaned_data[field] for field in ['name', 'id_card', 'phone', 'email', 'education']} student, created = Student.objects.get_or_create(id_card=student_data['id_card'], defaults=student_data) course = form.cleaned_data['course'] 关键检查:是否已存在相同学员和课程的报名记录 if Enrollment.objects.filter(student=student, course=course).exists(): return HttpResponse('您已经报名过该课程,请勿重复提交。') 创建新的报名记录 Enrollment.objects.create(student=student, course=course) return HttpResponse('报名申请已提交,请等待管理员审核!') ... ```在表单中增加自定义验证。修改 enrollment/forms.py。
``` enrollment/forms.py import re class EnrollmentForm(forms.ModelForm): course = forms.ModelChoiceField(queryset=Course.objects.all(), label='选择课程') class Meta: model = Student fields = ['name', 'id_card', 'phone', 'email', 'education'] ... def clean_id_card(self): id_card = self.cleaned_data['id_card'] 简单的18位格式验证(仅示例,实际应更严谨) pattern = r'^\d{17}[\dXx]$' if not re.match(pattern, id_card): raise forms.ValidationError('身份证号码格式不正确,应为18位。') return id_card def clean_phone(self): phone = self.cleaned_data['phone'] pattern = r'^1[3-9]\d{9}$' if not re.match(pattern, phone): raise forms.ValidationError('手机号码格式不正确。') return phone ```开发完成后,需要部署到服务器。以下是关键步骤:
启动应用:
``` gunicorn --workers 3 training_system.wsgi:application ```访问 `http://your_domain.com/enrollment/apply/` 即可看到报名页面,访问 `http://your_domain.com/admin/` 使用超级用户账号登录管理后台,审核报名和查看学员档案。