CommonUse.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. <template>
  2. <div class="work-common">
  3. <div class="common-title">
  4. <span>常用功能</span>
  5. <span class="set" @click="setFunctions"><i class="icon-set-img"></i> 设置</span>
  6. </div>
  7. <div class="common-lists">
  8. <div class="list-item" v-for="(item, index) in commonList" :key="index" @click="openRouter(item.url)">
  9. <img class="item-img" :src="item.img" alt="常用功能">
  10. <span v-html="item.name" class="item-name"></span>
  11. </div>
  12. <div v-if="commonList && commonList.length < 8" class="list-add" @click="setFunctions">
  13. <span class="icon-add-img"></span>
  14. <span class="add-text">添加常用功能</span>
  15. </div>
  16. </div>
  17. <!-- 设置常用功能dialog -->
  18. <el-dialog
  19. custom-class="fn-dialog"
  20. :visible.sync="dialogFn"
  21. :close-on-click-modal="false"
  22. :show-close="false"
  23. center
  24. width="696px"
  25. v-if="dialogFn"
  26. >
  27. <Card @onCancel="dialogFn = false" @onConfirm="confirmSaveFn" confirmText="确定">
  28. <div slot="header">常用功能设置</div>
  29. <div class="transfer-content">
  30. <Transfer :left="allFuncitons" :right="commonList" @onSave="saveFunData"></Transfer>
  31. </div>
  32. <p class="more-tips">最多可选择 <em style="color:#2CB7CA;">8</em> 个常用功能</p>
  33. </Card>
  34. </el-dialog>
  35. </div>
  36. </template>
  37. <script>
  38. import { Dialog } from 'element-ui'
  39. import Card from '@/components/selector/SelectorCard'
  40. import Transfer from './Transfer'
  41. import { getAllFunctions, getCanUseFunctions, saveCommonFunctions } from '@/api/modules'
  42. export default {
  43. name: 'work-common',
  44. computed: {},
  45. components: {
  46. [Dialog.name]: Dialog,
  47. Card,
  48. Transfer
  49. },
  50. data () {
  51. return {
  52. dialogFn: false,
  53. commonList: [], // 常用功能
  54. allFuncitons: [], // 所有功能
  55. saveData: null // 要提交的数据
  56. }
  57. },
  58. created () {
  59. this.getCanUseFunctions()
  60. this.getAllFunctions()
  61. },
  62. mounted () {},
  63. methods: {
  64. // 获取所有功能
  65. getAllFunctions () {
  66. // 平台参数 platform 平台:默认PC,微信:WX,app:APP, 可不传
  67. getAllFunctions().then(res => {
  68. if (res.error_code === 0 && res.data) {
  69. this.allFuncitons = res.data
  70. } else {
  71. this.allFuncitons = []
  72. }
  73. })
  74. },
  75. // 获取常用功能
  76. getCanUseFunctions () {
  77. getCanUseFunctions().then(res => {
  78. if (res.error_code === 0 && res.data) {
  79. res.data.forEach(v => {
  80. if (v.name.indexOf('/') > -1) {
  81. v.name = v.name.replace('/', '/<br>')
  82. }
  83. })
  84. this.commonList = res.data
  85. } else {
  86. this.commonList = []
  87. }
  88. })
  89. },
  90. setFunctions () {
  91. this.dialogFn = true
  92. },
  93. // 穿梭框子组件传来的组件
  94. saveFunData (data) {
  95. this.saveData = data
  96. },
  97. // dialog 卡片组件保存按钮提交事件
  98. confirmSaveFn () {
  99. console.log('保存的数据', this.saveData)
  100. if (this.saveData) {
  101. saveCommonFunctions({
  102. platform: 'PC',
  103. names: this.saveData.toString()
  104. }).then(res => {
  105. if (res.error_code === 0 && res.data) {
  106. this.dialogFn = false
  107. this.getCanUseFunctions()
  108. } else {
  109. this.$toast(res.error_msg)
  110. }
  111. })
  112. } else {
  113. this.dialogFn = false
  114. }
  115. },
  116. openRouter (url) {
  117. window.open(url)
  118. }
  119. }
  120. }
  121. </script>
  122. <style lang="scss" scoped>
  123. .work-common{
  124. margin-top: 20px;
  125. background: #fff;
  126. border-radius: 4px;
  127. box-shadow: 0px 0px 18px 0px rgba(0,0,0,0.02);
  128. ::v-deep{
  129. .fn-dialog{
  130. .el-dialog__header,.el-dialog__body{
  131. padding: 0;
  132. }
  133. }
  134. .transfer-content{
  135. display: flex;
  136. align-items: center;
  137. justify-content: center;
  138. }
  139. .selector-card-header{
  140. margin: 0 0 28px!important;
  141. }
  142. .selector-card.s-card{
  143. width: 100%;
  144. }
  145. .selector-card-content{
  146. display: block!important;
  147. padding: 0 30px;
  148. }
  149. .more-tips{
  150. margin-top: 20px;
  151. font-size: 14px;
  152. line-height: 22px;
  153. text-align: center;
  154. color: #686868;
  155. }
  156. }
  157. .common-title{
  158. position: relative;
  159. display: flex;
  160. justify-content: space-between;
  161. align-items: center;
  162. padding: 12px 20px;
  163. font-size: 18px;
  164. color: #1d1d1d;
  165. line-height: 28px;
  166. &::after{
  167. position: absolute;
  168. content: '';
  169. width: 3px;
  170. height: 24px;
  171. background: #2cb7ca;
  172. left: 0;
  173. top: 50%;
  174. transform: translateY(-50%);
  175. }
  176. .set{
  177. display: flex;
  178. align-items: center;
  179. color: #2cb7ca;
  180. font-size: 14px;
  181. cursor: pointer;
  182. }
  183. .icon-set-img{
  184. display: inline-block;
  185. width: 18px;
  186. height: 18px;
  187. margin-right: 6px;
  188. background: url('~@/assets/images/icon/icon-set.png') no-repeat center center;
  189. background-size: contain;
  190. }
  191. }
  192. .common-lists{
  193. padding: 0 20px;
  194. display: flex;
  195. .list-item,
  196. .list-add{
  197. width: 120px;
  198. height: 120px;
  199. padding: 18px 0 24px;
  200. display: flex;
  201. flex-direction: column;
  202. align-items: center;
  203. text-align: center;
  204. cursor: pointer;
  205. }
  206. .list-item{
  207. &:hover{
  208. span{
  209. color: #2cb7ca;
  210. }
  211. }
  212. }
  213. .item-name,.add-text{
  214. margin-top: 10px;
  215. font-size: 14px;
  216. line-height: 20px;
  217. color: #1D1D1D;
  218. }
  219. .item-img{
  220. width: 44px;
  221. height: 44px;
  222. }
  223. .icon-add-img{
  224. display: inline-block;
  225. width: 44px;
  226. height: 44px;
  227. background: url('~@/assets/images/icon/icon-add.png') no-repeat center center;
  228. background-size: contain;
  229. }
  230. .add-text{
  231. color: #686868;
  232. }
  233. }
  234. }
  235. </style>