Commit 29319cfbd8e4f3a037a7a6c1bc3aba14d998d25c

Authored by 梁保满
1 parent 9865dde4

设备。教师管理

src/api/apis/apis.js
@@ -1630,4 +1630,25 @@ export default { @@ -1630,4 +1630,25 @@ export default {
1630 data 1630 data
1631 }); 1631 });
1632 }, 1632 },
  1633 + //删除基站
  1634 + deleteStation(data) {
  1635 + console.log(service({
  1636 + url: setUpUrls.deleteStation,
  1637 + method: "POST",
  1638 + data
  1639 + }))
  1640 + return service({
  1641 + url: setUpUrls.deleteStation,
  1642 + method: "POST",
  1643 + data
  1644 + });
  1645 + },
  1646 + //导出授课端日志
  1647 + downloadDeviceLog(data) {
  1648 + return service({
  1649 + url: setUpUrls.downloadDeviceLog,
  1650 + method: "POST",
  1651 + data
  1652 + });
  1653 + },
1633 }; 1654 };
src/api/axios.js
@@ -101,12 +101,13 @@ service.interceptors.response.use( @@ -101,12 +101,13 @@ service.interceptors.response.use(
101 } 101 }
102 return; 102 return;
103 } 103 }
104 - Message({  
105 - message: data.info || error,  
106 - type: "error",  
107 - duration: 3 * 1000,  
108 - });  
109 - return Promise.reject(error.response); // 返回接口返回的错误信息 104 +
  105 + return Promise.resolve(
  106 + {
  107 + status: status,
  108 + info: data.info || error,
  109 + }
  110 + ); // 返回接口返回的错误信息
110 } 111 }
111 ); 112 );
112 export default service; 113 export default service;
src/api/urls/apis.js
@@ -426,4 +426,8 @@ export default { @@ -426,4 +426,8 @@ export default {
426 paperWordUpload: "/api_html/common/paper/upload", 426 paperWordUpload: "/api_html/common/paper/upload",
427 //删除随堂问报表 427 //删除随堂问报表
428 deletePaperReport: "/api_html/teaching/deletePaperReport", 428 deletePaperReport: "/api_html/teaching/deletePaperReport",
  429 + //删除基站
  430 + deleteStation: "/api_html/school/manager/deleteStation",
  431 + //导出授课端日志
  432 + downloadDeviceLog: "/api_html/school/manager/downloadDeviceLog",
429 } 433 }
src/assets/images/shuazi.svg 0 → 100644
  1 +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1703748022272" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9884" xmlns:xlink="http://www.w3.org/1999/xlink" width="48" height="48"><path d="M963.54816 955.7248h-869.888l25.6 25.6v-383.06304c0-58.36288-7.77728-120.704 31.89248-169.27232 43.39712-53.12512 104.25344-50.7904 165.33504-50.7904h481.536c57.2672 0 105.06752 34.45248 129.0752 85.26848 11.0848 23.46496 10.8544 49.25952 10.8544 74.49088v443.37152c0 33.01376 51.2 33.01376 51.2 0v-383.06816c0-59.56608 4.81792-117.92896-23.86432-172.7232-38.1184-72.8064-114.02752-98.5344-190.91456-98.5344H337.65888c-54.56384 0-107.4176-3.95264-158.96576 17.85344-51.93216 21.9648-89.36448 71.43936-104.3968 124.63104-6.528 23.1168-6.23104 47.03232-6.23104 70.77376v441.06752c0 13.96224 11.64288 25.6 25.6 25.6h869.90336c33.00352-0.00512 33.00352-51.20512-0.02048-51.20512z" fill="#221714" p-id="9885"></path><path d="M121.61536 623.21152H935.59808c33.00864 0 33.00864-51.2 0-51.2H121.61024c-33.01376 0-33.01376 51.2 0.00512 51.2zM554.20928 971.0848v-217.46688c0-33.01376-51.2-33.01376-51.2 0v217.46688c0 33.01376 51.2 33.01376 51.2 0zM347.38176 971.0848v-217.46688c0-33.01376-51.2-33.01376-51.2 0v217.46688c0 33.01376 51.2 33.01376 51.2 0zM776.89856 971.0848v-217.46688c0-33.01376-51.2-33.01376-51.2 0v217.46688c0 33.01376 51.2 33.01376 51.2 0zM374.56384 348.15488V206.40768c0-86.85056 68.32128-143.40096 151.69024-143.40096 41.64096 0 78.53056 7.90016 110.61248 36.33152 30.09024 26.67008 45.77792 65.7664 45.77792 105.55392v143.26272c0 33.01888 51.2 33.01888 51.2 0 0-52.97664 2.78016-106.68544-0.60416-159.5648-6.8608-107.18208-100.0448-176.78336-202.27584-176.78336-48.03584 0-92.30336 9.23136-131.44576 38.656-41.63072 31.29856-69.25312 79.24736-74.79808 131.11296-5.85216 54.72256-1.3568 111.59552-1.3568 166.5792 0 33.01888 51.2 33.01888 51.2 0z" fill="#221714" p-id="9886"></path></svg>
0 \ No newline at end of file 2 \ No newline at end of file
src/views/basic/device/index.vue
@@ -7,37 +7,16 @@ @@ -7,37 +7,16 @@
7 <template slot="btns"> 7 <template slot="btns">
8 <template v-if="tableData.length"> 8 <template v-if="tableData.length">
9 <el-tooltip effect="dark" content="设备导出" placement="bottom"> 9 <el-tooltip effect="dark" content="设备导出" placement="bottom">
10 - <el-button  
11 - type="primary"  
12 - icon="fa fa-cloud-download"  
13 - size="mini"  
14 - plain  
15 - circle  
16 - @click="downExl"  
17 - ></el-button> 10 + <el-button type="primary" icon="fa fa-cloud-download" size="mini" plain circle @click="downExl"></el-button>
18 </el-tooltip> 11 </el-tooltip>
19 </template> 12 </template>
20 <template v-if="role == 'ROLE_XUEXIAO' && type == 1"> 13 <template v-if="role == 'ROLE_XUEXIAO' && type == 1">
21 <el-tooltip effect="dark" content="设备导入" placement="bottom"> 14 <el-tooltip effect="dark" content="设备导入" placement="bottom">
22 - <el-button  
23 - type="primary"  
24 - icon="el-icon-upload2"  
25 - size="mini"  
26 - plain  
27 - circle  
28 - @click="diaUp = true"  
29 - ></el-button> 15 + <el-button type="primary" icon="el-icon-upload2" size="mini" plain circle @click="diaUp = true"></el-button>
30 </el-tooltip> 16 </el-tooltip>
31 <el-tooltip effect="dark" content="添加基站" placement="bottom"> 17 <el-tooltip effect="dark" content="添加基站" placement="bottom">
32 - <el-button  
33 - type="primary"  
34 - icon="el-icon-receiving"  
35 - size="mini"  
36 - plain  
37 - circle  
38 - @click="addDev"  
39 - ></el-button> </el-tooltip  
40 - ></template> 18 + <el-button type="primary" icon="el-icon-receiving" size="mini" plain circle @click="addDev"></el-button>
  19 + </el-tooltip></template>
41 </template> 20 </template>
42 </back-box> 21 </back-box>
43 <div> 22 <div>
@@ -48,16 +27,10 @@ @@ -48,16 +27,10 @@
48 <el-radio-button :label="3">授课端管理</el-radio-button> 27 <el-radio-button :label="3">授课端管理</el-radio-button>
49 </el-radio-group> 28 </el-radio-group>
50 </div> 29 </div>
51 - <p  
52 - v-show="(type == 1 && stationCount) || (type == 2 && clickerCount)"  
53 - class="error-tips"  
54 - > 30 + <p v-show="(type == 1 && stationCount) || (type == 2 && clickerCount)" class="error-tips">
55 有{{ 31 有{{
56 type == 1 ? stationCount : clickerCount 32 type == 1 ? stationCount : clickerCount
57 - }}条设备异常信息,<router-link  
58 - :to="{ path: '/deviceError', query: { type: type } }"  
59 - >点击查看&gt;&gt;</router-link  
60 - > 33 + }}条设备异常信息,<router-link :to="{ path: '/deviceError', query: { type: type } }">点击查看&gt;&gt;</router-link>
61 </p> 34 </p>
62 <div class="content"> 35 <div class="content">
63 <div v-show="type == 1"> 36 <div v-show="type == 1">
@@ -67,101 +40,39 @@ @@ -67,101 +40,39 @@
67 <p class="p2">基站数量</p> 40 <p class="p2">基站数量</p>
68 </div> 41 </div>
69 <div class="chart"> 42 <div class="chart">
70 - <pie-chart  
71 - id="pieChart"  
72 - :params="chartData"  
73 - @clickPieChart="clickPieChart"  
74 - ></pie-chart> 43 + <pie-chart id="pieChart" :params="chartData" @clickPieChart="clickPieChart"></pie-chart>
75 </div> 44 </div>
76 </div> 45 </div>
77 <div class="table-box"> 46 <div class="table-box">
78 <div class="answer-header"> 47 <div class="answer-header">
79 <div class="sel-box"> 48 <div class="sel-box">
80 - <el-cascader  
81 - size="small"  
82 - class="sel sel2"  
83 - clearable  
84 - placeholder="选择班级"  
85 - v-model="query.classId"  
86 - :options="gradeList"  
87 - :props="props"  
88 - collapse-tags  
89 - :show-all-levels="false"  
90 - ></el-cascader>  
91 - <el-select  
92 - class="sel"  
93 - v-model="query.onlineStatus"  
94 - placeholder="选择状态"  
95 - @change="_QueryData(true)"  
96 - >  
97 - <el-option  
98 - v-for="item in statusList"  
99 - :key="item.value"  
100 - :label="item.label"  
101 - :value="item.value"  
102 - > 49 + <el-cascader size="small" class="sel sel2" clearable placeholder="选择班级" v-model="query.classId"
  50 + :options="gradeList" :props="props" collapse-tags :show-all-levels="false"></el-cascader>
  51 + <el-select class="sel" v-model="query.onlineStatus" placeholder="选择状态" @change="_QueryData(true)">
  52 + <el-option v-for="item in statusList" :key="item.value" :label="item.label" :value="item.value">
