statistics.vue 18 KB

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