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

dev_new_shixunsrepository
杨树明 5 years ago
commit cb84b0d372

@ -6,10 +6,10 @@ class Weapps::ChallengesController < Weapps::BaseController
# 关卡有展示效果 || 选择题 || jupyter实训 || vnc || 隐藏代码窗口 || html+css实训 # 关卡有展示效果 || 选择题 || jupyter实训 || vnc || 隐藏代码窗口 || html+css实训
# @challenge.show_type != -1 || @challenge.st == 1 || @shixun.is_jupyter? || @shixun.vnc || # @challenge.show_type != -1 || @challenge.st == 1 || @shixun.is_jupyter? || @shixun.vnc ||
# @shixun.hide_code? || (@shixun.small_mirror_name & ["Css", "Html", "Web"]).present? # @shixun.hide_code? || (@shixun.small_mirror_name & ["Css", "Html", "Web"]).present?
play = @shixun.is_jupyter? || @shixun.vnc || play = @challenge.st == 1 || @shixun.is_jupyter? || @shixun.vnc ||
@shixun.hide_code? || (@shixun.small_mirror_name & ["Css", "Html", "Web"]).present? @shixun.hide_code? || (@shixun.small_mirror_name & ["Css", "Html", "Web"]).present?
if @challenge.st != 1 && play if play
normal_status(-5, "该关卡暂不支持小程序") normal_status(-5, "该关卡暂不支持小程序")
else else
render_ok render_ok

@ -387,7 +387,7 @@ class Course < ApplicationRecord
end end
def max_activity_time def max_activity_time
course_acts.pluck(:updated_at).max course_activities.pluck(:updated_at).max
end end
# 课堂作业数 # 课堂作业数

@ -44,7 +44,7 @@ class Admins::SchoolDailyStatisticService < ApplicationService
courses = Course.where(is_delete: 0, school_id: ids).group('school_id') courses = Course.where(is_delete: 0, school_id: ids).group('school_id')
course_map = courses.count course_map = courses.count
nearly_course_time_map = courses.joins(:course_acts).maximum('course_activities.updated_at') nearly_course_time_map = courses.joins(:course_activities).maximum('course_activities.updated_at')
active_course_map = courses.where(is_end: false).count active_course_map = courses.where(is_end: false).count
shixun_map = Shixun.joins(user: :user_extension).where(user_extensions: { identity: :teacher, school_id: ids }) shixun_map = Shixun.joins(user: :user_extension).where(user_extensions: { identity: :teacher, school_id: ids })

@ -17,7 +17,7 @@ namespace :migrate_course_resource do
if atta.course_second_category.present? if atta.course_second_category.present?
target_category = CourseSecondCategory.find_by(name: atta.course_second_category.name, course_id: target_course.id, category_type: "attachment") target_category = CourseSecondCategory.find_by(name: atta.course_second_category.name, course_id: target_course.id, category_type: "attachment")
unless target_category.present? unless target_category.present?
course_module = Course.course_modules.find_by(module_type: "attachment") course_module = target_course.course_modules.find_by(module_type: "attachment")
target_category = CourseSecondCategory.create(name: atta.course_second_category.name, course_id: target_course.id, target_category = CourseSecondCategory.create(name: atta.course_second_category.name, course_id: target_course.id,
category_type: "attachment", course_module_id: course_module&.id, category_type: "attachment", course_module_id: course_module&.id,
position: course_module&.course_second_categories&.count.to_i + 1) position: course_module&.course_second_categories&.count.to_i + 1)
@ -53,7 +53,7 @@ namespace :migrate_course_resource do
if homework.course_second_category.present? if homework.course_second_category.present?
target_category = CourseSecondCategory.find_by(name: homework.course_second_category.name, course_id: target_course.id, category_type: "shixun_homework") target_category = CourseSecondCategory.find_by(name: homework.course_second_category.name, course_id: target_course.id, category_type: "shixun_homework")
unless target_category.present? unless target_category.present?
course_module = Course.course_modules.find_by(module_type: "shixun_homework") course_module = target_course.course_modules.find_by(module_type: "shixun_homework")
target_category = CourseSecondCategory.create(name: homework.course_second_category.name, course_id: target_course.id, target_category = CourseSecondCategory.create(name: homework.course_second_category.name, course_id: target_course.id,
category_type: "shixun_homework", course_module_id: course_module&.id, category_type: "shixun_homework", course_module_id: course_module&.id,
position: course_module&.course_second_categories&.count.to_i + 1) position: course_module&.course_second_categories&.count.to_i + 1)
@ -193,6 +193,16 @@ namespace :migrate_course_resource do
target_course = Course.find_by(id: target_id) target_course = Course.find_by(id: target_id)
return if source_course.blank? || target_course.blank? return if source_course.blank? || target_course.blank?
# 先把target——course中的老师创建分班权限
target_course.teachers.each do |member|
if member.teacher_course_groups.blank?
target_course.course_groups.each do |group|
TeacherCourseGroup.create!(course_group_id: group.id, course_id: target_course.id, course_member_id: member&.id, user_id: member&.user_id)
end
end
end
source_course.course_members.where(role: %i[PROFESSOR ASSISTANT_PROFESSOR]).each do |teacher| source_course.course_members.where(role: %i[PROFESSOR ASSISTANT_PROFESSOR]).each do |teacher|
new_member = target_course.teachers.find_by(user_id: teacher.user_id) new_member = target_course.teachers.find_by(user_id: teacher.user_id)
unless new_member.present? unless new_member.present?
@ -208,25 +218,37 @@ namespace :migrate_course_resource do
end end
new_user_ids = [] new_user_ids = []
group.course_members.where(role: 4).each do |member| group.course_members.where(role: 4).each do |member|
new_member = target_course.course_members.find_by(user_id: member.user_id) new_member = target_course.students.find_by(user_id: member.user_id)
if new_member.present? if new_member.present?
new_member.update_column("course_group_id", new_group.id) new_member.update_attributes(course_group_id: new_group.id)
else else
CourseMember.create!(course_id: target_course.id, course_group_id: new_group.id, user_id: member.user_id, role: member.role) CourseMember.create!(course_id: target_course.id, course_group_id: new_group.id, user_id: member.user_id, role: member.role)
new_user_ids << member.user_id new_user_ids << member.user_id
end end
end end
# CourseAddStudentCreateWorksJob.perform_later(target_course.id, new_user_ids) unless new_user_ids.blank? CourseAddStudentCreateWorksJob.perform_later(target_course.id, new_user_ids) unless new_user_ids.blank?
group.teacher_course_groups.each do |teacher_group| group.teacher_course_groups.each do |teacher_group|
member = CourseMember.find_by(course_id: target_course.id, user_id: teacher_group.user_id, role: %i[CREATOR PROFESSOR ASSISTANT_PROFESSOR]) member = CourseMember.find_by(course_id: target_course.id, user_id: teacher_group.user_id, role: %i[CREATOR PROFESSOR ASSISTANT_PROFESSOR])
if member.present? if member.present? && !member.teacher_course_groups.where(course_group_id: new_group.id).exists?
TeacherCourseGroup.create!(course_group_id: new_group.id, course_id: target_course.id, course_member_id: member&.id, user_id: member&.user_id) TeacherCourseGroup.create!(course_group_id: new_group.id, course_id: target_course.id, course_member_id: member&.id, user_id: member&.user_id)
end end
end end
end end
user_ids = []
source_course.students.where(course_group_id: 0).each do |member|
new_member = target_course.students.find_by(user_id: member.user_id)
if new_member.present?
new_member.update_attributes(course_group_id: 0)
else
CourseMember.create!(course_id: target_course.id, course_group_id: 0, user_id: member.user_id, role: member.role)
user_ids << member.user_id
end
end
CourseAddStudentCreateWorksJob.perform_later(target_course.id, user_ids) unless user_ids.blank?
end end
end end

