从零搭建企业级档案系统:培训服务技术实操指南
一、核心目标与工具选型
本文的目标是指导你搭建一个用于内部培训服务的档案管理系统,实现从课程资料、讲师信息到学员学习记录的电子化集中管理。我们将使用开源技术栈,确保零成本部署与高可扩展性。
我们选择以下核心工具:
- 后端框架: Django (Python)。因其自带强大的Admin管理后台,能快速构建数据模型。
- 数据库: SQLite (开发/轻量级生产) 或 PostgreSQL (正式生产)。本文以SQLite为例,无需额外安装。
- 前端: 使用Django模板,简化开发,聚焦业务逻辑。
- 文件存储: Django默认的本地存储,便于理解。生产环境可替换为云存储。
二、环境准备与项目初始化
确保你的操作系统已安装Python 3.8+。所有操作在命令行终端中完成。
1. 创建虚拟环境与安装依赖
隔离项目环境,避免包冲突。
打开终端,执行以下命令:
创建项目目录并进入
mkdir training_archive_system && cd training_archive_system
创建Python虚拟环境
python -m venv venv
激活虚拟环境
Windows系统执行:
venv\Scripts\activate
Linux/macOS系统执行:
source venv/bin/activate
安装Django
pip install django==4.2
激活后,命令行提示符前会出现(venv)标识。
2. 创建Django项目与应用
创建名为"config"的Django项目
django-admin startproject config .
创建名为"archive"的核心应用
python manage.py startapp archive
项目结构应如下所示:
training_archive_system/
├── venv/ 虚拟环境目录
├── manage.py
├── config/ 项目配置目录
│ ├── __init__.py
│ ├── settings.py 核心配置文件
│ ├── urls.py
│ └── wsgi.py
└── archive/ 档案系统应用目录
├── __init__.py
├── admin.py
├── apps.py
├── models.py 数据模型文件
├── tests.py
└── views.py
三、定义数据模型
在archive/models.py中定义档案系统的核心数据结构。
from django.db import models
from django.contrib.auth.models import User
class Trainer(models.Model):
"""讲师档案"""
name = models.CharField(max_length=100, verbose_name='姓名')
employee_id = models.CharField(max_length=50, unique=True, verbose_name='工号')
department = models.CharField(max_length=100, verbose_name='所属部门')
expertise = models.TextField(verbose_name='擅长领域')
resume = models.FileField(upload_to='trainer_resumes/', verbose_name='简历文件', null=True, blank=True)
class Meta:
verbose_name = '讲师档案'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class TrainingCourse(models.Model):
"""培训课程档案"""
COURSE_TYPE_CHOICES = (
('online', '线上课程'),
('offline', '线下集训'),
('hybrid', '混合式'),
)
title = models.CharField(max_length=200, verbose_name='课程标题')
course_code = models.CharField(max_length=50, unique=True, verbose_name='课程代码')
description = models.TextField(verbose_name='课程描述')
course_type = models.CharField(max_length=10, choices=COURSE_TYPE_CHOICES, verbose_name='课程类型')
duration_hours = models.PositiveIntegerField(verbose_name='课时(小时)')
trainer = models.ForeignKey(Trainer, on_delete=models.SET_NULL, null=True, verbose_name='主讲讲师')
materials = models.FileField(upload_to='course_materials/', verbose_name='课程资料包', blank=True)
class Meta:
verbose_name = '培训课程'
verbose_name_plural = verbose_name
def __str__(self):
return f"{self.course_code} - {self.title}"
class TrainingRecord(models.Model):
"""培训记录档案"""
trainee = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='学员')
course = models.ForeignKey(TrainingCourse, on_delete=models.CASCADE, verbose_name='参与课程')
enrolled_at = models.DateTimeField(auto_now_add=True, verbose_name='报名时间')
completed_at = models.DateTimeField(null=True, blank=True, verbose_name='完成时间')
score = models.FloatField(null=True, blank=True, verbose_name='考核成绩')
feedback = models.TextField(blank=True, verbose_name='学员反馈')
certificate = models.FileField(upload_to='certificates/', verbose_name='结业证书', null=True, blank=True)
class Meta:
verbose_name = '培训记录'
verbose_name_plural = verbose_name
unique_together = ['trainee', 'course'] 防止重复报名
def __str__(self):
return f"{self.trainee.username} - {self.course.title}"
四、配置项目并激活模型
1. 注册应用与媒体文件设置
编辑config/settings.py文件。
找到INSTALLED_APPS列表,添加'archive'应用:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'archive', 新增此行
]
在文件末尾添加媒体文件配置,用于存储上传的文件:
媒体文件设置
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
2. 生成数据库并创建超级用户
在终端执行以下命令:

