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

dev_video
杨树明 5 years ago
commit d19043e39a

@ -0,0 +1,49 @@
import React,{ Component } from "react";
import { Switch , Pagination } from 'antd';
import { NoneData } from 'educoder';
import LiveItem from './LiveItem';
import './video.css';
class Live extends Component{
render(){
const { liveData , lives , successFunc , admin , business , is_teacher , pageSize , changePage } = this.props;
const operation = admin || business || (is_teacher && this.props.checkIfProfessionalCertification())
return(
<div className="livePanel">
{
lives && lives.length > 0 ?
<React.Fragment>
<p className="font-grey-9 mt20 mb20 pl5"> <span className="color-orange">{liveData && liveData.total_count}</span> </p>
<div className="liveContent">
{
lives.map((item,key)=>{
return(
<LiveItem
item={item}
{...this.props}
{...this.state}
successFunc={()=>successFunc()}
operation={operation}
></LiveItem>
)
})
}
</div>
{
liveData && liveData.total_count > pageSize &&
<div className="mt30 mb50 edu-txt-center">
<Pagination showQuickJumper total={liveData.total_count} pageSize={pageSize} onChange={(page)=>changePage(page,'live')}></Pagination>
</div>
}
</React.Fragment>
:
<NoneData style={{width: '100%'}}></NoneData>
}
</div>
)
}
}
export default Live;

@ -0,0 +1,52 @@
import React,{ Component } from "react";
import { Switch } from 'antd';
import { getImageUrl } from 'educoder';
import axios from 'axios';
class LiveItem extends Component{
changeStatus=(flag,event,id)=>{
const url = `/live_links/${id}.json`;
axios.put(url,{
on_status:flag?1:0
}).then(result=>{
if(result){
this.props.showNotification(`直播已${flag?"开启":"关闭"}!`);
const { successFunc } = this.props;
successFunc && successFunc(1);
}
}).catch(error=>{
console.log(error);
})
}
render(){
const { item , operation } = this.props;
return(
<div className="liveItem">
<div className="lineMiddle livesMain">
<span className="lineMiddle">
<img alt={`${item.author_name}`} className="liveAuthor" src={getImageUrl(`images/${item.author_img}`)}/>
<label>{item.author_name}</label>
<span className={item.on_status?"labels living":"labels lived"}>{item.on_status?'已开播':'未开播'}</span>
</span>
{
operation &&
<Switch checkedChildren="on" unCheckedChildren="off" defaultChecked={item.on_status} onChange={(flag,event)=>this.changeStatus(flag,event,item.id)}></Switch>
}
</div>
<div className="lineMiddle mt15">
<div className="liveDesc">
<p><span className="task-hide-2">{item.description}</span></p>
</div>
{
item.on_status?
<a className="btns going" href={`${item.url}`}>进入</a>
:
<span className="btns ect">进入</span>
}
</div>
</div>
)
}
}
export default LiveItem;

@ -0,0 +1,79 @@
import React,{ Component } from "react";
import { Modal , Form , Input } from 'antd';
import './video.css';
import axios from 'axios';
const { TextArea } = Input;
class LiveNew extends Component{
constructor(props){
super(props);
this.state={
}
}
handleSubmit=()=>{
this.props.form.validateFields((err, values) => {
if(!err){
const CourseId=this.props.match.params.coursesId;
const url = `/courses/${CourseId}/live_links.json`;
axios.post(url,{
...values
}).then(result=>{
if(result){
this.props.showNotification("添加成功!");
const { setliveVisibel } = this.props;
setliveVisibel && setliveVisibel(false);
}
}).catch(error=>{
console.log(error);
})
}
})
}
render(){
const {getFieldDecorator} = this.props.form;
const { visible , setliveVisibel } = this.props;
return(
<Modal
visible={visible}
width="560px"
title={'直播设置'}
footer={null}
closable={false}
className="liveModal"
>
<div className="task-popup-content">
<Form onSubmit={this.handleSubmit}>
<Form.Item label={`直播链接`}>
{getFieldDecorator('url', {
rules: [{required: true, message: "请输入第三方直播链接"}],
})(
<Input placeholder="请输入第三方直播链接,如:腾讯课堂播放链接等。" />
)}
</Form.Item>
<Form.Item label={`直播说明`} style={{marginBottom:"0px"}}>
{getFieldDecorator('description', {
rules: [],
})(
<TextArea rows={4} placeholder="可在此介绍开播具体事项,如开播时间安排等。" />
)}
</Form.Item>
<p className="flex-middle" style={{justifyContent:"space-between"}}>
<span>EduCoder推荐您使用<a href="https://ke.qq.com/" target="_blank" className="color-blue">腾讯课堂</a></span>
<a href="https://pub.idqqimg.com/pc/misc/files/20200204/2e4cb765bef54f0c919c0ab8ab79d969.pdf" target="_blank" className="color-blue">下载操作指引</a>
</p>
</Form>
<div className="clearfix mt30 edu-txt-center">
<a onClick={()=>setliveVisibel(false)} className="task-btn mr30">取消</a>
<a type="submit" onClick={this.handleSubmit} className="task-btn task-btn-orange">确定</a>
</div>
</div>
</Modal>
)
}
}
const WrappedLiveNew = Form.create({name: 'LiveNew'})(LiveNew);
export default WrappedLiveNew;

