index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780
  1. <template>
  2. <view style="height: 100vh">
  3. <view v-if="!connected">
  4. <scroll-view class="main-container" scroll-y="true"
  5. :refresher-enabled="false">
  6. <view v-for="(item, index) in deviceListDataShow" :key="item.id" class="list-item" hover-class="list-item-hover"
  7. hover-start-time="0" hover-stay-time="100" @click="listViewTap(item.id)">
  8. <image v-if="item.manufacturer==='eciot'" src="/static/img/ecble.png" class="list-item-img"></image>
  9. <image v-else src="/static/img/ble.png" class="list-item-img"></image>
  10. <text class="list-item-name">{{item.name}}</text>
  11. <image v-if="item.rssi >= -41" src="/static/img/s5.png" mode="aspectFit" class="list-item-rssi-img"></image>
  12. <image v-else-if="item.rssi >= -55" src="/static/img/s4.png" mode="aspectFit" class="list-item-rssi-img"></image>
  13. <image v-else-if="item.rssi >= -65" src="/static/img/s3.png" mode="aspectFit" class="list-item-rssi-img"></image>
  14. <image v-else-if="item.rssi >= -75" src="/static/img/s2.png" mode="aspectFit" class="list-item-rssi-img"></image>
  15. <image v-else="item.rssi < -75" src="/static/img/s1.png" mode="aspectFit" class="list-item-rssi-img"></image>
  16. <text class="list-item-rssi">{{item.rssi}}</text>
  17. <view class="list-item-line"></view>
  18. </view>
  19. <u-popup :show="showSendData" >
  20. <view class="slot-content">
  21. <view>
  22. <u--input
  23. :placeholder="i18('请输入值')"
  24. border="surround"
  25. v-model="sendData"
  26. ></u--input>
  27. </view>
  28. <view style="margin:10px;text-decoration: underline;margin-bottom: 0px" @click="sendLanyaData">
  29. <u-button>发送</u-button>
  30. </view>
  31. </view>
  32. </u-popup>
  33. <view v-if="deviceListDataShow.length==0" class="notice"> - {{ $t('buletooth.nodevice') }} -</view>
  34. <view class="gap"></view>
  35. </scroll-view>
  36. </view>
  37. <view v-if="connected">
  38. <view class="text-area">
  39. <u--form v-if="isCompanyUser()" style="width: 100%;"
  40. labelPosition="left"
  41. ref="uForm"
  42. >
  43. <u-form-item
  44. label="WIFI名称:"
  45. borderBottom
  46. labelWidth="auto"
  47. @click="openChooseWifi"
  48. ref="item1"
  49. >
  50. <u--input
  51. v-model="SSID"
  52. disabled
  53. disabledColor="#ffffff"
  54. placeholder="请选择wifi:"
  55. border="none"
  56. ></u--input>
  57. <u-icon
  58. slot="right"
  59. name="arrow-right"
  60. ></u-icon>
  61. </u-form-item>
  62. <u-form-item
  63. label="密码:"
  64. borderBottom
  65. ref="item1"
  66. >
  67. <u--input
  68. v-model="password"
  69. border="none"
  70. ></u--input>
  71. </u-form-item>
  72. </u--form>
  73. <u--form v-else style="width: 100%;"
  74. labelPosition="left"
  75. ref="uForm"
  76. >
  77. <u-form-item
  78. label="WIFI名称:"
  79. borderBottom
  80. labelWidth="auto"
  81. @click="openChooseWifi"
  82. ref="item1"
  83. >
  84. <u--input
  85. v-model="SSID"
  86. disabled
  87. disabledColor="#ffffff"
  88. placeholder="请选择wifi:"
  89. border="none"
  90. ></u--input>
  91. <u-icon
  92. slot="right"
  93. name="arrow-right"
  94. ></u-icon>
  95. </u-form-item>
  96. <u-form-item
  97. label="密码:"
  98. borderBottom
  99. ref="item1"
  100. >
  101. <u--input
  102. v-model="password"
  103. border="none"
  104. ></u--input>
  105. </u-form-item>
  106. <u-form-item
  107. label="二维码ID:"
  108. borderBottom
  109. ref="item1"
  110. labelWidth="auto"
  111. >
  112. <u--input
  113. v-model="qrcodeid"
  114. border="none"
  115. ></u--input>
  116. </u-form-item>
  117. <u-form-item
  118. @click="showProductList = true"
  119. label="产品类型:"
  120. borderBottom
  121. ref="item1"
  122. labelWidth="auto"
  123. >
  124. <u--input disabled
  125. v-model="productName"
  126. border="none"
  127. ></u--input>
  128. </u-form-item>
  129. </u--form>
  130. </view>
  131. <view style="margin:10px">
  132. <u-button text="开始配网" v-if="isCompanyUser()" @click="doConnectUser(1)" size="small" type="primary"></u-button>
  133. <u-button text="开始配网" v-else @click="doConnect(2)" size="small" type="primary"></u-button>
  134. </view>
  135. <u-picker @cancel="showWiftList=false" @confirm="chooseWifi" :show="showWiftList" :columns="wifiList"></u-picker>
  136. <u-picker @cancel="showProductList=false" keyName="text" @confirm="chooseProduct" :show="showProductList" :columns="chooseProductList"></u-picker>
  137. </view>
  138. </view>
  139. </template>
  140. <script>
  141. import authObj from '@/plugins/auth.js';
  142. // #ifdef APP
  143. import ecUI from '@/utils/ecUI.js'
  144. import ecBLE from '@/utils/ecBLE/ecBLE.js'
  145. // #endif
  146. // #ifdef MP
  147. const ecUI = require('@/utils/ecUI.js')
  148. const ecBLE = require('@/utils/ecBLE/ecBLE.js')
  149. // #endif
  150. import i18 from '@/utils/i18.js'
  151. import {getDevcieByQrcodeID} from "@/api/device/device";
  152. let ctx
  153. let deviceListData = []
  154. export default {
  155. data() {
  156. return {
  157. showProductList:false,
  158. showPwd:false,
  159. rightPwd:"",
  160. pwd:"",
  161. timer:"",
  162. buleid:"",
  163. deviceListDataShow: [],
  164. showTimer:null,
  165. connected:false,
  166. uuid:"",
  167. showDeviceNo:false,
  168. inputDeviceNo:"",
  169. commonCode:"",
  170. showSendData:false,
  171. sendData:"",
  172. qrcodeid:"",
  173. productName:"",
  174. deviceno:"",
  175. SSID:"",
  176. password:"",
  177. showWiftList:false,
  178. productId:56,
  179. chooseProductList:[[ {
  180. id:56,text:"3"
  181. },
  182. {
  183. id:56,text:"4"
  184. },
  185. {
  186. id:57,text:"5"
  187. }
  188. ]],
  189. wifiList: [
  190. []
  191. ],
  192. }
  193. },
  194. onLoad() {
  195. uni.setNavigationBarTitle({
  196. title: "蓝牙配网"
  197. })
  198. this.deviceno = this.generateTimestamp();
  199. ecUI.showLoading("正在初始化蓝牙模块")
  200. ctx = this
  201. clearInterval(this.timer);
  202. this.timer = setInterval(() => {
  203. ctx.deviceListDataShow = JSON.parse(JSON.stringify(deviceListData))
  204. }, 800)
  205. console.log(this.commonCode)
  206. this.productName = this.chooseProductList[0][0].text;
  207. },
  208. onUnload(){
  209. ecBLE.stopBluetoothDevicesDiscovery();
  210. ecBLE.closeBLEConnection()
  211. },
  212. onShow() {
  213. if(this.showTimer!= null){
  214. clearTimeout(this.showTimer);
  215. }
  216. this.showTimer = setTimeout(() => {
  217. ctx.openBluetoothAdapter()
  218. }, 100)
  219. },
  220. methods: {
  221. isCompanyUser(){
  222. return authObj.authRoleAdmin(["companymgr"]) || authObj.authRoleAdmin(["companyuser"]);
  223. },
  224. chooseProduct(e){
  225. this.productId = e.value[0].id;
  226. this.productName = e.value[0].text;
  227. this.showProductList= false;
  228. },
  229. generateTimestamp() {
  230. const date = new Date();
  231. const year = date.getFullYear().toString().substr(2);
  232. const month = date.getMonth() + 1;
  233. const day = date.getDate();
  234. const hours = date.getHours();
  235. const minutes = date.getMinutes();
  236. // 生成6位随机数字
  237. const randomNum = Math.floor(Math.random() * 900000) + 100000;
  238. // 将数字拼接成字符串
  239. const timestamp = `${year}${month < 10 ? '0' + month : month}${day < 10 ? '0' + day : day}${hours}${minutes < 10 ? '0' + minutes : minutes}${randomNum}`;
  240. return timestamp;
  241. },
  242. getAuth(){
  243. wx.getSetting({
  244. success(res) {
  245. if (!res.authSetting['scope.userLocation']) {
  246. wx.authorize({
  247. scope: 'scope.userLocation',
  248. success () {
  249. // 用户已经同意小程序使用录音功能,后续调用 wx.startRecord 接口不会弹窗询问
  250. }
  251. })
  252. }
  253. }
  254. })
  255. },
  256. chooseWifi(e){
  257. this.SSID = e.value[0];
  258. this.showWiftList= false;
  259. },
  260. openChooseWifi(){
  261. if(this.wifiList[0].length == 0){
  262. this.getWifiList();
  263. }else{
  264. this.showWiftList = true;
  265. }
  266. },
  267. openWifi(){
  268. let self = this;
  269. // #ifdef MP-WEIXIN
  270. wx.startWifi({
  271. success(res) {
  272. console.log(res);
  273. // self.getWifiList();
  274. },
  275. fail(res) {
  276. console.log(res)
  277. uni.showToast({
  278. title: '请打开WIFI',
  279. icon: 'none',
  280. duration: 3000
  281. });
  282. },
  283. })
  284. // #endif
  285. },
  286. getWifi(){
  287. // #ifdef MP-WEIXIN
  288. var that = this
  289. wx.getConnectedWifi({
  290. success(res) {
  291. console.log(res)
  292. that.BSSID = res.wifi.BSSID
  293. that.WIFIName = res.wifi.SSID
  294. },
  295. fail(res) {
  296. console.log(res)
  297. //报错的相关处理
  298. },
  299. })
  300. // #endif
  301. },
  302. getWifiList(){
  303. // #ifdef MP-WEIXIN
  304. var that = this
  305. uni.showLoading();
  306. wx.getWifiList({
  307. success(res) {
  308. console.log(res)
  309. wx.onGetWifiList(function(res) {
  310. that.showWiftList = true;
  311. uni.hideLoading();
  312. console.log("获取wifi列表");
  313. that.wifiList = [[]];
  314. console.log(res.wifiList); //在这里提取列表数据
  315. //通过遍历将WIFI名字存入集合,以便下卡框等组件使用
  316. for (var i = 0; i < res.wifiList.length; i++) {
  317. that.wifiList[0].push(res.wifiList[i].SSID)
  318. }
  319. })
  320. },
  321. fail(res) {
  322. console.log(res)
  323. uni.showToast({
  324. title: '获取wifi失败,请检查wifi',
  325. icon: 'none',
  326. duration: 2000
  327. });
  328. },
  329. })
  330. // #endif
  331. },
  332. doConnectUser(){
  333. if(this.SSID == ""){
  334. uni.showToast({
  335. title: '请选择WIFI',
  336. icon: 'none',
  337. duration: 3000
  338. });
  339. return;
  340. }
  341. if(this.password == ""){
  342. uni.showToast({
  343. title: '请输入wifi密码',
  344. icon: 'none',
  345. duration: 3000
  346. });
  347. return;
  348. }
  349. /**
  350. * ID:XXX+回车换行(设备编号)
  351. * QR:XXXX+回车换行(二维码ID)
  352. * ssid:WiFi名字+回车换行
  353. * psd:wifi密码+回车换行
  354. * 最后+OK
  355. */
  356. let self = this;
  357. let endStr = "$$";
  358. ecUI.showLoading("正在配置网络信息")
  359. setTimeout(function(){
  360. self.sendBlueData("ssid:"+self.SSID+endStr);
  361. },400);
  362. setTimeout(function(){
  363. self.sendBlueData("psd:"+self.password+endStr);
  364. },600);
  365. setTimeout(function(){
  366. self.sendBlueData("OK");
  367. },800);
  368. },
  369. doConnect(){
  370. if(this.SSID == ""){
  371. uni.showToast({
  372. title: '请选择WIFI',
  373. icon: 'none',
  374. duration: 3000
  375. });
  376. return;
  377. }
  378. if(this.password == ""){
  379. uni.showToast({
  380. title: '请输入wifi密码',
  381. icon: 'none',
  382. duration: 3000
  383. });
  384. return;
  385. }
  386. if(this.qrcodeid == ""){
  387. uni.showToast({
  388. title: '请输入二维码ID',
  389. icon: 'none',
  390. duration: 3000
  391. });
  392. return;
  393. }
  394. if(this.deviceno == ""){
  395. uni.showToast({
  396. title: '请输入设备编号',
  397. icon: 'none',
  398. duration: 3000
  399. });
  400. return;
  401. }
  402. /**
  403. * ID:XXX+回车换行(设备编号)
  404. * QR:XXXX+回车换行(二维码ID)
  405. * ssid:WiFi名字+回车换行
  406. * psd:wifi密码+回车换行
  407. * 最后+OK
  408. */
  409. let self = this;
  410. getDevcieByQrcodeID(this.qrcodeid).then(res=>{
  411. if(res.data != null){
  412. self.$modal.showToast("当前二维码已经配置设备");
  413. }else{
  414. let endStr = "$$";
  415. ecUI.showLoading("正在配置网络信息")
  416. setTimeout(function(){
  417. self.sendBlueData("ID:"+self.deviceno+endStr);
  418. },200);
  419. setTimeout(function(){
  420. self.sendBlueData("QR:"+self.qrcodeid+endStr);
  421. },400);
  422. setTimeout(function(){
  423. self.sendBlueData("ssid:"+self.SSID+endStr);
  424. },600);
  425. setTimeout(function(){
  426. self.sendBlueData("psd:"+self.password+endStr);
  427. },800);
  428. setTimeout(function(){
  429. self.sendBlueData("pid:"+self.productId+endStr);
  430. },1000);
  431. setTimeout(function(){
  432. self.sendBlueData("OK");
  433. },1200);
  434. }
  435. })
  436. },
  437. stringToHex(str) {
  438. let hex = '';
  439. for (let i = 0; i < str.length; i++) {
  440. const char = str.charCodeAt(i);
  441. const hexChar = char.toString(16).padStart(2, '0');
  442. hex += hexChar;
  443. }
  444. return hex;
  445. },
  446. doByTime(func,time){
  447. setTimeout(function (){
  448. func();
  449. },time);
  450. },
  451. sendLanyaData(){
  452. this.$modal.showToast("正在发送");
  453. this.sendBlueData(this.sendData);
  454. },
  455. i18(text){
  456. return text;
  457. },
  458. cancel(){
  459. this.showPwd = false;
  460. uni.navigateBack({
  461. });
  462. },
  463. resetPwd(){
  464. let self = this;
  465. if(!this.inputDeviceNo){
  466. self.$modal.showToast("请输入序列号");
  467. return;
  468. }
  469. let uuidRight = false;
  470. if(this.inputDeviceNo == this.commonCode || this.uuid == this.inputDeviceNo){
  471. uuidRight = true;
  472. }
  473. if(!uuidRight){
  474. self.$modal.showToast("序列号有误");
  475. return;
  476. }
  477. if(uuidRight){
  478. this.$modal.confirm("密码将被重置为123456").then(res=>{
  479. setPwd("123456")
  480. self.$modal.showToast("密码修改成功");
  481. this.rightPwd = "123456";
  482. self.loginSuccess();
  483. });
  484. }
  485. },
  486. getBeijingTime() {
  487. const date = new Date();
  488. const utcTime = date.getTime() + (date.getTimezoneOffset() * 60 * 1000);
  489. const beijingTime = new Date(utcTime + (8 * 60 * 60 * 1000));
  490. return beijingTime;
  491. },
  492. generateUniqueNumber(date) {
  493. let dateString = date.toISOString().slice(0, 10).replace(/-/g, '');
  494. console.log(dateString)
  495. let hash = w_md5.hex_md5_32(dateString);
  496. console.log(hash);//32位小写
  497. let str = "";
  498. for (let i = 0; i < 6; i++) {
  499. const c = hash.charCodeAt(i);
  500. str = str+""+c+""
  501. }
  502. return str.substr(0,6);
  503. },
  504. goBack(){
  505. uni.navigateBack({
  506. });
  507. },
  508. $t(title){
  509. return title;
  510. },
  511. inputPwd(){
  512. if(!this.pwd ){
  513. this.$modal.showToast(this.$t('buletooth.errpwd'));
  514. }else{
  515. if(this.rightPwd && this.rightPwd === this.pwd){
  516. this.loginSuccess();
  517. }else{
  518. this.$modal.showToast(this.$t('buletooth.errpwd'));
  519. }
  520. }
  521. },
  522. loginSuccess(){
  523. this.showPwd = false;
  524. this.showDeviceNo = false;
  525. uni.setStorageSync("pwd",this.rightPwd);
  526. uni.setStorageSync('blueid', this.buleid);
  527. this.pwd = "";
  528. ecBLE.stopBluetoothDevicesDiscovery();
  529. uni.navigateTo({
  530. url: '/pages/weitiandi/bluetooth/status'
  531. });
  532. },
  533. getLocalPwd(){
  534. let pwd = uni.getStorageSync("pwd");
  535. return pwd;
  536. },
  537. sendBlueData(tempSendData){
  538. tempSendData = this.stringToHex(tempSendData);
  539. let data = tempSendData
  540. .replace(/\s*/g, '')
  541. .replace(/\n/g, '')
  542. .replace(/\r/g, '')
  543. console.log("写入数据:"+data);
  544. ecBLE.writeBLECharacteristicValue(data, true)
  545. },
  546. listViewTap(id){
  547. let self = this;
  548. ecUI.showLoading("正在连接蓝牙")
  549. ecBLE.onBLEConnectionStateChange(res => {
  550. console.log(res);
  551. if (res.ok) {
  552. self.connected = true;
  553. self.openWifi();
  554. ecUI.hideLoading()
  555. self.showSendData = true;
  556. ecBLE.stopBluetoothDevicesDiscovery();
  557. //
  558. } else {
  559. ecUI.hideLoading()
  560. this.$modal.showToast("请检查是否配置成功");
  561. }
  562. });
  563. //receive data
  564. ecBLE.onBLECharacteristicValueChange((str, strHex) => {
  565. console.log("数据来了")
  566. let isCheckRevHex = true;
  567. let data =
  568. (isCheckRevHex ? strHex.replace(/[0-9a-fA-F]{2}/g, ' $&') : str)
  569. console.log(data)
  570. self.$modal.closeLoading();
  571. data = parseDataObj(data);
  572. })
  573. self.connected = false;
  574. ecBLE.createBLEConnection(id);
  575. setTimeout(function (){
  576. if(!self.connected){
  577. self.$modal.showToast(i18('连接失败'));
  578. self.startBluetoothDevicesDiscovery()
  579. }
  580. },10000);
  581. },
  582. showInputPwd(){
  583. this.showPwd = true;
  584. },
  585. messageCallback(data){
  586. let self = this;
  587. console.log(data);
  588. let type = data.type;
  589. let real_data = data.real_data;
  590. if(type == 253){
  591. self.$modal.closeLoading();
  592. self.uuid = real_data.substr(0,6);
  593. }
  594. self.$forceUpdate();
  595. console.log('收到服务器内容:' + JSON.stringify(data));
  596. },
  597. forgetPwd(){
  598. this.$modal.loading("正在读取设备ID");
  599. getUUID()
  600. this.showDeviceNo = true;
  601. },
  602. openBluetoothAdapter() {
  603. let self = this;
  604. ecBLE.onBluetoothAdapterStateChange(res => {
  605. ecUI.hideLoading()
  606. if (res.ok) {
  607. ctx.startBluetoothDevicesDiscovery()
  608. } else {
  609. ecUI.showModal(
  610. this.$t('buletooth.tip'),
  611. `Bluetooth adapter error | ${res.errCode} | ${res.errMsg}`,
  612. () => {
  613. }
  614. )
  615. }
  616. })
  617. ecBLE.openBluetoothAdapter()
  618. },
  619. startBluetoothDevicesDiscovery() {
  620. ecBLE.stopBluetoothDevicesDiscovery();
  621. console.log('start search')
  622. ecBLE.onBluetoothDeviceFound(res => {
  623. let isRight = true;
  624. // if(res.name.startsWith('BT_') || res.name.startsWith('FC41D')){
  625. // isRight = true;
  626. // }
  627. if(!isRight){
  628. return;
  629. }
  630. for (const item of deviceListData) {
  631. if (item.id === res.id) {
  632. item.name = res.name
  633. item.rssi = res.rssi
  634. return
  635. }
  636. }
  637. let manufacturer = ''
  638. if (res.name.length === 11 && res.name.startsWith('@')) {
  639. manufacturer = 'eciot'
  640. }
  641. if (res.name.length === 15 && res.name.startsWith('BT_')) {
  642. manufacturer = 'eciot'
  643. }
  644. manufacturer = 'eciot'
  645. deviceListData.push({
  646. id: res.id,
  647. name: res.name,
  648. rssi: res.rssi,
  649. manufacturer,
  650. })
  651. })
  652. ecBLE.startBluetoothDevicesDiscovery()
  653. },
  654. }
  655. }
  656. </script>
  657. <style>
  658. .main-container {
  659. height: 100vh;
  660. }
  661. .list-item {
  662. height: 57px;
  663. position: relative;
  664. }
  665. .list-item-hover {
  666. background-color: #e5e4e9;
  667. }
  668. .list-item-img {
  669. position: absolute;
  670. width: 36px;
  671. height: 36px;
  672. left: 20px;
  673. top: 10px;
  674. }
  675. .list-item-name {
  676. position: absolute;
  677. font-size: 22px;
  678. left: 76px;
  679. top: 0px;
  680. line-height: 56px;
  681. }
  682. .list-item-rssi-img {
  683. position: absolute;
  684. width: 20px;
  685. height: 20px;
  686. right: 20px;
  687. top: 13px;
  688. }
  689. .list-item-rssi {
  690. position: absolute;
  691. width: 40px;
  692. height: 20px;
  693. right: 10px;
  694. top: 33px;
  695. font-size: 12px;
  696. font-weight: bold;
  697. display: flex;
  698. justify-content: center;
  699. }
  700. .list-item-line {
  701. position: absolute;
  702. height: 1px;
  703. width: 100vw;
  704. left: 20px;
  705. top: 56px;
  706. background-color: #c6c6c8;
  707. }
  708. .notice {
  709. display: flex;
  710. justify-content: center;
  711. align-items: center;
  712. margin-top: 10px;
  713. font-size: 13px;
  714. color: #909399;
  715. }
  716. .gap {
  717. height: 57px;
  718. }
  719. .text-area {
  720. display: flex;
  721. justify-content: center;
  722. background: white;
  723. width: 100%;
  724. height: 100%;
  725. }
  726. </style>