From 45b63bdb793f9a9056bbe02a40522a1391b61b5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 20 Dec 2019 11:57:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../users/get_navigation_info.json.jbuilder | 4 +- public/react/src/college/College.js | 6 +- .../modules/developer/recordDetail/index.js | 5 +- public/react/src/modules/tpm/NewHeader.js | 2 +- public/react/src/modules/tpm/TPMBanner.js | 10 +- public/react/src/modules/tpm/TPMDataset.js | 2 +- .../tpm/shixunchild/Challenges/Challenges.js | 104 ++++++---- .../Challenges/Challengesjupyter.js | 98 ++++++--- public/react/src/redux/actions/ojForUser.js | 193 +++++++++--------- public/react/src/services/ojService.js | 5 +- 10 files changed, 254 insertions(+), 175 deletions(-) diff --git a/app/views/users/get_navigation_info.json.jbuilder b/app/views/users/get_navigation_info.json.jbuilder index c507f7ef8..a0f10677c 100644 --- a/app/views/users/get_navigation_info.json.jbuilder +++ b/app/views/users/get_navigation_info.json.jbuilder @@ -41,7 +41,9 @@ json.top do json.old_url @old_domain # 云上实验室管理权限 - json.laboratory_user current_laboratory.laboratory_users.exists?(user_id: @user&.id) || @user&.admin_or_business? + laboratory_user = current_laboratory.laboratory_users.exists?(user_id: @user&.id) || @user&.admin_or_business? + json.laboratory_user laboratory_user + json.laboratory_admin_url laboratory_user ? "/cooperative" : nil end json.down do diff --git a/public/react/src/college/College.js b/public/react/src/college/College.js index bc43252b7..fb116429d 100644 --- a/public/react/src/college/College.js +++ b/public/react/src/college/College.js @@ -45,11 +45,13 @@ class College extends Component { align: 'center', className: "edu-txt-center font-14 maxnamewidth340", render: (text, record) => ( - + { record.teachers } - + ) }, { diff --git a/public/react/src/modules/developer/recordDetail/index.js b/public/react/src/modules/developer/recordDetail/index.js index 1951b7712..7a3fc13e1 100644 --- a/public/react/src/modules/developer/recordDetail/index.js +++ b/public/react/src/modules/developer/recordDetail/index.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-12-04 08:36:21 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-10 18:55:02 + * @LastEditTime: 2019-12-20 10:38:00 */ import './index.scss'; import React, { useState, useEffect } from 'react'; @@ -79,7 +79,7 @@ function RecordDetail (props) {
- 状态: {reviewResult[detail.status]} + 状态: {reviewResult[detail.status]} 提交时间: @@ -89,6 +89,7 @@ function RecordDetail (props) { 语言: C + {/* */}
diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index 06369d3d2..84354369c 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -1218,7 +1218,7 @@ submittojoinclass=(value)=>{ } { this.props.Headertop && this.props.Headertop.laboratory_user && -
  • 后台管理
  • +
  • 后台管理
  • }
  • 账号管理
  • diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index 672fff455..579e0a84a 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -148,7 +148,7 @@ class TPMBanner extends Component { }) } - + } } @@ -866,6 +866,8 @@ class TPMBanner extends Component { + { + this.props.is_jupyter===true?"": @@ -930,7 +932,7 @@ class TPMBanner extends Component {
    - + } { @@ -1014,8 +1016,8 @@ class TPMBanner extends Component { -
    您编辑完成后,可以马上使用到自
    -
    己的课堂和实训课程哦
    +
    点击发布后,可以马上应用到自
    +
    己的课堂和课程
    } diff --git a/public/react/src/modules/tpm/TPMDataset.js b/public/react/src/modules/tpm/TPMDataset.js index 85ce2006e..55cd8c746 100644 --- a/public/react/src/modules/tpm/TPMDataset.js +++ b/public/react/src/modules/tpm/TPMDataset.js @@ -461,7 +461,7 @@ class TPMDataset extends Component { const uploadProps = { width: 600, fileList, - multiple: false, + multiple: true, //multiple 是否支持多选 查重的时候不能多选 不然弹许多框出来 // https://github.com/ant-design/ant-design/issues/15505 // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js index 772cd089a..d84817fe8 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js @@ -10,8 +10,6 @@ import { Modal, Spin, Tooltip ,message,Icon,Button,Divider} from 'antd'; import axios from 'axios'; -import 'antd/lib/pagination/style/index.css'; - import '../shixunchildCss/Challenges.css'; import AccountProfile from"../../../user/AccountProfile"; @@ -74,33 +72,48 @@ class Challenges extends Component { if(box){ boxoffsetHeigh=box.offsetHeight - if(boxoffsetHeigh=300){ + this.setState({ + opentitletype:true, + isopentitletype:"greater", + boxoffsetHeigh:boxoffsetHeigh + }) + }else{ + this.setState({ + isopentitletype:"Less", + boxoffsetHeigh:boxoffsetHeigh + }) + } + } + } - console.log(boxoffsetHeigh) + } } componentDidMount() { - this.ChallengesList() + if(this.state.isopentitletype==="greater"){ + + }else { + this.ChallengesList() + } } componentDidUpdate = (prevProps,prevState) => { //防止陷入无限循环 if(prevState.ChallengesDataList!=this.state.ChallengesDataList){ - this.getjianjiesize() + if(this.state.isopentitletype==="greater"){ + + }else{ + this.getjianjiesize() + } } } @@ -341,7 +354,6 @@ class Challenges extends Component { opentitle=()=>{ this.setState({ opentitletype:!this.state.opentitletype, - isopentitletype:!this.state.opentitletype===false?"Less":"greater" }) } @@ -423,25 +435,7 @@ class Challenges extends Component { this.props.identity < 5?实训制作指南 : "":""} - {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined?this.state.opentitletype===true?:"":} +
    + + + {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined?:""} + + + {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined?"":this.state.isopentitletype==="greater"&&this.state.opentitletype===true? + :""} +
    @@ -471,7 +499,7 @@ class Challenges extends Component {
    - {this.state.isopentitletype==="Less"&&this.state.opentitletype===false?this.opentitle()} className={"pointer Breadcrumbfont color-grey-9 "}> + {this.state.isopentitletype==="Less"?"":this.state.opentitletype===true?this.opentitle()} className={"pointer Breadcrumbfont color-grey-9 "}> 阅读全文 :this.opentitle()} className={"pointer Breadcrumbfont color-grey-9 "}> 收起全文 diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index c68493163..d2376d616 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -48,33 +48,54 @@ class Challengesjupyter extends Component { isopentitletype:"Less", }) } + this.getjianjiesize() } } }).catch((error) => { //console.log(error) }); } + + + getjianjiesize=()=>{ + let {ChallengesDataList}=this.state; + let boxoffsetHeigh; + let box=document.getElementById("shixunchallengesid"); + + if(box){ + boxoffsetHeigh=box.offsetHeight + if(ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined){ + + }else{ + if(this.state.isopentitletype==="greater"){ + + }else{ + if(boxoffsetHeigh>=300){ + this.setState({ + opentitletype:true, + isopentitletype:"greater", + boxoffsetHeigh:boxoffsetHeigh + }) + }else{ + this.setState({ + isopentitletype:"Less", + boxoffsetHeigh:boxoffsetHeigh + }) + } + } + + } + + } + } componentDidUpdate = (prevProps,prevState) => { //防止陷入无限循环 if(prevState.ChallengesDataList!=this.state.ChallengesDataList){ - let boxoffsetHeigh; - let box=document.getElementById("shixunchallengesid"); - if(box){ - boxoffsetHeigh=box.offsetHeight - if(boxoffsetHeigh<300){ - this.setState({ - isopentitletype:"Less", - boxoffsetHeigh:boxoffsetHeigh - }) - }else{ - this.setState({ - isopentitletype:"greater", - opentitletype:true, - boxoffsetHeigh:boxoffsetHeigh - }) - } + if(this.state.isopentitletype==="greater"){ + }else{ + this.getjianjiesize() } } @@ -132,6 +153,8 @@ class Challengesjupyter extends Component { console.log("触发了jupytermessage"); that.modifyjupyter(); }); + setTimeout(this.getjianjiesize(), 1000); + } updatamakedowns = () => { @@ -220,6 +243,7 @@ class Challengesjupyter extends Component { } + render() { let{ChallengesDataList,booljupyterurls,enlarge}=this.state; let id = this.props.match.params.shixunId; @@ -252,17 +276,39 @@ class Challengesjupyter extends Component {
    - {this.state.opentitletype===true? + + {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined?:""} -
    + } + :""} + {ChallengesDataList === undefined || ChallengesDataList&&ChallengesDataList.description=== ""||ChallengesDataList&&ChallengesDataList.description===null||ChallengesDataList&&ChallengesDataList.description===undefined?"":this.state.isopentitletype==="greater"&&this.state.opentitletype===true? + :""}

    @@ -341,11 +387,7 @@ class Challengesjupyter extends Component { : ( admin===true||business===true||mysidentity===true? -

    - -
    +

    任务详情

    (请将实训题目写在下方并保存)

    @@ -402,7 +444,7 @@ class Challengesjupyter extends Component { { admin===true||business===true||mysidentity===true?
    -
    +
    { this.state.jupyter_url===null || this.state.jupyter_url===undefined? ( diff --git a/public/react/src/redux/actions/ojForUser.js b/public/react/src/redux/actions/ojForUser.js index 9cb814d80..5484b6eec 100644 --- a/public/react/src/redux/actions/ojForUser.js +++ b/public/react/src/redux/actions/ojForUser.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-11-27 13:42:11 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-19 15:11:56 + * @LastEditTime: 2019-12-20 10:25:42 */ import types from "./actionTypes"; import { Base64 } from 'js-base64'; @@ -87,7 +87,7 @@ export const getUserProgramDetail = (identifier, type) => { type: types.SAVE_USE_TEST_CASE_VALUE, payload: data.test_case || {} }); - // 代码是否更新 + // 代码是否更新 let _modify_code = false; if (data.hack) { _modify_code = data.hack.modify_code; @@ -171,15 +171,103 @@ export const updateCode = (identifier, inputValue, type) => { } } +// 代码评测 +export const codeEvaluate = (dispatch, identifier, type, time_limit) => { + // 调试代码成功后,调用轮循接口, 注意: 代码执行的时间要小于设置的时间限制 + const intervalTime = 500; + let count = 1; + /** + * @param {*} excuteTime 执行时间 + * @param {*} finalTime 总时间 + * @param {*} count 执行次数 + * @param {*} timer 定时器 + */ + function getCodeSubmit (intervalTime, finalTime, count, timer){ + const excuteTime = (count++) * intervalTime; // 当前执行时间 + fetchCodeSubmit(identifier, { mode: type }).then(res => { + const { status } = res.data; // 评测返回结果 + // 清除定时器条件: 评测通过或者评测时间大于指定时间 + if (+status === 0 || (excuteTime / 1000) > (finalTime + 1)) { + clearInterval(timer); // 清除定时器 + timer = null; + let returnData = null; + if (status === 1) { // 结果没有返回 + returnData = { + error_line: -1, + error_msg: '', + execute_memory: '', + execute_time: finalTime, + input: '', + output: '', + status: 2, + expected_output: '' + }; + } else { // 成功返回结果 + returnData = res.data.data; + } + // 返回评测结果 + dispatch({ + type: types.COMMIT_RECORD_DETAIL, + payload: returnData + }); + if (!type || type === 'debug') { + dispatch({ // 改变 loading 值 + type: types.LOADING_STATUS, + payload: false + }); + // 保存执行状态 + dispatch({ + type: types.TEST_CODE_STATUS, + payload: 'finish' + }); + } else { + // 回滚提交按钮状态 + dispatch({ + type: types.SUBMIT_LOADING_STATUS, + payload: false + }); + // 改变tab值至提交记录(只在提交时才跳转,测评时,切换到代码执行结果就可以了) + dispatch({ + type: types.CHANGE_USER_CODE_TAB, + payload: 'record' + }); + // 重新调用一下提交记录接口 + dispatch(getUserCommitRecord(identifier)); + } + } + }).catch(err => { // 评测异常时 + // 清除定时器 + clearInterval(timer); + timer = null; + // 回滚按钮状态 + if (!type || type === 'debug') { + dispatch({ // 改变 loading 值 + type: types.LOADING_STATUS, + payload: false + }); + } else { // 回滚提交按钮状态 + dispatch({ + type: types.SUBMIT_LOADING_STATUS, + payload: false + }); + } + }); + } + // 开启定时器,调用监听接口 + let timer = setInterval(() => { + getCodeSubmit(intervalTime, time_limit, count++, timer); + }, intervalTime); +} + /** * @description 调试代码 - * @param {*} identifier + * @param {*} identifier * @param {*} inputValue 输入值: 自定义 | 系统返回的 * @param {*} type 测评类型 debug | submit */ export const debuggerCode = (identifier,value, type) => { return (dispatch, getState) => { - // 调用之前 先保存 code + // 调用之前 先保存 code // TODO // console.log(identifier, value); const {hack: {time_limit = 0}} = getState().ojForUserReducer; @@ -194,15 +282,6 @@ export const debuggerCode = (identifier,value, type) => { // console.log('调用调试代码成功并返回结果: ', res); const { status } = res; if (status === 200) { - // 调试代码成功后,调用轮循接口, 注意: 代码执行的时间要小于设置的时间限制 - const intervalTime = 500; - let count = 1; - /** - * @param {*} excuteTime 执行时间 - * @param {*} finalTime 总时间 - * @param {*} count 执行次数 - * @param {*} timer 定时器 - */ if (res.data.status === 401) { dispatch({ // 改变 loading 值 type: types.LOADING_STATUS, @@ -210,81 +289,8 @@ export const debuggerCode = (identifier,value, type) => { }); return; }; - function getCodeSubmit (intervalTime, finalTime, count, timer){ - const excuteTime = (count++) * intervalTime; // 当前执行时间 - fetchCodeSubmit(identifier, { mode: type }).then(res => { - const { status } = res.data; // 评测返回结果 - // 清除定时器条件: 评测通过或者评测时间大于指定时间 - if (+status === 0 || (excuteTime / 1000) > (finalTime + 1)) { - clearInterval(timer); // 清除定时器 - timer = null; - let returnData = null; - if (status === 1) { // 结果没有返回 - returnData = { - error_line: -1, - error_msg: '', - execute_memory: '', - execute_time: finalTime, - input: '', - output: '', - status: 2, - expected_output: '' - }; - } else { // 成功返回结果 - returnData = res.data.data; - } - // 返回评测结果 - dispatch({ - type: types.COMMIT_RECORD_DETAIL, - payload: returnData - }); - if (!type || type === 'debug') { - dispatch({ // 改变 loading 值 - type: types.LOADING_STATUS, - payload: false - }); - // 保存执行状态 - dispatch({ - type: types.TEST_CODE_STATUS, - payload: 'finish' - }); - } else { - // 回滚提交按钮状态 - dispatch({ - type: types.SUBMIT_LOADING_STATUS, - payload: false - }); - // 改变tab值至提交记录(只在提交时才跳转,测评时,切换到代码执行结果就可以了) - dispatch({ - type: types.CHANGE_USER_CODE_TAB, - payload: 'record' - }); - // 重新调用一下提交记录接口 - dispatch(getUserCommitRecord(identifier)); - } - } - }).catch(err => { // 评测异常时 - // 清除定时器 - clearInterval(timer); - timer = null; - // 回滚按钮状态 - if (!type || type === 'debug') { - dispatch({ // 改变 loading 值 - type: types.LOADING_STATUS, - payload: false - }); - } else { // 回滚提交按钮状态 - dispatch({ - type: types.SUBMIT_LOADING_STATUS, - payload: false - }); - } - }); - } - // 开启定时器,调用监听接口 - let timer = setInterval(() => { - getCodeSubmit(intervalTime, time_limit, count++, timer); - }, intervalTime); + // 测评 + codeEvaluate(dispatch, identifier, type, time_limit); } }).catch(() => { dispatch({ @@ -362,7 +368,8 @@ export const changeUserCodeTab = (key) => { */ export const submitUserCode = (identifier, inputValue, type) => { return (dispatch, getState) => { - const { userCode, isUpdateCode } = getState().ojForUserReducer; + const { userCode, isUpdateCode, hack: {time_limit = 0} } = getState().ojForUserReducer; + function userCodeSubmit () { fetchUserCodeSubmit(identifier).then(res => { // console.log('用户提交代码成功======》》》》》', res); @@ -374,12 +381,8 @@ export const submitUserCode = (identifier, inputValue, type) => { }); return; }; - // 将编辑代码清空 - dispatch({ - type: types.SAVE_EDITOR_CODE, - payload: '' - }); - dispatch(debuggerCode(identifier, inputValue, type || 'submit')); + // 测评 + codeEvaluate(dispatch, identifier, type, time_limit); } }).catch(() => { dispatch({ diff --git a/public/react/src/services/ojService.js b/public/react/src/services/ojService.js index 373805b73..e552c1211 100644 --- a/public/react/src/services/ojService.js +++ b/public/react/src/services/ojService.js @@ -4,11 +4,10 @@ * @Github: * @Date: 2019-11-20 10:55:38 * @LastEditors: tangjiang - * @LastEditTime: 2019-12-17 14:10:37 + * @LastEditTime: 2019-12-20 10:10:53 */ import axios from 'axios'; -import { func } from 'prop-types'; export async function fetchOJList (params) { console.log('传递的参数: ', params); @@ -137,4 +136,4 @@ export async function fetchUploadImage (file) { export async function fetchUploadImageUrl (id) { const url = `/attachments/${id}`; return axios.get(url); -} +}