feat: add the guide, question-setting tips && mark-paper size adjusting #1

Merged
OpenCT merged 1 commits from Eei7om32x/openscore:dev into master 2022-08-21 14:03:30 +08:00
6 changed files with 376 additions and 21 deletions

View File

@ -0,0 +1,140 @@
import React from "react";
import {Divider, Image, Layout, Typography} from "antd";
import {Content} from "antd/es/layout/layout";
const {Title, Paragraph, Text, Link} = Typography;
export default class Home extends React.Component {
constructor(props) {
super(props);
}
componentDidMount() {
}
render() {
return(
<Layout className="site-layout">
<Content style={{margin: "30px 36px"}}>
<Typography>
<Title>Openscore阅卷系统使用指南</Title>
<Divider />
<Paragraph>
<Text strong>欢迎使用Openscore</Text>
</Paragraph>
<Paragraph>
Openscore阅卷系统是Openct社区旗下开发的线上阅卷系统支持对试卷的批量导入批改数据统计和实时监控立志于将阅卷过程智能化
</Paragraph>
<Paragraph>
本指南将为您提供关于本系统的详细使用指导
</Paragraph>
<Title level={2}>开始使用</Title>
<Paragraph>
请先选择您的角色登录openscore系统
</Paragraph>
<Paragraph>
<Text type="secondary">本文包括</Text>
</Paragraph>
<Paragraph>
<ul>
<li>
<Link href="/web/public">管理员指南</Link>
</li>
<li>
<Link href="/web/public">阅卷组长指南</Link>
</li>
<li>
<Link href="/web/public">阅卷老师指南</Link>
</li>
</ul>
</Paragraph>
<blockquote>
<Title level={3}>管理员</Title>
<pre>管理员具有<Text mark>试卷题目设置</Text><Text mark></Text><Text mark></Text><Text
mark>实时监控评卷进度</Text><Text mark></Text></pre>
</blockquote>
<blockquote>
<Title level={5}>管理员如何导入试卷</Title>
<Divider />
<Paragraph>1.管理员登陆后选择左侧菜单中试卷管理-题目设置看到如下界面</Paragraph>
<Image width="90%" src="http://tva1.sinaimg.cn/large/0076q0C5ly1h57qpsiqtoj31q70kl404.jpg" />
<Divider />
<Paragraph>2.按如下格式填写大题设置</Paragraph>
<Image width="90%" src="http://tva1.sinaimg.cn/large/0076q0C5ly1h57qsysys6j31px09laaq.jpg" />
<Paragraph type="danger">(如果选择需要二次阅卷同一份试卷将交给两位老师批改)</Paragraph>
<Divider />
<Paragraph>3.按如下格式填写小题设置</Paragraph>
<Paragraph>注意分数分布中的各个数字即表示阅卷时该题可以打的分数<Text
type="danger"> 分数与分数之间用-短横线字符链接</Text></Paragraph>
<Image width="90%" src="http://tva1.sinaimg.cn/large/0076q0C5ly1h57qwhe93bj31pu0910t7.jpg" />
<Divider />
<Paragraph>4.填写均完成后点击<Text keyboard>确认</Text> </Paragraph>
<Paragraph>点击<Text keyboard>查看详情</Text>+</Paragraph>
<Image width="50%" src="http://tva1.sinaimg.cn/large/0076q0C5ly1h57qzjrgqbj313d0m1dhc.jpg" />
<Paragraph>5.接下来选择左侧菜单中试卷管理-试卷导入然后点击<Text keyboard>导入试卷</Text>excel</Paragraph>
<Image width="40%" src="http://tva1.sinaimg.cn/large/0076q0C5ly1h57r5k512oj30im03caa0.jpg" />
<Paragraph>注意上传的文件需遵循以下格式<Link href="/">点击下载excel模板样式</Link></Paragraph>
<Image width="80%" src="http://tva1.sinaimg.cn/large/0076q0C5ly1h5dxg7hoadj31gx0n9b29.jpg" />
</blockquote>
<blockquote>
<Title level={5}>管理员如何管理用户</Title>
<Paragraph>管理员登陆后选择左侧菜单中用户管理-用户管理看到如下界面</Paragraph>
<Image width="90%" src="http://tva1.sinaimg.cn/large/0076q0C5ly1h5dxgq53vtj31lc0g70u6.jpg" />
<Paragraph>点击<Text keyboard>添加</Text></Paragraph>
<Paragraph>点击<Text keyboard>编辑</Text></Paragraph>
<Paragraph>点击<Text keyboard>删除</Text> </Paragraph>
</blockquote>
<blockquote>
<Title level={5}>管理员如何监控阅卷进度</Title>
<Paragraph>管理员登陆后选择左侧菜单中评卷监控的各个子菜单选择科目和大题即可监测阅卷进度</Paragraph>
<Image src="http://tva1.sinaimg.cn/large/0076q0C5ly1h5dxdqygtbj308m0dojrj.jpg" />
</blockquote>
<blockquote>
<Title level={3}>阅卷组长</Title>
<pre>阅卷组长具有<Text mark>监控阅卷进度</Text><Text mark></Text><Text mark></Text><Text mark></Text></pre>
</blockquote>
<blockquote>
<Title level={5}>阅卷组长如何监控阅卷进度</Title>
<Paragraph>阅卷组长登陆后选择左侧菜单中评卷监控的各个子菜单选择大题即可监测阅卷进度</Paragraph>
<Image width="90%" src="http://tva1.sinaimg.cn/large/0076q0C5ly1h5dxedxh4aj319l0dojsv.jpg" />
</blockquote>
<blockquote>
<Title level={5}>阅卷组长如何评阅特殊试卷</Title>
<Paragraph>阅卷组长登陆后选择左侧菜单中试卷管理中的各个子菜单选择大题即可看到各老师提交的特殊试卷点击右上角的评阅试卷按钮即可评阅特殊试卷</Paragraph>
<Image width="90%" src="http://tva1.sinaimg.cn/large/0076q0C5ly1h5dxeodt3aj31cd0e60tj.jpg" />
</blockquote>
<blockquote>
<Title level={3}>阅卷员</Title>
<pre>阅卷员具有<Text mark>评卷</Text><Text mark></Text><Text mark></Text><Text mark></Text></pre>
</blockquote>
<blockquote>
<Title level={5}>阅卷员如何评卷</Title>
<Paragraph>阅卷员登陆后自动定位到评卷界面也可点击左侧菜单的评卷进入如下图所示阅卷员可在上方通过滑动条调整试卷图片到自己觉得合适的大小该大小将会自动保存
阅卷员可以通过键盘输入或鼠标点击的方式选择该题的分数分数将显示在试卷上点击<Text keyboard>提交</Text>
再次点击<Text keyboard>确认</Text>
<li>小贴士阅卷员可以只使用键盘操作阅卷进入阅卷界面光标将自动定位到分数选择框可以输入分数回车确定后<Text keyboard>Tab</Text>
按一次即到提交按两次即到问题卷按三次即到优秀卷再敲下回车键即相当于点击按钮出现弹框后再敲下回车键即可完成一次评分</li>
</Paragraph>
<Image width="90%" src="http://tva1.sinaimg.cn/large/0076q0C5ly1h5dxeyjyduj31bt0d00y7.jpg" />
</blockquote>
</Typography>
</Content>
</Layout>
);
}
}

