diff --git a/public/react/src/common/components/comment/CommentForm.js b/public/react/src/common/components/comment/CommentForm.js index cc4e4efd9..da4814a9e 100644 --- a/public/react/src/common/components/comment/CommentForm.js +++ b/public/react/src/common/components/comment/CommentForm.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-12-17 17:32:55 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-26 11:11:57 + * @LastEditTime : 2019-12-26 18:43:21 */ import './index.scss'; import React, { useState } from 'react'; @@ -69,7 +69,7 @@ function CommentForm (props) { props.form.setFieldsValue({'comment': ''}); setCtx(''); // const _html = formatDelta(content.ops); - console.log('保存的内容=====》》》》', content); + // console.log('保存的内容=====》》》》', content); onSubmit && onSubmit(JSON.stringify(content)); } }); diff --git a/public/react/src/common/components/comment/CommentItem.js b/public/react/src/common/components/comment/CommentItem.js index 6332dbd9a..5cd39b8e0 100644 --- a/public/react/src/common/components/comment/CommentItem.js +++ b/public/react/src/common/components/comment/CommentItem.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-12-17 17:35:17 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-26 11:30:32 + * @LastEditTime : 2019-12-26 20:00:56 */ import './index.scss'; import 'quill/dist/quill.core.css'; // 核心样式 @@ -36,6 +36,8 @@ function CommentItem ({ const [showItemCount, setShowItemCount] = useState(5); // 箭头方向 const [arrow, setArrow] = useState(false); + // 上传图片的ulr + const [url, setUrl] = useState(''); const { author = {}, // 作者 @@ -85,6 +87,10 @@ function CommentItem ({ ); }; + const handleShowUploadImage = (url) => { + console.log('==============>>>>>>>>>>>>',url); + setUrl(url); + } // 评论内容 const commentCtx = (ctx) => { let _ctx = null; @@ -97,6 +103,7 @@ function CommentItem ({ )}; @@ -181,6 +188,10 @@ function CommentItem ({ } } + const handleClose = () => { + setUrl(''); + } + return (
  • {commentAvatar(author)} @@ -225,11 +236,17 @@ function CommentItem ({
    -
    + + {/* 显示上传的图片信息 */} +
    + + +
  • ); diff --git a/public/react/src/common/components/comment/index.scss b/public/react/src/common/components/comment/index.scss index d881e5bee..db327c82f 100644 --- a/public/react/src/common/components/comment/index.scss +++ b/public/react/src/common/components/comment/index.scss @@ -87,6 +87,39 @@ $ml: 20px; // .comment_item_quill{ // // margin-top: 10px; // } + .show_upload_image{ + position: fixed; + left: 0; + top: 0; + right: 0; + bottom: 0; + z-index: 1000; + &::before{ + position: absolute; + height: 100%; + width:100%; + content: ''; + background: #000; + opacity: .5; + } + + .image_info{ + position: absolute; + width: 80%; + height: 80%; + left: 10%; + top: 10%; + background: green; + } + + .image_close{ + position: absolute; + right: 20px; + top: 20px; + color: #fff; + cursor: pointer; + } + } } .comment_icon_count{ cursor: pointer; diff --git a/public/react/src/common/quillForEditor/ImageBlot.js b/public/react/src/common/quillForEditor/ImageBlot.js index 1b474d5dc..0316b1325 100644 --- a/public/react/src/common/quillForEditor/ImageBlot.js +++ b/public/react/src/common/quillForEditor/ImageBlot.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-12-16 15:50:45 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-24 09:44:03 + * @LastEditTime : 2019-12-27 08:57:37 */ import Quill from "quill"; @@ -15,25 +15,38 @@ export default class ImageBlot extends BlockEmbed { static create(value) { const node = super.create(); - node.setAttribute('alt', value.alt); node.setAttribute('src', value.url); - + console.log('~~~~~~~~~~~', node, value); + node.addEventListener('click', function () { + value.onclick(value.url); + }, false); if (value.width) { node.setAttribute('width', value.width); } if (value.height) { node.setAttribute('height', value.height); } + + if (value.id) { + node.setAttribute('id', value.id); + } // 宽度和高度都不存在时, if (!value.width && !value.height) { - node.setAttribute('display', 'block'); + // node.setAttribute('display', 'block'); node.setAttribute('width', '100%'); } + + node.setAttribute('style', { cursor: 'pointer' }); + + // if (node.onclick) { + // console.log('image 有图片点击事件======》》》》》》'); + // // node.setAttribute('onclick', node.onCLick); + // } // 给图片添加点击事件 - node.onclick = () => { - value.onClick && value.onClick(value.url); - } + // node.onclick = () => { + // value.onClick && value.onClick(value.url); + // } return node; } @@ -45,7 +58,9 @@ export default class ImageBlot extends BlockEmbed { onclick: node.onclick, width: node.width, height: node.height, - display: node.getAttribute('display') + display: node.getAttribute('display'), + id: node.id, + style: node.style }; } } diff --git a/public/react/src/common/quillForEditor/index.js b/public/react/src/common/quillForEditor/index.js index 8239a0c93..330ecfed9 100644 --- a/public/react/src/common/quillForEditor/index.js +++ b/public/react/src/common/quillForEditor/index.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-12-18 08:49:30 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-26 10:22:26 + * @LastEditTime : 2019-12-26 19:36:00 */ import './index.scss'; import 'quill/dist/quill.core.css'; // 核心样式 @@ -116,9 +116,22 @@ function QuillForEditor ({ // 设置值 useEffect(() => { if (!quill) return + + // debugger; const previous = quill.getContents() - const current = value + + if (value && value.hasOwnProperty('ops')) { + console.log(value.ops); + const ops = value.ops || []; + ops.forEach((item, i) => { + if (item.insert['image']) { + item.insert['image'] = Object.assign({}, item.insert['image'], {style: { cursor: 'pointer' }, onclick: (url) => showUploadImage(url)}); + } + }); + } + const current = value + console.log('+++++', current); if (!deepEqual(previous, current)) { setSelection(quill.getSelection()) if (typeof value === 'string') { diff --git a/public/react/src/modules/developer/components/controlSetting/index.js b/public/react/src/modules/developer/components/controlSetting/index.js index 0fcfc278f..5c970f00e 100644 --- a/public/react/src/modules/developer/components/controlSetting/index.js +++ b/public/react/src/modules/developer/components/controlSetting/index.js @@ -4,11 +4,11 @@ * @Github: * @Date: 2019-11-27 16:02:36 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-26 15:17:28 + * @LastEditTime : 2019-12-27 09:32:34 */ import './index.scss'; import React, { useState, useRef, useEffect } from 'react'; -import { Tabs, Button, Icon } from 'antd'; +import { Tabs, Button, Icon, notification } from 'antd'; import { connect } from 'react-redux'; import InitTabCtx from '../initTabCtx'; import ExecResult from '../execResult'; @@ -18,6 +18,7 @@ const { TabPane } = Tabs; const ControlSetting = (props) => { const { + hack, inputValue, loading, submitLoading, @@ -57,6 +58,13 @@ const ControlSetting = (props) => { // 调试代码 const handleTestCode = (e) => { + if (!hack.code) { + notification.warning({ + message: '提示', + description: '代码块内容不能为空' + }); + return; + } // console.log(formRef.current.handleTestCodeFormSubmit); // 调出控制台界面 setShowTextResult(true); @@ -137,8 +145,9 @@ const ControlSetting = (props) => { const mapStateToProps = (state) => { const {commonReducer, ojForUserReducer} = state; const {loading, excuteState, submitLoading, showOrHideControl } = commonReducer; - const { commitTestRecordDetail } = ojForUserReducer; + const { commitTestRecordDetail, hack } = ojForUserReducer; return { + hack, loading, submitLoading, excuteState, diff --git a/public/react/src/modules/developer/components/initTabCtx/index.js b/public/react/src/modules/developer/components/initTabCtx/index.js index 3e707daa1..831416fab 100644 --- a/public/react/src/modules/developer/components/initTabCtx/index.js +++ b/public/react/src/modules/developer/components/initTabCtx/index.js @@ -3,8 +3,8 @@ * @Author: tangjiang * @Github: * @Date: 2019-11-27 19:46:14 - * @LastEditors: tangjiang - * @LastEditTime: 2019-12-19 10:47:05 + * @LastEditors : tangjiang + * @LastEditTime : 2019-12-26 20:07:35 */ import './index.scss'; import React, { useState, useEffect, useRef, useImperativeHandle, forwardRef } from 'react'; @@ -26,7 +26,7 @@ function InitTabCtx (props, ref) { const { inputValue, onDebuggerCode } = props; - console.log('default value', inputValue); + // console.log('default value', inputValue); useImperativeHandle(ref, () => ({ handleTestCodeFormSubmit: (cb) => { // console.log('父组件调用我啦~~~~~~~~~'); @@ -34,9 +34,9 @@ function InitTabCtx (props, ref) { } })); - useEffect(() => { - console.log('初始值: ========', props); - }, [props]); + // useEffect(() => { + // console.log('初始值: ========', props); + // }, [props]); // 渲染文本提示信息 const renderText = () => (请在这里添加测试用例,点击“调试代码”时将从这里读取输入来测试你的代码...); diff --git a/public/react/src/modules/developer/components/myMonacoEditor/index.js b/public/react/src/modules/developer/components/myMonacoEditor/index.js index facff0b75..ed7186102 100644 --- a/public/react/src/modules/developer/components/myMonacoEditor/index.js +++ b/public/react/src/modules/developer/components/myMonacoEditor/index.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-11-27 15:02:52 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-26 15:19:34 + * @LastEditTime : 2019-12-27 09:22:08 */ import './index.scss'; import React, { useState, useRef, useEffect } from 'react'; @@ -53,9 +53,7 @@ function MyMonacoEditor (props, ref) { const editorRef = useRef(null); useEffect(() => { - if (props.code) { - setEditCode(props.code); - } + setEditCode(props.code || ''); }, [props]); useEffect(() => { @@ -125,9 +123,9 @@ function MyMonacoEditor (props, ref) { } } - const renderRestore = identifier ? ( - - ) : ''; + // const renderRestore = identifier ? ( + // + // ) : ''; // lex_has_save ${hadCodeUpdate} ? : '' const _classnames = hadCodeUpdate ? `flex_strict flex_has_save` : 'flex_strict'; diff --git a/public/react/src/modules/developer/newOrEditTask/rightpane/initTabCtx/index.js b/public/react/src/modules/developer/newOrEditTask/rightpane/initTabCtx/index.js index 6933151a2..defb5e3c7 100644 --- a/public/react/src/modules/developer/newOrEditTask/rightpane/initTabCtx/index.js +++ b/public/react/src/modules/developer/newOrEditTask/rightpane/initTabCtx/index.js @@ -75,11 +75,11 @@ class InitTabCtx extends PureComponent { handleTestCodeFormSubmit = (cb) => { const {form, debuggerCode} = this.props; - console.log(debuggerCode); + // console.log(debuggerCode); form.validateFields((err, values) => { if (!err) { // 表单验证通过时,调用测试接口 cb && cb(); // 调用回调函数,切换 tab - console.log('表单值:', values); + // console.log('表单值:', values); debuggerCode(values); } }); diff --git a/public/react/src/modules/developer/recordDetail/index.scss b/public/react/src/modules/developer/recordDetail/index.scss index e52090060..994ebea58 100644 --- a/public/react/src/modules/developer/recordDetail/index.scss +++ b/public/react/src/modules/developer/recordDetail/index.scss @@ -1,6 +1,7 @@ @import '../split_pane_resizer.scss'; .record_detail_area{ + background: #fff; .record_detail_ctx{ padding: 0 20px; .detail_ctx_header{ @@ -39,6 +40,9 @@ } .result_error_area{ margin-top: 15px; + background: rgba(250,250,250,1); + color: #E51C24; + border-radius: 3px; } } } diff --git a/public/react/src/modules/developer/studentStudy/rightpane/index.js b/public/react/src/modules/developer/studentStudy/rightpane/index.js index cf264c67b..259f2f63a 100644 --- a/public/react/src/modules/developer/studentStudy/rightpane/index.js +++ b/public/react/src/modules/developer/studentStudy/rightpane/index.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-11-27 14:59:51 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-26 17:56:51 + * @LastEditTime : 2019-12-27 09:23:15 */ import React, { useState, useEffect } from 'react'; import {connect} from 'react-redux'; @@ -39,10 +39,12 @@ const RightPane = (props) => { changeLoadingState } = props; - const [editorCode, setEditorCode] = useState(''); + const [editorCode, setEditorCode] = useState(editor_code || hack.code); const [noteClazz, setNoteClazz] = useState('editor_nodte_area'); const [noteCount] = useState(5000); - let initFlag = true; + // const [code, setCode] = useState(editor_code || hack.code); + // let initFlag = true; + useEffect(() => { if (editor_code) { setEditorCode(editor_code); @@ -61,24 +63,18 @@ const RightPane = (props) => { let timer = null; // 定时器 // 代码块内容变化时 - const handleCodeChange = (code) => { - // 保存用户提交的代码块 - setEditorCode(code); - // 第一次回填代码内容时不更新; - if (initFlag) { - initFlag = false; - return; - } + const handleCodeChange = (value) => { + saveUserInputCode(value); + setEditorCode(value); if (!timer) { - timer = setInterval(() => { + timer = setInterval(function () { clearInterval(timer); timer = null; - saveUserCodeForInterval && saveUserCodeForInterval(identifier, code); + saveUserCodeForInterval(identifier); }, 3000); } - // 保存用户代码块 - saveUserInputCode(code); } + // 代码调试 const handleDebuggerCode = (value) => { // 调用保存代码块接口,成功后,调用调试接口 diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js index 7be68d6dc..b24d4dc2c 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js @@ -360,11 +360,11 @@ class Challengesjupyter extends Component { let id=this.props.match.params.shixunId; let that=this; Modal.confirm({ - title: '重置实训', + title: '重置环境', content: (

    你在本文件中修改的内容将丢失,
    - 是否确定重新加载初始代码? + 是否确定重置环境?

    ), okText: '确定', @@ -430,9 +430,14 @@ class Challengesjupyter extends Component { ` .ant-notification{ - position: fixed; - z-index: 3000; + position: fixed !important; + z-index: 3000 !important; } + .ant-modal-wrap { + position: fixed !important; + z-index: 3000 !important; + margin-top: 100px !important; + } ` } diff --git a/public/react/src/redux/actions/ojForUser.js b/public/react/src/redux/actions/ojForUser.js index ee78d336e..5cd0cea3a 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-26 18:32:08 + * @LastEditTime : 2019-12-27 09:28:38 */ import types from "./actionTypes"; import { Base64 } from 'js-base64'; @@ -108,25 +108,31 @@ export const getUserProgramDetail = (identifier, type) => { } export const saveUserCodeForInterval = (identifier, code) => { - return (dispatch) => { + return (dispatch, getState) => { + const { userCode } = getState().ojForUserReducer; dispatch({ type: types.AUTO_UPDATE_CODE, payload: true }); + console.log('+++', userCode); fetchUpdateCode(identifier, { - code: Base64.encode(code) + code: userCode }).then(res => { if (res.data.status === 401) { return; }; - + dispatch({ + type: types.RESTORE_INITIAL_CODE, + payload: userCode + }); + setTimeout(() => { dispatch({ type: types.AUTO_UPDATE_CODE, payload: false }) }, 1000); - console.log('代码保存成功', res); + // console.log('代码保存成功', res); }).catch(() => { dispatch({ type: types.AUTO_UPDATE_CODE, diff --git a/public/react/src/redux/reducers/ojForUserReducer.js b/public/react/src/redux/reducers/ojForUserReducer.js index eeaa3c6ca..f78385049 100644 --- a/public/react/src/redux/reducers/ojForUserReducer.js +++ b/public/react/src/redux/reducers/ojForUserReducer.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-11-27 13:41:48 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-26 18:34:56 + * @LastEditTime : 2019-12-27 09:18:02 */ import types from "../actions/actionTypes"; import { Base64 } from 'js-base64'; @@ -94,11 +94,10 @@ const ojForUserReducer = (state = initialState, action) => { } case types.SAVE_USER_CODE: let curCode = Base64.encode(action.payload); - return { ...state, userCode: curCode, - isUpdateCode: true + isUpdateCode: true, } case types.IS_UPDATE_CODE: return { @@ -133,11 +132,13 @@ const ojForUserReducer = (state = initialState, action) => { let restoreCode = action.payload if (restoreCode) { curHack['code'] = Base64.decode(restoreCode); + } else { + curHack['code'] = ''; } - console.log('当前的代码内容:', curHack); + console.log(curHack); return { ...state, - hack: Object.assign({}, curHack) + hack: Object.assign({}, state.hack, curHack) } case types.SAVE_HACK_IDENTIFIER: return {