From 5bfb41ad37c3ca0dcb7a652eb6496d9b8c69cfd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 25 Jul 2019 14:34:46 +0800 Subject: [PATCH 01/25] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/coursesDetail/CoursesLeftNav.js | 4 +- .../courses/coursesPublic/AddcoursesNav.js | 148 +++++++++--------- .../courses/coursesPublic/ModalsRename.js | 124 +++++++-------- public/react/src/modules/paths/Index.js | 108 +++++++------ .../modules/paths/PathDetail/DetailCards.js | 20 ++- .../paths/PathDetail/DetailCardsEditAndAdd.js | 2 +- .../PathDetail/DetailCardsEditAndEdit.js | 2 +- .../paths/PathDetail/PathDetailIndex.js | 6 + 8 files changed, 220 insertions(+), 194 deletions(-) diff --git a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js index 2a395200c..707c4ba9b 100644 --- a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js +++ b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js @@ -408,7 +408,7 @@ class Coursesleftnav extends Component{ this.setState({ Navmodalname:id===2?"新建分班":"添加目录", Navtitles:id===2?"分班名称":"目录名称", - Navplaceholder:id===2?"示例:分班(最佳4个字符)":"示例:第一阶段(最佳4个字符)", + Navplaceholder:"请输入名称,最大限制60个字符", Navmodalnametype:true, Navmodaltypename:id, setnavid:setnavid, @@ -419,7 +419,7 @@ class Coursesleftnav extends Component{ this.setState({ Navmodalname:id===5?"分班重命名":"目录重命名", Navtitles:id===5?"分班名称":"目录名称", - Navplaceholder:id===5?"示例:分班(最佳4个字符)":"示例:第一阶段(最佳4个字符)", + Navplaceholder:"请输入名称,最大限制60个字符", Navmodalnametype:true, Navmodaltypename:id, setnavid:setnavid, diff --git a/public/react/src/modules/courses/coursesPublic/AddcoursesNav.js b/public/react/src/modules/courses/coursesPublic/AddcoursesNav.js index 74c03808a..756ae62a6 100644 --- a/public/react/src/modules/courses/coursesPublic/AddcoursesNav.js +++ b/public/react/src/modules/courses/coursesPublic/AddcoursesNav.js @@ -1,74 +1,74 @@ -import React,{ Component } from "react"; -import { Modal,Checkbox,Input,Select} from "antd"; -const Option = Select.Option; - -class AddcoursesNav extends Component{ - constructor(props){ - super(props); - this.state={ - StudentList_value:"" - } - } - - - - render(){ - // let {StudentList_value}=this.state; - // let {child}=this.props; - // - return( -
- - - - {this.props.addnametab===2? -
-
目录名称:
- -
- 取消 - 确定 -
-
- : this.props.addnametab===4? -
-
选择目录名称:
- - - -
- 取消 - 确定 -
-
- :""} -
- -
- ) - } -} -export default AddcoursesNav; - - +import React,{ Component } from "react"; +import { Modal,Checkbox,Input,Select} from "antd"; +const Option = Select.Option; + +class AddcoursesNav extends Component{ + constructor(props){ + super(props); + this.state={ + StudentList_value:"" + } + } + + + + render(){ + // let {StudentList_value}=this.state; + // let {child}=this.props; + // + return( +
+ + + + {this.props.addnametab===2? +
+
目录名称:
+ +
+ 取消 + 确定 +
+
+ : this.props.addnametab===4? +
+
选择目录名称:
+ + + +
+ 取消 + 确定 +
+
+ :""} +
+ +
+ ) + } +} +export default AddcoursesNav; + + diff --git a/public/react/src/modules/courses/coursesPublic/ModalsRename.js b/public/react/src/modules/courses/coursesPublic/ModalsRename.js index 61d0c1cd7..1398c50ff 100644 --- a/public/react/src/modules/courses/coursesPublic/ModalsRename.js +++ b/public/react/src/modules/courses/coursesPublic/ModalsRename.js @@ -1,63 +1,63 @@ -import React,{ Component } from "react"; -import { Modal,Checkbox,Upload,Button,Icon,message,Input} from "antd"; -import axios from 'axios'; - -class ModalsRename extends Component{ - constructor(props){ - super(props); - this.state={ - name:this.props.NavmodalValue - } - } - - saveNavmoda=()=>{ - let{url}=this.props; - let{name}=this.state; - - axios.post(url, {name:name}).then((result) => { - if(result.data.status===0){ - this.props.showNotification(result.data.message); - this.props.cannerNavmoda(); - this.props.coursupdata(); - }} - ) - } - - setNavmodalValue=(e)=>{ - console.log(e.target.value) - this.setState({ - name:e.target.value - }) - } - - render(){ - return( -
- -
{this.props.Navname}名称:
- -
- this.props.cannerNavmoda()}>取消 - this.saveNavmoda()}>确定 -
-
-
- ) - } -} +import React,{ Component } from "react"; +import { Modal,Checkbox,Upload,Button,Icon,message,Input} from "antd"; +import axios from 'axios'; + +class ModalsRename extends Component{ + constructor(props){ + super(props); + this.state={ + name:this.props.NavmodalValue + } + } + + saveNavmoda=()=>{ + let{url}=this.props; + let{name}=this.state; + + axios.post(url, {name:name}).then((result) => { + if(result.data.status===0){ + this.props.showNotification(result.data.message); + this.props.cannerNavmoda(); + this.props.coursupdata(); + }} + ) + } + + setNavmodalValue=(e)=>{ + console.log(e.target.value) + this.setState({ + name:e.target.value + }) + } + + render(){ + return( +
+ +
{this.props.Navname}名称:
+ +
+ this.props.cannerNavmoda()}>取消 + this.saveNavmoda()}>确定 +
+
+
+ ) + } +} export default ModalsRename; \ No newline at end of file diff --git a/public/react/src/modules/paths/Index.js b/public/react/src/modules/paths/Index.js index a26228ed5..a7efc43bc 100644 --- a/public/react/src/modules/paths/Index.js +++ b/public/react/src/modules/paths/Index.js @@ -1,52 +1,58 @@ -import React, { Component } from 'react'; - -import { SnackbarHOC } from 'educoder'; - - -import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; -import Loadable from 'react-loadable'; -import Loading from '../../Loading'; -import { TPMIndexHOC } from '../tpm/TPMIndexHOC'; - -const PathsDetail = Loadable({ - loader: () => import('./PathDetail/PathDetailIndex'), - loading:Loading, -}) -const PathsNew = Loadable({ - loader: () => import('./PathNew'), - loading:Loading, -}) -const Statistics = Loadable({ - loader: () => import('./SchoolStatistics/Statistics'), - loading:Loading -}) - -const ShixunPaths = Loadable({ - loader: () => import('./ShixunPaths'), - loading:Loading, -}) - - -class Index extends Component{ - constructor(props) { - super(props) - } - render() { - return ( -
- - - ()} - > - ()} - > - - - -
- ) - } -} +import React, { Component } from 'react'; + +import { SnackbarHOC } from 'educoder'; + + +import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; +import Loadable from 'react-loadable'; +import Loading from '../../Loading'; +import { TPMIndexHOC } from '../tpm/TPMIndexHOC'; + +const PathsDetail = Loadable({ + loader: () => import('./PathDetail/PathDetailIndex'), + loading:Loading, +}) +const PathsNew = Loadable({ + loader: () => import('./PathNew'), + loading:Loading, +}) +const Statistics = Loadable({ + loader: () => import('./SchoolStatistics/Statistics'), + loading:Loading +}) + +const ShixunPaths = Loadable({ + loader: () => import('./ShixunPaths'), + loading:Loading, +}) + + +class Index extends Component{ + constructor(props) { + super(props) + } + render() { + return ( +
+ + + + ()} + > + ()} + > + + ()} + > + + {/**/} + + +
+ ) + } +} export default SnackbarHOC() ( TPMIndexHOC(Index) ); \ No newline at end of file diff --git a/public/react/src/modules/paths/PathDetail/DetailCards.js b/public/react/src/modules/paths/PathDetail/DetailCards.js index 115f7066c..0e95f1a48 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCards.js +++ b/public/react/src/modules/paths/PathDetail/DetailCards.js @@ -314,6 +314,7 @@ class DetailCards extends Component{ showparagraphindex }=this.state; const antIcon = ; + return(
+
{ pathCardsList && pathCardsList.map((item,key)=>{ @@ -374,7 +388,7 @@ class DetailCards extends Component{ - {item.stage_name} + {item.stage_name} { idsum===key&&pathCardsedittype===true?'': @@ -442,13 +456,13 @@ class DetailCards extends Component{ : } - + {key+1}-{index+1}  {line.shixun_name} { - line.shixun_status==="暂未公开"? + this.props.current_user&&this.props.current_user.admin===false&&line.shixun_status==="暂未公开"?
  • 暂未公开
  • :
  • diff --git a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js index 340505655..912302cb8 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js +++ b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js @@ -402,7 +402,7 @@ class DetailCardsEditAndAdd extends Component{
    *
    - +
    名称不能为空
    必填项
    diff --git a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndEdit.js b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndEdit.js index 1bf137016..f91cf0e96 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndEdit.js +++ b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndEdit.js @@ -435,7 +435,7 @@ class DetailCardsEditAndEdit extends Component{
    *
    - +
    名称不能为空
    必填项
    diff --git a/public/react/src/modules/paths/PathDetail/PathDetailIndex.js b/public/react/src/modules/paths/PathDetail/PathDetailIndex.js index 1731064c0..61933b765 100644 --- a/public/react/src/modules/paths/PathDetail/PathDetailIndex.js +++ b/public/react/src/modules/paths/PathDetail/PathDetailIndex.js @@ -140,10 +140,13 @@ class PathDetailIndex extends Component{ let url="/paths/"+pathid+".json"; axios.get(url).then((result)=>{ if (result.data.status === 407 || result.data.status === 401) { + debugger return; } if (result.data.status === 403) { + debugger + window.location.href = "/403"; return; } @@ -165,9 +168,12 @@ class PathDetailIndex extends Component{ axios.get(url).then((result)=>{ // TODO 403 让后台返回status 403 比较好 if (result.data.status == 407 || result.data.status == 401) { + debugger return; } if (result.data.status === 403 ) { + debugger + window.location.href = "/403"; return; } From 8cbda918b810c4f923abce207eb0703dd335266c Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 25 Jul 2019 14:59:28 +0800 Subject: [PATCH 02/25] =?UTF-8?q?=E5=BC=80=E5=90=AF=E5=AE=9E=E8=AE=AD?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/shixuns_controller.rb | 178 ++++++++++++++++++++------ 1 file changed, 140 insertions(+), 38 deletions(-) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 9edb6bb9d..587ef2cb9 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -513,6 +513,111 @@ class ShixunsController < ApplicationController # 以前在开启挑战的时候检测实训是否更新,更新则重置,觉得应该放在TPI更好 # 中间需要一个过渡动画 # TODO: 第一次开启实训都会去判断是否是纯选择题类型,感觉做成在创建关卡的时候就判断该实训是否是纯选择题更加合适 + # def shixun_exec + # if is_shixun_opening? + # tip_show_exception(-3, "#{@shixun.opening_time.strftime('%Y-%m-%d %H:%M:%S')}") + # end + # current_myshixun = @shixun.current_myshixun(current_user.id) + # + # min_challenges = @shixun.challenges.pluck(:id , :st) + # + # Rails.logger.info("11111111112#{current_myshixun.try(:id)}") + # Rails.logger.info("111111111102#{params[:reset] != 1}") + # + # # 因为读写分离有延迟,所以如果是重置来的请求可以先跳过,重置过来的params[:reset]为1 + # if current_myshixun && params[:reset] != "1" + # games = current_myshixun.games + # # 如果TPM和TPI的管卡数不相等或者关卡顺序错了,说明实训被极大的改动,需要重置,实训发布前打过的实训都需要重置 + # if is_shixun_reset?(games, min_challenges, current_myshixun) + # # 这里页面弹框要收到 当前用户myshixun的identifier. + # tip_show_exception("/myshixuns/#{current_myshixun.try(:identifier)}/reset_my_game") + # end + # + # + # if current_myshixun.repo_name.nil? + # g = Gitlab.client + # repo_name = g.project(current_myshixun.gpid).try(:path_with_namespace) + # current_myshixun.update_column(:repo_name, repo_name) + # end + # + # + # # 如果存在实训,则直接进入实训 + # # 如果实训允许跳关,传参params[:challenge_id]跳入具体的关卡 + # @current_task = + # if params[:challenge_id] + # game = games.where(challenge_id: params[:challenge_id]).take + # if @shixun.task_pass || game.status != 3 + # game + # else + # current_myshixun.current_task(games) + # end + # else + # current_myshixun.current_task(games) + # end + # else + # # 如果未创建关卡一定不能开启实训,否则TPI没法找到当前的关卡 + # if @shixun.challenges_count == 0 + # tip_exception("开启实战前请先创建实训关卡") + # end + # + # # 判断实训是否全为选择题 + # is_choice_type = (min_challenges.size == min_challenges.select{|challenge| challenge.last == 1}.count) + # if !is_choice_type + # commit = GitService.commits(repo_path: @repo_path).try(:first) + # uid_logger("First comit########{commit}") + # tip_exception("开启实战前请先在版本库中提交代码") if commit.blank? + # commit_id = commit["id"] + # end + # + # ActiveRecord::Base.transaction do + # begin + # cloud_bridge = edu_setting('cloud_bridge') + # myshixun_identifier = generate_identifier Myshixun, 10 + # myshixun = @shixun.myshixuns.create!(user_id: current_user.id, identifier: myshixun_identifier, + # modify_time: @shixun.modify_time, reset_time: @shixun.reset_time, + # onclick_time: Time.now, commit_id: commit_id) + # uid_logger("myshixun_id is #{myshixun.id}") + # + # + # # 其它创建关卡等操作 + # challenges = @shixun.challenges + # # 之所以增加user_id是为了方便统计查询性能 + # game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at] + # Game.bulk_insert(*game_attrs) do |worker| + # base_attr = { myshixun_id: myshixun.id, user_id: myshixun.user_id } + # challenges.each_with_index do |challenge, index| + # status = (index == 0 ? 0 : 3) + # game_identifier = generate_identifier(Game, 12) + # worker.add(base_attr.merge(challenge_id: challenge.id, status: status, open_time: Time.now, + # identifier: game_identifier, modify_time: challenge.modify_time)) + # end + # end + # + # # 如果实训是纯选择题,则不需要去fork仓库以及中间层的相关操作了 + # unless is_choice_type + # # fork仓库 + # project_fork(myshixun, @repo_path, current_user.login) + # + # rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path ) + # uid_logger("start openGameInstance") + # uri = "#{cloud_bridge}/bridge/game/openGameInstance" + # logger.info("end openGameInstance") + # params = {tpiID: "#{myshixun.id}", tpmGitURL:rep_url, tpiRepoName: myshixun.repo_name.split("/").last} + # uid_logger("openGameInstance params is #{params}") + # interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)" + # end + # + # @current_task = myshixun.current_task(myshixun.games) + # uid_logger("## shixun exec: myshixun id is #{myshixun.id}") + # rescue Exception => e + # uid_logger_error(e.message) + # tip_exception("实训云平台繁忙(繁忙等级:81)") + # raise ActiveRecord::Rollback + # end + # end + # end + # end + def shixun_exec if is_shixun_opening? tip_show_exception(-3, "#{@shixun.opening_time.strftime('%Y-%m-%d %H:%M:%S')}") @@ -520,10 +625,6 @@ class ShixunsController < ApplicationController current_myshixun = @shixun.current_myshixun(current_user.id) min_challenges = @shixun.challenges.pluck(:id , :st) - - Rails.logger.info("11111111112#{current_myshixun.try(:id)}") - Rails.logger.info("111111111102#{params[:reset] != 1}") - # 因为读写分离有延迟,所以如果是重置来的请求可以先跳过,重置过来的params[:reset]为1 if current_myshixun && params[:reset] != "1" games = current_myshixun.games @@ -540,7 +641,6 @@ class ShixunsController < ApplicationController current_myshixun.update_column(:repo_name, repo_name) end - # 如果存在实训,则直接进入实训 # 如果实训允许跳关,传参params[:challenge_id]跳入具体的关卡 @current_task = @@ -569,50 +669,52 @@ class ShixunsController < ApplicationController commit_id = commit["id"] end - ActiveRecord::Base.transaction do - begin - cloud_bridge = edu_setting('cloud_bridge') - myshixun_identifier = generate_identifier Myshixun, 10 - myshixun = @shixun.myshixuns.create!(user_id: current_user.id, identifier: myshixun_identifier, - modify_time: @shixun.modify_time, reset_time: @shixun.reset_time, - onclick_time: Time.now, commit_id: commit_id) - uid_logger("myshixun_id is #{myshixun.id}") - - - # 其它创建关卡等操作 - challenges = @shixun.challenges - # 之所以增加user_id是为了方便统计查询性能 - game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at] - Game.bulk_insert(*game_attrs) do |worker| - base_attr = { myshixun_id: myshixun.id, user_id: myshixun.user_id } - challenges.each_with_index do |challenge, index| - status = (index == 0 ? 0 : 3) - game_identifier = generate_identifier(Game, 12) - worker.add(base_attr.merge(challenge_id: challenge.id, status: status, open_time: Time.now, - identifier: game_identifier, modify_time: challenge.modify_time)) + begin + ActiveRecord::Base.transaction do + begin + myshixun_identifier = generate_identifier Myshixun, 10 + myshixun_params = {user_id: current_user.id, identifier: myshixun_identifier, + modify_time: @shixun.modify_time, reset_time: @shixun.reset_time, + onclick_time: Time.now, commit_id: commit_id} + myshixun = @shixun.myshixuns.create!(myshixun_params) + # 其它创建关卡等操作 + challenges = @shixun.challenges + # 之所以增加user_id是为了方便统计查询性能 + game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at] + Game.bulk_insert(*game_attrs) do |worker| + base_attr = {myshixun_id: myshixun.id, user_id: myshixun.user_id} + challenges.each_with_index do |challenge, index| + status = (index == 0 ? 0 : 3) + game_identifier = generate_identifier(Game, 12) + worker.add(base_attr.merge(challenge_id: challenge.id, status: status, open_time: Time.now, + identifier: game_identifier, modify_time: challenge.modify_time)) + end end + @current_task = myshixun.current_task(myshixun.games) + rescue Exception => e + logger.error("------ActiveRecord::RecordInvalid: #{e.message}") + raise("ActiveRecord::RecordInvalid") end - - # 如果实训是纯选择题,则不需要去fork仓库以及中间层的相关操作了 + end + # 如果实训是纯选择题,则不需要去fork仓库以及中间层的相关操作了 + ActiveRecord::Base.transaction do unless is_choice_type # fork仓库 + cloud_bridge = edu_setting('cloud_bridge') project_fork(myshixun, @repo_path, current_user.login) - - rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path ) + rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path) uid_logger("start openGameInstance") uri = "#{cloud_bridge}/bridge/game/openGameInstance" logger.info("end openGameInstance") - params = {tpiID: "#{myshixun.id}", tpmGitURL:rep_url, tpiRepoName: myshixun.repo_name.split("/").last} + params = {tpiID: "#{myshixun.id}", tpmGitURL: rep_url, tpiRepoName: myshixun.repo_name.split("/").last} uid_logger("openGameInstance params is #{params}") interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)" end - - @current_task = myshixun.current_task(myshixun.games) - uid_logger("## shixun exec: myshixun id is #{myshixun.id}") - rescue Exception => e - uid_logger_error(e.message) - tip_exception("实训云平台繁忙(繁忙等级:81)") - raise ActiveRecord::Rollback + end + rescue Exception => e + if e.message != "ActiveRecord::RecordInvalid" + logger.error("##########project_fork error #{e.message}") + @current_task.destroy! end end end From 1bfe9b6b59a6fd254b84f6cab1f0b36e244b4825 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 25 Jul 2019 15:05:48 +0800 Subject: [PATCH 03/25] =?UTF-8?q?=E9=87=8D=E5=86=99=E5=BC=80=E5=90=AF?= =?UTF-8?q?=E5=AE=9E=E8=AE=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/shixuns_controller.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 587ef2cb9..fbc5c18fb 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -676,13 +676,13 @@ class ShixunsController < ApplicationController myshixun_params = {user_id: current_user.id, identifier: myshixun_identifier, modify_time: @shixun.modify_time, reset_time: @shixun.reset_time, onclick_time: Time.now, commit_id: commit_id} - myshixun = @shixun.myshixuns.create!(myshixun_params) + @myshixun = @shixun.myshixuns.create!(myshixun_params) # 其它创建关卡等操作 challenges = @shixun.challenges # 之所以增加user_id是为了方便统计查询性能 game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at] Game.bulk_insert(*game_attrs) do |worker| - base_attr = {myshixun_id: myshixun.id, user_id: myshixun.user_id} + base_attr = {myshixun_id: @myshixun.id, user_id: @myshixun.user_id} challenges.each_with_index do |challenge, index| status = (index == 0 ? 0 : 3) game_identifier = generate_identifier(Game, 12) @@ -690,7 +690,7 @@ class ShixunsController < ApplicationController identifier: game_identifier, modify_time: challenge.modify_time)) end end - @current_task = myshixun.current_task(myshixun.games) + @current_task = @myshixun.current_task(@myshixun.games) rescue Exception => e logger.error("------ActiveRecord::RecordInvalid: #{e.message}") raise("ActiveRecord::RecordInvalid") @@ -701,12 +701,12 @@ class ShixunsController < ApplicationController unless is_choice_type # fork仓库 cloud_bridge = edu_setting('cloud_bridge') - project_fork(myshixun, @repo_path, current_user.login) + project_fork(@myshixun, @repo_path, current_user.login) rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path) uid_logger("start openGameInstance") uri = "#{cloud_bridge}/bridge/game/openGameInstance" logger.info("end openGameInstance") - params = {tpiID: "#{myshixun.id}", tpmGitURL: rep_url, tpiRepoName: myshixun.repo_name.split("/").last} + params = {tpiID: "#{@myshixun.id}", tpmGitURL: rep_url, tpiRepoName: @myshixun.repo_name.split("/").last} uid_logger("openGameInstance params is #{params}") interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)" end From 5bebbbcd2f77191784a2f9a15024ac27d32ff0b0 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 25 Jul 2019 15:06:56 +0800 Subject: [PATCH 04/25] =?UTF-8?q?=E8=B7=91=E5=87=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/shixuns_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index fbc5c18fb..7a2db0666 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -716,6 +716,7 @@ class ShixunsController < ApplicationController logger.error("##########project_fork error #{e.message}") @current_task.destroy! end + raise ActiveRecord::Rollback end end end From 64ae7a2cb6c0b05f18cdffed8f798be9a052996f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 25 Jul 2019 15:14:05 +0800 Subject: [PATCH 05/25] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/new/CoursesNew.js | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/public/react/src/modules/courses/new/CoursesNew.js b/public/react/src/modules/courses/new/CoursesNew.js index c8b090b8b..73c1dded9 100644 --- a/public/react/src/modules/courses/new/CoursesNew.js +++ b/public/react/src/modules/courses/new/CoursesNew.js @@ -301,7 +301,7 @@ class CoursesNew extends Component { if(value!=""){ this.props.form.setFieldsValue({ classroom:value, - course:value + // course:value }); this.Searchvalue(value) } @@ -311,7 +311,7 @@ class CoursesNew extends Component { handleChange=(value)=>{ this.props.form.setFieldsValue({ - course:value, + // course:value, classroom:value }) }; @@ -320,7 +320,7 @@ class CoursesNew extends Component { if(value!="") { this.props.form.setFieldsValue({ - school: value, + // school: value, fetching: true, }); @@ -331,7 +331,7 @@ class CoursesNew extends Component { handleChangeschools=(value)=>{ this.props.form.setFieldsValue({ - school: value, + // school: value, fetching: true, }); } @@ -347,9 +347,9 @@ class CoursesNew extends Component { }; getschool=(value)=>{ - this.props.form.setFieldsValue({ - school: value - }) + // this.props.form.setFieldsValue({ + // school: value + // }) let url="/schools/school_list.json"; axios.get(url,{ params: { @@ -359,7 +359,7 @@ class CoursesNew extends Component { if (result.data.status===0) { this.setState({ searchlistscholl: result.data.school_names, - school: value + // school: value }) } @@ -367,9 +367,9 @@ class CoursesNew extends Component { console.log(error) }) } - showApplyForAddOrgModal = () => { - this.applyForAddOrgForm.setVisible(true) - } + showApplyForAddOrgModal = () => { + this.applyForAddOrgForm.setVisible(true) + } render() { let {datatime,school,searchlistscholl} = this.state; const {getFieldDecorator} = this.props.form; From f28a2e3580eb5f640d391cbb41232122bf49271e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 25 Jul 2019 15:17:28 +0800 Subject: [PATCH 06/25] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/common/components/DragValidator.js | 227 +++++++++--------- .../src/common/components/DragValidatortwo.js | 114 --------- .../react/src/modules/user/CheckInputysl.js | 104 ++++++++ .../src/modules/user/FindPasswordComponent.js | 26 +- .../modules/user/LoginRegisterComponent.js | 28 +-- public/react/src/modules/user/secureCode.css | 42 ++++ 6 files changed, 284 insertions(+), 257 deletions(-) delete mode 100644 public/react/src/common/components/DragValidatortwo.js create mode 100644 public/react/src/modules/user/CheckInputysl.js create mode 100644 public/react/src/modules/user/secureCode.css diff --git a/public/react/src/common/components/DragValidator.js b/public/react/src/common/components/DragValidator.js index 7d707def0..69e91f604 100644 --- a/public/react/src/common/components/DragValidator.js +++ b/public/react/src/common/components/DragValidator.js @@ -1,114 +1,115 @@ -import React, { Component } from 'react'; - -const $ = window.jQuery -const jQuery = $; -if (!$.drag) { - (function($){ - $.fn.dragValidator = function(options){ - var x, drag = this, isMove = false, defaults = { - }; - var options = $.extend(defaults, options); - //添加背景,文字,滑块 - var html = '
    '+ - '
    拖动滑块验证
    '+ - '
    '; - this.append(html); - - var handler = drag.find('.handler'); - var drag_bg = drag.find('.drag_bg'); - var text = drag.find('.drag_text'); - var maxWidth = text.width() - handler.width(); //能滑动的最大间距 - //鼠标按下时候的x轴的位置 - handler.mousedown(function(e){ - isMove = true; - x = e.pageX - parseInt(handler.css('left'), 10); - }); - - //鼠标指针在上下文移动时,移动距离大于0小于最大间距,滑块x轴位置等于鼠标移动距离 - $(document).mousemove(function(e){ - var _x = e.pageX - x; - var handler_offset = handler.offset(); - var lastX = e.clientX -x; - lastX = Math.max(0,Math.min(maxWidth,lastX)); - if(isMove){ - if(_x > 0 && _x <= maxWidth){ - handler.css({'left': lastX}); - drag_bg.css({'width': lastX}); - } - else if(lastX > maxWidth - 5 && lastX < maxWidth + 5 ){ //鼠标指针移动距离达到最大时清空事件 - dragOk(); - } - } - }); - handler.mouseup(function(e){ - isMove = false; - var _x = e.pageX - x; - if(text.text() != '验证通过' && _x < maxWidth){ //鼠标松开时,如果没有达到最大距离位置,滑块就返回初始位置 - handler.animate({'left': 0}); - drag_bg.animate({'width': 0}); - } - }); - - //清空事件 - function dragOk(){ - options.dragOkCallback && options.dragOkCallback() - var kuaiwidth=drag.width() - handler.width() - 2; - handler.removeClass('handler_bg').addClass('handler_ok_bg'); - handler.css({'left':kuaiwidth+'px'}) - text.css({'width':kuaiwidth+'px'}); - text.text('验证通过'); - drag.css({'color': '#fff'}); - drag_bg.css({'width':kuaiwidth+'px'}) - handler.unbind('mousedown'); - $(document).unbind('mousemove'); - $(document).unbind('mouseup'); - $("#user_verification_notice").html(""); - $('#user_verification_notice').parent().hide(); - } - }; - })(jQuery); -} - -class DragValidator extends Component { - componentDidMount () { - // if($("#reg-drag").length>0 && IsPC()){ - $("#reg-drag").dragValidator({ - height: this.props.height, - dragOkCallback: () => { - this.props.dragOkCallback && this.props.dragOkCallback() - } - }); - // }else{ - // $("#reg-drag").empty(); - // } - } - empty() { - $("#reg-drag").empty(); - } - render() { - const height = this.props.height || 45; - const className = this.props.className - const successGreenColor = this.props.successGreenColor || '#29bd8b' - // newMain clearfix - return ( -
    - - -
    - ); - } -} - +import React, { Component } from 'react'; + +const $ = window.jQuery +const jQuery = $; +if (!$.drag) { + (function($){ + $.fn.dragValidator = function(options){ + var x, drag = this, isMove = false, defaults = { + }; + var options = $.extend(defaults, options); + //添加背景,文字,滑块 + var html = '
    '+ + '
    拖动滑块验证
    '+ + '
    '; + this.append(html); + + var handler = drag.find('.handler'); + var drag_bg = drag.find('.drag_bg'); + var text = drag.find('.drag_text'); + var maxWidth = text.width() - handler.width(); //能滑动的最大间距 + //鼠标按下时候的x轴的位置 + handler.mousedown(function(e){ + isMove = true; + x = e.pageX - parseInt(handler.css('left'), 10); + }); + + //鼠标指针在上下文移动时,移动距离大于0小于最大间距,滑块x轴位置等于鼠标移动距离 + $(document).mousemove(function(e){ + var _x = e.pageX - x; + var handler_offset = handler.offset(); + var lastX = e.clientX -x; + lastX = Math.max(0,Math.min(maxWidth,lastX)); + if(isMove){ + if(_x > 0 && _x <= maxWidth){ + handler.css({'left': lastX}); + drag_bg.css({'width': lastX}); + } + else if(lastX > maxWidth - 5 && lastX < maxWidth + 5 ){ //鼠标指针移动距离达到最大时清空事件 + dragOk(); + + } + } + }); + handler.mouseup(function(e){ + isMove = false; + var _x = e.pageX - x; + if(text.text() != '验证通过' && _x < maxWidth){ //鼠标松开时,如果没有达到最大距离位置,滑块就返回初始位置 + handler.animate({'left': 0}); + drag_bg.animate({'width': 0}); + } + }); + + //清空事件 + function dragOk(){ + options.dragOkCallback && options.dragOkCallback() + var kuaiwidth=drag.width() - handler.width() - 2; + handler.removeClass('handler_bg').addClass('handler_ok_bg'); + handler.css({'left':kuaiwidth+'px'}) + text.css({'width':kuaiwidth+'px'}); + text.text('验证通过'); + drag.css({'color': '#fff'}); + drag_bg.css({'width':kuaiwidth+'px'}) + handler.unbind('mousedown'); + $(document).unbind('mousemove'); + $(document).unbind('mouseup'); + $("#user_verification_notice").html(""); + $('#user_verification_notice').parent().hide(); + } + }; + })(jQuery); +} + +class DragValidator extends Component { + componentDidMount () { + // if($("#reg-drag").length>0 && IsPC()){ + $("#reg-drag").dragValidator({ + height: this.props.height, + dragOkCallback: () => { + this.props.dragOkCallback && this.props.dragOkCallback() + } + }); + // }else{ + // $("#reg-drag").empty(); + // } + } + empty() { + $("#reg-drag").empty(); + } + render() { + const height = this.props.height || 45; + const className = this.props.className + const successGreenColor = this.props.successGreenColor || '#29bd8b' + // newMain clearfix + return ( +
    + + +
    + ); + } +} + export default ( DragValidator ); \ No newline at end of file diff --git a/public/react/src/common/components/DragValidatortwo.js b/public/react/src/common/components/DragValidatortwo.js deleted file mode 100644 index 2b789063e..000000000 --- a/public/react/src/common/components/DragValidatortwo.js +++ /dev/null @@ -1,114 +0,0 @@ -import React, { Component } from 'react'; - -const $ = window.jQuery -const jQuery = $; -if (!$.drag) { - (function($){ - $.fn.dragValidator = function(options){ - var x, drag = this, isMove = false, defaults = { - }; - var options = $.extend(defaults, options); - //添加背景,文字,滑块 - var html = '
    '+ - '
    拖动滑块验证
    '+ - '
    '; - this.append(html); - - var handler = drag.find('.handler'); - var drag_bg = drag.find('.drag_bg'); - var text = drag.find('.drag_text'); - var maxWidth = text.width() - handler.width(); //能滑动的最大间距 - //鼠标按下时候的x轴的位置 - handler.mousedown(function(e){ - isMove = true; - x = e.pageX - parseInt(handler.css('left'), 10); - }); - - //鼠标指针在上下文移动时,移动距离大于0小于最大间距,滑块x轴位置等于鼠标移动距离 - $(document).mousemove(function(e){ - var _x = e.pageX - x; - var handler_offset = handler.offset(); - var lastX = e.clientX -x; - lastX = Math.max(0,Math.min(maxWidth,lastX)); - if(isMove){ - if(_x > 0 && _x <= maxWidth){ - handler.css({'left': lastX}); - drag_bg.css({'width': lastX}); - } - else if(lastX > maxWidth - 5 && lastX < maxWidth + 5 ){ //鼠标指针移动距离达到最大时清空事件 - dragOk(); - } - } - }); - handler.mouseup(function(e){ - isMove = false; - var _x = e.pageX - x; - if(text.text() != '验证通过' && _x < maxWidth){ //鼠标松开时,如果没有达到最大距离位置,滑块就返回初始位置 - handler.animate({'left': 0}); - drag_bg.animate({'width': 0}); - } - }); - - //清空事件 - function dragOk(){ - options.dragOkCallback && options.dragOkCallback() - var kuaiwidth=drag.width() - handler.width() - 2; - handler.removeClass('handler_bg').addClass('handler_ok_bg'); - handler.css({'left':kuaiwidth+'px'}) - text.css({'width':kuaiwidth+'px'}); - text.text('验证通过'); - drag.css({'color': '#fff'}); - drag_bg.css({'width':kuaiwidth+'px'}) - handler.unbind('mousedown'); - $(document).unbind('mousemove'); - $(document).unbind('mouseup'); - $("#user_verification_notice").html(""); - $('#user_verification_notice').parent().hide(); - } - }; - })(jQuery); -} - -class DragValidator extends Component { - componentDidMount () { - // if($("#reg-drag").length>0 && IsPC()){ - $("#reg-drag").dragValidator({ - height: this.props.height, - dragOkCallback: () => { - this.props.dragOkCallback && this.props.dragOkCallback() - } - }); - // }else{ - // $("#reg-drag").empty(); - // } - } - empty() { - $("#reg-drag").empty(); - } - render() { - const height = this.props.height || 45; - const className = this.props.className - const successGreenColor = this.props.successGreenColor || '#29bd8b' - // newMain clearfix - return ( -
    - - -
    - ); - } -} - -export default ( DragValidator ); \ No newline at end of file diff --git a/public/react/src/modules/user/CheckInputysl.js b/public/react/src/modules/user/CheckInputysl.js new file mode 100644 index 000000000..a057f12d4 --- /dev/null +++ b/public/react/src/modules/user/CheckInputysl.js @@ -0,0 +1,104 @@ +import React, { Component } from 'react'; +import "./secureCode.css"; + +/** + * An TextInput with Icon and check + * 带图标检查的输入框 + */ +class CheckInputysl extends Component { + constructor(){ + super(); + this.state = { + isMove:false, + start:0, + moveLength:0, + clear:false, + move:0, + width:0 + }; + this.onMouseUp = this.onMouseUp.bind(this); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseMove = this.onMouseMove.bind(this); + } + componentDidMount() { + let dragHandler = document.getElementById("dragHandler"); + dragHandler.addEventListener("mousedown", this.onMouseDown); + } + onMouseDown(e){ + console.log("28"); + document.addEventListener("mousemove", this.onMouseMove); + document.addEventListener("mouseup", this.onMouseUp); + let event=e||window.event; + this.setState({ + isMove:true, + start:event.pageX + }); + } + onMouseUp(e){ + console.log("38"); + let event=e||window.event; + this.setState({ + isMove:false, + }); + let drag = window.getComputedStyle(this.verifyDOM); + let handler = window.getComputedStyle(this.handlerDOM); + let moveLength = event.clientX-this.verifyDOM.offsetLeft - Number.parseInt(handler.width) / 2; + // console.log(drag.width); + let maxWidth = Number.parseInt(drag.width) - Number.parseInt(handler.width); + console.log("moveLength="+moveLength); + console.log("maxWidth="+maxWidth); + if(moveLength <= maxWidth){ //鼠标松开时,如果没有达到最大距离位置,滑块就返回初始位置 + this.setState({ + move:0, + width:0 + }); + document.removeEventListener("mousemove", this.onMouseMove); + document.removeEventListener("mouseup", this.onMouseUp); + } + if(this.props.onDrag){ + this.props.onDrag(this.state.clear); + } + } + onMouseMove(e){ + console.log("63"); + let event=e||window.event; + let drag = window.getComputedStyle(this.verifyDOM); + let handler = window.getComputedStyle(this.handlerDOM); + let moveLength = event.clientX-this.verifyDOM.offsetLeft - Number.parseInt(handler.width) / 2; + let maxWidth = Number.parseInt(drag.width) - Number.parseInt(handler.width); + if(this.state.isMove){ + if(moveLength<0){ + moveLength=0 + }else if(moveLength >= maxWidth){ + moveLength=maxWidth; + this.removeMouseMove(); + } + this.setState({ + move:moveLength, + width:moveLength + }); + } + } + //清空事件 + removeMouseMove(){ + this.setState({ + clear:true + }); + let dragHandler = document.getElementById("dragHandler"); + dragHandler.removeEventListener("mousedown", this.onMouseDown); + document.removeEventListener("mousemove", this.onMouseMove); + document.removeEventListener("mouseup", this.onMouseUp); + this.props.dragOkCallback(); + } + render(){ + return ( +
    {this.verifyDOM = dom}} style={{"color":this.state.clear ? "#fff" : "#252535"}}> +
    {this.bgDOM = dom}} style={{"width":this.state.width}}>
    +
    {this.state.clear ? "验证通过" : "拖动滑块验证"}
    +
    {this.handlerDOM = dom}}>
    +
    + ); + } +} + +export default ( CheckInputysl ); \ No newline at end of file diff --git a/public/react/src/modules/user/FindPasswordComponent.js b/public/react/src/modules/user/FindPasswordComponent.js index 22fcd97de..0c3678776 100644 --- a/public/react/src/modules/user/FindPasswordComponent.js +++ b/public/react/src/modules/user/FindPasswordComponent.js @@ -2,11 +2,11 @@ import React, {Component} from 'react'; import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom"; -import {getImageUrl, DragValidator} from 'educoder'; - +import {getImageUrl} from 'educoder'; +import CheckInputysl1 from './CheckInputysl'; +import CheckInputysl2 from './CheckInputysl'; import {Tabs, Input, Checkbox, Button, notification} from 'antd'; -import DragValidatortwo from '../../../src/common/components/DragValidatortwo' import ReadPassword from './ReadPassword'; @@ -643,24 +643,20 @@ class LoginRegisterComponent extends Component { { Whethertoverify===false&&pciphone===true? - this.dragOkCallback()} - className="ysllw100" - > + + : "" } { Whethertoverify===true&&pciphone===true? - this.dragOkCallback()} - className="ysllw100" - > + + : "" } diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index dcbaf4730..f6c32909d 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -2,12 +2,13 @@ import React, {Component} from 'react'; import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom"; -import {getImageUrl, DragValidator,broadcastChannelPostMessage} from 'educoder'; +import {getImageUrl,broadcastChannelPostMessage} from 'educoder'; import {Tabs, Input, Checkbox, Button, notification,Menu} from 'antd'; import passopen from '../../../src/images/login/passopen.png'; import passoff from '../../../src/images/login/passoff.png'; import axios from 'axios'; -import DragValidatortwo from '../../../src/common/components/DragValidatortwo' +import CheckInputysl1 from './CheckInputysl'; +import CheckInputysl2 from './CheckInputysl'; import './common.css' import './commontwo.css' const { TabPane } = Tabs; @@ -402,7 +403,7 @@ class LoginRegisterComponent extends Component { type: 1, } }).then((result) => { - debugger + //验证有问题{"status":1,"message":"success"} // console.log(result); // this.setState({dragOk: true}) @@ -941,27 +942,24 @@ class LoginRegisterComponent extends Component { } { Whethertoverify===false&&pciphone===true? - + + : "" } { Whethertoverify===true&&pciphone===true? - + + : "" } +
    { pciphone===true? diff --git a/public/react/src/modules/user/secureCode.css b/public/react/src/modules/user/secureCode.css new file mode 100644 index 000000000..e7f171711 --- /dev/null +++ b/public/react/src/modules/user/secureCode.css @@ -0,0 +1,42 @@ +#drag{ + position: relative; + background-color: #e8e8e8; + min-width: 300px; + height: 38px; + line-height: 38px; + text-align: center; +} +#drag .handler{ + position: absolute; + top: 0px; + left: 0px; + width: 40px; + height: 38px; + border: 1px solid #ccc; + cursor: move; +} +.handler_bg{ background: #fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTEyNTVEMURGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTEyNTVEMUNGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTc5NzNmZS02OTQxLTQyOTYtYTIwNi02NDI2YTNkOWU5YmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YiRG4AAAALFJREFUeNpi/P//PwMlgImBQkA9A+bOnfsIiBOxKcInh+yCaCDuByoswaIOpxwjciACFegBqZ1AvBSIS5OTk/8TkmNEjwWgQiUgtQuIjwAxUF3yX3xyGIEIFLwHpKyAWB+I1xGSwxULIGf9A7mQkBwTlhBXAFLHgPgqEAcTkmNCU6AL9d8WII4HOvk3ITkWJAXWUMlOoGQHmsE45ViQ2KuBuASoYC4Wf+OUYxz6mQkgwAAN9mIrUReCXgAAAABJRU5ErkJggg==") no-repeat center;} + +.handler_ok_bg{ background: #fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDlBRDI3NjVGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDlBRDI3NjRGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphNWEzMWNhMC1hYmViLTQxNWEtYTEwZS04Y2U5NzRlN2Q4YTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+k+sHwwAAASZJREFUeNpi/P//PwMyKD8uZw+kUoDYEYgloMIvgHg/EM/ptHx0EFk9I8wAoEZ+IDUPiIMY8IN1QJwENOgj3ACo5gNAbMBAHLgAxA4gQ5igAnNJ0MwAVTsX7IKyY7L2UNuJAf+AmAmJ78AEDTBiwGYg5gbifCSxFCZoaBMCy4A4GOjnH0D6DpK4IxNSVIHAfSDOAeLraJrjgJp/AwPbHMhejiQnwYRmUzNQ4VQgDQqXK0ia/0I17wJiPmQNTNBEAgMlQIWiQA2vgWw7QppBekGxsAjIiEUSBNnsBDWEAY9mEFgMMgBk00E0iZtA7AHEctDQ58MRuA6wlLgGFMoMpIG1QFeGwAIxGZo8GUhIysmwQGSAZgwHaEZhICIzOaBkJkqyM0CAAQDGx279Jf50AAAAAABJRU5ErkJggg==") no-repeat center;} + +#drag .drag_bg{ + background-color: #7ac23c; + height: 38px; + width: 0px; +} +#drag .drag_text{ + position: absolute; + top: 0px; + font-size: 14px; + width: 100%; + -moz-user-select: none; + -webkit-user-select: none; + color: #fff; + user-select: none; + -o-user-select:none; + -ms-user-select:none; +} + +/* }*/ +/*//.handler_bg{ background: #fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTEyNTVEMURGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTEyNTVEMUNGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTc5NzNmZS02OTQxLTQyOTYtYTIwNi02NDI2YTNkOWU5YmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YiRG4AAAALFJREFUeNpi/P//PwMlgImBQkA9A+bOnfsIiBOxKcInh+yCaCDuByoswaIOpxwjciACFegBqZ1AvBSIS5OTk/8TkmNEjwWgQiUgtQuIjwAxUF3yX3xyGIEIFLwHpKyAWB+I1xGSwxULIGf9A7mQkBwTlhBXAFLHgPgqEAcTkmNCU6AL9d8WII4HOvk3ITkWJAXWUMlOoGQHmsE45ViQ2KuBuASoYC4Wf+OUYxz6mQkgwAAN9mIrUReCXgAAAABJRU5ErkJggg==") no-repeat center;}*/ +/*//.handler_ok_bg{ background: #fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDlBRDI3NjVGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDlBRDI3NjRGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphNWEzMWNhMC1hYmViLTQxNWEtYTEwZS04Y2U5NzRlN2Q4YTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+k+sHwwAAASZJREFUeNpi/P//PwMyKD8uZw+kUoDYEYgloMIvgHg/EM/ptHx0EFk9I8wAoEZ+IDUPiIMY8IN1QJwENOgj3ACo5gNAbMBAHLgAxA4gQ5igAnNJ0MwAVTsX7IKyY7L2UNuJAf+AmAmJ78AEDTBiwGYg5gbifCSxFCZoaBMCy4A4GOjnH0D6DpK4IxNSVIHAfSDOAeLraJrjgJp/AwPbHMhejiQnwYRmUzNQ4VQgDQqXK0ia/0I17wJiPmQNTNBEAgMlQIWiQA2vgWw7QppBekGxsAjIiEUSBNnsBDWEAY9mEFgMMgBk00E0iZtA7AHEctDQ58MRuA6wlLgGFMoMpIG1QFeGwAIxGZo8GUhIysmwQGSAZgwHaEZhICIzOaBkJkqyM0CAAQDGx279Jf50AAAAAABJRU5ErkJggg==") no-repeat center;}*/ From 1f18b1399bbf64d415ae13c91d356044ee7b5d74 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Thu, 25 Jul 2019 15:20:16 +0800 Subject: [PATCH 07/25] =?UTF-8?q?=E9=87=8D=E7=BD=AE=E5=AE=9E=E8=AE=AD?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/myshixuns_controller.rb | 35 +++++++++++++------------ 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index 649516a03..cdeca4871 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -20,28 +20,29 @@ class MyshixunsController < ApplicationController unless (current_user.admin? || current_user.id == @myshixun.user_id) tip_exception("403", "") end + begin + ActiveRecord::Base.transaction do + begin + @shixun = Shixun.select(:id, :identifier).find(@myshixun.shixun_id) + @myshixun.destroy - ActiveRecord::Base.transaction do - begin - @shixun = Shixun.select(:id, :identifier).find(@myshixun.shixun_id) - @myshixun.destroy + StudentWork.where(:myshixun_id => @myshixun.id).update_all(:myshixun_id => 0, :work_status => 0) - # 刪除版本庫 - begin - GitService.delete_repository(repo_path: @repo_path) + # 实训在申请发布前,是否玩过实训,如果玩过需要更改记录,防止二次重置 + shixun_mod = ShixunModify.where(:shixun_id => @shixun.id, :myshixun_id => @myshixun.id, :status => 1).take + shixun_mod.update_column(:status, 0) if shixun_mod rescue Exception => e - uid_logger_error("版本库删除异常,详情:#{e.message}") + logger.error("######reset_my_game_failed:#{e.message}") + raise("ActiveRecord::RecordInvalid") end - - StudentWork.where(:myshixun_id => @myshixun.id).update_all(:myshixun_id => 0, :work_status => 0) - - # 实训在申请发布前,是否玩过实训,如果玩过需要更改记录,防止二次重置 - shixun_mod = ShixunModify.where(:shixun_id => @shixun.id, :myshixun_id => @myshixun.id, :status => 1).take - shixun_mod.update_column(:status, 0) if shixun_mod - rescue Exception => e - uid_logger_error("myshixun reset failed #{e}") - raise ActiveRecord::Rollback end + # 删除版本库 + GitService.delete_repository(repo_path: @repo_path) + rescue Exception => e + if e.message != "ActiveRecord::RecordInvalid" + logger.error("######delete_repository_error:#{e.message}") + end + raise ActiveRecord::Rollback end end From b9d48c420a7ac491cc8512565e7b98455fac28c2 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 25 Jul 2019 15:37:29 +0800 Subject: [PATCH 08/25] =?UTF-8?q?=E9=9D=A2=E5=8C=85=E5=B1=91-=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/busyWork/CommonWorkDetailIndex.js | 7 ++++--- .../react/src/modules/courses/busyWork/CommonWorkPost.js | 4 ++-- public/react/src/modules/courses/busyWork/NewWork.js | 3 ++- .../courses/busyWork/common/WorkDetailPageHeader.js | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index 5960406e3..ff8e3e3a2 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -145,6 +145,7 @@ class CommonWorkDetailIndex extends Component{ , end_immediately, publish_immediately, work_statuses, accessoryVisible } =this.state; + const { current_user } = this.props let courseId=this.props.match.params.coursesId; let category_id= category && category.category_id; @@ -197,15 +198,15 @@ class CommonWorkDetailIndex extends Component{ background: #fff; } `} - + ]}>}
    36 ? homework_name : ''}`} diff --git a/public/react/src/modules/courses/busyWork/CommonWorkPost.js b/public/react/src/modules/courses/busyWork/CommonWorkPost.js index 4c5578d2c..f2b92b47d 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkPost.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkPost.js @@ -481,6 +481,7 @@ render(){ course_name, homework_name, memberNumMax, memberNumMin } =this.state; + const { current_user } = this.props let courseId=this.props.match.params.coursesId; let workId=this.props.match.params.workId; @@ -522,7 +523,6 @@ render(){ const moduleName = this.props.getModuleName() const moduleCHName = this.props.getModuleName(true) const isGroup = this.props.isGroup() - const { current_user } = this.props; return( @@ -540,7 +540,7 @@ render(){

    - {course_name} + {course_name} > {moduleCHName} > diff --git a/public/react/src/modules/courses/busyWork/NewWork.js b/public/react/src/modules/courses/busyWork/NewWork.js index 3bb77dfb5..2519f95e2 100644 --- a/public/react/src/modules/courses/busyWork/NewWork.js +++ b/public/react/src/modules/courses/busyWork/NewWork.js @@ -313,6 +313,7 @@ class NewWork extends Component{ init_max_num, init_min_num, title_num, course_name, category, has_commit, has_project }=this.state + const { current_user } = this.props const courseId = this.state.course_id || this.props.match.params.coursesId ; const isEdit = this.isEdit; @@ -369,7 +370,7 @@ class NewWork extends Component{ {pageType==="new"?"新建":"编辑"}

    */} Date: Thu, 25 Jul 2019 15:42:00 +0800 Subject: [PATCH 09/25] =?UTF-8?q?=E9=9D=A2=E5=8C=85=E5=B1=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/boards/BoardsNew.js | 3 ++- public/react/src/modules/courses/boards/TopicDetail.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/boards/BoardsNew.js b/public/react/src/modules/courses/boards/BoardsNew.js index 9833e9eb3..8d9db7c3f 100644 --- a/public/react/src/modules/courses/boards/BoardsNew.js +++ b/public/react/src/modules/courses/boards/BoardsNew.js @@ -239,6 +239,7 @@ class BoardsNew extends Component{ render() { let { addGroup, fileList, course_id, title_num } = this.state; const { getFieldDecorator } = this.props.form; + const { current_user } = this.props const formItemLayout = { labelCol: { @@ -299,7 +300,7 @@ class BoardsNew extends Component{ `}
    diff --git a/public/react/src/modules/courses/boards/TopicDetail.js b/public/react/src/modules/courses/boards/TopicDetail.js index 6309ac491..7aaecdd16 100644 --- a/public/react/src/modules/courses/boards/TopicDetail.js +++ b/public/react/src/modules/courses/boards/TopicDetail.js @@ -546,7 +546,7 @@ class TopicDetail extends Component { } `} From 4b130f2724780815352c10b13596e88d4ebdc4d9 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 25 Jul 2019 15:48:46 +0800 Subject: [PATCH 10/25] =?UTF-8?q?=E9=9D=A2=E5=8C=85=E5=B1=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/poll/PollDetailIndex.js | 4 ++-- .../react/src/modules/courses/poll/PollInfo.js | 3 ++- .../react/src/modules/courses/poll/PollNew.js | 17 +++++++++++------ 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/public/react/src/modules/courses/poll/PollDetailIndex.js b/public/react/src/modules/courses/poll/PollDetailIndex.js index 8e3f78d5c..9119b7902 100644 --- a/public/react/src/modules/courses/poll/PollDetailIndex.js +++ b/public/react/src/modules/courses/poll/PollDetailIndex.js @@ -110,7 +110,7 @@ class PollDetailIndex extends Component{ } render(){ let {tab,pollDetail,user_permission}=this.state; - + const { current_user } = this.props; const isAdmin =this.props.isAdmin(); const isStudent = this.props.isStudent(); return( @@ -123,7 +123,7 @@ class PollDetailIndex extends Component{ />

    - {this.props.coursedata.name} + {this.props.coursedata.name} > 问卷 > diff --git a/public/react/src/modules/courses/poll/PollInfo.js b/public/react/src/modules/courses/poll/PollInfo.js index fc1d55385..f32d652c2 100644 --- a/public/react/src/modules/courses/poll/PollInfo.js +++ b/public/react/src/modules/courses/poll/PollInfo.js @@ -299,6 +299,7 @@ class PollInfo extends Component{ modalSave, questionPanelFixed }=this.state; + const { current_user } = this.props let isAdmin=this.props.isAdmin(); let isStudent=this.props.isStudent(); return( @@ -314,7 +315,7 @@ class PollInfo extends Component{ >

    - {courseName} + {courseName} > 问卷 > diff --git a/public/react/src/modules/courses/poll/PollNew.js b/public/react/src/modules/courses/poll/PollNew.js index 0c4109ceb..cd559b75f 100644 --- a/public/react/src/modules/courses/poll/PollNew.js +++ b/public/react/src/modules/courses/poll/PollNew.js @@ -2320,12 +2320,17 @@ class PollNew extends Component { } gotohome=()=>{ - let courseId=this.props.match.params.coursesId; - if(courseId===undefined){ - this.props.history.push("/courses"); - }else{ - this.props.history.push(this.props.current_user.first_category_url); - } + const { current_user} = this.props + + this.props.history.push(current_user.first_category_url); + + + // let courseId=this.props.match.params.coursesId; + // if(courseId===undefined){ + // this.props.history.push("/courses"); + // }else{ + // this.props.history.push(this.props.current_user.first_category_url); + // } } //试图 render() { From 901ed458c44ef96d9d6307abe57ebb207f1035f8 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 25 Jul 2019 15:53:09 +0800 Subject: [PATCH 11/25] =?UTF-8?q?=E9=9D=A2=E5=8C=85=E5=B1=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/courses/graduation/topics/GraduateTopicDetail.js | 3 ++- .../src/modules/courses/graduation/topics/GraduateTopicNew.js | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/graduation/topics/GraduateTopicDetail.js b/public/react/src/modules/courses/graduation/topics/GraduateTopicDetail.js index be3ff7a30..c0e8fe185 100644 --- a/public/react/src/modules/courses/graduation/topics/GraduateTopicDetail.js +++ b/public/react/src/modules/courses/graduation/topics/GraduateTopicDetail.js @@ -96,6 +96,7 @@ class GraduateTopicDetail extends Component{ tablePageSize, tab, }=this.state + const { current_user } = this.props let {course_id,graduation_topic_id}=this.props.match.params; const isStudent =this.props.isStudent(); const isAdmin =this.props.isAdmin(); @@ -104,7 +105,7 @@ class GraduateTopicDetail extends Component{

    - {tableData && tableData.course_name} + {tableData && tableData.course_name} > {tableData.graduation_name} > diff --git a/public/react/src/modules/courses/graduation/topics/GraduateTopicNew.js b/public/react/src/modules/courses/graduation/topics/GraduateTopicNew.js index d71cec73b..569c76331 100644 --- a/public/react/src/modules/courses/graduation/topics/GraduateTopicNew.js +++ b/public/react/src/modules/courses/graduation/topics/GraduateTopicNew.js @@ -276,6 +276,7 @@ class GraduateTopicNew extends Component{ course_name, left_banner_name } = this.state; + const { current_user } = this.props const { getFieldDecorator } = this.props.form; let{ topicId,coursesId }=this.props.match.params console.log(this.props); @@ -322,7 +323,7 @@ class GraduateTopicNew extends Component{ `}

    - {course_name} + {course_name} > {left_banner_name} > From 8656c6037e6548d49bfb209ce1ddb5ad5f49cbb8 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 25 Jul 2019 15:58:42 +0800 Subject: [PATCH 12/25] =?UTF-8?q?=E9=9D=A2=E5=8C=85=E5=B1=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/exercise/ExerciseNew.js | 3 ++- .../src/modules/courses/exercise/ExerciseReviewAndAnswer.js | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/courses/exercise/ExerciseNew.js b/public/react/src/modules/courses/exercise/ExerciseNew.js index 0e1489c72..fe1b8f565 100644 --- a/public/react/src/modules/courses/exercise/ExerciseNew.js +++ b/public/react/src/modules/courses/exercise/ExerciseNew.js @@ -369,6 +369,7 @@ class ExerciceNew extends Component{ }, }; + const { current_user } = this.props const isAdmin = this.props.isAdmin() const courseId=this.props.match.params.coursesId; const exercise_id = this.props.match.params.Id @@ -407,7 +408,7 @@ class ExerciceNew extends Component{ `}

    diff --git a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js index eb8143c03..cd3355082 100644 --- a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js +++ b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js @@ -509,7 +509,7 @@ class ExerciseReviewAndAnswer extends Component{ }=this.state let isAdmin = this.props.isAdmin(); let isStudent =this.props.isStudent(); - + const { current_user } = this.props console.log(data&&data.exercise.user_name) return(
    @@ -537,7 +537,7 @@ class ExerciseReviewAndAnswer extends Component{ />

    - {courseName} + {courseName} > {data && data.left_banner_name} > From 78678a68ba486920604d1bb23df5b550adae97f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 25 Jul 2019 16:01:18 +0800 Subject: [PATCH 13/25] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shixunHomework/Listofworksstudentone.js | 6 ++++ .../shixunHomework/ShixunHomeworkPage.js | 6 ++-- .../modules/tpm/TPMsettings/TPMsettings.js | 26 ++++++++++++++- .../src/modules/tpm/newshixuns/Newshixuns.js | 33 +++++++++++++++++-- 4 files changed, 65 insertions(+), 6 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js index db58e95fd..81e388d6f 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js @@ -1482,6 +1482,7 @@ class Listofworksstudentone extends Component { } //计算成绩 setComputeTime=()=>{ + let matchurl = this.props.match.url; let {teacherdata}=this.state; this.setState({ computeTimetype:false @@ -1494,6 +1495,7 @@ class Listofworksstudentone extends Component { this.props.showNotification(`${response.data.message}`); // var homeworkid = this.props.match.params.homeworkid; this.Getalistofworks(homeworkid); + this.props.history.replace( matchurl ); // this.Getalistofworkstwo("", "", "", "", 1, 20); }).catch((error) => { console.log(error) @@ -2147,6 +2149,9 @@ class Listofworksstudentone extends Component { } setComputeTimet=()=>{ + + let matchurl = this.props.match.url; + this.setState({ computeTimetype:false }) @@ -2163,6 +2168,7 @@ class Listofworksstudentone extends Component { }) this.Startsortingt(this.state.orders, this.state.course_groupyslstwo, this.state.checkedValuesineinfo, this.state.searchtext, 1, this.state.limit); this.props.showNotification(`${response.data.message}`); + this.props.history.replace( matchurl ); } }).catch((error) => { console.log(error) diff --git a/public/react/src/modules/courses/shixunHomework/ShixunHomeworkPage.js b/public/react/src/modules/courses/shixunHomework/ShixunHomeworkPage.js index e2285a7a6..fec98e69b 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunHomeworkPage.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunHomeworkPage.js @@ -123,9 +123,9 @@ class ShixunHomeworkPage extends Component { let {tab, teacherdatapage, jobsettingsdatapage} = this.state; const isAdmin = this.props.isAdmin(); - console.log(119) - console.log(jobsettingsdatapage); - console.log(teacherdatapage); + // console.log(119) + // console.log(jobsettingsdatapage); + // console.log(teacherdatapage); return (

    diff --git a/public/react/src/modules/tpm/TPMsettings/TPMsettings.js b/public/react/src/modules/tpm/TPMsettings/TPMsettings.js index ed1249f0d..f6af871dd 100644 --- a/public/react/src/modules/tpm/TPMsettings/TPMsettings.js +++ b/public/react/src/modules/tpm/TPMsettings/TPMsettings.js @@ -31,6 +31,30 @@ const Option = Select.Option; const RadioGroup = Radio.Group; +// 处理整点 半点 +// 取传入时间往后的第一个半点 +export function handleDateStrings(dateString) { + if (!dateString) return dateString; + const ar = dateString.split(':') + if (ar[1] == '00' || ar[1] == '30') { + return dateString + } + const miniute = parseInt(ar[1]); + if (miniute < 30 || miniute == 60) { + return [ar[0], '30'].join(':') + } + if (miniute < 60) { + // 加一个小时 + const tempStr = [ar[0], '00'].join(':'); + const format = "YYYY-MM-DD HH:mm"; + const _moment = moment(tempStr, format) + _moment.add(1, 'hours') + return _moment.format(format) + } + + return dateString +} + // 恢复数据 function md_rec_data(k,mdu,id, editor){ if(window.sessionStorage.getItem(k+mdu) !== null){ @@ -1120,7 +1144,7 @@ export default class TPMsettings extends Component { } onChangeTimePicker =(value, dateString)=> { this.setState({ - opening_time:dateString + opening_time:moment(handleDateStrings(dateString)) }) } diff --git a/public/react/src/modules/tpm/newshixuns/Newshixuns.js b/public/react/src/modules/tpm/newshixuns/Newshixuns.js index cb0f08c0f..8cb79e9d0 100644 --- a/public/react/src/modules/tpm/newshixuns/Newshixuns.js +++ b/public/react/src/modules/tpm/newshixuns/Newshixuns.js @@ -2,7 +2,7 @@ import React, {Component} from 'react'; import {TPMIndexHOC} from '../TPMIndexHOC'; -import {SnackbarHOC,handleDateString} from 'educoder'; +import {SnackbarHOC} from 'educoder'; import {Input, Select, Radio, Checkbox, Modal, Icon, DatePicker,Upload,Button,message,Form,notification} from 'antd'; @@ -16,6 +16,7 @@ import './css/Newshixuns.css'; import {getUrl} from 'educoder' + let path = getUrl("/editormd/lib/") const $ = window.$; @@ -28,6 +29,34 @@ const Option = Select.Option; const RadioGroup = Radio.Group; const confirm = Modal.confirm; + + +// 处理整点 半点 +// 取传入时间往后的第一个半点 +export function handleDateStrings(dateString) { + if (!dateString) return dateString; + const ar = dateString.split(':') + if (ar[1] == '00' || ar[1] == '30') { + return dateString + } + const miniute = parseInt(ar[1]); + if (miniute < 30 || miniute == 60) { + return [ar[0], '30'].join(':') + } + if (miniute < 60) { + // 加一个小时 + const tempStr = [ar[0], '00'].join(':'); + const format = "YYYY-MM-DD HH:mm"; + const _moment = moment(tempStr, format) + _moment.add(1, 'hours') + return _moment.format(format) + } + + return dateString +} + + + // 恢复数据 function md_rec_data(k, mdu, id, editor) { if (window.sessionStorage.getItem(k + mdu) !== null) { @@ -713,7 +742,7 @@ class Newshixuns extends Component { onChangeTimePicker = (value, dateString) => { this.setState({ - TimePickervalue: handleDateString(dateString) + TimePickervalue: handleDateStrings(dateString) }) } // 附件相关 START From 806e81e3a59c1d5bf578db3ce9358a87412ab1f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 25 Jul 2019 16:17:20 +0800 Subject: [PATCH 14/25] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/user/FindPasswordComponent.js | 94 ++++++++++++++----- .../modules/user/LoginRegisterComponent.js | 74 +++++++++++++-- 2 files changed, 139 insertions(+), 29 deletions(-) diff --git a/public/react/src/modules/user/FindPasswordComponent.js b/public/react/src/modules/user/FindPasswordComponent.js index 0c3678776..6317c5134 100644 --- a/public/react/src/modules/user/FindPasswordComponent.js +++ b/public/react/src/modules/user/FindPasswordComponent.js @@ -94,14 +94,14 @@ class LoginRegisterComponent extends Component { } //倒计时 getverificationcode = () => { - + debugger if(this.state.login === undefined || this.state.login.length===0){ this.openNotification("请输入手机号或邮箱"); return; } //这是判断是否手机正确 - if(this.state.Phonenumberisnotcobool === true){ + if(this.state.Phonenumberisnotcobool === false){ this.openNotification(this.state.Phonenumberisnotco); this.setState({ Whethertoverify:this.state.Whethertoverify===true?false:true, @@ -109,7 +109,7 @@ class LoginRegisterComponent extends Component { return; } //拖动滑动验证 - if(this.state.dragOk===undefined||this.state.dragOk === false){ + if(this.state.dragOk === false){ this.openNotification("拖动滑块验证"); return; } @@ -180,12 +180,11 @@ class LoginRegisterComponent extends Component { //找回密码 Retrievepassword = () => { if (this.state.Phonenumberisnotcobool === false) { - if (this.state.login.length === 0) { - this.setState({ - Phonenumberisnotco:"请输入正确的邮箱或手机号", - }) - return - } + this.openNotification(this.state.Phonenumberisnotco); + this.setState({ + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + return; } if (this.state.login === undefined|| this.state.login.length ===0 || this.state.login === "") { this.setState({ @@ -365,7 +364,7 @@ class LoginRegisterComponent extends Component { if (value.length === 0) { this.setState({ Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, + Phonenumberisnotcobool: true, }) return; } @@ -418,20 +417,20 @@ class LoginRegisterComponent extends Component { if(this.state.login===""||this.state.login.length===0){ this.setState({ Phonenumberisnotco: "账号不能为空", - Phonenumberisnotcobool: true, + Phonenumberisnotcobool: false, dragOk:false, Whethertoverify:this.state.Whethertoverify===true?false:true, }) return } - console.log(e.target.value.length); - if (e.target.value.length === 0) { - this.setState({ - Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, - }) - return; - } + // console.log(e.target.value.length); + // if (e.target.value.length === 0) { + // this.setState({ + // Phonenumberisnotco: undefined, + // Phonenumberisnotcobool: false, + // }) + // return; + // } // var telephone = $("#telephoneAdd.tianjia_phone").val(); var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; // var email = $("#add_email.tianjia_email").val(); @@ -485,12 +484,63 @@ class LoginRegisterComponent extends Component { if (this.state.login === "" || this.state.login.length === 0) { this.setState({ Phonenumberisnotco: "账号不能为空", - Phonenumberisnotcobool: true, + Phonenumberisnotcobool: false, dragOk: false, Whethertoverify: this.state.Whethertoverify === true ? false : true, }) return } + // var telephone = $("#telephoneAdd.tianjia_phone").val(); + var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; + // var email = $("#add_email.tianjia_email").val(); + var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; + + // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 + var stringdata = undefined; + if (!regph.test(this.state.login)) { + stringdata = "手机号格式不正确"; + this.setState({ + Phonenumberisnotco: stringdata, + Phonenumberisnotcobool: false, + dragOk:false, + Whethertoverify: this.state.Whethertoverify === true ? false : true, + }) + } else { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: true, + dragOk: true, + + }); + this.Emailphonenumberverification(this.state.login) + + return + } + + if (!regemail.test(this.state.login)) { + if ((this.state.login.indexOf("@") != -1) === true) { + stringdata = "邮箱格式不正确"; + } else { + stringdata = "手机号格式不正确"; + + } + this.setState({ + Phonenumberisnotco: stringdata, + Phonenumberisnotcobool: false, + dragOk:false, + Whethertoverify: this.state.Whethertoverify === true ? false : true, + }) + return + } else { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: true, + dragOk: true, + }) + this.Emailphonenumberverification(this.state.login) + return + } + this.setState({ Phonenumberisnotcosytdhk: undefined, }) @@ -513,7 +563,7 @@ class LoginRegisterComponent extends Component { console.log(value.length); this.setState({ Phonenumberisnotco: result.data.message, - Phonenumberisnotcobool: true, + Phonenumberisnotcobool: false, dragOk:false, Whethertoverify:this.state.Whethertoverify===true?false:true, }) @@ -521,7 +571,7 @@ class LoginRegisterComponent extends Component { }else { this.setState({ Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, + Phonenumberisnotcobool: true, dragOk:true, }) return; diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index f6c32909d..241fc2c6f 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -206,7 +206,65 @@ class LoginRegisterComponent extends Component { } //是否验证通过 dragOkCallback = () => { - console.log(this.state.logins); + debugger + if (this.state.logins.length === 0) { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + + }) + return; + } + // var telephone = $("#telephoneAdd.tianjia_phone").val(); + var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; + // var email = $("#add_email.tianjia_email").val(); + var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; + + // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 + var stringdata = undefined; + if (!regph.test(this.state.logins)) { + stringdata = "手机号格式不正确"; + this.setState({ + Phonenumberisnotcos: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + } else { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }); + this.Emailphonenumberverification(this.state.logins, 2); + return + } + + if (!regemail.test(this.state.logins)) { + if ((this.state.logins.indexOf("@") != -1) === true) { + stringdata = "邮箱格式不正确"; + } else { + stringdata = "手机号格式不正确"; + + } + this.setState({ + Phonenumberisnotcos: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + return + } else { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + this.Emailphonenumberverification(this.state.logins, 2); + return + } + this.setState({ Phonenumberisnotcosytdhk:undefined, }) @@ -416,7 +474,6 @@ class LoginRegisterComponent extends Component { Phonenumberisnotco: undefined, Phonenumberisnotcobool: false, dragOk:true, - }) }else { this.setState({ @@ -426,7 +483,7 @@ class LoginRegisterComponent extends Component { Whethertoverify:this.state.Whethertoverify===true?false:true, }) } - return; + return; } else if (id === 2) { this.setState({ Phonenumberisnotcos: result.data.message, @@ -499,8 +556,9 @@ class LoginRegisterComponent extends Component { //倒计时 getverificationcode = () => { - console.log(this.state.Phonenumberisnotcobool); - console.log(this.state.dragOk); + debugger + // console.log(this.state.Phonenumberisnotcobool); + // console.log(this.state.dragOk); if(this.state.logins === undefined || this.state.logins.length===0){ this.openNotification("请输入手机号或邮箱"); return; @@ -513,7 +571,7 @@ class LoginRegisterComponent extends Component { }) return; } - if(this.state.dragOk===undefined||this.state.dragOk === false){ + if(this.state.dragOk === false){ this.openNotification("拖动滑块验证"); return; } @@ -669,6 +727,7 @@ class LoginRegisterComponent extends Component { this.setState({ Phonenumberisnotcos: undefined, Phonenumberisnotcobool: false, + }) return } @@ -691,6 +750,7 @@ class LoginRegisterComponent extends Component { this.setState({ Phonenumberisnotcos: undefined, Phonenumberisnotcobool: false, + }) this.Emailphonenumberverification(e.target.value, id); return @@ -943,7 +1003,7 @@ class LoginRegisterComponent extends Component { { Whethertoverify===false&&pciphone===true? : From b350b0f1a61fdecb8eeb489c15f65b9aa5acd00e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 25 Jul 2019 16:18:31 +0800 Subject: [PATCH 15/25] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../paths/PathDetail/DetailCardsTemp.js | 25 +- .../src/modules/paths/PathDetail/DetailTop.js | 477 +++++++++--------- .../paths/PathDetail/PathDetailIndex.js | 10 +- .../tpm/shixunchild/Challenges/Challenges.js | 15 +- .../Propaedeutics/Propaedeu_tics.js | 8 +- 5 files changed, 280 insertions(+), 255 deletions(-) diff --git a/public/react/src/modules/paths/PathDetail/DetailCardsTemp.js b/public/react/src/modules/paths/PathDetail/DetailCardsTemp.js index 4acc28a48..5150d14da 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCardsTemp.js +++ b/public/react/src/modules/paths/PathDetail/DetailCardsTemp.js @@ -1,5 +1,6 @@ import React, { Component } from 'react'; import {getImageUrl} from 'educoder'; +import { Tooltip } from 'antd'; import '../../paths/ShixunPaths.css'; import DetailCardsEditAndAdd from './DetailCardsEditAndAdd'; import axios from 'axios'; @@ -85,16 +86,26 @@ class DetailCards extends Component{ + {item.stage_name} - - - - - - + + + + + + + + - + + + + + + + +

    {item.stage_description}

    diff --git a/public/react/src/modules/paths/PathDetail/DetailTop.js b/public/react/src/modules/paths/PathDetail/DetailTop.js index 50c5c2680..09425df92 100644 --- a/public/react/src/modules/paths/PathDetail/DetailTop.js +++ b/public/react/src/modules/paths/PathDetail/DetailTop.js @@ -1,238 +1,241 @@ -import React,{ Component } from "react"; -import { Modal,Radio,Input,Tooltip } from "antd"; -import { BrowserRouter as Router, Route, Link } from "react-router-dom"; -import SendPanel from "./sendPanel.js"; -import { getImageUrl } from 'educoder'; -import axios from 'axios'; -import Modals from '../../modals/Modals'; -import './DetailTop.css'; - -const Search = Input.Search; -const RadioGroup = Radio.Group; -class DetailTop extends Component{ - constructor(props){ - super(props) - this.state={ - cardsModalcancel:this.cardsModalcancel, - cardsModalsave:this.cardsModalsave, - Modalstype:false, - Modalstopval:"", - Modalsbottomval:'', - loadtype:false, - deletepathtype:false, - cardsModalsavetype:false - } - } - - allow_deletepath=()=>{ - this.setState({ - Modalstype:true, - Modalstopval:"是否删除路径?", - deletepathtype:true - }) - } - - applyissuePath=()=>{ - this.setState({ - Modalstype:true, - Modalstopval:"发布申请已提交,请等待管理员的审核", - Modalsbottomval:"• 我们将在1-2个工作日内完成审核", - loadtype:true - }) - } - - cancelissuePath=()=>{ - let pathId=this.props.match.params.pathId; - let url ="/paths/"+pathId+"/cancel_publish.json"; - axios.get(url).then((result)=>{ - if(result.status===200){ - if(result.data.status===0){ - - }else if(result.data.status===1){ - window.location.href = "/paths/" + result.data.subject_id - } - } - }).catch((error)=>{ - console.log(error); - }) - } - - reovkissuePath=()=>{ - - this.setState({ - Modalstype:true, - Modalstopval:"是否确认撤销发布", - Modalsbottomval:"确认后,回退到编辑状态", - cardsModalsavetype:true, - }) - - } - reovkissuePaths=()=>{ - let pathId=this.props.match.params.pathId; - let url ="/paths/"+pathId+"/cancel_has_publish.json"; - axios.get(url).then((result)=>{ - if(result.status===200){ - if(result.data.status===0){ - - }else if(result.data.status===1){ - this.setState({ - cardsModalsavetype:false, - loadtype:false, - deletepathtype:false - }) - window.location.href = "/paths/" + result.data.subject_id - } - } - }).catch((error)=>{ - console.log(error); - }) - } - - cardsModalcancel=()=>{ - this.setState({ - Modalstype:false, - Modalsbottomval:'', - loadtype:false, - deletepathtype:false - }) - } - - cardsModalsave=()=>{ - let {loadtype,deletepathtype}=this.state; - - //删除路径 - if(deletepathtype===true){ - let pathid=this.props.match.params.pathId; - const deleteUrl = `/paths/`+pathid+`.json`; - axios.delete(deleteUrl).then((response) => { - const status = response.data.status - if (status === 1) { - window.location.href = "/paths"; - } - }).catch((error) => { - console.log(error) - }) - } - - //申请发布 - if(loadtype===true){ - - let pathid=this.props.match.params.pathId; - let url ="/paths/"+pathid+"/publish.json"; - axios.get(url).then((result)=>{ - if(result.status===200){ - if(result.data.status===0){ - this.setState({ - Modalstype:true, - Modalstopval: result.data.message, - }) - }else if(result.data.status===1){ - window.location.reload(); - } - } - }).catch((error)=>{ - console.log(error); - }) - - } - this.setState({ - Modalstype:false, - Modalsbottomval:'' - }) - } - - render(){ - let{detailInfoList}=this.props; - let{Modalstype,Modalstopval,cardsModalcancel,cardsModalsave,Modalsbottomval,cardsModalsavetype,loadtype}=this.state; - const radioStyle = { - display: 'block', - height: '30px', - lineHeight: '30px', - }; - - return( -
    - - - { - detailInfoList && -
    -
    - - {detailInfoList.name} - - - {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? - - - :"" - } - - {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? - - 学习统计 - :"" - } - - { detailInfoList.allow_send === true && - - } - -
    -
    - { - detailInfoList && -
      - { detailInfoList.stages_count!=0 ?
    • 章节{detailInfoList.stages_count}
    • : ""} - { detailInfoList.stage_shixuns_count!=0 ?
    • 实训{ detailInfoList.stage_shixuns_count}
    • : ""} - { detailInfoList.challenge_choose_count!=0 ?
    • 选择题任务{detailInfoList.challenge_choose_count}
    • : ""} - { detailInfoList.challenges_count!=0 ?
    • 实践任务{detailInfoList.challenges_count}
    • : ""} - { detailInfoList.subject_score!=0 ?
    • 经验值{detailInfoList.subject_score}
    • : ""} - { detailInfoList.member_count!=0 ?
    • 学习人数{detailInfoList.member_count}
    • : ""} -
    - } -
    - {detailInfoList===undefined?"":detailInfoList.allow_delete===true?删除路径:""} - - { - detailInfoList.publish_status===0&&detailInfoList.allow_statistics===true? - 申请发布:"" - } - - - { - detailInfoList.publish_status===1 && detailInfoList.allow_statistics===true? - 撤销申请:"" - } - - { - detailInfoList.publish_status===2 && detailInfoList.allow_statistics===true? - 撤销发布:"" - } -
    -
    -
    - } - -
    - ) - } -} +import React,{ Component } from "react"; +import { Modal,Radio,Input,Tooltip } from "antd"; +import { BrowserRouter as Router, Route, Link } from "react-router-dom"; +import SendPanel from "./sendPanel.js"; +import { getImageUrl } from 'educoder'; +import axios from 'axios'; +import Modals from '../../modals/Modals'; +import './DetailTop.css'; + +const Search = Input.Search; +const RadioGroup = Radio.Group; +class DetailTop extends Component{ + constructor(props){ + super(props) + this.state={ + cardsModalcancel:this.cardsModalcancel, + cardsModalsave:this.cardsModalsave, + Modalstype:false, + Modalstopval:"", + Modalsbottomval:'', + loadtype:false, + deletepathtype:false, + cardsModalsavetype:false + } + } + + allow_deletepath=()=>{ + this.setState({ + Modalstype:true, + Modalstopval:"是否删除路径?", + deletepathtype:true + }) + } + + applyissuePath=()=>{ + this.setState({ + Modalstype:true, + Modalstopval:"发布申请已提交,请等待管理员的审核", + Modalsbottomval:"• 我们将在1-2个工作日内完成审核", + loadtype:true + }) + } + + cancelissuePath=()=>{ + let pathId=this.props.match.params.pathId; + let url ="/paths/"+pathId+"/cancel_publish.json"; + axios.get(url).then((result)=>{ + if(result.status===200){ + if(result.data.status===0){ + + }else if(result.data.status===1){ + window.location.href = "/paths/" + result.data.subject_id + } + } + }).catch((error)=>{ + console.log(error); + }) + } + + reovkissuePath=()=>{ + + this.setState({ + Modalstype:true, + Modalstopval:"是否确认撤销发布", + Modalsbottomval:"确认后,回退到编辑状态", + cardsModalsavetype:true, + }) + + } + reovkissuePaths=()=>{ + let pathId=this.props.match.params.pathId; + let url ="/paths/"+pathId+"/cancel_has_publish.json"; + axios.get(url).then((result)=>{ + if(result.status===200){ + if(result.data.status===0){ + + }else if(result.data.status===1){ + this.setState({ + cardsModalsavetype:false, + loadtype:false, + deletepathtype:false + }) + window.location.href = "/paths/" + result.data.subject_id + } + } + }).catch((error)=>{ + console.log(error); + }) + } + + cardsModalcancel=()=>{ + this.setState({ + Modalstype:false, + Modalsbottomval:'', + loadtype:false, + deletepathtype:false + }) + } + + cardsModalsave=()=>{ + let {loadtype,deletepathtype}=this.state; + + //删除路径 + if(deletepathtype===true){ + let pathid=this.props.match.params.pathId; + const deleteUrl = `/paths/`+pathid+`.json`; + axios.delete(deleteUrl).then((response) => { + const status = response.data.status + if (status === 1) { + window.location.href = "/paths"; + } + }).catch((error) => { + console.log(error) + }) + } + + //申请发布 + if(loadtype===true){ + + let pathid=this.props.match.params.pathId; + let url ="/paths/"+pathid+"/publish.json"; + axios.get(url).then((result)=>{ + if(result.status===200){ + if(result.data.status===0){ + this.setState({ + Modalstype:true, + Modalstopval: result.data.message, + }) + }else if(result.data.status===1){ + window.location.reload(); + } + } + }).catch((error)=>{ + console.log(error); + }) + + } + this.setState({ + Modalstype:false, + Modalsbottomval:'' + }) + } + + render(){ + let{detailInfoList}=this.props; + let{Modalstype,Modalstopval,cardsModalcancel,cardsModalsave,Modalsbottomval,cardsModalsavetype,loadtype}=this.state; + const radioStyle = { + display: 'block', + height: '30px', + lineHeight: '30px', + }; + + return( +
    + + + { + detailInfoList && +
    +
    + + {detailInfoList.name} + + + {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? + + + + + + :"" + } + + {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? + + 学习统计 + :"" + } + + { detailInfoList.allow_send === true && + + } + +
    +
    + { + detailInfoList && +
      + { detailInfoList.stages_count!=0 ?
    • 章节{detailInfoList.stages_count}
    • : ""} + { detailInfoList.stage_shixuns_count!=0 ?
    • 实训{ detailInfoList.stage_shixuns_count}
    • : ""} + { detailInfoList.challenge_choose_count!=0 ?
    • 选择题任务{detailInfoList.challenge_choose_count}
    • : ""} + { detailInfoList.challenges_count!=0 ?
    • 实践任务{detailInfoList.challenges_count}
    • : ""} + { detailInfoList.subject_score!=0 ?
    • 经验值{detailInfoList.subject_score}
    • : ""} + { detailInfoList.member_count!=0 ?
    • 学习人数{detailInfoList.member_count}
    • : ""} +
    + } +
    + {detailInfoList===undefined?"":detailInfoList.allow_delete===true?删除路径:""} + + { + detailInfoList.publish_status===0&&detailInfoList.allow_statistics===true? + 申请发布:"" + } + + + { + detailInfoList.publish_status===1 && detailInfoList.allow_statistics===true? + 撤销申请:"" + } + + { + detailInfoList.publish_status===2 && detailInfoList.allow_statistics===true? + 撤销发布:"" + } +
    +
    +
    + } + +
    + ) + } +} export default DetailTop; \ No newline at end of file diff --git a/public/react/src/modules/paths/PathDetail/PathDetailIndex.js b/public/react/src/modules/paths/PathDetail/PathDetailIndex.js index 61933b765..a72771c39 100644 --- a/public/react/src/modules/paths/PathDetail/PathDetailIndex.js +++ b/public/react/src/modules/paths/PathDetail/PathDetailIndex.js @@ -369,9 +369,11 @@ class PathDetailIndex extends Component{

    课程须知 {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? + - + + :"" }

    @@ -397,16 +399,18 @@ class PathDetailIndex extends Component{
    +
    15&&clickdetailInfoListtype===false?"newsubscript mb9 color-grey-9 fr":"newsubscript mb9 color-grey-9 none"} - data-tip-down="显示全部" onClick={()=>this.clickNewsubscript(0)} >...
    +
    +
    this.clickNewsubscript(1)}>
    +
    } diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js index f5d57ae21..65e95319e 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js @@ -293,11 +293,12 @@ class Challenges extends Component {

    简介 + + href={"/shixuns/" + id + "/settings?edit=1"} className="ring-green fr"> +

    {item.st === 0 ? - + + + : - + + + } 第{key+1}关 diff --git a/public/react/src/modules/tpm/shixunchild/Propaedeutics/Propaedeu_tics.js b/public/react/src/modules/tpm/shixunchild/Propaedeutics/Propaedeu_tics.js index a2b20415d..f40e9fa63 100644 --- a/public/react/src/modules/tpm/shixunchild/Propaedeutics/Propaedeu_tics.js +++ b/public/react/src/modules/tpm/shixunchild/Propaedeutics/Propaedeu_tics.js @@ -10,6 +10,8 @@ import classNames from 'classnames'; import { getImageUrl, toPath } from 'educoder'; +import { Tooltip } from 'antd'; + import axios from 'axios'; import { CircularProgress } from 'material-ui/Progress'; @@ -76,8 +78,10 @@ class Propaedeutics extends Component { return (

    - + + + +

    { loadingContent ? From 943a628dc91ed81f5e1fd96d927a7508e34e2c2c Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 25 Jul 2019 16:26:25 +0800 Subject: [PATCH 16/25] clear --- public/react/src/modules/user/account/AccountBasicEdit.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/public/react/src/modules/user/account/AccountBasicEdit.js b/public/react/src/modules/user/account/AccountBasicEdit.js index 1458862a1..24674a3ce 100644 --- a/public/react/src/modules/user/account/AccountBasicEdit.js +++ b/public/react/src/modules/user/account/AccountBasicEdit.js @@ -274,6 +274,11 @@ class AccountBasic extends Component { return item.name == e; }); if (!arr[0]) { + if (!e) { + this.setState({ + filterSchoolList: [] + }) + } // 没找到学校,清空部门 this.setState({ departments: [], From 47ef7842e8c0eece2c210feee149a11a820525cc Mon Sep 17 00:00:00 2001 From: czd Date: Thu, 25 Jul 2019 16:26:25 +0800 Subject: [PATCH 17/25] 123 --- 2 | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 2 diff --git a/2 b/2 new file mode 100644 index 000000000..e69de29bb From c661aed21b4e0aface22f241502cb860a7cae8b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 25 Jul 2019 16:38:11 +0800 Subject: [PATCH 18/25] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/css/edu-all.css | 2 +- public/stylesheets/educoder/edu-all.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index ed44e1f90..ca04aa193 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -289,7 +289,7 @@ label.infolabel{display: block;float: left;width: 56px;text-align: right;margin- .shaiTitle{display: block;padding-right: 20px;} .shaiContent li.shaiItem.active{background-color: #4CACFF!important;color:#fff!important;} .shaiContent li.shaiItem{padding:3px 15px;float: left;border-radius: 4px;color: #4C4C4C;cursor: pointer;margin-right: 15px;display: block} -.shaiContent li.shaiItem:hover{background-color: #F5F5F5} +.shaiContent li.shaiItem:hover{background-color: #4CACFF!important;color:#fff!important;} .shaiAllItem{max-width: 1138px;} .subshaicontent{display: none;box-sizing: border-box;position: absolute;width: 100%;top: 33px;left: 0px;background-color: #fff;box-shadow:0px 1px 4px rgba(76,76,76,0.2);padding:0px 20px;z-index: 99999;border-radius: 4px;max-height: 800px;overflow-y: auto} .subshaicontent-part{border-bottom: 1px solid #eee;} diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index 4006fb615..45aea81be 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -291,7 +291,7 @@ label.infolabel{display: block;float: left;width: 56px;text-align: right;margin- .shaiTitle{display: block;padding-right: 20px;} .shaiContent li.shaiItem.active{background-color: #4CACFF!important;color:#fff!important;} .shaiContent li.shaiItem{padding:3px 15px;float: left;border-radius: 4px;color: #4C4C4C;cursor: pointer;margin-right: 15px;display: block} -.shaiContent li.shaiItem:hover{background-color: #F5F5F5} +.shaiContent li.shaiItem:hover{background-color: #4CACFF!important;color:#fff!important;} .shaiAllItem{max-width: 1138px;} .subshaicontent{display: none;box-sizing: border-box;position: absolute;width: 100%;top: 33px;left: 0px;background-color: #fff;box-shadow:0px 1px 4px rgba(76,76,76,0.2);padding:0px 20px;z-index: 99999;border-radius: 4px;max-height: 800px;overflow-y: auto} .subshaicontent-part{border-bottom: 1px solid #eee;} From 184db727438eca6105cf3594510de60682d1da8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 25 Jul 2019 16:38:39 +0800 Subject: [PATCH 19/25] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/tpm/component/TPMRightSection.js | 61 +++++++++---------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/public/react/src/modules/tpm/component/TPMRightSection.js b/public/react/src/modules/tpm/component/TPMRightSection.js index 8479acd76..a3a7e9820 100644 --- a/public/react/src/modules/tpm/component/TPMRightSection.js +++ b/public/react/src/modules/tpm/component/TPMRightSection.js @@ -117,36 +117,6 @@ class TPMRightSection extends Component { } -
    -

    推荐实训

    -
    - { - TPMRightSectionData===undefined?"":TPMRightSectionData.recommands===undefined?"":TPMRightSectionData.recommands.map((item,key)=>{ - return( -
    - - 69?1526971094 - -
    - - {item.name} - -

    - {item.stu_num} 人学习 -

    -

    {item.level}

    -
    -
    - ) - }) - } -
    -
    - +
    +

    推荐实训

    +
    + { + TPMRightSectionData===undefined?"":TPMRightSectionData.recommands===undefined?"":TPMRightSectionData.recommands.map((item,key)=>{ + return( +
    + + 69?1526971094 + +
    + + {item.name} + +

    + {item.stu_num} 人学习 +

    +

    {item.level}

    +
    +
    + ) + }) + } +
    +
    } From 09d0bcd196097e28afe4afdd52c83c2b26d92897 Mon Sep 17 00:00:00 2001 From: czd Date: Thu, 25 Jul 2019 16:40:40 +0800 Subject: [PATCH 20/25] 123 --- 3 | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 3 diff --git a/3 b/3 new file mode 100644 index 000000000..e69de29bb From 6b1db7bea25ab9cc20af41fb70535f612bad7815 Mon Sep 17 00:00:00 2001 From: czd Date: Thu, 25 Jul 2019 16:41:33 +0800 Subject: [PATCH 21/25] 123 --- 4 | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 4 diff --git a/4 b/4 new file mode 100644 index 000000000..e69de29bb From 2c639426b7e4e3f83ee706a9f4eddf06fda45ca4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 25 Jul 2019 16:46:20 +0800 Subject: [PATCH 22/25] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 2 | 0 3 | 0 4 | 0 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 2 delete mode 100644 3 delete mode 100644 4 diff --git a/2 b/2 deleted file mode 100644 index e69de29bb..000000000 diff --git a/3 b/3 deleted file mode 100644 index e69de29bb..000000000 diff --git a/4 b/4 deleted file mode 100644 index e69de29bb..000000000 From 50dd27e744828c4b3226f879a0a32c9447564b8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 25 Jul 2019 16:52:04 +0800 Subject: [PATCH 23/25] b --- public/react/src/modules/tpm/newshixuns/Newshixuns.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/react/src/modules/tpm/newshixuns/Newshixuns.js b/public/react/src/modules/tpm/newshixuns/Newshixuns.js index 8cb79e9d0..c15269c5a 100644 --- a/public/react/src/modules/tpm/newshixuns/Newshixuns.js +++ b/public/react/src/modules/tpm/newshixuns/Newshixuns.js @@ -16,6 +16,7 @@ import './css/Newshixuns.css'; import {getUrl} from 'educoder' +import moment from 'moment'; let path = getUrl("/editormd/lib/") From 016f6377eb8910f24b78bdb586c8cea6352944da Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 25 Jul 2019 17:06:56 +0800 Subject: [PATCH 24/25] current_user && --- public/react/src/modules/courses/exercise/ExerciseNew.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/exercise/ExerciseNew.js b/public/react/src/modules/courses/exercise/ExerciseNew.js index fe1b8f565..f5332d56e 100644 --- a/public/react/src/modules/courses/exercise/ExerciseNew.js +++ b/public/react/src/modules/courses/exercise/ExerciseNew.js @@ -407,11 +407,11 @@ class ExerciceNew extends Component{ } `}
    - + ]}> }

    {this.isEdit ? "编辑" : "新建"}试卷 From 8debe9d99ea56eaea61dbe08ff1685cc0a7ce50b Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 25 Jul 2019 17:07:02 +0800 Subject: [PATCH 25/25] key --- .../src/modules/courses/exercise/ExerciseDisplay.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/react/src/modules/courses/exercise/ExerciseDisplay.js b/public/react/src/modules/courses/exercise/ExerciseDisplay.js index 4da4768d2..bd70bece6 100644 --- a/public/react/src/modules/courses/exercise/ExerciseDisplay.js +++ b/public/react/src/modules/courses/exercise/ExerciseDisplay.js @@ -120,35 +120,35 @@ class ExerciseDisplay extends Component{ return } else if (item.question_type == 2) { return } else if (item.question_type == 3) { return } else if (item.question_type == 4) { return } else if (item.question_type == 5) { return }