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

dev_video
杨树明 5 years ago
commit e3efe4babe

@ -9,7 +9,7 @@ const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
const eslintFormatter = require('react-dev-utils/eslintFormatter');
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
// const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
const getClientEnvironment = require('./env');
const paths = require('./paths');
@ -267,7 +267,7 @@ module.exports = {
// https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
// You can remove this if you don't use Moment.js:
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
new MonacoWebpackPlugin(),
// new MonacoWebpackPlugin(),
],
// Some libraries import Node modules but don't use them in the browser.
// Tell Webpack to provide empty mocks for them so importing them works.

File diff suppressed because one or more lines are too long

@ -61,7 +61,7 @@ clearAllCookie();
function setpostcookie() {
const str =window.location.pathname;
console.log(str.indexOf("/wxcode"))
// console.log(str.indexOf("/wxcode"))
let newdomain=".educoder.net"
if(str.indexOf("/wxcode") !== -1){
console.log("123")

@ -507,6 +507,13 @@ class CoursesIndex extends Component{
(props) => (<Ordering {...this.props} {...props} {...this.state} />)
}
></Route>
{/*视频列表*/}
<Route path="/courses/:coursesId/course_videos"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
}
></Route>
{/* 资源列表页 */}
<Route path="/courses/:coursesId/file/:Id" exact
render={
@ -666,15 +673,15 @@ class CoursesIndex extends Component{
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 普通作业 */}
<Route path="/courses/:coursesId/common_homeworks/:category_id" exact
<Route path="/courses/:coursesId/common_homeworks/:category_id" exact
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 分组作业 */}
<Route path="/courses/:coursesId/group_homeworks/:category_id" exact
<Route path="/courses/:coursesId/group_homeworks/:category_id" exact
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}

