diff --git a/app/controllers/admins/shixun_settings_controller.rb b/app/controllers/admins/shixun_settings_controller.rb index fd06fddb3..37ca45674 100644 --- a/app/controllers/admins/shixun_settings_controller.rb +++ b/app/controllers/admins/shixun_settings_controller.rb @@ -5,9 +5,10 @@ class Admins::ShixunSettingsController < Admins::BaseController shixun_settings = Admins::ShixunSettingsQuery.call(params) @editing_shixuns = shixun_settings.where(status:0).size - @pending_shixuns = shixun_settings.where(status:1).size - @processed_shixuns = shixun_settings.where(status:2).size + @processed_shixuns = shixun_settings.where(status:2, public: 0).size @closed_shixuns = shixun_settings.where(status:3).size + @pending_public_shixuns = shixun_settings.where(public:1).size + @processed_pubic_shixuns = shixun_settings.where(public:2).size @sort_json = { can_copy: params[:can_copy].present? ? params[:can_copy] : false, diff --git a/app/controllers/admins/shixuns_controller.rb b/app/controllers/admins/shixuns_controller.rb index 6593f27c2..86cb9b45f 100644 --- a/app/controllers/admins/shixuns_controller.rb +++ b/app/controllers/admins/shixuns_controller.rb @@ -5,10 +5,8 @@ class Admins::ShixunsController < Admins::BaseController params[:sort_direction] = params[:sort_direction].presence || 'desc' shixuns = Admins::ShixunQuery.call(params) @editing_shixuns = shixuns.where(status:0).size - @pending_shixuns = shixuns.where(status:1).size - @processed_shixuns = shixuns.where(status:2).size + @processed_shixuns = shixuns.where(status:2, public: 0).size @closed_shixuns = shixuns.where(status:3).size - @none_public_shixuns = shixuns.where(public:0).size @pending_public_shixuns = shixuns.where(public:1).size @processed_pubic_shixuns = shixuns.where(public:2).size @shixuns_type_check = MirrorRepository.pluck(:type_name,:id) diff --git a/app/controllers/hack_user_lastest_codes_controller.rb b/app/controllers/hack_user_lastest_codes_controller.rb index 5f5eddddc..d5405fd71 100644 --- a/app/controllers/hack_user_lastest_codes_controller.rb +++ b/app/controllers/hack_user_lastest_codes_controller.rb @@ -1,10 +1,10 @@ class HackUserLastestCodesController < ApplicationController before_action :require_login, except: [:listen_result] - before_action :find_my_hack, only: [:show, :code_debug, :code_submit, :update_code, :sync_code, + before_action :find_my_hack, only: [:show, :code_debug, :code_submit, :update_code, :sync_code, :add_notes, :listen_result, :result, :submit_records, :restore_initial_code] before_action :update_user_hack_status, only: [:code_debug, :code_submit] - before_action :require_auth_identity, only: [:update_code, :restore_initial_code, :sync_code] - before_action :require_manager_identity, only: [:update_code] + before_action :require_auth_identity, only: [:add_notes] + before_action :require_manager_identity, only: [:show, :update_code, :restore_initial_code, :sync_code] def show @my_hack.update_attribute(:submit_status, 0) if @my_hack.submit_status == 1 @@ -67,7 +67,6 @@ class HackUserLastestCodesController < ApplicationController end - # 提交记录详情 def record_detail @hack_user = HackUserCode.find params[:id] @@ -109,6 +108,11 @@ class HackUserLastestCodesController < ApplicationController end + def add_notes + @my_hack.update_attribute(:notes, params[:notes]) + render_ok + end + private def find_my_hack @my_hack = HackUserLastestCode.find_by(identifier: params[:identifier]) @@ -168,7 +172,7 @@ class HackUserLastestCodesController < ApplicationController # 编程题已经发布,且之前未通关奖励积分 @hack.increment!(:pass_num) if @hack.status == 1 && !@my_hack.passed? - reward_attrs = { container_id: game.id, container_type: 'Hack', score: @hack.score } + reward_attrs = { container_id: @hack.id, container_type: 'Hack', score: @hack.score } RewardGradeService.call(@my_hack.user, reward_attrs) RewardExperienceService.call(@my_hack.user, reward_attrs) # 评测完成更新通过数 diff --git a/app/controllers/hacks_controller.rb b/app/controllers/hacks_controller.rb index f93b2dab5..fec768a19 100644 --- a/app/controllers/hacks_controller.rb +++ b/app/controllers/hacks_controller.rb @@ -188,10 +188,13 @@ class HacksController < ApplicationController def param_update_sets sets, all_sets_id delete_set_ids = all_sets_id - sets.map{|set|set[:id]} @hack.hack_sets.where(id: delete_set_ids).destroy_all + logger.info("#######sets:#{sets}") sets.each do |set| + logger.info("###set[:id]: #{set[:id]}") + logger.info("###all_sets: #{all_sets_id.include?(set[:id])}") if all_sets_id.include?(set[:id]) update_attrs = {input: set[:input], output: set[:output], position: set[:position]} - @hack.hack_sets.find_by!(id: set[:id]).update_attributes(update_attrs) + @hack.hack_sets.find_by!(id: set[:id]).update_attributes!(update_attrs) end end end diff --git a/app/models/hack_set.rb b/app/models/hack_set.rb index 6afe05663..9e2186fb5 100644 --- a/app/models/hack_set.rb +++ b/app/models/hack_set.rb @@ -1,5 +1,5 @@ class HackSet < ApplicationRecord - #validates :input, presence: { message: "测试集输入不能为空" } + validates :input, presence: { message: "测试集输入不能为空" } validates :output, presence: { message: "测试集输出不能为空" } validates_uniqueness_of :input, scope: [:hack_id, :input], message: "多个测试集的输入不能相同" # 编程题测试集 diff --git a/app/models/hack_user_lastest_code.rb b/app/models/hack_user_lastest_code.rb index 830f16dde..99582af41 100644 --- a/app/models/hack_user_lastest_code.rb +++ b/app/models/hack_user_lastest_code.rb @@ -12,4 +12,6 @@ class HackUserLastestCode < ApplicationRecord scope :mine_hack, ->(author_id){ where(user_id: author_id) } scope :passed, -> {where(status: 1)} + validates_length_of :notes, maximum: 5000, message: "笔记不能超过5000个字" + end diff --git a/app/queries/admins/shixun_query.rb b/app/queries/admins/shixun_query.rb index 4f9f4676e..29e087332 100644 --- a/app/queries/admins/shixun_query.rb +++ b/app/queries/admins/shixun_query.rb @@ -13,25 +13,14 @@ class Admins::ShixunQuery < ApplicationQuery all_shixuns = Shixun.all status = case params[:status] - when "editing" then [0] - when "pending" then [1] - when "processed" then [2] - when "closed" then [3] - else - [0,1,2,3] + when "editing" then {status: 0} + when "processed" then {status: 2, public: 0} + when "pending" then {public: 1} + when "publiced" then {public: 2} + when "closed" then {status: 3} end - public = - case params[:public] - when "editing" then [0] - when "pending" then [1] - when "processed" then [2] - else - [0,1,2] - end - - all_shixuns = all_shixuns.where(status: status) if status.present? - all_shixuns = all_shixuns.where(public: public) if public.present? + all_shixuns = all_shixuns.where(status) if status.present? if params[:fork_status].present? all_shixuns = all_shixuns.where.not(fork_from: nil) diff --git a/app/queries/admins/shixun_settings_query.rb b/app/queries/admins/shixun_settings_query.rb index 377e7bf60..1e45952bf 100644 --- a/app/queries/admins/shixun_settings_query.rb +++ b/app/queries/admins/shixun_settings_query.rb @@ -15,16 +15,15 @@ class Admins::ShixunSettingsQuery < ApplicationQuery all_shixuns = all_shixuns.where(id: params[:id]) if params[:id].present? status = - case params[:status] - when "editing" then [0] - when "pending" then [1] - when "processed" then [2] - when "closed" then [3] - else - [0,1,2,3] - end - - all_shixuns = all_shixuns.where(status: status) if status.present? + case params[:status] + when "editing" then {status: 0} + when "processed" then {status: 2, public: 0} + when "pending" then {public: 1} + when "publiced" then {public: 2} + when "closed" then {status: 3} + end + + all_shixuns = all_shixuns.where(status) if status.present? if params[:tag].present? all_shixuns = all_shixuns.joins(:mirror_repositories).where("mirror_repositories.id = ?",params[:tag].to_i) diff --git a/app/services/shixun_search_service.rb b/app/services/shixun_search_service.rb index 248d7d176..32488a7c3 100644 --- a/app/services/shixun_search_service.rb +++ b/app/services/shixun_search_service.rb @@ -33,6 +33,10 @@ class ShixunSearchService < ApplicationService @shixuns = status == "published" ? @shixuns.where(status: 2) : @shixuns.where(status: [0, 1]) end + if params[:no_jupyter] + @shixuns = @shixuns.where(is_jupyter: 0) + end + ## 筛选 难度 if params[:diff].present? && params[:diff].to_i != 0 @shixuns = @shixuns.where(trainee: params[:diff]) diff --git a/app/views/admins/shixun_settings/index.html.erb b/app/views/admins/shixun_settings/index.html.erb index 66286926a..16a02ab96 100644 --- a/app/views/admins/shixun_settings/index.html.erb +++ b/app/views/admins/shixun_settings/index.html.erb @@ -8,7 +8,7 @@
- <% status_options = [['全部', ''], ["编辑中(#{@editing_shixuns})", "editing"], ["待审核(#{@pending_shixuns})", 'pending'], ["已发布(#{@processed_shixuns})", 'processed'],["已关闭(#{@closed_shixuns})",'closed']] %> + <% status_options = [['全部', ''], ["编辑中(#{@editing_shixuns})", "editing"], ["已发布未公开(#{@processed_shixuns})", 'processed'], ["待审核(#{@pending_public_shixuns})", 'pending'], ["已公开(#{@processed_pubic_shixuns})", 'publiced'], ["已关闭(#{@closed_shixuns})",'closed']] %> <%= select_tag(:status, options_for_select(status_options), class: 'form-control') %>
diff --git a/app/views/admins/shixuns/index.html.erb b/app/views/admins/shixuns/index.html.erb index 9bb09f86f..4348f0f45 100644 --- a/app/views/admins/shixuns/index.html.erb +++ b/app/views/admins/shixuns/index.html.erb @@ -8,16 +8,10 @@
- <% status_options = [['全部', ''], ["编辑中(#{@editing_shixuns})", "editing"], ["待审核(#{@pending_shixuns})", 'pending'], ["已发布(#{@processed_shixuns})", 'processed'],["已关闭(#{@closed_shixuns})",'closed']] %> + <% status_options = [['全部', ''], ["编辑中(#{@editing_shixuns})", "editing"], ["已发布未公开(#{@processed_shixuns})", 'processed'], ["待审核(#{@pending_public_shixuns})", 'pending'], ["已公开(#{@processed_pubic_shixuns})", 'publiced'], ["已关闭(#{@closed_shixuns})",'closed']] %> <%= select_tag(:status, options_for_select(status_options), class: 'form-control') %>
-
- - <% public_options = [['全部', ''], ["未公开(#{@none_public_shixuns})", "editing"], ["待审核(#{@pending_public_shixuns})", 'pending'], ["已公开(#{@processed_pubic_shixuns})", 'processed']] %> - <%= select_tag(:public, options_for_select(public_options), class: 'form-control') %> -
-
<%= select_tag(:tag, options_for_select(@shixuns_type_check.unshift(["",nil])), class: 'form-control',id:"tag-choosed") %> diff --git a/app/views/challenges/edit.json.jbuilder b/app/views/challenges/edit.json.jbuilder index c0ea68d9c..9a135ff56 100644 --- a/app/views/challenges/edit.json.jbuilder +++ b/app/views/challenges/edit.json.jbuilder @@ -14,7 +14,7 @@ if @tab == 0 elsif @tab == 1 # 评测设置的编辑模式 json.(@challenge, :id, :path, :exec_path, :show_type, :original_picture_path, :expect_picture_path, :picture_path, - :web_route, :test_set_score, :test_set_average) + :web_route, :test_set_score, :test_set_average, :exec_time) json.has_web_route @shixun.has_web_route? json.test_sets @challenge.test_sets do |set| json.hidden (set.is_public ? 0 : 1) diff --git a/app/views/hack_user_lastest_codes/show.json.jbuilder b/app/views/hack_user_lastest_codes/show.json.jbuilder index 098c24546..a158d074f 100644 --- a/app/views/hack_user_lastest_codes/show.json.jbuilder +++ b/app/views/hack_user_lastest_codes/show.json.jbuilder @@ -5,6 +5,7 @@ json.hack do json.code @my_hack.code json.pass_count @hack.pass_num json.submit_count @hack.submit_num + json.notes @my_hack.notes json.modify_code @modify json.comments_count @hack.discusses.count json.user_praise @hack.praise_treads.select{|pt| pt.user_id == current_user.id}.length > 0 diff --git a/config/routes.rb b/config/routes.rb index 7a68ed5e2..f9ed12dbe 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -90,6 +90,7 @@ Rails.application.routes.draw do get :submit_records post :restore_initial_code post :sync_code + post :add_notes end collection do diff --git a/db/migrate/20191226083915_add_notes_hack_user_lastest_codes.rb b/db/migrate/20191226083915_add_notes_hack_user_lastest_codes.rb new file mode 100644 index 000000000..518e6d610 --- /dev/null +++ b/db/migrate/20191226083915_add_notes_hack_user_lastest_codes.rb @@ -0,0 +1,5 @@ +class AddNotesHackUserLastestCodes < ActiveRecord::Migration[5.2] + def change + add_column :hack_user_lastest_codes, :notes, :longtext + end +end diff --git a/db/migrate/20191226092304_modify_task_pass_2_for_challenges.rb b/db/migrate/20191226092304_modify_task_pass_2_for_challenges.rb new file mode 100644 index 000000000..f03039aa2 --- /dev/null +++ b/db/migrate/20191226092304_modify_task_pass_2_for_challenges.rb @@ -0,0 +1,8 @@ +class ModifyTaskPass2ForChallenges < ActiveRecord::Migration[5.2] + def change + challenges = Challenge.where("task_pass like '%frac%'") + challenges.find_each do |c| + c.update_column(:task_pass, c.task_pass.gsub('\f\frac', '\frac')) + end + end +end diff --git a/public/react/build.zip b/public/react/build.zip new file mode 100644 index 000000000..bcc9974cf Binary files /dev/null and b/public/react/build.zip differ diff --git a/public/react/src/common/components/comment/CommentForm.js b/public/react/src/common/components/comment/CommentForm.js index 7683e2dea..cc4e4efd9 100644 --- a/public/react/src/common/components/comment/CommentForm.js +++ b/public/react/src/common/components/comment/CommentForm.js @@ -4,14 +4,14 @@ * @Github: * @Date: 2019-12-17 17:32:55 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-24 17:27:41 + * @LastEditTime : 2019-12-26 11:11:57 */ import './index.scss'; import React, { useState } from 'react'; import { Form, Button, Input } from 'antd'; import QuillForEditor from '../../quillForEditor'; // import { QuillDeltaToHtmlConverter } from 'quill-delta-to-html' -import {formatDelta} from './util'; +// import {formatDelta} from './util'; const FormItem = Form.Item; function CommentForm (props) { @@ -68,8 +68,9 @@ function CommentForm (props) { const content = ctx; props.form.setFieldsValue({'comment': ''}); setCtx(''); - const _html = formatDelta(content.ops); - onSubmit && onSubmit(_html); + // const _html = formatDelta(content.ops); + 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 7360ddfd6..6332dbd9a 100644 --- a/public/react/src/common/components/comment/CommentItem.js +++ b/public/react/src/common/components/comment/CommentItem.js @@ -4,14 +4,19 @@ * @Github: * @Date: 2019-12-17 17:35:17 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-25 14:53:41 + * @LastEditTime : 2019-12-26 11:30:32 */ import './index.scss'; +import 'quill/dist/quill.core.css'; // 核心样式 +import 'quill/dist/quill.snow.css'; // 有工具栏 +import 'quill/dist/quill.bubble.css'; // 无工具栏 +import 'katex/dist/katex.min.css'; // katex 表达式样式 import React, { useState } from 'react'; import CommentIcon from './CommentIcon'; import { getImageUrl, CNotificationHOC } from 'educoder' import { Icon } from 'antd'; import CommentForm from './CommentForm'; +import QuillForEditor from '../../quillForEditor'; function CommentItem ({ isAdmin, @@ -81,9 +86,19 @@ function CommentItem ({ }; // 评论内容 - const commentCtx = (ctx) => ( -

- ); + const commentCtx = (ctx) => { + let _ctx = null; + try { + _ctx = JSON.parse(ctx); + } catch (e) { + _ctx = ctx; + } + return ( + + )}; // 加载更多 const handleOnLoadMore = (len) => { @@ -182,6 +197,13 @@ function CommentItem ({ type={!hidden ? "xianshi" : 'yincang1'} iconClick={() => handleShowOrHide(id, !hidden ? 1 : 0)} /> + + deleteComment(id)} + /> {/* 回复 */} { @@ -22,6 +22,8 @@ export const formatDelta = (deltas) => { keys.forEach(key => { text = operate(text, key, element['attributes'][key]); }); + } else if (element['insert']['formula']) { + text = element['insert']['formula']; } } else { const image = element['insert']['image']; @@ -42,7 +44,7 @@ export const formatDelta = (deltas) => { formatted.push(text); }); - + console.log(formatted); return formatted.join(''); } @@ -53,7 +55,7 @@ export const formatDelta = (deltas) => { */ export const operate = (text, key, value) => { let operatedText = null; - + debugger; switch (key) { case 'bold': operatedText = `${text}`; @@ -68,7 +70,7 @@ export const operate = (text, key, value) => { operatedText = `${text}`; break; case 'link': - operatedText = `${text}`; + operatedText = `${text}`; break; default: operatedText = text; diff --git a/public/react/src/common/quillForEditor/index.js b/public/react/src/common/quillForEditor/index.js index 8dcf995f4..8239a0c93 100644 --- a/public/react/src/common/quillForEditor/index.js +++ b/public/react/src/common/quillForEditor/index.js @@ -3,8 +3,8 @@ * @Author: tangjiang * @Github: * @Date: 2019-12-18 08:49:30 - * @LastEditors: tangjiang - * @LastEditTime: 2019-12-20 16:07:37 + * @LastEditors : tangjiang + * @LastEditTime : 2019-12-26 10:22:26 */ import './index.scss'; import 'quill/dist/quill.core.css'; // 核心样式 @@ -32,7 +32,8 @@ function QuillForEditor ({ style = {}, wrapStyle = {}, showUploadImage, - onContentChange + onContentChange, + // getQuillContent }) { // toolbar 默认值 const defaultConfig = [ @@ -54,8 +55,8 @@ function QuillForEditor ({ // 文本内容变化时 const handleOnChange = content => { - // console.log('编辑器内容====》》》》', content); - onContentChange && onContentChange(content); + // getQuillContent && getQuillContent(quill); + onContentChange && onContentChange(content, quill); }; const renderOptions = options || defaultConfig; diff --git a/public/react/src/modules/developer/components/controlSetting/index.js b/public/react/src/modules/developer/components/controlSetting/index.js index 502f3ae09..0fcfc278f 100644 --- a/public/react/src/modules/developer/components/controlSetting/index.js +++ b/public/react/src/modules/developer/components/controlSetting/index.js @@ -3,8 +3,8 @@ * @Author: tangjiang * @Github: * @Date: 2019-11-27 16:02:36 - * @LastEditors: tangjiang - * @LastEditTime: 2019-12-20 14:37:39 + * @LastEditors : tangjiang + * @LastEditTime : 2019-12-26 15:17:28 */ import './index.scss'; import React, { useState, useRef, useEffect } from 'react'; @@ -23,7 +23,7 @@ const ControlSetting = (props) => { submitLoading, identifier, excuteState, - showOrHideControl, + // showOrHideControl, commitTestRecordDetail, changeLoadingState, changeSubmitLoadingStatus, diff --git a/public/react/src/modules/developer/components/controlSetting/index.scss b/public/react/src/modules/developer/components/controlSetting/index.scss index 231358ea0..eaa97bea7 100644 --- a/public/react/src/modules/developer/components/controlSetting/index.scss +++ b/public/react/src/modules/developer/components/controlSetting/index.scss @@ -31,6 +31,14 @@ opacity: 0; } } + + .ant-tabs-bar{ + padding: 0; + } + + .ant-tabs-nav .ant-tabs-tab{ + padding: 12px 0px; + } } @@ -52,7 +60,7 @@ z-index: 20; height: 56px; padding-right: 20px; - padding-left: 10px; + padding-left: 5px; background: rgba(18,28,36,1); // background:rgba(48,48,48,1); } diff --git a/public/react/src/modules/developer/components/execResult/index.js b/public/react/src/modules/developer/components/execResult/index.js index fe90e904b..fad322160 100644 --- a/public/react/src/modules/developer/components/execResult/index.js +++ b/public/react/src/modules/developer/components/execResult/index.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-11-28 08:44:54 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-25 11:42:10 + * @LastEditTime : 2019-12-26 08:51:21 */ import './index.scss'; import React, { useState, useEffect } from 'react'; @@ -80,6 +80,13 @@ function ExecResult (props) { ); } else if (state === 4){ + return ( +

+ {/* 系统繁忙,请稍后重试 */} + {error_msg} +

+ ) + } else if (state === 3) { return (

系统繁忙,请稍后重试 diff --git a/public/react/src/modules/developer/components/initTabCtx/index.scss b/public/react/src/modules/developer/components/initTabCtx/index.scss index 5427aa374..992d49534 100644 --- a/public/react/src/modules/developer/components/initTabCtx/index.scss +++ b/public/react/src/modules/developer/components/initTabCtx/index.scss @@ -41,7 +41,7 @@ } } .flex_l{ - padding: 0 10px 0 20px; + padding: 0 10px 0 10px; color: #fff; } .flex_r{ diff --git a/public/react/src/modules/developer/components/myMonacoEditor/index.js b/public/react/src/modules/developer/components/myMonacoEditor/index.js index 261818092..facff0b75 100644 --- a/public/react/src/modules/developer/components/myMonacoEditor/index.js +++ b/public/react/src/modules/developer/components/myMonacoEditor/index.js @@ -3,8 +3,8 @@ * @Author: tangjiang * @Github: * @Date: 2019-11-27 15:02:52 - * @LastEditors: tangjiang - * @LastEditTime: 2019-12-20 20:07:11 + * @LastEditors : tangjiang + * @LastEditTime : 2019-12-26 15:19:34 */ import './index.scss'; import React, { useState, useRef, useEffect } from 'react'; @@ -155,7 +155,7 @@ function MyMonacoEditor (props, ref) { onClick={handleUpdateNotice} > {/* */} - + {/* {renderRestore} */} @@ -174,7 +174,7 @@ function MyMonacoEditor (props, ref) { placement="bottom" title="设置" > - +

{ const { - key, + // key, // onSubmitTest, onDeleteTest, testCase, diff --git a/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.js b/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.js index 01b78038b..2e345c489 100644 --- a/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.js +++ b/public/react/src/modules/developer/newOrEditTask/leftpane/editorTab/index.js @@ -3,8 +3,8 @@ * @Author: tangjiang * @Github: * @Date: 2019-11-20 10:35:40 - * @LastEditors: tangjiang - * @LastEditTime: 2019-12-20 16:53:55 + * @LastEditors : tangjiang + * @LastEditTime : 2019-12-26 16:00:57 */ import './index.scss'; // import 'katex/dist/katex.css'; @@ -222,10 +222,16 @@ class EditTab extends React.Component { } // 描述信息变化时 - const handleContentChange = (content) => { + const handleContentChange = (content, quill) => { console.log('描述信息为: ', content); - // 保存获取的描述信息至redux中 - this.handleChangeDescription(content); + // if (quill.getText()) + console.log('========>>>>>', quill.getText().length); + if (quill.getText().length === 1) { + this.handleChangeDescription(''); + } else { + // 保存获取的描述信息至redux中 + this.handleChangeDescription(content); + } } // 编辑器配置信息 const quillConfig = [ diff --git a/public/react/src/modules/developer/newOrEditTask/leftpane/index.js b/public/react/src/modules/developer/newOrEditTask/leftpane/index.js index ec0ca1416..53807cfe2 100644 --- a/public/react/src/modules/developer/newOrEditTask/leftpane/index.js +++ b/public/react/src/modules/developer/newOrEditTask/leftpane/index.js @@ -58,7 +58,7 @@ function LeftPane (props) {
    { renderNavItem }
-
+
{ renderComp }
diff --git a/public/react/src/modules/developer/newOrEditTask/rightpane/index.js b/public/react/src/modules/developer/newOrEditTask/rightpane/index.js index 69b67d60e..49d9f9b2a 100644 --- a/public/react/src/modules/developer/newOrEditTask/rightpane/index.js +++ b/public/react/src/modules/developer/newOrEditTask/rightpane/index.js @@ -3,8 +3,8 @@ * @Author: tangjiang * @Github: * @Date: 2019-12-01 10:18:35 - * @LastEditors: tangjiang - * @LastEditTime: 2019-12-09 11:38:15 + * @LastEditors : tangjiang + * @LastEditTime : 2019-12-26 13:51:40 */ import './index.scss'; import React from 'react'; @@ -25,15 +25,15 @@ function RightPane (props, ref) { // let timer = null; // 代码改变时,保存 const handleCodeChange = (updateCode) => { - // 保存用户输入的代码 - // if (!timer) { - // timer = setInterval(() => { - // clearInterval(timer); - // timer = null; - // if (updateCode) { - // console.log('调用更新代码------>>>>>>', updateCode); - // } - // }, 3000); + // if (props.identifier) { + // // 保存用户输入的代码 + // if (!timer) { + // timer = setInterval(() => { + // clearInterval(timer); + // timer = null; + + // }, 3000); + // } // } saveOjFormCode(updateCode); } diff --git a/public/react/src/modules/developer/newOrEditTask/rightpane/initTabCtx/index.scss b/public/react/src/modules/developer/newOrEditTask/rightpane/initTabCtx/index.scss index dc2d07d63..741664ae3 100644 --- a/public/react/src/modules/developer/newOrEditTask/rightpane/initTabCtx/index.scss +++ b/public/react/src/modules/developer/newOrEditTask/rightpane/initTabCtx/index.scss @@ -41,7 +41,7 @@ } } .flex_l{ - padding: 0 10px 0 20px; + padding: 0 10px 0 10px; color: #fff; } .flex_r{ diff --git a/public/react/src/modules/developer/recordDetail/index.js b/public/react/src/modules/developer/recordDetail/index.js index eadc514a2..f57d93f4e 100644 --- a/public/react/src/modules/developer/recordDetail/index.js +++ b/public/react/src/modules/developer/recordDetail/index.js @@ -3,8 +3,8 @@ * @Author: tangjiang * @Github: * @Date: 2019-12-04 08:36:21 - * @LastEditors: tangjiang - * @LastEditTime: 2019-12-20 20:05:57 + * @LastEditors : tangjiang + * @LastEditTime : 2019-12-26 14:04:16 */ import './index.scss'; import React, { useState, useEffect } from 'react'; @@ -15,6 +15,7 @@ import { Link } from 'react-router-dom'; import MonacoEditor from '@monaco-editor/react'; import { connect } from 'react-redux'; // import { getImageUrl } from 'educoder'; +import { withRouter } from 'react-router' import actions from '../../../redux/actions'; import CONST from '../../../constants'; import UserInfo from '../components/userInfo'; @@ -53,6 +54,12 @@ function RecordDetail (props) { } }, [recordDetail]); + const handleReturn = (identifier) => { + if (identifier) { + saveEditorCodeForDetail(''); + props.history.push(`/myproblems/${identifier}`); + } + } return (
@@ -67,8 +74,9 @@ function RecordDetail (props) { {detail.name || 'test'}
-
@@ -89,7 +97,7 @@ function RecordDetail (props) { 语言: {detail.language} - 执行用时: {`${detail.execute_time && (+detail.execute_time * 1000)}ms`} + 执行用时: {`${detail.execute_time && Number(detail.execute_time * 1000).toFixed(2)}ms`}
@@ -134,7 +142,7 @@ const mapDispatchToProps = (dispatch) => ({ saveEditorCodeForDetail: (code) => dispatch(actions.saveEditorCodeForDetail(code)) }); -export default connect( +export default withRouter(connect( mapStateToProps, mapDispatchToProps -)(RecordDetail); \ No newline at end of file +)(RecordDetail)); \ No newline at end of file diff --git a/public/react/src/modules/developer/split_pane_resizer.scss b/public/react/src/modules/developer/split_pane_resizer.scss index cd8ce22ca..8fc8b525f 100644 --- a/public/react/src/modules/developer/split_pane_resizer.scss +++ b/public/react/src/modules/developer/split_pane_resizer.scss @@ -148,8 +148,9 @@ } .Resizer { + position: relative; background: #000; - opacity: 0.2; + // opacity: 0.2; z-index: 1; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; diff --git a/public/react/src/modules/developer/studentStudy/index.js b/public/react/src/modules/developer/studentStudy/index.js index 9039bf3ac..2c7134c5b 100644 --- a/public/react/src/modules/developer/studentStudy/index.js +++ b/public/react/src/modules/developer/studentStudy/index.js @@ -3,8 +3,8 @@ * @Author: tangjiang * @Github: * @Date: 2019-11-23 10:53:19 - * @LastEditors: tangjiang - * @LastEditTime: 2019-12-20 14:54:39 + * @LastEditors : tangjiang + * @LastEditTime : 2019-12-26 15:02:12 */ import './index.scss'; import React, { useEffect, useState } from 'react'; @@ -25,9 +25,9 @@ function StudentStudy (props) { const [hasUpdate, setHasUpdate] = useState(true); const { - // hack, + hack, userInfo, - hack_identifier, + // hack_identifier, // user_program_identifier, restoreInitialCode, changeShowOrHideControl @@ -85,13 +85,13 @@ function StudentStudy (props) { // } // }); } - const _hack_id = hack_identifier || fromStore('hack_identifier'); - + // const _hack_id = hack_identifier || fromStore('hack_identifier'); // 处理编辑 - const handleClickEditor = () => { + const handleClickEditor = (identifier) => { + if (!identifier) return; changeShowOrHideControl(false); props.saveEditorCodeForDetail(); - props.history.push(`/problems/${_hack_id}/edit`); + props.history.push(`/problems/${identifier}/edit`); props.clearOjForUserReducer(); } // 处理退出 @@ -115,13 +115,13 @@ function StudentStudy (props) {
*/}
- 乘积最大序列 {hasUpdate} + {hack.name}
{/* to={`/problems/${_hack_id}/edit`} */} handleClickEditor(hack.identifier)} className={`quit-btn`} > 编辑 diff --git a/public/react/src/modules/developer/studentStudy/index.scss b/public/react/src/modules/developer/studentStudy/index.scss index 68835f2ce..aaebee9af 100644 --- a/public/react/src/modules/developer/studentStudy/index.scss +++ b/public/react/src/modules/developer/studentStudy/index.scss @@ -1,6 +1,52 @@ @import '../split_pane_resizer.scss'; .split-pane-area{ height: calc(100vh - 65px); + + .right_pane_code_wrap{ + position: relative; + + .editor_nodte_area, + .student_notes{ + position: absolute; + z-index: 100; + } + .student_notes{ + right: 0px; + top: 50%; + width: 36px; + height: 36px; + margin-top: -18px; + border-radius: 50%; + background: #5091FF; + color: #fff; + font-size: 18px; + text-align: center; + transform: translateX(18px); + cursor: pointer; + opacity: 0.5; + transition: all .3s; + &:hover{ + opacity: 1; + transform: translateX(-10px); + } + } + .editor_nodte_area{ + right: 10px; + top: 50%; + width: 450px; + height: 200px; + margin-top: -100px; + background: #fff; + border-radius: 5px; + padding: 14px 10px 0; + // opacity: ; + transform: translateX(500px); + transition: all .3s; + &.active{ + transform: translateX(0px); + } + } + } } .right_pane_code_wrap{ diff --git a/public/react/src/modules/developer/studentStudy/leftpane/comment/index.js b/public/react/src/modules/developer/studentStudy/leftpane/comment/index.js index 9b4287e76..25b538bc0 100644 --- a/public/react/src/modules/developer/studentStudy/leftpane/comment/index.js +++ b/public/react/src/modules/developer/studentStudy/leftpane/comment/index.js @@ -4,7 +4,7 @@ * @Github: * @Date: 2019-11-27 09:49:35 * @LastEditors : tangjiang - * @LastEditTime : 2019-12-25 10:55:44 + * @LastEditTime : 2019-12-26 10:43:45 */ import './index.scss'; import React, { useEffect, useState } from 'react'; diff --git a/public/react/src/modules/developer/studentStudy/rightpane/index.js b/public/react/src/modules/developer/studentStudy/rightpane/index.js index 054997359..cf264c67b 100644 --- a/public/react/src/modules/developer/studentStudy/rightpane/index.js +++ b/public/react/src/modules/developer/studentStudy/rightpane/index.js @@ -3,15 +3,20 @@ * @Author: tangjiang * @Github: * @Date: 2019-11-27 14:59:51 - * @LastEditors: tangjiang - * @LastEditTime: 2019-12-20 14:01:57 + * @LastEditors : tangjiang + * @LastEditTime : 2019-12-26 17:56:51 */ import React, { useState, useEffect } from 'react'; import {connect} from 'react-redux'; import MyMonacoEditor from '../../components/myMonacoEditor'; import ControlSetting from '../../components/controlSetting'; import actions from '../../../../redux/actions'; - +// import QuillForEditor from '../../../../common/quillForEditor'; +// import TextArea from 'antd/lib/input/TextArea'; +import { Input, Form, Button } from 'antd'; +// import FormItem from 'antd/lib/form/FormItem'; +const { TextArea } = Input; +const FormItem = Form.Item; const RightPane = (props) => { const { @@ -20,6 +25,7 @@ const RightPane = (props) => { submitUserCode, input, hack, + loading, notice, updateCode, hadCodeUpdate, @@ -27,12 +33,15 @@ const RightPane = (props) => { updateNotice, saveUserInputCode, restoreInitialCode, - saveOpacityType, - saveUserCodeForInterval + // saveOpacityType, + saveUserCodeForInterval, + addNotes, + changeLoadingState } = props; const [editorCode, setEditorCode] = useState(''); - + const [noteClazz, setNoteClazz] = useState('editor_nodte_area'); + const [noteCount] = useState(5000); let initFlag = true; useEffect(() => { if (editor_code) { @@ -86,6 +95,28 @@ const RightPane = (props) => { updateNotice && updateNotice(); }; + const handleClickNote = () => { + setNoteClazz('editor_nodte_area active'); + } + + const handleCancelNote = () => { + props.form.resetFields(); + setNoteClazz('editor_nodte_area'); + } + + const handleSubmitNote = () => { + props.form.validateFields((err, values) => { + if (!err) { + changeLoadingState(true); + addNotes(identifier, values, function () { + setNoteClazz('editor_nodte_area'); + props.form.resetFields(); + }); + } + }); + } + + const { getFieldDecorator } = props.form; return (
{ onUpdateNotice={handleUpdateNotice} onRestoreInitialCode={handleRestoreInitialCode} /> + + + + {/*
+