Commit 3dc6f992 by wufan

feat:开始联调线上课

parent a468e88b
...@@ -133,7 +133,7 @@ const FileTypeIcon = { ...@@ -133,7 +133,7 @@ const FileTypeIcon = {
PPTX: "https://image.xiaomaiketang.com/xm/847pFAdYGW.png", PPTX: "https://image.xiaomaiketang.com/xm/847pFAdYGW.png",
PDF: "https://image.xiaomaiketang.com/xm/rrEJMNkhTG.png", PDF: "https://image.xiaomaiketang.com/xm/rrEJMNkhTG.png",
MP3: "https://image.xiaomaiketang.com/xm/ykjnSWDyQ6.png", MP3: "https://image.xiaomaiketang.com/xm/ykjnSWDyQ6.png",
MP4: "https://image.xiaomaiketang.com/xm/whSYMTdR57.png", MP4: "https://image.xiaomaiketang.com/xm/TKwbQGYDBR.png",
JPG: "https://image.xiaomaiketang.com/xm/XRkX8JBTPs.png", JPG: "https://image.xiaomaiketang.com/xm/XRkX8JBTPs.png",
JPEG: "https://image.xiaomaiketang.com/xm/XRkX8JBTPs.png", JPEG: "https://image.xiaomaiketang.com/xm/XRkX8JBTPs.png",
PNG: "https://image.xiaomaiketang.com/xm/XRkX8JBTPs.png", PNG: "https://image.xiaomaiketang.com/xm/XRkX8JBTPs.png",
......
...@@ -300,47 +300,45 @@ class AddVideoCourse extends React.Component { ...@@ -300,47 +300,45 @@ class AddVideoCourse extends React.Component {
} }
// 选择视频 // 选择视频
handleSelectVideo = (file) => { handleSelectVideo = (addFolderIds,selectedFileList) => {
console.log("file-----",selectedFileList);
this.setState({ this.setState({
showSelectFileModal: false showSelectFileModal: false
}) })
const { ossUrl, resourceId, folderName, folderFormat, folderSize } = file;
let { courseChapterList } = this.state; let { courseChapterList } = this.state;
let _courseChapterList = [...courseChapterList]; let _courseChapterList = [...courseChapterList];
selectedFileList.map((file,index) => {
const { ossUrl, resourceId, folderName, folderFormat, folderSize } = file;
const videoDom = document.createElement('video')
videoDom.src = ossUrl
videoDom.onloadedmetadata = () => {
_courseChapterList.push({ _courseChapterList.push({
mediaContent: resourceId, mediaContent: resourceId,
contentType: 'SCHEDULE', contentType: 'SCHEDULE',
mediaType: "VIDEO", mediaType: "VIDEO",
mediaName: folderName.replace('.mp4',''), mediaName: folderName.replace('.mp4',''),
mediaNameAlias: folderName.replace('.mp4',''), mediaNameAlias: folderName.replace('.mp4',''),
videoDuration: folderSize, videoDuration: videoDom.duration,
id: resourceId, id: resourceId,
mediaUrl: ossUrl mediaUrl: ossUrl
}) })
const videoDom = document.createElement('video') this.setState({
this.setState({ size: folderSize,
size: folderSize, videoName: folderName,
videoName: folderName, videoType: folderFormat,
videoType: folderFormat, scheduleVideoUrl: ossUrl,
scheduleVideoUrl: ossUrl, scheduleVideoIds: resourceId,
scheduleVideoIds: resourceId, courseChapterList: _courseChapterList
videoDuration: videoDom.duration, })
courseChapterList: _courseChapterList }
}) })
// videoDom.src = ossUrl
// videoDom.onloadedmetadata = () => {
// this.setState({
// size: folderSize,
// videoName: folderName,
// videoType: folderFormat,
// scheduleVideoUrl: ossUrl,
// scheduleVideoIds: resourceId,
// videoDuration: videoDom.duration
// })
// }
} }
// 保存 // 保存
...@@ -614,6 +612,36 @@ class AddVideoCourse extends React.Component { ...@@ -614,6 +612,36 @@ class AddVideoCourse extends React.Component {
</div> </div>
} }
// 上下移动
handleChangeIndex = (isUp, sortIndex) => {
const { courseChapterList} = this.state;
// 第一个上移和最后一个下移不能使用
if((isUp && sortIndex === 0) || (!isUp && sortIndex === (courseChapterList.length -1))){
return;
}
let _courseChapterList = [...courseChapterList];
const temp = courseChapterList[sortIndex];
// 若上移
if(isUp){
_courseChapterList[sortIndex -1] = temp;
_courseChapterList[sortIndex -1].sort = sortIndex -1;
_courseChapterList[sortIndex] = courseChapterList[sortIndex - 1];
_courseChapterList[sortIndex].sort = sortIndex;
} else { // 若下移
_courseChapterList[sortIndex + 1] = temp;
_courseChapterList[sortIndex + 1].sort = sortIndex + 1;
_courseChapterList[sortIndex] = courseChapterList[sortIndex + 1];
_courseChapterList[sortIndex].sort = sortIndex;
}
this.setState({
courseChapterList: _courseChapterList
})
}
render() { render() {
const { const {
pageType, pageType,
...@@ -687,13 +715,14 @@ class AddVideoCourse extends React.Component { ...@@ -687,13 +715,14 @@ class AddVideoCourse extends React.Component {
this.setState({ this.setState({
showSelectFileModal: true showSelectFileModal: true
}) })
}}>{`${pageType === 'add' && !scheduleVideoIds ? '选择' : '更换'}视频`}</Button> }}>添加视频</Button>
<div className='course-ware--empty'>从资料云盘中选择视频</div> <div className='course-ware--empty'>从资料云盘中选择视频</div>
</div> </div>
<div className='tips'>视频数量限制20个,每个视频文件大小不超过2G</div> <div className='tips'>视频数量限制20个,每个视频文件大小不超过2G</div>
</div> </div>
</div>
<If condition={courseChapterList.length > 0}>
<If condition={courseChapterList.length > 0}>
<div className="course-chapter-list-wrap"> <div className="course-chapter-list-wrap">
<div className="course-chapter-total">{`共${courseChapterList.length}个课节`}</div> <div className="course-chapter-total">{`共${courseChapterList.length}个课节`}</div>
<div className='course-chapter-list' id="course-chapter-list"> <div className='course-chapter-list' id="course-chapter-list">
...@@ -704,6 +733,10 @@ class AddVideoCourse extends React.Component { ...@@ -704,6 +733,10 @@ class AddVideoCourse extends React.Component {
<img className='course-ware__img' src={courseWareIcon} alt='' /> <img className='course-ware__img' src={courseWareIcon} alt='' />
<div className='course-ware__name'>{item.mediaName && item.mediaName.length > 24 ? <Tooltip title={item.mediaName}>{item.mediaName}</Tooltip>:item.mediaName}</div> <div className='course-ware__name'>{item.mediaName && item.mediaName.length > 24 ? <Tooltip title={item.mediaName}>{item.mediaName}</Tooltip>:item.mediaName}</div>
<div className="course-chapter__opt" id={item.id}> <div className="course-chapter__opt" id={item.id}>
<div className={`up ${Number(index) === 0 ? 'disabled':''}`} onClick={()=> this.handleChangeIndex(true,item.sort,item.id)}>上移</div>
<div className="line">|</div>
<div className={`down ${Number(index) === (courseChapterList.length - 1) ? 'disabled':''}`} onClick={()=> this.handleChangeIndex(false,item.sort,item.id)}>下移</div>
<div className="line">|</div>
<Popconfirm <Popconfirm
placement="topLeft" placement="topLeft"
className="course-chapter-tooltip" className="course-chapter-tooltip"
...@@ -729,7 +762,6 @@ class AddVideoCourse extends React.Component { ...@@ -729,7 +762,6 @@ class AddVideoCourse extends React.Component {
</div> </div>
</div> </div>
</If> </If>
</div>
<div className='cover-url flex mt16'> <div className='cover-url flex mt16'>
<div className='label'>课程封面:</div> <div className='label'>课程封面:</div>
......
...@@ -153,6 +153,7 @@ ...@@ -153,6 +153,7 @@
.course-chapter-list-wrap { .course-chapter-list-wrap {
position: relative; position: relative;
margin-left: 85px;
.course-chapter-total { .course-chapter-total {
height: 40px; height: 40px;
font-size: 14px; font-size: 14px;
...@@ -171,7 +172,7 @@ ...@@ -171,7 +172,7 @@
} }
.course-chapter-list { .course-chapter-list {
margin-top: 8px; margin-top: 8px;
width: 552px; width: 630px;
max-height: 247px; max-height: 247px;
min-height: 130px; min-height: 130px;
overflow-y: auto ; overflow-y: auto ;
...@@ -201,15 +202,24 @@ ...@@ -201,15 +202,24 @@
} }
.course-chapter__opt { .course-chapter__opt {
display: flex; display: flex;
color: #2966FF; color: #2966ff;
.line { .line {
color: #BFBFBF; color: #bfbfbf;
margin-left: 4px; margin-left: 4px;
margin-right: 4px; margin-right: 4px;
} }
.delete, .rename { .delete,
.rename,
.up,
.down {
cursor: pointer; cursor: pointer;
} }
.up,
.down {
&.disabled {
color: rgba(204, 204, 204, 1);
}
}
} }
} }
} }
......
import React from "react";
import './LearningDetailModal.less';
class LearningDetailModal extends React.Component {
constructor(props) {
super(props);
this.state = {
data:[]
};
}
componentDidMount() {
this.handleFetchDataList();
}
// 获取观看视频数据列表
handleFetchDataList = () => {
const { query, id } = this.state;
const params = {
...query,
courseId: id,
storeId: User.getStoreId(),
};
CourseService.videoWatchInfo(params).then((res) => {
const { result = {} } = res;
const { records = [], total = 0 } = result;
this.setState({
dataSource: records,
totalCount: Number(total),
});
});
};
}
\ No newline at end of file
...@@ -3,7 +3,7 @@ import college from "@/common/lottie/college"; ...@@ -3,7 +3,7 @@ import college from "@/common/lottie/college";
import { PageControl, XMTable } from "@/components"; import { PageControl, XMTable } from "@/components";
import Breadcrumbs from "@/components/Breadcrumbs"; import Breadcrumbs from "@/components/Breadcrumbs";
import CourseService from "@/domains/course-domain/CourseService"; import CourseService from "@/domains/course-domain/CourseService";
import { Input } from 'antd'; import { Input, Select } from 'antd';
import React from "react"; import React from "react";
import { withRouter } from "react-router-dom"; import { withRouter } from "react-router-dom";
const { Search } = Input; const { Search } = Input;
...@@ -20,6 +20,7 @@ class WatchData extends React.Component { ...@@ -20,6 +20,7 @@ class WatchData extends React.Component {
query: { query: {
current: 1, current: 1,
size: 10, size: 10,
sourceEnum: ""
}, },
totalCount: 0, totalCount: 0,
}; };
...@@ -49,11 +50,20 @@ class WatchData extends React.Component { ...@@ -49,11 +50,20 @@ class WatchData extends React.Component {
}; };
parseColumns = () => { parseColumns = () => {
const SOURCENUM = {
'WE_CHAT': "微信", 'WORK_WE_CHAT': "企业微信"
}
const columns = [ const columns = [
{ {
title: '观看学员', title: '观看学员',
key: 'name', key: 'name',
dataIndex: 'name' dataIndex: 'name',
render: (val,item) => {
return <div className="watcher">
<div className="watcher__name">{val}</div>
<div className={`watcher__type ${item.sourceEnum}`}>{SOURCENUM[item.sourceEnum]}</div>
</div>
}
}, },
{ {
title: '手机号', title: '手机号',
...@@ -99,12 +109,28 @@ class WatchData extends React.Component { ...@@ -99,12 +109,28 @@ class WatchData extends React.Component {
return columns; return columns;
}; };
handleChangNickname = (value)=>{
const isPhone = (value || '').match(/^\d+$/);
const { query } = this.state;
if(isPhone){
query.phone = value;
query.nickName = null;
}else{
query.nickName = value;
query.phone = null;
}
query.current = 1;
this.setState({
query
}, this.handleFetchDataList)
}
render() { render() {
const { dataSource, totalCount, query } = this.state; const { dataSource, totalCount, query } = this.state;
const { current, size } = query; const { current, size, sourceEnum } = query;
return ( return (
<div className="page data-list"> <div className="page video-course-watch-data">
<Breadcrumbs <Breadcrumbs
navList="观看学员数据" navList="观看学员数据"
goBack={() => { goBack={() => {
...@@ -114,7 +140,32 @@ class WatchData extends React.Component { ...@@ -114,7 +140,32 @@ class WatchData extends React.Component {
<div className="box-header"> <div className="box-header">
<div className="course-title"></div> <div className="course-title"></div>
<div className="filter-box"> <div className="filter-box">
<Search placeholder="搜索学员姓名/手机号" style={{ width: 200 }} onChange={(e) => { this.handleChangNickname(e.target.value)}} onSearch={ () => { this.handleFetchDataList()}} enterButton={<span className="icon iconfont">&#xe832;</span>}/> <Search placeholder="搜索学员姓名/手机号" style={{ width: 200 }} onChange={(e) => { this.handleChangNickname(e.target.value)}} onSearch={ () => { this.handleFetchDataList()}} enterButton={<span className="icon iconfont">&#xe832;</span>}/>
<Select
showSearch
allowClear
onSearch={(value) => {
query.classNameLike = value;
this.setState({ query }, this.handleFetchClassList)
}}
onPopupScroll={this.handleFetchMore}
placeholder="请选择学员类型"
value={sourceEnum}
onChange={this.handleClassSelect}
>
<Select.Option
tyle={{ textAlign: 'center' }}
value="WE_CHAT"
>
微信
</Select.Option>
<Select.Option
tyle={{ textAlign: 'center' }}
value="WORK_WE_CHAT"
>
企业微信
</Select.Option>
</Select>
</div> </div>
</div> </div>
......
.video-course-watch-data {
.watcher {
&__type {
margin-left: 8px;
&.WE_CHAT {
color:rgba(28, 172, 27, 1);
}
&.WORK_WE_CHAT {
color: rgba(41, 102, 255, 1);
}
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment