1. 项目概述:校园生活服务平台的四个角色设计
校园生活学习服务交流平台是一个基于Python技术栈开发的综合性校园服务系统,采用Django作为主框架,Flask作为辅助微服务框架。这个平台最显著的特点是设计了四个核心用户角色:学生、教师、管理员和后勤服务人员,每个角色都有专属的功能模块和交互界面。
我在实际开发中发现,多角色系统的权限控制是这类平台的技术难点。Django自带的auth模块虽然强大,但需要针对校园场景进行深度定制。比如学生角色需要区分本科生、研究生不同权限层级,教师角色要关联院系信息,而后勤人员则需要对接宿舍管理、食堂订餐等特殊功能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 技术架构选型解析
2.1 Django与Flask的混合架构
选择Django作为主框架主要基于以下考虑:
- 自带Admin后台管理系统,快速实现CRUD操作
- ORM支持多数据库后端,方便对接校园已有的MySQL/Oracle系统
- 完善的用户认证体系,为多角色系统打下基础
Flask则用于实现以下特定功能:
- 轻量级的API服务(如课表查询、成绩推送)
- 实时通知系统(WebSocket实现)
- 第三方服务对接(图书馆系统、支付接口)
实际开发中发现,Django的模板系统与Flask的Jinja2存在兼容问题。建议统一前端模板引擎,或在两者间建立清晰的边界。
2.2 数据库设计要点
四个角色共享核心用户表,通过type字段区分角色类型。关键表结构设计如下:
python复制class User(AbstractUser):
ROLE_CHOICES = (
('STU', '学生'),
('TEA', '教师'),
('ADM', '管理员'),
('LOG', '后勤人员')
)
role = models.CharField(max_length=3, choices=ROLE_CHOICES)
# 公共字段...
class StudentProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
student_id = models.CharField(max_length=20)
grade = models.CharField(max_length=10)
# 学生特有字段...
class TeacherProfile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
teacher_id = models.CharField(max_length=20)
department = models.ForeignKey(Department, on_delete=models.PROTECT)
# 教师特有字段...
3. 核心功能模块实现
3.1 多角色登录与权限控制
采用Django的权限系统扩展实现:
python复制# permissions.py
from django.contrib.auth.models import Group
def init_roles():
roles = {
'student': ['view_course', 'submit_assignment'],
'teacher': ['create_course', 'grade_assignment'],
'admin': ['manage_user', 'audit_log'],
'logistics': ['manage_dorm', 'process_order']
}
for role, perms in roles.items():
group, _ = Group.objects.get_or_create(name=role)
for perm in perms:
group.permissions.add(get_permission(perm))
前端根据角色动态渲染菜单:
javascript复制// 获取用户角色后过滤菜单项
const filterMenu = (menuItems, role) => {
return menuItems.filter(item => {
return item.roles.includes(role)
})
}
3.2 学生模块关键技术
- 课表查询优化:
python复制# 使用select_related减少查询次数
timetable = Course.objects.select_related(
'teacher', 'classroom'
).filter(
student_classes__student=request.user.studentprofile
)
- 作业提交防重复:
python复制def submit_assignment(request):
if AssignmentSubmission.objects.filter(
student=request.user.studentprofile,
assignment_id=request.POST['assignment_id']
).exists():
return JsonResponse({'error': '请勿重复提交'})
# 处理提交逻辑...
3.3 教师模块特殊功能
在线批改系统采用Flask实现:
python复制@app.route('/grade', methods=['POST'])
def grade_assignment():
# JWT验证教师身份
token = request.headers.get('Authorization')
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
if payload['role'] != 'teacher':
abort(403)
except:
abort(401)
# 批改逻辑...
4. 部署与性能优化
4.1 混合部署方案
| 组件 | 技术选型 | 说明 |
|---|---|---|
| 主应用 | Django + Gunicorn | 处理核心业务逻辑 |
| API服务 | Flask + uWSGI | 运行在8001端口 |
| 实时通知 | Flask-SocketIO | 独立部署在8002端口 |
| 静态文件 | Nginx | 同时做负载均衡 |
4.2 缓存策略设计
- 课程信息缓存:
python复制from django.core.cache import cache
def get_courses():
key = f'courses_{request.user.id}'
data = cache.get(key)
if not data:
data = list(Course.objects.filter(...).values())
cache.set(key, data, timeout=3600) # 1小时缓存
return data
- Redis存储会话信息:
python复制SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
5. 开发中遇到的典型问题
5.1 跨域会话共享
问题现象:Django和Flask服务间无法共享登录状态
解决方案:
- 采用JWT作为统一认证方式
- 设置相同的SECRET_KEY
- 配置CORS白名单
python复制# Django settings.py
CORS_ALLOWED_ORIGINS = [
"http://api.example.com",
"http://notify.example.com"
]
# Flask配置
app.config['JWT_SECRET_KEY'] = 'same_as_django'
CORS(app, resources={
r"/*": {"origins": ["http://main.example.com"]}
})
5.2 文件上传兼容性问题
不同角色上传需求差异:
- 学生:作业文件(限制10MB)
- 教师:课件资料(限制100MB)
- 后勤:采购清单(Excel专用)
实现方案:
python复制# 动态配置上传参数
def handle_upload(request):
role = request.user.role
if role == 'STU':
max_size = 10 * 1024 * 1024
allowed_types = ['pdf', 'docx']
elif role == 'TEA':
max_size = 100 * 1024 * 1024
allowed_types = ['ppt', 'pptx', 'pdf']
# 验证逻辑...
6. 安全防护措施
6.1 角色权限验证
在每个视图函数添加装饰器:
python复制from django.contrib.auth.decorators import user_passes_test
def teacher_required(view_func):
actual_decorator = user_passes_test(
lambda u: u.is_authenticated and u.role == 'TEA',
login_url='/403/'
)
return actual_decorator(view_func)
6.2 敏感操作审计
创建审计日志模型:
python复制class AuditLog(models.Model):
ACTION_CHOICES = [
('LOGIN', '登录系统'),
('UPDATE', '修改数据'),
('DELETE', '删除数据')
]
user = models.ForeignKey(User, on_delete=models.PROTECT)
action = models.CharField(max_length=10, choices=ACTION_CHOICES)
ip_address = models.GenericIPAddressField()
created_at = models.DateTimeField(auto_now_add=True)
@classmethod
def log_action(cls, user, action, request):
cls.objects.create(
user=user,
action=action,
ip_address=get_client_ip(request)
)
7. 项目扩展方向
- 移动端适配:开发React Native应用,通过REST API与后端交互
- 智能推荐:基于用户行为数据分析,推荐学习资源
- 物联网集成:对接校园卡系统、门禁系统等硬件设备
在实现多角色系统时,最重要的是保持各角色功能的隔离性,同时又要确保基础数据的共享。我们采用了微服务架构将不同角色的核心功能拆分为独立模块,通过API网关进行统一调度。实际运行中发现,这种架构虽然增加了初期开发成本,但极大方便了后期的功能扩展和维护。
