Merge branches 'dev_aliyun' and 'dev_newshixunModel' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_newshixunModel

dev_cs
杨树明 5 years ago
commit cd38f4013c

@ -268,12 +268,14 @@ pop_box_new(htmlvalue, 480, 182);
}); });
} }
onPathChange(index) { onPathChange(index, callback) {
let { challenge } = this.state; let { challenge } = this.state;
// challenge = Object.assign({}, challenge) // challenge = Object.assign({}, challenge)
// challenge.pathIndex = index; // challenge.pathIndex = index;
this.setState({ this.setState({
challenge: update(challenge, {pathIndex: { $set: index }}), challenge: update(challenge, {pathIndex: { $set: index }}),
}, () => {
callback && callback()
}) })
// TODO load new path content // TODO load new path content
} }

@ -305,7 +305,7 @@ class CoursesIndex extends Component{
//Do your stuff here //Do your stuff here
}); });
} }
//更新左边课堂导航
updataleftNav=()=>{ updataleftNav=()=>{
let query=this.props.location.pathname let query=this.props.location.pathname
let {isaloadtype}=this.state; let {isaloadtype}=this.state;

@ -29,12 +29,14 @@ class Elearning extends Component{
userlogin:"", userlogin:"",
isRender:false, isRender:false,
subject_id:0, subject_id:0,
myupdataleftNavs:this.myupdataleftNav
} }
} }
componentDidMount() { componentDidMount() {
// 记得删除退出课堂 // 记得删除退出课堂
// console.log("获取到数据"); // console.log("在线学习");
// console.log("获取到数据");
// console.log(this.props); // console.log(this.props);
this.getdata(); this.getdata();
} }
@ -289,6 +291,9 @@ class Elearning extends Component{
}) })
}; };
myupdataleftNav=()=>{
this.props.updataleftNavfun();
}
render(){ render(){
console.log("Elearning++++++++"); console.log("Elearning++++++++");
// console.log(this.props.Chapterupdate); // console.log(this.props.Chapterupdate);
@ -397,7 +402,7 @@ class Elearning extends Component{
<div> <div>
{/*开始学习*/} {/*开始学习*/}
<YslDetailCards {...this.state} {...this.props} Startlearningtwo={()=>this.Startlearningtwo()} Myreload={()=>this.Myreload()} Tojoinclass={()=>this.Tojoinclass()} getPathCardsList={()=>this.getdata()}></YslDetailCards> <YslDetailCards {...this.state} {...this.props} Startlearningtwo={()=>this.Startlearningtwo()} Myreload={()=>this.Myreload()} Tojoinclass={()=>this.Tojoinclass()} getPathCardsList={()=>this.getdata()} ></YslDetailCards>
</div> </div>

@ -210,7 +210,7 @@ class YslDetailCards extends Component{
//取消 //确认
updatapathCardsedit=()=>{ updatapathCardsedit=()=>{
this.setState({ this.setState({
idsum:undefined, idsum:undefined,
@ -219,9 +219,10 @@ class YslDetailCards extends Component{
editbuttomtypeadd:false editbuttomtypeadd:false
}) })
this.props.getPathCardsList(); this.props.getPathCardsList();
this.props.myupdataleftNavs();
// this.props.updatadetailInfoLists(); // this.props.updatadetailInfoLists();
}; };
//确认 //取消
editeditbuttomtypecanle=()=>{ editeditbuttomtypecanle=()=>{
this.setState({ this.setState({
editbuttomtype:true, editbuttomtype:true,
@ -300,6 +301,7 @@ class YslDetailCards extends Component{
this.updatapathCardsedit() this.updatapathCardsedit()
this.props.showNotification(`删除成功`); this.props.showNotification(`删除成功`);
this.props.myupdataleftNavs();
}else { }else {
this.props.showNotification(`删除失败`); this.props.showNotification(`删除失败`);
} }

@ -1067,7 +1067,7 @@ class ShixunHomework extends Component{
{/*<span className="font-18 fl color-dark-21">{datas&&datas.category_name===undefined||datas&&datas.category_name===null?datas&&datas.main_category_name:datas&&datas.category_name+" 作业列表"}</span>*/} {/*<span className="font-18 fl color-dark-21">{datas&&datas.category_name===undefined||datas&&datas.category_name===null?datas&&datas.main_category_name:datas&&datas.category_name+" 作业列表"}</span>*/}
<span className="font-18 fl color-dark-21">实训作业</span> <span className="font-18 fl color-dark-21">实训作业</span>
<li className="fr"> <li className="fr">
{datas===undefined?"":datas.homeworks && datas.homeworks.length>1?this.props.isClassManagement()===true?datas&&datas.category_name===undefined||datas&&datas.category_name===null? {datas===undefined?"":datas.homeworks && datas.homeworks.length>1?this.props.isAdminOrCreator()===true?datas&&datas.category_name===undefined||datas&&datas.category_name===null?
<span> <span>
<WordsBtn style="blue" className={"mr30 font-16"}> <WordsBtn style="blue" className={"mr30 font-16"}>
<Link className="color4CACFF" to={`/courses/${this.props.match.params.coursesId}/ordering/shixun_homework/${main_id&&main_id}`}>调整排序</Link> <Link className="color4CACFF" to={`/courses/${this.props.match.params.coursesId}/ordering/shixun_homework/${main_id&&main_id}`}>调整排序</Link>

@ -207,12 +207,13 @@ class MainContentContainer extends Component {
if (newProps.game && newProps.st === 0) { if (newProps.game && newProps.st === 0) {
if (!this.props || !this.props.game if (!this.props || !this.props.game
|| ( newProps.game.identifier !== this.props.game.identifier ) ) { || ( newProps.game.identifier !== this.props.game.identifier ) ) {
setTimeout(this.fetchRepositoryCode( newProps), 1500);
} else if ( this.props.challenge.pathIndex != newProps.challenge.pathIndex
&& newProps.challenge.pathIndex !== -1) { // 切换到只读文件
// pathIndex切换
setTimeout(this.fetchRepositoryCode( newProps), 1500); setTimeout(this.fetchRepositoryCode( newProps), 1500);
} }
// else if ( this.props.challenge.pathIndex != newProps.challenge.pathIndex
// && newProps.challenge.pathIndex !== -1) { // 切换到只读文件
// pathIndex切换
// setTimeout(this.fetchRepositoryCode( newProps), 1500);
// }
} }
if (newProps.myshixun) { if (newProps.myshixun) {
var stageId = newProps.match.params.stageId; var stageId = newProps.match.params.stageId;
@ -231,7 +232,11 @@ class MainContentContainer extends Component {
// 切换关卡时,停止轮训 // 切换关卡时,停止轮训
this.oldGameIdentifier = prevProps.game.identifier; this.oldGameIdentifier = prevProps.game.identifier;
this.doFileUpdateRequestOnCodeMirrorBlur(prevProps) this.doFileUpdateRequestOnCodeMirrorBlur(prevProps)
} else if (challenge && (challenge.pathIndex || prevProps.challenge.pathIndex) && challenge.pathIndex != prevProps.challenge.pathIndex) { }
// else if (this.props.shixun && this.props.shixun.code_edit_permission && this.state.currentPath != prevState.currentPath) {
// this.doFileUpdateRequestOnCodeMirrorBlur(prevProps)
// }
else if (challenge && (challenge.pathIndex || prevProps.challenge.pathIndex) && challenge.pathIndex != prevProps.challenge.pathIndex) {
this.doFileUpdateRequestOnCodeMirrorBlur(prevProps) this.doFileUpdateRequestOnCodeMirrorBlur(prevProps)
} }
@ -253,6 +258,9 @@ class MainContentContainer extends Component {
this.setState({ codeLoading: false }); this.setState({ codeLoading: false });
return; return;
} }
if (type && arg_path) {
this.doFileUpdateRequestOnCodeMirrorBlur(this.props)
}
const stageId = game.identifier const stageId = game.identifier
let path; let path;
let isEditablePath = false; let isEditablePath = false;
@ -535,7 +543,9 @@ class MainContentContainer extends Component {
this.oldRepositoryCode = codeContent; this.oldRepositoryCode = codeContent;
let argPath; let argPath;
if (challenge.pathIndex === -1) { // 当前是只读文件 if (this.props.shixun && this.props.shixun.code_edit_permission == true) {
argPath = this.state.currentPath
} else if (challenge.pathIndex === -1) { // 当前是只读文件
argPath = challenge.multiPath === true ? challenge.path[0] : challenge.path argPath = challenge.multiPath === true ? challenge.path[0] : challenge.path
} else { } else {
argPath = challenge.multiPath === true ? challenge.path[challenge.pathIndex] : challenge.path argPath = challenge.multiPath === true ? challenge.path[challenge.pathIndex] : challenge.path
@ -624,6 +634,11 @@ class MainContentContainer extends Component {
gameBuilding: false gameBuilding: false
}) })
} }
onPathChange = (index, isDropDown) => {
this.props.onPathChange(index, () => {
isDropDown && this.fetchRepositoryCode()
})
}
onRunCodeTest() { onRunCodeTest() {
// tipContent(0, 100, 30, 360, 1) // tipContent(0, 100, 30, 360, 1)
// return; // for test // return; // for test
@ -634,7 +649,7 @@ class MainContentContainer extends Component {
showDialog({ showDialog({
contentText: '需要先切回可编辑的文件才可评测,确认要现在切换吗?', contentText: '需要先切回可编辑的文件才可评测,确认要现在切换吗?',
callback: () => { callback: () => {
onPathChange(0) this.onPathChange(0, true)
handleGdialogClose(); handleGdialogClose();
} }
}) })
@ -957,7 +972,9 @@ class MainContentContainer extends Component {
onRepositoryCodeUpdate={this.onRepositoryCodeUpdate} onRunCodeTest={this.onRunCodeTest} onRepositoryCodeUpdate={this.onRepositoryCodeUpdate} onRunCodeTest={this.onRunCodeTest}
codemirrorDidMount={this.codemirrorDidMount} fetchRepositoryCode={this.fetchRepositoryCode} codemirrorDidMount={this.codemirrorDidMount} fetchRepositoryCode={this.fetchRepositoryCode}
showResetCodeDialog={this.showResetCodeDialog} showResetPassedCodeDialog={this.showResetPassedCodeDialog} showResetCodeDialog={this.showResetCodeDialog} showResetPassedCodeDialog={this.showResetPassedCodeDialog}
doFileUpdateRequestOnCodeMirrorBlur={this.doFileUpdateRequestOnCodeMirrorBlur} ></MainContent> doFileUpdateRequestOnCodeMirrorBlur={this.doFileUpdateRequestOnCodeMirrorBlur}
onPathChange={this.onPathChange}
></MainContent>
</React.Fragment> </React.Fragment>
); );

@ -1,6 +1,6 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import axios from 'axios' import axios from 'axios'
import { Spin } from 'antd' import { Spin, Icon } from 'antd'
import ClipboardJS from 'clipboard' import ClipboardJS from 'clipboard'
import VNCDisplay from './VNCDisplay' import VNCDisplay from './VNCDisplay'
@ -22,7 +22,9 @@ class VNCContainer extends Component {
this.state = { this.state = {
fileTreeSelectedKeys: [], fileTreeSelectedKeys: [],
repositoryCode: '', repositoryCode: '',
displayKey: 1 displayKey: 1,
vnc_reseting: false,
} }
} }
componentDidMount() { componentDidMount() {
@ -116,6 +118,7 @@ class VNCContainer extends Component {
this.setState({ bottomDrawer: true }) this.setState({ bottomDrawer: true })
} }
onResetVNC = () => { onResetVNC = () => {
if (this.state.vnc_reseting) return;
// 桌面系统将恢复到初始状态,您在系统中创建的数据可能会丢失 // 桌面系统将恢复到初始状态,您在系统中创建的数据可能会丢失
// 请确保您的数据已保存(如:版本库代码已推送到服务器) // 请确保您的数据已保存(如:版本库代码已推送到服务器)
// 是否确认重置? // 是否确认重置?
@ -127,13 +130,15 @@ class VNCContainer extends Component {
</div>, </div>,
onOk: () => { onOk: () => {
const url = `/tasks/${this.props.game.identifier}/reset_vnc_link.json` const url = `/tasks/${this.props.game.identifier}/reset_vnc_link.json`
this.setState({ vnc_reseting: true })
axios.get(url, { axios.get(url, {
}).then((response) => { }).then((response) => {
if (response.data.data && response.data.data.vnc_url) { if (response.data.data && response.data.data.vnc_url) {
// reset // reset
this.setState({ this.setState({
displayKey: this.state.displayKey + 1, displayKey: this.state.displayKey + 1,
vnc_url: response.data.data.vnc_url vnc_url: response.data.data.vnc_url,
vnc_reseting: false
}) })
} else { } else {
} }
@ -141,7 +146,7 @@ class VNCContainer extends Component {
}).catch(error =>{ }).catch(error =>{
console.log(error) console.log(error)
this.setState({ readingCodeLoading: false }); this.setState({ vnc_reseting: false });
this.props.showSnackbar(`服务端异常,请联系管理员!`); this.props.showSnackbar(`服务端异常,请联系管理员!`);
}) })
@ -270,15 +275,23 @@ class VNCContainer extends Component {
></RepoTree> ></RepoTree>
</SecondDrawer> </SecondDrawer>
<FloatButton className="resetVNC" onClick={this.onResetVNC}> <FloatButton className="resetVNC" onClick={this.onResetVNC}>
<i className="iconfont icon-zhongzhi2 font-16 "></i> {/* <i className="iconfont icon-zhongzhi2 font-16 "></i> */}
{this.state.vnc_reseting ? <Icon type="loading" style={{verticalAlign: 'sub'}} />
: <i className="iconfont icon-zhongzhi2 font-16 "></i>}
<span>重置桌面系统</span> <span>重置桌面系统</span>
</FloatButton> </FloatButton>
{/* <Spin tip="..." spinning={this.state.vnc_reseting}>
</Spin> */}
<VNCDisplay <VNCDisplay
{...this.props} {...this.props}
key={this.state.displayKey} key={this.state.displayKey}
vnc_url={this.state.vnc_url || this.props.vnc_url} vnc_url={this.state.vnc_url || this.props.vnc_url}
> >
<Spin tip="加载中..." spinning={this.state.vnc_reseting}>
</Spin>
<Drawer <Drawer
mask={true} mask={true}
title="" title=""

@ -222,7 +222,7 @@ class TPIMonaco extends Component {
// https://github.com/Microsoft/monaco-editor/issues/539 // https://github.com/Microsoft/monaco-editor/issues/539
window.monaco.editor.setModelLanguage(editor_monaco.getModel(), lang) window.monaco.editor.setModelLanguage(editor_monaco.getModel(), lang)
} else if (prevProps.isEditablePath != this.props.isEditablePath) { } else if (prevProps.isEditablePath != this.props.isEditablePath) {
if (this.props.isEditablePath) { if (this.props.isEditablePath || this.props.shixun && this.props.shixun.code_edit_permission == true) {
editor_monaco.updateOptions({readOnly: false}) editor_monaco.updateOptions({readOnly: false})
} else { } else {
editor_monaco.updateOptions({readOnly: true}) editor_monaco.updateOptions({readOnly: true})
@ -271,7 +271,7 @@ class TPIMonaco extends Component {
const lang = getLanguageByMirrorName(this.props.mirror_name); const lang = getLanguageByMirrorName(this.props.mirror_name);
const editor = window.monaco.editor.create(document.getElementById('extend-challenge-file-edit'), { const editor = window.monaco.editor.create(document.getElementById('extend-challenge-file-edit'), {
value: value, value: value,
readOnly: !this.props.isEditablePath, readOnly: !this.props.isEditablePath && this.props.shixun && this.props.shixun.code_edit_permission != true,
// 属性说明 // 属性说明
// http://testeduplus2.educoder.net/react/build/static/node_modules/_monaco-editor@0.15.6@monaco-editor/esm/vs/editor/common/config/commonEditorConfig.js // http://testeduplus2.educoder.net/react/build/static/node_modules/_monaco-editor@0.15.6@monaco-editor/esm/vs/editor/common/config/commonEditorConfig.js
// https://github.com/Microsoft/monaco-editor/issues/29 // https://github.com/Microsoft/monaco-editor/issues/29

@ -157,13 +157,13 @@ class CodeRepositoryView extends Component {
} }
onPathChange(index) { onPathChange(index, isDropDown) {
const { challenge, onPathChange, doFileUpdateRequestOnCodeMirrorBlur } = this.props; const { challenge, onPathChange, doFileUpdateRequestOnCodeMirrorBlur } = this.props;
if (challenge.pathIndex !== index) { if (challenge.pathIndex !== index) {
// 切换时保存文件 // 切换时保存文件
// doFileUpdateRequestOnCodeMirrorBlur(true) // doFileUpdateRequestOnCodeMirrorBlur(true)
onPathChange(index) onPathChange(index, isDropDown)
} }
} }
@ -174,7 +174,7 @@ class CodeRepositoryView extends Component {
const pathArray = path.forEach ? path : [path] const pathArray = path.forEach ? path : [path]
pathArray.forEach( (item, index) => { pathArray.forEach( (item, index) => {
domArray.push( domArray.push(
<p key={index} className={classNames({'blue-line': pathIndex == index})} onClick={ () => this.onPathChange(index) } > <p key={index} className={classNames({'blue-line': pathIndex == index})} onClick={ () => this.onPathChange(index, true) } >
{item} {item}
</p> ) </p> )
}) })
@ -501,7 +501,8 @@ class CodeRepositoryView extends Component {
</Tooltip> </Tooltip>
} */} } */}
<div className="codemirrorBackground" <div className="codemirrorBackground"
style={{ backgroundImage: `url('${notEditablePathImg}')`, display: (isEditablePath ? 'none' : 'block') }}></div> style={{ backgroundImage: `url('${notEditablePathImg}')`
, display: (isEditablePath || this.props.shixun && this.props.shixun.code_edit_permission ? 'none' : 'block') }}></div>
{/*<textarea className = "" id="extend-challenge-file-edit" name="content">{repositoryCode}</textarea>*/} {/*<textarea className = "" id="extend-challenge-file-edit" name="content">{repositoryCode}</textarea>*/}
{/* cm monaco 切换 */} {/* cm monaco 切换 */}
{/* <TPICodeMirror {...this.props} ></TPICodeMirror> */} {/* <TPICodeMirror {...this.props} ></TPICodeMirror> */}

@ -231,12 +231,14 @@ class CodeRepositoryViewContainer extends Component {
const { fetchRepositoryCode, onPathChange, showSnackbar, challenge } = this.props; const { fetchRepositoryCode, onPathChange, showSnackbar, challenge } = this.props;
const nodePath = info.node.props.eventKey; const nodePath = info.node.props.eventKey;
let isCurrentFile = false;
// 设置pathIndex为-1那么代码文件下拉可以切回可编辑的文件 // 设置pathIndex为-1那么代码文件下拉可以切回可编辑的文件
if (!challenge.multiPath) { // 单path任务 多path任务 path是数组 if (!challenge.multiPath) { // 单path任务 多path任务 path是数组
if (challenge.path.trim() == nodePath.trim()) { if (challenge.path.trim() == nodePath.trim()) {
if (challenge.pathIndex === 0) { if (challenge.pathIndex === 0) {
showSnackbar(`当前编辑文件已经是${nodePath}`) showSnackbar(`当前编辑文件已经是${nodePath}`)
} else { } else {
fetchRepositoryCode(null, nodePath, 1);
onPathChange(0) onPathChange(0)
} }
return; return;
@ -244,7 +246,7 @@ class CodeRepositoryViewContainer extends Component {
onPathChange(-1) onPathChange(-1)
} }
} else { } else {
let isCurrentFile = false;
let cur_index = -1; let cur_index = -1;
if (challenge.path && challenge.path.forEach) { if (challenge.path && challenge.path.forEach) {
challenge.path.forEach((item, index) => { challenge.path.forEach((item, index) => {

@ -135,10 +135,11 @@ class DetailCardsEditAndAdd extends Component{
//点击新建阶段 //点击新建阶段
addStage=()=>{ addStage=()=>{
this.props.editeditbuttomtypes();
this.setState({ this.setState({
editPanel:true editPanel:true
}) })
this.props.editeditbuttomtypes();
} }
//取消新建阶段 //取消新建阶段
@ -275,13 +276,12 @@ class DetailCardsEditAndAdd extends Component{
shixun_id:shixuns_listeditlist shixun_id:shixuns_listeditlist
}).then((response) => { }).then((response) => {
// window.location.href = "/paths/" + response.data.subject_id // window.location.href = "/paths/" + response.data.subject_id
this.props.getPathCardsLists();
this.cancelAddState(); this.cancelAddState();
this.setState({ this.setState({
stage_nametype:false, stage_nametype:false,
descriptiontype:false descriptiontype:false
}) })
this.props.getPathCardsLists();
}).catch((error) => { }).catch((error) => {
console.log(error) console.log(error)
}); });

@ -288,7 +288,7 @@ class PathNew extends Component{
</div> </div>
<div className="clearfix mb30 mt30"> <div className="clearfix mb30 mt30">
<Button className="defalutSubmitbtn fl mr20" loading={this.state.bottonloading} onClick={this.submitNewPath}>提交</Button> <button className="defalutSubmitbtn fl mr20" loading={this.state.bottonloading} onClick={this.submitNewPath}>提交</button>
{this.isEditPage ? {this.isEditPage ?
<Link to={`/paths/${this.props.match.params.pathId}`} <Link to={`/paths/${this.props.match.params.pathId}`}
className="defalutCancelbtn fl">取消</Link> className="defalutCancelbtn fl">取消</Link>

@ -202,48 +202,40 @@ export function TPMIndexHOC(WrappedComponent) {
NORMAL = 6 # 普通用户 NORMAL = 6 # 普通用户
Anonymous = 7 # 普未登录 Anonymous = 7 # 普未登录
*/ */
//超管 //超管0
isSuperAdmin = () => { isSuperAdmin = () => {
// return false // return false
return this.state.coursedata&&this.state.coursedata.course_identity === 0 return this.state.coursedata&&this.state.coursedata.course_identity === 0
} }
// 课堂管理等 //超管、运维0-1
isClassManagement = () => { isClassManagement = () => {
// return this.state.coursedata&&this.state.coursedata.course_identity >= 0 &&
return this.state.coursedata&&this.state.coursedata.course_identity < 2 return this.state.coursedata&&this.state.coursedata.course_identity < 2
} }
//老师等 //超管、运维、课堂管理0-2
isAdminOrCreator = () => { isAdminOrCreator = () => {
// return this.state.coursedata&&this.state.coursedata.course_identity >= 0 &&
return this.state.coursedata&&this.state.coursedata.course_identity < 3 return this.state.coursedata&&this.state.coursedata.course_identity < 3
} }
// 助教等 //超管、运维、课堂管理、老师0-3
isAdminOrTeacher = () => { isAdminOrTeacher = () => {
// return this.state.coursedata&&this.state.coursedata.course_identity >= 0 &&
return this.state.coursedata&&this.state.coursedata.course_identity < 4 return this.state.coursedata&&this.state.coursedata.course_identity < 4
} }
// 老师、管理员等 // 超管、运维、课堂管理、老师、助教0-4
isAdmin = () => { isAdmin = () => {
// return false
// return this.state.coursedata&&this.state.coursedata.course_identity >= 0 &&
return this.state.coursedata&&this.state.coursedata.course_identity < 5 return this.state.coursedata&&this.state.coursedata.course_identity < 5
} }
// 学生 // 学生5
isStudent = () => { isStudent = () => {
// return true
// return this.state.coursedata&&this.state.coursedata.course_identity >= 0 &&
return this.state.coursedata&&this.state.coursedata.course_identity === 5 return this.state.coursedata&&this.state.coursedata.course_identity === 5
} }
// 超管、运维、课堂管理、老师、助教、学生0-5
isAdminOrStudent = () => { isAdminOrStudent = () => {
// return this.state.coursedata&&this.state.coursedata.course_identity >= 0 &&
return this.state.coursedata&&this.state.coursedata.course_identity <= 5 return this.state.coursedata&&this.state.coursedata.course_identity <= 5
} }
// 非课堂成员 // 游客未登录/非课堂成员6>
isNotMember = () => { isNotMember = () => {
// return this.state.coursedata&&this.state.coursedata.course_identity >= 0 &&
return this.state.coursedata&&this.state.coursedata.course_identity >= 6 return this.state.coursedata&&this.state.coursedata.course_identity >= 6
} }
//课堂是否已结束
isCourseEnd = () => { isCourseEnd = () => {
return this.state.current_user ? this.state.current_user.course_is_end : false return this.state.current_user ? this.state.current_user.course_is_end : false
} }

Loading…
Cancel
Save