From 3eb3d3e5a85c3616a57f016c9ca9fc622e8ef95a Mon Sep 17 00:00:00 2001
From: lichong <18518571399@163.com>
Date: Fri, 5 Jul 2024 13:44:26 +0800
Subject: [PATCH] 134
---
api/main.py | 163 ++++++++++++++++++++++++++++---
front/package.json | 5 +-
front/src/api/login.js | 11 ---
front/src/api/user.js | 20 +++-
front/src/router/index.js | 20 ++--
front/src/views/login.vue | 24 ++---
front/src/views/user.vue | 200 +++++++++++++++++++++++++-------------
front/vite.config.js | 2 +-
8 files changed, 322 insertions(+), 123 deletions(-)
delete mode 100644 front/src/api/login.js
diff --git a/api/main.py b/api/main.py
index 71c028d..025d508 100644
--- a/api/main.py
+++ b/api/main.py
@@ -1,18 +1,122 @@
-from flask import Flask
+from flask import Flask, request, jsonify
from pymongo import MongoClient
+from bson import ObjectId
+import hashlib
+import json
+from flask import Flask, render_template, request
+from flask_socketio import SocketIO, Namespace, emit
app = Flask(__name__)
client = MongoClient("mongodb://localhost:27019/")
db = client["back"]
collection = db["users"]
+# sockitIo
+socketio = SocketIO()
+# 解决跨域问题
+socketio.init_app(app, cors_allowed_origins="*")
+# 用来存放客户端的 sid,即 session id
+# 可以不单独定义字典存放 sid与namespace,flask-socketio 默认将 sid 存放在 room 中
+socket_pool = {}
+
+
+# Websocket 通过namespace 和 sid 标识具体客户端
+# 第一个 Websocket 类
+class MyCustomNamespace(Namespace):
+ name_space = "/msg"
+
+ # 连接成功调用的方法
+ def on_connect(self):
+ global socket_pool
+
+ print("connect..")
+ print("-----------------")
+ print(self.server.manager)
+ print(self.socketio)
+ print("-----------------")
+ print(request.namespace)
+ socket_pool[request.sid] = self.name_space
+ print(socket_pool)
+
+ # 断开连接调用的方法
+ def on_disconnect(self):
+ global socket_pool
+ print("disconnect...")
+ del socket_pool[request.sid]
+ print(socket_pool)
+
+ # 往 接收客户端标消息识为 'message' 的方法
+ def on_message(self, data):
+ print(data)
+ # 把消息发送到客户端的 'response' 标识的方法中, 一般是 on_response()
+ emit("response", "123", to=request.sid)
+ print("--------------")
+ print(request.sid)
+ print("--------------")
+ print(socketio.server.manager.rooms)
+
+ # 往 接收客户端标消息识为 'hello' 的方法
+ def on_hello(self, data):
+ print("hello world")
+
+ # 发送消息
+ def send(self, data):
+ # 向 namespace中的所有 Websocket 连接广播消息, namespace参数不能少, to缺省是广播模式
+ emit("response", data, namespace=self.name_space)
+ # 向 sid 所标识的客户端 单播
+ emit("response", data, namespace=self.name_space, to=request.sid)
+
+
+# 为了详细展示不同类,这里就不做继承
+# 第二个 Websocket 类
+class MyCustomNamespace1(Namespace):
+ name_space = "/vedio"
+
+ def on_connect(self):
+ global socket_pool
+
+ print("connect..")
+ print(request.namespace)
+ socket_pool[request.sid] = self.name_space
+ print(socket_pool)
+
+ def on_disconnect(self):
+ global socket_pool
+ print("disconnect...")
+ del socket_pool[request.sid]
+ print(socket_pool)
+
+ def on_message(self, data):
+ print(data)
+ emit("response", "123")
+ self.send("asd")
+
+ # 发送消息
+ def send(self, data):
+ emit("response", data, namespace=self.name_space)
+
+
+@app.route("/sendMsg")
+def sendMsg():
+ for sid, namespace_value in socket_pool.items():
+ print(sid)
+ emit("response", "123456", namespace=namespace_value, to=sid)
+ print("ok")
+ return "ok"
+
+
+# md5加密
+def md5_encrypt(data):
+ md5 = hashlib.md5()
+ md5.update(data.encode("utf-8"))
+ return md5.hexdigest()
# 初始化数据
def initData():
- isAdmin = collection.find_one({"isAdmin": 1, "isExit": 1})
- if isAdmin is None:
- # 学校名称、学校代号、专业名称、专业代号、年级、班级、学生姓名、学号、成绩、作弊情况(作弊类型、作弊时间、作弊图片)、考试类型、考试科目、考试时间段、是否是管理员、是否删除、创建时间、更新时间
- # xuexiaomingcheng、xuexiaodaihao、zhuanyemingcheng、zhuanyedaihao、nianji、banji、xueshengxingming、xuehao、chengji、zuobiqingkuang(zuobileixing、zuobishijian、zuobitupian)、kaoshileixing、kaoshikemu、kaoshishijianduan、isAdmin、isExit、chuangjianshijian、gengxinshijian
+ 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、isAdmin、isExit、chuangjianshijian、gengxinshijian
user = {
"xuexiaomingcheng": "",
"xuexiaodaihao": "",
@@ -22,6 +126,7 @@ def initData():
"banji": "",
"xueshengxingming": "老师",
"xuehao": "0000",
+ "mima": md5_encrypt("0000"),
"chengji": "",
"zuobiqingkuang": [],
"kaoshileixing": "",
@@ -33,18 +138,46 @@ def initData():
"gengxinshijian": "",
}
collection.insert_one(user)
+ print("管理账号'老师'已被初始化新建")
else:
- print(888, isAdmin)
+ 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("/")
-def hello():
- return "Hello World!"
+# 用户登录
+@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("/insert")
+@app.route("/addUser", methods=["post"])
def insert_data():
user = {"name": "John Doe", "age": 25, "city": "New York"}
collection.insert_one(user)
@@ -52,7 +185,7 @@ def insert_data():
# 查询用户
-@app.route("/query")
+@app.route("/getUser", methods=["post"])
def query_data():
users = collection.find()
result = ""
@@ -62,7 +195,7 @@ def query_data():
# 更新用户
-@app.route("/update")
+@app.route("/updateUser", methods=["post"])
def update_data():
query = {"name": "John Doe"}
new_data = {"$set": {"age": 30, "city": "San Francisco"}}
@@ -71,7 +204,7 @@ def update_data():
# 删除用户
-@app.route("/delete")
+@app.route("/delUser", methods=["post"])
def delete_data():
query = {"name": "John Doe"}
collection.delete_one(query)
@@ -80,4 +213,4 @@ def delete_data():
if __name__ == "__main__":
initData()
- app.run()
+ app.run(debug=True)
diff --git a/front/package.json b/front/package.json
index 683778c..af979b0 100644
--- a/front/package.json
+++ b/front/package.json
@@ -5,8 +5,7 @@
"type": "module",
"scripts": {
"dev": "vite",
- "build": "vite build",
- "preview": "vite preview"
+ "build": "vite build"
},
"dependencies": {
"@element-plus/icons-vue": "^2.3.1",
@@ -27,4 +26,4 @@
"@vitejs/plugin-vue": "^4.6.2",
"vite": "^5.0.8"
}
-}
+}
\ No newline at end of file
diff --git a/front/src/api/login.js b/front/src/api/login.js
deleted file mode 100644
index a3cc359..0000000
--- a/front/src/api/login.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import _axios from "@/plugins/axios";
-
-//登录、注册
-export function loginFun(data) {
- return _axios({
- url: `/v1/login`,
- method: "POST",
- data,
- });
-}
-
diff --git a/front/src/api/user.js b/front/src/api/user.js
index efaf90c..bec74b0 100644
--- a/front/src/api/user.js
+++ b/front/src/api/user.js
@@ -1,11 +1,21 @@
import _axios from "@/plugins/axios";
+//登录、注册
+export function loginFun(data) {
+ return _axios({
+ url: `/v1/userLogin`,
+ method: "POST",
+ data: { ...data },
+ });
+}
+
+
//增加用户
export function addUser(data) {
return _axios({
url: `/v1/addUser`,
method: "POST",
- data,
+ data: { ...data, id: localStorage.getItem("userId") },
});
}
@@ -14,15 +24,15 @@ export function delUser(data) {
return _axios({
url: `/v1/delUser`,
method: "POST",
- data,
+ data: { ...data, id: localStorage.getItem("userId") },
});
}
//修改用户
-export function getUser(data) {
+export function updateUser(data) {
return _axios({
url: `/v1/updateUser`,
method: "POST",
- data,
+ data: { ...data, id: localStorage.getItem("userId") },
});
}
//查找用户
@@ -30,7 +40,7 @@ export function getUser(data) {
return _axios({
url: `/v1/getUser`,
method: "POST",
- data,
+ data: { ...data, id: localStorage.getItem("userId") },
});
}
diff --git a/front/src/router/index.js b/front/src/router/index.js
index a5368a3..1a540c8 100644
--- a/front/src/router/index.js
+++ b/front/src/router/index.js
@@ -6,24 +6,20 @@ const routes = [
path: "/",
name: "home",
component: home,
- redirect: "/bug",
- children: [{
- path: "bug",
- name: "bug",
- component: () => import("../views/bug.vue"),
- },
- {
- path: "user",
- name: "user",
- component: () => import("../views/user.vue"),
- },]
+ redirect: "/user",
+ children: [
+ {
+ path: "user",
+ name: "user",
+ component: () => import("../views/user.vue"),
+ },]
},
{
path: "/login",
name: "login",
component: () => import("../views/login.vue"),
},
- { name: "重定向", path: "/:catchAll(.*)", redirect: "/bug" },
+ { name: "重定向", path: "/:catchAll(.*)", redirect: "/login" },
];
// 创建路由实例
diff --git a/front/src/views/login.vue b/front/src/views/login.vue
index 1895e80..79d377e 100644
--- a/front/src/views/login.vue
+++ b/front/src/views/login.vue
@@ -7,18 +7,19 @@
登录
-
+
-
+
-
+
@@ -40,7 +41,7 @@