Merge branch 'develop' into dev_aliyun

dev_static
cxt 6 years ago
commit 6e7c80ac77

@ -23,23 +23,23 @@ class ApplicationController < ActionController::Base
# 所有请求必须合法签名 # 所有请求必须合法签名
def check_sign def check_sign
unless Rails.env.development? # unless Rails.env.development?
Rails.logger.info("66666 #{params}") # Rails.logger.info("66666 #{params}")
suffix = request.url.split(".").last.split("?").first # suffix = request.url.split(".").last.split("?").first
suffix_arr = ["xls", "xlsx", "pdf", "zip"] # excel文件先注释 # suffix_arr = ["xls", "xlsx", "pdf"] # excel文件先注释
unless suffix_arr.include?(suffix) # unless suffix_arr.include?(suffix)
if params[:client_key].present? # if params[:client_key].present?
randomcode = params[:randomcode] # randomcode = params[:randomcode]
# tip_exception(501, "请求不合理") unless (Time.now.to_i - randomcode.to_i).between?(0,5) # # tip_exception(501, "请求不合理") unless (Time.now.to_i - randomcode.to_i).between?(0,5)
#
sign = Digest::MD5.hexdigest("#{OPENKEY}#{randomcode}") # sign = Digest::MD5.hexdigest("#{OPENKEY}#{randomcode}")
Rails.logger.info("2222 #{sign}") # Rails.logger.info("2222 #{sign}")
tip_exception(501, "请求不合理") if sign != params[:client_key] # tip_exception(501, "请求不合理") if sign != params[:client_key]
else # else
tip_exception(501, "请求不合理") # tip_exception(501, "请求不合理")
end # end
end # end
end # end
end end
# 全局配置参数 # 全局配置参数

@ -101,6 +101,7 @@
</table> </table>
</div> </div>
<% if @work.myshixun.present? %>
<div class="bor-grey-e mt20"> <div class="bor-grey-e mt20">
<p class="pt10 pb10 pl15 pr15 clearfix bor-bottom-greyE"> <p class="pt10 pb10 pl15 pr15 clearfix bor-bottom-greyE">
<span class="fl font-bd">图形统计</span> <span class="fl font-bd">图形统计</span>
@ -224,6 +225,7 @@
</div> </div>
<% end %> <% end %>
</div> </div>
<% end %>
</div> </div>
</body> </body>
@ -261,6 +263,7 @@
// 基于准备好的dom初始化echarts实例 // 基于准备好的dom初始化echarts实例
if(document.getElementById('shixun_skill_chart')){
var effChart = echarts.init(document.getElementById('shixun_skill_chart')); var effChart = echarts.init(document.getElementById('shixun_skill_chart'));
// 指定图表的配置项和数据 // 指定图表的配置项和数据
var option = { var option = {
@ -357,6 +360,9 @@
// 使用刚指定的配置项和数据显示图表 // 使用刚指定的配置项和数据显示图表
effChart.setOption(option); effChart.setOption(option);
console.debug(<%= @myself_consume %>); console.debug(<%= @myself_consume %>);
}
if(document.getElementById('shixun_skill_chart')) {
var ablChart = echarts.init(document.getElementById('shixun_overall_ablility_chart')); var ablChart = echarts.init(document.getElementById('shixun_overall_ablility_chart'));
var dataBJ = <%= @echart_data[:consume_list] %>; var dataBJ = <%= @echart_data[:consume_list] %>;
var schema = [ var schema = [
@ -471,5 +477,6 @@
// 使用刚指定的配置项和数据显示图表。 // 使用刚指定的配置项和数据显示图表。
ablChart.setOption(option1); ablChart.setOption(option1);
} }
}
</script> </script>
</html> </html>

@ -1,7 +1,7 @@
# 执行示例 bundle exec rake zip_pack:shixun_pack args=123,2323 # 执行示例 bundle exec rake zip_pack:shixun_pack args=123,2323
namespace :zip_pack do namespace :zip_pack do
desc "手工打包作品" desc "手工打包作品"
OUTPUT_FOLDER = "#{Rails.root}/files/archiveZip" OUTPUT_FOLDER = "/tmp"
task :shixun_pack => :environment do task :shixun_pack => :environment do
@ -23,7 +23,7 @@ namespace :zip_pack do
student_works.find_each.map do |student_work| student_works.find_each.map do |student_work|
export = ExportShixunReportService.new(homework, student_work) export = ExportShixunReportService.new(homework, student_work)
pdf = export.to_pdf pdf = export.to_pdf
# pdfs << pdf pdfs << pdf
begin begin
zip.add(export.filename, pdf.path) zip.add(export.filename, pdf.path)
rescue => ex rescue => ex

@ -30,7 +30,7 @@ const env = getClientEnvironment(publicUrl);
module.exports = { module.exports = {
// You may want 'eval' instead if you prefer to see the compiled output in DevTools. // You may want 'eval' instead if you prefer to see the compiled output in DevTools.
// See the discussion in https://github.com/facebookincubator/create-react-app/issues/343.s // See the discussion in https://github.com/facebookincubator/create-react-app/issues/343.s
devtool: "cheap-module-eval-source-map", //devtool: "cheap-module-eval-source-map",
// 开启调试 // 开启调试
//devtool: "source-map", // 开启调试 //devtool: "source-map", // 开启调试
// These are the "entry points" to our application. // These are the "entry points" to our application.

@ -326,8 +326,8 @@ module.exports = {
comments: false comments: false
}, },
compress: { compress: {
drop_debugger: false, drop_debugger: true,
drop_console: false drop_console: true
} }
} }
}), }),