@ -71,6 +71,12 @@ const Resourcelist= Loadable({
loading: Loading,
})
// 视频
const CourseVideo = Loadable({
loader: () => import('./Video/VideoIndex'),
loading: Loading,
})
//实训作业
const ShixunHomework= Loadable({
loader: () => import('./shixunHomework/shixunHomework'),
@ -234,7 +240,13 @@ class ListPageIndex extends Component{
(props) => (<Boards {...this.props} {...props} {...this.state} />)
}
></Route>
{/*视频列表*/}
<Route path="/courses/:coursesId/course_videos"
render={
(props) => (<CourseVideo {...this.props} {...props} {...this.state} />)
}
></Route>
<Route path="/courses/:coursesId/teachers"
render={
(props) => (<TeacherList {...this.props} {...props} {...this.state} />)
@ -288,7 +300,7 @@ class ListPageIndex extends Component{
(props) => (<Statistics {...this.props} {...props} {...this.state} />)
}
></Route>
{/*公告栏列表*/}

@ -0,0 +1,260 @@
import React,{ Component } from "react";
import { Input , Pagination } from 'antd';
import { WordsBtn , NoneData ,ActionBtn } from 'educoder';
import VideoItem from './VideoItem';
import ClipboardJS from 'clipboard'
import axios from 'axios';
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 '../../user/usersInfo/video/InfosVideo.css'
const PAGE_SIZE = 15;
const DEFAULT_VIDEO_WIDTH_IN_MD = "90%" // 400
const DEFAULT_VIDEO_HEIGHT_IN_MD = "55%" // 400
const videoEl = null;
let _clipboard = null;
class VideoIndex extends Component{
constructor(props){
super(props);
this.state={
upload:false,
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.getList(page);
}
// 获取视频列表
getList=(page)=>{
const CourseId=this.props.match.params.coursesId;
const fetchUrl = `/courses/${CourseId}/course_videos.json`;
axios.get(fetchUrl, {
params: {
page,
per_page: PAGE_SIZE,
}
})
.then((response) => {
if(response){
this.setState({
count:response.data.count,
videos:response.data.videos
})
}
}).catch((error) => {
console.log(error);
})
}
onEditVideo=(item)=>{
let videoId = {
videoId: item.id,
title: item.title
}
this.setState({
videoId,
})
this.setVisible(true);
}
uploadVideo=(upload)=>{
this.setState({
upload
})
const { page } = this.state;
this.getList(page);
}
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);
}
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)=>{
this.setState({
page
})
this.getList(page);
}
toUpload =()=> {
const { admin , is_teacher,business} = this.props.user;
if (admin || business || (is_teacher && this.props.checkIfProfessionalCertification())) {
this.setState({
upload:true
})
} else {
this.props.showProfessionalCertificationDialog();
}
}
render(){
const { count , videos , upload , 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;
// console.log(this.props && this.props.admin());
const operation = admin || business || (is_teacher && this.props.checkIfProfessionalCertification())
return(
<React.Fragment>
<div className="edu-back-white">
<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>
<p className="clearfix padding30">
<span className="fl font-grey-9"> <span className="color-orange">{count}</span> </span>
{
(admin || is_teacher) &&
<li className="fr">
{
upload ?
<WordsBtn style="grey" className="font-16" onClick={()=>this.uploadVideo(false)}>取消</WordsBtn>
:
<WordsBtn style="blue" className="font-16" onClick={this.toUpload}>上传视频</WordsBtn>
}
</li>
}
</p>
</div>
{
upload ?
<VideoUploadList {...this.props} flag={true} CourseId={CourseId} CourseUser={login} successFunc={this.uploadVideo}></VideoUploadList>
:
<React.Fragment>
<div className="videoContent">
{
videos && videos.length > 0 ?
<React.Fragment>
{
videos.map((item,key)=>{
return(
// <VideoItem
// item={item}
// key={key}
// onEditVideo={this.onEditVideo}
// ></VideoItem>
<VideoInReviewItem
{...this.props}
{...item}
key={item.id}
onEditVideo={this.onEditVideo}
onMaskClick={this.onMaskClick}
getCopyText={this.getCopyText}
operation={operation}
>
</VideoInReviewItem>
)
})
}
</React.Fragment>
:
<NoneData style={{width: '100%'}}></NoneData>
}
</div>
{
count > PAGE_SIZE &&
<div className="mt30 mb50 edu-txt-center">
<Pagination showQuickJumper total={count} pageSize={PAGE_SIZE} onChange={this.changePage}></Pagination>
</div>
}
</React.Fragment>
}
</React.Fragment>
)
}
}
export default VideoIndex;

@ -0,0 +1,45 @@
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;

@ -0,0 +1,11 @@
import React,{ Component } from "react";
class VideoNew extends Component{
render(){
return(
<div></div>
)
}
}
export default VideoNew;

@ -0,0 +1,48 @@
.videoContent{
display: flex;
flex-wrap: wrap;
margin-top: 20px;
align-items: flex-start;
}
.videoContent > div{
width: 285px;
margin-bottom: 20px;
background: #fff;
border-radius: 12px;
margin-right: 30px;
}
.videoContent > div:nth-child(3n+0){
margin-right: 0px;
}
.videoContent > div.videoItem:nth-child(4n+0){
margin-right: 30px;
}
.videoContent > div .cover{
border-radius: 12px 12px 0px 0px;
height: 158px;
width: 100%;
}
.videoInfo{
padding:15px;
}
.videoInfo .title{
line-height: 24px;
}
.videoInfo .time{
line-height: 15px;
margin-bottom: 10px;
color: #C0C4CC;
font-size: 14px;
}
.flex-middle{
display: flex;
justify-content: space-between;
align-items: center;
height: 25px;
}
.square-main .buttonRow i {
vertical-align: top;
font-size: 16px;
color: #4CACFF !important;
margin-left: 6px;
}

@ -1025,7 +1025,7 @@ class Coursesleftnav extends Component{
<a>
<li title={item.name.length<7?"":item.name} onClick={(e)=>this.showsandians(e,key,item.category_url,1,item.id,item.type)} className={this.props.mainurl===item.category_url&&this.props.location.pathname===item.category_url?"liactive":"clearfix active"} onMouseLeave={(e)=>this.hidesandian(e,key)} onMouseEnter={(e)=>this.showsandian(e,key)}>
<a onClick={(e)=>this.showsandians(e,key,item.category_url,1,item.id,item.type)} className={ item.second_category===undefined?"fl ml20 pd0":item.second_category.length===0?"fl ml20 pd0":this.state.sandiantypes===key?"fl ml20 pd0 ebebeb":"fl ml20 pd0"}>
{
{
item.type==="announcement"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-xiaoxi1 mr10 fl":"iconfont icon-xiaoxi1 mr10 fl"}></i>:
item.type==="online_learning"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-kecheng mr10 fl font-16":"iconfont icon-kecheng mr10 fl font-16"}></i>:
item.type==="shixun_homework"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-daima mr10 fl":"iconfont icon-daima mr10 fl"}></i>:
@ -1037,7 +1037,8 @@ class Coursesleftnav extends Component{
item.type==="attachment"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-ziyuan mr10 fl":"iconfont icon-ziyuan mr10 fl"} ></i>:
item.type==="board"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-taolun mr10 fl":"iconfont icon-taolun mr10 fl"} ></i>:
item.type==="course_group"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-fenban mr10 fl":"iconfont icon-fenban mr10 fl"} ></i>:
item.type==="statistics"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-tongji mr10 fl":"iconfont icon-tongji mr10 fl"} ></i>:""
item.type==="statistics"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-tongji mr10 fl":"iconfont icon-tongji mr10 fl"} ></i>:
item.type==="video"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-bofang1 mr10 fl":"iconfont icon-bofang1 mr10 fl"} ></i>:""
}
{/*||this.props.location.pathname===this.state.url&&key===this.state.indexs*/}
@ -1177,7 +1178,9 @@ class Coursesleftnav extends Component{
item.type==="poll"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-wenjuan mr10 fl":"iconfont icon-wenjuan mr10 fl"}></i>:
item.type==="attachment"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-ziyuan mr10 fl":"iconfont icon-ziyuan mr10 fl"} ></i>:
item.type==="board"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-taolun mr10 fl":"iconfont icon-taolun mr10 fl"} ></i>:
item.type==="course_group"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-fenban mr10 fl":"iconfont icon-fenban mr10 fl"} ></i>:
item.type==="course_group"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-fenban mr10 fl":"iconfont icon-fenban mr10 fl"} ></i>:
item.type==="video"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-bofang1 mr10 fl":"iconfont icon-bofang1 mr10 fl"} ></i>:
item.type==="statistics"?<i className={this.props.location.pathname===item.category_url?"color-blue iconfont icon-tongji mr10 fl":"iconfont icon-tongji mr10 fl"} ></i>:""
}

@ -869,7 +869,7 @@ class CoursesNew extends Component {
>
{getFieldDecorator("checkboxgroup", {
initialValue: [
"shixun_homework", "common_homework", "group_homework", "exercise", "attachment", "course_group",
"shixun_homework", "common_homework", "group_homework", "exercise", "attachment", "course_group","video"
],
})(
<Checkbox.Group style={{ marginTop: "10px"}}>
@ -881,6 +881,7 @@ class CoursesNew extends Component {
<Checkbox value={"exercise"} className="fl">试卷</Checkbox>
<Checkbox value={"poll"} className="fl">问卷</Checkbox>
<Checkbox value={"attachment"} className="fl">资源</Checkbox>
<Checkbox value={"video"} className="fl">视频</Checkbox>
<Checkbox value={"board"} className="fl">讨论</Checkbox>
<Checkbox value={"course_group"} className="fl">分班</Checkbox>
<Checkbox value={"statistics"} className="fl">统计</Checkbox>

@ -92,14 +92,14 @@ const style = {
// <Dialog
// open={true}
// onClose={this.handleGoldRewardDialogClose}
// >
// >
// <DialogTitle id="alert-dialog-title">{"奖励设置"}</DialogTitle>
// <DialogContent>
// <FormControl aria-describedby="name-error-text">
// <InputLabel htmlFor="goldReward">1请输入奖励的金币数量</InputLabel>
// <Input id="goldReward" type="number" value={this.state.goldRewardInput} onChange={(e) => this.onGoldRewardInputChange(e)} />
// </FormControl>
// </DialogContent>
// <DialogActions>
@ -109,7 +109,7 @@ const style = {
// }
// }
// const TestMaterialDesign = () => (
// <FlatButton label="Primary" primary={true} />
// );
@ -122,7 +122,7 @@ const style = {
function PPHOC(WrappedComponent) {
return class PP extends React.Component {
componentDidMount() {
console.log('componentDidMount1 componentDidMount1 ')
// console.log('componentDidMount1 componentDidMount1 ')
}
constructor(props) {
super(props)

@ -76,7 +76,7 @@ class NewHeader extends Component {
goshowqqgtounp:false,
visiblemyss:false,
}
console.log("176")
// console.log("176")
// console.log(props);
// console.log("NewHeader1234567890");
// console.log(this.props);
@ -89,7 +89,7 @@ class NewHeader extends Component {
}
}
componentDidMount() {
console.log("componentDidMount1");
// console.log("componentDidMount1");
this.getAppdata();
window._header_componentHandler = this;

@ -76,14 +76,14 @@ function doCreateUploader (options) {
file_name: _random+fileName
}).then((response) => {
// if (response.data.status == )
const data = response.data.data
var uploadAuth = data.UploadAuth
var uploadAddress = data.UploadAddress
var videoId = data.VideoId
uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress, videoId)
if(response){
const data = response.data.data
var uploadAuth = data.UploadAuth
var uploadAddress = data.UploadAddress
var videoId = data.VideoId
uploader.setUploadAuthAndAddress(uploadInfo, uploadAuth, uploadAddress, videoId)
}
}).catch((error) => {
// 删除当前出错的,并执行下一个任务
uploader.deleteFile(uploader._curIndex)

@ -10,9 +10,13 @@ function EditVideoModal (props) {
const { history, videoId, cover_url, title, created_at, isReview, onEditVideo, visible, setVisible,
form, editSuccess } = props;
const getFieldDecorator = form.getFieldDecorator
const username = props.match.params.username
let username = props.match.params.username
const _title = form.getFieldsValue().title;
if(props.CourseUser){
username = props.CourseUser;
}
function toList() {
history.push(`/users/${username}/videos`)
}

@ -20,7 +20,7 @@ const clipboardMap = {}
function VideoInReviewItem (props) {
const theme = useContext(ThemeContext);
const { history, file_url, cover_url, title, created_at, published_at, isReview, id
, onEditVideo, onMaskClick, getCopyText, showNotification,vv,play_duration} = props;
, onEditVideo, onMaskClick, getCopyText, showNotification,vv,play_duration,operation} = props;
useEffect(()=> {
if (!isReview) {
_clipboard = new ClipboardJS(`.copybtn_item_${id}`);
@ -73,11 +73,14 @@ function VideoInReviewItem (props) {
</Tooltip> } {vv===0?"":vv}
</span>
{ isReview != true && <div>
<Tooltip title="编辑" placement="bottom">
<i className="icon-bianji1 iconfont" onClick={() => onEditVideo(props)}
style={{ marginTop: '1px', display: 'inline-block'}}
></i>
</Tooltip>
{
operation &&
<Tooltip title="编辑" placement="bottom">
<i className="icon-bianji1 iconfont" onClick={() => onEditVideo(props)}
style={{ marginTop: '1px', display: 'inline-block'}}
></i>
</Tooltip>
}
<Tooltip title="复制视频地址" placement="bottom">
<i className={`icon-fuzhi iconfont copybtn_item_${id}`} data-clipboard-text={getCopyText(file_url, cover_url)}></i>
</Tooltip>

@ -47,8 +47,8 @@ function VideoUpload (props) {
`
}
</style>
<div className="courseForm">
<span className="titleLabel">标题</span>
<div className="courseForm" style={{display:"flex",alignItems:"center"}}>
<span className="titleLabel mt15">标题</span>
<Input placeholder={`标题支持最多${MAX_LENGTH}个字符`} onInput={titleChange} maxLength={MAX_LENGTH} addonAfter={
<span className="color-grey-6 font-13">{String(title.length)}/{MAX_LENGTH}</span>
}

@ -50,7 +50,8 @@ function VideoUploadList (props) {
}
const _beforeunload = beforeunload // .bind(this, noUploads, state)
const username = props.match.params.username
const username = props.match.params.username || props.CourseUser;
console.log("username",username);
const { showNotification, history } = props;
const uploaderOptions = {
@ -219,26 +220,34 @@ function VideoUploadList (props) {
}
function onPublish() {
// 下列这些参数只有是课堂里面上传视频才会有
const { CourseId , CourseUser ,flag , successFunc } = props;
if (state.videos.length == 0) {
showNotification('请先上传视频')
return;
}
const publishUrl = `/users/${username}/videos/batch_publish.json`
const publishUrl = `/users/${ flag ? CourseUser : username }/videos/batch_publish.json`
axios.post(publishUrl, {
videos: state.videos.map(item => {
return {
video_id: item.videoId,
// todo
title: item.title
title: item.title,
course_id:CourseId
}
})
}).then((response) => {
// to success page
if (response.data.status == 0) {
dispatch({type: 'removeAll'})
// setCouldRouteNav(true)
history.push(`/users/${username}/videos/success`)
}
if(response){
if (response.data.status == 0) {
dispatch({type: 'removeAll'})
if(flag){
successFunc(false)
}else{
history.push(`/users/${username}/videos/success`)
}
}
}
}).catch((error) => {
console.log(error)
})
@ -249,8 +258,9 @@ function VideoUploadList (props) {
// login
const protocolLine = <div>上传视频即表示您已同意
<Link to={`/users/${username}/videos/protocol`} style={{color: theme.foreground_select}}>上传内容协议</Link></div>
const { flag } = props;
return (
<div className="educontent videoUploadList" style={{ marginBottom: '200px' }}>
<div className={flag?"edu-back-white pb100 bor-top-greyE videoUploadList":"educontent videoUploadList"} style={{ marginBottom: `${flag?"0px":"200px"}` }}>
<Prompt
when={state.videos.length }
message='确认要离开当前页面,当前数据不可恢复'
@ -356,19 +366,24 @@ function VideoUploadList (props) {
cursor: pointer;
}
`}</style>
<CBreadcrumb
className="mb26"
separator=" > "
items={[
{ to: `/users/${username}/videos`, name: '视频'},
{ name: '上传'}
]}
></CBreadcrumb>
<div className="title">
<h2 className="head">上传视频</h2>
{/* <span className="titleDescription">单次最多支持{MAX_FILE_COUNT}个视频文件上传,不支持断点续传,单个视频文件最大{MAX_FILE_SIZE}M</span> */}
</div>
{
!flag &&
<React.Fragment>
<CBreadcrumb
className="mb26"
separator=" > "
items={[
{ to: `/users/${username}/videos`, name: '视频'},
{ name: '上传'}
]}
></CBreadcrumb>
<div className="title">
<h2 className="head">上传视频</h2>
{/* <span className="titleDescription">单次最多支持{MAX_FILE_COUNT}个视频文件上传,不支持断点续传,单个视频文件最大{MAX_FILE_SIZE}M</span> */}
</div>
</React.Fragment>
}
<div className="section">
{/* noUploads */}

Loading…
Cancel
Save