statistics.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699
  1. <template>
  2. <view>
  3. <view class="status_bar"></view>
  4. <view class="" style="position: relative;top: 40px;">
  5. <view style="position: fixed;z-index: 100;">
  6. <uni-nav-bar @clickLeft="clickLeft" left-icon="back" title="害虫统计"></uni-nav-bar>
  7. </view>
  8. <view class="statistics">
  9. <view class="top_text">
  10. <view :class="topindex==index?'title_text_color':'tltle_text'" v-for="(item,index) in toptext"
  11. :key="index" @click="changeindex(index)">
  12. {{item}}
  13. </view>
  14. </view>
  15. <view class="shuju_one">
  16. <p class="shuju_one_title">害虫趋势统计</p>
  17. <view class="shuju_one_btn">
  18. <view class="schedule_box">
  19. <view class="schedule" @click="pickertfone=!pickertfone">
  20. <p class="schedule_value">{{titletext[indexone]}}</p>
  21. <p class="schedule_icon">
  22. <u-icon name="arrow-down"></u-icon>
  23. </p>
  24. </view>
  25. <u-picker v-model="pickertfone" mode="selector" @confirm="confirmFun"
  26. :default-selector="[indexone]" :range="titletext"></u-picker>
  27. <view class="schedule" @click="pickertftwo=!pickertftwo" v-if="tishitf">
  28. <p class="schedule_value">{{wormdata[indextwo]}}</p>
  29. <p class="schedule_icon">
  30. <u-icon name="arrow-down"></u-icon>
  31. </p>
  32. <u-picker v-model="pickertftwo" mode="selector" @confirm="confirmFun2"
  33. :default-selector="[indextwo]" :range="wormdata"></u-picker>
  34. </view>
  35. </view>
  36. </view>
  37. <view class="canvastishi" v-if="!canvastishiTF">
  38. 暂无数据
  39. </view>
  40. <canvas v-if="canvastishiTF" canvas-id="canvasColumnA" id="canvasColumnA" class="charts"
  41. @touchstart="touchLineA($event)" @touchmove="moveLineA($event)"
  42. @touchend="touchEndLineA($event)" disable-scroll=true
  43. :style="{'width':cWidth*pixelRatio+'px','height':cHeight*pixelRatio+'px', 'transform': 'scale('+(1/pixelRatio)+')','margin-left':-cWidth*(pixelRatio-1)/2+'px','margin-top':-cHeight*(pixelRatio-1)/2+'px'}"></canvas>
  44. </view>
  45. <view class="shuju_two">
  46. <p class="shuju_one_title">害虫比例</p>
  47. <view class="canvastishi" v-if="!canvastishiTF">
  48. 暂无数据
  49. </view>
  50. <canvas v-if="canvastishiTF" canvas-id="canvasRing" id="canvasRing" class="charts"
  51. @touchstart="touchRing"
  52. :style="{'width':cWidth*pixelRatio+'px','height':cHeight*pixelRatio+'px', 'transform': 'scale('+(1/pixelRatio)+')','margin-left':-cWidth*(pixelRatio-1)/2+'px','margin-top':-cHeight*(pixelRatio-1)/2+'px'}"></canvas>
  53. </view>
  54. <view class="shuju_table" v-if="tableval.length">
  55. <table class="table">
  56. <tr class="tr">
  57. <th class="th">害虫名称</th>
  58. <th class="th">害虫数量</th>
  59. <th class="th">害虫比例</th>
  60. </tr>
  61. <tr class="tr" v-for="(item,index) in tableval" :key="index">
  62. <td class="td">{{item.name}}</td>
  63. <td class="td">{{item.data}}</td>
  64. <td class="td">{{(item.prop*100).toFixed(2)+"%"}}</td>
  65. </tr>
  66. </table>
  67. </view>
  68. </view>
  69. </view>
  70. </view>
  71. </template>
  72. <style lang="scss">
  73. .top_text {
  74. width: 90%;
  75. position: absolute;
  76. top: 54px;
  77. display: flex;
  78. left: 5%;
  79. .tltle_text {
  80. width: 50%;
  81. border: 2rpx solid #F0F0F0;
  82. text-align: center;
  83. }
  84. .title_text_color {
  85. width: 50%;
  86. border: 2rpx solid #64CC82;
  87. text-align: center;
  88. }
  89. }
  90. .tishi {
  91. position: absolute;
  92. top: 250rpx;
  93. left: 40%;
  94. font-size: 32rpx;
  95. color: #7A7373;
  96. }
  97. .shuju_one_title {
  98. font-size: 32rpx;
  99. font-weight: 700;
  100. width: 100%;
  101. text-align: center;
  102. margin-bottom: 20rpx;
  103. }
  104. .shuju_one_btn {
  105. width: 90%;
  106. margin: 0 auto;
  107. display: flex;
  108. justify-content: space-between;
  109. .schedule_box {
  110. display: flex;
  111. }
  112. .schedule {
  113. display: flex;
  114. width: 280rpx;
  115. height: 50rpx;
  116. border: 2rpx solid #F0F0F0;
  117. margin-left: 20rpx;
  118. .schedule_value {
  119. width: 70%;
  120. text-align: center;
  121. line-height: 50rpx;
  122. font-size: 24rpx;
  123. }
  124. .schedule_icon {
  125. width: 30%;
  126. background-color: #F2F2F2;
  127. text-align: center;
  128. line-height: 50rpx;
  129. }
  130. }
  131. }
  132. </style>
  133. <script>
  134. import uCharts from '../../../../components/js_sdk/u-charts/u-charts/u-charts.js';
  135. var canvaColumnA = null;
  136. var canvasRing = null;
  137. var newtime = +new Date()
  138. var strrttime = newtime - 24 * 60 * 60 * 1000
  139. export default {
  140. data() {
  141. return {
  142. cWidth: '400',
  143. cHeight: '400',
  144. pixelRatio: 1,
  145. canvastishiTF: false,
  146. d_id: '',
  147. start_time: strrttime,
  148. end_time: newtime,
  149. titletext: ["24小时", "近一个月", "近半年", "近一年"],
  150. device_id: '',
  151. pest_name: '',
  152. wormdata: [],
  153. pickertfone: false,
  154. pickertftwo: false,
  155. indexone: 0,
  156. indextwo: 0,
  157. tishitf: false,
  158. tishi: false,
  159. toptext: ["自动统计", "手动统计"],
  160. topindex: 0,
  161. tableval: []
  162. }
  163. },
  164. methods: {
  165. async historys() { //获取统计虫子 自动统计 初始化统计 没有传入害虫名称
  166. const res = await this.$myRequest({
  167. url: '/api/api_gateway?method=forecast.worm_lamp.pest_statistics',
  168. data: {
  169. d_id: this.d_id,
  170. start_time: parseInt(this.start_time / 1000),
  171. end_time: parseInt(this.end_time / 1000),
  172. }
  173. })
  174. this.historydatas = res
  175. console.log(this.historydatas)
  176. if (this.historydatas.date.length == 0) {
  177. this.canvastishiTF = false
  178. this.tishitf = false
  179. } else {
  180. this.canvastishiTF = true
  181. this.tishitf = true
  182. this.wormdata = []
  183. for (var i = 0; i < res.percentage.length; i++) {
  184. this.wormdata.unshift(res.percentage[i].name_num)
  185. }
  186. var arr1 = []
  187. var arr2 = []
  188. var arr3 = []
  189. var xtitle = []
  190. var ringarr = []
  191. for (var i = 0; i < res.date.length; i++) {
  192. var times = new Date(res.date[i].addtime * 1000)
  193. xtitle.unshift(times.getMonth() + 1 + "/" + times.getDate() + "-" + times.getHours() + ":" +
  194. times.getSeconds())
  195. arr1.unshift(res.date[i].temperature == "" ? "0" : res.date[i].temperature)
  196. arr2.unshift(res.date[i].humidity == "" ? "0" : res.date[i].humidity)
  197. arr3.unshift(res.date[i]._sums == "" ? "0" : res.date[i]._sums)
  198. }
  199. var maxnumarr = []
  200. for (var i = 0; i < res.percentage.length; i++) {
  201. var obj = {}
  202. obj.name = res.percentage[i].name_num
  203. obj.data = Number(res.percentage[i].num)
  204. maxnumarr.unshift(obj)
  205. }
  206. console.log(ringarr)
  207. var temp;
  208. for (var i = 0; i < maxnumarr.length - 1; i++) {
  209. for (var j = 0; j < maxnumarr.length - 1; j++) {
  210. if (maxnumarr[j].data < maxnumarr[j + 1].data) {
  211. temp = maxnumarr[j];
  212. maxnumarr[j] = maxnumarr[j + 1];
  213. maxnumarr[j + 1] = temp;
  214. }
  215. }
  216. }
  217. if (maxnumarr.length < 20) {
  218. ringarr = maxnumarr
  219. } else {
  220. ringarr = maxnumarr.splice(0, 20)
  221. this.tableval = maxnumarr.splice(20)
  222. }
  223. var tablevalsum = 0
  224. for (var i = 0; i < maxnumarr.length; i++) {
  225. tablevalsum += maxnumarr[i].data
  226. }
  227. for (var i = 0; i < this.tableval.length; i++) {
  228. this.tableval[i].prop = this.tableval[i].data / tablevalsum
  229. }
  230. console.log(this.tableval)
  231. console.log(maxnumarr)
  232. var obj = [{
  233. name: '温度',
  234. data: arr1,
  235. color: '#00E29D'
  236. }, {
  237. name: '湿度',
  238. data: arr2,
  239. color: '#6CBBFF'
  240. }, {
  241. name: '害虫总数',
  242. data: arr3,
  243. color: '#FF3F3F'
  244. }]
  245. this.showColumn("canvasColumnA", xtitle, obj)
  246. this.showRing(ringarr)
  247. }
  248. },
  249. async history() { //获取统计虫子 //自动统计 传入害虫名称统计 在historys之后
  250. const res = await this.$myRequest({
  251. url: '/api/api_gateway?method=forecast.worm_lamp.pest_statistics',
  252. data: {
  253. pest_name: this.pest_name,
  254. d_id: this.d_id,
  255. start_time: parseInt(this.start_time / 1000),
  256. end_time: parseInt(this.end_time / 1000)
  257. }
  258. })
  259. this.historydatas = res
  260. console.log(this.historydatas)
  261. if (this.historydatas.date.length == 0) {
  262. this.canvastishiTF = false
  263. this.tishitf = false
  264. } else {
  265. this.canvastishiTF = true
  266. this.tishitf = true
  267. var arr1 = []
  268. var arr2 = []
  269. var arr3 = []
  270. var xtitle = []
  271. for (var i = 0; i < res.date.length; i++) {
  272. var times = new Date(res.date[i].addtime * 1000)
  273. xtitle.unshift(times.getMonth() + 1 + "/" + times.getDate() + "-" + times.getHours() + ":" +
  274. times.getSeconds())
  275. arr1.unshift(res.date[i].temperature == "" ? "0" : res.date[i].temperature)
  276. arr2.unshift(res.date[i].humidity == "" ? "0" : res.date[i].humidity)
  277. arr3.unshift(res.date[i]._sums == "" ? "0" : res.date[i]._sums)
  278. }
  279. var obj = [{
  280. name: '温度',
  281. data: arr1,
  282. color: '#00E29D'
  283. }, {
  284. name: '湿度',
  285. data: arr2,
  286. color: '#6CBBFF'
  287. }, {
  288. name: '害虫总数',
  289. data: arr3,
  290. color: '#FF3F3F'
  291. }]
  292. this.showColumn("canvasColumnA", xtitle, obj)
  293. }
  294. },
  295. // forecast.worm_lamp.pest_manual_statistics手动统计
  296. async selfhistorys() { //获取统计虫子 手动统计 初始化统计 不传入害虫名称
  297. const res = await this.$myRequest({
  298. url: '/api/api_gateway?method=forecast.worm_lamp.pest_manual_statistics',
  299. data: {
  300. device_id: this.d_id,
  301. start_time: parseInt(this.start_time / 1000),
  302. end_time: parseInt(this.end_time / 1000)
  303. }
  304. })
  305. console.log(res)
  306. if (res.date.length == 0) {
  307. this.tishitf = false
  308. this.canvastishiTF = false
  309. } else {
  310. this.tishitf = true
  311. this.canvastishiTF = true
  312. this.wormdata = []
  313. for (var i = 0; i < res.date.length; i++) {
  314. this.wormdata.unshift(res.date[i].pest_name)
  315. }
  316. var arr1 = []
  317. var xtitle = []
  318. var ringarr = []
  319. for (var i = 0; i < res.date.length; i++) {
  320. var times = new Date(res.date[i].add_time * 1000)
  321. xtitle.unshift(times.getMonth() + 1 + "/" + times.getDate() + "-" + times.getHours() + ":" +
  322. times.getSeconds())
  323. arr1.unshift(res.date[i].pest_num == "" ? "0" : res.date[i].pest_num)
  324. var obj = {}
  325. obj.name = res.date[i].pest_name
  326. obj.data = Number(res.date[i].pest_num)
  327. ringarr.unshift(obj)
  328. }
  329. var obj = [{
  330. name: '害虫总数',
  331. data: arr1,
  332. color: '#00E29D'
  333. }]
  334. this.showColumn("canvasColumnA", xtitle, obj)
  335. this.showRing(ringarr)
  336. }
  337. },
  338. async selfhistory() { //获取统计虫子 //手动统计 传入害虫名称
  339. const res = await this.$myRequest({
  340. url: '/api/api_gateway?method=forecast.worm_lamp.pest_manual_statistics',
  341. data: {
  342. pest_name: this.pest_name,
  343. device_id: this.d_id,
  344. start_time: parseInt(this.start_time / 1000),
  345. end_time: parseInt(this.end_time / 1000)
  346. }
  347. })
  348. this.historydatas = res
  349. console.log(this.historydatas)
  350. if (res.date.length == 0) {
  351. this.tishitf = false
  352. this.canvastishiTF = false
  353. } else {
  354. this.tishitf = true
  355. this.canvastishiTF = true
  356. var arr1 = []
  357. var xtitle = []
  358. for (var i = 0; i < res.pests.pest_list.length; i++) {
  359. var times = new Date(res.pests.pest_list[i].add_time * 1000)
  360. xtitle.unshift(times.getMonth() + 1 + "/" + times.getDate() + "-" + times.getHours() + ":" +
  361. times.getSeconds())
  362. arr1.unshift(res.pests.pest_list[i].pest_num == "" ? "0" : res.pests.pest_list[i].pest_num)
  363. }
  364. var obj = [{
  365. name: '害虫总数',
  366. data: arr1,
  367. color: '#00E29D'
  368. }]
  369. this.showColumn("canvasColumnA", xtitle, obj)
  370. }
  371. },
  372. clickLeft() {
  373. uni.navigateBack({
  374. delta: 1
  375. })
  376. },
  377. confirmFun(index) {
  378. this.indexone = index[0]
  379. var now = new Date()
  380. this.$forceUpdate()
  381. if (index[0] == 0) {
  382. this.start_time = strrttime
  383. if (this.topindex == 0) {
  384. if (this.pest_name == '') {
  385. this.historys()
  386. } else {
  387. this.history()
  388. }
  389. } else {
  390. if (this.pest_name == '') {
  391. this.selfhistorys()
  392. } else {
  393. this.selfhistory()
  394. }
  395. }
  396. } else if (index[0] == 1) {
  397. var oldtime = now.setMonth(now.getMonth() - 1)
  398. this.start_time = parseInt(oldtime)
  399. if (this.topindex == 0) {
  400. if (this.pest_name == '') {
  401. this.historys()
  402. } else {
  403. this.history()
  404. }
  405. } else {
  406. if (this.pest_name == '') {
  407. this.selfhistorys()
  408. } else {
  409. this.selfhistory()
  410. }
  411. }
  412. } else if (index[0] == 2) {
  413. var oldtime = now.setMonth(now.getMonth() - 6)
  414. this.start_time = parseInt(oldtime)
  415. if (this.topindex == 0) {
  416. if (this.pest_name == '') {
  417. this.historys()
  418. } else {
  419. this.history()
  420. }
  421. } else {
  422. if (this.pest_name == '') {
  423. this.selfhistorys()
  424. } else {
  425. this.selfhistory()
  426. }
  427. }
  428. } else if (index[0] == 3) {
  429. var oldtime = now.setFullYear(now.getFullYear() - 1)
  430. this.start_time = parseInt(oldtime)
  431. if (this.topindex == 0) {
  432. if (this.pest_name == '') {
  433. this.historys()
  434. } else {
  435. this.history()
  436. }
  437. } else {
  438. if (this.pest_name == '') {
  439. this.selfhistorys()
  440. } else {
  441. this.selfhistory()
  442. }
  443. }
  444. }
  445. },
  446. confirmFun2(index) {
  447. console.log(index)
  448. console.log(this.wormdata)
  449. this.indextwo = index[0]
  450. this.pest_name = this.wormdata[this.indextwo]
  451. if (this.topindex == 0) {
  452. this.history()
  453. } else {
  454. this.selfhistory()
  455. }
  456. },
  457. changeindex(index) {
  458. this.tableval = []
  459. this.topindex = index
  460. if (this.topindex == 0) {
  461. this.pest_name = ''
  462. this.tishitf = false
  463. this.historys()
  464. } else {
  465. this.pest_name = ''
  466. this.tishitf = false
  467. this.selfhistorys()
  468. }
  469. },
  470. showColumn(id, xtitle, xinfo) {
  471. var _self = this
  472. canvaColumnA = new uCharts({
  473. canvasId: id,
  474. type: 'line',
  475. legend: {
  476. position: "top"
  477. },
  478. fontSize: 11,
  479. background: '#FFFFFF',
  480. pixelRatio: 1,
  481. animation: true,
  482. dataLabel: false,
  483. categories: xtitle,
  484. series: xinfo,
  485. enableScroll: true, //开启图表拖拽功能
  486. xAxis: {
  487. disableGrid: true,
  488. type: 'grid',
  489. gridType: 'dash',
  490. itemCount: 5, //x轴单屏显示数据的数量,默认为5个
  491. scrollShow: true, //新增是否显示滚动条,默认false
  492. // scrollAlign: 'left', //滚动条初始位置
  493. scrollBackgroundColor: '#F7F7FF', //默认为 #EFEBEF
  494. scrollColor: '#DEE7F7', //默认为 #A6A6A6
  495. },
  496. yAxis: {},
  497. width: _self.cWidth * 1,
  498. height: _self.cHeight * 1,
  499. extra: {
  500. line: {
  501. type: 'curve'
  502. }
  503. }
  504. });
  505. },
  506. touchLineA(e) {
  507. console.log(e)
  508. canvaColumnA.scrollStart(e);
  509. },
  510. moveLineA(e) {
  511. canvaColumnA.scroll(e);
  512. },
  513. touchEndLineA(e) {
  514. canvaColumnA.scrollEnd(e);
  515. //下面是toolTip事件,如果滚动后不需要显示,可不填写
  516. canvaColumnA.showToolTip(e, {
  517. format: function(item, category) {
  518. return category + ' ' + item.name + ':' + item.data
  519. }
  520. });
  521. },
  522. showRing(data) {
  523. var _self = this
  524. canvasRing = new uCharts({
  525. canvasId: "canvasRing",
  526. type: 'ring',
  527. fontSize: 11,
  528. legend: true,
  529. extra: {
  530. pie: {
  531. offsetAngle: -45,
  532. ringWidth: 40 * _self.pixelRatio,
  533. labelWidth: 15
  534. }
  535. },
  536. background: '#FFFFFF',
  537. pixelRatio: _self.pixelRatio,
  538. series: data,
  539. animation: true,
  540. width: _self.cWidth * _self.pixelRatio,
  541. height: _self.cHeight * _self.pixelRatio,
  542. disablePieStroke: true,
  543. dataLabel: true,
  544. });
  545. },
  546. touchRing(e) {
  547. canvasRing.showToolTip(e, {
  548. format: function(item) {
  549. return item.name + ':' + item.data
  550. }
  551. });
  552. },
  553. },
  554. onLoad(option) {
  555. this.d_id = option.d_id
  556. this.device_id = option.device_id
  557. this.cWidth = uni.upx2px(650);
  558. this.cHeight = uni.upx2px(500);
  559. this.historys()
  560. }
  561. }
  562. </script>
  563. <style lang="scss">
  564. .shuju_one {
  565. position: absolute;
  566. top: 84px;
  567. width: 90%;
  568. left: 5%;
  569. box-shadow: 0 0 10rpx #bcb9ca;
  570. padding-top: 20rpx;
  571. box-sizing: border-box;
  572. height: 650rpx;
  573. .canvastishi {
  574. font-size: 32rpx;
  575. position: absolute;
  576. top: 50%;
  577. left: 50%;
  578. margin-left: -64rpx;
  579. margin-top: -21rpx;
  580. }
  581. }
  582. .shuju_two {
  583. position: absolute;
  584. top: 840rpx;
  585. width: 90%;
  586. left: 5%;
  587. box-shadow: 0 0 10rpx #bcb9ca;
  588. padding-top: 20rpx;
  589. box-sizing: border-box;
  590. height: 650rpx;
  591. margin-bottom: 40rpx;
  592. .canvastishi {
  593. font-size: 32rpx;
  594. position: absolute;
  595. top: 50%;
  596. left: 50%;
  597. margin-left: -64rpx;
  598. margin-top: -21rpx;
  599. }
  600. }
  601. .shuju_table {
  602. position: absolute;
  603. top: 1510rpx;
  604. width: 90%;
  605. left: 5%;
  606. box-shadow: 0 0 10rpx #bcb9ca;
  607. padding-top: 20rpx;
  608. box-sizing: border-box;
  609. margin-bottom: 40rpx;
  610. .table {
  611. tr {
  612. display: flex;
  613. }
  614. .th,
  615. .td {
  616. padding: 5rpx;
  617. width: 240rpx;
  618. text-align: center;
  619. height: 52rpx;
  620. line-height: 52rpx;
  621. font-size: 28rpx !important;
  622. }
  623. }
  624. }
  625. .condition {
  626. position: absolute;
  627. top: 600rpx;
  628. display: flex;
  629. flex-wrap: wrap;
  630. width: 90%;
  631. left: 5%;
  632. box-shadow: 0 0 10rpx #bcb9ca;
  633. margin-bottom: 30rpx;
  634. .scroll-X {
  635. width: 95%;
  636. margin: 20rpx auto;
  637. .tr {
  638. display: flex;
  639. overflow: hidden;
  640. .th,
  641. .td {
  642. display: inline-block;
  643. padding: 5rpx;
  644. width: 240rpx;
  645. text-align: center;
  646. height: 52rpx;
  647. line-height: 52rpx;
  648. border: 2rpx solid #F1F1F1;
  649. }
  650. }
  651. }
  652. .pagenumber {
  653. display: flex;
  654. margin: 20rpx auto;
  655. button {
  656. width: 150rpx;
  657. height: 50rpx;
  658. line-height: 50rpx;
  659. font-size: 26rpx;
  660. text-align: center;
  661. background-color: #17BB89;
  662. color: #FFFFFF;
  663. }
  664. .pagenumber_page {
  665. width: 150rpx;
  666. height: 50rpx;
  667. line-height: 50rpx;
  668. font-size: 26rpx;
  669. text-align: center;
  670. }
  671. }
  672. }
  673. </style>