dev_202412
yujialong 8 months ago
parent c84ccc6ce0
commit d11e9ed59b
  1. 355
      src/pages/achievement/info/course.vue
  2. 379
      src/pages/achievement/info/project.vue
  3. 1
      src/pages/achievement/show/index.vue
  4. 390
      src/pages/match/manage/matchReport.vue
  5. 311
      src/pages/project/add/index.vue
  6. 4
      src/pages/station/preview/index.vue
  7. 202
      src/plugins/requests/index.js
  8. 2
      src/setting.js

@ -1,32 +1,20 @@
<template>
<div>
<el-card shadow="hover"
class="m-b-20 head-card">
<el-card shadow="hover" class="m-b-20 head-card">
<div class="flex-between m-b-20">
<el-page-header @back="back"
:content="goodsName"></el-page-header>
<el-page-header @back="back" :content="goodsName"></el-page-header>
</div>
</el-card>
<div v-loading="loading">
<el-card shadow="hover"
class="m-b-20">
<el-tabs v-model="classId"
@tab-click="classChange">
<el-tab-pane v-for="(item, i) in classList"
:key="i"
:name="item.id"
:label="item.className"></el-tab-pane>
<el-card shadow="hover" class="m-b-20">
<el-tabs v-model="classId" @tab-click="classChange">
<el-tab-pane v-for="(item, i) in classList" :key="i" :name="item.id" :label="item.className"></el-tab-pane>
</el-tabs>
<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-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">
@ -47,224 +35,138 @@
<p class="val">{{ minScore || 0 }}</p>
</div>
</div>
<div class="chart"
id="chart"></div>
<div class="chart" id="chart"></div>
</div>
</el-card>
<el-card shadow="hover"
class="m-b-20">
<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>参加考试{{ permissions ? (max.numberOfParticipants || 0) : (max.quantityAfterWeightRemoval || 0) }}&emsp;&emsp;{{ curTab == 1 ? `${max.itemErrorCount || 0}人做错,` : '' }}错误率{{ max.errorRate || 0 }}%</span>
<span>参加考试{{ permissions ? (max.numberOfParticipants || 0) : (max.quantityAfterWeightRemoval || 0)
}}&emsp;&emsp;{{ curTab == 1 ? `${max.itemErrorCount || 0}人做错,` : '' }}错误率{{ max.errorRate || 0
}}%</span>
</div>
<div class="line">
<span class="jud-name">错误率最低{{ min.projectName }}</span>
<span>参加考试{{ permissions ? (min.numberOfParticipants || 0) : (min.quantityAfterWeightRemoval || 0) }}&emsp;&emsp;{{ curTab == 1 ? `${min.itemErrorCount || 0}人做错,` : '' }}错误率{{ min.errorRate || 0 }}%</span>
<span>参加考试{{ permissions ? (min.numberOfParticipants || 0) : (min.quantityAfterWeightRemoval || 0)
}}&emsp;&emsp;{{ curTab == 1 ? `${min.itemErrorCount || 0}人做错,` : '' }}错误率{{ min.errorRate || 0
}}%</span>
</div>
</div>
<div class="chart"
id="chart1"></div>
<div class="chart" 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>
<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="exportData">导出成绩列表</el-button>
<!-- <el-button type="primary"
@click="exportReport">导出成绩详情</el-button> -->
</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">
<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>
<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="练习项目数"
align="center">
<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">
<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 prop="totalNumberOfParticipants" label="参加考核次数" align="center">
</el-table-column>
<el-table-column prop="averageTimeSpent"
label="平均用时"
align="center">
<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">
<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">
<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>
<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 background layout="total, prev, pager, next" :total="total"
@current-change="handleCurrentChange" :current-page="page">
</el-pagination>
</div>
</el-card>
</el-card>
<el-dialog title="成绩详情"
:visible.sync="detailVisible"
width="900px"
:key="curTab"
:close-on-click-modal="false">
<el-dialog title="成绩详情" :visible.sync="detailVisible" width="900px" :key="curTab" :close-on-click-modal="false">
<div class="m-b-10 text-right">
<el-button type="primary"
@click="exportDetail">导出</el-button>
<el-button type="primary" @click="exportDetail">导出</el-button>
</div>
<el-table :data="details"
stripe
:key="curTab"
header-align="center"
row-key="id">
<el-table-column type="index"
width="60"
label="序号"
align="center">
<el-table :data="details" stripe :key="curTab" header-align="center" row-key="id">
<el-table-column type="index" width="60" label="序号" align="center">
<template slot-scope="scope">
{{ scope.$index + (pageDetail - 1) * pageSizeDetail + 1 }}
</template>
</el-table-column>
<el-table-column prop="userName"
label="姓名"
width="100"
align="center">
<el-table-column prop="userName" label="姓名" width="100" align="center">
</el-table-column>
<el-table-column prop="workNumber"
label="学号"
width="100"
align="center"></el-table-column>
<el-table-column prop="workNumber" label="学号" width="100" align="center"></el-table-column>
<template v-if="curTab == 0">
<el-table-column prop="projectName"
label="项目名称"
min-width="200"
align="center"></el-table-column>
<el-table-column prop="averageDuration"
label="平均练习时长"
width="110"
align="center">
<el-table-column prop="projectName" label="项目名称" min-width="200" align="center"></el-table-column>
<el-table-column prop="averageDuration" label="平均练习时长" width="110" align="center">
<template slot-scope="scope">
{{ scope.row.averageDuration }}min
</template>
</el-table-column>
<el-table-column prop="averageScore"
label="平均分"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="averageScore" label="平均分" min-width="100" align="center"></el-table-column>
</template>
<template v-else>
<el-table-column prop="experimentalName"
label="考核名称"
min-width="200"
align="center"></el-table-column>
<el-table-column prop="averageDuration"
label="用时"
width="100"
align="center">
<el-table-column prop="experimentalName" label="考核名称" min-width="200" align="center"></el-table-column>
<el-table-column prop="averageDuration" label="用时" width="100" align="center">
<template slot-scope="scope">
{{ scope.row.timeSum }}min
</template>
</el-table-column>
<el-table-column prop="score"
label="分数"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="score" label="分数" min-width="100" align="center"></el-table-column>
</template>
<el-table-column label="成绩报告"
align="center"
width="90">
<el-table-column label="成绩报告" align="center" width="90">
<template slot-scope="scope">
<el-button type="text"
@click="toReport(scope.row)">查看</el-button>
<el-button type="text" @click="toReport(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background
layout="total, prev, pager, next"
:total="totalDetail"
:page-size="pageSizeDetail"
@current-change="handleCurrentDetailChange"
:current-page="pageDetail">
<el-pagination background layout="total, prev, pager, next" :total="totalDetail" :page-size="pageSizeDetail"
@current-change="handleCurrentDetailChange" :current-page="pageDetail">
</el-pagination>
</div>
<span slot="footer"
class="dialog-footer">
<el-button size="small"
type="primary"
@click="detailVisible = false">确定</el-button>
<span slot="footer" class="dialog-footer">
<el-button size="small" type="primary" @click="detailVisible = false">确定</el-button>
</span>
</el-dialog>
</div>
@ -448,20 +350,23 @@ export default {
//
const list = this.multipleSelection.length ? this.multipleSelection : this.listDataAll
list.forEach(async e => {
const { report, userScores } = await this.$get(`${this.api.reportDetail}?reportId=${e.reportId}`)
userScores.map((e, i) => {
if (e.answer && typeof e.answer === 'string') e.answer = e.answer.replace(/<[^>]+>/g, '').replace(/(&nbsp;|&amp;|%s)/g, '').replace(/>/g, '&gt;').replace(/</g, '&lt;')
})
for (const i in report) {
if (report[i] && typeof report[i] === 'string') report[i] = report[i].replace(/<[^>]+>/g, '')
if (e.reportId) {
try {
const { report, userScores } = await this.$get(`${this.api.reportDetail}?reportId=${e.reportId}`)
userScores.map((e, i) => {
if (e.answer && typeof e.answer === 'string') e.answer = e.answer.replace(/<[^>]+>/g, '').replace(/(&nbsp;|&amp;|%s)/g, '').replace(/>/g, '&gt;').replace(/</g, '&lt;')
})
for (const i in report) {
if (report[i] && typeof report[i] === 'string') report[i] = report[i].replace(/<[^>]+>/g, '')
}
report.purpose = report.purpose.replace(/<[^>]+>/g, '')
const res = await this.$post(this.api[userScores.find(e => e.lcRuleRecords) ? 'exportBankExperimentReport' : 'exportLabReport'], {
...report,
experimentalData: userScores
})
util.downloadFileDirect(`${e.userName}的实验报告.docx`, new Blob([res]))
} catch (e) { }
}
report.purpose = report.purpose.replace(/<[^>]+>/g, '')
this.$post(this.api[userScores.find(e => e.lcRuleRecords) ? 'exportBankExperimentReport' : 'exportLabReport'], {
...report,
experimentalData: userScores
}).then(res => {
util.downloadFileDirect(`${e.userName}的实验报告.docx`, new Blob([res]))
}).catch(res => { })
})
},
handleDelete (row) { //
@ -714,75 +619,85 @@ export default {
<style lang="scss" scoped>
/deep/ .head-card {
.el-card__body {
padding-bottom: 0px;
.el-card__body {
padding-bottom: 0px;
.el-tabs__header {
margin-bottom: 1px;
.el-tabs__header {
margin-bottom: 1px;
.el-tabs__nav-wrap::after {
display: none;
}
.el-tabs__nav-wrap::after {
display: none;
}
.el-tabs__item {
font-size: 18px;
}
}
.el-tabs__item {
font-size: 18px;
}
}
}
}
.chart {
height: 300px;
height: 300px;
}
.stat {
display: flex;
.nums {
display: flex;
.nums {
display: flex;
align-items: center;
flex-wrap: wrap;
width: 640px;
margin-right: 20px;
align-items: center;
flex-wrap: wrap;
width: 640px;
margin-right: 20px;
.item {
width: 300px;
padding: 30px 30px;
margin: 0 10px;
box-sizing: border-box;
border-radius: 8px;
background: url('../../../assets/img/total.png') 0 0/100% 100% no-repeat;
p {
font-size: 18px;
color: #ffffff;
}
.val {
margin-top: 10px;
color: #ffffff;
font-size: 36px;
}
}
.item:nth-child(2) {
background-image: url('../../../assets/img/avg.png');
}
.item:nth-child(3) {
background-image: url('../../../assets/img/ach1.png');
}
.item:nth-child(4) {
background-image: url('../../../assets/img/ach2.png');
}
.item {
width: 300px;
padding: 30px 30px;
margin: 0 10px;
box-sizing: border-box;
border-radius: 8px;
background: url('../../../assets/img/total.png') 0 0/100% 100% no-repeat;
p {
font-size: 18px;
color: #ffffff;
}
.val {
margin-top: 10px;
color: #ffffff;
font-size: 36px;
}
}
.item:nth-child(2) {
background-image: url('../../../assets/img/avg.png');
}
.item:nth-child(3) {
background-image: url('../../../assets/img/ach1.png');
}
.chart {
width: calc(100% - 660px);
.item:nth-child(4) {
background-image: url('../../../assets/img/ach2.png');
}
}
.chart {
width: calc(100% - 660px);
}
}
.wrong {
.line {
display: flex;
width: 920px;
margin: 0 auto 10px;
.jud-name {
width: 500px;
margin-right: 100px;
}
.line {
display: flex;
width: 920px;
margin: 0 auto 10px;
.jud-name {
width: 500px;
margin-right: 100px;
}
}
}
</style>

@ -1,36 +1,26 @@
<template>
<div>
<div class="back-wrap">
<span class="back"
@click="back">返回 ></span>
<span class="back" @click="back">返回 ></span>
<span class="name">{{ experimentalName }}</span>
</div>
<div v-loading="loading">
<el-card v-if="classes.length"
shadow="hover"
class="m-b-20 head-card">
<el-card v-if="classes.length" shadow="hover" class="m-b-20 head-card">
<div class="flex-between m-b-20">
<div>
<span class="m-r-10">班级</span>
<el-select v-model="classId"
clearable
@change="initData">
<el-option label="不限"
value="">
<el-select v-model="classId" clearable @change="initData">
<el-option label="不限" value="">
</el-option>
<el-option v-for="item in classes"
:key="item.id"
:label="item.className"
:value="item.id">
<el-option v-for="item in classes" :key="item.id" :label="item.className" :value="item.id">
</el-option>
</el-select>
</div>
</div>
</el-card>
<el-card shadow="hover"
class="m-b-20">
<el-card shadow="hover" class="m-b-20">
<div class="stat">
<div class="nums">
<div class="item">
@ -50,224 +40,124 @@
<p class="val">{{ minScore }}</p>
</div>
</div>
<div class="chart"
id="chart"></div>
<div class="chart" id="chart"></div>
</div>
</el-card>
<el-card shadow="hover"
class="m-b-20">
<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.judgmentName }}</span>
<span>参加考试{{ peopleNum }}&emsp;&emsp;{{ permissions ? `${max.errorTotal || 0}人做错,` : '' }}错误率{{ max.errorRate }}%</span>
<span>参加考试{{ peopleNum }}&emsp;&emsp;{{ permissions ? `${max.errorTotal || 0}人做错,` : '' }}错误率{{
max.errorRate }}%</span>
</div>
<div class="line">
<span class="jud-name">错误率最低{{ min.judgmentName }}</span>
<span>参加考试{{ peopleNum }}&emsp;&emsp;{{ permissions ? `${min.errorTotal || 0}人做错,` : '' }}错误率{{ min.errorRate }}%</span>
<span>参加考试{{ peopleNum }}&emsp;&emsp;{{ permissions ? `${min.errorTotal || 0}人做错,` : '' }}错误率{{
min.errorRate }}%</span>
</div>
</div>
<div class="chart"
id="chart1"></div>
<div class="chart" id="chart1"></div>
</el-card>
<el-card shadow="hover">
<div class="flex-between m-b-10">
<div>
<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 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>
</div>
<div class="flex-between m-b-20">
<div>
<el-input placeholder="请输入姓名/学号"
prefix-icon="el-icon-search"
v-model="keyword"
clearable></el-input>
<el-input placeholder="请输入姓名/学号" prefix-icon="el-icon-search" v-model="keyword" clearable></el-input>
</div>
<div v-if="curTab == 0">
<el-button type="primary"
@click="delAllData">批量删除</el-button>
<el-button type="primary"
@click="exportData">导出成绩列表</el-button>
<el-button type="primary"
@click="exportReport">导出成绩报告</el-button>
<el-button type="primary" @click="delAllData">批量删除</el-button>
<el-button type="primary" @click="exportData">导出成绩列表</el-button>
<el-button type="primary" @click="exportReport">导出成绩报告</el-button>
</div>
<div v-else>
<el-button type="primary"
@click="exportDataActivation">导出</el-button>
<el-button type="primary" @click="exportDataActivation">导出</el-button>
</div>
</div>
<template v-if="curTab == 0">
<el-table :data="listData"
:key="1"
class="table"
ref="table"
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">
<el-table :data="listData" :key="1" class="table" ref="table" 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="className"
label="班级"
min-width="150"
align="center">
<el-table-column prop="className" label="班级" min-width="150" align="center">
</el-table-column>
<el-table-column v-if="permissions"
prop="experimentalName"
label="考核名称"
min-width="250"
align="center"></el-table-column>
<el-table-column prop="userName"
label="学生姓名"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="workNumber"
label="学号"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="score"
label="分数"
width="90"
align="center"></el-table-column>
<el-table-column prop="timeSum"
label="耗时"
width="90"
align="center">
<el-table-column v-if="permissions" prop="experimentalName" label="考核名称" min-width="250"
align="center"></el-table-column>
<el-table-column prop="userName" label="学生姓名" min-width="100" align="center"></el-table-column>
<el-table-column prop="workNumber" label="学号" min-width="100" align="center"></el-table-column>
<el-table-column prop="score" label="分数" width="90" align="center"></el-table-column>
<el-table-column prop="timeSum" label="耗时" width="90" align="center">
<template slot-scope="scope">
{{ scope.row.timeSum + (scope.row.reportId ? 'min' : '') }}
</template>
</el-table-column>
<el-table-column prop="submitTime"
label="提交时间"
min-width="150"
align="center">
<el-table-column prop="submitTime" label="提交时间" min-width="150" align="center">
</el-table-column>
<el-table-column v-if="permissions"
prop="submitTime"
label="状态"
min-width="150"
align="center">
<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">
<el-table-column label="操作" align="center" width="160">
<template slot-scope="scope">
<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>
<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>
<div class="pagination">
<el-pagination background
layout="total, prev, pager, next"
:total="total"
@current-change="handleCurrentChange"
:current-page="page">
<el-pagination background layout="total, prev, pager, next" :total="total"
@current-change="handleCurrentChange" :current-page="page">
</el-pagination>
</div>
</template>
<template v-else>
<el-table :data="activations"
:key="2"
ref="table"
stripe
header-align="center"
@selection-change="handleSelectionActivationChange"
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">
<el-table :data="activations" :key="2" ref="table" stripe header-align="center"
@selection-change="handleSelectionActivationChange" 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 + (pageActivation - 1) * pageSizeActivation + 1 }}
</template>
</el-table-column>
<el-table-column prop="className"
label="班级"
min-width="150"
align="center">
<el-table-column prop="className" label="班级" min-width="150" align="center">
</el-table-column>
<el-table-column prop="userName"
label="学生姓名"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="workNumber"
label="学号"
min-width="100"
align="center"></el-table-column>
<el-table-column prop="practiceNum"
label="练习次数"
min-width="90"
align="center"></el-table-column>
<el-table-column prop="avgScore"
label="实验平均分"
min-width="90"
align="center"></el-table-column>
<el-table-column prop="highestScore"
label="实验最高分"
min-width="90"
align="center"></el-table-column>
<el-table-column prop="lowestMark"
label="实验最低分"
min-width="90"
align="center"></el-table-column>
<el-table-column prop="timeSum"
label="耗时最多"
min-width="90"
align="center">
<el-table-column prop="userName" label="学生姓名" min-width="100" align="center"></el-table-column>
<el-table-column prop="workNumber" label="学号" min-width="100" align="center"></el-table-column>
<el-table-column prop="practiceNum" label="练习次数" min-width="90" align="center"></el-table-column>
<el-table-column prop="avgScore" label="实验平均分" min-width="90" align="center"></el-table-column>
<el-table-column prop="highestScore" label="实验最高分" min-width="90" align="center"></el-table-column>
<el-table-column prop="lowestMark" label="实验最低分" min-width="90" align="center"></el-table-column>
<el-table-column prop="timeSum" label="耗时最多" min-width="90" align="center">
<template slot-scope="scope">
{{ scope.row.theLongestTime }}min
</template>
</el-table-column>
<el-table-column prop="timeSum"
label="耗时最少"
min-width="90"
align="center">
<el-table-column prop="timeSum" label="耗时最少" min-width="90" align="center">
<template slot-scope="scope">
{{ scope.row.shortestTime }}min
</template>
</el-table-column>
<el-table-column prop="lastSubmissionTime"
label="最近提交时间"
min-width="150"
align="center">
<el-table-column prop="lastSubmissionTime" label="最近提交时间" min-width="150" align="center">
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination background
layout="total, prev, pager, next"
:total="totalActivation"
@current-change="handleCurrentActivationChange"
:current-page="pageActivation">
<el-pagination background layout="total, prev, pager, next" :total="totalActivation"
@current-change="handleCurrentActivationChange" :current-page="pageActivation">
</el-pagination>
</div>
</template>
@ -450,20 +340,23 @@ export default {
}
list.forEach(async e => {
const { report, userScores } = await this.$get(`${this.api.reportDetail}?reportId=${e.reportId}`)
userScores.map((e, i) => {
if (e.answer && typeof e.answer === 'string') e.answer = e.answer.replace(/<[^>]+>/g, '').replace(/(&nbsp;|&amp;|%s)/g, '').replace(/>/g, '&gt;').replace(/</g, '&lt;')
})
for (const i in report) {
if (report[i] && typeof report[i] === 'string') report[i] = report[i].replace(/<[^>]+>/g, '')
if (e.reportId) {
try {
const { report, userScores } = await this.$get(`${this.api.reportDetail}?reportId=${e.reportId}`)
userScores.map((e, i) => {
if (e.answer && typeof e.answer === 'string') e.answer = e.answer.replace(/<[^>]+>/g, '').replace(/(&nbsp;|&amp;|%s)/g, '').replace(/>/g, '&gt;').replace(/</g, '&lt;')
})
for (const i in report) {
if (report[i] && typeof report[i] === 'string') report[i] = report[i].replace(/<[^>]+>/g, '')
}
report.purpose = report.purpose.replace(/<[^>]+>/g, '')
const res = await this.$post(this.api[userScores.find(e => e.lcRuleRecords) ? 'exportBankExperimentReport' : 'exportLabReport'], {
...report,
experimentalData: userScores
})
util.downloadFileDirect(`${e.userName}的实验报告.docx`, new Blob([res]))
} catch (e) { }
}
report.purpose = report.purpose.replace(/<[^>]+>/g, '')
this.$post(this.api[userScores.find(e => e.lcRuleRecords) ? 'exportBankExperimentReport' : 'exportLabReport'], {
...report,
experimentalData: userScores
}).then(res => {
util.downloadFileDirect(`${e.userName}的实验报告.docx`, new Blob([res]))
}).catch(res => { })
})
},
handleDelete (row) { //
@ -707,83 +600,95 @@ export default {
<style lang="scss" scoped>
.back-wrap {
margin-bottom: 20px;
.back {
margin-right: 20px;
color: #9278ff;
cursor: pointer;
}
margin-bottom: 20px;
.back {
margin-right: 20px;
color: #9278ff;
cursor: pointer;
}
}
/deep/ .head-card {
.el-card__body {
padding-bottom: 0px;
.el-card__body {
padding-bottom: 0px;
.el-tabs__header {
margin-bottom: 1px;
.el-tabs__header {
margin-bottom: 1px;
.el-tabs__nav-wrap::after {
display: none;
}
.el-tabs__nav-wrap::after {
display: none;
}
.el-tabs__item {
font-size: 18px;
}
}
.el-tabs__item {
font-size: 18px;
}
}
}
}
.chart {
height: 300px;
height: 300px;
}
.stat {
display: flex;
.nums {
display: flex;
.nums {
display: flex;
align-items: center;
flex-wrap: wrap;
width: 640px;
margin-right: 20px;
align-items: center;
flex-wrap: wrap;
width: 640px;
margin-right: 20px;
.item {
width: 300px;
padding: 30px 30px;
margin: 0 10px;
box-sizing: border-box;
border-radius: 8px;
background: url('../../../assets/img/total.png') 0 0/100% 100% no-repeat;
p {
font-size: 18px;
color: #ffffff;
}
.val {
margin-top: 10px;
color: #ffffff;
font-size: 36px;
}
}
.item:nth-child(2) {
background-image: url('../../../assets/img/avg.png');
}
.item:nth-child(3) {
background-image: url('../../../assets/img/ach1.png');
}
.item:nth-child(4) {
background-image: url('../../../assets/img/ach2.png');
}
.item {
width: 300px;
padding: 30px 30px;
margin: 0 10px;
box-sizing: border-box;
border-radius: 8px;
background: url('../../../assets/img/total.png') 0 0/100% 100% no-repeat;
p {
font-size: 18px;
color: #ffffff;
}
.val {
margin-top: 10px;
color: #ffffff;
font-size: 36px;
}
}
.item:nth-child(2) {
background-image: url('../../../assets/img/avg.png');
}
.item:nth-child(3) {
background-image: url('../../../assets/img/ach1.png');
}
.chart {
width: calc(100% - 660px);
.item:nth-child(4) {
background-image: url('../../../assets/img/ach2.png');
}
}
.chart {
width: calc(100% - 660px);
}
}
.wrong {
.line {
display: flex;
width: 920px;
margin: 0 auto 10px;
.jud-name {
width: 500px;
margin-right: 100px;
}
.line {
display: flex;
width: 920px;
margin: 0 auto 10px;
.jud-name {
width: 500px;
margin-right: 100px;
}
}
}
</style>

@ -411,6 +411,7 @@ samp {
}
.result-pic {
max-width: 100%;
margin: 10px 0;
}

@ -1,204 +1,137 @@
<template>
<div class="wrap">
<el-card shadow="hover"
class="m-b-20">
<el-page-header @back="$router.back()"
content="查看报告"></el-page-header>
<el-card shadow="hover" class="m-b-20">
<el-page-header @back="$router.back()" content="查看报告"></el-page-header>
</el-card>
<div class="content"
v-loading="loading">
<div class="content" v-loading="loading">
<div class="text-right">
<el-button type="primary"
@click="exportPage">导出报告</el-button>
<el-button type="primary" @click="exportPage">导出报告</el-button>
</div>
<h6 class="r-title">标准实验报告</h6>
<div class="info">
<h6 class="l-title">
<img src="@/assets/img/info1.png"
alt="">
<img src="@/assets/img/info1.png" alt="">
基本信息
</h6>
<ul :class="['info-list', {edit: editing}]">
<ul :class="['info-list', { edit: editing }]">
<li>
<label>学生姓名</label>
<el-input v-if="editing"
v-model="infoData.userName"
disabled></el-input>
<el-input v-if="editing" v-model="infoData.userName" disabled></el-input>
<span v-else>{{ infoData.userName }}</span>
</li>
<li>
<label>学生学号</label>
<el-input v-if="editing"
v-model="infoData.workNumber"
disabled></el-input>
<el-input v-if="editing" v-model="infoData.workNumber" disabled></el-input>
<span v-else>{{ infoData.workNumber }}</span>
</li>
<li>
<label>实验时间</label>
<el-input v-if="editing"
v-model="infoData.submitTime"
disabled></el-input>
<el-input v-if="editing" v-model="infoData.submitTime" disabled></el-input>
<span v-else>{{ infoData.submitTime }}</span>
</li>
<li>
<label>实验成绩</label>
<el-input v-if="editing"
v-model="infoData.score"
disabled></el-input>
<div v-else
class="score-wrap">
<el-input v-if="editing" v-model="infoData.score" disabled></el-input>
<div v-else class="score-wrap">
<em>{{ infoData.score }}</em>
<img src="@/assets/img/point.png"
alt="">
<img src="@/assets/img/point.png" alt="">
</div>
</li>
<li>
<label>学生班级</label>
<el-input v-if="editing"
v-model="infoData.className"></el-input>
<el-input v-if="editing" v-model="infoData.className"></el-input>
<span v-else>{{ infoData.className }}</span>
</li>
<li>
<label>指导老师</label>
<el-input v-if="editing"
v-model="infoData.instructor"></el-input>
<el-input v-if="editing" v-model="infoData.instructor"></el-input>
<span v-else>{{ infoData.instructor }}</span>
</li>
<li>
<label>实验学时</label>
<el-input v-if="editing"
v-model="infoData.period"></el-input>
<el-input v-if="editing" v-model="infoData.period"></el-input>
<span v-else>{{ infoData.period }}</span>
</li>
</ul>
<div class="m-b-20">
<h6 class="l-title">
<img src="@/assets/img/report2.png"
alt="">
<img src="@/assets/img/report2.png" alt="">
实验项目名称
</h6>
<el-input v-if="editing"
v-model="form.projectName"
type="textarea"></el-input>
<div v-else
class="pre-wrap"
v-html="form.projectName"></div>
<el-input v-if="editing" v-model="form.projectName" type="textarea"></el-input>
<div v-else class="pre-wrap" v-html="form.projectName"></div>
</div>
<div class="m-b-20">
<h6 class="l-title">
<img src="@/assets/img/report3.png"
alt="">
<img src="@/assets/img/report3.png" alt="">
实验目的
</h6>
<div :class="['pre-wrap', {edit: editing}]"
v-html="form.purpose"></div>
<div :class="['pre-wrap', { edit: editing }]" v-html="form.purpose"></div>
</div>
<div class="m-b-20">
<h6 class="l-title">
<img src="@/assets/img/report4.png"
alt="">
<img src="@/assets/img/report4.png" alt="">
实验数据
</h6>
<el-table :data="expData"
class="table"
border
stripe
header-align="center">
<el-table-column type="index"
label="序号"
align="center"
width="60">
<el-table :data="expData" class="table" border stripe header-align="center">
<el-table-column type="index" label="序号" align="center" width="60">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="judgmentName"
label="判分点"
width="270"
align="center"></el-table-column>
<el-table-column v-if='project'
prop="judgmentName"
label="考核点"
align="center"
width="150">
<el-table-column prop="judgmentName" label="判分点" width="270" align="center"></el-table-column>
<el-table-column v-if='project' prop="judgmentName" label="考核点" align="center" width="150">
<template slot-scope="scope">
<div v-for="(item, index) in scope.row.lcRuleRecords"
:key="index">
<div v-for="(item, index) in scope.row.lcRuleRecords" :key="index">
<span>
<span>{{index+1}}. </span>{{item.name}}
<span>{{ index + 1 }}. </span>{{ item.name }}
</span>
</div>
</template>
</el-table-column>
<el-table-column prop="ruleAnswer"
label="参考答案"
style='word-wrap: break-word'>
<el-table-column prop="ruleAnswer" label="参考答案" style='word-wrap: break-word'>
<template slot-scope="scope">
<div v-if='scope.row.lcRuleRecords'>
<div v-for="(item, index) in scope.row.lcRuleRecords"
:key="index">
<div v-for="(item, index) in scope.row.lcRuleRecords" :key="index">
<span>
<span>{{index+1}}. </span>{{item.ruleAnswer}}
<span>{{ index + 1 }}. </span>{{ item.ruleAnswer }}
</span>
</div>
</div>
<div v-else
v-html="scope.row.referenceAnswer"></div>
<div v-else v-html="scope.row.referenceAnswer"></div>
</template>
</el-table-column>
<el-table-column prop="userAnswer"
label="学生答案">
<el-table-column prop="userAnswer" label="学生答案">
<template slot-scope="scope">
<div v-if='scope.row.lcRuleRecords'>
<div v-for="(item, index) in scope.row.lcRuleRecords"
:key="index">
<div v-for="(item, index) in scope.row.lcRuleRecords" :key="index">
<span v-if='item.userAnswer'>
<span>{{index+1}}. </span>{{item.userAnswer}}
<span>{{ index + 1 }}. </span>{{ item.userAnswer }}
</span>
<span v-else>
<span>{{index+1}}. </span>未填写
<span>{{ index + 1 }}. </span>未填写
</span>
</div>
</div>
<div v-else
v-html='scope.row.answer'
style='white-space: pre-wrap'></div>
<div v-else v-html='scope.row.answer' style='white-space: pre-wrap'></div>
<template v-if="scope.row.runThePictureList">
<img v-for="(img, i) in scope.row.runThePictureList"
:key="i"
width="200"
class="result-pic"
:src="img"
alt="">
<img v-for="(img, i) in scope.row.runThePictureList" :key="i" width="200" class="result-pic"
:src="img" alt="">
</template>
</template>
</el-table-column>
<el-table-column prop="quesScore"
label="分值"
:key="6"
width="80"
align="center"></el-table-column>
<el-table-column prop="score"
label="得分"
width="80"
align="center"></el-table-column>
<el-table-column prop="quesScore" label="分值" :key="6" width="80" align="center"></el-table-column>
<el-table-column prop="score" label="得分" width="80" align="center"></el-table-column>
</el-table>
</div>
<div class="m-b-20">
<h6 class="l-title">
<img src="@/assets/img/report5.png"
alt="">
<img src="@/assets/img/report5.png" alt="">
实验总结与体会
</h6>
<quill v-if="editing"
:border="true"
v-model="form.summarize"
:minHeight="150"
:height="150" />
<div v-else
class="pre-wrap"
v-html="form.summarize"></div>
<quill v-if="editing" :border="true" v-model="form.summarize" :minHeight="150" :height="150" />
<div v-else class="pre-wrap" v-html="form.summarize"></div>
</div>
</div>
</div>
@ -313,132 +246,161 @@ export default {
<style lang="scss" scoped>
.wrap {
padding: 12px 300px 20px;
padding: 12px 300px 20px;
}
.text-right {
text-align: right;
text-align: right;
}
code,
kbd,
samp {
font-family: 'PingFang SC', 'Helvetica Neue', Helvetica, 'microsoft yahei', arial, STHeiTi, sans-serif;
word-wrap: break-word;
white-space: pre-wrap;
font-family: 'PingFang SC', 'Helvetica Neue', Helvetica, 'microsoft yahei', arial, STHeiTi, sans-serif;
word-wrap: break-word;
white-space: pre-wrap;
}
/deep/ pre {
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
word-break: break-all;
overflow: hidden;
font-size: 12px;
font-weight: 400;
font-family: 'PingFang SC', 'Helvetica Neue', Helvetica, 'microsoft yahei', arial, STHeiTi, sans-serif;
white-space: pre-wrap;
/* css-3 */
white-space: -moz-pre-wrap;
/* Mozilla, since 1999 */
white-space: pre-wrap;
/* Opera 4-6 */
white-space: -o-pre-wrap;
/* Opera 7 */
word-wrap: break-word;
/* Internet Explorer 5.5+ */
word-break: break-all;
overflow: hidden;
font-size: 12px;
font-weight: 400;
font-family: 'PingFang SC', 'Helvetica Neue', Helvetica, 'microsoft yahei', arial, STHeiTi, sans-serif;
}
.content {
padding: 16px 40px;
background: #fff;
.r-title {
margin-bottom: 40px;
font-size: 24px;
text-align: center;
color: #333;
}
.info {
padding: 20px 16px;
border: 1px solid #e1e6f2;
padding: 16px 40px;
background: #fff;
.r-title {
margin-bottom: 40px;
font-size: 24px;
text-align: center;
color: #333;
}
.info {
padding: 20px 16px;
border: 1px solid #e1e6f2;
}
.l-title {
display: flex;
align-items: center;
padding: 5px 8px;
margin-bottom: 12px;
font-size: 14px;
color: #333;
background-color: #f7f5ff;
}
.info-list {
display: flex;
flex-wrap: wrap;
padding: 10px 0 0 20px;
li {
display: inline-flex;
width: 23%;
padding: 0 10px;
margin-bottom: 34px;
}
.l-title {
display: flex;
&.edit {
li {
align-items: center;
padding: 5px 8px;
margin-bottom: 12px;
font-size: 14px;
color: #333;
background-color: #f7f5ff;
}
}
.info-list {
display: flex;
flex-wrap: wrap;
padding: 10px 0 0 20px;
li {
display: inline-flex;
width: 23%;
padding: 0 10px;
margin-bottom: 34px;
}
&.edit {
li {
align-items: center;
}
}
label {
font-size: 14px;
color: #333;
white-space: nowrap;
}
span {
min-width: 150px;
padding: 0 10px 3px;
border-bottom: 1px solid #e1e6f2;
}
/deep/.el-input {
width: 174px;
}
label {
font-size: 14px;
color: #333;
white-space: nowrap;
}
.score-wrap {
position: relative;
min-width: 150px;
border-bottom: 1px solid #e1e6f2;
em {
position: absolute;
top: -12px;
left: 30px;
font-family: din;
font-size: 30px;
font-weight: 600;
color: #0b1d30;
}
img {
position: absolute;
bottom: -15px;
left: 0;
}
span {
min-width: 150px;
padding: 0 10px 3px;
border-bottom: 1px solid #e1e6f2;
}
/deep/.el-textarea .el-textarea__inner,
.pre-wrap {
min-height: 72px;
padding: 10px 16px;
font-size: 14px;
color: #333;
&.edit {
color: #abb3c6;
border: 1px solid #cacfdb;
border-radius: 4px;
background-color: #f6f7f9;
}
/deep/.el-input {
width: 174px;
}
/deep/ .table th {
background-color: #e5dfff !important;
.cell {
line-height: 35px;
color: #fff;
}
}
.score-wrap {
position: relative;
min-width: 150px;
border-bottom: 1px solid #e1e6f2;
em {
position: absolute;
top: -12px;
left: 30px;
font-family: din;
font-size: 30px;
font-weight: 600;
color: #0b1d30;
}
img {
position: absolute;
bottom: -15px;
left: 0;
}
}
/deep/.el-textarea .el-textarea__inner,
.pre-wrap {
min-height: 72px;
padding: 10px 16px;
font-size: 14px;
color: #333;
&.edit {
color: #abb3c6;
border: 1px solid #cacfdb;
border-radius: 4px;
background-color: #f6f7f9;
}
}
/deep/ .table th {
background-color: #e5dfff !important;
.cell {
line-height: 35px;
color: #fff;
}
}
}
.result-pic {
margin: 10px 0;
max-width: 100%;
margin: 10px 0;
}
@media (max-width: 1650px) {
.wrap {
padding: 12px 200px 20px;
}
.wrap {
padding: 12px 200px 20px;
}
}
@media (max-width: 1430px) {
.wrap {
padding: 12px 100px 20px;
}
.wrap {
padding: 12px 100px 20px;
}
}
</style>

@ -1,65 +1,39 @@
<template>
<div ref="main"
class="main"
v-loading="loading">
<div ref="main" class="main" v-loading="loading">
<el-form :disabled="isDetail">
<el-card shadow="hover"
class="m-b-20">
<el-card shadow="hover" class="m-b-20">
<div class="flex-between">
<el-page-header @back="back"
content="项目配置"></el-page-header>
<el-page-header @back="back" content="项目配置"></el-page-header>
<div v-if="!isDetail">
<el-button type="success"
:loading="submiting === 0"
@click="save(0)">保存为草稿</el-button>
<el-button type="primary"
:loading="submiting === 1"
@click="save(1)">确定并发布</el-button>
<el-button type="success" :loading="submiting === 0" @click="save(0)">保存为草稿</el-button>
<el-button type="primary" :loading="submiting === 1" @click="save(1)">确定并发布</el-button>
</div>
</div>
</el-card>
<el-card shadow="hover"
class="m-b-20">
<el-card shadow="hover" class="m-b-20">
<h6 class="p-title">基本信息</h6>
<div>
<el-form label-width="80px"
:disabled="isDetail">
<el-form label-width="80px" :disabled="isDetail">
<div class="flex">
<el-form-item label="课程">
<el-cascader v-if="projectManage.founder"
v-model="mallIds"
:options="curs"
:props="{ checkStrictly: true, value: 'id' }"
popper-class="course-cas"
@expand-change="curChange"
@change="curChange"></el-cascader>
<el-cascader v-if="projectManage.founder" v-model="mallIds" :options="curs"
:props="{ checkStrictly: true, value: 'id' }" popper-class="course-cas" @expand-change="curChange"
@change="curChange"></el-cascader>
<el-select v-else
v-model="projectManage.systemId"
placeholder="请选择"
@change="systemChange">
<el-option v-for="item in systemList"
:key="item.id"
:label="item.label"
:value="item.id"></el-option>
<el-select v-else v-model="projectManage.systemId" placeholder="请选择" @change="systemChange">
<el-option v-for="item in systemList" :key="item.id" :label="item.label" :value="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="项目名称">
<el-input v-model.trim="projectManage.projectName"
placeholder="20个字符以内"
@blur="projectNameExistis"></el-input>
<el-input v-model.trim="projectManage.projectName" placeholder="20个字符以内"
@blur="projectNameExistis"></el-input>
</el-form-item>
<el-form-item label="项目用途">
<el-select v-model="projectManage.permissions"
placeholder="请选择"
@change="permissionChange">
<el-option label="练习"
:value="0"></el-option>
<el-option label="考核"
:value="1"></el-option>
<el-option label="竞赛"
:value="2"></el-option>
<el-select v-model="projectManage.permissions" placeholder="请选择" @change="permissionChange">
<el-option label="练习" :value="0"></el-option>
<el-option label="考核" :value="1"></el-option>
<el-option label="竞赛" :value="2"></el-option>
</el-select>
</el-form-item>
</div>
@ -67,172 +41,101 @@
</div>
</el-card>
<el-card shadow="hover"
class="m-b-20">
<el-card shadow="hover" class="m-b-20">
<h6 class="p-title">实验目标</h6>
<div>
<el-form label-width="0">
<el-form-item>
<quill :border="true"
:readonly="isDetail"
v-model="projectManage.experimentTarget"
:type.sync="projectManage.experimentTargetType"
radio
:minHeight="150"
:height="150" />
<quill :border="true" :readonly="isDetail" v-model="projectManage.experimentTarget"
:type.sync="projectManage.experimentTargetType" radio :minHeight="150" :height="150" />
</el-form-item>
</el-form>
</div>
</el-card>
<el-card shadow="hover"
class="m-b-20">
<el-card shadow="hover" class="m-b-20">
<h6 class="p-title">项目背景</h6>
<div>
<el-form label-width="0">
<el-form-item>
<quill :border="true"
:readonly="isDetail"
v-model="projectManage.experimentDescription"
:type.sync="projectManage.experimentDescriptionType"
radio
:minHeight="150"
:height="150"
:index="1" />
<quill :border="true" :readonly="isDetail" v-model="projectManage.experimentDescription"
:type.sync="projectManage.experimentDescriptionType" radio :minHeight="150" :height="150" :index="1" />
</el-form-item>
</el-form>
</div>
</el-card>
<el-card shadow="hover"
class="m-b-20">
<el-card shadow="hover" class="m-b-20">
<div class="m-b-20 flex-between">
<h6 class="p-title"
style="margin-bottom: 0">实验任务</h6>
<h6 class="p-title" style="margin-bottom: 0">实验任务</h6>
<div>
<!--<el-button :disabled="isDetail" type="primary" @click="toJudgePoint('home')">进入判分点</el-button>-->
</div>
</div>
<div class="m-b-20 flex-between">
<div class="flex-center">
<div class="m-r-20"
style="color: #f00">项目总分值100</div>
<div class="m-r-20" style="color: #f00">项目总分值100</div>
<!-- <div>权重&emsp;<div class="dib"><el-input></el-input></div></div> -->
</div>
<div>
<el-button class="m-r-20"
type="text"
@click="avgDistributionScore">平均分配分值</el-button>
<el-button class="m-r-20"
type="text"
@click="manualDistributionScore">手动分配分值</el-button>
<el-button class="m-r-20" type="text" @click="avgDistributionScore">平均分配分值</el-button>
<el-button class="m-r-20" type="text" @click="manualDistributionScore">手动分配分值</el-button>
<span>(待分配分值: {{ handDistributionScore }}/100)</span>
</div>
</div>
<el-button type="primary"
icon="el-icon-plus"
round
@click="handleQueryJudgment"
style="margin-bottom: 10px">判分点</el-button>
<el-button type="primary"
icon="el-icon-delete"
round
@click="batchDeleteProjectJudgment"
style="margin-bottom: 10px">批量删除</el-button>
<el-button type="primary" icon="el-icon-plus" round @click="handleQueryJudgment"
style="margin-bottom: 10px">判分点</el-button>
<el-button type="primary" icon="el-icon-delete" round @click="batchDeleteProjectJudgment"
style="margin-bottom: 10px">批量删除</el-button>
<div class="draggable">
<u-table ref="projectJudgementTable"
:data="projectJudgmentData"
class="table"
stripe
header-align="center"
:use-virtual="isLc"
:max-height="600"
:row-height="60"
:border="false"
@selection-change="handleSelectionProjectJudgment"
row-key="judgmentId"
v-loading="listLoading">
<u-table-column type="selection"
width="55"
align="center"></u-table-column>
<u-table-column prop="sort"
label="序号"
width="80"
align="center">
<u-table ref="projectJudgementTable" :data="projectJudgmentData" class="table" stripe header-align="center"
:use-virtual="isLc" :max-height="600" :row-height="60" :border="false"
@selection-change="handleSelectionProjectJudgment" row-key="judgmentId" v-loading="listLoading">
<u-table-column type="selection" width="55" align="center"></u-table-column>
<u-table-column prop="sort" label="序号" width="80" align="center">
<template slot-scope="scope">
{{ scope.row.sort }}
</template>
</u-table-column>
<u-table-column prop="name"
label="判分指标"
align="center"
show-overflow-tooltip
min-width="140"></u-table-column>
<u-table-column prop="name"
label="判分点名称"
align="center"
show-overflow-tooltip
min-width="140"></u-table-column>
<u-table-column label="实验要求"
align="center"
width="600">
<u-table-column prop="name" label="判分指标" align="center" show-overflow-tooltip
min-width="140"></u-table-column>
<u-table-column prop="name" label="判分点名称" align="center" show-overflow-tooltip
min-width="140"></u-table-column>
<u-table-column label="实验要求" align="center" width="600">
<template slot-scope="scope">
<quill :readonly="true"
elseRead="true"
v-model="scope.row.experimentalRequirements"
:index="2" />
<quill :readonly="true" elseRead="true" v-model="scope.row.experimentalRequirements" :index="2" />
</template>
</u-table-column>
<u-table-column prop="score"
label="分数"
align="center"
width="120">
<u-table-column prop="score" label="分数" align="center" width="120">
<template slot-scope="scope">
<el-input :key="scope.$index"
type="number"
step="0.1"
v-model.trim="scope.row.score"></el-input>
<el-input :key="scope.$index" type="number" step="0.1" v-model.trim="scope.row.score"></el-input>
<!--
@input="scoreChange(scope.row, scope.$index)" -->
</template>
</u-table-column>
<u-table-column label="操作"
width="100"
align="center">
<u-table-column label="操作" width="100" align="center">
<template slot-scope="scope">
<!--<el-button :disabled="isDetail" type="text" style="margin-right: 10px" @click="toJudgePoint('edit', scope.row)">自定义</el-button>-->
<el-button type="text"
@click="delJudgePoint(scope.$index)">删除</el-button>
<el-button type="text" @click="delJudgePoint(scope.$index)">删除</el-button>
</template>
</u-table-column>
</u-table>
</div>
</el-card>
<el-card shadow="hover"
class="m-b-20">
<el-card shadow="hover" class="m-b-20">
<div class="m-b-20 flex-between">
<h6 class="p-title"
style="margin-bottom: 0">实验提示</h6>
<h6 class="p-title" style="margin-bottom: 0">实验提示</h6>
<div>
启用
<el-switch :active-value="0"
:inactive-value="1"
v-model="projectManage.hintOpen"></el-switch>
<el-switch :active-value="0" :inactive-value="1" v-model="projectManage.hintOpen"></el-switch>
</div>
</div>
<div>
<el-form label-width="0">
<el-form-item prop="tips"
label="">
<quill :border="true"
:readonly="isDetail"
v-model="projectManage.experimentHint"
:type.sync="projectManage.experimentHintType"
radio
:minHeight="150"
:height="400"
:index="3" />
<el-form-item prop="tips" label="">
<quill :border="true" :readonly="isDetail" v-model="projectManage.experimentHint"
:type.sync="projectManage.experimentHintType" radio :minHeight="150" :height="400" :index="3" />
</el-form-item>
</el-form>
</div>
@ -240,59 +143,32 @@
</el-form>
<!--选择判分点对话框-->
<el-dialog title="添加判分点"
:visible.sync="dialogVisible"
width="40%"
:close-on-click-modal="false">
<el-dialog title="添加判分点" :visible.sync="dialogVisible" width="40%" :close-on-click-modal="false">
<div class="text-right m-b-10">
<div>
<el-input placeholder="请输入需要查找的判分点"
prefix-icon="el-icon-search"
v-model.trim="judgementpointsquery"
clearable></el-input>
<el-input placeholder="请输入需要查找的判分点" prefix-icon="el-icon-search" v-model.trim="judgementpointsquery"
clearable></el-input>
</div>
</div>
<u-table v-loading="visibleLoading"
:data="judgementData"
ref="judgementTable"
class="table"
stripe
header-align="center"
use-virtual
:row-height="45"
:max-height="400"
:border="false"
@selection-change="handleSelectionJudgment"
:row-key="rowKey">
<u-table-column type="selection"
width="55"
align="center"
:reserve-selection="true"></u-table-column>
<u-table-column prop="id"
label="序号"
align="center"
width="100">
<u-table v-loading="visibleLoading" :data="judgementData" ref="judgementTable" class="table" stripe
header-align="center" use-virtual :row-height="45" :max-height="400" :border="false"
@selection-change="handleSelectionJudgment" :row-key="rowKey">
<u-table-column type="selection" width="55" align="center" :reserve-selection="true"></u-table-column>
<u-table-column prop="id" label="序号" align="center" width="100">
<template slot-scope="scope">
{{ scope.$index + 1 }}
</template>
</u-table-column>
<u-table-column prop="name"
label="判分点名称"
align="center"></u-table-column>
<u-table-column label="操作"
align="center"
width="100">
<u-table-column prop="name" label="判分点名称" align="center"></u-table-column>
<u-table-column label="操作" align="center" width="100">
<template slot-scope="scope">
<el-button size="mini"
@click="toJudgePoint('view', scope.row)">查看</el-button>
<el-button size="mini" @click="toJudgePoint('view', scope.row)">查看</el-button>
</template>
</u-table-column>
</u-table>
<div slot="footer"
class="dialog-footer">
<div slot="footer" class="dialog-footer">
<el-button @click="dialogVisible = false"> </el-button>
<el-button type="primary"
@click="addJudgment"> </el-button>
<el-button type="primary" @click="addJudgment"> </el-button>
</div>
</el-dialog>
</div>
@ -685,25 +561,29 @@ export default {
}
},
handleQueryJudgment () { //
let { systemId } = this.projectManage;
this.dialogVisible = true;
this.$nextTick(() => {
this.$refs.judgementTable.clearSelection();
});
let params = {
systemId,
name: this.judgementpointsquery
};
if (systemId == 2 || systemId == 3) {
console.log("系统id:", systemId);
} else if (this.isLc) {
// ()
this.rowKey = "lcId";
this.getProcessClassData(params);
let { systemId } = this.projectManage
if (systemId) {
this.dialogVisible = true;
this.$nextTick(() => {
this.$refs.judgementTable.clearSelection();
});
let params = {
systemId,
name: this.judgementpointsquery
};
if (systemId == 2 || systemId == 3) {
console.log("系统id:", systemId);
} else if (this.isLc) {
// ()
this.rowKey = "lcId";
this.getProcessClassData(params);
} else {
//
this.rowKey = "bcId";
this.getProgrammingClassData(params);
}
} else {
//
this.rowKey = "bcId";
this.getProgrammingClassData(params);
util.errorMsg('请选择课程')
}
},
getProcessClassData (params) { //
@ -888,13 +768,14 @@ export default {
<style lang="scss" scoped>
/deep/ .readonly .ql-toolbar {
height: 0;
padding: 0;
border-bottom: 0;
height: 0;
padding: 0;
border-bottom: 0;
}
.main {
overflow: auto;
overflow-x: hidden;
height: calc(100vh - 152px);
overflow: auto;
overflow-x: hidden;
height: calc(100vh - 152px);
}
</style>

@ -15,7 +15,7 @@
<template v-if="showMask">
<div class="mask" style="top: 0;width:100%;height: 48px;"></div>
<div class="mask" style="top: 53px;width:100%;height: 30px;"></div>
<div class="mask" style="bottom: 0;right: 0;width:280px;height: 22px;background-color: #444;"></div>
<div class="mask" style="bottom: 0;right: 40px;width:195px;height: 22px;background-color: #444;"></div>
</template>
<template v-if="showMask1">
<div class="word-mask" style="height: 40px;"></div>
@ -978,7 +978,7 @@ $height: 700px;
.entry {
width: 100%;
height: 34px;
height: 40px;
font-size: 17px;
}

@ -5,132 +5,132 @@ import Setting from "@/setting";
import store from '@/store'
const service = axios.create({
baseURL: Setting.apiBaseURL,
timeout: 10000000
baseURL: Setting.apiBaseURL,
timeout: 10000000
});
// post请求头
service.defaults.headers.post["Content-Type"] = "application/json;charset=UTF-8";
// 请求拦截器
service.interceptors.request.use(config => {
let token = util.local.get(Setting.tokenKey);
if (token) config.headers.token = token;
return config;
let token = util.local.get(Setting.tokenKey);
if (token) config.headers.token = token;
return config;
}, err => {
util.errorMsg({
message: "退出登陆",
onClose: function() {
store.dispatch('user/logout')
}
});
return Promise.reject(err);
util.errorMsg({
message: "退出登陆",
onClose: function () {
store.dispatch('user/logout')
}
});
return Promise.reject(err);
});
let logouted = 0;
// 响应拦截器
service.interceptors.response.use(
response => {
const res = response.data;
if (res.status == 200 || res.status == 10000 || res.status == 30001) {
return Promise.resolve(res).catch(e => {});
} else if (!res.status) {
return Promise.resolve(res).catch(e => {});
} else {
util.errorMsg(res.message);
return Promise.reject(res)
// return Promise.resolve(res).catch(e => {});
}
},
// 服务器状态码不是200的情况
error => {
if (error.response.status) {
switch (error.response.status) {
// 401: 未登录
// 未登录则跳转登录页面,并携带当前页面的路径
// 在登录成功后返回当前页面,这一步需要在登录页操作。
case 401:
if (!logouted) {
util.local.remove(Setting.storeKey);
util.local.remove(Setting.tokenKey);
util.errorMsg("登录过期,请重新登录");
setTimeout(() => {
store.dispatch('user/logout')
}, 1000);
logouted = 1
}
break;
case 500:
util.errorMsg("网络错误");
break;
// 403 token过期
// 登录过期对用户进行提示
// 清除本地token和清空vuex中token对象
// 跳转登录页面
case 403:
util.local.remove(Setting.storeKey);
util.local.remove(Setting.tokenKey);
util.errorMsg("登录过期,请重新登录");
// 清除token
// store.commit('loginSuccess', null);
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
setTimeout(() => {
store.dispatch('user/logout')
}, 1000);
break;
// 404请求不存在
case 404:
util.errorMsg("网络请求不存在!");
break;
// 其他错误,直接抛出错误提示
default:
util.errorMsg(error.response.data.message);
Promise.reject(res);
}
return Promise.reject(error.response);
}
response => {
const res = response.data;
if (res.status == 200 || res.status == 10000 || res.status == 30001) {
return Promise.resolve(res).catch(e => { });
} else if (!res.status) {
return Promise.resolve(res).catch(e => { });
} else {
util.errorMsg(res.message);
return Promise.reject(res)
// return Promise.resolve(res).catch(e => {});
}
},
// 服务器状态码不是200的情况
error => {
if (error.response.status) {
switch (error.response.status) {
// 401: 未登录
// 未登录则跳转登录页面,并携带当前页面的路径
// 在登录成功后返回当前页面,这一步需要在登录页操作。
case 401:
if (!logouted) {
util.local.remove(Setting.storeKey);
util.local.remove(Setting.tokenKey);
util.errorMsg("登录过期,请重新登录");
setTimeout(() => {
store.dispatch('user/logout')
}, 1000);
logouted = 1
}
break;
case 500:
util.errorMsg("网络错误");
break;
// 403 token过期
// 登录过期对用户进行提示
// 清除本地token和清空vuex中token对象
// 跳转登录页面
case 403:
util.local.remove(Setting.storeKey);
util.local.remove(Setting.tokenKey);
util.errorMsg("登录过期,请重新登录");
// 清除token
// store.commit('loginSuccess', null);
// 跳转登录页面,并将要浏览的页面fullPath传过去,登录成功后跳转需要访问的页面
setTimeout(() => {
store.dispatch('user/logout')
}, 1000);
break;
// 404请求不存在
case 404:
util.errorMsg("网络请求不存在!");
break;
// 其他错误,直接抛出错误提示
default:
util.errorMsg(error.response.data.message);
Promise.reject(res);
}
return Promise.reject(error.response);
}
}
);
function get(url, params) {
return new Promise((resolve, reject) => {
service.get(url, { params: params }).then(res => {
resolve(res);
}).catch(err => {
reject(err);
});
function get (url, params) {
return new Promise((resolve, reject) => {
service.get(url, { params: params }).then(res => {
resolve(res);
}).catch(err => {
reject(err);
});
});
}
function post(url, params) {
return new Promise((resolve, reject) => {
service.post(url, params).then(res => {
resolve(res);
}).catch(err => {
reject(err.data);
});
function post (url, params) {
return new Promise((resolve, reject) => {
service.post(url, params).then(res => {
resolve(res);
}).catch(err => {
reject(err.data);
});
});
}
function del(url, params) {
return new Promise((resolve, reject) => {
service.delete(url, {
params
}).then(res => {
resolve(res);
}).catch(err => {
reject(err.data);
});
function del (url, params) {
return new Promise((resolve, reject) => {
service.delete(url, {
params
}).then(res => {
resolve(res);
}).catch(err => {
reject(err.data);
});
});
}
function put(url, params) {
return new Promise((resolve, reject) => {
service.put(url, params).then(res => {
resolve(res);
}).catch(err => {
reject(err.data);
});
function put (url, params) {
return new Promise((resolve, reject) => {
service.put(url, params).then(res => {
resolve(res);
}).catch(err => {
reject(err.data);
});
});
}
export { get, post, del, put };

@ -30,7 +30,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.51:9000/";
// host = "http://192.168.31.51:9000/";
host = localStorage.getItem('localIp') == 1 ? 'http://192.168.31.51:9000/' : 'http://192.168.31.217:9000/'
} else if (isSq) {
zcPath = `10.20.100.204:8883`

Loading…
Cancel
Save