Merge branches 'dev_aliyun' and 'dev_cxt2' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_cxt2

dev_auth
杨树明 5 years ago
commit 72e2ea1665

@ -62,7 +62,7 @@ module CoursesHelper
course_board = course.course_board course_board = course.course_board
"/courses/#{course.id}/boards/#{course_board.id}" "/courses/#{course.id}/boards/#{course_board.id}"
when "course_group" when "course_group"
"/courses/#{course.id}/students" "/courses/#{course.id}/course_groups"
end end
end end

@ -642,6 +642,14 @@ class User < ApplicationRecord
login login
end end
def bind_open_user?(type)
case type
when 'wechat' then wechat_open_user.present?
when 'qq' then qq_open_user.present?
else false
end
end
protected protected
def validate_password_length def validate_password_length
# 管理员的初始密码是5位 # 管理员的初始密码是5位

@ -17,6 +17,7 @@ class CreateBindUserService < ApplicationService
bind_user = User.try_to_login(params[:username], params[:password]) bind_user = User.try_to_login(params[:username], params[:password])
raise Error, '用户名或者密码错误' if bind_user.blank? raise Error, '用户名或者密码错误' if bind_user.blank?
raise Error, '该账号已被绑定' if bind_user.bind_open_user?(params[:type].to_s)
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
open_user.user_id = bind_user.id open_user.user_id = bind_user.id

@ -2,9 +2,9 @@ json.setting do
setting = @laboratory.laboratory_setting setting = @laboratory.laboratory_setting
json.name setting.name || default_setting.name json.name setting.name || default_setting.name
json.nav_logo_url setting.nav_logo_url || default_setting.nav_logo_url json.nav_logo_url (setting.nav_logo_url || default_setting.nav_logo_url)&.[](1..-1)
json.login_logo_url setting.login_logo_url || default_setting.login_logo_url json.login_logo_url (setting.login_logo_url || default_setting.login_logo_url)&.[](1..-1)
json.tab_logo_url setting.tab_logo_url || default_setting.tab_logo_url json.tab_logo_url (setting.tab_logo_url || default_setting.tab_logo_url)&.[](1..-1)
json.navbar setting.navbar || default_setting.navbar json.navbar setting.navbar || default_setting.navbar

@ -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.

@ -8,7 +8,9 @@
<!-- width=device-width, initial-scale=1 , shrink-to-fit=no --> <!-- width=device-width, initial-scale=1 , shrink-to-fit=no -->
<!-- <meta name="viewport" content=""> --> <!-- <meta name="viewport" content=""> -->
<meta name="theme-color" content="#000000"> <meta name="theme-color" content="#000000">
<meta http-equiv="cache-control" content="no-cache,no-store, must-revalidate" />
<meta http-equiv="pragma" content="no-cache" />
<meta http-equiv="Expires" content="0" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json"> <link rel="manifest" href="%PUBLIC_URL%/manifest.json">
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico"> <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">