@ -0,0 +1,222 @@
import React,{ Component } from "react";
import { Input , Pagination } from 'antd';
import { NoneData ,ActionBtn } from 'educoder';
import VideoUploadList from '../../user/usersInfo/video/VideoUploadList';
import VideoInReviewItem from '../../user/usersInfo/video/VideoInReviewItem';
import HeadlessModal from '../../user/usersInfo/common/HeadlessModal';
import EditVideoModal from '../../user/usersInfo/video/EditVideoModal'
import ClipboardJS from 'clipboard'
import './video.css';
import '../../user/usersInfo/video/InfosVideo.css'
const DEFAULT_VIDEO_WIDTH_IN_MD = "90%" // 400
const DEFAULT_VIDEO_HEIGHT_IN_MD = "55%" // 400
const videoEl = null;
let _clipboard = null;
class Video extends Component{
constructor(props){
super(props);
this.state={
videos:undefined,
count:0,
page:1,
videoId:undefined,
videoVisible:false,
visible:false
}
}
// 编辑的弹框visible
setVisible=(flag)=>{
this.setState({
visible:flag
})
}
setVideoVisible=(flag)=>{
this.setState({
videoVisible:flag
})
if (flag === false) {
if (_clipboard) {
this.setState({
videoId:undefined
})
_clipboard.listener.destroy();
_clipboard = null;
}
} else {
// videoEl.current && videoEl.current.play()
setTimeout(() => {
if (!_clipboard) {
_clipboard = new ClipboardJS('.copybtn');
_clipboard.on('success', (e) => {
this.props.showNotification('复制成功');
});
}
}, 200)
}
}
// 编辑成功后回调的方法
editSuccess=()=>{
const { page } = this.state;
this.props.showNotification("视频名称修改成功!");
const { listFunc } = this.props;
listFunc && listFunc(page);
}
onEditVideo=(item)=>{
let videoId = {
videoId: item.id,
title: item.title
}
this.setState({
videoId,
})
this.setVisible(true);
}
onMaskClick=(item)=> {
let videoId = {
videoId: item.id,
title: item.title,
file_url: item.file_url,
cover_url: item.cover_url
}
this.setState({
videoId
})
this.setVideoVisible(true);
}
setVideoVisible=(flag)=>{
this.setState({
videoVisible:flag
})
if (flag === false) {
if (_clipboard) {
this.setState({
videoId:undefined
})
_clipboard.listener.destroy();
_clipboard = null;
}
} else {
// videoEl.current && videoEl.current.play()
setTimeout(() => {
if (!_clipboard) {
_clipboard = new ClipboardJS('.copybtn');
_clipboard.on('success', (e) => {
this.props.showNotification('复制成功');
});
}
}, 200)
}
}
getCopyText = (file_url, cover_url)=>{
return `<video src="${file_url}" controls="true" controlslist="nodownload" width="${DEFAULT_VIDEO_WIDTH_IN_MD}" height="${DEFAULT_VIDEO_HEIGHT_IN_MD}" poster="${cover_url}">您的浏览器不支持 video 标签。</video>`
}
render(){
const { count , visible , videoVisible , videoId } = this.state;
const CourseId=this.props.match.params.coursesId;
const login=this.props.user&&this.props.user.login;
const _inputValue = videoId && this.getCopyText(videoId.file_url, videoId.cover_url);
const { admin , is_teacher ,business} = this.props.user;
const { videos , upload , uploadVideo , videoData , changePage ,pageSize } = this.props;
const operation = admin || business || (is_teacher && this.props.checkIfProfessionalCertification())
return(
<div>
<EditVideoModal {...this.props} visible={visible} setVisible={this.setVisible}
editSuccess={this.editSuccess}
{...videoId} CourseUser={login}
></EditVideoModal>
<HeadlessModal
visible={videoVisible}
setVisible={this.setVideoVisible}
className="showVideoModal"
width={800 - 1}
>
{
videoId &&
<video
autoplay="true"
ref={videoEl}
src={videoId.file_url} controls="true" controlslist="nodownload">
您的浏览器不支持 video 标签
</video>
}
<div className="df copyLine">
<Input value={_inputValue}
className="dark"
></Input>
<ActionBtn className="copybtn" data-clipboard-text={_inputValue}>复制视频地址</ActionBtn>
</div>
</HeadlessModal>
<div className="videoPanel">
{
upload ?
<VideoUploadList {...this.props} flag={true} CourseId={CourseId} CourseUser={login} successFunc={()=>uploadVideo()}></VideoUploadList>
:
<React.Fragment>
{
videos && videos.length > 0 ?
<React.Fragment>
<p className="font-grey-9 mt20 mb20 pl5"> <span className="color-orange">{videoData && videoData.count}</span> </p>
<div className="videoContent">
{
videos.map((item,key)=>{
return(
<VideoInReviewItem
{...this.props}
{...item}
key={item.id}
onEditVideo={this.onEditVideo}
onMaskClick={this.onMaskClick}
getCopyText={this.getCopyText}
operation={operation}
>
</VideoInReviewItem>
)
})
}
</div>
</React.Fragment>
:
<NoneData style={{width: '100%'}}></NoneData>
}
{
videoData && videoData.count > pageSize &&
<div className="mt30 mb50 edu-txt-center">
<Pagination showQuickJumper total={videoData.count} pageSize={pageSize} onChange={(page)=>changePage(page,'video')}></Pagination>
</div>
}
</React.Fragment>
}
</div>
</div>
)
}
}
export default Video;

