Files
hsa/Html/apps/views/material.py

172 lines
7.8 KiB
Python

from flask import Blueprint, request, jsonify, current_app, session, render_template, session
from bson import ObjectId
from ..services.course_service import create_material, update_material, get_materials_by_teacher, load_material, get_materials_by_teacher_dict, add_material_chapter, add_material_chapter_lesson, delete_material_chapter_lesson, reorder_material_structure, rename_material_structure
from ..auth.decorators import require_role
from ..services.cos_service import upload_file
bp = Blueprint('material', __name__)
@bp.get("/teacherboard")
@require_role(roles="teacher")
def teacherboard():
teacher_uuid = session.get("user_uuid")
teacher_id = current_app.extensions["uuid2username"][teacher_uuid]
return render_template("teacherboard.html",role="teacher", materials=get_materials_by_teacher_dict(teacher_id))
@bp.route('/teacher/upload_image', methods=['POST'])
@require_role(roles="teacher")
def upload_image():
teacher_uuid = session.get("user_uuid")
teacher_id = current_app.extensions["uuid2username"][teacher_uuid]
file = request.files.get('file')
if not file:
return jsonify({"message": "未上传文件"}), 400
image_url = upload_file(file, teacher_id + '_' + file.filename)
return jsonify({"message": "图片上传成功", "image_url": image_url}), 200
@bp.route('/create_material', methods=['POST'])
@require_role(roles="teacher")
def create_new_material():
data = request.get_json()
teacher_uuid = session.get("user_uuid")
teacher_id = current_app.extensions["uuid2username"][teacher_uuid]
image_url = data.get('image_url',None)
material_name = data.get('material_name',None)
description = data.get('description','')
chapters = data.get('chapters',[]) # 如果从其他课程为例进一步修改,则非空
if material_name is None:
return jsonify({"message": "教材名称不能为空"}), 400
material_id = create_material(teacher_id, material_name, description, chapters, image_url)
return jsonify({"message": "教材创建成功", "material_id": material_id}), 201
@bp.route('/materials/<material_id>', methods=['GET', 'PUT', 'DELETE'])
@require_role(roles="teacher")
def handle_material(material_id):
if request.method == 'GET':
if material_id is None:
return jsonify({"message": "教材名称不能为空"}), 400
material = load_material(material_id)
print(material)
return jsonify(material.model_dump()), 200
elif request.method == 'PUT':
data = request.get_json()
chapters = data.get('chapters')
if update_material(material_id, chapters):
return jsonify({"message": "教材更新成功"}), 200
else:
return jsonify({"message": "教材更新失败"}), 500
elif request.method == 'DELETE':
# 获取当前教师信息
teacher_uuid = session.get("user_uuid")
teacher_id = current_app.extensions["uuid2username"][teacher_uuid]
# 检查材料是否存在,并且是否为当前教师创建
mongo = current_app.extensions["mongo"]
print(f"尝试删除课程ID: {material_id}, 当前教师ID: {teacher_id}")
try:
material = mongo.db.materials.find_one({'_id': ObjectId(material_id)})
print(f"找到的材料: {material}")
if not material:
return jsonify({"message": "课程不存在", "success": False}), 404
# 验证是否为当前教师创建的课程
if material.get('teacher_id') != teacher_id:
return jsonify({"message": "权限不足,无法删除他人课程", "success": False}), 403
except Exception as e:
print(f"查询材料时出错: {e}")
return jsonify({"message": f"查询课程时出错: {str(e)}", "success": False}), 500
# 执行删除操作
try:
result = mongo.db.materials.delete_one({'_id': ObjectId(material_id), 'teacher_id': teacher_id})
print(f"删除操作结果: {result.deleted_count}")
except Exception as e:
print(f"删除材料时出错: {e}")
return jsonify({"message": f"删除课程时出错: {str(e)}", "success": False}), 500
if result.deleted_count > 0:
return jsonify({"message": "课程删除成功", "success": True}), 200
else:
return jsonify({"message": "删除失败", "success": False}), 500
@bp.route('/materials/addchapter/<material_id>', methods=['POST'])
@require_role(roles="teacher")
def add_chapter(material_id):
data = request.get_json()
chapter_name = data.get('chapter_name')
teacher_uuid = session.get("user_uuid")
teacher_id = current_app.extensions["uuid2username"][teacher_uuid]
if add_material_chapter(material_id, chapter_name, teacher_id):
return jsonify({"message": "章节添加成功"}), 200
return jsonify({"message": "章节添加失败"}), 404
@bp.route('/materials/addlesson/<material_id>', methods=['POST'])
@require_role(roles="teacher")
def add_lesson(material_id):
data = request.get_json()
chapter_name = data.get('chapter_name')
lesson_name = data.get('lesson_name')
teacher_uuid = session.get("user_uuid")
teacher_id = current_app.extensions["uuid2username"][teacher_uuid]
if add_material_chapter_lesson(material_id, chapter_name, lesson_name, teacher_id):
return jsonify({"message": "课时添加成功"}), 200
return jsonify({"message": "课时添加失败"}), 404
@bp.route('/materials/structure/rename/<material_id>', methods=['POST'])
@require_role(roles="teacher")
def rename_material(material_id):
data = request.get_json()
is_chapter = data.get('is_chapter')
chapter_name = data.get('chapter_name')
lesson_name = data.get('lesson_name')
new_name = data.get('new_name')
print(f"rename_material: {is_chapter}, {chapter_name}, {lesson_name}, {new_name}")
if rename_material_structure(material_id, is_chapter, chapter_name, lesson_name, new_name):
return jsonify({"message": "教材重命名成功"}), 200
return jsonify({"message": "教材重命名失败"}), 404
@bp.route('/materials/deletelesson/<material_id>', methods=['DELETE'])
@require_role(roles="teacher")
def delete_lesson(material_id):
data = request.get_json()
chapter_name = data.get('chapter_name')
lesson_name = data.get('lesson_name')
teacher_uuid = session.get("user_uuid")
teacher_id = current_app.extensions["uuid2username"][teacher_uuid]
if delete_material_chapter_lesson(material_id, chapter_name, lesson_name, teacher_id):
return jsonify({"message": "课时删除成功"}), 200
return jsonify({"message": "课时删除失败"}), 404
@bp.route('/materials/structure/reorder/<material_id>', methods=['POST'])
@require_role(roles="teacher")
def reorder_material(material_id):
data = request.get_json()
order = data.get('order')
if reorder_material_structure(material_id, order):
return jsonify({"message": "教材顺序更新成功"}), 200
return jsonify({"message": "教材顺序更新失败"}), 404
@bp.route('/teacher/materials', methods=['GET'])
@require_role(roles="teacher")
def get_materials_by_teacher_view():
teacher_uuid = session.get("user_uuid")
teacher_id = current_app.extensions["uuid2username"][teacher_uuid]
materials = get_materials_by_teacher(teacher_id)
result = []
for material in materials:
result.append({
'_id': str(material._id),
'name': material.name,
'description': material.description,
'created_at': material.created_at,
'updated_at': material.updated_at,
#'chapters': material.chapters,
'image_url': material.image_url
})
return jsonify(result), 200