备题组卷
++ 管理 + + {{ dataInfo.paperCount }}套答题卡, + +
+diff --git a/src/api/apis/apis.js b/src/api/apis/apis.js
index cf82df9..687ec23 100644
--- a/src/api/apis/apis.js
+++ b/src/api/apis/apis.js
@@ -34,6 +34,14 @@ export default {
data,
});
},
+ // 个人版首页数据
+ personalIndex(data) {
+ return service({
+ url: setUpUrls.personalIndex,
+ method: "POST",
+ data,
+ });
+ },
//班主任-查询管理的班级
cTClassList(data) {
return service({
diff --git a/src/api/axios.js b/src/api/axios.js
index 42cdd84..e1ed38c 100644
--- a/src/api/axios.js
+++ b/src/api/axios.js
@@ -63,7 +63,6 @@ service.interceptors.response.use(
return Promise.resolve(res);
},
(error) => {
- debugger
const { data, status } = error.response;
if (error.response == undefined) {
return Promise.reject(error);
diff --git a/src/api/urls/apis.js b/src/api/urls/apis.js
index 9d53bff..29eb06a 100644
--- a/src/api/urls/apis.js
+++ b/src/api/urls/apis.js
@@ -199,4 +199,8 @@ export default {
exportGradeContrast: "/api_html/tenant/exportGradeContrast",
// 同步教师账号
syncUser: "/api_html/tenant/syncUser",
+
+
+ // 个人版首页统计数据
+ personalIndex:"/api_html/personal/classList"
}
diff --git a/src/components/charts/lineChart.vue b/src/components/charts/lineChart.vue
new file mode 100644
index 0000000..fa23aef
--- /dev/null
+++ b/src/components/charts/lineChart.vue
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
diff --git a/src/components/charts/radarChart.vue b/src/components/charts/radarChart.vue
new file mode 100644
index 0000000..188169d
--- /dev/null
+++ b/src/components/charts/radarChart.vue
@@ -0,0 +1,104 @@
+
+
+
+
+
+
+
diff --git a/src/main.js b/src/main.js
index a02acdc..b36367a 100755
--- a/src/main.js
+++ b/src/main.js
@@ -11,7 +11,7 @@ import permission from "./directive/permission/button"
import NProgress from "nprogress"
import "babel-polyfill"
import '@/components/globalComponents.js'
-
+import '@/plugins/echarts.js'
import "nprogress/nprogress.css"
import "font-awesome/css/font-awesome.css"
diff --git a/src/plugins/echarts.js b/src/plugins/echarts.js
new file mode 100644
index 0000000..0b042fb
--- /dev/null
+++ b/src/plugins/echarts.js
@@ -0,0 +1,35 @@
+import Vue from 'vue'
+// 引入 echarts 核心模块,核心模块提供了 echarts 使用必须要的接口。
+import * as echarts from 'echarts/core';
+// 引入柱状图图表,图表后缀都为 Chart
+import {
+ LineChart,
+ PieChart,
+ ScatterChart,
+ RadarChart
+} from 'echarts/charts';
+// 引入提示框,标题,直角坐标系组件,组件后缀都为 Component
+import {
+ LabelLayout,
+ UniversalTransition
+} from 'echarts/features'
+import {
+ TitleComponent,
+ TooltipComponent,
+ GridComponent,
+ GraphicComponent,
+ SingleAxisComponent,
+ LegendComponent
+} from 'echarts/components';
+
+// 引入 Canvas 渲染器,注意引入 CanvasRenderer 或者 SVGRenderer 是必须的一步
+import {
+ CanvasRenderer
+} from 'echarts/renderers';
+
+// 注册必须的组件
+echarts.use(
+ [LineChart,RadarChart, ScatterChart, PieChart, SingleAxisComponent, TitleComponent, TooltipComponent, GridComponent, CanvasRenderer, GraphicComponent, UniversalTransition, LabelLayout,LegendComponent]
+);
+
+Vue.prototype.$echarts = echarts
\ No newline at end of file
diff --git a/src/router/index.js b/src/router/index.js
index 913a0fe..45872fa 100755
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -8,27 +8,46 @@ import HomeMain from "@/views/index/mainIndex"
// 不是必须加载的组件使用懒加载
const NotFound = () => import("@/views/page404")
-const ExaminationPaper = () => import("@/views/examinationPaper/index")
-const ExaminationPaperAdd = () => import("@/views/examinationPaper/add")
-const ExaminationPaperEdit = () => import("@/views/examinationPaper/edit")
-const ExaminationPaperRecycle = () => import("@/views/examinationPaper/recycle")
-const Ask = () => import("@/views/ask/index")
-const AskAnalysis = () => import("@/views/ask/analysis")
-const Test = () => import("@/views/test/index")
-const TestAnalysis = () => import("@/views/test/analysis")
-const DataSync = () => import("@/views/dataSync/index")
-const Portrait = () => import("@/views/portrait/index")
-const Card = () => import("@/views/card/index")
-const Analysis = () => import("@/views/analysis/index")
-const Device = () => import("@/views/device/index")
-const DeviceLog = () => import("@/views/device/log")
-const Down = () => import("@/views/down/index")
-const DownClient = () => import("@/views/down/client")
-const SetUpAccount = () => import("@/views/setUp/account")
-const SetUpConglomerate = () => import("@/views/setUp/conglomerate")
-const SetUpSchool = () => import("@/views/setUp/school")
-const SetUpStudent = () => import("@/views/setUp/student")
-const SetUpTeacher = () => import("@/views/setUp/teacher")
+const ExaminationPaper = () => import("@/views/standard/examinationPaper/index")
+const ExaminationPaperAdd = () => import("@/views/standard/examinationPaper/add")
+const ExaminationPaperEdit = () => import("@/views/standard/examinationPaper/edit")
+const ExaminationPaperRecycle = () => import("@/views/standard/examinationPaper/recycle")
+const Ask = () => import("@/views/standard/ask/index")
+const AskAnalysis = () => import("@/views/standard/ask/analysis")
+const Test = () => import("@/views/standard/test/index")
+const TestAnalysis = () => import("@/views/standard/test/analysis")
+const DataSync = () => import("@/views/standard/dataSync/index")
+const Card = () => import("@/views/standard/card/index")
+const Analysis = () => import("@/views/standard/analysis/index")
+const Device = () => import("@/views/standard/device/index")
+const DeviceLog = () => import("@/views/standard/device/log")
+const Down = () => import("@/views/standard/down/index")
+const DownClient = () => import("@/views/standard/down/client")
+const SetUpAccount = () => import("@/views/standard/setUp/account")
+const SetUpConglomerate = () => import("@/views/standard/setUp/conglomerate")
+const SetUpSchool = () => import("@/views/standard/setUp/school")
+const SetUpStudent = () => import("@/views/standard/setUp/student")
+const SetUpTeacher = () => import("@/views/standard/setUp/teacher")
+
+const PersonalExaminationPaper = () => import("@/views/personal/examinationPaper/index")
+const PersonalExaminationPaperAdd = () => import("@/views/personal/examinationPaper/add")
+const PersonalExaminationPaperEdit = () => import("@/views/personal/examinationPaper/edit")
+const PersonalExaminationPaperRecycle = () => import("@/views/personal/examinationPaper/recycle")
+const PersonalAsk = () => import("@/views/personal/ask/index")
+const PersonalAskAnalysis = () => import("@/views/personal/ask/analysis")
+const PersonalTest = () => import("@/views/personal/test/index")
+const PersonalTestAnalysis = () => import("@/views/personal/test/analysis")
+const PersonalDataSync = () => import("@/views/personal/dataSync/index")
+const PersonalPortrait = () => import("@/views/personal/portrait/index")
+const PersonalPortraitDetail = () => import("@/views/personal/portrait/detail")
+const PersonalSetUpStudent = () => import("@/views/personal/setUp/student")
+const PersonalDown = () => import("@/views/personal/down/index")
+const PersonalUserInfo = () => import("@/views/personal/userInfo/index")
+
+const AdminDevice = () => import("@/views/admin/device/index")
+const AdminDeviceLog = () => import("@/views/admin/device/log")
+const AdminAccount = () => import("@/views/admin/account/index")
+const AdminClientVersion = () => import("@/views/admin/clientVersion/index")
/**
* 重写路由的push方法
@@ -70,6 +89,22 @@ let defaultRouter = [
]
},
{
+ path: "/userInfo",
+ iconCls: "fa fa-user", // 图标样式class
+ name: "个人信息",
+ component: Layout,
+ hidden: true,
+ children: [
+ {
+ path: "/userInfo",
+ iconCls: "fa fa-user", // 图标样式class
+ name: "个人信息",
+ component: PersonalUserInfo,
+ children: []
+ }
+ ]
+ },
+ {
path: "/404",
component: NotFound,
name: "404",
@@ -176,23 +211,6 @@ let addrouters = [ //测试用,后续后端获取
]
},
- // {
- // path: "/portrait",
- // iconCls: "fa fa-users", // 图标样式class
- // name: "学生画像",
- // component: Layout,
- // alone: true,
- // children: [
- // {
- // path: "/portrait",
- // iconCls: "fa fa-users", // 图标样式class
- // name: "",
- // component: Portrait,
- // children: []
- // }
- // ]
- // },
-
{
path: "/setUpConglomerate",
iconCls: "fa fa-building", // 图标样式class
@@ -355,7 +373,247 @@ let addrouters = [ //测试用,后续后端获取
},
]
+const addroutersPersonal = [
+ {
+ path: "/examinationPaper",
+ iconCls: "fa fa-file-text", // 图标样式class
+ name: "备题组卷",
+ component: Layout,
+ alone: true,
+ children: [
+ {
+ path: "/examinationPaper",
+ iconCls: "fa fa-file-text", // 图标样式class
+ name: "examinationPaper",
+ component: PersonalExaminationPaper,
+ children: []
+ },
+ {
+ path: "/examinationPaperAdd",
+ iconCls: "", // 图标样式class
+ name: "examinationPaperAdd",
+ component: PersonalExaminationPaperAdd,
+ parent: "examinationPaper",
+ children: []
+ },
+ {
+ path: "/examinationPaperEdit",
+ iconCls: "", // 图标样式class
+ name: "修改答题卡",
+ component: PersonalExaminationPaperEdit,
+ parent: "examinationPaper",
+ children: []
+ },
+ {
+ path: "/examinationPaperRecycle",
+ iconCls: "", // 图标样式class
+ name: "已归档答题卡",
+ component: PersonalExaminationPaperRecycle,
+ parent: "examinationPaper",
+ children: []
+ },
+ ]
+ },
+ {
+ path: "/ask",
+ iconCls: "fa fa-bar-chart", // 图标样式class
+ name: "随堂问报表",
+ component: Layout,
+ alone: true,
+ children: [
+ {
+ path: "/ask",
+ iconCls: "fa fa-bar-chart", // 图标样式class
+ name: "ask",
+ name: "随堂问报表",
+ component: PersonalAsk,
+ meta: {
+ keepAlive: true,
+ },
+ children: []
+
+ },
+ {
+ path: "/askAnalysis",
+ iconCls: "", // 图标样式class
+ name: "随堂问报表分析",
+ component: PersonalAskAnalysis,
+ parent: "ask",
+ children: []
+ }
+ ]
+ },
+ {
+ path: "/test",
+ iconCls: "fa fa-pie-chart", // 图标样式class
+ name: "即时测报表",
+ component: Layout,
+ alone: true,
+ children: [
+ {
+ path: "/test",
+ iconCls: "fa fa-pie-chart", // 图标样式class
+ name: "",
+ component: PersonalTest,
+ meta: {
+ keepAlive: true,
+ },
+ children: []
+ },
+ {
+ path: "/testAnalysis",
+ iconCls: "", // 图标样式class
+ name: "即时测报表分析",
+ component: PersonalTestAnalysis,
+ parent: "test",
+ children: []
+ }
+
+ ]
+ },
+ {
+ path: "/portrait",
+ iconCls: "fa fa-users", // 图标样式class
+ name: "学生画像",
+ component: Layout,
+ alone: true,
+ children: [
+ {
+ path: "/portrait",
+ iconCls: "fa fa-users", // 图标样式class
+ name: "",
+ component: PersonalPortrait,
+ meta: {
+ keepAlive: true,
+ },
+ children: []
+ },
+ {
+ path: "/portraitDetail",
+ iconCls: "", // 图标样式class
+ name: "授课端软件",
+ component: PersonalPortraitDetail,
+ parent: "down",
+ children: []
+ }
+ ]
+ },
+ {
+ path: "/setUpStudent",
+ iconCls: "fa fa-mortar-board",
+ name: '班级名单',
+ component: Layout,
+ alone: true,
+ children: [
+ {
+ path: "/setUpStudent",
+ iconCls: "a fa-mortar-board",
+ name: '',
+ component: PersonalSetUpStudent,
+ children: []
+ },
+ ]
+ },
+ {
+ path: "/down",
+ iconCls: "fa fa-download", // 图标样式class
+ name: "软件下载",
+ component: Layout,
+ alone: true,
+ children: [
+ {
+ path: "/down",
+ iconCls: "fa fa-download", // 图标样式class
+ name: "发卡软件",
+ component: PersonalDown,
+ children: []
+ }
+ ]
+ },
+ {
+ path: "/dataSync",
+ iconCls: "fa fa-random", // 图标样式class
+ name: "数据同步",
+ component: Layout,
+ alone: true,
+ children: [
+ {
+ path: "/dataSync",
+ iconCls: "fa fa-random", // 图标样式class
+ name: "",
+ component: PersonalDataSync,
+ children: []
+ }
+ ]
+ },
+
+
+
+]
+
+const addRoutersAdmin = [
+ {
+ path: "/account",
+ iconCls: "fa fa-id-card-o", // 图标样式class
+ name: "账号管理",
+ component: Layout,
+ alone: true,
+ children: [
+ {
+ path: "/account",
+ iconCls: "fa fa-id-card-o",
+ name: '',
+ component: AdminAccount,
+ children: []
+ },
+ ]
+ },
+ {
+ path: "/device",
+ iconCls: "fa fa-dashboard", // 图标样式class
+ name: "设备状态",
+ component: Layout,
+ alone: true,
+ children: [
+ {
+ path: "/device",
+ iconCls: "fa fa-dashboard", // 图标样式class
+ name: "",
+ component: AdminDevice,
+ meta: {
+ keepAlive: true,
+ },
+ children: []
+ },
+ {
+ path: "/deviceLog",
+ iconCls: "fa fa-list-alt", // 图标样式class
+ name: "",
+ component: AdminDeviceLog,
+ parent: "device",
+ children: []
+ }
+ ]
+ },
+ {
+ path: "/clientVersion",
+ iconCls: "fa fa-cogs", // 图标样式class
+ name: "版本管理",
+ component: Layout,
+ alone: true,
+ children: [
+ {
+ path: "/clientVersion",
+ iconCls: "fa fa-id-card-o",
+ name: '',
+ component: AdminClientVersion,
+ children: []
+ },
+ ]
+ },
+]
+
export default new Router({
routes: defaultRouter
})
-export { defaultRouter, addrouters }
+export { defaultRouter, addrouters,addroutersPersonal,addRoutersAdmin }
diff --git a/src/router/permission.js b/src/router/permission.js
index a3d6618..9e09e79 100644
--- a/src/router/permission.js
+++ b/src/router/permission.js
@@ -18,7 +18,25 @@ router.beforeEach((to, from, next) => {
return item.roleName == userInfo.showRoleName;
});
console.log([...authorityRouterObj[0]?.authorityRouter])
- store.commit("setRouters", [...authorityRouterObj[0]?.authorityRouter]);
+ // store.commit("setRouters", [...authorityRouterObj[0]?.authorityRouter]);
+
+ //start 开发用,测试删除
+ store.commit("setRouters", [
+ "setUpStudent",
+ "examinationPaper",
+ "examinationPaperAdd",
+ "examinationPaperEdit",
+ "examinationPaperRecycle",
+ "ask",
+ "askAnalysis",
+ "test",
+ "testAnalysis",
+ "portrait",
+ "dataSync",
+ "down",
+ ]);
+ //end
+
store.commit("setInfo", { ...userInfo });
store.getters.addRouters.forEach((res) => {
router.addRoute(res);
diff --git a/src/store/index.js b/src/store/index.js
index 5e47e01..585695a 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -8,7 +8,7 @@ import { Message } from "element-ui";
import request from "@/api/index";
import router from "@/router/index";
-import { addrouters } from "@/router/index";
+import { addrouters,addRoutersAdmin ,addroutersPersonal} from "@/router/index";
Vue.use(Vuex);
const store = new Vuex.Store({
@@ -39,7 +39,15 @@ const store = new Vuex.Store({
localStorage.setItem("info", JSON.stringify(data));
},
setRouters: (state, routers) => {
- let aRouters = addrouters.filter((item) => {
+ let addrouterList = []
+ if(state.info.showRole == 'ROLE_PINGTAI'){
+ addrouterList = [...addroutersPersonal]
+ }else if(state.info.showRole == 'ROLE_ADMIN'){
+ addrouterList = [...addRoutersAdmin]
+ }else{
+ addrouterList = [...addrouters]
+ }
+ let aRouters = addrouterList.filter((item) => {
let path = item.children[0]?.path.replace("/", "");
return routers?.includes(path);
});
@@ -72,11 +80,35 @@ const store = new Vuex.Store({
const userInfo = { ...response.data };
if (userInfo.permissions && userInfo.permissions.length) {
userInfo.showRoleName = response.data.permissions[0]?.roleName;
+ // userInfo.showRole = response.data.permissions[0]?.role;
+ // 开发用,测试删除
+ userInfo.showRole = "ROLE_PINGTAI";
commit("setToken", "isLogin");
commit("setInfo", { ...userInfo });
- commit("setRouters", [
- ...userInfo.permissions[0]?.authorityRouter,
+ // commit("setRouters", [
+ // ...userInfo.permissions[0]?.authorityRouter,
+ // ]);
+ //start 开发用,测试删除
+ commit("setRouters", [
+ "setUpStudent",
+ "examinationPaper",
+ "examinationPaperAdd",
+ "examinationPaperEdit",
+ "examinationPaperRecycle",
+ "ask",
+ "askAnalysis",
+ "test",
+ "testAnalysis",
+ "portrait",
+ "dataSync",
+ "down",
+
+ "account",
+ "device",
+ "clientVersion"
]);
+ //end
+
state.addRouters.forEach((res) => {
router.addRoute(res);
});
@@ -117,6 +149,7 @@ const store = new Vuex.Store({
const userInfo = { ...response.data };
if (userInfo.permissions && userInfo.permissions.length) {
userInfo.showRoleName = response.data.permissions[0]?.roleName;
+ userInfo.showRole = response.data.permissions[0]?.role;
commit("setToken", "isLogin");
commit("setCode", code);
commit("setInfo", { ...userInfo });
@@ -158,6 +191,7 @@ const store = new Vuex.Store({
return item.role == role;
});
userInfo.showRoleName = authorityRouterObj[0]?.roleName;
+ userInfo.showRole = authorityRouterObj[0]?.role;
commit("setInfo", userInfo);
commit("setRouters", [...authorityRouterObj[0]?.authorityRouter]);
state.addRouters.forEach((res) => {
diff --git a/src/utils/global.js b/src/utils/global.js
index d9d4423..e889291 100644
--- a/src/utils/global.js
+++ b/src/utils/global.js
@@ -1,10 +1,8 @@
import rules from "./rules"
import request from "@/api"
-import * as echarts from "echarts"
export default {
install (Vue, options) {
- Vue.prototype.$echarts = echarts
Vue.prototype.$request = request
Vue.prototype.$rules = rules
}
diff --git a/src/utils/index.js b/src/utils/index.js
index aef5fe3..166760c 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -744,3 +744,44 @@ export function formatGradeNameClass(data) {
});
return gradeNameArr;
}
+
+export function tablePrint(id) {
+ let divs = document.getElementById(id);
+ let awin = window.open("", "_blank");
+ awin.document.getElementsByTagName(
+ "head"
+ )[0].innerHTML = ``;
+ let aDom = divs.cloneNode(true);
+ let aTbody = aDom
+ .getElementsByClassName("el-table__body")[0]
+ .getElementsByTagName("tbody")[0];
+ aDom.getElementsByClassName("el-table__header")[0].append(aTbody);
+ awin.document.body.append(aDom);
+ awin.print();
+ awin.close()
+}
\ No newline at end of file
diff --git a/src/views/admin/account/index.vue b/src/views/admin/account/index.vue
new file mode 100644
index 0000000..bba74da
--- /dev/null
+++ b/src/views/admin/account/index.vue
@@ -0,0 +1,22 @@
+
+ {{ count }} 基站数量
+ {{ item.className }}
+ {{ count }} 答题器数量
+ {{ item.studentName }}
+
+ {{ item.className }}
+
{{ `${this.$store.getters.info.name}` }}
+个人版
+
+
+ 今天 + 本周 + 本月 + 本季度 +
+
+
中天易教授课端 V1.3.4
+文件大小:35M
+最近更新:2022-12-03 13:30
+
+
+
+
--
+
+
{{ form.title }}
+卷面总分:{{ allScore }}分
++ {{ setBigNum(index) }}、 + {{ question.questionTitle }} + 共:{{ setNums(question.subQuestions) }}题 + 共:{{ setScore(question) }} 分 +
+
+
--
++ + {{ + `${paperModifyLog.modifiedTime} ${paperModifyLog.realName}` + }}老师修改了答案 +
+{{ form.title || title }}
+卷面总分:{{ allScore }}分
+
+ {{ setBigNum(index) }}、
+
+
--
+
+
--
+
+ 另有{{ archivedTotal }}份已经归档的答题卡,
+
+
{{ item.id }}
++ {{ item.title }} + {{ item.tag }} +
++ 总题数:{{ item.questionNum }} + | + 预计时长:{{ item.examsDuration }} + | +
++ {{ item.realName }}|{{ item.modifiedTime }} +
++ 今天 + 本周 + 本月 + 本季度 +
+张三 (学号:1301) 测练总次数:16
++ 今天 + 本周 + 本月 + 本季度 +
+{{ item.studentCode }}
++ {{ item.studentName }} + {{ item.clickerSn }} +
+{{ item.sectionName + item.className }}
+最近活跃:{{ item.time }}
+班级列表
++ {{ formStu.className }}所有学生({{ studentList.length }}) + +
+{{ item.studentName }}
+答题器:{{ item.clickerSn || "--" }}
+长学号:{{ item.studentCode }}
+短学号:{{ item.shortNumber || "--" }}
+
+ 通过Excel名单导入学生模板,点击
+
+ + {{ + `${paperModifyLog.modifiedTime} ${paperModifyLog.realName}` + }}修改了答案,是否重新记分? +
++ {{ + scope.row.questionType == "5" + ? "" + : scope.row["option" + index] + ? `${scope.row["option" + index]}(${ + scope.row["persent" + index] + })` + : "" + }} +
+
+ 第一步:下载模板并编辑完成学生分数
+
第二步:上传完成编辑的模板文件并导入。
+ ++ 今天 + 本周 + 本月 + 本季度 +
++ "-" +
+ +{{ scoped.row.excellenNum }}
++ {{ `(${scoped.row.excellenRate}%)` }} +
+ ++ "-" +
+ +{{ scoped.row.goodNum }}
++ {{ `(${scoped.row.goodRate}%)` }} +
+ ++ "-" +
+ +{{ scoped.row.passNum }}
++ {{ `(${scoped.row.passRate}%)` }} +
+ ++ "-" +
+ +{{ scoped.row.failedNum }}
++ {{ `(${scoped.row.failedRate}%)` }} +
+ +
+
+ 第一步:下载模板并编辑完成学生分数
+
第二步:上传完成编辑的模板文件并导入。
+ +从U盘上传
++ 本功能帮助无法上网的授课端软件,将本地数据同步到云平台。 +
+数据导出至U盘
+本功能将云平台的数据导出到U盘。
++ 今天 + 本周 + 本月 + 本季度 +
+{{ scoped.row.content }}
+ 2022-11-24 14:30张老师修改了答案。 +
+{{ form.title }}
+卷面总分:{{ allScore }}分
++ {{ setBigNum(index) }}、 + {{ question.questionTitle }} + 共 {{ question.score }} 分 +
++
{{ item.id }}
++ {{ item.title }} {{ item.tag }} +
++ {{ item.gradeName }} + | + 总题数:{{ item.questionNum }} + | + 预计时长:{{ item.examsDuration }} +
++ {{ item.realName }}|{{ item.modifiedTime }} +
+
基站
-
+
{{ item.stationCount }}
键盘
-
+
{{ item.keyboardCount }}
班级
-
+
{{ item.classCount }}
学生
-
+
{{ item.studentCount }}
老师
-
+
{{ item.teacherCount }}