竞赛内容end

dev_sync_trustie
杨树明 5 years ago
parent 3a0dea5f48
commit dd25f38b8f

@ -321,7 +321,7 @@ module.exports = {
}, },
compress: { compress: {
drop_debugger: true, drop_debugger: true,
drop_console: true drop_console: false
} }
} }
}), }),

@ -1,6 +1,6 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import { Breadcrumb,Layout,Table, Divider, Tag,Badge,Tooltip} from 'antd'; import { Breadcrumb,Layout,Table, Divider, Tag,Badge,Tooltip} from 'antd';
import { Link } from 'react-router-dom';
import axios from 'axios'; import axios from 'axios';
import NoneData from "../../courses/shixunHomework/shixunHomework"; import NoneData from "../../courses/shixunHomework/shixunHomework";
@ -19,6 +19,18 @@ class Competitionteams extends Component{
componentDidMount(){ componentDidMount(){
window.document.title = '竞赛'; window.document.title = '竞赛';
if(this.props.match.params.identifier!=null){
let url=`/competitions/${this.props.match.params.identifier}/common_header.json`;
axios.get(url).then((response) => {
if(response.status===200){
this.setState({
data:response.data,
})
}
}).catch((error) => {
console.log(error)
})
}
this.getshixundata(); this.getshixundata();
this.getcoursedata(); this.getcoursedata();
@ -131,7 +143,7 @@ class Competitionteams extends Component{
} }
render() { render() {
let {data}=this.state;
const shixuncolumns = [ const shixuncolumns = [
{ {
title: '创建者', title: '创建者',
@ -224,14 +236,14 @@ class Competitionteams extends Component{
]; ];
console.log(this.state.shixundata) // console.log(this.state.shixundata)
return ( return (
<div className={"educontent clearfix mt20 "}> <div className={"educontent clearfix mt20 "}>
<Breadcrumb separator=">"> <Breadcrumb separator=">">
<Breadcrumb.Item>全国高校计算机大赛战</Breadcrumb.Item> <Breadcrumb.Item><Link to={"/newcompetitions"}>{data&&data.name}</Link></Breadcrumb.Item>
<Breadcrumb.Item href="">报名</Breadcrumb.Item> <Breadcrumb.Item><Link to={`/newcompetitions/${this.props.match.params.identifier}/enroll`}>报名</Link></Breadcrumb.Item>
<Breadcrumb.Item href="">战队详情</Breadcrumb.Item> <Breadcrumb.Item>战队详情</Breadcrumb.Item>
</Breadcrumb> </Breadcrumb>
<Layout className={"teamsLayout"}> <Layout className={"teamsLayout"}>

@ -5,6 +5,7 @@ import axios from 'axios';
import {markdownToHTML,getImageUrl} from 'educoder'; import {markdownToHTML,getImageUrl} from 'educoder';
import CompetitionContents from './CompetitionContents'; import CompetitionContents from './CompetitionContents';
import CompetitionContentsChart from './CompetitionContentsChart'; import CompetitionContentsChart from './CompetitionContentsChart';
import CompetitionContentsMd from './CompetitionContentsMd';
import NoneData from "../../courses/shixunHomework/shixunHomework"; import NoneData from "../../courses/shixunHomework/shixunHomework";
import './CompetitionCommon.css'; import './CompetitionCommon.css';
@ -18,7 +19,8 @@ class CompetitionCommon extends Component{
data:undefined, data:undefined,
bannerdata:undefined, bannerdata:undefined,
module_type:undefined, module_type:undefined,
mdContentdata:undefined mdContentdata:undefined,
Competitionedittype:false
} }
} }
@ -46,6 +48,7 @@ class CompetitionCommon extends Component{
if(response.status===200){ if(response.status===200){
this.setState({ this.setState({
data:response.data, data:response.data,
thiskeys:response.data.competition_modules[0].position
}) })
this.getrightdata( this.getrightdata(
response.data.competition_modules[0].id, response.data.competition_modules[0].id,
@ -59,12 +62,33 @@ class CompetitionCommon extends Component{
}) })
} }
getrightdatas=(e)=>{
let keys=parseInt(e.key);
this.getlistdata(keys)
}
getlistdata=(keys)=>{
let{data}=this.state;
this.setState({
thiskeys:keys
})
data&&data.competition_modules.map((item,key)=>{
if(keys===item.position){
this.getrightdata(item.id,item.module_type,item.module_url,item.has_url)
return
}
})
}
getrightdata=(id,typeid,module_url,has_url)=>{ getrightdata=(id,typeid,module_url,has_url)=>{
console.log(id,typeid,module_url,has_url) console.log(id,typeid,module_url,has_url)
this.setState({ this.setState({
module_id:id, module_id:id,
module_type:typeid module_type:typeid
}) })
if(typeid==="enroll"){
this.props.history.replace(`/newcompetitions/${this.props.match.params.identifier}/enroll`);
return
}
if(has_url===false){ if(has_url===false){
let url=`${module_url}`; let url=`${module_url}`;
axios.get(url).then((response) => { axios.get(url).then((response) => {
@ -76,19 +100,38 @@ class CompetitionCommon extends Component{
}).catch((error) => { }).catch((error) => {
console.log(error) console.log(error)
}) })
}else{
this.props.history.replace(module_url);
return
} }
} }
Competitionedit=()=>{
this.setState({
Competitionedittype:true
})
}
hideCompetitionedit=()=>{
this.setState({
Competitionedittype:false
})
}
render() { render() {
let {data,bannerdata,module_type,module_id,mdContentdata}=this.state; let {data,bannerdata,module_type,Competitionedittype,mdContentdata}=this.state;
console.log(module_type) console.log(module_type)
return ( return (
data===undefined?"":<div className={"educontent clearfix mt20 "}> data===undefined?"":<div className={"educontent clearfix mt20 "}>
<Breadcrumb separator=">"> <Breadcrumb separator=">">
<Breadcrumb.Item href="">在线竞赛</Breadcrumb.Item> <Breadcrumb.Item><Link to={"/newcompetitions"}>在线竞赛</Link></Breadcrumb.Item>
<Breadcrumb.Item href="">{data&&data.name}</Breadcrumb.Item> <Breadcrumb.Item>{data&&data.name}</Breadcrumb.Item>
</Breadcrumb> </Breadcrumb>
<div className={"mt10 relative"}> <div className={"mt10 relative"}>
@ -173,12 +216,14 @@ class CompetitionCommon extends Component{
<Layout className={'teamsLayout mt40'}> <Layout className={'teamsLayout mt40'}>
<Sider> <Sider>
<Menu mode="inline" className="CompetitionMenu" defaultSelectedKeys={['1']}> <Menu mode="inline" className="CompetitionMenu" defaultSelectedKeys={['1']} onClick={(e)=>this.getrightdatas(e)}>
{data&&data.competition_modules.map((item,key)=>{ {data&&data.competition_modules.map((item,key)=>{
return( return(
<Menu.Item key={item.position}> <Menu.Item key={item.position}>
{item.has_url===false?<span onClick={()=>this.getrightdata(item.id,item.module_type,item.module_url,item.has_url)}>{item.name}</span>:<a {item.has_url===false?<span
// onClick={()=>this.getrightdata(item.id,item.module_type,item.module_url,item.has_url)}
>{item.name}</span>:<a
// target="_blank" // target="_blank"
href={item.module_url} href={item.module_url}
// onClick={()=>this.getrightdata(item.id,item.module_type)} // onClick={()=>this.getrightdata(item.id,item.module_type)}
@ -191,17 +236,25 @@ class CompetitionCommon extends Component{
</Sider> </Sider>
<Layout className={"teamsLayoutleft"}> <Layout className={"teamsLayoutleft"}>
{this.state.module_type==="chart"?<CompetitionContentsChart {this.state.module_type==="chart"?Competitionedittype===false?<CompetitionContentsChart
{...this.props} {...this.props}
{...this.state} {...this.state}
/>:<CompetitionContents Competitionedit={()=>this.Competitionedit()}
/>:"":Competitionedittype===false?<CompetitionContents
Competitionedit={()=>this.Competitionedit()}
{...this.props} {...this.props}
{...this.state} {...this.state}
/>} />:""}
{/*<CompetitionContentsChart*/} {/*<CompetitionContentsChart*/}
{/*{...this.props}*/} {/*{...this.props}*/}
{/*{...this.state}*/} {/*{...this.state}*/}
{/*/>*/} {/*/>*/}
{Competitionedittype===true?<CompetitionContentsMd
hideCompetitionedit={()=>this.hideCompetitionedit()}
getlistdata={(keys)=>this.getlistdata(keys)}
{...this.props}
{...this.state}
/>:""}
</Layout> </Layout>
</Layout> </Layout>

@ -1,7 +1,7 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import {Button,Layout} from 'antd'; import {Button,Layout} from 'antd';
import axios from 'axios'; import axios from 'axios';
import {markdownToHTML,getImageUrl} from 'educoder'; import {markdownToHTML,getImageUrl,AttachmentList} from 'educoder';
import NoneData from "../../courses/shixunHomework/shixunHomework"; import NoneData from "../../courses/shixunHomework/shixunHomework";
const { Header, Footer, Sider, Content } = Layout; const { Header, Footer, Sider, Content } = Layout;
@ -26,12 +26,16 @@ class CompetitionContents extends Component{
return ( return (
<div className={"fr"}> <div className={"fr"}>
{this.props.current_user&&this.props.current_user.admin===true||this.props.current_user&&this.props.current_user.business===true?<Button className={"fr"} type="primary" ghost> {this.props.current_user&&this.props.current_user.admin===true||this.props.current_user&&this.props.current_user.business===true?this.props.Competitionedittype===false?<Button className={"fr"} type="primary" ghost onClick={()=>this.props.Competitionedit()}>
编辑 编辑
</Button>:""} </Button>:"":""}
<div className={this.props.current_user&&this.props.current_user.admin===true||this.props.current_user&&this.props.current_user.business===true?"mt50":""}> <div className={this.props.current_user&&this.props.current_user.admin===true||this.props.current_user&&this.props.current_user.business===true?"mt50 mb100":"mb100"}>
<Content className={"markdown-body"} dangerouslySetInnerHTML={{__html: markdownToHTML(mdContentdata&&mdContentdata.md_contents[0]).replace(/▁/g, "▁▁▁")}}> <Content className={"markdown-body"} dangerouslySetInnerHTML={{__html: markdownToHTML(mdContentdata===undefined?"":mdContentdata.md_content===undefined?"":mdContentdata.md_content).replace(/▁/g, "▁▁▁")}}>
</Content> </Content>
<div>
<AttachmentList {...this.props} {...this.state} attachments={mdContentdata===undefined?[]:mdContentdata.attachments===undefined?[]:mdContentdata.attachments}></AttachmentList>
</div>
</div> </div>
</div> </div>

@ -32,7 +32,7 @@ class CompetitionContents extends Component{
render() { render() {
const operations = <Button className={"fr"} type="primary" ghost>编辑</Button>; const operations = <Button className={"fr"} type="primary" ghost onClick={()=>this.props.Competitionedit()}>编辑</Button>;
const columns = [ const columns = [
{ {
title: 'usersum', title: 'usersum',
@ -86,7 +86,7 @@ class CompetitionContents extends Component{
return ( return (
<div> <div>
<Tabs tabBarExtraContent={this.props.current_user&&this.props.current_user.admin===true||this.props.current_user&&this.props.current_user.business===true?operations:""}> <Tabs tabBarExtraContent={this.props.current_user&&this.props.current_user.admin===true||this.props.current_user&&this.props.current_user.business===true?this.props.Competitionedittype===false?operations:"":""}>
<TabPane tab="总排行榜" key="1"> <TabPane tab="总排行榜" key="1">
<Content className={"markdown-body"} dangerouslySetInnerHTML={{__html: markdownToHTML("Content of tab 1").replace(/▁/g, "▁▁▁")}}> <Content className={"markdown-body"} dangerouslySetInnerHTML={{__html: markdownToHTML("Content of tab 1").replace(/▁/g, "▁▁▁")}}>
</Content> </Content>

@ -0,0 +1,163 @@
import React, { Component } from 'react';
import {Button, Card, Row, Col ,Upload,Icon,message} from 'antd';
import axios from 'axios';
import {getImageUrl,getUrl,appendFileSizeToUploadFileAll,appendFileSizeToUploadFile} from 'educoder';
import TPMMDEditor from '../../tpm/challengesnew/TPMMDEditor';
class CompetitionContentsMd extends Component{
constructor(props) {
super(props)
this.contentMdRef = React.createRef();
this.state={
contentFileList:[]
}
}
componentDidMount(){
window.document.title = '竞赛';
let {mdContentdata}=this.props;
// this.gettitledata()
// is_pdf: false
//
let contentFileList = mdContentdata===undefined?[]:mdContentdata.attachments===undefined?[]:mdContentdata.attachments.map((item) => {
return {
id: item.id,
uid: item.id,
name: appendFileSizeToUploadFile(item),
url: item.url,
filesize: item.filesize,
status: 'done',
response:{id: item.id}
}
})
this.setState({
contentFileList:contentFileList
})
this.contentMdRef.current.setValue(mdContentdata===undefined?"":mdContentdata.md_content===undefined?"":mdContentdata.md_content || '')
}
handleContentUploadChange = (info) => {
let contentFileList = info.fileList;
this.setState({ contentFileList: appendFileSizeToUploadFileAll(contentFileList) });
}
onAttachmentRemove = (file, stateName) => {
debugger
if(file.response!=undefined){
this.props.confirm({
content: '是否确认删除?',
onOk: () => {
this.deleteAttachment(file, stateName)
},
onCancel() {
console.log('Cancel');
},
});
return false;
}
}
deleteAttachment = (file, stateName) => {
// 初次上传不能直接取uid
const url = `/attachments/${file.response ? file.response.id : file.uid}.json`
axios.delete(url, {
})
.then((response) => {
if (response.data) {
const { status } = response.data;
if (status == 0) {
console.log('--- success')
this.props.showNotification(response.data.message);
this.setState((state) => {
const index = state[stateName].indexOf(file);
const newFileList = state[stateName].slice();
newFileList.splice(index, 1);
return {
[stateName]: newFileList,
};
});
}
}
})
.catch(function (error) {
console.log(error);
});
}
handleSubmit = () => {
let {contentFileList}=this.state;
const mdContnet = this.contentMdRef.current.getValue().trim();
let attachment_ids = contentFileList.map(item => {
return item.response ? item.response.id : item.id
})
console.log(attachment_ids)
let url=`/competitions/${this.props.match.params.identifier}/update_md_content.json`;
axios.post(url,{
md_content_id:this.props.mdContentdata.md_id,
competition_module_id:this.props.mdContentdata.id,
content:mdContnet,
name:"编辑",
attachment_ids:attachment_ids
}
).then((response) => {
if(response.data.status===0){
this.props.showNotification(response.data.message);
this.props.getlistdata(this.props.thiskeys);
this.props.hideCompetitionedit();
}else{
this.props.showNotification(response.data.message);
}
}).catch((error) => {
console.log(error)
})
}
render() {
let {contentFileList}=this.state;
const uploadProps = {
width: 600,
fileList: contentFileList,
multiple: true,
// https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false,
action: `${getUrl()}/api/attachments.json`,
onChange: this.handleContentUploadChange,
onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'),
beforeUpload: (file) => {
console.log('beforeUpload', file.name);
const isLt150M = file.size / 1024 / 1024 < 150;
if (!isLt150M) {
message.error('文件大小必须小于150MB!');
}
return isLt150M;
},
};
console.log(contentFileList)
return (
<div>
<TPMMDEditor ref={this.contentMdRef} placeholder="请输入任务内容说明最大限制5000个字符" mdID={'courseContentMD'} refreshTimeout={1500}
className="courseMessageMD" initValue={this.state.description}></TPMMDEditor>
<Upload {...uploadProps} className="upload_1 newWorkUpload">
<Button className="uploadBtn">
<Icon type="upload" /> 上传附件
</Button>
(单个文件150M以内)
</Upload>
<div className="clearfix mt30 mb30">
{/* htmlType="submit" */}
<Button type="primary" onClick={this.handleSubmit} className="defalutSubmitbtn fl mr20">提交</Button>
<a className="defalutCancelbtn fl" onClick={() => this.props.hideCompetitionedit()}>取消</ a>
</div>
</div>
)
}
}
export default CompetitionContentsMd;

@ -8,7 +8,7 @@ import Loading from '../../Loading';
import Loadable from 'react-loadable'; import Loadable from 'react-loadable';
import { TPMIndexHOC } from '../tpm/TPMIndexHOC'; import { TPMIndexHOC } from '../tpm/TPMIndexHOC';
import { SnackbarHOC } from 'educoder'; import { CNotificationHOC } from '../courses/common/CNotificationHOC';
//新版竞赛首页 //新版竞赛首页
const CompetitionsIndex = Loadable({ const CompetitionsIndex = Loadable({
@ -90,4 +90,4 @@ class Competitions extends Component {
} }
} }
export default SnackbarHOC() (TPMIndexHOC (Competitions)) ; export default CNotificationHOC() (TPMIndexHOC (Competitions)) ;
Loading…
Cancel
Save