View File

@ -12,6 +12,8 @@ import Answer from "../Mark/Answer";
import Sample from "../Mark/Sample";
import Review from "../Mark/Review";
import guide from "../Guide";
import all from "../Group/mark_monitor/all";
import average from "../Group/mark_monitor/average";
import score from "../Group/mark_monitor/score";
@ -76,7 +78,7 @@ export default class index extends Component {
}
})
.catch((e) => {
Setting.showMessage('error', e)
Setting.showMessage("error", e);
});
}
getAccount() {
@ -228,7 +230,7 @@ export default class index extends Component {
<img src={logoUrl} alt="" />
<span className="header-title">OpenCT在线阅卷系统</span>
</div>
{/*
<div className="header-info">
<span className="header-teacher">教师小屋</span>
<span className="header-teacher">任务正评卷</span>
@ -236,10 +238,16 @@ export default class index extends Component {
<span className="header-teacher">评卷数量201</span>
<span className="header-teacher">平均速度6.5/</span>
<span className="header-teacher">当前密号2008886</span>
</div>
</div>*/}
{
this.renderAccount()
}
<div className="header-right">
<Link
to={"/home/guide"} style={{color: "#ffffff", marginLeft: "50px"}}>
阅卷系统使用指南
</Link>
</div>
</div>
</Header>
@ -293,6 +301,7 @@ export default class index extends Component {
<Route path="/home/management/user/user_manage" component={userManage} exact></Route>
<Route path="/home/normaluser" component={normalLogin} exact></Route>
<Route path="/home/guide" component={guide} exact></Route>
</>
: null

View File

@ -4,7 +4,7 @@
background-color: #fff;
> .ant-layout-header{
background-color: #545A77;
padding: 0px 15px;
padding: 0 15px;
height: 48px;
> .header-box{
width: 100%;
@ -29,10 +29,16 @@
color: #ffffff;
margin-left: 90px;
> span {
margin:0px 30px;
margin:0 30px;
}
}
> .header-right{
font-size: 14px;
color: #ffffff;
float: right;
margin-left: 1000px;
}
}
}
> .container{

View File

@ -1,7 +1,7 @@
import React, {Component} from "react";
import DocumentTitle from "react-document-title";
import {Button, Input, Modal, Radio, message} from "antd";
import {DeleteOutlined, ExclamationCircleOutlined} from "@ant-design/icons";
import {Button, Input, Modal, Popover, Radio, message} from "antd";
import {DeleteOutlined, ExclamationCircleOutlined, QuestionCircleOutlined} from "@ant-design/icons";
import * as Settings from "../../../../Setting";
import "./index.less";
import Manage from "../../../../api/manage";
@ -24,6 +24,7 @@ export default class index extends Component {
topicName: undefined,
score: undefined,
error: undefined,
selfScore: undefined,
scoreType: 1,
topicDetails: [
{
@ -36,7 +37,28 @@ export default class index extends Component {
QuestionId: undefined,
QuestionDetailIds: [],
visible: false,
}
content1 = (
<div>
<p>输入小题的名称</p>
<p>第1小题</p>
</div>
);
content2 = (
<div>
<p>输入小题的分数</p>
<p>10</p>
</div>
);
content3 = (
<div>
<p>-分割小题的分数</p>
<p>0-5-10</p>
</div>
);
componentDidMount() {
let questionList = [...this.state.questionList];
@ -51,6 +73,13 @@ export default class index extends Component {
});
}} />
<Popover content={this.content1} trigger="hover">
&emsp;<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
}} />
</Popover>
</div>
<div className="question-item">
小题满分<Input placeholder="请输入分数" style={{width: 120}} onChange={e => {
@ -61,6 +90,13 @@ export default class index extends Component {
});
}} />
<Popover content={this.content2} trigger="hover">
&emsp;<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
}} />
</Popover>
</div>
<div className="question-item">
分数分布<Input placeholder="请输入分布" style={{width: 120}} onChange={e => {
@ -71,6 +107,13 @@ export default class index extends Component {
});
}} />
<Popover content={this.content3} trigger="hover">
&emsp;<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
}} />
</Popover>
</div>
</div>
);
@ -106,6 +149,13 @@ export default class index extends Component {
topicDetails,
});
}} />
<Popover content={this.content1} trigger="hover">
&emsp;<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
}} />
</Popover>
</div>
<div className="question-item">
小题满分<Input placeholder="请输入分数" style={{width: 120}} onChange={e => {
@ -121,6 +171,13 @@ export default class index extends Component {
topicDetails,
});
}} />
<Popover content={this.content2} trigger="hover">
&emsp;<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
}} />
</Popover>
</div>
<div className="question-item">
分数分布<Input placeholder="请输入分布" style={{width: 120}} onChange={e => {
@ -136,6 +193,13 @@ export default class index extends Component {
topicDetails,
});
}} />
<Popover content={this.content3} trigger="hover">
&emsp;<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
}} />
</Popover>
</div>
<div className="question-item">
<DeleteOutlined style={{fontSize: "20px", color: "#1890FF", height: "100%", marginTop: "5px", cursor: "pointer"}} onClick={() => {this.questionDel(questionNo);}} />
@ -198,6 +262,7 @@ export default class index extends Component {
score: Number(this.state.score),
error: Number(this.state.error),
scoreType: this.state.scoreType,
selfScore: Number(this.state.selfScore),
topicDetails,
})
.then((res) => {
@ -273,6 +338,47 @@ export default class index extends Component {
goToDetail = () => {
this.props.history.push("/home/management/detailTable");
}
content01 = (
<div>
<p>输入科目的名称</p>
<p>语文</p>
</div>
);
content02 = (
<div>
<p>输入大题的名称</p>
<p>第一大题</p>
</div>
);
content03 = (
<div>
<p>输入大题的分数</p>
<p>10</p>
</div>
);
content04 = (
<div>
<p>输入本题阅卷标准差</p>
<p>5</p>
</div>
);
content05 = (
<div>
<p>填入一个小于100的整数</p>
<p>自评指数指每百份试卷中自评的份数</p>
</div>
);
content06 = (
<div>
<p>开启二次阅卷后</p>
<p>每张试卷将被二次评阅</p>
</div>
);
render() {
return (
@ -288,6 +394,13 @@ export default class index extends Component {
subjectName: e.target.value,
});
}} />
<Popover content={this.content01} trigger="hover">
&emsp;<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
}} />
</Popover>
</div>
<div className="subject-item">
大题名<Input placeholder="请输入大题名" value={this.state.topicName} style={{width: 120}} onChange={e => {
@ -295,6 +408,13 @@ export default class index extends Component {
topicName: e.target.value,
});
}} />
<Popover content={this.content02} trigger="hover">
&emsp;<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
}} />
</Popover>
</div>
<div className="subject-item">
分数满分<Input placeholder="请输入分数" value={this.state.score} style={{width: 120}} onChange={e => {
@ -302,6 +422,13 @@ export default class index extends Component {
score: e.target.value,
});
}} />
<Popover content={this.content03} trigger="hover">
&emsp;<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
}} />
</Popover>
</div>
<div className="subject-item">
标准误差<Input placeholder="请输入误差" value={this.state.error} style={{width: 120}} onChange={e => {
@ -309,20 +436,52 @@ export default class index extends Component {
error: e.target.value,
});
}} />
<Popover content={this.content04} trigger="hover">
&emsp;<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
}} />
</Popover>
</div>
</div>
<div className="setting-second">
是否需要二次阅卷<Radio.Group
onChange={e => {
<div className="setting-input">
<div className="subject-item">
自评指数<Input placeholder="请输入每百份自评数" value={this.state.selfScore} style={{width: 120}} onChange={e => {
this.setState({
scoreType: e.target.value,
selfScore: e.target.value,
});
}}
defaultValue={this.state.scoreType}>
<Radio value={1}></Radio>
<Radio value={2}></Radio>
</Radio.Group>
}} />
<Popover content={this.content05} trigger="hover">
&emsp;<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
}} />
</Popover>
</div>
<div className="setting-second">
<Popover content={this.content06} trigger="hover">
<QuestionCircleOutlined style={{
fontSize: "20px",
cursor: "pointer",
color: "#999999",
marginRight: "10px",
}} />
</Popover>
是否需要二次阅卷<Radio.Group
onChange={e => {
this.setState({
scoreType: e.target.value,
});
}}
defaultValue={this.state.scoreType}>
<Radio value={1}></Radio>
<Radio value={2}></Radio>
</Radio.Group>
</div>
</div>
</div>
</div>
<div className="question-setting">