103 </el-option> 53 </el-option>
104 </el-select> 54 </el-select>
105 - <el-input  
106 - placeholder="请输入设备编码"  
107 - v-model="query.sn"  
108 - class="input-with-select"  
109 - clearable  
110 - @keyup.enter.native="_QueryData(true)"  
111 - >  
112 - <el-button  
113 - slot="append"  
114 - icon="el-icon-search"  
115 - @click="_QueryData(true)"  
116 - ></el-button> 55 + <el-input placeholder="请输入设备编码" v-model="query.sn" class="input-with-select" clearable
  56 + @keyup.enter.native="_QueryData(true)">
  57 + <el-button slot="append" icon="el-icon-search" @click="_QueryData(true)"></el-button>
117 </el-input> 58 </el-input>
118 - <el-button class="serach-box" round @click="_QueryData(true)"  
119 - >筛选</el-button  
120 - > 59 + <el-button class="serach-box" round @click="_QueryData(true)">筛选</el-button>
121 </div> 60 </div>
122 </div> 61 </div>
123 <p class="loading" v-if="!tableData.length && loading"> 62 <p class="loading" v-if="!tableData.length && loading">
124 加载中<i class="el-icon-loading"></i> 63 加载中<i class="el-icon-loading"></i>
125 </p> 64 </p>
126 <el-table v-else :data="tableData" border style="width: 100%"> 65 <el-table v-else :data="tableData" border style="width: 100%">
127 - <el-table-column  
128 - prop="sn"  
129 - label="设备编码"  
130 - align="center"  
131 - ></el-table-column>  
132 - <el-table-column  
133 - prop="frequency"  
134 - label="频点"  
135 - align="center"  
136 - width="60"  
137 - ></el-table-column>  
138 - <el-table-column  
139 - prop="pairingCode"  
140 - label="配对码"  
141 - align="center"  
142 - ></el-table-column>  
143 - <el-table-column  
144 - v-if="role == 'ROLE_JITUAN'"  
145 - prop="schoolName"  
146 - label="学校"  
147 - align="center"  
148 - ></el-table-column>  
149 - <el-table-column  
150 - v-if="role == 'ROLE_JITUAN'"  
151 - prop="gradeName"  
152 - label="年级"  
153 - align="center"  
154 - ><template slot-scope="scoped"> 66 + <el-table-column prop="sn" label="设备编码" align="center"></el-table-column>
  67 + <el-table-column prop="frequency" label="频点" align="center" width="60"></el-table-column>
  68 + <el-table-column prop="pairingCode" label="配对码" align="center"></el-table-column>
  69 + <el-table-column v-if="role == 'ROLE_JITUAN'" prop="schoolName" label="学校" align="center"></el-table-column>
  70 + <el-table-column prop="gradeName" label="年级" align="center"><template slot-scope="scoped">
155 <p v-for="(item, index) in scoped.row.classList" :key="index"> 71 <p v-for="(item, index) in scoped.row.classList" :key="index">
156 {{ item.gradeName }} 72 {{ item.gradeName }}
157 </p> 73 </p>
158 - </template></el-table-column  
159 - >  
160 - <el-table-column  
161 - prop="roomName"  
162 - label="所在教室"  
163 - align="center"  
164 - ></el-table-column> 74 + </template></el-table-column>
  75 + <el-table-column prop="roomName" label="所在教室" align="center"></el-table-column>
165 <el-table-column label="关联班级" align="center"> 76 <el-table-column label="关联班级" align="center">
166 <template slot-scope="scoped"> 77 <template slot-scope="scoped">
167 <p v-for="(item, index) in scoped.row.classList" :key="index"> 78 <p v-for="(item, index) in scoped.row.classList" :key="index">
@@ -169,60 +80,31 @@ @@ -169,60 +80,31 @@
169 </p> 80 </p>
170 </template> 81 </template>
171 </el-table-column> 82 </el-table-column>
172 - <el-table-column  
173 - prop="otaVersionName"  
174 - label="固件版本号"  
175 - align="center"  
176 - ></el-table-column>  
177 - <el-table-column  
178 - prop="onlineTime"  
179 - label="最近上报"  
180 - align="center"  
181 - width="160"  
182 - ></el-table-column>  
183 - <el-table-column  
184 - prop="createdTime"  
185 - label="创建时间"  
186 - align="center"  
187 - width="160"  
188 - ></el-table-column>  
189 - <el-table-column label="状态" align="center" width="60"  
190 - ><template slot-scope="scope"> 83 + <el-table-column prop="otaVersionName" label="固件版本号" align="center"></el-table-column>
  84 + <el-table-column prop="onlineTime" label="最近上报" align="center" width="160"></el-table-column>
  85 + <el-table-column prop="createdTime" label="创建时间" align="center" width="160"></el-table-column>
  86 + <el-table-column label="状态" align="center" width="60"><template slot-scope="scope">
191 {{ 87 {{
192 scope.row.onlineStatus == 1 88 scope.row.onlineStatus == 1
193 - ? "在线"  
194 - : scope.row.onlineStatus == 2 89 + ? "在线"
  90 + : scope.row.onlineStatus == 2
195 ? "异常" 91 ? "异常"
196 : "离线" 92 : "离线"
197 }} 93 }}
198 - </template></el-table-column  
199 - >  
200 - <el-table-column label="操作" align="center"  
201 - ><template slot-scope="scoped">  
202 - <el-tooltip  
203 - effect="dark"  
204 - v-if="role != 'ROLE_JITUAN'"  
205 - content="修改基站"  
206 - placement="top"  
207 - >  
208 - <el-button  
209 - type="primary"  
210 - circle  
211 - size="mini"  
212 - icon="fa fa-edit"  
213 - @click="edit(scoped.row)"  
214 - ></el-button> 94 + </template></el-table-column>
  95 + <el-table-column label="操作" align="center" width="130"><template slot-scope="scoped">
  96 + <el-tooltip effect="dark" v-if="role != 'ROLE_JITUAN'" content="修改基站" placement="top">
  97 + <el-button type="primary" circle size="mini" icon="fa fa-edit" @click="edit(scoped.row)"></el-button>
215 </el-tooltip> 98 </el-tooltip>
216 <el-tooltip effect="dark" content="日志" placement="top"> 99 <el-tooltip effect="dark" content="日志" placement="top">
217 - <el-button  
218 - type="warning"  
219 - circle  
220 - size="mini"  
221 - icon="fa fa-eye"  
222 - @click="linkTo(scoped.row, 1)"  
223 - ></el-button>  
224 - </el-tooltip> </template  
225 - ></el-table-column> 100 + <el-button type="warning" circle size="mini" icon="fa fa-eye"
  101 + @click="linkTo(scoped.row, 1)"></el-button>
  102 + </el-tooltip>
  103 + <el-popconfirm title="确定删除吗?" @confirm="delStation(scoped.row)">
  104 + <el-button class="del" slot="reference" type="danger" circle size="mini"
  105 + icon="fa fa-trash-o"></el-button>
  106 + </el-popconfirm>
  107 + </template></el-table-column>
226 </el-table> 108 </el-table>
227 </div> 109 </div>
228 </div> 110 </div>
@@ -233,151 +115,61 @@ @@ -233,151 +115,61 @@
233 <p class="p2">答题器数量</p> 115 <p class="p2">答题器数量</p>
234 </div> 116 </div>
235 <div class="chart"> 117 <div class="chart">
236 - <scatter-chart  
237 - id="scatterChart"  
238 - :params="chartData2"  
239 - @clickScatterChart="clickScatterChart"  
240 - ></scatter-chart> 118 + <scatter-chart id="scatterChart" :params="chartData2"
  119 + @clickScatterChart="clickScatterChart"></scatter-chart>
241 </div> 120 </div>
242 </div> 121 </div>
243 <div class="table-box"> 122 <div class="table-box">
244 <div class="answer-header"> 123 <div class="answer-header">
245 <div class="sel-box"> 124 <div class="sel-box">
246 - <el-cascader  
247 - size="small"  
248 - class="sel sel2"  
249 - clearable  
250 - placeholder="选择班级"  
251 - v-model="query.classId"  
252 - :options="gradeList"  
253 - :props="props"  
254 - collapse-tags  
255 - :show-all-levels="false"  
256 - ></el-cascader>  
257 - <el-select  
258 - class="sel"  
259 - v-model="query.type"  
260 - placeholder="选择状态"  
261 - @change="_QueryData(true)"  
262 - >  
263 - <el-option  
264 - v-for="item in typeList"  
265 - :key="item.value"  
266 - :label="item.label"  
267 - :value="item.value"  
268 - > 125 + <el-cascader size="small" class="sel sel2" clearable placeholder="选择班级" v-model="query.classId"
  126 + :options="gradeList" :props="props" collapse-tags :show-all-levels="false"></el-cascader>
  127 + <el-select class="sel" v-model="query.type" placeholder="选择状态" @change="_QueryData(true)">
  128 + <el-option v-for="item in typeList" :key="item.value" :label="item.label" :value="item.value">
269 </el-option> 129 </el-option>
270 </el-select> 130 </el-select>
271 - <el-input  
272 - placeholder="请输入设备编码"  
273 - v-model="query.sn"  
274 - class="input-with-select"  
275 - clearable  
276 - @input.native="query.studentName = ''"  
277 - @keyup.enter.native="_QueryData(true)"  
278 - >  
279 - <el-button  
280 - slot="append"  
281 - icon="el-icon-search"  
282 - @click="_QueryData(true)"  
283 - ></el-button> 131 + <el-input placeholder="请输入设备编码" v-model="query.sn" class="input-with-select" clearable
  132 + @input.native="query.studentName = ''" @keyup.enter.native="_QueryData(true)">
  133 + <el-button slot="append" icon="el-icon-search" @click="_QueryData(true)"></el-button>
