Commit bb4c8454eb478e4af572f1594ef17555390bedee

Authored by 阿宝
1 parent 42056450

添加,修改教师

src/utils/index.js
@@ -678,3 +678,34 @@ export function formatClass(data) { @@ -678,3 +678,34 @@ export function formatClass(data) {
678 console.log(sectionNameArr); 678 console.log(sectionNameArr);
679 return sectionNameArr; 679 return sectionNameArr;
680 } 680 }
  681 +export function formatGradeClass(data) {
  682 + let gradeName = [];
  683 + let gradeNameArr = [];
  684 + data.map((item) => {
  685 + if (!gradeName.includes(item.gradeName)) {
  686 + gradeName.push(item.gradeName);
  687 + gradeNameArr.push({
  688 + value: item.grade,
  689 + label: item.gradeName,
  690 + children: [
  691 + {
  692 + value: item.classCode,
  693 + label: item.className,
  694 + },
  695 + ],
  696 + });
  697 + } else {
  698 + let gradeIndex = 0;
  699 + gradeNameArr.map((items, index) => {
  700 + if (items.value == item.grade) {
  701 + gradeIndex = index;
  702 + }
  703 + });
  704 + gradeNameArr[gradeIndex].children.push({
  705 + value: item.classCode,
  706 + label: item.className,
  707 + });
  708 + }
  709 + });
  710 + return gradeNameArr;
  711 +}
src/views/index/mainIndex.vue
@@ -5,21 +5,33 @@ @@ -5,21 +5,33 @@
5 <img class="icon" src="../../assets/nav/setUpAccount.png" alt="" /> 5 <img class="icon" src="../../assets/nav/setUpAccount.png" alt="" />
6 <div class="text"> 6 <div class="text">
7 <p class="p1">账号管理</p> 7 <p class="p1">账号管理</p>
8 - <p class="p2">管理{{schoolInfo.teacherCourseCount}}个任课教师,{{schoolInfo.classManagerCount}}个班主任,{{schoolInfo.teacherGradeCount}}个备课组长账号信息。</p> 8 + <p class="p2">
  9 + 管理{{ schoolInfo.teacherCourseCount }}个任课教师,{{
  10 + schoolInfo.classManagerCount
  11 + }}个班主任,{{ schoolInfo.teacherGradeCount }}个备课组长账号信息。
  12 + </p>
9 </div> 13 </div>
10 </li> 14 </li>
11 <li class="nav-item item1" @click="links('/setUpSchool')"> 15 <li class="nav-item item1" @click="links('/setUpSchool')">
12 <img class="icon" src="../../assets/nav/setUpSchool.png" alt="" /> 16 <img class="icon" src="../../assets/nav/setUpSchool.png" alt="" />
13 <div class="text"> 17 <div class="text">
14 <p class="p1">学校管理</p> 18 <p class="p1">学校管理</p>
15 - <p class="p2">管理{{schoolInfo.gradeCount}}个年级,{{schoolInfo.classCount}}个班级,{{schoolInfo.studentCount}}名学生信息。</p> 19 + <p class="p2">
  20 + 管理{{ schoolInfo.gradeCount }}个年级,{{
  21 + schoolInfo.classCount
  22 + }}个班级,{{ schoolInfo.studentCount }}名学生信息。
  23 + </p>
16 </div> 24 </div>
17 </li> 25 </li>
18 <li class="nav-item item2" @click="links('/device')"> 26 <li class="nav-item item2" @click="links('/device')">
19 <img class="icon" src="../../assets/nav/device.png" alt="" /> 27 <img class="icon" src="../../assets/nav/device.png" alt="" />
20 <div class="text"> 28 <div class="text">
21 <p class="p1">设备状态</p> 29 <p class="p1">设备状态</p>
22 - <p class="p2">管理{{schoolInfo.stationCount}}个基站,{{schoolInfo.keyboardCount}}套答题器设备。</p> 30 + <p class="p2">
  31 + 管理{{ schoolInfo.stationCount }}个基站,{{
  32 + schoolInfo.keyboardCount
  33 + }}套答题器设备。
  34 + </p>
23 </div> 35 </div>
24 </li> 36 </li>
25 <li class="item3"> 37 <li class="item3">
@@ -44,8 +56,13 @@ @@ -44,8 +56,13 @@
44 </ul> 56 </ul>
45 <ul class="nav-list" v-if="type == 'ROLE_JITUAN'"> 57 <ul class="nav-list" v-if="type == 'ROLE_JITUAN'">
46 <template v-for="item in navList"> 58 <template v-for="item in navList">
47 - <li v-if="!item.path.includes('dataSync')" :key="item.path" class="nav-item item4" @click="links(item.path)">  
48 - <img class="icon" :src="getImgs(item.path)" alt="" /> 59 + <li
  60 + v-if="!item.path.includes('dataSync')"
  61 + :key="item.path"
  62 + class="nav-item item4"
  63 + @click="links(item.path)"
  64 + >
  65 + <img class="icon" :src="getImgs(item.path)" alt="" />
