Commit f20c48c9a8e9fec3a80fe21ff036fa894424f267
1 parent
87053bc8
集团管理员添加发卡记录,并添加报表导出
Showing
7 changed files
with
210 additions
and
101 deletions
src/api/apis/apis.js
| ... | ... | @@ -490,6 +490,7 @@ export default { |
| 490 | 490 | url: setUpUrls.teacherTemplate, |
| 491 | 491 | method: "POST", |
| 492 | 492 | data, |
| 493 | + responseType: 'arraybuffer', | |
| 493 | 494 | }); |
| 494 | 495 | }, |
| 495 | 496 | // 教师导出 |
| ... | ... | @@ -694,6 +695,15 @@ export default { |
| 694 | 695 | data, |
| 695 | 696 | }); |
| 696 | 697 | }, |
| 698 | + // 发卡数据导出 | |
| 699 | + exportClickersLog(data) { | |
| 700 | + return service({ | |
| 701 | + url: setUpUrls.exportClickersLog, | |
| 702 | + method: "POST", | |
| 703 | + data, | |
| 704 | + responseType: 'arraybuffer', | |
| 705 | + }); | |
| 706 | + }, | |
| 697 | 707 | |
| 698 | 708 | /** |
| 699 | 709 | * 集团管理员-学校管理 | ... | ... |
src/api/urls/apis.js
| ... | ... | @@ -172,6 +172,8 @@ export default { |
| 172 | 172 | exportUsageAnalysis: "/api_html/school/manager/exportUsageAnalysis", |
| 173 | 173 | // 发卡应用下载 |
| 174 | 174 | latestClickersApp: "/api_html/school/manager/latestClickersApp", |
| 175 | + // 发卡导出 | |
| 176 | + exportClickersLog: "/api_html/school/manager/exportClickersLog", | |
| 175 | 177 | |
| 176 | 178 | |
| 177 | 179 | // 查询区域列表 | ... | ... |
src/assets/nav/setUpConglomerate.png
src/views/index/mainIndex.vue
| ... | ... | @@ -117,6 +117,10 @@ |
| 117 | 117 | <p class="p1">使用分析</p> |
| 118 | 118 | <p class="p2">按学校、学段统计使用频率。</p> |
| 119 | 119 | </div> |
| 120 | + <div class="text" v-else-if="item.path == '/card'"> | |
| 121 | + <p class="p1">发卡记录</p> | |
| 122 | + <p class="p2">查看发卡、换卡记录信息。</p> | |
| 123 | + </div> | |
| 120 | 124 | </li> |
| 121 | 125 | </template> |
| 122 | 126 | </ul> |
| ... | ... | @@ -157,78 +161,77 @@ |
| 157 | 161 | </li> |
| 158 | 162 | </template> |
| 159 | 163 | </ul> |
| 160 | - <ul class="nav-list" v-if="type == 'ROLE_PERSONAL'"> | |
| 161 | - <li class="nav-item item1" @click="links('/examinationPaper')"> | |
| 162 | - <img class="icon" src="../../assets/nav/setUpAccount.png" alt="" /> | |
| 163 | - <div class="text"> | |
| 164 | - <p class="p1">备题组卷</p> | |
| 165 | - <p class="p2" v-if="dataInfo.paperCount"> | |
| 166 | - 管理 {{ dataInfo.paperCount }}套答题卡, | |
| 167 | - </p> | |
| 168 | - </div> | |
| 169 | - </li> | |
| 170 | - <li class="nav-item item1" @click="links('/setUpStudent')"> | |
| 171 | - <img class="icon" src="../../assets/nav/setUpSchool.png" alt="" /> | |
| 172 | - <div class="text"> | |
| 173 | - <p class="p1">班级名单</p> | |
| 174 | - <p class="p2" v-if="dataInfo.classCount"> | |
| 175 | - 管理{{ dataInfo.classCount }}个班级的学生名单, | |
| 176 | - </p> | |
| 177 | - </div> | |
| 178 | - </li> | |
| 179 | - <li class="nav-item item2" @click="links('/portrait')"> | |
| 180 | - <img class="icon" src="../../assets/nav/device.png" alt="" /> | |
| 164 | + <ul class="nav-list" v-if="type == 'ROLE_PERSONAL'"> | |
| 165 | + <li class="nav-item item1" @click="links('/examinationPaper')"> | |
| 166 | + <img class="icon" src="../../assets/nav/setUpAccount.png" alt="" /> | |
| 167 | + <div class="text"> | |
| 168 | + <p class="p1">备题组卷</p> | |
| 169 | + <p class="p2" v-if="dataInfo.paperCount"> | |
| 170 | + 管理 {{ dataInfo.paperCount }}套答题卡, | |
| 171 | + </p> | |
| 172 | + </div> | |
| 173 | + </li> | |
| 174 | + <li class="nav-item item1" @click="links('/setUpStudent')"> | |
| 175 | + <img class="icon" src="../../assets/nav/setUpSchool.png" alt="" /> | |
| 176 | + <div class="text"> | |
| 177 | + <p class="p1">班级名单</p> | |
| 178 | + <p class="p2" v-if="dataInfo.classCount"> | |
| 179 | + 管理{{ dataInfo.classCount }}个班级的学生名单, | |
| 180 | + </p> | |
| 181 | + </div> | |
| 182 | + </li> | |
| 183 | + <li class="nav-item item2" @click="links('/portrait')"> | |
| 184 | + <img class="icon" src="../../assets/nav/device.png" alt="" /> | |
| 185 | + <div class="text"> | |
| 186 | + <p class="p1">学生画像</p> | |
| 187 | + <p class="p2" v-if="dataInfo.stationCount"> | |
| 188 | + 共分析{{ dataInfo.stationCount }}名学生成绩 | |
| 189 | + </p> | |
| 190 | + </div> | |
| 191 | + </li> | |
| 192 | + <li class="item3"> | |
| 193 | + <div class="nav-item item1 item-child2" @click="links('/ask')"> | |
| 194 | + <img class="icon" src="../../assets/nav/card.png" alt="" /> | |
| 195 | + <p class="p1">随堂问报表</p> | |
| 196 | + <p class="p2" v-if="dataInfo.classPeriodCount"> | |
| 197 | + 对{{ dataInfo.classPeriodCount }}套随堂问答题记录分析 | |
| 198 | + </p> | |
| 199 | + </div> | |
| 200 | + <div class="nav-item item1 item-child3" @click="links('/test')"> | |
| 201 | + <img class="icon" src="../../assets/nav/analysis.png" alt="" /> | |
| 202 | + <p class="p1">即时测报表</p> | |
| 203 | + <p class="p2" v-if="dataInfo.examCount"> | |
| 204 | + 对{{ dataInfo.examCount }}套即时测答题记录分析 | |
| 205 | + </p> | |
| 206 | + </div> | |
| 207 | + <div class="nav-item item1 item-child1" @click="links('/down')"> | |
| 208 | + <img class="icon" src="../../assets/nav/down.png" alt="" /> | |
| 181 | 209 | <div class="text"> |
| 182 | - <p class="p1">学生画像</p> | |
| 183 | - <p class="p2" v-if="dataInfo.stationCount"> | |
| 184 | - 共分析{{ dataInfo.stationCount }}名学生成绩 | |
| 185 | - </p> | |
| 186 | - </div> | |
| 187 | - </li> | |
| 188 | - <li class="item3"> | |
| 189 | - <div class="nav-item item1 item-child2" @click="links('/ask')"> | |
| 190 | - <img class="icon" src="../../assets/nav/card.png" alt="" /> | |
| 191 | - <p class="p1">随堂问报表</p> | |
| 192 | - <p class="p2" v-if="dataInfo.classPeriodCount"> | |
| 193 | - 对{{ dataInfo.classPeriodCount }}套随堂问答题记录分析 | |
| 194 | - </p> | |
| 195 | - </div> | |
| 196 | - <div class="nav-item item1 item-child3" @click="links('/test')"> | |
| 197 | - <img class="icon" src="../../assets/nav/analysis.png" alt="" /> | |
| 198 | - <p class="p1">即时测报表</p> | |
| 199 | - <p class="p2" v-if="dataInfo.examCount"> | |
| 200 | - 对{{ dataInfo.examCount }}套即时测答题记录分析 | |
| 201 | - </p> | |
| 210 | + <p class="p1">软件下载</p> | |
| 211 | + <p class="p2">授课端软件最新版本1.2.0。</p> | |
| 202 | 212 | </div> |
| 203 | - <div class="nav-item item1 item-child1" @click="links('/down')"> | |
| 204 | - <img class="icon" src="../../assets/nav/down.png" alt="" /> | |
| 205 | - <div class="text"> | |
| 206 | - <p class="p1">软件下载</p> | |
| 207 | - <p class="p2">授课端软件最新版本1.2.0。</p> | |
| 208 | - </div> | |
| 209 | - </div> | |
| 210 | - </li> | |
| 211 | - | |
| 213 | + </div> | |
| 214 | + </li> | |
| 212 | 215 | </ul> |
| 213 | 216 | <ul class="nav-list" v-if="type == 'ROLE_PINGTAI'"> |
| 214 | - <li class="nav-item item1" @click="links('/account')"> | |
| 215 | - <img class="icon" src="../../assets/nav/setUpAccount.png" alt="" /> | |
| 216 | - <div class="text"> | |
| 217 | - <p class="p1">账号管理</p> | |
| 218 | - </div> | |
| 219 | - </li> | |
| 220 | - <li class="nav-item item1" @click="links('/device')"> | |
| 221 | - <img class="icon" src="../../assets/nav/device.png" alt="" /> | |
| 222 | - <div class="text"> | |
| 223 | - <p class="p1">设备管理</p> | |
| 224 | - </div> | |
| 225 | - </li> | |
| 226 | - <li class="nav-item item2" @click="links('/clientVersion')"> | |
| 227 | - <img class="icon" src="../../assets/nav/down.png" alt="" /> | |
| 228 | - <div class="text"> | |
| 229 | - <p class="p1">授课端版本管理</p> | |
| 230 | - </div> | |
| 231 | - </li> | |
| 217 | + <li class="nav-item item1" @click="links('/account')"> | |
| 218 | + <img class="icon" src="../../assets/nav/setUpAccount.png" alt="" /> | |
| 219 | + <div class="text"> | |
| 220 | + <p class="p1">账号管理</p> | |
| 221 | + </div> | |
| 222 | + </li> | |
| 223 | + <li class="nav-item item1" @click="links('/device')"> | |
| 224 | + <img class="icon" src="../../assets/nav/device.png" alt="" /> | |
| 225 | + <div class="text"> | |
| 226 | + <p class="p1">设备管理</p> | |
| 227 | + </div> | |
| 228 | + </li> | |
| 229 | + <li class="nav-item item2" @click="links('/clientVersion')"> | |
| 230 | + <img class="icon" src="../../assets/nav/down.png" alt="" /> | |
| 231 | + <div class="text"> | |
| 232 | + <p class="p1">授课端版本管理</p> | |
| 233 | + </div> | |
| 234 | + </li> | |
| 232 | 235 | </ul> |
| 233 | 236 | </div> |
| 234 | 237 | </template> |
| ... | ... | @@ -241,12 +244,12 @@ export default { |
| 241 | 244 | type: "", |
| 242 | 245 | navList: [], |
| 243 | 246 | dataInfo: {}, |
| 244 | - code:"" | |
| 247 | + code: "", | |
| 245 | 248 | }; |
| 246 | 249 | }, |
| 247 | 250 | watch: { |
| 248 | 251 | "$store.getters.info.showRoleName": function (val) { |
| 249 | - this._Init(val) | |
| 252 | + this._Init(val); | |
| 250 | 253 | this._QueryData(); |
| 251 | 254 | }, |
| 252 | 255 | }, |
| ... | ... | @@ -265,7 +268,9 @@ export default { |
| 265 | 268 | }); |
| 266 | 269 | }, |
| 267 | 270 | _Init(val) { |
| 268 | - this.type = this.$store.getters.info.showRole || this.$store.getters.info.permissions[0].role; | |
| 271 | + this.type = | |
| 272 | + this.$store.getters.info.showRole || | |
| 273 | + this.$store.getters.info.permissions[0].role; | |
| 269 | 274 | this.navList = this.$store.getters.addRouters.map((item) => { |
| 270 | 275 | return { |
| 271 | 276 | name: item.name, |
| ... | ... | @@ -318,7 +323,7 @@ export default { |
| 318 | 323 | this.$message.error(info); |
| 319 | 324 | } |
| 320 | 325 | }, |
| 321 | - async personalIndex() { | |
| 326 | + async personalIndex() { | |
| 322 | 327 | const { data, status, info } = await this.$request.personalIndex(); |
| 323 | 328 | if (status === 0) { |
| 324 | 329 | this.dataInfo = { ...data }; |
| ... | ... | @@ -404,7 +409,7 @@ export default { |
| 404 | 409 | height: calc(50% - 8px); |
| 405 | 410 | flex-wrap: wrap; |
| 406 | 411 | padding: 12px 0 12px 30px; |
| 407 | - margin-right:20px; | |
| 412 | + margin-right: 20px; | |
| 408 | 413 | .icon { |
| 409 | 414 | width: 60px; |
| 410 | 415 | height: 60px; |
| ... | ... | @@ -466,7 +471,6 @@ export default { |
| 466 | 471 | height: 240px; |
| 467 | 472 | display: flex; |
| 468 | 473 | flex-wrap: wrap; |
| 469 | - | |
| 470 | 474 | } |
| 471 | 475 | .item4 { |
| 472 | 476 | width: calc(50% - 10px); | ... | ... |
src/views/standard/card/index.vue
| ... | ... | @@ -8,7 +8,7 @@ |
| 8 | 8 | |
| 9 | 9 | <div class="page-content"> |
| 10 | 10 | <div class="answer-header"> |
| 11 | - <div class="sel-box"> | |
| 11 | + <div class="sel-box" v-if="role == 'ROLE_XUEXIAO'"> | |
| 12 | 12 | <el-cascader |
| 13 | 13 | @change="_QueryData(1)" |
| 14 | 14 | size="small" |
| ... | ... | @@ -48,6 +48,22 @@ |
| 48 | 48 | >筛选</el-button |
| 49 | 49 | > |
| 50 | 50 | </div> |
| 51 | + <div class="sel-box" v-if="role == 'ROLE_JITUAN'"> | |
| 52 | + <el-select | |
| 53 | + class="sel2" | |
| 54 | + v-model="schoolId" | |
| 55 | + placeholder="选择学校" | |
| 56 | + @change="_QueryData(true)" | |
| 57 | + > | |
| 58 | + <el-option | |
| 59 | + v-for="item in schoolList" | |
| 60 | + :key="item.value" | |
| 61 | + :label="item.label" | |
| 62 | + :value="item.value" | |
| 63 | + > | |
| 64 | + </el-option> | |
| 65 | + </el-select> | |
| 66 | + </div> | |
| 51 | 67 | </div> |
| 52 | 68 | <el-empty |
| 53 | 69 | :image-size="100" |
| ... | ... | @@ -113,14 +129,26 @@ |
| 113 | 129 | </el-pagination> |
| 114 | 130 | </div> |
| 115 | 131 | </div> |
| 132 | + <p class="down" v-if="tableData.length"> | |
| 133 | + <el-button | |
| 134 | + type="primary" | |
| 135 | + plain | |
| 136 | + round | |
| 137 | + icon="fa fa-cloud-download" | |
| 138 | + @click="downExl" | |
| 139 | + >导出报表</el-button | |
| 140 | + > | |
| 141 | + </p> | |
| 116 | 142 | </div> |
| 117 | 143 | </div> |
| 118 | 144 | </template> |
| 119 | 145 | |
| 120 | 146 | <script> |
| 147 | +import { downloadFile } from "utils"; | |
| 121 | 148 | export default { |
| 122 | 149 | data() { |
| 123 | 150 | return { |
| 151 | + role: "", | |
| 124 | 152 | loading: false, |
| 125 | 153 | props: { multiple: false }, |
| 126 | 154 | query: { |
| ... | ... | @@ -128,6 +156,8 @@ export default { |
| 128 | 156 | studentName: "", |
| 129 | 157 | studentCode: "", |
| 130 | 158 | }, |
| 159 | + schoolId: "", | |
| 160 | + schoolList: [], | |
| 131 | 161 | gradeList: [], |
| 132 | 162 | tableData: [], |
| 133 | 163 | page: 1, |
| ... | ... | @@ -135,8 +165,17 @@ export default { |
| 135 | 165 | total: 0, |
| 136 | 166 | }; |
| 137 | 167 | }, |
| 138 | - created() { | |
| 139 | - this._QueryGradeList(); | |
| 168 | + async created() { | |
| 169 | + this.role = | |
| 170 | + this.$store.getters.info.showRole || | |
| 171 | + this.$store.getters.info.permissions[0].role; | |
| 172 | + this.loading = true; | |
| 173 | + if (this.role == "ROLE_XUEXIAO") { | |
| 174 | + this._QueryGradeList(); | |
| 175 | + } else if (this.role == "ROLE_JITUAN") { | |
| 176 | + await this._QuerySchool(); | |
| 177 | + } | |
| 178 | + | |
| 140 | 179 | this._QueryData(); |
| 141 | 180 | }, |
| 142 | 181 | methods: { |
| ... | ... | @@ -171,23 +210,42 @@ export default { |
| 171 | 210 | this.page = page; |
| 172 | 211 | this._QueryData(4); |
| 173 | 212 | }, |
| 213 | + async _QuerySchool() { | |
| 214 | + const { data, status, info } = await this.$request.schoolList(); | |
| 215 | + if (status === 0) { | |
| 216 | + this.schoolList = | |
| 217 | + data.list?.map((item) => { | |
| 218 | + return { | |
| 219 | + label: item.schoolName, | |
| 220 | + value: item.id, | |
| 221 | + }; | |
| 222 | + }) || []; | |
| 223 | + this.schoolId = (this.schoolList && this.schoolList[0].value) || ""; | |
| 224 | + } else { | |
| 225 | + this.$message.error(info); | |
| 226 | + } | |
| 227 | + }, | |
| 174 | 228 | async _QueryData(type) { |
| 175 | 229 | let query = {}; |
| 176 | - query.gradeName = this.query.gradeName; | |
| 177 | - if (type == 1) { | |
| 178 | - query.classId = this.query.classId[1] ? this.query.classId[1] : ""; | |
| 179 | - this.query.studentCode = ""; | |
| 180 | - this.query.studentName = ""; | |
| 181 | - } else if (type == 2) { | |
| 182 | - query.studentName = this.query.studentName; | |
| 183 | - this.query.classId = ""; | |
| 184 | - this.query.studentCode = ""; | |
| 185 | - } else if (type == 3) { | |
| 186 | - query.studentCode = this.query.studentCode; | |
| 187 | - this.query.classId = ""; | |
| 188 | - this.query.studentName = ""; | |
| 189 | - } else { | |
| 190 | - query = { ...this.query }; | |
| 230 | + if (this.role == "ROLE_XUEXIAO") { | |
| 231 | + query.gradeName = this.query.gradeName; | |
| 232 | + if (type == 1) { | |
| 233 | + query.classId = this.query.classId[1] ? this.query.classId[1] : ""; | |
| 234 | + this.query.studentCode = ""; | |
| 235 | + this.query.studentName = ""; | |
| 236 | + } else if (type == 2) { | |
| 237 | + query.studentName = this.query.studentName; | |
| 238 | + this.query.classId = ""; | |
| 239 | + this.query.studentCode = ""; | |
| 240 | + } else if (type == 3) { | |
| 241 | + query.studentCode = this.query.studentCode; | |
| 242 | + this.query.classId = ""; | |
| 243 | + this.query.studentName = ""; | |
| 244 | + } else { | |
| 245 | + query = { ...this.query }; | |
| 246 | + } | |
| 247 | + } else if (this.role == "ROLE_JITUAN") { | |
| 248 | + query.schoolId = this.schoolId; | |
| 191 | 249 | } |
| 192 | 250 | this.loading = true; |
| 193 | 251 | const { data, status, info } = await this.$request.cardList({ |
| ... | ... | @@ -204,6 +262,28 @@ export default { |
| 204 | 262 | this.$message.error(info); |
| 205 | 263 | } |
| 206 | 264 | }, |
| 265 | + async downExl() { | |
| 266 | + //报表导出 | |
| 267 | + if (this.exportLoading == true) return; | |
| 268 | + let query = {}; | |
| 269 | + if (this.role == "ROLE_XUEXIAO") { | |
| 270 | + query = { ...this.query }; | |
| 271 | + } else if (this.role == "ROLE_JITUAN") { | |
| 272 | + query.schoolId = this.schoolId; | |
| 273 | + } | |
| 274 | + | |
| 275 | + this.exportLoading = true; | |
| 276 | + const data = await this.$request.exportClickersLog({ ...query }); | |
| 277 | + this.exportLoading = false; | |
| 278 | + if (data) { | |
| 279 | + let blob = new Blob([data], { | |
| 280 | + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", | |
| 281 | + }); | |
| 282 | + downloadFile("发卡记录.xlsx", blob); | |
| 283 | + } else { | |
| 284 | + this.$message.error("下载失败"); | |
| 285 | + } | |
| 286 | + }, | |
| 207 | 287 | }, |
| 208 | 288 | }; |
| 209 | 289 | </script> |
| ... | ... | @@ -212,4 +292,10 @@ export default { |
| 212 | 292 | .table-box { |
| 213 | 293 | padding: 0 20px; |
| 214 | 294 | } |
| 295 | +.down { | |
| 296 | + padding: 16px 20px; | |
| 297 | +} | |
| 298 | +.answer-header .sel-box .sel2 { | |
| 299 | + width: 300px; | |
| 300 | +} | |
| 215 | 301 | </style> |
| 216 | 302 | \ No newline at end of file | ... | ... |
src/views/standard/setUp/teacher.vue
| ... | ... | @@ -773,15 +773,13 @@ export default { |
| 773 | 773 | }, |
| 774 | 774 | async downExcel() { |
| 775 | 775 | let { data, status, info } = await this.$request.teacherTemplate(); |
| 776 | - debugger; | |
| 777 | - if (status == 0) { | |
| 778 | - const a = document.createElement("a"); | |
| 779 | - a.href = data.downloadUrl; | |
| 780 | - document.body.appendChild(a); | |
| 781 | - a.click(); | |
| 782 | - a.remove(); | |
| 776 | + if (data && !data.code) { | |
| 777 | + let blob = new Blob([data], { | |
| 778 | + type: "application/vnd.ms-excel;charset=utf-8", | |
| 779 | + }); | |
| 780 | + downloadFile(`教师名单模版.xlsx`, blob); | |
| 783 | 781 | } else { |
| 784 | - this.$message.error(info); | |
| 782 | + this.$message.error(data.info); | |
| 785 | 783 | } |
| 786 | 784 | }, |
| 787 | 785 | async exportTeacherExl() { |
| ... | ... | @@ -814,6 +812,13 @@ export default { |
| 814 | 812 | .teacher-ul { |
| 815 | 813 | max-height: 60vh; |
| 816 | 814 | overflow-y: scroll; |
| 815 | + &::-webkit-scrollbar { | |
| 816 | + width: 6px; | |
| 817 | + } | |
| 818 | + &::-webkit-scrollbar-thumb { | |
| 819 | + border-radius: 10px; | |
| 820 | + background-color: #ccc; | |
| 821 | + } | |
| 817 | 822 | } |
| 818 | 823 | .teacher-list { |
| 819 | 824 | width: 240px; |
| ... | ... | @@ -822,7 +827,7 @@ export default { |
| 822 | 827 | height: 40px; |
| 823 | 828 | line-height: 40px; |
| 824 | 829 | background: #eee; |
| 825 | - border-radius: 10px 10px 0 0; | |
| 830 | + // border-radius: 10px 10px 0 0; | |
| 826 | 831 | } |
| 827 | 832 | .teacher-item { |
| 828 | 833 | font-size: 16px; |
| ... | ... | @@ -843,6 +848,7 @@ export default { |
| 843 | 848 | .teacher-detail { |
| 844 | 849 | flex: 1; |
| 845 | 850 | position: relative; |
| 851 | + padding-left: 10px; | |
| 846 | 852 | .icon-box { |
| 847 | 853 | position: absolute; |
| 848 | 854 | top: 12px; | ... | ... |