diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 0c643d15c..0b3e35519 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -35,7 +35,7 @@ class CoursesController < ApplicationController :transfer_to_course_group, :delete_from_course, :export_member_scores_excel, :search_users, :add_students_by_search, :get_historical_courses, :add_teacher_popup, :add_teacher, :export_couser_info, :export_member_act_score, - :update_informs, :new_informs, :delete_informs] + :update_informs, :new_informs, :delete_informs, :switch_to_student] before_action :admin_allowed, only: [:set_invite_code_halt, :set_public_or_private, :change_course_admin, :set_course_group, :create_group_by_importing_file, :update_task_position, :tasks_list] @@ -681,13 +681,19 @@ class CoursesController < ApplicationController course_member = @course.course_members.find_by!(user_id: current_user.id, is_active: 1) tip_exception("切换失败") if course_member.STUDENT? - course_student = CourseMember.find_by!(user_id: current_user.id, role: %i[STUDENT], course_id: @course.id) - course_member.update_attributes(is_active: 0) - course_student.update_attributes(is_active: 1) + course_student = CourseMember.find_by(user_id: current_user.id, role: %i[STUDENT], course_id: @course.id) + course_member.update_attributes!(is_active: 0) + if course_student + course_student.update_attributes!(is_active: 1) + else + # 学生身份不存在则创建 + CourseMember.create!(user_id: current_user.id, role: 4, course_id: @course.id) + CourseAddStudentCreateWorksJob.perform_later(@course.id, [current_user.id]) + end normal_status(0, "切换成功") rescue => e uid_logger_error("switch_to_student error: #{e.message}") - tip_exception("切换失败") + tip_exception(e.message) raise ActiveRecord::Rollback end end @@ -1127,7 +1133,7 @@ class CoursesController < ApplicationController def top_banner @user = current_user - @is_teacher = @user_course_identity < Course::STUDENT + @switch_student = Course::BUSINESS < @user_course_identity && @user_course_identity < Course::STUDENT @is_student = @user_course_identity == Course::STUDENT @course.increment!(:visits) end diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index adfcef74f..60cf2d6c5 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -161,7 +161,7 @@ class HomeworkCommonsController < ApplicationController # 作品状态 0: 未提交, 1 按时提交, 2 延迟提交 if params[:work_status].present? params_work_status = request.get? ? params[:work_status].split(",") : params[:work_status] - work_status = params_work_status.split(",").map{|status| status.to_i} + work_status = params_work_status.map{|status| status.to_i} all_student_works = @student_works.left_joins(:myshixun) @student_works = all_student_works.where(work_status: work_status) diff --git a/app/services/admins/save_laboratory_setting_service.rb b/app/services/admins/save_laboratory_setting_service.rb index 00e202cd9..f2a5c151e 100644 --- a/app/services/admins/save_laboratory_setting_service.rb +++ b/app/services/admins/save_laboratory_setting_service.rb @@ -30,7 +30,7 @@ class Admins::SaveLaboratorySettingService < ApplicationService hash = {} hash[:name] = strip nav[:name] hash[:link] = strip nav[:link] - hash[:hidden] = nav[:hidden].to_s == 0 + hash[:hidden] = nav[:hidden].to_s != '0' hash end end diff --git a/app/views/courses/top_banner.json.jbuilder b/app/views/courses/top_banner.json.jbuilder index 877ffcdf1..9a0554585 100644 --- a/app/views/courses/top_banner.json.jbuilder +++ b/app/views/courses/top_banner.json.jbuilder @@ -15,7 +15,7 @@ json.is_admin @user_course_identity < Course::PROFESSOR json.is_public @course.is_public == 1 json.code_halt @course.invite_code_halt == 1 json.invite_code @course.invite_code_halt == 0 ? @course.generate_invite_code : "" -json.switch_to_student switch_student_role(@is_teacher, @course, @user) +json.switch_to_student @switch_student json.switch_to_teacher switch_teacher_role(@is_student, @course, @user) json.switch_to_assistant switch_assistant_role(@is_student, @course, @user) #json.join_course !@user.member_of_course?(@course) diff --git a/public/react/src/modules/courses/Resource/index.js b/public/react/src/modules/courses/Resource/index.js index 03627a59f..d61dec15b 100644 --- a/public/react/src/modules/courses/Resource/index.js +++ b/public/react/src/modules/courses/Resource/index.js @@ -745,6 +745,7 @@ class Fileslists extends Component{ {/*选择资源*/} {shixunmodal&&shixunmodal===true?:""} - + {/*设置资源*/} {Settingtype&&Settingtype===true?{ newcourse_groups.push ({ @@ -96,7 +79,6 @@ class Selectsetting extends Component{ datalist:response.data, description: response.data.description, is_public: response.data.is_public, - unified_setting: response.data.unified_setting, datatime:response.data.publish_time, // is_public:response.data.course_groups, //attachment_histories:response.data.attachment_histories @@ -145,21 +127,6 @@ class Selectsetting extends Component{ this.getalldata() } - } - onChangepublics=(e)=>{ - console.log(e.target.checked) - this.setState({ - is_public:e.target.checked - }) - - } - - onChangesettings=(e)=>{ - console.log(e.target.checked) - this.setState({ - unified_setting:e.target.checked - }) - } settextarea=(e)=>{ @@ -180,13 +147,26 @@ class Selectsetting extends Component{ } savecouseShixunModal=()=>{ - let {fileList,is_public,unified_setting,description,datatime,course_groups}=this.state; + let {fileList,is_public,description,datatime,course_groups}=this.state; let newfileList=[]; for(var list of fileList){ newfileList.push(list.response.id) } + if(this.state.Radiovalue===1){ + if(datatime===undefined||datatime===null||datatime=== ""){ + this.setState({ + Radiovaluetype:true + }) + return + }else{ + this.setState({ + Radiovaluetype:false + }) + } + } + if(description===undefined||description===null){ }else if(description.length>100){ @@ -196,29 +176,6 @@ class Selectsetting extends Component{ return } - // course_groups.forEach((item,key)=>{ - // if(item.course_group_id===undefined||item.publish_time===undefined){ - // this.setState({ - // course_group_publish_timestype:true - // }) - // return - // } - // }) - - // if(unified_setting===false){ - // - // course_groups.forEach((item,key)=>{ - // if(item.course_group_id===undefined){ - // this.setState({ - // course_group_idtypes:true - // }) - // return - // } - // }) - // - // } - - let coursesId=this.props.match.params.coursesId; let attachmentId=this.props.attachmentId; let url="/files/"+this.props.discussMessageid+".json"; @@ -228,7 +185,6 @@ class Selectsetting extends Component{ new_attachment_id:newfileList.length===0?undefined:newfileList, course_second_category_id:this.props.coursesidtype===undefined||this.props.coursesidtype==="node"?0:attachmentId, is_public:is_public, - is_unified_setting:unified_setting, publish_time:unified_setting===true?datatime===undefined?moment(new Date()).format('YYYY-MM-DD HH'):datatime:undefined, description:description, course_group_publish_times:unified_setting===false?course_groups:undefined @@ -244,7 +200,6 @@ class Selectsetting extends Component{ } onChangeTimepublish= (date, dateString) => { - // console.log('startValue', dateString); this.setState({ datatime:handleDateString(dateString), }) @@ -268,31 +223,6 @@ class Selectsetting extends Component{ } } - // onAttachmentRemove = (file) => { - // // confirm({ - // // title: '确定要删除这个附件吗?', - // // okText: '确定', - // // cancelText: '取消', - // // // content: 'Some descriptions', - // // onOk: () => { - // // this.deleteAttachment(file) - // // }, - // // onCancel() { - // // console.log('Cancel'); - // // }, - // // }); - // // return false; - // - // // this.setState({ - // // Modalstype:true, - // // Modalstopval:'确定要删除这个附件吗?', - // // ModalSave: ()=>this.deleteAttachment(file), - // // ModalCancel:this.cancelAttachment - // // }) - // // return false; - // - // this.deleteAttachment(file); - // } onAttachmentRemove = (file) => { @@ -309,14 +239,7 @@ class Selectsetting extends Component{ fileListtype:false, fileList:[] }) - // this.setState((state) => { - // const index = state.fileList.indexOf(file); - // const newFileList = state.fileList.slice(); - // newFileList.splice(index, 1); - // return { - // fileList: newFileList, - // }; - // }); + } } }) @@ -332,63 +255,23 @@ class Selectsetting extends Component{ fileList:[] }) } - // const url = `/attachments/${file.response ? file.response.id : file.uid}.json` - } - onChangeTimepublishs= (date, dateString,key) => { - let {course_groups}=this.state; - let newgroup_publish=course_groups; - for(var i=0; i{ this.setState({ - course_groups:newgroup_publish, - }) - } - - - selectassigngroups=(e,index,key)=>{ - let {course_groups}=this.state; - let newgroup_publish=course_groups; - for(var i=0; i{ - let newlist=this.state.course_groups; - newlist.splice(key,1); - this.setState({ - course_groups:newlist + is_public:e.target.checked }) } - - addgrouppublish=()=>{ - let newlist=this.state.course_groups; - newlist.push( { - course_group_id : undefined, - publish_time :"" - // moment(new Date()).format('YYYY-MM-DD HH:mm') - }) + RadioonChange=(e)=>{ this.setState({ - course_groups:newlist - }) + Radiovalue: e.target.value, + }); } render(){ - let {is_public,unified_setting,course_groups,datatime,description,datalist,course_group_publish_timestype}=this.state; + let {datatime,description,datalist}=this.state; const uploadProps = { width: 600, - // https://github.com/ant-design/ant-design/issues/15505 - // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。 - // showUploadList: false, action: `${getUrl()}/api/attachments.json`, onChange: this.handleChange, onRemove: this.onAttachmentRemove, @@ -401,9 +284,11 @@ class Selectsetting extends Component{ return isLt150M; }, }; - - - // console.log(this.props.has_course_groups) + const radioStyle = { + display: 'block', + height: '30px', + lineHeight: '30px', + }; return(
*/} - {/*{this.state.fileList.length===0?"":this.state.fileList.map((item,key)=>{*/} - {/*return(*/} - {/*

*/} - {/**/} - {/**/} - {/**/} - {/**/} - {/*{item.name}*/} - {/**/} - {/**/} - {/*{item.response===undefined?"":isNaN(bytesToSize(item.filesize))?"123":bytesToSize(item.filesize)}*/} - {/**/} - {/*this.onAttachmentRemove(item.response===undefined?"":item.response.id&&item.response.id)}>*/} - {/*

*/} - {/*)*/} - {/*})}*/} - {this.state.newfileListtypes===true?

请先上传资源

:""}

