index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. <template>
  2. <div class="user-content mobile-content">
  3. <div class="user-name">
  4. <img src="/images/component/default.png"/>
  5. <div class="user-info">
  6. <p v-text="userInfo.data.userName"></p>
  7. <p>{{enterpriseInfo.enName}}<a @click="setShowEnterpriseToggle(!showEnterpriseToggle, $event)">切换</a></p>
  8. <ul class="en-list" v-show="showEnterpriseToggle">
  9. <li class="menu-item"
  10. v-for="en in sortEnterprises"
  11. v-if="en.uu != enterpriseInfo.uu">
  12. <a @click="switchEnterprise(en)">{{ en.enName }}</a>
  13. </li>
  14. <li class="menu-item" v-if="enterpriseInfo.uu">
  15. <a @click="switchEnterprise({uu: 0})"><span v-text="userInfo.data.userName"></span>(个人账户)</a>
  16. </li>
  17. </ul>
  18. </div>
  19. <a v-if="isVendor" v-text="userType === 'saler' ? '切换至买家中心' : '切换至卖家中心'" @click="switchType"></a>
  20. </div>
  21. <ul class="switch-list" v-if="userType !== 'saler'">
  22. <li :class="{active: activeType == 'seek'}" @click="activeType = 'seek'" v-text="userType === 'saler' ? '求购询价' : '我的求购'"></li>
  23. <li :class="{active: activeType == 'comp'}" @click="activeType = 'comp'">器件收藏</li>
  24. <li :class="{active: activeType == 'store'}" @click="activeType = 'store'">店铺关注</li>
  25. </ul>
  26. <div v-if="activeType == 'seek'">
  27. <div class="seek" v-if="userType !== 'saler'">
  28. <ul class="seek-type">
  29. <li :class="{active: seekType == 'wait'}" @click="switchSeek('wait')"><div>待报价</div></li>
  30. <li :class="{active: seekType == 'done'}" @click="switchSeek('done')"><div>已报价</div></li>
  31. <!--<li :class="{active: seekType == 'accept'}" @click="switchSeek('accept')"><div>已采纳</div></li>-->
  32. </ul>
  33. </div>
  34. <ul class="switch-list vendor-switch" v-if="userType === 'saler'">
  35. <li :class="{active: seekType == 'wait'}" @click="switchSeek('wait')"><div>全部</div></li>
  36. <li :class="{active: seekType == 'done'}" @click="switchSeek('done')"><div>已报价</div></li>
  37. </ul>
  38. <div class="search-content">
  39. <input type="text" placeholder="请输入您要查找的型号或品牌" v-model="seekKeyword" @keyup.13="searchSeek">
  40. <span @click="searchSeek">
  41. <i class="iconfont icon-sousuo"></i>
  42. </span>
  43. </div>
  44. <seek-list :userType="userType" :seekType="seekType" :purchaseManList="purchaseManListData" :isDataChange="isDataChange"></seek-list>
  45. </div>
  46. <div class="shop-list" v-if="activeType == 'store'" v-for="item in focusPage.content" @click="goStoreDetail(item.storeInfo.uuid)">
  47. <h3>{{item.storeName}}</h3>
  48. <div class="list-item">
  49. <div class="item-img">
  50. <img :src="getBackground(item.storeInfo.type)" />
  51. <img :src="item.storeInfo.logoUrl || '/images/component/default.png'">
  52. </div>
  53. <div class="list-item-phone">
  54. <p>电话:<span>{{item.storeInfo.enterprise ? item.storeInfo.enterprise.enTel : '-'}}</span></p>
  55. <p>传真:<span>{{item.storeInfo.enterprise ? item.storeInfo.enterprise.enFax : '-'}}</span></p>
  56. <p>联系商家:<a @click="selectStoreInfo(item, $event)">点击查看</a></p>
  57. <i class="iconfont icon-shoucang" @click="cancelFocus('store', item, $event)"></i>
  58. </div>
  59. </div>
  60. </div>
  61. <div class="detail-brand" v-for="(item, index) in collectSave.content" v-if="activeType == 'comp'" @click="goComponentDetail(item.componentinfo.uuid)">
  62. <a>
  63. <div class="brand-item">
  64. <p>型号:<span>{{item.componentinfo.code}}</span></p>
  65. <p>品牌:<span>{{item.componentinfo.brand.nameCn}}</span></p>
  66. <p>产品描述:<span>{{item.componentinfo.kind.nameCn}}</span></p>
  67. <i class="iconfont icon-shoucang" @click="cancelFocus('product', item, $event)"></i>
  68. </div>
  69. </a>
  70. </div>
  71. <div class="none-state" v-if="(activeType != 'seek') && ((collectSave.totalElements == 0 && activeType == 'comp') || (focusPage.totalElements == 0 && activeType == 'store') || (collectSave.totalElements == 0 && focusPage.totalElements == 0))">
  72. <img src="/images/mobile/@2x/empty-collect.png">
  73. <p v-text="getRemindText()"></p>
  74. <nuxt-link to="/">返回首页</nuxt-link>
  75. </div>
  76. <remind-box :title="collectResult" :timeoutCount="timeoutCount"></remind-box>
  77. <div class="mobile-modal" v-if="showStoreInfo">
  78. <div class="mobile-modal-box">
  79. <div class="mobile-modal-header">联系方式<i @click="showStoreInfo = false" class="icon-guanbi iconfont"></i></div>
  80. <div class="mobile-modal-content">
  81. <div v-if="checkInfo(storeInfo.enAddress || storeInfo.address)">商家地址:{{storeInfo.enAddress || storeInfo.address}}</div>
  82. <!--<div class="content-line link-url">在线咨询</div>-->
  83. <div v-if="checkInfo(storeInfo.enTel)">致电:<a :href="'tel:' + storeInfo.enTel" target="_blank" class="content-line link-url">{{storeInfo.enTel}}</a></div>
  84. <div v-if="checkInfo(storeInfo.enEmail)">邮件:<a :href="'mailto:' + storeInfo.enEmail" target="_blank" class="content-line link-url">{{storeInfo.enEmail}}</a></div>
  85. </div>
  86. </div>
  87. </div>
  88. <page-loading v-show="showLoading"></page-loading>
  89. <loading v-show="isSearchSearchingMore"></loading>
  90. <div v-if="purchaseManList && false"></div>
  91. <div v-if="purchaseManListFetching && false"></div>
  92. </div>
  93. </template>
  94. <script>
  95. import SeekList from '~components/mobile/applyPurchase/SeekList.vue'
  96. import {RemindBox, Loading} from '~components/mobile/common'
  97. import PageLoading from '~components/common/loading/PageLoading.vue'
  98. export default {
  99. layout: 'mobile',
  100. data () {
  101. return {
  102. userName: '',
  103. count: '',
  104. page: '',
  105. type: '',
  106. activeType: 'seek',
  107. collectResult: '取消成功',
  108. timeoutCount: 0,
  109. showStoreInfo: false,
  110. storeInfo: {},
  111. seekType: 'wait',
  112. showLoading: false,
  113. seekKeyword: '',
  114. isSearchSearchingMore: false,
  115. isChange: false,
  116. seekPage: 1,
  117. seekSize: 10,
  118. purchaseManListData: [],
  119. isDataChange: false,
  120. showEnterpriseToggle: false
  121. }
  122. },
  123. components: {
  124. RemindBox,
  125. SeekList,
  126. PageLoading,
  127. Loading
  128. },
  129. fetch ({ store, route }) {
  130. let user = store.state.option.user.data
  131. let params = {
  132. pageNumber: 1,
  133. pageSize: 10,
  134. state: (!route.query.type || route.query.type === 'buyer') ? 'todo' : null
  135. }
  136. if (user.enterprise.uu) {
  137. params.enUU = user.enterprise.uu
  138. } else {
  139. params.userUU = user.userUU
  140. }
  141. // console.log(params)
  142. return Promise.all([
  143. store.dispatch('product/saveStores', { count: 100, page: 1, type: 'component' }),
  144. store.dispatch('shop/StoreFocusPage', { count: 100, page: 1 }),
  145. store.dispatch(route.query.type === 'saler' ? 'applyPurchase/loadPurchaseManList' : 'applyPurchase/loadBuyerUnSayPricePurchaseManList', params)
  146. ])
  147. },
  148. mounted: function () {
  149. this.$nextTick(() => {
  150. window.addEventListener('scroll', this.scroll, false)
  151. document.body.addEventListener('click', () => {
  152. this.setShowEnterpriseToggle(false)
  153. }, false)
  154. })
  155. },
  156. methods: {
  157. // 切换当前企业
  158. switchEnterprise (en) {
  159. this.showEnterpriseToggle = false
  160. this.$http.get(`/user/authentication/${en.uu}`).then(() => {
  161. this.isChange = true
  162. this.$store.dispatch('loadUserInfo').then(() => {
  163. if (this.userType === 'saler') {
  164. this.$router.push('/mobile/user?type=buyer')
  165. } else {
  166. this.reloadData()
  167. }
  168. })
  169. })
  170. },
  171. setShowEnterpriseToggle (flag, e) {
  172. if (e) {
  173. e.stopPropagation()
  174. }
  175. this.showEnterpriseToggle = flag
  176. },
  177. cancelFocus: function (type, item, event) {
  178. event.stopPropagation()
  179. if (type === 'store') {
  180. this.$http.post('/trade/storeFocus/delete/storeId', [item.storeid])
  181. .then(response => {
  182. this.$store.dispatch('shop/StoreFocusPage', { count: 100, page: 1 })
  183. this.timeoutCount++
  184. })
  185. } else {
  186. // /trade/collection/
  187. this.$http.delete('/trade/collection/' + item.id)
  188. .then(response => {
  189. this.$store.dispatch('product/saveStores', { count: 100, page: 1, type: 'component' })
  190. this.timeoutCount++
  191. })
  192. }
  193. },
  194. getBackground: function (type) {
  195. let url = ''
  196. if (type === 'AGENCY') {
  197. url += '/images/mobile/@2x/shop/agency.png'
  198. } else if (type === 'DISTRIBUTION') {
  199. url += '/images/mobile/@2x/shop/distribution.png'
  200. } else if (type === 'ORIGINAL_FACTORY') {
  201. url += '/images/mobile/@2x/shop/original_factory.png'
  202. } else if (type === 'CONSIGNMENT') {
  203. url = '/images/mobile/@2x/shop/consignment.png'
  204. }
  205. return url
  206. },
  207. goStoreDetail: function (uuid) {
  208. this.$router.push('/mobile/shop/' + uuid)
  209. },
  210. goComponentDetail: function (uuid) {
  211. this.$router.push('/mobile/brand/componentDetail/' + uuid)
  212. },
  213. getRemindText: function () {
  214. if (this.activeType === 'comp') {
  215. return '抱歉,暂无器件收藏'
  216. } else if (this.activeType === 'store') {
  217. return '抱歉,暂无店铺关注'
  218. }
  219. },
  220. selectStoreInfo: function (store, event) {
  221. event.stopPropagation()
  222. this.storeInfo = store.storeInfo.enterprise || {}
  223. this.showStoreInfo = true
  224. },
  225. checkInfo: function (str) {
  226. return str && str.trim() !== ''
  227. },
  228. switchSeek: function (type) {
  229. this.seekType = type
  230. this.showLoading = true
  231. this.seekKeyword = ''
  232. this.isChange = true
  233. this.seekPage = 1
  234. this.reloadData()
  235. },
  236. switchType: function () {
  237. this.activeType = 'seek'
  238. this.seekType = 'wait'
  239. this.seekKeyword = ''
  240. this.$router.push('/mobile/user' + (this.userType === 'saler' ? '?type=buyer' : '?type=saler'))
  241. },
  242. searchSeek: function () {
  243. this.isChange = true
  244. this.reloadData()
  245. },
  246. reloadData: function () {
  247. let type = this.seekType
  248. let user = this.$store.state.option.user.data
  249. let params = {
  250. pageNumber: 1,
  251. pageSize: 10,
  252. keyword: this.seekKeyword || null
  253. }
  254. if (user.enterprise.uu) {
  255. params.enUU = user.enterprise.uu
  256. } else {
  257. params.userUU = user.userUU
  258. }
  259. if (this.userType !== 'saler') {
  260. if (type === 'wait') {
  261. params.state = 'todo'
  262. this.$store.dispatch('applyPurchase/loadBuyerUnSayPricePurchaseManList', params)
  263. } else if (type === 'done') {
  264. params._state = 'done'
  265. this.$store.dispatch('applyPurchase/loadBuyerPurchaseManList', params)
  266. } else {
  267. params._state = 'done'
  268. this.$store.dispatch('applyPurchase/loadBuyerPurchaseManList', params)
  269. }
  270. } else {
  271. if (type === 'wait') {
  272. this.$store.dispatch('applyPurchase/loadPurchaseManList', {pageNumber: this.seekPage, pageSize: this.seekSize, enUU: this.$store.state.option.user.data.enterprise.uu, keyword: this.seekKeyword})
  273. } else if (type === 'done') {
  274. this.$store.dispatch('applyPurchase/loadVendorPurchaseManList', {pageNumber: this.seekPage, pageSize: this.seekSize, _state: 'done', filter: {vendUU: this.$store.state.option.user.data.enterprise.uu, fromDate: null, endDate: null, keyword: this.seekKeyword}})
  275. } else {
  276. this.$store.dispatch('applyPurchase/loadVendorPurchaseManList', {pageNumber: this.seekPage, pageSize: this.seekSize, _state: 'done', filter: {vendUU: this.$store.state.option.user.data.enterprise.uu, fromDate: null, endDate: null, keyword: this.seekKeyword}})
  277. }
  278. }
  279. },
  280. scroll: function () {
  281. let scrolled = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop
  282. if (Math.ceil(scrolled + window.screen.availHeight) >= document.body.scrollHeight && !this.isSearchSearchingMore && this.seekPage < this.allPage) {
  283. this.getMoreSearch()
  284. }
  285. },
  286. getMoreSearch: function () {
  287. this.seekPage++
  288. this.isSearchSearchingMore = true
  289. this.reloadData()
  290. }
  291. },
  292. computed: {
  293. collectSave () {
  294. return this.$store.state.product.common.collectList.data
  295. },
  296. userInfo () {
  297. return this.$store.state.option.user
  298. },
  299. enterpriseInfo () {
  300. let ens = this.userInfo.data.enterprises
  301. if (ens && ens.length) {
  302. for (let i = 0; i < ens.length; i++) {
  303. if (ens[i].current) {
  304. return ens[i]
  305. }
  306. }
  307. }
  308. return {enName: this.userInfo.data.userName + '(个人账户)'}
  309. },
  310. sortEnterprises () {
  311. let ens = this.userInfo.data.enterprises
  312. if (ens && ens.length) {
  313. ens.sort(function (a, b) {
  314. return b.lastLoginTime - a.lastLoginTime
  315. })
  316. }
  317. return ens
  318. },
  319. isVendor () {
  320. return this.enterpriseInfo.isVendor === 313
  321. },
  322. userType () {
  323. return this.$route.query.type
  324. },
  325. focusPage () {
  326. return this.$store.state.shop.storeInfo.focusPage.data
  327. },
  328. purchase () {
  329. return this.$store.state.applyPurchase.purchaseManList.purchaseManList
  330. },
  331. purchaseManList () {
  332. let list = this.purchase.data.content
  333. if (this.isChange) {
  334. this.purchaseManListData = []
  335. this.seekPage = 1
  336. this.isChange = false
  337. this.isDataChange = true
  338. } else {
  339. this.purchaseManListData = this.purchaseManListData.concat(list)
  340. this.isSearchSearchingMore = false
  341. this.isDataChange = false
  342. }
  343. // console.log(this.purchaseManListData)
  344. return this.purchase.data.content
  345. },
  346. allPage () {
  347. return Math.floor(this.purchase.data.totalElements / this.purchase.data.size) + Math.floor(this.purchase.data.totalElements % this.purchase.data.size > 0 ? 1 : 0)
  348. },
  349. purchaseManListFetching () {
  350. this.showLoading = false
  351. return this.purchase.fetching
  352. }
  353. }
  354. }
  355. </script>
  356. <style scoped lang="scss">
  357. .user-content{
  358. margin-bottom: .98rem;
  359. .none-state{
  360. text-align: center;
  361. padding:1.5rem 0;
  362. background: #fff;
  363. margin-top:.1rem;
  364. width:100%;
  365. img{
  366. margin:0 auto;
  367. width: 4.08rem;
  368. height: 2.62rem;
  369. }
  370. p {
  371. font-size: .32rem;
  372. color: #999;
  373. margin: 1.19rem 0 0 0;
  374. }
  375. a {
  376. display: block;
  377. font-size: .28rem;
  378. color: #fff;
  379. width: 1.88rem;
  380. height: .54rem;
  381. line-height: .54rem;
  382. background: #418bf6;
  383. margin: .7rem auto 0;
  384. border-radius: .05rem;
  385. }
  386. }
  387. .user-name{
  388. height: 1.8rem;
  389. padding: .28rem 0 .28rem .34rem;
  390. background: #fff;
  391. width: 100%;
  392. position: relative;
  393. img{
  394. display: inline-block;
  395. width: 1.25rem;
  396. height: 1.25rem;
  397. border: 1px solid #c5dbfc;
  398. border-radius: .05rem;
  399. vertical-align: middle;
  400. }
  401. .user-info {
  402. margin-left:.25rem;
  403. display: inline-block;
  404. vertical-align: middle;
  405. position: relative;
  406. p{
  407. font-size:.3rem;
  408. margin:0;
  409. display: block;
  410. overflow: hidden;
  411. text-overflow: ellipsis;
  412. white-space: nowrap;
  413. max-width: 3.92rem;
  414. &:nth-child(2) {
  415. position: relative;
  416. margin-top: .2rem;
  417. padding-right: .7rem;
  418. a {
  419. position: absolute;
  420. right: 0;
  421. }
  422. }
  423. }
  424. .en-list {
  425. position: absolute;
  426. max-width: 8rem;
  427. max-height: 3rem;
  428. overflow-y: auto;
  429. border-radius: .05rem;
  430. .menu-item {
  431. height: .6rem;
  432. line-height: .6rem;
  433. font-size: .3rem;
  434. padding: 0 .2rem;
  435. overflow: hidden;
  436. white-space: nowrap;
  437. text-overflow: ellipsis;
  438. background: rgba(0, 0, 0, .4);
  439. &:active, &:focus, &:hover {
  440. background: #7d7d7d;
  441. }
  442. a {
  443. color: #fff;
  444. }
  445. }
  446. }
  447. }
  448. > a {
  449. font-size: .24rem;
  450. position: absolute;
  451. top: .45rem;
  452. right: .1rem;
  453. color: #3f84f6;
  454. border: 1px solid #3f84f6;
  455. border-radius: .2rem;
  456. padding: .06rem .12rem;
  457. }
  458. }
  459. .shop-list {
  460. background:#fff;
  461. border-bottom: .1rem solid #dfe2e4;
  462. padding: .14rem 0 .14rem 0;
  463. h3{
  464. font-size: .32rem;
  465. line-height: .4rem;
  466. margin: 0 0 0 .27rem;
  467. overflow: hidden;
  468. text-overflow: ellipsis;
  469. white-space: nowrap;
  470. padding-top: .1rem;
  471. position: relative;
  472. top: .1rem;
  473. }
  474. .list-item{
  475. width:6.77rem;
  476. margin-left:.39rem;
  477. .item-img{
  478. width:2.4rem;
  479. vertical-align: middle;
  480. display: inline-block;
  481. img{
  482. &:nth-child(2) {
  483. width:2.4rem;
  484. height:1.69rem;
  485. border: 1px solid #eee;
  486. }
  487. &:nth-child(1) {
  488. position:absolute;
  489. width:.65rem;
  490. height:.33rem;
  491. }
  492. }
  493. }
  494. .list-item-phone{
  495. width:3.95rem;
  496. padding:.18rem 0;
  497. position:relative;
  498. display: inline-block;
  499. vertical-align: middle;
  500. margin-left: .26rem;
  501. p{
  502. font-size:.28rem;
  503. line-height: .67rem;
  504. margin:0;
  505. overflow: hidden;
  506. text-overflow: ellipsis;
  507. white-space: nowrap;
  508. width: 3.2rem;
  509. }
  510. i{
  511. display:block;
  512. position:absolute;
  513. top: -.06rem;
  514. right: -.18rem;
  515. font-size:.5rem;
  516. color:#ff7800;
  517. width: .6rem;
  518. height: .6rem;
  519. text-align: center;
  520. line-height: .6rem;
  521. }
  522. }
  523. }
  524. &:active {
  525. background: #e1e1e1;
  526. }
  527. }
  528. .detail-brand{
  529. background: #fff;
  530. width:100%;
  531. min-height:1.5rem;
  532. padding:.2rem 0;
  533. border-bottom: .1rem solid #dfe2e4;
  534. &:nth-child(1) {
  535. margin-top:.1rem;
  536. }
  537. .brand-item{
  538. width:7rem;
  539. margin:0 auto;
  540. border-radius:.1rem;
  541. background: #fff;
  542. padding:.2rem;
  543. position:relative;
  544. &:active{
  545. background: #e1e1e1;
  546. }
  547. p{
  548. font-size:.28rem;
  549. line-height:.4rem;
  550. color:#333;
  551. margin:0;
  552. }
  553. i{
  554. display:block;
  555. position:absolute;
  556. top:.2rem;
  557. right:.1rem;
  558. font-size:.5rem;
  559. color:#ff7800;
  560. width: .6rem;
  561. height: .6rem;
  562. line-height: .6rem;
  563. text-align: center;
  564. }
  565. }
  566. div.active{
  567. background: #d4d;
  568. }
  569. }
  570. .collect-list-type {
  571. background: #fff;
  572. border-bottom: 1px solid #acacac;
  573. p {
  574. font-size: .32rem;
  575. margin: 0 0 0 .13rem;
  576. width: .92rem;
  577. text-align: center;
  578. line-height: .5rem;
  579. border-bottom: .06rem solid #418bf6;
  580. }
  581. }
  582. ul.switch-list {
  583. li {
  584. display: inline-block;
  585. width: 2.5rem;
  586. height: .63rem;
  587. line-height: .63rem;
  588. text-align: center;
  589. font-size: .28rem;
  590. color: #666;
  591. background: #fff;
  592. border: 1px solid #b4b4b4;
  593. border-right: none;
  594. &.active {
  595. background: #0067e7;
  596. border: 1px solid #0067e7;
  597. color: #fff;
  598. }
  599. &:first-child {
  600. border-left: none;
  601. }
  602. &:last-child {
  603. border-right: none;
  604. }
  605. }
  606. &.vendor-switch {
  607. li {
  608. width: 50%;
  609. }
  610. }
  611. }
  612. .seek {
  613. .seek-type {
  614. margin-top: .15rem;
  615. li {
  616. font-size: .28rem;
  617. color: #666;
  618. display: inline-block;
  619. width: 50%;
  620. text-align: center;
  621. div {
  622. border-bottom: 1px solid #c1c4c9;
  623. margin: 0 auto;
  624. height: .46rem;
  625. line-height: .46rem;
  626. }
  627. &.active {
  628. color: #3f84f6;
  629. div {
  630. border-color: #3f84f6;
  631. }
  632. }
  633. }
  634. }
  635. }
  636. .search-content {
  637. text-align: center;
  638. padding: .25rem 0 0 0;
  639. input {
  640. border: 1px solid #376ff3;
  641. }
  642. span {
  643. height: .46rem;
  644. line-height: .46rem;
  645. }
  646. }
  647. }
  648. </style>