Commit 0454f787a9ea7bde38cf2a28cf3e698f1e612a8c
1 parent
0ca11cc2
班级管理,班级列表修改,科目设置
Showing
7 changed files
with
780 additions
and
333 deletions
package.json
| @@ -21,7 +21,8 @@ | @@ -21,7 +21,8 @@ | ||
| 21 | "vue": "^2.6.11", | 21 | "vue": "^2.6.11", |
| 22 | "vue-i18n": "^8.4.0", | 22 | "vue-i18n": "^8.4.0", |
| 23 | "vue-router": "^3.5.1", | 23 | "vue-router": "^3.5.1", |
| 24 | - "vuex": "^3.6.2" | 24 | + "vuex": "^3.6.2", |
| 25 | + "vuedraggable": "^2.24.3" | ||
| 25 | }, | 26 | }, |
| 26 | "devDependencies": { | 27 | "devDependencies": { |
| 27 | "@vue/cli-plugin-babel": "~4.5.0", | 28 | "@vue/cli-plugin-babel": "~4.5.0", |
src/api/apis/apis.js
| @@ -1425,8 +1425,6 @@ export default { | @@ -1425,8 +1425,6 @@ export default { | ||
| 1425 | data, | 1425 | data, |
| 1426 | }); | 1426 | }); |
| 1427 | }, | 1427 | }, |
| 1428 | - | ||
| 1429 | - | ||
| 1430 | //修改密码 | 1428 | //修改密码 |
| 1431 | changePwd(data) { | 1429 | changePwd(data) { |
| 1432 | return service({ | 1430 | return service({ |
| @@ -1435,4 +1433,39 @@ export default { | @@ -1435,4 +1433,39 @@ export default { | ||
| 1435 | data, | 1433 | data, |
| 1436 | }); | 1434 | }); |
| 1437 | }, | 1435 | }, |
| 1436 | + /** | ||
| 1437 | + * v1.4 | ||
| 1438 | + */ | ||
| 1439 | + //班级管理 | ||
| 1440 | + classManager(data) { | ||
| 1441 | + return service({ | ||
| 1442 | + url: setUpUrls.classManager, | ||
| 1443 | + method: "POST", | ||
| 1444 | + data, | ||
| 1445 | + }); | ||
| 1446 | + }, | ||
| 1447 | + //班级排序 | ||
| 1448 | + classSort(data) { | ||
| 1449 | + return service({ | ||
| 1450 | + url: setUpUrls.classSort, | ||
| 1451 | + method: "POST", | ||
| 1452 | + data, | ||
| 1453 | + }); | ||
| 1454 | + }, | ||
| 1455 | + //学生分班轨迹 | ||
| 1456 | + studentClassLogs(data) { | ||
| 1457 | + return service({ | ||
| 1458 | + url: setUpUrls.studentClassLogs, | ||
| 1459 | + method: "POST", | ||
| 1460 | + data, | ||
| 1461 | + }); | ||
| 1462 | + }, | ||
| 1463 | + //修改科目 | ||
| 1464 | + updateSubject(data) { | ||
| 1465 | + return service({ | ||
| 1466 | + url: setUpUrls.updateSubject, | ||
| 1467 | + method: "POST", | ||
| 1468 | + data, | ||
| 1469 | + }); | ||
| 1470 | + }, | ||
| 1438 | }; | 1471 | }; |
src/api/urls/apis.js
| @@ -367,4 +367,17 @@ export default { | @@ -367,4 +367,17 @@ export default { | ||
| 367 | 367 | ||
| 368 | // 修改密码 | 368 | // 修改密码 |
| 369 | changePwd: "/api_html/changePwd", | 369 | changePwd: "/api_html/changePwd", |
| 370 | + | ||
| 371 | + | ||
| 372 | + /** | ||
| 373 | + * v1.4 | ||
| 374 | + */ | ||
| 375 | + //班级管理 | ||
| 376 | + classManager: "/api_html/school/manager/classManager", | ||
| 377 | + //班级排序 | ||
| 378 | + classSort: "/api_html/school/manager/classSort", | ||
| 379 | + //学生分班轨迹 | ||
| 380 | + studentClassLogs: "/api_html/school/manager/studentClassLogs", | ||
| 381 | + //修改科目 | ||
| 382 | + updateSubject: "/api_html/school/manager/updateSubject", | ||
| 370 | } | 383 | } |
src/router/index.js
| @@ -42,6 +42,7 @@ const SetUpConglomerate = () => import("@/views/standard/setUp/conglomerate") | @@ -42,6 +42,7 @@ const SetUpConglomerate = () => import("@/views/standard/setUp/conglomerate") | ||
| 42 | const SetUpSchool = () => import("@/views/standard/setUp/school") | 42 | const SetUpSchool = () => import("@/views/standard/setUp/school") |
| 43 | const SetUpTeacher = () => import("@/views/standard/setUp/teacher") | 43 | const SetUpTeacher = () => import("@/views/standard/setUp/teacher") |
| 44 | const SetUpStudent = () => import("@/views/standard/setUp/student") | 44 | const SetUpStudent = () => import("@/views/standard/setUp/student") |
| 45 | +const SetUpClazz = () => import("@/views/standard/setUp/clazz") | ||
| 45 | const ArchivedClazz = () => import("@/views/standard/setUp/archivedClazz") | 46 | const ArchivedClazz = () => import("@/views/standard/setUp/archivedClazz") |
| 46 | 47 | ||
| 47 | const PersonalAsk = () => import("@/views/personal/ask/index") | 48 | const PersonalAsk = () => import("@/views/personal/ask/index") |
| @@ -295,6 +296,13 @@ let addrouters = [ | @@ -295,6 +296,13 @@ let addrouters = [ | ||
| 295 | children: [] | 296 | children: [] |
| 296 | }, | 297 | }, |
| 297 | { | 298 | { |
| 299 | + path: "/setUpClazz", | ||
| 300 | + iconCls: "fa fa-sitemap", | ||
| 301 | + name: '班级管理', | ||
| 302 | + component: SetUpClazz, | ||
| 303 | + children: [] | ||
| 304 | + }, | ||
| 305 | + { | ||
| 298 | path: "/setUpTeacher", | 306 | path: "/setUpTeacher", |
| 299 | iconCls: "fa fa-male", | 307 | iconCls: "fa fa-male", |
| 300 | name: '教师管理', | 308 | name: '教师管理', |
src/views/standard/setUp/clazz.vue
0 → 100644
| 1 | +<template> | ||
| 2 | + <div> | ||
| 3 | + <back-box> | ||
| 4 | + <template slot="title"> | ||
| 5 | + <span>班级管理</span> | ||
| 6 | + </template> | ||
| 7 | + <template slot="btns" v-if="!code"> | ||
| 8 | + <el-tooltip effect="dark" content="导入班级名单" placement="bottom"> | ||
| 9 | + <el-button | ||
| 10 | + type="primary" | ||
| 11 | + icon="el-icon-upload2" | ||
| 12 | + size="mini" | ||
| 13 | + plain | ||
| 14 | + circle | ||
| 15 | + @click="diaUp = true" | ||
| 16 | + ></el-button> | ||
| 17 | + </el-tooltip> | ||
| 18 | + <el-tooltip effect="dark" content="导出班级名单" placement="bottom"> | ||
| 19 | + <el-button | ||
| 20 | + type="primary" | ||
| 21 | + icon="el-icon-download" | ||
| 22 | + size="mini" | ||
| 23 | + plain | ||
| 24 | + circle | ||
| 25 | + @click="exportTeacherExl" | ||
| 26 | + ></el-button> | ||
| 27 | + </el-tooltip> | ||
| 28 | + </template> | ||
| 29 | + </back-box> | ||
| 30 | + <div class="page-content"> | ||
| 31 | + <div class="grade-box"> | ||
| 32 | + <div class="grade-item" v-for="(item, index) in dataList"> | ||
| 33 | + <p class="h-title"> | ||
| 34 | + <span>{{ item.gradeName }}</span> | ||
| 35 | + <el-button | ||
| 36 | + class="sub-btn" | ||
| 37 | + type="info" | ||
| 38 | + size="mini" | ||
| 39 | + round | ||
| 40 | + plain | ||
| 41 | + @click="openSubject(item)" | ||
| 42 | + >科目管理({{ item.subjectNames.length }})</el-button | ||
| 43 | + > | ||
| 44 | + <span class="txt" v-if="index == 0">拖动班级进行排序</span> | ||
| 45 | + </p> | ||
| 46 | + <draggable | ||
| 47 | + tag="ul" | ||
| 48 | + class="grade-info" | ||
| 49 | + v-model="item.classList" | ||
| 50 | + @start="start" | ||
| 51 | + @end="end(item)" | ||
| 52 | + v-bind="{ | ||
| 53 | + animation: 300, | ||
| 54 | + }" | ||
| 55 | + > | ||
| 56 | + <li class="clazz-li" v-for="clazz in item.classList" :key="item.id"> | ||
| 57 | + <div class="clazz-item"> | ||
| 58 | + <p class="clazz-name"> | ||
| 59 | + {{ clazz.className }} | ||
| 60 | + <i | ||
| 61 | + class="el-icon-edit" | ||
| 62 | + @click.stop="setClass(clazz, item.gradeName)" | ||
| 63 | + ></i> | ||
| 64 | + </p> | ||
| 65 | + <div class="clazz-class"> | ||
| 66 | + <span>学生:{{ clazz.studentCount }}个</span> | ||
| 67 | + <span>教师:{{ clazz.studentCount }}个</span> | ||
| 68 | + </div> | ||
| 69 | + </div> | ||
| 70 | + </li> | ||
| 71 | + </draggable> | ||
| 72 | + </div> | ||
| 73 | + </div> | ||
| 74 | + </div> | ||
| 75 | + <el-dialog title="导入班级名单" :visible.sync="diaUp" width="600"> | ||
| 76 | + <up-load | ||
| 77 | + id="downTeacher" | ||
| 78 | + :url="url" | ||
| 79 | + @upSuccess="upSuccess" | ||
| 80 | + fileName="班级名单" | ||
| 81 | + > | ||
| 82 | + <p class="down-txt" slot="down"> | ||
| 83 | + 通过Excel名单导入班级名单,点击 | ||
| 84 | + <el-link type="danger" @click="downExcel">模板下载</el-link> 。 | ||
| 85 | + </p> | ||
| 86 | + </up-load> | ||
| 87 | + <div class="dialog-footer" slot="footer"> | ||
| 88 | + <el-button @click="diaUp = false">取 消</el-button> | ||
| 89 | + </div> | ||
| 90 | + </el-dialog> | ||
| 91 | + <el-dialog title="修改班级" :visible.sync="diaClass" width="400"> | ||
| 92 | + <el-form | ||
| 93 | + ref="formClass" | ||
| 94 | + :model="formClass" | ||
| 95 | + :rules="rulesClass" | ||
| 96 | + label-width="160px" | ||
| 97 | + > | ||
| 98 | + <el-form-item label="所在年级:"> | ||
| 99 | + <span>{{ formClass.gradeName }}</span> | ||
| 100 | + </el-form-item> | ||
| 101 | + <el-form-item label="班级名称:" prop="studentName"> | ||
| 102 | + <el-col :span="10"> | ||
| 103 | + <el-input maxlength="30" v-model.trim="formClass.className" /> | ||
| 104 | + </el-col> | ||
| 105 | + </el-form-item> | ||
| 106 | + <el-form-item label="班级编码:"> | ||
| 107 | + <el-col :span="10"> | ||
| 108 | + <el-input maxlength="30" v-model.trim="formClass.classCode" /> | ||
| 109 | + </el-col> | ||
| 110 | + </el-form-item> | ||
| 111 | + <el-form-item label="入学年份:"> | ||
| 112 | + <el-col :span="10"> | ||
| 113 | + <el-date-picker | ||
| 114 | + v-model="formClass.intoSchoolYear" | ||
| 115 | + type="year" | ||
| 116 | + placeholder="选择年" | ||
| 117 | + > | ||
| 118 | + </el-date-picker> | ||
| 119 | + </el-col> | ||
| 120 | + </el-form-item> | ||
| 121 | + </el-form> | ||
| 122 | + <div class="dialog-footer" slot="footer"> | ||
| 123 | + <el-button @click="_SaveClass" type="primary">确 定</el-button> | ||
| 124 | + <el-button @click="diaClass = false">取 消</el-button> | ||
| 125 | + <el-popconfirm title="确定删除该班级吗?" @confirm="_RemoveClass"> | ||
| 126 | + <el-button class="el-button-del" slot="reference" type="danger" plain | ||
| 127 | + >删 除</el-button | ||
| 128 | + > | ||
| 129 | + </el-popconfirm> | ||
| 130 | + </div> | ||
| 131 | + </el-dialog> | ||
| 132 | + <el-dialog :visible.sync="diaSubject" width="400"> | ||
| 133 | + <p slot="title" class="dia-tit"> | ||
| 134 | + {{ formClass.gradeName }} | ||
| 135 | + <span class="tips">(默认科目和已经有任课老师的提示不能删除)</span> | ||
| 136 | + </p> | ||
| 137 | + <el-form class="form-box" label-width="80px" v-loading="loadingSub"> | ||
| 138 | + <el-form-item label="科目:"> | ||
| 139 | + <div class="subject-box"> | ||
| 140 | + <el-checkbox-group v-model="subjectNames"> | ||
| 141 | + <p | ||
| 142 | + class="p1" | ||
| 143 | + v-for="(item, index) in subjectList" | ||
| 144 | + :key="item.default" | ||
| 145 | + > | ||
| 146 | + <el-checkbox v-if="!item.checked" :label="item.value">{{ | ||
| 147 | + item.value | ||
| 148 | + }}</el-checkbox> | ||
| 149 | + <el-input | ||
| 150 | + class="sub-ipt" | ||
| 151 | + v-else | ||
| 152 | + v-model="item.value" | ||
| 153 | + @keyup.enter.native="_EditSub(item)" | ||
| 154 | + ></el-input> | ||
| 155 | + <i | ||
| 156 | + class="el-icon el-icon-edit" | ||
| 157 | + v-show="!item.checked" | ||
| 158 | + @click="item.checked = true" | ||
| 159 | + ></i> | ||
| 160 | + <i | ||
| 161 | + class="el-icon el-icon-check" | ||
| 162 | + v-show="item.checked" | ||
| 163 | + @click="_EditSub(item)" | ||
| 164 | + ></i> | ||
| 165 | + <i | ||
| 166 | + class="el-icon el-icon-close" | ||
| 167 | + v-show="item.checked" | ||
| 168 | + @click="resetSub(item)" | ||
| 169 | + ></i> | ||
| 170 | + <i | ||
| 171 | + v-show="!item.checked" | ||
| 172 | + class="el-icon el-icon-delete" | ||
| 173 | + @click="_DelSubject(item, index)" | ||
| 174 | + ></i> | ||
| 175 | + </p> | ||
| 176 | + </el-checkbox-group> | ||
| 177 | + </div> | ||
| 178 | + <el-col :span="8"> | ||
| 179 | + <el-input | ||
| 180 | + placeholder="添加科目" | ||
| 181 | + v-model.trim="subjectName" | ||
| 182 | + maxlength="30" | ||
| 183 | + > | ||
| 184 | + <i | ||
| 185 | + slot="suffix" | ||
| 186 | + class="el-input__icon el-icon-plus" | ||
| 187 | + @click="addSubjectName" | ||
| 188 | + ></i> | ||
| 189 | + </el-input> | ||
| 190 | + </el-col> | ||
| 191 | + </el-form-item> | ||
| 192 | + </el-form> | ||
| 193 | + <div class="dialog-footer" slot="footer"> | ||
| 194 | + <el-button @click="_SaveSubject" type="primary">确 定</el-button> | ||
| 195 | + <el-button @click="diaSubject = false">取 消</el-button> | ||
| 196 | + </div> | ||
| 197 | + </el-dialog> | ||
| 198 | + </div> | ||
| 199 | +</template> | ||
| 200 | + | ||
| 201 | +<script> | ||
| 202 | +import { downloadFile } from "@/utils"; | ||
| 203 | +import draggable from "vuedraggable"; | ||
| 204 | +export default { | ||
| 205 | + components: { | ||
| 206 | + draggable, | ||
| 207 | + }, | ||
| 208 | + data() { | ||
| 209 | + return { | ||
| 210 | + code: "", | ||
| 211 | + loading: false, | ||
| 212 | + loadingDown: false, | ||
| 213 | + loadingSub: false, | ||
| 214 | + diaUp: false, | ||
| 215 | + diaClass: false, | ||
| 216 | + diaSubject: false, | ||
| 217 | + subjectLoading: false, | ||
| 218 | + url: "/api_html/school/manager/importClazzClicker", | ||
| 219 | + formClass: { | ||
| 220 | + //修改班级信息 | ||
| 221 | + gradeName: "", | ||
| 222 | + className: "", | ||
| 223 | + classCode: "", | ||
| 224 | + intoSchoolYear: "", | ||
| 225 | + }, | ||
| 226 | + rulesClass: { | ||
| 227 | + className: [ | ||
| 228 | + { required: true, message: "请输入班级名称", trigger: "blur" }, | ||
| 229 | + ], | ||
| 230 | + }, | ||
| 231 | + subjects: [], //科目列表(只有科目) | ||
| 232 | + subjectList: [], //科目列表 | ||
| 233 | + subjectNames: [], //已有科目 | ||
| 234 | + subjectName: "", //要添加的科目 | ||
| 235 | + dataList: [], | ||
| 236 | + }; | ||
| 237 | + }, | ||
| 238 | + async created() { | ||
| 239 | + this.code = localStorage.getItem("csCode") || ""; | ||
| 240 | + this._QueryData(); | ||
| 241 | + this._QuerySubject(); | ||
| 242 | + }, | ||
| 243 | + methods: { | ||
| 244 | + openSubject(obj) { | ||
| 245 | + this.formClass.gradeName = obj.gradeName; | ||
| 246 | + this.subjectNames = [...obj.subjectNames]; | ||
| 247 | + this.diaSubject = true; | ||
| 248 | + }, | ||
| 249 | + start(e) { | ||
| 250 | + console.log(e); | ||
| 251 | + }, | ||
| 252 | + end(obj) { | ||
| 253 | + let classListIds = obj.classList.map((item) => { | ||
| 254 | + return item.id; | ||
| 255 | + }); | ||
| 256 | + this._SaveComponents(classListIds); | ||
| 257 | + }, | ||
| 258 | + upSuccess(res) { | ||
| 259 | + //导入成功 | ||
| 260 | + this.$message.closeAll(); | ||
| 261 | + this.$message({ | ||
| 262 | + showClose: true, | ||
| 263 | + message: `成功(${res.data.success})`, | ||
| 264 | + type: "success", | ||
| 265 | + duration: 5000, | ||
| 266 | + }); | ||
| 267 | + this.diaUp = false; | ||
| 268 | + this._QueryData(); | ||
| 269 | + }, | ||
| 270 | + setClass(obj, gradeName) { | ||
| 271 | + this.formClass.gradeName = gradeName; | ||
| 272 | + this.formClass.classId = obj.id; | ||
| 273 | + this.formClass.className = obj.className; | ||
| 274 | + this.formClass.classCode = obj.classCode || ""; | ||
| 275 | + this.formClass.intoSchoolYear = obj.intoSchoolYear | ||
| 276 | + ? obj.intoSchoolYear + "" | ||
| 277 | + : ""; | ||
| 278 | + this.diaClass = true; | ||
| 279 | + }, | ||
| 280 | + _RemoveClass() { | ||
| 281 | + this.$refs.formClass.validate(async (valid) => { | ||
| 282 | + if (valid) { | ||
| 283 | + const { data, status, info } = await this.$request.removeClass({ | ||
| 284 | + classId: this.formClass.classId, | ||
| 285 | + }); | ||
| 286 | + if (status === 0) { | ||
| 287 | + this.$message.success("修改成功"); | ||
| 288 | + this.diaClass = false; | ||
| 289 | + this._QueryData(); | ||
| 290 | + } else { | ||
| 291 | + this.$message.error(info); | ||
| 292 | + } | ||
| 293 | + } else { | ||
| 294 | + this.$message.warning("输入有误请检查!"); | ||
| 295 | + return false; | ||
| 296 | + } | ||
| 297 | + }); | ||
| 298 | + }, | ||
| 299 | + _SaveClass() { | ||
| 300 | + this.$refs.formClass.validate(async (valid) => { | ||
| 301 | + if (valid) { | ||
| 302 | + const { data, status, info } = await this.$request.updateClass({ | ||
| 303 | + classId: this.formClass.classId, | ||
| 304 | + className: this.formClass.className, | ||
| 305 | + intoSchoolYear: this.formClass.intoSchoolYear, | ||
| 306 | + }); | ||
| 307 | + if (status === 0) { | ||
| 308 | + this.$message.success("修改成功"); | ||
| 309 | + this.diaClass = false; | ||
| 310 | + this._QueryData(); | ||
| 311 | + } else { | ||
| 312 | + this.$message.error(info); | ||
| 313 | + } | ||
| 314 | + } else { | ||
| 315 | + this.$message.warning("输入有误请检查!"); | ||
| 316 | + return false; | ||
| 317 | + } | ||
| 318 | + }); | ||
| 319 | + }, | ||
| 320 | + addSubjectName() { | ||
| 321 | + //添加科目 | ||
| 322 | + if (!this.subjectName) { | ||
| 323 | + this.$message.warning("请填写科目名称"); | ||
| 324 | + return; | ||
| 325 | + } else if (this.subjects.includes(this.subjectName)) { | ||
| 326 | + this.$message.warning("科目已存在,请重新填写~"); | ||
| 327 | + return; | ||
| 328 | + } | ||
| 329 | + this.subjectList.push({ | ||
| 330 | + default: this.subjectName, | ||
| 331 | + value: this.subjectName, | ||
| 332 | + checked: false, | ||
| 333 | + }); | ||
| 334 | + this.subjectNames.push(this.subjectName); | ||
| 335 | + this.subjectName = ""; | ||
| 336 | + }, | ||
| 337 | + resetSub(item) { | ||
| 338 | + item.value = item.default; | ||
| 339 | + item.checked = false; | ||
| 340 | + }, | ||
| 341 | + async _EditSub(item) { | ||
| 342 | + if (this.subjects.includes(item.value)) { | ||
| 343 | + this.$message.warning("科目已存在,请重新填写~"); | ||
| 344 | + return; | ||
| 345 | + } | ||
| 346 | + item.checked = false; | ||
| 347 | + const { status, info } = await this.$request.updateSubject({ | ||
| 348 | + subjectName: item.value, | ||
| 349 | + oldSubjectName: item.default, | ||
| 350 | + }); | ||
| 351 | + if (status === 0) { | ||
| 352 | + this.$message.success(info); | ||
| 353 | + let idx = this.subjectNames.findIndex(sub => item==sub) | ||
| 354 | + this.subjectNames.splice(idx, 1, item.value); | ||
| 355 | + item.default = item.value; | ||
| 356 | + } else { | ||
| 357 | + item.checked = true; | ||
| 358 | + this.$message.error(info); | ||
| 359 | + } | ||
| 360 | + }, | ||
| 361 | + async _DelSubject(obj, index) { | ||
| 362 | + if (this.subjectLoading) return; | ||
| 363 | + this.subjectLoading = true; | ||
| 364 | + const { status, info } = await this.$request.delSubject({ | ||
| 365 | + subjectName: obj.default, | ||
| 366 | + }); | ||
| 367 | + this.subjectLoading = false; | ||
| 368 | + if (status === 0) { | ||
| 369 | + this.$message.success(info); | ||
| 370 | + this.subjectList.splice(index, 1); | ||
| 371 | + this._QueryData(); | ||
| 372 | + } else { | ||
| 373 | + this.$message.error(info); | ||
| 374 | + } | ||
| 375 | + }, | ||
| 376 | + async _SaveSubject() { | ||
| 377 | + //保存修改年级信息 | ||
| 378 | + if (!this.subjectNames.length) { | ||
| 379 | + this.$message.error("请选择科目!"); | ||
| 380 | + return; | ||
| 381 | + } | ||
| 382 | + this.loadingSub = true; | ||
| 383 | + const { status, info } = await this.$request.updateGrade({ | ||
| 384 | + gradeName: this.formClass.gradeName, | ||
| 385 | + subjectNames: this.subjectNames, | ||
| 386 | + }); | ||
| 387 | + this.loadingSub = false; | ||
| 388 | + if (status === 0) { | ||
| 389 | + this.$message.success("修改成功~"); | ||
| 390 | + this.diaSubject = false; | ||
| 391 | + this._QueryData(); | ||
| 392 | + this._QuerySubject(); | ||
| 393 | + } else { | ||
| 394 | + this.$message.error(info); | ||
| 395 | + } | ||
| 396 | + }, | ||
| 397 | + async _SaveComponents(classListIds) { | ||
| 398 | + this.loading = true; | ||
| 399 | + let { status, info } = await this.$request.classSort({ | ||
| 400 | + classIds: [...classListIds], | ||
| 401 | + }); | ||
| 402 | + this.loading = false; | ||
| 403 | + if (status === 0) { | ||
| 404 | + this.$message.success("调整成功!"); | ||
| 405 | + } else { | ||
| 406 | + this.$message.error(info); | ||
| 407 | + } | ||
| 408 | + }, | ||
| 409 | + async _QueryData() { | ||
| 410 | + this.loading = true; | ||
| 411 | + let { data, status, info } = await this.$request.classManager(); | ||
| 412 | + this.loading = false; | ||
| 413 | + if (status === 0) { | ||
| 414 | + this.dataList = [...data.list] || []; | ||
| 415 | + } else { | ||
| 416 | + this.$message.error(info); | ||
| 417 | + } | ||
| 418 | + }, | ||
| 419 | + async _QuerySubject() { | ||
| 420 | + const { data, status, info } = await this.$request.subjectList(); | ||
| 421 | + if (status === 0) { | ||
| 422 | + this.subjects = [...data?.subjectNames] || []; | ||
| 423 | + this.subjectList = | ||
| 424 | + data?.subjectNames.map((item) => { | ||
| 425 | + return { | ||
| 426 | + default: item, | ||
| 427 | + value: item, | ||
| 428 | + checked: false, | ||
| 429 | + }; | ||
| 430 | + }) || []; | ||
| 431 | + } else { | ||
| 432 | + this.$message.error(info); | ||
| 433 | + } | ||
| 434 | + }, | ||
| 435 | + async downExcel() { | ||
| 436 | + let data = await this.$request.teacherTemplate(); | ||
| 437 | + if (data && !data.code) { | ||
| 438 | + let blob = new Blob([data], { | ||
| 439 | + type: "application/vnd.ms-excel;charset=utf-8", | ||
| 440 | + }); | ||
| 441 | + downloadFile(`班级名单模版.xlsx`, blob); | ||
| 442 | + } else { | ||
| 443 | + this.$message.error(data.info); | ||
| 444 | + } | ||
| 445 | + }, | ||
| 446 | + async exportTeacherExl() { | ||
| 447 | + this.loadingDown = true; | ||
| 448 | + let data = await this.$request.exportTeacher(); | ||
| 449 | + this.loadingDown = false; | ||
| 450 | + if (data) { | ||
| 451 | + let blob = new Blob([data], { | ||
| 452 | + type: "application/vnd.ms-excel;charset=utf-8", | ||
| 453 | + }); | ||
| 454 | + downloadFile(`班级名单.xlsx`, blob); | ||
| 455 | + } else { | ||
| 456 | + this.$message.error("下载失败"); | ||
| 457 | + } | ||
| 458 | + }, | ||
| 459 | + }, | ||
| 460 | +}; | ||
| 461 | +</script> | ||
| 462 | + | ||
| 463 | +<style lang="scss" scoped> | ||
| 464 | +.page-tit { | ||
| 465 | + margin-bottom: 20px; | ||
| 466 | +} | ||
| 467 | +.page-content { | ||
| 468 | + padding: 20px; | ||
| 469 | +} | ||
| 470 | +.grade-box { | ||
| 471 | + background: #f8f8f8; | ||
| 472 | + padding: 12px 0; | ||
| 473 | +} | ||
| 474 | +.el-button-del { | ||
| 475 | + margin-left: 10px; | ||
| 476 | +} | ||
| 477 | +.h-title { | ||
| 478 | + display: flex; | ||
| 479 | + align-items: center; | ||
| 480 | + .sub-btn { | ||
| 481 | + margin-left: 30px; | ||
| 482 | + } | ||
| 483 | + .txt { | ||
| 484 | + margin-left: 30px; | ||
| 485 | + font-size: 13px; | ||
| 486 | + color: #666; | ||
| 487 | + } | ||
| 488 | +} | ||
| 489 | +.dia-tit { | ||
| 490 | + .tips { | ||
| 491 | + font-size: 12px; | ||
| 492 | + } | ||
| 493 | +} | ||
| 494 | +.grade-item { | ||
| 495 | + .grade-info { | ||
| 496 | + display: flex; | ||
| 497 | + flex-wrap: wrap; | ||
| 498 | + padding: 20px 20px 0; | ||
| 499 | + .clazz-li { | ||
| 500 | + margin-right: 30px; | ||
| 501 | + margin-bottom: 20px; | ||
| 502 | + position: relative; | ||
| 503 | + background: #fff; | ||
| 504 | + .el-icon-edit { | ||
| 505 | + cursor: pointer; | ||
| 506 | + display: none; | ||
| 507 | + &:hover { | ||
| 508 | + color: #667ffd; | ||
| 509 | + } | ||
| 510 | + } | ||
| 511 | + &:hover { | ||
| 512 | + .el-icon-edit { | ||
| 513 | + display: inline; | ||
| 514 | + } | ||
| 515 | + } | ||
| 516 | + } | ||
| 517 | + | ||
| 518 | + .clazz-item { | ||
| 519 | + width: 220px; | ||
| 520 | + box-sizing: border-box; | ||
| 521 | + padding: 16px; | ||
| 522 | + border-radius: 10px; | ||
| 523 | + box-shadow: 1px 1px 3px #888; | ||
| 524 | + } | ||
| 525 | + .clazz-name { | ||
| 526 | + font-size: 16px; | ||
| 527 | + font-weight: bold; | ||
| 528 | + line-height: 18px; | ||
| 529 | + padding-bottom: 12px; | ||
| 530 | + } | ||
| 531 | + .clazz-class { | ||
| 532 | + display: flex; | ||
| 533 | + justify-content: space-between; | ||
| 534 | + font-size: 15px; | ||
| 535 | + } | ||
| 536 | + } | ||
| 537 | +} | ||
| 538 | +.subject-box { | ||
| 539 | + overflow: hidden; | ||
| 540 | + position: relative; | ||
| 541 | + .p1 { | ||
| 542 | + line-height: 20px; | ||
| 543 | + margin-bottom: 10px; | ||
| 544 | + } | ||
| 545 | +} | ||
| 546 | +:deep(.el-checkbox-group) { | ||
| 547 | + display: flex; | ||
| 548 | + flex-wrap: wrap; | ||
| 549 | + .p1 { | ||
| 550 | + padding-right: 50px; | ||
| 551 | + position: relative; | ||
| 552 | + &:hover { | ||
| 553 | + .el-icon { | ||
| 554 | + display: block; | ||
| 555 | + &:hover { | ||
| 556 | + color: #667ffd; | ||
| 557 | + } | ||
| 558 | + } | ||
| 559 | + .is-checked ~ .el-icon-delete { | ||
| 560 | + display: none; | ||
| 561 | + } | ||
| 562 | + } | ||
| 563 | + } | ||
| 564 | + .el-icon { | ||
| 565 | + font-size: 14px; | ||
| 566 | + color: #999; | ||
| 567 | + position: absolute; | ||
| 568 | + right: 10px; | ||
| 569 | + top: 3px; | ||
| 570 | + cursor: pointer; | ||
| 571 | + display: none; | ||
| 572 | + } | ||
| 573 | + .el-icon-check, | ||
| 574 | + .el-icon-close { | ||
| 575 | + display: block; | ||
| 576 | + } | ||
| 577 | + .el-icon-edit, | ||
| 578 | + .el-icon-check { | ||
| 579 | + right: 28px; | ||
| 580 | + } | ||
| 581 | +} | ||
| 582 | +.sub-ipt { | ||
| 583 | + :deep(.el-input__inner) { | ||
| 584 | + height: 24px; | ||
| 585 | + line-height: 24px; | ||
| 586 | + } | ||
| 587 | +} | ||
| 588 | +.form-box { | ||
| 589 | + :deep(.el-form-item__label) { | ||
| 590 | + line-height: 28px; | ||
| 591 | + } | ||
| 592 | + .el-icon-plus { | ||
| 593 | + cursor: pointer; | ||
| 594 | + &:hover { | ||
| 595 | + color: #667ffd; | ||
| 596 | + } | ||
| 597 | + } | ||
| 598 | +} | ||
| 599 | +</style> | ||
| 0 | \ No newline at end of file | 600 | \ No newline at end of file |
src/views/standard/setUp/school.vue
| @@ -72,7 +72,6 @@ | @@ -72,7 +72,6 @@ | ||
| 72 | class="grade-item" | 72 | class="grade-item" |
| 73 | v-for="item in tableData" | 73 | v-for="item in tableData" |
| 74 | :key="item.grade" | 74 | :key="item.grade" |
| 75 | - @click="setGrade(item)" | ||
| 76 | > | 75 | > |
| 77 | <p class="grade-name">{{ item.gradeName }}</p> | 76 | <p class="grade-name">{{ item.gradeName }}</p> |
| 78 | <div class="grade-class"> | 77 | <div class="grade-class"> |
| @@ -113,55 +112,6 @@ | @@ -113,55 +112,6 @@ | ||
| 113 | <el-button @click="diaUp = false">取 消</el-button> | 112 | <el-button @click="diaUp = false">取 消</el-button> |
| 114 | </div> | 113 | </div> |
| 115 | </el-dialog> | 114 | </el-dialog> |
| 116 | - <el-dialog title="修改年级信息" :visible.sync="diaGrade" width="800px"> | ||
| 117 | - <el-form | ||
| 118 | - class="form-box" | ||
| 119 | - :model="formGrade" | ||
| 120 | - :rules="rulesGrade" | ||
| 121 | - label-width="160px" | ||
| 122 | - > | ||
| 123 | - <el-form-item label="科目:" prop="subjectNames"> | ||
| 124 | - <div class="subject-box" v-loading="subjectLoading" :class="showAll ? 'active' : ''"> | ||
| 125 | - <span | ||
| 126 | - v-show="subjectList.length > 12" | ||
| 127 | - class="showAll" | ||
| 128 | - @click="showAll = !showAll" | ||
| 129 | - >{{ showAll ? "收起" : "更多..." }}</span | ||
| 130 | - > | ||
| 131 | - <el-checkbox-group v-model="formGrade.subjectNames"> | ||
| 132 | - <p class="p1" v-for="(item, index) in subjectList" :key="item"> | ||
| 133 | - <el-checkbox :label="item">{{ item }}</el-checkbox> | ||
| 134 | - <i class="el-icon-delete" @click="_DelSubject(item, index)"></i> | ||
| 135 | - </p> | ||
| 136 | - </el-checkbox-group> | ||
| 137 | - </div> | ||
| 138 | - <el-col :span="8"> | ||
| 139 | - <el-input | ||
| 140 | - placeholder="添加科目" | ||
| 141 | - v-model.trim="subjectName" | ||
| 142 | - maxlength="30" | ||
| 143 | - > | ||
| 144 | - <i | ||
| 145 | - slot="suffix" | ||
| 146 | - class="el-input__icon el-icon-plus" | ||
| 147 | - @click="addSubjectName" | ||
| 148 | - ></i> | ||
| 149 | - </el-input> | ||
| 150 | - </el-col> | ||
| 151 | - </el-form-item> | ||
| 152 | - <el-form-item label="班级:"> | ||
| 153 | - <span v-for="(item, index) in formGrade.classList" :key="item.id">{{ | ||
| 154 | - `${item.className}${ | ||
| 155 | - index == formGrade.classList.length - 1 ? "" : "、" | ||
| 156 | - }` | ||
| 157 | - }}</span> | ||
| 158 | - </el-form-item> | ||
| 159 | - </el-form> | ||
| 160 | - <div class="dialog-footer" slot="footer"> | ||
| 161 | - <el-button @click="editGrade">确 定</el-button> | ||
| 162 | - <el-button @click="diaGrade = false">取 消</el-button> | ||
| 163 | - </div> | ||
| 164 | - </el-dialog> | ||
| 165 | <el-dialog title="修改学校信息" :visible.sync="diaSchool" width="400"> | 115 | <el-dialog title="修改学校信息" :visible.sync="diaSchool" width="400"> |
| 166 | <el-form | 116 | <el-form |
| 167 | ref="formSchool" | 117 | ref="formSchool" |
| @@ -246,8 +196,6 @@ export default { | @@ -246,8 +196,6 @@ export default { | ||
| 246 | url: "/api_html/school/manager/importClassAndStudent", | 196 | url: "/api_html/school/manager/importClassAndStudent", |
| 247 | diaUp: false, | 197 | diaUp: false, |
| 248 | diaSchool: false, | 198 | diaSchool: false, |
| 249 | - diaGrade: false, | ||
| 250 | - showAll: false, //修改年级科目显示 | ||
| 251 | school: { | 199 | school: { |
| 252 | schoolName: "", | 200 | schoolName: "", |
| 253 | managePwd: "", | 201 | managePwd: "", |
| @@ -286,21 +234,8 @@ export default { | @@ -286,21 +234,8 @@ export default { | ||
| 286 | }, | 234 | }, |
| 287 | ], | 235 | ], |
| 288 | }, | 236 | }, |
| 289 | - formGrade: { | ||
| 290 | - //修改年级 | ||
| 291 | - gradeName: "", | ||
| 292 | - subjectNames: [], | ||
| 293 | - classList: [], | ||
| 294 | - }, | ||
| 295 | - rulesGrade: { | ||
| 296 | - subjectNames: [ | ||
| 297 | - { required: true, message: "请选择科目", trigger: "blur" }, | ||
| 298 | - ], | ||
| 299 | - }, | ||
| 300 | subjectName: "", | 237 | subjectName: "", |
| 301 | sectionsList: [], | 238 | sectionsList: [], |
| 302 | - subjectLoading:false, | ||
| 303 | - subjectList: [], | ||
| 304 | diaUpgradeGrade: false, //班级升级 | 239 | diaUpgradeGrade: false, //班级升级 |
| 305 | defaultSections: [], | 240 | defaultSections: [], |
| 306 | }; | 241 | }; |
| @@ -321,7 +256,6 @@ export default { | @@ -321,7 +256,6 @@ export default { | ||
| 321 | this.code = localStorage.getItem("csCode") || ""; | 256 | this.code = localStorage.getItem("csCode") || ""; |
| 322 | this._QueryDataSchool(); | 257 | this._QueryDataSchool(); |
| 323 | this._QueryDataGrade(); | 258 | this._QueryDataGrade(); |
| 324 | - this._QuerySubject(); | ||
| 325 | this._QuerySectionList(); | 259 | this._QuerySectionList(); |
| 326 | }, | 260 | }, |
| 327 | methods: { | 261 | methods: { |
| @@ -338,27 +272,6 @@ export default { | @@ -338,27 +272,6 @@ export default { | ||
| 338 | this._QueryDataSchool(); | 272 | this._QueryDataSchool(); |
| 339 | this._QueryDataGrade(); | 273 | this._QueryDataGrade(); |
| 340 | }, | 274 | }, |
| 341 | - setGrade(obj) { | ||
| 342 | - //打开年级设置 | ||
| 343 | - this.formGrade.subjectNames = obj.subjectNames; | ||
| 344 | - this.formGrade.classList = obj.classList; | ||
| 345 | - this.formGrade.gradeName = obj.gradeName; | ||
| 346 | - this.showAll = false; | ||
| 347 | - this.diaGrade = true; | ||
| 348 | - }, | ||
| 349 | - addSubjectName() { | ||
| 350 | - //添加科目 | ||
| 351 | - if (!this.subjectName) { | ||
| 352 | - this.$message.warning("请填写科目名称"); | ||
| 353 | - return; | ||
| 354 | - } else if (this.subjectList.includes(this.subjectName)) { | ||
| 355 | - this.$message.warning("科目已存在,请重新填写~"); | ||
| 356 | - return; | ||
| 357 | - } | ||
| 358 | - this.subjectList.push(this.subjectName); | ||
| 359 | - this.formGrade.subjectNames.push(this.subjectName); | ||
| 360 | - this.subjectName = ""; | ||
| 361 | - }, | ||
| 362 | editSchool() { | 275 | editSchool() { |
| 363 | //保存修改学校信息 | 276 | //保存修改学校信息 |
| 364 | if (!this.formSchool.sections.length) { | 277 | if (!this.formSchool.sections.length) { |
| @@ -398,20 +311,7 @@ export default { | @@ -398,20 +311,7 @@ export default { | ||
| 398 | } | 311 | } |
| 399 | }); | 312 | }); |
| 400 | }, | 313 | }, |
| 401 | - async _DelSubject(subject, index) { | ||
| 402 | - if(this.subjectLoading)return | ||
| 403 | - this.subjectLoading = true | ||
| 404 | - const { status, info } = await this.$request.delSubject({ | ||
| 405 | - subjectName: subject, | ||
| 406 | - }); | ||
| 407 | - this.subjectLoading = false | ||
| 408 | - if (status === 0) { | ||
| 409 | - this.$message.success(info); | ||
| 410 | - this.subjectList.splice(index, 1); | ||
| 411 | - } else { | ||
| 412 | - this.$message.error(info); | ||
| 413 | - } | ||
| 414 | - }, | 314 | + |
| 415 | async _UpgradeGrade() { | 315 | async _UpgradeGrade() { |
| 416 | this.loading = true; | 316 | this.loading = true; |
| 417 | const { data, status, info } = await this.$request.upgradeGrade(); | 317 | const { data, status, info } = await this.$request.upgradeGrade(); |
| @@ -420,34 +320,11 @@ export default { | @@ -420,34 +320,11 @@ export default { | ||
| 420 | this.$message.success("升级成功~"); | 320 | this.$message.success("升级成功~"); |
| 421 | this.diaUpgradeGrade = false; | 321 | this.diaUpgradeGrade = false; |
| 422 | this._QueryDataGrade(); | 322 | this._QueryDataGrade(); |
| 423 | - this._QuerySubject(); | ||
| 424 | - } else { | ||
| 425 | - this.$message.error(info); | ||
| 426 | - } | ||
| 427 | - }, | ||
| 428 | - async editGrade() { | ||
| 429 | - //保存修改年级信息 | ||
| 430 | - if (!this.formGrade.subjectNames.length) { | ||
| 431 | - this.$message.error("请选择科目!"); | ||
| 432 | - return; | ||
| 433 | - } | ||
| 434 | - if (this.loading) { | ||
| 435 | - return; | ||
| 436 | - } | ||
| 437 | - this.loading = true; | ||
| 438 | - const { data, status, info } = await this.$request.updateGrade({ | ||
| 439 | - gradeName: this.formGrade.gradeName, | ||
| 440 | - subjectNames: this.formGrade.subjectNames, | ||
| 441 | - }); | ||
| 442 | - this.loading = false; | ||
| 443 | - if (status === 0) { | ||
| 444 | - this.$message.success("修改成功~"); | ||
| 445 | - this.diaGrade = false; | ||
| 446 | - this._QueryDataGrade(); | ||
| 447 | } else { | 323 | } else { |
| 448 | this.$message.error(info); | 324 | this.$message.error(info); |
| 449 | } | 325 | } |
| 450 | }, | 326 | }, |
| 327 | + | ||
| 451 | async _QuerySectionList() { | 328 | async _QuerySectionList() { |
| 452 | //学校学段 | 329 | //学校学段 |
| 453 | const { data, status, info } = await this.$request.sectionList(); | 330 | const { data, status, info } = await this.$request.sectionList(); |
| @@ -491,14 +368,7 @@ export default { | @@ -491,14 +368,7 @@ export default { | ||
| 491 | this.$message.error(info); | 368 | this.$message.error(info); |
| 492 | } | 369 | } |
| 493 | }, | 370 | }, |
| 494 | - async _QuerySubject() { | ||
| 495 | - const { data, status, info } = await this.$request.subjectList(); | ||
| 496 | - if (status === 0) { | ||
| 497 | - this.subjectList = [...data.subjectNames] || []; | ||
| 498 | - } else { | ||
| 499 | - this.$message.error(info); | ||
| 500 | - } | ||
| 501 | - }, | 371 | + |
| 502 | async downExcel() { | 372 | async downExcel() { |
| 503 | let data = await this.$request.classAndStudentTemplate(); | 373 | let data = await this.$request.classAndStudentTemplate(); |
| 504 | if (data && !data.code) { | 374 | if (data && !data.code) { |
| @@ -598,7 +468,6 @@ export default { | @@ -598,7 +468,6 @@ export default { | ||
| 598 | padding: 12px 16px; | 468 | padding: 12px 16px; |
| 599 | border-radius: 10px; | 469 | border-radius: 10px; |
| 600 | box-shadow: 1px 1px 3px #888; | 470 | box-shadow: 1px 1px 3px #888; |
| 601 | - cursor: pointer; | ||
| 602 | transition: all 0.5s; | 471 | transition: all 0.5s; |
| 603 | &:hover { | 472 | &:hover { |
| 604 | transform: translate(-2px, -5px); | 473 | transform: translate(-2px, -5px); |
| @@ -633,27 +502,6 @@ export default { | @@ -633,27 +502,6 @@ export default { | ||
| 633 | } | 502 | } |
| 634 | .form-box { | 503 | .form-box { |
| 635 | margin: 0 20px; | 504 | margin: 0 20px; |
| 636 | - .subject-box { | ||
| 637 | - height: 90px; | ||
| 638 | - overflow: hidden; | ||
| 639 | - position: relative; | ||
| 640 | - &.active { | ||
| 641 | - height: auto; | ||
| 642 | - overflow: auto; | ||
| 643 | - } | ||
| 644 | - .showAll { | ||
| 645 | - position: absolute; | ||
| 646 | - bottom: 0; | ||
| 647 | - right: 10px; | ||
| 648 | - font-size: 12px; | ||
| 649 | - color: #7f7f7f; | ||
| 650 | - cursor: pointer; | ||
| 651 | - padding: 2px; | ||
| 652 | - &:hover { | ||
| 653 | - color: #667ffd; | ||
| 654 | - } | ||
| 655 | - } | ||
| 656 | - } | ||
| 657 | } | 505 | } |
| 658 | .el-icon-plus { | 506 | .el-icon-plus { |
| 659 | cursor: pointer; | 507 | cursor: pointer; |
src/views/standard/setUp/student.vue
| @@ -34,6 +34,23 @@ | @@ -34,6 +34,23 @@ | ||
| 34 | </back-box> | 34 | </back-box> |
| 35 | <div class="answer-header"> | 35 | <div class="answer-header"> |
| 36 | <div class="sel-box"> | 36 | <div class="sel-box"> |
| 37 | + <el-select | ||
| 38 | + class="sel" | ||
| 39 | + v-model="query.gradeName" | ||
| 40 | + placeholder="选择年级" | ||
| 41 | + @change="changeGrade" | ||
| 42 | + > | ||
| 43 | + <el-option disabled label="全部" value=""></el-option> | ||
| 44 | + <el-option | ||
| 45 | + v-for="item in gradeList" | ||
| 46 | + :key="item.value" | ||
| 47 | + :label="item.label" | ||
| 48 | + :value="item.value" | ||
| 49 | + > | ||
| 50 | + </el-option> | ||
| 51 | + <el-option label="未分配" :value="80"></el-option> | ||
| 52 | + <el-option label="已毕业" :value="81"></el-option> | ||
| 53 | + </el-select> | ||
| 37 | <el-input | 54 | <el-input |
| 38 | placeholder="请输入学生姓名" | 55 | placeholder="请输入学生姓名" |
| 39 | v-model="query.studentName" | 56 | v-model="query.studentName" |
| @@ -61,30 +78,14 @@ | @@ -61,30 +78,14 @@ | ||
| 61 | </div> | 78 | </div> |
| 62 | </div> | 79 | </div> |
| 63 | <div class="page-content"> | 80 | <div class="page-content"> |
| 64 | - <!-- <template v-if="!code && role !== 'ROLE_PERSONAL'"> | ||
| 65 | - <p class="tips" v-show="archivedTotal"> | ||
| 66 | - <span>另有{{ archivedTotal }}个班级已经归档,</span> | ||
| 67 | - <router-link to="/archivedClazz">点击查看>></router-link> | ||
| 68 | - </p> | ||
| 69 | - </template> --> | ||
| 70 | <div class="stu-box"> | 81 | <div class="stu-box"> |
| 71 | - <div class="stu-list"> | ||
| 72 | - <div class="h-title"> | ||
| 73 | - <el-select | ||
| 74 | - class="sel" | ||
| 75 | - v-model="query.gradeName" | ||
| 76 | - placeholder="选择年级" | ||
| 77 | - @change="changeGrade" | ||
| 78 | - > | ||
| 79 | - <el-option | ||
| 80 | - v-for="item in gradeList" | ||
| 81 | - :key="item.value" | ||
| 82 | - :label="item.label" | ||
| 83 | - :value="item.value" | ||
| 84 | - > | ||
| 85 | - </el-option> | ||
| 86 | - </el-select> | ||
| 87 | - </div> | 82 | + <div |
| 83 | + class="stu-list" | ||
| 84 | + v-show=" | ||
| 85 | + query.gradeName != 80 && query.gradeName != 81 && query.gradeName | ||
| 86 | + " | ||
| 87 | + > | ||
| 88 | + <div class="h-title">班级列表</div> | ||
| 88 | <ul class="stu-ul"> | 89 | <ul class="stu-ul"> |
| 89 | <li | 90 | <li |
| 90 | class="stu-item" | 91 | class="stu-item" |
| @@ -93,33 +94,19 @@ | @@ -93,33 +94,19 @@ | ||
| 93 | :class="query.classId == item.id ? 'active' : ''" | 94 | :class="query.classId == item.id ? 'active' : ''" |
| 94 | @click="classDetail(item)" | 95 | @click="classDetail(item)" |
| 95 | > | 96 | > |
| 96 | - <template v-if="!code && role !== 'ROLE_PERSONAL'"> | ||
| 97 | - <!-- <el-tooltip effect="dark" content="班级归档" placement="top"> | ||
| 98 | - <div class="popconfirm-box"> | ||
| 99 | - <i | ||
| 100 | - slot="reference" | ||
| 101 | - class="fa fa-file-archive-o" | ||
| 102 | - @click.stop="openArchivingDia(item, index)" | ||
| 103 | - ></i> | ||
| 104 | - </div> | ||
| 105 | - </el-tooltip> --> | ||
| 106 | - <el-tooltip effect="dark" content="修改班级" placement="top"> | ||
| 107 | - <i | ||
| 108 | - class="el-icon-edit-outline" | ||
| 109 | - @click.stop="setClass(item)" | ||
| 110 | - ></i> | ||
| 111 | - </el-tooltip> | ||
| 112 | - </template> | ||
| 113 | {{ item.className }}({{ item.studentCount }}) | 97 | {{ item.className }}({{ item.studentCount }}) |
| 114 | </li> | 98 | </li> |
| 115 | </ul> | 99 | </ul> |
| 116 | </div> | 100 | </div> |
| 117 | <div class="stu-detail"> | 101 | <div class="stu-detail"> |
| 118 | - <div class="clazz-detail" v-if="clazzDetail.stationSn"> | 102 | + <p class="total" v-if="studentList.length"> |
| 103 | + 共筛选出{{ studentList.length }}名学生。 | ||
| 104 | + </p> | ||
| 105 | + <!-- <div class="clazz-detail" v-if="clazzDetail.stationSn"> | ||
| 119 | <p>基站SN:{{ clazzDetail.stationSn }}</p> | 106 | <p>基站SN:{{ clazzDetail.stationSn }}</p> |
| 120 | <p>配对码:{{ clazzDetail.pairingCode }}</p> | 107 | <p>配对码:{{ clazzDetail.pairingCode }}</p> |
| 121 | <p>频点:{{ clazzDetail.frequency }}</p> | 108 | <p>频点:{{ clazzDetail.frequency }}</p> |
| 122 | - </div> | 109 | + </div> --> |
| 123 | 110 | ||
| 124 | <ul class="s-ul" v-loading="loading"> | 111 | <ul class="s-ul" v-loading="loading"> |
| 125 | <li | 112 | <li |
| @@ -130,24 +117,26 @@ | @@ -130,24 +117,26 @@ | ||
| 130 | <el-popconfirm | 117 | <el-popconfirm |
| 131 | v-if="!code" | 118 | v-if="!code" |
| 132 | title="确定删除吗?" | 119 | title="确定删除吗?" |
| 133 | - @confirm="removeStu(item, index)" | 120 | + @confirm="removeStu(item, index, $event)" |
| 134 | > | 121 | > |
| 135 | <i class="el-icon-delete" slot="reference"></i> | 122 | <i class="el-icon-delete" slot="reference"></i> |
| 136 | </el-popconfirm> | 123 | </el-popconfirm> |
| 137 | <i | 124 | <i |
| 138 | class="el-icon-user-solid" | 125 | class="el-icon-user-solid" |
| 139 | v-if="!code" | 126 | v-if="!code" |
| 140 | - @click="openChangeClazz(item)" | 127 | + @click.stop="openChangeClazz(item)" |
| 141 | ></i> | 128 | ></i> |
| 142 | - <p class="name"> | ||
| 143 | - {{ item.studentName }} | ||
| 144 | - </p> | ||
| 145 | - <p class="p2" v-if="!query.classId"> | ||
| 146 | - {{ item.gradeName }}﹒{{ item.className }} | ||
| 147 | - </p> | ||
| 148 | - <p class="p1">答题器:{{ item.clickerSn || "--" }}</p> | ||
| 149 | - <p class="p1">长学号:{{ item.studentCode }}</p> | ||
| 150 | - <p class="p1">短学号:{{ item.shortNumber || "--" }}</p> | 129 | + <div class="s-li-box" @click="sayChange(item)"> |
| 130 | + <p class="name"> | ||
| 131 | + {{ item.studentName }} | ||
| 132 | + </p> | ||
| 133 | + <p class="p2" v-if="!query.classId"> | ||
| 134 | + {{ item.gradeName }}﹒{{ item.className }} | ||
| 135 | + </p> | ||
| 136 | + <p class="p1">答题器:{{ item.clickerSn || "--" }}</p> | ||
| 137 | + <p class="p1">长学号:{{ item.studentCode }}</p> | ||
| 138 | + <p class="p1">短学号:{{ item.shortNumber || "--" }}</p> | ||
| 139 | + </div> | ||
| 151 | </li> | 140 | </li> |
| 152 | </ul> | 141 | </ul> |
| 153 | <el-empty | 142 | <el-empty |
| @@ -204,6 +193,25 @@ | @@ -204,6 +193,25 @@ | ||
| 204 | <el-button @click="diaChangeClass = false">取 消</el-button> | 193 | <el-button @click="diaChangeClass = false">取 消</el-button> |
| 205 | </div> | 194 | </div> |
| 206 | </el-dialog> | 195 | </el-dialog> |
| 196 | + <el-dialog title="调班轨迹" :visible.sync="diaChangeClassTrack" width="400"> | ||
| 197 | + <el-form | ||
| 198 | + :model="formClassTrack" | ||
| 199 | + label-width="160px" | ||
| 200 | + v-loading="loadingClassLogs" | ||
| 201 | + > | ||
| 202 | + <el-form-item label="学生姓名:"> | ||
| 203 | + <span>{{ formClassTrack.studentName }}</span> | ||
| 204 | + </el-form-item> | ||
| 205 | + <el-form-item label="当前班级:"> | ||
| 206 | + <p v-for="item in formClassTrack.classList"> | ||
| 207 | + {{ `${item.grade}-${item.className}(${item.createdTime})` }} | ||
| 208 | + </p> | ||
| 209 | + </el-form-item> | ||
| 210 | + </el-form> | ||
| 211 | + <div class="dialog-footer" slot="footer"> | ||
| 212 | + <el-button @click="diaChangeClassTrack = false">关 闭</el-button> | ||
| 213 | + </div> | ||
| 214 | + </el-dialog> | ||
| 207 | <el-dialog title="添加学生" :visible.sync="diaStu" width="400"> | 215 | <el-dialog title="添加学生" :visible.sync="diaStu" width="400"> |
| 208 | <el-form | 216 | <el-form |
| 209 | ref="formBox" | 217 | ref="formBox" |
| @@ -255,39 +263,6 @@ | @@ -255,39 +263,6 @@ | ||
| 255 | <el-button @click="diaStu = false">取 消</el-button> | 263 | <el-button @click="diaStu = false">取 消</el-button> |
| 256 | </div> | 264 | </div> |
| 257 | </el-dialog> | 265 | </el-dialog> |
| 258 | - <el-dialog title="修改班级" :visible.sync="diaClass" width="400"> | ||
| 259 | - <el-form | ||
| 260 | - class="form-box" | ||
| 261 | - ref="formClass" | ||
| 262 | - :model="formClass" | ||
| 263 | - :rules="rulesClass" | ||
| 264 | - label-width="160px" | ||
| 265 | - > | ||
| 266 | - <el-form-item label="所在年级:"> | ||
| 267 | - <span>{{ formClass.gradeName }}</span> | ||
| 268 | - </el-form-item> | ||
| 269 | - <el-form-item label="班级名称:" prop="studentName"> | ||
| 270 | - <el-col :span="10"> | ||
| 271 | - <el-input maxlength="30" v-model.trim="formClass.className" /> | ||
| 272 | - </el-col> | ||
| 273 | - </el-form-item> | ||
| 274 | - <el-form-item label="入学年份:" prop="studentCode"> | ||
| 275 | - <el-col :span="10"> | ||
| 276 | - <el-date-picker | ||
| 277 | - v-model="formClass.intoSchoolYear" | ||
| 278 | - type="year" | ||
| 279 | - value-format="yyyy" | ||
| 280 | - placeholder="选择年" | ||
| 281 | - > | ||
| 282 | - </el-date-picker> | ||
| 283 | - </el-col> | ||
| 284 | - </el-form-item> | ||
| 285 | - </el-form> | ||
| 286 | - <div class="dialog-footer" slot="footer"> | ||
| 287 | - <el-button @click="saveClass">确 定</el-button> | ||
| 288 | - <el-button @click="diaClass = false">取 消</el-button> | ||
| 289 | - </div> | ||
| 290 | - </el-dialog> | ||
| 291 | <el-dialog title="学生答题器绑定" :visible.sync="diaUp" width="600"> | 266 | <el-dialog title="学生答题器绑定" :visible.sync="diaUp" width="600"> |
| 292 | <up-load | 267 | <up-load |
| 293 | id="downTeacher" | 268 | id="downTeacher" |
| @@ -304,17 +279,6 @@ | @@ -304,17 +279,6 @@ | ||
| 304 | <el-button @click="diaUp = false">取 消</el-button> | 279 | <el-button @click="diaUp = false">取 消</el-button> |
| 305 | </div> | 280 | </div> |
| 306 | </el-dialog> | 281 | </el-dialog> |
| 307 | - <el-dialog title="班级归档" :visible.sync="diaArchiving" width="400"> | ||
| 308 | - <p> | ||
| 309 | - 注意班级归档后,学生解除班级关系且相关老师任课信息将不存在,确认要将班级归档吗? | ||
| 310 | - </p> | ||
| 311 | - <div class="dialog-footer" slot="footer"> | ||
| 312 | - <el-button type="danger" @click="archivingClass">确认归档</el-button> | ||
| 313 | - <el-button type="primary" @click="diaArchiving = false" | ||
| 314 | - >取 消</el-button | ||
| 315 | - > | ||
| 316 | - </div> | ||
| 317 | - </el-dialog> | ||
| 318 | </div> | 282 | </div> |
| 319 | </template> | 283 | </template> |
| 320 | 284 | ||
| @@ -326,11 +290,18 @@ export default { | @@ -326,11 +290,18 @@ export default { | ||
| 326 | return { | 290 | return { |
| 327 | code: "", | 291 | code: "", |
| 328 | role: "", | 292 | role: "", |
| 293 | + loading: false, | ||
| 294 | + loadingDown: false, | ||
| 295 | + loadingClassLogs: false, | ||
| 329 | diaUp: false, | 296 | diaUp: false, |
| 330 | url: "/api_html/school/manager/importStudentClicker", | 297 | url: "/api_html/school/manager/importStudentClicker", |
| 331 | diaStu: false, | 298 | diaStu: false, |
| 332 | - diaClass: false, | ||
| 333 | diaChangeClass: false, | 299 | diaChangeClass: false, |
| 300 | + diaChangeClassTrack: false, | ||
| 301 | + formClassTrack: { | ||
| 302 | + studentName: "", | ||
| 303 | + classList: [], | ||
| 304 | + }, | ||
| 334 | clazzDetail: { stationSn: "", pairingCode: "", frequency: "" }, | 305 | clazzDetail: { stationSn: "", pairingCode: "", frequency: "" }, |
| 335 | query: { | 306 | query: { |
| 336 | gradeName: "", | 307 | gradeName: "", |
| @@ -354,16 +325,6 @@ export default { | @@ -354,16 +325,6 @@ export default { | ||
| 354 | { required: true, message: "请输入学生长学号", trigger: "blur" }, | 325 | { required: true, message: "请输入学生长学号", trigger: "blur" }, |
| 355 | ], | 326 | ], |
| 356 | }, | 327 | }, |
| 357 | - formClass: { | ||
| 358 | - gradeName: "", | ||
| 359 | - className: "", | ||
| 360 | - intoSchoolYear: "", | ||
| 361 | - }, | ||
| 362 | - rulesClass: { | ||
| 363 | - className: [ | ||
| 364 | - { required: true, message: "请输入班级名称", trigger: "blur" }, | ||
| 365 | - ], | ||
| 366 | - }, | ||
| 367 | formStuCla: { | 328 | formStuCla: { |
| 368 | studentName: "", | 329 | studentName: "", |
| 369 | studentId: "", | 330 | studentId: "", |
| @@ -393,10 +354,6 @@ export default { | @@ -393,10 +354,6 @@ export default { | ||
| 393 | teacherCourseList: [], | 354 | teacherCourseList: [], |
| 394 | teacherGradeList: [], | 355 | teacherGradeList: [], |
| 395 | }, | 356 | }, |
| 396 | - diaArchiving: false, | ||
| 397 | - archivedTotal: 0, //已归档班级 | ||
| 398 | - archivingObj: {}, //即将归档班级信息 | ||
| 399 | - archivingIndex: 0, //即将归档班级下标 | ||
| 400 | }; | 357 | }; |
| 401 | }, | 358 | }, |
| 402 | async created() { | 359 | async created() { |
| @@ -404,7 +361,6 @@ export default { | @@ -404,7 +361,6 @@ export default { | ||
| 404 | this.role = | 361 | this.role = |
| 405 | this.$store.getters.info.showRole || | 362 | this.$store.getters.info.showRole || |
| 406 | this.$store.getters.info.permissions[0].role; | 363 | this.$store.getters.info.permissions[0].role; |
| 407 | - this._QueryArchivedNum(); | ||
| 408 | await this._QueryDataGrade(); | 364 | await this._QueryDataGrade(); |
| 409 | await this._QueryClass(); | 365 | await this._QueryClass(); |
| 410 | this._QueryData(3); | 366 | this._QueryData(3); |
| @@ -435,34 +391,6 @@ export default { | @@ -435,34 +391,6 @@ export default { | ||
| 435 | this._QueryData(3); | 391 | this._QueryData(3); |
| 436 | }, | 392 | }, |
| 437 | 393 | ||
| 438 | - setClass(obj) { | ||
| 439 | - this.formClass.gradeName = obj.gradeName; | ||
| 440 | - this.formClass.classId = obj.id; | ||
| 441 | - this.formClass.className = obj.className; | ||
| 442 | - this.formClass.intoSchoolYear = obj.intoSchoolYear + ""; | ||
| 443 | - this.diaClass = true; | ||
| 444 | - }, | ||
| 445 | - saveClass() { | ||
| 446 | - this.$refs.formClass.validate(async (valid) => { | ||
| 447 | - if (valid) { | ||
| 448 | - const { data, status, info } = await this.$request.updateClass({ | ||
| 449 | - classId: this.formClass.classId, | ||
| 450 | - className: this.formClass.className, | ||
| 451 | - intoSchoolYear: this.formClass.intoSchoolYear, | ||
| 452 | - }); | ||
| 453 | - if (status === 0) { | ||
| 454 | - this.$message.success("修改成功"); | ||
| 455 | - this.diaClass = false; | ||
| 456 | - this._QueryClass(); | ||
| 457 | - } else { | ||
| 458 | - this.$message.error(info); | ||
| 459 | - } | ||
| 460 | - } else { | ||
| 461 | - this.$message.warning("输入有误请检查!"); | ||
| 462 | - return false; | ||
| 463 | - } | ||
| 464 | - }); | ||
| 465 | - }, | ||
| 466 | upSuccess(res) { | 394 | upSuccess(res) { |
| 467 | this.$message.closeAll(); | 395 | this.$message.closeAll(); |
| 468 | this.$message({ | 396 | this.$message({ |
| @@ -513,6 +441,11 @@ export default { | @@ -513,6 +441,11 @@ export default { | ||
| 513 | } | 441 | } |
| 514 | }); | 442 | }); |
| 515 | }, | 443 | }, |
| 444 | + //学生调班轨迹 | ||
| 445 | + sayChange(obj) { | ||
| 446 | + this._StudentClassLogs(obj); | ||
| 447 | + this.diaChangeClassTrack = true; | ||
| 448 | + }, | ||
| 516 | //学生调班弹窗 | 449 | //学生调班弹窗 |
| 517 | openChangeClazz(obj) { | 450 | openChangeClazz(obj) { |
| 518 | this.formStuCla.studentId = obj.id; | 451 | this.formStuCla.studentId = obj.id; |
| @@ -551,32 +484,21 @@ export default { | @@ -551,32 +484,21 @@ export default { | ||
| 551 | { leading: true, trailing: false } | 484 | { leading: true, trailing: false } |
| 552 | ), | 485 | ), |
| 553 | 486 | ||
| 554 | - openArchivingDia(obj, index) { | ||
| 555 | - this.archivingObj = { ...obj }; | ||
| 556 | - this.archivingIndex = index; | ||
| 557 | - this.diaArchiving = true; | ||
| 558 | - }, | ||
| 559 | - //班级归档 | ||
| 560 | - async archivingClass() { | ||
| 561 | - const { data, status, info } = await this.$request.classArchiving({ | ||
| 562 | - classId: this.archivingObj.id, | 487 | + //学生调班轨迹 |
| 488 | + async _StudentClassLogs(obj) { | ||
| 489 | + this.loadingClassLogs = true; | ||
| 490 | + let { data, info, status } = await this.$request.studentClassLogs({ | ||
| 491 | + studentId: obj.id, | ||
| 563 | }); | 492 | }); |
| 564 | - this.diaArchiving = false; | ||
| 565 | - if (status === 0) { | ||
| 566 | - this.$message.success("归档成功"); | ||
| 567 | - this.classList.splice(this.archivingIndex, 1); | ||
| 568 | - if (this.archivingIndex == this.classList.length) { | ||
| 569 | - this.classDetail(this.classList[this.archivingIndex - 1]); | ||
| 570 | - } else { | ||
| 571 | - this.classDetail(this.classList[this.archivingIndex]); | ||
| 572 | - } | ||
| 573 | - this._QueryArchivedNum(); | ||
| 574 | - this._QueryData(3); | 493 | + this.loadingClassLogs = false; |
| 494 | + if (status == 0) { | ||
| 495 | + this.formClassTrack.studentName = obj.studentName; | ||
| 496 | + this.formClassTrack.classList = (data.list && [...data.list]) || []; | ||
| 575 | } else { | 497 | } else { |
| 576 | this.$message.error(info); | 498 | this.$message.error(info); |
| 577 | } | 499 | } |
| 578 | }, | 500 | }, |
| 579 | - async removeStu(obj, index) { | 501 | + async removeStu(obj, index, $event) { |
| 580 | const { data, status, info } = await this.$request.delStudent({ | 502 | const { data, status, info } = await this.$request.delStudent({ |
| 581 | studentId: obj.id, | 503 | studentId: obj.id, |
| 582 | }); | 504 | }); |
| @@ -589,28 +511,33 @@ export default { | @@ -589,28 +511,33 @@ export default { | ||
| 589 | } | 511 | } |
| 590 | }, | 512 | }, |
| 591 | async changeGrade(val) { | 513 | async changeGrade(val) { |
| 514 | + if (!val) return; | ||
| 592 | this.query.classId = ""; | 515 | this.query.classId = ""; |
| 516 | + this.query.studentName = ""; | ||
| 517 | + this.query.studentCode = ""; | ||
| 593 | await this._QueryClass(val); | 518 | await this._QueryClass(val); |
| 594 | this._QueryData(3); | 519 | this._QueryData(3); |
| 595 | }, | 520 | }, |
| 596 | - async _QueryArchivedNum() { | ||
| 597 | - const { data, status, info } = await this.$request.archivingClassList(); | ||
| 598 | - if (status === 0) { | ||
| 599 | - this.archivedTotal = data?.count || 0; | ||
| 600 | - } else { | ||
| 601 | - this.$message.error(info); | ||
| 602 | - } | ||
| 603 | - }, | ||
| 604 | async _QueryData(type) { | 521 | async _QueryData(type) { |
| 605 | let query = {}; | 522 | let query = {}; |
| 606 | if (type == 1) { | 523 | if (type == 1) { |
| 524 | + if (!this.query.studentName) { | ||
| 525 | + this.$message.warning("输入学生姓名~"); | ||
| 526 | + return; | ||
| 527 | + } | ||
| 607 | this.query.classId = ""; | 528 | this.query.classId = ""; |
| 608 | query.studentName = this.query.studentName; | 529 | query.studentName = this.query.studentName; |
| 609 | this.query.studentCode = ""; | 530 | this.query.studentCode = ""; |
| 531 | + this.query.gradeName = ""; | ||
| 610 | } else if (type == 2) { | 532 | } else if (type == 2) { |
| 533 | + if (!this.query.studentName) { | ||
| 534 | + this.$message.warning("输入学生学号~"); | ||
| 535 | + return; | ||
| 536 | + } | ||
| 611 | this.query.classId = ""; | 537 | this.query.classId = ""; |
| 612 | query.studentCode = this.query.studentCode; | 538 | query.studentCode = this.query.studentCode; |
| 613 | this.query.studentName = ""; | 539 | this.query.studentName = ""; |
| 540 | + this.query.gradeName = ""; | ||
| 614 | } else if (type == 3) { | 541 | } else if (type == 3) { |
| 615 | this.query.studentName = ""; | 542 | this.query.studentName = ""; |
| 616 | this.query.studentCode = ""; | 543 | this.query.studentCode = ""; |
| @@ -619,6 +546,15 @@ export default { | @@ -619,6 +546,15 @@ export default { | ||
| 619 | } else { | 546 | } else { |
| 620 | query = this.query; | 547 | query = this.query; |
| 621 | } | 548 | } |
| 549 | + if (query.gradeName == 80) { | ||
| 550 | + query.status = 1; | ||
| 551 | + delete query.gradeName; | ||
| 552 | + } else if (query.gradeName == 81) { | ||
| 553 | + query.status = 2; | ||
| 554 | + delete query.gradeName; | ||
| 555 | + } else { | ||
| 556 | + query.status = 0; | ||
| 557 | + } | ||
| 622 | this.loading = true; | 558 | this.loading = true; |
| 623 | const { data, status, info } = await this.$request.studentList({ | 559 | const { data, status, info } = await this.$request.studentList({ |
| 624 | ...query, | 560 | ...query, |
| @@ -702,6 +638,7 @@ export default { | @@ -702,6 +638,7 @@ export default { | ||
| 702 | padding-top: 10px; | 638 | padding-top: 10px; |
| 703 | } | 639 | } |
| 704 | .stu-list { | 640 | .stu-list { |
| 641 | + min-width: 200px; | ||
| 705 | max-height: 80vh; | 642 | max-height: 80vh; |
| 706 | .h-title { | 643 | .h-title { |
| 707 | height: 40px; | 644 | height: 40px; |
| @@ -766,18 +703,26 @@ export default { | @@ -766,18 +703,26 @@ export default { | ||
| 766 | .stu-detail { | 703 | .stu-detail { |
| 767 | flex: 1; | 704 | flex: 1; |
| 768 | border-left: 0.5px solid #eee; | 705 | border-left: 0.5px solid #eee; |
| 706 | + .total { | ||
| 707 | + padding: 15px 12px; | ||
| 708 | + font-size: 14px; | ||
| 709 | + color: #666; | ||
| 710 | + } | ||
| 769 | .s-ul { | 711 | .s-ul { |
| 770 | display: flex; | 712 | display: flex; |
| 771 | flex-wrap: wrap; | 713 | flex-wrap: wrap; |
| 772 | padding-left: 20px; | 714 | padding-left: 20px; |
| 773 | .s-li { | 715 | .s-li { |
| 774 | - width: 180px; | ||
| 775 | - min-height: 120px; | 716 | + position: relative; |
| 776 | box-shadow: 2px 2px 5px #7f7f7f; | 717 | box-shadow: 2px 2px 5px #7f7f7f; |
| 777 | - border-radius: 10px; | ||
| 778 | margin: 0 20px 20px 0; | 718 | margin: 0 20px 20px 0; |
| 779 | - padding: 0 12px 5px; | ||
| 780 | - position: relative; | 719 | + .s-li-box { |
| 720 | + width: 180px; | ||
| 721 | + border-radius: 10px; | ||
| 722 | + min-height: 120px; | ||
| 723 | + padding: 0 12px 5px; | ||
| 724 | + cursor: pointer; | ||
| 725 | + } | ||
| 781 | .el-icon-user-solid { | 726 | .el-icon-user-solid { |
| 782 | position: absolute; | 727 | position: absolute; |
| 783 | top: 8px; | 728 | top: 8px; |