284 </el-input> 134 </el-input>
285 - <el-input  
286 - placeholder="学生姓名"  
287 - v-model="query.studentName"  
288 - class="input-with-select"  
289 - clearable  
290 - @input.native="query.sn = ''"  
291 - @keyup.enter.native="_QueryData(true)"  
292 - >  
293 - <el-button  
294 - slot="append"  
295 - icon="el-icon-search"  
296 - @click="_QueryData(true)"  
297 - ></el-button> 135 + <el-input placeholder="学生姓名" v-model="query.studentName" class="input-with-select" clearable
  136 + @input.native="query.sn = ''" @keyup.enter.native="_QueryData(true)">
  137 + <el-button slot="append" icon="el-icon-search" @click="_QueryData(true)"></el-button>
298 </el-input> 138 </el-input>
299 - <el-button class="serach-box" round @click="_QueryData(true)"  
300 - >筛选</el-button  
301 - > 139 + <el-button class="serach-box" round @click="_QueryData(true)">筛选</el-button>
302 </div> 140 </div>
303 </div> 141 </div>
304 <p class="loading" v-if="!tableData.length && loading"> 142 <p class="loading" v-if="!tableData.length && loading">
305 加载中<i class="el-icon-loading"></i> 143 加载中<i class="el-icon-loading"></i>
306 </p> 144 </p>
307 <el-table v-else :data="tableData" border style="width: 100%"> 145 <el-table v-else :data="tableData" border style="width: 100%">
308 - <el-table-column  
309 - prop="sn"  
310 - label="设备编码"  
311 - align="center"  
312 - ></el-table-column>  
313 - <el-table-column label="学生信息" align="center"  
314 - ><template slot-scope="scoped"  
315 - ><p  
316 - v-for="(item, index) in scoped.row.studentList"  
317 - :key="index"  
318 - > 146 + <el-table-column prop="sn" label="设备编码" align="center"></el-table-column>
  147 + <el-table-column label="学生信息" align="center"><template slot-scope="scoped">
  148 + <p v-for="(item, index) in scoped.row.studentList" :key="index">
319 {{ item.studentName }} 149 {{ item.studentName }}
320 - </p></template  
321 - ></el-table-column  
322 - >  
323 - <el-table-column  
324 - v-if="role == 'ROLE_JITUAN'"  
325 - prop="schoolName"  
326 - label="学校"  
327 - align="center"  
328 - ></el-table-column>  
329 - <el-table-column  
330 - v-if="role == 'ROLE_JITUAN'"  
331 - prop="gradeName"  
332 - label="年级"  
333 - align="center"  
334 - width="120"  
335 - ><template slot-scope="scoped"> 150 + </p>
  151 + </template></el-table-column>
  152 + <el-table-column v-if="role == 'ROLE_JITUAN'" prop="schoolName" label="学校" align="center"></el-table-column>
  153 + <el-table-column v-if="role == 'ROLE_JITUAN'" prop="gradeName" label="年级" align="center"
  154 + width="120"><template slot-scope="scoped">
336 <p v-for="(item, index) in scoped.row.classList" :key="index"> 155 <p v-for="(item, index) in scoped.row.classList" :key="index">
337 {{ item.gradeName }} 156 {{ item.gradeName }}
338 </p> 157 </p>
339 - </template></el-table-column  
340 - >  
341 - <el-table-column  
342 - prop="class"  
343 - label="关联班级"  
344 - align="center"  
345 - width="160"  
346 - > 158 + </template></el-table-column>
  159 + <el-table-column prop="class" label="关联班级" align="center" width="160">
347 <template slot-scope="scoped"> 160 <template slot-scope="scoped">
348 <p v-for="(item, index) in scoped.row.classList" :key="index"> 161 <p v-for="(item, index) in scoped.row.classList" :key="index">
349 {{ item.className }} 162 {{ item.className }}
350 </p> 163 </p>
351 - </template></el-table-column  
352 - >  
353 - <!-- <el-table-column  
354 - prop="pairingCode"  
355 - label="配对码"  
356 - align="center"  
357 - ></el-table-column> -->  
358 - <!-- <el-table-column  
359 - prop="answerTimes"  
360 - label="答题次数"  
361 - align="center"  
362 - ></el-table-column> -->  
363 - <el-table-column  
364 - prop="latestReportTime"  
365 - label="最后答题时间"  
366 - align="center"  
367 - width="160"  
368 - ></el-table-column>  
369 - <el-table-column label="操作" align="center" width="80"  
370 - ><template slot-scope="scoped"> 164 + </template></el-table-column>
  165 + <el-table-column prop="pairingCode" label="配对码" align="center"></el-table-column>
  166 + <el-table-column prop="answerTimes" label="答题次数" align="center"></el-table-column>
  167 + <el-table-column prop="latestReportTime" label="最后答题时间" align="center" width="160"></el-table-column>
  168 + <el-table-column label="操作" align="center" width="80"><template slot-scope="scoped">
371 <el-tooltip effect="dark" content="日志" placement="top"> 169 <el-tooltip effect="dark" content="日志" placement="top">
372 - <el-button  
373 - type="warning"  
374 - circle  
375 - size="mini"  
376 - icon="fa fa-eye"  
377 - @click="linkTo(scoped.row, 2)"  
378 - ></el-button>  
379 - </el-tooltip> </template  
380 - ></el-table-column> 170 + <el-button type="warning" circle size="mini" icon="fa fa-eye"
  171 + @click="linkTo(scoped.row, 2)"></el-button>
  172 + </el-tooltip> </template></el-table-column>
381 </el-table> 173 </el-table>
382 </div> 174 </div>
383 </div> 175 </div>
@@ -385,27 +177,12 @@ @@ -385,27 +177,12 @@
385 <div class="table-box"> 177 <div class="table-box">
386 <div class="answer-header"> 178 <div class="answer-header">
387 <div class="sel-box"> 179 <div class="sel-box">
388 - <el-cascader  
389 - size="small"  
390 - class="sel sel2"  
391 - clearable  
392 - placeholder="选择班级"  
393 - v-model="query.classId"  
394 - :options="gradeList"  
395 - :props="props"  
396 - collapse-tags  
397 - :show-all-levels="false"  
398 - @change="_QueryData(false)"  
399 - ></el-cascader>  
400 - <span class="sel"  
401 - >共选择{{ selectionTabIds.length }}个授课端</span  
402 - >  
403 - <el-button plan round @click="autoUpDate(false)"  
404 - >开启自动更新</el-button  
405 - >  
406 - <el-button plan round @click="stopUpdate(false)"  
407 - >停止自动更新</el-button  
408 - > 180 + <el-cascader size="small" class="sel sel2" clearable placeholder="选择班级" v-model="query.classId"
  181 + :options="gradeList" :props="props" collapse-tags :show-all-levels="false"
  182 + @change="_QueryData(false)"></el-cascader>
  183 + <span class="sel">共选择{{ selectionTabIds.length }}个授课端</span>
  184 + <el-button plan round @click="autoUpDate(false)">开启自动更新</el-button>
  185 + <el-button plan round @click="stopUpdate(false)">停止自动更新</el-button>
409 </div> 186 </div>
410 <p class="upgrade-all" v-if="this.role == 'ROLE_XUEXIAO'"> 187 <p class="upgrade-all" v-if="this.role == 'ROLE_XUEXIAO'">
411 <span>全校更新:</span> 188 <span>全校更新:</span>
@@ -416,102 +193,49 @@ @@ -416,102 +193,49 @@
416 <p class="loading" v-if="!tableData.length && loading"> 193 <p class="loading" v-if="!tableData.length && loading">
417 加载中<i class="el-icon-loading"></i> 194 加载中<i class="el-icon-loading"></i>
418 </p> 195 </p>
419 - <el-table  
420 - v-else  
421 - ref="multipleTable"  
422 - :data="tableData"  
423 - border  
424 - style="width: 100%"  
425 - @selection-change="handleSelectionChange"  
426 - > 196 + <el-table v-else ref="multipleTable" :data="tableData" border style="width: 100%"
  197 + @selection-change="handleSelectionChange">
427 <el-table-column type="selection" width="55"></el-table-column> 198 <el-table-column type="selection" width="55"></el-table-column>
428 - <el-table-column  
429 - prop="sn"  
430 - label="设备编码"  
431 - align="center"  
432 - ></el-table-column>  
433 - <el-table-column  
434 - prop="class"  
435 - label="关联班级"  
436 - align="center"  
437 - width="100"  
438 - ><template slot-scope="scoped"> 199 + <!-- <el-table-column prop="sn" label="设备编码" align="center"></el-table-column> -->
  200 + <el-table-column prop="class" label="关联班级" align="center" width="100"><template slot-scope="scoped">
439 <p v-for="(item, index) in scoped.row.classList" :key="index"> 201 <p v-for="(item, index) in scoped.row.classList" :key="index">
440 {{ item.className }} 202 {{ item.className }}
441 </p> 203 </p>
442 - </template></el-table-column  
443 - >  
444 - <el-table-column  
445 - v-if="role == 'ROLE_JITUAN'"  
446 - prop="schoolName"  
447 - label="学校"  
448 - align="center"  
449 - ></el-table-column>  
450 - <el-table-column  
451 - v-if="role == 'ROLE_JITUAN'"  
452 - prop="gradeName"  
453 - label="年级"  
454 - align="center"  
455 - width="80"  
456 - ><template slot-scope="scoped"> 204 + </template></el-table-column>
  205 + <el-table-column v-if="role == 'ROLE_JITUAN'" prop="schoolName" label="学校" align="center"></el-table-column>
  206 + <el-table-column v-if="role == 'ROLE_JITUAN'" prop="gradeName" label="年级" align="center"
  207 + width="80"><template slot-scope="scoped">