@ -175,6 +175,9 @@ class ListPageIndex extends Component{
isexcellent:excellent isexcellent:excellent
}) })
} }
updatabanners=()=>{
this.refs.CoursesBanner.updatabanner()
}
render() { render() {
let {yslGuideone} =this.state; let {yslGuideone} =this.state;
// console.log("98"); // console.log("98");
@ -187,7 +190,7 @@ class ListPageIndex extends Component{
<div> <div>
<div className="newMain clearfix"> <div className="newMain clearfix">
{/*头部banner*/} {/*头部banner*/}
<CoursesBanner {...this.props} ispostexcellenttype={(excellent)=>this.ispostexcellenttype(excellent)}></CoursesBanner> <CoursesBanner ref={"CoursesBanner"} {...this.props} ispostexcellenttype={(excellent)=>this.ispostexcellenttype(excellent)}></CoursesBanner>
{/*下面是指引哦*/} {/*下面是指引哦*/}
{/*{yslGuideone!==undefined?*/} {/*{yslGuideone!==undefined?*/}
{/*(*/} {/*(*/}
@ -249,7 +252,7 @@ class ListPageIndex extends Component{
></Route> ></Route>
<Route path="/courses/:coursesId/teachers" <Route path="/courses/:coursesId/teachers"
render={ render={
(props) => (<TeacherList {...this.props} {...props} {...this.state} />) (props) => (<TeacherList updatabanners={()=>this.updatabanners()} {...this.props} {...props} {...this.state} />)
} }
></Route> ></Route>
{/* 学生列表*/} {/* 学生列表*/}
@ -300,7 +303,7 @@ class ListPageIndex extends Component{
(props) => (<Statistics {...this.props} {...props} {...this.state} />) (props) => (<Statistics {...this.props} {...props} {...this.state} />)
} }
></Route> ></Route>
{/*公告栏列表*/} {/*公告栏列表*/}
@ -324,7 +327,7 @@ class ListPageIndex extends Component{
} }
></Route> ></Route>
<Route path="/courses/:coursesId/files/:main_id" <Route path="/courses/:coursesId/files/:main_id"
render={ render={
(props) => (<Resourcelist {...this.props} {...props} {...this.state} />) (props) => (<Resourcelist {...this.props} {...props} {...this.state} />)
@ -335,7 +338,7 @@ class ListPageIndex extends Component{
(props) => (<Resourcelist {...this.props} {...props} {...this.state} />) (props) => (<Resourcelist {...this.props} {...props} {...this.state} />)
} }
></Route> ></Route>
<Route path="/courses/:coursesId/graduation_topics/:Id" <Route path="/courses/:coursesId/graduation_topics/:Id"
render={ render={
(props) => (<GraduationTopics {...this.props} {...props} {...this.state} />) (props) => (<GraduationTopics {...this.props} {...props} {...this.state} />)

@ -42,7 +42,7 @@ class ModalWrapper extends Component{
{ {
` `
body { body {
overflow: hidden !important; width: calc(100%) !important;
} }
` `
} }

@ -954,7 +954,7 @@ class Coursesleftnav extends Component{
{ {
` `
body { body {
overflow: hidden !important; width: calc(100%) !important;
} }
` `
} }

@ -130,7 +130,9 @@ class CoursesHome extends Component{
<div className="newMain clearfix"> <div className="newMain clearfix">
<style> <style>
{ {
` ` ::-webkit-scrollbar {
width: 0px !important;
}
.courses-head{ .courses-head{
width: 100%; width: 100%;
height: 300px; height: 300px;

@ -153,7 +153,7 @@ class HomeworkModal extends Component{
{ {
` `
body { body {
overflow: hidden !important; width: calc(100%) !important;
} }
` `
} }
@ -170,7 +170,7 @@ class HomeworkModal extends Component{
destroyOnClose={true} destroyOnClose={true}
> >
<div className="task-popup-content"> <div className="task-popup-content">
{ this.props.usingCheckBeforePost ? { this.props.usingCheckBeforePost ?
<React.Fragment> <React.Fragment>
@ -183,7 +183,7 @@ class HomeworkModal extends Component{
<p className="task-popup-text-center font-16 mt10"> <p className="task-popup-text-center font-16 mt10">
此设置将对所有分班生效 此设置将对所有分班生效
</p> </p>
</React.Fragment> : </React.Fragment> :
<React.Fragment> <React.Fragment>
<p className="task-popup-text-center font-16"> <p className="task-popup-text-center font-16">
{this.props.Topval} {this.props.Topval}
@ -222,8 +222,8 @@ class HomeworkModal extends Component{
</span> </span>
</p>} </p>}
{/* usingCheckBeforePost 为true的时候 全选所有分班 */} {/* usingCheckBeforePost 为true的时候 全选所有分班 */}
{this.props.modaltype===undefined||this.props.modaltype===2||this.props.modaltype===4 {this.props.modaltype===undefined||this.props.modaltype===2||this.props.modaltype===4
|| !course_groups || course_groups.length == 0 || !course_groups || course_groups.length == 0
|| this.props.usingCheckBeforePost ?"":<ul className="upload_select_box fl clearfix mt20 mb30" || this.props.usingCheckBeforePost ?"":<ul className="upload_select_box fl clearfix mt20 mb30"
style={{"overflow-y":"auto",padding:"10px 0px"}} style={{"overflow-y":"auto",padding:"10px 0px"}}
id="search_not_members_list" id="search_not_members_list"

@ -43,6 +43,16 @@ class ModalsRename extends Component{
centered={true} centered={true}
className={"Navmodal"} className={"Navmodal"}
> >
{this.props.Navmodalnametype===undefined?false:this.props.Navmodalnametype===true?<style>
{
`
body{
width: calc(100%) !important;
}
`
}
</style>:""}
<div className={"fl mt5"}>{this.props.Navname}名称</div> <div className={"fl mt5"}>{this.props.Navname}名称</div>
<Input placeholder={"请输入名称最大限制60个字符"} <Input placeholder={"请输入名称最大限制60个字符"}
className={"inputNav greyInput fl"} className={"inputNav greyInput fl"}

@ -443,7 +443,7 @@ class NewShixunModel extends Component{
<div> <div>
<style> <style>
{ {
`body{ overflow: hidden !important; } `body{ width: calc(100%) !important; }
.ant-drawer-content{ overflow:auto !important; background: #f5f5f5; } .ant-drawer-content{ overflow:auto !important; background: #f5f5f5; }
.yslbottomsj{position: absolute;bottom: -8px;} .yslbottomsj{position: absolute;bottom: -8px;}
.ant-drawer-close{ .ant-drawer-close{

@ -2,7 +2,7 @@ import React, { useState, useEffect } from 'react'
import { trigger } from 'educoder' import { trigger } from 'educoder'
import { Input, Checkbox } from "antd"; import { Input, Checkbox } from "antd";
/** /**
arg_course_groups 选中的id数组 arg_course_groups 选中的id数组
joinCourseGroup 选中时触发 joinCourseGroup(checkedValues, item, index) 传入item数据对象index 数据对象index joinCourseGroup 选中时触发 joinCourseGroup(checkedValues, item, index) 传入item数据对象index 数据对象index
checkAllValue 是否全选 checkAllValue 是否全选
@ -33,13 +33,13 @@ function CourseGroupChooser({ course_groups, isAdminOrCreator = true, item, inde
that.setState({groupSearchValue: e.target.value}) that.setState({groupSearchValue: e.target.value})
that.onCheckAllChange(e, item, index) - onCheckAllChange(e, item, index) that.onCheckAllChange(e, item, index) - onCheckAllChange(e, item, index)
that.joinCourseGroup(checkedValues, item, index) - joinCourseGroup(checkedValues, item, index) that.joinCourseGroup(checkedValues, item, index) - joinCourseGroup(checkedValues, item, index)
that.state.checkAllArray[index] - checkAllValue that.state.checkAllArray[index] - checkAllValue
*/ */
console.log('arg_course_groups', arg_course_groups) console.log('arg_course_groups', arg_course_groups)
const urlStyle = {"left":"unset", minWidth: '262px'}; const urlStyle = {"left":"unset", minWidth: '262px'};
if (alwaysShow == true) { if (alwaysShow == true) {
@ -54,17 +54,18 @@ function CourseGroupChooser({ course_groups, isAdminOrCreator = true, item, inde
</p>): </p>):
'' ''
} }
<Checkbox.Group onChange={(checkedValues) => joinCourseGroup(checkedValues, item, index)} <Checkbox.Group onChange={(checkedValues) => joinCourseGroup(checkedValues, item, index)}
value={arg_course_groups.length && arg_course_groups[0].id ? arg_course_groups.map(item => item.id): arg_course_groups} value={arg_course_groups.length && arg_course_groups[0].id ? arg_course_groups.map(item => item.id): arg_course_groups}
disabled={!isAdminOrCreator} className="mainGroup" disabled={!isAdminOrCreator} className="mainGroup"
> >
{course_groups && course_groups.length > 1 && <li key={'_all' + index} > {course_groups && course_groups.length > 1 && <li key={'_all' + index} >
{/* 防止被外面group包裹 */} {/* 防止被外面group包裹 */}
<Checkbox.Group onChange={(e) => onCheckAllChange(e, item, index)} value={[checkAllValue]}> <Checkbox.Group onChange={(e) => onCheckAllChange(e, item, index)} value={[checkAllValue]}>
<Checkbox <Checkbox
value={true} value={true}
style={{ marginRight: '6px' }} onClick={() => {}} disabled={!isAdminOrCreator}
style={{ marginRight: '6px' }} onClick={() => {}}
>全选</Checkbox> >全选</Checkbox>
</Checkbox.Group> </Checkbox.Group>
</li>} </li>}
@ -84,7 +85,7 @@ function CourseGroupChooser({ course_groups, isAdminOrCreator = true, item, inde
) )
}) })
} }
</Checkbox.Group> </Checkbox.Group>
<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"

@ -38,8 +38,8 @@ function buildColumns(that) {
const isAdminOrCreator = that.props.isAdminOrCreator(); const isAdminOrCreator = that.props.isAdminOrCreator();
const isAdminOrTeacher = that.props.isAdminOrTeacher() const isAdminOrTeacher = that.props.isAdminOrTeacher()
const { course_groups, filterKey } = that.state const { course_groups, filterKey } = that.state
const showSorter = filterKey == '1' const showSorter = filterKey == '1'
const courseId = that.props.match.params.coursesId const courseId = that.props.match.params.coursesId
const columns = [{ const columns = [{
title: '序号', title: '序号',
@ -48,7 +48,7 @@ function buildColumns(that) {
width: 78, width: 78,
render: (content, item, index) => { render: (content, item, index) => {
return index + 1 return index + 1
// return item.isApply == true ? '' : <a href="javascript:;">{(that.state.page - 1) * 20 + index + 1 // return item.isApply == true ? '' : <a href="javascript:;">{(that.state.page - 1) * 20 + index + 1
// - (that.state.application_list ? that.state.application_list.length : 0)} </a> // - (that.state.application_list ? that.state.application_list.length : 0)} </a>
} }
} }
@ -70,7 +70,7 @@ function buildColumns(that) {
sortDirections: sortDirections, sortDirections: sortDirections,
sortOrder: sortedInfo.columnKey === 'name' && sortedInfo.order, sortOrder: sortedInfo.columnKey === 'name' && sortedInfo.order,
render: (name, record) => { render: (name, record) => {
return <a href={`/users/${record.login}`} target="_blank" className="overflowHidden1" style={{ maxWidth: '110px'}} return <a href={`/users/${record.login}`} target="_blank" className="overflowHidden1" style={{ maxWidth: '110px'}}
title={`${name.length > 4 ? name : ''}`}>{name}</a> title={`${name.length > 4 ? name : ''}`}>{name}</a>
} }
}, { }, {
@ -84,7 +84,7 @@ function buildColumns(that) {
sortDirections: sortDirections, sortDirections: sortDirections,
sortOrder: sortedInfo.columnKey === 'role' && sortedInfo.order, sortOrder: sortedInfo.columnKey === 'role' && sortedInfo.order,
}] }]
that.state.course_groups && that.state.course_groups.length && showSorter && columns.push({ that.state.course_groups && that.state.course_groups.length && showSorter && columns.push({
title: <Tooltip title="仅能批阅指定分班的作品">管理权限</Tooltip>, title: <Tooltip title="仅能批阅指定分班的作品">管理权限</Tooltip>,
width: 260, width: 260,
@ -152,13 +152,13 @@ function buildColumns(that) {
<span> <span>
<WordsBtn onClick={() => that.onRefuse(record)} style={'grey'}>拒绝</WordsBtn> <WordsBtn onClick={() => that.onRefuse(record)} style={'grey'}>拒绝</WordsBtn>
<Divider type="vertical" /> <Divider type="vertical" />
<a onClick={() => that.onAgree(record)} style={{color: '#4CACFF'}}>同意</a> <a onClick={() => that.onAgree(record)} style={{color: '#4CACFF'}}>同意</a>
</span> ) </span> )
} else { } else {
return ( return (
<React.Fragment> <React.Fragment>
<WordsBtn style2={{ marginRight: '12px' }} onClick={() => that.onDelete(record)} style={'grey'}>删除</WordsBtn> <WordsBtn style2={{ marginRight: '12px' }} onClick={() => that.onDelete(record)} style={'grey'}>删除</WordsBtn>
<ChangeRolePop <ChangeRolePop
courseId={courseId} courseId={courseId}
record={record} record={record}
@ -169,7 +169,7 @@ function buildColumns(that) {
fetchUser={that.props.fetchUser} fetchUser={that.props.fetchUser}
></ChangeRolePop> ></ChangeRolePop>
{/* <Popconfirm {/* <Popconfirm
placement="bottom" placement="bottom"
icon={null} icon={null}
title={ title={
@ -192,11 +192,11 @@ function buildColumns(that) {
// { record.role == ROLE_TEACHER ? <a style={{color: '#4CACFF'}} onClick={() => that.changeToAssistant(record)}>变更为助教</a> : '' } // { record.role == ROLE_TEACHER ? <a style={{color: '#4CACFF'}} onClick={() => that.changeToAssistant(record)}>变更为助教</a> : '' }
// { record.role == ROLE_TEACHER_ASSISTANT ? <a style={{color: '#4CACFF'}} onClick={() => that.changeToTeacher(record)}>变更为教师</a> : '' } // { record.role == ROLE_TEACHER_ASSISTANT ? <a style={{color: '#4CACFF'}} onClick={() => that.changeToTeacher(record)}>变更为教师</a> : '' }
// { record.role == ROLE_ADMIN && isAdminOrCreator ? <a style={{color: '#4CACFF', marginLeft: '44px'}} onClick={() => that.showChangeAdminModal(record)}>更换管理员</a> : '' } // { record.role == ROLE_ADMIN && isAdminOrCreator ? <a style={{color: '#4CACFF', marginLeft: '44px'}} onClick={() => that.showChangeAdminModal(record)}>更换管理员</a> : '' }
// </span> // </span>
) )
} }
}, },
}) })
} }
@ -209,7 +209,7 @@ function buildColumns(that) {
render: (content, item, index) => { render: (content, item, index) => {
return content ? <Checkbox value={content}></Checkbox> : '' return content ? <Checkbox value={content}></Checkbox> : ''
} }
}) })
} }
return columns return columns
} }
@ -265,10 +265,10 @@ class studentsList extends Component{
}) })
return; return;
} }
const courseId = this.props.match.params.coursesId const courseId = this.props.match.params.coursesId
let url = `/courses/${courseId}/teacher_application_review.json` let url = `/courses/${courseId}/teacher_application_review.json`
this.props.confirm({ this.props.confirm({
content: `是否确认${ approval == 1 ? '同意' : '拒绝'}TA的加入`, content: `是否确认${ approval == 1 ? '同意' : '拒绝'}TA的加入`,
onOk: () => { onOk: () => {
@ -285,11 +285,11 @@ class studentsList extends Component{
}) })
.catch(function (error) { .catch(function (error) {
console.log(error); console.log(error);
}); });
} }
}) })
} }
onRefuse = (record) => { onRefuse = (record) => {
this.onAgree(record, 2) this.onAgree(record, 2)
@ -343,10 +343,10 @@ class studentsList extends Component{
// console.log('addTeacherSuccessListener', data) // console.log('addTeacherSuccessListener', data)
} }
getCourseGroups = () => { getCourseGroups = () => {
const courseId = this.props.match.params.coursesId const courseId = this.props.match.params.coursesId
let url = `/courses/${courseId}/all_course_groups.json` let url = `/courses/${courseId}/all_course_groups.json`
axios.get(url, { axios.get(url, {
params: { all: true } params: { all: true }
}) })
@ -369,11 +369,11 @@ class studentsList extends Component{
} }
joinCourseGroup = (ids, item, index) => { joinCourseGroup = (ids, item, index) => {
// console.log('join ', ids, item) // console.log('join ', ids, item)
const courseId = this.props.match.params.coursesId const courseId = this.props.match.params.coursesId
let url = `/courses/${courseId}/set_course_group.json` let url = `/courses/${courseId}/set_course_group.json`
axios.post(url, { axios.post(url, {
course_group_ids: ids, course_group_ids: ids,
user_id: item.user_id, user_id: item.user_id,
@ -382,6 +382,7 @@ class studentsList extends Component{
.then((response) => { .then((response) => {
if (response.data.status == 0) { if (response.data.status == 0) {
this.props.showNotification('修改成功') this.props.showNotification('修改成功')
this.props.updatabanners()
const newArray = ids.map((item) => {return {id: item, name: this.state.course_groups_map[item]}}); const newArray = ids.map((item) => {return {id: item, name: this.state.course_groups_map[item]}});
this.setState( this.setState(
(prevState) => ({ (prevState) => ({
@ -397,18 +398,18 @@ class studentsList extends Component{
} }
onChangeRoleSuccess = () => { onChangeRoleSuccess = () => {
this.fetchAll(undefined,this.state.filterKey) this.fetchAll(undefined,this.state.filterKey)
} }
fetchAll = async (argPage,filterKey) => { fetchAll = async (argPage,filterKey) => {
let { searchValue }=this.state let { searchValue }=this.state
this.setState({ this.setState({
isSpin:true isSpin:true
}) })
let id = this.props.match.params.coursesId let id = this.props.match.params.coursesId
if (argPage) { if (argPage) {
this.setState({ page: argPage }) this.setState({ page: argPage })
} }
const sortedInfo = this.state.sortedInfo; const sortedInfo = this.state.sortedInfo;
let page = argPage || this.state.page let page = argPage || this.state.page
@ -436,7 +437,7 @@ class studentsList extends Component{
const result = await axios.get(encodeURI(url)) const result = await axios.get(encodeURI(url))
// axios.get((url)).then((result)=>{ // axios.get((url)).then((result)=>{
if (result.data.teacher_list) { if (result.data.teacher_list) {
this.setState({ this.setState({
teachers: result.data.teacher_list, teachers: result.data.teacher_list,
total_count: result.data.teacher_list_size, total_count: result.data.teacher_list_size,
application_list: result.data.application_list || [], application_list: result.data.application_list || [],
@ -445,7 +446,7 @@ class studentsList extends Component{
isSpin:false isSpin:false
}) })
} else if (result.data.application_list) { } else if (result.data.application_list) {
this.setState({ this.setState({
total_count: result.data.teacher_list_size, total_count: result.data.teacher_list_size,
application_list: result.data.application_list || [], application_list: result.data.application_list || [],
is_admin: result.data.is_admin, is_admin: result.data.is_admin,
@ -461,7 +462,7 @@ class studentsList extends Component{
// }) // })
} }
getGroupList(){ getGroupList(){
let id = this.props.match.params.coursesId let id = this.props.match.params.coursesId
let url='/courses/'+id+'/graduation_group_list.json'; let url='/courses/'+id+'/graduation_group_list.json';
axios.get((url)).then((result)=>{ axios.get((url)).then((result)=>{
if(result.status==200){ if(result.status==200){
@ -543,16 +544,16 @@ class studentsList extends Component{
this.setState({ order: order }, () => { this.setState({ order: order }, () => {
this.fetchAll() this.fetchAll()
}) })
} }
changeRole = (member, role) => { changeRole = (member, role) => {
const courseId = this.props.match.params.coursesId const courseId = this.props.match.params.coursesId
let {filterKey}=this.state; let {filterKey}=this.state;
let url= `/courses/${courseId}/change_course_teacher.json`; let url= `/courses/${courseId}/change_course_teacher.json`;
axios.post(url, { axios.post(url, {
course_member_id: member.course_member_id course_member_id: member.course_member_id
// "user_list": [ // "user_list": [
// { "user_id": member.user_id } // { "user_id": member.user_id }
// ], // ],
// "graduation_group_id": member.graduation_group_id, // "graduation_group_id": member.graduation_group_id,
// "course_group_id": "820", // "course_group_id": "820",
@ -588,7 +589,7 @@ class studentsList extends Component{
const courseId = this.props.match.params.coursesId const courseId = this.props.match.params.coursesId
const url = `/courses/${courseId}/delete_course_teacher.json` const url = `/courses/${courseId}/delete_course_teacher.json`
axios.post(url, { axios.post(url, {
course_member_id: member.course_member_id course_member_id: member.course_member_id
}) })
.then((response) => { .then((response) => {
@ -601,15 +602,15 @@ class studentsList extends Component{
}) })
.catch(function (error) { .catch(function (error) {
console.log(error); console.log(error);
}); });
} }
}) })
} }
addTeacher = () => { addTeacher = () => {
this.refs.addTeacherModal.setVisible(true) this.refs.addTeacherModal.setVisible(true)
} }
addStudent = () => { addStudent = () => {
this.refs.addStudentModal.setVisible(true) this.refs.addStudentModal.setVisible(true)
} }
hasGraduationModule = () => { hasGraduationModule = () => {
@ -619,7 +620,7 @@ class studentsList extends Component{
}) })
return result && result.length > 0 return result && result.length > 0
} }
onTableChange = (pagination, filters, sorter) => { onTableChange = (pagination, filters, sorter) => {
let {filterKey}=this.state; let {filterKey}=this.state;
console.log('Various parameters', pagination, filters, sorter); console.log('Various parameters', pagination, filters, sorter);
@ -679,11 +680,11 @@ class studentsList extends Component{
return( return(
<React.Fragment> <React.Fragment>
{/* <AddTeacherModal ref="addTeacherModal" {/* <AddTeacherModal ref="addTeacherModal"
{...this.props} {...this.props}
moduleName="教师" moduleName="教师"
></AddTeacherModal> ></AddTeacherModal>
<AddStudentModal ref="addStudentModal" <AddStudentModal ref="addStudentModal"
{...this.props} {...this.props}
moduleName="学生" moduleName="学生"
></AddStudentModal> */} ></AddStudentModal> */}
@ -694,7 +695,7 @@ class studentsList extends Component{
{...this.props} onOk={this.showChangeAdminModal} {...this.props} onOk={this.showChangeAdminModal}
changeAdminSuccess={this.changeAdminSuccess} changeAdminSuccess={this.changeAdminSuccess}
></AddAdminModal> ></AddAdminModal>
<Titlesearchsection <Titlesearchsection
title={<React.Fragment> title={<React.Fragment>
<span>教师列表</span> <span>教师列表</span>
@ -708,9 +709,9 @@ class studentsList extends Component{
<React.Fragment> <React.Fragment>
{/* { isAdmin && <WordsBtn style="blue" className="mr30" onClick={()=>this.addTeacher()}></WordsBtn> } {/* { isAdmin && <WordsBtn style="blue" className="mr30" onClick={()=>this.addTeacher()}></WordsBtn> }
{ isAdmin && <WordsBtn style="blue" className="mr30" onClick={()=>this.addStudent()}>添加学生</WordsBtn> } */} { isAdmin && <WordsBtn style="blue" className="mr30" onClick={()=>this.addStudent()}>添加学生</WordsBtn> } */}
{ isAdminOrCreator && <WordsBtn style="blue" className="fr" onClick={()=>this.showChangeAdminModal()}>更换管理员</WordsBtn>} { isAdminOrCreator && <WordsBtn style="blue" className="fr" onClick={()=>this.showChangeAdminModal()}>更换管理员</WordsBtn>}
</React.Fragment> </React.Fragment>
} }
secondRowLeft={ secondRowLeft={
@ -777,7 +778,7 @@ class studentsList extends Component{
{ hasGraduationModule && isAdminOrTeacher && <li className="li_line drop_down"> { hasGraduationModule && isAdminOrTeacher && <li className="li_line drop_down">
加入答辩组<i className="iconfont icon-xiajiantou font-12 ml2"></i> 加入答辩组<i className="iconfont icon-xiajiantou font-12 ml2"></i>
<ul className="drop_down_menu" style={{"right":"0px","left":"unset", minWidth: '222px'}}> <ul className="drop_down_menu" style={{"right":"0px","left":"unset", minWidth: '222px'}}>
{ {
groupList && groupList.graduation_groups_count>10? groupList && groupList.graduation_groups_count>10?
(<p className="drop_down_search"> (<p className="drop_down_search">
@ -814,10 +815,10 @@ 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 teacher_table"> <div className="clearfix stu_table teacher_table">
{combineArray.length ? {combineArray.length ?
<Checkbox.Group style={{ width: '100%' }} onChange={this.onCheckBoxChange} value={checkBoxValues}> <Checkbox.Group style={{ width: '100%' }} onChange={this.onCheckBoxChange} value={checkBoxValues}>
{/* pagination={{ current: page, total: total_count, pageSize:20, onChange: this.onPageChange }} */} {/* pagination={{ current: page, total: total_count, pageSize:20, onChange: this.onPageChange }} */}
<Table columns={columns} dataSource={combineArray} <Table columns={columns} dataSource={combineArray}
onChange={this.onTableChange} onChange={this.onTableChange}
pagination={total_count > 20 && filterKey == '1' ? { //分页 pagination={total_count > 20 && filterKey == '1' ? { //分页
total: page == 1 && this.state.application_list.length ? total_count + total_count / Math.floor(this.state.application_list.length + 20) : total_count , //数据总数量 total: page == 1 && this.state.application_list.length ? total_count + total_count / Math.floor(this.state.application_list.length + 20) : total_count , //数据总数量

@ -870,7 +870,7 @@ class ShixunHomework extends Component{
Modalstype:false, Modalstype:false,
}) })
let category_id=this.props.match.params.category_id; let category_id=this.props.match.params.category_id;
const cid = this.props.match.params.coursesId; const cid = this.props.match.params.coursesId;
let url="/courses/"+cid+"/homework_commons/set_public.json"; let url="/courses/"+cid+"/homework_commons/set_public.json";
axios.post(url, { axios.post(url, {
@ -1126,7 +1126,7 @@ class ShixunHomework extends Component{
{ {
` `
body { body {
overflow: hidden !important; width: calc(100%) !important;
} }
` `
} }

@ -27,7 +27,7 @@ render() {
{ {
` `
body{ body{
overflow: hidden !important; width: calc(100%) !important;
} }
.ant-modal-body { .ant-modal-body {
padding: 20px 40px; padding: 20px 40px;

@ -80,7 +80,7 @@ positon:0
return "" return ""
} }
// 初始化 initialValue + defaultSelected defaultSelected={``} // 初始化 initialValue + defaultSelected defaultSelected={``}
// {this.renderChoiceItems(item, index)} // {this.renderChoiceItems(item, index)}
// String.valueOf(index) // String.valueOf(index)
var choiceQuestionComponent = choose.map( (item, index) => { var choiceQuestionComponent = choose.map( (item, index) => {
var choose_test = choose_test_cases.test_sets[index]; var choose_test = choose_test_cases.test_sets[index];
@ -90,7 +90,7 @@ positon:0
// <p style={{paddingLeft:'27px'}}>{item.subject}</p> // <p style={{paddingLeft:'27px'}}>{item.subject}</p>
/* /*
<ReactMarkdown <ReactMarkdown
source={item.subject} style={{paddingLeft:'27px'}} source={item.subject} style={{paddingLeft:'27px'}}
renderers={{code: CodeBlock}} renderers={{code: CodeBlock}}
/> />
@ -102,31 +102,31 @@ positon:0
const i = optionValueArray.indexOf(item); const i = optionValueArray.indexOf(item);
initialValueArray[i] = item initialValueArray[i] = item
}) })
return ( return (
<div id={`choice${index}`} key={index} className="mb15"> <div id={`choice${index}`} key={index} className="mb15">
{/* <div style={groupStyle}> {/* <div style={groupStyle}>
{( item.category === 1 ? "单选题" : "多选题" )} {( item.category === 1 ? "单选题" : "多选题" )}
</div> */} </div> */}
<div className="clearfix"> <div className="clearfix">
<span className="fl" style={{"color":"#8B9399"}}>{index+1}.</span>
<div id={`choose_subject_${index+1}`} className="fl choiceMD"> <div id={`choose_subject_${index+1}`} className="fl choiceMD">
<textarea style={{display:'none'}}>{item.subject}</textarea> <span className="fl" style={{"color":"#8B9399"}}>{index+1}.</span><textarea style={{display:'none'}}>{item.subject}</textarea>
</div> </div>
</div> </div>
<div> <div>
{getFieldDecorator("" + (index), { {getFieldDecorator("" + (index), {
initialValue: item.category === 1 ? actual_output : (actual_output && actual_output.split('')) initialValue: item.category === 1 ? actual_output : (actual_output && actual_output.split(''))
})( })(
item.category === 1 ? item.category === 1 ?
<RadioGroup name={`${index}`} defaultSelected={actual_output} className="radiogroup"> <RadioGroup name={`${index}`} defaultSelected={actual_output} className="radiogroup">
{this.renderChoiceItems(item, index)} {this.renderChoiceItems(item, index)}
</RadioGroup> </RadioGroup>
: this.renderMultiChoiceItems(item, index, initialValueArray) : this.renderMultiChoiceItems(item, index, initialValueArray)
) )
} }
</div> </div>
</div> </div>
) )
@ -151,7 +151,7 @@ positon:0
/* /*
<div style={ { display: 'inline-block'} } <div style={ { display: 'inline-block'} }
dangerouslySetInnerHTML={{__html: optionItem.option_name}}> dangerouslySetInnerHTML={{__html: optionItem.option_name}}>
</div> </div>
<textarea value={optionItem.option_name}></textarea> <textarea value={optionItem.option_name}></textarea>
*/ */
ar.push( ar.push(
@ -161,9 +161,9 @@ positon:0
classes={{root: this.props.classes.radio, classes={{root: this.props.classes.radio,
checked: this.props.classes.checked}} checked: this.props.classes.checked}}
checked={isSelected} checked={isSelected}
value={`${optionValueArray[optionIndex]}`} value={`${optionValueArray[optionIndex]}`}
style={styles.radioButton} style={styles.radioButton}
/> />
} label={<div className="break-word" style={{lineHeight:"24px"}}> } label={<div className="break-word" style={{lineHeight:"24px"}}>
@ -172,20 +172,20 @@ positon:0
</div> </div>
<div style={ { display: 'inline-block',"color":"#8B9399"} } <div style={ { display: 'inline-block',"color":"#8B9399"} }
dangerouslySetInnerHTML={{__html: showText}}> dangerouslySetInnerHTML={{__html: showText}}>
</div> </div>
</div>} ></FormControlLabel> </div>} ></FormControlLabel>
) )
}) })
// //
// <span style={ isSelected ? { fontSize: 16} : {}}> {optionItem.option_name}</span> // <span style={ isSelected ? { fontSize: 16} : {}}> {optionItem.option_name}</span>
return ar return ar
} }
renderMultiChoiceItems(item, index, initialValueArray) { renderMultiChoiceItems(item, index, initialValueArray) {
return <CheckBoxGroup return <CheckBoxGroup
{...this.props} {...this.props}
options={item.challenge_question} initialValueArray={initialValueArray} options={item.challenge_question} initialValueArray={initialValueArray}
itemLabelFunction={(option, index)=> { itemLabelFunction={(option, index)=> {
@ -198,10 +198,10 @@ positon:0
</div> </div>
<div style={ { display: 'inline-block',"color":"#8B9399"} } <div style={ { display: 'inline-block',"color":"#8B9399"} }
dangerouslySetInnerHTML={{__html: showText}}> dangerouslySetInnerHTML={{__html: showText}}>
</div> </div>
</div> </div>
) )
}} }}
itemValueFunction={(option, index)=> {return optionValueArray[index]}}></CheckBoxGroup> itemValueFunction={(option, index)=> {return optionValueArray[index]}}></CheckBoxGroup>
} }
@ -235,14 +235,14 @@ positon:0
return ( return (
<React.Fragment> <React.Fragment>
{ loading === true ? { loading === true ?
'' ''
: :
<div id="choiceRepositoryView" style={{"color":"#8B9399!important"}}> <div id="choiceRepositoryView" style={{"color":"#8B9399!important"}}>
{this.renderChooseQuestions()} {this.renderChooseQuestions()}
</div> </div>
} }
</React.Fragment> </React.Fragment>
); );
} }

@ -92,7 +92,7 @@ class ShixunPathSearch extends Component{
getList=(order,select,search,page )=>{ getList=(order,select,search,page )=>{
let url='/paths.json'; let url='/paths.json';
// '?order='+order+'&page='+page; // '?order='+order+'&page='+page;
// if(select!=""){ // if(select!=""){
@ -166,6 +166,9 @@ class ShixunPathSearch extends Component{
<style> <style>
{ {
` `
::-webkit-scrollbar {
width: 0px !important;
}
.pathImg{ .pathImg{
width: 100%; width: 100%;
height: 300px; height: 300px;
@ -205,7 +208,7 @@ class ShixunPathSearch extends Component{
{/*<div className="fr mr5 search-new">*/} {/*<div className="fr mr5 search-new">*/}
{/*/!* <Search*/} {/*/!* <Search*/}
{/*placeholder="请输入路径名称进行搜索"*/} {/*placeholder="请输入路径名称进行搜索"*/}
{/*id="subject_search_input"*/} {/*id="subject_search_input"*/}
{/*value={search}*/} {/*value={search}*/}
{/*onInput={this.inputSearchValue}*/} {/*onInput={this.inputSearchValue}*/}
{/*onSearch={this.searchValue}*/} {/*onSearch={this.searchValue}*/}

Loading…
Cancel
Save