@@ -647,21 +501,6 @@ class Selectsetting extends Component{ margin-top:10px; } `} - - {/*

*/} - {/**/} - {/*勾选后所有用户可见,否则仅课堂成员可见*/} - {/**/} - {/*
*/} - {/*{this.props.has_course_groups&&this.props.has_course_groups===true?:""}*/} - {this.state.course_groupss&&this.state.course_groupss.length>0? - 统一设置(选中则所有分班使用相同的发布设置,否则各个单独设置) - :""} - - - - {/*this.props.has_course_groups&&this.props.has_course_groups===true?:""*/} -
- {unified_setting===false? - this.state.course_groups&&this.state.course_groups.map((item,key)=>{ - return( -
- - - - - - this.onChangeTimepublishs(e,index,key)} - // onChange={ this.onChangeTimepublish } - disabledTime={disabledDateTime} - disabledDate={disabledDate} - /> - - {key!=0?this.deletegrouppublish(key)}>:""} - {key===course_groups.length-1?:""} -
- ) - }):""} -
- + {this.props.course_is_public===true?
+ 公开: + 选中,所有用户可见,否则课堂成员可见 + +
:""}

- {unified_setting===true? -

- - - -

:""} - {/*{this.state.course_group_idtypes===true?

请选择分班

:""}*/} - - {/*{course_group_publish_timestype===true?

请填写完整

:""}*/} + +
+ 发布设置: + + + 立即发布 + + + 延迟发布 + + + (按照设置的时间定时发布) + +
+ {this.state.descriptiontypes===true?

描述不能超过最大限制:100个字符

:""} + {this.state.Radiovaluetype===true?

发布时间不能为空

:""}
diff --git a/public/react/src/modules/courses/coursesPublic/sendResource.js b/public/react/src/modules/courses/coursesPublic/sendResource.js index fbc2ebeb2..bf810a140 100644 --- a/public/react/src/modules/courses/coursesPublic/sendResource.js +++ b/public/react/src/modules/courses/coursesPublic/sendResource.js @@ -1,5 +1,5 @@ import React,{ Component } from "react"; -import { Modal,Checkbox,Upload,Button,Icon,message,DatePicker,Select,Tooltip} from "antd"; +import { Modal,Checkbox,Upload,Button,Icon,message,DatePicker,Select,Tooltip,Radio} from "antd"; import axios from 'axios'; import Modals from '../../modals/Modals'; import {getUrl,handleDateString,bytesToSize,appendFileSizeToUploadFileAll} from 'educoder'; @@ -40,7 +40,6 @@ class Sendresource extends Component{ ModalSave:"", fileListtype:false, loadtype:false, - is_unified_setting:true, is_public:false, datatime:undefined, // moment(new Date()).format('YYYY-MM-DD HH:mm:ss'), @@ -50,7 +49,9 @@ class Sendresource extends Component{ publish_time :"" }], course_groups:undefined, - course_groups_count:undefined + course_groups_count:undefined, + Radiovalue:0, + Radiovaluetype:false } } @@ -101,37 +102,6 @@ class Sendresource extends Component{ } } - // onAttachmentRemove = (file) => { - // - // this.setState({ - // fileListtype:false, - // }) - // // confirm({ - // // title: '确定要删除这个附件吗?', - // // okText: '确定', - // // cancelText: '取消', - // // // content: 'Some descriptions', - // // onOk: () => { - // // this.deleteAttachment(file) - // // }, - // // onCancel() { - // // console.log('Cancel'); - // // }, - // // }); - // // return false; - // - // // this.setState({ - // // Modalstype:true, - // // Modalstopval:'确定要删除这个附件吗?', - // // ModalSave: ()=>this.deleteAttachment(file), - // // ModalCancel:this.cancelAttachment - // // }) - // // return false; - // - // this.deleteAttachment(file); - // } - - onAttachmentRemove = (file) => { if(!file.percent || file.percent == 100){ const url = `/attachments/${file.response ? file.response.id : file.uid}.json` @@ -174,8 +144,7 @@ class Sendresource extends Component{ } Saves=()=>{ - let id=this.props.categoryid; - let {fileList,description,is_public,is_unified_setting,datatime,course_group_publish_times} =this.state; + let {fileList,description,is_public,datatime,Radiovalue} =this.state; let newfileList=[]; for(var list of fileList){ @@ -188,17 +157,19 @@ class Sendresource extends Component{ }) return } - // if(is_unified_setting===false){ - // course_group_publish_times.forEach((item,key)=>{ - // if(item.course_group_id===undefined||item.publish_time===undefined){ - // this.setState({ - // course_group_publish_timestype:true - // }) - // return - // } - // }) - // - // } + + if(this.state.Radiovalue===1){ + if(datatime===undefined||datatime===null||datatime=== ""){ + this.setState({ + Radiovaluetype:true + }) + return + }else{ + this.setState({ + Radiovaluetype:false + }) + } + } @@ -222,22 +193,14 @@ class Sendresource extends Component{ course_second_category_id:this.props.coursesidtype===undefined||this.props.coursesidtype==="node"?0:attachmentId, attachment_ids:newfileList, is_public:is_public, - is_unified_setting:is_unified_setting, - publish_time:is_unified_setting===true?datatime===undefined? moment(new Date()).format('YYYY-MM-DD HH:mm'):datatime:undefined, + publish_time:Radiovalue===1?datatime===undefined? undefined:datatime:undefined, description:description, - course_group_publish_times:is_unified_setting===false?course_group_publish_times:undefined + delay_publish:Radiovalue, }).then((result)=>{ if(result.data.status===0){ - // this.setState({ - // Modalstype:true, - // Modalstopval:result.data.message, - // ModalSave:this.ModalCancelModalCancel, - // loadtype:true - // }) this.ModalCancelModalCancel(); this.props.updataleftNavfun(); - // this.props.showNotification(result.data.message); this.props.showNotification("上传资源成功"); this.props.setupdate(this.props.attachmentId) } @@ -253,14 +216,6 @@ class Sendresource extends Component{ }) } - onChangesetting=(e)=>{ - - this.setState({ - is_unified_setting:e.target.checked - }) - - } - onChangepublic=(e)=>{ this.setState({ @@ -289,50 +244,15 @@ class Sendresource extends Component{ } - selectassigngroups=(e,index,key)=>{ - let {course_group_publish_times}=this.state; - let newgroup_publish=course_group_publish_times; - for(var i=0; i{ this.setState({ - course_group_publish_times:newgroup_publish, - }) + Radiovalue: e.target.value, + }); } - - deletegrouppublish=(key)=>{ - let newlist=this.state.course_group_publish_times; - newlist.splice(key,1); - this.setState({ - course_group_publish_times:newlist - }) - } - - addgrouppublish=()=>{ - let newlist=this.state.course_group_publish_times; - newlist.push( { - course_group_id : undefined, - publish_time :undefined - }) - this.setState({ - course_group_publish_times:newlist - }) - } - render(){ - let {settextarea,newfileListtype,descriptiontype, - course_group_publish_timestype, - Modalstopval, - ModalCancel, - ModalSave, - loadtype, - is_unified_setting, + let { newfileListtype,descriptiontype, is_public, datatime, - course_group_publish_times, - course_groups }=this.state; const uploadProps = { @@ -350,7 +270,11 @@ class Sendresource extends Component{ return isLt150M; }, }; - + const radioStyle = { + display: 'block', + height: '30px', + lineHeight: '30px', + }; return(
{/*提示*/} @@ -389,6 +313,7 @@ class Sendresource extends Component{ margin-right: 5px; } .ant-upload-list-item:hover .ant-upload-list-item-info{ + padding: 0 12px 0 0px; background-color:#fff; } .upload_1 .ant-upload-list { @@ -437,42 +362,12 @@ class Sendresource extends Component{ - (单个文件最大150M) + (单个文件最大150M) :""}

- {/**/} - {/*{this.state.fileList.length===0?"":this.state.fileList.map((item,key)=>{*/} - {/*debugger*/} - {/*return(*/} - {/*

*/} - {/**/} - {/**/} - {/**/} - {/**/} - {/*{item.name}*/} - {/**/} - {/**/} - {/*{item.response===undefined?"":isNaN(bytesToSize(item.filesize))?"":bytesToSize(item.filesize)}*/} - {/**/} - {/*this.onAttachmentRemove(item.response===undefined?"":item.response.id&&item.response.id)}>*/} - {/*

*/} - {/*)*/} - {/*})}*/} + {newfileListtype===true&&this.state.fileListtype===false?

请先上传资源

:""} @@ -484,13 +379,12 @@ class Sendresource extends Component{ } `} - {/*
*/} - {/*勾选后所有用户可见,否则仅课堂成员可见*/} - {/**/} + {this.props.course_is_public===true?
+ 公开: + 选中,所有用户可见,否则课堂成员可见 + +
:""} - {this.state.course_groups_count&&this.state.course_groups_count>0? - 统一设置(选中则所有分班使用相同的发布设置,否则各个单独设置) - :""} -
- {is_unified_setting===false? - course_group_publish_times.map((item,key)=>{ - return( -
- - - - this.onChangeTimepublish(e,index,key,2)} - // onChange={ this.onChangeTimepublish } - disabledTime={disabledDateTime} - disabledDate={disabledDate} - /> - {key!=0?this.deletegrouppublish(key)}>:""} - {key===course_group_publish_times.length-1&&key:""} -
- ) - }) - - :""} -
-

