IndustryReport.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. <template>
  2. <view class="container industry-content" id="industry-content">
  3. <view v-if="haveData">
  4. <view class="content-top">
  5. <view class="top-bg">
  6. <!-- 详情封面图 -->
  7. <image :src="industryVideo.DetailImgUrl" class="industry-video-poster"
  8. v-show="industryVideo.Id && industryVideo.DetailImgUrl && !havePlayed"
  9. @click="handelVideoPlay"></image>
  10. <!-- 视频 -->
  11. <video :src="industryVideo.ResourceUrl" class="industry-video" id="industry-video"
  12. v-show="industryVideo.ResourceUrl && (havePlayed || (!industryVideo.DetailImgUrl))" controls></video>
  13. <view class="top-bg-title"
  14. :style="{'height':industryVideo.Id?'70rpx':'99rpx',
  15. 'background-color':industryVideo.Id?'white':'#d1ebff'}">产业赛道布局于{{ layoutTime }}</view>
  16. </view>
  17. <!-- industryVideo.ResourceUrl -- 视频url -->
  18. <view class="top-box" :style="{'top':industryVideo.Id?'418rpx':'99rpx'}">
  19. <view class="top-tab-cont">
  20. <view class="tab-cont">
  21. <scroll-view scroll-x="true" scroll-with-animation class="scroll-tab" :scroll-into-view="'_' + tabIndex">
  22. <block v-for="(item, index) in tabBars" :key="item.CategoryId">
  23. <view :id="'_' + index" class="scroll-tab-item" :class="{ active: tabAct_id == item.CategoryId }" @click.stop="toggleTab(item, index)">
  24. {{ item.MatchTypeName }}
  25. <image src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/border_act.png" mode="" class="border_act" v-if="tabAct_id == item.CategoryId"></image>
  26. <text class="reg-hint" v-if="item.IsRed"></text>
  27. </view>
  28. </block>
  29. </scroll-view>
  30. </view>
  31. <view class="lucency" v-if="tabBars.length > 6"></view>
  32. </view>
  33. </view>
  34. </view>
  35. <view class="collect-ul" :style="{'padding-top':industryVideo.ResourceUrl?'528rpx':'210rpx'}">
  36. <!-- 其他tab -->
  37. <block v-show="tabAct_id!==99999">
  38. <view class="collect-ltem" v-for="(item, index) in collectList" :key="index" @click="goDetail(item, index)">
  39. <view class="item-left">
  40. <text class="title text_twoLine"
  41. >{{ item.Title }}
  42. <text class="reg-text" v-if="item.IsRed"></text>
  43. </text>
  44. <text class="text_twoLine desc">{{ item.PublishDate }}</text>
  45. </view>
  46. <u-icon name="arrow-right" color="#BDBDBD" size="34"></u-icon>
  47. </view>
  48. <u-loadmore :status="status" icon-type="flower" :load-text="loadText" margin-top="20" v-if="totalPage > 1&&tabAct_id!==99999" />
  49. </block>
  50. <!-- 时间线 -->
  51. <block v-if="tabAct_id===99999">
  52. <view class="time-line">
  53. <view class="line-item" v-for="(item,index) in timeLine" :key="index" @click="goDetailFromTimeLine(item, index)">
  54. <view class="time">{{item.date}}</view>
  55. <view class="content" v-if="item.Content.length">
  56. <rich-text class="rich-text" :style="{height:item.isExpand?'auto':richTextHeight+'px'}" :data-index="index" :class="{'expand':item.isExpand}"
  57. :nodes="item.Content">
  58. </rich-text>
  59. <view class="expan-btn" :class="{'pos':!item.isExpand}" @click="handleExpand(item,index)" v-if="item.isShowBtn">{{item.isExpand?'收起':'展开'}}</view>
  60. </view>
  61. <view class="title" v-else>{{item.Title}}</view>
  62. </view>
  63. <view v-show="loadTimeLine" class="loadTimeLine"></view>
  64. <u-loadmore :status="status" icon-type="flower" :load-text="loadText" margin-top="20" v-if="totalPage > 1&&tabAct_id===99999" />
  65. </view>
  66. </block>
  67. </view>
  68. </view>
  69. <view class="nodata" v-else>
  70. <image src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/act_search.png" mode="" class="nodata_ico"></image>
  71. <text>暂时没有报告的内容</text>
  72. </view>
  73. <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
  74. <!-- 权限弹窗 -->
  75. <modalDialog :isShowhasPermission="isShowhasPermission" :applyForIsShow="applyForIsShow" :jurisdictionList="jurisdictionList" :hasPermission="hasPermission" />
  76. </view>
  77. </template>
  78. <script>
  79. import { Mine } from "@/config/api.js"; //模拟
  80. import { Reports } from "@/config/api.js"; //模拟
  81. import { Throttle } from "@/config/util.js";
  82. import freeCharge from "@/components/freeCharge";
  83. import modalDialog from "@/components/modalDialog.vue";
  84. let app = getApp({ allowDefault: true });
  85. export default {
  86. data() {
  87. return {
  88. tabAct_id: "",
  89. tabBars: [],
  90. industrialManagementId: "",
  91. layoutTime: "",
  92. refresh: false, //正在下拉
  93. page_no: 1,
  94. pageSize: 10,
  95. categoryId: "",
  96. collectList: [],
  97. isShow: false,
  98. haveData: true,
  99. status: "loadmore",
  100. loadText: {
  101. loadmore: "上拉加载更多",
  102. loading: "加载中",
  103. nomore: "已经到底了",
  104. },
  105. totalPage: "",
  106. toggleTabIndex: 0,
  107. titleReport: "",
  108. pcTabActive: "",
  109. industryVideo:{},
  110. authInfo:{},
  111. havePlayed:false,
  112. isShowhasPermission: false, // 联系销售的提交申请
  113. applyForIsShow: false, // 提交申请
  114. jurisdictionList: {},
  115. hasPermission: "", //权限
  116. timeLine:[],//时间线数据
  117. mockTimeLine:[
  118. {
  119. date:'不重要',
  120. Content:'<p>hello,world</p><p>hello,world</p><p>hello,world</p>'
  121. },//第一项是为了获取当前手机下,三行是多少相对高度
  122. ],
  123. loadTimeLine:false,//时间线的遮罩
  124. richTextHeight:1000,//晨会富文本最大高度
  125. };
  126. },
  127. onLoad(option) {
  128. this.industrialManagementId = option.id;
  129. this.tabAct_id = option.tab;
  130. this.toArticleCategoryList();
  131. },
  132. onShow() {
  133. this.$store.dispatch("statistics", { PageType: "IndustryList", IndustrialManagementId: this.industrialManagementId });
  134. },
  135. components: {
  136. freeCharge,
  137. modalDialog
  138. },
  139. watch: {
  140. //监听tabs的变化
  141. tabAct_id: {
  142. handler() {
  143. if (this.tabAct_id) {
  144. (this.page_no = 1), (this.collectList = []);
  145. this.getCollectList();
  146. }
  147. },
  148. immediate: true,
  149. },
  150. },
  151. methods: {
  152. //tabs切换事件
  153. toggleTab(item, index) {
  154. this.toggleTabIndex = index;
  155. if (this.tabAct_id !== item.CategoryId) {
  156. this.tabAct_id = item.CategoryId;
  157. this.pageNum = 1;
  158. this.timeLine=[]
  159. this.totalPage=""
  160. uni.pageScrollTo({
  161. scrollTop: 0,
  162. duration: 0,
  163. });
  164. }
  165. },
  166. toArticleCategoryList() {
  167. Reports.toArticleCategoryList({
  168. IndustrialManagementId: this.industrialManagementId,
  169. ShowTimeLine:1
  170. }).then((res) => {
  171. if (res.Ret == 200) {
  172. uni.setNavigationBarTitle({
  173. title: res.Data.IndustryName,
  174. });
  175. this.titleReport = res.Data.IndustryName;
  176. this.layoutTime = res.Data.LayoutTime;
  177. this.industryVideo = res.Data.IndustryVideo
  178. this.authInfo = res.Data.AuthInfo
  179. if (res.Data.List) {
  180. this.tabAct_id = res.Data.List[0].CategoryId;
  181. this.tabBars = res.Data.List;
  182. }
  183. }
  184. });
  185. },
  186. /* 获取列表 */
  187. getCollectList() {
  188. //just for test
  189. if(this.tabAct_id===99999) {
  190. Reports.getArticleList({
  191. PageSize: this.pageSize,
  192. CurrentIndex: this.page_no,
  193. CategoryId: 99999,
  194. IndustrialManagementId: this.industrialManagementId,
  195. }).then((res)=>{
  196. if(res.Ret===200){
  197. this.loadTimeLine = true
  198. this.status = this.page_no < res.Data.Paging.Pages ? "loadmore" : "nomore"
  199. this.totalPage = res.Data.Paging.Pages
  200. let list = res.Data.List||[]
  201. list = list.map(item=>{
  202. let temp = item
  203. temp.date = item.PublishTime.split(" ")[0]
  204. if(item.Content.length){
  205. temp.isExpand = true
  206. temp.isShowBtn = true
  207. }
  208. return temp
  209. })
  210. if(this.page_no===1){
  211. this.timeLine = list
  212. this.haveData = this.timeLine.length ? true : false;
  213. if (this.refresh) {
  214. uni.stopPullDownRefresh();
  215. this.refresh = false;
  216. }
  217. }else{
  218. this.timeLine = this.timeLine.concat(list)
  219. }
  220. }
  221. this.timeLine.unshift(this.mockTimeLine[0])
  222. //在获取高度前把所有的晨会展开,收起的话无法获取正确高度
  223. this.timeLine.forEach(item=>{
  224. if(item.Content.length){
  225. item.isExpand = true
  226. item.isShowBtn = true
  227. }
  228. })
  229. setTimeout(()=>{
  230. this.getConentsHeight()
  231. },0)
  232. })
  233. return
  234. }
  235. Reports.getArticleList({
  236. PageSize: this.pageSize,
  237. CurrentIndex: this.page_no,
  238. CategoryId: this.tabAct_id,
  239. IndustrialManagementId: this.industrialManagementId,
  240. }).then((res) => {
  241. if (res.Ret === 200) {
  242. this.status = this.page_no < res.Data.Paging.Pages ? "loadmore" : "nomore";
  243. this.totalPage = res.Data.Paging.Pages; //总页数
  244. if (this.page_no === 1) {
  245. this.pcTabActive = res.Data.ChartPermissionId;
  246. this.collectList = res.Data.List || [];
  247. this.haveData = this.collectList.length ? true : false;
  248. if (this.refresh) {
  249. uni.stopPullDownRefresh();
  250. this.refresh = false;
  251. }
  252. } else {
  253. this.collectList = this.collectList.concat(res.Data.List);
  254. }
  255. }
  256. });
  257. },
  258. async goDetail(item, index) {
  259. /* 无需授权且已绑定 检验是或否有权限 */
  260. if (index == 0) {
  261. this.tabBars[this.toggleTabIndex].IsRed = false;
  262. }
  263. this.collectList[index].IsRed = false;
  264. await this.$store.dispatch("checkHandle");
  265. if (!this.$store.state.isAuth && !this.$store.state.isBind) {
  266. // 已授权已绑定
  267. if (item.SubCategoryName=== "路演精华") {
  268. //跳转路演精华
  269. uni.navigateTo({
  270. url: "/reportPages/roadEssence/roadEssence?id=" + item.ArticleId,
  271. });
  272. } else {
  273. uni.navigateTo({
  274. url: "/pageMy/reportDetail/reportDetail?id=" + item.ArticleId,
  275. });
  276. }
  277. }
  278. },
  279. // 视频播放权限判断
  280. handelVideoPlay(){
  281. if (!this.$store.state.isAuth && !this.$store.state.isBind) {
  282. if (this.authInfo.HasPermission == 1) {
  283. this.playVideo()
  284. } else {
  285. this.hasPermission = this.authInfo.HasPermission;
  286. this.jurisdictionList.ActivityId = this.industryVideo.Id;
  287. this.jurisdictionList.isAudioVideo = 3;
  288. if (this.hasPermission == 2) {
  289. this.jurisdictionList.SellerMobile = this.authInfo.SellerMobile;
  290. this.jurisdictionList.SellerName = this.authInfo.SellerName;
  291. this.jurisdictionList.PopupMsg = this.authInfo.PopupMsg;
  292. this.isShowhasPermission = true;
  293. } else if (this.hasPermission == 3 || this.hasPermission == 4 || this.hasPermission == 5) {
  294. this.jurisdictionList.PopupMsg = this.authInfo.PopupMsg;
  295. this.applyForIsShow = true;
  296. }
  297. }
  298. } else {
  299. this.$store.dispatch("checkHandle");
  300. }
  301. },
  302. // 播放视频
  303. playVideo(){
  304. const query = uni.createSelectorQuery().in(this)
  305. query.select("#industry-video").context(data =>{
  306. data.context.play()
  307. setTimeout(()=>{
  308. this.havePlayed=true
  309. },10)
  310. }).exec()
  311. },
  312. //展开收起晨会内容
  313. handleExpand(item,index){
  314. item.isExpand = !item.isExpand
  315. this.timeLine.splice(index,1,item)
  316. },
  317. //获取所有晨会内容的高度并决定是否显示展开收起按钮
  318. getConentsHeight(){
  319. const query = wx.createSelectorQuery()
  320. query.selectAll(".rich-text").boundingClientRect()
  321. query.exec(res=>{
  322. /* console.log(res[0][0].height) */
  323. //根据timeLine的第一项确定当前手机三行文字的高度
  324. const standardHeight = res[0][0].height
  325. this.richTextHeight = standardHeight
  326. res[0].forEach(item=>{
  327. let temp = this.timeLine[item.dataset.index]
  328. //超过这个高度的,需要显示展开/收起按钮
  329. if(item.height>standardHeight){
  330. temp.isExpand = false
  331. temp.isShowBtn = true
  332. }else{
  333. temp.isExpand = true
  334. temp.isShowBtn = false
  335. }
  336. })
  337. //然后把timeLine的第一项扔掉
  338. this.timeLine.shift()
  339. this.loadTimeLine = false
  340. })
  341. },
  342. async goDetailFromTimeLine(item, index){
  343. if(item.Content.length!==0) return;
  344. await this.$store.dispatch("checkHandle");
  345. if (!this.$store.state.isAuth && !this.$store.state.isBind) {
  346. // 已授权已绑定
  347. if (item.SubCategoryName=== "路演精华") {
  348. //跳转路演精华
  349. uni.navigateTo({
  350. url: "/reportPages/roadEssence/roadEssence?id=" + item.Id,
  351. });
  352. } else {
  353. uni.navigateTo({
  354. url: "/pageMy/reportDetail/reportDetail?id=" + item.Id,
  355. });
  356. }
  357. }
  358. },
  359. getNode(content,isExpand){
  360. return `<div style='-webkit-line-clamp: ${isExpand?9999:3};-webkit-box-orient: vertical;display: -webkit-box;overflow: hidden;text-overflow: ellipsis;'>${content}</div>`
  361. }
  362. },
  363. /* 触底 */
  364. onReachBottom: Throttle(function () {
  365. if (this.status === "nomore") return;
  366. this.status = "loading";
  367. this.page_no++;
  368. if (this.tabAct_id) {
  369. this.getCollectList();
  370. }
  371. }),
  372. /* 下拉刷新 */
  373. onPullDownRefresh: Throttle(function () {
  374. if (this.tabAct_id) {
  375. this.page_no = 1;
  376. this.refresh = true;
  377. this.getCollectList();
  378. }
  379. }),
  380. /**
  381. * 用户点击分享
  382. */
  383. onShareAppMessage: function (res) {
  384. return {
  385. title: this.isHorzMobile ? "好友向您推荐此内容,上传名片享查研观向免费月卡!" : this.titleReport,
  386. path: "/reportPages/IndustryReport/IndustryReport?id=" + this.industrialManagementId + "&tab=" + this.tabAct_id + "&tabs=" + this.pcTabActive,
  387. success: (res) => {},
  388. fail: (err) => {},
  389. };
  390. },
  391. };
  392. </script>
  393. <style lang="scss">
  394. .industry-content {
  395. background-color: #f7f7f7;
  396. // height: 100vh;
  397. .top-bg {
  398. position: fixed;
  399. top: 0;
  400. left: 0;
  401. width: 100%;
  402. z-index: 100;
  403. background-color: white;
  404. text-align: center;
  405. .industry-video-poster{
  406. border-radius: 8rpx 8rpx 0 0;
  407. height: 340rpx;
  408. width: 728rpx;
  409. }
  410. .industry-video{
  411. height: 340rpx;
  412. width: 728rpx;
  413. }
  414. .top-bg-title{
  415. height: 99rpx;
  416. color: #2c83ff;
  417. background-color: #d1ebff;
  418. font-size: 28rpx;
  419. display: flex;
  420. align-items: center;
  421. justify-content: center;
  422. }
  423. .test{
  424. position: relative;
  425. span{
  426. position: absolute;
  427. left: 30rpx;
  428. bottom: 30rpx;
  429. color: white;
  430. }
  431. }
  432. }
  433. .top-box {
  434. position: fixed;
  435. width: 100%;
  436. top: 99rpx;
  437. left: 0;
  438. z-index: 100;
  439. }
  440. .top-tab-cont {
  441. .lucency {
  442. position: absolute;
  443. top: 0;
  444. right: 0;
  445. width: 32px;
  446. height: 30px;
  447. opacity: 0.9;
  448. background-color: #fff;
  449. }
  450. .tab-cont {
  451. padding: retu;
  452. padding: 30rpx 26rpx 0;
  453. background-color: #fff;
  454. font-size: 32rpx;
  455. box-shadow: 0 3rpx 6rpx rgba(187, 216, 255, 0.2);
  456. .scroll-tab {
  457. width: 100%;
  458. white-space: nowrap;
  459. }
  460. .scroll-tab-item {
  461. // flex-grow: 1;
  462. text-align: center;
  463. display: inline-block;
  464. padding: 0rpx 8rpx 30rpx 8rpx;
  465. margin-right: 60rpx;
  466. border-bottom: 8rpx solid transparent;
  467. position: relative;
  468. &:last-child {
  469. margin-right: 0;
  470. }
  471. &.active {
  472. border-bottom: none;
  473. color: #2c83ff;
  474. font-weight: 700;
  475. }
  476. .border_act {
  477. width: 100%;
  478. height: 8rpx;
  479. position: absolute;
  480. bottom: 0;
  481. left: 0;
  482. }
  483. .reg-hint {
  484. position: absolute;
  485. top: 0rpx;
  486. right: -10rpx;
  487. width: 14rpx;
  488. height: 14rpx;
  489. background-color: #ff0000;
  490. border-radius: 50%;
  491. }
  492. }
  493. }
  494. }
  495. .collect-ul {
  496. // margin-top: 30rpx;s
  497. padding-top: 210rpx;
  498. // padding-top: 4rpx;
  499. .collect-ltem {
  500. display: flex;
  501. padding: 30rpx 34rpx;
  502. background: #fff;
  503. margin-bottom: 4rpx;
  504. align-items: center;
  505. justify-content: space-between;
  506. .title {
  507. position: relative;
  508. max-width: 625rpx;
  509. color: #4a4a4a;
  510. font-size: 34rpx;
  511. padding-left: 28rpx;
  512. .reg-text {
  513. position: absolute;
  514. top: 15rpx;
  515. left: 0rpx;
  516. width: 14rpx;
  517. height: 14rpx;
  518. background-color: #ff0000;
  519. border-radius: 50%;
  520. z-index: 9;
  521. }
  522. }
  523. .desc {
  524. margin-top: 17rpx;
  525. padding-left: 28rpx;
  526. width: 625rpx;
  527. color: #999;
  528. }
  529. }
  530. .time-line{
  531. margin-top:15rpx;
  532. padding:30rpx 40rpx 50rpx 40rpx;
  533. min-height: calc(100vh - 190rpx);
  534. background-color:#FFFFFF;
  535. position: relative;
  536. .loadTimeLine{
  537. top:0;bottom:0;left:0;right:0;
  538. position:absolute;
  539. background-color: #fff;
  540. z-index: 6;
  541. }
  542. .line-item{
  543. position:relative;
  544. padding:0 0 50rpx 40rpx;
  545. /* border-left:1rpx solid #DAE9FD; */
  546. &:last-child{
  547. padding-bottom: 0;
  548. &::after{
  549. height: calc(100% - 25rpx);
  550. }
  551. }
  552. &:first-child{
  553. .time{
  554. &::after{
  555. background-color: #3385FF;
  556. }
  557. }
  558. }
  559. &::before,&::after{
  560. position:absolute;
  561. content: "";
  562. }
  563. &::before{
  564. width:24rpx;
  565. height: 24rpx;
  566. background-color: #DAE9FD;
  567. z-index: 1;
  568. left:0;
  569. top:27rpx;
  570. transform: translate(-50%,-50%);
  571. border-radius: 50%;
  572. }
  573. &::after{
  574. top:17rpx;
  575. left:0;
  576. width:1rpx;
  577. height:calc(100%);
  578. background-color: #DAE9FD;
  579. z-index: 2;
  580. }
  581. .time{
  582. width:245rpx;
  583. height: 55rpx;
  584. text-align: center;
  585. line-height: 45rpx;
  586. padding:5rpx 20rpx;
  587. background-color: #F5F9FF;
  588. border-radius: 64rpx;
  589. color:#5181C9;
  590. font-size: 32rpx;
  591. margin-bottom:20rpx;
  592. position: relative;
  593. &::before,&::after{
  594. position:absolute;
  595. content: "";
  596. left:-36rpx;
  597. top:27rpx;
  598. width:24rpx;
  599. height:1rpx;
  600. background-color:#DAE9FD;
  601. z-index: 1;
  602. }
  603. &::after{
  604. left:-40rpx;
  605. top:27rpx;
  606. width:12rpx;
  607. height:12rpx;
  608. border-radius: 50%;
  609. transform: translate(-50%,-50%);
  610. background-color:#9DC5FF;
  611. z-index: 3;
  612. }
  613. }
  614. .content{
  615. color:#666666;
  616. position: relative;
  617. .rich-text{
  618. overflow: hidden;
  619. text-overflow: ellipsis;
  620. text-align: justify;
  621. display: -webkit-box;
  622. -webkit-line-clamp: 3;
  623. -webkit-box-orient: vertical;
  624. position: relative;
  625. &.expand{
  626. -webkit-line-clamp: 999;
  627. height: auto;
  628. }
  629. }
  630. .expan-btn{
  631. color:#2C83FF;
  632. text-align: right;
  633. &.pos{
  634. padding:0 0 0 40rpx;
  635. background-color: rgba(255, 255, 255, 0.882);
  636. position:absolute;
  637. right:0;
  638. bottom:0;
  639. }
  640. }
  641. }
  642. .title{
  643. color:#3385FF;
  644. }
  645. }
  646. }
  647. }
  648. }
  649. #industry-content{
  650. .industry-video-module{
  651. .global-video-box{
  652. .video-content{
  653. top: 400rpx!important;
  654. }
  655. .close-icon{
  656. top: 330rpx!important;
  657. }
  658. }
  659. }
  660. }
  661. </style>