diff --git a/app-dm/src/TeacherPages/MarkingPages/StudentLink.jsx b/app-dm/src/TeacherPages/MarkingPages/StudentLink.jsx index 892cf5c..bbe8a2e 100644 --- a/app-dm/src/TeacherPages/MarkingPages/StudentLink.jsx +++ b/app-dm/src/TeacherPages/MarkingPages/StudentLink.jsx @@ -7,6 +7,7 @@ import axios from 'axios'; function StudentLink(){ const testID=useParams()['key'] + const [list,setlist]=useState([]) const sumbitScore=async()=>{ try{ @@ -15,6 +16,10 @@ function StudentLink(){ testID, suggestion }) + const delPods=await axios.post('/api/teacher/MarkDelPods',{ + testID, + list + }) }catch{ alert('提交出错') } @@ -33,6 +38,7 @@ function StudentLink(){ testID }) setTestLink(NotMarkTestSrc.data['result']) + setlist(Object.keys(NotMarkTestSrc.data['result']).map(key => NotMarkTestSrc.data['result'][key][0])) }catch{ alert('出错') } @@ -58,6 +64,7 @@ function StudentLink(){ [name]: value }); } + return(
diff --git a/app-dm/src/TeacherPages/TestManage/Test.jsx b/app-dm/src/TeacherPages/TestManage/Test.jsx index bf6ed27..3860368 100644 --- a/app-dm/src/TeacherPages/TestManage/Test.jsx +++ b/app-dm/src/TeacherPages/TestManage/Test.jsx @@ -21,7 +21,7 @@ export default function Test({ ip = "", port = "22", password = "123456", user = if (terminal !== null) { terminal.open(terminalObj.current); - const newSocket = io("ws://36.138.114.105:31055"); + const newSocket = io("ws:///"); setSocket(newSocket); terminal.onData((data) => { diff --git a/app-dm/src/pages/ListPages/Analyse/AnalysePages.jsx b/app-dm/src/pages/ListPages/Analyse/AnalysePages.jsx index 4f1dc36..d031a44 100644 --- a/app-dm/src/pages/ListPages/Analyse/AnalysePages.jsx +++ b/app-dm/src/pages/ListPages/Analyse/AnalysePages.jsx @@ -34,7 +34,7 @@ function SubjectPage(){ datasets: [ { label: '得分情况分布', - data: [HistoryTrain[key][0][4],HistoryTrain[key][0][5]], // 这里填写每个类型题目的数量 + data: [HistoryTrain[key][0][5],HistoryTrain[key][0][4]], // 这里填写每个类型题目的数量 backgroundColor: ['#FF6384','#36A2EB'], // 颜色 hoverOffset: 2, }, @@ -103,7 +103,7 @@ function SubjectPage(){
}
diff --git a/app-dm/src/pages/ListPages/Training/Operation1.jsx b/app-dm/src/pages/ListPages/Training/Operation1.jsx index 65b3782..3830753 100644 --- a/app-dm/src/pages/ListPages/Training/Operation1.jsx +++ b/app-dm/src/pages/ListPages/Training/Operation1.jsx @@ -146,7 +146,7 @@ function Operation1() { localStorage.setItem('answeredJudge',answeredJudge) localStorage.setItem('TrainData',JSON.stringify(TrainData)) localStorage.setItem('score',score) - localStorage.setItem('succeed',succeed) + localStorage.setItem('succeed',JSON.stringify(succeed)) }; @@ -196,9 +196,7 @@ function Operation1() { setscore(prevscore=>prevscore+5) }else{ const itemText = item[0][9]; - if (!succeed.includes(itemText)) { setsucceed((prevSucceed) => [...prevSucceed, itemText]); - } } CHO_sum++ } @@ -206,10 +204,8 @@ function Operation1() { if (item[0][2]===completion_answer[COM_sum]) { setscore(prevscore=>prevscore+5) }else{ - const itemText = item[0][5]; - if (!succeed.includes(itemText)) { + const itemText = item[0][9]; setsucceed((prevSucceed) => [...prevSucceed, itemText]); - } } COM_sum++ } @@ -217,10 +213,8 @@ function Operation1() { if (item[0][2]===judge_answer[JUD_sum]) { setscore(prevscore=>prevscore+5) }else{ - const itemText = item[0][5]; - if (!succeed.includes(itemText)) { + const itemText = item[0][9]; setsucceed((prevSucceed) => [...prevSucceed, itemText]); - } } JUD_sum++ } @@ -275,7 +269,7 @@ function Operation1() { )} -
  • 实训题
  • +
  • 实训题
  • {/* 题目预览框 */} diff --git a/app-dm/src/pages/ListPages/Training/Operation2.jsx b/app-dm/src/pages/ListPages/Training/Operation2.jsx index 5fcbb3c..948deea 100644 --- a/app-dm/src/pages/ListPages/Training/Operation2.jsx +++ b/app-dm/src/pages/ListPages/Training/Operation2.jsx @@ -15,9 +15,10 @@ function Operation2() { const score=localStorage.getItem('score') const { operateID } = useParams(); const [isTrue,setisTrue]=useState(false) - const [TrainScore,setTrainScore]=useState() + const [TrainScore,setTrainScore]=useState(null) const succeed=localStorage.getItem('succeed') const TrainData=JSON.parse(localStorage.getItem('TrainData')) + const subject=(TrainData['operateID'][3]) // 获取链接 const [Src,setSrc]=useState() @@ -99,7 +100,8 @@ function Operation2() { TrainScore, operateID, student_ID, - succeed + succeed, + subject }) }catch{ alert('submitTrainSrc出错') @@ -118,9 +120,9 @@ function Operation2() { localStorage.removeItem('answeredJudge') localStorage.removeItem('RemainingTime') localStorage.removeItem('score') + localStorage.removeItem('succeed') alert('提交成功') window.location.href='/train' - localStorage.removeItem('TrainData') } // 检测按钮 @@ -175,15 +177,23 @@ function Operation2() {
    {/* 前端连接数据库⬇ */} { !isTrue&&TrainData&&Src&&
    -

    题目:{TrainData['operateID'][3][0]}

    - {Src[6]} +

    题目:{TrainData['operateID'][3][0]}

    + 点击此链接进入到ide编辑代码:
    - {Src[7]} + {Src[6]}
    - {Src[8]}
    -

    点击以上链接前往实训

    + 5000端口映射到: +
    + {Src[7]} +
    +
    + 3000端口映射到: +
    + {Src[8]} +
    + } {/* 前端连接数据库 ⬆*/} @@ -191,11 +201,10 @@ function Operation2() { { isTrue&&TrainData&&

    {TrainData['operateID'][3][0]}

    - {/* {Src&&} */} + {Src&&}
    } {/* 达梦数据库连接⬆ */} -

    上一页

    @@ -205,6 +214,7 @@ function Operation2() {

    完成

    + diff --git a/app-dm/src/pages/ListPages/Training/TrainingPage.jsx b/app-dm/src/pages/ListPages/Training/TrainingPage.jsx index 9283abc..4b8d3ad 100644 --- a/app-dm/src/pages/ListPages/Training/TrainingPage.jsx +++ b/app-dm/src/pages/ListPages/Training/TrainingPage.jsx @@ -7,7 +7,7 @@ import axios from 'axios'; const WarningModal = ({ isOpen, onClose }) => { // 添加一个状态来控制是否应用动画 const [isClosing, setIsClosing] = useState(false); - + localStorage.removeItem('TrainData') // 定义关闭警告框的函数 const handleClose = () => { setIsClosing(true); // 设置状态以触发动画 diff --git a/docker-compose.yml b/docker-compose.yml index 2401c83..3397c48 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -41,4 +41,5 @@ services: - '8443:8443' - '5000:5000' - '3000:3000' + command: service DmServiceDMTEST start && sleep 9999999999 diff --git a/docker/code-server/Dockerfile b/docker/code-server/Dockerfile index 9ffa20a..6e9521a 100644 --- a/docker/code-server/Dockerfile +++ b/docker/code-server/Dockerfile @@ -6,6 +6,7 @@ ENV DEBIAN_FRONTEND="noninteractive" WORKDIR /home/dmdba USER root + RUN apt-get update && apt-get install -y --no-install-recommends \ git jq libatomic1 net-tools netcat python3-pip curl sudo catatonit libssl-dev \ cron \ @@ -69,6 +70,12 @@ ADD --chmod=744 "https://raw.githubusercontent.com/linuxserver/docker-mods/mod-s ADD --chmod=744 "https://raw.githubusercontent.com/linuxserver/docker-mods/mod-scripts/package-install.${PKG_INST_VERSION}" "/etc/s6-overlay/s6-rc.d/init-mods-package-install/run" ADD --chmod=744 "https://raw.githubusercontent.com/linuxserver/docker-mods/mod-scripts/lsiown.${LSIOWN_VERSION}" "/usr/bin/lsiown" +USER dmdba +WORKDIR /home/dmdba/dmdbms/bin +RUN /home/dmdba/dmdbms/bin/dminit path=/home/dmdba/data +USER root +RUN /home/dmdba/dmdbms/script/root/dm_service_installer.sh -t dmserver -dm_ini /home/dmdba/data/DAMENG/dm.ini -p DMTEST + # 添加本地目录 COPY /root / diff --git a/python/Dockerfile b/python/Dockerfile index 789da3f..8561f66 100644 --- a/python/Dockerfile +++ b/python/Dockerfile @@ -27,6 +27,7 @@ ENV PATH="$VIRTUAL_ENV/bin:$PATH" COPY --from=build-dmpython --chown=flask:flask /home/dmdba/build_artifacts/dmPython-2.5.5-cp310-cp310-linux_x86_64.whl . RUN python3 -m venv "$VIRTUAL_ENV" && \ +pip3 config set global.index-url https://mirrors.bfsu.edu.cn/pypi/web/simple && \ export FLASK_APP=app.py && \ pip3 install dmPython-2.5.5-cp310-cp310-linux_x86_64.whl && rm dmPython-2.5.5-cp310-cp310-linux_x86_64.whl && \ MAKEFLAGS="-j$(nproc)" pip install -r requirements.txt diff --git a/python/app.py b/python/app.py index 8696c0e..7cd7686 100644 --- a/python/app.py +++ b/python/app.py @@ -4,9 +4,9 @@ import time import paramiko +from k8s_func import * from teacher_func import * from student_func import * -# from k8s_func import * from flask import Flask, render_template, request, jsonify, send_from_directory, session from flask_cors import CORS @@ -178,10 +178,19 @@ def FindTrain1Src(): @app.route('/api/student/EntryTrainScore',methods=['POST']) def EntryTrainScore(): score=request.json['score'] - TrainScore=request.json['trainScore'] + TrainScore=request.json['TrainScore'] operateID=request.json['operateID'] student_ID=request.json['student_ID'] - AddTrainScoreFunc(score,TrainScore,student_ID,operateID) + succeed=request.json['succeed'] + subject=request.json['subject'] + print(subject[0]) + print(type(subject)) + if subject[0]=="达梦数据库连接": + Name='n'+student_ID+'-'+operateID + delete_pod(Name) + else: + print(False) + AddTrainScoreFunc(student_ID,operateID,score,TrainScore,succeed) return jsonify({'result': '成功'}) @@ -346,38 +355,48 @@ def getTrainData(): return jsonify({'data': data}) -# @app.route("/api/teacher/list_pods",methods=['POST']) # 列出pod -# def teacher_list_pods(): -# return list_pods() -# @app.route("/api/teacher/list_services") # 列出服务 -# def teacher_list_services(): -# return list_services() +@app.route("/api/teacher/list_pods",methods=['POST']) # 列出pod +def teacher_list_pods(): + return list_pods() +@app.route("/api/teacher/list_services") # 列出服务 +def teacher_list_services(): + return list_services() # @app.route("/api/teacher/create_pod") # 创建服务 1为项目实训, 0为安装实训 # def teacher_create_pod(): # create_pod(1, "test2") -# @app.route("/api/teacher/DelPods",methods=['POST']) # 删除服务 -# def teacher_delete_pod(): -# name=request.json['name'] -# studentID=name[1:9] -# testID=name[10:] -# delDMFunc(studentID,testID) -# return delete_pod(name=name) +@app.route("/api/teacher/DelPods",methods=['POST']) # 删除服务 +def teacher_delete_pod(): + name=request.json['name'] + studentID=name[1:9] + testID=name[10:] + delDMFunc(studentID,testID) + return delete_pod(name=name) -# @app.route("/api/student/check_pod",methods=['POST']) # 检测数据库是否安装成功 若成功,返回OK 否则返回NO -# def teacher_check_pod(): -# name=request.json["student_ID"] -# testID=request.json["operateID"] -# name= 'n' + str(name) + '-' + str(testID) -# result = check_dm(name) -# return jsonify(result) +@app.route('/api/teacher/MarkDelPods',methods=['POST']) +def teacher_mark_del_pods(): + studentList=request.json['list'] + testID=request.json['testID'] + for i in studentList: + Name='s'+i+'-'+testID + delete_pod(Name) + return '删除成功' +@app.route("/api/student/check_pod",methods=['POST']) # 检测数据库是否安装成功 若成功,返回OK 否则返回NO +def teacher_check_pod(): + name=request.json["student_ID"] + testID=request.json["operateID"] + name= 'n' + str(name) + '-' + str(testID) + result = check_dm(name) + return jsonify(result) @app.route('/') @app.route('/') def catch_all(path = "index.html"): - return send_from_directory("public", path) - + if os.path.exists(f"public/{path}"): + return send_from_directory("public", path) + else: + return send_from_directory("public", "index.html") @socketio.on('connect_ssh') def handle_connect_ssh(data): diff --git a/python/student_func.py b/python/student_func.py index dc60def..60b0b90 100644 --- a/python/student_func.py +++ b/python/student_func.py @@ -4,6 +4,7 @@ from Crypto.Cipher import AES from Crypto.Random import get_random_bytes import base64 from datetime import datetime +import re # 获取当前日期和时间 current_datetime = datetime.now() @@ -344,12 +345,23 @@ def FindTrain1SrcFunc(ID,testID): def AddTrainScoreFunc(ID,testID,score,trainResult,succeed): a=[] + # 打印结果字符串 + succeed=json.loads(succeed) + succeed=list(succeed) for i in succeed: - a.append(succeed[i]) - a=set(a) - print(a) + a.append(i) + + a=list(set(a)) + if None in a: + a.remove(None) + if len(a)==0: + result_string='全能高手' + else: + result_string = ','.join(a)+'需要加强' + cursor=db.cursor() - cursor.execute("UPDATE TRAINSCORE SET TF='true', RESULT=(?), TRAINRESULT=(?) WHERE STUDENT_ID=(?) AND TEST_ID=(?)",(score,trainResult,ID,testID)) + cursor.execute("UPDATE TRAINSCORE SET TF='true', RESULT=(?), TRAINRESULT=(?) ,ANALYSE=(?) WHERE STUDENT_ID=(?) AND TEST_ID=(?)",(score,trainResult,result_string,ID,testID)) + print('加入成绩成功') db.commit() cursor.close() return '添加成功' diff --git a/python/teacher_func.py b/python/teacher_func.py index e65db63..5400a83 100644 --- a/python/teacher_func.py +++ b/python/teacher_func.py @@ -291,8 +291,8 @@ def SendLink(): 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,'NULL' + cursor.execute(f"INSERT INTO TRAINSCORE VALUES (?,?,?,?,?,?,?,?,?,?,?)",( + i,i[0:6],testID,'false','NULL','NULL',Link,Link2,Link3,'NULL','NULL' )) else: pass @@ -304,8 +304,8 @@ def SendLink(): 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','NULL' + cursor.execute(f"INSERT INTO TRAINSCORE VALUES (?,?,?,?,?,?,?,?,?,?,?)", ( + i, i[0:6], testID, 'false', 'NULL', 'NULL', Link, 'NULL', 'NULL','NULL','NULL' )) print('加入链接成功') diff --git a/python/test.py b/python/test.py index 4932c14..e5cf91c 100644 --- a/python/test.py +++ b/python/test.py @@ -1,7 +1,5 @@ -list1=[1,2,3,4,5] -name='asd' -dic={name:list1} -print(dic) +import k8s_func +k8s_func.delete_pod('20240101')