Merge branch 'dev_aliyun' of http://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun

chromesetting
cxt 5 years ago
commit f97d6616ea

@ -23,7 +23,7 @@ class HackUserLastestCodesController < ApplicationController
# 同步代码
def sync_code
@my_hack.update_attributes(code: @hack.code, modify_time: @hack.modify_time)
@my_hack.update_attributes(code: @hack.code, modify_time: Time.now)
end
# 调试代码

@ -33,7 +33,7 @@ if (isDev) {
// 超管
// debugType="admin";
// 老师
// debugType="teacher";
//ebugType="teacher";
// 学生
//debugType="student";

@ -0,0 +1,30 @@
/*
* @Description:
* @Author: tangjiang
* @Github:
* @Date: 2019-12-13 10:28:15
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-13 10:37:17
*/
import { Modal } from 'antd';
export function ModalConfirm (
title,
content,
handleOk,
handleCancel
) {
Modal.confirm({
title,
content,
okText: '确定',
cancelText: '取消',
onOk () {
handleOk && handleOk();
},
onCancel () {
handleCancel && handleCancel();
}
});
}

@ -315,6 +315,7 @@ class ShixunWorkReport extends Component {
// let showAppraiseModals=this.props&&this.props.isAdminOrTeacher()===true?work_comment===null||work_comment===undefined?false:true:work_comment===null||work_comment===undefined?false:true;
let showAppraiseModals=work_comment===null||work_comment===undefined?false:true;
document.title=data&&data.course_name;
return (
data===undefined?"":<Spin indicator={antIcon} spinning={this.state.spinning}>
@ -366,10 +367,15 @@ class ShixunWorkReport extends Component {
<p className=" fl color-black mt25 summaryname">{data&&data.shixun_name}</p>
{/*{this.props.isAdmin()?<a className=" fr font-14 ml30 mt10 mr20 color-grey-9 ">导出实训报告数据</a>:""}*/}
<a onClick={this.goback} className="color-grey-6 fr font-14 ml20 mt15">返回</a>
<a
{this.props.isAdmin() ?<a
className=" color-blue font-14 fr ml20 mt15"
onClick={()=>this.confirmysl(`/student_works/${homeworkid}/export_shixun_work_report.pdf`)}
> <Spin size="small" spinning={this.state.isspinning}>导出实训报告数据</Spin></a>
> <Spin size="small" spinning={this.state.isspinning}>导出实训报告数据</Spin></a>:
parseInt(this.props&&this.props.user.user_id)===parseInt(data&&data.user_id)?<a
className=" color-blue font-14 fr ml20 mt15"
onClick={()=>this.confirmysl(`/student_works/${homeworkid}/export_shixun_work_report.pdf`)}
> <Spin size="small" spinning={this.state.isspinning}>导出实训报告数据</Spin></a>:""
}
{/*{this.props.isAdmin() ?work_comment_hidden===true? "":<a*/}
{/*className=" color-blue font-14 fr ml20 mt15"*/}
{/*onClick={()=>this.showAppraiseModal(1)}*/}

@ -44,6 +44,13 @@ const maps = {
'value': '2'
}
],
'languageMenu': [
{
'key': 'c',
'name': 'C语言',
'value': 'c'
}
],
'difficultMenu': [
{
'key': '1',
@ -119,15 +126,14 @@ class DeveloperHome extends React.PureComponent {
>
{/* <Link to={`/problems/${record.identifier}/edit`}></Link> */}
</Button>
<Button
<Button
shape="circle"
type="danger"
icon="close"
size="small"
style={{ marginLeft: '10px' }}
style={{ marginLeft: '10px', display: record.open_or_not ? 'none' : 'inline-block' }}
onClick={() => this.handleClickDelete(record)}
>
{/* <Link to={`/problems/${record.identifier}/edit`}></Link> */}
</Button>
</React.Fragment>
),
@ -197,7 +203,6 @@ class DeveloperHome extends React.PureComponent {
componentDidMount() {
// 是否是我的,如果是我的 显示编辑按钮
const { isMySource } = this.props;
console.log(this.props);
if (isMySource) {
this.handleFilterSearch({come_from: 'mine'});
let _columns = this.columns.concat([this.options]);
@ -346,6 +351,14 @@ class DeveloperHome extends React.PureComponent {
});
this.handleFilterSearch({category: +item.key === 0 ? '' : +item.key});
}
// 下拉语言
handleLanguageMenuClick = (item) => {
this.addShowFilterCtx({
type: 'language',
key: item.key
});
this.handleFilterSearch({language: item.key})
}
// 难度下拉
handleHardMenuClick = (item) => {
this.addShowFilterCtx({
@ -421,6 +434,7 @@ class DeveloperHome extends React.PureComponent {
// const { testReducer, handleClick } = this.props;
const {
ojListReducer: {hacks_list, top_data, hacks_count},
user,
pagination
} = this.props;
const {passed_count = 0, simple_count = 0, medium_count = 0, diff_count = 0} = top_data;
@ -443,7 +457,11 @@ class DeveloperHome extends React.PureComponent {
>{ctx}</Tag>
)});
};
// console.log('=====>>>>>>>>>.', this.props);
const newBtnStyle = user && (user.admin || (user.is_teacher && user.professional_certification) || user.business)
? { display: 'block'}
: { display: 'none'};
return (
<div className="developer-list">
<div className="ant-spin-container">
@ -457,7 +475,8 @@ class DeveloperHome extends React.PureComponent {
<MultipTags type="warning" text="中等" numb={medium_count} style={{ marginRight: '20px' }}/>
<MultipTags type="error" text="困难" numb={diff_count}/>
</div>
<Button type="primary" onClick={this.handleClickNew}>新建
{/* 认证的老师, 超级管理员, 运营人员可见 */}
<Button style={ newBtnStyle } type="primary" onClick={this.handleClickNew}>新建
{/* <Link to="/problems/new">新建</Link> */}
</Button>
</div>
@ -468,6 +487,9 @@ class DeveloperHome extends React.PureComponent {
<Dropdown className={'dropdonw-style'} placement="bottomLeft" overlay={this.getMenuItems('categoryMenu', this.handleCategoryMenuClick)}>
<span className={'dropdown-span'}>分类 <Icon type="down"/></span>
</Dropdown>
<Dropdown className={'dropdonw-style'} placement="bottomLeft" overlay={this.getMenuItems('languageMenu', this.handleLanguageMenuClick)}>
<span className={'dropdown-span'}>语言 <Icon type="down"/></span>
</Dropdown>
<Dropdown className={'dropdonw-style'} placement="bottomLeft" overlay={this.getMenuItems('difficultMenu', this.handleHardMenuClick)}>
<span className={'dropdown-span'}>难度 <Icon type="down"/></span>
</Dropdown>

@ -4,7 +4,7 @@
* @Github:
* @Date: 2019-11-27 16:02:36
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-10 09:30:27
* @LastEditTime: 2019-12-13 17:32:33
*/
import './index.scss';
import React, { useState, useRef } from 'react';
@ -84,7 +84,7 @@ const ControlSetting = (props) => {
<Tabs
className={classNames}
activeKey={defaultActiveKey}
tabBarStyle={{ backgroundColor: '#000', color: '#fff' }}
tabBarStyle={{ backgroundColor: 'rgba(48,48,48,1)', color: '#fff' }}
onChange={handleTabChange}
>
<TabPane tab={'自定义测试用例'} key={'1'} style={{ height: '280px', overflowY: 'auto' }}>

@ -2,6 +2,7 @@
position: absolute;
bottom: 0;
width: 100%;
background:rgba(30,30,30,1);
// height: 56px;
.control_tab{
position: absolute;
@ -51,7 +52,8 @@
height: 56px;
padding-right: 30px;
padding-left: 10px;
background: #000;
// background: #000;
background:rgba(48,48,48,1);
}
.setting_drawer{

@ -4,7 +4,7 @@
* @Github:
* @Date: 2019-11-27 19:46:14
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-10 09:31:00
* @LastEditTime: 2019-12-13 17:38:42
*/
import './index.scss';
import React, { useState, useEffect, useRef, useImperativeHandle, forwardRef } from 'react';
@ -50,6 +50,7 @@ function InitTabCtx (props, ref) {
],
initialValue: inputValue
})(<TextArea
className="input_textarea_style"
rows={8}
placeholder="请填写测试用例的输入值,点击“调试代码”"
/>)

@ -47,4 +47,11 @@
.flex_r{
padding: 0 20px 0 10px;
}
.input_textarea_style{
background:rgba(30,30,30,1) !important;
color: #fff;
border-color: transparent;
outline: none;
}
}

@ -4,11 +4,11 @@
* @Github:
* @Date: 2019-11-27 15:02:52
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-10 09:20:42
* @LastEditTime: 2019-12-13 16:16:56
*/
import './index.scss';
import React, { useState, useRef, useEffect } from 'react';
import { Icon, Drawer, Modal } from 'antd';
import { Drawer, Modal } from 'antd';
import { fromStore } from 'educoder';
import { connect } from 'react-redux';
import MonacoEditor from '@monaco-editor/react';

@ -1,11 +1,13 @@
.monaco_editor_area{
height: 100%;
background-color: rgba(30,30,30,1);
.code_title{
display: flex;
align-items: center;
// justify-content: space-between;
// background: #000;
background: #333333;
// background: #333333;
background-color: rgba(48,48,48,1);
color: #fff;
height: 56px;
padding: 0 30px;

@ -9,7 +9,7 @@ import './index.scss';
import React, { useEffect } from 'react';
import { connect } from 'react-redux';
import SplitPane from 'react-split-pane';// import { Form } from 'antd';
import { Button } from 'antd';
import { Button, Modal } from 'antd';
import LeftPane from './leftpane';
import RightPane from './rightpane';
import { withRouter } from 'react-router';
@ -17,6 +17,7 @@ import { toStore } from 'educoder';
import UserInfo from '../components/userInfo';
// import RightPane from './rightpane/index';
import actions from '../../../redux/actions';
import {ModalConfirm} from '../../../common/components/ModalConfirm';
const NewOrEditTask = (props) => {
const {
@ -32,17 +33,18 @@ const NewOrEditTask = (props) => {
changePublishLoadingStatus,
startProgramQuestion,
getUserInfoForNew,
handleCancelPublish,
// updateTestAndValidate,
} = props;
// 表单提交
const handleSubmitForm = () => {
// 改变loading状态
changeSubmitLoadingStatus(true);
// 调用输入表单验证功能
if (props.identifier) {
props.handleUpdateOjForm(props);
} else {
// 改变loading状态
changeSubmitLoadingStatus(true);
props.handleFormSubmit(props); // 提交表单
}
};
@ -66,6 +68,9 @@ const NewOrEditTask = (props) => {
}, []);
// 模拟挑战
const imitationChallenge = () => {
}
// 开始挑战
const startChallenge = () => {
// 调用 start 接口, 成功后跳转到模拟页面
startProgramQuestion(identifier, props);
@ -84,9 +89,20 @@ const NewOrEditTask = (props) => {
// 发布
const handleClickPublish = () => {
// console.log('public has click');
changePublishLoadingStatus(true);
handlePublish(props, 'publish');
ModalConfirm('提示', (<p>发布后即可应用到自己管理的课堂<br /> 是否确认发布?</p>), () => {
changePublishLoadingStatus(true);
handlePublish(props, 'publish');
});
}
// 撤销发布
const handleClickCancelPublish = () => {
ModalConfirm('提示', (<p>是否确认撤销发布?</p>), () => {
changePublishLoadingStatus(true);
handleCancelPublish(props, identifier);
});
}
// 取消保存/取消按钮
@ -107,20 +123,43 @@ const NewOrEditTask = (props) => {
}
// 发布/模拟挑战
const renderPubOrFight = () => {
const pubButton = isPublish ? '' : (<Button
type="primary"
loading={publishLoading}
onClick={handleClickPublish}
>立即发布</Button>);
const pubButton = isPublish
? (<Button
type="primary"
loading={publishLoading}
onClick={handleClickCancelPublish}
>撤销发布</Button>)
: (<Button
type="primary"
loading={publishLoading}
onClick={handleClickPublish}
>立即发布</Button>);
// 未发布: 模拟挑战 已发布: 开始挑战
const challengeBtn = isPublish ? (
<Button type="primary" onClick={startChallenge}>开始挑战</Button>
) : (
<Button type="primary" onClick={imitationChallenge}>模拟挑战</Button>
);
// 更新
// const updateBtn = isPublish
// ? ''
// : (
// <Button
// type="primary"
// loading={submitLoading}
// onClick={handleSubmitForm}
// >更新</Button>
// );
return (
<React.Fragment>
<Button
type="primary"
loading={submitLoading}
onClick={handleSubmitForm}
>更新</Button>
<Button
type="primary"
loading={submitLoading}
onClick={handleSubmitForm}
>更新</Button>
{pubButton}
<Button type="primary" onClick={startChallenge}>模拟挑战</Button>
{challengeBtn}
</React.Fragment>
)
}
@ -142,24 +181,9 @@ const NewOrEditTask = (props) => {
return (
<div className={'new_add_task_wrap'}>
<div className={'task_header'}>
{/* <Link to="/problems" className={'header_btn'} >
<Icon type="left" style={{ marginRight: '5px'}}/>后退
</Link> */}
<UserInfo userInfo={userInfo}/>
<p className={'header_title'}>{props.name || ''}</p>
{ renderQuit() }
{/* <Link style={{
position: 'absolute',
right: '30px',
top: 0,
color: '#5091FF'
}} to="/problems">退出</Link> */}
{/* <Button
style={{ display: identifier ? 'none' : 'block'}}
loading={publishLoading}
className={`header_btn`}
type="primary"
onClick={handleClickPublish}>立即发布</Button> */}
</div>
<div className="split-pane-area">
<SplitPane split="vertical" minSize={350} maxSize={-350} defaultSize="40%">
@ -206,6 +230,8 @@ const mapDispatchToProps = (dispatch) => ({
handleFormSubmit: (props) => dispatch(actions.validateOjForm(props)),
// 发布表单
handlePublish: (props, type) => dispatch(actions.validateOjForm(props, type)),
// 撤销发布
handleCancelPublish: (props, identifier) => dispatch(actions.handleClickCancelPublish(props, identifier)),
// 更新OJForm
handleUpdateOjForm: (props) => dispatch(actions.validateOjForm(props)),
// 根据id号获取表单信息

@ -4,7 +4,7 @@
* @Github:
* @Date: 2019-11-21 09:19:38
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-10 19:37:35
* @LastEditTime: 2019-12-13 11:58:46
*/
import './index.scss';
import React, { useState } from 'react';
@ -16,7 +16,7 @@ const { TextArea } = Input;
const FormItem = Form.Item;
const AddTestDemo = (props) => {
const {
// key,
key,
onSubmitTest,
onDeleteTest,
testCase,
@ -138,7 +138,7 @@ const AddTestDemo = (props) => {
return (
<Collapse className={'collapse_area'} activeKey={isOpen?'1':''} onChange={() => handleChangeCollapse()}>
<Panel header={`测试用例${testCase.position}`} extra={genExtra()} key="1">
<Panel header={`测试用例${props.index + 1}`} extra={genExtra()} key="1">
<Form>
<FormItem
label={<span className={'label_text'}>输入</span>}

@ -4,7 +4,7 @@
* @Github:
* @Date: 2019-11-20 10:35:40
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-09 10:22:03
* @LastEditTime: 2019-12-13 11:39:52
*/
import 'quill/dist/quill.core.css';
import 'quill/dist/quill.bubble.css';
@ -185,6 +185,7 @@ class EditTab extends React.Component {
};
const renderTestCase = () => {
return this.props.testCases.map((item, i) => {
console.log(111);
return <AddTestDemo
key={`${i}`}
isOpen={openTestCodeIndex.includes(i)}

@ -4,10 +4,10 @@
* @Github:
* @Date: 2019-11-23 10:53:19
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-10 19:16:18
* @LastEditTime: 2019-12-13 17:19:15
*/
import './index.scss';
import React, { useEffect } from 'react';
import React, { useEffect, useState } from 'react';
import { connect } from 'react-redux';
import SplitPane from 'react-split-pane';
import LeftPane from './leftpane';
@ -15,33 +15,59 @@ import RightPane from './rightpane';
// import { Link } from 'react-router-dom';
// import { getImageUrl } from 'educoder'
// import RightPane from '../newOrEditTask/rightpane';
import { Icon } from 'antd';
import { Icon, Modal } from 'antd';
import UserInfo from '../components/userInfo';
import actions from '../../../redux/actions';
import { fromStore} from 'educoder';
import { withRouter } from 'react-router';
const StudentStudy = (props) => {
function StudentStudy (props) {
const [hasUpdate, setHasUpdate] = useState(true);
const {
// hack,
userInfo,
hack_identifier
hack_identifier,
// user_program_identifier,
restoreInitialCode
} = props;
const {
match: { params },
getUserProgramDetail,
saveUserProgramIdentifier
} = props;
useEffect(() => {
const {
match: { params },
getUserProgramDetail,
saveUserProgramIdentifier
} = props;
let { id } = params;
// console.log(id);
let { id } = params;
useEffect(() => {
// 保存当前的id
saveUserProgramIdentifier(id);
// startProgramQuestion(id);
getUserProgramDetail(id);
}, []);
useEffect(() => {
const { hack = {} } = props;
if (hack.modify_code && hasUpdate) { // 代码更改,提示是否需要更新代码
setHasUpdate(false);
Modal.confirm({
title: '提示',
content: (
<p>
代码文件有更新啦 <br />
还未提交的代码请自行保存
</p>
),
okText: '立即更新',
cancelText: '稍后再说',
onOk () {
restoreInitialCode(id, '更新成功');
}
});
}
}, [props, hasUpdate, setHasUpdate]);
const _hack_id = hack_identifier || fromStore('hack_identifier');
// 处理编辑
@ -66,11 +92,11 @@ const StudentStudy = (props) => {
</div> */}
<UserInfo userInfo={userInfo}/>
<div className={'study_name'}>
<span>乘积最大序列</span>
<span>乘积最大序列 {hasUpdate}</span>
</div>
<div className={'study_quit'}>
{/* to={`/problems/${_hack_id}/edit`} */}
<span onClick={handleClickEditor} className="quit-btn">
<span onClick={handleClickEditor} className={`quit-btn`}>
<Icon type="form" className="quit-icon"/> 编辑
</span>
{/* to="/problems" */}
@ -102,11 +128,13 @@ const StudentStudy = (props) => {
const mapStateToProps = (state) => {
const { userInfo } = state.userReducer;
const { hack_identifier } = state.ojForUserReducer;
const { hack_identifier, user_program_identifier, hack } = state.ojForUserReducer;
return {
hack,
userInfo,
user_program_identifier,
hack_identifier
};
};
};
const mapDispatchToProps = (dispatch) => ({
@ -115,7 +143,9 @@ const mapDispatchToProps = (dispatch) => ({
// 调用编程题详情
getUserProgramDetail: (id) => dispatch(actions.getUserProgramDetail(id)),
saveUserProgramIdentifier: (id) => dispatch(actions.saveUserProgramIdentifier(id)),
saveEditorCodeForDetail: (code) => dispatch(actions.saveEditorCodeForDetail(code))
saveEditorCodeForDetail: (code) => dispatch(actions.saveEditorCodeForDetail(code)),
// 恢复初始代码
restoreInitialCode: (identifier, msg) => dispatch(actions.restoreInitialCode(identifier, msg)),
});
export default withRouter(connect(

@ -4,7 +4,7 @@
* @Github:
* @Date: 2019-11-27 14:59:51
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-10 19:00:30
* @LastEditTime: 2019-12-13 16:50:40
*/
import React, { useState, useEffect } from 'react';
import {connect} from 'react-redux';
@ -66,7 +66,7 @@ const RightPane = (props) => {
}
// 恢复初始代码
const handleRestoreInitialCode = () => {
restoreInitialCode(identifier);
restoreInitialCode(identifier, '恢复初始代码成功');
}
return (
@ -110,7 +110,7 @@ const mapDispatchToProps = (dispatch) => ({
// 保存用户代码至后台
saveUserCodeForInterval: (identifier, code) => dispatch(actions.saveUserCodeForInterval(identifier, code)),
// 恢复初始代码
restoreInitialCode: (identifier) => dispatch(actions.restoreInitialCode(identifier)),
restoreInitialCode: (identifier, msg) => dispatch(actions.restoreInitialCode(identifier, msg)),
});
export default connect(

@ -31,6 +31,7 @@ import {
testCaseOutputChange,
updateTestAndValidate,
updateOpenTestCaseIndex,
handleClickCancelPublish,
} from './ojForm';
import {
@ -79,6 +80,7 @@ export default {
validateOjTimeLimit,
validateOjCategory,
validateOpenOrNot,
handleClickCancelPublish,
addTestCase,
deleteTestCase,
testCaseInputChange,

@ -4,7 +4,7 @@
* @Github:
* @Date: 2019-11-27 13:42:11
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-10 19:05:36
* @LastEditTime: 2019-12-13 16:49:42
*/
import types from "./actionTypes";
import { Base64 } from 'js-base64';
@ -19,6 +19,7 @@ import {
fetchUserCodeSubmit,
fetchRestoreInitialCode
} from "../../services/ojService";
import { notification } from "antd";
// 进入编程页面时,首先调用开启编程题接口
export const startProgramQuestion = (id, props) => {
@ -384,17 +385,21 @@ export const submitUserCode = (identifier, inputValue, type) => {
}
// 恢复初始代码
export const restoreInitialCode = (identifier) => {
export const restoreInitialCode = (identifier, msg) => {
return (dispatch) => {
fetchRestoreInitialCode(identifier).then(res => {
if (res.data.status === 401) return;
console.log('恢复初始代码====》》》》', res);
// console.log('恢复初始代码====》》》》', res);
const {status, data} = res;
if (status === 200) {
dispatch({
type: types.RESTORE_INITIAL_CODE,
payload: data.code
})
});
notification.success({
message: '提示',
description: msg
});
}
});
}

@ -4,11 +4,16 @@
* @Github:
* @Date: 2019-11-20 16:35:46
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-10 19:54:56
* @LastEditTime: 2019-12-13 16:56:22
*/
import types from './actionTypes';
import CONST from '../../constants';
import { fetchPostOjForm, fetchGetOjById, publishTask } from '../../services/ojService';
import {
fetchPostOjForm,
fetchGetOjById,
publishTask,
cancelPublicTask
} from '../../services/ojService';
import { Base64 } from 'js-base64';
import { message, notification, Modal } from 'antd';
import { toStore } from 'educoder';
@ -80,6 +85,18 @@ const payloadInfo = (key, value, errMsg, validateInfo) => ({
}
});
// 接口调用成功后,跳转至列表页
function linkToDev (dispatch, props) {
toStore('oj_description', '');
dispatch({
type: types.IS_MY_SOURCE,
payload: true
});
setTimeout(() => {
props.history.push('/problems');
}, 1000);
}
// 表单提交验证
export const validateOjForm = (props, type) => {
return (dispatch, getState) => {
@ -229,59 +246,39 @@ export const validateOjForm = (props, type) => {
paramsObj['identifier'] = identifier;
}
// 接口调用成功后,跳转至列表页
function linkToDev () {
toStore('oj_description', '');
dispatch({
type: types.IS_MY_SOURCE,
payload: true
});
setTimeout(() => {
props.history.push('/problems');
}, 1000);
}
// 调用保存或更新
if (type === 'publish') {
// 提示发布信息
Modal.confirm({
title: '提示',
content: `
发布后即可应用到自己管理的课堂,
是否确定发布?`,
okText: '确定',
cancelText: '取消',
onOk () {
publishTask(identifier).then(res => {
if (res.data.status === 0) {
message.success('发布成功!');
linkToDev();
}
dispatch({
type: types.PUBLISH_LOADING_STATUS,
payload: false
});
}).catch(() => {
dispatch({
type: types.PUBLISH_LOADING_STATUS,
payload: false
});
});
},
onCancel () {
dispatch({
type: types.PUBLISH_LOADING_STATUS,
payload: false
publishTask(identifier).then(res => {
if (res.data.status === 0) {
// message.success('发布成功!');
notification.success({
message: '提示',
description: '发布成功!'
});
linkToDev(dispatch, props);
}
dispatch({
type: types.PUBLISH_LOADING_STATUS,
payload: false
});
}).catch(() => {
dispatch({
type: types.PUBLISH_LOADING_STATUS,
payload: false
});
});
} else {
// 调用更新
fetchPostOjForm(paramsObj).then(res => {
if (res.status === 200) { // 保存成功后,重新跳转至列表页
if (res.data.identifier) {
message.success('保存成功!');
linkToDev();
if (res.data.status === 0) {
// message.success(paramsObj['submitType'] === 'update' ? '更新成功' : '保存成功');
notification.success({
message: '提示',
description: paramsObj['submitType'] === 'update' ? '更新成功' : '保存成功'
});
linkToDev(dispatch, props);
}
dispatch({
type: types.SUBMIT_LOADING_STATUS,
@ -299,6 +296,33 @@ export const validateOjForm = (props, type) => {
}
}
};
// 撤销发布
export const handleClickCancelPublish = (props, identifier) => {
return (dispatch) => {
cancelPublicTask(identifier).then(res => {
dispatch({
type: types.PUBLISH_LOADING_STATUS,
payload: false
});
if (res.status = 200) {
const { data} = res;
if (data.status === 0) {
// message.success('撤销发布成功!');
notification.success({
message: '提示',
description: '撤销发布成功!'
});
linkToDev(dispatch, props);
}
}
}).catch(() => {
dispatch({
type: types.PUBLISH_LOADING_STATUS,
payload: false
});
})
}
}
// 保存提交的代码
export const saveOjFormCode = (value) => {
return {

@ -4,7 +4,7 @@
* @Github:
* @Date: 2019-11-20 16:40:32
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-09 16:30:46
* @LastEditTime: 2019-12-13 11:54:35
*/
import { Base64 } from 'js-base64';
import types from '../actions/actionTypes';
@ -146,12 +146,16 @@ const ojFormReducer = (state = initialState, action) => {
const { position } = action.payload;
// 根据 position 去查找当前元素在数组中的位置
const index = state.testCases.findIndex((item) => item.position === position);
const tempTestCase = state.testCases || [];
const tempTestValicate = state.testCasesValidate || [];
if (index > -1) {
state.testCases.splice(index, 1); // 删除当前元素
state.testCasesValidate.splice(index, 1); // 删除测试用例对应的校验
tempTestCase.splice(index, 1); // 删除当前元素
tempTestValicate.splice(index, 1); // 删除测试用例对应的校验
}
return {
...state
...state,
testCases: [...tempTestCase],
testCasesValidate: [...tempTestValicate]
};
case types.SAVE_OJ_FORM_ID:
state.identifier = action.payload;

@ -4,7 +4,7 @@
* @Github:
* @Date: 2019-11-20 10:55:38
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-10 20:46:16
* @LastEditTime: 2019-12-13 17:03:47
*/
import axios from 'axios';
@ -84,10 +84,10 @@ export async function fetchUserCommitRecordDetail (identifier) {
}
// 恢复初始代码
export async function restoreInitialCode (identifier) {
const url = `/myproblems/${identifier}/restore_initial_code.json`;
return axios.get(url);
}
// export async function restoreInitialCode (identifier) {
// const url = `/myproblems/${identifier}/restore_initial_code.json`;
// return axios.get(url);
// }
// 发布任务
export async function publishTask (identifier) {
@ -95,6 +95,12 @@ export async function publishTask (identifier) {
return axios.post(url);
}
// 撤销发布
export async function cancelPublicTask (identifier) {
const url = `/problems/${identifier}/cancel_publish.json`;
return axios.post(url);
}
// 更新用户编辑代码
export async function fetchUpdateCode (identifier, params) {
const url = `/myproblems/${identifier}/update_code.json`;
@ -109,7 +115,8 @@ export async function fetchUserCodeSubmit (identifier) {
// 恢复初始代码
export async function fetchRestoreInitialCode (identifier) {
const url = `/myproblems/${identifier}/restore_initial_code.json`;
// const url = `/myproblems/${identifier}/restore_initial_code.json`;
const url = `/myproblems/${identifier}/sync_code.json`;
return axios.post(url);
}

Loading…
Cancel
Save