生成数据库迁移文件
python manage.py makemigrations archive
执行迁移,创建数据库表
python manage.py migrate
创建管理员账户,用于登录后台
python manage.py createsuperuser
按提示输入用户名、邮箱和密码
五、配置管理后台与文件访问
1. 注册模型到Admin后台
编辑archive/admin.py文件,使模型能在后台管理。
from django.contrib import admin
from .models import Trainer, TrainingCourse, TrainingRecord
@admin.register(Trainer)
class TrainerAdmin(admin.ModelAdmin):
list_display = ('name', 'employee_id', 'department')
search_fields = ('name', 'employee_id')
@admin.register(TrainingCourse)
class TrainingCourseAdmin(admin.ModelAdmin):
list_display = ('course_code', 'title', 'course_type', 'trainer')
list_filter = ('course_type',)
@admin.register(TrainingRecord)
class TrainingRecordAdmin(admin.ModelAdmin):
list_display = ('trainee', 'course', 'enrolled_at', 'score')
list_filter = ('course',)
2. 配置URL路由与开发服务器文件服务
编辑项目主路由文件config/urls.py:
from django.contrib import admin
from django.urls import path
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
path('admin/', admin.site.urls),
]
仅在开发环境提供媒体文件访问
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
六、启动系统与基础操作
1. 启动开发服务器
python manage.py runserver
终端将显示Starting development server at http://127.0.0.1:8000/。
2. 登录后台并录入数据
打开浏览器,访问 http://127.0.0.1:8000/admin,使用创建的超级用户账号登录。
你将看到“ARCHIVE”模块下列出的三个模型:
- 添加讲师档案:点击“讲师档案”后的“增加”,填写讲师信息,并可上传PDF格式的简历文件。
- 创建培训课程:点击“培训课程”后的“增加”,关联已创建的讲师,上传课程资料(如PPT、PDF)。
- 登记培训记录:点击“培训记录”后的“增加”,选择学员(即Django用户,可在“认证和授权”下的“用户”中添加)和对应课程,记录成绩并上传结业证书。
所有上传的文件将自动保存在项目根目录的media/文件夹下,并按模型字段的upload_to参数分类。
七、核心功能扩展实操
1. 实现按部门统计培训学时的视图
在archive/views.py中创建业务视图:
from django.db.models import Sum
from django.contrib.auth.models import User
from django.shortcuts import render
from .models import TrainingRecord
def department_training_hours(request):
按学员所属部门(这里简化使用用户组的第一个组名作为部门)聚合培训总时长
stats = []
for user in User.objects.filter(groups__isnull=False).distinct():
dept_name = user.groups.first().name if user.groups.exists() else '未分组'
total_hours = TrainingRecord.objects.filter(
trainee=user,
completed_at__isnull=False
).aggregate(
total=Sum('course__duration_hours')
)['total'] or 0
stats.append({
'department': dept_name,
'user': user.username,
'total_hours': total_hours
})
return render(request, 'archive/department_stats.html', {'stats': stats})
创建模板文件archive/templates/archive/department_stats.html:
部门培训学时统计
部门培训学时统计
部门
学员
总完成学时(小时)
{% for item in stats %}
{{ item.department }}
{{ item.user }}
{{ item.total_hours }}
{% endfor %}
在archive目录下创建urls.py文件,并配置路由:
from django.urls import path
from . import views
urlpatterns = [
path('stats/department/', views.department_training_hours, name='dept_stats'),
]
将应用路由包含到项目config/urls.py的urlpatterns中:
from django.contrib import admin
from django.urls import path, include 新增include导入
urlpatterns = [
path('admin/', admin.site.urls),
path('archive/', include('archive.urls')), 新增此行
]
访问 http://127.0.0.1:8000/archive/stats/department/ 即可查看统计页面。
2. 关键生产环境部署步骤
- 切换数据库:在
settings.py中,将DATABASES配置为PostgreSQL,并安装psycopg2-binary包。 - 收集静态文件:执行
python manage.py collectstatic。 - 关闭DEBUG模式:设置
DEBUG = False,并配置ALLOWED_HOSTS。 - 使用Web服务器:通过Gunicorn或uWSGI部署,并用Nginx或Apache处理静态文件和媒体文件,替换开发服务器的
static()方式。 - 文件存储:使用AWS S3、阿里云OSS等云服务存储媒体文件,通过Django Storages库配置。
至此,一个具备讲师、课程、培训记录管理,支持文件上传,并可扩展统计功能的培训档案系统已搭建完成。你可以根据具体业务需求,继续在模型中添加字段,或开发更复杂的查询与分析功能。