@ -1,80 +1,75 @@
import React,{ Component } from "react"; import React,{ Component } from "react";
import { Input , Pagination } from 'antd';
import { WordsBtn , NoneData ,ActionBtn } from 'educoder';
import VideoItem from './VideoItem'; import { Menu, Spin } from 'antd';
import ClipboardJS from 'clipboard'
import { WordsBtn } from 'educoder';
import axios from 'axios'; import axios from 'axios';
import Videos from './Video';
import Lives from './Live';
import LivesNew from './LiveNew';
import VideoUploadList from '../../user/usersInfo/video/VideoUploadList';
import VideoInReviewItem from '../../user/usersInfo/video/VideoInReviewItem';
import HeadlessModal from '../../user/usersInfo/common/HeadlessModal';
import EditVideoModal from '../../user/usersInfo/video/EditVideoModal'
import './video.css'; import './video.css';
import '../../user/usersInfo/video/InfosVideo.css' import '../css/Courses.css';
import '../publicNav/nav.css';
const PAGE_SIZE = 15; const PAGE_SIZE = 15;
const DEFAULT_VIDEO_WIDTH_IN_MD = "90%" // 400 const LIVE_PAGE_SIZE = 10;
const DEFAULT_VIDEO_HEIGHT_IN_MD = "55%" // 400
const videoEl = null;
let _clipboard = null;
class VideoIndex extends Component{ class VideoIndex extends Component{
constructor(props){ constructor(props){
super(props); super(props);
this.state={ this.state={
page:1,
upload:false, upload:false,
videos:undefined, videos:undefined,
count:0, videoData:undefined,
page:1, type:"video",
isSpining:false,
lives:undefined,
liveData:undefined,
videoId:undefined, liveVisible:false
videoVisible:false,
visible:false
} }
} }
// 编辑的弹框visible checkType=(type,page)=>{
setVisible=(flag)=>{
this.setState({ this.setState({
visible:flag type,
isSpining:true
}) })
if(type === "video"){
this.getList(page);
}else{
this.getLiveList(page);
} }
setVideoVisible=(flag)=>{
this.setState({
videoVisible:flag
})
if (flag === false) {
if (_clipboard) {
this.setState({
videoId:undefined
})
_clipboard.listener.destroy();
_clipboard = null;
} }
} else {
// videoEl.current && videoEl.current.play()
setTimeout(() => { componentDidMount=()=>{
if (!_clipboard) { const { type ,page } = this.state;
_clipboard = new ClipboardJS('.copybtn'); this.checkType(type,page);
_clipboard.on('success', (e) => {
this.props.showNotification('复制成功');
});
} }
}, 200) // 获取直播列表
getLiveList=(page)=>{
const CourseId=this.props.match.params.coursesId;
const url = `/courses/${CourseId}/live_links.json`;
axios.get(url,{
params:{
page,
limit:LIVE_PAGE_SIZE
} }
}).then(result=>{
if(result){
this.setState({
liveData:result.data,
lives:result.data.lives,
isSpining:false
})
} }
// 编辑成功后回调的方法 }).catch(error=>{
editSuccess=()=>{ console.log(error);
const { page } = this.state; })
this.getList(page);
} }
// 获取视频列表 // 获取视频列表
getList=(page)=>{ getList=(page)=>{
const CourseId=this.props.match.params.coursesId; const CourseId=this.props.match.params.coursesId;
@ -88,8 +83,9 @@ class VideoIndex extends Component{
.then((response) => { .then((response) => {
if(response){ if(response){
this.setState({ this.setState({
count:response.data.count, videos:response.data.videos,
videos:response.data.videos videoData:response.data,
isSpining:false
}) })
} }
}).catch((error) => { }).catch((error) => {
@ -97,6 +93,22 @@ class VideoIndex extends Component{
}) })
} }
changeType=(e)=>{
this.setState({
type:e.key,
upload:false,
page:1
})
this.checkType(e.key,1);
}
changePage=(page,type)=>{
this.setState({
page
})
this.checkType(type,page);
}
onEditVideo=(item)=>{ onEditVideo=(item)=>{
let videoId = { let videoId = {
videoId: item.id, videoId: item.id,
@ -115,144 +127,94 @@ class VideoIndex extends Component{
this.getList(page); this.getList(page);
} }
onMaskClick=(item)=> { toUpload =()=> {
let videoId = { const { admin , is_teacher,business} = this.props.user;
videoId: item.id, if (admin || business || (is_teacher && this.props.checkIfProfessionalCertification())) {
title: item.title,
file_url: item.file_url,
cover_url: item.cover_url
}
this.setState({ this.setState({
videoId type:"video",
upload:true
}) })
this.setVideoVisible(true); } else {
} this.props.showProfessionalCertificationDialog();
getCopyText = (file_url, cover_url)=>{
return `<video src="${file_url}" controls="true" controlslist="nodownload" width="${DEFAULT_VIDEO_WIDTH_IN_MD}" height="${DEFAULT_VIDEO_HEIGHT_IN_MD}" poster="${cover_url}">您的浏览器不支持 video 标签。</video>`
} }
componentDidMount=()=>{
const { page } = this.state;
this.getList(page);
} }
changePage=(page)=>{ // 直播设置后回调的方法
successFunc=()=>{
this.setState({ this.setState({
page type:"live",
page:1
}) })
this.getList(page); this.checkType("live",1);
} }
//直播设置弹框
toUpload =()=> { setliveVisibel=(flag)=>{
const { admin , is_teacher,business} = this.props.user;
if (admin || business || (is_teacher && this.props.checkIfProfessionalCertification())) {
this.setState({ this.setState({
upload:true liveVisible:flag,
type:"live"
}) })
} else { this.checkType("live",1);
this.props.showProfessionalCertificationDialog();
}
} }
render(){ render(){
const { count , videos , upload , visible , videoVisible , videoId } = this.state; const { videos , upload , videoData , type , liveData , lives , liveVisible , isSpining } = this.state;
const CourseId=this.props.match.params.coursesId; const { admin , is_teacher } = this.props.user;
const login=this.props.user&&this.props.user.login;
const _inputValue = videoId && this.getCopyText(videoId.file_url, videoId.cover_url);
const { admin , is_teacher ,business} = this.props.user;
// console.log(this.props && this.props.admin());
const operation = admin || business || (is_teacher && this.props.checkIfProfessionalCertification())
return( return(
<React.Fragment> <React.Fragment>
<div className="edu-back-white"> <LivesNew
<EditVideoModal {...this.props} visible={visible} setVisible={this.setVisible} visible={liveVisible}
editSuccess={this.editSuccess} setliveVisibel={this.setliveVisibel}
{...videoId} CourseUser={login} {...this.props}
></EditVideoModal> {...this.state}
<HeadlessModal ></LivesNew>
visible={videoVisible} <div className="edu-back-white" style={{marginBottom:"1px"}}>
setVisible={this.setVideoVisible}
className="showVideoModal" <div className="clearfix pl30 pr30 menuDiv">
width={800 - 1} <div className="task_menu_ul fl">
> <Menu mode="horizontal" selectedKeys={[type]} onClick={this.changeType}>
{ <Menu.Item key="video">视频</Menu.Item>
videoId && <Menu.Item key="live">直播</Menu.Item>
<video </Menu>
autoplay="true"
ref={videoEl}
src={videoId.file_url} controls="true" controlslist="nodownload">
您的浏览器不支持 video 标签
</video>
}
<div className="df copyLine">
<Input value={_inputValue}
className="dark"
></Input>
<ActionBtn className="copybtn" data-clipboard-text={_inputValue}>复制视频地址</ActionBtn>
</div> </div>
</HeadlessModal>
<p className="clearfix padding30">
<span className="fl font-grey-9"> <span className="color-orange">{count}</span> </span>
{ {
(admin || is_teacher) && (admin || is_teacher) &&
<li className="fr"> <li className="fr mt18">
{ {
upload ? upload ?
<WordsBtn style="grey" className="font-16" onClick={()=>this.uploadVideo(false)}>取消</WordsBtn> <WordsBtn style="grey" className="font-16" onClick={()=>this.uploadVideo(false)}>取消</WordsBtn>
: :
<WordsBtn style="blue" className="font-16" onClick={this.toUpload}>上传视频</WordsBtn> <WordsBtn style="blue" className="font-16" onClick={this.toUpload}>上传视频</WordsBtn>
} }
<WordsBtn style="blue" className="font-16 ml30" onClick={()=>this.setliveVisibel(true)}>直播设置</WordsBtn>
</li> </li>
} }
</p>
</div> </div>
</div>
<Spin spinning={isSpining}>
{ {
upload ? type === "video" ?
<VideoUploadList {...this.props} flag={true} CourseId={CourseId} CourseUser={login} successFunc={this.uploadVideo}></VideoUploadList> <Videos
: upload={upload}
<React.Fragment> videos={videos}
<div className="videoContent"> data={videoData}
{ pageSize={PAGE_SIZE}
videos && videos.length > 0 ? uploadVideo={this.uploadVideo}
<React.Fragment> listFunc={this.getList}
{ changePage={this.changePage}
videos.map((item,key)=>{
return(
// <VideoItem
// item={item}
// key={key}
// onEditVideo={this.onEditVideo}
// ></VideoItem>
<VideoInReviewItem
{...this.props} {...this.props}
{...this.state}
{...item} ></Videos>
key={item.id}
onEditVideo={this.onEditVideo}
onMaskClick={this.onMaskClick}
getCopyText={this.getCopyText}
operation={operation}
>
</VideoInReviewItem>
)
})
}
</React.Fragment>
: :
<NoneData style={{width: '100%'}}></NoneData> <Lives
} lives={lives}
</div> liveData={liveData}
{ pageSize={LIVE_PAGE_SIZE}
count > PAGE_SIZE && successFunc={this.getLiveList}
<div className="mt30 mb50 edu-txt-center"> changePage={this.changePage}
<Pagination showQuickJumper total={count} pageSize={PAGE_SIZE} onChange={this.changePage}></Pagination> {...this.props}
</div> {...this.state}
} ></Lives>
</React.Fragment>
} }
</Spin>
</React.Fragment> </React.Fragment>
) )
} }

@ -1,45 +0,0 @@
import React,{ Component } from "react";
import moment from 'moment';
import playIcon from '../../user/usersInfo/video/images/play.png'
import { Tooltip } from 'antd';
class VideoItem extends Component{
render(){
const { item , onEditVideo} = this.props;
return(
<div>
<img className="cover" src="http://video.educoder.net/5040e61081fe4380ba7bdfd181e44350/snapshots/88d4bf91061149e1ae45fab811ee1a33-00005.jpg" alt="" />
<div className="playWrap">
<img className="play mp23" alt="" src={playIcon}></img>
</div>
<div className="videoInfo">
<div className="title overflowHidden1 font-16"
title={item.title && item.title.length > 20 ? item.title : ''}
>{item.title}</div>
<div className="time">
{moment(item.published_at || item.created_at).format('YYYY-MM-DD HH:mm:ss')}
</div>
<div className="flex-middle">
{
item.vv === 0 ? <span></span> :
<Tooltip title="播放次数" placement="bottom" className="color-grey-6">
<i className={`icon-dianjiliang iconfont dianjilianicon font-14 fl`}></i>
<span className="ml8">item.vv</span>
</Tooltip>
}
<span>
<Tooltip title="编辑" placement="bottom">
<a onClick={()=>onEditVideo(item)}><i className={`icon-bianji1 iconfont font-18 color-blue`}></i></a>
</Tooltip>
<Tooltip title="复制链接" placement="bottom">
<i className={`icon-fuzhi iconfont font-18 color-blue ml20`}></i>
</Tooltip>
</span>
</div>
</div>
</div>
)
}
}
export default VideoItem;

@ -1,7 +1,6 @@
.videoContent{ .videoContent{
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
margin-top: 20px;
align-items: flex-start; align-items: flex-start;
} }
.videoContent > div{ .videoContent > div{
@ -49,3 +48,79 @@
color: #4CACFF !important; color: #4CACFF !important;
margin-left: 6px; margin-left: 6px;
} }
.leftMenu{
float: left;
border:none;
font-size: 18px;
}
.liveItem{
padding: 30px 30px 15px 30px;
background: #fff;
margin-bottom: 10px;
}
.livesMain{
justify-content: space-between;
}
.lineMiddle{
display: flex;
align-items: center;
}
.liveAuthor{
width: 36px;
height: 36px;
border-radius: 50%;
margin-right: 20px;
}
.labels{
display: block;
padding: 0px 16px;
height: 24px;
line-height: 24px;
font-size: 12px;
margin-left: 20px;
border-radius: 16px;
}
.labels.living{
border:1px solid #FF5555;
color: #FF5555;
}
.labels.lived{
border:1px solid #999999;
color: #999999;
}
.btns
{
display: block;
height: 34px;
line-height: 34px;
padding: 0px 26px;
border-radius: 4px;
}
.btns.going{
background: #5091FF;
color: #fff;
}
.btns.ect{
background: #CCCCCC;
color: #fff;
}
.liveDesc{
flex:1;
margin-right: 30px;
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
}
.liveModal .ant-modal-body{
padding:10px 20px 20px 20px;
}
.liveModal .ant-modal-body .task-popup-content{
padding:0px;
}

@ -51,7 +51,6 @@ function VideoUploadList (props) {
const _beforeunload = beforeunload // .bind(this, noUploads, state) const _beforeunload = beforeunload // .bind(this, noUploads, state)
const username = props.match.params.username || props.CourseUser; const username = props.match.params.username || props.CourseUser;
console.log("username",username);
const { showNotification, history } = props; const { showNotification, history } = props;
const uploaderOptions = { const uploaderOptions = {
@ -260,7 +259,7 @@ function VideoUploadList (props) {
<Link to={`/users/${username}/videos/protocol`} style={{color: theme.foreground_select}}>上传内容协议</Link></div> <Link to={`/users/${username}/videos/protocol`} style={{color: theme.foreground_select}}>上传内容协议</Link></div>
const { flag } = props; const { flag } = props;
return ( return (
<div className={flag?"edu-back-white pb100 bor-top-greyE videoUploadList":"educontent videoUploadList"} style={{ marginBottom: `${flag?"0px":"200px"}` }}> <div className={flag?"edu-back-white pb100 videoUploadList":"educontent videoUploadList"} style={{ marginBottom: `${flag?"0px":"200px"}` }}>
<Prompt <Prompt
when={state.videos.length } when={state.videos.length }
message='确认要离开当前页面,当前数据不可恢复' message='确认要离开当前页面,当前数据不可恢复'

Loading…
Cancel
Save