Merge branches 'dev_Ysl', 'dev_Ysm' and 'topic_bank' of https://bdgit.educoder.net/Hjqreturn/educoder into topic_bank

# Conflicts:
#	public/react/src/modules/courses/busyWork/NewWork.js
dev_aliyun_beta
杨树明 6 years ago
commit d609b22f44

@ -32,7 +32,7 @@ module.exports = {
// 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.
// This means they will be the "root" imports that are included in JS bundle. // This means they will be the "root" imports that are included in JS bundle.
// The first two entry points enable "hot" CSS and auto-refreshes for JS. // The first two entry points enable "hot" CSS and auto-refreshes for JS.

@ -283,6 +283,11 @@ const Completetaskpage =Loadable({
loader: () => import('../../modules/courses/completetaskdetails/Completetaskpage'), loader: () => import('../../modules/courses/completetaskdetails/Completetaskpage'),
loading: Loading, loading: Loading,
}); });
//问卷编辑
const PollNewQuestbank =Loadable({
loader: () => import('../../modules/courses/poll/PollNewQuestbank'),
loading: Loading,
});
class CoursesIndex extends Component{ class CoursesIndex extends Component{
constructor(props) { constructor(props) {
super(props) super(props)
@ -461,13 +466,19 @@ class CoursesIndex extends Component{
// console.log(commons) // console.log(commons)
return ( return (
<Switch {...this.props}> <Switch {...this.props}>
{/*题库问卷编辑详情*/}
<Route path="/courses/questreediting/:workid/edit"
render={
(props) => (<PollNewQuestbank {...this.props} {...props} {...this.state} />)
}
></Route>
{/*毕设任务题库详情*/} {/*毕设任务题库详情*/}
<Route path="/courses/completetask/:workid" <Route path="/courses/completetask/:workid"
render={ render={
(props) => (<Completetaskpage {...this.props} {...props} {...this.state} />) (props) => (<Completetaskpage {...this.props} {...props} {...this.state} />)
} }
></Route> ></Route>
{/*毕设内容题库详情*/} {/*毕设选题题库详情*/}
<Route path="/courses/completetopic/:workid" <Route path="/courses/completetopic/:workid"
render={ render={
(props) => (<CompletetopicdePage {...this.props} {...props} {...this.state} />) (props) => (<CompletetopicdePage {...this.props} {...props} {...this.state} />)

@ -320,8 +320,11 @@ class CommonWorkPost extends Component{
// ModalSave: ()=>this.deleteAttachment(file), // ModalSave: ()=>this.deleteAttachment(file),
// ModalCancel:this.cancelAttachment // ModalCancel:this.cancelAttachment
// }) // })
this.deleteAttachment(file) if(file.response!=undefined){
return false; this.deleteAttachment(file)
return false;
}
} }
cancelAttachment=()=>{ cancelAttachment=()=>{

@ -3,11 +3,11 @@ import { Input, InputNumber, Form, Button, Checkbox, Upload, Icon, message, Moda
import axios from 'axios' import axios from 'axios'
import '../css/busyWork.css' import '../css/busyWork.css'
import '../css/Courses.css' import '../css/Courses.css'
import { WordsBtn, getUrl, ConditionToolTip } from 'educoder' import { WordsBtn, getUrl, ConditionToolTip, appendFileSizeToUploadFile, appendFileSizeToUploadFileAll } from 'educoder'
import TPMMDEditor from '../../tpm/challengesnew/TPMMDEditor';
import CBreadcrumb from '../common/CBreadcrumb' import CBreadcrumb from '../common/CBreadcrumb'
import NewWorkForm from './NewWorkForm'
const confirm = Modal.confirm;
const $ = window.$ const $ = window.$
const MAX_TITLE_LENGTH = 60; const MAX_TITLE_LENGTH = 60;
class NewWork extends Component{ class NewWork extends Component{
@ -17,6 +17,15 @@ class NewWork extends Component{
this.answerMdRef = React.createRef(); this.answerMdRef = React.createRef();
this.state={ this.state={
title_value:"",
title_num: 0,
contentFileList: [],
answerFileList: [],
workLoaded: false,
base_on_project: true,
category: {},
min_num: 2,
max_num: 10,
} }
} }
componentDidMount () { componentDidMount () {
@ -41,6 +50,7 @@ class NewWork extends Component{
course_id: data.course_id, course_id: data.course_id,
course_name: data.course_name, course_name: data.course_name,
category: data.category, category: data.category,
}) })
} }
}) })
@ -55,26 +65,129 @@ class NewWork extends Component{
.then((response) => { .then((response) => {
if (response.data.name) { if (response.data.name) {
const data = response.data; const data = response.data;
data.isEdit = true;
this.setState({ const contentFileList = data.attachments.map(item => {
category: data.category, return {
course_id: data.course_id, id: item.id,
course_name: data.course_name, uid: item.id,
name: appendFileSizeToUploadFile(item),
url: item.url,
filesize: item.filesize,
status: 'done'
}
})
const answerFileList = data.ref_attachments.map(item => {
return {
id: item.id,
uid: item.id,
name: appendFileSizeToUploadFile(item),
url: item.url,
filesize: item.filesize,
status: 'done'
}
}) })
this.newWorkFormRef.initValue(data);
this.setState({
...data,
// course_id: data.course_id,
// course_name: data.course_name,
// category: data.category,
title_num: parseInt(data.name.length),
workLoaded: true,
init_min_num: data.min_num,
init_max_num: data.max_num,
// description: data.description,
reference_answer: data.reference_answer,
contentFileList,
answerFileList,
}, () => {
setTimeout(() => {
this.contentMdRef.current.setValue(data.description || '')
this.answerMdRef.current.setValue(data.reference_answer || '')
}, 2000)
this.props.form.setFieldsValue({
title: data.name,
description: data.description || '',
reference_answer: data.reference_answer || '',
});
})
} }
}) })
.catch(function (error) { .catch(function (error) {
console.log(error); console.log(error);
}); });
} }
doEdit = (params) => { // 输入title
changeTitle=(e)=>{
console.log(e.target.value.length);
this.setState({
title_num: parseInt(e.target.value.length)
})
}
handleSubmit = () => {
const courseId = this.state.course_id || this.props.match.params.coursesId ;
this.props.form.validateFieldsAndScroll((err, values) => {
console.log(values)
const mdContnet = this.contentMdRef.current.getValue().trim();
console.log(mdContnet)
values.description = mdContnet;
// return;
{/* max={has_commit ? init_min_num : null } */}
{/* min={has_commit ? init_max_num : (min_num == undefined ? 2 : min_num + 1) } */}
// 已有提交作品,人数范围只能扩大
const { has_commit, max_num, init_max_num, min_num, init_min_num } = this.state;
if (has_commit) {
if (max_num < init_max_num || min_num > init_min_num) {
this.props.showNotification(`已有提交作品,人数范围只能扩大(原设置为:${init_min_num} - ${init_max_num})`)
return;
}
}
// const errKeys = Object.keys(err); // || errKeys.length == 1 && errKeys[0] == 'content' && mdContnet
if (!err) {
if (this.isEdit) {
this.doEdit(courseId, values)
} else {
this.doNew(courseId, values)
}
} else {
$("html").animate({ scrollTop: $('html').scrollTop() - 100 })
}
})
}
doEdit = (courseId, values) => {
const workId = this.props.match.params.workId const workId = this.props.match.params.workId
const newUrl = `/homework_commons/${workId}.json` const newUrl = `/homework_commons/${workId}.json`
let attachment_ids = this.state.contentFileList.map(item => {
return item.response ? item.response.id : item.id
})
let reference_attachment_ids = this.state.answerFileList.map(item => {
return item.response ? item.response.id : item.id
})
const { min_num, max_num, base_on_project, category } = this.state
const isGroup = this.props.isGroup() const isGroup = this.props.isGroup()
axios.put(newUrl, params) axios.put(newUrl, {
type: isGroup ? 3 : 1,
name: values.title,
description: values.description,
reference_answer: values.reference_answer,
attachment_ids,
reference_attachment_ids,
min_num,
max_num,
base_on_project
})
.then((response) => { .then((response) => {
if (response.data.status == 0) { if (response.data.status == 0) {
this.props.showNotification('保存成功') this.props.showNotification('保存成功')
@ -85,11 +198,30 @@ class NewWork extends Component{
console.log(error); console.log(error);
}); });
} }
doNew = (params) => { doNew = (courseId, values) => {
const courseId = this.props.match.params.coursesId ;
const newUrl = `/courses/${courseId}/homework_commons.json` const newUrl = `/courses/${courseId}/homework_commons.json`
axios.post(newUrl, params) let attachment_ids = this.state.contentFileList.map(item => {
return item.response ? item.response.id : item.id
})
let reference_attachment_ids = this.state.answerFileList.map(item => {
return item.response ? item.response.id : item.id
})
const isGroup = this.props.isGroup()
const { min_num, max_num, base_on_project, category } = this.state
axios.post(newUrl, {
type: isGroup ? 3 : 1,
name: values.title,
description: values.description,
reference_answer: values.reference_answer,
attachment_ids,
reference_attachment_ids,
min_num,
max_num,
base_on_project
})
.then((response) => { .then((response) => {
if (response.data.status == 0) { if (response.data.status == 0) {
this.props.showNotification('保存成功') this.props.showNotification('保存成功')
@ -100,26 +232,147 @@ class NewWork extends Component{
console.log(error); console.log(error);
}); });
} }
handleContentUploadChange = (info) => {
let contentFileList = info.fileList;
this.setState({ contentFileList: appendFileSizeToUploadFileAll(contentFileList) });
}
handleAnswerUploadChange = (info) => {
let answerFileList = info.fileList;
this.setState({ answerFileList: appendFileSizeToUploadFileAll(answerFileList) });
}
onAttachmentRemove = (file, stateName) => {
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.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);
});
}
max_num_change = (val) => {
if (val < 2) {
this.setState({
max_num: 2,
})
return;
}
const { min_num } = this.state;
this.setState({
max_num: val,
min_num: val <= min_num ? val - 1 : min_num
})
}
min_num_change = (val) => {
this.setState({ min_num: val })
}
base_on_project_change = () => {
this.setState({ base_on_project: !this.state.base_on_project })
}
render(){ render(){
let {typeId,coursesId,pageType}=this.props.match.params; let {typeId,coursesId,pageType}=this.props.match.params;
const { getFieldDecorator } = this.props.form;
const isGroup = this.props.isGroup() const isGroup = this.props.isGroup()
const moduleName = !isGroup? "普通作业":"分组作业"; const moduleName = !isGroup? "普通作业":"分组作业";
const moduleEngName = this.props.getModuleName() const moduleEngName = this.props.getModuleName()
let{ let{
category title_value, contentFileList, answerFileList, max_num, min_num, base_on_project,
init_max_num, init_min_num,
title_num, course_name, category, has_commit, has_project
}=this.state }=this.state
const { current_user } = this.props const { current_user } = this.props
const courseId = this.props.match.params.coursesId ; const courseId = this.state.course_id || this.props.match.params.coursesId ;
const isEdit = this.isEdit; const isEdit = this.isEdit;
if ((isEdit == undefined || isEdit) && !this.state.workLoaded) {
return ''
}
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;
},
};
const answerUploadProps = {
width: 600,
fileList: answerFileList,
multiple: true,
// https://github.com/ant-design/ant-design/issues/15505
// showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
// showUploadList: false,
action: `${getUrl()}/api/attachments.json`,
onChange: this.handleAnswerUploadChange,
onRemove: (file) => this.onAttachmentRemove(file, 'answerFileList'),
beforeUpload: (file) => {
console.log('beforeUpload', file.name);
const isLt150M = file.size / 1024 / 1024 < 150;
if (!isLt150M) {
message.error('文件大小必须小于150MB!');
}
return isLt150M;
},
};
return( return(
<div className="newMain"> <div className="newMain">
<div className="educontent mt20 mb50"> <div className="educontent mt20 mb50">
{/* <p className="clearfix">
<WordsBtn style="grey" className="fl">{course_name}</WordsBtn>
<span className="color-grey-9 fl ml3 mr3">&gt;</span>
<WordsBtn style="grey" className="fl">{typeId==1 ?"普通作业":"分组作业"}</WordsBtn>
<span className="color-grey-9 fl ml3 mr3">&gt;</span>
<span>{pageType==="new"?"新建":"编辑"}</span>
</p> */}
<CBreadcrumb items={[ <CBreadcrumb items={[
{ to: current_user && current_user.first_category_url, name: this.state.course_name}, { to: current_user && current_user.first_category_url, name: this.state.course_name},
{ to: `/courses/${courseId}/${moduleEngName}/${category && category.category_id ? category.category_id : ''}` { to: `/courses/${courseId}/${moduleEngName}/${category && category.category_id ? category.category_id : ''}`
@ -138,16 +391,161 @@ class NewWork extends Component{
</a> </a>
</p> </p>
<div> <div>
<NewWorkForm wrappedComponentRef={(ref) => {this.newWorkFormRef = ref}} {/* onSubmit={this.handleSubmit} */}
{...this.props} <style>
onSave={this.onSave} {
doNew={this.doNew} `
doEdit={this.doEdit} .yslnewworkinputaddonAfter .ant-input{
></NewWorkForm> border-right: none !important;
height: 40px !important;
}
`
}
</style>
<Form className="courseForm">
<Form.Item
label="标题"
className="AboutInputForm"
>
{getFieldDecorator('title', {
rules: [{
required: true, message: '请输入标题'
}],
})(
<Input placeholder="请输入作业标题最大限制60个字符" onInput={this.changeTitle} className="searchView yslnewworkinputaddonAfter searchViewAfter" style={{"width":"100%"}} maxLength={MAX_TITLE_LENGTH} addonAfter={`${String(title_num)}/${MAX_TITLE_LENGTH}`}/>
)}
</Form.Item>
<style>{`
.uploadBtn.ant-btn {
border: none;
color: #4CACFF;
box-shadow: none;
background: transparent;
padding: 0 6px;
}
.ant-upload-list-item:hover .ant-upload-list-item-info{
background-color:#fff;
}
.upload_1 .ant-upload-list {
width: 350px;
}
.ant-input-number {
height: 40px;
line-height: 40px;
}
.workContent.AboutInputForm.ant-form-item {
border-bottom: none;
padding-bottom: 0px !important;
}
.newWorkUpload {
padding: 0px 30px 30px 30px!important;
background: #fff;
width: 100%;
display: inline-block;
border-bottom: 1px solid #EDEDED;
}
`}</style>
{ <Form.Item
label="内容"
className="AboutInputForm workContent mdInForm"
>
{getFieldDecorator('description', {
rules: [{
required: true, message: '请输入作业内容和要求'
}],
})(
<TPMMDEditor ref={this.contentMdRef} placeholder="请在此输入作业内容和要求,最大限制5000个字符" mdID={'courseContentMD'} refreshTimeout={1500}
className="courseMessageMD" initValue={this.state.description}></TPMMDEditor>
)}
</Form.Item> }
<Upload {...uploadProps} className="upload_1 newWorkUpload">
<Button className="uploadBtn">
<Icon type="upload" /> 上传附件
</Button>
(单个文件150M以内)
</Upload>
{ isGroup &&
<Form.Item
label="分组设置"
className="AboutInputForm"
>
{getFieldDecorator('personNum', {
rules: [{
required: false
// required: true, message: '请输入最小人数和最大人数'
}],
})(
<div>
<p className="clearfix">
<ConditionToolTip condition={has_commit} title={'已有提交作品,人数范围只能扩大'}>
{/* max={has_commit ? init_min_num : null } */}
<InputNumber placeholder="请填写每组最小人数" min={1} className="winput-240-40" value={min_num}
onChange={this.min_num_change} style={{width:'180px'}} />
</ConditionToolTip>
<span className="ml15 mr15">~</span>
{/* min={has_commit ? init_max_num : (min_num == undefined ? 2 : min_num + 1) } */}
<ConditionToolTip condition={has_commit} title={'已有提交作品,人数范围只能扩大'}>
<InputNumber className="winput-240-40" placeholder="请填写每组最大人数" value={max_num} max={10}
onChange={this.max_num_change} style={{width:'180px'}} />
</ConditionToolTip>
<label className="color-grey-9 ml20 font-14">项目管理员角色的成员都可以提交作品提交作品时需要关联同组成员组内成员作品共享</label>
</p>
<p className="mt20">
<ConditionToolTip condition={has_commit || has_project} title={'已有关联项目或作品,不能修改'}>
<Checkbox checked={base_on_project} onChange={this.base_on_project_change}
disabled={has_project || has_commit}
>基于项目实施</Checkbox>
</ConditionToolTip>
<label className="color-grey-9 ml12 font-14">勾选后各小组必须在educoder平台创建项目教师可随时观察平台对各小组最新进展的实时统计</label>
</p>
</div>
)}
</Form.Item>
}
<Form.Item
label="参考答案"
className="AboutInputForm"
style={{"borderBottom":"none"}}
>
{getFieldDecorator('reference_answer', {
rules: [{
required: false
}],
})(
<TPMMDEditor ref={this.answerMdRef} placeholder="请在此输入作业的参考答案,最大限制5000个字符" mdID={'workAnswerMD'}
className="courseMessageMD" refreshTimeout={1500} initValue={this.state.reference_answer || ''}></TPMMDEditor>
)}
<Upload {...answerUploadProps} className="upload_1">
<Button className="uploadBtn">
<Icon type="upload" /> 上传附件
</Button>
(单个文件150M以内)
</Upload>
</Form.Item>
<Form.Item>
<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.toListPage(this.props.match.params, category.category_id)}>取消</ a>
</div>
</Form.Item>
</Form>
</div> </div>
</div> </div>
</div> </div>
) )
} }
} }
export default NewWork; const WrappedBoardsNew = Form.create({ name: 'NewWork' })(NewWork);
export default WrappedBoardsNew;

@ -57,20 +57,22 @@ class Groupjobbandetails extends Component {
render() { render() {
let{datas}=this.props;
return ( return (
<div className=" clearfix edu-back-white" ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}> <div className=" clearfix edu-back-white" ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}>
<div className="yslquestionbank1"> <div className="yslquestionbank1">
<div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML("C++是C语言的面向对象扩展是C语言的一个超集同时也是历史最悠久、最受欢迎的程序设计语言之一。根据C++创始人Stroustrup的自述C++是一个“更好的C语言”。\n" + <div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML(datas&&datas.description).replace(/▁/g, "▁▁▁")}}/>
"\n" +
"输入输出是计算机程序的基本功能。程序本质上是对数据进行处理的一系列操作,一般程序都可以分解为:“数据输入”、“数据处理”和“数据输出”三个步骤。标准输入输出(键盘输入和显示器输出)是程序的重要组成部分。\n" + {datas.attachments === undefined ? "" : datas.attachments.map((item, key) => {
"\n" + return (
"本实训项目的主要目标是学习和掌握C++程序的基本结构和基本输入输出主要内容包括标准C语言自有的单个字符的输入输出、格式化的输入输出以及C++扩展的使用流对象的输入输出").replace(/▁/g, "▁▁▁")}}/> <GroupPackage key={key} attachments={item}></GroupPackage>
)
})}
<GroupPackage2 datas={datas} bool={false}></GroupPackage2>
<GroupPackage></GroupPackage>
<GroupPackage2></GroupPackage2>
</div> </div>

@ -18,17 +18,20 @@ class Completetaskpage extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
// this.answerMdRef = React.createRef(); // this.answerMdRef = React.createRef();
this.setState({ this.state={
workid:1, workid:1,
isSpin:false, isSpin:false,
datas:[], datas:[],
}) }
} }
componentDidMount() { componentDidMount() {
// console.log("父组件加载框"); // console.log("父组件加载框");
this.getonedata();
}
getonedata(){
if( this.props.match.params.workid){ if( this.props.match.params.workid){
this.setState({ this.setState({
workid: this.props.match.params.workid, workid: this.props.match.params.workid,
@ -47,13 +50,13 @@ class Completetaskpage extends Component {
this.setState({ this.setState({
isSpin:true, isSpin:true,
}) })
let url = `/homework_banks/${workids}.json`; let url = `/task_banks/${workids}.json`;
// //
axios.get(url).then((response) => { axios.get(url).then((response) => {
if(response){ if(response){
if(response.data){ if(response.data){
this.setState({ this.setState({
datas:response.data.informs, datas:response.data,
}) })
}else { }else {
this.setState({ this.setState({
@ -86,6 +89,7 @@ class Completetaskpage extends Component {
///////////////教师截止 ///////////////教师截止
render() { render() {
let{datas}=this.state;
const isAdmin = this.props.isAdmin(); const isAdmin = this.props.isAdmin();
// console.log(119) // console.log(119)
@ -108,10 +112,10 @@ class Completetaskpage extends Component {
</div> </div>
<div className="educontent mb20"> <div className="educontent mb20">
<p className=" fl color-black summaryname" style={{heigth: "33px"}}> <p className=" fl color-black summaryname" style={{heigth: "33px"}}>
MySQL数据库编程开发实训基础篇 {datas&&datas.name}
</p> </p>
<CoursesListType <CoursesListType
typelist={["公开"]} typelist={datas&&datas.is_public?["公开"]:["私有"]}
/> />
</div> </div>
@ -126,7 +130,7 @@ class Completetaskpage extends Component {
</div> </div>
</div> </div>
<Completetaskdetails/> <Completetaskdetails {...this.state} {...this.props} datas={datas}/>
</div> </div>
</div> </div>

@ -19,11 +19,11 @@ class CompletetopicdePage extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
// this.answerMdRef = React.createRef(); // this.answerMdRef = React.createRef();
this.setState({ this.state={
workid:1, workid:1,
isSpin:false, isSpin:false,
datas:[], datas:[],
}) }
} }
@ -48,13 +48,13 @@ class CompletetopicdePage extends Component {
this.setState({ this.setState({
isSpin:true, isSpin:true,
}) })
let url = `/homework_banks/${workids}.json`; let url = `/gtopic_banks/${workids}.json`;
// //
axios.get(url).then((response) => { axios.get(url).then((response) => {
if(response){ if(response){
if(response.data){ if(response.data){
this.setState({ this.setState({
datas:response.data.informs, datas:response.data,
}) })
}else { }else {
this.setState({ this.setState({
@ -88,7 +88,7 @@ class CompletetopicdePage extends Component {
///////////////教师截止 ///////////////教师截止
render() { render() {
let{datas}=this.state;
const isAdmin = this.props.isAdmin(); const isAdmin = this.props.isAdmin();
// console.log(119) // console.log(119)
@ -110,10 +110,10 @@ class CompletetopicdePage extends Component {
</div> </div>
<div className="educontent mb20"> <div className="educontent mb20">
<p className=" fl color-black summaryname" style={{heigth: "33px"}}> <p className=" fl color-black summaryname" style={{heigth: "33px"}}>
MySQL数据库编程开发实训基础篇 {datas&&datas.name}
</p> </p>
<CoursesListType <CoursesListType
typelist={["公开"]} typelist={datas&&datas.is_public?["公开"]:["私有"]}
/> />
</div> </div>
@ -128,7 +128,7 @@ class CompletetopicdePage extends Component {
</div> </div>
</div> </div>
<Completetopicdetails/> <Completetopicdetails {...this.state} {...this.props} datas={datas}/>
{/*{parseInt(tab) === 1 ? <Completetopicdeswer/>:""}*/} {/*{parseInt(tab) === 1 ? <Completetopicdeswer/>:""}*/}
</div> </div>

@ -56,52 +56,52 @@ class Completetopicdetails extends Component {
render() { render() {
let{datas}=this.props;
return ( return (
<div className=" clearfix edu-back-white " ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}> <div className=" clearfix edu-back-white " ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}>
<div className="bor-bottom-greyE"> <div className="bor-bottom-greyE">
<div className="yslquestionbank1"> <div className="yslquestionbank1">
<div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML("C++是C语言的面向对象扩展是C语言的一个超集同时也是历史最悠久、最受欢迎的程序设计语言之一。根据C++创始人Stroustrup的自述C++是一个“更好的C语言”。\n" + <div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML(datas&&datas.description).replace(/▁/g, "▁▁▁")}}/>
"\n" +
"输入输出是计算机程序的基本功能。程序本质上是对数据进行处理的一系列操作,一般程序都可以分解为:“数据输入”、“数据处理”和“数据输出”三个步骤。标准输入输出(键盘输入和显示器输出)是程序的重要组成部分。\n" +
"\n" +
"本实训项目的主要目标是学习和掌握C++程序的基本结构和基本输入输出主要内容包括标准C语言自有的单个字符的输入输出、格式化的输入输出以及C++扩展的使用流对象的输入输出").replace(/▁/g, "▁▁▁")}}/>
<GroupPackage></GroupPackage> {datas.attachment_list === undefined ? "" : datas.attachment_list.map((item, key) => {
return (
<GroupPackage key={key} attachments={item}></GroupPackage>
)
})}
</div> </div>
</div> </div>
<div style={{width:"100%", padding: "36px"}}> <div style={{width:"100%", padding: "36px"}}>
<div className="yslboomdivs"> <div className="yslboomdivs">
<p> <p>
<span className="yslboomdivsy">课题类型</span> <span className="yslboomdivsy">课题类型</span>
<span className="yslboomdivsys">设计</span> <span className="yslboomdivsys">{datas&&datas.topic_type===1?"设计":datas&&datas.topic_type===2?"论文":datas&&datas.topic_type===3?"创作":"设计"}</span>
</p> </p>
<p> <p>
<span className="yslboomdivsy">课题来源</span> <span className="yslboomdivsy">课题来源</span>
<span className="yslboomdivsys">生产/社会实践</span> <span className="yslboomdivsys">{datas&&datas.topic_source===1?"生产/社会实际":datas&&datas.topic_source===2?"结合科研":datas&&datas.topic_source===3?"其它":"生产/社会实际"}</span>
</p> </p>
<p> <p>
<span className="yslboomdivsy">课题性质1</span> <span className="yslboomdivsy">课题性质1</span>
<span className="yslboomdivsys">设计</span> <span className="yslboomdivsys">{datas&&datas.topic_property_first===1?"真题":datas&&datas.topic_property_first===2?"模拟题":"真题"}</span>
</p> </p>
<p> <p>
<span className="yslboomdivsy">课题性质2</span> <span className="yslboomdivsy">课题性质2</span>
<span className="yslboomdivsys">设计</span> <span className="yslboomdivsys">{datas&&datas.topic_property_second===1?"纵向课题":datas&&datas.topic_property_second===2?"横向课题":datas&&datas.topic_property_second===3?"自选":"纵向课题"}</span>
</p> </p>
</div> </div>
<div className="yslboomdivs"> <div className="yslboomdivs">
<p> <p>
<span className="yslboomdivsy">课题重复情况 </span> <span className="yslboomdivsy">课题重复情况 </span>
<span className="yslboomdivsys">新需求</span> <span className="yslboomdivsys">{datas&&datas.topic_repeat===1?"新题":datas&&datas.topic_repeat===2?"往届题,有新要求":datas&&datas.topic_repeat===3?"往届题,无新要求":"新题"}</span>
</p> </p>
<p> <p>
<span className="yslboomdivsy">调研或实习地点</span> <span className="yslboomdivsy">调研或实习地点</span>
<span className="yslboomdivsys">长沙</span> <span className="yslboomdivsys">{datas&&datas.province}{datas&&datas.city}</span>
</p> </p>
<p style={{width:"564px"}}> <p style={{width:"564px"}}>
<span className="yslboomdivsy">课题单位来源</span> <span className="yslboomdivsy">课题单位来源</span>
<span className="yslboomdivsys">湖南省据C++创始人Stroustrup有限公司</span> <span className="yslboomdivsys">{datas&&datas.source_unit}</span>
</p> </p>
</div> </div>
</div> </div>

@ -73,8 +73,9 @@ class AccessoryModal extends Component{
// ModalCancel:this.cancelAttachment // ModalCancel:this.cancelAttachment
// }) // })
// return false; // return false;
if(file.response!=undefined){
this.deleteAttachment(file); this.deleteAttachment(file);
}
} }

@ -64,8 +64,10 @@ class AccessoryModal2 extends Component{
// ModalCancel:this.cancelAttachment // ModalCancel:this.cancelAttachment
// }) // })
// return false; // return false;
if(file.response!=undefined){
this.deleteAttachment(file);
}
this.deleteAttachment(file);
} }

@ -296,37 +296,39 @@ class Selectsetting extends Component{
onAttachmentRemove = (file) => { onAttachmentRemove = (file) => {
if(file.response!=undefined){
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) {
// const url = `/attachments/${file.response ? file.response.id : file.uid}.json` this.setState({
const url = `/attachments/${file.response ? file.response.id : file.uid}.json` fileListtype:false,
axios.delete(url, { fileList:[]
}) })
.then((response) => { // this.setState((state) => {
if (response.data) { // const index = state.fileList.indexOf(file);
const { status } = response.data; // const newFileList = state.fileList.slice();
if (status == 0) { // newFileList.splice(index, 1);
// return {
this.setState({ // fileList: newFileList,
fileListtype:false, // };
fileList:[] // });
}) }
// this.setState((state) => {
// const index = state.fileList.indexOf(file);
// const newFileList = state.fileList.slice();
// newFileList.splice(index, 1);
// return {
// fileList: newFileList,
// };
// });
} }
} })
.catch(function (error) {
console.log(error);
});
this.setState({
fileListtype:false,
}) })
.catch(function (error) { }
console.log(error); // const url = `/attachments/${file.response ? file.response.id : file.uid}.json`
});
this.setState({
fileListtype:false,
})
} }
onChangeTimepublishs= (date, dateString,key) => { onChangeTimepublishs= (date, dateString,key) => {

@ -132,28 +132,29 @@ class Sendresource extends Component{
onAttachmentRemove = (file) => { onAttachmentRemove = (file) => {
debugger if(file.response!=undefined){
const url = `/attachments/${file.response ? file.response.id : file.uid}.json` const url = `/attachments/${file.response ? file.response.id : file.uid}.json`
axios.delete(url, { axios.delete(url, {
}) })
.then((response) => { .then((response) => {
if (response.data) { if (response.data) {
const { status } = response.data; const { status } = response.data;
if (status == 0) { if (status == 0) {
this.setState({ this.setState({
fileListtype:false, fileListtype:false,
fileList:[] fileList:[]
}) })
} }
} }
}) })
.catch(function (error) { .catch(function (error) {
console.log(error); console.log(error);
}); });
this.setState({ this.setState({
fileListtype:false, fileListtype:false,
}) })
}
} }
ModalCancelModalCancel=()=>{ ModalCancelModalCancel=()=>{

@ -157,49 +157,52 @@ class GraduationTasksSubmitedit extends Component{
} }
onAttachmentRemove = (file) => { onAttachmentRemove = (file) => {
let {attachments,fileList}=this.state; if(file.response!=undefined){
const url = `/attachments/${file}.json` let {attachments,fileList}=this.state;
axios.delete(url, { const url = `/attachments/${file}.json`
}) axios.delete(url, {
.then((response) => { })
if (response.data) { .then((response) => {
// const { status } = response.data; if (response.data) {
if (response.data.status === 0) { // const { status } = response.data;
console.log('--- success') if (response.data.status === 0) {
let newattachments=attachments; console.log('--- success')
if(file.uid===undefined){ let newattachments=attachments;
for(var i=0; i<newattachments.length; i++){ if(file.uid===undefined){
if(newattachments[i].id===file.id){ for(var i=0; i<newattachments.length; i++){
newattachments.splice(i, 1); if(newattachments[i].id===file.id){
} newattachments.splice(i, 1);
} }
}
} }
this.setState({ this.setState({
Modalstype:true, Modalstype:true,
Modalstopval:response.data.message, Modalstopval:response.data.message,
ModalSave:this.cancelAttachment, ModalSave:this.cancelAttachment,
Loadtype:true, Loadtype:true,
attachments:newattachments attachments:newattachments
}) })
this.setState((state) => { this.setState((state) => {
const index = state.fileList.indexOf(file); const index = state.fileList.indexOf(file);
const newFileList = state.fileList.slice(); const newFileList = state.fileList.slice();
newFileList.splice(index, 1); newFileList.splice(index, 1);
return { return {
fileList: newFileList, fileList: newFileList,
}; };
}); });
} }
} }
}) })
.catch(function (error) { .catch(function (error) {
console.log(error); console.log(error);
}); });
}
} }
inputSearchValue=(e)=>{ inputSearchValue=(e)=>{

@ -146,14 +146,16 @@ class GraduationTasksSubmitnew extends Component{
// }, // },
// }); // });
// return false; // return false;
if(file.response!=undefined){
this.setState({
Modalstype:true,
Modalstopval:'确定要删除这个附件吗?',
ModalSave: ()=>this.deleteAttachment(file),
ModalCancel:this.cancelAttachment
})
return false;
}
this.setState({
Modalstype:true,
Modalstopval:'确定要删除这个附件吗?',
ModalSave: ()=>this.deleteAttachment(file),
ModalCancel:this.cancelAttachment
})
return false;
} }
cancelAttachment=()=>{ cancelAttachment=()=>{

@ -173,30 +173,33 @@ class GraduationTasksnew extends Component {
} }
onAttachmentRemove = (file) => { onAttachmentRemove = (file) => {
const url = `/attachments/${file.response ? file.response.id : file.uid}.json` if(file.response!=undefined){
// const url = `/attachments/${file}.json` const url = `/attachments/${file.response ? file.response.id : file.uid}.json`
axios.delete(url, {}) // const url = `/attachments/${file}.json`
.then((response) => { axios.delete(url, {})
if (response.data) { .then((response) => {
const {status} = response.data; if (response.data) {
if (status == 0) { const {status} = response.data;
console.log('--- success') if (status == 0) {
console.log('--- success')
this.setState((state) => {
const index = state.fileList.indexOf(file); this.setState((state) => {
const newFileList = state.fileList.slice(); const index = state.fileList.indexOf(file);
newFileList.splice(index, 1); const newFileList = state.fileList.slice();
return { newFileList.splice(index, 1);
fileList: newFileList, return {
}; fileList: newFileList,
}); };
this.cancelAttachment() });
this.cancelAttachment()
}
} }
} })
}) .catch(function (error) {
.catch(function (error) { console.log(error);
console.log(error); });
}); }
} }
//滚动 //滚动

@ -21,7 +21,9 @@ class GroupPackage extends Component {
} }
} }
DownloadOpenPdf=(type,url)=>{
type===true?window.open(url):window.location.href=url;
}
componentDidMount() { componentDidMount() {
console.log("Groupjobquesanswer"); console.log("Groupjobquesanswer");
console.log("componentDidMount"); console.log("componentDidMount");
@ -54,9 +56,9 @@ class GroupPackage extends Component {
render() { render() {
let{attachments}=this.props;
return ( return (
<div className="color-grey df yslquesmat26" key={0} style={{ lineHeight: '17px'}}> <div className="color-grey df yslquesmat26" key={this.props.key} style={{ lineHeight: '17px'}}>
<a className="color-grey "> <a className="color-grey ">
<i className="font-14 color-green iconfont icon-fujian mr8" aria-hidden="true"></i> <i className="font-14 color-green iconfont icon-fujian mr8" aria-hidden="true"></i>
</a> </a>
@ -73,11 +75,11 @@ class GroupPackage extends Component {
` `
} }
</style> </style>
<a href={"/"} title={''} <a onClick={()=>this.DownloadOpenPdf(attachments.is_pdf,attachments.url)} title={attachments&&attachments.title}
className="mr12 yslahover overflowHidden1" length="58" style={{maxWidth:'480px',fontSize:"16px",}}> className="mr12 yslahover overflowHidden1" length="58" style={{maxWidth:'480px',fontSize:"16px",}}>
<span>清除浏览器缓存或换个浏览器操作指南更新版本.zip</span> <span>{attachments&&attachments.title}</span>
</a> </a>
<span className="color656565 color-grey-6 font-12 mr8">{2}</span> <span className="color656565 color-grey-6 font-12 mr8">{attachments&&attachments.filesize}</span>
</div> </div>
) )

@ -54,18 +54,42 @@ class GroupPackage extends Component {
render() { render() {
let{datas,bool}=this.props;
return ( return (
bool===true?
<div className="ml47text"> <div className="ml47text">
<p> {
<span className="ysltextcolor66">分组要求</span> datas===undefined?"":datas.min_num===undefined||datas.max_num===undefined?"":datas.min_num===null||datas.max_num===null?"":
<span className="ysltextcolor05">2~ 5学生提交作品时需要关联同组成员组内成员作品共享</span> <p>
</p> <span className="ysltextcolor66">分组要求</span>
<span className="ysltextcolor05">{datas&&datas.min_num}~ {datas&&datas.max_num}学生提交作品时需要关联同组成员组内成员作品共享</span>
</p>
}
<p> <p>
<span className="ysltextcolor66">基于项目实施</span> <span className="ysltextcolor66">基于项目实施</span>
<span className="ysltextcolor05">学生必须在本平台创建项目项目管理员可以提交作品</span> <span className="ysltextcolor05">学生必须在本平台创建项目项目管理员可以提交作品</span>
</p> </p>
</div> </div>
:<div className="ml47text">
{
datas===undefined?"":datas.group_info===undefined?"":datas.group_info.min_number===undefined||datas.group_info.max_number===undefined?"":
datas.group_info.min_number===null||datas.group_info.max_number===null?"":
<p>
<span className="ysltextcolor66">分组要求</span>
<span className="ysltextcolor05">{datas&&datas.group_info&&datas.group_info.min_number}~ {datas&&datas.group_info&&datas.group_info.max_number}学生提交作品时需要关联同组成员组内成员作品共享</span>
</p>
}
{
datas&&datas.group_info&&datas.group_info.base_on_project?
<p>
<span className="ysltextcolor66">基于项目实施</span>
<span className="ysltextcolor05">学生必须在本平台创建项目项目管理员可以提交作品</span>
</p>
:""
}
</div>
) )
} }
} }

@ -57,20 +57,21 @@ class Groupjobbandetails extends Component {
render() { render() {
let{datas}=this.props;
return ( return (
<div className=" clearfix edu-back-white" ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}> <div className=" clearfix edu-back-white" ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}>
<div className="yslquestionbank1"> <div className="yslquestionbank1">
<div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML("C++是C语言的面向对象扩展是C语言的一个超集同时也是历史最悠久、最受欢迎的程序设计语言之一。根据C++创始人Stroustrup的自述C++是一个“更好的C语言”。\n" + <div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML(datas&&(datas.description===null?"无":datas.description==="null"?"无":datas.description)).replace(/▁/g, "▁▁▁")}}/>
"\n" +
"输入输出是计算机程序的基本功能。程序本质上是对数据进行处理的一系列操作,一般程序都可以分解为:“数据输入”、“数据处理”和“数据输出”三个步骤。标准输入输出(键盘输入和显示器输出)是程序的重要组成部分。\n" +
"\n" +
"本实训项目的主要目标是学习和掌握C++程序的基本结构和基本输入输出主要内容包括标准C语言自有的单个字符的输入输出、格式化的输入输出以及C++扩展的使用流对象的输入输出").replace(/▁/g, "▁▁▁")}}/>
<GroupPackage></GroupPackage> {datas.attachments === undefined ? "" : datas.attachments.map((item, key) => {
return (
<GroupPackage key={key} attachments={item}></GroupPackage>
)
})}
<GroupPackage2></GroupPackage2> <GroupPackage2 datas={datas} bool={true}></GroupPackage2>
</div> </div>

@ -14,6 +14,7 @@ import "../common/formCommon.css";
import '../css/Courses.css'; import '../css/Courses.css';
import '../css/busyWork.css'; import '../css/busyWork.css';
import '../poll/pollStyle.css'; import '../poll/pollStyle.css';
import Generaljobdetails from "../questionbank/Generaljobdetails";
class GroupjobbankPage extends Component { class GroupjobbankPage extends Component {
//分组作业内容详情 //分组作业内容详情
@ -43,7 +44,7 @@ class GroupjobbankPage extends Component {
console.log(e); console.log(e);
console.log("44"); console.log("44");
} }
this.getonedata();
} }
@ -64,6 +65,9 @@ class GroupjobbankPage extends Component {
this.setState({ this.setState({
shixuntypes: types[3] shixuntypes: types[3]
}) })
this.getonedata();
}
getonedata=()=>{
if( this.props.match.params.workid){ if( this.props.match.params.workid){
this.setState({ this.setState({
workid: this.props.match.params.workid, workid: this.props.match.params.workid,
@ -88,7 +92,7 @@ class GroupjobbankPage extends Component {
if(response){ if(response){
if(response.data){ if(response.data){
this.setState({ this.setState({
datas:response.data.informs, datas:response.data,
}) })
}else { }else {
this.setState({ this.setState({
@ -120,7 +124,7 @@ class GroupjobbankPage extends Component {
///////////////教师截止 ///////////////教师截止
render() { render() {
let {tab} = this.state; let {tab,datas} = this.state;
const isAdmin = this.props.isAdmin(); const isAdmin = this.props.isAdmin();
// console.log(119) // console.log(119)
@ -143,10 +147,10 @@ class GroupjobbankPage extends Component {
</div> </div>
<div className="educontent mb20"> <div className="educontent mb20">
<p className=" fl color-black summaryname" style={{heigth: "33px"}}> <p className=" fl color-black summaryname" style={{heigth: "33px"}}>
MySQL数据库编程开发实训基础篇 {datas&&datas.name}
</p> </p>
<CoursesListType <CoursesListType
typelist={["公开"]} typelist={datas.is_public===true?["公开"]:["私有"]}
/> />
</div> </div>
@ -155,15 +159,15 @@ class GroupjobbankPage extends Component {
<div className=" clearfix edu-back-white poll_list"> <div className=" clearfix edu-back-white poll_list">
<a className={parseInt(tab) === 0 ? "active ml12" : "ml12"} onClick={(e) => this.ChangeTab(0)}>内容详情</a> <a className={parseInt(tab) === 0 ? "active ml12" : "ml12"} onClick={(e) => this.ChangeTab(0)}>内容详情</a>
<a className={parseInt(tab) === 1 ? "active ml12" : "ml12"} onClick={(e) => this.ChangeTab(1)}>参考答案</a> <a className={parseInt(tab) === 1 ? "active ml12" : "ml12"} onClick={(e) => this.ChangeTab(1)}>参考答案</a>
<a className="fr color-blue font-16" >发送</a> <a className="fr color-blue font-16" >发送</a>
<a className="fr color-blue font-16" >编辑</a> <a className="fr color-blue font-16" >编辑</a>
<a className="fr color-blue font-16" >删除</a> <a className="fr color-blue font-16" >删除</a>
</div> </div>
</div> </div>
</div> </div>
<Spin size="large" spinning={this.state.isSpin} id={"cdiv"}> <Spin size="large" spinning={this.state.isSpin} id={"cdiv"}>
{parseInt(tab) === 0 ? <Groupjobbandetails/>:""} {parseInt(tab) === 0 ? <Groupjobbandetails {...this.props} {...this.state} datas={datas}/>:""}
{parseInt(tab) === 1 ? <Groupjobquesanswer/>:""} {parseInt(tab) === 1 ? <Groupjobquesanswer {...this.props} {...this.state} datas={datas}/>:""}
</Spin> </Spin>
</div> </div>
</div> </div>

@ -56,20 +56,20 @@ class Groupjobquesanswer extends Component {
render() { render() {
let{datas}=this.props;
return ( return (
<div className=" clearfix edu-back-white" ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}> <div className=" clearfix edu-back-white" ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}>
<div className="yslquestionbank1"> <div className="yslquestionbank1">
<div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML("C++是C语言的面向对象扩展是C语言的一个超集同时也是历史最悠久、最受欢迎的程序设计语言之一。根据C++创始人Stroustrup的自述C++是一个“更好的C语言”。\n" + <div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML(datas&&(datas.description===null?"无":datas.description==="null"?"无":datas.description)).replace(/▁/g, "▁▁▁")}}/>
"\n" +
"输入输出是计算机程序的基本功能。程序本质上是对数据进行处理的一系列操作,一般程序都可以分解为:“数据输入”、“数据处理”和“数据输出”三个步骤。标准输入输出(键盘输入和显示器输出)是程序的重要组成部分。\n" +
"\n" +
"本实训项目的主要目标是学习和掌握C++程序的基本结构和基本输入输出主要内容包括标准C语言自有的单个字符的输入输出、格式化的输入输出以及C++扩展的使用流对象的输入输出").replace(/▁/g, "▁▁▁")}}/>
<GroupPackage></GroupPackage> {datas.attachments === undefined ? "" : datas.attachments.map((item, key) => {
return (
<GroupPackage key={key} attachments={item}></GroupPackage>
)
})}
<GroupPackage2></GroupPackage2> <GroupPackage2 datas={datas} bool={true}></GroupPackage2>
</div> </div>

@ -73,18 +73,21 @@ class CreateGroupByImportModal extends Component{
} }
onAttachmentRemove = (file) => { onAttachmentRemove = (file) => {
this.props.confirm({ if(file.response!=undefined){
content: '是否确认删除?', this.props.confirm({
content: '是否确认删除?',
onOk: () => {
this.deleteAttachment(file) onOk: () => {
}, this.deleteAttachment(file)
onCancel() { },
console.log('Cancel'); onCancel() {
}, console.log('Cancel');
}); },
});
return false;
return false;
}
} }
deleteAttachment = (file) => { deleteAttachment = (file) => {
const url = `/attachments/${file.response ? file.response.id : file.uid}.json` const url = `/attachments/${file.response ? file.response.id : file.uid}.json`

File diff suppressed because it is too large Load Diff

@ -55,18 +55,19 @@ class Generaljobanswer extends Component {
render() { render() {
let{datas}=this.props
return ( return (
<div className=" clearfix edu-back-white" ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}> <div className=" clearfix edu-back-white" ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}>
<div className="yslquestionbank1"> <div className="yslquestionbank1">
<div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML("C++是C语言的面向对象扩展是C语言的一个超集同时也是历史最悠久、最受欢迎的程序设计语言之一。根据C++创始人Stroustrup的自述C++是一个“更好的C语言”。\n" + <div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML(datas&&(datas.reference_answer===null?"无":datas.reference_answer==="null"?"无":datas.reference_answer)).replace(/▁/g, "▁▁▁")}}/>
"\n" + {datas.attachments === undefined ? "" : datas.attachments.map((item, key) => {
"输入输出是计算机程序的基本功能。程序本质上是对数据进行处理的一系列操作,一般程序都可以分解为:“数据输入”、“数据处理”和“数据输出”三个步骤。标准输入输出(键盘输入和显示器输出)是程序的重要组成部分。\n" + return (
"\n" + <GroupPackage key={key} attachments={item}></GroupPackage>
"本实训项目的主要目标是学习和掌握C++程序的基本结构和基本输入输出主要内容包括标准C语言自有的单个字符的输入输出、格式化的输入输出以及C++扩展的使用流对象的输入输出").replace(/▁/g, "▁▁▁")}}/> )
})}
<GroupPackage></GroupPackage>
</div> </div>

@ -43,7 +43,7 @@ class Generaljobbankdetails extends Component {
console.log(e); console.log(e);
console.log("44"); console.log("44");
} }
this.getonedata();
} }
@ -58,17 +58,19 @@ class Generaljobbankdetails extends Component {
this.setState({ this.setState({
tab: type[1], tab: type[1],
}); });
console.log("Generaljobbankdetails"); console.log("Generaljobbankdetails");
console.log(this.props); console.log(this.props);
this.getonedata();
}
getonedata=()=>{
if( this.props.match.params.workid){ if( this.props.match.params.workid){
this.setState({ this.setState({
workid: this.props.match.params.workid, workid: this.props.match.params.workid,
}) })
} }
this.getdata(this.props.match.params.workid); this.getdata(this.props.match.params.workid);
} };
//获取数据的地方 //获取数据的地方
getdata=(workid)=>{ getdata=(workid)=>{
var workids= workid; var workids= workid;
@ -86,7 +88,7 @@ class Generaljobbankdetails extends Component {
if(response){ if(response){
if(response.data){ if(response.data){
this.setState({ this.setState({
datas:response.data.informs, datas:response.data,
}) })
}else { }else {
this.setState({ this.setState({
@ -118,7 +120,7 @@ class Generaljobbankdetails extends Component {
///////////////教师截止 ///////////////教师截止
render() { render() {
let {tab} = this.state; let {tab,datas} = this.state;
const isAdmin = this.props.isAdmin(); const isAdmin = this.props.isAdmin();
// console.log(119) // console.log(119)
@ -141,10 +143,10 @@ class Generaljobbankdetails extends Component {
</div> </div>
<div className="educontent mb20"> <div className="educontent mb20">
<p className=" fl color-black summaryname" style={{heigth: "33px"}}> <p className=" fl color-black summaryname" style={{heigth: "33px"}}>
MySQL数据库编程开发实训基础篇 {datas&&datas.name}
</p> </p>
<CoursesListType <CoursesListType
typelist={["公开"]} typelist={datas.is_public===true?["公开"]:["私有"]}
/> />
</div> </div>
@ -160,8 +162,8 @@ class Generaljobbankdetails extends Component {
</div> </div>
</div> </div>
<Spin size="large" spinning={this.state.isSpin} id={"cdiv"}> <Spin size="large" spinning={this.state.isSpin} id={"cdiv"}>
{parseInt(tab) === 0 ? <Generaljobdetails {...this.props} {...this.state}/> :""} {parseInt(tab) === 0 ? <Generaljobdetails {...this.props} {...this.state} datas={datas}/> :""}
{parseInt(tab) === 1 ? <Generaljobanswer{...this.props} {...this.state}/>:""} {parseInt(tab) === 1 ? <Generaljobanswer{...this.props} {...this.state} datas={datas}/>:""}
</Spin> </Spin>
</div> </div>
</div> </div>

@ -13,14 +13,13 @@ import {
import GroupPackage from '../groupjobbank/GroupPackage' import GroupPackage from '../groupjobbank/GroupPackage'
import './questionbank.css'; import './questionbank.css';
//内容详情
class Generaljobdetails extends Component { class Generaljobdetails extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.state = { this.state = {
} }
} }
@ -56,18 +55,18 @@ class Generaljobdetails extends Component {
render() { render() {
let{datas}=this.props;
return ( return (
<div className=" clearfix edu-back-white" ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}> <div className=" clearfix edu-back-white" ref='targetElementTrainingjobsetting' style={{margin: "auto", minWidth:"1200px"}}>
<div className="yslquestionbank1"> <div className="yslquestionbank1">
<div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML("C++是C语言的面向对象扩展是C语言的一个超集同时也是历史最悠久、最受欢迎的程序设计语言之一。根据C++创始人Stroustrup的自述C++是一个“更好的C语言”。\n" + <div id="MakedownHTML"className="markdown-body yslquesHeigth yslquesmarkdowntext" dangerouslySetInnerHTML={{__html: markdownToHTML(datas&&(datas.description===null?"无":datas.description==="null"?"无":datas.description)).replace(/▁/g, "▁▁▁")}}/>
"\n" + {datas.attachments === undefined ? "" : datas.attachments.map((item, key) => {
"输入输出是计算机程序的基本功能。程序本质上是对数据进行处理的一系列操作,一般程序都可以分解为:“数据输入”、“数据处理”和“数据输出”三个步骤。标准输入输出(键盘输入和显示器输出)是程序的重要组成部分。\n" + return (
"\n" + <GroupPackage key={key} attachments={item}></GroupPackage>
"本实训项目的主要目标是学习和掌握C++程序的基本结构和基本输入输出主要内容包括标准C语言自有的单个字符的输入输出、格式化的输入输出以及C++扩展的使用流对象的输入输出").replace(/▁/g, "▁▁▁")}}/> )
})}
<GroupPackage></GroupPackage>
</div> </div>

@ -1,452 +1,456 @@
import React,{ Component } from "react"; import React,{ Component } from "react";
import './css/moopCases.css' import './css/moopCases.css'
import '../courses/css/Courses.css' import '../courses/css/Courses.css'
import { Form , Input , Upload , Button , Icon , message , Tooltip } from "antd"; import { Form , Input , Upload , Button , Icon , message , Tooltip } from "antd";
import { getImageUrl , setImagesUrl , MarkdownToHtml , ActionBtn , appendFileSizeToUploadFile , appendFileSizeToUploadFileAll , getUrl , getUploadActionUrl } from 'educoder'; import { getImageUrl , setImagesUrl , MarkdownToHtml , ActionBtn , appendFileSizeToUploadFile , appendFileSizeToUploadFileAll , getUrl , getUploadActionUrl } from 'educoder';
import Tags from './CaseTags' import Tags from './CaseTags'
import axios from 'axios'; import axios from 'axios';
import TPMMDEditor from '../tpm/challengesnew/TPMMDEditor'; import TPMMDEditor from '../tpm/challengesnew/TPMMDEditor';
import _ from 'lodash' import _ from 'lodash'
const { Dragger } = Upload; const { Dragger } = Upload;
function beforeUpload(file) { function beforeUpload(file) {
const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'; const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
if (!isJpgOrPng) { if (!isJpgOrPng) {
message.error('You can only upload JPG/PNG file!'); message.error('You can only upload JPG/PNG file!');
} }
const isLt2M = file.size / 1024 / 1024 < 2; const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) { if (!isLt2M) {
message.error('Image must smaller than 2MB!'); message.error('Image must smaller than 2MB!');
} }
return isJpgOrPng && isLt2M; return isJpgOrPng && isLt2M;
} }
function getBase64(img, callback) { function getBase64(img, callback) {
const reader = new FileReader(); const reader = new FileReader();
reader.addEventListener('load', () => callback(reader.result)); reader.addEventListener('load', () => callback(reader.result));
reader.readAsDataURL(img); reader.readAsDataURL(img);
} }
const $ = window.$; const $ = window.$;
class CaseNew extends Component{ class CaseNew extends Component{
constructor(props){ constructor(props){
super(props); super(props);
this.DescMdRef = React.createRef(); this.DescMdRef = React.createRef();
this.state={ this.state={
casesTags:[], casesTags:[],
contentFileList:[], contentFileList:[],
filesID:[], filesID:[],
imageUrl:undefined, imageUrl:undefined,
loading: false, loading: false,
checkTag:false, checkTag:false,
checkFile:false, checkFile:false,
coverID:undefined coverID:undefined
} }
} }
// 上传附件-删除确认框 // 上传附件-删除确认框
onAttachmentRemove = (file, stateName) => { onAttachmentRemove = (file, stateName) => {
this.props.confirm({ this.props.confirm({
content: '是否确认删除?', content: '是否确认删除?',
onOk: () => { onOk: () => {
this.deleteAttachment(file, stateName) this.deleteAttachment(file, stateName)
}, },
onCancel() { onCancel() {
console.log('Cancel'); console.log('Cancel');
}, },
}); });
return false; return false;
} }
// 上传附件-确认删除 // 上传附件-确认删除
deleteAttachment = (file, stateName) => { deleteAttachment = (file, stateName) => {
// 初次上传不能直接取uid // 初次上传不能直接取uid
const url = `/attachments/${file.response ? file.response.id : file.uid}.json` const url = `/attachments/${file.response ? file.response.id : file.uid}.json`
axios.delete(url, { axios.delete(url, {
}).then((response) => { }).then((response) => {
if (response.data) { if (response.data) {
const { status } = response.data; const { status } = response.data;
if (status == 0) { if (status == 0) {
console.log('--- success') console.log('--- success')
this.setState((state) => { this.setState((state) => {
const index = state[stateName].indexOf(file); const index = state[stateName].indexOf(file);
const newFileList = state[stateName].slice(); const newFileList = state[stateName].slice();
newFileList.splice(index, 1); newFileList.splice(index, 1);
console.log("newFileList"); console.log("newFileList");
console.log(newFileList.map(item =>{ return( item.id )})); console.log(newFileList.map(item =>{ return( item.id )}));
return { return {
[stateName]: newFileList, [stateName]: newFileList,
filesID:newFileList.map(item =>{ return( item.id )}) filesID:newFileList.map(item =>{ return( item.id )})
}; };
}); });
} }
} }
}) })
.catch(function (error) { .catch(function (error) {
console.log(error); console.log(error);
}); });
} }
// 上传附件-change // 上传附件-change
handleContentUploadChange = (info) => { handleContentUploadChange = (info) => {
if (info.file.status === 'done' || info.file.status === 'uploading') { if (info.file.status === 'done' || info.file.status === 'uploading') {
let contentFileList = info.fileList; let contentFileList = info.fileList;
this.setState({ contentFileList: appendFileSizeToUploadFileAll(contentFileList)}); this.setState({ contentFileList: appendFileSizeToUploadFileAll(contentFileList)});
let list = appendFileSizeToUploadFileAll(contentFileList); let list = appendFileSizeToUploadFileAll(contentFileList);
let arr = list.map(item=>{ let arr = list.map(item=>{
return ( item.response && item.response.id ) return ( item.response && item.response.id )
}) })
this.setState({ this.setState({
filesID:arr, filesID:arr,
checkFile:arr.length > 0 ? false : true checkFile:arr.length > 0 ? false : true
}) })
} }
} }
// 上传封面图-change // 上传封面图-change
handleChange = (info) => { handleChange = (info) => {
if (info.file.status === 'uploading') { if (info.file.status === 'uploading') {
this.setState({ loading: true }); this.setState({ loading: true });
return; return;
} }
if (info.file.status === 'done') { if (info.file.status === 'done') {
// Get this url from response in real world. // Get this url from response in real world.
getBase64(info.file.originFileObj, imageUrl => getBase64(info.file.originFileObj, imageUrl =>
this.setState({ this.setState({
imageUrl, imageUrl,
loading: false loading: false
}), }),
); );
console.log(info.file); console.log(info.file);
this.setState({ this.setState({
coverID:info.file.response && info.file.response.id coverID:info.file.response && info.file.response.id
}) })
} }
}; };
// 编辑时加载数据 // 编辑时加载数据
componentDidMount=()=>{ componentDidMount=()=>{
if(this.props.match.params.caseID){ if(this.props.match.params.caseID){
this.InitEditData(); this.InitEditData();
} }
} }
componentDidUpdate=(prevState)=>{ componentDidUpdate=(prevState)=>{
if(this.props.CaseDetail && prevState.CaseDetail != this.props.CaseDetail){ if(this.props.CaseDetail && prevState.CaseDetail != this.props.CaseDetail){
this.props.form.setFieldsValue({ this.props.form.setFieldsValue({
caseTitle:this.props.CaseDetail.title, caseTitle:this.props.CaseDetail.title,
userName:this.props.CaseDetail.author_name, userName:this.props.CaseDetail.author_name,
userUnit:this.props.CaseDetail.author_school_name, userUnit:this.props.CaseDetail.author_school_name,
}) })
this.setState({ this.setState({
contentFileList:this.props.attachments.map(item => { contentFileList:this.props.attachments.map(item => {
return { return {
id: item.id, id: item.id,
uid: item.id, uid: item.id,
name: appendFileSizeToUploadFile(item), name: appendFileSizeToUploadFile(item),
url: item.url, url: item.url,
filesize: item.filesize, filesize: item.filesize,
status: 'done' status: 'done'
} }
}), }),
filesID:this.props.attachments.map(item => { filesID:this.props.attachments.map(item => {
return ( item.id ) return ( item.id )
}), }),
coverID:this.props.cover && this.props.cover.id, coverID:this.props.cover && this.props.cover.id,
imageUrl:this.props.CaseDetail.cover && setImagesUrl(this.props.CaseDetail.cover.url), imageUrl:this.props.CaseDetail.cover && setImagesUrl(this.props.CaseDetail.cover.url),
casesTags:this.props.tags.map(item=>{ casesTags:this.props.tags.map(item=>{
return (item.id); return (item.id);
}) })
}) })
console.log(this.props.attachments.map(item => { console.log(this.props.attachments.map(item => {
return ( item.id ) return ( item.id )
})) }))
} }
} }
InitEditData=()=>{ InitEditData=()=>{
let caseID = this.props.match.params.caseID; let caseID = this.props.match.params.caseID;
this.props.getDetail(caseID); this.props.getDetail(caseID);
} }
// 申请提交和保存 // 申请提交和保存
handleSubmit = (type) => { handleSubmit = (type) => {
let caseID = this.props.match.params.caseID; let caseID = this.props.match.params.caseID;
console.log(type); console.log(type);
this.props.form.validateFieldsAndScroll((err, values) => { this.props.form.validateFieldsAndScroll((err, values) => {
let { casesTags , filesID } = this.state; let { casesTags , filesID } = this.state;
if(casesTags.length == 0){ if(casesTags.length == 0){
$("html").animate({ scrollTop: $("#tagFormItem").offset().top - 100 }); $("html").animate({ scrollTop: $("#tagFormItem").offset().top - 100 });
this.setState({ this.setState({
checkTag:true checkTag:true
}) })
return; return;
} }
if(filesID.length == 0){ if(filesID.length == 0){
$("html").animate({ scrollTop: $("#fileFormItem").offset().top - 100 }); $("html").animate({ scrollTop: $("#fileFormItem").offset().top - 100 });
this.setState({ this.setState({
checkFile:true checkFile:true
}) })
return; return;
} }
const mdContnet = this.DescMdRef.current.getValue().trim(); const mdContnet = this.DescMdRef.current.getValue().trim();
console.log(mdContnet) console.log(mdContnet)
values.description = mdContnet; values.description = mdContnet;
console.log(values); console.log(values);
let url = caseID ? `/libraries/${caseID}.json`: `/libraries.json`; let url = caseID ? `/libraries/${caseID}.json`: `/libraries.json`;
if(caseID){ if(caseID){
axios.put((url),{ axios.put((url),{
title:values.caseTitle, title:values.caseTitle,
author_name:values.userName, author_name:values.userName,
author_school_name:values.userUnit, author_school_name:values.userUnit,
content:values.description, content:values.description,
attachment_ids:this.state.contentFileList.map(item=>{ attachment_ids:this.state.contentFileList.map(item=>{
return (item.response ? item.response.id : item.id ) return (item.response ? item.response.id : item.id )
}), }),
tag_ids:this.state.casesTags, tag_ids:this.state.casesTags,
cover_id:this.state.coverID, cover_id:this.state.coverID,
publish:type == 'save' ? false : true publish:type == 'save' ? false : true
}).then((result)=>{ }).then((result)=>{
if(result){ if(result){
this.props.showNotification(type == 'save' ? `案例保存成功!`: `提交成功!`); this.props.showNotification(type == 'save' ? `案例保存成功!`: `提交成功!`);
this.props.history.push(type == 'save' ? `/moop_cases/${result.data.id}` : `/moop_cases/${result.data.id}/publish_success`); this.props.history.push(type == 'save' ? `/moop_cases/${result.data.id}` : `/moop_cases/${result.data.id}/publish_success`);
} }
}).catch((error)=>{ }).catch((error)=>{
console.log(error); console.log(error);
}) })
}else{ }else{
axios.post((url),{ axios.post((url),{
title:values.caseTitle, title:values.caseTitle,
author_name:values.userName, author_name:values.userName,
author_school_name:values.userUnit, author_school_name:values.userUnit,
content:values.description, content:values.description,
attachment_ids:this.state.filesID, attachment_ids:this.state.filesID,
tag_ids:this.state.casesTags, tag_ids:this.state.casesTags,
cover_id:this.state.coverID, cover_id:this.state.coverID,
publish:type == 'save' ? false : true publish:type == 'save' ? false : true
}).then((result)=>{ }).then((result)=>{
if(result){ if(result){
this.props.showNotification(type == 'save' ? `案例保存成功!`: `提交成功!`); this.props.showNotification(type == 'save' ? `案例保存成功!`: `提交成功!`);
this.props.history.push(type == 'save' ? `/moop_cases/${result.data.id}` : `/moop_cases/${result.data.id}/publish_success`); this.props.history.push(type == 'save' ? `/moop_cases/${result.data.id}` : `/moop_cases/${result.data.id}/publish_success`);
} }
}).catch((error)=>{ }).catch((error)=>{
console.log(error); console.log(error);
}) })
} }
}) })
} }
// 选择标签 // 选择标签
changeType=(type)=>{ changeType=(type)=>{
let tags = []; // console.log(this.state.casesTags);
if(this.state.casesTags.indexOf(type) > -1){ // debugger
tags = this.state.casesTags.filter(item => item != type); let tags = [];
}else{
tags = this.state.casesTags.concat(type); if(this.state.casesTags.indexOf(type) > -1){
} tags = this.state.casesTags.filter(item => item != type);
const tagUniqed = _.uniq(tags); }else{
this.setState({ tags = this.state.casesTags.concat(type);
casesTags: tagUniqed, }
checkTag:tags.length > 0 ? false : true const tagUniqed = _.uniq(tags);
}) this.setState({
} casesTags: tagUniqed,
checkTag:tags.length > 0 ? false : true
render(){ })
let { caseID } = this.props.match.params; }
let { CaseDetail } = this.props;
let { casesTags , contentFileList , imageUrl , checkTag , checkFile } = this.state; render(){
const {getFieldDecorator} = this.props.form; let { caseID } = this.props.match.params;
let { CaseDetail } = this.props;
let { casesTags , contentFileList , imageUrl , checkTag , checkFile } = this.state;
// 上传附件点击事件 const {getFieldDecorator} = this.props.form;
const uploadProps = {
width: 600,
multiple: true, // 上传附件点击事件
fileList:contentFileList, const uploadProps = {
action: `${getUploadActionUrl()}`, width: 600,
onChange: this.handleContentUploadChange, multiple: true,
onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'), fileList:contentFileList,
beforeUpload: (file) => { action: `${getUploadActionUrl()}`,
const isLt150M = file.size / 1024 / 1024 < 150; onChange: this.handleContentUploadChange,
if (!isLt150M) { onRemove: (file) => this.onAttachmentRemove(file, 'contentFileList'),
//message.error('文件大小必须小于150MB!'); beforeUpload: (file) => {
this.props.define({ const isLt150M = file.size / 1024 / 1024 < 150;
title:'提示', if (!isLt150M) {
content:"该文件无法上传。超过文件大小限制(150MB),建议上传到百度云等其它共享工具里然后再txt文档里给出链接以及共享密码并上传" //message.error('文件大小必须小于150MB!');
}) this.props.define({
return isLt150M; title:'提示',
} content:"该文件无法上传。超过文件大小限制(150MB),建议上传到百度云等其它共享工具里然后再txt文档里给出链接以及共享密码并上传"
} })
}; return isLt150M;
// 上传封面图-html }
const uploadButton = ( }
<div> };
<Icon className='font-36 color-grey-c' type={this.state.loading ? 'loading' : 'plus'} /> // 上传封面图-html
</div> const uploadButton = (
); <div>
// 上传封面图点击事件 <Icon className='font-36 color-grey-c' type={this.state.loading ? 'loading' : 'plus'} />
const uploadCover = { </div>
listType:"picture-card", );
className:"avatar-uploader", // 上传封面图点击事件
showUploadList:false, const uploadCover = {
action:`${getUploadActionUrl()}`, listType:"picture-card",
onChange:this.handleChange, className:"avatar-uploader",
} showUploadList:false,
console.log('111'); action:`${getUploadActionUrl()}`,
console.log(!caseID || (CaseDetail && CaseDetail.status == "pending")); onChange:this.handleChange,
return( }
<div className="educontent mt10 mb50"> console.log('111');
<style> console.log(!caseID || (CaseDetail && CaseDetail.status == "pending"));
{ return(
` <div className="educontent mt10 mb50">
.newCases .ant-col.ant-form-item-label{ <style>
float:left; {
margin-right:20px; `
height:35px; .newCases .ant-col.ant-form-item-label{
line-height:35px; float:left;
} margin-right:20px;
height:35px;
.newCaseUpload{ line-height:35px;
width: 100%; }
background: #F2F9FF;
justify-content: center; .newCaseUpload{
align-items: center; width: 100%;
display: -webkit-flex; background: #F2F9FF;
text-align: center; justify-content: center;
height: 120px; align-items: center;
border-radius: 4px; display: -webkit-flex;
border: 1px dashed #4cacff; text-align: center;
} height: 120px;
.newCases .ant-form-item{ border-radius: 4px;
margin-bottom:20px!important ; border: 1px dashed #4cacff;
} }
.newCases .ant-col.ant-form-item-control-wrapper{ .newCases .ant-form-item{
position:relative; margin-bottom:20px!important ;
} }
.newCases .ant-form-explain{ .newCases .ant-col.ant-form-item-control-wrapper{
position:absolute; position:relative;
bottom:-18px; }
left:76px; .newCases .ant-form-explain{
padding-left: 7px; position:absolute;
} bottom:-18px;
.newCases .resetLeft .ant-form-explain{ left:76px;
left:0px; padding-left: 7px;
} }
.newCases .resetBottom .ant-form-explain{ .newCases .resetLeft .ant-form-explain{
bottom:2px; left:0px;
} }
` .newCases .resetBottom .ant-form-explain{
} bottom:2px;
</style> }
<p className="mt10 mb20 clearfix lineh-20"> `
<a href="/moop_cases" className="color-grey-9">教学案例</a> &gt; <span className="color-grey-3">{ caseID ? "" : "" }</span> }
</p> </style>
<p class="lineh-25 font-22 mb20">上传教学案例</p> <p className="mt10 mb20 clearfix lineh-20">
<Form onSubmit={this.handleSubmit} className={"newCases"}> <a href="/moop_cases" className="color-grey-9">教学案例</a> &gt; <span className="color-grey-3">{ caseID ? "" : "" }</span>
<div className="padding30 edu-back-white"> </p>
<Form.Item label="标题"> <p class="lineh-25 font-22 mb20">上传教学案例</p>
{getFieldDecorator('caseTitle', { <Form onSubmit={this.handleSubmit} className={"newCases"}>
rules: [{required: true, message: "案例标题不能为空"}], <div className="padding30 edu-back-white">
})( <Form.Item label="标题">
<Input placeholder="例如:软件工程教学案例" className="greyInput winput-300-35 mr20 fl"/> {getFieldDecorator('caseTitle', {
)} rules: [{required: true, message: "案例标题不能为空"}],
<span className="color-grey-c font-12 fl">简明扼要介绍文档/视频所包含的主要的内容</span> })(
</Form.Item> <Input placeholder="例如:软件工程教学案例" className="greyInput winput-300-35 mr20 fl"/>
<div className="clearfix"> )}
<Form.Item label="作者" className="fl with22"> <span className="color-grey-c font-12 fl">简明扼要介绍文档/视频所包含的主要的内容</span>
{getFieldDecorator('userName', { </Form.Item>
rules: [{required: true, message: "请输入作者姓名"}], <div className="clearfix">
})( <Form.Item label="作者" className="fl with22">
<Input placeholder="请输入姓名" className="greyInput winput-120-35 mr20 fl winput150"/> {getFieldDecorator('userName', {
)} rules: [{required: true, message: "请输入作者姓名"}],
</Form.Item> })(
<Form.Item className="fl resetLeft"> <Input placeholder="请输入姓名" className="greyInput winput-120-35 mr20 fl winput150"/>
{getFieldDecorator('userUnit', { )}
rules: [{required: true, message: "请输入作者单位名称"}], </Form.Item>
})( <Form.Item className="fl resetLeft">
<Input placeholder="请输入作者单位名称" className="greyInput winput-300-35 mr20 fl"/> {getFieldDecorator('userUnit', {
)} rules: [{required: true, message: "请输入作者单位名称"}],
</Form.Item> })(
</div> <Input placeholder="请输入作者单位名称" className="greyInput winput-300-35 mr20 fl"/>
<div className={checkTag==true ? "clearfix mb20 pr has-error" : "clearfix mb20"} id="tagFormItem"> )}
<span className="upload_Title must">标签</span> </Form.Item>
<ul className="fl libraries_tab"> </div>
<li className={ casesTags.indexOf(1) > -1 ? "active" :"" } onClick={()=>this.changeType(1)}>获奖案例</li> <div className={checkTag==true ? "clearfix mb20 pr has-error" : "clearfix mb20"} id="tagFormItem">
<li className={ casesTags.indexOf(2) > -1 ? "active" :"" } onClick={()=>this.changeType(2)}>入库案例</li> <span className="upload_Title must">标签</span>
</ul> <ul className="fl libraries_tab">
{ <li className={ casesTags.indexOf(1) > -1 ? "active" :"" } onClick={()=>this.changeType(1)}>获奖案例</li>
checkTag && <div class="ant-form-explain">请选择标签</div> <li className={ casesTags.indexOf(2) > -1 ? "active" :"" } onClick={()=>this.changeType(2)}>入库案例</li>
} {/*<li className={casesTags.indexOf(3) > -1 ? "active" : ""} onclick={() => this.changeType(3)}>企业案例</li>*/}
</div> </ul>
<Form.Item label="描述" className="resetBottom" style={{marginBottom:"0px"}}> {
{getFieldDecorator('description', { checkTag && <div class="ant-form-explain">请选择标签</div>
rules: [{ }
required: true, message: '请输入描述内容' </div>
}], <Form.Item label="描述" className="resetBottom" style={{marginBottom:"0px"}}>
})( {getFieldDecorator('description', {
<TPMMDEditor ref={this.DescMdRef} placeholder="请添加描述" mdID={'caseContentMD'} refreshTimeout={1500} rules: [{
watch={true} className="caseMessageMD" initValue={CaseDetail && CaseDetail.content}></TPMMDEditor> required: true, message: '请输入描述内容'
)} }],
</Form.Item> })(
<div className={checkFile == true ? "clearfix mb20 pr has-error" : "clearfix mb20"} id="fileFormItem" style={{marginLeft:"76px"}}> <TPMMDEditor ref={this.DescMdRef} placeholder="请添加描述" mdID={'caseContentMD'} refreshTimeout={1500}
<Dragger {...uploadProps} className="librariesField upload_1"> watch={true} className="caseMessageMD" initValue={CaseDetail && CaseDetail.content}></TPMMDEditor>
<p className="ant-upload-text color-blue font-18 mb20">上传附件</p> )}
<p className="ant-upload-text color-grey-c">从我的电脑选择要上传的文档按住CTRL可以上传多份文档单个文件最大限制150MB</p> </Form.Item>
</Dragger> <div className={checkFile == true ? "clearfix mb20 pr has-error" : "clearfix mb20"} id="fileFormItem" style={{marginLeft:"76px"}}>
{ <Dragger {...uploadProps} className="librariesField upload_1">
checkFile == true && <div style={{left:"0px",bottom:"-21px"}} class="ant-form-explain">请先上传附件</div> <p className="ant-upload-text color-blue font-18 mb20">上传附件</p>
} <p className="ant-upload-text color-grey-c">从我的电脑选择要上传的文档按住CTRL可以上传多份文档单个文件最大限制150MB</p>
</div> </Dragger>
<p className="lineh-25 mt20 mb10 clearfix"> {
<span className="upload_Title" style={{marginRight:"12px"}}>封面图</span><span class="color-grey-c fl lineh-35">120*90 px</span> checkFile == true && <div style={{left:"0px",bottom:"-21px"}} class="ant-form-explain">请先上传附件</div>
</p> }
<div style={{marginLeft:"76px"}} className="uploadImage"> </div>
<Upload {...uploadCover}> <p className="lineh-25 mt20 mb10 clearfix">
{ imageUrl ? <span className="upload_Title" style={{marginRight:"12px"}}>封面图</span><span class="color-grey-c fl lineh-35">120*90 px</span>
<Tooltip title="重新上传"> </p>
<img src={imageUrl} alt="avatar" style={{ width: '100%' }} /> <div style={{marginLeft:"76px"}} className="uploadImage">
</Tooltip> <Upload {...uploadCover}>
: { imageUrl ?
<Tooltip title="上传图片"> <Tooltip title="重新上传">
{uploadButton} <img src={imageUrl} alt="avatar" style={{ width: '100%' }} />
</Tooltip> </Tooltip>
} :
</Upload> <Tooltip title="上传图片">
</div> {uploadButton}
</div> </Tooltip>
<div className="padding30 bor-top-greyE edu-back-white"> }
<li className="lineh-25 color-grey-6 font-18 mb20">审核说明</li> </Upload>
<ul className="font-16"> </div>
<li>平台管理员将对每天新上传的文档进行审核审核通过的文档将公开显示否则将私有化或移除</li> </div>
</ul> <div className="padding30 bor-top-greyE edu-back-white">
</div> <li className="lineh-25 color-grey-6 font-18 mb20">审核说明</li>
<div className="padding30 bor-top-greyE edu-back-white"> <ul className="font-16">
<li className="lineh-25 color-grey-6 font-18 mb20">温馨提示</li> <li>平台管理员将对每天新上传的文档进行审核审核通过的文档将公开显示否则将私有化或移除</li>
<ul className="font-16 lineh-30"> </ul>
<li>1.请勿上传已设置加密口令的文档资源</li> </div>
<li>2.可以上传符合教学案例标准的文档资料 <div className="padding30 bor-top-greyE edu-back-white">
<a className="color-blue" target="_blank" href="https://www.educoder.net/courses/1309/boards/5909/messages/34799">案例入库标准</a> <li className="lineh-25 color-grey-6 font-18 mb20">温馨提示</li>
<a target="_blank" className="color-blue" href="https://www.educoder.net/courses/1309/boards/5909/messages/34798">案例使用说明书</a>100MB</li> <ul className="font-16 lineh-30">
<li>3.请确保上传内容无侵权或违反国家关于互联网政策的不良行为</li> <li>1.请勿上传已设置加密口令的文档资源</li>
<li>4.请使用ChromeFirefoxSafariIE11及以上版本浏览器</li> <li>2.可以上传符合教学案例标准的文档资料
</ul> <a className="color-blue" target="_blank" href="https://www.educoder.net/courses/1309/boards/5909/messages/34799">案例入库标准</a>
</div> <a target="_blank" className="color-blue" href="https://www.educoder.net/courses/1309/boards/5909/messages/34798">案例使用说明书</a>100MB</li>
<Form.Item> <li>3.请确保上传内容无侵权或违反国家关于互联网政策的不良行为</li>
<div className="clearfix mt30 mb30"> <li>4.请使用ChromeFirefoxSafariIE11及以上版本浏览器</li>
{ </ul>
(!caseID || (CaseDetail && CaseDetail.status == "pending" || CaseDetail && CaseDetail.status == "refused")) ? <Button type="primary" onClick={()=>this.handleSubmit("submit")} className="defalutSubmitbtn fl mr20">申请发布</Button> : "" </div>
} <Form.Item>
<a className="defalutCancelbtn fl" onClick={()=>this.handleSubmit("save")}>保存</ a> <div className="clearfix mt30 mb30">
</div> {
</Form.Item> (!caseID || (CaseDetail && CaseDetail.status == "pending" || CaseDetail && CaseDetail.status == "refused")) ? <Button type="primary" onClick={()=>this.handleSubmit("submit")} className="defalutSubmitbtn fl mr20">申请发布</Button> : ""
</Form> }
</div> <a className="defalutCancelbtn fl" onClick={()=>this.handleSubmit("save")}>保存</ a>
) </div>
} </Form.Item>
} </Form>
const WrappedCoursesNewApp = Form.create({name: 'CaseNew'})(CaseNew); </div>
)
}
}
const WrappedCoursesNewApp = Form.create({name: 'CaseNew'})(CaseNew);
export default WrappedCoursesNewApp; export default WrappedCoursesNewApp;

@ -1384,20 +1384,23 @@ export default class TPMsettings extends Component {
} }
onAttachmentRemove = (file) => { onAttachmentRemove = (file) => {
confirm({ if(file.response!=undefined){
title: '确定要删除这个附件吗?', confirm({
okText: '确定', title: '确定要删除这个附件吗?',
cancelText: '取消', okText: '确定',
// content: 'Some descriptions', cancelText: '取消',
onOk: () => { // content: 'Some descriptions',
console.log("665") onOk: () => {
this.deleteAttachment(file) console.log("665")
}, this.deleteAttachment(file)
onCancel() { },
console.log('Cancel'); onCancel() {
}, console.log('Cancel');
}); },
return false; });
return false;
}
} }
deleteAttachment = (file) => { deleteAttachment = (file) => {

@ -772,20 +772,23 @@ class Newshixuns extends Component {
} }
onAttachmentRemove = (file) => { onAttachmentRemove = (file) => {
confirm({ if(file.response!=undefined){
title: '确定要删除这个附件吗?', confirm({
okText: '确定', title: '确定要删除这个附件吗?',
cancelText: '取消', okText: '确定',
// content: 'Some descriptions', cancelText: '取消',
onOk: () => { // content: 'Some descriptions',
console.log("665") onOk: () => {
this.deleteAttachment(file) console.log("665")
}, this.deleteAttachment(file)
onCancel() { },
console.log('Cancel'); onCancel() {
}, console.log('Cancel');
}); },
return false; });
return false;
}
} }
deleteAttachment = (file) => { deleteAttachment = (file) => {
console.log(file); console.log(file);

@ -457,7 +457,7 @@ class InfosTopics extends Component{
<a className="btn colorblue mr25 font-16 fr" <a className="btn colorblue mr25 font-16 fr"
href={category==="normal"?`/courses/ordinarywork/${item.id}?tab=0`: href={category==="normal"?`/courses/ordinarywork/${item.id}?tab=0`:
category==="group"?`/courses/groupingwork/${item.id}?tab=0`: category==="group"?`/courses/groupingwork/${item.id}?tab=0`:
category==="poll"?`/courses/poll/${item.id}`: category==="poll"?`/courses/questreediting/${item.id}/edit`:
category==="exercise"?`/courses/poll/${item.id}`: category==="exercise"?`/courses/poll/${item.id}`:
category==="gtask"?`/courses/completetask/${item.id}`: category==="gtask"?`/courses/completetask/${item.id}`:
category==="gtopic"?`/courses/completetopic/${item.id}`:"" category==="gtopic"?`/courses/completetopic/${item.id}`:""

Loading…
Cancel
Save