This commit is contained in:
30404 2024-07-03 14:08:43 +08:00
parent c1dc6dc9f7
commit 3219a1ac95
17 changed files with 254 additions and 151 deletions

View File

@ -62,3 +62,7 @@
margin-top: -12px;
color: #525252;
}
#TF{
position: absolute;
margin-left: 1200px;
}

View File

@ -9,6 +9,7 @@ import axios from 'axios';
//
function Marking(){
const teacher_ID=localStorage.getItem('islogin')
const currentTime = new Date().toLocaleString()
if(teacher_ID==null){
alert('登录过期,请重新登录')
window.location.href='http://36.138.114.105:30294/'
@ -59,10 +60,6 @@ function Marking(){
const ClassChange=(event)=>{
setClassID(event.target.value)
}
const click=()=>{
console.log(ClassID);
console.log(MarkData);
}
return(
<div className='body-right-mark'>
@ -80,13 +77,13 @@ function Marking(){
<img src={Test} alt="" width='35px' height='35px'/>
<p>
<p className='p-mark'><span>实训ID:{MarkData[key][0][10]}</span>{eval(MarkData[key][0][11])}</p>
<span>{MarkData[key][0][6]}</span><span></span>
<div id='TF'>{MarkData[key][0][6]>currentTime?'未开始':''}</div>
<span>{MarkData[key][0][6]}</span>
</p>
</li>
</Link>
))}
</ul>
<button onClick={click}>asda</button>
</div>}
</div>
)

View File

