Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun

# Conflicts:
#	public/react/src/modules/paths/PathDetail/DetailTop.js
#	public/react/src/modules/paths/PathDetail/PathDetailIndex.js
dev_oauth
杨树林 6 years ago
commit b36aeb5293

@ -42,4 +42,13 @@ module Util
return '' if str.blank?
str.gsub(/<\/?.*?>/, '').gsub(/[\n\t\r]/, '').gsub(/&nbsp;/, '')
end
def conceal(str, type = nil)
str = str.to_s
case type
when :phone then "#{str[0..2]}***#{str[-4..-1]}"
when :email then "#{str[0..2]}***#{str[str.rindex('@')..-1]}"
else "#{str[0..2]}***#{str[-3..-1]}"
end
end
end

@ -11,7 +11,7 @@ class Users::BindEmailService < ApplicationService
def call
Users::BindEmailForm.new(params).validate!
raise Error, '该邮箱已被绑定' if User.where.not(id: user.id).exists?(mail: params[:email])
raise Error, '该邮箱已被其他账号绑定' if User.where.not(id: user.id).exists?(mail: params[:email])
code = VerificationCode.where(email: params[:email], code: params[:code], code_type: 5).last
raise Error, '验证码无效' unless code&.effective?

@ -11,7 +11,7 @@ class Users::BindPhoneService < ApplicationService
def call
Users::BindPhoneForm.new(params).validate!
raise Error, '该手机号已被绑定' if User.where.not(id: user.id).exists?(phone: params[:phone])
raise Error, '该手机号已被其他账号绑定' if User.where.not(id: user.id).exists?(phone: params[:phone])
code = VerificationCode.where(phone: params[:phone], code: params[:code], code_type: 4).last
raise Error, '验证码无效' unless code&.effective?

@ -58,7 +58,7 @@ namespace :public_course do
# 更新某个课程的某类时间
# 执行示例 bundle exec rake public_course:time args=-1,2932,1,1
# 执行示例 RAILS_ENV=production bundle exec rake public_course:time args=-1,2932,1,1
task :time => :environment do
# course_id = ENV['args'].split(",")[0] # 对应课堂的id
# type = ENV['args'].split(",")[1]
@ -69,14 +69,15 @@ namespace :public_course do
when 1
# 讨论区
created_on = random_time start_time, end_time
puts created_on
messages = Message.where(board_id: course.boards)
message_details = MessageDetail.where(message_id: messages)
messages.update_columns(created_on: created_on, updated_on: created_on)
message_details.update_columns(created_at: created_on, updated_at: created_on)
messages.each do |message|
message.update_columns(created_on: created_on, updated_on: created_on)
MessageDetail.where(message_id: message.id).update_all(created_at: created_on, updated_at: created_on)
end
when 2
# 作业
course.homework_commons.each do |homework|
course.homework_commons.each do |homework|
created_at = random_time(start_time, end_time)
publish_time = random_larger_time created_at, start_time, end_time
end_time = random_larger_time publish_time, start_time, end_time

@ -0,0 +1,67 @@
# add test user
namespace :sync do
task :add_user => :environment do
DCODES = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z)
user_count = ENV['args'].split(",")[0].to_i # 用户数
rand_chart = ENV['args'].split(",")[1] # 手机号或者邮箱等前面的随机数
puts rand_chart
puts user_count
(1..user_count).each do |i|
puts i
no = sprintf("%04d", i)
phone = "#{rand_chart}160731#{no}"
mail = "#{rand_chart}#{no}@educoder.net"
code = generate_identifier User, 8
login = "m" + code
l = "赵,钱,孙,李,周,吴,郑,王,冯,陈,褚,卫,蒋,沈,韩,杨,朱,秦,尤,许,何,吕,施,张,孔,曹,严,华,金,魏,陶,姜,黄".split(",")
f = "爱童,安妮,若婷,安煜,博,雷,梅,静,士红,大龙,冰波,慧娟,梅,婧婧,军,淋,真,维,涛,程程,
,,,,,,,,,,,,,,,,访,,,绿,,
,,访,,,,,,,,,,,,访,,,,,,,
,,,,,,,,,,,,,,,,,,绿,,,
,,,,,,,,,,访,,绿,,,,,,,,,
,,绿,,,,,,,,,,,,,,,,,,,
,绿,,,,,,,,,,绿,,,,,,,,,,
,,,,,,,,,,,,,,,,,".split(",")
lastname = l[rand(l.length)].strip + f[rand(f.length)].strip
edit_params = {
login: login,
admin: false,
type: User,
phone: phone,
lastname: lastname,
mail: mail,
authentication: 1,
professional_certification: 1,
profile_completed: true,
is_test: true
}
user = User.create!(edit_params)
puts "aa"
UserExtension.create!(user_id: user.id, school_id: 117)
puts i
end
end
# 随机生成字符
def generate_identifier(container, num)
code = DCODES.sample(num).join
if container == User
while container.exists?(login: code) do
code = DCODES.sample(num).join
end
else
while container.exists?(identifier: code) do
code = DCODES.sample(num).join
end
end
code
end
end

