1、技术选择
- 前端框架:vue2
- 后端框架:django
- 可视化:Echarts
- 前后端分离:DRF
- 数据库MySQL8.0
2、功能模块
3、具体功能界面
3.1、登录界面
登录使用到了JWT框架,部分代码如下:
from rest_framework_jwt.settings import api_settings
from rest_framework_jwt.views import JSONWebTokenAPIView, ObtainJSONWebToken, RefreshJSONWebToken, VerifyJSONWebToken
from datetime import datetime
from rest_framework.response import Response
from rest_framework import status
class MyJSONWebTokenAPIView(JSONWebTokenAPIView):
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
print('user----------------', serializer)
if serializer.is_valid():
user = serializer.object.get('user') or request.user
print(f'序列化之后的用户信息:--> {user}')
token = serializer.object.get('token')
response_data = jwt_response_payload_handler(token, user, request)
response = Response(response_data)
if api_settings.JWT_AUTH_COOKIE:
expiration = (datetime.utcnow() +
api_settings.JWT_EXPIRATION_DELTA)
response.set_cookie(api_settings.JWT_AUTH_COOKIE,
token,
expires=expiration,
httponly=True)
return response
error_data = jwt_response_payload_error_handler(serializer, request)
return Response(error_data, status=status.HTTP_200_OK)
3.2、管理员端
3.2.1、用户管理
3.2.2、信息管理
3.2.3、视频和文档管理
3.3、学生端
3.3.1、首页
3.3.2、课程信息
3.3.3、选课及推荐
3.3.4、视频播放及推荐
视频推荐使用基于用户的协同过滤推荐算法,部分代码如下:
def get_recommendations(student_id):
# 获取所有用户的点击数据
student_id = int(student_id)
all_clicks = VideoClick.objects.all()
# 创建用户-视频点击矩阵
user_video_matrix = defaultdict(lambda: defaultdict(int))
for click in all_clicks:
user_video_matrix[click.student_id][click.video_id] += 1
# 获取当前用户的点击向量
target_user_clicks = user_video_matrix[student_id]
print(f"Target User Clicks for student_id {student_id}: {target_user_clicks}")
# 如果目标用户没有点击记录,则推荐最热门的视频
if not target_user_clicks:
print(f"No clicks found for student_id {student_id}. Recommending popular videos.")
# 获取点击量最高的视频
popular_videos = VideoClick.objects.values('video_id').annotate(click_count=Count('video_id')).order_by('-click_count')[:4]
recommended_videos = [video['video_id'] for video in popular_videos]
else:
# 计算所有其他用户与当前用户的相似度
def cosine_similarity(vec1, vec2):
if len(vec1) == 0 or len(vec2) == 0:
return 0
vec1, vec2 = np.array(vec1), np.array(vec2)
dot_product = np.dot(vec1, vec2)
norm_a = np.linalg.norm(vec1)
norm_b = np.linalg.norm(vec2)
if norm_a == 0 or norm_b == 0:
return 0
return dot_product / (norm_a * norm_b)
3.3.5、PDF阅读下载功能
这里查看使用的是浏览器自带的PDF阅读功能。