457 <p v-for="(item, index) in scoped.row.classList" :key="index"> 208 <p v-for="(item, index) in scoped.row.classList" :key="index">
458 {{ item.gradeName }} 209 {{ item.gradeName }}
459 </p> 210 </p>
460 - </template></el-table-column  
461 - >  
462 - <el-table-column  
463 - prop="lastUpdateTime"  
464 - label="最近更新"  
465 - align="center"  
466 - ></el-table-column>  
467 - <el-table-column  
468 - prop="osInfo"  
469 - label="软件系统"  
470 - align="center"  
471 - ></el-table-column>  
472 - <el-table-column  
473 - prop="hardwareInfo"  
474 - label="硬件环境"  
475 - align="center"  
476 - ></el-table-column>  
477 - <el-table-column  
478 - prop="otaVersionName"  
479 - label="版本号"  
480 - align="center"  
481 - width="80"  
482 - ></el-table-column>  
483 - <el-table-column label="状态" align="center" width="80"  
484 - ><template slot-scope="scope"> 211 + </template></el-table-column>
  212 + <el-table-column prop="lastUpdateTime" label="最近更新" align="center"></el-table-column>
  213 + <el-table-column prop="osInfo" label="软件系统" align="center"></el-table-column>
  214 + <el-table-column prop="hardwareInfo" label="硬件环境" align="center"></el-table-column>
  215 + <el-table-column prop="otaVersionName" label="版本号" align="center" width="80"></el-table-column>
  216 + <el-table-column label="状态" align="center" width="80"><template slot-scope="scope">
485 {{ 217 {{
486 scope.row.onlineStatus == 1 218 scope.row.onlineStatus == 1
487 - ? "在线"  
488 - : scope.row.onlineStatus == 2 219 + ? "在线"
  220 + : scope.row.onlineStatus == 2
489 ? "异常" 221 ? "异常"
490 : "离线" 222 : "离线"
491 }} 223 }}
492 - </template></el-table-column  
493 - >  
494 - <el-table-column label="自动更新" align="center" width="100"  
495 - ><template slot-scope="scoped">  
496 - <el-switch  
497 - v-model="scoped.row.upgradeFlag"  
498 - @change="changeUpdate($event, scoped.row, this)"  
499 - >  
500 - </el-switch> </template  
501 - ></el-table-column> 224 + </template></el-table-column>
  225 + <el-table-column label="日志记录" align="center" width="80">
  226 + <template slot-scope="scope">
  227 + <el-link type="primary" @click="downloadDeviceLog(scope.row.id)">下载</el-link>
  228 + </template>
  229 + </el-table-column>
  230 + <el-table-column label="自动更新" align="center" width="100"><template slot-scope="scoped">
  231 + <el-switch v-model="scoped.row.upgradeFlag" @change="changeUpdate($event, scoped.row, this)">
  232 + </el-switch> </template></el-table-column>
502 </el-table> 233 </el-table>
503 </div> 234 </div>
504 </div> 235 </div>
505 <div class="pagination-box"> 236 <div class="pagination-box">
506 - <el-pagination  
507 - small=""  
508 - layout="total,prev, pager, next"  
509 - :hide-on-single-page="true"  
510 - :total="total"  
511 - @current-change="changePage"  
512 - :current-page="page"  
513 - :page-size="size"  
514 - > 237 + <el-pagination small="" layout="total,prev, pager, next" :hide-on-single-page="true" :total="total"
  238 + @current-change="changePage" :current-page="page" :page-size="size">
515 </el-pagination> 239 </el-pagination>
516 </div> 240 </div>
517 </div> 241 </div>
@@ -527,75 +251,33 @@ @@ -527,75 +251,33 @@
527 <el-button @click="diaUp = false">取 消</el-button> 251 <el-button @click="diaUp = false">取 消</el-button>
528 </div> 252 </div>
529 </el-dialog> 253 </el-dialog>
530 - <el-dialog :close-on-click-modal="false"  
531 - :title="isAdd ? '添加基站' : '修改基站'"  
532 - :visible.sync="diaAnswerEqu"  
533 - width="400"  
534 - > 254 + <el-dialog :close-on-click-modal="false" :title="isAdd ? '添加基站' : '修改基站'" :visible.sync="diaAnswerEqu" width="400">
535 <el-form ref="forms" :model="form" :rules="formRules" label-width="140px"> 255 <el-form ref="forms" :model="form" :rules="formRules" label-width="140px">
536 <el-form-item label="设备编码:" prop="sn"> 256 <el-form-item label="设备编码:" prop="sn">
537 - <el-col :span="16"  
538 - ><el-input  
539 - type="text"  
540 - placeholder="输入设备编码"  
541 - v-model.trim="form.sn"  
542 - maxlength="30"  
543 - size="45"  
544 - show-word-limit  
545 - :disabled="!isAdd"  
546 - >  
547 - </el-input  
548 - ></el-col> 257 + <el-col :span="16"><el-input type="text" placeholder="输入设备编码" v-model.trim="form.sn" maxlength="30" size="45"
  258 + show-word-limit :disabled="!isAdd">
  259 + </el-input></el-col>
549 </el-form-item> 260 </el-form-item>
550 <el-form-item label="频点:" prop="frequency"> 261 <el-form-item label="频点:" prop="frequency">
551 - <el-col :span="16"  
552 - ><el-input  
553 - type="text"  
554 - placeholder="输入频点"  
555 - v-model.trim="form.frequency"  
556 - maxlength="30"  
557 - size="45"  
558 - show-word-limit  
559 - >  
560 - </el-input  
561 - ></el-col> 262 + <el-col :span="16"><el-input type="text" placeholder="输入频点" v-model.trim="form.frequency" maxlength="30"
  263 + size="45" show-word-limit>
  264 + </el-input></el-col>
562 </el-form-item> 265 </el-form-item>
563 <el-form-item label="配对码:" prop="pairingCode"> 266 <el-form-item label="配对码:" prop="pairingCode">
564 - <el-col :span="16"  
565 - ><el-input  
566 - type="text"  
567 - placeholder="输入配对码"  
568 - v-model.trim="form.pairingCode"  
569 - maxlength="30"  
570 - size="45"  
571 - show-word-limit  
572 - >  
573 - </el-input  
574 - ></el-col> 267 + <el-col :span="16"><el-input type="text" placeholder="输入配对码" v-model.trim="form.pairingCode" maxlength="30"
  268 + size="45" show-word-limit>
  269 + </el-input></el-col>
575 </el-form-item> 270 </el-form-item>
576 <el-form-item label="选择班级:" prop="classIds"> 271 <el-form-item label="选择班级:" prop="classIds">
577 <el-col :span="16"> 272 <el-col :span="16">
578 - <el-cascader  
579 - class="sel"  
580 - clearable  
581 - v-model="form.classIds"  
582 - :options="gradeList"  
583 - :show-all-levels="false"  
584 - ></el-cascader> 273 + <el-cascader class="sel" clearable v-model="form.classIds" :options="gradeList"
  274 + :show-all-levels="false"></el-cascader>
585 </el-col> 275 </el-col>
586 </el-form-item> 276 </el-form-item>
587 <el-form-item label="所在教室:"> 277 <el-form-item label="所在教室:">
588 - <el-col :span="16"  
589 - ><el-input  
590 - type="text"  
591 - placeholder="输入所在教室"  
592 - v-model.trim="form.roomName"  
593 - maxlength="30"  
594 - size="45"  
595 - show-word-limit  
596 - >  
597 - </el-input  
598 - ></el-col> 278 + <el-col :span="16"><el-input type="text" placeholder="输入所在教室" v-model.trim="form.roomName" maxlength="30"
  279 + size="45" show-word-limit>
  280 + </el-input></el-col>
599 </el-form-item> 281 </el-form-item>
600 </el-form> 282 </el-form>
601 <div class="dialog-footer" slot="footer"> 283 <div class="dialog-footer" slot="footer">
@@ -800,6 +482,17 @@ export default { @@ -800,6 +482,17 @@ export default {
800 }, 482 },
801 }); 483 });
802 }, 484 },
  485 + async delStation(obj) {
  486 + const { status, info } = await this.$request.deleteStation({
  487 + id: obj.id
  488 + });
  489 + if (status === 0) {
  490 + this._QueryData(false);
  491 + this.$message.success(info);
  492 + } else {
  493 + this.$message.error(info);
  494 + }
  495 + },