@ -8,20 +8,20 @@ class WordsBtn extends Component {
} }
render() { render() {
let{to, href,targets, style2 }=this.props let{to, href,targets, style2, style, className, ...others }=this.props
return( return(
<React.Fragment> <React.Fragment>
{ {
to==undefined&&targets==undefined ? to==undefined&&targets==undefined ?
<a href={href || "javascript:void(0)"} onClick={this.props.onClick} className={"btn "+`${map[this.props.style]} ${this.props.className}`} <a href={href || "javascript:void(0)"} onClick={this.props.onClick} className={"btn "+`${map[this.props.style]} ${this.props.className}`}
style={style2} style={style2} {...others}
>{this.props.children}</a>: >{this.props.children}</a>:
targets!=undefined? <a href={to} target="_blank" className={"btn "+`${map[this.props.style]} ${this.props.className}`} targets!=undefined? <a href={to} target="_blank" className={"btn "+`${map[this.props.style]} ${this.props.className}`}
style={style2} style={style2} {...others}
>{this.props.children}</a> >{this.props.children}</a>
: :
<Link to={to} className={"btn "+`${map[this.props.style]} ${this.props.className}`} <Link to={to} className={"btn "+`${map[this.props.style]} ${this.props.className}`}
style={style2} style={style2} {...others}
>{this.props.children}</Link> >{this.props.children}</Link>
} }
</React.Fragment> </React.Fragment>

@ -33,6 +33,12 @@ const StudentsList= Loadable({
loader: () => import('./members/studentsList'), loader: () => import('./members/studentsList'),
loading: Loading, loading: Loading,
}); });
//分班列表
const CourseGroupList= Loadable({
loader: () => import('./members/CourseGroupList'),
loading: Loading,
});
const Eduinforms= Loadable({ const Eduinforms= Loadable({
loader: () => import('./gradinforms/Eduinforms.js'), loader: () => import('./gradinforms/Eduinforms.js'),
loading: Loading, loading: Loading,
@ -234,7 +240,7 @@ class ListPageIndex extends Component{
></Route> ></Route>
<Route path="/courses/:coursesId/course_groups" <Route path="/courses/:coursesId/course_groups"
render={ render={
(props) => (<StudentsList {...this.props} {...props} {...this.state} />) (props) => (<CourseGroupList {...this.props} {...props} {...this.state} />)
} }
></Route> ></Route>

@ -275,25 +275,26 @@ class Fileslistitem extends Component{
` `
} }
</style> </style>
{discussMessage.course_groups.length===0?"": {/*资源分班*/}
<p className="color-grey panel-lightgrey mt8 fl lightgreybox ml30" style={{width:'100%'}}> {/*{discussMessage.course_groups.length===0?"":*/}
{discussMessage.course_groups.map((item,key)=>{ {/*<p className="color-grey panel-lightgrey mt8 fl lightgreybox ml30" style={{width:'100%'}}>*/}
return( {/*{discussMessage.course_groups.map((item,key)=>{*/}
<div className="mr50"> {/*return(*/}
<span className="mr15 color-dark">{item.course_group_name}</span> {/*<div className="mr50">*/}
<span className="mr15 color-grey9 ">将发布于 { moment(item.course_group_publish_time).format('YYYY-MM-DD HH:mm')}</span> {/*<span className="mr15 color-dark">{item.course_group_name}</span>*/}
</div> {/*<span className="mr15 color-grey9 ">将发布于 { moment(item.course_group_publish_time).format('YYYY-MM-DD HH:mm')}</span>*/}
) {/*</div>*/}
})} {/*)*/}
{/*})}*/}
</p>}
{/*</p>}*/}
<p className={this.props.isAdmin===true?"color-grey panel-lightgrey mt8 fl ml30":"color-grey panel-lightgrey mt8 fl ml13"} style={{width:'100%'}}> <p className={this.props.isAdmin===true?"color-grey panel-lightgrey mt8 fl ml30":"color-grey panel-lightgrey mt8 fl ml13"} style={{width:'100%'}}>
<span className="mr50"> <span className="mr50">
<span className="mr15 color-dark">{discussMessage.author.name}</span> <span className="mr15 color-dark">{discussMessage.author.name}</span>
<span className="mr15 color-grey9">大小 {discussMessage.filesize}</span> <span className="mr15 color-grey9">大小 {discussMessage.filesize}</span>
<span className="mr15 color-grey9">下载 {discussMessage.downloads_count}</span> <span className="mr15 color-grey9">下载 {discussMessage.downloads_count}</span>
<span className="mr15 color-grey9">引用 {discussMessage.quotes}</span> {/*<span className="mr15 color-grey9">引用 {discussMessage.quotes}</span>*/}
<span className="mr15 color-grey-c"> <span className="mr15 color-grey-c">
{/*{moment(discussMessage.publish_time).format('YYYY-MM-DD HH:mm:ss')}*/} {/*{moment(discussMessage.publish_time).format('YYYY-MM-DD HH:mm:ss')}*/}
{/*{moment(discussMessage.publish_time).fromNow()}*/} {/*{moment(discussMessage.publish_time).fromNow()}*/}

@ -51,8 +51,14 @@ class Fileslists extends Component{
}) })
if(this.props.match.params.main_id){ if(this.props.match.params.main_id){
this.seactall(); this.seactall();
this.setState({
child:false,
})
}else if(this.props.match.params.Id){ }else if(this.props.match.params.Id){
this.seactall(parseInt(this.props.match.params.Id),1) this.seactall(parseInt(this.props.match.params.Id),1)
this.setState({
child:true,
})
} }
this.updadatalist(); this.updadatalist();
on('updateNavSuccess', this.updateNavSuccess) on('updateNavSuccess', this.updateNavSuccess)
@ -74,9 +80,12 @@ class Fileslists extends Component{
this.setState({ this.setState({
isSpin:true, isSpin:true,
checkBoxValues:[], checkBoxValues:[],
checkAllValue:false checkAllValue:false,
}) })
if(this.props.match.params.main_id!=undefined){ if(this.props.match.params.main_id!=undefined){
this.setState({
child:false,
})
this.seactall(); this.seactall();
} }
} }
@ -84,31 +93,15 @@ class Fileslists extends Component{
this.setState({ this.setState({
isSpin:true, isSpin:true,
checkBoxValues:[], checkBoxValues:[],
checkAllValue:false checkAllValue:false,
}) })
if(this.props.match.params.Id!=undefined){ if(this.props.match.params.Id!=undefined){
this.setState({
child:true,
})
this.seactall(parseInt(this.props.match.params.Id),1) this.seactall(parseInt(this.props.match.params.Id),1)
} }
} }
// if ( prevProps.match.params.Id != this.props.match.params.Id ||prevProps.isaloadtype!= this.props.isaloadtype) {
// let lists=this.props.course_modules;
// if(lists!=undefined){
// debugger
// let url=this.props.location.pathname;
// lists.forEach((item,index)=>{
// if(url===item.category_url){
// this.seactall();
// }
// if(item.second_category!=undefined&&item.second_category.length!=0){
// item.second_category.forEach((iem,key)=>{
// if(url===iem.second_category_url){
// this.seactall(parseInt(this.props.match.params.Id),2);
// }
// })
// }
// })
// }
// }
} }
updadatalist=(id)=>{ updadatalist=(id)=>{
@ -188,23 +181,27 @@ class Fileslists extends Component{
course_second_category_id:id course_second_category_id:id
} }
}).then((result)=>{ }).then((result)=>{
// console.log(result) if(result!=undefined){
if(result.status===200){
if(result.status===200){ if(result.data.status===0){
if(result.data.status===0){ let list=result.data.data;
let list=result.data.data; this.setState({
this.setState({ total_count:list.total_count,
total_count:list.total_count, publish_count:list.publish_count,
publish_count:list.publish_count, unpublish_count:list.unpublish_count,
unpublish_count:list.unpublish_count, files:list.files,
files:list.files, filesId:list.id,
filesId:list.id, name:list.name,
name:list.name, course_is_public:result.data.data.course_is_public,
course_is_public:result.data.data.course_is_public, isSpin:false
isSpin:false })
}) }
} }
} }else{
this.setState({
isSpin:false
})
}
}).catch((error)=>{ }).catch((error)=>{
console.log(error) console.log(error)
this.setState({ this.setState({
@ -399,11 +396,16 @@ class Fileslists extends Component{
} }
addDir = () => { addDir = () => {
let {filesId}=this.state; let {filesId,course_modules}=this.state;
this.setState({ this.setState({
checkBoxValues:[] checkBoxValues:[]
}) })
trigger('attachmentAddlog', parseInt(filesId)) if(parseInt(this.props.match.params.main_id)!=parseInt(this.props.coursesids)){
trigger('attachmentAddlog', parseInt( course_modules&&course_modules.course_modules[0].id))
}else{
trigger('attachmentAddlog', parseInt(filesId))
}
} }
editDir = (name) => { editDir = (name) => {
@ -677,11 +679,13 @@ class Fileslists extends Component{
course_modules, course_modules,
shixunmodal, shixunmodal,
course_is_public, course_is_public,
filesId filesId,
child
} = this.state; } = this.state;
let category_id= this.props.match.params.category_id; let category_id= this.props.match.params.category_id;
return( return(
<React.Fragment > <React.Fragment >
@ -779,13 +783,14 @@ class Fileslists extends Component{
/>:""} />:""}
<Titlesearchsection <Titlesearchsection
title={name} title={child===false?"全部资源":name}
searchValue={ searchValue } searchValue={ searchValue }
// searchtype={this.props.isAdmin||this.props.isStudent ?true:false} // searchtype={this.props.isAdmin||this.props.isStudent ?true:false}
onInputSearchChange={this.onInputSearchChange} onInputSearchChange={this.onInputSearchChange}
firstRowRight={ firstRowRight={
<React.Fragment> <React.Fragment>
{this.props.isAdmin()?parseInt(this.props.match.params.main_id)===parseInt(this.props.coursesids)?<WordsBtn style="blue" onClick={()=>this.addDir()} className={"mr30 font-16"}>添加目录</WordsBtn>:"":""} {/*{this.props.isAdmin()?parseInt(this.props.match.params.main_id)===parseInt(this.props.coursesids)?<WordsBtn style="blue" onClick={()=>this.addDir()} className={"mr30 font-16"}>新建目录</WordsBtn>:"":""}*/}
{this.props.isAdmin()?<WordsBtn style="blue" onClick={()=>this.addDir()} className={"mr30 font-16"}>新建目录</WordsBtn>:""}
{this.props.isAdmin()?parseInt(this.props.match.params.main_id)!=parseInt(this.props.coursesids)?<WordsBtn style="blue" onClick={()=>this.editDir(name)} className={"mr30 font-16"}>目录重命名</WordsBtn>:"":""} {this.props.isAdmin()?parseInt(this.props.match.params.main_id)!=parseInt(this.props.coursesids)?<WordsBtn style="blue" onClick={()=>this.editDir(name)} className={"mr30 font-16"}>目录重命名</WordsBtn>:"":""}
{this.props.isAdmin()||this.props.isStudent() ? <WordsBtn style="blue" className="mr30 font-16" onClick={()=>this.addResource()}>选用资源</WordsBtn>:""} {this.props.isAdmin()||this.props.isStudent() ? <WordsBtn style="blue" className="mr30 font-16" onClick={()=>this.addResource()}>选用资源</WordsBtn>:""}
@ -869,7 +874,7 @@ class Fileslists extends Component{
{/*})}*/} {/*})}*/}
{this.props.isAdmin()?parseInt(this.props.match.params.main_id)===filesId&&filesId? {this.props.isAdmin()?parseInt(this.props.match.params.main_id)===filesId&&filesId?
<p className="drop_down_btn"> <p className="drop_down_btn">
<a className="color-grey-6" onClick={()=>this.addDir()}>添加目录</a> <a className="color-grey-6" onClick={()=>this.addDir()}>新建目录</a>
</p> </p>
:"":""} :"":""}
</ul> </ul>
@ -885,7 +890,7 @@ class Fileslists extends Component{
{/*className={sorttype === 'created_on'?"none":""} className={sorttype === 'quotes'?"none":""} className={sorttype === 'downloads'?"none":""} */} {/*className={sorttype === 'created_on'?"none":""} className={sorttype === 'quotes'?"none":""} className={sorttype === 'downloads'?"none":""} */}
<li style={{width:'130px'}} onClick={() => this.onSortTypeChange('created_on')}>更新时间排序</li> <li style={{width:'130px'}} onClick={() => this.onSortTypeChange('created_on')}>更新时间排序</li>
<li style={{width:'130px'}} onClick={() => this.onSortTypeChange('downloads')}>下载次数排序</li> <li style={{width:'130px'}} onClick={() => this.onSortTypeChange('downloads')}>下载次数排序</li>
<li style={{width:'130px'}} onClick={() => this.onSortTypeChange('quotes')}>引用次数排序</li> {/*<li style={{width:'130px'}} onClick={() => this.onSortTypeChange('quotes')}>引用次数排序</li>*/}
</ul> </ul>
</li>:""} </li>:""}
</div> </div>

@ -287,11 +287,12 @@ class BoardsNew extends Component{
const isAdmin = this.props.isAdmin() const isAdmin = this.props.isAdmin()
const courseId=this.props.match.params.coursesId; const courseId=this.props.match.params.coursesId;
const boardId = this.props.match.params.boardId const boardId = this.props.match.params.boardId
const isCourseEnd = this.props.isCourseEnd() const isCourseEnd = this.props.isCourseEnd();
document.title=this.props.coursedata&&this.props.coursedata.name;
return( return(
<div className="newMain "> <div className="newMain ">
<AddDirModal {...this.props} <AddDirModal {...this.props}
title="添加目录" title="新建目录"
label="目录名称" label="目录名称"
ref="addDirModal" ref="addDirModal"
addSuccess={this.addSuccess} addSuccess={this.addSuccess}
@ -385,7 +386,7 @@ class BoardsNew extends Component{
<React.Fragment> <React.Fragment>
<Divider style={{ margin: '4px 0' }} /> <Divider style={{ margin: '4px 0' }} />
<div style={{ padding: '8px', cursor: 'pointer' }} onMouseDown={() => this.refs['addDirModal'].open()}> <div style={{ padding: '8px', cursor: 'pointer' }} onMouseDown={() => this.refs['addDirModal'].open()}>
<Icon type="plus" /> 添加目录 <Icon type="plus" /> 新建目录
</div> </div>
</React.Fragment> </React.Fragment>
} }

@ -526,8 +526,10 @@ class TopicDetail extends Component {
const isAdmin = this.props.isAdmin() const isAdmin = this.props.isAdmin()
// TODO 图片上传地址 // TODO 图片上传地址
const courseId=this.props.match.params.coursesId; const courseId=this.props.match.params.coursesId;
const boardId = this.props.match.params.boardId const boardId = this.props.match.params.boardId;
const isCourseEnd = this.props.isCourseEnd() const isCourseEnd = this.props.isCourseEnd();
document.title=this.props.coursedata&&this.props.coursedata.name;
return ( return (
<div className="edu-back-white edu-class-container edu-position course-message topicDetail" id="yslforum_index_list"> {/* fl with100 */} <div className="edu-back-white edu-class-container edu-position course-message topicDetail" id="yslforum_index_list"> {/* fl with100 */}
<style>{` <style>{`

@ -349,7 +349,7 @@ class Boards extends Component{
searchPlaceholder={ '请输入帖子名称进行搜索' } searchPlaceholder={ '请输入帖子名称进行搜索' }
firstRowRight={ firstRowRight={
<React.Fragment> <React.Fragment>
{ !isCourseEnd && isAdmin && !parent_id && <WordsBtn style="blue" className="mr30" onClick={()=>this.addDir()}>添加目录</WordsBtn> } { !isCourseEnd && isAdmin && !parent_id && <WordsBtn style="blue" className="mr30" onClick={()=>this.addDir()}>新建目录</WordsBtn> }
{ isAdmin && !!parent_id && <WordsBtn style="blue" className="mr30" onClick={()=>this.renameDir()}>目录重命名</WordsBtn> } { isAdmin && !!parent_id && <WordsBtn style="blue" className="mr30" onClick={()=>this.renameDir()}>目录重命名</WordsBtn> }
{ !isCourseEnd && isAdminOrStudent && <WordsBtn style="blue" className="" onClick={()=>this.onToBoardsNew()}>我要发贴</WordsBtn> } { !isCourseEnd && isAdminOrStudent && <WordsBtn style="blue" className="" onClick={()=>this.onToBoardsNew()}>我要发贴</WordsBtn> }
</React.Fragment> </React.Fragment>
@ -393,7 +393,7 @@ class Boards extends Component{
<p className="drop_down_btn"> <p className="drop_down_btn">
<a href="javascript:void(0)" className="color-grey-6" <a href="javascript:void(0)" className="color-grey-6"
onClick={()=>this.addDir()} onClick={()=>this.addDir()}
>添加目录...</a> >新建目录...</a>
</p> </p>
} }
{/* <p className="drop_down_btn"><a href="javascript:void(0)" className="color-grey-6">添加分班...</a></p> */} {/* <p className="drop_down_btn"><a href="javascript:void(0)" className="color-grey-6">添加分班...</a></p> */}

@ -171,6 +171,8 @@ class CommonWorkAppraise extends Component{
let category_id=this.props.match.params.category_id; let category_id=this.props.match.params.category_id;
let studentWorkId=this.props.match.params.studentWorkId; let studentWorkId=this.props.match.params.studentWorkId;
const isAdmin = this.props.isAdmin() const isAdmin = this.props.isAdmin()
document.title=course_name&&course_name;
return( return(
<WorkDetailPageHeader <WorkDetailPageHeader
{...this.props} {...this.state} {...this.props} {...this.state}

@ -225,6 +225,7 @@ class CommonWorkDetailIndex extends Component{
// console.log(params); // console.log(params);
let exportUrl = `/homework_commons/${workId}/works_list.zip?${queryString.stringify(params)}` let exportUrl = `/homework_commons/${workId}/works_list.zip?${queryString.stringify(params)}`
let exportResultUrl = `/homework_commons/${workId}/works_list.xlsx?${queryString.stringify(params)}` let exportResultUrl = `/homework_commons/${workId}/works_list.xlsx?${queryString.stringify(params)}`
document.title=course_name === undefined ? "" : course_name;
return ( return (
<div> <div>
<PublishRightnow ref={this.publishModal} showActionButton={false} {...this.props} checkBoxValues={[workId]} <PublishRightnow ref={this.publishModal} showActionButton={false} {...this.props} checkBoxValues={[workId]}

@ -161,8 +161,8 @@ class NewWork extends Component{
doNew: this.doNew, doNew: this.doNew,
doEdit: this.doEdit, doEdit: this.doEdit,
} }
document.title=this.state.course_name && this.state.course_name
return( return(
<div className="newMain"> <div className="newMain">
<div className="educontent mt20 mb50"> <div className="educontent mt20 mb50">
<CBreadcrumb items={[ <CBreadcrumb items={[

@ -400,11 +400,13 @@ class CoursesBanner extends Component {
if(sum===1){ if(sum===1){
let url =`/courses/${id}/switch_to_student.json`; let url =`/courses/${id}/switch_to_student.json`;
axios.post(url).then((response) => { axios.post(url).then((response) => {
if(response.data.status===0){ if(response!=undefined){
// window.location.href = "/users/" + this.props.current_user.login; if(response.data.status===0){
// this.props.history.replace(newurl); // window.location.href = "/users/" + this.props.current_user.login;
window.location.href=newurl // this.props.history.replace(newurl);
} window.location.href=newurl
}
}
}) })
} }
@ -412,11 +414,13 @@ class CoursesBanner extends Component {
if(sum===2){ if(sum===2){
let url =`/courses/${id}/switch_to_teacher.json`; let url =`/courses/${id}/switch_to_teacher.json`;
axios.post(url).then((response) => { axios.post(url).then((response) => {
if(response.data.status===0){ if(response!=undefined){
// window.location.href = "/users/" + this.props.current_user.login; if(response.data.status===0){
// this.props.history.replace(newurl); // window.location.href = "/users/" + this.props.current_user.login;
window.location.href=newurl // this.props.history.replace(newurl);
} window.location.href=newurl
}
}
}) })
} }
@ -481,6 +485,7 @@ class CoursesBanner extends Component {
render() { render() {
let { Addcoursestypes, coursedata,excellent, modalsType, modalsTopval, loadtype,modalsBottomval,antIcon,is_guide,AccountProfiletype} = this.state; let { Addcoursestypes, coursedata,excellent, modalsType, modalsTopval, loadtype,modalsBottomval,antIcon,is_guide,AccountProfiletype} = this.state;
const isCourseEnd = this.props.isCourseEnd() const isCourseEnd = this.props.isCourseEnd()
document.title=coursedata===undefined || coursedata.status===401 || coursedata.status===407?"":coursedata.name;
return ( return (
<div> <div>
{ {

@ -238,6 +238,37 @@ class Coursesleftnav extends Component{
this.props.updataleftNavfun() this.props.updataleftNavfun()
} }
componentDidUpdate=(prevProps)=>{
if(prevProps!=this.props){
let courstype=this.props.match.url;
courstype = courstype.split('/');
courstype=courstype[3];
const query =this.props.location.search;
let category_id;
if(courstype==="board"){
category_id=parseInt(this.props.match.params.boardId);
}else{
category_id=parseInt(this.props.match.params.category_id);
}
if(query===""){
this.setState({
positiontype:courstype,
})
}else{
if(isNaN(category_id)){
this.setState({
positiontype:courstype,
})
}else{
this.setState({
positiontype:courstype,
})
}
}
}
}
setnavid=(e,key,id,type,url)=>{ setnavid=(e,key,id,type,url)=>{
// this.props.getleftNavid && this.props.getleftNavid(key,type); // this.props.getleftNavid && this.props.getleftNavid(key,type);
// let {selectnavid,navid}=this.state; // let {selectnavid,navid}=this.state;
@ -401,7 +432,7 @@ class Coursesleftnav extends Component{
axios.get(url).then((result)=>{ axios.get(url).then((result)=>{
navidtype=true navidtype=true
this.props.updataleftNavfun(); this.props.updataleftNavfun();
console.log(this.props) // console.log(this.props)
let list=this.props.course_modules; let list=this.props.course_modules;
for(var i=0; i<list.length;i++){ for(var i=0; i<list.length;i++){
if(list[i].id!=id){ if(list[i].id!=id){
@ -442,7 +473,7 @@ class Coursesleftnav extends Component{
navidtype=false navidtype=false
if(id===1||id===2||id===6){ if(id===1||id===2||id===6){
this.setState({ this.setState({
Navmodalname:id===2?"新建分班":"添加目录", Navmodalname:id===2?"新建分班":"新建目录",
Navtitles:id===2?"分班名称":"目录名称", Navtitles:id===2?"分班名称":"目录名称",
Navplaceholder:"请输入名称最大限制60个字符", Navplaceholder:"请输入名称最大限制60个字符",
Navmodalnametype:true, Navmodalnametype:true,
@ -493,7 +524,8 @@ class Coursesleftnav extends Component{
navidtype=true navidtype=true
} }
saveNavmodapost=(url,value)=>{ saveNavmodapost=(url,value,positiontype,coursesId)=>{
axios.post(url, axios.post(url,
{name:value}).then((result)=>{ {name:value}).then((result)=>{
if(result.data.status===0){ if(result.data.status===0){
@ -505,6 +537,10 @@ class Coursesleftnav extends Component{
description:result.data.message description:result.data.message
}); });
trigger('updateNavSuccess') trigger('updateNavSuccess')
if(positiontype==="files"){
window.location.href=`/courses/${coursesId}/file/${result.data.category_id}`;
// this.props.history.push(`/courses/${coursesId}/file/${result.data.category_id}`)
}
} }
}).catch((error)=>{ }).catch((error)=>{
console.log(error) console.log(error)
@ -556,9 +592,8 @@ class Coursesleftnav extends Component{
} }
if(Navmodaltypename===1){ if(Navmodaltypename===1){
let url="/course_modules/"+id+"/add_second_category.json" let url="/course_modules/"+id+"/add_second_category.json"
this.saveNavmodapost(url,NavmodalValue) this.saveNavmodapost(url,NavmodalValue,this.state.positiontype,this.props.match.params.coursesId)
} else if(Navmodaltypename===2){ } else if(Navmodaltypename===2){
@ -781,15 +816,15 @@ class Coursesleftnav extends Component{
return ( <div className={"sandianbox"}> return ( <div className={"sandianbox"}>
{/*公告栏*/} {/*公告栏*/}
{/*作业*/} {/*作业*/}
{item.type==="shixun_homework"?<div onClick={e=>this.Navmodalnames(e,1,"shixun_homework",item.id)}>添加目录</div>:""} {item.type==="shixun_homework"?<div onClick={e=>this.Navmodalnames(e,1,"shixun_homework",item.id)}>新建目录</div>:""}
{/*资源*/} {/*资源*/}
{item.type==="attachment"?<div onClick={e=>this.Navmodalnames(e,1,"attachment",item.id)}>添加目录</div>:""} {item.type==="attachment"?<div onClick={e=>this.Navmodalnames(e,1,"attachment",item.id)}>新建目录</div>:""}
{/*毕业设计*/} {/*毕业设计*/}
{/*{item.type==="graduation"?<div onClick={()=>this.Navmodalnames(1,"attachment",item.id)}>添加目录</div>:""}*/} {/*{item.type==="graduation"?<div onClick={()=>this.Navmodalnames(1,"attachment",item.id)}>添加目录</div>:""}*/}
{/*讨论区*/} {/*讨论区*/}
{item.type==="board"?this.props.current_user&&this.props.current_user.course_is_end===true?"":<div onClick={e=>this.Navmodalnames(e,6,"board",item.main_id)}>添加目录</div>:""} {item.type==="board"?this.props.current_user&&this.props.current_user.course_is_end===true?"":<div onClick={e=>this.Navmodalnames(e,6,"board",item.main_id)}>新建目录</div>:""}
{/*分班*/} {/*分班*/}
{item.type==="course_group"?this.props.current_user&&this.props.current_user.course_is_end===true?"":<div onClick={e=>this.Navmodalnames(e,2,"course_group",item.id)}>添加分班</div>:""} {item.type==="course_group"?this.props.current_user&&this.props.current_user.course_is_end===true?"":<div onClick={e=>this.Navmodalnames(e,2,"course_group",item.id)}>新建分班</div>:""}
{/*分班*/} {/*分班*/}
{/*{item.type==="course_group"? :""}*/} {/*{item.type==="course_group"? :""}*/}
<div onClick={e=>this.Navmodalnames(e,3,"editname",item.id,item.name)}>重命名</div> <div onClick={e=>this.Navmodalnames(e,3,"editname",item.id,item.name)}>重命名</div>

@ -53,6 +53,7 @@ class CoursesHome extends Component{
} }
componentDidMount(){ componentDidMount(){
document.title="翻转课堂";
const upsystem=`/users/system_update.json`; const upsystem=`/users/system_update.json`;
axios.get(upsystem).then((response)=>{ axios.get(upsystem).then((response)=>{
let updata=response.data; let updata=response.data;

@ -57,8 +57,9 @@ class ExerciceNew extends Component{
const courseId=this.props.match.params.coursesId; const courseId=this.props.match.params.coursesId;
const isEdit = this.isEdit const isEdit = this.isEdit;
document.title=this.props.coursedata&&this.props.coursedata.name;
return( return(
<div className="newMain exerciseNew"> <div className="newMain exerciseNew">

@ -612,6 +612,7 @@ class ExerciseReviewAndAnswer extends Component{
let isStudent =this.props.isStudent(); let isStudent =this.props.isStudent();
const { current_user } = this.props const { current_user } = this.props
// console.log(data&&data.exercise.user_name) // console.log(data&&data.exercise.user_name)
document.title=courseName&&courseName.name;
return( return(
<div className="newMain" style={{paddingTop:"0px"}}> <div className="newMain" style={{paddingTop:"0px"}}>
<Spin size="large" spinning={isSpin}> <Spin size="large" spinning={isSpin}>

@ -271,7 +271,7 @@ class Testpapersettinghomepage extends Component{
// TODO // TODO
// console.log(Commonheadofthetestpaper.exercise_status); // console.log(Commonheadofthetestpaper.exercise_status);
document.title=this.props.coursedata&&this.props.coursedata.name;
return( return(
<div className="newMain clearfix "> <div className="newMain clearfix ">
{/*<DownloadMessage*/} {/*<DownloadMessage*/}

@ -316,6 +316,8 @@ class GraduationTaskDetail extends Component{
setTab:this.setTab, setTab:this.setTab,
getdatas:this.getdatas getdatas:this.getdatas
} }
document.title=questionslist&&questionslist.course_name;
return( return(
<div className="newMain clearfix"> <div className="newMain clearfix">
{ {

@ -537,7 +537,7 @@ class GraduationTasksSubmitedit extends Component{
}, },
}; };
document.title=workslist&&workslist.course_name;
return( return(
<React.Fragment> <React.Fragment>

@ -560,10 +560,10 @@ render(){
}, },
}; };
console.log(this.props) // console.log(this.props)
document.title=workslist&&workslist.course_name;
return( return(
<React.Fragment> <React.Fragment>

@ -146,6 +146,8 @@ class GraduationTasksappraise extends Component{
let graduation_id=datalist===undefined?"":datalist.graduation_id; let graduation_id=datalist===undefined?"":datalist.graduation_id;
let task_id=datalist===undefined?"":datalist.task_id; let task_id=datalist===undefined?"":datalist.task_id;
// console.log(datalist); // console.log(datalist);
document.title=datalist&&datalist.course_name;
return( return(
<React.Fragment> <React.Fragment>

@ -328,7 +328,7 @@ class GraduationTasksedit extends Component{
}; };
document.title=this.props.current_user&&this.props.current_user.course_name;
return( return(
<React.Fragment> <React.Fragment>

@ -313,6 +313,7 @@ class GraduationTasksnew extends Component {
}; };
// this.ifHasAnchorJustScorll(); // this.ifHasAnchorJustScorll();
// console.log(this.props.current_user.course_name) // console.log(this.props.current_user.course_name)
document.title=this.props.current_user&&this.props.current_user.course_name;
return ( return (
<React.Fragment> <React.Fragment>

@ -100,7 +100,7 @@ class GraduateTopicDetail extends Component{
let {course_id,graduation_topic_id}=this.props.match.params; let {course_id,graduation_topic_id}=this.props.match.params;
const isStudent =this.props.isStudent(); const isStudent =this.props.isStudent();
const isAdmin =this.props.isAdmin(); const isAdmin =this.props.isAdmin();
document.title=tableData && tableData.course_name;
return( return(
<div className="newMain"> <div className="newMain">
<div className="educontent mt10 mb50"> <div className="educontent mt10 mb50">

@ -323,6 +323,7 @@ class GraduateTopicNew extends Component{
}; };
// console.log("dfsf"); // console.log("dfsf");
// console.log(this.props); // console.log(this.props);
document.title=course_name===undefined?"":course_name;
return( return(
<div className="newMain "> <div className="newMain ">
<style>{` <style>{`

@ -0,0 +1,238 @@
// 分班列表 加入分班
import React, { useState, useEffect, useRef } from 'react'
import { Input,Checkbox,Table, Pagination, Modal,Menu ,Spin, Tooltip , Divider, Popconfirm } from "antd";
import ClipboardJS from 'clipboard'
import axios from 'axios'
import _ from 'lodash'
import '../css/Courses.css'
import '../css/members.css'
import CourseLayoutcomponent from '../common/CourseLayoutComponent'
import Titlesearchsection from '../common/titleSearch/TitleSearchSection'
import ColorCountText from '../common/titleSearch/ColorCountText'
import { WordsBtn, trigger, on, off, getUrl, downloadFile , sortDirections, NoneData } from 'educoder'
import Modals from "../../modals/Modals";
import DownloadMessageysl from "../../modals/DownloadMessageysl";
import CreateGroupByImportModal from './modal/CreateGroupByImportModal'
import ChangeRolePop from './ChangeRolePop'
import CourseGroupListTable from './CourseGroupListTable'
import './studentsList.css'
/**
角色数组, CREATOR: 创建者, PROFESSOR: 教师, ASSISTANT_PROFESSOR: 助教, STUDENT: 学生
*/
function CourseGroupList(props) {
const [searchValue, setSearchValue] = useState('')
const [isSpin, setIsSpin] = useState(true)
const [DownloadType, setDownloadType] = useState()
const [DownloadMessageval, setDownloadMessageval] = useState()
const [listRes, setListRes] = useState({})
const createGroupModalEl = useRef(null);
const courseId = props.match.params.coursesId
useEffect(() => {
fetchAll()
on('updateNavSuccess', onOperationSuccess)
return () => {
off('updateNavSuccess', onOperationSuccess)
}
}, [])
function onOperationSuccess() {
fetchAll()
props.updataleftNavfun()
}
async function fetchAll() {
const url = `/courses/${courseId}/course_groups.json`
setIsSpin(true)
const response = await axios.get(url, { params: {
search: searchValue
}});
console.log(response)
setIsSpin(false)
if (response) {
setListRes(response.data)
}
}
const onConfirm = async () => {
}
function createGroupImportSuccess() {
}
function addDir() {
trigger('groupAdd', props.coursesids)
}
function deleteDir() {
}
function onPressEnter() {
fetchAll()
}
function onInputSearchChange(e) {
setSearchValue(e.target.value)
}
function Downloadcal() {
}
const confirmysl = (url) => {
axios.get(url + 'export=true').then((response) => {
if(response === undefined){
return
}
if(response.data.status&&response.data.status===-1){
}else if(response.data.status&&response.data.status===-2){
if(response.data.message === "100"){
// 已超出文件导出的上限数量100 ),建议:
setDownloadType(true)
setDownloadMessageval(100)
}else {
//因附件资料超过500M
setDownloadType(true)
setDownloadMessageval(500)
}
}else {
props.slowDownload(url)
}
}).catch((error) => {
console.log(error)
});
}
const isAdmin = props.isAdmin();
const isSuperAdmin = props.isSuperAdmin();
const isParent = true;
// const searchValue = '';
const isCourseEnd= props.isCourseEnd();
const course_group_id= '';
const total_count = listRes.group_count;
const none_group_member_count = listRes.none_group_member_count;
const course_groups = listRes.course_groups
const current_group_id = listRes.current_group_id
let exportUrl = `/courses/${courseId}/export_member_scores_excel.xlsx?`; //总成绩
let exportUrltwo = `/courses/${courseId}/export_couser_info.xlsx?`; //课堂信息
let exportUrlthree = `/courses/${courseId}/export_member_act_score.xlsx?`; //活跃度
return (
<React.Fragment>
<DownloadMessageysl
{...props}
value={DownloadMessageval}
modalCancel={Downloadcal}
modalsType={DownloadType}
/>
<Titlesearchsection
title={"分班列表"}
searchValue={ searchValue }
onInputSearchChange={onInputSearchChange}
showSearchInput={total_count >= 10}
searchPlaceholder={ '请输入分班名称进行搜索' }
firstRowRight={
<React.Fragment>
{ // pageType !== TYPE_STUDENTS &&
isSuperAdmin && <React.Fragment>
{/* ref="createGroupByImportModal" */}
<CreateGroupByImportModal {...props}
ref={createGroupModalEl}
createGroupImportSuccess={createGroupImportSuccess}
></CreateGroupByImportModal>
{/* this.refs['createGroupByImportModal'].setVisible(true) */}
<WordsBtn style="blue" className="mr30" onClick={()=> {createGroupModalEl.current.setVisible(true)}}>导入创建分班</WordsBtn>
</React.Fragment> }
{
// pageType !== TYPE_STUDENTS &&
!isCourseEnd && isAdmin && isParent && <WordsBtn style="blue" className="mr30" onClick={()=>addDir()}>新建分班</WordsBtn> }
{/* {
isAdmin && !isParent && course_group_id != 0 && <WordsBtn style="blue" className="mr30" onClick={()=>deleteDir()}>删除分班</WordsBtn> } */}
{/* {
isAdmin && !isParent && course_group_id != 0 && <WordsBtn style="blue" className="mr30" onClick={()=>this.renameDir()}>分班重命名</WordsBtn> } */}
<style>{`
.drop_down_menu li a {
padding: 0px;
font-size: 14px;
}
.drop_down_menu {
/*width: 93px;*/
}
.drop_down_menu li {
width:100%;
box-sizing:boder-box;
float:unset;
line-height:30px!important;
flex: 0 0 30px;
}
.drop_down_menu, .drop_down_normal {
padding-top: 10px;
padding-bottom: 8px;
}
.drop_down_menu .drop_down_btn{
border-top:none;
}
.dividerStyle.ant-divider-horizontal{
margin: 0px;
}
.courseGroupList .ant-table-tbody tr:last-child td {
border-bottom: none;
}
`}</style>
{ isAdmin &&
<li className="li_line drop_down fr color-blue font-16">
导出<i className="iconfont icon-xiajiantou font-12 ml2"></i>
<ul className="drop_down_menu" style={{"right": "-20px", "left": "unset", "height": "auto"}}>
<li><a
onClick={(i) => confirmysl(exportUrltwo)}>课堂信息</a>
</li>
<li><a
onClick={(i) => confirmysl(exportUrlthree)}>活跃度</a>
</li>
<li><a
onClick={(i) => confirmysl(exportUrl)}>总成绩</a>
</li>
</ul>
</li>
}
</React.Fragment>
}
secondRowLeft={
total_count ? <ColorCountText count={total_count} name="个分班"></ColorCountText> : ''
}
onPressEnter={onPressEnter}
></Titlesearchsection>
<div className="mt20 edu-back-white padding20-30 ">
<span>未分班</span>
<span style={{color: '#999999'}}>{none_group_member_count}个学生</span>
<WordsBtn style="blue" className="fr "
onClick={() => {props.history.push(`/courses/${courseId}/course_groups/0`)}}>查看</WordsBtn>
</div>
<Spin size="large" spinning={isSpin}>
{course_groups && !!course_groups.length ?
<div className="mt20 edu-back-white padding20 courseGroupList">
<CourseGroupListTable
course_groups={course_groups}
onOperationSuccess={onOperationSuccess}
current_group_id={current_group_id}
{...props}
></CourseGroupListTable>
</div>:
<NoneData></NoneData>}
</Spin>
</React.Fragment>
)
}
export default CourseGroupList

@ -0,0 +1,219 @@
import React, { useState, useEffect } from 'react'
import { Input,Checkbox,Table, Pagination, Modal,Menu ,Spin, Tooltip , Badge, Popconfirm } from "antd";
import axios from 'axios'
import { WordsBtn, trigger, on, off, getUrl, downloadFile , sortDirections } from 'educoder'
import ClipboardJS from 'clipboard'
/**
角色数组, CREATOR: 创建者, PROFESSOR: 教师, ASSISTANT_PROFESSOR: 助教, STUDENT: 学生
course_members_count: 0
id: 2441
invite_code: "WUNX9K"
member_manager: "全部教师"
name: "e'e'e"
*/
const clipboardMap = {}
function CourseGroupListTable(props) {
const [serachValue, setSerachValue] = useState('')
const courseId = props.match.params.coursesId
useEffect(() => {
const course_groups = props.course_groups
if (!course_groups) {
return;
}
course_groups.forEach((record) => {
const id = record.id
debugger;
let _clipboard = new ClipboardJS(`.copyBtn_${id}`);
_clipboard.on('success', (e) => {
props.showNotification('复制成功')
});
clipboardMap[id] = _clipboard
})
return () => {
course_groups.forEach((record) => {
const id = record.id
if (clipboardMap[id]) {
clipboardMap[id].destroy();
clipboardMap[id] = null;
}
})
}
}, [props.course_groups])
function buildColumns() {
const columns=[{
title: '序号',
dataIndex: 'id',
key: 'id',
align:'center',
width:"5%",
className:"color-grey-6",
render: (id, record, index) => {
return index + 1
}
},
{
title: '分班名称',
dataIndex: 'name',
key: 'name',
align:'center',
width:"25%",
className:"color-grey-6",
render: (name, record, index) => {
return <WordsBtn title={name.length > 11 ? name : ''} onClick={() => onGoDetail(record)} style={''}
className="overflowHidden1" style2={{maxWidth: '180px', verticalAlign: 'bottom'}}>
{name}</WordsBtn>
}
},
{
title: '学生成员',
dataIndex: 'course_members_count',
key: 'course_members_count',
align:'center',
width:"8%",
className:"color-grey-6",
render: (course_members_count, record, index) => {
return course_members_count
}
}
];
if (!isNotMember) {
columns.push({
title: '管理教师',
dataIndex: 'member_manager',
key: 'member_manager',
align:'center',
width:"27%",
className:"color-grey-6",
render: (member_manager, record, index) => {
return <span className=""
title={record.subStringOfMember_manager ? member_manager : ''}
>{record.subStringOfMember_manager || member_manager}</span>
}
})
const aCol = (isAdmin ? {
title: '邀请码',
dataIndex: 'invite_code',
key: 'invite_code',
align:'center',
width:"10%",
className:"color-grey-6",
render: (invite_code, record, index) => {
return invite_code
}
} : {
title: '你当前所在分班',
dataIndex: 'group',
key: 'group',
align:'center',
width:"20%",
className:"color-grey-6",
render: (invite_code, record, index) => {
return props.current_group_id == record.id && <Badge status="processing" text="" />
}
})
columns.push( aCol );
}
columns.push({
title: '操作',
dataIndex: 'setting',
key: 'setting',
align:'center',
width:"25%",
className:"color-grey-6",
render: (none, record, index) => {
return <React.Fragment>
{!isCourseEnd && isAdmin && <WordsBtn style2={{ marginRight: '12px' }} onClick={() => onDelete(record)} style={'grey'}>删除分班</WordsBtn>}
{isAdmin && <WordsBtn style2={{ marginRight: '12px' }} data-clipboard-text={record.invite_code}
className={`copyBtn_${record.id}`} style={''}>复制邀请码</WordsBtn> }
{isStudent && <WordsBtn style2={{ marginRight: '12px' }} onClick={() => addToDir(record)} style={''}>加入分班</WordsBtn>}
<WordsBtn style2={{ marginRight: '12px' }} onClick={() => onGoDetail(record)} style={''}>查看</WordsBtn>
</React.Fragment>
}
})
return columns
}
const addToDir = async (record) => {
const courseId = props.match.params.coursesId
const url = `/courses/${courseId}/join_course_group.json`
const course_group_id = record.id
const response = await axios.post(url, {
course_group_id
})
if (response && response.data.status == 0) {
props.showNotification('加入成功')
props.updataleftNavfun()
props.onOperationSuccess && props.onOperationSuccess()
}
}
function onDelete(record) {
props.confirm({
content: <div>
<div>该分班的学生将被移动到未分班</div>
<div>是否确认删除?</div>
</div>,
onOk: () => {
// const cid = this.props.match.params.coursesId
const url = `/course_groups/${record.id}.json`
axios.delete(url)
.then((response) => {
if (response.data.status == 0) {
props.showNotification('删除成功')
props.onOperationSuccess && props.onOperationSuccess()
// props.history.push(response.data.right_url)
}
})
.catch(function (error) {
console.log(error);
});
}
})
}
function onGoDetail(record) {
props.history.push(`/courses/${courseId}/course_groups/${record.id}`)
}
const isAdmin = props.isAdmin();
const isSuperAdmin = props.isSuperAdmin();
const isStudent = props.isStudent()
const isNotMember = props.isNotMember()
const isParent = true;
const isCourseEnd= props.isCourseEnd();
const course_groups = props.course_groups
const columns = buildColumns()
const dataSource = course_groups.map(item => {
return {
...item,
subStringOfMember_manager : item.member_manager.length > 92
? item.member_manager.substring(0, 92) + '...' : null
}
})
return (
<React.Fragment>
<style>{`
.groupListTable .ant-badge-status-processing {
width: 10px;
height: 10px;
}
`}</style>
{/* onChange={onTableChange} */}
<Table columns={columns} dataSource={dataSource} pagination={false} className="groupListTable"></Table>
</React.Fragment>
)
}
export default CourseGroupListTable

@ -1,3 +1,4 @@
.stu_table .ant-table-thead > tr > th, .stu_table .ant-table-tbody > tr > td { .stu_table .ant-table-thead > tr > th, .stu_table .ant-table-tbody > tr > td,
.courseGroupList .ant-table-thead > tr > th, .courseGroupList .ant-table-tbody > tr > td {
padding: 14px 6px; padding: 14px 6px;
} }

@ -833,7 +833,7 @@ class studentsList extends Component{
</div> </div>
<Spin size="large" spinning={this.state.isSpin}> <Spin size="large" spinning={this.state.isSpin}>
<div className="clearfix stu_table"> <div className="clearfix stu_table">
{students && students.length && <Checkbox.Group style={{ width: '100%' }} onChange={this.onCheckBoxChange} value={checkBoxValues}> {students && !!students.length && <Checkbox.Group style={{ width: '100%' }} onChange={this.onCheckBoxChange} value={checkBoxValues}>
<Table columns={buildColumns(this,isParent)} dataSource={students} onChange={this.onTableChange} pagination={false}></Table> <Table columns={buildColumns(this,isParent)} dataSource={students} onChange={this.onTableChange} pagination={false}></Table>
</Checkbox.Group> } </Checkbox.Group> }
</div> </div>

@ -75,7 +75,7 @@ class Poll extends Component{
selectBlank=(type)=>{ selectBlank=(type)=>{
if(type===2){ if(type===2){
this.setState({ this.setState({
addname:"添加目录", addname:"新建目录",
addnametype:true, addnametype:true,
addnametab:type, addnametab:type,
addcanner:this.homeworkhide, addcanner:this.homeworkhide,

@ -115,6 +115,7 @@ class PollDetailIndex extends Component{
const { current_user } = this.props; const { current_user } = this.props;
const isAdmin =this.props.isAdmin(); const isAdmin =this.props.isAdmin();
const isStudent = this.props.isStudent(); const isStudent = this.props.isStudent();
document.title=this.props.coursedata&&this.props.coursedata.name;
return( return(
<div className="newMain"> <div className="newMain">
<DownloadMessageysl <DownloadMessageysl

@ -301,6 +301,7 @@ class PollInfo extends Component{
const { current_user } = this.props const { current_user } = this.props
let isAdmin=this.props.isAdmin(); let isAdmin=this.props.isAdmin();
let isStudent=this.props.isStudent(); let isStudent=this.props.isStudent();
document.title=courseName&&courseName;
return( return(
<div className="newMain" style={{paddingTop:"0px"}}> <div className="newMain" style={{paddingTop:"0px"}}>
{/*<p style={{height:"60px"}}></p>*/} {/*<p style={{height:"60px"}}></p>*/}

@ -2765,6 +2765,7 @@ class PollNew extends Component {
// console.log(this.state.projects===undefined?"":this.state.projects.poll_questions) // console.log(this.state.projects===undefined?"":this.state.projects.poll_questions)
var displaymysave = (mysave === true) ? "" : "display:none;"; var displaymysave = (mysave === true) ? "" : "display:none;";
document.title=this.props.coursedata&&this.props.coursedata.name;
return ( return (
<div className="newMain"> <div className="newMain">
{/*提示*/} {/*提示*/}

@ -74,7 +74,7 @@ class ListNav extends Component{
<p className="clearfix padding30 bor-bottom-greyE"> <p className="clearfix padding30 bor-bottom-greyE">
<span className="font-18 fl">资源列表</span> <span className="font-18 fl">资源列表</span>
<li className="fr"> <li className="fr">
<a href="javascript:void(0)" className="color-blue mr30">添加目录</a> <a href="javascript:void(0)" className="color-blue mr30">新建目录</a>
<a href="javascript:void(0)" className="color-blue mr30">导入资源</a> <a href="javascript:void(0)" className="color-blue mr30">导入资源</a>
<a href="javascript:void(0)" className="color-blue">上传资源</a> <a href="javascript:void(0)" className="color-blue">上传资源</a>
</li> </li>

@ -121,6 +121,7 @@ class CommitSummary extends Component{
const {getFieldDecorator} = this.props.form; const {getFieldDecorator} = this.props.form;
let {contents,data}=this.state; let {contents,data}=this.state;
// console.log(this.props); // console.log(this.props);
document.title=data === undefined ? "" :data.course_name===undefined?"": data.course_name;
return ( return (
<div> <div>
<div className="newMain clearfix"> <div className="newMain clearfix">

@ -182,6 +182,7 @@ class ShixunHomeworkPage extends Component {
const isAdmin = this.props.isAdmin(); const isAdmin = this.props.isAdmin();
// console.log(119) // console.log(119)
// console.log(jobsettingsdatapage); // console.log(jobsettingsdatapage);
document.title=jobsettingsdatapage === undefined ? "" : jobsettingsdatapage.data.course_name;
return ( return (
<div className="newMain clearfix "> <div className="newMain clearfix ">
<Modals <Modals

@ -95,6 +95,7 @@ class ShixunWorkDetails extends Component {
} }
render() { render() {
let{data}=this.state; let{data}=this.state;
document.title=data&&data.course_name;
return ( return (
<Spin size="large" spinning={this.state.spinning} style={{marginTop:"13%"}}> <Spin size="large" spinning={this.state.spinning} style={{marginTop:"13%"}}>
<div className="newMain clearfix "> <div className="newMain clearfix ">

@ -310,7 +310,7 @@ class ShixunWorkReport extends Component {
// let showAppraiseModals=this.props&&this.props.isAdminOrTeacher()===true?work_comment===null||work_comment===undefined?false:true:work_comment===null||work_comment===undefined?false:true; // let showAppraiseModals=this.props&&this.props.isAdminOrTeacher()===true?work_comment===null||work_comment===undefined?false:true:work_comment===null||work_comment===undefined?false:true;
let showAppraiseModals=work_comment===null||work_comment===undefined?false:true; let showAppraiseModals=work_comment===null||work_comment===undefined?false:true;
document.title=data&&data.course_name;
return ( return (
data===undefined?"":<Spin indicator={antIcon} spinning={this.state.spinning}> data===undefined?"":<Spin indicator={antIcon} spinning={this.state.spinning}>

@ -304,8 +304,8 @@ class ShixunhomeWorkItem extends Component{
<div className="clearfix ds pr pt5 contentSection" > <div className="clearfix ds pr pt5 contentSection" >
<style>{` <style>{`
.maxwidth580{ .maxwidth422{
max-width: 580px; max-width: 422px;
overflow:hidden; overflow:hidden;
text-overflow:ellipsis; text-overflow:ellipsis;
white-space:nowrap white-space:nowrap
@ -317,21 +317,21 @@ class ShixunhomeWorkItem extends Component{
{ {
this.props.isAdmin?<a onClick={()=>this.hrefjumpskip("/courses/"+this.props.match.params.coursesId+"/"+this.state.shixuntypes+"/"+discussMessage.homework_id+"/list?tab=0")} this.props.isAdmin?<a onClick={()=>this.hrefjumpskip("/courses/"+this.props.match.params.coursesId+"/"+this.state.shixuntypes+"/"+discussMessage.homework_id+"/list?tab=0")}
title={discussMessage.name} title={discussMessage.name}
className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.name}</a>:"" className="fl mt3 font-16 font-bd color-dark maxwidth422">{discussMessage.name}</a>:""
} }
{ {
this.props.isStudent? <a onClick={()=>this.hrefjumpskip(`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${discussMessage.homework_id}/list?tab=0`)} this.props.isStudent? <a onClick={()=>this.hrefjumpskip(`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${discussMessage.homework_id}/list?tab=0`)}
title={discussMessage.name} title={discussMessage.name}
className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.name}</a>:"" className="fl mt3 font-16 font-bd color-dark maxwidth422">{discussMessage.name}</a>:""
} }
{ {
this.props.isNotMember===true? this.props.discussMessage.private_icon===true? this.props.isNotMember===true? this.props.discussMessage.private_icon===true?
<span className="fl mt3 font-16 font-bd color-dark maxwidth580 pointer" title={"私有属性,非课堂成员不能访问"}>{discussMessage.name}</span> <span className="fl mt3 font-16 font-bd color-dark maxwidth422 pointer" title={"私有属性,非课堂成员不能访问"}>{discussMessage.name}</span>
: <a onClick={()=>this.hrefjumpskip(`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${discussMessage.homework_id}/list?tab=0`)} : <a onClick={()=>this.hrefjumpskip(`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${discussMessage.homework_id}/list?tab=0`)}
title={discussMessage.name} title={discussMessage.name}
className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.name}</a>:"" className="fl mt3 font-16 font-bd color-dark maxwidth422">{discussMessage.name}</a>:""
} }
@ -346,12 +346,45 @@ class ShixunhomeWorkItem extends Component{
<CoursesListType typelist={discussMessage.status} typesylename={""} /> <CoursesListType typelist={discussMessage.status} typesylename={""} />
<style>
{
`
.homepagePostSettingname{
width:192px !important;
}
.homepagePostSettingbox{
width:139px !important;
}
`
}
</style>
{this.props.isAdmin?<span onClick={(event)=>this.stopPro(event)} className={this.props.isAdminOrCreator()?"homepagePostSetting homepagePostSettingname":"homepagePostSetting homepagePostSettingbox"} style={{"right":"-2px","top":"6px","display":"block"}}>
<Link className="btn colorblue font-16" to={"/shixuns/"+discussMessage.shixun_identifier+"/challenges"} target={"_blank"}>实训详情</Link>
{this.props.isAdminOrCreator()?<a onClick={(event)=>this.editname(discussMessage.name,discussMessage.homework_id,event)} className={"btn colorblue ml20 font-16"}>重命名</a>:""}
{/*<WordsBtn className="btn colorblue ml20 font-16" to={`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${discussMessage.homework_id}/settings?tab=3`} > 设置</WordsBtn>*/}
<WordsBtn className="btn colorblue font-16 ml15" to={`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${discussMessage.homework_id}/settings?tab=3`} > 设置</WordsBtn>
</span>:""}
{this.props.isStudent===true?this.props.course_identity===5?
<WordsBtn style="blue" className="colorblue font-16 mr20 fr mt10">
{startbtn===false?
(discussMessage.task_operation[0] == '继续挑战' || discussMessage.task_operation[0] == '查看实战' ?
<a className="btn colorblue" href={getTaskUrlById(discussMessage.task_operation[1])}>
{discussMessage.task_operation[0]}
</a>
:
<a className="btn colorblue" onClick={()=>this.taskoperationId(discussMessage.task_operation[1])}>
{discussMessage.task_operation[0]}
</a>):<a className="btn colorblue" ></a>}
</WordsBtn>:"":""
}
</h6> </h6>
<div className="cl"></div> <div className="cl"></div>
<p className="color-grey mt16 fl"> <p className="color-grey mt16 fl" style={{"width":"820px"}}>
<span className="mr50 df"> <span >
{/* <a href="/users/innov" className="panel-name-small hide fl mr15 mr30 color-grey3">{discussMessage.author.name}</a> */} {/* <a href="/users/innov" className="panel-name-small hide fl mr15 mr30 color-grey3">{discussMessage.author.name}</a> */}
{ discussMessage.author && <span className="mr15 color-grey-3">{discussMessage.author}</span> } { discussMessage.author && <span className="mr15 color-grey-3">{discussMessage.author}</span> }
{discussMessage.commit_count===undefined?"":<span className="mr15 color-grey9">已开始做题 {discussMessage.commit_count}</span>} {discussMessage.commit_count===undefined?"":<span className="mr15 color-grey9">已开始做题 {discussMessage.commit_count}</span>}
@ -381,7 +414,7 @@ class ShixunhomeWorkItem extends Component{
{ {
discussMessage && discussMessage.upper_category_name && discussMessage && discussMessage.upper_category_name &&
<ConditionToolTip title={discussMessage.upper_category_name} condition={ discussMessage.upper_category_name.length > 22 }> <ConditionToolTip title={discussMessage.upper_category_name} condition={ discussMessage.upper_category_name.length > 22 }>
{ <span className="mr15 color-grey9 task-hide" style={discussMessage.time_status===1||discussMessage.time_status===2||discussMessage.time_status===3||discussMessage.time_status===4||discussMessage.time_status===5||discussMessage.time_status===6?{"maxWidth":"85px"}:{"maxWidth":"272px"}} title={discussMessage.upper_category_name}>{discussMessage.upper_category_name}</span>} { <div className=" color-grey9 task-hide fr" style={discussMessage.time_status===1||discussMessage.time_status===2||discussMessage.time_status===3||discussMessage.time_status===4||discussMessage.time_status===5||discussMessage.time_status===6?{"maxWidth":"268px"}:{"maxWidth":"625px"}} title={discussMessage.upper_category_name}>所属目录{discussMessage.upper_category_name}</div>}
</ConditionToolTip> </ConditionToolTip>
} }
@ -396,39 +429,6 @@ class ShixunhomeWorkItem extends Component{
</p> </p>
<style>
{
`
.homepagePostSettingname{
width:192px !important;
}
.homepagePostSettingbox{
width:139px !important;
}
`
}
</style>
{this.props.isAdmin?<div onClick={(event)=>this.stopPro(event)} className={this.props.isAdminOrCreator()?"homepagePostSetting homepagePostSettingname":"homepagePostSetting homepagePostSettingbox"} style={{"right":"-2px","top":"46px","display":"block"}}>
<Link className="btn colorblue font-16" to={"/shixuns/"+discussMessage.shixun_identifier+"/challenges"} target={"_blank"}>实训详情</Link>
{this.props.isAdminOrCreator()?<a onClick={(event)=>this.editname(discussMessage.name,discussMessage.homework_id,event)} className={"btn colorblue ml20 font-16"}>重命名</a>:""}
{/*<WordsBtn className="btn colorblue ml20 font-16" to={`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${discussMessage.homework_id}/settings?tab=3`} > 设置</WordsBtn>*/}
<WordsBtn className="btn colorblue font-16 ml15" to={`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${discussMessage.homework_id}/settings?tab=3`} > 设置</WordsBtn>
</div>:""}
{this.props.isStudent===true?this.props.course_identity===5?
<WordsBtn style="blue" className="colorblue font-16 mr20 fr mt10">
{startbtn===false?
(discussMessage.task_operation[0] == '继续挑战' || discussMessage.task_operation[0] == '查看实战' ?
<a className="btn colorblue" href={getTaskUrlById(discussMessage.task_operation[1])}>
{discussMessage.task_operation[0]}
</a>
:
<a className="btn colorblue" onClick={()=>this.taskoperationId(discussMessage.task_operation[1])}>
{discussMessage.task_operation[0]}
</a>):<a className="btn colorblue" ></a>}
</WordsBtn>:"":""
}
</div> </div>

@ -1016,14 +1016,14 @@ class Trainingjobsetting extends Component {
this.setState({ this.setState({
completionefficiencyscore: e.target.checked, completionefficiencyscore: e.target.checked,
work_efficiencys:e.target.checked, work_efficiencys:e.target.checked,
latedeductiontwo: 0, latedeductiontwo: 20,
}) })
//均分比例 //均分比例
if(this.state.proportion==="均分比例"){ if(this.state.proportion==="均分比例"){
this.Equalproportion(0); this.Equalproportion(20);
}else if(this.state.proportion==="经验值比例"){ }else if(this.state.proportion==="经验值比例"){
this.Empiricalvalueratio(0); this.Empiricalvalueratio(20);
} }
@ -1691,6 +1691,7 @@ class Trainingjobsetting extends Component {
modalSave: this.cancelBox modalSave: this.cancelBox
}) })
} else { } else {
var releasetime =true; var releasetime =true;
var deadline = true; var deadline = true;
var endtime =true; var endtime =true;
@ -1840,7 +1841,7 @@ class Trainingjobsetting extends Component {
flagPageEditstwo:releasetime, flagPageEditstwo:releasetime,
flagPageEditsthrees:deadline, flagPageEditsthrees:deadline,
flagPageEditsfor:endtime, flagPageEditsfor:endtime,
completionefficiencyscore:false, completionefficiencyscore:true,
work_efficiencys:datas.data.work_efficiency, work_efficiencys:datas.data.work_efficiency,
unifiedsetting:datas.data.unified_setting, unifiedsetting:datas.data.unified_setting,
latedeductiontwo:datas.data.eff_score, latedeductiontwo:datas.data.eff_score,
@ -2080,7 +2081,7 @@ class Trainingjobsetting extends Component {
// console.log(this.props.isAdmin()) // console.log(this.props.isAdmin())
// console.log(this.state.code_review===false) // console.log(this.state.code_review===false)
// console.log("引入的分值"); // console.log("引入的分值");
console.log(this.state.work_efficiencys); // console.log(this.state.work_efficiencys);

@ -133,10 +133,16 @@ class ShixunHomework extends Component{
category:id category:id
} }
}).then((result)=>{ }).then((result)=>{
this.setState({ if(result!=undefined){
isSpin:false, this.setState({
datas:result.data, isSpin:false,
}) datas:result.data,
})
}else{
this.setState({
isSpin:false,
})
}
}).catch((error)=>{ }).catch((error)=>{
console.log(error); console.log(error);
}) })
@ -188,19 +194,18 @@ class ShixunHomework extends Component{
category: category_id===undefined?undefined:category_id category: category_id===undefined?undefined:category_id
} }
}).then((result)=>{ }).then((result)=>{
if(result.status===200){ if(result!=undefined){
// if(checkedtype===true&&page>1){ if(result.status===200){
// for(var value of result.data.homeworks){ this.setState({
// checkBoxValues.push(value.homework_id) datas:result.data,
// } isSpin:false
// } })
this.setState({ }
datas:result.data, }else{
isSpin:false this.setState({
}) isSpin:false
})
}
}
}).catch((error)=>{ }).catch((error)=>{
console.log(error); console.log(error);
}) })
@ -1152,7 +1157,7 @@ class ShixunHomework extends Component{
{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?
<span> <span>
<WordsBtn style="blue" onClick={()=>this.addDir()} className={"mr30 font-16"}>添加目录</WordsBtn> <WordsBtn style="blue" onClick={()=>this.addDir()} className={"mr30 font-16"}>新建目录</WordsBtn>
{/*<WordsBtn style="blue" onClick={()=>this.editname(datas&&datas.main_category_name)} className={"mr30"}>目录重命名</WordsBtn>*/} {/*<WordsBtn style="blue" onClick={()=>this.editname(datas&&datas.main_category_name)} className={"mr30"}>目录重命名</WordsBtn>*/}
</span>: </span>:
<WordsBtn style="blue" onClick={()=>this.editDir(datas&&datas.category_name)} className={"mr30 font-16"}>目录重命名</WordsBtn>:""} <WordsBtn style="blue" onClick={()=>this.editDir(datas&&datas.category_name)} className={"mr30 font-16"}>目录重命名</WordsBtn>:""}
@ -1252,7 +1257,7 @@ class ShixunHomework extends Component{
{this.props.isAdmin()?datas&&datas.category_name===undefined||datas&&datas.category_name===null? {this.props.isAdmin()?datas&&datas.category_name===undefined||datas&&datas.category_name===null?
<p className="drop_down_btn"> <p className="drop_down_btn">
<a className="color-grey-6" onClick={()=>this.addDir()}>添加目录...</a> <a className="color-grey-6" onClick={()=>this.addDir()}>新建目录...</a>
</p> </p>
:"":""} :"":""}

@ -27,6 +27,7 @@ import { Tooltip } from 'antd'
// import CBreadcrumb from '../courses/common/CBreadcrumb' // import CBreadcrumb from '../courses/common/CBreadcrumb'
import { typeNameMap2 } from './MemoNew' import { typeNameMap2 } from './MemoNew'
import CaseDetail from "../moop_cases/CaseDetail";
const $ = window.$ const $ = window.$
function urlStringify(params) { function urlStringify(params) {
let noParams = true; let noParams = true;
@ -673,7 +674,7 @@ class MemoDetail extends Component {
const { match, history } = this.props const { match, history } = this.props
const { memo, recommend_shixun, current_user,author_info } = this.props; const { memo, recommend_shixun, current_user,author_info } = this.props;
const { comments, hasMoreComments, goldRewardDialogOpen } = this.state; const { comments, hasMoreComments, goldRewardDialogOpen } = this.state;
document.title = memo&&memo.subject!=undefined?memo&&memo.subject:"交流问答";
if (!memo || this.state.memoLoading) { if (!memo || this.state.memoLoading) {
return <div className="edu-back-white" id="forum_index_list"></div> return <div className="edu-back-white" id="forum_index_list"></div>
} }

@ -18,6 +18,7 @@ import 'antd/lib/select/style/index.css'
import TPMMDEditor from '../tpm/challengesnew/TPMMDEditor' import TPMMDEditor from '../tpm/challengesnew/TPMMDEditor'
import { getUrl, getUploadActionUrl, appendFileSizeToUploadFileAll, appendFileSizeToUploadFile } from 'educoder' import { getUrl, getUploadActionUrl, appendFileSizeToUploadFileAll, appendFileSizeToUploadFile } from 'educoder'
import CaseDetail from "../moop_cases/CaseDetail";
const Option = Select.Option; const Option = Select.Option;
const $ = window.$; const $ = window.$;
@ -316,6 +317,7 @@ class MemoNew extends Component {
const repertoires = []; const repertoires = [];
const repertoiresTagMap = {} const repertoiresTagMap = {}
if ( data.tag_list ) { if ( data.tag_list ) {
document.title = "交流问答";
// data.tag_list.forEach((item, index)=>{ // data.tag_list.forEach((item, index)=>{
// const tagArray = []; // const tagArray = [];
// item.tag.forEach( (tag, index) => { // item.tag.forEach( (tag, index) => {
@ -362,6 +364,8 @@ class MemoNew extends Component {
const tag_list = response.data.tag_list const tag_list = response.data.tag_list
if (tag_list) { if (tag_list) {
// this.setState({...response.data}) // this.setState({...response.data})
document.title = response.data.subject;
const { content, forum_id, id, repertoire_name, subject, const { content, forum_id, id, repertoire_name, subject,
current_user, tag_list, attachments_url, memo_tags, attachments } = response.data; current_user, tag_list, attachments_url, memo_tags, attachments } = response.data;
this.initMD(content); this.initMD(content);

@ -541,7 +541,7 @@ class LoginDialog extends Component {
if (isRender === undefined) { if (isRender === undefined) {
isRender = false isRender = false
} }
console.log(this.props) // console.log(this.props)
return ( return (
<Dialog open={true} id="DialogID" <Dialog open={true} id="DialogID"
style={{ display: isRender==false? 'none' : ''}} style={{ display: isRender==false? 'none' : ''}}

@ -267,10 +267,12 @@ class Otherlogin extends Component {
className={this.state.logintypes==="username"?"bor-red mb20 wechatpass":" mb20 wechatpass"} className={this.state.logintypes==="username"?"bor-red mb20 wechatpass":" mb20 wechatpass"}
></Input> ></Input>
<Input value={this.state.password} <Input.Password value={this.state.password}
autoComplete="new-password"
onInput={this.passwordonChange} onInput={this.passwordonChange}
className={this.state.logintypes==="password"?"bor-red wechatpass":" wechatpass"} className={this.state.logintypes==="password"?"bor-red wechatpass":" wechatpass"}
placeholder="请输入密码"></Input> placeholder="请输入密码"
></Input.Password>
</Content> </Content>
{this.state.logintypes==="username"?<span className={"color-red ml50"}>请填写账号</span>:this.state.logintypes==="password"?<span className={"color-red ml50"}></span>:""} {this.state.logintypes==="username"?<span className={"color-red ml50"}>请填写账号</span>:this.state.logintypes==="password"?<span className={"color-red ml50"}></span>:""}
<Footer> <Footer>

@ -65,6 +65,7 @@ class CaseDetail extends Component{
modalsTopval, modalsTopval,
modalsBottomval, modalsBottomval,
} = this.state; } = this.state;
document.title = CaseDetail&&CaseDetail.title!=undefined?CaseDetail&&CaseDetail.title:"教学案例";
return( return(
<div className="educontent mt10 mb50"> <div className="educontent mt10 mb50">
{ {

@ -31,6 +31,7 @@ class CaseList extends Component{
} }
componentDidMount = () =>{ componentDidMount = () =>{
window.document.title = '教学案例'
let { type , search , page , pageSize } = this.state; let { type , search , page , pageSize } = this.state;
this.InitList(type,search,page,pageSize); this.InitList(type,search,page,pageSize);
} }

@ -130,9 +130,12 @@ class CaseNew extends Component{
// 编辑时加载数据 // 编辑时加载数据
componentDidMount=()=>{ componentDidMount=()=>{
if(this.props.match.params.caseID){ if(this.props.match.params.caseID){
this.InitEditData(); this.InitEditData();
} }else{
window.document.title = '教学案例'
}
let url=`/library_tags.json`; let url=`/library_tags.json`;
axios.get(url).then((result) => { axios.get(url).then((result) => {
console.log(result) console.log(result)

@ -47,7 +47,7 @@ class Index extends Component{
} }
} }
componentDidMount(){ componentDidMount(){
window.document.title = '教学案例'
} }
// 获取案例详情 // 获取案例详情
getDetail = (caseID) =>{ getDetail = (caseID) =>{
@ -64,6 +64,7 @@ class Index extends Component{
tags:result.data.tags, tags:result.data.tags,
attachments:result.data.attachments attachments:result.data.attachments
}) })
window.document.title = result.data.title;
} }
}).catch((error)=>{ }).catch((error)=>{
console.log(error); console.log(error);

@ -227,6 +227,8 @@ class PathDetailIndex extends Component{
pathtopskey:key===undefined?1:key, pathtopskey:key===undefined?1:key,
// items: getItems(result.data.members.length), // items: getItems(result.data.members.length),
}) })
document.title=result.data.name;
} }
}).catch((error)=>{ }).catch((error)=>{

@ -64,6 +64,7 @@ class ShixunPathSearch extends Component{
componentDidMount(){ componentDidMount(){
document.title="实践课程";
const upsystem=`/users/system_update.json`; const upsystem=`/users/system_update.json`;
axios.get(upsystem).then((response)=>{ axios.get(upsystem).then((response)=>{
let updata=response.data; let updata=response.data;

Loading…
Cancel
Save