49 <div class="text" v-if="item.path == '/setUpConglomerate'"> 66 <div class="text" v-if="item.path == '/setUpConglomerate'">
50 <p class="p1">学校管理</p> 67 <p class="p1">学校管理</p>
51 <p class="p2">管理3个区域,14个学校。</p> 68 <p class="p2">管理3个区域,14个学校。</p>
@@ -62,30 +79,40 @@ @@ -62,30 +79,40 @@
62 <p class="p1">使用分析</p> 79 <p class="p1">使用分析</p>
63 <p class="p2">按软件功能、题型统计使用频率。</p> 80 <p class="p2">按软件功能、题型统计使用频率。</p>
64 </div> 81 </div>
65 - </li> 82 + </li>
66 </template> 83 </template>
67 </ul> 84 </ul>
68 - <ul class="nav-list" v-if="type == 'ROLE_JIAOSHI' || type == 'ROLE_BANZHUREN' ">  
69 - <template v-for="(item) in navList">  
70 - <li v-if="!item.path.includes('dataSync')" :key="item.path" class="nav-item item4" @click="links(item.path)">  
71 - <img class="icon" :src="getImgs(item.path)" alt="" /> 85 + <ul
  86 + class="nav-list"
  87 + v-if="type == 'ROLE_JIAOSHI' || type == 'ROLE_BANZHUREN'"
  88 + >
  89 + <template v-for="item in navList">
  90 + <li
  91 + v-if="!item.path.includes('dataSync')"
  92 + :key="item.path"
  93 + class="nav-item item4"
  94 + @click="links(item.path)"
  95 + >
  96 + <img class="icon" :src="getImgs(item.path)" alt="" />
72 <div class="text" v-if="item.path == '/examinationPaper'"> 97 <div class="text" v-if="item.path == '/examinationPaper'">
73 <p class="p1">备题组卷</p> 98 <p class="p1">备题组卷</p>
74 - <p class="p2">管理{{schoolInfo.paperCount}}套答题卡。</p> 99 + <p class="p2">管理{{ schoolInfo.paperCount }}套答题卡。</p>
75 </div> 100 </div>
76 <div class="text" v-else-if="item.path == '/portrait'"> 101 <div class="text" v-else-if="item.path == '/portrait'">
77 <p class="p1">学生画像</p> 102 <p class="p1">学生画像</p>
78 - <p class="p2">共分析{{schoolInfo.imagesCount}}名学生成绩。</p> 103 + <p class="p2">共分析{{ schoolInfo.imagesCount }}名学生成绩。</p>
79 </div> 104 </div>
80 <div class="text" v-else-if="item.path == '/ask'"> 105 <div class="text" v-else-if="item.path == '/ask'">
81 <p class="p1">随堂问报表</p> 106 <p class="p1">随堂问报表</p>
82 - <p class="p2">对{{schoolInfo.classPeriodCount}}套随堂问答题记录分析。</p> 107 + <p class="p2">
  108 + 对{{ schoolInfo.classPeriodCount }}套随堂问答题记录分析。
  109 + </p>
