from flask import Flask, request, jsonify from pymongo import MongoClient from bson import ObjectId import hashlib import json from flask import Flask, request from flask_socketio import SocketIO, emit, join_room, leave_room import time app = Flask(__name__) client = MongoClient("mongodb://localhost:27019/") db = client["back"] collection = db["users"] # sockitIo解决跨域问题 app.config["SECRET_KEY"] = "secret!" socketio = SocketIO(app, cors_allowed_origins="*") # 存储连接的客户端的房间号 clients = [] adminSid = "" @socketio.on("connect", namespace="/ws/video") def on_connect(): global clients global adminSid sid = request.sid # 假设客户端在连接时发送了一个 id id = request.args.get("id") isAdmin = request.args.get("isAdmin") if isAdmin == "1": adminSid = sid print(87874, adminSid) clients.append({"id": id, "sid": sid, "isAdmin": isAdmin}) @socketio.on("disconnect", namespace="/ws/video") def on_disconnect(): global clients for item in clients: if item["id"] == request.sid: clients.remove(item) print(f"Client disconnected with id {item['id']}") @socketio.on("video", namespace="/ws/video") def handle_video_frame(message): # 广播视频帧给老师 global adminSid # print(f"Received video frame from {message['userId']}") socketio.emit("teacherVideo", message, to=adminSid, namespace="/ws/video") # # md5加密 def md5_encrypt(data): md5 = hashlib.md5() md5.update(data.encode("utf-8")) return md5.hexdigest() # 初始化数据 def initData(): admin = collection.find_one({"isAdmin": 1, "isExit": 1}) if admin is None: # 学校名称、学校代号、专业名称、专业代号、年级、班级、学生姓名、学号、密码、成绩、作弊情况(作弊类型、作弊时间、作弊图片)、考试类型、考试科目、考试时间段、考试链接、是否是管理员、是否删除、创建时间、更新时间 # xuexiaomingcheng、xuexiaodaihao、zhuanyemingcheng、zhuanyedaihao、nianji、banji、xueshengxingming、xuehao、mima、chengji、zuobiqingkuang(zuobileixing、zuobishijian、zuobitupian)、kaoshileixing、kaoshikemu、kaoshishijianduan、kaoshilianjie、isAdmin、isExit、chuangjianshijian、gengxinshijian user = { "xuexiaomingcheng": "", "xuexiaodaihao": "", "zhuanyemingcheng": "", "zhuanyedaihao": "", "nianji": "", "banji": "", "xueshengxingming": "老师", "xuehao": "0000", "mima": md5_encrypt("0000"), "chengji": "", "zuobiqingkuang": [], "kaoshileixing": "", "kaoshikemu": "", "kaoshishijianduan": "", "kaoshilianjie": "", "isAdmin": 1, "isExit": 1, "chuangjianshijian": "", "gengxinshijian": "", } collection.insert_one(user) print("管理账号'老师'已被初始化新建") else: print(f"管理账号'{admin['xueshengxingming']}'已存在") # 判断是否是管理员 def isAdmin(id): mongoId = ObjectId(id) userObj = collection.find_one({"_id": mongoId, "isExit": 1}) # 检查 userObj 是否为 None if userObj is None: return False # 默认返回 False 如果 isAdmin 字段不存在 adminBool = userObj.get("isAdmin", False) return bool(adminBool) # 用户登录 @app.route("/userLogin", methods=["post"]) def login(): resData = request.data # 检测是否有数据 if not resData: return {"code": 200, "msg": "请填写信息后登录", "list": [], "hasError": True} # 获取到POST过来的数据,转为json形式 userJson = json.loads(resData) res = collection.find_one({"xuehao": userJson["xuehao"], "mima": userJson["mima"]}) if res is None: return {"code": 200, "msg": "暂无此用户", "list": [], "hasError": True} # serialized_data = [] # for item in data: # item["_id"] = str(item["_id"]) # 将ObjectId转换为字符串 # serialized_data.append(item) # 将ObjectId转换为字符串 res["_id"] = str(res["_id"]) return {"code": 200, "msg": "登陆成功", "list": [res], "hasError": False} # 新增用户 @app.route("/addUser", methods=["post"]) def insert_data(): resData = request.data # 检测是否有数据 if not resData: return {"code": 200, "msg": "无数据", "list": [], "hasError": True} # 获取到POST过来的数据,转为json形式 userJson = json.loads(resData) admin = isAdmin(userJson["id"]) if admin: _id = ObjectId() userItem = { "_id": _id, "xuexiaomingcheng": userJson["xuexiaomingcheng"], "xuexiaodaihao": userJson["xuexiaodaihao"], "zhuanyemingcheng": userJson["zhuanyemingcheng"], "zhuanyedaihao": userJson["zhuanyedaihao"], "nianji": userJson["nianji"], "banji": userJson["banji"], "xueshengxingming": userJson["xueshengxingming"], "xuehao": userJson["xuehao"], "mima": md5_encrypt(userJson["mima"]), "chengji": userJson["chengji"], "zuobiqingkuang": userJson["zuobiqingkuang"], "kaoshileixing": userJson["kaoshileixing"], "kaoshikemu": userJson["kaoshikemu"], "kaoshishijianduan": userJson["kaoshishijianduan"], "kaoshilianjie": "/student/" + str(_id), # 需要自动生成一个链接 "isAdmin": 0, "isExit": 1, "chuangjianshijian": time.strftime( "%Y-%m-%d %H:%M:%S", time.localtime(time.time()) ), "gengxinshijian": time.strftime( "%Y-%m-%d %H:%M:%S", time.localtime(time.time()) ), } collection.insert_one(userItem) return "新增成功" # 查询用户 @app.route("/getUser", methods=["post"]) def query_data(): resData = request.data # 检测是否有数据 if not resData: return {"code": 200, "msg": "请填写信息后登录", "list": [], "hasError": True} # 获取到POST过来的数据,转为json形式 userJson = json.loads(resData) admin = isAdmin(userJson["id"]) if admin: users = collection.find() serialized_data = [] for item in users: item["_id"] = str(item["_id"]) # 将ObjectId转换为字符串 serialized_data.append(item) return { "code": 200, "msg": "查询成功", "list": serialized_data, "hasError": False, } else: mongoId = ObjectId(userJson["id"]) userObj = collection.find_one({"_id": mongoId, "isExit": 1}) userObj["_id"] = str(userObj["_id"]) # 将ObjectId转换为字符串 return { "code": 200, "msg": "查询成功", "list": [userObj], "hasError": False, } # 更新用户 @app.route("/updateUser", methods=["post"]) def update_data(): resData = request.data # 检测是否有数据 if not resData: return {"code": 200, "msg": "无数据", "list": [], "hasError": True} # 获取到POST过来的数据,转为json形式 userJson = json.loads(resData) admin = isAdmin(userJson["id"]) if admin: userItem = { "xuexiaomingcheng": userJson["xuexiaomingcheng"], "xuexiaodaihao": userJson["xuexiaodaihao"], "zhuanyemingcheng": userJson["zhuanyemingcheng"], "zhuanyedaihao": userJson["zhuanyedaihao"], "nianji": userJson["nianji"], "banji": userJson["banji"], "xueshengxingming": userJson["xueshengxingming"], "xuehao": userJson["xuehao"], "chengji": userJson["chengji"], "zuobiqingkuang": userJson["zuobiqingkuang"], "kaoshileixing": userJson["kaoshileixing"], "kaoshikemu": userJson["kaoshikemu"], "kaoshishijianduan": userJson["kaoshishijianduan"], "gengxinshijian": time.strftime( "%Y-%m-%d %H:%M:%S", time.localtime(time.time()) ), } collection.update_one( {"_id": ObjectId(userJson["userid"])}, {"$set": userItem}, ) return "修改成功" # 删除用户 @app.route("/delUser", methods=["post"]) def delete_data(): resData = request.data # 检测是否有数据 if not resData: return {"code": 200, "msg": "无数据", "list": [], "hasError": True} # 获取到POST过来的数据,转为json形式 userJson = json.loads(resData) admin = isAdmin(userJson["id"]) if admin: serialized_data = [] for item in userJson["ids"]: serialized_data.append(ObjectId(item)) # 将ObjectId转换为字符串 collection.delete_many({"_id": {"$in": serialized_data}}) return "删除成功" # 修改密码 @app.route("/updatePassword", methods=["post"]) def updatePassword(): resData = request.data # 检测是否有数据 if not resData: return {"code": 200, "msg": "无数据", "list": [], "hasError": True} # 获取到POST过来的数据,转为json形式 userJson = json.loads(resData) admin = isAdmin(userJson["id"]) if admin: collection.update_one( {"_id": ObjectId(userJson["userid"])}, { "$set": {"mima": md5_encrypt(userJson["mima"])}, }, ) return {"code": 200, "msg": "修改成功", "list": [], "hasError": False} if __name__ == "__main__": initData() # app.run(debug=True) socketio.run(app, debug=True)