- {is_unified_setting===true?

- - this.onChangeTimepublish(e,index,undefined,1)} - disabledTime={disabledDateTime} - disabledDate={disabledDate} - /> - -

:""} + +
+ 发布设置: + + + 立即发布 + + + 延迟发布 + this.onChangeTimepublish(e,index,undefined,1)} + disabledTime={disabledDateTime} + disabledDate={disabledDate} + disabled={this.state.Radiovalue===1?false:true} + /> + + (按照设置的时间定时发布) + +
+ {/*{course_group_publish_timestype===true?

请填写完整

:""}*/} {descriptiontype===true?

请输入资源描述,最大限制100个字符

:""} + {this.state.Radiovaluetype===true?

发布时间不能为空

:""}
{this.props.Cancelname} this.Saves()}>{this.props.Savesname} diff --git a/public/stylesheets/educoder/edu-main.css b/public/stylesheets/educoder/edu-main.css index 64663634c..6e2fa2b7c 100644 --- a/public/stylesheets/educoder/edu-main.css +++ b/public/stylesheets/educoder/edu-main.css @@ -197,6 +197,7 @@ input::-ms-clear{display:none;} .color-white{color: #ffffff!important;} /*黑色*/ .color-dark{color: #05101a!important;} +.color-ooo{color: #000!important;} /*灰色*/ .color-grey-name{color: #1A0B00!important;} .color-grey-fa{color: #FAFAFA!important;}