83 </div> 110 </div>
84 <div class="text" v-else-if="item.path == '/test'"> 111 <div class="text" v-else-if="item.path == '/test'">
85 <p class="p1">即时测报表</p> 112 <p class="p1">即时测报表</p>
86 - <p class="p2">对{{schoolInfo.examCount}}套即时测答题记录分析。</p> 113 + <p class="p2">对{{ schoolInfo.examCount }}套即时测答题记录分析。</p>
87 </div> 114 </div>
88 - </li> 115 + </li>
89 </template> 116 </template>
90 </ul> 117 </ul>
91 </div> 118 </div>
@@ -98,31 +125,49 @@ export default { @@ -98,31 +125,49 @@ export default {
98 return { 125 return {
99 type: "", 126 type: "",
100 navList: [], 127 navList: [],
101 - schoolInfo:{} 128 + schoolInfo: {},
102 }; 129 };
103 }, 130 },
104 - watch:{  
105 - "$store.getters.info.showRoleName":function(val){  
106 - window.location.reload()  
107 - } 131 + watch: {
  132 + "$store.getters.info.showRoleName": function (val) {
  133 + let type = "";
  134 + this.$store.getters.info.permissions.map((item) => {
  135 + if (item.roleName == val) {
  136 + type = item.role;
  137 + }
  138 + });
  139 + this.type = type ? type : this.$store.getters.info.permissions[0].role;
  140 + this.navList = this.$store.getters.addRouters.map((item) => {
  141 + return {
  142 + name: item.name,
  143 + path: item.children[0].path,
  144 + };
  145 + });
  146 + },
108 }, 147 },
109 created() { 148 created() {
110 - this.type = this.$store.getters.info.permissions[0].role  
111 - this.navList = this.$store.getters.addRouters.map(item=>{  
112 - return {  
113 - name:item.name,  
114 - path:item.children[0].path, 149 + let type = "";
  150 + this.$store.getters.info.permissions.map((item) => {
  151 + if (item.roleName == this.$store.getters.info.showRoleName) {
  152 + type = item.role;
115 } 153 }
116 - })  
117 - if(this.type == "ROLE_XUEXIAO"){  
118 - this.schoolIndex()  
119 - }else if(this.type == "ROLE_JIAOSHI" || this.type == "ROLE_BANZHUREN"){  
120 - this.teacherIndex() 154 + });
  155 + this.type = type ? type : this.$store.getters.info.permissions[0].role;
  156 + this.navList = this.$store.getters.addRouters.map((item) => {
  157 + return {
  158 + name: item.name,
  159 + path: item.children[0].path,
  160 + };
  161 + });
  162 + if (this.type == "ROLE_XUEXIAO") {
  163 + this.schoolIndex();
  164 + } else if (this.type == "ROLE_JIAOSHI" || this.type == "ROLE_BANZHUREN") {
  165 + this.teacherIndex();
121 } 166 }
122 }, 167 },
123 methods: { 168 methods: {
124 getImgs(path) { 169 getImgs(path) {
125 - return require(`@/assets/nav${path}.png`) 170 + return require(`@/assets/nav${path}.png`);
126 }, 171 },
127 links(path) { 172 links(path) {
128 this.$router.push({ 173 this.$router.push({
src/views/login/index.vue
@@ -90,12 +90,12 @@ export default { @@ -90,12 +90,12 @@ export default {
90 disableClick: true, 90 disableClick: true,
91 passwordType: "password", 91 passwordType: "password",
92 loginForm: { 92 loginForm: {
93 - // username: "13610050254",  
94 - // password: "Pw050254#", 93 + username: "13610050254",
  94 + password: "Pw050254#",
95 // username: "18946034886", 95 // username: "18946034886",
96 // password: "Pw034886#", 96 // password: "Pw034886#",
97 - username: "18332123505",  
98 - password: "Pw123505#", 97 + // username: "18332123505",
  98 + // password: "Pw123505#",
99 }, 99 },
100 loginRules: { 100 loginRules: {
101 username: [ 101 username: [
src/views/setUp/account.vue
@@ -9,9 +9,9 @@ @@ -9,9 +9,9 @@
9 <div class="sel-box"> 9 <div class="sel-box">
10 <el-select 10 <el-select
11 class="sel" 11 class="sel"
12 - v-model="query.id" 12 + v-model="query.roleId"
13 placeholder="选择账号角色" 13 placeholder="选择账号角色"
14 - @change="(page = 1),_QueryData(1)" 14 + @change="(page = 1), _QueryData(1)"
15 > 15 >
16 <el-option 16 <el-option
17 v-for="item in roleList" 17 v-for="item in roleList"
@@ -25,34 +25,33 @@ @@ -25,34 +25,33 @@
25 class="sel" 25 class="sel"
26 v-model="query.available" 26 v-model="query.available"
27 placeholder="选择账号状态" 27 placeholder="选择账号状态"
28 - @change="(page = 1),_QueryData(1)" 28 + @change="(page = 1), _QueryData(1)"
29 > 29 >
30 - <el-option label="可用" :value="0"></el-option>  
31 - <el-option label="不可用" :value="1"></el-option> 30 + <el-option label="正常" :value="0"></el-option>
  31 + <el-option label="禁用" :value="1"></el-option>
32 </el-select> 32 </el-select>
33 <el-input 33 <el-input
34 - type="number"  
35 placeholder="请输入老师账号" 34 placeholder="请输入老师账号"
36 v-model="query.loginName" 35 v-model="query.loginName"
37 class="input-with-select" 36 class="input-with-select"
38 - @keyup.enter.native="(page = 1),_QueryData(2)" 37 + @keyup.enter.native="(page = 1), _QueryData(2)"
39 > 38 >
40 <el-button 39 <el-button
41 slot="append" 40 slot="append"
42 icon="el-icon-search" 41 icon="el-icon-search"
43 - @click="(page = 1),_QueryData(2)" 42 + @click="(page = 1), _QueryData(2)"
44 ></el-button> 43 ></el-button>
45 </el-input> 44 </el-input>
46 <el-input 45 <el-input
47 placeholder="请输入老师姓名" 46 placeholder="请输入老师姓名"
48 v-model="query.realName" 47 v-model="query.realName"
49 class="input-with-select" 48 class="input-with-select"
50 - @keyup.enter.native="(page = 1),_QueryData(3)" 49 + @keyup.enter.native="(page = 1), _QueryData(3)"
51 > 50 >
52 <el-button 51 <el-button
53 slot="append" 52 slot="append"
54 icon="el-icon-search" 53 icon="el-icon-search"
55 - @click="(page = 1),_QueryData(3)" 54 + @click="(page = 1), _QueryData(3)"
56 ></el-button> 55 ></el-button>
57 </el-input> 56 </el-input>
58 </div> 57 </div>
@@ -117,7 +116,9 @@ @@ -117,7 +116,9 @@
117 ></el-button> 116 ></el-button>
118 <el-dropdown-menu slot="dropdown"> 117 <el-dropdown-menu slot="dropdown">
119 <el-dropdown-item :command="0">重置密码</el-dropdown-item> 118 <el-dropdown-item :command="0">重置密码</el-dropdown-item>
120 - <el-dropdown-item :command="1">禁用</el-dropdown-item> 119 + <el-dropdown-item :command="1">{{
  120 + `${scoped.row.available == 0 ? "禁用" : "启用"}`
  121 + }}</el-dropdown-item>
121 <el-dropdown-item :command="2">删除</el-dropdown-item> 122 <el-dropdown-item :command="2">删除</el-dropdown-item>
122 </el-dropdown-menu> 123 </el-dropdown-menu>
123 </el-dropdown> 124 </el-dropdown>
@@ -224,7 +225,18 @@ export default { @@ -224,7 +225,18 @@ export default {
224 }, 225 },
225 handleDropdownClick(value, item) { 226 handleDropdownClick(value, item) {
226 //更多 227 //更多
227 - this.updateUser(item, value); 228 + if (value == 2) {
  229 + this.$confirm("确定要删除这条账号信息吗?", "提示", {
  230 + customClass: "del-model",
  231 + cancelButttonText: "取消",
  232 + confirmButtonText: "确定",
  233 + type: "warning",
  234 + }).then(() => {
  235 + this.updateUser(item, value);
  236 + });
  237 + } else {
  238 + this.updateUser(item, value);
  239 + }
228 }, 240 },
229 changePage(page) { 241 changePage(page) {
230 this.page = page; 242 this.page = page;
@@ -314,8 +326,17 @@ export default { @@ -314,8 +326,17 @@ export default {
314 }, 326 },
315 }; 327 };
316 </script> 328 </script>
317 - 329 +<style lang="scss">
  330 +.del-model {
  331 + .el-message-box__btns button:nth-child(1) {
  332 + color: #667ffd;
  333 + }
  334 +}
  335 +</style>
318 <style lang="scss" scoped> 336 <style lang="scss" scoped>
  337 +.el-message-box .el-button--default {
  338 + color: red;
  339 +}
319 .set-count { 340 .set-count {
320 margin-right: 12px; 341 margin-right: 12px;
321 } 342 }
src/views/setUp/school.vue
@@ -359,7 +359,6 @@ export default { @@ -359,7 +359,6 @@ export default {
359 }, 359 },
360 async _QuerySubject() { 360 async _QuerySubject() {
361 const { data, status, info } = await this.$request.subjectList(); 361 const { data, status, info } = await this.$request.subjectList();
362 - console.log(status);  
363 if (status === 0) { 362 if (status === 0) {
364 this.subjectList = [...data.subjectNames] || []; 363 this.subjectList = [...data.subjectNames] || [];
365 } else { 364 } else {
src/views/setUp/student.vue
@@ -80,7 +80,12 @@ @@ -80,7 +80,12 @@
80 </div> 80 </div>
81 <ul class="s-ul" v-loading="loading"> 81 <ul class="s-ul" v-loading="loading">
82 <li class="s-li" v-for="(item,index) in studentList" :key="item.id"> 82 <li class="s-li" v-for="(item,index) in studentList" :key="item.id">
83 - <i class="el-icon-delete" @click="removeStu(item,index)"></i> 83 + <el-popconfirm
  84 + title="确定删除吗?"
  85 + @confirm="removeStu(item,index)"
  86 + >
  87 + <i class="el-icon-delete" slot="reference"></i>
  88 + </el-popconfirm>
84 <p class="name">{{ item.studentName }}</p> 89 <p class="name">{{ item.studentName }}</p>
85 <p class="p1"> 90 <p class="p1">
86 答题器:{{ 91 答题器:{{
src/views/setUp/teacher.vue
@@ -22,6 +22,7 @@ @@ -22,6 +22,7 @@
22 size="mini" 22 size="mini"
23 plain 23 plain
24 circle 24 circle
  25 + @click="addTeacherDia"
25 ></el-button> 26 ></el-button>
26 </el-tooltip> 27 </el-tooltip>
27 </template> 28 </template>
@@ -93,7 +94,7 @@ @@ -93,7 +94,7 @@
93 </div> 94 </div>
94 <div class="teacher-detail"> 95 <div class="teacher-detail">
95 <div class="icon-box"> 96 <div class="icon-box">
96 - <i class="icon el-icon-edit-outline"></i> 97 + <i class="icon el-icon-edit-outline" @click="editTeacher"></i>
97 <i class="icon el-icon-circle-plus-outline"></i> 98 <i class="icon el-icon-circle-plus-outline"></i>
98 </div> 99 </div>
99 <div class="detail-top"> 100 <div class="detail-top">
@@ -122,7 +123,9 @@ @@ -122,7 +123,9 @@
122 v-for="item in teacherDetail.managerList" 123 v-for="item in teacherDetail.managerList"
123 :key="item.classId" 124 :key="item.classId"
124 > 125 >
125 - <i class="el-icon-delete"></i> 126 + <el-popconfirm title="确定删除吗?" confirm="">
  127 + <i class="el-icon-delete" slot="reference"></i>
  128 + </el-popconfirm>
126 <div class="grade-item"> 129 <div class="grade-item">
127 <p class="grade-name">{{ item.className }}</p> 130 <p class="grade-name">{{ item.className }}</p>
128 <div class="grade-class"> 131 <div class="grade-class">
@@ -150,7 +153,9 @@ @@ -150,7 +153,9 @@
150 v-for="item in teacherDetail.teacherCourseList" 153 v-for="item in teacherDetail.teacherCourseList"
151 :key="item.classId" 154 :key="item.classId"
152 > 155 >
153 - <i class="el-icon-delete"></i> 156 + <el-popconfirm title="确定删除吗?" confirm="">
  157 + <i class="el-icon-delete" slot="reference"></i>
  158 + </el-popconfirm>
154 <div class="grade-item"> 159 <div class="grade-item">
155 <p class="grade-name"> 160 <p class="grade-name">
156 {{ item.className }}({{ item.subjectName }}) 161 {{ item.className }}({{ item.subjectName }})
@@ -180,7 +185,9 @@ @@ -180,7 +185,9 @@
180 :key="item.grade" 185 :key="item.grade"
181 > 186 >
182 <li class="grade-li"> 187 <li class="grade-li">
183 - <i class="el-icon-delete"></i> 188 + <el-popconfirm title="确定删除吗?" confirm="">
  189 + <i class="el-icon-delete" slot="reference"></i>
  190 + </el-popconfirm>
184 <div class="grade-item"> 191 <div class="grade-item">
185 <p class="grade-name"> 192 <p class="grade-name">
186 {{ item.gradeName }}({{ item.subjectName }}) 193 {{ item.gradeName }}({{ item.subjectName }})
@@ -192,7 +199,7 @@ @@ -192,7 +199,7 @@
192 </div> 199 </div>
193 </div> 200 </div>
194 </div> 201 </div>
195 - <el-dialog title="导入教师名单" :visible.sync="diaUp" width="400"> 202 + <el-dialog title="导入教师名单" :visible.sync="diaUp" width="600">
196 <up-load id="downTeacher" :url="url" fileName="教师名单"> 203 <up-load id="downTeacher" :url="url" fileName="教师名单">
197 <p class="down-txt" slot="down"> 204 <p class="down-txt" slot="down">
198 通过Excel名单导入教师名单,点击 205 通过Excel名单导入教师名单,点击
@@ -203,16 +210,17 @@ @@ -203,16 +210,17 @@
203 <el-button @click="diaUp = false">取 消</el-button> 210 <el-button @click="diaUp = false">取 消</el-button>
204 </div> 211 </div>
205 </el-dialog> 212 </el-dialog>
206 - <el-dialog title="添加学生" :visible.sync="diaTeacher" width="400"> 213 + <el-dialog title="添加教师" :visible.sync="diaTeacher" width="400">
207 <el-form 214 <el-form
208 class="form-box" 215 class="form-box"
  216 + ref="formTeacher"
209 :model="formTeacher" 217 :model="formTeacher"
210 :rules="rulesTeacher" 218 :rules="rulesTeacher"
211 label-width="160px" 219 label-width="160px"
212 > 220 >
213 <el-form-item label="手机号码:" prop="loginName"> 221 <el-form-item label="手机号码:" prop="loginName">
214 <el-col :span="10"> 222 <el-col :span="10">
215 - <el-input maxlength="30" v-model.trim="formTeacher.loginName" /> 223 + <el-input maxlength="11" v-model.trim="formTeacher.loginName" />
216 </el-col> 224 </el-col>
217 </el-form-item> 225 </el-form-item>
218 <el-form-item label="教师姓名:" prop="teacherName"> 226 <el-form-item label="教师姓名:" prop="teacherName">
@@ -220,14 +228,67 @@ @@ -220,14 +228,67 @@
220 <el-input maxlength="30" v-model.trim="formTeacher.teacherName" /> 228 <el-input maxlength="30" v-model.trim="formTeacher.teacherName" />
221 </el-col> 229 </el-col>
222 </el-form-item> 230 </el-form-item>
223 - <el-form-item label="性别:"> 231 + <el-form-item label="性别:" prop="sex">
224 <el-radio-group v-model="formTeacher.sex"> 232 <el-radio-group v-model="formTeacher.sex">
225 <el-radio :label="1">男</el-radio> 233 <el-radio :label="1">男</el-radio>
226 <el-radio :label="2">女</el-radio> 234 <el-radio :label="2">女</el-radio>
227 </el-radio-group> 235 </el-radio-group>
228 </el-form-item> 236 </el-form-item>
229 - <el-form-item label="教师角色:">  
230 - 237 + <el-form-item label="教师角色:" prop="roleList">
  238 + <div
  239 + class="role-list"
  240 + v-for="(item, index) in formTeacher.roleList"
  241 + :key="item.id"
  242 + >
  243 + <el-select
  244 + class="sel-c"
  245 + v-model="item.roleId"
  246 + placeholder="选择角色"
  247 + @change="item.classId = []"
  248 + >
  249 + <el-option
  250 + v-for="item in teacherTypeList"
  251 + :key="item.value"
  252 + :label="item.label"
  253 + :value="item.value"
  254 + >
  255 + </el-option>
  256 + </el-select>
  257 + <el-cascader
  258 + v-if="item.roleId == 6"
  259 + class="sel-t"
  260 + collapse
  261 + clearable
  262 + placeholder="选择班级"
  263 + v-model="item.classId"
  264 + :options="gradeClassList"
  265 + :props="{ expandTrigger: 'hover' }"
  266 + ></el-cascader>
  267 + <el-cascader
  268 + v-if="item.roleId == 7"
  269 + class="sel-t"
  270 + collapse
  271 + clearable
  272 + placeholder="选择班级-科目"
  273 + v-model="item.classId"
  274 + :options="classList"
  275 + :props="{ expandTrigger: 'hover' }"
  276 + ></el-cascader>
  277 + <el-cascader
  278 + v-if="item.roleId == 8"
  279 + class="sel-t"
  280 + collapse
  281 + clearable
  282 + placeholder="选择年级-科目"
  283 + v-model="item.classId"
  284 + :options="gradeSubList"
  285 + :props="{ expandTrigger: 'hover' }"
  286 + ></el-cascader>
  287 + <i class="el-icon-close" @click="removeRoleList(index)"></i>
  288 + </div>
  289 + <p class="add-box">
  290 + <el-button icon="el-icon-plus" @click="addRoleList">添加</el-button>
  291 + </p>
231 </el-form-item> 292 </el-form-item>
232 </el-form> 293 </el-form>
233 <div class="dialog-footer" slot="footer"> 294 <div class="dialog-footer" slot="footer">
@@ -239,21 +300,40 @@ @@ -239,21 +300,40 @@
239 </template> 300 </template>
240 301
241 <script> 302 <script>
242 -import { downloadFile } from "@/utils"; 303 +import { downloadFile, formatGradeClass, randomWord } from "@/utils";
243 export default { 304 export default {
244 data() { 305 data() {
245 return { 306 return {
246 loading: false, 307 loading: false,
247 url: "", 308 url: "",
248 diaUp: false, 309 diaUp: false,
249 - diaTeacher:false, 310 + diaTeacher: false,
  311 + isAdd: false,
250 query: { 312 query: {
251 gradeName: "", 313 gradeName: "",
252 teacherName: "", 314 teacherName: "",
253 phone: "", 315 phone: "",
254 }, 316 },
  317 + subjectList: [],
255 gradeList: [], 318 gradeList: [],
  319 + classList: [],
  320 + gradeClassList: [],
  321 + gradeSubList: [],
256 teacherList: [], 322 teacherList: [],
  323 + teacherTypeList: [
  324 + {
  325 + value: 6,
  326 + label: "班主任",
  327 + },
  328 + {
  329 + value: 7,
  330 + label: "任课老师",
  331 + },
  332 + {
  333 + value: 8,
  334 + label: "备课组长",
  335 + },
  336 + ],
257 teacherDetail: { 337 teacherDetail: {
258 teacherName: "", 338 teacherName: "",
259 loginName: "", 339 loginName: "",
@@ -264,21 +344,60 @@ export default { @@ -264,21 +344,60 @@ export default {
264 teacherGradeList: [], 344 teacherGradeList: [],
265 }, 345 },
266 showTId: "", //显示详情 教师ID 346 showTId: "", //显示详情 教师ID
267 - formTeacher:{  
268 - teacherName:"",  
269 - loginName:"",  
270 - sex:1,  
271 - managerList:[] 347 + roleList: [],
  348 + formTeacher: {
  349 + teacherName: "",
  350 + loginName: "",
  351 + sex: 1,
  352 + roleList: [],
  353 + },
  354 + rulesTeacher: {
  355 + teacherName: [
  356 + { required: true, message: "请输入联系电话", trigger: "blur" },
  357 + ],
  358 + loginName: [
  359 + { required: true, message: "请输入教师姓名", trigger: "blur" },
  360 + ],
  361 + sex: [{ required: true, message: "请选择性别", trigger: "blur" }],
  362 + roleList: [
  363 + { required: true, message: "请选择角色信息", trigger: "blur" },
  364 + ],
272 }, 365 },
273 - rulesTeacher:{},  
274 }; 366 };
275 }, 367 },
276 async created() { 368 async created() {
277 await this._QueryDataGrade(); 369 await this._QueryDataGrade();
278 this._QueryData(1); 370 this._QueryData(1);
  371 + this._RoleList();
  372 + await this._QuerySubject();
  373 + await this._QueryClass();
279 }, 374 },
280 methods: { 375 methods: {
  376 + addRoleList() {
  377 + //添加教师角色
  378 + this.formTeacher.roleList.push({
  379 + id: randomWord(true, 16, 20),
  380 + roleId: "",
  381 + classId: [],
  382 + });
  383 + },
  384 + removeRoleList(index) {
  385 + //删除教师角色
  386 + this.formTeacher.roleList.splice(index, 1);
  387 + },
  388 + addTeacherDia() {
  389 + //添加教师弹窗
  390 + this.isAdd = true;
  391 + this.formTeacher = {
  392 + teacherName: "",
  393 + loginName: "",
  394 + sex: 1,
  395 + managerList: [],
  396 + };
  397 + this.diaTeacher = true;
  398 + },
281 setClass(obj) { 399 setClass(obj) {
  400 + //教师角色数量
282 return ( 401 return (
283 obj.managerList?.length + 402 obj.managerList?.length +
284 obj.teacherCourseList?.length + 403 obj.teacherCourseList?.length +
@@ -286,10 +405,161 @@ export default { @@ -286,10 +405,161 @@ export default {
286 ); 405 );
287 }, 406 },
288 showTeacher(obj) { 407 showTeacher(obj) {
  408 + //教师详细数据
289 this.showTId = obj.id; 409 this.showTId = obj.id;
290 this.teacherDetail = { ...obj }; 410 this.teacherDetail = { ...obj };
291 }, 411 },
292 - addTeacher(){}, 412 + editTeacher() {
  413 + this.isAdd = false;
  414 + for (let key in this.teacherDetail) {
  415 + if (key == "realName") {
  416 + this.formTeacher.teacherName = this.teacherDetail.realName;
  417 + } else {
  418 + this.formTeacher[key] = this.teacherDetail[key];
  419 + }
  420 + }
  421 + this.toTeacherForm();
  422 + this.diaTeacher = true;
  423 + },
  424 + addTeacher() {
  425 + //添加教师
  426 + this.$refs.formTeacher.validate(async (valid) => {
  427 + if (valid) {
  428 + let obj = this.setTeacharForm();
  429 + if (!obj) {
  430 + this.$message.error("教师角色数据有误请检查!");
  431 + return;
  432 + }
  433 + let res;
  434 + if (this.isAdd) {
  435 + res = await this.$request.addTeacher({
  436 + teacherName: this.formTeacher.teacherName,
  437 + loginName: this.formTeacher.loginName,
  438 + sex: this.formTeacher.sex,
  439 + ...obj,
  440 + });
  441 + } else {
  442 + res = await this.$request.updateTeacher({
  443 + teacherId: this.formTeacher.id,
  444 + teacherName: this.formTeacher.teacherName,
  445 + loginName: this.formTeacher.loginName,
  446 + sex: this.formTeacher.sex,
  447 + ...obj,
  448 + });
  449 + }
  450 + if (res.status === 0) {
  451 + this.$message.success(res.info);
  452 + this.diaTeacher = false;
  453 + this._QueryData(10);
  454 + } else {
  455 + this.$message.error(res.info);
  456 + }
  457 + } else {
  458 + console.log("输入有误请检查!");
  459 + return false;
  460 + }
  461 + });
  462 + },
  463 + setTeacharForm() {
  464 + //转换保存教师数据格式
  465 + let ERR_OK = true;
  466 + this.formTeacher.roleList.map((item) => {
  467 + if (item.classId.length == 0) {
  468 + ERR_OK = false;
  469 + }
  470 + });
  471 + if (ERR_OK) {
  472 + let [managerList, teacherCourseList, gradeGroupList] = [[], [], []];
  473 + this.formTeacher.roleList.map((item) => {
  474 + if (item.roleId == 6) {
  475 + managerList.push({
  476 + classId: item.classId[1],
  477 + className: this.classList.find(
  478 + (items) => items.value == item.classId[1]
  479 + ).label,
  480 + });
  481 + } else if (item.roleId == 7) {
  482 + teacherCourseList.push({
  483 + classId: item.classId[0],
  484 + className: this.classList.find(
  485 + (items) => items.value == item.classId[0]
  486 + ).label,
  487 + subjectName: item.classId[1],
  488 + });
  489 + } else {
  490 + gradeGroupList.push({
  491 + grade: item.classId[0],
  492 + gradeName: this.gradeList.find(
  493 + (items) => items.id == item.classId[0]
  494 + ).label,
  495 + subjectName: item.classId[1],
  496 + });
  497 + }
  498 + });
  499 + return {
  500 + managerList,
  501 + teacherCourseList,
  502 + gradeGroupList,
  503 + };
  504 + } else {
  505 + return false;
  506 + }
  507 + },
  508 + toTeacherForm() {
  509 + //教师角色数据转换为form格式数据
  510 + this.formTeacher.roleList = [];
  511 + this.formTeacher.managerList?.map((item) => {
  512 + console.log(
  513 + this.classList.find(
  514 + (items) =>
  515 + items.value == item.classId || items.label == item.className
  516 + )
  517 + );
  518 + this.formTeacher.roleList.push({
  519 + id: randomWord(true, 16, 20),
  520 + roleId: 6,
  521 + classId: [
  522 + this.classList.find(
  523 + (items) =>
  524 + items.value == item.classId || items.label == item.className
  525 + ).grade,
  526 + item.classId,
  527 + ],
  528 + });
  529 + });
  530 + this.formTeacher.teacherCourseList?.map((item) => {
  531 + this.formTeacher.roleList.push({
  532 + id: randomWord(true, 16, 20),
  533 + roleId: 7,
  534 + classId: [
  535 + this.classList.find(
  536 + (items) =>
  537 + items.value == item.classId || items.label == item.className
  538 + ).value,
  539 + item.subjectName,
  540 + ],
  541 + });
  542 + });
  543 + this.formTeacher.gradeGroupList?.map((item) => {
  544 + this.formTeacher.roleList.push({
  545 + id: randomWord(true, 16, 20),
  546 + roleId: 8,
  547 + classId: [
  548 + this.gradeList.find((items) => items.id == item.classId[0]).id,
  549 + item.subjectName,
  550 + ],
  551 + });
  552 + });
  553 + },
  554 + async _RoleList() {
  555 + //角色
  556 + const { data, status, info } = await this.$request.roleList();
  557 + if (status === 0) {
  558 + this.roleList = data.list || [];
  559 + } else {
  560 + this.$message.error(info);
  561 + }
  562 + },
293 async _QueryData(type) { 563 async _QueryData(type) {
294 let query = {}; 564 let query = {};
295 if (type == 1) { 565 if (type == 1) {
@@ -304,8 +574,11 @@ export default { @@ -304,8 +574,11 @@ export default {
304 query.phone = this.query.phone; 574 query.phone = this.query.phone;
305 this.query.teacherName = ""; 575 this.query.teacherName = "";
306 this.query.gradeName = ""; 576 this.query.gradeName = "";
  577 + } else if (type == 10) {
  578 + query = { ...this.query };
307 } 579 }
308 this.loading = true; 580 this.loading = true;
  581 + this.teacherList=[]
309 const { data, status, info } = await this.$request.teacherList({ 582 const { data, status, info } = await this.$request.teacherList({
310 ...query, 583 ...query,
311 }); 584 });
@@ -313,13 +586,22 @@ export default { @@ -313,13 +586,22 @@ export default {
313 console.log(status); 586 console.log(status);
314 if (status === 0) { 587 if (status === 0) {
315 this.teacherList = data.list || []; 588 this.teacherList = data.list || [];
316 - this.teacherDetail = { ...this.teacherList[0] };  
317 - this.showTId = this.teacherList[0]?.id; 589 + if (type == 10) {
  590 + let detailArr =
  591 + data.list.filter((item) => item.id == this.formTeacher.id) || [];
  592 + this.teacherDetail = (detailArr.length && detailArr[0]) || {
  593 + ...data.list[0],
  594 + };
  595 + } else {
  596 + this.teacherDetail = { ...this.teacherList[0] };
  597 + }
  598 + this.showTId = this.teacherDetail.id;
318 } else { 599 } else {
319 this.$message.error(info); 600 this.$message.error(info);
320 } 601 }
321 }, 602 },
322 async _QueryDataGrade() { 603 async _QueryDataGrade() {
  604 + //年级数据
323 const { data, status, info } = await this.$request.gradeList(); 605 const { data, status, info } = await this.$request.gradeList();
324 if (status === 0) { 606 if (status === 0) {
325 this.gradeList = 607 this.gradeList =
@@ -327,14 +609,60 @@ export default { @@ -327,14 +609,60 @@ export default {
327 return { 609 return {
328 value: item.gradeName, 610 value: item.gradeName,
329 label: item.gradeName, 611 label: item.gradeName,
  612 + id: item.grade,
330 }; 613 };
331 }) || []; 614 }) || [];
332 - console.log(this.gradeList); 615 +
333 this.query.gradeName = this.gradeList[0]?.value; 616 this.query.gradeName = this.gradeList[0]?.value;
334 } else { 617 } else {
335 this.$message.error(info); 618 this.$message.error(info);
336 } 619 }
337 }, 620 },
  621 + async _QuerySubject() {
  622 + //科目信息
  623 + const { data, status, info } = await this.$request.subjectList();
  624 + console.log(status);
  625 + if (status === 0) {
  626 + this.subjectList = [...data.subjectNames] || [];
  627 + this.gradeSubList = this.gradeList?.map((item) => {
  628 + return {
  629 + value: item.id,
  630 + label: item.label,
  631 + children: data.subjectNames.map((sub) => {
  632 + return {
  633 + value: sub,
  634 + label: sub,
  635 + };
  636 + }),
  637 + };
  638 + });
  639 + } else {
  640 + this.$message.error(info);
  641 + }
  642 + },
  643 + async _QueryClass() {
  644 + //班级数据
  645 + const { data, status, info } = await this.$request.schoolClassList();
  646 + if (status === 0) {
  647 + this.classList =
  648 + data.list.map((item) => {
  649 + return {
  650 + value: item.classCode,
  651 + label: item.className,
  652 + grade: item.grade,
  653 + children: this.subjectList.map((sub) => {
  654 + return {
  655 + value: sub,
  656 + label: sub,
  657 + };
  658 + }),
  659 + };
  660 + }) || [];
  661 + this.gradeClassList = formatGradeClass([...data.list]);
  662 + } else {
  663 + this.$message.error(info);
  664 + }
  665 + },
338 async downExcel() { 666 async downExcel() {
339 let data = await this.$request.downDevice({ 667 let data = await this.$request.downDevice({
340 id: this.id, 668 id: this.id,
@@ -476,4 +804,21 @@ export default { @@ -476,4 +804,21 @@ export default {
476 } 804 }
477 } 805 }
478 } 806 }
  807 +.add-box {
  808 + margin-top: 10px;
  809 +}
  810 +.sel-c {
  811 + width: 120px;
  812 + margin-right: 12px;
  813 +}
  814 +.role-list {
  815 + margin-bottom: 10px;
  816 + .el-icon-close {
  817 + padding: 5px;
  818 + cursor: pointer;
  819 + margin-left: 16px;
  820 + background: #ccc;
  821 + border-radius: 50%;
  822 + }
  823 +}
479 </style> 824 </style>
480 \ No newline at end of file 825 \ No newline at end of file