From a033d5c406cf828641bcad728d1523563da918f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 4 Jul 2019 15:18:35 +0800 Subject: [PATCH 01/15] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/shixunHomework/Listofworks.js | 40 ++++++++++++++----- .../shixunHomework/Trainingjobsetting.js | 37 ++++++++++++++--- .../shixunHomework/Workquestionandanswer.js | 30 +++++++++++++- 3 files changed, 89 insertions(+), 18 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/Listofworks.js b/public/react/src/modules/courses/shixunHomework/Listofworks.js index 2553300ab..a8507d853 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworks.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworks.js @@ -1353,11 +1353,15 @@ class Listofworks extends Component { var blob = new Blob([response.data]) var downloadElement = document.createElement('a'); var href = window.URL.createObjectURL(blob); //创建下载的链接 - downloadElement.href = href; - downloadElement.download = '实习报告.pdf'; //下载后文件名 - document.body.appendChild(downloadElement); - downloadElement.click(); //点击下载 - document.body.removeChild(downloadElement); //下载完成移除元素 + let filename = response.headers.get('Content-Disposition'); + if (filename) { + filename = filename.match(/\"(.*)\"/)[1]; //提取文件名 + downloadElement.href = href; + downloadElement.download = filename; //下载后文件名 + document.body.appendChild(downloadElement); + downloadElement.click(); //点击下载 + document.body.removeChild(downloadElement); //下载完成移除元素 + } window.URL.revokeObjectURL(href); //释放掉blob对象 }).catch((error) => { console.log(error) @@ -1377,15 +1381,31 @@ class Listofworks extends Component { },{responseType: 'blob'}).then((response) => { console.log("1306"); console.log(response); + // if (response.status == 200) { + // let url = window.URL.createObjectURL(new Blob([response.data])) + // let link = document.createElement('a') + // link.style.display = 'none' + // link.href = url + // link.setAttribute('download', fileName) // 自定义下载文件名(如exemple.txt) + // document.body.appendChild(link) + // link.click() + // } + + var blob = new Blob([response.data]) var downloadElement = document.createElement('a'); var href = window.URL.createObjectURL(blob); //创建下载的链接 - downloadElement.href = href; - downloadElement.download = '课堂学生成绩.xlsx'; //下载后文件名 - document.body.appendChild(downloadElement); - downloadElement.click(); //点击下载 - document.body.removeChild(downloadElement); //下载完成移除元素 + let filename = response.headers.get('Content-Disposition'); + if (filename) { + filename = filename.match(/\"(.*)\"/)[1]; //提取文件名 + downloadElement.href = href; + downloadElement.download = filename; //下载后文件名 + document.body.appendChild(downloadElement); + downloadElement.click(); //点击下载 + document.body.removeChild(downloadElement); //下载完成移除元素 + } window.URL.revokeObjectURL(href); //释放掉blob对象 + }).catch((error) => { console.log(error) }); diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index 55770c359..19343ad79 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -1607,7 +1607,7 @@ class Trainingjobsetting extends Component { showmodel:false }) } -// 导出实习报告批量 + // 导出实习报告批量 internshipreport = () => { console.log("internshipreport"); var homeworkid = this.props.match.params.homeworkid; @@ -1616,14 +1616,26 @@ class Trainingjobsetting extends Component { params: { homework_common_id: homeworkid, } - }).then((response) => { - console.log("1593"); + },{responseType: 'blob'}).then((response) => { + console.log("326"); console.log(response); + var blob = new Blob([response.data]) + var downloadElement = document.createElement('a'); + var href = window.URL.createObjectURL(blob); //创建下载的链接 + let filename = response.headers.get('Content-Disposition'); + if (filename) { + filename = filename.match(/\"(.*)\"/)[1]; //提取文件名 + downloadElement.href = href; + downloadElement.download = filename; //下载后文件名 + document.body.appendChild(downloadElement); + downloadElement.click(); //点击下载 + document.body.removeChild(downloadElement); //下载完成移除元素 + } + window.URL.revokeObjectURL(href); //释放掉blob对象 }).catch((error) => { console.log(error) }); - } // 课堂学生成绩的导出下载 @@ -1631,9 +1643,22 @@ class Trainingjobsetting extends Component { console.log("Classstudentachievement"); const course_id = this.props.match.params.coursesId; let url = "/courses/" + course_id + "/export_member_scores_excel.xlsx"; - axios.get(url).then((response) => { - console.log("1607"); + axios.get((url),{responseType: 'blob'}).then((response) => { + console.log("339"); console.log(response); + var blob = new Blob([response.data]) + var downloadElement = document.createElement('a'); + var href = window.URL.createObjectURL(blob); //创建下载的链接 + let filename = response.headers.get('Content-Disposition'); + if (filename) { + filename = filename.match(/\"(.*)\"/)[1]; //提取文件名 + downloadElement.href = href; + downloadElement.download = filename; //下载后文件名 + document.body.appendChild(downloadElement); + downloadElement.click(); //点击下载 + document.body.removeChild(downloadElement); //下载完成移除元素 + } + window.URL.revokeObjectURL(href); //释放掉blob对象 }).catch((error) => { console.log(error) diff --git a/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js b/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js index 28560d4fe..d341aab6b 100644 --- a/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js +++ b/public/react/src/modules/courses/shixunHomework/Workquestionandanswer.js @@ -327,9 +327,22 @@ class Workquestionandanswer extends Component { params: { homework_common_id: homeworkid, } - }).then((response) => { + },{responseType: 'blob'}).then((response) => { console.log("326"); console.log(response); + var blob = new Blob([response.data]) + var downloadElement = document.createElement('a'); + var href = window.URL.createObjectURL(blob); //创建下载的链接 + let filename = response.headers.get('Content-Disposition'); + if (filename) { + filename = filename.match(/\"(.*)\"/)[1]; //提取文件名 + downloadElement.href = href; + downloadElement.download = filename; //下载后文件名 + document.body.appendChild(downloadElement); + downloadElement.click(); //点击下载 + document.body.removeChild(downloadElement); //下载完成移除元素 + } + window.URL.revokeObjectURL(href); //释放掉blob对象 }).catch((error) => { console.log(error) @@ -341,9 +354,22 @@ class Workquestionandanswer extends Component { console.log("Classstudentachievement"); const course_id = this.props.match.params.coursesId; let url = "/courses/" + course_id + "/export_member_scores_excel.xlsx"; - axios.get(url).then((response) => { + axios.get((url),{responseType: 'blob'}).then((response) => { console.log("339"); console.log(response); + var blob = new Blob([response.data]) + var downloadElement = document.createElement('a'); + var href = window.URL.createObjectURL(blob); //创建下载的链接 + let filename = response.headers.get('Content-Disposition'); + if (filename) { + filename = filename.match(/\"(.*)\"/)[1]; //提取文件名 + downloadElement.href = href; + downloadElement.download = filename; //下载后文件名 + document.body.appendChild(downloadElement); + downloadElement.click(); //点击下载 + document.body.removeChild(downloadElement); //下载完成移除元素 + } + window.URL.revokeObjectURL(href); //释放掉blob对象 }).catch((error) => { console.log(error) From 10fce08c59a231cd7e490ef6d79664903fbfada4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 4 Jul 2019 15:22:51 +0800 Subject: [PATCH 02/15] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/shixunHomework/Listofworks.js | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/Listofworks.js b/public/react/src/modules/courses/shixunHomework/Listofworks.js index a8507d853..28395c1d7 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworks.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworks.js @@ -1338,7 +1338,7 @@ class Listofworks extends Component { // 导出实习报告批量 internshipreport = ()=>{ console.log("internshipreport"); - let url = "/zip/shixun_report"; + let url = "http://47.96.87.25:48080/zip/shixun_report"; let homeworkid = this.props.match.params.homeworkid; axios.get((url),{ params: { @@ -1350,7 +1350,9 @@ class Listofworks extends Component { },{responseType: 'blob'}).then((response) => { console.log("1342"); console.log(response); - var blob = new Blob([response.data]) + if (response.status == 200) { + + var blob = new Blob([response.data]) var downloadElement = document.createElement('a'); var href = window.URL.createObjectURL(blob); //创建下载的链接 let filename = response.headers.get('Content-Disposition'); @@ -1363,6 +1365,7 @@ class Listofworks extends Component { document.body.removeChild(downloadElement); //下载完成移除元素 } window.URL.revokeObjectURL(href); //释放掉blob对象 + } }).catch((error) => { console.log(error) }); @@ -1372,7 +1375,7 @@ class Listofworks extends Component { Classstudentachievement=()=>{ console.log("Classstudentachievement"); const course_id = this.props.match.params.coursesId; - let url = "/courses/"+course_id+"/export_member_scores_excel.xlsx"; + let url = "http://47.96.87.25:48080/courses/"+course_id+"/export_member_scores_excel.xlsx"; axios.get((url),{ params: { group_id: this.state.checkedValuesineinfo, @@ -1381,17 +1384,7 @@ class Listofworks extends Component { },{responseType: 'blob'}).then((response) => { console.log("1306"); console.log(response); - // if (response.status == 200) { - // let url = window.URL.createObjectURL(new Blob([response.data])) - // let link = document.createElement('a') - // link.style.display = 'none' - // link.href = url - // link.setAttribute('download', fileName) // 自定义下载文件名(如exemple.txt) - // document.body.appendChild(link) - // link.click() - // } - - + if (response.status == 200) { var blob = new Blob([response.data]) var downloadElement = document.createElement('a'); var href = window.URL.createObjectURL(blob); //创建下载的链接 @@ -1405,7 +1398,7 @@ class Listofworks extends Component { document.body.removeChild(downloadElement); //下载完成移除元素 } window.URL.revokeObjectURL(href); //释放掉blob对象 - + } }).catch((error) => { console.log(error) }); From e67128cfbd8df73f57b8f2b5f1b5cb485fc01905 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 4 Jul 2019 15:26:36 +0800 Subject: [PATCH 03/15] moduleChineseName --- public/react/src/modules/courses/busyWork/commonWork.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/busyWork/commonWork.js b/public/react/src/modules/courses/busyWork/commonWork.js index 8b2a3dced..85fd2ff66 100644 --- a/public/react/src/modules/courses/busyWork/commonWork.js +++ b/public/react/src/modules/courses/busyWork/commonWork.js @@ -401,7 +401,7 @@ class commonWork extends Component{ } secondRowLeft={
- 共 {mainList&&mainList.all_count} 个作业 + 共 {mainList&&mainList.all_count} 个{moduleChineseName} 已发布:{published_count}个 {/* {this.props.isAdmin()?:""} */} 未发布:{unpublished_count}个 From f536f0c98c575bbfd5046ed0501303fd967bb0f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 4 Jul 2019 15:32:53 +0800 Subject: [PATCH 04/15] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/courses/shixunHomework/Listofworks.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/Listofworks.js b/public/react/src/modules/courses/shixunHomework/Listofworks.js index 28395c1d7..9606740dc 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworks.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworks.js @@ -1338,7 +1338,7 @@ class Listofworks extends Component { // 导出实习报告批量 internshipreport = ()=>{ console.log("internshipreport"); - let url = "http://47.96.87.25:48080/zip/shixun_report"; + let url = "/zip/shixun_report"; let homeworkid = this.props.match.params.homeworkid; axios.get((url),{ params: { @@ -1375,7 +1375,7 @@ class Listofworks extends Component { Classstudentachievement=()=>{ console.log("Classstudentachievement"); const course_id = this.props.match.params.coursesId; - let url = "http://47.96.87.25:48080/courses/"+course_id+"/export_member_scores_excel.xlsx"; + let url = "/courses/"+course_id+"/export_member_scores_excel.xlsx"; axios.get((url),{ params: { group_id: this.state.checkedValuesineinfo, From 3af911654eeb4daf33d09f7b5052c33d2fa4c5d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 4 Jul 2019 15:44:14 +0800 Subject: [PATCH 05/15] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/coursesPublic/PathModal.js | 6 +- .../courses/shixunHomework/shixunHomework.js | 2 +- public/react/src/modules/home/shixunsHome.js | 2 +- public/react/src/modules/paths/PathNew.js | 26 +- public/react/src/modules/tpm/NewHeader.js | 4 +- .../modules/tpm/component/TPMRightSection.js | 410 ++++----- .../react/src/modules/user/usersInfo/Infos.js | 780 +++++++++--------- .../src/modules/user/usersInfo/InfosPath.js | 392 ++++----- 8 files changed, 811 insertions(+), 811 deletions(-) diff --git a/public/react/src/modules/courses/coursesPublic/PathModal.js b/public/react/src/modules/courses/coursesPublic/PathModal.js index 0b69fa15d..fc6747e08 100644 --- a/public/react/src/modules/courses/coursesPublic/PathModal.js +++ b/public/react/src/modules/courses/coursesPublic/PathModal.js @@ -75,13 +75,13 @@ class PathModal extends Component{ if(patheditarry===undefined){ this.setState({ patheditarrytype:true, - patheditarryvalue:"请先选择实训课程" + patheditarryvalue:"请先选择实践课程" }) return }else if(patheditarry.length===0){ this.setState({ patheditarrytype:true, - patheditarryvalue:"请先选择实训课程" + patheditarryvalue:"请先选择实践课程" }) return } @@ -137,7 +137,7 @@ class PathModal extends Component{ />:""} this.editname(datas&&datas.main_category_name)} className={"mr30"}>目录重命名*/} : this.editDir(datas&&datas.category_name)} className={"mr30 font-16"}>目录重命名:""} - {this.props.isAdmin()===true?datas&&datas.category_name===undefined||datas&&datas.category_name===null?选用实训课程:"":""} + {this.props.isAdmin()===true?datas&&datas.category_name===undefined||datas&&datas.category_name===null?选用实践课程:"":""} {this.props.isAdmin()===true?this.createCommonWork()}>选用实训:""}

diff --git a/public/react/src/modules/home/shixunsHome.js b/public/react/src/modules/home/shixunsHome.js index 9ef26f7a8..9093ec22d 100644 --- a/public/react/src/modules/home/shixunsHome.js +++ b/public/react/src/modules/home/shixunsHome.js @@ -189,7 +189,7 @@ class ShixunsHome extends Component { {/*实训路径*/}
-

实训课程

+

实践课程

TRAINING COURSE

更多 diff --git a/public/react/src/modules/paths/PathNew.js b/public/react/src/modules/paths/PathNew.js index 89adbc233..0575fc817 100644 --- a/public/react/src/modules/paths/PathNew.js +++ b/public/react/src/modules/paths/PathNew.js @@ -94,7 +94,7 @@ class PathNew extends Component{ submitNewPath=()=>{ let {pathName} = this.state; if(pathName===""){ - this.props.showSnackbar("请输入实训课程名称"); + this.props.showSnackbar("请输入实践课程名称"); window.location.href="#part_Name"; this.setState({ flag_name:false @@ -103,23 +103,23 @@ class PathNew extends Component{ } let des=this.Des_editMD.getValue(); if(des===""){ - this.props.showSnackbar("请输入实训课程的简介"); + this.props.showSnackbar("请输入实践课程的简介"); window.location.href="#part_Des"; return; } if (des.length > 5000) { - this.props.showSnackbar("实训课程的简介最大限制5000个字符"); + this.props.showSnackbar("实践课程的简介最大限制5000个字符"); window.location.href="#part_Des"; return; } let point = this.Point_editMD.getValue(); if(point===""){ - this.props.showSnackbar("请输入实训课程的学习须知"); + this.props.showSnackbar("请输入实践课程的学习须知"); window.location.href="#part_point"; return; } if(point.length > 500){ - this.props.showSnackbar("实训课程的学习须知最大限制500个字符"); + this.props.showSnackbar("实践课程的学习须知最大限制500个字符"); window.location.href="#part_point"; return; } @@ -177,10 +177,10 @@ class PathNew extends Component{ }) const Des_editMD = create_editorMD("shixun_introduction","100%","490px" - ,"请在此输入实训课程的简介,最大限制5000个字符","/api/attachments.json", response.data.description,""); + ,"请在此输入实践课程的简介,最大限制5000个字符","/api/attachments.json", response.data.description,""); this.Des_editMD=Des_editMD; const Point_editMD = create_editorMD("shixun_propaedeutics","100%","260px" - ,"请在此输入实训课程的学习须知,最大限制500个字符","/api/attachments.json",response.data.learning_notes,""); + ,"请在此输入实践课程的学习须知,最大限制500个字符","/api/attachments.json",response.data.learning_notes,""); this.Point_editMD=Point_editMD; } }).catch((error)=>{ @@ -189,9 +189,9 @@ class PathNew extends Component{ } else { this.isEditPage = false - const Des_editMD = create_editorMD("shixun_introduction","100%","490px","请在此输入实训课程的简介,最大限制5000个字符","/api/attachments.json","",""); + const Des_editMD = create_editorMD("shixun_introduction","100%","490px","请在此输入实践课程的简介,最大限制5000个字符","/api/attachments.json","",""); this.Des_editMD=Des_editMD; - const Point_editMD = create_editorMD("shixun_propaedeutics","100%","260px","请在此输入实训课程的学习须知,最大限制500个字符","/api/attachments.json","",""); + const Point_editMD = create_editorMD("shixun_propaedeutics","100%","260px","请在此输入实践课程的学习须知,最大限制500个字符","/api/attachments.json","",""); this.Point_editMD=Point_editMD; } @@ -210,9 +210,9 @@ class PathNew extends Component{
-

创建实训课程

+

创建实践课程

-

实训课程名称

+

实践课程名称

*
@@ -233,7 +233,7 @@ class PathNew extends Component{ *
- +

@@ -247,7 +247,7 @@ class PathNew extends Component{ *
- +

diff --git a/public/react/src/modules/tpm/NewHeader.js b/public/react/src/modules/tpm/NewHeader.js index c5b72946e..bf8271940 100644 --- a/public/react/src/modules/tpm/NewHeader.js +++ b/public/react/src/modules/tpm/NewHeader.js @@ -751,7 +751,7 @@ submittojoinclass=(value)=>{
  • 我的课堂
  • {/* p 老师 l 学生 */}
  • 我的实训
  • -
  • 我的实训课程
  • +
  • 我的实践课程
  • 我的项目
  • 账号管理
  • {/*
  • this.educoderlogin()} >登入测试接口
  • */} @@ -788,7 +788,7 @@ submittojoinclass=(value)=>{
      diff --git a/public/react/src/modules/tpm/component/TPMRightSection.js b/public/react/src/modules/tpm/component/TPMRightSection.js index bfc1fb0e4..28c49333a 100644 --- a/public/react/src/modules/tpm/component/TPMRightSection.js +++ b/public/react/src/modules/tpm/component/TPMRightSection.js @@ -1,205 +1,205 @@ -import React, { Component } from 'react'; - -import { BrowserRouter as Router, Route, Link } from "react-router-dom"; - -import axios from 'axios'; - -import { getImageUrl,} from "educoder"; - -import './TPMright.css'; - -import {Icon,Tooltip} from 'antd'; - -// import "antd/dist/antd.css"; - -class TPMRightSection extends Component { - constructor(props) { - super(props) - this.state = { - - TPMRightSection:false, - clickNewsubscripttype:false - } - } - - // componentDidMount() { - // let id=this.props.match.params.shixunId; - // - // let shixunsDetailsURL=`/shixuns/`+id+`/show_right.json`; - // - // axios.get(shixunsDetailsURL).then((response)=> { - // if(response.status===200){ - // this.setState({ - // TPMRightSectionData: response.data - // }); - // } - // }).catch((error)=>{ - // console.log(error) - // }); - // } - - // shouldComponentUpdate(nextProps, nextState) { - // return nextProps.TPMRightSectionData !== this.state.TPMRightSectionData - // } - clickNewsubscript=(val)=>{ - if(val===0){ - this.setState({ - TPMRightSection:true, - clickNewsubscripttype:true - }) - }else{ - this.setState({ - TPMRightSection:false, - clickNewsubscripttype:false - }) - } - - } - render() { - let {TPMRightSection,clickNewsubscripttype}=this.state; - let {TPMRightSectionData}=this.props - - return ( -
      - { - TPMRightSectionData===undefined?"": -
      -
      -

      创建者

      -
      - - 头像 - -
      - -

      {TPMRightSectionData===undefined?"":TPMRightSectionData.creator===undefined?"":TPMRightSectionData.creator.name}

      -
      - 发布 {TPMRightSectionData.user_shixuns_count} - {/*粉丝 {TPMRightSectionData.fans_count}*/} - {/* 取消关注 */} -
      - -
      -
      -
      - { - TPMRightSectionData === undefined ? "" :TPMRightSectionData.tags===undefined?"": TPMRightSectionData.tags.length === 0 ? "" : -
      -

      技能标签 {TPMRightSectionData.tags.length}

      -
      -
      - { TPMRightSectionData.tags.map((item,key)=>{ - return( - {item.tag_name} - )}) - } -
      -
      - - -
      15&&clickNewsubscripttype===false?"newsubscript mb9 color-grey-9":"newsubscript mb9 color-grey-9 none"} - - data-tip-down="显示全部" - onClick={()=>this.clickNewsubscript(0)}>... -
      - - -
      this.clickNewsubscript(1)}> -
      - -
      - - - } - -
      -

      推荐实训

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

      - {item.stu_num} 人学习 -

      -

      {item.level}

      -
      -
      - ) - }) - } -
      -
      - -
      -

      相关实训课程

      -
      - { - TPMRightSectionData===undefined?"":TPMRightSectionData.paths===undefined?"":TPMRightSectionData.paths.map((i,k)=>{ - - return( - -
      - - - 实训 - - -
      - {i.name} -

      - - - {i.stages_count} - - - {/**/} - {/*{i.score_count}*/} - {/**/} - - - {i.members_count} - - -

      -
      - -
      - - ) - }) - } -
      -
      - - - -
      - } -
      - ) - - - } -} - -export default TPMRightSection; +import React, { Component } from 'react'; + +import { BrowserRouter as Router, Route, Link } from "react-router-dom"; + +import axios from 'axios'; + +import { getImageUrl,} from "educoder"; + +import './TPMright.css'; + +import {Icon,Tooltip} from 'antd'; + +// import "antd/dist/antd.css"; + +class TPMRightSection extends Component { + constructor(props) { + super(props) + this.state = { + + TPMRightSection:false, + clickNewsubscripttype:false + } + } + + // componentDidMount() { + // let id=this.props.match.params.shixunId; + // + // let shixunsDetailsURL=`/shixuns/`+id+`/show_right.json`; + // + // axios.get(shixunsDetailsURL).then((response)=> { + // if(response.status===200){ + // this.setState({ + // TPMRightSectionData: response.data + // }); + // } + // }).catch((error)=>{ + // console.log(error) + // }); + // } + + // shouldComponentUpdate(nextProps, nextState) { + // return nextProps.TPMRightSectionData !== this.state.TPMRightSectionData + // } + clickNewsubscript=(val)=>{ + if(val===0){ + this.setState({ + TPMRightSection:true, + clickNewsubscripttype:true + }) + }else{ + this.setState({ + TPMRightSection:false, + clickNewsubscripttype:false + }) + } + + } + render() { + let {TPMRightSection,clickNewsubscripttype}=this.state; + let {TPMRightSectionData}=this.props + + return ( +
      + { + TPMRightSectionData===undefined?"": +
      +
      +

      创建者

      +
      + + 头像 + +
      + +

      {TPMRightSectionData===undefined?"":TPMRightSectionData.creator===undefined?"":TPMRightSectionData.creator.name}

      +
      + 发布 {TPMRightSectionData.user_shixuns_count} + {/*粉丝 {TPMRightSectionData.fans_count}*/} + {/* 取消关注 */} +
      + +
      +
      +
      + { + TPMRightSectionData === undefined ? "" :TPMRightSectionData.tags===undefined?"": TPMRightSectionData.tags.length === 0 ? "" : +
      +

      技能标签 {TPMRightSectionData.tags.length}

      +
      +
      + { TPMRightSectionData.tags.map((item,key)=>{ + return( + {item.tag_name} + )}) + } +
      +
      + + +
      15&&clickNewsubscripttype===false?"newsubscript mb9 color-grey-9":"newsubscript mb9 color-grey-9 none"} + + data-tip-down="显示全部" + onClick={()=>this.clickNewsubscript(0)}>... +
      + + +
      this.clickNewsubscript(1)}> +
      + +
      + + + } + +
      +

      推荐实训

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

      + {item.stu_num} 人学习 +

      +

      {item.level}

      +
      +
      + ) + }) + } +
      +
      + +
      +

      相关实践课程

      +
      + { + TPMRightSectionData===undefined?"":TPMRightSectionData.paths===undefined?"":TPMRightSectionData.paths.map((i,k)=>{ + + return( + +
      + + + 实训 + + +
      + {i.name} +

      + + + {i.stages_count} + + + {/**/} + {/*{i.score_count}*/} + {/**/} + + + {i.members_count} + + +

      +
      + +
      + + ) + }) + } +
      +
      + + + +
      + } +
      + ) + + + } +} + +export default TPMRightSection; diff --git a/public/react/src/modules/user/usersInfo/Infos.js b/public/react/src/modules/user/usersInfo/Infos.js index 58c0b3c4e..9c8abcde1 100644 --- a/public/react/src/modules/user/usersInfo/Infos.js +++ b/public/react/src/modules/user/usersInfo/Infos.js @@ -1,391 +1,391 @@ -import React, { Component } from 'react'; -import { SnackbarHOC } from 'educoder'; -import {Link} from 'react-router-dom'; -import {Tooltip,Menu} from 'antd'; -import Loadable from 'react-loadable'; -import Loading from '../../../Loading'; -import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; - -import axios from 'axios'; -import {getImageUrl} from 'educoder'; -import { TPMIndexHOC } from '../../tpm/TPMIndexHOC'; -import { CNotificationHOC } from '../../courses/common/CNotificationHOC' -import "./usersInfo.css" -import "../../courses/css/members.css" -import "../../courses/css/Courses.css" -import update from 'immutability-helper' - -import Trialapplication from '../../login/Trialapplication' - -const InfosCourse = Loadable({ - loader: () => import('./InfosCourse'), - loading:Loading, -}) -const InfosShixun = Loadable({ - loader: () => import('./InfosShixun'), - loading:Loading, -}) -const InfosPath = Loadable({ - loader: () => import('./InfosPath'), - loading:Loading, -}) -const InfosProject = Loadable({ - loader: () => import('./InfosProject'), - loading:Loading, -}) - -const $ = window.$; -class Infos extends Component{ - constructor(props){ - super(props); - this.state={ - data:undefined, - is_current:true, - is_edit:false, - sign:undefined, - type:0, - login:undefined, - isRenders:false, - moduleName:"courses", - next_gold:undefined - } - } - componentDidMount =()=>{ - this.getInfo(this.props.match.params.username); - } - //判断是否看的是当前用户的个人主页 - componentDidUpdate =(prevProps)=> { - if(this.props.current_user && prevProps.current_user != this.props.current_user){ - console.log(this.props); - if(this.props.current_user.login != this.props.match.params.username){ - this.setState({ - is_current:false, - login:this.props.current_user.login - }) - } - } - } - - - //获取个人主页信息 - getInfo = (user_login) =>{ - let url =`/users/${user_login}/homepage_info.json`; - axios.get(url).then((result)=>{ - if(result){ - this.setState({ - data:result.data, - followed:result.data.followed, - sign:result.data.brief_introduction, - id:result.data.id, - next_gold:result.data.tomorrow_attendance_gold - }) - } - }).catch((error)=>{ - console.log(error); - }) - } - - // 编辑签名 - editmysign=()=>{ - this.setState({ - is_edit:true - },()=>{ - $("#mysign").focus(); - }) - } - // 输入签名 - inputSign=(e)=>{ - this.setState({ - sign:e.target.value - }) - } - //取消编辑签名 - savemysign=()=>{ - let { sign } =this.state; - let url=`/users/brief_introduction.json`; - axios.post((url),{ - content:sign - }).then((result)=>{ - if(result){ - this.setState({ - is_edit:false - }) - } - }).catch((error)=>{ - console.log(error) - }) - - } - changeType=(e)=>{ - this.setState({ - type:e.key - }) - } - turnTo=(url)=>{ - this.props.history.push(url); - } - - //签到 - signFor=()=>{ - let url=`/users/attendance.json` - axios.post(url).then((result)=>{ - if(result){ - // this.setState( - // (prevState) => ({ - // data : update(prevState.data, {attendance_signed: {$set: true} }) - // }) - // ) - // this.setState({ - // next_gold:result.data.next_gold - // }) - this.getInfo(this.props.match.params.username); - } - }).catch((error)=>{ - console.log(error); - }) - } - - // 关注 - followPerson=()=>{ - let{followed,id}=this.state; - let url=`/users/${id}/watch.json`; - // 取消关注 - if(followed){ - axios.delete(url).then((result)=>{ - if(result){ - this.setState({ - followed:false - }) - } - }).catch((error)=>{ - console.log(error) - }) - }else{ - // 关注 - axios.post(url).then((result)=>{ - if(result){ - this.setState({ - followed:true - }) - } - }).catch((error)=>{ - console.log(error); - }) - } - } - - // 试用申请 - trialapplications =()=>{ - this.setState({ - isRenders: true, - showTrial:true - }) - } - cancelModulationModels=()=>{ - this.setState({ - isRenders: false - }) - } - ToBank=(url)=>{ - window.location.href=url; - } - - render(){ - let { - data , - is_current, - is_edit, - sign, - type, - followed, - id, - login, - isRenders, - moduleName, - next_gold - }=this.state; - let {username}= this.props.match.params; - - let {pathname}=this.props.location; - moduleName=pathname.split("/")[3]; - return( -
      - { - isRenders && this.cancelModulationModels()}/> - } -
      -
      -
      -
      -
      -
      -
      - {is_current ? "我":"TA"}的经验值 - {data && data.experience} -
      - -
      - {is_current ? "我":"TA"}的金币 - {data && data.grade} -
      -
      - 头像 -
      -
      - {is_current ? "我":"TA"}的粉丝 - {data && data.fan_count} -
      - -
      - {is_current ? "我":"TA"}的关注 - {data && data.follow_count} -
      - - {data && data.name} -
      -
      -
      -
      - { - data && is_current == false && data.identity =="学生" ? "" : {data && data.identity} - } - - - - - - - - - - - - - - - - - - - - - {/* */} - { - data && data.college_identifier && - - - - - - } -
      -
      -
      -

      - { - is_edit && is_current ? - - : - is_current ? - {sign || "这家伙很懒,什么都没留下~"} - : - {sign || "这家伙很懒,什么都没留下~"} - } -

      - { - is_current ? -
      - { - data && data.can_apply_trial == false ? - data.attendance_signed ? - - 已签到 -

      明日签到 +{next_gold} 金币

      -
      - : - 签到 - : - 试用申请 - } -
      - : - - } -
      -
      -
      -
    • - this.setState({moduleName: 'courses'})} - to={`/users/${username}/courses`}>课堂 -
    • -
    • - this.setState({moduleName: 'shixuns'})} - to={`/users/${username}/shixuns`}>实训 -
    • -
    • - this.setState({moduleName: 'paths'})} - to={`/users/${username}/paths`}>实训课程 -
    • -
    • - this.setState({moduleName: 'projects'})} - to={`/users/${username}/projects`}>项目 -
    • - - { data && data.identity!="学生" &&
    • 题库
    • } - -
      -
      -
      -
      -
      - - - {/* --------------------------------------------------------------------- */} - - {/* 课堂 */} - {/* http://localhost:3007/courses/1309/homework/9300/setting */} - () - } - > - - {/* 实训 */} - () - } - > - - {/* 实训课程 */} - () - } - > - - {/* 项目 */} - () - } - > - () - } - > - - -
      - ) - } -} +import React, { Component } from 'react'; +import { SnackbarHOC } from 'educoder'; +import {Link} from 'react-router-dom'; +import {Tooltip,Menu} from 'antd'; +import Loadable from 'react-loadable'; +import Loading from '../../../Loading'; +import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; + +import axios from 'axios'; +import {getImageUrl} from 'educoder'; +import { TPMIndexHOC } from '../../tpm/TPMIndexHOC'; +import { CNotificationHOC } from '../../courses/common/CNotificationHOC' +import "./usersInfo.css" +import "../../courses/css/members.css" +import "../../courses/css/Courses.css" +import update from 'immutability-helper' + +import Trialapplication from '../../login/Trialapplication' + +const InfosCourse = Loadable({ + loader: () => import('./InfosCourse'), + loading:Loading, +}) +const InfosShixun = Loadable({ + loader: () => import('./InfosShixun'), + loading:Loading, +}) +const InfosPath = Loadable({ + loader: () => import('./InfosPath'), + loading:Loading, +}) +const InfosProject = Loadable({ + loader: () => import('./InfosProject'), + loading:Loading, +}) + +const $ = window.$; +class Infos extends Component{ + constructor(props){ + super(props); + this.state={ + data:undefined, + is_current:true, + is_edit:false, + sign:undefined, + type:0, + login:undefined, + isRenders:false, + moduleName:"courses", + next_gold:undefined + } + } + componentDidMount =()=>{ + this.getInfo(this.props.match.params.username); + } + //判断是否看的是当前用户的个人主页 + componentDidUpdate =(prevProps)=> { + if(this.props.current_user && prevProps.current_user != this.props.current_user){ + console.log(this.props); + if(this.props.current_user.login != this.props.match.params.username){ + this.setState({ + is_current:false, + login:this.props.current_user.login + }) + } + } + } + + + //获取个人主页信息 + getInfo = (user_login) =>{ + let url =`/users/${user_login}/homepage_info.json`; + axios.get(url).then((result)=>{ + if(result){ + this.setState({ + data:result.data, + followed:result.data.followed, + sign:result.data.brief_introduction, + id:result.data.id, + next_gold:result.data.tomorrow_attendance_gold + }) + } + }).catch((error)=>{ + console.log(error); + }) + } + + // 编辑签名 + editmysign=()=>{ + this.setState({ + is_edit:true + },()=>{ + $("#mysign").focus(); + }) + } + // 输入签名 + inputSign=(e)=>{ + this.setState({ + sign:e.target.value + }) + } + //取消编辑签名 + savemysign=()=>{ + let { sign } =this.state; + let url=`/users/brief_introduction.json`; + axios.post((url),{ + content:sign + }).then((result)=>{ + if(result){ + this.setState({ + is_edit:false + }) + } + }).catch((error)=>{ + console.log(error) + }) + + } + changeType=(e)=>{ + this.setState({ + type:e.key + }) + } + turnTo=(url)=>{ + this.props.history.push(url); + } + + //签到 + signFor=()=>{ + let url=`/users/attendance.json` + axios.post(url).then((result)=>{ + if(result){ + // this.setState( + // (prevState) => ({ + // data : update(prevState.data, {attendance_signed: {$set: true} }) + // }) + // ) + // this.setState({ + // next_gold:result.data.next_gold + // }) + this.getInfo(this.props.match.params.username); + } + }).catch((error)=>{ + console.log(error); + }) + } + + // 关注 + followPerson=()=>{ + let{followed,id}=this.state; + let url=`/users/${id}/watch.json`; + // 取消关注 + if(followed){ + axios.delete(url).then((result)=>{ + if(result){ + this.setState({ + followed:false + }) + } + }).catch((error)=>{ + console.log(error) + }) + }else{ + // 关注 + axios.post(url).then((result)=>{ + if(result){ + this.setState({ + followed:true + }) + } + }).catch((error)=>{ + console.log(error); + }) + } + } + + // 试用申请 + trialapplications =()=>{ + this.setState({ + isRenders: true, + showTrial:true + }) + } + cancelModulationModels=()=>{ + this.setState({ + isRenders: false + }) + } + ToBank=(url)=>{ + window.location.href=url; + } + + render(){ + let { + data , + is_current, + is_edit, + sign, + type, + followed, + id, + login, + isRenders, + moduleName, + next_gold + }=this.state; + let {username}= this.props.match.params; + + let {pathname}=this.props.location; + moduleName=pathname.split("/")[3]; + return( +
      + { + isRenders && this.cancelModulationModels()}/> + } +
      +
      +
      +
      +
      +
      +
      + {is_current ? "我":"TA"}的经验值 + {data && data.experience} +
      + +
      + {is_current ? "我":"TA"}的金币 + {data && data.grade} +
      +
      + 头像 +
      +
      + {is_current ? "我":"TA"}的粉丝 + {data && data.fan_count} +
      + +
      + {is_current ? "我":"TA"}的关注 + {data && data.follow_count} +
      + + {data && data.name} +
      +
      +
      +
      + { + data && is_current == false && data.identity =="学生" ? "" : {data && data.identity} + } + + + + + + + + + + + + + + + + + + + + + {/* */} + { + data && data.college_identifier && + + + + + + } +
      +
      +
      +

      + { + is_edit && is_current ? + + : + is_current ? + {sign || "这家伙很懒,什么都没留下~"} + : + {sign || "这家伙很懒,什么都没留下~"} + } +

      + { + is_current ? +
      + { + data && data.can_apply_trial == false ? + data.attendance_signed ? + + 已签到 +

      明日签到 +{next_gold} 金币

      +
      + : + 签到 + : + 试用申请 + } +
      + : + + } +
      +
      +
      +
    • + this.setState({moduleName: 'courses'})} + to={`/users/${username}/courses`}>课堂 +
    • +
    • + this.setState({moduleName: 'shixuns'})} + to={`/users/${username}/shixuns`}>实训 +
    • +
    • + this.setState({moduleName: 'paths'})} + to={`/users/${username}/paths`}>实践课程 +
    • +
    • + this.setState({moduleName: 'projects'})} + to={`/users/${username}/projects`}>项目 +
    • + + { data && data.identity!="学生" &&
    • 题库
    • } + +
      +
      +
      +
      +
      + + + {/* --------------------------------------------------------------------- */} + + {/* 课堂 */} + {/* http://localhost:3007/courses/1309/homework/9300/setting */} + () + } + > + + {/* 实训 */} + () + } + > + + {/* 实训课程 */} + () + } + > + + {/* 项目 */} + () + } + > + () + } + > + + +
      + ) + } +} export default CNotificationHOC() ( SnackbarHOC() ( TPMIndexHOC(Infos) )); \ No newline at end of file diff --git a/public/react/src/modules/user/usersInfo/InfosPath.js b/public/react/src/modules/user/usersInfo/InfosPath.js index 0cd74cfd2..6e5fa247d 100644 --- a/public/react/src/modules/user/usersInfo/InfosPath.js +++ b/public/react/src/modules/user/usersInfo/InfosPath.js @@ -1,197 +1,197 @@ -import React, { Component } from 'react'; -import { SnackbarHOC } from 'educoder'; -import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; -import {Tooltip,Menu,Pagination, Spin} from 'antd'; -import Loadable from 'react-loadable'; -import Loading from '../../../Loading'; -import NoneData from '../../courses/coursesPublic/NoneData' -import axios from 'axios'; -import {getImageUrl,setImagesUrl} from 'educoder'; -import { TPMIndexHOC } from '../../tpm/TPMIndexHOC'; -import { CNotificationHOC } from '../../courses/common/CNotificationHOC' -import "./usersInfo.css" - -import Create from './publicCreatNew' - -class InfosPath extends Component{ - constructor(props){ - super(props); - this.state={ - category:undefined, - page:1, - sort_by:'time', - status:undefined, - per_page:16, - isSpin:false, - - totalCount:undefined, - data:undefined - } - } - - componentDidMount=()=>{ - this.setState({ - isSpin:true - }) - let{category,status,sort_by,page,per_page}=this.state; - this.getCourses(category,status,sort_by,page,per_page); - } - - getCourses=(category,status,sort_by,page,per_page)=>{ - let url=`/users/${this.props.match.params.username}/subjects.json`; - axios.get((url),{params:{ - category, - status, - sort_by, - page, - per_page:this.props.is_current && category && page ==1?17:16 - }}).then((result)=>{ - if(result){ - this.setState({ - totalCount:result.data.count, - data:result.data, - isSpin:false - }) - } - }).catch((error)=>{ - console.log(error); - }) - } - - //切换种类 - changeCategory=(cate)=>{ - this.setState({ - category:cate, - status:undefined, - page:1, - isSpin:true - }) - let{sort_by}=this.state; - this.getCourses(cate,undefined,sort_by,1); - } - // 切换状态 - changeStatus=(status)=>{ - let{category,sort_by}=this.state; - this.setState({ - status, - page:1, - isSpin:true - }) - this.getCourses(category,status,sort_by,1); - } - //切换页数 - changePage=(page)=>{ - this.setState({ - page, - isSpin:true - }) - let{category,sort_by,status}=this.state; - this.getCourses(category,status,sort_by,page); - } - - // 进入课堂 - turnToCourses=(url)=>{ - this.props.history.push(url); - } - - - // 切换排序方式 - changeOrder= (sort)=>{ - this.setState({ - sort_by:sort, - isSpin:true - }) - let{category,status,page}=this.state; - this.getCourses(category,status,sort,page); - } - - render(){ - let{ - category, - status, - sort_by, - page, - data, - totalCount, - isSpin - } = this.state; - let isStudent = this.props.isStudent(); - let is_current=this.props.is_current; - return( -
      - - - { - category && category == "manage" && is_current && - - } - { - category && category == "study" && is_current && - - } -
      - 共参与{totalCount}个{category?category=="manage"?"发布":"学习":"实训课程"} - 时间最新 -
      -
      - { - !isStudent && page == 1 && !category && is_current && - - } - { - (!data || data.subjects.length==0) && (isStudent || category) && - } - { - data && data.subjects && data.subjects.map((item,key)=>{ - return( -
      this.turnToCourses(`/paths/${item.id}`)}> - { - item.tag &&
      {item.tag}
      - } - Subject12 -
      -

      - {item.name} -

      -
      -

      - {item.owner_name} - - - - - {item.visits_count} - -

      -
      -
      -
      - ) - }) - } -
      - { - totalCount > 15 && -
      - -
      - } -
      -
      - ) - } -} +import React, { Component } from 'react'; +import { SnackbarHOC } from 'educoder'; +import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; +import {Tooltip,Menu,Pagination, Spin} from 'antd'; +import Loadable from 'react-loadable'; +import Loading from '../../../Loading'; +import NoneData from '../../courses/coursesPublic/NoneData' +import axios from 'axios'; +import {getImageUrl,setImagesUrl} from 'educoder'; +import { TPMIndexHOC } from '../../tpm/TPMIndexHOC'; +import { CNotificationHOC } from '../../courses/common/CNotificationHOC' +import "./usersInfo.css" + +import Create from './publicCreatNew' + +class InfosPath extends Component{ + constructor(props){ + super(props); + this.state={ + category:undefined, + page:1, + sort_by:'time', + status:undefined, + per_page:16, + isSpin:false, + + totalCount:undefined, + data:undefined + } + } + + componentDidMount=()=>{ + this.setState({ + isSpin:true + }) + let{category,status,sort_by,page,per_page}=this.state; + this.getCourses(category,status,sort_by,page,per_page); + } + + getCourses=(category,status,sort_by,page,per_page)=>{ + let url=`/users/${this.props.match.params.username}/subjects.json`; + axios.get((url),{params:{ + category, + status, + sort_by, + page, + per_page:this.props.is_current && category && page ==1?17:16 + }}).then((result)=>{ + if(result){ + this.setState({ + totalCount:result.data.count, + data:result.data, + isSpin:false + }) + } + }).catch((error)=>{ + console.log(error); + }) + } + + //切换种类 + changeCategory=(cate)=>{ + this.setState({ + category:cate, + status:undefined, + page:1, + isSpin:true + }) + let{sort_by}=this.state; + this.getCourses(cate,undefined,sort_by,1); + } + // 切换状态 + changeStatus=(status)=>{ + let{category,sort_by}=this.state; + this.setState({ + status, + page:1, + isSpin:true + }) + this.getCourses(category,status,sort_by,1); + } + //切换页数 + changePage=(page)=>{ + this.setState({ + page, + isSpin:true + }) + let{category,sort_by,status}=this.state; + this.getCourses(category,status,sort_by,page); + } + + // 进入课堂 + turnToCourses=(url)=>{ + this.props.history.push(url); + } + + + // 切换排序方式 + changeOrder= (sort)=>{ + this.setState({ + sort_by:sort, + isSpin:true + }) + let{category,status,page}=this.state; + this.getCourses(category,status,sort,page); + } + + render(){ + let{ + category, + status, + sort_by, + page, + data, + totalCount, + isSpin + } = this.state; + let isStudent = this.props.isStudent(); + let is_current=this.props.is_current; + return( +
      + + + { + category && category == "manage" && is_current && + + } + { + category && category == "study" && is_current && + + } +
      + 共参与{totalCount}个{category?category=="manage"?"发布":"学习":"实践课程"} + 时间最新 +
      +
      + { + !isStudent && page == 1 && !category && is_current && + + } + { + (!data || data.subjects.length==0) && (isStudent || category) && + } + { + data && data.subjects && data.subjects.map((item,key)=>{ + return( +
      this.turnToCourses(`/paths/${item.id}`)}> + { + item.tag &&
      {item.tag}
      + } + Subject12 +
      +

      + {item.name} +

      +
      +

      + {item.owner_name} + + + + + {item.visits_count} + +

      +
      +
      +
      + ) + }) + } +
      + { + totalCount > 15 && +
      + +
      + } +
      +
      + ) + } +} export default InfosPath; \ No newline at end of file From 1f1a041f6fcc859abf53fad57bf0185c34b63c12 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 4 Jul 2019 15:49:15 +0800 Subject: [PATCH 06/15] scroll --- public/react/src/App.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/public/react/src/App.js b/public/react/src/App.js index 15105f749..85267a4e6 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -224,7 +224,11 @@ class App extends Component { componentDidMount() { // force an update if the URL changes - history.listen(() => this.forceUpdate()); + history.listen(() => { + this.forceUpdate() + const $ = window.$ + $("html").animate({ scrollTop: $('html').scrollTop() - 0 }) + }); initAxiosInterceptors(this.props) From 48b9615f3ca8a1918190fde88f7534ab15b60331 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 4 Jul 2019 15:56:11 +0800 Subject: [PATCH 07/15] =?UTF-8?q?https://www.trustie.net/issues/21919=20?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E4=BC=9A=E6=9C=89=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/App.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/react/src/App.js b/public/react/src/App.js index 85267a4e6..f7530989e 100644 --- a/public/react/src/App.js +++ b/public/react/src/App.js @@ -227,6 +227,7 @@ class App extends Component { history.listen(() => { this.forceUpdate() const $ = window.$ + // https://www.trustie.net/issues/21919 可能会有问题 $("html").animate({ scrollTop: $('html').scrollTop() - 0 }) }); From c9458c88008504e3c36a1033f7d643f9467abe40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 4 Jul 2019 16:24:00 +0800 Subject: [PATCH 08/15] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/shixunHomework/ShixunStudentWork.js | 4 ++-- .../src/modules/tpm/challengesnew/css/TPMchallengesnew.css | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/ShixunStudentWork.js b/public/react/src/modules/courses/shixunHomework/ShixunStudentWork.js index f5029d9c5..4f1ddb027 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunStudentWork.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunStudentWork.js @@ -572,10 +572,10 @@ class ShixunStudentWork extends Component {

    - {data&&data.homework_name} + {jobsettingsdata === undefined ? "" : jobsettingsdata.data.homework_name}

    返回 diff --git a/public/react/src/modules/tpm/challengesnew/css/TPMchallengesnew.css b/public/react/src/modules/tpm/challengesnew/css/TPMchallengesnew.css index 9a8af13e7..fb23ba4b8 100644 --- a/public/react/src/modules/tpm/challengesnew/css/TPMchallengesnew.css +++ b/public/react/src/modules/tpm/challengesnew/css/TPMchallengesnew.css @@ -60,7 +60,7 @@ a{ #exercisememoMD .CodeMirror { margin-top: 31px !important; - height: 700px !important; + height: 374px !important; /*width: 579px !important;*/ } @@ -125,7 +125,7 @@ a{ #neweditanswer .editormd-preview { top: 40px !important; height: 364px !important; - width: 578px !important; + width: 551px !important; } #repository_url_tip { From e8f91c68f29e2051df22cd1c7473c9dd53de106f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 4 Jul 2019 16:28:03 +0800 Subject: [PATCH 09/15] b --- public/react/config/webpack.config.dev.js | 41 +++++++++++++++++ public/react/config/webpack.config.prod.js | 52 ++++++++++++++-------- 2 files changed, 75 insertions(+), 18 deletions(-) diff --git a/public/react/config/webpack.config.dev.js b/public/react/config/webpack.config.dev.js index 2fc1bbe64..48e4f7f52 100644 --- a/public/react/config/webpack.config.dev.js +++ b/public/react/config/webpack.config.dev.js @@ -9,6 +9,7 @@ const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin'); const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin'); const eslintFormatter = require('react-dev-utils/eslintFormatter'); const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); +const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin'); // const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); const getClientEnvironment = require('./env'); const paths = require('./paths'); @@ -249,6 +250,46 @@ module.exports = { // https://github.com/jmblog/how-to-optimize-momentjs-with-webpack // You can remove this if you don't use Moment.js: new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), + new ParallelUglifyPlugin({ + // 传递给 UglifyJS的参数如下: + uglifyJS: { + output: { + /* + 是否输出可读性较强的代码,即会保留空格和制表符,默认为输出,为了达到更好的压缩效果, + 可以设置为false + */ + beautify: false, + /* + 是否保留代码中的注释,默认为保留,为了达到更好的压缩效果,可以设置为false + */ + comments: false + }, + compress: { + /* + 是否在UglifyJS删除没有用到的代码时输出警告信息,默认为输出,可以设置为false关闭这些作用 + 不大的警告 + */ + warnings: false, + + /* + 是否删除代码中所有的console语句,默认为不删除,开启后,会删除所有的console语句 + */ + drop_console: true, + + /* + 是否内嵌虽然已经定义了,但是只用到一次的变量,比如将 var x = 1; y = x, 转换成 y = 5, 默认为不 + 转换,为了达到更好的压缩效果,可以设置为false + */ + collapse_vars: true, + + /* + 是否提取出现了多次但是没有定义成变量去引用的静态值,比如将 x = 'xxx'; y = 'xxx' 转换成 + var a = 'xxxx'; x = a; y = a; 默认为不转换,为了达到更好的压缩效果,可以设置为false + */ + reduce_vars: true + } + } + }), ], // Some libraries import Node modules but don't use them in the browser. // Tell Webpack to provide empty mocks for them so importing them works. diff --git a/public/react/config/webpack.config.prod.js b/public/react/config/webpack.config.prod.js index abeb58db9..e70e04fac 100644 --- a/public/react/config/webpack.config.prod.js +++ b/public/react/config/webpack.config.prod.js @@ -10,6 +10,8 @@ const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin'); const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin'); const eslintFormatter = require('react-dev-utils/eslintFormatter'); const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); +const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin'); + const paths = require('./paths'); const getClientEnvironment = require('./env'); @@ -270,25 +272,39 @@ module.exports = { // Otherwise React will be compiled in the very slow development mode. new webpack.DefinePlugin(env.stringified), // Minify the code. - new webpack.optimize.UglifyJsPlugin({ - compress: { + // new webpack.optimize.UglifyJsPlugin({ + // compress: { + // warnings: false, + // // Disabled because of an issue with Uglify breaking seemingly valid code: + // // https://github.com/facebookincubator/create-react-app/issues/2376 + // // Pending further investigation: + // // https://github.com/mishoo/UglifyJS2/issues/2011 + // comparisons: false, + // }, + // mangle: { + // safari10: true, + // }, + // output: { + // comments: false, + // // Turned on because emoji and regex is not minified properly using default + // // https://github.com/facebookincubator/create-react-app/issues/2488 + // ascii_only: true, + // }, + // sourceMap: shouldUseSourceMap, + // }), + + new ParallelUglifyPlugin({ + cacheDir: '.cache/', + uglifyJS:{ + output: { + comments: false + }, warnings: false, - // Disabled because of an issue with Uglify breaking seemingly valid code: - // https://github.com/facebookincubator/create-react-app/issues/2376 - // Pending further investigation: - // https://github.com/mishoo/UglifyJS2/issues/2011 - comparisons: false, - }, - mangle: { - safari10: true, - }, - output: { - comments: false, - // Turned on because emoji and regex is not minified properly using default - // https://github.com/facebookincubator/create-react-app/issues/2488 - ascii_only: true, - }, - sourceMap: shouldUseSourceMap, + compress: { + drop_debugger: true, + drop_console: true + } + } }), // Note: this won't work without ExtractTextPlugin.extract(..) in `loaders`. new ExtractTextPlugin({ From 648262012036ddbbb912e6a75e2216e5d71597ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 4 Jul 2019 16:36:32 +0800 Subject: [PATCH 10/15] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 113 +++---- public/react/config/webpack.config.dev.js | 309 ----------------- public/react/config/webpack.config.prod.js | 365 --------------------- 3 files changed, 57 insertions(+), 730 deletions(-) delete mode 100644 public/react/config/webpack.config.dev.js delete mode 100644 public/react/config/webpack.config.prod.js diff --git a/.gitignore b/.gitignore index ecc3e003a..18e26e891 100644 --- a/.gitignore +++ b/.gitignore @@ -1,56 +1,57 @@ -# See https://help.github.com/articles/ignoring-files for more about ignoring files. -# -# If you find yourself ignoring temporary files generated by your text editor -# or operating system, you probably want to add a global ignore instead: -# git config --global core.excludesfile '~/.gitignore_global' - -# Ignore bundler config. -/.bundle - -# mac -*.DS_Store - -# Ignore all logfiles and tempfiles. -/log/* -/tmp/* -!/log/.keep -!/tmp/.keep - -# Ignore uploaded files in development -/storage/* - -/node_modules -/yarn-error.log - -# /public/assets -.byebug_history - -# Ignore master key for decrypting credentials and more. -/config/master.key -/config/database.yml -/.idea/* - -# Ignore react node_modules -/public/react/build -/public/react/build/ -/public/react/node_modules/ -/public/react/config/stats.json -/public/react/stats.json - -/public/npm-debug.log - -# avatars -/public/images/avatars - -/config/secrets.yml -/files/archiveZip/* -/files/cache_store/* -public/upload.html -/config/configuration.yml -/config/initializers/gitlab_config.rb -/db/schema.rb -.vscode/ -vendor/bundle/ -.ruby-version -.ruby-gemset - +# See https://help.github.com/articles/ignoring-files for more about ignoring files. +# +# If you find yourself ignoring temporary files generated by your text editor +# or operating system, you probably want to add a global ignore instead: +# git config --global core.excludesfile '~/.gitignore_global' + +# Ignore bundler config. +/.bundle + +# mac +*.DS_Store + +# Ignore all logfiles and tempfiles. +/log/* +/tmp/* +!/log/.keep +!/tmp/.keep + +# Ignore uploaded files in development +/storage/* + +/node_modules +/yarn-error.log + +# /public/assets +.byebug_history + +# Ignore master key for decrypting credentials and more. +/config/master.key +/config/database.yml +/.idea/* + +# Ignore react node_modules +/public/react/build +/public/react/build/ +/public/react/.cache +/public/react/node_modules/ +/public/react/config/stats.json +/public/react/stats.json + +/public/npm-debug.log + +# avatars +/public/images/avatars + +/config/secrets.yml +/files/archiveZip/* +/files/cache_store/* +public/upload.html +/config/configuration.yml +/config/initializers/gitlab_config.rb +/db/schema.rb +.vscode/ +vendor/bundle/ +.ruby-version +.ruby-gemset + diff --git a/public/react/config/webpack.config.dev.js b/public/react/config/webpack.config.dev.js deleted file mode 100644 index 48e4f7f52..000000000 --- a/public/react/config/webpack.config.dev.js +++ /dev/null @@ -1,309 +0,0 @@ -'use strict'; - -const autoprefixer = require('autoprefixer'); -const path = require('path'); -const webpack = require('webpack'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); -const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); -const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin'); -const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin'); -const eslintFormatter = require('react-dev-utils/eslintFormatter'); -const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin'); -const ParallelUglifyPlugin = require('webpack-parallel-uglify-plugin'); -// const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin'); -const getClientEnvironment = require('./env'); -const paths = require('./paths'); - -// Webpack uses `publicPath` to determine where the app is being served from. -// In development, we always serve from the root. This makes config easier. -const publicPath = '/'; -// `publicUrl` is just like `publicPath`, but we will provide it to our app -// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript. -// Omit trailing slash as %PUBLIC_PATH%/xyz looks better than %PUBLIC_PATH%xyz. -const publicUrl = ''; -// Get environment variables to inject into our app. -const env = getClientEnvironment(publicUrl); - -// This is the development configuration. -// It is focused on developer experience and fast rebuilds. -// The production configuration is different and lives in a separate file. -module.exports = { - // 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. - devtool: 'cheap-module-source-map', - // These are the "entry points" to our application. - // 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. - entry: [ - // We ship a few polyfills by default: - require.resolve('./polyfills'), - // Include an alternative client for WebpackDevServer. A client's job is to - // connect to WebpackDevServer by a socket and get notified about changes. - // When you save a file, the client will either apply hot updates (in case - // of CSS changes), or refresh the page (in case of JS changes). When you - // make a syntax error, this client will display a syntax error overlay. - // Note: instead of the default WebpackDevServer client, we use a custom one - // to bring better experience for Create React App users. You can replace - // the line below with these two lines if you prefer the stock client: - // require.resolve('webpack-dev-server/client') + '?/', - // require.resolve('webpack/hot/dev-server'), - require.resolve('react-dev-utils/webpackHotDevClient'), - // Finally, this is your app's code: - paths.appIndexJs, - // We include the app code last so that if there is a runtime error during - // initialization, it doesn't blow up the WebpackDevServer client, and - // changing JS code would still trigger a refresh. - ], - output: { - // Add /* filename */ comments to generated require()s in the output. - pathinfo: true, - // This does not produce a real file. It's just the virtual path that is - // served by WebpackDevServer in development. This is the JS bundle - // containing code from all our entry points, and the Webpack runtime. - filename: 'static/js/bundle.js', - // There are also additional JS chunk files if you use code splitting. - chunkFilename: 'static/js/[name].chunk.js', - // This is the URL that app is served from. We use "/" in development. - publicPath: publicPath, - // Point sourcemap entries to original disk location (format as URL on Windows) - devtoolModuleFilenameTemplate: info => - path.resolve(info.absoluteResourcePath).replace(/\\/g, '/'), - }, - resolve: { - // This allows you to set a fallback for where Webpack should look for modules. - // We placed these paths second because we want `node_modules` to "win" - // if there are any conflicts. This matches Node resolution mechanism. - // https://github.com/facebookincubator/create-react-app/issues/253 - modules: ['node_modules', paths.appNodeModules].concat( - // It is guaranteed to exist because we tweak it in `env.js` - process.env.NODE_PATH.split(path.delimiter).filter(Boolean) - ), - // These are the reasonable defaults supported by the Node ecosystem. - // We also include JSX as a common component filename extension to support - // some tools, although we do not recommend using it, see: - // https://github.com/facebookincubator/create-react-app/issues/290 - // `web` extension prefixes have been added for better support - // for React Native Web. - extensions: ['.web.js', '.mjs', '.js', '.json', '.web.jsx', '.jsx'], - alias: { - - "educoder": __dirname + "/../src/common/educoder.js", - // Support React Native Web - // https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/ - 'react-native': 'react-native-web', - }, - plugins: [ - // Prevents users from importing files from outside of src/ (or node_modules/). - // This often causes confusion because we only process files within src/ with babel. - // To fix this, we prevent you from importing files out of src/ -- if you'd like to, - // please link the files into your node_modules/ and let module-resolution kick in. - // Make sure your source files are compiled, as they will not be processed in any way. - new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]), - // MonacoEditor - // https://github.com/Microsoft/monaco-editor/blob/master/docs/integrate-esm.md - // https://github.com/Microsoft/monaco-editor-webpack-plugin/issues/56 - // new MonacoWebpackPlugin(), - ], - }, - module: { - strictExportPresence: true, - rules: [ - // TODO: Disable require.ensure as it's not a standard language feature. - // We are waiting for https://github.com/facebookincubator/create-react-app/issues/2176. - // { parser: { requireEnsure: false } }, - - // First, run the linter. - // It's important to do this before Babel processes the JS. - // { - // test: /\.(js|jsx|mjs)$/, - // enforce: 'pre', - // use: [ - // { - // options: { - // formatter: eslintFormatter, - // eslintPath: require.resolve('eslint'), - // - // }, - // loader: require.resolve('eslint-loader'), - // }, - // ], - // include: paths.appSrc, - // }, - { - // "oneOf" will traverse all following loaders until one will - // match the requirements. When no loader matches it will fall - // back to the "file" loader at the end of the loader list. - oneOf: [ - // "url" loader works like "file" loader except that it embeds assets - // smaller than specified limit in bytes as data URLs to avoid requests. - // A missing `test` is equivalent to a match. - { - test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/], - loader: require.resolve('url-loader'), - options: { - limit: 10000, - name: 'static/media/[name].[hash:8].[ext]', - }, - }, - // Process JS with Babel. - { - test: /\.(js|jsx|mjs)$/, - include: paths.appSrc, - loader: require.resolve('babel-loader'), - options: { - - // This is a feature of `babel-loader` for webpack (not Babel itself). - // It enables caching results in ./node_modules/.cache/babel-loader/ - // directory for faster rebuilds. - cacheDirectory: true, - }, - }, - // "postcss" loader applies autoprefixer to our CSS. - // "css" loader resolves paths in CSS and adds assets as dependencies. - // "style" loader turns CSS into JS modules that inject