@ -193,10 +193,10 @@ function generateNewIndexJsp() {
}
const newVersion = '1.1.1'
let cdnHost = 'https://shixun.educoder.net'
cdnHost = 'http://cdn.educoder.net'
cdnHost = ''
cdnHost = 'https://ali-cdn.educoder.net'
// cdnHost = ''
var result = data.replace('/js/js_min_all.js', `${cdnHost}/react/build/js/js_min_all.js?v=${newVersion}`)
.replace('/js/js_min_all_2.js', `${cdnHost}/react/build/js/js_min_all_2.js?v=${newVersion}`)
// .replace('/js/js_min_all_2.js', `${cdnHost}/react/build/js/js_min_all_2.js?v=${newVersion}`)
.replace('/css/css_min_all.css', `${cdnHost}/react/build/css/css_min_all.css?v=${newVersion}`)
.replace('/css/iconfont.css', `${cdnHost}/react/build/css/iconfont.css?v=${newVersion}`)

@ -73,4 +73,13 @@ html, body {
}
.formItemInline .ant-form-item-control-wrapper {
flex: 1;
}
/* 兼容性 */
/* 火狐有滚动条时高度问题 */
@-moz-document url-prefix() {
.newContainers {
min-height: calc(100% - 60px) !important;
}
}

@ -1,4 +1,5 @@
const isDev = window.location.port == 3007;
export const TEST_HOST = "http://47.96.87.25:48080"
export function getImageUrl(path) {
// https://www.educoder.net
// https://testbdweb.trustie.net

@ -4,7 +4,7 @@ import { from } from '_array-flatten@2.1.2@array-flatten';
export { getImageUrl as getImageUrl, getUrl as getUrl, getUrl2 as getUrl2, setImagesUrl as setImagesUrl
, getUploadActionUrl as getUploadActionUrl, getUploadActionUrlOfAuth as getUploadActionUrlOfAuth
, getTaskUrlById as getTaskUrlById } from './UrlTool';
, getTaskUrlById as getTaskUrlById, TEST_HOST } from './UrlTool';
export { default as queryString } from './UrlTool2';
export { SnackbarHOC as SnackbarHOC } from './SnackbarHOC';

