Commit 29319cfbd8e4f3a037a7a6c1bc3aba14d998d25c

Authored by 梁保满
1 parent 9865dde4

设备。教师管理

src/api/apis/apis.js
... ... @@ -1630,4 +1630,25 @@ export default {
1630 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 101 }
102 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 113 export default service;
... ...
src/api/urls/apis.js
... ... @@ -426,4 +426,8 @@ export default {
426 426 paperWordUpload: "/api_html/common/paper/upload",
427 427 //删除随堂问报表
428 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 2 \ No newline at end of file
... ...
src/views/basic/device/index.vue
... ... @@ -7,37 +7,16 @@
7 7 <template slot="btns">
8 8 <template v-if="tableData.length">
9 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 11 </el-tooltip>
19 12 </template>
20 13 <template v-if="role == 'ROLE_XUEXIAO' && type == 1">
21 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 16 </el-tooltip>
31 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 20 </template>
42 21 </back-box>
43 22 <div>
... ... @@ -48,16 +27,10 @@
48 27 <el-radio-button :label="3">授课端管理</el-radio-button>
49 28 </el-radio-group>
50 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 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 34 </p>
62 35 <div class="content">
63 36 <div v-show="type == 1">
... ... @@ -67,101 +40,39 @@
67 40 <p class="p2">基站数量</p>
68 41 </div>
69 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 44 </div>
76 45 </div>
77 46 <div class="table-box">
78 47 <div class="answer-header">
79 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 53 </el-option>
104 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 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 60 </div>
122 61 </div>
123 62 <p class="loading" v-if="!tableData.length && loading">
124 63 加载中<i class="el-icon-loading"></i>
125 64 </p>
126 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 71 <p v-for="(item, index) in scoped.row.classList" :key="index">
156 72 {{ item.gradeName }}
157 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 76 <el-table-column label="关联班级" align="center">
166 77 <template slot-scope="scoped">
167 78 <p v-for="(item, index) in scoped.row.classList" :key="index">
... ... @@ -169,60 +80,31 @@
169 80 </p>
170 81 </template>
171 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 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 98 </el-tooltip>
216 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 108 </el-table>
227 109 </div>
228 110 </div>
... ... @@ -233,151 +115,61 @@
233 115 <p class="p2">答题器数量</p>
234 116 </div>
235 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 120 </div>
242 121 </div>
243 122 <div class="table-box">
244 123 <div class="answer-header">
245 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 129 </el-option>
270 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 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 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 140 </div>
303 141 </div>
304 142 <p class="loading" v-if="!tableData.length && loading">
305 143 加载中<i class="el-icon-loading"></i>
306 144 </p>
307 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 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 155 <p v-for="(item, index) in scoped.row.classList" :key="index">
337 156 {{ item.gradeName }}
338 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 160 <template slot-scope="scoped">
348 161 <p v-for="(item, index) in scoped.row.classList" :key="index">
349 162 {{ item.className }}
350 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 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 173 </el-table>
382 174 </div>
383 175 </div>
... ... @@ -385,27 +177,12 @@
385 177 <div class="table-box">
386 178 <div class="answer-header">
387 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 186 </div>
410 187 <p class="upgrade-all" v-if="this.role == 'ROLE_XUEXIAO'">
411 188 <span>全校更新:</span>
... ... @@ -416,102 +193,49 @@
416 193 <p class="loading" v-if="!tableData.length && loading">
417 194 加载中<i class="el-icon-loading"></i>
418 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 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 201 <p v-for="(item, index) in scoped.row.classList" :key="index">
440 202 {{ item.className }}
441 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 208 <p v-for="(item, index) in scoped.row.classList" :key="index">
458 209 {{ item.gradeName }}
459 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 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 233 </el-table>
503 234 </div>
504 235 </div>
505 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 239 </el-pagination>
516 240 </div>
517 241 </div>
... ... @@ -527,75 +251,33 @@
527 251 <el-button @click="diaUp = false">取 消</el-button>
528 252 </div>
529 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 255 <el-form ref="forms" :model="form" :rules="formRules" label-width="140px">
536 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 260 </el-form-item>
550 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 265 </el-form-item>
563 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 270 </el-form-item>
576 271 <el-form-item label="选择班级:" prop="classIds">
577 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 275 </el-col>
586 276 </el-form-item>
587 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 281 </el-form-item>
600 282 </el-form>
601 283 <div class="dialog-footer" slot="footer">
... ... @@ -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 496 clickPieChart(obj) {
804 497 this.query.onlineStatus =
805 498 obj.name == "在线" ? 1 : obj.name == "离线" ? 0 : 2;
... ... @@ -813,14 +506,14 @@ export default {
813 506 obj.name == "1日内"
814 507 ? 1
815 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 517 this.query.sn = "";
825 518 this.query.classId = [];
826 519 this.page = 1;
... ... @@ -865,7 +558,7 @@ export default {
865 558 if (data && !data.code) {
866 559 this._QueryData(false);
867 560 this.selectionTabIds = [];
868   - this.$message.success(this.upgradeFlag?"开启自动更新成功":"关闭/停止自动更新成功");
  561 + this.$message.success(this.upgradeFlag ? "开启自动更新成功" : "关闭/停止自动更新成功");
869 562 } else {
870 563 this.$message.error(data.info);
871 564 }
... ... @@ -931,6 +624,20 @@ export default {
931 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 641 async downExcel() {
935 642 let data = await this.$request.stationTemplate({
936 643 id: this.id,
... ... @@ -944,8 +651,8 @@ export default {
944 651 this.$message.error("下载失败");
945 652 }
946 653 },
  654 + //报表导出
947 655 async downExl() {
948   - //报表导出
949 656 if (this.exportLoading == true) return;
950 657 let query = this.setQuery();
951 658 const exportDevice =
... ... @@ -967,8 +674,8 @@ export default {
967 674 this.type == 1
968 675 ? "基站管理报表.xlsx"
969 676 : this.type == 2
970   - ? "答题器报表.xlsx"
971   - : "授课端报表.xlsx";
  677 + ? "答题器报表.xlsx"
  678 + : "授课端报表.xlsx";
972 679 downloadFile(txt, blob);
973 680 } else {
974 681 this.$message.error(data.info);
... ... @@ -1079,8 +786,8 @@ export default {
1079 786 item.onlineStatus == "1"
1080 787 ? "在线"
1081 788 : item.onlineStatus == 0
1082   - ? "离线"
1083   - : "异常",
  789 + ? "离线"
  790 + : "异常",
1084 791 value: item.total,
1085 792 rate: item.rate,
1086 793 };
... ... @@ -1105,14 +812,14 @@ export default {
1105 812 item.type == 1
1106 813 ? "1日内"
1107 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 823 count: item.total,
1117 824 value: item.rate * 100,
1118 825 };
... ... @@ -1276,39 +983,52 @@ export default {
1276 983 height: 100%;
1277 984 overflow-y: auto;
1278 985 }
  986 +
1279 987 .tab-box {
1280 988 padding: 20px 0 12px;
1281 989 }
  990 +
1282 991 .down {
1283 992 padding: 0 0 16px 20px;
1284 993 }
  994 +
1285 995 .error-tips {
1286 996 margin-bottom: 12px;
1287 997 }
  998 +.del{
  999 + margin-left: 10px;
  1000 +}
  1001 +
1288 1002 .content {
1289 1003 background: #f8f8f8;
1290 1004 border: 1px solid #e2e2e2;
1291 1005 border-radius: 10px;
1292 1006 overflow: hidden;
  1007 +
1293 1008 :deep(.fa-edit) {
1294 1009 width: 12px;
1295 1010 height: 12px;
  1011 +
1296 1012 &::before {
1297 1013 margin-left: 2px;
1298 1014 }
1299 1015 }
1300   - :deep(.fa-eye) {
  1016 +
  1017 + :deep(.fa) {
1301 1018 width: 12px;
1302 1019 height: 12px;
  1020 +
1303 1021 &::before {
1304 1022 margin-left: 1px;
1305 1023 }
1306 1024 }
  1025 +
1307 1026 .chart-box {
1308 1027 display: flex;
1309 1028 overflow: hidden;
1310 1029 height: 240px;
1311 1030 border-bottom: 0.5px solid #e2e2e2;
  1031 +
1312 1032 .device-num {
1313 1033 width: 280px;
1314 1034 border-right: 0.5px solid #e2e2e2;
... ... @@ -1316,26 +1036,32 @@ export default {
1316 1036 flex-direction: column;
1317 1037 justify-content: center;
1318 1038 align-items: center;
  1039 +
1319 1040 .p1 {
1320 1041 font-size: 28px;
1321 1042 }
1322 1043 }
  1044 +
1323 1045 .chart {
1324 1046 flex: 1;
1325 1047 height: 100%;
1326 1048 }
1327 1049 }
  1050 +
1328 1051 .table-box {
1329 1052 padding: 20px 20px 0;
  1053 +
1330 1054 .loading {
1331 1055 text-align: center;
1332 1056 line-height: 36px;
1333 1057 font-size: 16px;
1334 1058 color: #666;
1335 1059 }
  1060 +
1336 1061 .answer-header {
1337 1062 padding: 0;
1338 1063 margin-bottom: 12px;
  1064 +
1339 1065 .upgrade-all {
1340 1066 display: flex;
1341 1067 align-items: center;
... ... @@ -1343,11 +1069,14 @@ export default {
1343 1069 }
1344 1070 }
1345 1071 }
  1072 +
1346 1073 .answer-header .sel-box .input-with-select {
1347 1074 margin-right: 20px;
  1075 +
1348 1076 :deep(.el-input__suffix) {
1349 1077 right: -5px;
1350 1078 }
  1079 +
1351 1080 :deep(.el-button) {
1352 1081 padding: 12px 16px 12px 10px;
1353 1082 }
... ...
src/views/basic/device/log.vue
... ... @@ -286,7 +286,7 @@ export default {
286 286 for (let key in this.query) {
287 287 if (this.query[key] != "") {
288 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 290 } else {
291 291 query[key] = this.query[key];
292 292 }
... ...
src/views/basic/setUp/teacher.vue
... ... @@ -6,93 +6,41 @@
6 6 </template>
7 7 <template slot="btns" v-if="!code">
8 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 10 </el-tooltip>
18 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 14 </el-tooltip>
28 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 17 </el-tooltip>
38 18 </template>
39 19 </back-box>
40 20  
41 21 <div class="answer-header">
42 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 29 multiple: true,
53 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 33 <el-option disabled label="请选择" :value="9"></el-option>
65 34 <el-option label="已分配任课信息" :value="0"></el-option>
66 35 <el-option label="未分配任课信息" :value="1"></el-option>
67 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 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 44 </el-input>
97 45 <!-- <el-button class="serach-box" round @click="_QueryData(4)"
98 46 >筛选</el-button
... ... @@ -103,36 +51,30 @@
103 51 共筛选出{{ teacherList.length }}名教师。
104 52 </p>
105 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 55 <div class="teacher-box" v-loading="loading" v-else>
112 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 73 </div>
129 74 <div class="teacher-detail">
130 75 <div class="icon-box" v-if="!code">
131 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 78 </div>
137 79 <div class="detail-top">
138 80 <p class="p-item">手机号码:{{ teacherDetail.loginName }}</p>
... ... @@ -142,29 +84,18 @@
142 84 <p class="p-item">
143 85 性别:{{
144 86 teacherDetail.sex == 1
145   - ? "男"
146   - : teacherDetail.sex == 2
  87 + ? "男"
  88 + : teacherDetail.sex == 2
147 89 ? "女"
148 90 : "未知"
149 91 }}
150 92 </p>
151 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 95 <p class="h-title">班主任</p>
157 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 99 <i class="el-icon-delete" slot="reference"></i>
169 100 </el-popconfirm>
170 101 <div class="grade-item">
... ... @@ -182,25 +113,13 @@
182 113 </li>
183 114 </ul>
184 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 119 <p class="h-title">任课老师</p>
193 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 123 <i class="el-icon-delete" slot="reference"></i>
205 124 </el-popconfirm>
206 125 <div class="grade-item">
... ... @@ -220,25 +139,13 @@
220 139 </li>
221 140 </ul>
222 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 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 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 149 <i class="el-icon-delete" slot="reference"></i>
243 150 </el-popconfirm>
244 151 <div class="grade-item">
... ... @@ -252,18 +159,8 @@
252 159 </div>
253 160 </div>
254 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 164 <p class="down-txt" slot="down">
268 165 通过Excel名单导入教师名单,点击
269 166 <el-link type="danger" @click="downExcel">模板下载</el-link> 。
... ... @@ -273,115 +170,42 @@
273 170 <el-button @click="diaUp = false">取 消</el-button>
274 171 </div>
275 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 176 <el-form-item v-show="!isAdd && setTercherType == 2" label="教师姓名:">
293 177 <span>{{ formTeacher.teacherName }}</span>
294 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 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 183 </el-col>
307 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 186 <el-col :span="10">
314 187 <el-input maxlength="30" v-model.trim="formTeacher.teacherName" />
315 188 </el-col>
316 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 191 <el-radio-group v-model="formTeacher.sex">
323 192 <el-radio :label="1">男</el-radio>
324 193 <el-radio :label="2">女</el-radio>
325 194 </el-radio-group>
326 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 200 </el-option>
350 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 209 <i class="el-icon-close" @click="removeRoleList(index)"></i>
386 210 </div>
387 211 <p class="add-box">
... ... @@ -415,6 +239,7 @@ export default {
415 239 isAdd: false,
416 240 setTercherType: 1,
417 241 query: {
  242 + classType: 0,
418 243 gradeClassSub: [],
419 244 type: 0,
420 245 teacherName: "",
... ... @@ -469,8 +294,20 @@ export default {
469 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 311 async created() {
475 312 this.code = localStorage.getItem("csCode") || "";
476 313 this._QueryData(4);
... ... @@ -479,6 +316,50 @@ export default {
479 316 await this._QueryClass();
480 317 },
481 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 363 gradeName(type) {
483 364 return setGradeName(type);
484 365 },
... ... @@ -955,28 +836,34 @@ export default {
955 836 .page-content {
956 837 padding: 0 20px 20px;
957 838 }
  839 +
958 840 .total {
959 841 padding: 0 20px 10px;
960 842 font-size: 14px;
961 843 color: #666;
962 844 }
  845 +
963 846 .teacher-box {
964 847 display: flex;
965 848 background: #f8f8f8;
966 849 border-radius: 10px;
967 850 overflow: hidden;
968 851 min-height: 400px;
  852 +
969 853 .teacher-ul {
970 854 max-height: 60vh;
971   - overflow-y: scroll;
  855 + overflow-y: auto;
  856 +
972 857 &::-webkit-scrollbar {
973 858 width: 6px;
974 859 }
  860 +
975 861 &::-webkit-scrollbar-thumb {
976 862 border-radius: 10px;
977 863 background-color: #ccc;
978 864 }
979 865 }
  866 +
980 867 .teacher-list {
981 868 width: 240px;
982 869  
... ... @@ -984,17 +871,38 @@ export default {
984 871 height: 40px;
985 872 line-height: 40px;
986 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 894 .teacher-item {
990 895 font-size: 16px;
991 896 color: #7f7f7f;
992 897 line-height: 36px;
993 898 cursor: pointer;
994 899 padding-left: 12px;
  900 + display: flex;
  901 +
995 902 &:hover {
996 903 background: #eee;
997 904 }
  905 +
998 906 &.active {
999 907 color: #667ffd;
1000 908 background: #eee;
... ... @@ -1006,19 +914,23 @@ export default {
1006 914 flex: 1;
1007 915 position: relative;
1008 916 padding-left: 10px;
  917 +
1009 918 .icon-box {
1010 919 position: absolute;
1011 920 top: 12px;
1012 921 right: 20px;
  922 +
1013 923 .icon {
1014 924 font-size: 24px;
1015 925 color: #7f7f7f;
1016 926 cursor: pointer;
1017 927 }
  928 +
1018 929 .el-icon-circle-plus-outline {
1019 930 margin-left: 10px;
1020 931 }
1021 932 }
  933 +
1022 934 .detail-top {
1023 935 padding: 12px 20px;
1024 936 box-sizing: border-box;
... ... @@ -1026,20 +938,24 @@ export default {
1026 938 flex-wrap: wrap;
1027 939 font-size: 14px;
1028 940 color: #7f7f7f;
  941 +
1029 942 .p-item {
1030 943 width: 40%;
1031 944 line-height: 28px;
1032 945 }
1033 946 }
  947 +
1034 948 .grade-box {
1035 949 .grade-info {
1036 950 display: flex;
1037 951 flex-wrap: wrap;
1038 952 padding: 20px 20px 0;
1039   - & > li {
  953 +
  954 + &>li {
1040 955 margin-right: 20px;
1041 956 margin-bottom: 20px;
1042 957 position: relative;
  958 +
1043 959 .el-icon-delete {
1044 960 position: absolute;
1045 961 top: 8px;
... ... @@ -1047,10 +963,12 @@ export default {
1047 963 padding: 2px;
1048 964 cursor: pointer;
1049 965 display: none;
  966 +
1050 967 &:hover {
1051 968 color: #667ffd;
1052 969 }
1053 970 }
  971 +
1054 972 &:hover {
1055 973 .el-icon-delete {
1056 974 display: block;
... ... @@ -1065,22 +983,26 @@ export default {
1065 983 border-radius: 10px;
1066 984 box-shadow: 1px 1px 3px #888;
1067 985 }
  986 +
1068 987 .grade-name {
1069 988 font-size: 16px;
1070 989 font-weight: bold;
1071 990 line-height: 18px;
1072 991 padding-bottom: 12px;
1073 992 }
  993 +
1074 994 .grade-class {
1075 995 display: flex;
1076 996 justify-content: space-between;
1077 997 font-size: 15px;
1078 998 padding-right: 20px;
  999 +
1079 1000 .fa {
1080 1001 font-size: 18px;
1081 1002 margin-right: 5px;
1082 1003 color: #a4a4a4;
1083 1004 }
  1005 +
1084 1006 .fa-book {
1085 1007 font-size: 20px;
1086 1008 }
... ... @@ -1089,16 +1011,20 @@ export default {
1089 1011 }
1090 1012 }
1091 1013 }
  1014 +
1092 1015 .add-box {
1093 1016 margin-top: 10px;
1094 1017 }
  1018 +
1095 1019 .sel-c {
1096 1020 width: 120px;
1097 1021 margin-right: 12px;
1098 1022 }
  1023 +
1099 1024 .role-list {
1100 1025 margin-bottom: 10px;
1101 1026 position: relative;
  1027 +
1102 1028 .sel-p {
1103 1029 position: absolute;
1104 1030 left: 146px;
... ... @@ -1106,11 +1032,13 @@ export default {
1106 1032 font-size: 13px;
1107 1033 color: #606266;
1108 1034 }
  1035 +
1109 1036 .sel-t {
1110 1037 :deep(.el-input__inner) {
1111 1038 background: transparent;
1112 1039 }
1113 1040 }
  1041 +
1114 1042 .el-icon-close {
1115 1043 padding: 5px;
1116 1044 cursor: pointer;
... ...