@ -40,7 +40,7 @@ if (isDev) {
// 超管 // 超管
// debugType="admin"; // debugType="admin";
// 老师 // 老师
//ebugType="teacher"; //debugType="teacher";
// 学生 // 学生
//debugType="student"; //debugType="student";
@ -126,7 +126,7 @@ export function initAxiosInterceptors(props) {
let timestamp = Date.parse(new Date())/1000; let timestamp = Date.parse(new Date())/1000;
if (window.location.port === "3007") { if (window.location.port === "3007") {
// let timestamp=railsgettimes(proxy); // let timestamp=railsgettimes(proxy);
console.log(timestamp) // console.log(timestamp)
railsgettimes(`${proxy}/api/main/first_stamp.json`); railsgettimes(`${proxy}/api/main/first_stamp.json`);
let newopens=md5(opens+timestamp) let newopens=md5(opens+timestamp)
config.url = `${proxy}${url}`; config.url = `${proxy}${url}`;

@ -297,7 +297,7 @@ class CommonWorkAppraiseReply extends Component{
<style>{` <style>{`
.course-message .panel-comment_item .comment_orig_content { .course-message .panel-comment_item .comment_orig_content {
width: 1074px; width: 1040px;
} }
.course-message .childrenCommentsView .comment_orig_content { .course-message .childrenCommentsView .comment_orig_content {
width: 1000px; width: 1000px;

@ -734,7 +734,7 @@ background:rgba(204,204,204,0.2) !important;
} }
`} `}
</style> </style>
<Breadcrumb separator="|" className={"mt5"}> { excellent===true&&this.props.isAdminOrStudent()===false?"":<Breadcrumb separator="|" className={"mt5"}>
<Breadcrumb.Item className={"pointer"}> <Breadcrumb.Item className={"pointer"}>
<Tooltip getPopupContainer={trigger => trigger.parentNode} visible={coursedata.teacher_applies_count===undefined?false:coursedata.teacher_applies_count>0?true:false} <Tooltip getPopupContainer={trigger => trigger.parentNode} visible={coursedata.teacher_applies_count===undefined?false:coursedata.teacher_applies_count>0?true:false}
@ -766,7 +766,7 @@ background:rgba(204,204,204,0.2) !important;
<span className="color-grey-c font-16"><span className={"mr10 ml10"}>学分</span> <span className={"mr10"}>{coursedata.credit}</span></span> <span className="color-grey-c font-16"><span className={"mr10 ml10"}>学分</span> <span className={"mr10"}>{coursedata.credit}</span></span>
}</Breadcrumb.Item> }</Breadcrumb.Item>
</Breadcrumb> </Breadcrumb>}
{/*<li className={"mt7 teachersbox"} >*/} {/*<li className={"mt7 teachersbox"} >*/}
{/*<Link to={"/courses/"+this.props.match.params.coursesId+"/teachers"}>*/} {/*<Link to={"/courses/"+this.props.match.params.coursesId+"/teachers"}>*/}

@ -55,7 +55,7 @@ class MemoDetail extends Component {
} }
} }
componentDidMount() { componentDidMount() {
window.$("html,body").animate({"scrollTop":0}) // window.$("html,body").animate({"scrollTop":0})
const { match } = this.props const { match } = this.props

@ -200,13 +200,13 @@ class ShixunsHome extends Component {
item.sub_repertoires.map((i,k)=>{ item.sub_repertoires.map((i,k)=>{
return( return(
<div className="clearfix mt20 mb5 pb10 navlistpanel-line" key={k}> <div className="clearfix mt20 mb5 pb10 navlistpanel-line" key={k}>
<p className="little-title clearfix welcome_shixun_index little-titles" <div className="little-title clearfix welcome_shixun_index little-titles"
data-id="1" data-rep-id="1" data-type="sub" data-id="1" data-rep-id="1" data-type="sub"
> >
<Link to={"/shixuns?id="+i.id+"&type=sub&palce="+item.id}> <Link to={"/shixuns?id="+i.id+"&type=sub&palce="+item.id}>
{i.name} {i.name}
</Link> </Link>
</p> </div>
{ {
i.tags.map((t,e)=>{ i.tags.map((t,e)=>{
return( return(

@ -21,8 +21,16 @@ import './tpiPageForMobile.css';
import actions from '../../redux/actions'; import actions from '../../redux/actions';
const $ = window.$; const $ = window.$;
class MainContent extends Component { class MainContent extends Component {
constructor(props) {
super(props)
this.chooseQ = React.createRef();
}
chooseQfun = (Ref) => {
this.chooseQ = Ref;
}
componentDidMount() { componentDidMount() {
// ios下图标位置有问题 // ios下图标位置有问题
this.props.mainContentfun(this)
setTimeout(()=>{ setTimeout(()=>{
if (window.$('.b-label>.resize-helper').position().top < 100) { if (window.$('.b-label>.resize-helper').position().top < 100) {
window.$('.b-label>.resize-helper').css('top', '200px') window.$('.b-label>.resize-helper').css('top', '200px')
@ -162,7 +170,7 @@ class MainContent extends Component {
<CodeRepositoryViewContainer { ...this.props } ></CodeRepositoryViewContainer> <CodeRepositoryViewContainer { ...this.props } ></CodeRepositoryViewContainer>
</div> </div>
</React.Fragment> </React.Fragment>
: <ChooseRepositoryView ref="chooseQ" { ...this.props }></ChooseRepositoryView> : <ChooseRepositoryView ref="chooseQ" chooseQfun={(ref)=>this.chooseQfun(ref)}{ ...this.props }></ChooseRepositoryView>
} }
{/* */} {/* */}

@ -158,7 +158,7 @@ class MainContentContainer extends Component {
this.showResetCodeDialog = this.showResetCodeDialog.bind(this) this.showResetCodeDialog = this.showResetCodeDialog.bind(this)
this.showResetPassedCodeDialog = this.showResetPassedCodeDialog.bind(this) this.showResetPassedCodeDialog = this.showResetPassedCodeDialog.bind(this)
this.mainContent = React.createRef();
this.oldRepositoryCode = ''; this.oldRepositoryCode = '';
@ -177,7 +177,9 @@ class MainContentContainer extends Component {
isEditablePath: true isEditablePath: true
} }
} }
mainContentfun = (Ref) => {
this.mainContent = Ref;
}
// ------------------------------------------------ // ------------------------------------------------
// static childContextTypes = { // static childContextTypes = {
// muiTheme: PropTypes.object // muiTheme: PropTypes.object
@ -589,7 +591,9 @@ class MainContentContainer extends Component {
onRunChooseTest() { onRunChooseTest() {
const { st, game, onRunChooseTestFinish, showSnackbar } = this.props; const { st, game, onRunChooseTestFinish, showSnackbar } = this.props;
// 获取form表单值 // 获取form表单值
var value = this.refs.mainContent.refs.chooseQ.getForm().getFieldsValue(); // console.log(this.mainContent.chooseQ.props.form.getFieldsValue())
var value = this.mainContent.chooseQ.props.form.getFieldsValue();
// this.refs.mainContent.refs.chooseQ.getForm().getFieldsValue();
var valueArray = []; // map转array var valueArray = []; // map转array
var unSelectOptionIndexArray = [] // 自己做未选提示 var unSelectOptionIndexArray = [] // 自己做未选提示
@ -984,7 +988,7 @@ class MainContentContainer extends Component {
</Dialog> </Dialog>
<UpdateDrawer {...this.props} fetchRepositoryCode={this.fetchRepositoryCode}></UpdateDrawer> <UpdateDrawer {...this.props} fetchRepositoryCode={this.fetchRepositoryCode}></UpdateDrawer>
<MainContent ref="mainContent" {...this.props} output_sets={output_sets} {...this.state} <MainContent ref="mainContent" mainContentfun={(ref)=>this.mainContentfun(ref)} {...this.props} output_sets={output_sets} {...this.state}
onRepositoryCodeUpdate={this.onRepositoryCodeUpdate} onRunCodeTest={this.onRunCodeTest} onRepositoryCodeUpdate={this.onRepositoryCodeUpdate} onRunCodeTest={this.onRunCodeTest}
codemirrorDidMount={this.codemirrorDidMount} fetchRepositoryCode={this.fetchRepositoryCode} codemirrorDidMount={this.codemirrorDidMount} fetchRepositoryCode={this.fetchRepositoryCode}
showResetCodeDialog={this.showResetCodeDialog} showResetPassedCodeDialog={this.showResetPassedCodeDialog} showResetCodeDialog={this.showResetCodeDialog} showResetPassedCodeDialog={this.showResetPassedCodeDialog}

@ -1,10 +1,10 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import IconButton from 'material-ui/IconButton';
import Tooltip from 'material-ui/Tooltip'; import Tooltip from 'material-ui/Tooltip';
import { CircularProgress } from 'material-ui/Progress'; import { CircularProgress } from 'material-ui/Progress';
import './ChooseEvaluateViewnew.css';
class ChooseEvaluateView extends Component { class ChooseEvaluateView extends Component {
@ -128,7 +128,7 @@ class ChooseEvaluateView extends Component {
</div> </div>
<div id="blacktab_con_2" className=" "> <div id="blacktab_con_2" className=" ">
<div className="fit -scroll"> <div className="fit -scroll">
<div className="-layout-v -fit"> <div className="-layout-v -fit paddingbottom60tpm">
<div className="-flex -scroll task-padding16 loading-center undis" id="evaluating_ajax_loading"></div> <div className="-flex -scroll task-padding16 loading-center undis" id="evaluating_ajax_loading"></div>
<div className="-flex -scroll task-padding16" id="evaluating_contents"> <div className="-flex -scroll task-padding16" id="evaluating_contents">
{/* {/*

@ -0,0 +1,3 @@
.paddingbottom60tpm{
padding-bottom: 60px;
}

@ -70,6 +70,9 @@ subject:"计算机中的应用软件是指:"
option_name:"所有计算机上都应使用的软件" option_name:"所有计算机上都应使用的软件"
positon:0 positon:0
*/ */
componentDidMount() {
this.props.chooseQfun(this)
}
renderChooseQuestions() { renderChooseQuestions() {
const { getFieldDecorator } = this.props.form; const { getFieldDecorator } = this.props.form;
const { choose, choose_test_cases } = this.props; const { choose, choose_test_cases } = this.props;

@ -135,3 +135,7 @@
.-task-ces-info .inputTitle .input{ .-task-ces-info .inputTitle .input{
white-space: pre-wrap; white-space: pre-wrap;
} }
.paddingbottom60tpm{
padding-bottom: 60px;
}

@ -1,11 +1,10 @@
import '../VNC.css'; import '../VNC.css';
import React, { Component } from 'react'; import React, { Component } from 'react';
import IconButton from 'material-ui/IconButton';
import Tooltip from 'material-ui/Tooltip'; import Tooltip from 'material-ui/Tooltip';
import Button from 'material-ui/Button';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import './CodeEvaluateView.css' import './CodeEvaluateView.css';
import { CircularProgress } from 'material-ui/Progress'; import { CircularProgress } from 'material-ui/Progress';
import { on, off } from 'educoder' import { on, off } from 'educoder'
import actions from '../../../redux/actions'; import actions from '../../../redux/actions';
@ -386,7 +385,7 @@ class CodeEvaluateView extends Component {
</div> </div>
<div id="blacktab_con_2" className=" " style={ tabIndex === 1 ? {display: 'block'} : {display: 'none'} }> <div id="blacktab_con_2" className=" " style={ tabIndex === 1 ? {display: 'block'} : {display: 'none'} }>
<div className="fit -scroll"> <div className="fit -scroll">
<div className="-layout-v -fit"> <div className="-layout-v -fit paddingbottom60tpm">
<div className="-flex -scroll task-padding16 loading-center undis" id="evaluating_ajax_loading"></div> <div className="-flex -scroll task-padding16 loading-center undis" id="evaluating_ajax_loading"></div>
<div className="-flex -scroll task-padding16" id="evaluating_contents"> <div className="-flex -scroll task-padding16" id="evaluating_contents">
{/* {/*

@ -510,7 +510,8 @@ class DetailCards extends Component{
{this.props.current_user&&this.props.current_user.admin===true||this.props.current_user&&this.props.current_user.business===true? {this.props.current_user&&this.props.current_user.admin===true||this.props.current_user&&this.props.current_user.business===true?
item.shixuns_list && item.shixuns_list.map((line,index)=>{ item.shixuns_list && item.shixuns_list.map((line,index)=>{
return( return(
<div className="clearfix paragraph lineh-30" onMouseEnter> <div className="clearfix paragraph lineh-30" onMouseEnter={()=>this.showparagraph(key,index)} onMouseLeave={this.hideparagraph}>
<li className="fl li-width63"> <li className="fl li-width63">
@ -531,6 +532,7 @@ class DetailCards extends Component{
{ {
showparagraphkey===key&&showparagraphindex===index?<div> showparagraphkey===key&&showparagraphindex===index?<div>
<Link to={'/shixuns/'+line.identifier+'/challenges'} className="mr30 color-blue_4C shixun_detail pointer fl" target="_blank">查看详情</Link> <Link to={'/shixuns/'+line.identifier+'/challenges'} className="mr30 color-blue_4C shixun_detail pointer fl" target="_blank">查看详情</Link>
{line.shixun_status==="暂未公开"?"":<a onClick={()=>this.startgameid(line.identifier)} className="btn_auto user_bluebg_btn fl" id="shixun_operation" >开始实战</a>}
</div>:"" </div>:""
} }
</li> </li>

@ -135,6 +135,13 @@ class TPMBanner extends Component {
this.setState({ this.setState({
openknow:true openknow:true
}) })
setTimeout(()=>{
this.openknow()
this.setState({
openknow:false
})
}, 10000);
}else{ }else{
this.setState({ this.setState({
openknow:false openknow:false
@ -158,6 +165,12 @@ class TPMBanner extends Component {
this.setState({ this.setState({
openshowpublictype: true openshowpublictype: true
}) })
setTimeout(()=>{
this.openshowpublic()
this.setState({
openshowpublictype:false
})
}, 10000);
} else { } else {
this.setState({ this.setState({
openshowpublictype: false openshowpublictype: false

@ -163,7 +163,7 @@ class TPMIndex extends Component {
openknows:false openknows:false
}) })
let newTPMsettings=this.props.user&&this.props.user.user_id+'newTPMsettings' let newTPMsettings=this.props.user&&this.props.user.user_id+'newTPMsettings'
storage.setItem(newTPMsettings,true); storage.setItem(newTPMsettings,false);
} }
@ -174,7 +174,7 @@ class TPMIndex extends Component {
let newTPMsettings=window.localStorage.getItem(getnewTPMsettings) let newTPMsettings=window.localStorage.getItem(getnewTPMsettings)
if(newTPMsettings===undefined||newTPMsettings===false||newTPMsettings===null){ if(newTPMsettings===undefined||newTPMsettings===false||newTPMsettings===null){
this.setState({ this.setState({
openknows:true openknows:false
}) })
}else{ }else{
this.setState({ this.setState({
@ -453,20 +453,20 @@ class TPMIndex extends Component {
{ this.state.is_jupyter===false? <Menu.Item key="8" className={"competitionmr50"}> { this.state.is_jupyter===false? <Menu.Item key="8" className={"competitionmr50"}>
<span className={"tpmbannernavstyler"}>排行榜</span> <span className={"tpmbannernavstyler"}>排行榜</span>
</Menu.Item>:""} </Menu.Item>:""}
{this.state.identity >4||this.state.identity===undefined ? "":this.state.openknows===true?<span> {/*{this.state.identity >4||this.state.identity===undefined ? "":this.state.openknows===true?<span>*/}
<Popover {/* <Popover*/}
content={ {/* content={*/}
<pre className={"bannerpd201"}> {/* <pre className={"bannerpd201"}>*/}
<div>更多设置在这里点击配置看一看~</div> {/* <div>更多设置在这里,点击“配置”看一看~</div>*/}
<div className={"wechatcenter mt15"}><Button type="primary" onClick={this.openknow} >我知道了</Button></div> {/* <div className={"wechatcenter mt15"}><Button type="primary" onClick={this.openknow} >我知道了</Button></div>*/}
</pre> {/* </pre>*/}
} {/* }*/}
trigger="click" {/* trigger="click"*/}
placement="top" {/* placement="top"*/}
visible={this.state.openknows} {/* visible={this.state.openknows}*/}
> {/* >*/}
</Popover> {/* </Popover>*/}
</span>:""} {/*</span>:""}*/}
{this.state.identity >4||this.state.identity===undefined ? "": {this.state.identity >4||this.state.identity===undefined ? "":
<Menu.Item key="9" className={"competitionmr50"}> <Menu.Item key="9" className={"competitionmr50"}>

@ -375,9 +375,7 @@ export function TPMIndexHOC(WrappedComponent) {
}); });
} }
/**
课堂权限相关方法暂时写这里了 ----------------------------------------END
*/
fetchUser = () => { fetchUser = () => {
let url = `/users/get_user_info.json` let url = `/users/get_user_info.json`
let courseId; let courseId;

@ -69,6 +69,7 @@ function JupyterTPI (props) {
drawervisible, drawervisible,
reset_with_tpi, reset_with_tpi,
jupytertime, jupytertime,
endjupytertime,
active_with_tpi, active_with_tpi,
spinning, spinning,
updataspinning, updataspinning,
@ -303,7 +304,7 @@ function JupyterTPI (props) {
> >
<div className="sortinxdirection"> <div className="sortinxdirection">
<Icon type="file-text" className="jupyter_icon fl lineheighttaj filestyles" /> <Icon type="file-text" className="jupyter_icon fl lineheighttaj filestyles" />
<a className="jupyter_name ml10 maxnamewidth181 lineheighttaj colorlineheighttaj" title={item.title}>{item.title}</a> <a className="jupyter_name ml10 maxnamewidth152 lineheighttaj colorlineheighttaj" title={item.title}>{item.title}</a>
<a className={"fr color-blue lineheighttaj"} <a className={"fr color-blue lineheighttaj"}
onClick={() => { onClick={() => {
jsCopy("file_path"+i) jsCopy("file_path"+i)
@ -326,6 +327,7 @@ function JupyterTPI (props) {
}, [props]); }, [props]);
const onFinish= () =>{ const onFinish= () =>{
Modal.destroyAll();
Modal.confirm({ Modal.confirm({
title: '倒计时截止', title: '倒计时截止',
content: ( content: (
@ -337,11 +339,24 @@ function JupyterTPI (props) {
cancelText: '取消', cancelText: '取消',
onOk () { onOk () {
reset_with_tpi(myIdentifier, '重置成功'); reset_with_tpi(myIdentifier, '重置成功');
// active_with_tpi(myIdentifier, '重置成功');
} }
}) })
} }
const endonFinish= () =>{
Modal.confirm({
title: '服务中断提醒',
content: (
<p style={{ lineHeight: '24px' }}>
jupyter将于<span className={"Countdownfonttpi"}><Countdown value={jupytertime} format="HH:mm:ss"/></span>使
</p>
),
okText: '立即延长',
cancelText: '不需要',
onOk () {
active_with_tpi(myIdentifier, '延长成功');
}
})
}
return ( return (
<Spin tip="加载中..." spinning={spinning}> <Spin tip="加载中..." spinning={spinning}>
<div className="jupyter_area"> <div className="jupyter_area">
@ -351,6 +366,9 @@ function JupyterTPI (props) {
<span className="title_desc" style={{ marginTop: '10px' }}>{jupyterInfo.name}</span> <span className="title_desc" style={{ marginTop: '10px' }}>{jupyterInfo.name}</span>
<span className="title_time jupytertitle_time"> <span className="title_time jupytertitle_time">
<Countdown value={jupytertime} format="HH:mm:ss" onFinish={onFinish}/> <Countdown value={jupytertime} format="HH:mm:ss" onFinish={onFinish}/>
<span className={"Countdowntypes"}>
{/*{endjupytertime===false?"":<Countdown value={endjupytertime} format="HH:mm:ss" onFinish={endonFinish}/>}*/}
</span>
</span> </span>
</p> </p>
<p className="jupyter_btn"> <p className="jupyter_btn">
@ -457,7 +475,7 @@ const mapStateToProps = (state) => {
jupyter_pagination, jupyter_pagination,
jupyter_identifier jupyter_identifier
} = state.jupyterReducer; } = state.jupyterReducer;
const { loading ,drawervisible,jupytertime,spinning} = state.commonReducer; const { loading ,drawervisible,jupytertime,spinning,endjupytertime} = state.commonReducer;
return { return {
loading, loading,
jupyter_info, jupyter_info,
@ -470,6 +488,7 @@ const mapStateToProps = (state) => {
jupyter_identifier, jupyter_identifier,
drawervisible, drawervisible,
jupytertime, jupytertime,
endjupytertime,
spinning spinning
}; };
} }

@ -26,7 +26,7 @@
.filestyles{ .filestyles{
color: #28b887 !important; color: #28b887 !important;
font-size: 25px !important; font-size: 25px !important;
margin-left:20px; margin-left:48px;
} }
.Resizer.horizontal:hover { .Resizer.horizontal:hover {
border-top: 5px solid rgba(0, 0, 0, 0.5); border-top: 5px solid rgba(0, 0, 0, 0.5);
@ -230,16 +230,32 @@ line-height: 50px !important;
width: 186px; width: 186px;
} }
.maxnamewidth181{ .maxnamewidth152{
max-width:181px; max-width:152px;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
cursor: default; cursor: default;
width: 181px; width: 152px;
} }
.height45lineheight45{ .height45lineheight45{
height: 45px; height: 45px;
line-height: 45px !important; line-height: 45px !important;
} }
.Countdowntypes{
width:1px;
height:1px;
overflow: hidden;
display: block;
}
.Countdownfonttpi{
width: 60px;
display: inline-block;
}
.Countdownfonttpi .ant-statistic-content-value{
font-size: 14px;
}

@ -30,7 +30,8 @@ class Challengesjupyter extends Component {
fileList:[], fileList:[],
shuaxin:false, shuaxin:false,
showtime:false, showtime:false,
jupytertime:Date.now() +3600 * 1000 jupytertime:Date.now() +3600 * 1000,
endtimes:false
} }
} }
@ -119,10 +120,12 @@ class Challengesjupyter extends Component {
let remainingSeconds=response.data.remainingSeconds; let remainingSeconds=response.data.remainingSeconds;
// let summain=3600 * 1000; // let summain=3600 * 1000;
let sums= remainingSeconds * 1000; let sums= remainingSeconds * 1000;
let endsms=(remainingSeconds-300<=0?0:remainingSeconds-300)*1000
// let sum=summain-sums; // let sum=summain-sums;
setTimeout(()=>{ setTimeout(()=>{
this.setState({ this.setState({
jupytertime:Date.now() +sums jupytertime:Date.now() +sums,
endtimes:endsms===0?Date.now()+1000:Date.now() +endsms
}) })
},500); },500);
} }
@ -420,6 +423,7 @@ class Challengesjupyter extends Component {
} }
onFinish=()=>{ onFinish=()=>{
Modal.destroyAll();
let id=this.props.match.params.shixunId; let id=this.props.match.params.shixunId;
let that=this; let that=this;
Modal.confirm({ Modal.confirm({
@ -436,8 +440,45 @@ class Challengesjupyter extends Component {
} }
}) })
} }
onendFinish=()=>{
let id=this.props.match.params.shixunId;
let that=this;
Modal.confirm({
title:"服务中断提醒",
content: (
<p style={{ lineHeight: '24px' }}>
jupyter将于<span className={"Countdownfonttpm"}><Countdown value={this.state.jupytertime} format="HH:mm:ss" onFinish={this.onFinish}/></span>使
</p>
),
okText: '立即延长',
cancelText: '不需要',
onOk () {
that.onendhandleClickResetTpi(id)
}
})
}
onendhandleClickResetTpi=(id)=>{
const url = `/jupyters/active_with_tpm.json`;
axios.get(url,{params:{
identifier:id
}}).then((response) => {
if(response.data.status===0){
this.props.showNotification('延长成功!');
setTimeout(()=>{
this.setState({
jupytertime:Date.now() + 900 * 1000,
endtimes:Date.now() + 300 * 1000
})
},500);
}
});
}
render() { render() {
let{ChallengesDataList,booljupyterurls,enlarge,fileList}=this.state; let{ChallengesDataList,booljupyterurls,enlarge,fileList,endtimes}=this.state;
let id = this.props.match.params.shixunId; let id = this.props.match.params.shixunId;
//老师 //老师
const is_teacher = this.props&&this.props.current_user&&this.props.current_user.is_teacher?this.props.current_user.is_teacher:false; const is_teacher = this.props&&this.props.current_user&&this.props.current_user.is_teacher?this.props.current_user.is_teacher:false;
@ -509,6 +550,7 @@ class Challengesjupyter extends Component {
<span className={"Countdowntypes"}> <span className={"Countdowntypes"}>
{/*this.state.jupytertime*/} {/*this.state.jupytertime*/}
<Countdown value={this.state.jupytertime} format="HH:mm:ss" onFinish={this.onFinish}/> <Countdown value={this.state.jupytertime} format="HH:mm:ss" onFinish={this.onFinish}/>
{/*{endtimes===false?"":<Countdown value={endtimes} format="HH:mm:ss" onFinish={this.onendFinish}/>}*/}
</span> </span>
<p className="clearfix mb20 edu-back-white"> <p className="clearfix mb20 edu-back-white">

@ -239,3 +239,12 @@
background-color: #29BD8B !important; background-color: #29BD8B !important;
border-color: transparent ; border-color: transparent ;
} }
.Countdownfonttpm{
width: 60px;
display: inline-block;
}
.Countdownfonttpm .ant-statistic-content-value{
font-size: 14px;
}

@ -74,7 +74,7 @@ export const getJupyterTpiUrl = (obj) => {
const id = obj.identifier || jupyter_info.myshixun_identifier; const id = obj.identifier || jupyter_info.myshixun_identifier;
fetchJupyterTpiUrl({identifier: id}).then(res => { fetchJupyterTpiUrl({identifier: id}).then(res => {
if (res.data.status === 401) return; // 用户未登录 if (res.data.status === 401) return; // 用户未登录
console.log('获取url', res); //console.log('获取url', res);
if (res.status === 200) { if (res.status === 200) {
const { status, url = '', port } = res.data; const { status, url = '', port } = res.data;
dispatch(updataspinning(false)) dispatch(updataspinning(false))
@ -159,7 +159,8 @@ export const active_with_tpi = (identifier, msg) => {
const {status} = res.data const {status} = res.data
if (status === 0) { if (status === 0) {
message.success(msg); message.success(msg);
dispatch(addjypertime(Date.now() + 900 * 1000)) // dispatch(addjypertime(Date.now() + 900 * 1000,false))
setTimeout(()=>{dispatch(addjypertime(Date.now() + 900 * 1000, Date.now() + 300 * 1000))},800);
} }
} }
}) })
@ -224,11 +225,21 @@ export const changeshowDrawer = (type) => {
} }
} }
//增加倒计时 //增加倒计时
export const addjypertime=(time)=>{ export const addjypertime=(time,endtime)=>{
if(endtime===false){
return { return {
type: types.CHANGE_JYPYTER_TIME, type: types.CHANGE_JYPYTER_TIME,
payload: time payload: time,
endtime:false
} }
}else{
return {
type: types.CHANGE_JYPYTER_TIME,
payload: time,
endtime:endtime
}
}
} }
export const updataspinning=(type)=>{ export const updataspinning=(type)=>{
@ -262,8 +273,9 @@ export const timeinfo_with_tpi = (identifier, dispatch) => {
let remainingSeconds=res.data.remainingSeconds; let remainingSeconds=res.data.remainingSeconds;
// let summain=3600 * 1000; // let summain=3600 * 1000;
let sums= remainingSeconds * 1000; let sums= remainingSeconds * 1000;
let endsms=(remainingSeconds-300<=0?0:remainingSeconds-300)*1000
// let sum=summain-sums; // let sum=summain-sums;
setTimeout(()=>{ dispatch(addjypertime(Date.now() +sums))},500); setTimeout(()=>{ dispatch(addjypertime(Date.now() +sums,endsms===0?Date.now()+1000:Date.now() +endsms))},500);
} }
} }
} }

@ -17,11 +17,12 @@ const initialState = {
isMySource: false, isMySource: false,
drawervisible:false, drawervisible:false,
jupytertime:0, jupytertime:0,
endjupytertime:false,
spinning:false spinning:false
} }
const commonReducer = (state = initialState, action) => { const commonReducer = (state = initialState, action) => {
console.log(action)
switch (action.type) { switch (action.type) {
case types.SHOW_OR_HIDE_CONTROL: case types.SHOW_OR_HIDE_CONTROL:
return { return {
@ -61,7 +62,8 @@ const commonReducer = (state = initialState, action) => {
case types.CHANGE_JYPYTER_TIME: case types.CHANGE_JYPYTER_TIME:
return { return {
...state, ...state,
jupytertime: action.payload jupytertime: action.payload,
endjupytertime:action.endtime,
} }
case types.CHANGE_UPDETA_SPIN: case types.CHANGE_UPDETA_SPIN:
return { return {

@ -45,7 +45,7 @@ const JupyterReducer = (state = initState, action) => {
jupyter_tpi_code: port jupyter_tpi_code: port
} }
case types.SAVE_JUPYTER_IDENTIFIER: case types.SAVE_JUPYTER_IDENTIFIER:
console.log('保存的jupyter_identifier', action.payload); //console.log('保存的jupyter_identifier', action.payload);
return { return {
...state, ...state,
jupyter_identifier: action.payload jupyter_identifier: action.payload

Loading…
Cancel
Save