View File

@ -25,7 +25,7 @@
display: flex;
margin-bottom: 30px;
.subject-item{
margin-right: 10%;
margin-right: 9%;
}
}
}
@ -66,7 +66,7 @@
color: rgba(0, 0, 0, 0.85);
background-color: #FAFAFA;
border: 1px solid #F0F0F0;
border-radius: 2px 2px 0px 0px;
border-radius: 2px 2px 0 0;
margin-top: 18px;
cursor: pointer;
}

View File

@ -1,6 +1,6 @@
import React, {Component} from "react";
import DocumentTitle from "react-document-title";
import {Button, Input, Modal, Radio, Select, Space, message} from "antd";
import {Button, Input, Modal, Radio, Select, Slider, Space, message} from "antd";
import {ExclamationCircleOutlined} from "@ant-design/icons";
import * as Settings from "../../../Setting";
import "./index.less";
@ -23,12 +23,14 @@ export default class index extends Component {
selectScore: [],
subTopic: [],
markScore: [],
imgWidth: 100,
};
componentDidMount() {
if(localStorage.getItem("account") === "1" || localStorage.getItem("account") === "2") {
this.getAllPaper();
}
// this.dragPicture();
}
// 总试卷获取
@ -93,12 +95,45 @@ export default class index extends Component {
}
// 阅卷区
onChange = (value) => {
// console.log("onChange: ", value);
this.setState({
imgWidth: value,
});
};
onAfterChange = (value) => {
console.log("onAfterChange: ", value);
};
imgSlider =() => {
if (this.state.currentPaper.testInfos !== undefined) {
return <div className="slider">
<h3>&ensp;拖动滑动条缩放图片</h3>
<Slider
min={50}
max={150}
step={10}
defaultValue={100}
onChange={this.onChange}
onAfterChange={this.onAfterChange}
/>
</div>;
} else{
return null;
}
}
showTest = () => {
let testPaper = null;
if (this.state.currentPaper.testInfos !== undefined) {
testPaper = this.state.currentPaper.testInfos.map((item, index) => {
return <div className="test-question-img" key={index} data-content-before={this.imgScore(item.test_detail_id)}>
<img src={item.pic_src} alt="加载失败" />
<img
src={item.pic_src}
alt="加载失败"
width={this.state.imgWidth + "%"}
/>
</div>;
});
}
@ -110,6 +145,9 @@ export default class index extends Component {
<DocumentTitle title="阅卷系统-评卷">
<div className="mark-tasks-page" data-component="mark-tasks-page">
<div className="mark-paper">
{
this.imgSlider()
}
{
this.showTest()
}
@ -296,7 +334,10 @@ export default class index extends Component {
Settings.showMessage("error", e);
});
}
} else if (value === 2) {
} else if (value === 3) {
console.log("3");
} else {
console.log("2", this);
this.setState({
problemVisible: true,
});