Hardware.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725
  1. <template>
  2. <div class="content">
  3. <div class="tabs">
  4. <ul>
  5. <li v-for="(tab,i) in tabs" @click="goTab(tab.url)" :class="{'active':tabIndex == i}">
  6. {{tab.name}}
  7. </li>
  8. </ul>
  9. </div>
  10. <!--<div class="upload">-->
  11. <!--<h5>固件上传</h5>-->
  12. <!--<div class="uploadContainer">-->
  13. <!--<el-upload-->
  14. <!--class="upload-demo"-->
  15. <!--action="/api/v1/AdminSettings/FirmwareUpdate"-->
  16. <!--:on-change="handleChange"-->
  17. <!--:auto-upload="true"-->
  18. <!--:file-list="fileList">-->
  19. <!--<el-button size="small" type="primary">点击上传</el-button>-->
  20. <!--</el-upload>-->
  21. <!--&lt;!&ndash;<em class="addMemo" v-show="fileList.length == 0" @click="addMemo">&ndash;&gt;-->
  22. <!--&lt;!&ndash;<i></i>添加固件&ndash;&gt;-->
  23. <!--&lt;!&ndash;</em>&ndash;&gt;-->
  24. <!--</div>-->
  25. <!--</div>-->
  26. <div class="hardwareList">
  27. <h5>升级设备列表</h5>
  28. <div class="panel">
  29. <div class="panel-body">
  30. <div class=" panel_control">
  31. <el-row :gutter="20">
  32. <el-col :span="4">
  33. <em>标签名:</em>
  34. <el-input v-model="panel.tagname" placeholder="请输入标签名"></el-input>
  35. </el-col>
  36. <el-col :span="4">
  37. <em>所属区域:</em>
  38. <el-select v-model="panel.regionid">
  39. <el-option
  40. v-for="item in panel.regionidOptions"
  41. :key="item.Id"
  42. :label="item.Name"
  43. :value="item.Id">
  44. </el-option>
  45. </el-select>
  46. </el-col>
  47. <!--<el-col :span="4">-->
  48. <!--<em>固件版本:</em>-->
  49. <!--<el-input v-model="panel.keyword" placeholder="请输入固件版本"></el-input>-->
  50. <!--</el-col>-->
  51. <el-col :span="4">
  52. <el-button size="small" type="primary" @click="query">查询</el-button>
  53. </el-col>
  54. </el-row>
  55. </div>
  56. </div>
  57. </div>
  58. <div class="contorl">
  59. <!--<el-button size="small" type="primary" @click="startUpdate">开始更新</el-button>-->
  60. <div class="version">
  61. <em>NEW </em>
  62. <span>最新固件版本:M0固件:v{{FirmwareScanM0Version}}</span>
  63. <span>M4固件: v{{FirmwareScanM4Version}}</span>
  64. <span>ESP固件 :v{{FirmwareVersion}}</span>
  65. </div>
  66. <!--<el-tooltip class="item" effect="dark" content="一键更新全部设备固件" placement="top">-->
  67. <!--<i class="question"></i>-->
  68. <!--</el-tooltip>-->
  69. <!--<el-button class="allItem" size="small" type="primary" @click="changeList">全部更新</el-button>-->
  70. <el-upload
  71. class="upload-demo"
  72. :action="FirmwareUpdateUrl"
  73. :on-change="handleChange"
  74. :on-success="successResave"
  75. :before-upload="handleupload"
  76. :data="uploadData"
  77. :auto-upload="true"
  78. :file-list="fileList">
  79. <el-button size="small" type="primary">点击上传</el-button>
  80. </el-upload>
  81. </div>
  82. <br>
  83. <el-table
  84. :data="tableData"
  85. is-horizontal-resize
  86. :default-sort="{prop: 'date', order: 'descending'}"
  87. v-loading="loading"
  88. element-loading-background="rgba(0, 0, 0, 0.8)"
  89. class=""
  90. @selection-change="handleSelectionChange"
  91. stripe
  92. >
  93. <el-table-column
  94. type="selection"
  95. width="55">
  96. </el-table-column>
  97. <el-table-column
  98. prop="Mac"
  99. label="Mac"
  100. >
  101. </el-table-column>
  102. <el-table-column
  103. prop="TagName"
  104. label="标签名"
  105. >
  106. </el-table-column>
  107. <el-table-column
  108. prop="Location"
  109. label="位置"
  110. >
  111. <template slot-scope="scope">
  112. <el-tooltip class="item" effect="dark" :content="scope.row.Location" placement="top-start">
  113. <span>
  114. {{ scope.row.Location.length > 11 ? scope.row.Location.substr(0,11)+'...' : scope.row.Location }}
  115. </span>
  116. </el-tooltip>
  117. </template>
  118. </el-table-column>
  119. <el-table-column
  120. prop="FirmwareVersion"
  121. label="ESP固件"
  122. >
  123. </el-table-column>
  124. <el-table-column
  125. prop="HardwareVersion"
  126. label="硬件版本"
  127. >
  128. </el-table-column>
  129. <el-table-column
  130. prop="FirmwareScanM4Version"
  131. label="M4固件版本"
  132. >
  133. </el-table-column>
  134. <el-table-column
  135. prop="FirmwareScanM0Version"
  136. label="M0固件版本"
  137. >
  138. </el-table-column>
  139. <el-table-column
  140. prop="LastOnline"
  141. label="最近上线"
  142. >
  143. </el-table-column>
  144. <el-table-column
  145. prop="Memo"
  146. label="备注"
  147. >
  148. </el-table-column>
  149. <el-table-column
  150. prop="Status"
  151. label="状态"
  152. >
  153. <template slot-scope="scope">
  154. <span v-if="scope.row.Status == 0">已禁用</span>
  155. <span v-if="scope.row.Status == 1">已启用</span>
  156. <span v-if="scope.row.Status == 2">已离线</span>
  157. </template>
  158. </el-table-column>
  159. </el-table>
  160. <br>
  161. <el-pagination
  162. background
  163. :total="pageination.total"
  164. :page-size="pageination.pageItem"
  165. @current-change="pageChange"
  166. ></el-pagination>
  167. <dialog_referrer_list
  168. :show="dialog_state"
  169. :title="dialog_title"
  170. :large="true"
  171. @dialog_cancel="dialog_cancel"
  172. @dialog_ok="dialog_ok"
  173. >
  174. <div class="dialogContent">
  175. <el-row :gutter="20">
  176. <el-col :span="20">
  177. <label>
  178. 固件版本号
  179. </label>
  180. <el-input type="text" v-model="dialog.version"></el-input>
  181. </el-col>
  182. <el-col :span="20">
  183. <label>
  184. 备注
  185. </label>
  186. <el-input type="textarea" v-model="dialog.memo"></el-input>
  187. </el-col>
  188. </el-row>
  189. </div>
  190. </dialog_referrer_list>
  191. <el-dialog
  192. title="提示"
  193. :visible.sync="dialogVisible"
  194. width="30%"
  195. :before-close="handleClose">
  196. <span>{{dialogInfo}}</span>
  197. <span slot="footer" class="dialog-footer">
  198. <el-button @click="dialogVisible = false">取 消</el-button>
  199. <el-button type="primary" @click="dialogVisible = false">确 定</el-button>
  200. </span>
  201. </el-dialog>
  202. </div>
  203. </div>
  204. </template>
  205. <script>
  206. import Global from '../Global.js'
  207. import dialog_referrer_list from '../components/dialog_referrer_list'
  208. import {
  209. DetectorQuery,
  210. GetChildRegionSelect,
  211. GetLastVerionFirmwareinfo,
  212. RegionPictureGetByRegionId,
  213. FirmwareAdd,
  214. } from '../api/getApiRes.js'
  215. let qs = require('qs');
  216. export default {
  217. data() {
  218. return {
  219. FirmwareUpdateUrl: headapi + 'v1/AdminSettings/FirmwareUpdate',
  220. FirmwareScanM0Version: '',
  221. FirmwareScanM4Version: '',
  222. FirmwareVersion: '',
  223. VersionTime: '',
  224. // dialog
  225. dialog_state: false,
  226. dialog_title: '添加备注',
  227. dialog_type: '',//类型,1是添加,2是修改
  228. dialogVisible: false,
  229. dialogInfo: '开始升级咯~',
  230. tabIndex: 0,
  231. tabs: [
  232. {name: '固件管理', url: 'hardware'},
  233. //{name: '警务通管理', url: 'police'},
  234. {name: '密码修改', url: 'pwd'},
  235. {name: '系统设置', url: 'setting'},
  236. ],
  237. fileList: [
  238. // {name: 'food.jpeg',
  239. // url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100'}
  240. ],
  241. uploadData: {
  242. token: localStorage.token
  243. },
  244. // panel 配置项目
  245. panel: {
  246. usercode: '',
  247. username: '',
  248. compname: '',
  249. keyword: '',
  250. USERCODE: '',
  251. taskstatus: 99,
  252. regionid: 0,
  253. regionid2: '',
  254. regionidOptions: [],
  255. regionidOptions2: [],
  256. options: [
  257. {value: 99, label: '全部'},
  258. {value: 1, label: '进行中'},
  259. {value: 2, label: '已完成'},
  260. ],
  261. time1: globalBt2(),
  262. },
  263. pageination: {
  264. pageItem: 10,
  265. pageoptions: pageOptions(),
  266. total: 10,
  267. pageIndex: 1,
  268. },
  269. dialog: {
  270. version: '',
  271. updateContent: '',
  272. key: '',
  273. },
  274. draw: 1,
  275. start: 0,
  276. recordsTotal: 0,
  277. tableData: [],
  278. allTableData: [],
  279. limit: '10',
  280. multipleSort: false,
  281. loading: true,
  282. multipleSelection: [],
  283. }
  284. },
  285. mounted() {
  286. this.getTableQuery();
  287. this.getGetLastVerionFirmwareinfo();
  288. },
  289. methods: {
  290. // 页面数据查询
  291. getTableQuery() {
  292. let that = this;
  293. that.loading = true;
  294. this.getGetChildRegionSelect(0, 1);
  295. // 查询检测设备。上级区域id,区域id必传。regionid传0,查询supregionid对应所有子区域的检测设备。 如果supregionid,regionid都传0,默认查询企业ID下所有检测设备
  296. let param = {
  297. token: localStorage.token,
  298. supregionid: 0,//
  299. regionid: this.panel.regionid,//
  300. comid: 1,//
  301. tagname: that.panel.tagname,//标签名
  302. start: 1,//
  303. tableMax: 9999,//
  304. };
  305. let postdata = qs.stringify(param);
  306. DetectorQuery(postdata).then(res => {
  307. let json = res;
  308. if (json.Code == 0) {
  309. that.loading = false;
  310. if (json.Rs) {
  311. that.allTableData = json.Rs;
  312. that.recordsTotal = json.Rs.length;
  313. } else {
  314. that.allTableData = [];
  315. that.recordsTotal = 0;
  316. }
  317. // 设置分页数据
  318. that.setPaginations();
  319. } else {
  320. that.$message.error(json.Memo);
  321. }
  322. })
  323. },
  324. getGetLastVerionFirmwareinfo() {
  325. let that = this;
  326. let param = {
  327. token: localStorage.token,
  328. };
  329. let postdata = qs.stringify(param);
  330. GetLastVerionFirmwareinfo(postdata).then(res => {
  331. let json = res;
  332. if (json.Code == 0) {
  333. that.FirmwareScanM0Version = json.FirmwareScanM0Version;
  334. that.FirmwareScanM4Version = json.FirmwareScanM4Version;
  335. that.FirmwareVersion = json.FirmwareVersion;
  336. } else {
  337. that.$message.error(json.Memo);
  338. }
  339. })
  340. },
  341. // 获取下级列表
  342. getGetChildRegionSelect(regionId, level) {
  343. let that = this;
  344. let param = {
  345. token: localStorage.token,
  346. regionId: regionId,
  347. };
  348. let postdata = qs.stringify(param);
  349. GetChildRegionSelect(postdata).then(res => {
  350. let json = res;
  351. if (json.Code == 0) {
  352. if (level == 1) {
  353. that.panel.regionidOptions = json.Rs;
  354. that.panel.regionidOptions.unshift({Id: 0, Name: "全部"});
  355. } else {
  356. if (json.Rs) {
  357. that.panel.regionidOptions2 = json.Rs;
  358. that.panel.regionid2 = json.Rs[0].Id;
  359. } else {
  360. that.panel.regionidOptions2 = [];
  361. that.panel.regionid2 = '';
  362. }
  363. }
  364. } else {
  365. that.$message.error(json.Memo);
  366. }
  367. })
  368. },
  369. // 跳转tab页面
  370. goTab(url) {
  371. this.$router.push({path: url});
  372. },
  373. // 查询按钮
  374. query() {
  375. this.getTableQuery();
  376. this.$message.success('查询完毕');
  377. },
  378. handleSelectionChange(val) {
  379. this.multipleSelection = val;
  380. console.log(val);
  381. },
  382. successResave(response) {
  383. if (response.Code == 0) {
  384. this.$message.success('上传成功,等待系统自动更新中....');
  385. this.getTableQuery();
  386. } else {
  387. this.$message.error(response.Memo);
  388. }
  389. },
  390. handleChange(file, fileList) {
  391. this.fileList = fileList.slice(-3);
  392. },
  393. handleupload(file) {
  394. if (file.type != 'application/x-zip-compressed') {
  395. this.$message.error('只允许上传压缩文件,当前文件格式为' + file.type);
  396. return false
  397. }
  398. },
  399. handleClose() {
  400. console.log(123);
  401. },
  402. handleImgbefore(file) {
  403. console.log(file);
  404. this.dialog.image = file;
  405. },
  406. // 设置分页数据
  407. setPaginations() {
  408. // 分页属性
  409. let that = this;
  410. that.pageination.total = that.recordsTotal;
  411. // 默认分页
  412. that.tableData = that.allTableData.filter((item, index) => {
  413. return index < that.pageination.pageItem;
  414. });
  415. },
  416. // 每页显示数量
  417. handleSizeChange() {
  418. let that = this;
  419. that.tableData = that.allTableData.filter((item, index) => {
  420. return index < that.pageination.pageItem;
  421. });
  422. that.draw = that.pageination.pageItem;
  423. that.getTableQuery();
  424. },
  425. // 翻页
  426. pageChange(pageIndex) {
  427. let that = this;
  428. // 获取当前页
  429. let index = that.pageination.pageItem * (pageIndex - 1);
  430. // 数据总数
  431. let nums = that.pageination.pageItem * pageIndex;
  432. // 容器
  433. let tables = [];
  434. for (var i = index; i < nums; i++) {
  435. if (that.allTableData[i]) {
  436. tables.push(that.allTableData[i])
  437. }
  438. this.tableData = tables;
  439. }
  440. that.start = index * that.draw;
  441. // that.getTableQuery();
  442. },
  443. // 自动排序
  444. sortChange(params) {
  445. console.log(params)
  446. },
  447. // 过滤时间
  448. filterFmtDate(value, row, column) {
  449. let that = this;
  450. return globalfmtDate(column, 11);
  451. },
  452. addList() {
  453. this.dialog_state = true;
  454. this.dialog_title = '添加设备';
  455. },
  456. changeList() {
  457. // checkNum
  458. if (!this.multipleSelection.length) {
  459. this.$message({
  460. showClose: true,
  461. message: '错了哦,需要先选中一个设备',
  462. type: 'error'
  463. });
  464. return false
  465. }
  466. if (this.multipleSelection.length > 1) {
  467. this.$message({
  468. showClose: true,
  469. message: '错了哦,只能选中一个设备',
  470. type: 'error'
  471. });
  472. return false
  473. }
  474. },
  475. // 探测记录
  476. goRecord(row) {
  477. console.log(row);
  478. this.$router.push({path: '/record', query: {row: row}});
  479. },
  480. dialog_cancel() {
  481. let that = this;
  482. that.dialog_state = false;
  483. },
  484. dialog_ok() {
  485. // 获取提交类型
  486. this.confirmFirmwareAdd();
  487. },
  488. // 添加备注
  489. addMemo() {
  490. // 开启弹窗
  491. this.dialog_state = true;
  492. },
  493. // 添加固件
  494. confirmFirmwareAdd() {
  495. let that = this;
  496. let param = {
  497. token: localStorage.token,
  498. version: that.dialog.version,
  499. updateContent: that.dialog.updateContent,
  500. key: that.dialog.key,
  501. };
  502. let postdata = qs.stringify(param);
  503. FirmwareAdd(postdata).then(res => {
  504. let json = res;
  505. if (json.Code == 0) {
  506. that.$message({
  507. showClose: true,
  508. message: '添加固件成功!',
  509. type: 'success'
  510. });
  511. that.getTableQuery();
  512. that.getGetLastVerionFirmwareinfo();
  513. // 关闭弹窗
  514. that.dialog_state = false;
  515. } else {
  516. that.$message.error(json.Memo);
  517. }
  518. })
  519. },
  520. // 开始更新
  521. startUpdate() {
  522. // checkNum
  523. if (!this.multipleSelection.length) {
  524. this.$message({
  525. showClose: true,
  526. message: '错了哦,需要先选中一个设备',
  527. type: 'error'
  528. });
  529. return false
  530. }
  531. this.dialogVisible = true;
  532. }
  533. },
  534. components: {
  535. dialog_referrer_list
  536. }
  537. }
  538. </script>
  539. <style scoped>
  540. @import "../assets/css/panel.css";
  541. @import "../assets/css/dialog.css";
  542. .content {
  543. width: 98%;
  544. overflow: hidden;
  545. display: block;
  546. margin: 0 auto;
  547. padding-left: 20px;
  548. }
  549. .tabs ul {
  550. width: 558px;
  551. }
  552. table span {
  553. cursor: pointer;
  554. }
  555. .upload {
  556. width: 100%;
  557. overflow: hidden;
  558. display: block;
  559. margin: 0 auto;
  560. }
  561. .upload h5 {
  562. width: 100%;
  563. overflow: hidden;
  564. display: block;
  565. margin: 0 auto;
  566. color: #6DC1FF;
  567. font-size: 18px;
  568. text-align: left;
  569. font-weight: normal;
  570. }
  571. .uploadContainer {
  572. width: 100%;
  573. overflow: hidden;
  574. display: block;
  575. margin: 0 auto;
  576. background: rgba(27, 86, 200, 0.14);
  577. border: 1px solid #005EA2;
  578. border-radius: 0;
  579. margin-top: 11px;
  580. padding: 10px 0;
  581. }
  582. /deep/ .el-upload {
  583. float: left;
  584. margin-left: 27px;
  585. }
  586. /deep/ .el-upload-list {
  587. width: 600px;
  588. float: left;
  589. overflow: hidden;
  590. }
  591. /deep/ .el-upload-list__item-name [class^=el-icon] {
  592. color: #6DC1FF;
  593. }
  594. /deep/ .el-upload-list__item-name {
  595. color: #6DC1FF;
  596. }
  597. /deep/ .el-upload-list__item:first-child {
  598. margin-top: 5px;
  599. }
  600. /deep/ .el-upload-list__item:hover {
  601. background: none;
  602. }
  603. .addMemo {
  604. width: 120px;
  605. height: 30px;
  606. line-height: 30px;
  607. border-radius: 250px;
  608. float: left;
  609. background: #005EA2;
  610. color: #6DC1FF;
  611. font-size: 14px;
  612. text-align: left;
  613. font-style: normal;
  614. cursor: pointer;
  615. margin-top: 2px;
  616. margin-left: 20px;
  617. }
  618. .addMemo i {
  619. width: 14px;
  620. height: 14px;
  621. overflow: hidden;
  622. float: left;
  623. background: url("../assets/img/icon/addMemo.png") top center no-repeat;
  624. background-size: 100% 100%;
  625. margin-top: 8px;
  626. margin-left: 20px;
  627. margin-right: 10px;
  628. }
  629. .hardwareList {
  630. width: 100%;
  631. overflow: hidden;
  632. display: block;
  633. margin: 0 auto;
  634. margin-top: 35px;
  635. }
  636. .hardwareList h5 {
  637. width: 100%;
  638. overflow: hidden;
  639. display: block;
  640. margin: 0 auto;
  641. color: #6DC1FF;
  642. font-size: 18px;
  643. text-align: left;
  644. font-weight: normal;
  645. margin-bottom: 10px;
  646. }
  647. .contorl {
  648. /*width: 100%;*/
  649. overflow: hidden;
  650. display: block;
  651. margin: 0 auto;
  652. padding: 17px 23px;
  653. }
  654. em {
  655. font-style: normal;
  656. }
  657. .version {
  658. float: left;
  659. color: #6DC1FF;
  660. font-size: 14px;
  661. font-style: normal;
  662. margin-left: 30px;
  663. line-height: 30px;
  664. }
  665. .version span {
  666. margin-right: 10px;
  667. }
  668. .allItem {
  669. float: right;
  670. }
  671. .question {
  672. width: 18px;
  673. height: 18px;
  674. cursor: pointer;
  675. background: url("../assets/img/icon/question_icon.png") top center no-repeat;
  676. float: right;
  677. margin-top: 7px;
  678. margin-left: 13px;
  679. }
  680. /deep/ textarea {
  681. color: #6DC1FF;
  682. outline: none;
  683. }
  684. .upload-demo {
  685. /*float: right;*/
  686. }
  687. /deep/ .el-upload-list__item {
  688. width: 160px;
  689. float: left;
  690. }
  691. </style>