You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dianshang-qianduan/src/views/teacherEnd/index.vue

324 lines
8.9 KiB
Vue

<template>
<div class="teachers">
<div class="flex">
<el-card shadow="never">
<template #header>
<div class="card-header">班级平均成绩走势图</div>
</template>
<div class="el-card-body">
<div id="trend"></div>
<div class="trend-title">班级成绩统计分析</div>
</div>
</el-card>
<el-card shadow="never">
<template #header>
<div class="card-header">班级成绩统计分析</div>
</template>
<div class="el-card-body">
<div class="serch">
<el-form :inline="true">
<el-form-item label="日期:">
<el-date-picker v-model="classParams.time" style="width: 185.6px" type="datetime" placeholder="请选择" format="YYYY/MM/DD HH:mm:ss" />
</el-form-item>
<el-form-item label="班级:">
<el-select placeholder="全部" v-model="classParams.classId" style="width: 185.6px">
<el-option v-for="item in userStore.classList" :key="item" :label="item.class_name" :value="item.class_id" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="warning" @click="getClassGradeStatistics">查看成绩</el-button>
</el-form-item>
</el-form>
</div>
<div id="statistics"></div>
<div class="maxpoints">
<div class="maxpoints-item" v-for="item in circularData2" :key="item.name">
<!-- <img style="width: 55px; height: 55px" :src="getAssetsFile(`images/${item.name}.png`)" alt="" /> -->
<div class="ri">
<span style="color: #333333; font-weight: bold; font-size: 16px; letter-spacing: 4px">{{ item.name }}:</span>
<span style="font-family: Source Han Sans CN; font-weight: bold; font-size: 20px; color: #ff6400">{{ item.value ?? 0 }}</span>
</div>
</div>
</div>
</div>
</el-card>
</div>
</div>
</template>
<script setup>
import * as echarts from "echarts";
import * as teacherApi from "@/api/teacher.js";
const { proxy } = getCurrentInstance();
import { getAssetsFile } from "@/utils/index.js";
import useUserStore from "@/store/modules/user";
const userStore = useUserStore();
const classTime = ref([]);
const className = ref([]);
const classList = ref([]);
const classParams = ref({
classId: "",
time: "",
});
const initstatus = ref(false);
const circularData = ref([
{ value: 0, name: "一般", key: "generalCount" },
{ value: 0, name: "优秀", key: "excellentCount" },
{ value: 0, name: "良好", key: "goodCount" },
{ value: 0, name: "不及格", key: "failCount" },
]);
const circularData2 = ref([
{ score: 0, name: "最高分", key: "maxScore" },
{ score: 0, name: "最低分", key: "minScore" },
{ score: 0, name: "平均分", key: "averageScore" },
]);
// 获取成绩走势图数据
const getTrendData = async () => {
var myinde = echarts.init(document.getElementById("trend"));
myinde.setOption({
tooltip: {
trigger: "axis",
},
legend: {
data: className.value,
},
grid: {
left: "4%",
right: "4%",
bottom: "1%",
containLabel: true,
},
xAxis: {
type: "category",
boundaryGap: false,
data: classTime.value,
},
yAxis: {
type: "value",
//显示0~100
min: 0,
max: 100,
},
series: classList.value,
});
// 自适应
window.addEventListener("resize", () => {
myinde.resize();
});
};
// 成绩统计分析
const getStatisticsData = async () => {
var myChart = echarts.init(document.getElementById("statistics"));
myChart.setOption({
tooltip: {
trigger: "item",
formatter: "{a} <br/>{b} : {c} ({d}%)",
},
legend: {
orient: "vertical",
left: "right",
top: "center",
data: ["一般", "优秀", "良好", "不及格"],
},
series: [
{
type: "pie",
radius: "70%",
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: "rgba(0, 0, 0, 0.5)",
},
},
data: circularData.value,
// 修改颜色
color: ["#f7b844", "#51bcb5", "#5d92f7", "#ca5038"],
},
],
});
// 自适应
window.addEventListener("resize", () => {
myChart.resize();
});
};
// 获取班级成绩走势函数功能函数
const getClassGradeTrend = () => {
teacherApi.getAverageScoreTrend().then((res) => {
const trends = Array.isArray(res) ? res : [];
classTime.value = trends[0]?.startTime || [];
className.value = trends.map((item) => item.className);
classList.value = trends.map((item) => {
return {
name: item.className,
type: "line",
stack: "Total",
data: item.classAverageScore,
};
});
getTrendData();
});
};
// 获取班级成绩统计分析函数功能函数
const getClassGradeStatistics = () => {
if (!classParams.value.time) {
classParams.value.time = new Date().toString();
} else {
classParams.value.time = classParams.value.time.toString();
}
if (initstatus.value && !classParams.value.classId) {
proxy.$modal.msgWarning("请选择班级");
}
teacherApi.getScoreStatisticsTrend(classParams.value).then((res) => {
circularData.value.forEach((item, index) => {
item.value = res[item.key];
if (res.hasOwnProperty(item.key)) {
item.value = res[item.key];
}
});
circularData2.value.forEach((item, index) => {
item.value = res[item.key];
if (res.hasOwnProperty(item.key)) {
item.value = res[item.key];
}
});
getStatisticsData();
});
};
// 获取班级
const getClassList = () => {
teacherApi.getOwnedTeachingClasses().then((res) => {
userStore.classList = (res.data || []).map((item) => ({
class_name: item.className,
class_id: item.schoolClassId,
}));
});
};
onMounted(() => {
getClassGradeTrend();
getClassGradeStatistics()
getClassList()
initstatus.value = true;
});
</script>
<style lang='scss' scoped>
.teachers {
.flex {
display: flex;
flex-wrap: wrap;
// gap: 15px;
:deep(.el-card) {
padding: 0px 15px;
height: calc(100vh - 80px);
border: none;
#trend {
height: 500px;
}
#statistics {
height: 360px;
}
.maxpoints {
display: flex;
justify-content: center;
gap: 60px;
margin-top: 70px;
.maxpoints-item {
display: flex;
align-items: center;
justify-content: center;
gap: 0;
width: 181px;
height: 50px;
background: #fff8e5;
border-radius: 10px;
border: 1px solid #ffb900;
.ri {
display: flex;
align-items: center;
gap: 15px;
}
}
}
.trend-title {
margin-top: 28px;
text-align: center;
font-family: Source Han Sans CN;
font-weight: bold;
font-size: 16px;
color: #999999;
}
.serch {
}
.el-card__header {
padding: 13px 15px 13px 21px !important;
border-bottom: 2px dashed #e5e5e5;
}
.card-header {
font-family: Source Han Sans CN;
font-weight: bold;
font-size: 20px;
color: #333333;
position: relative;
margin-left: 17px;
letter-spacing: 4px; /* 设置文字间隔为2像素 */
&::before {
content: "";
position: absolute;
left: -40px;
top: 25%;
display: inline-block;
width: 16px;
height: 16px;
background: url(@/assets/images/分析.png) no-repeat;
background-size: 100% 100%;
// border-radius: 4px;
// margin-right: 20px;
}
}
}
.el-card:nth-child(1) {
width: calc(100% - 47% - 15px);
border-right: 2px dashed #e5e5e5;
}
.el-card:nth-child(2) {
width: calc(100% - 53%);
.card-header {
font-family: Source Han Sans CN;
font-weight: bold;
font-size: 20px;
color: #333333;
margin-left: 17px;
position: relative;
&::before {
content: "";
position: absolute;
left: -40px;
top: 25%;
display: inline-block;
width: 16px;
height: 16px;
// background: url(@/assets/images/统计.png) no-repeat;
// background-size: 100% 100%;
}
}
}
}
}
.btnOne {
// background: url("@/assets/images/tea查看.png") no-repeat;
// background-size: 100% 100%;
border: none;
min-width: 118px;
padding-left: 30px;
height: 40px;
}
:deep(.el-form) {
.el-form-item:nth-child(2) {
margin-right: 15px !important;
}
.el-form-item:nth-child(3) {
margin-right: 0px !important;
}
}
</style>