成绩相关

master
yujialong 10 months ago
parent 3186dafffb
commit 908dc4670c
  1. 27
      public/index-occupationlab.html
  2. 9
      public/index-zxy.html
  3. 298
      src/pages/achievement/info/course.vue
  4. 55
      src/pages/achievement/info/project.vue
  5. 27
      src/pages/achievement/list/course.vue
  6. 16
      src/pages/achievement/list/project.vue
  7. 1
      src/pages/screen/index.vue
  8. 10
      src/setting.js

@ -0,0 +1,27 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link rel="stylesheet" href="//at.alicdn.com/t/font_830376_qzecyukz0s.css" />
<title>教师管理端</title>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement('script');
hm.src = 'https://hm.baidu.com/hm.js?72fbad6ebf1d6c705117fe8fe0686a0e';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</head>
<body>
<noscript>
<strong>We're sorry but vms doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="app"></div>
<script src="/styles/tinymce/tinymce.min.js"></script>
<!-- built files will be auto injected -->
</body>
</html>

@ -6,6 +6,15 @@
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
<link rel="stylesheet" href="//at.alicdn.com/t/font_830376_qzecyukz0s.css" />
<title>教师管理端</title>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement('script');
hm.src = 'https://hm.baidu.com/hm.js?e4d7deeca2d6ea71d2bd5fa2365bc654';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</head>
<body>
<noscript>