@ -9,8 +9,22 @@ function StudentLink(){
const testID=useParams()['key']
const sumbitScore=async()=>{
try{
const sumbitScoreSrc=await axios.post('/api/teacher/UpdateTest',{
score,
testID
})
}catch{
alert('提交出错')
}
}
const submit=()=>{
console.log(TestLink);
console.log('a');
sumbitScore()
alert('批改成功')
window.location.href='http://localhost:3000/teacher/mark'
}
const [TestLink,setTestLink]=useState()
@ -28,6 +42,15 @@ function StudentLink(){
NotMarkTestFunc()
},[])
const [score,setscore]=useState([])
const handleInputChange = (event) => {
const { name, value } = event.target;
setscore({
...score,
[name]: value
});
}
return(
<div className='body-right-studentlink'>
<table>
@ -42,8 +65,8 @@ function StudentLink(){
{Object.keys(TestLink).map((key)=>(
<tr key={key}>
<td>{key}</td>
<td><Link to={TestLink[key][6]}>{TestLink[key][6]}</Link></td>
<td><input type="text" name="" id="" /></td>
<td><Link to={TestLink[key][6]} target="_blank">{TestLink[key][6]}</Link></td>
<td><input type="text" onChange={handleInputChange} name={TestLink[key][0]}/></td>
</tr>
))}
</tbody>}

View File

@ -5,11 +5,11 @@ import { useLocation } from 'react-router-dom';
import io, { Socket } from "socket.io-client";
export default function WebSSH({ ip = "10.233.183.99", port = "22", password = "123456", user = "dmdba" }) {
export default function Test({ ip = "10.106.152.68", port = "22", password = "123456", user = "dmdba" }) {
const location = useLocation();
const terminalObj = useRef<HTMLDivElement | null>(null);
const [terminal, setTerminal] = useState<Terminal | null>(null);
const [socket, setSocket] = useState<Socket | null>(null);
const terminalObj = useRef(null);
const [terminal, setTerminal] = useState(null);
const [socket, setSocket] = useState(null);
useEffect(() => {
if (terminal === null) {
@ -19,7 +19,7 @@ export default function WebSSH({ ip = "10.233.183.99", port = "22", password = "
useEffect(() => {
if (terminal !== null) {
terminal.open(terminalObj.current as HTMLDivElement);
terminal.open(terminalObj.current);
const newSocket = io("ws://36.138.114.105:32087");
setSocket(newSocket);
@ -38,7 +38,7 @@ export default function WebSSH({ ip = "10.233.183.99", port = "22", password = "
newSocket.emit("heartbeat");
}, 1000);
newSocket.on("output", (data: string) => {
newSocket.on("output", (data) => {
terminal.write(data);
});
@ -54,7 +54,7 @@ export default function WebSSH({ ip = "10.233.183.99", port = "22", password = "
}
}, [socket, ip, port, password, user]);
function pasteContent(event: React.MouseEvent) {
function pasteContent(event) {
navigator.clipboard.readText().then((content) => {
socket?.emit("input", content);
});

View File

@ -1,15 +1,33 @@
import axios from 'axios';
import './Trainmanage.css'
import { Link } from 'react-router-dom';
// import React, { useEffect, useState } from 'react';
import React, { useEffect, useState } from 'react';
// import axios from 'axios';
function TrainManage(){
const teacher_ID=localStorage.getItem('islogin')
const [Data,setData]=useState()
//
const getTrainfunc=async()=>{
try{
const getTrainSrc=await axios.post('/api/teacher/getTrain',{
teacher_ID,
})
setData(getTrainSrc.data['data'])
}catch{
alert('aaaa')
}
}
useEffect(()=>{
getTrainfunc()
},[])
return(
<div className='body-trainmanage'>
<p>已批改的试卷</p>
<div className='line'></div>
<div className='train-list-trainmanage'>
{Data&&<div className='train-list-trainmanage'>
<ul className='ul1-trainmanage'>
<li>
<span>111</span>
@ -31,7 +49,10 @@ function TrainManage(){
</li>
</ul>
<Link to='/teacher/SendTrain' className='sendtestpage'>前往发布实训</Link>
</div>
</div>}
<button onClick={()=>{
console.log(Data);
}}></button>
</div>
)
}

View File

@ -12,21 +12,11 @@ import { max, min } from 'lodash';
//
function Home(){
const [isChecked,setisChecked]=useState(false)
//
// useEffect(()=>{
// if (!isChecked){
// const is_login=localStorage.getItem('islogin')
// if(!is_login){
// alert('')
// window.location.href='/signin'
// }else{
// console.log(is_login);
// console.log('');
// setisChecked(true)
// }
// //login
// }
// },[]);//
const student_ID=localStorage.getItem('islogin')
if(student_ID==null){
window.location.href='http://localhost:3000/signin'
alert('未登录,请前往登录')
}
//
const [lesson, setLesson] = useState([]);

View File

@ -8,6 +8,7 @@ import moment from 'moment';
//
function SubjectPage(){
const student_ID=localStorage.getItem('islogin')
if(student_ID==null){
alert('登录过期,请重新登录')
window.location.href='http://36.138.114.105:30294/'
@ -33,11 +34,6 @@ function SubjectPage(){
test()
},[])
const click=()=>{
console.log(testdata);
console.log(FalseData);
console.log(NotFalse);
}
return(
<div className="body">
@ -68,7 +64,6 @@ function SubjectPage(){
</div>
))}
</div>
<button>更多历史</button>
{ NotFalse&& result&&<div className='test-subject'>
{Object.keys(NotFalse).map((key)=>{
return(

View File

@ -9,7 +9,7 @@ import arrowright from '../img/arrowright.jpg'
import bottom from '../img/bottom.jpg'
import top from '../img/top.jpg'
import axios from 'axios';
import Test from '../../../TeacherPages/TestManage/Test';
function Operation2() {
const student_ID=localStorage.getItem('islogin')
const { operateID } = useParams();
@ -32,8 +32,6 @@ function Operation2() {
}
//
const terminalObj = useRef(null);
let sock = null;
const [terminal, setTerminal] = useState(null);
useEffect(()=>{
@ -42,7 +40,6 @@ function Operation2() {
Train1()
setisTrue(true)
if (terminal == null){
setTerminal(new Terminal({
cols: 80,
@ -63,52 +60,6 @@ function Operation2() {
}
// useEffect(() => {
// if (terminal == null){
// setTerminal(new Terminal({
// cols: 80,
// rows: 27,
// fontSize: 23
// }));
// }
// }, [])
// useEffect(() => {
// if (terminal != null){
// terminal.open(terminalObj.current );
// // sock = new WebSocket("ws://192.168.0.40:8765");
// sock = new WebSocket(Src);
// terminal.onData((data) => {
// sock?.send(data);
// });
// terminal.onSelectionChange((a, b) => {
// if (terminal.hasSelection()){
// navigator.clipboard.writeText(terminal.getSelection());
// }
// })
// setInterval(() => {
// sock?.send("heartbeat");
// }, 1000);
// sock.addEventListener("message", function (event) {
// console.log(event.data);
// terminal.write(event.data);
// });
// }
// }, [terminal])
function pasteContent(event) {
navigator.clipboard.readText().then((content) =>{
sock?.send(content);
})
event.preventDefault();
}
//
const DEL=()=>{
//
}
//
// const { OperationId } = useParams();
const [countdown, setCountdown] = useState(0);
@ -203,7 +154,9 @@ function Operation2() {
{ isTrue&&TrainData&&
<div>
<p>{TrainData['operateID'][3][0]}</p>
<div style={{width: "1430px",position:'absolute',right:'0'}} ref={terminalObj} onContextMenu={pasteContent}></div>
<Test/>
<div className=''><button>检测</button></div>
</div>}
{/* 达梦数据库连接⬆ */}

View File

@ -26,11 +26,7 @@ import Marking from '../TeacherPages/MarkingPages/Marking';
import SendTrain from '../TeacherPages/Trainmanage/SendTrain'
import TrainManage from '../TeacherPages/Trainmanage/Trainmanage'
import StudentLink from '../TeacherPages/MarkingPages/StudentLink';
import Test from '../TeacherPages/TestManage/Test.tsx'
import SendTrain from '../TeacherPages/Trainmanage/SendTrain';
import TrainManage from '../TeacherPages/Trainmanage/Trainmanage';
import Test from '../TeacherPages/TestManage/Test';
// (exam)使
const MainLayout = ({ headerNav:HeaderNav }) => {
return (

View File

@ -4,7 +4,7 @@ module.exports = function(app) {
app.use(
'/api', // 如果请求路径匹配'/api',则进行代理
createProxyMiddleware({
target: 'http://127.0.0.1:5000', // 目标后端服务地址
target: 'http://36.138.114.105:32087/', // 目标后端服务地址
changeOrigin: true,
})
);

View File

@ -12,6 +12,8 @@ from flask import Flask, render_template, request, jsonify, send_from_directory,
from flask_cors import CORS
from flask_socketio import SocketIO, emit, disconnect
import logging
import os
print(os.getcwd())
logging.basicConfig(level=logging.DEBUG)
app = Flask(__name__, static_folder="public")
CORS(app)
@ -257,11 +259,14 @@ def SendTrainTest():
TrainJudge=data['TrainJudge']
Hour=data['HourValue']
Min=data['MinValue']
StopTime=data['StopTime']
startTime=convert_iso_to_database_format(data['startDate'])
endTime=convert_iso_to_database_format(data['endDate'])
Class=data['selectedItems']
Train=data['Train']
teacher_id=data['teacher_ID']
SendTrainTestFunc(TrainChoice, TrainCompletion, TrainJudge, Hour, Min, StopTime,Class,Train,teacher_id)
SendTrainTestFunc(TrainChoice, TrainCompletion, TrainJudge, Hour, Min,Class,Train,teacher_id,startTime,endTime)
SendLink()
TeacherMark(Class, teacher_id)
return '发布成功'
@ -272,20 +277,44 @@ def Find_details():
result=Find_details_Func(ID)
print(result)
return jsonify({'TestScore':result})
@app.route('/api/teacher/NotMarkTest',methods=["POST"])
def NotMarkTest():
testID=request.json['testID']
result=NotMarkTestFunc(testID)
return jsonify({'result':result})
@app.route('/api/teacher/UpdateTest',methods=["POST"])
def UpdateTest():
testID=request.json['testID']
score=request.json['score']
submitScoreFunc(score,testID)
print('修改成功')
return '修改成功'
@app.route('/api/teacher/getTrain',methods=["POST"])
def GetTrain():
teacherID=request.json['teacher_ID']
data=getTrainFunc(teacherID)
return jsonify({'data':data})
@app.route("/api/teacher/list_pods") # 列出pod
def teacher_list_pods():
return list_pods()
return jsonify(list_pods())
@app.route("/api/teacher/list_services") # 列出服务
def teacher_list_services():
return list_services()
@app.route("/api/teacher/create_pod") # 创建服务 0为项目实训 1为安装实训
@app.route("/api/teacher/create_pod") # 创建服务 1为项目实训 0为安装实训
def teacher_create_pod():
return create_pod(1, "test")
create_pod(1, "test2")
@app.route("/api/teacher/delete_pod") # 删除服务
def teacher_delete_pod():
return delete_pod("test")
return delete_pod("test2")
@app.route("/api/teacher/check_pod") # 检测数据库是否安装成功 若成功返回OK 否则返回NO
def teacher_check_pod():

View File

@ -17,8 +17,8 @@ spec:
runAsGroup: 0
resources:
limits:
cpu: '1'
memory: 1Gi
cpu: '0.2'
memory: 0.3Gi
requests:
cpu: '0.25'
memory: 0.5Gi
cpu: '0.1'
memory: 0.2Gi

View File

@ -15,8 +15,8 @@ spec:
runAsGroup: 0
resources:
limits:
cpu: '1'
memory: 1Gi
cpu: '0.2'
memory: 0.3Gi
requests:
cpu: '0.25'
memory: 0.5Gi
cpu: '0.1'
memory: 0.2Gi

6
python/del.py Normal file
View File

@ -0,0 +1,6 @@
import k8s_func
studentList=['s20240103-44']
for i in studentList:
k8s_func.delete_pod(i)
print("delete")

View File

@ -6,25 +6,29 @@ from kubernetes import client, config
from flask import jsonify
import dmPython
# Load in-cluster config
config.load_incluster_config()
v1 = client.CoreV1Api()
namespace = open("/var/run/secrets/kubernetes.io/serviceaccount/namespace").read()
IP = "36.138.114.105"
def list_pods():
ret = v1.list_namespaced_pod(namespace, watch=False)
return {
return ({
"list": [{
"name": item.metadata.name,
"ip": item.status.pod_ip
} for item in ret.items]
}
})
def list_services():
ret = v1.list_namespaced_service(namespace)
return {
"list": [
item.to_dict()
for item in ret.items]
"list": [{
"ip": item.spec.cluster_ip,
"name": item.metadata.name,
"ports": [port.to_dict() for port in item.spec.ports]
} for item in ret.items]
}
def create_pod(type, name):
@ -38,7 +42,7 @@ def create_pod(type, name):
body=pod_manifest,
namespace=namespace
)
print(f"pod '{resp.metadata.name}' 创建成功")
# print(f"pod '{resp.metadata.name}' 创建成功")
# 创建 Service
with open(f"assets/type{type}-service.yaml") as f:
service_pod = yaml.safe_load(f)
@ -49,20 +53,23 @@ def create_pod(type, name):
body=service_pod,
namespace=namespace
)
print(f"服务 '{resp.metadata.name}' 创建成功")
# print(f"服务 '{resp.metadata.name}' 创建成功")
if type == 1:
# 创建成功,再次查询,拿到端口
service = v1.read_namespaced_service(name=name + "-service", namespace=namespace)
print(service)
print("访问地址:" + IP + ":" + str(service.spec.ports[0].node_port))
# print(service)
# print("访问地址:" + IP + ":" + str(service.spec.ports[0].node_port))
else:
service = v1.read_namespaced_service(name=name + "-service", namespace=namespace)
print(service)
print("访问地址:" + IP + ":" + str(service.spec.ports[0].node_port))
return f"{IP} {service.spec.ports[0].node_port}"
# print(service)
# print("访问地址:" + IP + ":" + str(service.spec.ports[0].node_port))
return "cjcg"
# create_pod(0,'20240101-zt-9-0')
def delete_pod(name):
v1.delete_namespaced_pod(name=name, namespace=namespace)
print('deleting pod ' + name)
v1.delete_namespaced_service(name=name + "-service", namespace=namespace)
return "删除成功"

View File

@ -4,10 +4,18 @@ from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
import base64
import datetime
import k8s_func
db = dmPython.connect(user='SYSDBA', password='dameng!!', host="36.138.114.105", port="32522")
def convert_iso_to_database_format(iso_datetime_str):
# 解析 ISO 8601 格式的日期时间字符串为 datetime 对象
iso_datetime = datetime.datetime.fromisoformat(iso_datetime_str.replace('Z', '+00:00'))
# 格式化为数据库需要的日期时间格式
formatted_datetime_str = iso_datetime.strftime('%Y-%m-%d %H:%M:%S')
return formatted_datetime_str
#获取题目
def choice_question_func(ID):
@ -223,6 +231,7 @@ def train_question():
testID=None
TrainName=""
studentList=[]
# train_question()
def SendTrainTestFunc(TrainChoice,TrainCompletion,TrainJudge,Hour,Min,Class,Train,teacher_id,startTime,endTime):
TrainChoice = json.dumps(TrainChoice)
@ -232,7 +241,6 @@ def SendTrainTestFunc(TrainChoice,TrainCompletion,TrainJudge,Hour,Min,Class,Trai
Train=json.dumps(Train)
global TrainName
TrainName=Train
cursor = db.cursor()
cursor.execute(f'INSERT INTO TRAINTEST (CHOICE,COMPLE,JUDGE,HOUR,MIN,RELEASETIME,STOPTIME,CLASS,SUBJECT,TEACHER_ID,Train) VALUES'
f'(?,?,?,?,?,?,?,?,?,?,?)',(TrainChoice,TrainCompletion,TrainJudge,Hour,Min,startTime,endTime,Class,'Train',teacher_id,Train))
@ -249,20 +257,11 @@ def SendTrainTestFunc(TrainChoice,TrainCompletion,TrainJudge,Hour,Min,Class,Trai
end = 'false'
# 将试卷分配到每一个学生
zero='https://www.baidu.com/'
one='https://www.douyin.com/'
global studentList
studentList=student_list
for i in student_list:
if Train=='达梦数据库连接':
cursor.execute("INSERT INTO TrainScore (STUDENT_ID,CLASS,TEST_ID,TF,LINK) VALUES (?,?,?,?,?)",
(i, i[0:6], test_id, end,zero))
else:
cursor.execute("INSERT INTO TrainScore (STUDENT_ID,CLASS,TEST_ID,TF,LINK) VALUES (?,?,?,?,?)",
(i, i[0:6], test_id, end,one))
# 发布实训的时候根据实训不同给予不同链接
cursor.execute(f"SELECT ID FROM TRAINTEST WHERE RELEASETIME=? ", (now_time))
cursor.execute(f"SELECT ID FROM TRAINTEST WHERE RELEASETIME=? ", (startTime))
test_id = cursor.fetchall()[0][0]
global testID
testID=test_id
@ -272,6 +271,50 @@ def SendTrainTestFunc(TrainChoice,TrainCompletion,TrainJudge,Hour,Min,Class,Trai
return '发布成功'
num=5
def SendLink():
global TrainName
global studentList
global testID
cursor = db.cursor()
print('进入到函数')
if TrainName.find(r'["\u524d\u7aef\u4e0e\u6570\u636e\u5e93\u7ed3\u5408"]') != -1:
print('s')
for i in studentList:
print(i)
name ='s'+str(i)+'-'+str(testID)
k8s_func.create_pod(1, name)
item = k8s_func.list_services()
for j in item['list']:
if j['name'] == name + '-service':
Link = 'http://36.138.114.105/' + str(j['ports'][0]['node_port'])
Link2 = 'http://36.138.114.105/' + str(j['ports'][1]['node_port'])
Link3 = 'http://36.138.114.105/' + str(j['ports'][2]['node_port'])
cursor.execute(f"INSERT INTO TRAINSCORE VALUES (?,?,?,?,?,?,?,?,?)",(
i,i[0:6],testID,'false','NULL','NULL',Link,Link2,Link3
))
else:
pass
else:
for i in studentList:
name = 'n' + str(i) + '-' + str(testID)
k8s_func.create_pod(0,name)
item = k8s_func.list_services()
for j in item['list']:
if j['name'] == name + '-service':
Link = j['ip']
cursor.execute(f"INSERT INTO TRAINSCORE VALUES (?,?,?,?,?,?,?,?,?)", (
i, i[0:6], testID, 'false', 'NULL', 'NULL', Link, 'NULL', 'NULL'
))
print('加入链接成功')
db.commit()
cursor.close()
def TeacherMark(CLASS,ID):
global testID
global TrainName
@ -280,20 +323,11 @@ def TeacherMark(CLASS,ID):
if TrainName.find(r'["\u524d\u7aef\u4e0e\u6570\u636e\u5e93\u7ed3\u5408"]') != -1:
for i in eval(strClass):
cursor.execute(f'INSERT INTO TEACHERMARK VALUES(?,?,?,?) ', (ID,testID,'false', i))
else:
print(TrainName)
db.commit()
cursor.close()
# def Find_dic(dic):
# # 获取字典的键,并按照从大到小的顺序排序
# keys_sorted = sorted(dic.keys(), reverse=True)
#
# # 取最后三个键
# last_three_keys = keys_sorted[:3]
#
# # 创建一个新的字典,仅包含排序后的最后三个键及其对应的值
# dic_last_three = {key: dic[key] for key in last_three_keys}
#
# return dic_last_three # 返回一个新字典,该字典仅包含排序后的最后三个键及其对应的值
def Find_details_Func(ID):
@ -324,7 +358,7 @@ def MarkTrainFunc(ClassID,teacher_ID):
# MarkTrainFunc('202401','111111')
def NotMarkTest(testID):
def NotMarkTestFunc(testID):
cursor = db.cursor()
dic={}
cursor.execute(f'SELECT * FROM TRAINSCORE WHERE TEST_ID=?',(testID))
@ -334,5 +368,23 @@ def NotMarkTest(testID):
return dic
NotMarkTest('9')
# NotMarkTest('9')
def submitScoreFunc(score,testID):
cursor = db.cursor()
for i in score:
cursor.execute(f'UPDATE TRAINSCORE SET TRAINRESULT=? WHERE TEST_ID=? AND STUDENT_ID=?', (score[i], testID,i))
cursor.execute(f'UPDATE TEACHERMARK SET TF=? WHERE TRAINID=?',('true',testID))
db.commit()
return 'SELECT'
# score= {'20240101':'123','20240102':'132','20240103':'321'}
# submitScoreFunc(score,'9')
def getTrainFunc(teacherID):
cursor = db.cursor()
cursor.execute(f'SELECT * FROM TRAINTEST WHERE TEACHER_ID=?',(teacherID))
data = cursor.fetchall()
return data

30
python/test.py Normal file
View File

@ -0,0 +1,30 @@
import json
import dmPython
import k8s_func
db = dmPython.connect(user='SYSDBA', password='dameng!!', host="36.138.114.105", port="32522")
cursor=db.cursor()
studentList=['20240101','20240102']
testID='5'
type1=2
for i in studentList:
if type1==1:
name='s'+i+'-'+testID
# k8s_func.create_pod(type1,name)
item=k8s_func.list_services()
for j in item['list']:
if j['name']==name+'-service':
Link = 'http://36.138.114.105/' + str(j['ports'][0]['node_port'])
Link2 = 'http://36.138.114.105/' + str(j['ports'][1]['node_port'])
Link3 = 'http://36.138.114.105/' + str(j['ports'][2]['node_port'])
else:
name='n'+i+'-'+testID
# k8s_func.create_pod(0,name)
item=k8s_func.list_services()
for j in item['list']:
if j['name']==name+'-service':
Link=j['ip']
print(Link)