@ -539,6 +539,8 @@ pop_box_new(htmlvalue, 480, 182);
.then((response) => {
// {"status":1,"message":"Unauthorized. \u7528\u6237\u8ba4\u8bc1\u5931\u8d25."}
window.__fetchAllFlag = false;
if (response.data.status == 403) {
window.location.href = "/403";
return;

@ -1,108 +1,108 @@
import React,{ Component } from "react";
import { Modal,Checkbox,Upload,Button,Icon,message,Input} from "antd";
class ModulationModal extends Component{
constructor(props){
super(props);
this.state={
group_ids:[],
fileList:[],
textareaval:undefined,
Inputsval:undefined
}
}
Saves=()=>{
let {textareaval,Inputsval}=this.state;
if(textareaval===""||textareaval===undefined){
this.setState({
textareavaltype:true
})
return
}
this.setState({
textareavaltype: false
})
if(Inputsval===undefined||Inputsval===""){
this.setState({
Inputsvaltype:true
})
return
}
this.props.Saves(textareaval,Inputsval)
}
settextarea=(e)=>{
this.setState({
textareaval:e.target.value
})
}
setInputs=(e)=>{
var value=parseInt(e.target.value)
if(isNaN(value)){
value=0
}else{
if(value<0||value>100){
value=0
}
}
this.setState({
Inputsval:value
})
}
render(){
let {textareaval,Inputsval,textareavaltype,Inputsvaltype}=this.state;
return(
<div>
<Modal
keyboard={false}
className={"HomeworkModal"}
title={this.props.modalname || '调分'}
visible={this.props.visible}
closable={false}
footer={null}
destroyOnClose={true}
>
<div className="task-popup-content">
<p className="task-popup-text-center font-16">
<span className={"color-dark-21"}>该学生的最终成绩将不会按照评分规则进行计算</span>
</p>
<div className="clearfix">
<textarea
className="winput-100-150"
placeholder="请填写您对作品调分的原因"
value={textareaval}
onInput={this.settextarea}
></textarea>
<li style={{height:"20px",lineHeight:"20px"}}><span className={textareavaltype===true?"color-red":"none"}>原因不能为空</span></li>
</div>
<li>
<Input style={{
width: '20%',
}}
placeholder="请填写分数"
value={Inputsval}
onInput={this.setInputs}/> <span className="ml10"></span>
</li>
<li style={{height:"20px",lineHeight:"20px"}}><span className={Inputsvaltype===true?"color-red":"none"}>分数不能为空</span></li>
<div className="clearfix edu-txt-center">
<a className="task-btn color-white mr30" onClick={this.props.Cancel}>{this.props.Cancelname || '取消'}</a>
<a className="task-btn task-btn-orange" onClick={this.Saves}>{this.props.Savesname || '保存'}</a>
</div>
</div>
</Modal>
</div>
)
}
}
import React,{ Component } from "react";
import { Modal,Checkbox,Upload,Button,Icon,message,Input} from "antd";
class ModulationModal extends Component{
constructor(props){
super(props);
this.state={
group_ids:[],
fileList:[],
textareaval:undefined,
Inputsval:undefined
}
}
Saves=()=>{
let {textareaval,Inputsval}=this.state;
if(textareaval===""||textareaval===undefined){
this.setState({
textareavaltype:true
})
return
}
this.setState({
textareavaltype: false
})
if(Inputsval===undefined||Inputsval===""){
this.setState({
Inputsvaltype:true
})
return
}
this.props.Saves(textareaval,Inputsval)
}
settextarea=(e)=>{
this.setState({
textareaval:e.target.value
})
}
setInputs=(e)=>{
var value=parseInt(e.target.value)
if(isNaN(value)){
value=0
}else{
if(value<0||value>100){
value=0
}
}
this.setState({
Inputsval:value
})
}
render(){
let {textareaval,Inputsval,textareavaltype,Inputsvaltype}=this.state;
return(
<div>
<Modal
keyboard={false}
className={"HomeworkModal"}
title={this.props.modalname || '调分'}
visible={this.props.visible}
closable={false}
footer={null}
destroyOnClose={true}
>
<div className="task-popup-content">
<p className="task-popup-text-center font-16 mb20">
<span className={"color-dark-21"}>该学生的最终成绩将不会按照评分规则进行计算</span>
</p>
<div className="clearfix">
<textarea
className="winput-100-150"
placeholder="请填写您对作品调分的原因"
value={textareaval}
onInput={this.settextarea}
></textarea>
<li style={{height:"20px",lineHeight:"20px"}}><span className={textareavaltype===true?"color-red":"none"}>原因不能为空</span></li>
</div>
<li>
<Input style={{
width: '20%',
}}
placeholder="请填写分数"
value={Inputsval}
onInput={this.setInputs}/> <span className="ml10"></span>
</li>
<li style={{height:"20px",lineHeight:"20px"}}><span className={Inputsvaltype===true?"color-red":"none"}>分数不能为空</span></li>
<div className="clearfix edu-txt-center">
<a className="task-btn color-white mr30" onClick={this.props.Cancel}>{this.props.Cancelname || '取消'}</a>
<a className="task-btn task-btn-orange" onClick={this.Saves}>{this.props.Savesname || '保存'}</a>
</div>
</div>
</Modal>
</div>
)
}
}
export default ModulationModal;

@ -632,89 +632,89 @@ class Selectsetting extends Component{
{this.state.newfileListtypes===true?<p className={"color-red"}>请先上传资源</p>:""}
<p className={"winth540"}>
<style>{`
.ant-checkbox-wrapper{
margin-left:0px !important;
margin-top:10px;
}
`}</style>
<div className={this.state.fileListtype===true?"mt30":""}>
<Checkbox
checked={is_public}
onChange={this.onChangepublics}>
<span className={"font-14"}>勾选后所有用户可见否则仅课堂成员可见</span>
</Checkbox>
</div>
{/*{this.props.has_course_groups&&this.props.has_course_groups===true?:""}*/}
{/*{this.state.course_groupss&&this.state.course_groupss.length>0?<Checkbox*/}
{/*checked={unified_setting}*/}
{/*onChange={this.onChangesettings}>*/}
{/*<span>统一设置</span><span className={"font-14 color-grey-9"}>(选中则所有分班使用相同的发布设置,否则各个单独设置)</span>*/}
{/*</Checkbox>:""}*/}
<style>
{`
.Selectleft20{
margin-left: 20px !important;
width: 176px;
height: 40px;
}
.resourcebox{
max-height:150px;
overflow: auto;
}
`}
</style>
{/*this.props.has_course_groups&&this.props.has_course_groups===true?:""*/}
<div className={"resourcebox"}>
{unified_setting===false?
this.state.course_groups&&this.state.course_groups.map((item,key)=>{
return(
<div className={"mt10 "} key={key}>
<Select placeholder="请选择分班名称"
value={item.course_group_id}
style={{ width: 200 }}
onChange={(e,index)=>this.selectassigngroups(e,index,key)}
>
{ this.state.course_groupss&&this.state.course_groupss.map((item,key)=>{
return(
<Option value={item.id} key={key}>{item.name}</Option>
)
})}
</Select>
<DatePicker
showToday={false}
dropdownClassName="hideDisable"
showTime={{ format: 'HH:mm' }}
format="YYYY-MM-DD HH:mm"
locale={locale}
placeholder="请选择发布时间"
id={"startimes"}
className={"Selectleft20"}
width={"200px"}
value={item.publish_time===undefined||item.publish_time===""?"":item.publish_time===null?"":moment(item.publish_time, dateFormat)}
onChange={(e,index)=>this.onChangeTimepublishs(e,index,key)}
// onChange={ this.onChangeTimepublish }
disabledTime={disabledDateTime}
disabledDate={disabledDate}
/>
{key!=0?<i className="iconfont icon-shanchu color-grey-c font-14 font-n ml20" onClick={()=>this.deletegrouppublish(key)}></i>:""}
{key===course_groups.length-1?<i className="iconfont icon-tianjiafangda color-green ml15" onClick={this.addgrouppublish}></i>:""}
</div>
)
}):""}
</div>
</p>
{/*<p className={"winth540"}>*/}
{/*<style>{`*/}
{/*.ant-checkbox-wrapper{*/}
{/*margin-left:0px !important;*/}
{/*margin-top:10px;*/}
{/*}*/}
{/*`}</style>*/}
{/*<div className={this.state.fileListtype===true?"mt30":""}>*/}
{/*<Checkbox*/}
{/*checked={is_public}*/}
{/*onChange={this.onChangepublics}>*/}
{/*<span className={"font-14"}>勾选后所有用户可见,否则仅课堂成员可见</span>*/}
{/*</Checkbox>*/}
{/*</div>*/}
{/*/!*{this.props.has_course_groups&&this.props.has_course_groups===true?:""}*!/*/}
{/*/!*{this.state.course_groupss&&this.state.course_groupss.length>0?<Checkbox*!/*/}
{/*/!*checked={unified_setting}*!/*/}
{/*/!*onChange={this.onChangesettings}>*!/*/}
{/*/!*<span>统一设置</span><span className={"font-14 color-grey-9"}>(选中则所有分班使用相同的发布设置,否则各个单独设置)</span>*!/*/}
{/*/!*</Checkbox>:""}*!/*/}
{/*<style>*/}
{/*{`*/}
{/*.Selectleft20{*/}
{/*margin-left: 20px !important;*/}
{/*width: 176px;*/}
{/*height: 40px; */}
{/*}*/}
{/*.resourcebox{*/}
{/*max-height:150px;*/}
{/*overflow: auto;*/}
{/*}*/}
{/*`}*/}
{/*</style>*/}
{/*/!*this.props.has_course_groups&&this.props.has_course_groups===true?:""*!/*/}
{/*<div className={"resourcebox"}>*/}
{/*{unified_setting===false?*/}
{/*this.state.course_groups&&this.state.course_groups.map((item,key)=>{*/}
{/*return(*/}
{/*<div className={"mt10 "} key={key}>*/}
{/*<Select placeholder="请选择分班名称"*/}
{/*value={item.course_group_id}*/}
{/*style={{ width: 200 }}*/}
{/*onChange={(e,index)=>this.selectassigngroups(e,index,key)}*/}
{/*>*/}
{/*{ this.state.course_groupss&&this.state.course_groupss.map((item,key)=>{*/}
{/*return(*/}
{/*<Option value={item.id} key={key}>{item.name}</Option>*/}
{/*)*/}
{/*})}*/}
{/*</Select>*/}
{/*<DatePicker*/}
{/*showToday={false}*/}
{/*dropdownClassName="hideDisable"*/}
{/*showTime={{ format: 'HH:mm' }}*/}
{/*format="YYYY-MM-DD HH:mm"*/}
{/*locale={locale}*/}
{/*placeholder="请选择发布时间"*/}
{/*id={"startimes"}*/}
{/*className={"Selectleft20"}*/}
{/*width={"200px"}*/}
{/*value={item.publish_time===undefined||item.publish_time===""?"":item.publish_time===null?"":moment(item.publish_time, dateFormat)}*/}
{/*onChange={(e,index)=>this.onChangeTimepublishs(e,index,key)}*/}
{/*// onChange={ this.onChangeTimepublish }*/}
{/*disabledTime={disabledDateTime}*/}
{/*disabledDate={disabledDate}*/}
{/*/>*/}
{/*{key!=0?<i className="iconfont icon-shanchu color-grey-c font-14 font-n ml20" onClick={()=>this.deletegrouppublish(key)}></i>:""}*/}
{/*{key===course_groups.length-1?<i className="iconfont icon-tianjiafangda color-green ml15" onClick={this.addgrouppublish}></i>:""}*/}
{/*</div>*/}
{/*)*/}
{/*}):""}*/}
{/*</div>*/}
{/*</p>*/}
<style>
{`
#startime .ant-calendar-picker-icon{
@ -723,7 +723,7 @@ class Selectsetting extends Component{
`}
</style>
{unified_setting===true?
<p className={"mt10"}>
<p className={this.state.fileListtype===true?"mt30":""}>
<span>
<DatePicker
showToday={false}

@ -469,81 +469,81 @@ class Sendresource extends Component{
{newfileListtype===true&&this.state.fileListtype===false?<p className={"color-red"}>请先上传资源</p>:""}
<p className={"winth540"}>
<style>{`
.ant-checkbox-wrapper{
margin-left:0px !important;
margin-top:10px;
}
`}</style>
<div className={this.state.fileListtype===true?"mt30":""}></div><Checkbox checked={is_public} onChange={this.onChangepublic}>
<span className={"font-14"}>勾选后所有用户可见否则仅课堂成员可见</span>
</Checkbox>
{/*{this.state.course_groups_count&&this.state.course_groups_count>0?<Checkbox checked={is_unified_setting} onChange={this.onChangesetting}>*/}
{/*<span>统一设置</span><span className={"font-14 color-grey-9"}>(选中则所有分班使用相同的发布设置,否则各个单独设置)</span>*/}
{/*</Checkbox>:""}*/}
<style>{`
.Selectleft20{
margin-left: 20px !important;
width: 176px;
height: 40px;
}
#startimes .ant-calendar-picker-icon{
margin-top:-11px;
}
.resourcebox{
max-height:150px;
overflow: auto;
}
`}</style>
<div className={"resourcebox"}>
{is_unified_setting===false?
course_group_publish_times.map((item,key)=>{
return(
<div className={"mt10"} key={key}>
<Select placeholder="请选择分班名称"
value={item.course_group_id}
style={{ width: 200 }}
onChange={(e,index)=>this.selectassigngroups(e,index,key)}
>
{course_groups&&course_groups.map((item,key)=>{
return(
<Option value={item.id} key={key}>{item.name}</Option>
)
})}
</Select>
<DatePicker
dropdownClassName="hideDisable"
showTime={{ format: 'HH:mm' }}
locale={locale}
showToday={false}
format={dateFormat}
placeholder="请选择发布时间"
id={"startimes"}
className={"Selectleft20 "}
width={"200px"}
value={item.publish_time===undefined||item.publish_time===""?undefined:moment(item.publish_time, dateFormat)}
onChange={(e,index)=>this.onChangeTimepublish(e,index,key,2)}
// onChange={ this.onChangeTimepublish }
disabledTime={disabledDateTime}
disabledDate={disabledDate}
/>
{key!=0?<i className="iconfont icon-shanchu color-grey-c font-14 font-n ml20" onClick={()=>this.deletegrouppublish(key)}></i>:""}
{key===course_group_publish_times.length-1&&key<this.state.course_groups_count-1?<i className="iconfont icon-tianjiafangda color-green ml15" onClick={this.addgrouppublish}></i>:""}
</div>
)
})
:""}
</div>
</p>
{is_unified_setting===true?<p className={"mt10"}>
{/*<p className={"winth540"}>*/}
{/*<style>{`*/}
{/*.ant-checkbox-wrapper{*/}
{/*margin-left:0px !important;*/}
{/*margin-top:10px;*/}
{/*}*/}
{/*`}</style>*/}
{/*<div className={this.state.fileListtype===true?"mt30":""}></div><Checkbox checked={is_public} onChange={this.onChangepublic}>*/}
{/*<span className={"font-14"}>勾选后所有用户可见,否则仅课堂成员可见</span>*/}
{/*</Checkbox>*/}
{/*/!*{this.state.course_groups_count&&this.state.course_groups_count>0?<Checkbox checked={is_unified_setting} onChange={this.onChangesetting}>*!/*/}
{/*/!*<span>统一设置</span><span className={"font-14 color-grey-9"}>(选中则所有分班使用相同的发布设置,否则各个单独设置)</span>*!/*/}
{/*/!*</Checkbox>:""}*!/*/}
{/*<style>{`*/}
{/*.Selectleft20{*/}
{/*margin-left: 20px !important;*/}
{/*width: 176px;*/}
{/*height: 40px; */}
{/*}*/}
{/*#startimes .ant-calendar-picker-icon{*/}
{/*margin-top:-11px;*/}
{/*}*/}
{/*.resourcebox{*/}
{/*max-height:150px;*/}
{/*overflow: auto;*/}
{/*}*/}
{/*`}</style>*/}
{/*<div className={"resourcebox"}>*/}
{/*{is_unified_setting===false?*/}
{/*course_group_publish_times.map((item,key)=>{*/}
{/*return(*/}
{/*<div className={"mt10"} key={key}>*/}
{/*<Select placeholder="请选择分班名称"*/}
{/*value={item.course_group_id}*/}
{/*style={{ width: 200 }}*/}
{/*onChange={(e,index)=>this.selectassigngroups(e,index,key)}*/}
{/*>*/}
{/*{course_groups&&course_groups.map((item,key)=>{*/}
{/*return(*/}
{/*<Option value={item.id} key={key}>{item.name}</Option>*/}
{/*)*/}
{/*})}*/}
{/*</Select>*/}
{/*<DatePicker*/}
{/*dropdownClassName="hideDisable"*/}
{/*showTime={{ format: 'HH:mm' }}*/}
{/*locale={locale}*/}
{/*showToday={false}*/}
{/*format={dateFormat}*/}
{/*placeholder="请选择发布时间"*/}
{/*id={"startimes"}*/}
{/*className={"Selectleft20 "}*/}
{/*width={"200px"}*/}
{/*value={item.publish_time===undefined||item.publish_time===""?undefined:moment(item.publish_time, dateFormat)}*/}
{/*onChange={(e,index)=>this.onChangeTimepublish(e,index,key,2)}*/}
{/*// onChange={ this.onChangeTimepublish }*/}
{/*disabledTime={disabledDateTime}*/}
{/*disabledDate={disabledDate}*/}
{/*/>*/}
{/*{key!=0?<i className="iconfont icon-shanchu color-grey-c font-14 font-n ml20" onClick={()=>this.deletegrouppublish(key)}></i>:""}*/}
{/*{key===course_group_publish_times.length-1&&key<this.state.course_groups_count-1?<i className="iconfont icon-tianjiafangda color-green ml15" onClick={this.addgrouppublish}></i>:""}*/}
{/*</div>*/}
{/*)*/}
{/*})*/}
{/*:""}*/}
{/*</div>*/}
{/*</p>*/}
{is_unified_setting===true?<p className={this.state.fileListtype===true?"mt30":"mt10"}>
<span>
<DatePicker
dropdownClassName="hideDisable"

@ -2,7 +2,7 @@ import React,{Component} from "React";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal} from "antd";
import {Link} from 'react-router-dom';
import TPMMDEditor from '../../../tpm/challengesnew/TPMMDEditor';
import { WordsBtn,getUrl ,bytesToSize,appendFileSizeToUploadFileAll} from 'educoder';
import { WordsBtn,getUrl ,bytesToSize,appendFileSizeToUploadFileAll,AttachmentList} from 'educoder';
import axios from 'axios';
import Modals from '../../../modals/Modals';
import '../../css/Courses.css';
@ -419,35 +419,35 @@ class GraduationTasksedit extends Component{
)}
</Form.Item>
<input type="hidden" id='descriptiontypes' />
<AttachmentList {...this.props} {...this.state} attachments={attachments&&attachments}></AttachmentList>
{/*{attachments&&attachments.map((item,key)=>{*/}
{attachments&&attachments.map((item,key)=>{
return(
<div className="color-grey mt5"
key={key}
>
<a className="color-grey ml3">
<i className="font-14 color-green iconfont icon-fujian mr8" aria-hidden="true"></i>
</a>
<a
href={item.url}
className="mr12 color9B9B" length="58">
{item.title}
</a>
<span className="color656565 mt2 color-grey-6 font-12 mr8">
{item.filesize}
</span>
{item.delete===true?
<i className="font-14 iconfont icon-guanbi "
id={item.id}
onClick={()=>this.onAttachmentRemove(item.id)}
aria-hidden="true">
</i>:""}
</div>
)
})}
{/*return(*/}
{/*<div className="color-grey mt5"*/}
{/*key={key}*/}
{/*>*/}
{/*<a className="color-grey ml3">*/}
{/*<i className="font-14 color-green iconfont icon-fujian mr8" aria-hidden="true"></i>*/}
{/*</a>*/}
{/*<a*/}
{/*href={item.url}*/}
{/*className="mr12 color9B9B" length="58">*/}
{/*{item.title}*/}
{/*</a>*/}
{/*<span className="color656565 mt2 color-grey-6 font-12 mr8">*/}
{/*{item.filesize}*/}
{/*</span>*/}
{/*{item.delete===true?*/}
{/*<i className="font-14 iconfont icon-guanbi "*/}
{/*id={item.id}*/}
{/*onClick={()=>this.onAttachmentRemove(item.id)}*/}
{/*aria-hidden="true">*/}
{/*</i>:""}*/}
{/*</div>*/}
{/*)*/}
{/*})}*/}
<Upload {...uploadProps} fileList={this.state.fileList} className="upload_1 ml5">
<Button className="uploadBtn">
<Icon type="upload" /> 上传附件

@ -1,7 +1,7 @@
import React,{Component} from "React";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag} from "antd";
import {Link} from 'react-router-dom';
import { WordsBtn,markdownToHTML} from 'educoder';
import { WordsBtn,markdownToHTML,AttachmentList} from 'educoder';
import axios from 'axios';
import Modals from '../../../modals/Modals';
import DownloadMessageysl from "../../../modals/DownloadMessageysl";
@ -396,23 +396,23 @@ class GraduationTasksquestions extends Component{
}
<div>
{questionslist&&questionslist.attachments.map((item,key)=>{
return(
<div className="color-grey mt5">
<a className="color-grey">
<i className="font-14 color-green iconfont icon-fujian mr8" aria-hidden="true"></i>
</a>
<a href={item.url}
className="mr12" length="58">
{item.title}
</a>
<span className="color-grey mt2 color-grey-6 font-12">{item.filesize}</span>
</div>
)
})}
{/*{questionslist&&questionslist.attachments.map((item,key)=>{*/}
{/*return(*/}
{/*<div className="color-grey mt5">*/}
{/*<a className="color-grey">*/}
{/*<i className="font-14 color-green iconfont icon-fujian mr8" aria-hidden="true"></i>*/}
{/*</a>*/}
{/*<a href={item.url}*/}
{/*className="mr12" length="58">*/}
{/*{item.title}*/}
{/*</a>*/}
{/*<span className="color-grey mt2 color-grey-6 font-12">{item.filesize}</span>*/}
{/*</div>*/}
{/*)*/}
{/*})}*/}
<AttachmentList {...this.props} {...this.state} attachments={questionslist&&questionslist.attachments}></AttachmentList>
</div>
{questionslist&&questionslist.group_info?<div>

@ -298,6 +298,7 @@ class MainContentContainer extends Component {
}).then((fetchRepositoryCodeResponse) => {
// monaca 需要刷新,不然无法编辑
if (this.retryAndRefresh && fetchRepositoryCodeResponse.data.content) {
this.retryAndRefresh = false;
window.location.reload()
return;
}

@ -1,11 +1,11 @@
import React, { Component } from 'react';
import { TEST_HOST } from 'educoder'
export function loadSshScript(callback) {
let _url_origin = ``;
let prefix = 'react/build'
if (window.location.port == 3007) {
prefix = ''
_url_origin = 'https://newweb.educoder.net/';
// prefix = ''
_url_origin = TEST_HOST + '/' // 'https://newweb.educoder.net/';
} else {
// _url_origin = `https://testeduplus2.educoder.net/`;
_url_origin = '/';

@ -620,8 +620,8 @@ class DetailCardsEditAndAdd extends Component{
</div>
}
{this.props.detailInfoList===undefined?"":this.props.detailInfoList.allow_statistics===true?editPanel===false?<div className="click_add color-grey-9">
<span className="color-blue_4C" onClick={this.addStage}>+点击新建阶段</span>1
{this.props.detailInfoList===undefined?"":this.props.detailInfoList.allow_statistics===true?editPanel===false?<div className="click_add color-grey-9" onClick={this.addStage}>
<span className="color-blue_4C" >+点击新建阶段</span>1
</div>:'':''}
</div>
)

@ -82,11 +82,12 @@ class DetailCardsEditAndEdit extends Component{
//打开选择实训弹框初始化tag标签和列表
changeTag(id,search){
this.setState({
ChooseShixunListshixun_list:[],
page:1,
hometypepvisible:true
})
let pathId=this.props.pathid;
let {page}=this.state;
let url='/paths/'+pathId+'/choose_subject_shixun.json?page='+page
let url='/paths/'+pathId+'/choose_subject_shixun.json?page='+1
if(search!="" && search!=undefined){
url+="&search="+search;
}
@ -523,7 +524,7 @@ class DetailCardsEditAndEdit extends Component{
`
}
</style>
<div className="over180 pl20 pr20"
{ChooseShixunListshixun_list && ChooseShixunListshixun_list.length===0?"":<div className="over180 pl20 pr20"
onScroll={this.contentViewScrolledit}
>
<Checkbox.Group style={{ width: '100%' }} onChange={this.shixunhomeworkedit}>
@ -552,7 +553,7 @@ class DetailCardsEditAndEdit extends Component{
})
}
</Checkbox.Group>
</div>
</div>}
<div className="mt20 marginauto clearfix edu-txt-center">
<a className="pop_close task-btn mr30 margin-tp26" onClick={this.cloasShixunBox}>取消</a>
<a className="task-btn task-btn-orange margin-tp26" id="submit_send_shixun" onClick={this.clickShixunchoose}>确定</a>

@ -476,7 +476,7 @@ class PathDetailIndex extends Component{
</div>
}
{
this.props.checkIfLogin()===false?"123213":progress === undefined ? "" : progress === null ? "" :
this.props.checkIfLogin()===false?"":progress === undefined ? "" : progress === null ? "" :
<div className="edu-back-white myProgress padding40-20 mb10">
<p className="mb20">
<span className="font-16 mr10">我的进展</span>

@ -37,7 +37,7 @@ function VideoUpload (props) {
</div>
</div>
<div>
<div className="courseForm">
<span className="titleLabel">标题</span>
<Input placeholder={`标题支持最多${MAX_LENGTH}个字符`} onInput={titleChange} maxLength={MAX_LENGTH} suffix={
<span className="color-grey-6 font-13">{String(title.length)}/{MAX_LENGTH}</span>

@ -61,6 +61,17 @@ function VideoUploadList (props) {
// alert("请先选择需要上传的文件!")
return
}
// avi、flv、f4v、m4v、mov、mp4、rmvb、swf、webm
if (file.name
&& file.name.indexOf('.avi') == -1 && file.name.indexOf('.flv') == -1
&& file.name.indexOf('.f4v') == -1 && file.name.indexOf('.m4v') == -1
&& file.name.indexOf('.mov') == -1 && file.name.indexOf('.mp4') == -1
&& file.name.indexOf('.rmvb') == -1 && file.name.indexOf('.swf') == -1
&& file.name.indexOf('.webm') == -1
) {
showNotification(`不支持的视频格式`)
return;
}
if (file.size > 200 * 1024 * 1024) {
// 超过200m TODO
clearInput()

Loading…
Cancel
Save