@ -6,161 +6,179 @@
<el-page-header @back="$router.push('list?tab=tab1')"
:content="goodsName"></el-page-header>
</div>
</el-card>
<el-card shadow="hover"
class="m-b-20">
<el-tabs v-model="curTab"
@tab-click="tabChange">
<el-tab-pane v-for="(item) in tabs"
:label="item.name"
<!-- <el-radio-group v-model="classId"
size="small">
<el-radio v-for="(item, i) in classList"
:key="i"
:label="item.id"
@change="initData">{{ item.className }}</el-radio>
</el-radio-group> -->
<el-tabs v-model="classId"
@tab-click="classChange">
<el-tab-pane v-for="(item, i) in classList"
:key="i"
:name="item.id"
:key="item.id"></el-tab-pane>
:label="item.className"></el-tab-pane>
</el-tabs>
<div class="stat">
<div class="nums">
<div class="item">
<p class="name">实验总人数</p>
<p class="val">{{ peopleNum }}</p>
</div>
<div class="item item2">
<p class="name">实验平均分</p>
<p class="val">{{ avgScore }}</p>
<el-card shadow="hover"
class="m-b-20">
<el-tabs v-model="curTab"
@tab-click="tabChange">
<el-tab-pane v-for="(item) in tabs"
:label="item.name"
:name="item.id"
:key="item.id"></el-tab-pane>
</el-tabs>
<div class="stat">
<div class="nums">
<div class="item">
<p class="name">实验总人数</p>
<p class="val">{{ peopleNum }}</p>
</div>
<div class="item item2">
<p class="name">实验平均分</p>
<p class="val">{{ avgScore }}</p>
</div>
<div class="item item3">
<p class="name">实验最高分</p>
<p class="val">{{ maxScore || 0 }}</p>
</div>
<div class="item item4">
<p class="name">实验最低分</p>
<p class="val">{{ minScore || 0 }}</p>
</div>
</div>
<div class="item item3">
<p class="name">实验最高分</p>
<p class="val">{{ maxScore || 0 }}</p>
<div class="chart"
id="chart"></div>
</div>
</el-card>
<el-card shadow="hover"
class="m-b-20">
<h6 style="font-size: 16px">错误率分析</h6>
<div class="wrong">
<div class="line">
<span class="jud-name">错误率最高{{ max.projectName }}</span>
<span>参加考试{{ max.numberOfParticipants || 0 }}&emsp;&emsp;{{ curTab == 1 ? `${max.itemErrorCount || 0}人做错,` : '' }}错误率{{ max.errorRate || 0 }}%</span>
</div>
<div class="item item4">
<p class="name">实验最低分</p>
<p class="val">{{ minScore || 0 }}</p>
<div class="line">
<span class="jud-name">错误率最低{{ min.projectName }}</span>
<span>参加考试{{ min.numberOfParticipants || 0 }}&emsp;&emsp;{{ curTab == 1 ? `${min.itemErrorCount || 0}人做错,` : '' }}错误率{{ min.errorRate || 0 }}%</span>
</div>
</div>
<div class="chart"
id="chart"></div>
</div>
</el-card>
<el-card shadow="hover"
class="m-b-20">
<h6 style="font-size: 16px">错误率分析</h6>
<div class="wrong">
<div class="line">
<span class="jud-name">错误率最高{{ max.projectName }}</span>
<span>参加考试{{ max.numberOfParticipants || 0 }}&emsp;&emsp;{{ curTab == 1 ? `${max.itemErrorCount || 0}人做错,` : '' }}错误率{{ max.errorRate || 0 }}%</span>
</div>
<div class="line">
<span class="jud-name">错误率最低{{ min.projectName }}</span>
<span>参加考试{{ min.numberOfParticipants || 0 }}&emsp;&emsp;{{ curTab == 1 ? `${min.itemErrorCount || 0}人做错,` : '' }}错误率{{ min.errorRate || 0 }}%</span>
</div>
</div>
<div class="chart"
id="chart1"></div>
</el-card>
id="chart1"></div>
</el-card>
<el-card shadow="hover">
<div class="flex-between m-b-20">
<div>
<el-input placeholder="请输入姓名/学号"
prefix-icon="el-icon-search"
v-model="keyword"
clearable></el-input>
</div>
<div>
<el-button type="primary"
@click="exportData">导出成绩列表</el-button>
<!-- <el-button type="primary"
<el-card shadow="hover">
<div class="flex-between m-b-20">
<div>
<el-input placeholder="请输入姓名/学号"
prefix-icon="el-icon-search"
v-model="keyword"
clearable></el-input>
</div>
<div>
<el-button type="primary"
@click="exportData">导出成绩列表</el-button>
<!-- <el-button type="primary"
@click="exportReport">导出成绩详情</el-button> -->
</div>
</div>
</div>
<el-table :data="listData"
class="table"
ref="table"
:key="curTab"
stripe
header-align="center"
@selection-change="handleSelectionChange"
row-key="reportId">
<el-table-column type="selection"
width="55"
align="center"
:reserve-selection="true"></el-table-column>
<el-table-column type="index"
width="60"
label="序号"
align="center">
<template slot-scope="scope">
{{ scope.$index + (page - 1) * pageSize + 1 }}
</template>
</el-table-column>
<el-table-column prop="userName"
label="姓名"
align="center"></el-table-column>
<el-table-column prop="workNumber"
label="学号"
align="center"></el-table-column>
<template v-if="curTab == 0">
<el-table-column label="练习项目数"
<el-table :data="listData"
class="table"
ref="table"
:key="curTab"
stripe
header-align="center"
@selection-change="handleSelectionChange"
row-key="reportId">
<el-table-column type="selection"
width="55"
align="center"
:reserve-selection="true"></el-table-column>
<el-table-column type="index"
width="60"
label="序号"
align="center">
<template slot-scope="scope">
{{ scope.row.totalNumberOfPractices }}
{{ scope.$index + (page - 1) * pageSize + 1 }}
</template>
</el-table-column>
<el-table-column prop="numberOfExercises"
label="练习次数"
width="90"
<el-table-column prop="userName"
label="姓名"
align="center"></el-table-column>
<el-table-column prop="workNumber"
label="学号"
align="center"></el-table-column>
<el-table-column label="累计练习时长"
<template v-if="curTab == 0">
<el-table-column label="练习项目数"
align="center">
<template slot-scope="scope">
{{ scope.row.totalNumberOfPractices }}
</template>
</el-table-column>
<el-table-column prop="numberOfExercises"
label="练习次数"
width="90"
align="center"></el-table-column>
<el-table-column label="累计练习时长"
align="center">
<template slot-scope="scope">
{{ scope.row.cumulativePracticeTime }}min
</template>
</el-table-column>
</template>
<template v-else>
<el-table-column prop="totalNumberOfParticipants"
label="参加考核次数"
align="center">
</el-table-column>
<el-table-column prop="averageTimeSpent"
label="平均用时"
align="center">
<template slot-scope="scope">
{{ scope.row.averageTimeSpent }}min
</template>
</el-table-column>
</template>
<el-table-column prop="avgScore"
label="平均分"
align="center">
<template slot-scope="scope">
{{ scope.row.cumulativePracticeTime }}min
{{ curTab == 0 ? scope.row.avgScore : scope.row.averageScore }}
</template>
</el-table-column>
</template>
<template v-else>
<el-table-column prop="totalNumberOfParticipants"
label="参加考核次数"
align="center">
</el-table-column>
<el-table-column prop="averageTimeSpent"
label="平均用时"
align="center">
<el-table-column prop="maxScore"
label="最高分"
align="center"></el-table-column>
<el-table-column prop="minScore"
label="最低分"
align="center"></el-table-column>
<el-table-column label="操作"
align="center"
width="140">
<template slot-scope="scope">
{{ scope.row.averageTimeSpent }}min
<el-button type="text"
@click="show(scope.row)">查看成绩详情</el-button>
</template>
</el-table-column>
</template>
<el-table-column prop="avgScore"
label="平均分"
align="center">
<template slot-scope="scope">
{{ curTab == 0 ? scope.row.avgScore : scope.row.averageScore }}
</template>
</el-table-column>
<el-table-column prop="maxScore"
label="最高分"
align="center"></el-table-column>
<el-table-column prop="minScore"
label="最低分"
align="center"></el-table-column>
<el-table-column label="操作"
align="center"
width="140">
<template slot-scope="scope">
<el-button type="text"
@click="show(scope.row)">查看成绩详情</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background
layout="total, prev, pager, next"
:total="total"
@current-change="handleCurrentChange"
:current-page="page">
</el-pagination>
</div>
</el-table>
<div class="pagination">
<el-pagination background
layout="total, prev, pager, next"
:total="total"
@current-change="handleCurrentChange"
:current-page="page">
</el-pagination>
</div>
</el-card>
</el-card>
<el-dialog title="成绩详情"
@ -284,6 +302,7 @@ export default {
id: +this.$route.query.id,
cid: +this.$route.query.cid,
classId: +this.$route.query.classId,
classList: [],
keyword: "",
searchTimer: null,
listDataAll: [],
@ -320,8 +339,8 @@ export default {
}
},
mounted () {
// this.getClass()
this.getData()
this.getClass()
this.initData()
},
methods: {
//
@ -367,6 +386,23 @@ export default {
this.page = 1
this.getData()
},
//
getClass () {
this.$post(this.api.allClassesInOurSchool).then(res => {
this.classList = res.data
}).catch(res => { })
},
//
classChange () {
this.$router.push({
path: 'course',
query: {
...this.$route.query,
classId: this.classId
}
})
this.initData()
},
//
handlePage () {
const list = this.listDataAll

@ -33,8 +33,8 @@
<div class="stat">
<div class="nums">
<div class="item">
<p class="name">实验总人数</p>
<p class="val">{{ peopleNum }}</p>
<p class="name">{{ permissions && classId != 1 ? '已参加/应参加实验人数' : '实验总人数' }}</p>
<p class="val">{{ peopleNum + (permissions && classId != 1 ? '/' + examCount : '') }}</p>
</div>
<div class="item item2">
<p class="name">实验平均分</p>
@ -133,11 +133,7 @@
prop="experimentalName"
label="考核名称"
min-width="250"
align="center">
<template slot-scope="scope">
{{ experimentalName }}
</template>
</el-table-column>
align="center"></el-table-column>
<el-table-column prop="userName"
label="学生姓名"
min-width="100"
@ -155,7 +151,7 @@
width="90"
align="center">
<template slot-scope="scope">
{{ scope.row.timeSum }}min
{{ scope.row.timeSum + (scope.row.reportId ? 'min' : '') }}
</template>
</el-table-column>
<el-table-column prop="submitTime"
@ -163,14 +159,25 @@
min-width="150"
align="center">
</el-table-column>
<el-table-column v-if="permissions"
prop="submitTime"
label="状态"
min-width="150"
align="center">
<template slot-scope="scope">
{{ scope.row.reportId ? '已参加' : '未参加' }}
</template>
</el-table-column>
<el-table-column label="操作"
align="center"
width="160">
<template slot-scope="scope">
<el-button type="text"
@click="show(scope.row)">查看成绩报告</el-button>
<el-button type="text"
@click="handleDelete(scope.row)">删除</el-button>
<tempalte v-if="scope.row.reportId">
<el-button type="text"
@click="show(scope.row)">查看成绩报告</el-button>
<el-button type="text"
@click="handleDelete(scope.row)">删除</el-button>
</tempalte>
</template>
</el-table-column>
</el-table>
@ -292,6 +299,7 @@ export default {
page: 1,
pageSize: 10,
total: 0,
examCount: 0,
peopleNum: 0, //
avgScore: 0, //
maxScore: 0,
@ -359,16 +367,16 @@ export default {
const res = this.permissions ?
await this.$post(`${this.api.getAssessmentDetail}?pageNum=${this.page}&pageSize=10000&assessmentId=${this.id}&classId=${this.classId}&keyword=${this.keyword}&mallId=${this.mallId}`) :
await this.$post(`${this.api.getPracticeDetail}?pageNum=${this.page}&pageSize=10000&projectId=${this.id}&keyWord=${this.keyword}&classId=${this.classId}&mallId=${this.mallId}`)
this.listDataAll = res.page.records
this.listData = res.page.records
this.total = res.page.total
this.avgScore = (+res.avgScore).toFixed(2)
this.examCount = res.examCount
this.peopleNum = res.peopleNum
this.maxScore = res.maxScore
this.minScore = res.minScore
this.errorAnalysis = res.errorAnalysis || {}
this.max = res.highestErrorRate || {}
this.min = res.minimumErrorRate || {}
this.handlePage()
this.getChart()
this.errorChart()
},
@ -402,7 +410,7 @@ export default {
: `${this.api.exportPracticeInfo}?projectId=${this.id}&mallId=${this.mallId}`
// id
if (this.multipleSelection.length) {
const ids = this.multipleSelection.map(e => e.reportId)
const ids = this.multipleSelection.map(e => this.permissions ? e.testStatusId : e.reportId)
url += `&ids=${ids.toString()}`
}
axios.get(url, {
@ -415,9 +423,17 @@ export default {
}).catch(res => { })
},
//
exportReport () {
async exportReport () {
//
const list = this.multipleSelection.length ? this.multipleSelection : this.listDataAll
let list = this.multipleSelection
if (!this.multipleSelection.length) {
//
const res = this.permissions ?
await this.$post(`${this.api.getAssessmentDetail}?pageNum=${this.page}&pageSize=10000&assessmentId=${this.id}&classId=${this.classId}&keyword=${this.keyword}&mallId=${this.mallId}`) :
await this.$post(`${this.api.getPracticeDetail}?pageNum=${this.page}&pageSize=10000&projectId=${this.id}&keyWord=${this.keyword}&classId=${this.classId}&mallId=${this.mallId}`)
list = res.page.records
}
list.forEach(async e => {
const { report, userScores } = await this.$get(`${this.api.reportDetail}?reportId=${e.reportId}`)
userScores.map((e, i) => {
@ -473,7 +489,7 @@ export default {
},
handleCurrentChange (val) { //
this.page = val;
this.handlePage();
this.getData();
},
handleSelectionActivationChange (val) { //
@ -481,7 +497,7 @@ export default {
},
handleCurrentActivationChange (val) { //
this.pageActivation = val;
this.handlePage();
this.getData();
},
// ()
@ -515,7 +531,6 @@ export default {
list.map(n => {
yData[n.score]++
})
console.log(333, xData, yData)
let myChart = echarts.init(document.getElementById("chart"));
myChart.setOption({
title: { text: "实验分数分布图" },

@ -3,7 +3,7 @@
<h6 class="p-title">筛选</h6>
<div class="tool mul">
<ul class="filter">
<li>
<!-- <li>
<label>课程</label>
<el-select v-model="mallId"
@change="initData">
@ -28,6 +28,12 @@
:value="item.id">
</el-option>
</el-select>
</li> -->
<li>
<el-input placeholder="请输入课程名称"
prefix-icon="el-icon-search"
v-model="keyword"
clearable></el-input>
</li>
</ul>
</div>
@ -49,10 +55,10 @@
label="课程"
align="center"
min-width="200"></el-table-column>
<el-table-column prop="className"
<!-- <el-table-column prop="className"
label="班级"
align="center"
min-width="130"></el-table-column>
min-width="130"></el-table-column> -->
<el-table-column prop="numberOfPracticeItems"
label="练习项目数"
align="center"
@ -61,10 +67,10 @@
label="考核项目数"
align="center"
min-width="100"></el-table-column>
<el-table-column prop="classSize"
<!-- <el-table-column prop="classSize"
label="班级人数"
align="center"
min-width="100"></el-table-column>
min-width="100"></el-table-column> -->
<el-table-column label="操作"
align="center"
width="100">
@ -98,7 +104,7 @@ export default {
projectPermissions: this.$route.query.per ? +this.$route.query.per : 0,
mallIds: [],
curs: [],
keyword: "",
keyword: this.$route.query.keyword || '',
searchTimer: null,
startingtime: "",
endTime: "",
@ -127,7 +133,7 @@ export default {
}
],
date: "",
page: +this.$route.query.page || 1,
page: this.$route.query.page ? +this.$route.query.page : 1,
pageSize: 10,
total: 0,
loadIns: null
@ -156,6 +162,13 @@ export default {
keyword: function (val) {
clearTimeout(this.searchTimer);
this.searchTimer = setTimeout(() => {
this.$router.push({
path: 'list',
query: {
...this.$route.query,
keyword: val
}
})
this.initData();
}, 500);
}

@ -170,7 +170,7 @@ export default {
projectPermissions: this.$route.query.per ? +this.$route.query.per : 0,
mallIds: [],
curs: [],
keyword: "",
keyword: this.$route.query.keyword || '',
searchTimer: null,
startingtime: "",
endTime: "",
@ -199,7 +199,7 @@ export default {
}
],
date: "",
page: +this.$route.query.page || 1,
page: this.$route.query.page ? +this.$route.query.page : 1,
pageSize: 10,
total: 0,
loadIns: null
@ -228,6 +228,13 @@ export default {
keyword: function (val) {
clearTimeout(this.searchTimer);
this.searchTimer = setTimeout(() => {
this.$router.push({
path: 'list',
query: {
...this.$route.query,
keyword: val
}
})
this.initData();
}, 500);
}
@ -246,7 +253,7 @@ export default {
const { data } = await this.$get(this.api.getSchoolEffectiveCourse)
this.curs = data
this.mallId = this.mallId || data[0].mallId
this.initData();
this.getData();
},
//
curChange (id) {
@ -294,7 +301,6 @@ export default {
list = res.page.records
this.total = res.page.total
}
console.log(33, per)
list.map(e => {
// isAdmin1 isdel=1courseDel=1 (1. 2.3)isAdmin0isDel1
e.canDel = per ?
@ -353,7 +359,7 @@ export default {
},
//
entry (row) {
this.$router.push(`project?id=${row.assessmentId || row.projectId}&projectName=${row.projectName}&permissions=${row.permissions || 0}&mallId=${this.mallId}`)
this.$router.push(`project?id=${row.assessmentId || row.projectId}&projectName=${row.projectName}&permissions=${row.permissions || 0}&mallId=${this.mallId}&classId=${row.classId}`)
},
handleDelete (row) { //
this.$confirm("该项目下的所有成绩报告将会删除,是否继续?", "提示", {

@ -772,6 +772,7 @@ export default {
sort: 0,
isShelves: 0,
hotTag: 1,
purchaseStatus: 1
})
if (cousrseRes) {
const courseList = cousrseRes.page.records

@ -15,8 +15,11 @@ let bankPath = `${location.origin}/banksystem` // 银行系统地址
let sandPath = `${location.origin}/sandbox` // 沙盘地址
let jumpPath = `${location.origin}/judgmentPoint`
let host = `${location.origin}/`
let uploadURL = `${location.origin}/`
let title = (isHh || isCH) ? '教师管理端' : '职站服务端管理系统'
// let host = `https://izhixinyun.com/`
// let uploadURL = `${location.origin}/`
let uploadURL = `https://izhixinyun.com/`
// let title = (isHh || isCH) ? '教师管理端' : '职站服务端管理系统'
let title = '教师管理端'
if (isPro) {
bankPath = `https://www.huorantech.cn/banksystem`
@ -30,8 +33,7 @@ if (isPro) {
uploadURL = `http://121.37.12.51/`
host = "http://121.37.12.51/"; // 中台测试服
// host = 'https://www.occupationlab.com/' // 正式服
host = "http://192.168.31.217:9000/"; // 榕
// host = 'http://192.168.31.51:9000/'; // 赓
host = "http://192.168.31.217:9000/";
} else if (isSq) {
zcPath = `10.20.100.204:8883`
}

Loading…
Cancel
Save