Commit 0b9cb284 by yuananting

Merge branch 'feature/yuananting/20210327/test-paper' of…

Merge branch 'feature/yuananting/20210327/test-paper' of https://xmgit.ixm5.cn/xiaomai-cloud-class/xiaomai-cloud-class-web into feature/yuananting/20210327/test-paper
parents 2d1d10ae 0365370f
......@@ -64,40 +64,40 @@ class GraphicsEditor extends React.Component {
class ImageMenu extends BtnMenu {
constructor(editor) {
// data-title属性表示当鼠标悬停在该按钮上时提示该按钮的功能简述
const $elem = E.$(
`<div class="w-e-menu" data-title="图片">
const $elem = E.$(
`<div class="w-e-menu" data-title="图片">
<i class="w-e-icon-image"></i>
</div>`
)
super($elem, editor)
)
super($elem, editor)
}
// 菜单点击事件
clickHandler() {
Bus.trigger(`graphicsEditorImage${isIntro ? '' : 'Content'}`)
}
tryChangeActive() {
}
}
class VideoMenu extends BtnMenu {
constructor(editor) {
// data-title属性表示当鼠标悬停在该按钮上时提示该按钮的功能简述
const $elem = E.$(
`<div class="w-e-menu" data-title="视频">
const $elem = E.$(
`<div class="w-e-menu" data-title="视频">
<i class="w-e-icon-play"></i>
</div>`
)
super($elem, editor)
)
super($elem, editor)
}
// 菜单点击事件
clickHandler() {
Bus.trigger('graphicsEditorVideo')
}
tryChangeActive() {
}
}
......@@ -173,7 +173,7 @@ class GraphicsEditor extends React.Component {
const textLength = this.editorInt.txt.text().replace(/\&nbsp\;/ig, ' ').length + videoCount + imageCount;
this.setState({ textLength }, () => {
if (textLength > maxLimit) {
message.warning('超过字数限定');
// message.warning('超过字数限定');
}
onChange(html, this.state.textLength);
})
......@@ -181,7 +181,7 @@ class GraphicsEditor extends React.Component {
this.editorInt.create();
this.editorInt.txt.html(detail.content);
}
// 选择图文
handleSelectVideo = (file) => {
this.setState({
......@@ -224,9 +224,9 @@ class GraphicsEditor extends React.Component {
render() {
const { editorId, textLength, showSelectImageModal, showSelectVideoModal } = this.state;
const { limitLength = 1000, isIntro, maxLimit } = this.props;
return <div className={`graphics-editor-container${isIntro ? ' introduce' : ''}`}>
<div className="editor-box" id={`editor${editorId}`}></div>
<div className="editor-tips">({textLength}/{maxLimit || 100000})</div>
return <div className={`graphics-editor-container${isIntro ? ' introduce' : ''} ${(textLength > maxLimit)&& 'warning'}`}>
<div className="editor-box" id={`editor${editorId}`} ></div>
<div className="editor-tips">( {(textLength > maxLimit) ? <span style={{ color: 'red' }} >{textLength}</span> : textLength}/{maxLimit || 100000})</div>
{showSelectVideoModal &&
<SelectPrepareFileModal
operateType="select"
......@@ -246,7 +246,7 @@ class GraphicsEditor extends React.Component {
onSelect={this.handleSelectVideo}
/>
}
{showSelectImageModal &&
{showSelectImageModal &&
<SelectPrepareFileModal
key="basic"
operateType="select"
......
......@@ -23,7 +23,7 @@
background-color: #fff !important;
border: none !important;
border-bottom: 1px solid #E8E8E8 !important;
width: 700px;
max-width: 700px;
}
.w-e-text-container {
......@@ -49,4 +49,8 @@
height: ~'calc(100% - 69px)' !important;
}
}
&.warning{
border-color: red;
}
}
\ No newline at end of file
......@@ -365,8 +365,8 @@ function AddExam(props: any) {
checked={needPhone == 'NEED_PHONE_VERIFY'}
onChange={(val) => { setNeedPhone(val ? 'NEED_PHONE_VERIFY' : 'DO_NOT_NEED_PHONE_VERIFY') }}
></Switch>
<div style={{ position: 'relative', top: 3, left: 8, color: "#999" }}><p>开启:需要验证手机号才能参加考试</p>
<p>关闭:仅需微信/企业微信授权登录验证</p></div>
<div style={{ position: 'relative', top: 3, left: 8, color: "#999" }}><p>开启:需要绑定手机号的用户才能参加考试</p>
<p>关闭:微信/企业微信登陆直接参加考试</p></div>
</div>
</Form.Item>
......
......@@ -109,24 +109,24 @@ function ExamData(props: any) {
dataIndex: "questionStem",
ellipsis: true,
width: 350,
render: (val:any) => {
render: (val: any) => {
var handleVal = val;
handleVal = handleVal.replace(/<(?!img|input).*?>/g, "");
handleVal = handleVal.replace(/<\s?input[^>]*>/gi, "_、");
handleVal = handleVal.replace(/\&nbsp\;/gi, " ");
return (
<Tooltip
overlayClassName="aid-tool-list"
title={
<div style={{ maxWidth: 700, width: "auto" }}>{handleVal}</div>
}
placement="topLeft"
overlayStyle={{ maxWidth: 700 }}
>
{handleVal}
</Tooltip>
<Tooltip
overlayClassName="aid-tool-list"
title={
<div style={{ maxWidth: 700, width: "auto" }}>{handleVal}</div>
}
placement="topLeft"
overlayStyle={{ maxWidth: 700 }}
>
{handleVal}
</Tooltip>
);
},
},
},
{
......@@ -177,7 +177,7 @@ function ExamData(props: any) {
if (filters.questionType) {
console.log(233232)
_query.questionType = filters.questionType;
_query.current =1;
_query.current = 1;
} else {
delete _query.questionType
}
......@@ -213,31 +213,47 @@ function ExamData(props: any) {
style={{ position: "absolute", left: "-10000px" }}
></a>
<div className="dataPanal">
<div className="item">
<div className="num">{(examData.singleChoiceAccuracy || 0) * 100}%</div>
<div className="percent">正确率</div>
<div className="subTitle"><div className="type"><span className="icon iconfont">&#xe7fa;</span> 单选题 <span>(共{examData.singleChoiceCnt}题)</span></div></div>
</div>
<div className="item">
<div className="num">{(examData.multiChoiceAccuracy || 0) * 100}%</div>
<div className="percent">正确率</div>
<div className="subTitle"><div className="type"><span className="icon iconfont">&#xe7fb;</span>多选题 <span>(共{examData.multiChoiceCnt}题)</span></div></div>
</div>
<div className="item">
<div className="num">{(examData.judgeAccuracy || 0) * 100}%</div>
<div className="percent">正确率</div>
<div className="subTitle"><div className="type"><span className="icon iconfont">&#xe7fc;</span>判断题 <span>(共{examData.judgeCnt}题)</span></div></div>
</div>
<div className="item">
<div className="num">{(examData.gapFillingAccuracy || 0) * 100}%</div>
<div className="percent">正确率</div>
<div className="subTitle"><div className="type"><span className="icon iconfont">&#xe7fd;</span>填空题 <span>(共{examData.gapFillingCnt}题)</span></div></div>
</div>
<div className="item">
<div className="num">{(examData.indefiniteChoiceAccuracy || 0) * 100}%</div>
<div className="percent">正确率</div>
<div className="subTitle"><div className="type"><span className="icon iconfont">&#xe7fe;</span>不定项选择题 <span>(共{examData.indefiniteChoiceCnt}题)</span></div></div>
</div>
{
!!examData.singleChoiceCnt && <div className="item">
<div className="num">{(examData.singleChoiceAccuracy || 0) * 100}%</div>
<div className="percent">正确率</div>
<div className="subTitle"><div className="type"><span className="icon iconfont">&#xe7fa;</span> 单选题 <span>(共{examData.singleChoiceCnt}题)</span></div></div>
</div>
}
{
!!examData.multiChoiceCnt && <div className="item">
<div className="num">{(examData.multiChoiceAccuracy || 0) * 100}%</div>
<div className="percent">正确率</div>
<div className="subTitle"><div className="type"><span className="icon iconfont">&#xe7fb;</span>多选题 <span>(共{examData.multiChoiceCnt}题)</span></div></div>
</div>
}
{
!!examData.judgeCnt && <div className="item">
<div className="num">{(examData.judgeAccuracy || 0) * 100}%</div>
<div className="percent">正确率</div>
<div className="subTitle"><div className="type"><span className="icon iconfont">&#xe7fc;</span>判断题 <span>(共{examData.judgeCnt}题)</span></div></div>
</div>
}
{
!!examData.gapFillingCnt && <div className="item">
<div className="num">{(examData.gapFillingAccuracy || 0) * 100}%</div>
<div className="percent">正确率</div>
<div className="subTitle"><div className="type"><span className="icon iconfont">&#xe7fd;</span>填空题 <span>(共{examData.gapFillingCnt}题)</span></div></div>
</div>
}
{
!!examData.indefiniteChoiceCnt && <div className="item">
<div className="num">{(examData.indefiniteChoiceAccuracy || 0) * 100}%</div>
<div className="percent">正确率</div>
<div className="subTitle"><div className="type"><span className="icon iconfont">&#xe7fe;</span>不定项选择题 <span>(共{examData.indefiniteChoiceCnt}题)</span></div></div>
</div>
}
</div>
{
!!allData && <Button style={{ marginBottom: 12, marginTop: 12 }} onClick={download} >导出</Button>
......
......@@ -48,6 +48,7 @@ class ExamShareModal extends React.Component {
// 下载海报
handleDownloadPoster = () => {
const { data } = this.props;
const dom = document.querySelector('#poster');
html2canvas(dom, {
useCORS: true,
......@@ -56,7 +57,7 @@ class ExamShareModal extends React.Component {
const { courseName } = this.props.data;
const dataUrl = canvas.toDataURL('image/png');
downloadDOM.href = dataUrl;
downloadDOM.download = `${courseName}.png`;
downloadDOM.download = `${data.examName}.png`;
downloadDOM.click();
});
}
......
......@@ -396,7 +396,15 @@ function ExaminationManager(props: any) {
</div>
<Route path={`${match.url}/add`} render={() => {
return <AddExam freshList={() => {
getList()
let _query: any = { ...queryRef.current };
if (_query.current != 1) {
_query.current = 1;
setQuery(_query)
} else {
getList()
}
}} />;
}} />
<Route path={`${match.url}/edit/:id`} render={() => {
......
......@@ -4,8 +4,9 @@
display: flex;
.item{
text-align: center;
width: 29.9%;
// width: 29.9%;
position: relative;
flex: 1;
.num{
font-size: 26px;
......@@ -60,6 +61,12 @@
right: 0px;
}
&:last-child{
&:after{
display: none;
}
}
}
.exstatus{
width: 4px;
......
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