addLInkDia.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649
  1. <template>
  2. <el-dialog :modal-append-to-body='false' title="添加链接" :visible.sync="show"
  3. :close-on-click-modal="false" width="872px" top="5vh">
  4. <div class="add-link-box">
  5. <div class="link-box-option">
  6. <el-select v-model="addLinkSearchParams.linkType" placeholder="链接类型" style="width: 240px;" @change="changeLinkType">
  7. <el-option :label="item.label" :value="item.value" v-for="item in linkTypeList" :key="item.value"></el-option>
  8. </el-select>
  9. <el-select v-if="addLinkSearchParams.linkType==1"
  10. v-model="search_dataBaseId"
  11. v-loadMore="dataBaseSearchLoad"
  12. ref="searchRef"
  13. :filterable="!search_dataBaseId"
  14. remote
  15. clearable
  16. placeholder="指标ID/指标名称"
  17. style="width: 240px"
  18. :remote-method="dataBaseSearch"
  19. @click.native="dataBaseInputFocus"
  20. >
  21. <i slot="prefix" class="el-input__icon el-icon-search"></i>
  22. <el-option
  23. v-for="item in dataBaseOptions"
  24. :key="item.EdbInfoId"
  25. :label="item.EdbName"
  26. :value="item.EdbInfoId"
  27. >
  28. </el-option>
  29. </el-select>
  30. <el-select v-else-if="addLinkSearchParams.linkType==2"
  31. v-model="search_dataBaseId"
  32. v-loadMore="dataBaseSearchLoad"
  33. ref="searchRef"
  34. :filterable="!search_dataBaseId"
  35. remote
  36. clearable
  37. placeholder="图表名称"
  38. style="width: 240px"
  39. :remote-method="dataBaseSearch"
  40. @click.native="dataBaseInputFocus"
  41. >
  42. <i slot="prefix" class="el-input__icon el-icon-search"></i>
  43. <el-option
  44. v-for="item in dataBaseOptions"
  45. :key="item.ChartInfoId"
  46. :label="item.ChartName"
  47. :value="item.ChartInfoId"
  48. >
  49. </el-option>
  50. </el-select>
  51. <el-input v-else v-model="reportKeyWord" @input="searchReport"
  52. placeholder="标题 / 创建人" style="width: 240px;" clearable >
  53. <i slot="prefix" class="el-input__icon el-icon-search"></i>
  54. </el-input>
  55. </div>
  56. <div class="link-box-content">
  57. <!-- 指标 -->
  58. <div class="link-content-dataIndex" v-if="addLinkSearchParams.linkType==1 && databaseTableData && databaseTableData.length>0">
  59. <el-table :data="databaseTableData" border style="box-shadow: rgba(155, 170, 219, 0.2) 0px 3px 6px;">
  60. <el-table-column label="指标Id" align="center">
  61. <template slot-scope="scope">{{ scope.row.EdbCode }}</template>
  62. </el-table-column>
  63. <el-table-column label="指标名称" align="center" width="200">
  64. <template slot-scope="scope">{{ scope.row.EdbName }}</template>
  65. </el-table-column>
  66. <el-table-column label="频度" align="center" width="50">
  67. <template slot-scope="scope">{{ scope.row.Frequency }}</template>
  68. </el-table-column>
  69. <el-table-column label="单位" align="center">
  70. <template slot-scope="scope">{{ scope.row.Unit }}</template>
  71. </el-table-column>
  72. <el-table-column label="起始时间" align="center" width="100">
  73. <template slot-scope="scope">{{ scope.row.StartDate }}</template>
  74. </el-table-column>
  75. <el-table-column label="更新时间" align="center" width="160">
  76. <template slot-scope="scope">{{ scope.row.ModifyTime }}</template>
  77. </el-table-column>
  78. <el-table-column label="来源" align="center">
  79. <template slot-scope="scope">{{ scope.row.SourceName }}</template>
  80. </el-table-column>
  81. <el-table-column label="操作" align="center" width="50">
  82. <template slot-scope="scope">
  83. <span class="delete-button">删除</span>
  84. </template>
  85. </el-table-column>
  86. </el-table>
  87. <ul
  88. class="value-ul"
  89. ref="valueUl"
  90. @scroll="databaseScrollHandle"
  91. v-show="databaseList.length">
  92. <li
  93. class="value-item"
  94. v-for="item in databaseList"
  95. :key="item.EdbDataId"
  96. >
  97. <span class="value-label">
  98. <span style="position: relative;">
  99. <i class="new-tag" v-if="databaseTableData[0].LatestDate===item.DataTime"></i>
  100. {{item.DataTime}}
  101. </span>
  102. </span>
  103. <span :class="['value-label',{'predict-act': databaseTableData[0].DataInsertConfig.Date===item.DataTime}]" style="min-width:200px;text-align:center;">
  104. <span :class="['value-style',{'predict-act': databaseTableData[0].DataInsertConfig.Date===item.DataTime}]">{{item.Value}}</span>
  105. </span>
  106. </li>
  107. <li class="nodata value-item" v-if="!databaseList.length">暂无数据</li>
  108. </ul>
  109. </div>
  110. <div class="link-content-chartIndex" v-else-if="addLinkSearchParams.linkType==2 && this.chartInfo && this.chartInfo.ChartInfoId">
  111. <div class="chart-name">{{ this.chartInfo.ChartName }}</div>
  112. <Chart :options="options" ref="chartRef" />
  113. </div>
  114. <div class="link-content-dataIndex" v-else-if="addLinkSearchParams.linkType==3 && this.reportList.length>0">
  115. <el-table :data="this.reportList" border style="margin-bottom: 10px;" ref="reportTable"
  116. @select="reportSelect" @select-all="reportSelect">
  117. <el-table-column type="selection" width="40" align="center"></el-table-column>
  118. <el-table-column label="报告标题" align="center" show-overflow-tooltip>
  119. <template slot-scope="scope">
  120. <span >{{ scope.row.Title }}</span>
  121. <span v-if="scope.row.MsgSendTime">
  122. ({{ scope.row.MsgSendTime.substring(5, 7)}}{{ scope.row.MsgSendTime.substring(8, 10) }})
  123. </span>
  124. <span v-else-if="scope.row.PublishTime">
  125. ({{ scope.row.PublishTime.substring(5, 7)}}{{ scope.row.PublishTime.substring(8, 10) }})
  126. </span>
  127. <span v-else-if="scope.row.CreateTime">
  128. ({{ scope.row.CreateTime.substring(5, 7)}}{{ scope.row.CreateTime.substring(8, 10) }})
  129. </span>
  130. </template>
  131. </el-table-column >
  132. <el-table-column label="发布时间" align="center">
  133. <template slot-scope="scope">
  134. <span>{{scope.row.PrePublishTime?scope.row.PrePublishTime:scope.row.PublishTime}}</span>
  135. </template>
  136. </el-table-column>
  137. </el-table>
  138. <m-page :page_no="reportParams.CurrentIndex" :pageSize="5" :total="reportTotal" @handleCurrentChange="pageChange"/>
  139. </div>
  140. <tableNoData text="暂无数据" v-else/>
  141. </div>
  142. <div class="link-box-tags">
  143. <div class="link-box-tag" v-for="(item,index) in checkedLinkList" :key="item.RId">
  144. <span @dblclick.stop="editLinkName(item)" v-if="!item.editing" @click="linkClick(item)">{{ item.Name }}</span>
  145. <el-input v-else @blur="editLinkNameFinish(item)"
  146. v-model.trim="editingLabel" class="label-edit-input" ref="labelEditInput"/>
  147. <img src="~@/assets/img/sand_new/delete_outline_1.png" @click="linkDelete(item,index)">
  148. </div>
  149. </div>
  150. <div class="link-box-buttons">
  151. <el-button type="info" style="width:120px;color:#333333;background-color:#F4F8FE" @click="cancelHandle">取消</el-button>
  152. <el-button type="primary" style="width:120px;margin-left: 30px;" @click="saveLink">确定</el-button>
  153. </div>
  154. </div>
  155. </el-dialog>
  156. </template>
  157. <script>
  158. import { chartSetMixin } from '../../../dataEntry_manage/mixins/chartPublic'
  159. import * as sheetInterface from "@/api/modules/sheetApi.js";
  160. import mPage from "@/components/mPage.vue";
  161. import Chart from '../../../dataEntry_manage/components/chart.vue'
  162. import { dataBaseInterface,reportlist} from '@/api/api.js';
  163. export default {
  164. components:{
  165. mPage,Chart
  166. },
  167. props:{
  168. show:{
  169. reuqired:true,
  170. type:Boolean
  171. },
  172. linkList:{
  173. type:Array,
  174. default:()=>[]
  175. }
  176. },
  177. mixins:[chartSetMixin],
  178. watch:{
  179. /* 选中搜索指标 展开目录 选中指标 展示数据 */
  180. search_dataBaseId(newval) {
  181. if (newval) {
  182. if(this.addLinkSearchParams.linkType==1){
  183. let search_obj = this.dataBaseOptions.find(
  184. (item) => item.EdbInfoId === newval
  185. );
  186. if(search_obj){
  187. this.checkedLinkList.push({
  188. RId:this.addLinkSearchParams.linkType+'-'+search_obj.EdbInfoId,
  189. Id:search_obj.EdbInfoId,
  190. Name:search_obj.EdbName,
  191. Type:this.addLinkSearchParams.linkType,
  192. editing:false,
  193. databaseType:search_obj.EdbInfoType, //0 普通指标 | 1 预测指标
  194. detailParams:{
  195. code:search_obj.UniqueCode,
  196. id:search_obj.EdbInfoId,
  197. classifyId:search_obj.ClassifyId
  198. }
  199. })
  200. this.activeItemRId=this.addLinkSearchParams.linkType+'-'+search_obj.EdbInfoId
  201. this.initGetData()
  202. }
  203. }else{
  204. let search_obj = this.dataBaseOptions.find(
  205. (item) => item.ChartInfoId === newval
  206. );
  207. if(search_obj){
  208. this.checkedLinkList.push({
  209. RId:this.addLinkSearchParams.linkType+'-'+search_obj.ChartInfoId,
  210. Id:search_obj.ChartInfoId,
  211. Name:search_obj.ChartName,
  212. Type:this.addLinkSearchParams.linkType,
  213. editing:false,
  214. detailParams:{
  215. code:search_obj.UniqueCode,
  216. id:search_obj.ChartInfoId
  217. }
  218. })
  219. this.activeItemRId=this.addLinkSearchParams.linkType+'-'+search_obj.ChartInfoId
  220. this.getChartDetail(search_obj.ChartInfoId)
  221. }
  222. }
  223. }
  224. },
  225. edbData: {
  226. handler(newval, oldval) {
  227. newval.length && !this.chartInfo.WarnMsg && this.setChartOptionHandle(newval);
  228. },
  229. deep: true,
  230. },
  231. show(value){
  232. if(value){
  233. this.addLinkSearchParams.linkType=1
  234. this.changeLinkType()
  235. this.checkedLinkList = JSON.parse(JSON.stringify(this.linkList))
  236. }
  237. }
  238. },
  239. data() {
  240. return {
  241. linkTypeList:[
  242. {value:1,label:"ETA指标/预测指标"},
  243. {value:2,label:"ETA图库"},
  244. {value:3,label:"ETA研报"}
  245. ],
  246. addLinkSearchParams:{
  247. linkType:1
  248. },
  249. //添加链接:指标
  250. search_dataBaseId:'',
  251. dataBaseParams:{
  252. pages:1,
  253. searchText:'',
  254. search_have_more:false
  255. },
  256. dataBaseOptions:[],
  257. databaseTableData:[],
  258. databaseList:[],
  259. databaseHaveMore:false,
  260. databasePageNo:1,
  261. chartInfo:{},
  262. edbData:[],
  263. options:{},
  264. reportKeyWord:'',
  265. reportParams:{
  266. CurrentIndex:1,
  267. PageSize:5,
  268. },
  269. reportList:[],
  270. selections:[],
  271. checkedLinkList:[],
  272. reportTotal:0,
  273. editingLabel:'',
  274. activeItemRId:'',
  275. }
  276. },
  277. methods: {
  278. // -------------------------------添加链接
  279. changeLinkType(){
  280. this.search_dataBaseId=''
  281. this.dataBaseOptions=[]
  282. this.dataBaseParams={
  283. pages:1,
  284. searchText:'',
  285. search_have_more:false
  286. }
  287. this.databaseTableData=[]
  288. this.databaseList=[]
  289. this.databaseHaveMore=false
  290. this.databasePageNo=1
  291. this.chartInfo={}
  292. this.edbData=[]
  293. this.reportKeyWord=''
  294. this.reportList=[]
  295. },
  296. /* 搜索 */
  297. dataBaseSearch(query) {
  298. this.dataBaseParams.pages = 1;
  299. this.dataBaseParams.searchText = query;
  300. this.dataBaseSearchApi(this.dataBaseParams.searchText)
  301. },
  302. // 加载更多
  303. dataBaseSearchLoad() {
  304. if(!this.dataBaseParams.search_have_more) return;
  305. this.dataBaseSearchApi(this.dataBaseParams.searchText,++this.dataBaseParams.pages);
  306. },
  307. /* 聚焦获取当前检索 */
  308. dataBaseInputFocus(e) {
  309. this.dataBaseParams.pages = 1;
  310. this.dataBaseParams.searchText = e.target.value;
  311. if(this.dataBaseParams.searchText) {
  312. this.dataBaseSearchApi(this.dataBaseParams.searchText);
  313. }else {
  314. this.searchOptions = [];
  315. this.dataBaseParams.search_have_more=false
  316. }
  317. },
  318. dataBaseSearchApi(query,page=1) {
  319. if(this.addLinkSearchParams.linkType==1){
  320. sheetInterface.searchTarget({
  321. KeyWord:query,
  322. CurrentIndex: page
  323. }).then(res => {
  324. if(res.Ret !== 200) return
  325. const { List,Paging } = res.Data;
  326. this.dataBaseParams.search_have_more = page < Paging.Pages;
  327. this.dataBaseOptions = page === 1 ? List : this.dataBaseOptions.concat(List);
  328. })
  329. }else{
  330. dataBaseInterface.chartSearchByEs({
  331. Keyword: query,
  332. IsShowMe:false,
  333. CurrentIndex: page
  334. })
  335. .then((res) => {
  336. if (res.Ret !== 200) return
  337. const { List,Paging } = res.Data;
  338. this.dataBaseParams.search_have_more = page < Paging.Pages;
  339. this.dataBaseOptions = page === 1 ? List : [...this.dataBaseOptions,...List];
  340. });
  341. }
  342. },
  343. initGetData() {
  344. this.databasePageNo = 1;
  345. if(this.$refs.edb_detail_data){
  346. this.$refs.valueUl.scrollTop=0
  347. }
  348. this.getDatabaseList();
  349. },
  350. getDatabaseList(){
  351. dataBaseInterface.targetList({
  352. PageSize: 20,
  353. CurrentIndex: this.databasePageNo,
  354. EdbInfoId: this.search_dataBaseId,
  355. }).then(res => {
  356. if(res.Ret === 200) {
  357. if(res.Data) {
  358. this.databaseTableData = [res.Data.Item] || [];
  359. this.databaseHaveMore = this.databasePageNo < res.Data.Paging.Pages ? true : false;
  360. this.databaseList = this.databasePageNo === 1 ? (res.Data.Item.DataList || []) : this.databaseList.concat(res.Data.Item.DataList);
  361. }else {
  362. this.databaseTableData = [];
  363. this.databaseList = [];
  364. }
  365. }
  366. })
  367. },
  368. databaseScrollHandle:_.throttle(function() {
  369. let scrollTop = this.$refs.valueUl.scrollTop;
  370. let clientHeight = this.$refs.valueUl.clientHeight;
  371. let scrollHeight = this.$refs.valueUl.scrollHeight;
  372. if(scrollTop===0) return
  373. if(scrollTop + clientHeight >= scrollHeight-10 && this.databaseHaveMore){
  374. this.databasePageNo++
  375. this.getDatabaseList()
  376. }
  377. },200),
  378. async getChartDetail(ChartInfoId) {
  379. const res = await dataBaseInterface.getChartInfoById({ChartInfoId})
  380. if (res.Ret !== 200) return;
  381. this.chartInfo = res.Data.ChartInfo || {}
  382. this.edbData = res.Data.EdbInfoList|| []
  383. const chartTypeMap = {
  384. 7: this.initBarData, //柱形图
  385. 10: this.initSectionScatterData //截面散点
  386. }
  387. chartTypeMap[this.chartInfo.ChartType] && chartTypeMap[this.chartInfo.ChartType](res.Data);
  388. },
  389. editLinkName(item){
  390. this.editingLabel = item.Name
  391. item.editing=true
  392. this.$nextTick(() => {
  393. this.$refs.labelEditInput[0].focus();
  394. });
  395. },
  396. linkClick(item){
  397. if(this.activeItemRId == item.RId) return
  398. this.activeItemRId = item.RId
  399. if(item.Type==3){
  400. this.$message.info('研报类型的暂无回显')
  401. }else if(item.Type==1){
  402. this.addLinkSearchParams.linkType=item.Type
  403. this.changeLinkType()
  404. this.initGetData()
  405. }else if(item.Type==2){
  406. this.addLinkSearchParams.linkType=item.Type
  407. this.changeLinkType()
  408. this.getChartDetail(item.Id)
  409. }
  410. },
  411. linkDelete(item,index){
  412. if(this.activeItemRId == item.RId){
  413. this.activeItemRId=""
  414. this.changeLinkType()
  415. }
  416. if(item.Type==3){
  417. let deleteId=this.selections.filter(it=> it.Id==item.Id)
  418. if(deleteId[0]){
  419. this.$refs.reportTable && this.$refs.reportTable.toggleRowSelection(deleteId[0],false)
  420. }
  421. }
  422. this.checkedLinkList.splice(index,1)
  423. },
  424. editLinkNameFinish(item){
  425. if (this.editingLabel) {
  426. item.editing=false
  427. item.Name = this.editingLabel
  428. } else {
  429. this.$message.warning('不能为空');
  430. }
  431. },
  432. searchReport(){
  433. this.reportParams.CurrentIndex=1
  434. if(!this.reportKeyWord){
  435. this.reportList=[]
  436. this.reportTotal=0
  437. }else{
  438. this.getReportList()
  439. }
  440. },
  441. getReportList(){
  442. let params={
  443. CurrentIndex: this.reportParams.CurrentIndex,
  444. PageSize: this.reportParams.PageSize,
  445. KeyWord:this.reportKeyWord,
  446. State:2
  447. }
  448. reportlist(params).then((res) => {
  449. if (res.Ret === 200) {
  450. this.reportList = res.Data.List || [];
  451. this.reportTotal = parseInt(res.Data.Paging.Totals);
  452. }
  453. });
  454. },
  455. pageChange(page_no){
  456. this.reportParams.CurrentIndex = page_no;
  457. this.getReportList();
  458. },
  459. reportSelect(selection){
  460. this.selections=selection
  461. let allIds = this.reportList.map(it => {
  462. return it.Id
  463. })
  464. let simpleSelections = selection.map(it => {
  465. return {Id:it.Id,Code:it.ReportCode,Name:it.Title}
  466. })
  467. let unselectIds=[]
  468. if(simpleSelections.length>0){
  469. allIds.map(id =>{
  470. if(simpleSelections.every(sele => id!=sele.Id )){
  471. unselectIds.push(id)
  472. }
  473. })
  474. }else{
  475. unselectIds=allIds
  476. }
  477. //没有就增加
  478. simpleSelections.map(item =>{
  479. let rId = this.addLinkSearchParams.linkType+'-'+item.Id
  480. if(this.checkedLinkList.every(sele => rId!=sele.RId )){
  481. this.checkedLinkList.push({
  482. RId:rId,
  483. Id:item.Id,
  484. Name:item.Name,
  485. Type:this.addLinkSearchParams.linkType,
  486. editing:false,
  487. detailParams:{id:item.Id,code:item.Code}
  488. })
  489. }
  490. })
  491. //有就去掉
  492. unselectIds.map(item =>{
  493. let rId = this.addLinkSearchParams.linkType+'-'+item
  494. let index = this.checkedLinkList.findIndex(link => rId==link.RId)
  495. if(index!=-1){
  496. this.checkedLinkList.splice(index,1)
  497. }
  498. })
  499. },
  500. saveLink(){
  501. this.$emit("saveLink", this.checkedLinkList);
  502. },
  503. cancelHandle(){
  504. this.$emit("update:show", false);
  505. }
  506. },
  507. }
  508. </script>
  509. <style lang="scss" scoped>
  510. .add-link-box{
  511. padding: 15px 40px 35px;
  512. .link-box-option{
  513. display: flex;
  514. align-items: center;
  515. justify-content: space-between;
  516. margin-bottom: 30px;
  517. }
  518. .link-box-content{
  519. margin-bottom: 30px;
  520. .link-content-dataIndex{
  521. display: flex;
  522. flex-direction: column;
  523. .value-ul {
  524. flex-grow: 1;
  525. overflow-y: auto;
  526. margin-top: 10px;
  527. height: 200px;
  528. border-bottom: 1px solid #EBEFF6;
  529. .value-item {
  530. /* width: 100%; */
  531. padding: 10px 0;
  532. border: 1px solid #dcdfe6;
  533. border-bottom: none;
  534. display: flex;
  535. justify-content: space-around;
  536. >span{
  537. padding:0 16px;
  538. box-sizing: border-box;
  539. }
  540. .value-label {
  541. position: relative;
  542. color: #666;
  543. .value-style{
  544. padding:5px;
  545. border-radius: 4px;
  546. &.predict-act {
  547. color: orange;
  548. }
  549. }
  550. &.date{
  551. &::after{
  552. content: '';
  553. position:absolute;
  554. right:0;
  555. top:-14px;
  556. height:calc(100% + 28px);
  557. width:1px;
  558. background-color: #dcdfe6;
  559. }
  560. }
  561. }
  562. .predict-act {
  563. color: orange;
  564. }
  565. .new-tag {
  566. width: 6px;
  567. height: 6px;
  568. display: inline-block;
  569. position: absolute;
  570. left: -12px;
  571. top: 50%;
  572. transform: translateY(-50%);
  573. border-radius: 50%;
  574. background: #f00;
  575. }
  576. }
  577. .nodata {
  578. text-align: center;
  579. padding: 40px 0;
  580. color: #999;
  581. }
  582. }
  583. .delete-button{
  584. color: #AD352F;
  585. font-size: 14px;
  586. cursor: pointer;
  587. }
  588. }
  589. .link-content-chartIndex{
  590. .chart-name{
  591. font-size: 16px;
  592. text-align: center;
  593. color: #333333;
  594. }
  595. }
  596. }
  597. .link-box-tags{
  598. display: flex;
  599. align-items: center;
  600. overflow-x: auto;
  601. .link-box-tag{
  602. display: flex;
  603. align-items: center;
  604. padding: 0 8px;
  605. height: 30px;
  606. max-width: 250px;
  607. background-color: #F8F8F8;
  608. margin-right: 30px;
  609. cursor: pointer;
  610. &:last-child{
  611. margin-right: 0;
  612. }
  613. span{
  614. color: #666666;
  615. white-space: nowrap;
  616. overflow: hidden;
  617. text-overflow: ellipsis;
  618. }
  619. img{
  620. height: 16px;
  621. width: 16px;
  622. margin-left: 8px;
  623. }
  624. }
  625. }
  626. .link-box-buttons{
  627. margin-top: 60px;
  628. display: flex;
  629. align-items: center;
  630. justify-content: center;
  631. }
  632. }
  633. </style>