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/', 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/', 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/', 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/', 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/', 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/', 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