803 clickPieChart(obj) { 496 clickPieChart(obj) {
804 this.query.onlineStatus = 497 this.query.onlineStatus =
805 obj.name == "在线" ? 1 : obj.name == "离线" ? 0 : 2; 498 obj.name == "在线" ? 1 : obj.name == "离线" ? 0 : 2;
@@ -813,14 +506,14 @@ export default { @@ -813,14 +506,14 @@ export default {
813 obj.name == "1日内" 506 obj.name == "1日内"
814 ? 1 507 ? 1
815 : obj.name == "3日内" 508 : obj.name == "3日内"
816 - ? 2  
817 - : obj.name == "7日内"  
818 - ? 3  
819 - : obj.name == "1月内"  
820 - ? 4  
821 - : obj.name == "3月内"  
822 - ? 5  
823 - : 6; 509 + ? 2
  510 + : obj.name == "7日内"
  511 + ? 3
  512 + : obj.name == "1月内"
  513 + ? 4
  514 + : obj.name == "3月内"
  515 + ? 5
  516 + : 6;
824 this.query.sn = ""; 517 this.query.sn = "";
825 this.query.classId = []; 518 this.query.classId = [];
826 this.page = 1; 519 this.page = 1;
@@ -865,7 +558,7 @@ export default { @@ -865,7 +558,7 @@ export default {
865 if (data && !data.code) { 558 if (data && !data.code) {
866 this._QueryData(false); 559 this._QueryData(false);
867 this.selectionTabIds = []; 560 this.selectionTabIds = [];
868 - this.$message.success(this.upgradeFlag?"开启自动更新成功":"关闭/停止自动更新成功"); 561 + this.$message.success(this.upgradeFlag ? "开启自动更新成功" : "关闭/停止自动更新成功");
869 } else { 562 } else {
870 this.$message.error(data.info); 563 this.$message.error(data.info);
871 } 564 }
@@ -931,6 +624,20 @@ export default { @@ -931,6 +624,20 @@ export default {
931 this.$message.error(data.info); 624 this.$message.error(data.info);
932 } 625 }
933 }, 626 },
  627 + // 导出授课端日志
  628 + async downloadDeviceLog(id) {
  629 + let data = await this.$request.downloadDeviceLog({
  630 + id: id,
  631 + });
  632 + if (data) {
  633 + let blob = new Blob([data], {
  634 + type: "application/vnd.ms-excel;charset=utf-8",
  635 + });
  636 + downloadFile(`基站模版.xlsx`, blob);
  637 + } else {
  638 + this.$message.error("下载失败");
  639 + }
  640 + },
934 async downExcel() { 641 async downExcel() {
935 let data = await this.$request.stationTemplate({ 642 let data = await this.$request.stationTemplate({
936 id: this.id, 643 id: this.id,
@@ -944,8 +651,8 @@ export default { @@ -944,8 +651,8 @@ export default {
944 this.$message.error("下载失败"); 651 this.$message.error("下载失败");
945 } 652 }
946 }, 653 },
  654 + //报表导出
947 async downExl() { 655 async downExl() {
948 - //报表导出  
949 if (this.exportLoading == true) return; 656 if (this.exportLoading == true) return;
950 let query = this.setQuery(); 657 let query = this.setQuery();
951 const exportDevice = 658 const exportDevice =
@@ -967,8 +674,8 @@ export default { @@ -967,8 +674,8 @@ export default {
967 this.type == 1 674 this.type == 1
968 ? "基站管理报表.xlsx" 675 ? "基站管理报表.xlsx"
969 : this.type == 2 676 : this.type == 2
970 - ? "答题器报表.xlsx"  
971 - : "授课端报表.xlsx"; 677 + ? "答题器报表.xlsx"
  678 + : "授课端报表.xlsx";
972 downloadFile(txt, blob); 679 downloadFile(txt, blob);
973 } else { 680 } else {
974 this.$message.error(data.info); 681 this.$message.error(data.info);
@@ -1079,8 +786,8 @@ export default { @@ -1079,8 +786,8 @@ export default {
1079 item.onlineStatus == "1" 786 item.onlineStatus == "1"
1080 ? "在线" 787 ? "在线"
1081 : item.onlineStatus == 0 788 : item.onlineStatus == 0
1082 - ? "离线"  
1083 - : "异常", 789 + ? "离线"
  790 + : "异常",
1084 value: item.total, 791 value: item.total,
1085 rate: item.rate, 792 rate: item.rate,
1086 }; 793 };
@@ -1105,14 +812,14 @@ export default { @@ -1105,14 +812,14 @@ export default {
1105 item.type == 1 812 item.type == 1
1106 ? "1日内" 813 ? "1日内"
1107 : item.type == 2 814 : item.type == 2
1108 - ? "3日内"  
1109 - : item.type == 3  
1110 - ? "7日内"  
1111 - : item.type == 4  
1112 - ? "1月内"  
1113 - : item.type == 5  
1114 - ? "3月内"  
1115 - : "3月以上", 815 + ? "3日内"
  816 + : item.type == 3
  817 + ? "7日内"
  818 + : item.type == 4
  819 + ? "1月内"
  820 + : item.type == 5
  821 + ? "3月内"
  822 + : "3月以上",
1116 count: item.total, 823 count: item.total,
1117 value: item.rate * 100, 824 value: item.rate * 100,
1118 }; 825 };
@@ -1276,39 +983,52 @@ export default { @@ -1276,39 +983,52 @@ export default {
1276 height: 100%; 983 height: 100%;
1277 overflow-y: auto; 984 overflow-y: auto;
1278 } 985 }
  986 +
1279 .tab-box { 987 .tab-box {
1280 padding: 20px 0 12px; 988 padding: 20px 0 12px;
1281 } 989 }
  990 +
1282 .down { 991 .down {
1283 padding: 0 0 16px 20px; 992 padding: 0 0 16px 20px;
1284 } 993 }
  994 +
1285 .error-tips { 995 .error-tips {
1286 margin-bottom: 12px; 996 margin-bottom: 12px;
1287 } 997 }
  998 +.del{
  999 + margin-left: 10px;
  1000 +}
  1001 +
1288 .content { 1002 .content {
1289 background: #f8f8f8; 1003 background: #f8f8f8;
1290 border: 1px solid #e2e2e2; 1004 border: 1px solid #e2e2e2;
1291 border-radius: 10px; 1005 border-radius: 10px;
1292 overflow: hidden; 1006 overflow: hidden;
  1007 +
1293 :deep(.fa-edit) { 1008 :deep(.fa-edit) {
1294 width: 12px; 1009 width: 12px;
1295 height: 12px; 1010 height: 12px;
  1011 +
1296 &::before { 1012 &::before {
1297 margin-left: 2px; 1013 margin-left: 2px;
1298 } 1014 }
1299 } 1015 }
1300 - :deep(.fa-eye) { 1016 +
  1017 + :deep(.fa) {
1301 width: 12px; 1018 width: 12px;
1302 height: 12px; 1019 height: 12px;
  1020 +
1303 &::before { 1021 &::before {
1304 margin-left: 1px; 1022 margin-left: 1px;
1305 } 1023 }
1306 } 1024 }
  1025 +
1307 .chart-box { 1026 .chart-box {
1308 display: flex; 1027 display: flex;
1309 overflow: hidden; 1028 overflow: hidden;
1310 height: 240px; 1029 height: 240px;
1311 border-bottom: 0.5px solid #e2e2e2; 1030 border-bottom: 0.5px solid #e2e2e2;
  1031 +
1312 .device-num { 1032 .device-num {
1313 width: 280px; 1033 width: 280px;
1314 border-right: 0.5px solid #e2e2e2; 1034 border-right: 0.5px solid #e2e2e2;
@@ -1316,26 +1036,32 @@ export default { @@ -1316,26 +1036,32 @@ export default {
1316 flex-direction: column; 1036 flex-direction: column;
1317 justify-content: center; 1037 justify-content: center;
1318 align-items: center; 1038 align-items: center;
  1039 +
1319 .p1 { 1040 .p1 {
1320 font-size: 28px; 1041 font-size: 28px;
1321 } 1042 }
1322 } 1043 }
  1044 +
1323 .chart { 1045 .chart {
1324 flex: 1; 1046 flex: 1;
1325 height: 100%; 1047 height: 100%;
1326 } 1048 }
1327 } 1049 }
  1050 +
1328 .table-box { 1051 .table-box {
1329 padding: 20px 20px 0; 1052 padding: 20px 20px 0;
  1053 +
1330 .loading { 1054 .loading {
1331 text-align: center; 1055 text-align: center;
1332 line-height: 36px; 1056 line-height: 36px;
1333 font-size: 16px; 1057 font-size: 16px;
1334 color: #666; 1058 color: #666;
1335 } 1059 }
  1060 +
1336 .answer-header { 1061 .answer-header {
1337 padding: 0; 1062 padding: 0;
1338 margin-bottom: 12px; 1063 margin-bottom: 12px;
  1064 +
1339 .upgrade-all { 1065 .upgrade-all {
1340 display: flex; 1066 display: flex;
1341 align-items: center; 1067 align-items: center;
@@ -1343,11 +1069,14 @@ export default { @@ -1343,11 +1069,14 @@ export default {
1343 } 1069 }
1344 } 1070 }
1345 } 1071 }
  1072 +
1346 .answer-header .sel-box .input-with-select { 1073 .answer-header .sel-box .input-with-select {
1347 margin-right: 20px; 1074 margin-right: 20px;
  1075 +
1348 :deep(.el-input__suffix) { 1076 :deep(.el-input__suffix) {
1349 right: -5px; 1077 right: -5px;
1350 } 1078 }
  1079 +
1351 :deep(.el-button) { 1080 :deep(.el-button) {
1352 padding: 12px 16px 12px 10px; 1081 padding: 12px 16px 12px 10px;
1353 } 1082 }
src/views/basic/device/log.vue
@@ -286,7 +286,7 @@ export default { @@ -286,7 +286,7 @@ export default {
286 for (let key in this.query) { 286 for (let key in this.query) {
287 if (this.query[key] != "") { 287 if (this.query[key] != "") {
288 if (key == "day" || key == "startDay" || key == "endDay") { 288 if (key == "day" || key == "startDay" || key == "endDay") {
289 - query[key] = this.query[key].split("-").join(""); 289 + query[key] = this.query[key]?.split("-").join("");
290 } else { 290 } else {
291 query[key] = this.query[key]; 291 query[key] = this.query[key];
292 } 292 }
src/views/basic/setUp/teacher.vue
@@ -6,93 +6,41 @@ @@ -6,93 +6,41 @@
6 </template> 6 </template>
7 <template slot="btns" v-if="!code"> 7 <template slot="btns" v-if="!code">
8 <el-tooltip effect="dark" content="导入教师名单" placement="bottom"> 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> 9 + <el-button type="primary" icon="el-icon-upload2" size="mini" plain circle @click="diaUp = true"></el-button>
17 </el-tooltip> 10 </el-tooltip>
18 <el-tooltip effect="dark" content="导出教师名单" placement="bottom"> 11 <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> 12 + <el-button type="primary" icon="el-icon-download" size="mini" plain circle
  13 + @click="exportTeacherExl"></el-button>
27 </el-tooltip> 14 </el-tooltip>
28 <el-tooltip effect="dark" content="添加教师" placement="bottom"> 15 <el-tooltip effect="dark" content="添加教师" placement="bottom">
29 - <el-button  
30 - type="primary"  
31 - icon="el-icon-plus"  
32 - size="mini"  
33 - plain  
34 - circle  
35 - @click="addTeacherDia"  
36 - ></el-button> 16 + <el-button type="primary" icon="el-icon-plus" size="mini" plain circle @click="addTeacherDia"></el-button>
37 </el-tooltip> 17 </el-tooltip>
38 </template> 18 </template>
39 </back-box> 19 </back-box>
40 20
41 <div class="answer-header"> 21 <div class="answer-header">
42 <div class="sel-box"> 22 <div class="sel-box">
43 - <el-cascader  
44 - size="small"  
45 - class="sel sel2"  
46 - clearable  
47 - placeholder="选择范围"  
48 - @change="_QueryData(1)"  
49 - v-model="query.gradeClassSub"  
50 - :options="gradeClassSubList"  
51 - :props="{ 23 + <el-select class="sel" v-model="query.classType" @change="_QueryData()" placeholder="选择类型">
  24 + <el-option label="行政班" :value="0"></el-option>
  25 + <el-option label="教学班" :value="1"></el-option>
  26 + </el-select>
  27 + <el-cascader size="small" class="sel sel2" clearable placeholder="选择范围" @change="_QueryData(1)"
  28 + v-model="query.gradeClassSub" :options="gradeClassSubList" :props="{
52 multiple: true, 29 multiple: true,
53 checkStrictly: true, 30 checkStrictly: true,
54 - }"  
55 - collapse-tags  
56 - :show-all-levels="false"  
57 - ></el-cascader>  
58 - <el-select  
59 - class="sel"  
60 - v-model="query.type"  
61 - @change="_QueryData(4)"  
62 - placeholder="选择类型"  
63 - > 31 + }" collapse-tags :show-all-levels="false"></el-cascader>
  32 + <el-select class="sel" v-model="query.type" @change="_QueryData(4)" placeholder="选择类型">
64 <el-option disabled label="请选择" :value="9"></el-option> 33 <el-option disabled label="请选择" :value="9"></el-option>
65 <el-option label="已分配任课信息" :value="0"></el-option> 34 <el-option label="已分配任课信息" :value="0"></el-option>
66 <el-option label="未分配任课信息" :value="1"></el-option> 35 <el-option label="未分配任课信息" :value="1"></el-option>
67 </el-select> 36 </el-select>
68 - <el-input  
69 - placeholder="请输入老师姓名"  
70 - v-model="query.teacherName"  
71 - class="input-with-select"  
72 - maxlength="30"  
73 - clearable  
74 - @keyup.enter.native="_QueryData(2)"  
75 - >  
76 - <el-button  
77 - slot="append"  
78 - icon="el-icon-search"  
79 - @click="_QueryData(2)"  
80 - ></el-button> 37 + <el-input placeholder="请输入老师姓名" v-model="query.teacherName" class="input-with-select" maxlength="30" clearable
  38 + @keyup.enter.native="_QueryData(2)">
  39 + <el-button slot="append" icon="el-icon-search" @click="_QueryData(2)"></el-button>
81 </el-input> 40 </el-input>
82 - <el-input  
83 - type="number"  
84 - oninput="if(value.length > 11) value = value.slice(0,11)"  
85 - placeholder="请输入老师手机号"  
86 - v-model="query.phone"  
87 - clearable  
88 - class="input-with-select"  
89 - @keyup.enter.native="_QueryData(3)"  
90 - >  
91 - <el-button  
92 - slot="append"  
93 - icon="el-icon-search"  
94 - @click="_QueryData(3)"  
95 - ></el-button> 41 + <el-input type="number" oninput="if(value.length > 11) value = value.slice(0,11)" placeholder="请输入老师手机号"
  42 + v-model="query.phone" clearable class="input-with-select" @keyup.enter.native="_QueryData(3)">
  43 + <el-button slot="append" icon="el-icon-search" @click="_QueryData(3)"></el-button>
96 </el-input> 44 </el-input>
97 <!-- <el-button class="serach-box" round @click="_QueryData(4)" 45 <!-- <el-button class="serach-box" round @click="_QueryData(4)"
98 >筛选</el-button 46 >筛选</el-button
@@ -103,36 +51,30 @@ @@ -103,36 +51,30 @@
103 共筛选出{{ teacherList.length }}名教师。 51 共筛选出{{ teacherList.length }}名教师。
104 </p> 52 </p>
105 <div class="page-content"> 53 <div class="page-content">
106 - <el-empty  
107 - :image-size="100"  
108 - v-if="!teacherList.length && loading == false"  
109 - description="没有更多数据"  
110 - ></el-empty> 54 + <el-empty :image-size="100" v-if="!teacherList.length && loading == false" description="没有更多数据"></el-empty>
111 <div class="teacher-box" v-loading="loading" v-else> 55 <div class="teacher-box" v-loading="loading" v-else>
112 <div class="teacher-list"> 56 <div class="teacher-list">
113 - <p class="h-title">教师列表</p>  
114 - <ul class="teacher-ul">  
115 - <li  
116 - class="teacher-item"  
117 - v-for="item in teacherList"  
118 - :key="item.id"  
119 - :class="showTId == item.id ? 'active' : ''"  
120 - @click="showTeacher(item)"  
121 - >  
122 - {{ item.realName  
123 - }}<template v-if="setClass(item)"  
124 - >({{ setClass(item) }})</template  
125 - >  
126 - </li>  
127 - </ul> 57 + <p class="h-title" v-loading="removeLoading">
  58 + <el-checkbox v-model="AllTeacher" :indeterminate="indeterminate" @change="handleCheckAllChange">{{ ""
  59 + }}</el-checkbox>
  60 + <span class="txt">教师列表</span>
  61 + <img v-show="showDel" class="clear" @click="remove" src="../../../assets/images/shuazi.svg" alt="">
  62 + </p>
  63 + <el-checkbox-group v-model="clearTeacher" @change="handleCheckedChange">
  64 + <ul class="teacher-ul">
  65 + <li class="teacher-item" v-for="item in teacherList" :key="item.id"
  66 + :class="showTId == item.id ? 'active' : ''">
  67 + <el-checkbox :label="item.id">{{ "" }}</el-checkbox>
  68 + <p @click="showTeacher(item)"> {{ item.realName
  69 + }}<template v-if="setClass(item)">({{ setClass(item) }})</template></p>
  70 + </li>
  71 + </ul>
  72 + </el-checkbox-group>
128 </div> 73 </div>
129 <div class="teacher-detail"> 74 <div class="teacher-detail">
130 <div class="icon-box" v-if="!code"> 75 <div class="icon-box" v-if="!code">
131 <i class="icon el-icon-edit-outline" @click="editTeacher(1)"></i> 76 <i class="icon el-icon-edit-outline" @click="editTeacher(1)"></i>
132 - <i  
133 - class="icon el-icon-circle-plus-outline"  
134 - @click="editTeacher(2)"  
135 - ></i> 77 + <i class="icon el-icon-circle-plus-outline" @click="editTeacher(2)"></i>
136 </div> 78 </div>
137 <div class="detail-top"> 79 <div class="detail-top">
138 <p class="p-item">手机号码:{{ teacherDetail.loginName }}</p> 80 <p class="p-item">手机号码:{{ teacherDetail.loginName }}</p>
@@ -142,29 +84,18 @@ @@ -142,29 +84,18 @@
142 <p class="p-item"> 84 <p class="p-item">
143 性别:{{ 85 性别:{{
144 teacherDetail.sex == 1 86 teacherDetail.sex == 1
145 - ? "男"  
146 - : teacherDetail.sex == 2 87 + ? "男"
  88 + : teacherDetail.sex == 2
147 ? "女" 89 ? "女"
148 : "未知" 90 : "未知"
149 }} 91 }}
150 </p> 92 </p>
151 </div> 93 </div>
152 - <div  
153 - class="grade-box"  
154 - v-if="teacherDetail.managerList && teacherDetail.managerList.length"  
155 - > 94 + <div class="grade-box" v-if="teacherDetail.managerList && teacherDetail.managerList.length">
156 <p class="h-title">班主任</p> 95 <p class="h-title">班主任</p>
157 <ul class="grade-info"> 96 <ul class="grade-info">
158 - <li  
159 - class="grade-li"  
160 - v-for="item in teacherDetail.managerList"  
161 - :key="item.classId"  
162 - >  
163 - <el-popconfirm  
164 - title="确定删除吗?"  
165 - @confirm="delTeacherManager(item, 1)"  
166 - v-if="!code"  
167 - > 97 + <li class="grade-li" v-for="item in teacherDetail.managerList" :key="item.classId">
  98 + <el-popconfirm title="确定删除吗?" @confirm="delTeacherManager(item, 1)" v-if="!code">
168 <i class="el-icon-delete" slot="reference"></i> 99 <i class="el-icon-delete" slot="reference"></i>
169 </el-popconfirm> 100 </el-popconfirm>
170 <div class="grade-item"> 101 <div class="grade-item">
@@ -182,25 +113,13 @@ @@ -182,25 +113,13 @@
182 </li> 113 </li>
183 </ul> 114 </ul>
184 </div> 115 </div>
185 - <div  
186 - class="grade-box"  
187 - v-if="  
188 - teacherDetail.teacherCourseList &&  
189 - teacherDetail.teacherCourseList.length  
190 - "  
191 - > 116 + <div class="grade-box" v-if="teacherDetail.teacherCourseList &&
  117 + teacherDetail.teacherCourseList.length
  118 + ">
192 <p class="h-title">任课老师</p> 119 <p class="h-title">任课老师</p>
193 <ul class="grade-info"> 120 <ul class="grade-info">
194 - <li  
195 - class="grade-li"  
196 - v-for="item in teacherDetail.teacherCourseList"  
197 - :key="item.classId+item.subjectName"  
198 - >  
199 - <el-popconfirm  
200 - title="确定删除吗?"  
201 - @confirm="delTeacherManager(item, 2)"  
202 - v-if="!code"  
203 - > 121 + <li class="grade-li" v-for="item in teacherDetail.teacherCourseList" :key="item.classId + item.subjectName">
  122 + <el-popconfirm title="确定删除吗?" @confirm="delTeacherManager(item, 2)" v-if="!code">
204 <i class="el-icon-delete" slot="reference"></i> 123 <i class="el-icon-delete" slot="reference"></i>
205 </el-popconfirm> 124 </el-popconfirm>
206 <div class="grade-item"> 125 <div class="grade-item">
@@ -220,25 +139,13 @@ @@ -220,25 +139,13 @@
220 </li> 139 </li>
221 </ul> 140 </ul>
222 </div> 141 </div>
223 - <div  
224 - class="grade-box"  
225 - v-if="  
226 - teacherDetail.teacherGradeList &&  
227 - teacherDetail.teacherGradeList.length  
228 - "  
229 - > 142 + <div class="grade-box" v-if="teacherDetail.teacherGradeList &&
  143 + teacherDetail.teacherGradeList.length
  144 + ">
230 <p class="h-title">备课组长</p> 145 <p class="h-title">备课组长</p>
231 - <ul  
232 - class="grade-info"  
233 - v-for="item in teacherDetail.teacherGradeList"  
234 - :key="item.grade"  
235 - > 146 + <ul class="grade-info" v-for="item in teacherDetail.teacherGradeList" :key="item.grade">
236 <li class="grade-li"> 147 <li class="grade-li">
237 - <el-popconfirm  
238 - title="确定删除吗?"  
239 - @confirm="delTeacherManager(item, 3)"  
240 - v-if="!code"  
241 - > 148 + <el-popconfirm title="确定删除吗?" @confirm="delTeacherManager(item, 3)" v-if="!code">
242 <i class="el-icon-delete" slot="reference"></i> 149 <i class="el-icon-delete" slot="reference"></i>
243 </el-popconfirm> 150 </el-popconfirm>
244 <div class="grade-item"> 151 <div class="grade-item">
@@ -252,18 +159,8 @@ @@ -252,18 +159,8 @@
252 </div> 159 </div>
253 </div> 160 </div>
254 </div> 161 </div>
255 - <el-dialog  
256 - :close-on-click-modal="false"  
257 - title="导入教师名单"  
258 - :visible.sync="diaUp"  
259 - width="600"  
260 - >  
261 - <upload  
262 - id="downTeacher"  
263 - :url="url"  
264 - @upSuccess="upSuccess"  
265 - fileName="教师名单"  
266 - > 162 + <el-dialog :close-on-click-modal="false" title="导入教师名单" :visible.sync="diaUp" width="600">
  163 + <upload id="downTeacher" :url="url" @upSuccess="upSuccess" fileName="教师名单">
267 <p class="down-txt" slot="down"> 164 <p class="down-txt" slot="down">
268 通过Excel名单导入教师名单,点击 165 通过Excel名单导入教师名单,点击
269 <el-link type="danger" @click="downExcel">模板下载</el-link> 。 166 <el-link type="danger" @click="downExcel">模板下载</el-link> 。
@@ -273,115 +170,42 @@ @@ -273,115 +170,42 @@
273 <el-button @click="diaUp = false">取 消</el-button> 170 <el-button @click="diaUp = false">取 消</el-button>
274 </div> 171 </div>
275 </el-dialog> 172 </el-dialog>
276 - <el-dialog  
277 - :close-on-click-modal="false"  
278 - :title="  
279 - isAdd ? '添加教师' : setTercherType == 1 ? '编辑教师信息' : '管理班级'  
280 - "  
281 - :visible.sync="diaTeacher"  
282 - width="400"  
283 - append-to-body  
284 - >  
285 - <el-form  
286 - class="form-box"  
287 - ref="formTeacher"  
288 - :model="formTeacher"  
289 - :rules="rulesTeacher"  
290 - label-width="160px"  
291 - > 173 + <el-dialog :close-on-click-modal="false" :title="isAdd ? '添加教师' : setTercherType == 1 ? '编辑教师信息' : '管理班级'
  174 + " :visible.sync="diaTeacher" width="400" append-to-body>
  175 + <el-form class="form-box" ref="formTeacher" :model="formTeacher" :rules="rulesTeacher" label="" -width="160px">
292 <el-form-item v-show="!isAdd && setTercherType == 2" label="教师姓名:"> 176 <el-form-item v-show="!isAdd && setTercherType == 2" label="教师姓名:">
293 <span>{{ formTeacher.teacherName }}</span> 177 <span>{{ formTeacher.teacherName }}</span>
294 </el-form-item> 178 </el-form-item>
295 - <el-form-item  
296 - v-show="isAdd || (!isAdd && setTercherType == 1)"  
297 - label="手机号码:"  
298 - prop="loginName"  
299 - > 179 + <el-form-item v-show="isAdd || (!isAdd && setTercherType == 1)" label="手机号码:" prop="loginName">
300 <el-col :span="10"> 180 <el-col :span="10">
301 - <el-input  
302 - type="number"  
303 - oninput="if(value.length > 11) value = value.slice(0,11)"  
304 - v-model.trim="formTeacher.loginName"  
305 - /> 181 + <el-input type="number" oninput="if(value.length > 11) value = value.slice(0,11)"
  182 + v-model.trim="formTeacher.loginName" />
306 </el-col> 183 </el-col>
307 </el-form-item> 184 </el-form-item>
308 - <el-form-item  
309 - v-show="isAdd || (!isAdd && setTercherType == 1)"  
310 - label="教师姓名:"  
311 - prop="teacherName"  
312 - > 185 + <el-form-item v-show="isAdd || (!isAdd && setTercherType == 1)" label="教师姓名:" prop="teacherName">
313 <el-col :span="10"> 186 <el-col :span="10">
314 <el-input maxlength="30" v-model.trim="formTeacher.teacherName" /> 187 <el-input maxlength="30" v-model.trim="formTeacher.teacherName" />
315 </el-col> 188 </el-col>
316 </el-form-item> 189 </el-form-item>
317 - <el-form-item  
318 - v-show="isAdd || (!isAdd && setTercherType == 1)"  
319 - label="性别:"  
320 - prop="sex"  
321 - > 190 + <el-form-item v-show="isAdd || (!isAdd && setTercherType == 1)" label="性别:" prop="sex">
322 <el-radio-group v-model="formTeacher.sex"> 191 <el-radio-group v-model="formTeacher.sex">
323 <el-radio :label="1">男</el-radio> 192 <el-radio :label="1">男</el-radio>
324 <el-radio :label="2">女</el-radio> 193 <el-radio :label="2">女</el-radio>
325 </el-radio-group> 194 </el-radio-group>
326 </el-form-item> 195 </el-form-item>
327 - <el-form-item  
328 - v-show="isAdd || (!isAdd && setTercherType == 2)"  
329 - label="教师角色:"  
330 - prop="roleList"  
331 - >  
332 - <div  
333 - class="role-list"  
334 - v-for="(item, index) in formTeacher.roleList"  
335 - :key="item.id"  
336 - >  
337 - <el-select  
338 - class="sel-c"  
339 - v-model="item.roleId"  
340 - placeholder="选择角色"  
341 - @change="item.classId = []"  
342 - >  
343 - <el-option  
344 - v-for="item in teacherRoleList"  
345 - :key="item.value"  
346 - :label="item.label"  
347 - :value="item.value"  
348 - > 196 + <el-form-item v-show="isAdd || (!isAdd && setTercherType == 2)" label="教师角色:" prop="roleList">
  197 + <div class="role-list" v-for="(item, index) in formTeacher.roleList" :key="item.id">
  198 + <el-select class="sel-c" v-model="item.roleId" placeholder="选择角色" @change="item.classId = []">
  199 + <el-option v-for="item in teacherRoleList" :key="item.value" :label="item.label" :value="item.value">
349 </el-option> 200 </el-option>
350 </el-select> 201 </el-select>
351 - <el-cascader  
352 - size="small"  
353 - v-if="item.roleId == 6"  
354 - class="sel-t"  
355 - collapse  
356 - clearable  
357 - placeholder="选择年级-班级"  
358 - v-model="item.classId"  
359 - :options="gradeClassList"  
360 - :props="{ expandTrigger: 'hover' }"  
361 - ></el-cascader>  
362 - <el-cascader  
363 - size="small"  
364 - v-if="item.roleId == 7"  
365 - class="sel-t teacher-cascader"  
366 - collapse  
367 - clearable  
368 - placeholder="选择年级-科目-班级"  
369 - v-model="item.classId"  
370 - :options="gradeSubListClass"  
371 - :props="{ expandTrigger: 'hover', multiple: true }"  
372 - popperClass="cascader-clazz"  
373 - ></el-cascader>  
374 - <el-cascader  
375 - size="small"  
376 - v-if="item.roleId == 8"  
377 - class="sel-t"  
378 - collapse  
379 - clearable  
380 - placeholder="选择年级-科目"  
381 - v-model="item.classId"  
382 - :options="gradeList"  
383 - :props="{ expandTrigger: 'hover' }"  
384 - ></el-cascader> 202 + <el-cascader size="small" v-if="item.roleId == 6" class="sel-t" collapse clearable placeholder="选择年级-班级"
  203 + v-model="item.classId" :options="gradeClassList" :props="{ expandTrigger: 'hover' }"></el-cascader>
  204 + <el-cascader size="small" v-if="item.roleId == 7" class="sel-t teacher-cascader" collapse clearable
  205 + placeholder="选择年级-科目-班级" v-model="item.classId" :options="gradeSubListClass"
  206 + :props="{ expandTrigger: 'hover', multiple: true }" popperClass="cascader-clazz"></el-cascader>
  207 + <el-cascader size="small" v-if="item.roleId == 8" class="sel-t" collapse clearable placeholder="选择年级-科目"
  208 + v-model="item.classId" :options="gradeList" :props="{ expandTrigger: 'hover' }"></el-cascader>
385 <i class="el-icon-close" @click="removeRoleList(index)"></i> 209 <i class="el-icon-close" @click="removeRoleList(index)"></i>
386 </div> 210 </div>
387 <p class="add-box"> 211 <p class="add-box">
@@ -415,6 +239,7 @@ export default { @@ -415,6 +239,7 @@ export default {
415 isAdd: false, 239 isAdd: false,
416 setTercherType: 1, 240 setTercherType: 1,
417 query: { 241 query: {
  242 + classType: 0,
418 gradeClassSub: [], 243 gradeClassSub: [],
419 type: 0, 244 type: 0,
420 teacherName: "", 245 teacherName: "",
@@ -469,8 +294,20 @@ export default { @@ -469,8 +294,20 @@ export default {
469 { required: true, message: "请选择角色信息", trigger: "blur" }, 294 { required: true, message: "请选择角色信息", trigger: "blur" },
470 ], 295 ],
471 }, 296 },
  297 +
  298 + AllTeacher: false,
  299 + indeterminate: false,
  300 + clearTeacher: [],
  301 + removeLoading: false
472 }; 302 };
473 }, 303 },
  304 + computed: {
  305 + showDel: function () {
  306 + return !this.query.gradeClassSub.some(item => {
  307 + return item.length > 1
  308 + })
  309 + }
  310 + },
474 async created() { 311 async created() {
475 this.code = localStorage.getItem("csCode") || ""; 312 this.code = localStorage.getItem("csCode") || "";
476 this._QueryData(4); 313 this._QueryData(4);
@@ -479,6 +316,50 @@ export default { @@ -479,6 +316,50 @@ export default {
479 await this._QueryClass(); 316 await this._QueryClass();
480 }, 317 },
481 methods: { 318 methods: {
  319 + //选择删除
  320 + handleCheckAllChange(val) {
  321 + this.clearTeacher = val
  322 + ? this.teacherList.map((item) => {
  323 + return item.id;
  324 + })
  325 + : [];
  326 + this.indeterminate = false;
  327 + },
  328 + handleCheckedChange(value) {
  329 + let checkedCount = value.length;
  330 + this.checkAll = checkedCount === this.teacherList.length;
  331 + this.indeterminate =
  332 + checkedCount > 0 && checkedCount < this.teacherList.length;
  333 + },
  334 + async remove() {
  335 + if (this.clearTeacher.length) {
  336 + this.$message.warning("请选择要格式化的老师")
  337 + return
  338 + }
  339 + this.removeLoading = true
  340 + let grades = []
  341 + this.query.gradeClassSub.map(item => {
  342 + if (item.length == 1) {
  343 + if (!grades.includes(item[0])) {
  344 + grades.push(item[0]);
  345 + }
  346 + }
  347 + })
  348 + const { data, status, info } = await this.$request.teacherTemplate({
  349 + ids: this.clearTeacher,
  350 + type: this.query.classType,
  351 + grades: grades
  352 + });
  353 + this.removeLoading = false
  354 + if (status === 0) {
  355 + this.$message.success(info);
  356 + this._QueryData();
  357 + } else {
  358 + this.$message.error(info);
  359 + }
  360 + },
  361 + //end
  362 +
482 gradeName(type) { 363 gradeName(type) {
483 return setGradeName(type); 364 return setGradeName(type);
484 }, 365 },
@@ -955,28 +836,34 @@ export default { @@ -955,28 +836,34 @@ export default {
955 .page-content { 836 .page-content {
956 padding: 0 20px 20px; 837 padding: 0 20px 20px;
957 } 838 }
  839 +
958 .total { 840 .total {
959 padding: 0 20px 10px; 841 padding: 0 20px 10px;
960 font-size: 14px; 842 font-size: 14px;
961 color: #666; 843 color: #666;
962 } 844 }
  845 +
963 .teacher-box { 846 .teacher-box {
964 display: flex; 847 display: flex;
965 background: #f8f8f8; 848 background: #f8f8f8;
966 border-radius: 10px; 849 border-radius: 10px;
967 overflow: hidden; 850 overflow: hidden;
968 min-height: 400px; 851 min-height: 400px;
  852 +
969 .teacher-ul { 853 .teacher-ul {
970 max-height: 60vh; 854 max-height: 60vh;
971 - overflow-y: scroll; 855 + overflow-y: auto;
  856 +
972 &::-webkit-scrollbar { 857 &::-webkit-scrollbar {
973 width: 6px; 858 width: 6px;
974 } 859 }
  860 +
975 &::-webkit-scrollbar-thumb { 861 &::-webkit-scrollbar-thumb {
976 border-radius: 10px; 862 border-radius: 10px;
977 background-color: #ccc; 863 background-color: #ccc;
978 } 864 }
979 } 865 }
  866 +
980 .teacher-list { 867 .teacher-list {
981 width: 240px; 868 width: 240px;
982 869
@@ -984,17 +871,38 @@ export default { @@ -984,17 +871,38 @@ export default {
984 height: 40px; 871 height: 40px;
985 line-height: 40px; 872 line-height: 40px;
986 background: #eee; 873 background: #eee;
987 - // border-radius: 10px 10px 0 0; 874 + display: flex;
  875 + justify-content: space-between;
  876 + align-items: center;
  877 +
  878 + .txt {
  879 + flex: 1;
  880 + }
  881 +
  882 + .clear {
  883 + width: 18px;
  884 + margin-right: 10px;
  885 + cursor: pointer;
  886 + transition: all .3s;
  887 +
  888 + &:hover {
  889 + transform: scale(1.1);
  890 + }
  891 + }
988 } 892 }
  893 +
989 .teacher-item { 894 .teacher-item {
990 font-size: 16px; 895 font-size: 16px;
991 color: #7f7f7f; 896 color: #7f7f7f;
992 line-height: 36px; 897 line-height: 36px;
993 cursor: pointer; 898 cursor: pointer;
994 padding-left: 12px; 899 padding-left: 12px;
  900 + display: flex;
  901 +
995 &:hover { 902 &:hover {
996 background: #eee; 903 background: #eee;
997 } 904 }
  905 +
998 &.active { 906 &.active {
999 color: #667ffd; 907 color: #667ffd;
1000 background: #eee; 908 background: #eee;
@@ -1006,19 +914,23 @@ export default { @@ -1006,19 +914,23 @@ export default {
1006 flex: 1; 914 flex: 1;
1007 position: relative; 915 position: relative;
1008 padding-left: 10px; 916 padding-left: 10px;
  917 +
1009 .icon-box { 918 .icon-box {
1010 position: absolute; 919 position: absolute;
1011 top: 12px; 920 top: 12px;
1012 right: 20px; 921 right: 20px;
  922 +
1013 .icon { 923 .icon {
1014 font-size: 24px; 924 font-size: 24px;
1015 color: #7f7f7f; 925 color: #7f7f7f;
1016 cursor: pointer; 926 cursor: pointer;
1017 } 927 }
  928 +
1018 .el-icon-circle-plus-outline { 929 .el-icon-circle-plus-outline {
1019 margin-left: 10px; 930 margin-left: 10px;
1020 } 931 }
1021 } 932 }
  933 +
1022 .detail-top { 934 .detail-top {
1023 padding: 12px 20px; 935 padding: 12px 20px;
1024 box-sizing: border-box; 936 box-sizing: border-box;
@@ -1026,20 +938,24 @@ export default { @@ -1026,20 +938,24 @@ export default {
1026 flex-wrap: wrap; 938 flex-wrap: wrap;
1027 font-size: 14px; 939 font-size: 14px;
1028 color: #7f7f7f; 940 color: #7f7f7f;
  941 +
1029 .p-item { 942 .p-item {
1030 width: 40%; 943 width: 40%;
1031 line-height: 28px; 944 line-height: 28px;
1032 } 945 }
1033 } 946 }
  947 +
1034 .grade-box { 948 .grade-box {
1035 .grade-info { 949 .grade-info {
1036 display: flex; 950 display: flex;
1037 flex-wrap: wrap; 951 flex-wrap: wrap;
1038 padding: 20px 20px 0; 952 padding: 20px 20px 0;
1039 - & > li { 953 +
  954 + &>li {
1040 margin-right: 20px; 955 margin-right: 20px;
1041 margin-bottom: 20px; 956 margin-bottom: 20px;
1042 position: relative; 957 position: relative;
  958 +
1043 .el-icon-delete { 959 .el-icon-delete {
1044 position: absolute; 960 position: absolute;
1045 top: 8px; 961 top: 8px;
@@ -1047,10 +963,12 @@ export default { @@ -1047,10 +963,12 @@ export default {
1047 padding: 2px; 963 padding: 2px;
1048 cursor: pointer; 964 cursor: pointer;
1049 display: none; 965 display: none;
  966 +
1050 &:hover { 967 &:hover {
1051 color: #667ffd; 968 color: #667ffd;
1052 } 969 }
1053 } 970 }
  971 +
1054 &:hover { 972 &:hover {
1055 .el-icon-delete { 973 .el-icon-delete {
1056 display: block; 974 display: block;
@@ -1065,22 +983,26 @@ export default { @@ -1065,22 +983,26 @@ export default {
1065 border-radius: 10px; 983 border-radius: 10px;
1066 box-shadow: 1px 1px 3px #888; 984 box-shadow: 1px 1px 3px #888;
1067 } 985 }
  986 +
1068 .grade-name { 987 .grade-name {
1069 font-size: 16px; 988 font-size: 16px;
1070 font-weight: bold; 989 font-weight: bold;
1071 line-height: 18px; 990 line-height: 18px;
1072 padding-bottom: 12px; 991 padding-bottom: 12px;
1073 } 992 }
  993 +
1074 .grade-class { 994 .grade-class {
1075 display: flex; 995 display: flex;
1076 justify-content: space-between; 996 justify-content: space-between;
1077 font-size: 15px; 997 font-size: 15px;
1078 padding-right: 20px; 998 padding-right: 20px;
  999 +
1079 .fa { 1000 .fa {
1080 font-size: 18px; 1001 font-size: 18px;
1081 margin-right: 5px; 1002 margin-right: 5px;
1082 color: #a4a4a4; 1003 color: #a4a4a4;
1083 } 1004 }
  1005 +
1084 .fa-book { 1006 .fa-book {
1085 font-size: 20px; 1007 font-size: 20px;
1086 } 1008 }
@@ -1089,16 +1011,20 @@ export default { @@ -1089,16 +1011,20 @@ export default {
1089 } 1011 }
1090 } 1012 }
1091 } 1013 }
  1014 +
1092 .add-box { 1015 .add-box {
1093 margin-top: 10px; 1016 margin-top: 10px;
1094 } 1017 }
  1018 +
1095 .sel-c { 1019 .sel-c {
1096 width: 120px; 1020 width: 120px;
1097 margin-right: 12px; 1021 margin-right: 12px;
1098 } 1022 }
  1023 +
1099 .role-list { 1024 .role-list {
1100 margin-bottom: 10px; 1025 margin-bottom: 10px;
1101 position: relative; 1026 position: relative;
  1027 +
1102 .sel-p { 1028 .sel-p {
1103 position: absolute; 1029 position: absolute;
1104 left: 146px; 1030 left: 146px;
@@ -1106,11 +1032,13 @@ export default { @@ -1106,11 +1032,13 @@ export default {
1106 font-size: 13px; 1032 font-size: 13px;
1107 color: #606266; 1033 color: #606266;
1108 } 1034 }
  1035 +
1109 .sel-t { 1036 .sel-t {
1110 :deep(.el-input__inner) { 1037 :deep(.el-input__inner) {
1111 background: transparent; 1038 background: transparent;
1112 } 1039 }
1113 } 1040 }
  1041 +
1114 .el-icon-close { 1042 .el-icon-close {
1115 padding: 5px; 1043 padding: 5px;
1116 cursor: pointer; 1044 cursor: pointer;