Commit 7a32c8d5 authored by wangxuelai's avatar wangxuelai

'最新代码提交'

parent 30e3b286
......@@ -11,7 +11,7 @@
<script src="js/console-polyfill.js"></script>
<![endif]-->
<script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=XSZBZ-5LHCV-5I2P7-UQHPW-6456F-JBB3B"></script>
<link href="/dist/index.css?1570618372194" rel="stylesheet">
<link href="/dist/index.css?1570804726564" rel="stylesheet">
<script src="/lib/vendor.dll.js?3" charset="utf-8"></script>
<script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/console-polyfill.js?3" charset="utf-8"></script>
<script src="https://cdn.img.shangjiadao.cn/qingxiao/biz/js/es6-shim.min.js?3" charset="utf-8"></script>
......@@ -24,7 +24,7 @@
<body>
<div id="root"></div>
<script src="/dist/index.js?1570618372194" charset="utf-8"></script>
<script src="/dist/index.js?1570804726564" charset="utf-8"></script>
</body>
</html>
\ No newline at end of file
......@@ -37,7 +37,7 @@ export default {
activeurl: `${__IMGCDN__}menu/classactive.png`,
notactiveurl: `${__IMGCDN__}menu/class.png`,
path: '/sjd/classmgt',
relativePath: ['/sjd/classmgt', '/sjd/classdetail/:classid', '/sjd/newtheme/jobclock/:id', '/sjd/newtheme/calendarclock/:id', '/sjd/newtheme/jobclock/:id/:isCopy', '/sjd/newtheme/calendarclock/:id/:isCopy', '/sjd/thememgt/:classid'],
relativePath: ['/sjd/classmgt', '/sjd/classdetail/:classid', '/sjd/newtheme/jobclock/:id', '/sjd/newtheme/calendarclock/:id', '/sjd/newtheme/jobclock/:id/:isCopy', '/sjd/newtheme/calendarclock/:id/:isCopy', '/sjd/thememgt/:classid', '/sjd/clockmgt/:themetype/:classid/:themeid'],
},
{
id: '4',
......
This diff is collapsed.
......@@ -460,6 +460,9 @@ export default {
}
const thememgtactive = pathToRegexp('/sjd/thememgt/:classid').exec(pathname);
if (thememgtactive) {
dispatch({
type: 'clockmgt/pageInit',
});
dispatch({
type: 'thememgt/querythemelist',
payload: {
......@@ -655,6 +658,25 @@ export default {
}
const clockmgtactive = pathToRegexp('/sjd/clockmgt/:themetype/:classid/:themeid').exec(pathname);
if (clockmgtactive) {
dispatch({
type: 'webapp/updateState',
payload: {
breadcrumbList: [
{
path: 'sjd/classmgt',
name: '班级管理',
},
{
path: pathname,
name: '主题管理',
},
{
path: pathname,
name: '点评',
},
],
},
});
dispatch({
type: 'clockmgt/enterclockmgt',
payload: {
......
......@@ -128,21 +128,27 @@ class ClockItem extends React.Component {
<div className={pageStyle.teacherassesmenttext}>
<span className={pageStyle.teacherassesment} dangerouslySetInnerHTML={{ __html: formatTextB(clock.review[1].content) }} />
</div>
{clock.review[1].audio && clock.review[1].audio.length > 0 &&
{((clock.review[1].audio && clock.review[1].audio.length > 0) || clock.review[1].audio.src) &&
<div className={pageStyle.teacheraudiobox}>
{/*
<div className={pageStyle.teacheraudio} onClick={() => playAudio(clock.review[1].audio)}>
<span>播放</span>
<span>{voiceTimeFormat(clock.review[1].audio.duration)}</span>
</div>
*/}
<audio controls id={clock.review[1].audio.src} src={audioorigin(clock.review[1].audio.src)} />
</div>
}
{clock.review[1].img && clock.review[1].img.length > 0 &&
<div className={pageStyle.teacherimgbox}>
{clock.review[1].img.map((ele, index) => (
<img className={pageStyle.teacherimg} onClick={() => imgPreview(index, clock.review[1].img.filter(ele => ele.type == 'image'))} src={imagify(ele.src, 'image/resize,w_320/format,jpg/quality,q_50')} alt="" />
<div>
{ele.type == 'image' &&
<img className={pageStyle.teacherimg} onClick={() => imgPreview(index - clock.review[1].img.filter(ele => ele.type == 'video').length, clock.review[1].img.filter(ele => ele.type == 'image'))} src={imagify(ele.src, 'image/resize,w_320/format,jpg/quality,q_50')} alt="" />
}
{ele.type == 'video' &&
<div className={pageStyle.teachervideoitem} onClick={() => playVideo(ele.src)}>
<img className={pageStyle.teachervideoposter} src={videoPoster(ele.src, 'image/resize,w_320/format,jpg/quality,q_50')} alt={ele.src} />
<div className={pageStyle.playbox}>
<Icon type="caret-right" className={pageStyle.playbtn} />
</div>
</div>
}
</div>
))}
</div>
}
......@@ -154,14 +160,8 @@ class ClockItem extends React.Component {
<span className={pageStyle.teachername}>私密点评:</span>
<span className={pageStyle.teacherassesment} dangerouslySetInnerHTML={{ __html: formatTextB(clock.review[2].content) }} />
</div>
{clock.review[2].audio && clock.review[2].audio.length > 0 &&
{((clock.review[2].audio && clock.review[2].audio.length > 0) || clock.review[2].audio.src) &&
<div className={pageStyle.teacheraudiobox}>
{/*
<div className={pageStyle.teacheraudio} onClick={() => playAudio(clock.review[2].audio)}>
<span>播放</span>
<span>{voiceTimeFormat(clock.review[2].audio.duration)}</span>
</div>
*/}
<audio controls id={clock.review[2].audio.src} src={audioorigin(clock.review[2].audio.src)} />
</div>
}
......
.clockitem {
padding: 21px 0 20px 0;
position: relative;
audio {
&:focus {
outline: none;
}
}
.flagstamp {
width: 80px;
height: 80px;
......@@ -102,18 +107,21 @@
.audioitem {
width: 284px;
height: 38px;
background:linear-gradient(270deg,rgba(24,144,255,1) 0%,rgba(75,169,255,1) 100%);
// background:linear-gradient(270deg,rgba(24,144,255,1) 0%,rgba(75,169,255,1) 100%);
border-radius: 19px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 28px 0 15px;
// padding: 0 28px 0 15px;
line-height: 1;
color: #fff;
margin-bottom: 24px;
&:last-child {
margin-bottom: 0;
}
&:focus {
border: none;
}
}
}
.operatebox {
......@@ -205,6 +213,44 @@
}
}
.teacherimgbox {
display: flex;
align-items: center;
flex-wrap: nowrap;
.teachervideoitem {
margin: 0 10px 10px 0;
width: 70px;
height: 70px;
border-radius: 4px;
position: relative;
cursor: pointer;
overflow: hidden;
.playbox {
position: absolute;
top: 50%;
left: 50%;
z-index: 2;
color: #fff;
text-align: center;
width: 40px;
height: 40px;
border-radius: 50%;
background-color: rgba(0,0,0,0.5);
display: flex;
align-items: center;
justify-content: center;
margin-left: -20px;
margin-top: -20px;
.playbtn {
color:#fff;
font-size: 24px;
}
}
.teachervideoposter {
width: 70px;
height: 70px;
display: block;
}
}
.teacherimg {
// display: block;
margin: 0 10px 10px 0;
......
......@@ -2,7 +2,7 @@ import React from 'react';
import { connect } from 'dva';
import { Table, Button, Rate, Input, Switch, Modal, Icon } from 'antd';
import pageStyle from './commenteditorbox.less';
import { imagify } from '../../utils/index';
import { imagify, videoPoster, audioorigin } from '../../utils/index';
import { addShortWords } from '../../services/clockmgt';
const { TextArea } = Input;
......@@ -23,6 +23,9 @@ class CommentEditorBox extends React.Component {
const { goDrawImage } = this.props;
goDrawImage(clockDetail);
}
imageError = (e) => {
e.target.src = 'https://cdn.img.shangjiadao.cn/qingxiao/daka/images/2c/common/videodefault.png';
}
render() {
const {
commentParams,
......@@ -52,6 +55,11 @@ class CommentEditorBox extends React.Component {
gobackDraw,
delTeacherCommentImage,
clockdetail,
imgPreview,
playVideo,
commentuploadVideo,
delPriviteAudio,
delCommonAudio,
} = this.props;
return (
<div className={pageStyle.commenteditorbox} id="commenteditorbox" style={style}>
......@@ -109,14 +117,34 @@ class CommentEditorBox extends React.Component {
<div className={pageStyle.uploadimgbox}>
<div className={pageStyle.uploadimglist}>
{commentParams.common.img.map((ele, index) => (
<div className={pageStyle.uploadimgitem}>
<img alt={ele.src} className={pageStyle.teacheruploadimg} src={imagify(ele.src)} />
<div className={pageStyle.delmask} onClick={() => delTeacherCommentImage(index)}>删除</div>
<div>
{ele.type == 'image' &&
<div className={pageStyle.uploadimgitem}>
<img alt={ele.src} onClick={() => imgPreview(index - commentParams.common.img.filter(ele => ele.type == 'video').length, commentParams.common.img.filter(ele => ele.type == 'image'))} className={pageStyle.teacheruploadimg} src={imagify(ele.src)} />
<div className={pageStyle.delmask} onClick={() => delTeacherCommentImage(index)}>删除</div>
</div>
}
{ele.type == 'video' &&
<div className={pageStyle.uploadimgitem} >
<div className={pageStyle.playbox} onClick={() => playVideo(ele.src)}>
<Icon type="caret-right" className={pageStyle.playbtn} />
</div>
<img onError={this.imageError} alt={ele.src} className={pageStyle.teacheruploadimg} src={videoPoster(ele.src, 'image/resize,w_320/format,jpg/quality,q_50')} />
<div className={pageStyle.delmask} onClick={() => delTeacherCommentImage(index)}>删除</div>
</div>
}
</div>
))}
</div>
{((commentParams.common.audio && commentParams.common.audio.length > 0) || commentParams.common.audio.src) &&
<div className={pageStyle.teacheraudiobox} style={{ display: 'flex', alignItems: 'center', marginBottom: '12px' }}>
<audio controls id={commentParams.privite.audio.src} src={audioorigin(commentParams.privite.audio.src)} />
<a style={{ marginLeft: '10px' }} href="javascript:;" onClick={delCommonAudio}>删除</a>
</div>
}
<div className={pageStyle.operatebox}>
<div className={pageStyle.uploadimg}><input type="file" id="teachercommentupload" className={pageStyle.fileuploadinput} onChange={commentuploadImg} accept="image/*" />添加图片</div>
<div className={pageStyle.uploadimg}><input type="file" id="teachervideoupload" className={pageStyle.fileuploadinput} onChange={commentuploadVideo} accept="video/*" />添加视频</div>
{commentBoxtype == 1 && clockdetail && JSON.parse(clockdetail.video).length > 0 && JSON.parse(clockdetail.video).filter(ele => ele.type == 'image').length > 0 &&
<div className={pageStyle.uploadimg} onClick={() => this.goDrawImage(clockdetail)}>标记</div>
}
......@@ -140,9 +168,17 @@ class CommentEditorBox extends React.Component {
<div className={pageStyle.privitetitletext}>悄悄话</div>
</div>
{privitecommentOpen &&
<div className={pageStyle.textareabox}>
<TextArea maxlength={500} autosize={() => true} value={commentParams.privite.content} className={pageStyle.textareabox} onChange={priviteContentChange} style={{ minHeight: '100px' }} />
<div className={pageStyle.wordcount}>{commentParams.privite.content.length}/500</div>
<div>
<div className={pageStyle.textareabox}>
<TextArea maxlength={500} autosize={() => true} value={commentParams.privite.content} className={pageStyle.textareabox} onChange={priviteContentChange} style={{ minHeight: '100px' }} />
<div className={pageStyle.wordcount}>{commentParams.privite.content.length}/500</div>
</div>
{((commentParams.privite.audio && commentParams.privite.audio.length > 0) || commentParams.privite.audio.src) &&
<div className={pageStyle.teacheraudiobox} style={{ display: 'flex', alignItems: 'center' }}>
<audio controls id={commentParams.privite.audio.src} src={audioorigin(commentParams.privite.audio.src)} />
<a style={{ marginLeft: '10px' }} href="javascript:;" onClick={delPriviteAudio}>删除</a>
</div>
}
</div>
}
</div>
......@@ -153,7 +189,7 @@ class CommentEditorBox extends React.Component {
width={337}
onCancel={closeTempUpdate}
>
{copyTempArr.map(ele => <Input onChange={e => tempTitleChange(e, ele.id)} className={pageStyle.tempTitleInput} value={ele.title} />)}
{copyTempArr.map(ele => <Input maxLength={4} onChange={e => tempTitleChange(e, ele.id)} className={pageStyle.tempTitleInput} value={ele.title} />)}
<Button type="primary" className={pageStyle.singlesave} onClick={() => saveSubjectReviewTemplate(1)}>保存应用到当前班级</Button>
<Button className={pageStyle.allsave} onClick={() => saveSubjectReviewTemplate(2)}>保存应用到所有班级</Button>
</Modal>
......
.commenteditorbox {
// border-left: 1px solid rgba(0,0,0,0.05);
// border-bottom: 1px solid rgba(0,0,0,0.05);
audio {
outline: none;
}
.gobackdraw {
display: flex;
justify-content: space-between;
......@@ -96,7 +99,7 @@
.uploadimglist {
margin-bottom: 10px;
display: flex;
flex-wrap: nowrap;
flex-wrap: wrap;
}
.uploadimgitem {
width: 100px;
......@@ -105,6 +108,7 @@
margin: 0 10px 10px 0;
overflow: hidden;
position: relative;
cursor: pointer;
&:hover {
.delmask {
bottom: 0;
......@@ -128,6 +132,21 @@
transition: 0.2s;
cursor: pointer;
}
.playbox {
width: 43px;
height: 43px;
background-color: rgba(0,0,0,0.3);
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 20px;
}
}
.operatebox {
display: flex;
......
This diff is collapsed.
......@@ -3,15 +3,18 @@
.drawModalContent {
position: relative;
margin: 0 auto 40px;
.textconfirmbtnbox {
position: absolute;
z-index: 6;
top: 0;
right: 0;
}
.canvastextFloat {
position: absolute;
z-index: 5;
z-index: 15;
.textconfirmbtnbox {
position: absolute;
z-index: 6;
left: 0;
bottom: -24px;
width: 100%;
display: flex;
justify-content: space-around;
}
.textsizechange {
width: 10px;
height: 10px;
......@@ -49,7 +52,7 @@
border: 1px dashed red;
word-break: break-all;
padding: 10px;
background-color: transparent;
background-color: rgba(255, 255, 255, 0.6);
// position: fixed;
// top: 0;
// left: 0;
......@@ -63,6 +66,24 @@
}
.drawimgcanvas {
position: relative;
z-index: 10;
}
.drawcirclecanvas {
position: absolute;
left: 0;
top: 0;
z-index: 3;
}
.drawrectcanvas {
position: absolute;
left: 0;
top: 0;
z-index: 4;
}
.drawarrowcanvas {
position: absolute;
left: 0;
top: 0;
z-index: 2;
}
.imageLoading {
......@@ -79,8 +100,9 @@
.imagegallery {
display: flex;
align-items: flex-end;
margin-bottom: 24px;
padding-left: 24px;
margin: 24px 24px 0;
// padding-left: 24px;
overflow-x: scroll;
.imageitembox {
position: relative;
width: 64px;
......
......@@ -247,6 +247,36 @@ class ClockMgt extends React.Component {
},
});
}
singlecommentuploadVideo = (e) => {
const { dispatch } = this.props;
dispatch({
type: 'clockmgt/queryvideosignature',
payload: {
files: e.target,
uploadtype: 'singlecommentuploadVideo',
},
});
}
quickcommentuploadVideo = (e) => {
const { dispatch } = this.props;
dispatch({
type: 'clockmgt/queryvideosignature',
payload: {
files: e.target,
uploadtype: 'quickcommentuploadVideo',
},
});
}
batchcommentuploadVideo = (e) => {
const { dispatch } = this.props;
dispatch({
type: 'clockmgt/queryvideosignature',
payload: {
files: e.target,
uploadtype: 'batchcommentuploadVideo',
},
});
}
quickcommentuploadImg = (e) => {
const { dispatch } = this.props;
dispatch({
......@@ -622,23 +652,43 @@ class ClockMgt extends React.Component {
saveSubjectReviewTemplate = (type) => {
// type 1应用到当前班级 2 应用到所有班级
const { dispatch } = this.props;
Modal.confirm({
title: '将覆盖原有打分维度',
content: '您确定这样做吗?',
onOk() {
dispatch({
type: 'clockmgt/saveSubjectReviewTemplate',
payload: {
type,
callBack() {
dispatch({
type: 'clockmgt/tempApplyAllClass',
});
if (type == 1) {
Modal.confirm({
title: '将覆盖原有打分维度',
content: '您确定这样做吗?',
onOk() {
dispatch({
type: 'clockmgt/saveSubjectReviewTemplate',
payload: {
type,
callBack() {
dispatch({
type: 'clockmgt/tempApplyAllClass',
});
},
},
},
});
},
});
});
},
});
} else if (type == 2) {
Modal.confirm({
title: '是否将该模板应用到该校区的所有班级',
content: '您确定这样做吗?',
onOk() {
dispatch({
type: 'clockmgt/saveSubjectReviewTemplate',
payload: {
type,
callBack() {
dispatch({
type: 'clockmgt/tempApplyAllClass',
});
},
},
});
},
});
}
}
closeDrawImageModal = () => {
const { dispatch, tabIndex } = this.props;
......@@ -712,6 +762,24 @@ class ClockMgt extends React.Component {
},
});
}
delPriviteAudio= (type) => {
const { tabIndex, dispatch } = this.props;
dispatch({
type: 'clockmgt/delPriviteAudio',
payload: {
type,
},
});
}
delCommonAudio= (type) => {
const { tabIndex, dispatch } = this.props;
dispatch({
type: 'clockmgt/delCommonAudio',
payload: {
type,
},
});
}
render() {
const {
themetype,
......@@ -759,6 +827,7 @@ class ClockMgt extends React.Component {
commentBoxtype,
batchCommentImgObj,
singleClock,
quicktempScoreArr,
} = this.props;
return (
<div className={`${pageStyle.classmgtcontainer} clockmgtcontainer`}>
......@@ -801,7 +870,7 @@ class ClockMgt extends React.Component {
}
<Col span={20}>
{themetype == 1 && <div className={pageStyle.selectthemetitle}>{themeDetail.title}</div>}
{themetype == 3 && <div className={pageStyle.selectthemetitle}>{unlockSubjectLocks.length > 0 && unlockSubjectLocks.findIndex(ele => ele.id == selectId) + 1}关:{unlockSubjectLocks.length > 0 && unlockSubjectLocks.find(ele => ele.id == selectId).title}</div>}
{themetype == 3 && <div className={pageStyle.selectthemetitle}>{unlockSubjectLocks.length > 0 && unlockSubjectLocks.findIndex(ele => ele.id == selectId) + 1}关:{unlockSubjectLocks.length > 0 && unlockSubjectLocks.find(ele => ele.id == selectId) && unlockSubjectLocks.find(ele => ele.id == selectId).title}</div>}
{themetype == 2 && <div className={pageStyle.selectthemetitle}>{themeDetail.title}</div>}
{tabAClockCount > 0 &&
<div className={pageStyle.clocklistbox}>
......@@ -970,11 +1039,16 @@ class ClockMgt extends React.Component {
totempUpdate={this.totempUpdate}
closeTempUpdate={this.closeTempUpdate}
saveSubjectReviewTemplate={this.saveSubjectReviewTemplate}
tempScoreArr={tempScoreArr}
tempScoreArr={quicktempScoreArr}
commentBoxtype={commentBoxtype}
delTeacherCommentImage={this.delQuickTeacherCommentImage}
clockdetail={tabCClockDetail}
goDrawImage={this.goDrawImage}
imgPreview={this.imgPreview}
playVideo={this.playVideo}
commentuploadVideo={this.quickcommentuploadVideo}
delPriviteAudio={() => this.delPriviteAudio('quick')}
delCommonAudio={() => this.delCommonAudio('quick')}
/>
<Row type="flex" justify="end" className={pageStyle.quickcommentbox}>
<Button type="primary" style={{ marginRight: '15px' }} onClick={this.quickCommentPost}>{quickCommentSubmiting ? '点评中...' : '提交点评'}</Button>
......@@ -1024,6 +1098,11 @@ class ClockMgt extends React.Component {
delTeacherCommentImage={this.delSingleTeacherCommentImage}
clockdetail={singleClock}
goDrawImage={this.goDrawImage}
imgPreview={this.imgPreview}
playVideo={this.playVideo}
commentuploadVideo={this.singlecommentuploadVideo}
delPriviteAudio={() => this.delPriviteAudio('single')}
delCommonAudio={() => this.delCommonAudio('single')}
/>
<Row type="flex" justify="end" className={pageStyle.quickcommentbox}>
<Button type="primary" style={{ marginRight: '15px' }} onClick={this.singleCommentPost} loading={singleCommentSubmiting}>{singleCommentSubmiting ? '点评中...' : '提交点评'}</Button>
......@@ -1068,6 +1147,9 @@ class ClockMgt extends React.Component {
batchCommentImgObj={batchCommentImgObj}
gobackDraw={this.gobackDraw}
delTeacherCommentImage={this.delBatchTeacherCommentImage}
imgPreview={this.imgPreview}
playVideo={this.playVideo}
commentuploadVideo={this.batchcommentuploadVideo}
/>
<Row type="flex" justify="end" className={pageStyle.quickcommentbox}>
<Button type="primary" style={{ marginRight: '15px' }} onClick={this.batchCommentPost}>{batchCommentSubmiting ? '点评中...' : '提交点评'}</Button>
......@@ -1154,6 +1236,7 @@ function mapStateToProps(state) {
batchCommentImgObj,
drawImageShow,
commentBoxtype,
quicktempScoreArr,
} = state.clockmgt;
const {
audio,
......@@ -1206,6 +1289,7 @@ function mapStateToProps(state) {
batchCommentImgObj,
drawImageShow,
commentBoxtype,
quicktempScoreArr,
};
}
export default connect(mapStateToProps)(ClockMgt);
......
......@@ -89,11 +89,13 @@
margin-bottom: 20px;
}
}
.ant-carousel .slick-slide {
text-align: center;
height: 92px;
overflow: hidden;
background-color: #D8D8D8;
.goodsaddModal {
.ant-carousel .slick-slide {
text-align: center;
height: 92px;
overflow: hidden;
background-color: #D8D8D8;
}
}
.ant-modal-body {
padding: 10px 24px;
......
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