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

chromesetting
杨树明 5 years ago
commit 04f714c384

@ -23,7 +23,7 @@ class HackUserLastestCodesController < ApplicationController
# 同步代码 # 同步代码
def sync_code 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 end
# 调试代码 # 调试代码

@ -12,4 +12,5 @@ json.homework_type homework.homework_type
if homework.homework_type == "practice" if homework.homework_type == "practice"
json.shixun_identifier homework.shixuns.take.try(:identifier) json.shixun_identifier homework.shixuns.take.try(:identifier)
json.shixun_id homework.shixuns.take.try(:id) json.shixun_id homework.shixuns.take.try(:id)
json.shixun_status homework.shixuns.take.try(:status).to_i
end end

@ -29,6 +29,7 @@ json.homeworks @homework_commons.each do |homework|
if @user_course_identity < Course::STUDENT if @user_course_identity < Course::STUDENT
if homework.homework_type == "practice" if homework.homework_type == "practice"
json.shixun_identifier homework.shixuns.take.try(:identifier) json.shixun_identifier homework.shixuns.take.try(:identifier)
json.shixun_status homework.shixuns.take.try(:status).to_i
end end
elsif @user_course_identity == Course::STUDENT elsif @user_course_identity == Course::STUDENT
if homework.homework_type == "practice" if homework.homework_type == "practice"

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

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

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

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

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

@ -4,7 +4,7 @@
* @Github: * @Github:
* @Date: 2019-11-23 10:53:19 * @Date: 2019-11-23 10:53:19
* @LastEditors: tangjiang * @LastEditors: tangjiang
* @LastEditTime: 2019-12-12 19:08:24 * @LastEditTime: 2019-12-13 17:19:15
*/ */
import './index.scss'; import './index.scss';
import React, { useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
@ -23,15 +23,15 @@ import { withRouter } from 'react-router';
function StudentStudy (props) { function StudentStudy (props) {
const [hasUpdate, setHasUpdate] = useState(true);
const { const {
// hack,
userInfo, userInfo,
hack_identifier hack_identifier,
// user_program_identifier,
restoreInitialCode
} = props; } = props;
// 是否更新
const [isUpdate, setIsUpdate] = useState(true);
useEffect(() => {
const { const {
match: { params }, match: { params },
getUserProgramDetail, getUserProgramDetail,
@ -39,6 +39,8 @@ function StudentStudy (props) {
} = props; } = props;
let { id } = params; let { id } = params;
useEffect(() => {
// 保存当前的id // 保存当前的id
saveUserProgramIdentifier(id); saveUserProgramIdentifier(id);
// startProgramQuestion(id); // startProgramQuestion(id);
@ -46,10 +48,9 @@ function StudentStudy (props) {
}, []); }, []);
useEffect(() => { useEffect(() => {
console.log('=======>>>>>>>>');
const { hack = {} } = props; const { hack = {} } = props;
if (!hack.modify_code && isUpdate) { // 代码更改,提示是否需要更新代码 if (hack.modify_code && hasUpdate) { // 代码更改,提示是否需要更新代码
setIsUpdate(false); setHasUpdate(false);
Modal.confirm({ Modal.confirm({
title: '提示', title: '提示',
content: ( content: (
@ -61,30 +62,11 @@ function StudentStudy (props) {
okText: '立即更新', okText: '立即更新',
cancelText: '稍后再说', cancelText: '稍后再说',
onOk () { onOk () {
console.log('更新代码....'); restoreInitialCode(id, '更新成功');
} }
}); });
} }
}, [props]); }, [props, hasUpdate, setHasUpdate]);
// useEffect(() => {
// const {hack} = props;
// if (!hack.modify_code) { // 代码更改,提示是否需要更新代码
// Modal.confirm({
// title: '提示',
// content: (
// <p>
// 代码文件有更新啦 <br />
// 还未提交的代码,请自行保存
// </p>
// ),
// okText: '立即更新',
// cancelText: '稍后再说',
// onOk () {
// console.log('更新代码....');
// }
// });
// }
// }, [props]);
const _hack_id = hack_identifier || fromStore('hack_identifier'); const _hack_id = hack_identifier || fromStore('hack_identifier');
@ -110,7 +92,7 @@ function StudentStudy (props) {
</div> */} </div> */}
<UserInfo userInfo={userInfo}/> <UserInfo userInfo={userInfo}/>
<div className={'study_name'}> <div className={'study_name'}>
<span>乘积最大序列</span> <span>乘积最大序列 {hasUpdate}</span>
</div> </div>
<div className={'study_quit'}> <div className={'study_quit'}>
{/* to={`/problems/${_hack_id}/edit`} */} {/* to={`/problems/${_hack_id}/edit`} */}
@ -146,9 +128,11 @@ function StudentStudy (props) {
const mapStateToProps = (state) => { const mapStateToProps = (state) => {
const { userInfo } = state.userReducer; const { userInfo } = state.userReducer;
const { hack_identifier } = state.ojForUserReducer; const { hack_identifier, user_program_identifier, hack } = state.ojForUserReducer;
return { return {
hack,
userInfo, userInfo,
user_program_identifier,
hack_identifier hack_identifier
}; };
}; };
@ -159,7 +143,9 @@ const mapDispatchToProps = (dispatch) => ({
// 调用编程题详情 // 调用编程题详情
getUserProgramDetail: (id) => dispatch(actions.getUserProgramDetail(id)), getUserProgramDetail: (id) => dispatch(actions.getUserProgramDetail(id)),
saveUserProgramIdentifier: (id) => dispatch(actions.saveUserProgramIdentifier(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( export default withRouter(connect(

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

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

@ -4,7 +4,7 @@
* @Github: * @Github:
* @Date: 2019-11-20 16:35:46 * @Date: 2019-11-20 16:35:46
* @LastEditors: tangjiang * @LastEditors: tangjiang
* @LastEditTime: 2019-12-13 10:46:15 * @LastEditTime: 2019-12-13 16:56:22
*/ */
import types from './actionTypes'; import types from './actionTypes';
import CONST from '../../constants'; import CONST from '../../constants';
@ -251,7 +251,11 @@ export const validateOjForm = (props, type) => {
// 提示发布信息 // 提示发布信息
publishTask(identifier).then(res => { publishTask(identifier).then(res => {
if (res.data.status === 0) { if (res.data.status === 0) {
message.success('发布成功!'); // message.success('发布成功!');
notification.success({
message: '提示',
description: '发布成功!'
});
linkToDev(dispatch, props); linkToDev(dispatch, props);
} }
dispatch({ dispatch({
@ -269,7 +273,11 @@ export const validateOjForm = (props, type) => {
fetchPostOjForm(paramsObj).then(res => { fetchPostOjForm(paramsObj).then(res => {
if (res.status === 200) { // 保存成功后,重新跳转至列表页 if (res.status === 200) { // 保存成功后,重新跳转至列表页
if (res.data.status === 0) { if (res.data.status === 0) {
message.success(paramsObj['submitType'] === 'update' ? '更新成功' : '保存成功'); // message.success(paramsObj['submitType'] === 'update' ? '更新成功' : '保存成功');
notification.success({
message: '提示',
description: paramsObj['submitType'] === 'update' ? '更新成功' : '保存成功'
});
linkToDev(dispatch, props); linkToDev(dispatch, props);
} }
dispatch({ dispatch({
@ -299,7 +307,11 @@ export const handleClickCancelPublish = (props, identifier) => {
if (res.status = 200) { if (res.status = 200) {
const { data} = res; const { data} = res;
if (data.status === 0) { if (data.status === 0) {
message.success('撤销发布成功!'); // message.success('撤销发布成功!');
notification.success({
message: '提示',
description: '撤销发布成功!'
});
linkToDev(dispatch, props); linkToDev(dispatch, props);
} }
} }

@ -4,7 +4,7 @@
* @Github: * @Github:
* @Date: 2019-11-20 10:55:38 * @Date: 2019-11-20 10:55:38
* @LastEditors: tangjiang * @LastEditors: tangjiang
* @LastEditTime: 2019-12-13 10:09:12 * @LastEditTime: 2019-12-13 17:03:47
*/ */
import axios from 'axios'; import axios from 'axios';
@ -84,10 +84,10 @@ export async function fetchUserCommitRecordDetail (identifier) {
} }
// 恢复初始代码 // 恢复初始代码
export async function restoreInitialCode (identifier) { // export async function restoreInitialCode (identifier) {
const url = `/myproblems/${identifier}/restore_initial_code.json`; // const url = `/myproblems/${identifier}/restore_initial_code.json`;
return axios.get(url); // return axios.get(url);
} // }
// 发布任务 // 发布任务
export async function publishTask (identifier) { export async function publishTask (identifier) {
@ -115,7 +115,8 @@ export async function fetchUserCodeSubmit (identifier) {
// 恢复初始代码 // 恢复初始代码
export async function fetchRestoreInitialCode (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); return axios.post(url);
} }

Loading…
Cancel
Save