CommonUse.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721
  1. <template>
  2. <WorkspaceCard class="work-common" title="常用功能">
  3. <span slot="header-right" class="header-right-set" @click="setCommonFun"><i class="icon-set-img"></i> 设置</span>
  4. <div class="common-lists">
  5. <div class="list-item" v-for="item in commonList" :key="item.id" @click="openLink(item)">
  6. <div class="icon-box-container" v-if="item.icon && item.icon.indexOf('icon-') === 0">
  7. <JyIcon :name="item.icon" classPrefix=""></JyIcon>
  8. </div>
  9. <div v-else class="icon-box-container">
  10. <el-image :src="item.icon" alt="常用功能">
  11. <img slot="error" src="https://www.jianyu360.cn/common-module/public/image/auto.png" />
  12. </el-image>
  13. </div>
  14. <span v-html="item.name.replace('/', '/<br>')" class="item-name"></span>
  15. </div>
  16. <div v-if="commonList && commonList.length < maxCount" class="list-add" @click="setCommonFun">
  17. <span class="icon-add-img"></span>
  18. <span class="add-text">添加常用功能</span>
  19. </div>
  20. </div>
  21. <!-- 设置常用功能dialog -->
  22. <el-dialog
  23. custom-class="fn-dialog"
  24. :visible.sync="dialogShow"
  25. :close-on-click-modal="false"
  26. :show-close="false"
  27. v-if="dialogShow"
  28. center
  29. width="696px">
  30. <SelectorCard @onCancel="changeDialogState(false)" @onConfirm="confirmSaveFn" confirmText="确定">
  31. <div slot="header">常用功能设置</div>
  32. <div class="transfer-content">
  33. <Transfer :maxCount="maxCount" submitKey="id" :left="allFunctions" :right="transferCommonList" @onSave="onTransferSave"></Transfer>
  34. </div>
  35. </SelectorCard>
  36. </el-dialog>
  37. <!-- 改为抽屉式 -->
  38. <DrawerCard customClass="drawer-class" title="常用功能设置" percent="600px" :with-header="false" v-model="drawerShow" @close="onCloseDrawer" @saveData="onSaveDrawer">
  39. <div class="function-drawer-content" ref="drawerScroll" @scroll="handleScroll($event)">
  40. <div class="added-function">
  41. <h3 class="added-title">已添加({{addedList.length}})</h3>
  42. <transition-group class="added-container" name="drag" tag="ul" v-if="addedList && addedList.length > 0">
  43. <li class="added-item" draggable v-for="(item, i) in addedList" :key="item.id" @dragover.prevent @dragstart="onDragstart($event, i)" @dragenter="onDragenter($event, i)" @dragend="onDragend($event, i)">
  44. <div class="icon-box-container">
  45. <el-image :src="item.icon" :alt="item.name">
  46. <img slot="error" src="https://www.jianyu360.cn/common-module/public/image/auto.png" />
  47. </el-image>
  48. </div>
  49. <span v-html="item.name.replace('/', '/<br>')" class="item-name"></span>
  50. <span class="remove-tag" @click.stop="onAddedRemove(item)">-</span>
  51. </li>
  52. </transition-group>
  53. <div v-else class="no-added">暂未设置常用功能</div>
  54. </div>
  55. <div class="classify-function" ref="refContent">
  56. <div class="classify-tab" :class="{'tab-fixed': tabFixed}" ref="tabBox">
  57. <span class="tab-item" :class="{'active': tabActive === index}" v-for="(item, index) in tabNames" :key="item.id" @click="goAnchor(item, index)">{{item.name}}</span>
  58. </div>
  59. <div class="classify-content">
  60. <ul class="outer-container">
  61. <li class="outer-item" :id="level.name" v-for="level in mainFunList" :key="level.id">
  62. <h3 class="outer-item-name">{{ level.name }}</h3>
  63. <ul class="insert-container">
  64. <li class="insert-item" v-for="next in level.children" :key="next.id">
  65. <div class="insert-item-left">
  66. <el-image :src="next.icon" :alt="next.name">
  67. <img slot="error" src="https://www.jianyu360.cn/common-module/public/image/auto.png" />
  68. </el-image>
  69. <span v-html="next.name.replace('<br>', '')"></span>
  70. </div>
  71. <transition name="el-zoom-in-center">
  72. <span v-if="next.status" class="handle-btn remove-btn" @click.stop="onRemoveFun(next)">移除</span>
  73. <span v-else class="handle-btn add-btn" @click.stop="onAddFun(next)">添加</span>
  74. </transition>
  75. </li>
  76. </ul>
  77. </li>
  78. </ul>
  79. </div>
  80. </div>
  81. </div>
  82. </DrawerCard>
  83. </WorkspaceCard>
  84. </template>
  85. <script>
  86. import { JyIcon } from '@jianyu/icon'
  87. import { mapState, mapMutations, mapActions } from 'vuex'
  88. import { Dialog, Image } from 'element-ui'
  89. import WorkspaceCard from '../ui/WorkspaceCard'
  90. import SelectorCard from '@/components/selector/SelectorCard'
  91. import Transfer from '@/components/work-desktop/Transfer'
  92. import { mixinNoPowerMessageTip } from '@/utils/mixins/no-power-message-box'
  93. import { tryCallHooks } from '@jianyu/easy-inject-qiankun'
  94. import { debounce } from '@/utils/globalFunctions'
  95. import DrawerCard from '@/components/drawer/Drawer.vue'
  96. export default {
  97. name: 'CommonUse',
  98. mixins: [mixinNoPowerMessageTip],
  99. components: {
  100. [Dialog.name]: Dialog,
  101. [Image.name]: Image,
  102. WorkspaceCard,
  103. SelectorCard,
  104. JyIcon,
  105. Transfer,
  106. DrawerCard
  107. },
  108. data () {
  109. return {
  110. addedList: [],
  111. mainFunList: [],
  112. dragIndex: '',
  113. enterIndex: '',
  114. tabActive: 0,
  115. tabFixed: false,
  116. isScrollAnchor: true
  117. }
  118. },
  119. computed: {
  120. ...mapState({
  121. maxCount: state => state.workspace.commonUse.maxCount,
  122. dialogShow: state => state.workspace.commonUse.dialogShow,
  123. allFunctions: state => state.workspace.commonUse.allFunctions, // 所有功能
  124. transferCommonList: state => state.workspace.commonUse.transferCommonList,
  125. commonList: state => state.workspace.commonUse.commonList, // 常用功能
  126. mainFunctions: state => state.workspace.commonUse.mainFunctions,
  127. drawerShow: state => state.workspace.commonUse.drawerShow
  128. }),
  129. tabNames () {
  130. return this.mainFunctions.filter(item => item.level === 1)
  131. }
  132. },
  133. watch: {
  134. commonList (val) {
  135. if (val) {
  136. this.addedList = JSON.parse(JSON.stringify(val))
  137. this.formatMainFunList(this.addedList)
  138. }
  139. },
  140. mainFunctions (val) {
  141. if (val) {
  142. this.mainFunList = JSON.parse(JSON.stringify(val))
  143. this.formatMainFunList(this.addedList)
  144. }
  145. },
  146. drawerShow (val) {
  147. if (!val) {
  148. this.tabFixed = false
  149. this.tabActive = 0
  150. }
  151. }
  152. },
  153. async created () {
  154. await this.getCanUseFunctions()
  155. await this.getAllFunctions({ vm: this })
  156. },
  157. beforeDestroy () {
  158. window.removeEventListener('scroll', this.handleScroll)
  159. },
  160. methods: {
  161. ...mapMutations('workspace/commonUse', [
  162. 'changeDialogState',
  163. 'transferSave',
  164. 'changeDrawerState'
  165. ]),
  166. ...mapActions('workspace/commonUse', [
  167. 'getAllFunctions',
  168. 'getCanUseFunctions',
  169. 'confirmSave'
  170. ]),
  171. // 穿梭框子组件传来的组件
  172. onTransferSave (data) {
  173. this.transferSave(data)
  174. },
  175. openLink (item) {
  176. const { url } = item
  177. if (item.usable) {
  178. tryCallHooks({
  179. fn: () => {
  180. this.$BRACE.methods.open({
  181. route: {
  182. ...item,
  183. link: url
  184. }
  185. })
  186. },
  187. spareFn: () => {
  188. window.open(url)
  189. }
  190. })
  191. } else {
  192. // 判断是否需要自定义弹窗文案
  193. const hasTipInfo = Object.keys(item?.tipInfo || {}).length > 0
  194. if (hasTipInfo) {
  195. // 自定义弹窗文案
  196. const menu = item
  197. // 格式化弹窗配置信息
  198. const dialogParams = {
  199. type: 'tip',
  200. title: menu.tipInfo?.title,
  201. message: menu.tipInfo?.content,
  202. options: Object.assign({
  203. dangerouslyUseHTMLString: true,
  204. customClass: 'custom-message-box',
  205. confirmButtonText: '我知道了',
  206. confirmButtonClass: 'custom-confirm-btn',
  207. showClose: false,
  208. showCancelButton: false,
  209. closeOnClickModal: false,
  210. center: true
  211. }, {
  212. showCancelButton: !!menu.tipInfo?.isShowCancel,
  213. confirmButtonText: menu.tipInfo?.confirmText
  214. }, menu.tipInfo?.options || {})
  215. }
  216. this.$confirm(dialogParams.message, dialogParams.title, dialogParams.options).then(() => {
  217. // 确认按钮自定义跳转
  218. if (menu.tipInfo?.confirmUrl) {
  219. // 调用工作桌面函数跳转
  220. tryCallHooks({
  221. fn: () => {
  222. this.$BRACE.methods.open({
  223. route: {
  224. link: menu.tipInfo?.confirmUrl,
  225. appType: menu.tipInfo?.appType,
  226. openType: menu.tipInfo?.openType
  227. }
  228. })
  229. },
  230. spareFn: () => {
  231. window.open(menu.tipInfo?.confirmUrl)
  232. }
  233. })
  234. }
  235. }).catch(e => e)
  236. } else {
  237. // 默认文案
  238. this.showNoPowerMessageTip()
  239. }
  240. }
  241. },
  242. confirmSaveFn () {
  243. try {
  244. this.confirmSave()
  245. } catch (error) {
  246. this.$toast(error)
  247. }
  248. },
  249. onDragstart (e, index) {
  250. this.dragIndex = index
  251. const element = e.target
  252. element.classList.add('drag-move-item')
  253. },
  254. onDragenter: debounce(function (e, index) {
  255. e.preventDefault()
  256. if (this.dragIndex !== index) {
  257. const source = this.addedList[this.dragIndex]
  258. this.addedList.splice(this.dragIndex, 1)
  259. this.addedList.splice(index, 0, source)
  260. this.dragIndex = index
  261. const ids = this.addedList.map(v => {
  262. return v.id
  263. })
  264. this.transferSave(ids)
  265. }
  266. }, 200),
  267. onDragend (e, index) {
  268. e.preventDefault()
  269. const element = e.srcElement
  270. element.classList.remove('drag-move-item')
  271. this.$forceUpdate()
  272. },
  273. formatMainFunList (addedList = []) {
  274. this.mainFunList.forEach(v => {
  275. v.children.forEach(t => {
  276. t.status = false
  277. addedList.forEach(s => {
  278. if (s.id === t.id || s.name === t.name) {
  279. t.status = true
  280. }
  281. })
  282. })
  283. })
  284. },
  285. onCloseDrawer () {
  286. // this.tabFixed = false
  287. // this.tabActive = 0
  288. this.formatMainFunList(this.commonList)
  289. this.changeDrawerState(false)
  290. },
  291. onSaveDrawer () {
  292. this.confirmSaveFn()
  293. },
  294. setCommonFun () {
  295. this.changeDrawerState(true)
  296. this.addedList = JSON.parse(JSON.stringify(this.commonList))
  297. this.formatMainFunList(this.addedList)
  298. },
  299. onRemoveFun (item) {
  300. item.status = false
  301. this.addedList.splice(this.addedList.findIndex(add => add.id === item.id || add.name === item.name), 1)
  302. this.updateMainFunStatus(item)
  303. },
  304. onAddFun (item) {
  305. item.status = true
  306. this.addedList.unshift(item)
  307. this.updateMainFunStatus(item)
  308. },
  309. onAddedRemove (item) {
  310. this.addedList.splice(this.addedList.findIndex(add => add.id === item.id), 1)
  311. this.mainFunList.forEach(v => {
  312. if (v.children) {
  313. v.children.forEach(s => {
  314. if (item.id === s.id || item.name === s.name) {
  315. s.status = false
  316. this.$forceUpdate()
  317. }
  318. })
  319. }
  320. })
  321. const ids = this.addedList.map(v => {
  322. return v.id
  323. })
  324. this.transferSave(ids)
  325. },
  326. goAnchor (item, index) {
  327. this.isScrollAnchor = false
  328. const dom = this.$root.$el.querySelector('#' + item.name)
  329. const offsetTop = this.getOffsetTop(dom)
  330. // qiankun 子应用选择器获取不到document 改为this.$root.$el
  331. const scrollDom = this.$root.$el.querySelector('.function-drawer-content')
  332. // const addTop = this.$root.$el.querySelector('.added-function').offsetHeight
  333. const scrollTop = offsetTop - 70 - 48
  334. scrollDom.scrollTo({
  335. /**
  336. * 抽屉header高度70px, tabs导航栏高度48px, 滚动子元素h3标题高度60px
  337. */
  338. top: scrollTop,
  339. behavior: 'smooth'
  340. })
  341. this.tabActive = index
  342. setTimeout(() => {
  343. this.isScrollAnchor = true
  344. }, 800)
  345. },
  346. handleScroll (e) {
  347. const tabOffsetTop = this.$refs.refContent.getBoundingClientRect().top
  348. this.tabFixed = tabOffsetTop <= 70
  349. if (!this.isScrollAnchor) return
  350. const scrollItems = this.$root.$el.querySelectorAll('.outer-item')
  351. for (let i = scrollItems.length - 1; i >= 0; i--) {
  352. // console.log(e.target.scrollTop, this.getOffsetTop(scrollItems[i]), this.getOffsetTop(scrollItems[0]), 'judge')
  353. const scrollItemTop = this.getOffsetTop(scrollItems[i])
  354. // 判断滚动条滚动距离是否大于当前滚动项可滚动距离
  355. const judge =
  356. e.target.scrollTop >= scrollItemTop - 70 - 48 - 60
  357. if (judge) {
  358. this.tabActive = i
  359. break
  360. }
  361. }
  362. },
  363. // 获取当前元素的offsetTop
  364. getOffsetTop (obj) {
  365. let offsetTop = 0
  366. while (obj !== window.document.body && obj != null) {
  367. offsetTop += obj.offsetTop
  368. obj = obj.offsetParent
  369. }
  370. return offsetTop
  371. },
  372. updateMainFunStatus (item) {
  373. this.mainFunList.forEach(v => {
  374. if (v.children) {
  375. v.children.forEach(s => {
  376. if (item.id === s.id || item.name === s.name) {
  377. s.status = item.status
  378. this.$forceUpdate()
  379. }
  380. })
  381. }
  382. })
  383. this.formatMainFunList(this.addedList)
  384. const ids = this.addedList.map(v => {
  385. return v.id
  386. })
  387. this.transferSave(ids)
  388. this.$forceUpdate()
  389. }
  390. }
  391. }
  392. </script>
  393. <style lang="scss" scoped>
  394. $main: #2cb7ca;
  395. .drag-move {
  396. transition: transform .3s;
  397. }
  398. ::v-deep{
  399. .fn-dialog{
  400. .el-dialog__header,.el-dialog__body{
  401. padding: 0;
  402. }
  403. }
  404. .transfer-content{
  405. display: flex;
  406. align-items: center;
  407. justify-content: center;
  408. }
  409. .selector-card-header{
  410. margin: 0 0 28px!important;
  411. }
  412. .selector-card.s-card{
  413. width: 100%;
  414. }
  415. .selector-card-content{
  416. display: block!important;
  417. padding: 0 30px;
  418. }
  419. .more-tips{
  420. margin-top: 20px;
  421. font-size: 14px;
  422. line-height: 22px;
  423. text-align: center;
  424. color: #686868;
  425. }
  426. .drawer-class{
  427. background: #F2F2F4;
  428. .el-header{
  429. padding: 26px 30px;
  430. font-size: 18px;
  431. background: #fff;
  432. box-shadow: 0px -1px 0px 0px rgba(0, 0, 0, 0.05) inset;
  433. }
  434. .el-main{
  435. overflow-y: hidden!important;
  436. }
  437. .function-drawer-content{
  438. height: 100%;
  439. overflow-y: scroll;
  440. }
  441. .added-function{
  442. padding: 16px 30px 24px;
  443. background: #fff;
  444. .added-title{
  445. line-height: 24px;
  446. font-size: 16px;
  447. }
  448. .no-added{
  449. padding: 40px;
  450. text-align: center;
  451. font-size: 16px;
  452. color: #686868;
  453. }
  454. .added-container{
  455. display: flex;
  456. flex-wrap: wrap;
  457. }
  458. .added-item{
  459. position: relative;
  460. display: flex;
  461. flex-direction: column;
  462. align-items: center;
  463. width: 104px;
  464. height: fit-content;
  465. margin: 16px 0 0 0;
  466. padding: 8px 0;
  467. text-align: center;
  468. flex-shrink: 0;
  469. border-radius: 8px;
  470. cursor: grabbing;
  471. .item-name{
  472. margin-top: 8px;
  473. line-height: 22px;
  474. font-size: 14px;
  475. color: #1D1D1D;
  476. pointer-events: none;
  477. }
  478. .remove-tag{
  479. position: absolute;
  480. top: 0;
  481. right: 8px;
  482. display: inline-block;
  483. width: 14px;
  484. height: 14px;
  485. line-height: 12px;
  486. border-radius: 50%;
  487. background: #FF3A20;
  488. color: #fff;
  489. font-weight: bold;
  490. cursor: pointer;
  491. font-size: 16px;
  492. }
  493. }
  494. .drag-move-item{
  495. // padding: 8px 0;
  496. border: 1px solid rgba(0, 0, 0, 0.05);
  497. box-shadow: 0px 2px 16px rgba(0, 0, 0, 0.08);
  498. // border-radius: 8px;
  499. .remove-tag{
  500. display: none;
  501. }
  502. }
  503. .drag-init-hide{
  504. transition: 0.01s;
  505. transform: translateX(-9999px);
  506. }
  507. }
  508. .classify-function{
  509. margin-top: 12px;
  510. .classify-tab{
  511. width: 100%;
  512. padding: 0 12px;
  513. background: #fff;
  514. white-space: nowrap;
  515. overflow-x: auto;
  516. border-bottom: 1px solid rgba(0, 0, 0, 0.05);
  517. &::-webkit-scrollbar{
  518. height: 4px;
  519. }
  520. &::-webkit-scrollbar-track {
  521. background-color: #f5f5f5;
  522. }
  523. &::-webkit-scrollbar-thumb {
  524. border-radius: 2px;
  525. background-color: #ECECEC;
  526. opacity: 0.15;
  527. }
  528. }
  529. .tab-fixed{
  530. position: fixed;
  531. top: 70px;
  532. width: 100%;
  533. background: #fff;
  534. z-index: 10;
  535. white-space: nowrap;
  536. overflow-x: auto;
  537. }
  538. .tab-item{
  539. display: inline-block;
  540. // height: 100%;
  541. height: 48px;
  542. line-height: 48px;
  543. padding: 0 20px;
  544. cursor: pointer;
  545. font-size: 16px;
  546. }
  547. .active{
  548. position: relative;
  549. color: $main;
  550. &::after{
  551. position: absolute;
  552. content: '';
  553. width: 32px;
  554. height: 2px;
  555. bottom: 0;
  556. left: 50%;
  557. margin-left: -16px;
  558. background: $main;
  559. }
  560. }
  561. .classify-content{
  562. .outer-container,
  563. .insert-container{
  564. display: flex;
  565. flex-direction: column;
  566. }
  567. .outer-item{
  568. padding-left: 30px;
  569. margin-bottom: 8px;
  570. background: #fff;
  571. &:last-child{
  572. min-height: 100%;
  573. }
  574. }
  575. .outer-item-name{
  576. padding: 24px 0 8px;
  577. font-size: 18px;
  578. line-height: 28px;
  579. font-weight: 700;
  580. color: #1D1D1D;
  581. }
  582. .insert-item{
  583. position: relative;
  584. display: flex;
  585. align-items: center;
  586. justify-content: space-between;
  587. padding: 18px 30px 18px 0;
  588. &::after{
  589. position: absolute;
  590. content: '';
  591. right: 0;
  592. left: 60px;
  593. bottom: 0;
  594. border-bottom: 1px solid rgba(0, 0, 0, 0.05);
  595. }
  596. .el-image{
  597. width: 44px;
  598. height: 44px;
  599. flex-shrink: 0;
  600. }
  601. }
  602. .insert-item-left{
  603. display: flex;
  604. align-items: center;
  605. span{
  606. margin-left: 16px;
  607. font-size: 16px;
  608. line-height: 24px;
  609. }
  610. }
  611. .handle-btn{
  612. width: 72px;
  613. height: 30px;
  614. line-height: 28px;
  615. text-align: center;
  616. background: transparent;
  617. cursor: pointer;
  618. }
  619. .add-btn{
  620. border: 1px solid #E0E0E0;
  621. color: #1D1D1D;
  622. border-radius: 4px;
  623. }
  624. .remove-btn{
  625. border: 0;
  626. font-size: 14px;
  627. color: #FF3A20;
  628. }
  629. }
  630. }
  631. }
  632. }
  633. .icon-box-container {
  634. display: flex;
  635. align-items: center;
  636. justify-content: center;
  637. width: 44px;
  638. height: 44px;
  639. pointer-events: none;
  640. ::before{
  641. content: ''
  642. }
  643. ::v-deep {
  644. .el-image {
  645. width: 100%;
  646. height: 100%;
  647. img {
  648. width: 100%;
  649. height: 100%;
  650. }
  651. }
  652. }
  653. }
  654. .icon-set-img{
  655. display: inline-block;
  656. width: 18px;
  657. height: 18px;
  658. margin-right: 6px;
  659. background: url('~@/assets/images/icon/icon-set.png') no-repeat center center;
  660. background-size: contain;
  661. }
  662. .icon-add-img{
  663. display: inline-block;
  664. width: 44px;
  665. height: 44px;
  666. background: url('~@/assets/images/icon/icon-add.png') no-repeat center center;
  667. background-size: contain;
  668. }
  669. .header-right-set {
  670. display: flex;
  671. align-items: center;
  672. color: $main;
  673. font-size: 14px;
  674. cursor: pointer;
  675. }
  676. .common-lists{
  677. padding: 0 20px;
  678. display: flex;
  679. flex-wrap: wrap;
  680. .list-item,
  681. .list-add{
  682. width: 120px;
  683. padding: 18px 0 24px;
  684. display: flex;
  685. flex-direction: column;
  686. align-items: center;
  687. text-align: center;
  688. cursor: pointer;
  689. }
  690. .list-item{
  691. // flex: 1;
  692. &:hover{
  693. span{
  694. color: $main;
  695. }
  696. }
  697. }
  698. .item-name,.add-text{
  699. margin-top: 10px;
  700. font-size: 14px;
  701. line-height: 20px;
  702. color: #1D1D1D;
  703. @media only screen and (max-width: 1280px) {
  704. font-size: 12px;
  705. }
  706. }
  707. .item-img{
  708. width: 44px;
  709. height: 44px;
  710. }
  711. .add-text{
  712. white-space: nowrap;
  713. color: #686868;
  714. }
  715. }
  716. </style>