Quellcode durchsuchen

Merge branch 'deploy' of chelingzhu-web/qhsxKx-admin-html into master

lilei vor 4 Jahren
Ursprung
Commit
b5a8521719
97 geänderte Dateien mit 5640 neuen und 7190 gelöschten Zeilen
  1. 2 2
      .env
  2. 1 1
      .env.development
  3. 2 2
      .env.preview
  4. 38 32
      package-lock.json
  5. 1 1
      package.json
  6. 1 1
      public/index.html
  7. 0 42
      src/api/accessoryInfo.js
  8. 0 10
      src/api/accessoryType.js
  9. 0 77
      src/api/active.js
  10. 0 41
      src/api/bannerSetting.js
  11. 100 0
      src/api/car-wash.js
  12. 59 0
      src/api/card-voucher-role.js
  13. 58 0
      src/api/card-voucher-user.js
  14. 1 1
      src/api/data.js
  15. 0 35
      src/api/editionSetting.js
  16. 2 2
      src/api/index.js
  17. 6 5
      src/api/login.js
  18. 23 3
      src/api/lookup.js
  19. 0 62
      src/api/manage.js
  20. 0 33
      src/api/notice.js
  21. 57 0
      src/api/order.js
  22. 19 24
      src/api/power-role.js
  23. 19 24
      src/api/power-user.js
  24. 58 0
      src/api/send-coupon-role.js
  25. 61 0
      src/api/send-coupon-user.js
  26. 0 61
      src/api/serviceItems.js
  27. 0 31
      src/api/tenants.js
  28. 0 48
      src/api/theme.js
  29. 0 39
      src/api/tpl.js
  30. 0 71
      src/api/videoSetting.js
  31. BIN
      src/assets/logo.png
  32. 2 3
      src/components/Select/index.js
  33. 5 5
      src/components/Table/index.js
  34. 5 5
      src/components/UploadFile/index.vue
  35. 1 1
      src/components/global.less
  36. 319 282
      src/config/router.config.js
  37. 1 1
      src/core/bootstrap.js
  38. 65 0
      src/libs/getDate.js
  39. 3 3
      src/permission.js
  40. 14 20
      src/store/modules/user.js
  41. 1 1
      src/utils/domUtil.js
  42. 31 27
      src/utils/request.js
  43. 770 0
      src/views/CarWashManagement/AddCarWashModal.vue
  44. 398 0
      src/views/CarWashManagement/CarWashManagement.vue
  45. 166 0
      src/views/CarWashManagement/ChooseEquipment.vue
  46. 286 0
      src/views/CarWashManagement/DetailsCarWashModal.vue
  47. 192 0
      src/views/CardVoucherAuth/role/menuModal.vue
  48. 234 0
      src/views/CardVoucherAuth/role/roleList.vue
  49. 172 0
      src/views/CardVoucherAuth/role/roleModal.vue
  50. 254 0
      src/views/CardVoucherAuth/user/userList.vue
  51. 268 0
      src/views/CardVoucherAuth/user/userModal.vue
  52. 194 0
      src/views/CouponSendAuth/role/menuModal.vue
  53. 222 0
      src/views/CouponSendAuth/role/roleList.vue
  54. 172 0
      src/views/CouponSendAuth/role/roleModal.vue
  55. 260 0
      src/views/CouponSendAuth/user/userList.vue
  56. 256 0
      src/views/CouponSendAuth/user/userModal.vue
  57. 3 4
      src/views/Home.vue
  58. 353 0
      src/views/Order/OrderCenter.vue
  59. 210 0
      src/views/Order/OrderDetailModal.vue
  60. 206 0
      src/views/RefundRecord/RefundRecord.vue
  61. 0 114
      src/views/activity/h5View.vue
  62. 0 298
      src/views/activity/hdManage/hdContent.vue
  63. 0 250
      src/views/activity/hdManage/hdList.vue
  64. 0 603
      src/views/activity/hdManage/newHd.vue
  65. 0 17
      src/views/activity/preview.vue
  66. 0 101
      src/views/activity/statisticModal.vue
  67. 0 219
      src/views/activity/statistics.vue
  68. 0 158
      src/views/activity/tpl/selTplList.vue
  69. 0 193
      src/views/activity/tpl/theme.vue
  70. 0 195
      src/views/activity/tpl/themeList.vue
  71. 0 183
      src/views/activity/tpl/tplType.vue
  72. 0 233
      src/views/activity/tpl/tplTypeList.vue
  73. 0 247
      src/views/appSetting/addEditionSetting.vue
  74. 0 349
      src/views/appSetting/addVideoSetting.vue
  75. 0 323
      src/views/appSetting/bannerSetting.vue
  76. 0 136
      src/views/appSetting/editionSetting.vue
  77. 0 217
      src/views/appSetting/showVideoSetting.vue
  78. 0 176
      src/views/appSetting/videoSetting.vue
  79. 9 9
      src/views/bnSetting/menu/adminMenus.vue
  80. 2 2
      src/views/bnSetting/menu/childModal.vue
  81. 6 6
      src/views/bnSetting/menu/storeMenus.vue
  82. 0 145
      src/views/components/add-server-to-hd.vue
  83. 0 462
      src/views/components/choose-part/choose-part.vue
  84. 0 352
      src/views/components/choose-server-item/choose-server-item.vue
  85. 0 140
      src/views/components/hd-item-list.vue
  86. 0 378
      src/views/notice/noticeList.vue
  87. 2 2
      src/views/power/menu/childModal.vue
  88. 9 83
      src/views/power/menu/menu.vue
  89. 0 7
      src/views/power/role/menuModal.vue
  90. 16 9
      src/views/power/role/roleList.vue
  91. 0 3
      src/views/power/role/roleModal.vue
  92. 18 6
      src/views/power/user/userList.vue
  93. 0 19
      src/views/power/user/userModal.vue
  94. 0 281
      src/views/tenants/tenantsList.vue
  95. 0 270
      src/views/tenants/tenantsModal.vue
  96. 0 2
      src/views/user/ChangePwd.vue
  97. 7 2
      vue.config.js

+ 2 - 2
.env

@@ -1,5 +1,5 @@
 NODE_ENV=production
 VUE_APP_PREVIEW=false
-VUE_APP_API_BASE_URL=https://it.zyucgj.com/zyit/
+VUE_APP_API_BASE_URL=http://carwash.zyucgj.com/cw-admin/
 VUE_APP_VERSION=V1.0.1
-VUE_APP_PRO_NAME=车管家IT后
+VUE_APP_PRO_NAME=洗车机运营管理平

+ 1 - 1
.env.development

@@ -2,4 +2,4 @@ NODE_ENV=development
 VUE_APP_PREVIEW=true
 VUE_APP_API_BASE_URL=/api
 VUE_APP_VERSION=V1.0.1
-VUE_APP_PRO_NAME=车管家IT后台-dev
+VUE_APP_PRO_NAME=洗车机运营管理平台-dev

+ 2 - 2
.env.preview

@@ -1,5 +1,5 @@
 NODE_ENV=production
 VUE_APP_PREVIEW=true
-VUE_APP_API_BASE_URL=http://it.test.zyucgj.com/zyit
+VUE_APP_API_BASE_URL=http://carwash.test.zyucgj.com/cw-admin/
 VUE_APP_VERSION=V1.0.1
-VUE_APP_PRO_NAME=车管家IT后台-pro
+VUE_APP_PRO_NAME=洗车机运营管理平台-pro

+ 38 - 32
package-lock.json

@@ -2313,9 +2313,9 @@
       "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
     },
     "ant-design-vue": {
-      "version": "1.4.0-beta.0",
-      "resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-1.4.0-beta.0.tgz",
-      "integrity": "sha512-MZnb5Pwr4mlYoE2pHB5XMeL22pmPlKF7WkQszS18t7VygS9Q/gF8nJl94nebv6EHJRrKg0i/6Axh1gR0vXb6Hg==",
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-1.5.2.tgz",
+      "integrity": "sha512-DmlOl+ld4hSQdEG1c2wAV+v9/Bl2aG+wBEnd1GJYV0LeOXaSrBGiIkZrmUrTrUL92yBdFO+OF25aFNb0UFMZOA==",
       "requires": {
         "@ant-design/icons": "^2.1.1",
         "@ant-design/icons-vue": "^2.0.0",
@@ -2326,13 +2326,14 @@
         "babel-runtime": "6.x",
         "classnames": "^2.2.5",
         "component-classes": "^1.2.6",
-        "dom-align": "^1.7.0",
+        "dom-align": "^1.10.4",
         "dom-closest": "^0.2.0",
-        "dom-scroll-into-view": "^1.2.1",
+        "dom-scroll-into-view": "^2.0.0",
         "enquire.js": "^2.1.6",
         "intersperse": "^1.0.0",
+        "is-mobile": "^2.2.1",
         "is-negative-zero": "^2.0.0",
-        "ismobilejs": "^0.5.1",
+        "ismobilejs": "^1.0.0",
         "json2mq": "^0.2.0",
         "lodash": "^4.17.5",
         "moment": "^2.21.0",
@@ -2343,8 +2344,8 @@
         "resize-observer-polyfill": "^1.5.1",
         "shallow-equal": "^1.0.0",
         "shallowequal": "^1.0.2",
-        "vue-ref": "^1.0.4",
-        "warning": "^3.0.0"
+        "vue-ref": "^2.0.0",
+        "warning": "^4.0.0"
       }
     },
     "any-promise": {
@@ -2570,9 +2571,9 @@
       "dev": true
     },
     "async-validator": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.2.0.tgz",
-      "integrity": "sha512-QBuW7Qrg8wbh7Wtqw1QdN162GUmXDs9gayxFaXcCOf3bCqHJ/TQep0H4I63iVk7Q3kIGWU4wbAr/C0Uj64JiMw=="
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-3.3.0.tgz",
+      "integrity": "sha512-cAHGD9EL8aCqWXjnb44q94MWiDFzUo1tMhvLb2WzcpWqGiKugsjWG9cvl+jPgkPca7asNbsBU3fa0cwkI/P+Xg=="
     },
     "asynckit": {
       "version": "0.4.0",
@@ -5505,9 +5506,9 @@
       }
     },
     "dom-align": {
-      "version": "1.10.2",
-      "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.10.2.tgz",
-      "integrity": "sha512-AYZUzLepy05E9bCY4ExoqHrrIlM49PEak9oF93JEFoibqKL0F7w5DLM70/rosLOawerWZ3MlepQcl+EmHskOyw=="
+      "version": "1.12.0",
+      "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.0.tgz",
+      "integrity": "sha512-YkoezQuhp3SLFGdOlr5xkqZ640iXrnHAwVYcDg8ZKRUtO7mSzSC2BA5V0VuyAwPSJA4CLIc6EDDJh4bEsD2+zA=="
     },
     "dom-closest": {
       "version": "0.2.0",
@@ -5538,9 +5539,9 @@
       "integrity": "sha1-0nKLQWqHUzmA6wibhI0lPPI6dYw="
     },
     "dom-scroll-into-view": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz",
-      "integrity": "sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4="
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz",
+      "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w=="
     },
     "dom-serializer": {
       "version": "0.2.1",
@@ -8975,6 +8976,11 @@
         "is-extglob": "^2.1.1"
       }
     },
+    "is-mobile": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-2.2.2.tgz",
+      "integrity": "sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg=="
+    },
     "is-negative-zero": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
@@ -9131,9 +9137,9 @@
       "dev": true
     },
     "ismobilejs": {
-      "version": "0.5.2",
-      "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-0.5.2.tgz",
-      "integrity": "sha512-ta9UdV60xVZk/ZafFtSFslQaE76SvNkcs1r73d2PVR21zVzx9xuYv9tNe4MxA1NN7WoeCc2RjGot3Bz1eHDx3Q=="
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz",
+      "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw=="
     },
     "isobject": {
       "version": "3.0.1",
@@ -11817,9 +11823,9 @@
       "dev": true
     },
     "mutationobserver-shim": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.3.tgz",
-      "integrity": "sha512-gciOLNN8Vsf7YzcqRjKzlAJ6y7e+B86u7i3KXes0xfxx/nfLmozlW1Vn+Sc9x3tPIePFgc1AeIFhtRgkqTjzDQ=="
+      "version": "0.3.7",
+      "resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz",
+      "integrity": "sha512-oRIDTyZQU96nAiz2AQyngwx1e89iApl2hN5AOYwyxLUB47UYsU3Wv9lJWqH5y/QdiYkc5HQLi23ZNB3fELdHcQ=="
     },
     "mute-stream": {
       "version": "0.0.7",
@@ -14694,9 +14700,9 @@
       }
     },
     "shallow-equal": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.0.tgz",
-      "integrity": "sha512-Z21pVxR4cXsfwpMKMhCEIO1PCi5sp7KEp+CmOpBQ+E8GpHwKOw2sEzk7sgblM3d/j4z4gakoWEoPcjK0VJQogA=="
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz",
+      "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA=="
     },
     "shallowequal": {
       "version": "1.1.0",
@@ -16551,9 +16557,9 @@
       }
     },
     "vue-ref": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/vue-ref/-/vue-ref-1.0.6.tgz",
-      "integrity": "sha512-UzD8t1CG+aoWVOOpGd5KcaCNtCgUc0byaKhJMH+6N7H/p1ThVkYl/VCt7DmCrdhUlzZK+hT5JPTKAdrbWi0nNw=="
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/vue-ref/-/vue-ref-2.0.0.tgz",
+      "integrity": "sha512-uKNKpFOVeWNqS2mrBZqnpLyXJo5Q+vnkex6JvpENvhXHFNBW/SJTP8vJywLuVT3DpxwXcF9N0dyIiZ4/NpTexQ=="
     },
     "vue-router": {
       "version": "3.1.3",
@@ -16669,9 +16675,9 @@
       "integrity": "sha1-+9PB1JdpI8nt67hbKdMLNVEq0Dk="
     },
     "warning": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/warning/-/warning-3.0.0.tgz",
-      "integrity": "sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=",
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
+      "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
       "requires": {
         "loose-envify": "^1.0.0"
       }

+ 1 - 1
package.json

@@ -15,7 +15,7 @@
   },
   "dependencies": {
     "@antv/data-set": "^0.10.2",
-    "ant-design-vue": "1.4.0-beta.0",
+    "ant-design-vue": "^1.5.2",
     "axios": "^0.19.0",
     "core-js": "2.6.9",
     "enquire.js": "^2.1.6",

+ 1 - 1
public/index.html

@@ -5,7 +5,7 @@
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <link rel="icon" href="<%= BASE_URL %>logo.png">
-    <title>车管家IT后台</title>
+    <title>洗车机运营管理平台</title>
     <style>#loading-mask{position:fixed;left:0;top:0;height:100%;width:100%;background:#fff;user-select:none;z-index:9999;overflow:hidden}.loading-wrapper{position:absolute;top:50%;left:50%;transform:translate(-50%,-100%)}.loading-dot{animation:antRotate 1.2s infinite linear;transform:rotate(45deg);position:relative;display:inline-block;font-size:64px;width:64px;height:64px;box-sizing:border-box}.loading-dot i{width:22px;height:22px;position:absolute;display:block;background-color:#1890ff;border-radius:100%;transform:scale(.75);transform-origin:50% 50%;opacity:.3;animation:antSpinMove 1s infinite linear alternate}.loading-dot i:nth-child(1){top:0;left:0}.loading-dot i:nth-child(2){top:0;right:0;-webkit-animation-delay:.4s;animation-delay:.4s}.loading-dot i:nth-child(3){right:0;bottom:0;-webkit-animation-delay:.8s;animation-delay:.8s}.loading-dot i:nth-child(4){bottom:0;left:0;-webkit-animation-delay:1.2s;animation-delay:1.2s}@keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@-webkit-keyframes antRotate{to{-webkit-transform:rotate(405deg);transform:rotate(405deg)}}@keyframes antSpinMove{to{opacity:1}}@-webkit-keyframes antSpinMove{to{opacity:1}}</style>
     <!-- require cdn assets css -->
     <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.css) { %>

+ 0 - 42
src/api/accessoryInfo.js

@@ -1,42 +0,0 @@
-import { axios } from '@/utils/request'
-// 获取配件的标签
-export const getPartLabels = (params) => {
-  return axios.request({
-    url: 'label/queryList',
-    data: { lableBizKey: '', lableBizType: 'PART' },
-    method: 'post'
-  })
-}
-// 配件信息, labels = [{id:id},...]
-export const getAccessoryInfoData = (params) => {
-  return axios.request({
-    url: `part/queryLike/${params.pageNo}/${params.pageSize}`,
-    data: {
-      queryWord: params.queryWord,
-      partsClsId: params.partsClsId,
-      labels: params.labels
-    },
-    method: 'post'
-  })
-}
-// 添加
-export const addAccessoryInfo = (params) => {
-  return axios.request({
-    url: 'part/save',
-    data: params,
-    method: 'post'
-  })
-}
-export const getAccessoryInfoById = (params) => {
-  return axios.request({
-    url: `part/${params.id}`,
-    method: 'get'
-  })
-}
-// 删除
-export const deleteAccessoryInfo = (params) => {
-  return axios.request({
-    url: `part/del/${params.id}`,
-    method: 'get'
-  })
-}

+ 0 - 10
src/api/accessoryType.js

@@ -1,10 +0,0 @@
-import { axios } from '@/utils/request'
-
-// 配件分类操作
-export const getPartsList = formData => {
-  return axios.request({
-    url: '/partCls/findAll',
-    method: 'post',
-    data: {}
-  })
-}

+ 0 - 77
src/api/active.js

@@ -1,77 +0,0 @@
-import { axios } from '@/utils/request'
-
-// 活动统计查询
-export const activeList = params => {
-  const url = `/active/queryLike/${params.pageNo}/${params.pageSize}`
-  delete params.pageNo
-  delete params.pageSize
-
-  return axios.request({
-    url: url,
-    data: params,
-    method: 'post'
-  })
-}
-
-// 活动总数统计及参与客户总数
-export const totalActive = params => {
-  return axios.request({
-    url: '/active/getSum',
-    data: params,
-    method: 'post'
-  })
-}
-
-// 查看详情
-export const activeDetails = params => {
-  const url = `/active/mould/${params.id}/${params.pageNo}/${params.pageSize}`
-  return axios.request({
-    url: url,
-    data: {},
-    method: 'get'
-  })
-}
-
-// 保存新建的活动
-export const saveActive = params => {
-  return axios.request({
-    url: '/active/save',
-    data: params,
-    method: 'post'
-  })
-}
-
-// 预览scan
-export const scanActive = params => {
-  return axios.request({
-    url: '/active/scan',
-    data: params,
-    method: 'post'
-  })
-}
-
-// 查看活动详细
-export const activeViews = params => {
-  const url = `/active/${params.id}`
-  return axios.request({
-    url: url,
-    method: 'get'
-  })
-}
-// 删除活动模版
-export const delActive = params => {
-  const url = `/active/delete/${params.id}`
-  return axios.request({
-    url: url,
-    method: 'get'
-  })
-}
-
-// 启用禁用活动
-export const enableActive = params => {
-  const url = `/active/enable/${params.id}/${params.flag}`
-  return axios.request({
-    url: url,
-    method: 'get'
-  })
-}

+ 0 - 41
src/api/bannerSetting.js

@@ -1,41 +0,0 @@
-import { axios } from '@/utils/request'
-
-// 列表查询
-export const getBannerSettingList = (params) => {
-  const url = `/zycar-mgr/banner/query`
-  return axios({
-    url: url,
-    data: {bannerType:params.bannerType},
-    method: 'post'
-  })
-}
-
-// 更改状态
-export const changeStatus = (params) => {
-  const url = `/zycar-mgr/banner/enable/${params.id}/${params.flag}`
-  return axios({
-    url: url,
-    data: {},
-    method: 'get'
-  })
-}
-
-// 确认保存
-export const saveItem = (params) => {
-  const url = `/zycar-mgr/banner/save`
-  return axios({
-    url: url,
-    data: params,
-    method: 'post'
-  })
-}
-
-// 删除
-export const deleteItem = (params) => {
-  const url = `/zycar-mgr/banner/del/${params.id}`
-  return axios({
-    url: url,
-    data: {},
-    method: 'get'
-  })
-}

+ 100 - 0
src/api/car-wash.js

@@ -0,0 +1,100 @@
+import { axios } from '@/utils/request'
+
+// 门店设备列表
+export const storeQuery = (params) => {
+  const url = `store/query/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 门店设备保存
+export const storeSave = (params) => {
+  const url = 'store/save'
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 查询设备
+export const deviceQuery = (params) => {
+  const url = `device/query/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 网点详情
+export const storeFind = params => {
+  const url = `store/find/${params.id}`
+  return axios.request({
+    url: url,
+    method: 'get'
+  })
+}
+// 查询门店的服务时段价格
+export const findItem = params => {
+  const url = `item/${params.id}`
+  return axios.request({
+    url: url,
+    method: 'get'
+  })
+}
+// 服务列表
+export const itemQuery = (params) => {
+  const url = `item/query/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 删除网点
+export const storeDel = params => {
+  const url = `store/del/${params.id}`
+  return axios.request({
+    url: url,
+    method: 'get'
+  })
+}
+// 获取当前设备图片
+export const deviceImage = params => {
+  const url = `device/image/${params.deviceNo}`
+  return axios.request({
+    url: url,
+    method: 'get'
+  })
+}
+// 获取网点小程序码
+export const storeQrCode = params => {
+  const url = `store/qrCode/${params.deviceNo}/${params.id}`
+  return axios.request({
+    url: url,
+    method: 'get'
+  })
+}
+// 更改网点营业状态
+export const storeUpdateStatus = params => {
+  const url = `store/updateStatus/${params.id}/${params.businessStatus}`
+  return axios.request({
+    url: url,
+    method: 'get'
+  })
+}
+// 检测设备状态
+export const deviceValidStatus = params => {
+  const url = `device/validStatus/${params.deviceNo}`
+  return axios.request({
+    url: url,
+    method: 'get'
+  })
+}

+ 59 - 0
src/api/card-voucher-role.js

@@ -0,0 +1,59 @@
+import { axios } from '@/utils/request'
+
+// 获取列表数据
+export const getPowerRoleList = params => {
+  const url = `yyrole/queryLike/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 改变权限状态接口 flag 0:禁用 1:启用
+export const updateEnableStatus = params => {
+  return axios({
+    url: `yyrole/enable/${params.id}/${params.flag}`,
+    data: {},
+    method: 'get'
+  })
+}
+
+// 删除用户接口
+export const delectRolePower = params => {
+  return axios({
+    url: `yyrole/delete/${params.id}`,
+    data: {},
+    method: 'get'
+  })
+}
+
+// 新增/编辑保存接口
+export const saveRolePower = params => {
+  return axios({
+    url: 'yyrole/save',
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 获取菜单树数据
+export const getMenuList = params => {
+  const url = `yyrole/findAllMenu/${params.id}`
+  return axios({
+    url: url,
+    method: 'get'
+  })
+}
+
+// 保存权限分配
+export const addMenuPower = params => {
+  const url = `yyrole/saveRoleMenu`
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}

+ 58 - 0
src/api/card-voucher-user.js

@@ -0,0 +1,58 @@
+import { axios } from '@/utils/request'
+
+// 重置密码
+export const resetPSD = params => {
+  return axios({
+    url: 'yyuser/resetPwd',
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 获取列表数据
+export const getPowerUserList = params => {
+  const url = `yyuser/queryLike/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 改变权限状态接口
+export const updateEnableStatus = params => {
+  return axios({
+    url: `yyuser/enable/${params.id}/${params.flag}`,
+    data: {},
+    method: 'get'
+  })
+}
+
+// 删除用户接口
+export const delectUserPower = params => {
+  return axios({
+    url: `yyuser/delete/${params.id}`,
+    data: {},
+    method: 'get'
+  })
+}
+
+// 新增/编辑保存接口
+export const saveUserPower = params => {
+  return axios({
+    url: 'yyuser/save',
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 获取角色列表接口
+export const getRoleList = params => {
+  return axios({
+    url: 'yyrole/findAll',
+    data: params,
+    method: 'POST'
+  })
+}

+ 1 - 1
src/api/data.js

@@ -2,7 +2,7 @@ import { axios } from '@/utils/request'
 
 export function login (parameter) {
   return axios({
-    url: '/auth/login',
+    url: '/login',
     method: 'post',
     data: parameter
   })

+ 0 - 35
src/api/editionSetting.js

@@ -1,35 +0,0 @@
-import { axios } from '@/utils/request'
-
-// 列表查询
-export const getEditionSettingList = (params) => {
-  const url = `/zycar-mgr/sysVersion/query/${params.pageNo}/${params.pageSize}`
-  delete params.pageNo
-  delete params.pageSize
-  return axios({
-    url: url,
-    data: {applyCode:params.applyCode},
-    method: 'post'
-  })
-}
-
-
-
-// 新建保存
-export const saveItem = (params) => {
-  const url = `/zycar-mgr/sysVersion/save`
-  return axios({
-    url: url,
-    data: params,
-    method: 'post'
-  })
-}
-
-// 根据id查询
-export const editItem = (params) => {
-  const url = `/zycar-mgr/sysVersion/${params.id}`
-  return axios({
-    url: url,
-    data: params,
-    method: 'get'
-  })
-}

+ 2 - 2
src/api/index.js

@@ -1,6 +1,6 @@
 const api = {
-  Login: '/auth/login',
-  Logout: '/auth/logout',
+  Login: '/login',
+  Logout: '/logout',
   ForgePassword: '/auth/forge-password',
   Register: '/auth/register',
   twoStepCode: '/auth/2step-code',

+ 6 - 5
src/api/login.js

@@ -3,15 +3,16 @@ import { axios } from '@/utils/request'
 
 export function login ({ username, password }) {
   return axios({
-    url: 'auth/login',
-    data: { username, password },
+    url: 'login',
+    headers: { 'content-type': 'application/x-www-form-urlencoded', 'App-Type': 9 },
+    data: `username=${username}&password=${password}`,
     method: 'post'
-  })
+  }).then(res => res.data)
 }
 
 export function logout () {
   return axios({
-    url: 'auth/logout',
+    url: 'logout',
     method: 'get'
   })
 }
@@ -56,7 +57,7 @@ export function get2step (parameter) {
 // 修改密码
 export function changePwd (parameter) {
   return axios({
-    url: '/user/changePWD',
+    url: 'user/changePWD',
     method: 'post',
     data: parameter
   })

+ 23 - 3
src/api/lookup.js

@@ -1,7 +1,7 @@
 import { axios } from '@/utils/request'
 
 export const listLookUp = params => {
-  let url = `/lookup/queryLike`
+  const url = `/lookup/queryLike`
   return axios({
     url: url,
     data: params,
@@ -25,7 +25,7 @@ export const delLookUp = params => {
 }
 
 export const getLookUpItem = (params) => {
-  let url = `/lookupItem/query/${params.pageNo}/${params.pageSize}`
+  const url = `/lookupItem/query/${params.pageNo}/${params.pageSize}`
   delete params.pageNo
   delete params.pageSize
   return axios({
@@ -35,7 +35,6 @@ export const getLookUpItem = (params) => {
   })
 }
 
-
 export const delLookUpItem = params => {
   return axios({
     url: `/lookupItem/delete/${params.id}`,
@@ -49,3 +48,24 @@ export const saveLookUpItem = params => {
     method: 'post'
   })
 }
+// 查询省
+export const getProvince = () => {
+  return axios.request({
+    url: `/area/PROVINCE`,
+    method: 'get'
+  })
+}
+// 查询市
+export const getCityByPro = params => {
+  return axios.request({
+    url: `/area/CITY/${params.id}`,
+    method: 'get'
+  })
+}
+// 查询区
+export const getDistrictByCity = params => {
+  return axios.request({
+    url: `/area/DISTRICT/${params.id}`,
+    method: 'get'
+  })
+}

+ 0 - 62
src/api/manage.js

@@ -1,62 +0,0 @@
-import { axios } from '@/utils/request'
-
-const api = {
-  user: '/user',
-  role: '/role',
-  service: '/service',
-  permission: '/permission',
-  permissionNoPager: '/permission/no-pager',
-  orgTree: '/org/tree'
-}
-
-export default api
-
-export function getUserList (parameter) {
-  return axios({
-    url: api.user,
-    method: 'get',
-    params: parameter
-  })
-}
-
-export function getRoleList (parameter) {
-  return axios({
-    url: api.role,
-    method: 'get',
-    params: parameter
-  })
-}
-
-export function getServiceList (parameter) {
-  return axios({
-    url: api.service,
-    method: 'get',
-    params: parameter
-  })
-}
-
-export function getPermissions (parameter) {
-  return axios({
-    url: api.permissionNoPager,
-    method: 'get',
-    params: parameter
-  })
-}
-
-export function getOrgTree (parameter) {
-  return axios({
-    url: api.orgTree,
-    method: 'get',
-    params: parameter
-  })
-}
-
-// id == 0 add     post
-// id != 0 update  put
-export function saveService (parameter) {
-  return axios({
-    url: api.service,
-    method: parameter.id === 0 ? 'post' : 'put',
-    data: parameter
-  })
-}

+ 0 - 33
src/api/notice.js

@@ -1,33 +0,0 @@
-import { axios } from '@/utils/request'
-
-// 列表查询
-export const getNoticeList = (params) => {
-  const url = `notice/queryLike/${params.pageNo}/${params.pageSize}`
-  delete params.pageNo
-  delete params.pageSize
-  return axios({
-    url: url,
-    data: params,
-    method: 'post'
-  })
-}
-
-// 新建保存
-export const saveItem = (params) => {
-  const url = `notice/save`
-  return axios({
-    url: url,
-    data: params,
-    method: 'post'
-  })
-}
-
-// 删除
-export const deleteItem = (params) => {
-  const url = `notice/delete/${params.id}`
-  return axios({
-    url: url,
-    data: {},
-    method: 'get'
-  })
-}

+ 57 - 0
src/api/order.js

@@ -0,0 +1,57 @@
+import { axios } from '@/utils/request'
+
+// 订单列表
+export const orderCenterList = params => {
+  const url = `order/query/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 获取服务项目列表
+export const itemList = params => {
+  const url = `item/query/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 获取网点名称列表
+export const storeList = params => {
+  const url = `store/query/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 获取订单详情
+export const orderDetail = params => {
+  const url = `order/find/${params.id}`
+  return axios({
+    url: url,
+    data: params,
+    method: 'get'
+  })
+}
+
+// 合计
+export const orderTotal = params => {
+  const url = 'order/getSum'
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}

+ 19 - 24
src/api/power-role.js

@@ -1,8 +1,8 @@
 import { axios } from '@/utils/request'
 
-// 获取列表数据
+// 分页查询角色
 export const getPowerRoleList = params => {
-  const url = `/role/queryLike/${params.pageNo}/${params.pageSize}`
+  const url = `role/queryLike/${params.pageNo}/${params.pageSize}`
   delete params.pageNo
   delete params.pageSize
   return axios({
@@ -11,49 +11,44 @@ export const getPowerRoleList = params => {
     method: 'POST'
   })
 }
-
-// 改变权限状态接口 flag 0:禁用 1:启用
+// 保存角色
+export const saveRolePower = params => {
+  return axios({
+    url: 'role/save',
+    data: params,
+    method: 'POST'
+  })
+}
+// flag 0:禁用 1:启用  启禁用角色
 export const updateEnableStatus = params => {
   return axios({
-    url: `/role/enable/${params.id}/${params.flag}`,
+    url: `role/enable/${params.id}/${params.flag}`,
     data: {},
     method: 'get'
   })
 }
-
-// 删除用户接口
+// 删除角色
 export const delectRolePower = params => {
   return axios({
-    url: `/role/delete/${params.id}`,
+    url: `role/delete/${params.id}`,
     data: {},
     method: 'get'
   })
 }
-
-// 新增/编辑保存接口
-export const saveRolePower = params => {
-  return axios({
-    url: '/role/save',
-    data: params,
-    method: 'POST'
-  })
-}
-
-// 获取菜单树数据
+// 查询可用所有菜单
 export const getMenuList = params => {
-  const url = `/role/findAllMenu/${params.id}`
+  const url = `role/findAllMenu/${params.id}`
   return axios({
     url: url,
     method: 'get'
   })
 }
-
-// 保存权限分配
+// 保存角色菜单关系
 export const addMenuPower = params => {
-  const url = `/role/saveRoleMenu`
+  const url = `role/saveRoleMenu`
   return axios({
     url: url,
     data: params,
     method: 'post'
   })
-}
+}

+ 19 - 24
src/api/power-user.js

@@ -3,15 +3,22 @@ import { axios } from '@/utils/request'
 // 重置密码
 export const resetPSD = params => {
   return axios({
-    url: '/user/resetPwd',
+    url: 'user/resetPwd',
     data: params,
     method: 'POST'
   })
 }
-
-// 获取列表数据
+// 启用禁用
+export const updateEnableStatus = params => {
+  return axios({
+    url: `user/enable/${params.id}/${params.flag}`,
+    data: {},
+    method: 'get'
+  })
+}
+// 分页查询用户
 export const getPowerUserList = params => {
-  const url = `/user/queryLike/${params.pageNo}/${params.pageSize}`
+  const url = `user/queryLike/${params.pageNo}/${params.pageSize}`
   delete params.pageNo
   delete params.pageSize
   return axios({
@@ -20,39 +27,27 @@ export const getPowerUserList = params => {
     method: 'POST'
   })
 }
-
-// 改变权限状态接口
-export const updateEnableStatus = params => {
-  return axios({
-    url: `/user/enable/${params.id}/${params.flag}`,
-    data: {},
-    method: 'get'
-  })
-}
-
 // 删除用户接口
 export const delectUserPower = params => {
   return axios({
-    url: `/user/delete/${params.id}`,
+    url: `user/delete/${params.id}`,
     data: {},
     method: 'get'
   })
 }
-
-// 新增/编辑保存接口
-export const saveUserPower = params => {
+// 查询所有角色
+export const getRoleList = params => {
   return axios({
-    url: '/user/save',
+    url: 'role/findAll',
     data: params,
     method: 'POST'
   })
 }
-
-// 获取角色列表接口
-export const getRoleList = params => {
+// 保存用户
+export const saveUserPower = params => {
   return axios({
-    url: '/role/findAll',
+    url: 'user/save',
     data: params,
     method: 'POST'
   })
-}
+}

+ 58 - 0
src/api/send-coupon-role.js

@@ -0,0 +1,58 @@
+import { axios } from '@/utils/request'
+
+// 获取角色列表数据
+export const getRoleList = params => {
+  const url = `mdrole/queryLike/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 启用禁用角色   flag 0:禁用 1:启用
+export const changeRoleStatus = params => {
+  return axios({
+    url: `mdrole/enable/${params.id}/${params.flag}`,
+    params: params,
+    method: 'get'
+  })
+}
+
+// 查询发券可用所有菜单
+export const getAllUsedMenu = params => {
+  return axios({
+    url: `mdrole/findAllMenu/${params.id}`,
+    data: {},
+    method: 'get'
+  })
+}
+
+// 保存新修改的可用菜单
+export const getAllNewMenu = params => {
+  return axios({
+    url: `mdrole/saveRoleMenu`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 新增-编辑角色
+export const getEnableRole = params => {
+  return axios({
+    url: 'mdrole/save',
+    data: params,
+    method: 'post'
+  })
+}
+
+// 删除角色
+export const getDelRole = params => {
+  return axios({
+    url: `mdrole/delete/${params.id}`,
+    data: params,
+    method: 'get'
+  })
+}

+ 61 - 0
src/api/send-coupon-user.js

@@ -0,0 +1,61 @@
+import { axios } from '@/utils/request'
+
+// 重置密码
+export const resetPSD = params => {
+  return axios({
+    url: 'employee/restPWD',
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 获取列表数据
+export const getUserList = params => {
+  const url = `employee/queryLike/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 获取网点名称列表
+export const storeList = params => {
+  const url = `store/query/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 删除用户接口
+export const delectUser = params => {
+  return axios({
+    url: `employee/del/${params.id}`,
+    data: {},
+    method: 'get'
+  })
+}
+
+// 新增/编辑保存接口
+export const saveUser = params => {
+  return axios({
+    url: 'employee/save',
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 获取角色列表数据
+export const getRoleList = params => {
+  return axios.request({
+    url: '/mdrole/findAll',
+    data: params,
+    method: 'POST'
+  })
+}

+ 0 - 61
src/api/serviceItems.js

@@ -1,61 +0,0 @@
-import { axios } from '@/utils/request'
-
-// 服务项目
-export const getServiceItemData = (params) => {
-  const url = `item/queryLike/${params.pageNo}/${params.pageSize}`
-  delete params.pageNo
-  delete params.pageSize
-  return axios.request({
-    url: url,
-    data: params,
-    method: 'post'
-  })
-}
-export const getServiceItemById = (params) => {
-  return axios.request({
-    url: `item/${params.id}`,
-    method: 'get'
-  })
-}
-export const deleteServiceItem = (params) => {
-  return axios.request({
-    url: `item/del/${params.id}`,
-    method: 'get'
-  })
-}
-// 添加
-export const addServiceItems = (params) => {
-  return axios.request({
-    url: 'item/save',
-    data: params,
-    method: 'post'
-  })
-}
-// 获取某个服务类型下单服务标签
-export const getServiceLabels = (params) => {
-  return axios.request({
-    url: 'label/queryList',
-    data: { lableBizKey: params.clsId, lableBizType: 'SERVICE' },
-    method: 'post'
-  })
-}
-// 根据标签查询服务列表
-export const getServerByLabelId = (params) => {
-  return axios.request({
-    url: `item/queryByLabelId/${params.pageNo}/${params.pageSize}`,
-    data: {
-      name: params.queryWord,
-      itemClsId: params.itemClsId,
-      labelId: params.labelId
-    },
-    method: 'post'
-  })
-}
-// 根据服务类别获取标签
-export const getMarkData = (params) => {
-  return axios.request({
-    url: '/label/getLabelName',
-    data: params,
-    method: 'post'
-  })
-}

+ 0 - 31
src/api/tenants.js

@@ -1,31 +0,0 @@
-import { axios } from '@/utils/request'
-
-// 获取列表数据
-export const getTenantsList = params => {
-  const url = `/org/apply/queryLike/${params.pageNo}/${params.pageSize}`
-  delete params.pageNo
-  delete params.pageSize
-  return axios({
-    url: url,
-    data: params,
-    method: 'POST'
-  })
-}
-
-// 启用禁用
-export const enable = params => {
-  return axios({
-    url: '/org/apply/enable',
-    data: params,
-    method: 'POST'
-  })
-}
-
-// 授权
-export const saveAuth = params => {
-  return axios({
-    url: '/org/apply/auth',
-    data: params,
-    method: 'POST'
-  })
-}

+ 0 - 48
src/api/theme.js

@@ -1,48 +0,0 @@
-import { axios } from '@/utils/request'
-
-// 活动主题 根据模板id查询模板主题
-export const getThemeByMouldId = (params) => {
-  return axios.request({
-    url: `static/mould/theme/queryByMouldId/${params.staticMouldId}`,
-    method: 'get',
-    data: {}
-  })
-}
-// 带分页
-export const getThemeList = (params) => {
-  const url = `/static/mould/theme/queryLike/${params.pageNo}/${params.pageSize}`
-  delete params.pageNo
-  delete params.pageSize
-  return axios({
-    url: url,
-    data: params,
-    method: 'post'
-  })
-}
-export const saveTheme = (params) => {
-  return axios({
-    url: '/static/mould/theme/save',
-    data: params,
-    method: 'post'
-  })
-}
-export const delTheme = (params) => {
-  return axios({
-    url: `/static/mould/theme/delete/${params.id}`,
-    method: 'get'
-  })
-}
-// 改变状态接口
-export const updateEnableStatus = params => {
-  return axios({
-    url: `/static/mould/theme/enable/${params.id}/${params.flag}`,
-    method: 'get'
-  })
-}
-// 查详细
-export const getThemeDetail = (params) => {
-  return axios({
-    url: `/static/mould/theme/${params.id}`,
-    method: 'get'
-  })
-}

+ 0 - 39
src/api/tpl.js

@@ -1,39 +0,0 @@
-import { axios } from '@/utils/request'
-
-export const getTplList = (params) => {
-  const url = `/static/mould/queryLike/${params.pageNo}/${params.pageSize}`
-  delete params.pageNo
-  delete params.pageSize
-  return axios({
-    url: url,
-    data: params,
-    method: 'post'
-  })
-}
-export const saveTpl = (params) => {
-  return axios({
-    url: '/static/mould/save',
-    data: params,
-    method: 'post'
-  })
-}
-export const delTpl = (params) => {
-  return axios({
-    url: `/static/mould/delete/${params.id}`,
-    method: 'get'
-  })
-}
-// 改变状态接口
-export const updateEnableStatus = params => {
-  return axios({
-    url: `/static/mould/enable/${params.id}/${params.flag}`,
-    method: 'get'
-  })
-}
-// 查详细
-export const getTplDetail = (params) => {
-  return axios({
-    url: `/static/mould/${params.id}`,
-    method: 'get'
-  })
-}

+ 0 - 71
src/api/videoSetting.js

@@ -1,71 +0,0 @@
-import { axios } from '@/utils/request'
-
-// 列表查询
-export const getSettingList = (params) => {
-  const url = `zycar-mgr/business/experience/queryLike/${params.pageNo}/${params.pageSize}`
-  delete params.pageNo
-  delete params.pageSize
-  return axios({
-    url: url,
-    data: params,
-    method: 'post'
-  })
-}
-
-// 状态改变
-export const changeStatus = (params) => {
-  const url = `zycar-mgr/business/experience/enable/${params.id}/${params.flag}`
-  return axios({
-    url: url,
-    data: {},
-    method: 'get'
-  })
-}
-
-// 删除
-export const deleteItem = (params) => {
-  const url = `zycar-mgr/business/experience/delete/${params.id}`
-  return axios({
-    url: url,
-    data: {},
-    method: 'get'
-  })
-}
-
-// 保存
-export const saveItem = (params) => {
-  const url = `zycar-mgr/business/experience/save`
-  return axios({
-    url: url,
-    data: params,
-    method: 'post'
-  })
-}
-
-// 查详情
-export const searchDetail = (params) => {
-  const url = `zycar-mgr/business/experience/${params.id}`
-  return axios({
-    url: url,
-    data: params,
-    method: 'get'
-  })
-}
-
-// 关联广告图
-export const aboutaDvertisementImg = (params) => {
-  return axios.request({
-    url: `zycar-mgr/banner/query`,
-    data:{position:params.position},
-    method: 'post'
-  })
-}
-
-// 关联广告图片详情
-export const searcAdhDetail = (params) => {
-  return axios.request({
-    url: `zycar-mgr/banner/query`,
-    data:{id:params.id} ,
-    method: 'post'
-  })
-}

BIN
src/assets/logo.png


+ 2 - 3
src/components/Select/index.js

@@ -29,7 +29,7 @@ export default {
   }),
   created () {
     const _this = this
-    console.log(_this.code, '_this.code')
+    // console.log(_this.code, '_this.code')
     Promise.all([listLookUp({ code: '' }), getLookUpData({
       pageNo: 1,
       pageSize: 1000,
@@ -40,13 +40,12 @@ export default {
       if (_all.status + '' === '200' && _data.status + '' === '200') {
         _this.dataList = _data.data.list
         const a = _.find(_all.data, ['code', _this.code])
-        console.log(a)
+        // console.log(a)
         _this.placeholderText = '请选择' + (a != undefined ? a.name : '')
       }
     })
   },
   methods: {
-
     /**
      * 获取当前所有的option 数据
      * @returns options data

+ 5 - 5
src/components/Table/index.js

@@ -110,7 +110,7 @@ export default {
       pageSize: this.pageSize,
       showSizeChanger: this.showSizeChanger
     }) || false
-    console.log('this.localPagination', this.localPagination)
+    // console.log('this.localPagination', this.localPagination)
     this.needTotalList = this.initTotalList(this.columns)
     this.loadData()
   },
@@ -149,14 +149,14 @@ export default {
         ...filters
       }
       )
-      console.log('parameter', parameter)
+      // console.log('parameter', parameter)
       const result = this.data(parameter)
       // 对接自己的通用数据接口需要修改下方代码中的 r.pageNo, r.count, r.data
       // eslint-disable-next-line
       if ((typeof result === 'object' || typeof result === 'function') && typeof result.then === 'function') {
         result.then(r => {
-          let list = r.list || r.data || r
-          console.log(r,'rrrrrrrrrr')
+          const list = r.list || r.data || r
+          // console.log(r, 'rrrrrrrrrr')
           this.localPagination = this.showPagination && Object.assign({}, this.localPagination, {
             current: r.pageNo, // 返回结果中的当前分页数
             total: r.count, // 返回结果中的总记录数
@@ -180,7 +180,7 @@ export default {
           } catch (e) {
             this.localPagination = false
           }
-          console.log('loadData -> this.localPagination', this.localPagination)
+          // console.log('loadData -> this.localPagination', this.localPagination)
           this.localDataSource = list // 返回结果中的数组数据
           this.localLoading = false
         })

+ 5 - 5
src/components/UploadFile/index.vue

@@ -1,5 +1,6 @@
 <template>
   <div class="upload-file" :style="{width: maxNums>1?'100%':'auto'}">
+    <!-- previewFile 暂时去掉,否则不能正常回显 -->
     <a-upload
       :action="action"
       :listType="listType"
@@ -7,7 +8,6 @@
       @preview="handlePreview"
       @change="handleChange"
       :beforeUpload="beforeUpload"
-      :preview-file="previewFile"
       :data="params"
       :value="comVal"
     >
@@ -75,7 +75,7 @@ export default {
     value (a, b) {
       console.log(a, '=--====')
       this.comVal = a || ''
-      if (a == undefined) {
+      if (a === undefined) {
         this.fileList = []
       }
     }
@@ -116,7 +116,7 @@ export default {
       if (this.listType == 'text') {
         return
       }
-      console.log(file,'8888888888')
+      console.log(file, '8888888888')
       this.previewImage = file.url || file.thumbUrl
       // this.previewImage = file.response.data
       this.previewVisible = true
@@ -172,9 +172,9 @@ export default {
 
       // 文件大小
       const isLt2M = file.size / 1024 / 1024 < this.fileSize
-      if (!isLt2M ) {
+      if (!isLt2M) {
         if (tip != 0) {
-          if (this.fileType !='video/mp4') {
+          if (this.fileType != 'video/mp4') {
             this.$message.error('图片不能超过 ' + this.fileSize + 'MB!')
           } else {
             this.$message.error('视频不能超过 ' + this.fileSize + 'MB!')

+ 1 - 1
src/components/global.less

@@ -407,7 +407,7 @@ body {
 
     h1 {
       color: #fff;
-      font-size: 20px;
+      font-size: 16px;
       margin: 0 0 0 12px;
       font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
       font-weight: 600;

+ 319 - 282
src/config/router.config.js

@@ -1,300 +1,337 @@
-// eslint-disable-next-line
-import { UserLayout, BasicLayout, RouteView, BlankLayout, PageView } from '@/layouts'
-
-export const asyncRouterMap = [
+import {
+  UserLayout,
+  BasicLayout,
+  PageView
+} from '@/layouts'
+
+export const asyncRouterMap = [{
+  path: '/',
+  name: 'index',
+  component: BasicLayout,
+  meta: {
+    title: '首页'
+  },
+  redirect: '/home',
+  children: [{
+    path: '/home',
+    name: 'home',
+    redirect: '/home',
+    component: PageView,
+    meta: {
+      title: '首页',
+      icon: 'home'
+    },
+    hideChildrenInMenu: true,
+    children: [{
+      path: '/home',
+      name: 'home',
+      component: () => import(/* webpackChunkName: "home" */ '@/views/Home'),
+      meta: {
+        title: '首页',
+        icon: 'home',
+        hidden: true
+      }
+    },
+    {
+      path: '/changePwd',
+      name: 'changePwd',
+      component: () => import(/* webpackChunkName: "home" */ '@/views/user/ChangePwd'),
+      meta: {
+        title: '修改密码',
+        icon: 'home',
+        hidden: true
+      }
+    }
+    ]
+  },
+  // Car washing machine management center
+  {
+    path: '/CarWashManagement',
+    redirect: '/CarWashManagement/CarWashManagement',
+    component: PageView,
+    meta: {
+      title: '洗车机管理中心',
+      icon: 'shop',
+      permission: 'M_wash_0'
+    },
+    children: [{
+      path: '/CarWashManagement/CarWashManagement',
+      name: 'CarWashManagement',
+      component: () => import('@/views/CarWashManagement/CarWashManagement.vue'),
+      meta: {
+        title: '洗车网点管理',
+        icon: 'gateway',
+        permission: 'M_wash_list'
+      }
+    }]
+  },
+  {
+    path: '/Order',
+    redirect: '/Order/OrderCenter',
+    name: 'Order',
+    component: PageView,
+    meta: {
+      title: '订单中心',
+      icon: 'snippets',
+      permission: 'M_order_0'
+    },
+    children: [{
+      path: '/Order/OrderCenter',
+      name: 'OrderCenter',
+      component: () => import('@/views/Order/OrderCenter.vue'),
+      meta: {
+        title: '订单记录',
+        icon: 'file-text',
+        permission: 'M_order_list'
+      }
+    }]
+  },
+  // {
+  //   path: '/RefundRecord',
+  //   redirect: '/RefundRecord/RefundRecord',
+  //   component: PageView,
+  //   meta: {
+  //     title: '退单记录',
+  //     icon: 'setting'
+  //     // permission: 'M_setting_0'
+  //   },
+  //   children: [{
+  //     path: '/RefundRecord/RefundRecord',
+  //     name: 'RefundRecord',
+  //     component: () => import('@/views/RefundRecord/RefundRecord.vue'),
+  //     meta: {
+  //       title: '退单记录',
+  //       icon: 'setting'
+  //       // permission: 'M_sys_dataDictionary'
+  //     }
+  //   }
+  //   ]
+  // },
   {
-    path: '/',
-    name: 'index',
-    component: BasicLayout,
-    meta: { title: '首页' },
-    redirect: '/home',
+    path: '/menusAuth',
+    redirect: '/bnSetting/menusAuth',
+    component: PageView,
+    meta: {
+      title: '菜单管理',
+      icon: 'bars',
+      permission: 'M_menu_0'
+    },
     children: [
       {
-        path: '/home',
-        name: 'home',
-        redirect: '/home',
-        component: PageView,
-        meta: { title: '首页', icon: 'home' },
-        hideChildrenInMenu: true,
-        children: [
-          {
-            path: '/home',
-            name: 'home',
-            component: () => import(/* webpackChunkName: "home" */ '@/views/Home'),
-            meta: { title: '首页', icon: 'home', hidden: true }
-          },
-          {
-            path: '/changePwd',
-            name: 'changePwd',
-            component: () => import(/* webpackChunkName: "home" */ '@/views/user/ChangePwd'),
-            meta: { title: '修改密码', icon: 'home', hidden: true }
-          }
-        ]
+        path: '/menusAuth/adminMenus',
+        name: 'adminMenus',
+        component: () => import(/* webpackChunkName: "bnSetting" */ '@/views/bnSetting/menu/adminMenus.vue'),
+        meta: {
+          title: '运营平台菜单管理',
+          icon: 'appstore',
+          permission: 'M_auth_yyMenu'
+        }
       },
       {
-        path: '/tenants',
-        redirect: '/tenants/list',
-        component: PageView,
-        meta: { title: '租户管理', icon: 'team', permission: 'M_tenants_list' },
-        children: [
-          {
-            path: '/tenants/list',
-            name: 'tenantsList',
-            component: () => import(/* webpackChunkName: "tenants" */ '@/views/tenants/tenantsList.vue'),
-            meta: { title: '租户列表', icon: 'team', permission: 'M_tenants_list' }
-          }
-        ]
+        path: '/menusAuth/menu',
+        name: 'powerMenu',
+        component: () => import(/* webpackChunkName: "auth" */ '@/views/power/menu/menu.vue'),
+        meta: {
+          title: '卡券中心菜单管理',
+          icon: 'profile',
+          permission: 'M_auth_kqMenu'
+        }
       },
       {
-        path: '/activity',
-        redirect: '/activity/statistics',
-        component: PageView,
-        meta: { title: '营销活动', icon: 'gift', permission: 'M_activity_0' },
-        children: [
-          {
-            path: '/activity/statistics',
-            name: 'activityStatistics',
-            component: () => import(/* webpackChunkName: "activity" */ '@/views/activity/statistics.vue'),
-            meta: { title: '活动统计', icon: 'bar-chart', permission: 'M_activity_statistics' }
-          },
-          {
-            path: '/activity/tplType',
-            name: 'activityTplType',
-            component: () => import(/* webpackChunkName: "activity" */ '@/views/activity/tpl/tplTypeList.vue'),
-            meta: { title: '模板管理', icon: 'code', permission: 'M_activity_tplType' }
-          },
-          {
-            path: '/activity/hdList',
-            name: 'activityHdList',
-            component: () => import(/* webpackChunkName: "activity" */ '@/views/activity/hdManage/hdList.vue'),
-            meta: { title: '活动管理', icon: 'flag', permission: 'M_activity_hdList' }
-          }
-        ]
-      },
-      // 业务 设置setting
-      {
-        path: '/bnSetting',
-        redirect: '/bnSetting/menusAuth',
-        component: PageView,
-        meta: { title: '平台设置', icon: 'security-scan', permission: 'M_bnSetting_0' },
-        children: [
-          {
-            path: '/bnSetting/menusAuth',
-            name: 'menusAuth',
-            component: () => import(/* webpackChunkName: "bnSetting" */ '@/views/bnSetting/menusAuthTab.vue'),
-            meta: { title: '菜单授权', icon: 'property-safety', permission: 'M_bnSetting_0' }
-          }
-        ]
-      },
-      {
-        path: '/appSetting',
-        redirect: '/appSetting/bannerSetting',
-        component: PageView,
-        meta: { title: 'APP设置', icon: 'appstore', permission: 'M_appSetting' },
-        children: [
-          {
-            path: '/appSetting/bannerSetting',
-            name: 'bannerSetting',
-            component: () => import(/* webpackChunkName: "appSetting" */ '@/views/appSetting/bannerSetting.vue'),
-            meta: { title: '营销图设置', icon: 'file-image', permission: 'M_banner' }
-          },
-          {
-            path: '/videoSetting',
-            redirect: '/videoSetting/list',
-            name: 'videoSetting',
-            component: RouteView,
-            meta: { title: '生意经设置', icon: 'interaction', permission: 'M_shengyijing' },
-            hideChildrenInMenu: true,
-            children: [
-              {
-                path: '/videoSetting/list',
-                name: 'videoSetting_list',
-                component: () => import(/* webpackChunkName: "appSetting" */ '@/views/appSetting/videoSetting.vue'),
-                meta: { title: '生意经设置', icon: 'interaction', permission: 'M_shengyijing' }
-              },
-              {
-                path: '/videoSetting/add',
-                name: 'videoSetting_add',
-                component: () => import(/* webpackChunkName: "appSetting" */ '@/views/appSetting/addVideoSetting.vue'),
-                meta: { title: '增加', icon: 'crown', hidden: true }
-              },
-              {
-				  path: '/videoSetting/edit',
-				  name: 'videoSetting_edit',
-				  hideChildrenInMenu: true,
-				  component: () => import(/* webpackChunkName: "appSetting" */ '@/views/appSetting/addVideoSetting.vue'),
-				  meta: { title: '编辑', icon: 'crown', hidden: true }
-              },
-              {
-                path: '/videoSetting/detail',
-                name: 'videoSetting_detail',
-                component: () => import(/* webpackChunkName: "appSetting" */ '@/views/appSetting/showVideoSetting.vue'),
-                meta: { title: '查看详情', icon: 'crown', hidden: true }
-              }
-            ]
-          },
-          {
-            path: '/editionSetting',
-            redirect: '/editionSetting/list',
-            name: 'editionSetting',
-            component: RouteView,
-            meta: { title: '版本设置', icon: 'info-circle', permission: 'M_banben' },
-            hideChildrenInMenu: true,
-            children: [
-              {
-                path: '/editionSetting/list',
-                name: 'editionSetting_list',
-                component: () => import(/* webpackChunkName: "appSetting" */ '@/views/appSetting/editionSetting.vue'),
-                meta: { title: '版本设置列表', icon: 'interaction', permission: 'M_banben' }
-              },
-              {
-                path: '/editionSetting/add',
-                name: 'editionSetting_add',
-                component: () => import(/* webpackChunkName: "appSetting" */ '@/views/appSetting/addEditionSetting.vue'),
-                meta: { title: '增加', icon: 'crown', hidden: true }
-              }
-            ]
-          }
-        ]
-
-      },
-      {
-        path: '/menusAuth',
-        redirect: '/bnSetting/menusAuth',
-        component: PageView,
-        meta: { title: '菜单管理', icon: 'bars', permission: 'M_menusAuth_0' },
-        children: [
-          {
-            path: '/menusAuth/storeMenus',
-            name: 'storeMenus',
-            component: () => import(/* webpackChunkName: "bnSetting" */ '@/views/bnSetting/menu/storeMenus.vue'),
-            meta: { title: '门店菜单管理', icon: 'shop', permission: 'M_menusAuth_storeMenus' }
-          },
-          {
-            path: '/menusAuth/adminMenus',
-            name: 'adminMenus',
-            component: () => import(/* webpackChunkName: "bnSetting" */ '@/views/bnSetting/menu/adminMenus.vue'),
-            meta: { title: '运营菜单管理', icon: 'appstore', permission: 'M_menusAuth_adminMenus' }
-          },
-          {
-            path: '/menusAuth/menu',
-            name: 'powerMenu',
-            component: () => import(/* webpackChunkName: "auth" */ '@/views/power/menu/menu.vue'),
-            meta: { title: 'IT菜单管理', icon: 'profile', permission: 'M_menusAuth_menu' }
-          }
-        ]
-      },
-      // auth
-      {
-        path: '/auth',
-        redirect: '/auth/userList',
-        component: PageView,
-        meta: { title: 'IT权限管理', icon: 'lock', permission: 'M_auth_0' },
-        children: [
-          {
-            path: '/auth/userList',
-            name: 'powerUserList',
-            component: () => import(/* webpackChunkName: "auth" */ '@/views/power/user/userList.vue'),
-            meta: { title: '用户管理', icon: 'user', permission: 'M_auth_userList' }
-          },
-          {
-            path: '/auth/roleList',
-            name: 'powerRoleList',
-            component: () => import(/* webpackChunkName: "auth" */ '@/views/power/role/roleList.vue'),
-            meta: { title: '角色管理', icon: 'solution', permission: 'M_auth_roleList' }
-          }
-        ]
-      },
-      // setting
-	  {
-	  	path: '/notice',
-	  	redirect: '/notice/noticeList',
-	  	component: PageView,
-	  	meta: { title: '系统通知', icon: 'bell', permission: 'M_noticeList' },
-	  	children: [
-	  		{
-	  		  path: '/notice/noticeList',
-	  		  name: 'noticeList',
-	  		  component: () => import(/* webpackChunkName: "setting" */ '@/views/notice/noticeList.vue'),
-	  		  meta: { title: '系统通知', icon: 'bell', permission: 'M_noticeList' }
-	  		}
-	  	]
-	  },
-      {
-        path: '/setting',
-        redirect: '/setting/userList',
-        component: PageView,
-        meta: { title: '系统设置', icon: 'setting', permission: 'M_setting_0' },
-        children: [
-          {
-            path: '/setting/dataDictionary',
-            name: 'powerDD',
-            component: () => import(/* webpackChunkName: "setting" */ '@/views/power/dataDictionary/dataDictionary.vue'),
-            meta: { title: '数据字典管理', icon: 'database', permission: 'M_sys_dataDictionary' }
-          },
-          {
-            path: '/setting/register',
-            name: 'powerRegister',
-            component: () => import(/* webpackChunkName: "setting" */ '@/views/power/register/register.vue'),
-            meta: { title: '参数管理', icon: 'key', permission: 'M_sys_register' }
-          },
-          {
-            path: '/setting/jobs',
-            name: 'powerJobs',
-            component: () => import(/* webpackChunkName: "setting" */ '@/views/power/job/jobs.vue'),
-            meta: { title: '定时器', icon: 'alert', permission: 'M_sys_job' }
-          }
-        ]
+        path: '/menusAuth/storeMenus',
+        name: 'storeMenus',
+        component: () => import(/* webpackChunkName: "bnSetting" */ '@/views/bnSetting/menu/storeMenus.vue'),
+        meta: {
+          title: '发券中心菜单管理',
+          icon: 'control',
+          permission: 'M_auth_fqMenu'
+        }
       }
     ]
+  },
+  {
+    path: '/auth',
+    redirect: '/auth/userList',
+    component: PageView,
+    meta: {
+      title: '运营平台权限管理',
+      icon: 'apartment',
+      permission: 'M_yyAuth_0'
+    },
+    children: [
+      {
+        path: '/auth/userList',
+        name: 'powerUserList',
+        component: () => import(/* webpackChunkName: "auth" */ '@/views/power/user/userList.vue'),
+        meta: {
+          title: '用户管理',
+          icon: 'user',
+          permission: 'M_auth_yyUser'
+        }
+      },
+      {
+        path: '/auth/roleList',
+        name: 'powerRoleList',
+        component: () => import(/* webpackChunkName: "auth" */ '@/views/power/role/roleList.vue'),
+        meta: {
+          title: '角色管理',
+          icon: 'solution',
+          permission: 'M_auth_yyRole'
+        }
+      }
+    ]
   },
   {
-    path: '/preview',
-    name: 'activityPreview',
-    hidden: true,
-    component: () => import('@/views/activity/preview.vue')
-  },
-  {
-    path: '*', redirect: '/404', hidden: true
-  }
-]
-
-/**
- * 基础路由
- * @type { *[] }
- */
-export const constantRouterMap = [
-  {
-    path: '/user',
-    component: UserLayout,
-    redirect: '/user/login',
-    hidden: true,
+    path: '/CardVoucherAuth',
+    redirect: '/CardVoucherAuth/userList',
+    component: PageView,
+    meta: {
+      title: '卡券中心权限管理',
+      icon: 'wallet',
+      permission: 'M_kqAuth_0'
+    },
     children: [
       {
-        path: 'login',
-        name: 'login',
-        component: () => import(/* webpackChunkName: "user" */ '@/views/user/Login')
-      },
-      {
-        path: 'register',
-        name: 'register',
-        component: () => import(/* webpackChunkName: "user" */ '@/views/user/Register')
-      },
-      {
-        path: 'register-result',
-        name: 'registerResult',
-        component: () => import(/* webpackChunkName: "user" */ '@/views/user/RegisterResult')
+        path: '/CardVoucherAuth/userList',
+        name: 'CardUserList',
+        component: () => import(/* webpackChunkName: "CardVoucherAuth" */ '@/views/CardVoucherAuth/user/userList.vue'),
+        meta: {
+          title: '用户管理',
+          icon: 'user',
+          permission: 'M_auth_kqUser'
+        }
       },
       {
-        path: 'recover',
-        name: 'recover',
-        component: undefined
+        path: '/CardVoucherAuth/roleList',
+        name: 'CardRoleList',
+        component: () => import(/* webpackChunkName: "CardVoucherAuth" */ '@/views/CardVoucherAuth/role/roleList.vue'),
+        meta: {
+          title: '角色管理',
+          icon: 'solution',
+          permission: 'M_auth_kqRole'
+        }
       }
     ]
-  },
-  {
-    path: '/404',
-    component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404')
-  }
-
+  },
+  {
+    path: '/CardSendAuth',
+    redirect: '/CardSendAuth/userList',
+    component: PageView,
+    meta: {
+      title: '发券中心权限管理',
+      icon: 'gift',
+      permission: 'M_fqAuth_0'
+    },
+    children: [
+      {
+        path: '/CouponSendAuth/userList',
+        name: 'CouponSendUserList',
+        component: () => import(/* webpackChunkName: "CardVoucherAuth" */ '@/views/CouponSendAuth/user/userList.vue'),
+        meta: {
+          title: '员工信息',
+          icon: 'user',
+          permission: 'M_auth_fqEmployee'
+        }
+      },
+      {
+        path: '/CouponSendAuth/roleList',
+        name: 'CouponSendRoleList',
+        component: () => import(/* webpackChunkName: "CardVoucherAuth" */ '@/views/CouponSendAuth/role/roleList.vue'),
+        meta: {
+          title: '角色管理',
+          icon: 'solution',
+          permission: 'M_auth_fqRole'
+        }
+      }
+    ]
+  },
+  {
+    path: '/setting',
+    redirect: '/setting/userList',
+    component: PageView,
+    meta: {
+      title: '系统设置',
+      icon: 'setting',
+      permission: 'M_setting_0'
+    },
+    children: [{
+      path: '/setting/dataDictionary',
+      name: 'powerDD',
+      component: () => import(/* webpackChunkName: "setting" */
+        '@/views/power/dataDictionary/dataDictionary.vue'),
+      meta: {
+        title: '数据字典管理',
+        icon: 'database',
+        permission: 'M_sys_dataDictionary'
+      }
+    }
+      // 暂时屏蔽,后期可能需要
+      // {
+      //   path: '/setting/register',
+      //   name: 'powerRegister',
+      //   component: () => import( /* webpackChunkName: "setting" */ '@/views/power/register/register.vue'),
+      //   meta: {
+      //     title: '参数管理',
+      //     icon: 'key'
+      //     // permission: 'M_sys_register'
+      //   }
+      // },
+      // 暂时屏蔽,后期可能需要
+      // {
+      //   path: '/setting/jobs',
+      //   name: 'powerJobs',
+      //   component: () => import( /* webpackChunkName: "setting" */ '@/views/power/job/jobs.vue'),
+      //   meta: {
+      //     title: '定时器',
+      //     icon: 'alert'
+      //     // permission: 'M_sys_job'
+      //   }
+      // }
+    ]
+  }
+  ]
+},
+{
+  path: '*',
+  redirect: '/404',
+  hidden: true
+}
+]
+
+/**
+ * 基础路由
+ * @type { *[] }
+ */
+export const constantRouterMap = [{
+  path: '/user',
+  component: UserLayout,
+  redirect: '/user/login',
+  hidden: true,
+  children: [{
+    path: 'login',
+    name: 'login',
+    component: () => import(/* webpackChunkName: "user" */ '@/views/user/Login')
+  },
+  {
+    path: 'register',
+    name: 'register',
+    component: () => import(/* webpackChunkName: "user" */ '@/views/user/Register')
+  },
+  {
+    path: 'register-result',
+    name: 'registerResult',
+    component: () => import(/* webpackChunkName: "user" */ '@/views/user/RegisterResult')
+  },
+  {
+    path: 'recover',
+    name: 'recover',
+    component: undefined
+  }
+  ]
+},
+{
+  path: '/404',
+  component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404')
+}
+
 ]

+ 1 - 1
src/core/bootstrap.js

@@ -16,7 +16,7 @@ import {
 import config from '@/config/defaultSettings'
 
 export default function Initializer () {
-  console.log(`API_URL: ${process.env.VUE_APP_API_BASE_URL}`)
+  // console.log(`API_URL: ${process.env.VUE_APP_API_BASE_URL}`)
 
   store.commit('SET_SIDEBAR_TYPE', Vue.ls.get(SIDEBAR_TYPE, true))
   store.commit('TOGGLE_THEME', Vue.ls.get(DEFAULT_THEME, config.navTheme))

+ 65 - 0
src/libs/getDate.js

@@ -0,0 +1,65 @@
+// 引入 moment 时间插件
+import moment from "moment";
+//获取今日/昨日/本周/上周/本月/上月 时间
+export default {
+    // 获取今日的开始结束时间
+    getToday() {
+        let obj = {
+            starttime: '',
+            endtime: ''
+        }
+        obj.starttime = moment(moment().startOf("day").valueOf()).format("YYYY-MM-DD");
+        obj.endtime = moment(moment().valueOf()).format("YYYY-MM-DD");
+        return obj
+    },
+    // 获取昨日的开始结束时间
+    getYesterday() {
+        let obj = {
+            starttime: '',
+            endtime: ''
+        }
+        obj.starttime = moment(moment().add(-1, 'days').startOf("day").valueOf()).format("YYYY-MM-DD");
+        obj.endtime = moment(moment().add(-1, 'days').endOf('day').valueOf()).format('YYYY-MM-DD');
+        return obj
+    },
+    // 获取当前周的开始结束时间
+    getCurrWeekDays() {
+        let obj = {
+            starttime: '',
+            endtime: ''
+        }
+        obj.starttime = moment(moment().week(moment().week()).startOf('week').add(1, 'days').valueOf()).format('YYYY-MM-DD')
+        obj.endtime = moment(moment().week(moment().week()).endOf('week').add(1, 'days').valueOf()).format('YYYY-MM-DD');
+        return obj
+    },
+    // 获取上一周的开始结束时间
+    getLastWeekDays() {
+        let obj = {
+            starttime: '',
+            endtime: ''
+        }
+        obj.starttime = moment(moment().week(moment().week() - 1).startOf('week').add(1, 'days').valueOf()).format('YYYY-MM-DD')
+        obj.endtime = moment(moment().week(moment().week() - 1).endOf('week').add(1, 'days').valueOf()).format('YYYY-MM-DD');
+        return obj
+    },
+    // 获取当前月的开始结束时间
+    getCurrMonthDays() {
+        let obj = {
+            starttime: '',
+            endtime: ''
+        }
+        obj.starttime = moment(moment().month(moment().month()).startOf('month').valueOf()).format('YYYY-MM-DD');
+        obj.endtime = moment(moment().month(moment().month()).endOf('month').valueOf()).format('YYYY-MM-DD');
+        return obj
+    },
+    // 获取上一个月的开始结束时间
+    getLastMonthDays() {
+        let obj = {
+            starttime: '',
+            endtime: ''
+        }
+        obj.starttime = moment(moment().month(moment().month() - 1).startOf('month').valueOf()).format('YYYY-MM-DD');
+        obj.endtime = moment(moment().month(moment().month() - 1).endOf('month').valueOf()).format('YYYY-MM-DD');
+        return obj
+    }
+}

+ 3 - 3
src/permission.js

@@ -27,7 +27,7 @@ router.beforeEach((to, from, next) => {
       NProgress.done()
     } else {
       const userInfo = Vue.ls.get('userName')
-      console.log(userInfo)
+      // console.log(userInfo)
       if (userInfo) {
         store.dispatch('SetInfo', userInfo)
       } else {
@@ -35,13 +35,13 @@ router.beforeEach((to, from, next) => {
           next({ path: '/user/login', query: { redirect: to.fullPath } })
         })
       }
-      console.log(store.getters.roles)
+      // console.log(store.getters.roles)
       if (store.getters.roles.permissionList.length === 0) {
         store
           .dispatch('GetInfo', token)
           .then(res => {
             const roles = res
-            console.log(roles, 'roles')
+            // console.log(roles, 'roles')
             if (roles.permissionList.length == 0 || !roles) {
               store.dispatch('Logout').then(() => {
                 store.dispatch('ResetRoutes').then(() => {

+ 14 - 20
src/store/modules/user.js

@@ -39,28 +39,22 @@ const user = {
     Login ({ commit }, userInfo) {
       console.log(userInfo, 'userInfo----')
       return new Promise((resolve, reject) => {
-        login(userInfo).then(ret => {
-          console.log(ret, 'login success')
-          if (ret.status == 200) {
-            const res = ret.data
-            if (res.access_token && res.auth_user) {
-              const users = res.auth_user
-              Vue.ls.set('hasError', 0)
-              commit('SET_TOKEN', res.access_token)
-              commit('SET_NAME', { name: users.userNameCN, welcome: welcome() })
-              Vue.ls.set('rolesAccess', { permissionList: users.permCodes }, 7 * 24 * 60 * 60 * 1000)
-              commit('SET_AVATAR', res.avatar ? res.avatar : '')
-              // 记住密码
-              if (userInfo.rememberMe) {
-                VueCookies.set('REMEMBER_ME', JSON.stringify(userInfo))
-              } else {
-                VueCookies.remove('REMEMBER_ME')
-              }
+        login(userInfo).then(res => {
+          console.log(res, 'login success')
+          if (res.userid) {
+            Vue.ls.set('hasError', 0)
+            commit('SET_TOKEN', res.userid)
+            commit('SET_NAME', { name: res.userNameCN, welcome: welcome() })
+            commit('SET_AVATAR', res.avatar ? res.avatar : '')
+            Vue.ls.set('rolesAccess', { permissionList: res.permCodes }, 7 * 24 * 60 * 60 * 1000)
+            // 记住密码
+            if (userInfo.rememberMe) {
+              VueCookies.set('REMEMBER_ME', JSON.stringify(userInfo))
+            } else {
+              VueCookies.remove('REMEMBER_ME')
             }
-            resolve(res)
-          } else {
-            reject(ret)
           }
+          resolve()
         }).catch(error => {
           reject(error)
         })

+ 1 - 1
src/utils/domUtil.js

@@ -16,4 +16,4 @@ export const setDocumentTitle = function (title) {
   }
 }
 
-export const domTitle = '章鱼车管家IT后台系统'
+export const domTitle = '洗车机运营管理平台'

+ 31 - 27
src/utils/request.js

@@ -1,11 +1,10 @@
-// import Vue from 'vue'
+import Vue from 'vue'
 import axios from 'axios'
 import store from '@/store'
 import notification from 'ant-design-vue/es/notification'
-import modal from 'ant-design-vue/es/modal'
 import { VueAxios } from './axios'
-// import { ACCESS_TOKEN } from '@/store/mutation-types'
-// console.log(process.env.VUE_APP_PRO_NAME)
+import { ACCESS_TOKEN } from '@/store/mutation-types'
+console.log(process.env.VUE_APP_PRO_NAME)
 // 创建 axios 实例
 const service = axios.create({
   baseURL: process.env.VUE_APP_API_BASE_URL, // api base_url
@@ -13,15 +12,19 @@ const service = axios.create({
 })
 
 const err = (error) => {
-  console.log(error.response.data.message, 'error')
   if (error.response) {
-    const status = error.response.status
-    if ((status == 503 || status == 500) && window.location.pathname != '/user/login') {
+    const data = error.response.data
+    if ((error.response.status == 403 || error.response.status == 401) && window.location.pathname != '/user/login') {
       notification.destroy()
       notification.error({
         message: '提示',
-        description: error.response.data.message
+        description: data.message
       })
+      setTimeout(function () {
+        store.dispatch('Logout').then(() => {
+          window.location.reload()
+        })
+      }, 2000)
     }
   }
   // 超时无法访问服务
@@ -29,41 +32,42 @@ const err = (error) => {
     notification.destroy()
     notification.error({
       message: '提示',
-      description: '请求超时'
+      description: error.message
     })
+    setTimeout(function () {
+      store.dispatch('Logout').then(() => {
+        window.location.reload()
+      })
+    }, 2000)
   }
   return Promise.reject(error)
 }
 
 // request interceptor
 service.interceptors.request.use(config => {
-  const token = store.getters.token
-  config.headers['App-Type'] = 9 // 平台类型
+  const token = Vue.ls.get(ACCESS_TOKEN)
   if (token) {
-    config.headers['authorization'] = token // 让每个请求携带自定义 token 请根据实际情况自行修改
+    // config.headers['Access-Token'] = token // 让每个请求携带自定义 token 请根据实际情况自行修改
   }
   return config
 }, err)
 
 // response interceptor
 service.interceptors.response.use((response) => {
-  console.log(response, 'response.data.status')
-  const et = sessionStorage.getItem('errorTips')
-  if (response.data.status == '1001' && !et) {
-    sessionStorage.setItem('errorTips', 1)
-    modal.destroyAll()
-    modal.error({
-      title: '提示',
-      content: response.data.message,
-      onOk () {
-        sessionStorage.setItem('errorTips', 0)
-        store.dispatch('Logout').then(() => {
-          window.location.reload()
-        })
-      }
+  console.log(response, 'responseresponseresponse')
+  if (response.data.status == '-1') {
+    notification.destroy()
+    notification.error({
+      message: '提示',
+      description: response.data.message
     })
+    setTimeout(function () {
+      store.dispatch('Logout').then(() => {
+        window.location.reload()
+      })
+    }, 2000)
   }
-  if ((response.data.status == '401' || response.data.status == '900' || response.data.status == '500') && window.location.pathname != '/user/login') {
+  if ((response.data.status == '900') && window.location.pathname != '/user/login') {
     notification.destroy()
     notification.error({
       message: '提示',

+ 770 - 0
src/views/CarWashManagement/AddCarWashModal.vue

@@ -0,0 +1,770 @@
+<template>
+  <a-modal
+    class="CarWashModal"
+    :title="pageType == 'add' ? '新增' : pageType == 'edit' ? '编辑' : ''"
+    :width="1000"
+    :footer="null"
+    :destroyOnClose="true"
+    @cancel="isShow = false"
+    v-model="isShow"
+  >
+    <!-- 表单 -->
+    <a-form-model ref="ruleForm" :model="form" :rules="rules" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
+      <a-row :gutter="20">
+        <a-row>
+          <a-col :span="12">
+            <a-form-model-item label="网点名称" prop="name"><a-input v-model.trim="form.name" :maxLength="20" placeholder="请输入网店名称,20个字以内" /></a-form-model-item>
+            <a-form-model-item label="地址" class="default-form-item form-item-required">
+              <a-row :gutter="20">
+                <a-col :span="8">
+                  <a-form-model-item prop="addrProvince">
+                    <a-select v-model="form.addrProvince" placeholder="请选择省" @change="getCityList">
+                      <a-select-option v-for="item in addrProvinceList" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+                    </a-select>
+                  </a-form-model-item>
+                </a-col>
+                <a-col :span="8">
+                  <a-form-model-item prop="addrCity">
+                    <a-select v-model="form.addrCity" placeholder="请选择市" @change="getAreaList">
+                      <a-select-option v-for="item in addrCityList" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+                    </a-select>
+                  </a-form-model-item>
+                </a-col>
+                <a-col :span="8">
+                  <a-form-model-item prop="addrDistrict">
+                    <a-select v-model="form.addrDistrict" placeholder="请选择区" @change="areaCharged">
+                      <a-select-option v-for="item in addrDistrictList" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+                    </a-select>
+                  </a-form-model-item>
+                </a-col>
+              </a-row>
+            </a-form-model-item>
+          </a-col>
+          <a-col :span="12">
+            <a-form-model-item label="网点照片" prop="icon" class="default-form-item">
+              <a-row>
+                <a-col :span="8">
+                  <Upload
+                    ref="showPicture"
+                    :fileSize="5"
+                    :maxNums="1"
+                    @change="pictureChange"
+                    listType="picture-card"
+                    upText="上传图片"></Upload>
+                </a-col>
+                <a-col :span="16"><p class="pic-remarks">(尺寸为100*100px)</p></a-col>
+              </a-row>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+        <a-col :span="24">
+          <a-form-model-item label="详细地址" prop="addrDetail" :label-col="{ span: 3 }" :wrapper-col="{ span: 21 }">
+            <a-input v-model.trim="form.addrDetail" :maxLength="32" placeholder="请输入详细地址,32个字以内" />
+          </a-form-model-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-model-item label="设备ID" prop="deviceDTOList" class="default-form-item">
+            <a-row :gutter="20">
+              <a-col :span="19">
+                <a-tag v-if="form.deviceDTOList.length > 0" color="blue">{{ deviceNo }}</a-tag>
+              </a-col>
+              <a-col :span="5">
+                <a-button type="primary" size="small" class="small-btn" v-if="pageType != 'edit'" @click="openEquipmentModal = true">选择</a-button>
+              </a-col>
+            </a-row>
+          </a-form-model-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-model-item label="网点标签" prop="featuredServiceLabel" :rules="{ required: true, message: '请选择网点标签', trigger: 'change' }">
+            <v-select
+              ref="featuredServiceLabel"
+              v-model="featuredServiceLabel"
+              @change="featuredServiceLabelChange"
+              mode="multiple"
+              placeholder="请选择网点标签"
+              showArrow
+              code="STORE_LABEL"
+            ></v-select>
+          </a-form-model-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-model-item label="纬度" class="multi-line-tips form-item-required">
+            <a-row :gutter="20">
+              <a-col :span="17">
+                <a-form-model-item prop="lat" class="default-form-item">
+                  <a-input-number v-model="form.lat" :min="-90" :max="90" placeholder="请输入纬度坐标" class="input-number-all" />
+                </a-form-model-item>
+              </a-col>
+              <a-col :span="6">
+                <a href="https://lbs.qq.com/tool/getpoint/" target="_blank">
+                  <a-button type="primary" size="small" icon="search" class="small-btn">查询坐标</a-button>
+                </a>
+              </a-col>
+            </a-row>
+          </a-form-model-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-model-item label="经度" prop="lng" class="multi-line-tips">
+            <a-input-number v-model="form.lng" :min="-180" :max="180" placeholder="请输入经度坐标" class="input-number-all" />
+          </a-form-model-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-model-item label="服务类型" prop="serviceType">
+            <a-select v-model="form.serviceType" placeholder="请选择服务类型" @change="isResetstoreItemPriceDTOList('serviceType', $event)" showArrow mode="multiple">
+              <a-select-option v-for="item in itemQueryList" :key="item.id" :value="item.id">{{ item.itemName }}</a-select-option>
+            </a-select>
+          </a-form-model-item>
+        </a-col>
+        <a-col :span="12">
+          <a-form-model-item label="营业时间" class="default-form-item form-item-required">
+            <a-row :gutter="20">
+              <a-col :span="11">
+                <a-form-model-item prop="beginTime">
+                  <a-time-picker
+                    v-model="form.beginTime"
+                    @change="isResetstoreItemPriceDTOList('beginTime', $event)"
+                    format="HH:mm"
+                    placeholder="请选择开始时间"
+                    class="time-picker"
+                  />
+                </a-form-model-item>
+              </a-col>
+              <a-col :span="2">至</a-col>
+              <a-col :span="11">
+                <a-form-model-item prop="endTime">
+                  <a-time-picker
+                    v-model="form.endTime"
+                    @change="isResetstoreItemPriceDTOList('endTime', $event)"
+                    format="HH:mm"
+                    placeholder="请选择结束时间"
+                    class="time-picker"
+                  />
+                </a-form-model-item>
+              </a-col>
+            </a-row>
+          </a-form-model-item>
+        </a-col>
+        <!-- 时段价格设置  start -->
+        <a-col :span="24">
+          <a-form-model-item :label-col="{ span: 3 }" :wrapper-col="{ span: 21 }" prop="storeItemPriceDTOList">
+            <div slot="label" class="form-item-label">
+              <a-tooltip
+                placement="right"
+                arrow-point-at-center
+                title="时段价格是指车主在不同时段洗车需要支付不同的价格,主要用于日间服务和夜间服务的差异化管理,达到调节流量、集客引流的效果。不同时段区间采用起始时间包含,结束时间不包含原则。例如:时段区间为06:00(含)-22:00(不含),普通洗车10元;时间区间为22:00(含)-06:00(不含),普通洗车8元。客户在6点00分01秒普通洗车为10元,客户在22点00分01秒普通洗车为8元。"
+              >
+                时段价格
+                <a-icon :style="{ fontSize: '18px', color: '#1890ff', verticalAlign: 'sub' }" type="question-circle" />
+              </a-tooltip>
+            </div>
+            <a-row :gutter="20" v-for="(item, ind) in form.storeItemPriceDTOList" :key="ind">
+              <a-col :span="9">
+                <a-row :gutter="20">
+                  <a-col :span="11">
+                    <a-form-model-item
+                      :prop="'storeItemPriceDTOList.' + ind + '.beginTime'"
+                      :rules="{ required: true, message: '请选择开始时间', trigger: 'change' }"
+                    >
+                      <a-time-picker v-model="item.beginTime" disabled format="HH:mm" placeholder="请选择" class="time-picker" />
+                    </a-form-model-item>
+                  </a-col>
+                  <a-col :span="2">至</a-col>
+                  <a-col :span="11">
+                    <a-form-model-item
+                      :prop="'storeItemPriceDTOList.' + ind + '.endTime'"
+                      :rules="{ required: true, message: '请选择结束时间', trigger: 'change' }"
+                    >
+                      <a-time-picker
+                        v-model="item.endTime"
+                        :default-open-value="item.beginTime"
+                        @change="isResetBelowstoreItemPriceDTOList($event, ind)"
+                        format="HH:mm"
+                        placeholder="请选择"
+                        class="time-picker"
+                      />
+                    </a-form-model-item>
+                  </a-col>
+                </a-row>
+              </a-col>
+              <a-col :span="14">
+                <a-row :gutter="20">
+                  <a-col :span="8" v-for="(priceItem, subInd) in item.currentPrices" :key="subInd">
+                    <a-form-model-item
+                      :prop="'storeItemPriceDTOList.' + ind + '.currentPrices.' + subInd + '.price'"
+                      :rules="{ required: true, message: `请输入【${priceItem.name}】单价`, trigger: 'blur' }"
+                    >
+                      <a-input-number
+                        v-model="priceItem.price"
+                        :min="0"
+                        :max="999999"
+                        :precision="2"
+                        :placeholder="'【' + priceItem.name + '】单价'"
+                        class="input-number-s"
+                      />
+                      <span class="unit">元</span>
+                    </a-form-model-item>
+                  </a-col>
+                </a-row>
+              </a-col>
+              <a-col :span="1"><a-icon type="delete" title="删除" @click="delstoreItemPriceDTOList(ind)" :style="{ fontSize: '20px', color: 'red' }" /></a-col>
+            </a-row>
+            <a-button type="dashed" @click="setTimeInterval" class="setTimeInterval">
+              <a-icon type="plus" />
+              添加时段
+            </a-button>
+          </a-form-model-item>
+        </a-col>
+        <!-- 时段价格设置  end -->
+        <a-col :span="24">
+          <a-form-model-item label="路线指引" prop="guidance" :label-col="{ span: 3 }" :wrapper-col="{ span: 21 }">
+            <editor ref="editor" @on-change="editorChange" :cache="false" v-model="form.guidance"></editor>
+          </a-form-model-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-model-item label="温馨提示" prop="reminder" :label-col="{ span: 3 }" :wrapper-col="{ span: 21 }">
+            <a-textarea ref="reminder" v-model.trim="form.reminder" :maxLength="128" :auto-size="{ minRows: 3, maxRows: 5 }" placeholder="请输入温馨提示,128个字以内" />
+          </a-form-model-item>
+        </a-col>
+        <a-col :span="24">
+          <a-form-model-item :label-col="{ span: 3 }" :wrapper-col="{ span: 21 }" class="btn-cont">
+            <a-button type="primary" @click="onSubmit">保存</a-button>
+            <a-button class="cancel" @click="cancel">取消</a-button>
+          </a-form-model-item>
+        </a-col>
+      </a-row>
+    </a-form-model>
+
+    <!-- 选择设备 -->
+    <choose-equipment :openEquipmentModal="openEquipmentModal" @close="closeChooseEquipment" />
+  </a-modal>
+</template>
+
+<script>
+import { VSelect, Upload } from '@/components'
+import ChooseEquipment from './ChooseEquipment.vue'
+import Editor from '@/components/WEeditor'
+import moment from 'moment'
+import { getProvince, getCityByPro, getDistrictByCity } from '@/api/lookup'
+import { itemQuery, storeSave, storeFind, findItem } from '@/api/car-wash'
+export default {
+  name: 'AddCarWashModal',
+  components: { VSelect, Upload, Editor, ChooseEquipment },
+  props: {
+    openModal: {
+      //  弹框是否展示
+      type: Boolean,
+      default: false
+    },
+    pageType: {
+      //  页面类型
+      type: String,
+      default: ''
+    },
+    carWashId: {
+      //  网点id
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  弹框是否展示
+      form: {
+        icon: '', //  网点照片
+        name: '', //  网点名称
+        addrProvince: undefined, //  省  编码
+        addrProvinceName: '', //  省
+        addrCity: undefined, //  市  编码
+        addrCityName: '', //  市
+        addrDistrict: undefined, //  区  编码
+        addrDistrictName: '', //  区
+        addrDetail: '', //  详细地址
+        deviceDTOList: [], //  设备序列号
+        featuredServiceLabel: '', //  网点标签
+        lng: '', //  经度
+        lat: '', //  纬度
+        serviceType: [], //  服务类型
+        beginTime: null, //  营业时间开始时间
+        endTime: null, //  营业时间结束时间
+        storeItemPriceDTOList: [], //  时段价格
+        guidance: '', //  路线指引
+        reminder: '' //  温馨提示
+      },
+      rules: {
+        icon: [{ required: true, message: '请选择网店照片', trigger: 'change' }],
+        name: [{ required: true, message: '请输入网店名称', trigger: 'blur' }],
+        addrProvince: [{ required: true, message: '请选择所在省份', trigger: 'change' }],
+        addrCity: [{ required: true, message: '请选择所在市', trigger: 'change' }],
+        addrDistrict: [{ required: true, message: '请选择所在区县', trigger: 'change' }],
+        addrDetail: [{ required: true, message: '请输入详细地址', trigger: 'blur' }],
+        deviceDTOList: [{ required: true, message: '请选择设备', trigger: 'change' }],
+        lng: [
+          {
+            required: true,
+            pattern: /^[\\-\\+]?(0?\d{1,2}\.\d{1,8}|1[0-7]?\d{1}\.\d{1,8}|180\.0{1,8})$/,
+            message: '请输入正确的经度,整数部分为0~180,必须输入1到8位小数',
+            trigger: 'blur'
+          }
+        ],
+        lat: [
+          { required: true, pattern: /^[\\-\\+]?([0-8]?\d{1}\.\d{1,8}|90\.0{1,8})$/, message: '请输入正确的纬度,整数部分为0~90,必须输入1到8位小数', trigger: 'blur' }
+        ],
+        serviceType: [{ required: true, message: '请选择服务类型', trigger: 'change' }],
+        beginTime: [{ required: true, message: '请选择开始时间', trigger: 'change' }],
+        endTime: [{ required: true, message: '请选择结束时间', trigger: 'change' }],
+        storeItemPriceDTOList: [{ required: true, message: '请设置时段价格', trigger: 'change' }]
+      },
+      openEquipmentModal: false, //  选择设备  弹框展示状态
+      serviceType: [], //  服务类型  change前的值
+      beginTime: null, //  营业时间开始时间  change前的值
+      endTime: null, //  营业时间结束时间  change前的值
+      subendTime: [], //  时段价格  时段区间结束时间  change前的值
+      featuredServiceLabel: [], //  网点标签
+      addrProvinceList: [], //  省列表数据
+      addrCityList: [], //  市列表数据
+      addrDistrictList: [], //  区县列表数据
+      itemQueryList: [], //  服务类型列表数据
+      deviceNo: '' //  已选设备序列号
+    }
+  },
+  methods: {
+    moment,
+    // 文本编辑器  change
+    editorChange (html, text) {
+      this.form.guidance = html
+    },
+    // 网点详情
+    getCarWashInfo (id) {
+      storeFind({ id: id }).then(res => {
+        if (res.status == 200) {
+          // 查询门店的服务时段价格
+          findItem({ id: id }).then(result => {
+            if (result.status == 200) {
+              const carWashInfo = Object.assign(res.data, { storeItemPriceDTOList: result.data })
+              this.setVal(carWashInfo)
+            }
+          })
+        }
+      })
+    },
+    //  表单赋值
+    setVal (item) {
+      const arr = [ 'id', 'icon', 'name', 'addrProvince', 'addrProvinceName', 'addrCityName', 'addrDistrictName', 'featuredServiceLabel', 'lng', 'lat', 'serviceType', 'guidance', 'reminder' ]
+      arr.map(k => { this.form[k] = item[k] })
+      this.$refs.showPicture.setFileList(this.form.icon)
+      this.getCityList(item.addrProvince) //  获取市区下拉数据
+      this.form.addrCity = item.addrCity //  市区赋值
+      this.getAreaList(item.addrCity) //  获取区县下拉数据
+      this.form.addrDistrict = item.addrDistrict //  区县赋值
+      this.form.addrDetail = item.addrDetail //  详细地址赋值
+      this.form.deviceDTOList = [{ id: item.deviceVOList[0].id }] //  设备
+      this.deviceNo = item.deviceVOList[0].deviceNo //  设备序列号
+      this.featuredServiceLabel = item.featuredServiceLabel.split(',') //  网点标签
+      this.form.beginTime = moment(item.beginTime, 'HH:mm') //  营业时间  开始时间
+      this.form.endTime = moment(item.endTime, 'HH:mm') //  营业时间  结束时间
+      this.setPeriodPrice(item.storeItemPriceDTOList) // 时段价格
+      if (this.isShow) {
+        this.$refs.editor.setHtml(item.guidance) //  文本编辑器赋值
+      }
+    },
+    // 时段价格  赋值处理
+    setPeriodPrice (storeItemPriceDTOList) {
+      this.form.storeItemPriceDTOList = []
+      for (let i = 0; i < storeItemPriceDTOList.length; i++) {
+        this.form.storeItemPriceDTOList.push({
+          beginTime: moment(storeItemPriceDTOList[i][0].beginTime, 'HH:mm'),
+          endTime: moment(storeItemPriceDTOList[i][0].endTime, 'HH:mm'),
+          currentPrices: []
+        })
+        this.form.serviceType = []
+        for (let j = 0; j < storeItemPriceDTOList[i].length; j++) {
+          const k = storeItemPriceDTOList[i][j]
+          this.form.storeItemPriceDTOList[i].currentPrices.push({ name: k.itemName, price: k.currentPrice, itemId: k.itemId })
+          this.form.serviceType.push(k.itemId)
+        }
+      }
+    },
+    //  保存
+    onSubmit () {
+      const _this = this
+      _this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const formData = JSON.parse(JSON.stringify(_this.form))
+          //  校验营业时间结束时间是否与时段价格一致
+          const endTime = formData.storeItemPriceDTOList[formData.storeItemPriceDTOList.length - 1].endTime
+          if (_this.timeFormat(formData.endTime) !== _this.timeFormat(endTime)) {
+            _this.$message.error('时段价格与营业时间不一致,请修改后再保存!')
+            return
+          }
+          formData.beginTime = _this.timeFormat(formData.beginTime)
+          formData.endTime = _this.timeFormat(formData.endTime)
+          const arr = []
+          formData.storeItemPriceDTOList.map(item => {
+            item.currentPrices.map(k => {
+              arr.push({
+                beginTime: _this.timeFormat(item.beginTime),
+                endTime: _this.timeFormat(item.endTime),
+                itemId: k.itemId,
+                name: k.name,
+                currentPrice: k.price
+              })
+            })
+          })
+          formData.storeItemPriceDTOList = arr
+          //  提交前时间格式还需转换
+          delete formData.serviceType
+          storeSave(formData).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.$emit('success')
+            } else {
+              _this.$message.error(res.message)
+            }
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    // 时间格式转换
+    timeFormat (time) {
+      const dateTime = new Date(time)
+      const hour = dateTime.getHours()
+      const minute = dateTime.getMinutes()
+      const timeStr = this.addZero(hour) + ':' + this.addZero(minute)
+      return timeStr
+    },
+    // 时间0补位
+    addZero (v) {
+      return v < 10 ? '0' + v : v
+    },
+    // 取消
+    cancel () {
+      this.resetForm()
+      this.isShow = false
+    },
+    // 重置表单数据
+    resetForm () {
+      this.serviceType = [] //  服务类型  change前的值
+      this.beginTime = null //  营业时间开始时间  change前的值
+      this.endTime = null //  营业时间结束时间  change前的值
+      this.subendTime = [] //  时段价格  时段区间结束时间  change前的值
+      this.featuredServiceLabel = [] //  网点标签
+      this.deviceNo = '' //  已选设备序列号
+      // this.$refs.ruleForm.resetFields()    //  无效
+      this.form.id = null
+      this.form.icon = ''
+      if (this.$refs.showPicture) {
+        //  网点照片
+        this.$refs.showPicture.setFileList('')
+      }
+      const emptyArr = [ 'name', 'addrProvinceName', 'addrCityName', 'addrDistrictName', 'addrDetail', 'featuredServiceLabel', 'lng', 'lat', 'guidance', 'reminder' ]
+      const undefinedArr = [ 'addrProvince', 'addrCity', 'addrDistrict' ]
+      const array = [ 'deviceDTOList', 'serviceType', 'storeItemPriceDTOList' ]
+      emptyArr.map(item => { this.form[item] = '' })
+      undefinedArr.map(item => { this.form[item] = undefined })
+      array.map(item => { this.form[item] = [] })
+      this.form.beginTime = null //  营业时间开始时间
+      this.form.endTime = null //  营业时间结束时间
+    },
+    // 是否重置时段价格 (更改服务类型、营业开始结束时间)
+    isResetstoreItemPriceDTOList (type, val) {
+      // type: serviceType  服务类型  beginTime  营业时间  开始时间  endTime  营业时间  结束时间
+      const _this = this
+      setTimeout(() => {
+        if (_this.form.storeItemPriceDTOList.length !== 0) {
+          _this.$confirm({
+            title: '提示',
+            content: '更改后已设置的时段价格将会全部清空,确定要更改吗?',
+            onOk () {
+              type === 'serviceType' ? (_this.serviceType = val) : type === 'beginTime' ? (_this.beginTime = val) : (_this.endTime = val)
+              _this.form.storeItemPriceDTOList = []
+            },
+            onCancel () {
+              type === 'serviceType'
+                ? (_this.form.serviceType = _this.serviceType)
+                : type === 'beginTime'
+                  ? (_this.form.beginTime = _this.beginTime)
+                  : (_this.form.endTime = _this.endTime)
+            }
+          })
+        } else {
+          type === 'serviceType' ? (_this.serviceType = val) : type === 'beginTime' ? (_this.beginTime = val) : (_this.endTime = val)
+        }
+      }, 0)
+    },
+    // 是否重置时段价格 (更改时段价格区间结束时间)
+    isResetBelowstoreItemPriceDTOList (val, ind) {
+      const _this = this
+      // 更改已设置过的时段时间(因为有下一个时段的前提是当前时段结束时间已设置)
+      if (this.form.storeItemPriceDTOList[ind + 1]) {
+        _this.$confirm({
+          title: '提示',
+          content: '更改已设置过的时段区间,其之后的时段区间将会被清空,确定要更改吗?',
+          onOk () {
+            _this.subendTime[ind] = val
+            _this.form.storeItemPriceDTOList.splice(ind + 1, _this.form.storeItemPriceDTOList.length - Number(ind + 1))
+          },
+          onCancel () {
+            _this.form.storeItemPriceDTOList[ind].endTime = _this.subendTime[ind]
+          }
+        })
+      } else {
+        _this.subendTime[ind] = val
+      }
+    },
+    //  选择设备
+    closeChooseEquipment (val, no) {
+      if (val) {
+        this.form.deviceDTOList = [{ id: val }]
+        this.deviceNo = no
+      }
+      this.openEquipmentModal = false
+    },
+    // 网点照片  change
+    pictureChange (data) {
+      this.form.icon = data
+    },
+    //  设置时段价格
+    setTimeInterval () {
+      if (this.form.serviceType.length === 0) {
+        this.$message.error('请先选择服务类型')
+        return
+      }
+      if (!this.form.beginTime) {
+        this.$message.error('请先选择营业时间开始时间')
+        return
+      }
+      if (!this.form.endTime) {
+        this.$message.error('请先选择营业时间结束时间')
+        return
+      }
+      const arr = {}
+      // 时段价格开始时间
+      let timeStr = ''
+      if (this.form.storeItemPriceDTOList.length === 0) {
+        timeStr = this.form.beginTime.format('HH:mm')
+      } else {
+        timeStr = this.form.storeItemPriceDTOList[this.form.storeItemPriceDTOList.length - 1].endTime
+        if (!timeStr) {
+          this.$message.error('请先选择时段价格 - 第' + this.form.storeItemPriceDTOList.length + '个时段的结束时间')
+          return
+        }
+      }
+      arr.beginTime = moment(timeStr, 'HH:mm')
+      arr.endTime = null
+      arr.currentPrices = []
+      this.form.serviceType.map((item, index) => {
+        const i = this.itemQueryList.findIndex(k => Number(k.id) === Number(item))
+        arr.currentPrices.push({ name: this.itemQueryList[i].itemName, price: '', itemId: item })
+      })
+      this.form.storeItemPriceDTOList.push(arr)
+    },
+    // 删除时段价格
+    delstoreItemPriceDTOList (ind) {
+      const _this = this
+      const msg = Number(ind + 1) === _this.form.storeItemPriceDTOList.length ? '确定要删除该时段吗?' : '确定要删除该时段以及其之后已设置的时段吗?'
+      _this.$confirm({
+        title: '提示',
+        content: msg,
+        onOk () {
+          _this.form.storeItemPriceDTOList.splice(ind, _this.form.storeItemPriceDTOList.length - ind)
+        }
+      })
+    },
+    // 网点标签  change
+    featuredServiceLabelChange (val) {
+      this.form.featuredServiceLabel = val.join(',')
+    },
+    // 获取服务类型列表
+    getItemQuery () {
+      itemQuery({
+        pageNo: 1,
+        pageSize: 1000
+      }).then(res => {
+        if (res.status == 200) {
+          this.itemQueryList = res.data.list || []
+        } else {
+          this.itemQueryList = []
+        }
+      })
+    },
+    // 获取省列表
+    getProvinceList () {
+      const _this = this
+      getProvince().then(res => {
+        if (res.status == 200) {
+          _this.addrProvinceList = res.data || []
+        } else {
+          _this.addrProvinceList = []
+        }
+      })
+    },
+    // 获取城市列表
+    getCityList (val) {
+      this.addrCityList = []
+      this.addrDistrictList = []
+      this.form.addrCity = undefined
+      this.form.addrDistrict = undefined
+      this.form.addrDetail = ''
+      if (val == null || val === '') {
+        this.form.addrProvinceName = ''
+      } else {
+        for (let i = 0; i < this.addrProvinceList.length; i++) {
+          if (Number(this.addrProvinceList[i].id) === Number(val)) {
+            this.form.addrProvinceName = this.addrProvinceList[i].name
+            break
+          }
+        }
+        this.getCityListRequest(val)
+      }
+    },
+    getCityListRequest (val) {
+      const _this = this
+      getCityByPro({ id: val }).then(res => {
+        if (res.status == 200) {
+          _this.addrCityList = res.data || []
+        } else {
+          _this.addrCityList = []
+        }
+      })
+    },
+    // 获取区县列表
+    getAreaList (val) {
+      this.addrDistrictList = []
+      this.form.addrDistrict = undefined
+      this.form.addrDetail = ''
+      if (val == null || val === '') {
+        this.form.addrCityName = ''
+      } else {
+        for (let i = 0; i < this.addrCityList.length; i++) {
+          if (Number(this.addrCityList[i].id) === Number(val)) {
+            this.form.addrCityName = this.addrCityList[i].name
+            break
+          }
+        }
+        this.getAreaListRequest(val)
+      }
+    },
+    getAreaListRequest (val) {
+      const _this = this
+      getDistrictByCity({ id: val }).then(res => {
+        if (res.status == 200) {
+          _this.addrDistrictList = res.data || []
+        } else {
+          _this.addrDistrictList = []
+        }
+      })
+    },
+    // 区县变更
+    areaCharged (val) {
+      if (val == null || val === '') {
+        this.form.addrDistrictName = ''
+      } else {
+        for (let i = 0; i < this.addrDistrictList.length; i++) {
+          if (Number(this.addrDistrictList[i].id) === Number(val)) {
+            this.form.addrDistrictName = this.addrDistrictList[i].name
+            break
+          }
+        }
+      }
+      this.form.addrDetail = ''
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (val) {
+      if (!val) {
+        this.$emit('close')
+      } else {
+        this.resetForm() //  重置表单数据
+        this.getProvinceList() //  获取省下拉
+        this.getItemQuery() //  服务类型  列表
+      }
+    },
+    carWashId (newValue, oldValue) {
+      if (newValue && this.isShow) {
+        this.getProvinceList() //  获取省下拉
+        this.getCarWashInfo(newValue)
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+.CarWashModal {
+	.default-form-item {
+		margin-bottom: 0;
+	}
+  .multi-line-tips{
+    height: 79px;
+    margin: 0;
+  }
+	.form-item-label {
+		display: inline-block;
+		cursor: pointer;
+	}
+	.form-item-required {
+		.ant-form-item-label {
+			label:before {
+				display: inline-block;
+				margin-right: 4px;
+				color: #f5222d;
+				font-size: 14px;
+				font-family: SimSun, sans-serif;
+				line-height: 1;
+				content: '*';
+			}
+		}
+	}
+	.pic-remarks {
+		font-size: 12px;
+		color: #f5222d;
+		margin: 55px 0 0;
+	}
+	.small-btn {
+		background-color: #19be6b;
+		font-size: 13px;
+	}
+	.small-btn.ant-btn-primary:focus,
+	.small-btn.ant-btn-primary:hover {
+		background-color: #19be6b;
+	}
+	.time-picker {
+		width: 100%;
+	}
+	.btn-cont {
+		text-align: center;
+		.cancel {
+			margin-left: 10px;
+		}
+	}
+	.setTimeInterval {
+		width: 40%;
+		color: #19be6b;
+	}
+	.input-number-all {
+		width: 100%;
+	}
+	.input-number-s {
+		width: 90%;
+	}
+	.unit {
+		display: inline-block;
+		width: 10%;
+		text-align: right;
+		padding-left: 5px;
+		box-sizing: border-box;
+	}
+	.upload-file .ant-upload.ant-upload-select-picture-card,
+	.upload-file .ant-upload-list-picture-card .ant-upload-list-item {
+		width: 100px;
+		height: 100px;
+	}
+}
+</style>

+ 398 - 0
src/views/CarWashManagement/CarWashManagement.vue

@@ -0,0 +1,398 @@
+<template>
+  <a-card class="CarWashManagement" :bordered="false">
+    <!-- 搜索条件 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="48">
+          <a-col :span="6">
+            <a-form-item class="search-item" label="网点名称">
+              <a-input v-model.trim="queryParam.name" placeholder="请输入网点名称" @pressEnter="$refs.table.refresh(true)" allowClear />
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item class="search-item" label="营业状态">
+              <v-select ref="businessStatus" allowClear placeholder="请选择营业状态" v-model="queryParam.businessStatus" code="STORE_BUSINESS_STATUS"></v-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item class="search-item" label="设备状态">
+              <v-select ref="deviceStatus" allowClear placeholder="请选择设备状态" v-model="queryParam.deviceDTO.deviceStatus" code="DEVICE_STATUS"></v-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item class="search-item" label="省">
+              <a-select v-model="queryParam.addrProvince" placeholder="请选择省" @change="getCityList" allowClear>
+                <a-select-option v-for="item in addrProvinceList" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item class="search-item" label="市">
+              <a-select v-model="queryParam.addrCity" placeholder="请选择市" @change="getAreaList" allowClear>
+                <a-select-option v-for="item in addrCityList" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-button type="primary" class="search-btn" @click="$refs.table.refresh(true)">查询</a-button>
+            <a-button type="" @click="reset">重置</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 新建 -->
+    <div class="table-operator"><a-button type="primary" icon="plus" @click="modalHandle('add')">新建</a-button></div>
+    <!-- 表格列表 -->
+    <s-table
+      ref="table"
+      size="default"
+      rowKey="id"
+      :columns="columns"
+      :data="loadData"
+      bordered>
+      <!-- 营业时间 -->
+      <template slot="businessHours" slot-scope="text, record">
+        {{ record.beginTime.substr(0, 5) + '-' + record.endTime.substr(0, 5) }}
+      </template>
+      <!-- 设备状态 -->
+      <template slot="deviceStatus" slot-scope="text, record">
+        {{ record.deviceStatus ? $refs.deviceStatus.getNameByCode(record.deviceStatus.split(',')[0]) : '-' }}
+      </template>
+      <!-- 营业状态 -->
+      <template slot="businessStatus" slot-scope="text, record">
+        {{ record.businessStatus ? $refs.businessStatus.getNameByCode(record.businessStatus) : '-' }}
+      </template>
+      <!-- 操作 -->
+      <template slot="action" slot-scope="text, record">
+        <a-tooltip placement="left" overlayClassName="btn-cont">
+          <template slot="title">
+            <div class="btn-set-cont">
+              <p class="set-sub-btn normal" @click="setStoreUpdateStatus(record, 'OPEN')" v-if="record.deviceStatus.split(',')[0] != 'PAUSE' && record.businessStatus != 'OPEN'">
+                <a-icon type="check-circle" class="icon" />
+                正常营业
+              </p>
+              <p class="set-sub-btn suspension" @click="setStoreUpdateStatus(record, 'CLOSED')" v-if="record.businessStatus != 'CLOSED'">
+                <a-icon type="pause-circle" class="icon" />
+                暂停营业
+              </p>
+              <p
+                class="set-sub-btn soon"
+                @click="setStoreUpdateStatus(record, 'TO_BE_OPENED')"
+                v-if="record.deviceStatus.split(',')[0] != 'PAUSE' && record.businessStatus != 'TO_BE_OPENED'"
+              >
+                <a-icon type="play-circle" class="icon" />
+                即将开业
+              </p>
+            </div>
+          </template>
+          <a-icon type="setting" title="设置" v-if="record.deviceStatus.split(',')[0] != 'PAUSE'" :style="{ fontSize: '20px', color: '#19be6b', padding: '0 10px' }" />
+        </a-tooltip>
+        <a-icon type="setting" title="设置" v-if="record.deviceStatus.split(',')[0] == 'PAUSE'" @click="tooltipSet" :style="{ fontSize: '20px', color: '#19be6b', padding: '0 10px' }" />
+        <a-icon type="edit" title="编辑" @click="modalHandle('edit', record)" :style="{ fontSize: '20px', color: '#1890FF', padding: '0 10px' }" />
+        <a-icon type="eye" title="查看详情" @click="modalHandle('details', record)" :style="{ fontSize: '20px', color: '#e29e14', padding: '0 10px' }" />
+        <a-icon type="delete" title="删除" @click="deviceValidStatus('del', record)" :style="{ fontSize: '20px', color: 'red', padding: '0 10px' }" />
+        <a-icon type="qrcode" title="查看小程序码" @click="getQrCode(record)" :style="{ fontSize: '20px', color: '#e29e14', padding: '0 10px' }" />
+      </template>
+    </s-table>
+
+    <!-- 新增/编辑 洗车机 -->
+    <add-car-wash-modal :openModal="openModal" :pageType="pageType" :carWashId="carWashId" @success="carWashSubmit" @close="closeModal" />
+    <!-- 查看详情 洗车机 -->
+    <details-car-wash-modal :openModal="openDetailsModal" :carWashId="carWashId" @close="closeDetailsModal" />
+    <!-- 查看小程序码 -->
+    <a-modal
+      class="qrCodeModal"
+      title="查看小程序码"
+      :width="500"
+      :footer="null"
+      :destroyOnClose="true"
+      @cancel="isQrCodeModal = false"
+      v-model="isQrCodeModal">
+      <img :src="qrCode" width="400" height="400" class="qrCode" />
+      <a-button type="primary" class="downQrCode" @click="downloadCode">下载小程序码</a-button>
+    </a-modal>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import AddCarWashModal from './AddCarWashModal.vue'
+import DetailsCarWashModal from './DetailsCarWashModal.vue'
+import { getProvince, getCityByPro } from '@/api/lookup'
+import { storeQuery, storeDel, storeQrCode, storeUpdateStatus, deviceValidStatus } from '@/api/car-wash'
+export default {
+  name: 'CarWashManagement',
+  components: { STable, VSelect, AddCarWashModal, DetailsCarWashModal },
+  data () {
+    return {
+      queryParam: {
+        name: '', //  网点名称
+        businessStatus: '', //  营业状态
+        deviceDTO: { deviceStatus: '' }, //  设备状态
+        addrProvince: undefined, //  省
+        addrCity: undefined //  市
+      },
+      columns: [
+        { title: '创建时间', dataIndex: 'createDate', width: '100', align: 'center' },
+        { title: '设备ID', dataIndex: 'deviceNos', width: '100', align: 'center' },
+        { title: '网点名称', dataIndex: 'name', width: '100', align: 'center' },
+        { title: '省', dataIndex: 'addrProvinceName', width: '100', align: 'center' },
+        { title: '市', dataIndex: 'addrCityName', width: '100', align: 'center' },
+        { title: '地址', dataIndex: 'addrDetail', width: '100', align: 'center' },
+        { title: '营业时间', scopedSlots: { customRender: 'businessHours' }, width: '100', align: 'center' },
+        { title: '设备状态', scopedSlots: { customRender: 'deviceStatus' }, width: '100', align: 'center' },
+        { title: '营业状态', scopedSlots: { customRender: 'businessStatus' }, width: '100', align: 'center' },
+        { title: '操作', scopedSlots: { customRender: 'action' }, width: '265', align: 'center' }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        return storeQuery(Object.assign(parameter, this.queryParam)).then(res => {
+          const no = (res.data.pageNo - 1) * res.data.pageSize
+          for (let i = 0; i < res.data.list.length; i++) {
+            const _item = res.data.list[i]
+            _item.no = no + i + 1
+          }
+          return res.data
+        })
+      },
+      openModal: false, //  新增/编辑 洗车机  弹框展示状态
+      pageType: '', //  新增/编辑 洗车机  页面类型
+      openDetailsModal: false, //  查看详情 洗车机  弹框展示状态
+      addrProvinceList: [], //  省列表数据
+      addrCityList: [], //  市列表数据
+      isQrCodeModal: false, //  查看小程序码   弹框展示状态
+      qrCode: '', //  小程序码
+      carWashId: '' //  网点id
+    }
+  },
+  methods: {
+    //  新建/编辑/查看
+    modalHandle (type, item) {
+      this.pageType = type
+      if (type === 'add') {
+        this.carWashId = ''
+        this.openModal = true
+        this.openDetailsModal = false
+      } else if (type === 'edit') {
+        this.deviceValidStatus('edit', item)
+      } else if (type === 'details') {
+        this.carWashId = String(item.id)
+        this.openDetailsModal = true
+        this.openModal = false
+      }
+    },
+    // 检测设备状态
+    deviceValidStatus (type, item) {
+      deviceValidStatus({ deviceNo: item.deviceNos.split(',')[0] }).then(res => {
+        if (res.status == 200) {
+          if (type === 'edit') {
+            this.carWashId = String(item.id)
+            this.openModal = true
+            this.openDetailsModal = false
+          } else if (type === 'del') {
+            this.del(item)
+          }
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
+    // 新增编辑  提交成功
+    carWashSubmit () {
+      this.$refs.table.refresh(true)
+      this.openModal = false
+    },
+    // 删除
+    del (item) {
+      const _this = this
+      _this.$confirm({
+        title: '提示',
+        content: '确定要删除吗?',
+        onOk () {
+          storeDel({ id: item.id }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.$refs.table.refresh()
+            } else {
+              _this.$message.error(res.message)
+            }
+          })
+        }
+      })
+    },
+    //  重置
+    reset () {
+      this.queryParam = {
+        name: '', //  网点名称
+        businessStatus: '', //  营业状态
+        deviceDTO: { deviceStatus: '' }, //  设备状态
+        addrProvince: undefined, //  省
+        addrCity: undefined //  市
+      }
+      this.addrCityList = []
+      this.$refs.table.refresh(true)
+    },
+    // 查看小程序码
+    getQrCode (item) {
+      storeQrCode({ id: item.id, deviceNo: item.deviceNos.split(',')[0] }).then(res => {
+        if (res.status == 200) {
+          this.qrCode = 'data:image/png;base64,' + res.data
+          this.isQrCodeModal = true
+        } else {
+          this.qrCode = ''
+          this.$message.error(res.message)
+        }
+      })
+    },
+    //  下载小程序码
+    downloadCode () {
+      const link = document.createElement('a')
+      link.href = this.qrCode
+      link.download = 'qrCode.png'
+      link.click()
+    },
+    // 更改网点营业状态
+    setStoreUpdateStatus (item, businessStatus) {
+      storeUpdateStatus({ id: item.id, businessStatus: businessStatus }).then(res => {
+        if (res.status == 200) {
+          this.$message.success(res.message)
+          this.$refs.table.refresh(true)
+        } else {
+          this.$message.success(res.message)
+        }
+      })
+    },
+    //  设置提示
+    tooltipSet () {
+      this.$message.warning('洗车机设备离线(或暂停),暂不能设置营业状态!')
+    },
+    // 获取省列表
+    getProvinceList () {
+      const _this = this
+      getProvince().then(res => {
+        if (res.status == 200) {
+          _this.addrProvinceList = res.data || []
+        } else {
+          _this.addrProvinceList = []
+        }
+      })
+    },
+    // 获取城市列表
+    getCityList (val) {
+      this.addrCityList = []
+      this.queryParam.addrCity = undefined
+      if (val == null || val === '') {
+        this.addrProvinceName = ''
+      } else {
+        for (let i = 0; i < this.addrProvinceList.length; i++) {
+          if (Number(this.addrProvinceList[i].id) === Number(val)) {
+            this.addrProvinceName = this.addrProvinceList[i].name
+            break
+          }
+        }
+        this.getCityListRequest(val)
+      }
+    },
+    getCityListRequest (val) {
+      getCityByPro({ id: val }).then(res => {
+        if (res.status == 200) {
+          this.addrCityList = res.data || []
+        } else {
+          this.addrCityList = []
+        }
+      })
+    },
+    // 获取区县列表
+    getAreaList (val) {
+      if (val == null || val === '') {
+        this.addrCityName = ''
+      } else {
+        for (let i = 0; i < this.addrCityList.length; i++) {
+          if (Number(this.addrCityList[i].id) === Number(val)) {
+            this.addrCityName = this.addrCityList[i].name
+            break
+          }
+        }
+      }
+    },
+    // 新增、编辑 弹框关闭
+    closeModal () {
+      this.carWashId = ''
+      this.openModal = false
+    },
+    // 详情 弹框关闭
+    closeDetailsModal () {
+      this.carWashId = ''
+      this.openDetailsModal = false
+    }
+  },
+  mounted () {
+    //  获取省下拉
+    this.getProvinceList()
+  }
+}
+</script>
+
+<style lang="less">
+.CarWashManagement {
+	.table-page-search-wrapper {
+		.search-btn {
+			margin-right: 10px;
+		}
+	}
+}
+// 查看小程序码  弹框
+.qrCodeModal {
+	.qrCode {
+		display: block;
+		max-width: 100%;
+		margin: 0 auto;
+	}
+	.downQrCode {
+		display: block;
+		margin: 40px auto 30px;
+	}
+}
+.btn-cont {
+	.ant-tooltip-inner {
+		background-color: #fff;
+	}
+	.ant-tooltip-arrow:before {
+		background-color: #fff;
+	}
+	.btn-set-cont {
+		.set-sub-btn {
+			padding: 5px 15px 6px;
+			font-size: 12px;
+			border: 1px dashed #dcdee2;
+			border-radius: 4px;
+			margin: 0;
+			cursor: pointer;
+		}
+		.normal {
+			color: rgb(0, 204, 0);
+			border-color: rgb(0, 204, 0);
+			margin: 7px 0;
+			.icon {
+				margin-right: 5px;
+			}
+		}
+		.suspension {
+			color: rgb(255, 85, 0);
+			border-color: rgb(255, 85, 0);
+			margin: 7px 0;
+			.icon {
+				margin-right: 5px;
+			}
+		}
+		.soon {
+			color: #2d8cf0;
+			border-color: #2d8cf0;
+			margin: 7px 0;
+			.icon {
+				margin-right: 5px;
+			}
+		}
+	}
+}
+</style>

+ 166 - 0
src/views/CarWashManagement/ChooseEquipment.vue

@@ -0,0 +1,166 @@
+<template>
+  <a-modal
+    class="CarWashEquipmentModal"
+    title="选择设备"
+    :width="600"
+    :footer="null"
+    :destroyOnClose="true"
+    @cancel="modalIsShow = false"
+    v-model="modalIsShow">
+    <a-input-search placeholder="请输入设备序列号" enter-button="查询" @search="onSearch" class="input-search" />
+    <a-radio-group v-model="equipment" @change="onChange" class="radio-group">
+      <a-radio :style="radioStyle" v-for="(item, index) in equipmentList" :key="index" :value="item.id" :disabled="item.binding == 1">
+        <div class="radio-group-item">
+          <p class="item-label">{{ item.deviceNo }}</p>
+          <p :class="['item-status', item.binding == 1 ? 'ybind' : '']">{{ item.binding == 0 ? '绑定' : '已绑定' }}</p>
+        </div>
+      </a-radio>
+    </a-radio-group>
+    <!-- 分页 -->
+    <a-pagination
+      class="pagination-s"
+      show-size-changer
+      :current="pageNo"
+      :pageSize.sync="pageSize"
+      :total="total"
+      @showSizeChange="onShowSizeChange"
+      @change="onShowPageChange"
+    />
+  </a-modal>
+</template>
+
+<script>
+import { deviceQuery } from '@/api/car-wash'
+export default {
+  name: 'ChooseEquipment',
+  props: {
+    openEquipmentModal: {
+      //  弹框是否展示
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      modalIsShow: this.openEquipmentModal, //  弹框是否展示
+      searchVal: '', // 查询条件
+      radioStyle: {
+        //  设备选项样式
+        display: 'flex',
+        alignItems: 'center',
+        width: '100%',
+        border: '1px solid #e4e4e4',
+        borderRadius: '6px',
+        padding: '10px 15px',
+        marginTop: '15px'
+      },
+      equipment: null, //  选中的设备 id
+      equipmentNo: '', //  选中的设备   序列号
+      equipmentList: [], //  设备数据列表
+      pageNo: 1, //  页码
+      pageSize: 10, //  每页条数
+      total: 0 //  列表总条数
+    }
+  },
+  methods: {
+    // 设备列表
+    getEquipmentList (pageNo) {
+      if (pageNo) {
+        this.pageNo = pageNo
+      }
+      deviceQuery({
+        pageNo: this.pageNo,
+        pageSize: this.pageSize,
+        deviceNo: this.searchVal
+      }).then(res => {
+        if (res.status == 200) {
+          this.equipmentList = res.data.list || []
+          this.total = res.data.count
+        } else {
+          this.equipmentList = []
+          this.total = 0
+        }
+      })
+    },
+    //  查询
+    onSearch (value) {
+      this.searchVal = value
+      this.getEquipmentList(1)
+    },
+    // 设备  change
+    onChange (e) {
+      const _this = this
+      _this.equipment = e.target.value
+      const i = _this.equipmentList.findIndex(item => Number(item.id) === Number(_this.equipment))
+      _this.equipmentNo = _this.equipmentList[i].deviceNo
+      setTimeout(() => {
+        _this.modalIsShow = false
+      }, 300)
+    },
+    //  页码  change
+    onShowPageChange (page, pageSize) {
+      this.pageNo = page
+      this.getEquipmentList()
+    },
+    //  pageSize 变化的回调
+    onShowSizeChange (current, size) {
+      this.pageSize = size
+      this.getEquipmentList()
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openEquipmentModal (newValue, oldValue) {
+      this.modalIsShow = newValue
+    },
+    //  重定义的弹框状态
+    modalIsShow (val) {
+      if (!val) {
+        this.$emit('close', this.equipment, this.equipmentNo)
+      } else {
+        this.searchVal = ''
+        this.getEquipmentList(1)
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+.CarWashEquipmentModal {
+	.input-search {
+		margin-bottom: 15px;
+	}
+	.radio-group {
+		display: block;
+		width: 100%;
+		.ant-radio-wrapper {
+			.ant-radio {
+				width: 16px;
+			}
+			span:nth-child(2) {
+				width: 100%;
+			}
+		}
+		.radio-group-item {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			.item-label {
+				margin: 0;
+			}
+			.item-status {
+				margin: 0;
+				font-size: 12px;
+				color: #19be6b;
+			}
+			.item-status.ybind {
+				color: #ff9900;
+			}
+		}
+	}
+	.pagination-s {
+		margin-top: 20px;
+	}
+}
+</style>

+ 286 - 0
src/views/CarWashManagement/DetailsCarWashModal.vue

@@ -0,0 +1,286 @@
+<template>
+  <div class="DetailsCarWash">
+    <a-modal
+      class="DetailsCarWashModal"
+      title="查看详情"
+      :width="1000"
+      :footer="null"
+      :destroyOnClose="true"
+      @cancel="isShow=false"
+      v-model="isShow">
+      <v-select v-show="false" ref="featuredServiceLabel" placeholder="请选择网点标签" code="STORE_LABEL"></v-select>
+      <a-row :gutter="20">
+        <a-col :span="12" class="item-cont">
+          <p class="item-label">网点照片:</p>
+          <p class="item-main">
+            <img :src="carWashInfo.icon" width="100" height="100" class="wd-icon" />
+          </p>
+        </a-col>
+        <a-col :span="12" class="item-cont">
+          <p class="item-label">网点名称:</p>
+          <p class="item-main">{{ carWashInfo.name }}</p>
+        </a-col>
+        <a-col :span="12" class="item-cont">
+          <p class="item-label">地址:</p>
+          <p class="item-main">{{ carWashInfo.addrProvinceName }} - {{ carWashInfo.addrCityName }} - {{ carWashInfo.addrDistrictName }}</p>
+        </a-col>
+        <a-col :span="12" class="item-cont">
+          <p class="item-label">详细地址:</p>
+          <p class="item-main">{{ carWashInfo.addrDetail }}</p>
+        </a-col>
+        <a-col :span="12" class="item-cont">
+          <p class="item-label">设备ID:</p>
+          <p class="item-main">
+            <a-tag color="blue" v-if="carWashInfo.deviceVOList">{{ carWashInfo.deviceVOList[0].deviceNo }}</a-tag>
+          </p>
+        </a-col>
+        <a-col :span="12" class="item-cont">
+          <p class="item-label">网点标签:</p>
+          <div class="item-main">
+            <a-tag color="blue" v-for="(item, index) in labelList" :key="index">{{ item }}</a-tag>
+          </div>
+        </a-col>
+        <a-col :span="12" class="item-cont">
+          <p class="item-label">经度:</p>
+          <p class="item-main">{{ carWashInfo.lng }}</p>
+        </a-col>
+        <a-col :span="12" class="item-cont">
+          <p class="item-label">纬度:</p>
+          <p class="item-main">{{ carWashInfo.lat }}</p>
+        </a-col>
+        <a-col :span="12" class="item-cont">
+          <p class="item-label">服务类型:</p>
+          <p class="item-main">
+            <a-tag color="blue" v-for="(item, index) in serviceType" :key="index">{{ item }}</a-tag>
+          </p>
+        </a-col>
+        <a-col :span="12" class="item-cont">
+          <p class="item-label">营业时间:</p>
+          <p class="item-main">{{ carWashInfo.beginTime ? carWashInfo.beginTime.substr(0,5) : null }} - {{ carWashInfo.endTime ? carWashInfo.endTime.substr(0,5) : null }}</p>
+        </a-col>
+        <a-col :span="24" class="item-cont">
+          <p class="item-label">时段价格:</p>
+          <div class="item-main period-price-con">
+            <div class="item-period" v-for="(item, index) in storeItemPriceDTOList" :key="index">
+              <p class="period" :style="{width: 100/(item.currentPrices.length + 1) + '%'}">{{ item.beginTime }} - {{ item.endTime }}</p>
+              <p class="period-price" :style="{width: 100/(item.currentPrices.length + 1) + '%'}" v-for="(subItem, ind) in item.currentPrices" :key="ind">{{ subItem.name }}:<strong class="price">{{ subItem.price }}</strong><span class="price-unit">元</span></p>
+            </div>
+          </div>
+        </a-col>
+        <a-col :span="24" class="item-cont">
+          <p class="item-label">路段指引:</p>
+          <p :class="['item-main', carWashInfo.guidance ? 'guidance-con' : '']" v-html="carWashInfo.guidance"></p>
+        </a-col>
+        <a-col :span="24" class="item-cont">
+          <p class="item-label">温馨提示:</p>
+          <p class="item-main">{{ carWashInfo.reminder }}</p>
+        </a-col>
+        <a-col :span="24" class="item-cont">
+          <p class="item-label">现场照片:</p>
+          <p class="item-main">
+            <img :src="pic" class="small-pic" @click="isPicModal=true" />
+          </p>
+        </a-col>
+        <a-col :span="24" class="btn-cont">
+          <a-button @click="isShow=false">返回列表</a-button>
+        </a-col>
+      </a-row>
+    </a-modal>
+
+    <!-- 查看现场照片 -->
+    <a-modal
+      class="picModal"
+      title="查看现场照片"
+      :width="800"
+      :footer="null"
+      :destroyOnClose="true"
+      @cancel="isPicModal=false"
+      v-model="isPicModal">
+      <img :src="pic" class="pic" />
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { VSelect } from '@/components'
+import { storeFind, findItem, deviceImage, itemQuery } from '@/api/car-wash'
+export default {
+  name: 'DetailsCarWashModal',
+  components: { VSelect },
+  props: {
+    openModal: { //  弹框是否展示
+      type: Boolean,
+      default: false
+    },
+    carWashId: { //  网点id
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  弹框是否展示
+      labelList: [], //  网点标签
+      isPicModal: false, //  现场照片  弹框是否展示
+      pic: '', //  现场照片  路径
+      carWashInfo: {}, //  网点信息
+      serviceType: [], //  服务类型
+      storeItemPriceDTOList: [], //  时段价格
+      itemQueryList: [] //  服务类型  列表数据
+    }
+  },
+  methods: {
+    // 网点详情
+    getCarWashInfo (id) {
+      this.getItemQuery()
+      storeFind({ id: id }).then(res => {
+        if (res.status == 200) {
+          // 查询门店的服务时段价格
+          findItem({ id: id }).then(result => {
+            if (result.status == 200) {
+              this.carWashInfo = Object.assign(res.data, { storeItemPriceDTOList: result.data })
+              // 获取当前设备图片
+              deviceImage({ deviceNo: res.data.deviceVOList[0].deviceNo }).then(results => {
+                if (results.status == 200) {
+                  this.pic = results.data
+                } else {
+                  this.pic = ''
+                }
+              })
+              this.setVal()
+            }
+          })
+        }
+      })
+    },
+    //  赋值
+    setVal () {
+      const _this = this
+      // 网点标签
+      setTimeout(() => {
+        const featuredServiceLabel = this.carWashInfo.featuredServiceLabel.split(',')
+        const arr = []
+        featuredServiceLabel.map(k => {
+          arr.push(_this.$refs.featuredServiceLabel.getNameByCode(k))
+        })
+        _this.labelList = arr
+      }, 0)
+      // 时段价格
+      this.setPeriodPrice(this.carWashInfo.storeItemPriceDTOList)
+    },
+    // 时段价格  赋值处理
+    setPeriodPrice (storeItemPriceDTOList) {
+      this.storeItemPriceDTOList = []
+      for (let i = 0; i < storeItemPriceDTOList.length; i++) {
+        this.storeItemPriceDTOList.push({
+          beginTime: storeItemPriceDTOList[i][0].beginTime,
+          endTime: storeItemPriceDTOList[i][0].endTime,
+          currentPrices: []
+        })
+        this.serviceType = []
+        for (let j = 0; j < storeItemPriceDTOList[i].length; j++) {
+          const k = storeItemPriceDTOList[i][j]
+          this.storeItemPriceDTOList[i].currentPrices.push({ name: k.itemName, price: k.currentPrice, itemId: k.itemId })
+          const ind = this.itemQueryList.findIndex(item => item.id == k.itemId)
+          this.serviceType.push(this.itemQueryList[ind].itemName)
+        }
+      }
+    },
+    // 获取服务类型列表
+    getItemQuery () {
+      itemQuery({
+        pageNo: 1,
+        pageSize: 1000
+      }).then(res => {
+        if (res.status == 200) {
+          this.itemQueryList = res.data.list || []
+        } else {
+          this.itemQueryList = []
+        }
+      })
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (val) {
+      if (!val) {
+        this.$emit('close')
+      }
+    },
+    carWashId (newValue, oldValue) {
+      if (newValue && this.isShow) {
+        this.getCarWashInfo(newValue)
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+  .DetailsCarWashModal{
+    p{
+      margin: 0;
+    }
+    .item-cont{
+      margin-bottom: 24px;
+      display: flex;
+      align-items: center;
+      .item-label{
+        width: 115px;
+        font-size: 14px;
+        color: rgba(0, 0, 0, 0.85);
+        flex-shrink: 0;
+      }
+      .item-main{
+        flex-grow: 1;
+        .wd-icon{
+          display: block;
+        }
+      }
+      .guidance-con{
+        border: 1px dashed #e8e8e8;
+        border-radius: 6px;
+        padding: 20px;
+        img {
+          max-width: 100%;
+        }
+      }
+      .period-price-con{
+        border-bottom: 1px solid #e8e8e8;
+      }
+      .item-period{
+        display: flex;
+        align-items: center;
+        justify-content: space-evenly;
+        flex-grow: 1;
+        border: 1px solid #e8e8e8;
+        border-width: 1px 1px 0;
+        text-align: center;
+        .period, .period-price{
+          padding: 5px 0;
+          border-right: 1px solid #e8e8e8;
+        }
+        .period-price:last-child{
+          border-right: none;
+        }
+      }
+    }
+    .btn-cont{
+      text-align: center;
+    }
+    .small-pic{
+      display: block;
+      cursor: zoom-in;
+      width: 300px;
+    }
+  }
+  .pic{
+    display: block;
+    max-width: 100%;
+    margin: 0 auto;
+  }
+</style>

+ 192 - 0
src/views/CardVoucherAuth/role/menuModal.vue

@@ -0,0 +1,192 @@
+<template>
+  <div>
+    <a-modal class="modalBox" :title="roleName" v-model="isshow" @cancle="cancel">
+      <a-form class="form-box" style="max-height: 600px;" :form="form" @submit="handleSubmit">
+        <a-tree
+          checkable
+          @check="onCheck"
+          @expand="onExpand"
+          :expandedKeys="expandedKeys"
+          :autoExpandParent="autoExpandParent"
+          v-model="checkedKeys"
+          :treeData="treeData"
+        />
+      </a-form>
+      <a-form-item :wrapper-col="{ offset: 15 }">
+        <a-button type="primary" @click="handleSubmit()">
+          保存
+        </a-button>
+        <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()">
+          取消
+        </a-button>
+      </a-form-item>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import { addMenuPower } from '@/api/card-voucher-role.js'
+export default {
+  name: 'RoleModal',
+  components: {
+    STable, VSelect
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    data: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      treeData: [],
+      roleName: '',
+      expandedKeys: [],
+      autoExpandParent: true,
+      checkedKeys: [],
+      checkedData: [],
+      isshow: this.visible,
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'menuModal' }),
+      id: '' // 角色id
+    }
+  },
+  methods: {
+    onExpand (expandedKeys) {
+      // if not set autoExpandParent to false, if children expanded, parent can not collapse.
+      // or, you can remove all expanded children keys.
+      this.expandedKeys = expandedKeys
+      this.autoExpandParent = false
+    },
+    onCheck (checkedKeys, info) {
+      this.checkedData = [...checkedKeys, ...info.halfCheckedKeys]
+      this.checkedKeys = checkedKeys
+    },
+    cancel (e) {
+      this.clear()
+      this.$emit('close')
+    },
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          if (this.checkedData.length == 0) {
+            return this.$message.warning('请先选择菜单')
+          }
+          const arr = this.checkedData.join(',')
+          addMenuPower({ id: this.id, menuIds: arr }).then(res => {
+            if (res.status + '' === '200') {
+              this.$message.success(res.message ? res.message : '保存成功')
+              this.$emit('refresh')
+              setTimeout(function () {
+                _this.cancel()
+              }, 300)
+            } else {
+              // this.$message.error(res.message)
+            }
+          })
+        }
+      })
+    },
+    // 取消
+    handleCancel () {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '确定取消吗?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          _this.clear()
+          _this.cancel()
+        }
+      })
+    },
+    clear () {
+      this.form.resetFields()
+      this.roleName = ''
+      this.id = ''
+      this.checkedKeys = []
+    },
+    findLeaf (data, arr) {
+      for (let i = 0; i < data.length; i++) {
+        const node = data[i]
+        if (node.children) {
+          this.findLeaf(node.children, arr)
+        } else {
+          const hasNode = arr.find(item => {
+            return item == node.id
+          })
+          if (hasNode) {
+            this.checkedKeys.push(node.id)
+          }
+        }
+      }
+    }
+  },
+  mounted () {
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'menuModal' })
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (newValue) {
+        if (this.data) { // 编辑
+          this.treeData = this.data.allMenuList
+          this.id = this.data.role.id
+          this.roleName = '分配权限' + '(' + this.data.role.name + ')'
+          if (this.data.role.menuIds) {
+            const arr = this.data.role.menuIds.split(',')
+            const temp = []
+            arr.map(item => {
+              temp.push(Number(item))
+            })
+            this.checkedData = temp
+            this.expandedKeys = temp
+            // 找出叶子节点
+            this.findLeaf(this.treeData, temp)
+          }
+        }
+      } else {
+        this.cancel()
+      }
+    }
+  }
+}
+</script>
+
+<style >
+  .modalBox{
+  }
+  .ant-modal-footer {
+    display: none;
+  }
+  .form-box {
+    max-height: 600px !important;
+    overflow: auto;
+  }
+  .form-box::-webkit-scrollbar{
+    width: 6px;
+    height: 6px ;
+  }
+
+  .form-box::-webkit-scrollbar-thumb{
+    width: 6px;
+    height: 6px ;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 0 2px #d1d1d1;
+    background: #e4e4e4;
+  }
+</style>

+ 234 - 0
src/views/CardVoucherAuth/role/roleList.vue

@@ -0,0 +1,234 @@
+<template>
+  <a-card :bordered="false">
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="48">
+          <a-col :md="6" :sm="24">
+            <a-form-item label="角色名称">
+              <a-input allowClear v-model.trim="queryParam.name" @pressEnter="$refs.table.refresh(true)" placeholder="请输入角色名称"/>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="24">
+            <a-form-item label="状态">
+              <v-select code="CHECK_ENABLE_STATE" v-model="queryParam.isEnable" allowClear placeholder="请选择状态" ></v-select>
+            </a-form-item>
+          </a-col>
+          <a-col :md="4" :sm="24" class="flex-sp">
+            <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+            <a-button @click="reset">重置</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <a-divider/>
+    <div class="table-operator">
+      <a-button type="primary" icon="plus" @click="openModal">新建</a-button>
+    </div>
+
+    <s-table
+      ref="table"
+      size="default"
+      rowKey="id"
+      :columns="columns"
+      :data="loadData"
+      bordered
+    >
+      <span slot="status" slot-scope="text, record">
+        <a-switch checkedChildren="" unCheckedChildren="" v-model="record.isEnable" @change="changeFlagHandle(text, record)"/>
+      </span>
+
+      <span slot="action" slot-scope="text, record">
+        <template>
+          <a class="action-button menu-text" @click="openMenuModal(record)">菜单权限</a>
+          <a class="action-button" @click="handleEdit(record)">修改</a>
+          <a v-if="!record.isEnable" class="action-button red-text" @click="delect(record)">删除</a>
+        </template>
+      </span>
+    </s-table>
+    <roleModal :visible="showModal" :data="itemData" @refresh="refreshTable" @close="showModal = false"></roleModal>
+    <menuModal :visible="showMenuModal" :data="menuData" @close="showMenuModal = false"></menuModal>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import roleModal from './roleModal.vue'
+import menuModal from './menuModal.vue'
+import { getPowerRoleList, updateEnableStatus, delectRolePower, getMenuList } from '@/api/card-voucher-role.js'
+export default {
+  name: 'RoleList',
+  components: {
+    STable, VSelect, roleModal, menuModal
+  },
+  data () {
+    return {
+      // 查询参数
+      queryParam: {
+        name: '',
+        isEnable: ''
+      },
+      showModal: false,
+      showMenuModal: false,
+      itemData: {}, // 编辑行数据
+      menuData: {},
+      // 表头
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'no',
+          width: '40',
+          align: 'center'
+        },
+        {
+          title: '角色名称',
+          dataIndex: 'name',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '角色描述',
+          dataIndex: 'remarks',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '状态',
+          width: '100',
+          align: 'center',
+          scopedSlots: { customRender: 'status' }
+        },
+        {
+          title: '创建时间',
+          dataIndex: 'createDate',
+          width: '120',
+          align: 'center'
+        },
+        {
+          title: '操作',
+          width: '100',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        return getPowerRoleList(Object.assign(parameter, this.queryParam)).then(res => {
+          const no = (res.data.pageNo - 1) * res.data.pageSize
+          for (let i = 0; i < res.data.list.length; i++) {
+            const _item = res.data.list[i]
+            _item.no = no + i + 1
+            _item.isEnable = _item.isEnable + '' === '1'
+          }
+          return res.data
+        })
+      },
+      optionAlertShow: false
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {
+      // vm.$refs.table.refresh()
+    })
+  },
+  methods: {
+    // 刷新列表
+    refreshTable () {
+      this.$refs.table.refresh(true)
+    },
+    // 新建
+    openModal () {
+      this.showModal = true
+      this.itemData = {}
+    },
+    // 打开分配权限弹窗
+    openMenuModal (row) {
+      this.getMenuList(row.id)
+    },
+    // 获取菜单树列表
+    getMenuList (id) {
+      const _this = this
+      getMenuList({ id: id }).then(res => {
+        if (res.status == 200) {
+          _this.menuData = res.data
+          this.showMenuModal = true
+        }
+      })
+    },
+    //  重置
+    reset () {
+      this.queryParam = {
+        name: '',
+        isEnable: ''
+      }
+      this.$refs.table.refresh(true)
+    },
+    // 删除
+    delect (row) {
+      const _this = this
+      this.$confirm({
+        title: '警告',
+        content: '删除后无法恢复,确认删除?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          delectRolePower({
+            id: row.id
+          }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success('删除成功')
+              _this.$refs.table.refresh()
+            } else {
+              this.$message.error(res.message)
+            }
+          }).catch(() => {
+            _this.$message.success('删除失败, 请稍后重试')
+          })
+        }
+      })
+    },
+    handleEdit (row) {
+      this.showModal = true
+      this.itemData = row
+    },
+    // 修改状态
+    changeFlagHandle (text, record) {
+      const _data = {
+        id: record.id,
+        flag: record.isEnable ? '1' : '0'
+      }
+      updateEnableStatus(_data).then(res => {
+        if (res.status + '' === '200') {
+          this.$message.success('修改成功')
+        } else {
+          record.isEnable = !record.isEnable
+        }
+      })
+    }
+  }
+}
+</script>
+<style scoped>
+  .table-page-search-wrapper .ant-form-inline .ant-form-item{
+    margin-bottom: 0;
+  }
+  .flex-sp{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
+  .action-button{
+    line-height: 40px;
+    white-space: nowrap;
+    padding: 5px 10px;
+    background-color: #1890ff;
+    border-radius: 4px;
+    color: #fff;
+    margin-right: 5px;
+  }
+  .red-text{
+    background-color: red;
+  }
+  .menu-text {
+    background-color: #f90;
+  }
+</style>

+ 172 - 0
src/views/CardVoucherAuth/role/roleModal.vue

@@ -0,0 +1,172 @@
+<template>
+  <div>
+    <a-modal class="modalBox" :title="titleText" v-model="isshow" @cancle="cancel">
+      <a-form :form="form" @submit="handleSubmit">
+        <!-- 用户名称 -->
+        <a-form-item label="角色名称" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input
+            placeholder="请输入角色名称"
+            v-decorator="['formData.name', {
+              initialValue: formData.name,
+              rules: [{ required: true, message: '请输入角色名称!' },{pattern:'^[^<|>]{1,20}$',message:'请输入不含<或>的字符,最多20个字符'}] }]"
+          />
+        </a-form-item>
+
+        <!-- 状态 -->
+        <a-form-item label="状态" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-radio-group
+            name="radioGroup"
+            v-decorator="[
+              'formData.isEnable',
+              {
+                initialValue: formData.isEnable,
+                rules: [{ required: true, message: '请选择状态!' }] },
+            ]"
+          >
+            <a-radio :value="1">启用</a-radio>
+            <a-radio :value="0">禁用</a-radio>
+          </a-radio-group>
+        </a-form-item>
+
+        <a-form-item label="角色描述" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-textarea
+            v-decorator="[
+              'formData.remarks',
+              { initialValue: formData.remarks,
+                rules: [] },
+            ]"
+            style="min-height: 60px;"
+            placeholder=""
+            autosize />
+        </a-form-item>
+
+        <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
+          <a-button type="primary" @click="handleSubmit()">
+            保存
+          </a-button>
+          <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()">
+            取消
+          </a-button>
+        </a-form-item>
+      </a-form>
+
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import { saveRolePower } from '@/api/card-voucher-role.js'
+export default {
+  name: 'RoleModal',
+  components: {
+    STable, VSelect
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    data: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      titleText: '添加角色',
+      isshow: this.visible,
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'roleModal' }),
+      formData: {
+        name: '',
+        isEnable: '', // 活动状态
+        remarks: ''
+      }
+
+    }
+  },
+  methods: {
+    cancel (e) {
+      this.clear()
+      this.$emit('close')
+    },
+
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          saveRolePower(Object.assign(this.formData, values.formData)).then(res => {
+            if (res.status + '' === '200') {
+              this.$message.success(res.message ? res.message : '保存成功')
+              this.$emit('refresh')
+              setTimeout(function () {
+                _this.cancel()
+              }, 300)
+            } else {
+              // this.$message.error(res.message)
+            }
+          })
+        }
+      })
+    },
+    // 取消
+    handleCancel () {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '确定取消吗?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          _this.clear()
+          _this.cancel()
+        }
+      })
+    },
+    clear () {
+      this.form.resetFields()
+      delete this.formData.id
+      this.formData.name = ''
+      this.formData.isEnable = ''
+      this.formData.remarks = ''
+    }
+
+  },
+  mounted () {
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'roleModal' })
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (newValue) {
+        if (this.data.id) { // 编辑
+          this.titleText = '编辑角色'
+          this.formData = Object.assign({}, this.data)
+          delete this.formData.no
+          this.formData.isEnable = Number(this.formData.isEnable)
+        } else {
+          this.titleText = '添加角色'
+        }
+      } else {
+        this.cancel()
+      }
+    }
+  }
+}
+</script>
+
+<style >
+  .modalBox{
+  }
+  .ant-modal-footer {
+    display: none;
+  }
+</style>

+ 254 - 0
src/views/CardVoucherAuth/user/userList.vue

@@ -0,0 +1,254 @@
+<template>
+  <a-card :bordered="false">
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="48">
+          <a-col :md="6" :sm="24">
+            <a-form-item label="用户名称">
+              <a-input allowClear v-model.trim="queryParam.name" @pressEnter="$refs.table.refresh(true)" placeholder="请输入用户名称"/>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="24">
+            <a-form-item label="手机号码">
+              <a-input allowClear v-model.trim="queryParam.phone" @pressEnter="$refs.table.refresh(true)" placeholder="请输入手机号码"/>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="24">
+            <a-form-item label="状态">
+              <v-select code="CHECK_ENABLE_STATE" v-model="queryParam.loginFlag" allowClear placeholder="请选择状态"></v-select>
+            </a-form-item>
+          </a-col>
+          <a-col :md="4" :sm="24" class="flex-sp">
+            <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+            <a-button @click="reset">重置</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <a-divider/>
+    <div class="table-operator">
+      <a-button type="primary" icon="plus" @click="openModal">新建</a-button>
+    </div>
+    <s-table
+      ref="table"
+      size="default"
+      rowKey="id"
+      :columns="columns"
+      :data="loadData"
+      bordered
+    >
+      <span slot="status" slot-scope="text, record">
+        <a-switch checkedChildren="" unCheckedChildren="" v-model="record.loginFlag" @change="changeFlagHandle(text, record)"/>
+      </span>
+      <div slot="roleNames" slot-scope="text, record" :title="record.roleNames">
+        <span v-if="record.roleNames">{{ record.roleNames.substr(0,12) + '...' }}</span>
+        <span v-else>无</span>
+      </div>
+      <span slot="action" slot-scope="text, record">
+        <template>
+          <div >
+            <a class="action-button" @click="handleEdit(record)">修改</a>
+            <a v-if="record.loginFlag" class="action-button reset-text" @click="resetPassword(record)">重置密码</a>
+            <a v-if="!record.loginFlag" class="action-button red-text" @click="delect(record)">删除</a>
+          </div>
+        </template>
+      </span>
+    </s-table>
+    <userModal :visible="showModal" @refresh="$refs.table.refresh(true)" :data="itemData" @close="showModal = false"></userModal>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import userModal from './userModal.vue'
+import { resetPSD, updateEnableStatus, getPowerUserList, delectUserPower } from '@/api/card-voucher-user.js'
+export default {
+  name: 'UserList',
+  components: {
+    STable, VSelect, userModal
+  },
+  data () {
+    return {
+      // 查询参数
+      queryParam: {
+        name: '',
+        phone: '',
+        loginFlag: ''
+      },
+      showModal: false,
+      itemData: {}, // 编辑行数据
+      // 表头
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'no',
+          width: '40',
+          align: 'center'
+        },
+        {
+          title: '用户名称',
+          dataIndex: 'name',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '手机号码',
+          dataIndex: 'phone',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '角色',
+          width: '100',
+          align: 'center',
+          scopedSlots: { customRender: 'roleNames' }
+        },
+        {
+          title: '状态',
+          width: '100',
+          align: 'center',
+          scopedSlots: { customRender: 'status' }
+        },
+        {
+          title: '创建时间',
+          dataIndex: 'createDate',
+          width: '120',
+          align: 'center'
+        },
+        {
+          title: '操作',
+          width: '100',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        return getPowerUserList(Object.assign(parameter, this.queryParam)).then(res => {
+          const no = (res.data.pageNo - 1) * res.data.pageSize
+          for (let i = 0; i < res.data.list.length; i++) {
+            const _item = res.data.list[i]
+            _item.no = no + i + 1
+            _item.loginFlag = _item.loginFlag + '' === '1'
+          }
+          return res.data
+        })
+      },
+      optionAlertShow: false
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {
+      // vm.$refs.table.refresh()
+    })
+  },
+  methods: {
+    // 刷新列表
+    refreshTable () {
+      this.$refs.table.refresh(true)
+    },
+    //  重置
+    reset () {
+      this.queryParam = {
+        name: '',
+        phone: '',
+        loginFlag: ''
+      }
+      this.$refs.table.refresh(true)
+    },
+    // 新建
+    openModal () {
+      this.showModal = true
+      this.itemData = {}
+    },
+    // 重置密码
+    resetPassword (row) {
+      resetPSD({
+        id: row.id
+      }).then(res => {
+        if (res.status == 200) {
+          this.$message.success('密码重置成功')
+        } else {
+          this.$message.error(res.message)
+        }
+      }).catch(() => {
+        this.$message.success('密码重置失败, 请稍后重试')
+      })
+    },
+    // 删除
+    delect (row) {
+      const _this = this
+      this.$confirm({
+        title: '警告',
+        content: '删除后无法恢复,确认删除?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          delectUserPower({
+            id: row.id
+          }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success('删除成功')
+              _this.$refs.table.refresh()
+            } else {
+              _this.$message.error(res.message)
+            }
+          }).catch(() => {
+            _this.$message.success('删除失败, 请稍后重试')
+          })
+        }
+      })
+    },
+    getBizStr (storeBizList) {
+      const str = []
+      storeBizList.forEach(item => {
+        str.push(item.bizTypeName)
+      })
+      return str.join(',')
+    },
+    handleEdit (row) {
+      this.showModal = true
+      this.itemData = row
+    },
+    // 修改状态
+    changeFlagHandle (text, record) {
+      const _data = {
+        id: record.id,
+        flag: record.loginFlag ? '1' : '0'
+      }
+      updateEnableStatus(_data).then(res => {
+        if (res.status + '' === '200') {
+          this.$message.success('修改成功')
+        } else {
+          record.loginFlag = !record.loginFlag
+        }
+      })
+    }
+  }
+}
+</script>
+<style scoped>
+  .table-page-search-wrapper .ant-form-inline .ant-form-item{
+    margin-bottom: 0;
+  }
+  .flex-sp{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
+  .action-button{
+   line-height: 40px;
+   white-space: nowrap;
+    padding: 5px 10px;
+    background-color: #1890ff;
+    border-radius: 4px;
+    color: #fff;
+    margin-right: 5px;
+  }
+  .red-text{
+    background-color: red;
+  }
+  .reset-text {
+    background-color: #31b50b;
+  }
+</style>

+ 268 - 0
src/views/CardVoucherAuth/user/userModal.vue

@@ -0,0 +1,268 @@
+<template>
+  <div>
+    <a-modal class="modalBox" :title="titleText" v-model="isshow" @cancle="cancel">
+      <a-form :form="form" @submit="handleSubmit">
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <!-- 用户名称 -->
+            <a-form-item label="用户名称" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder="请输入用户名称"
+                v-decorator="['formData.name', {
+                  initialValue: formData.name,
+                  rules: [{ required: true, message: '请输入用户名称!' },{pattern:'^[^<|>]{1,20}$',message:'请输入不含<或>的字符,最多20个字符'}] }]"
+              />
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <!-- 手机号码 -->
+            <a-form-item label="手机号码" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder="请输入手机号码"
+                v-decorator="['formData.phone', {
+                  initialValue: formData.phone,
+                  rules: [{ required: true, message: '请输入手机号码!' },{pattern:/^[1][0-9]{10}$/, message: '请输入正确的手机号码!'}] }]"
+              />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <!-- 性别 -->
+          <a-col :span="12">
+            <a-form-item label="性别" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <v-select
+                code="SEX"
+                v-decorator="[
+                  'formData.sex',
+                  {
+                    initialValue: formData.sex,
+                    rules: [{ required: true, message: '请选择性别!' }] },
+                ]"
+                allowClear ></v-select>
+
+            </a-form-item>
+          </a-col>
+          <!-- 状态 -->
+          <a-col :span="12">
+            <a-form-item label="状态" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-radio-group
+                name="radioGroup"
+                v-decorator="[
+                  'formData.loginFlag',
+                  {
+                    initialValue: formData.loginFlag,
+                    rules: [{ required: true, message: '请选择状态!' }] },
+                ]"
+              >
+                <a-radio :value="1">是</a-radio>
+                <a-radio :value="0">否</a-radio>
+              </a-radio-group>
+
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="24">
+            <a-form-item label="角色" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
+              <a-select
+                v-decorator="[
+                  'formData.roleNames',
+                  {
+                    initialValue: formData.roleNames,
+                    rules: [{ required: true, message: '请选择状态!' }] },
+                ]"
+                mode="multiple"
+                style="width: 100%"
+                placeholder="请选择角色"
+              >
+                <a-select-option
+                  v-for="item in roleList"
+                  :key="item.id"
+                  :disabled="item.isEnable == '0' ? true : false"
+                >{{ item.name }}</a-select-option
+                >
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="24">
+            <a-form-item label="备注" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
+              <a-textarea
+                v-decorator="[
+                  'formData.remarks',
+                  {
+                    initialValue: formData.remarks,
+                    rules: [] },
+                ]"
+                style="min-height: 50px;"
+                placeholder=""
+                autosize />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
+          <a-button type="primary" @click="handleSubmit()">
+            保存
+          </a-button>
+          <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()">
+            取消
+          </a-button>
+        </a-form-item>
+      </a-form>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import { getRoleList, saveUserPower } from '@/api/card-voucher-user.js'
+export default {
+  name: 'UserModal',
+  components: {
+    STable, VSelect
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    data: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      titleText: '添加用户',
+      isshow: this.visible,
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'miniForm' }),
+      roleList: [],
+      formData: {
+        roleNames: undefined, // 角色
+        name: '',
+        loginFlag: '', // 活动状态
+        phone: '',
+        sex: '',
+        remarks: ''
+      }
+    }
+  },
+  methods: {
+    cancel (e) {
+      this.clear()
+      this.$emit('close')
+    },
+
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          values.formData.roleNames = values.formData.roleNames.join(',')
+          saveUserPower(Object.assign({ id: this.data.id ? this.data.id : '' }, values.formData)).then(res => {
+            if (res.status + '' === '200') {
+              this.$message.success(res.message ? res.message : '保存成功')
+              this.$emit('refresh')
+              setTimeout(function () {
+                _this.cancel()
+              }, 300)
+            } else {
+              // this.$message.error(res.message)
+            }
+          })
+        }
+      })
+    },
+    // 取消
+    handleCancel () {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '确定取消吗?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          _this.clear()
+          _this.cancel()
+        }
+      })
+    },
+    clear () {
+      this.form.resetFields()
+      delete this.formData.id
+      this.formData.roleNames = []
+      this.formData.name = ''
+      this.formData.loginFlag = ''
+      this.formData.phone = ''
+      this.formData.sex = ''
+      this.formData.remarks = ''
+    },
+
+    // 获取角色列表接口
+    getRoleList () {
+      getRoleList().then(res => {
+        if (res.status + '' === '200') {
+          this.roleList = res.data
+        } else {
+          this.$message.warning(res.message)
+        }
+      })
+    }
+
+  },
+  mounted () {
+    this.getRoleList()
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'miniForm' })
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (newValue) {
+        if (this.data.id) { // 编辑
+          this.titleText = '编辑用户'
+          this.formData = Object.assign({}, this.data)
+          delete this.formData.no
+          let roleNames = this.formData.roleNames
+          if (roleNames) {
+            roleNames = roleNames.split(',')
+            const arr = []
+            roleNames.map(item => {
+              const row = this.roleList.find(a => {
+                return a.name == item
+              })
+              if (row) {
+                arr.push(row.id)
+              }
+            })
+            this.formData.roleNames = arr
+          } else {
+            this.formData.roleNames = []
+          }
+
+          this.formData.loginFlag = Number(this.formData.loginFlag)
+        } else {
+          this.titleText = '添加用户'
+        }
+      } else {
+        this.cancel()
+      }
+    }
+  }
+}
+</script>
+
+<style >
+  .modalBox{
+  }
+  .ant-modal-footer {
+    display: none;
+  }
+</style>

+ 194 - 0
src/views/CouponSendAuth/role/menuModal.vue

@@ -0,0 +1,194 @@
+<template>
+  <div>
+    <a-modal class="modalBox" :title="roleName" v-model="isshow" @cancle="cancel">
+      <a-form class="form-box" style="max-height: 600px;" :form="form" @submit="handleSubmit">
+
+        <a-tree
+          checkable
+          @check="onCheck"
+          @expand="onExpand"
+          :expandedKeys="expandedKeys"
+          :autoExpandParent="autoExpandParent"
+          v-model="checkedKeys"
+          :treeData="treeData"
+        />
+
+      </a-form>
+      <a-form-item :wrapper-col="{ offset: 15 }">
+        <a-button type="primary" @click="handleSubmit()">
+          保存
+        </a-button>
+        <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()">
+          取消
+        </a-button>
+      </a-form-item>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import { getAllNewMenu } from '@/api/send-coupon-role'
+export default {
+  name: 'RoleModal',
+  components: {
+    STable, VSelect
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    data: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      treeData: [],
+      roleName: '',
+      expandedKeys: [],
+      autoExpandParent: true,
+      checkedKeys: [],
+      checkedData: [],
+      isshow: this.visible,
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'menuModal' }),
+      id: '' // 角色id
+    }
+  },
+  methods: {
+    onExpand (expandedKeys) {
+      // if not set autoExpandParent to false, if children expanded, parent can not collapse.
+      // or, you can remove all expanded children keys.
+      this.expandedKeys = expandedKeys
+      this.autoExpandParent = false
+    },
+    onCheck (checkedKeys, info) {
+      this.checkedData = [...checkedKeys, ...info.halfCheckedKeys]
+      this.checkedKeys = checkedKeys
+    },
+    cancel (e) {
+      this.clear()
+      this.$emit('close')
+    },
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          if (this.checkedData.length == 0) {
+            return this.$message.warning('请先选择菜单')
+          }
+          const arr = this.checkedData.join(',')
+          getAllNewMenu({ id: this.id, menuIds: arr }).then(res => {
+            if (res.status + '' === '200') {
+              this.$message.success(res.message ? res.message : '保存成功')
+              this.$emit('refresh')
+              setTimeout(function () {
+                _this.cancel()
+              }, 300)
+            } else {
+              // this.$message.error(res.message)
+            }
+          })
+        }
+      })
+    },
+    // 取消
+    handleCancel () {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '确定取消吗?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          _this.clear()
+          _this.cancel()
+        }
+      })
+    },
+    clear () {
+      this.form.resetFields()
+      this.roleName = ''
+      this.id = ''
+      this.checkedKeys = []
+    },
+    findLeaf (data, arr) {
+      for (let i = 0; i < data.length; i++) {
+        const node = data[i]
+        if (node.children) {
+          this.findLeaf(node.children, arr)
+        } else {
+          const hasNode = arr.find(item => {
+            return item == node.id
+          })
+          if (hasNode) {
+            this.checkedKeys.push(node.id)
+          }
+        }
+      }
+    }
+  },
+  mounted () {
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'menuModal' })
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (newValue) {
+        if (this.data) { // 编辑
+          this.treeData = this.data.allMenuList
+          this.id = this.data.role.id
+          this.roleName = '分配权限' + '(' + this.data.role.name + ')'
+          if (this.data.role.menuIds) {
+            const arr = this.data.role.menuIds.split(',')
+            const temp = []
+            arr.map(item => {
+              temp.push(Number(item))
+            })
+            this.checkedData = temp
+            this.expandedKeys = temp
+            // 找出叶子节点
+            this.findLeaf(this.treeData, temp)
+          }
+        }
+      } else {
+        this.cancel()
+      }
+    }
+  }
+}
+</script>
+
+<style >
+  .modalBox{
+  }
+  .ant-modal-footer {
+    display: none;
+  }
+  .form-box {
+    max-height: 600px !important;
+    overflow: auto;
+  }
+  .form-box::-webkit-scrollbar{
+    width: 6px;
+    height: 6px ;
+  }
+
+  .form-box::-webkit-scrollbar-thumb{
+    width: 6px;
+    height: 6px ;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 0 2px #d1d1d1;
+    background: #e4e4e4;
+  }
+</style>

+ 222 - 0
src/views/CouponSendAuth/role/roleList.vue

@@ -0,0 +1,222 @@
+<template>
+  <a-card :bordered="false">
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="48">
+          <a-col :md="6" :sm="24">
+            <a-form-item label="角色名称">
+              <a-input allowClear v-model.trim="queryParam.name" placeholder="请输入角色名称"/>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="6" :sm="24">
+            <a-form-item label="状态">
+              <v-select code="CHECK_ENABLE_STATE" v-model="queryParam.isEnable" allowClear placeholder="请选择状态" ></v-select>
+            </a-form-item>
+          </a-col>
+          <a-col :md="4" :sm="24">
+            <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <a-divider/>
+    <div class="table-operator">
+      <a-button type="primary" icon="plus" @click="openModal">新建</a-button>
+    </div>
+
+    <s-table
+      ref="table"
+      size="default"
+      rowKey="id"
+      :columns="columns"
+      :data="loadData"
+      bordered
+    >
+      <span slot="status" slot-scope="text, record">
+        <a-switch checkedChildren="" unCheckedChildren="" v-model="record.isEnable" @change="changeFlagHandle(text, record)"/>
+      </span>
+
+      <span slot="action" slot-scope="text, record">
+        <template>
+          <a class="action-button menu-text" @click="openMenuModal(record)">菜单权限</a>
+          <a class="action-button" @click="handleEdit(record)">修改</a>
+          <a v-if="!record.isEnable" class="action-button red-text" @click="delect(record)">删除</a>
+        </template>
+      </span>
+    </s-table>
+    <roleModal :visible="showModal" :data="itemData" @refresh="refreshTable" @close="showModal = false"></roleModal>
+    <menuModal :visible="showMenuModal" :data="menuData" @close="showMenuModal = false"></menuModal>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import roleModal from './roleModal.vue'
+import menuModal from './menuModal.vue'
+import { getRoleList, changeRoleStatus, getAllUsedMenu, getDelRole } from '@/api/send-coupon-role'
+export default {
+  name: 'RoleList',
+  components: {
+    STable, VSelect, roleModal, menuModal
+  },
+  data () {
+    return {
+      // 查询参数
+      queryParam: {
+        name: '',
+        isEnable: ''
+      },
+      showModal: false,
+      showMenuModal: false,
+      itemData: {}, // 编辑行数据
+      menuData: {},
+      // 表头
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'no',
+          width: '40',
+          align: 'center'
+        },
+        {
+          title: '角色名称',
+          dataIndex: 'name',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '角色描述',
+          dataIndex: 'remarks',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '状态',
+          width: '100',
+          align: 'center',
+          scopedSlots: { customRender: 'status' }
+        },
+        {
+          title: '创建时间',
+          dataIndex: 'createDate',
+          width: '120',
+          align: 'center'
+        },
+        {
+          title: '操作',
+          width: '100',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        return getRoleList(Object.assign(parameter, this.queryParam)).then(res => {
+          const no = (res.data.pageNo - 1) * res.data.pageSize
+          for (let i = 0; i < res.data.list.length; i++) {
+            const _item = res.data.list[i]
+            _item.no = no + i + 1
+            _item.isEnable = _item.isEnable + '' === '1'
+          }
+          return res.data
+        })
+      },
+      optionAlertShow: false
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {
+      // vm.$refs.table.refresh()
+    })
+  },
+  methods: {
+    // 刷新列表
+    refreshTable () {
+      this.$refs.table.refresh(true)
+    },
+    // 新建
+    openModal () {
+      this.showModal = true
+      this.itemData = {}
+    },
+    // 打开分配权限弹窗
+    openMenuModal (row) {
+      this.getAllUsedMenu(row.id)
+    },
+    // 获取菜单树列表
+    getAllUsedMenu (id) {
+      const _this = this
+      getAllUsedMenu({ id: id }).then(res => {
+        if (res.status == 200) {
+          _this.menuData = res.data
+          this.showMenuModal = true
+        }
+      })
+    },
+
+    // 删除
+    delect (row) {
+      const _this = this
+      this.$confirm({
+        title: '警告',
+        content: '删除后无法恢复,确认删除?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          getDelRole({
+            id: row.id
+          }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success('删除成功')
+              _this.$refs.table.refresh()
+            } else {
+              this.$message.error(res.message)
+            }
+          }).catch(() => {
+            _this.$message.success('删除失败, 请稍后重试')
+          })
+        }
+      })
+    },
+    handleEdit (row) {
+      this.showModal = true
+      this.itemData = row
+    },
+    // 修改状态
+    changeFlagHandle (text, record) {
+      const _data = {
+        id: record.id,
+        flag: record.isEnable ? '1' : '0'
+      }
+      changeRoleStatus(_data).then(res => {
+        if (res.status + '' === '200') {
+          this.$message.success('修改成功')
+        } else {
+          record.isEnable = !record.isEnable
+        }
+      })
+    }
+  }
+}
+</script>
+<style scoped>
+  .table-page-search-wrapper .ant-form-inline .ant-form-item{
+    margin-bottom: 0;
+  }
+  .action-button{
+    line-height: 40px;
+    white-space: nowrap;
+    padding: 5px 10px;
+    background-color: #1890ff;
+    border-radius: 4px;
+    color: #fff;
+    margin-right: 5px;
+  }
+  .red-text{
+    background-color: red;
+  }
+  .menu-text {
+    background-color: #f90;
+  }
+</style>

+ 172 - 0
src/views/CouponSendAuth/role/roleModal.vue

@@ -0,0 +1,172 @@
+<template>
+  <div>
+    <a-modal class="modalBox" :title="titleText" v-model="isshow" @cancle="cancel">
+      <a-form :form="form" @submit="handleSubmit">
+        <!-- 用户名称 -->
+        <a-form-item label="角色名称" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input
+            placeholder="请输入角色名称"
+            v-decorator="['formData.name', {
+              initialValue: formData.name,
+              rules: [{ required: true, message: '请输入角色名称!' },{pattern:'^[^<|>]{1,20}$',message:'请输入不含<或>的字符,最多20个字符'}] }]"
+          />
+        </a-form-item>
+
+        <!-- 状态 -->
+        <a-form-item label="状态" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-radio-group
+            name="radioGroup"
+            v-decorator="[
+              'formData.isEnable',
+              {
+                initialValue: formData.isEnable,
+                rules: [{ required: true, message: '请选择状态!' }] },
+            ]"
+          >
+            <a-radio :value="1">启用</a-radio>
+            <a-radio :value="0">禁用</a-radio>
+          </a-radio-group>
+        </a-form-item>
+
+        <a-form-item label="角色描述" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-textarea
+            v-decorator="[
+              'formData.remarks',
+              { initialValue: formData.remarks,
+                rules: [] },
+            ]"
+            style="min-height: 60px;"
+            placeholder=""
+            autosize />
+        </a-form-item>
+
+        <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
+          <a-button type="primary" @click="handleSubmit()">
+            保存
+          </a-button>
+          <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()">
+            取消
+          </a-button>
+        </a-form-item>
+      </a-form>
+
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import { getEnableRole } from '@/api/send-coupon-role'
+export default {
+  name: 'RoleModal',
+  components: {
+    STable, VSelect
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    data: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      titleText: '添加角色',
+      isshow: this.visible,
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'roleModal' }),
+      formData: {
+        name: '',
+        isEnable: '', // 活动状态
+        remarks: ''
+      }
+
+    }
+  },
+  methods: {
+    cancel (e) {
+      this.clear()
+      this.$emit('close')
+    },
+
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          getEnableRole(Object.assign(this.formData, values.formData)).then(res => {
+            if (res.status + '' === '200') {
+              this.$message.success(res.message ? res.message : '保存成功')
+              this.$emit('refresh')
+              setTimeout(function () {
+                _this.cancel()
+              }, 300)
+            } else {
+              // this.$message.error(res.message)
+            }
+          })
+        }
+      })
+    },
+    // 取消
+    handleCancel () {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '确定取消吗?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          _this.clear()
+          _this.cancel()
+        }
+      })
+    },
+    clear () {
+      this.form.resetFields()
+      delete this.formData.id
+      this.formData.name = ''
+      this.formData.isEnable = ''
+      this.formData.remarks = ''
+    }
+
+  },
+  mounted () {
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'roleModal' })
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (newValue) {
+        if (this.data.id) { // 编辑
+          this.titleText = '编辑角色'
+          this.formData = Object.assign({}, this.data)
+          delete this.formData.no
+          this.formData.isEnable = Number(this.formData.isEnable)
+        } else {
+          this.titleText = '添加角色'
+        }
+      } else {
+        this.cancel()
+      }
+    }
+  }
+}
+</script>
+
+<style >
+  .modalBox{
+  }
+  .ant-modal-footer {
+    display: none;
+  }
+</style>

+ 260 - 0
src/views/CouponSendAuth/user/userList.vue

@@ -0,0 +1,260 @@
+<template>
+  <a-card :bordered="false">
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="48">
+          <a-col :md="6" :sm="24">
+            <a-form-item label="所在网点">
+              <a-select placeholder="请选择" allowClear v-model="queryParam.storeId">
+                <a-select-option v-for="item in storeOptionData" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="24">
+            <a-form-item label="手机号码/员工姓名">
+              <a-input allowClear v-model.trim="queryParam.queryWord" placeholder="请输入手机号码"/>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="24">
+            <a-button type="primary" @click="$refs.table.refresh(true)" style="margin-right: 10px;">查询</a-button>
+            <a-button @click="reset">重置</a-button>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <a-divider/>
+    <div class="table-operator">
+      <a-button type="primary" icon="plus" @click="openModal">新建</a-button>
+    </div>
+
+    <s-table
+      ref="table"
+      size="default"
+      rowKey="id"
+      :columns="columns"
+      :data="loadData"
+      bordered
+    >
+      <div slot="roleNames" slot-scope="text, record" :title="record.roleNames">
+        <span v-if="record.roleNames">{{ record.roleNames.substr(0,12) + '...' }}</span>
+        <span v-else>无</span>
+      </div>
+      <!-- 性别 -->
+      <span slot="sex" slot-scope="text,record">
+        <template v-if="record.sex == 0 ">女</template>
+        <template v-if="record.sex==1">男</template>
+      </span>
+      <!-- 操作 -->
+      <span slot="action" slot-scope="text, record">
+        <template>
+          <div >
+            <a class="action-button" @click="handleEdit(record)">修改</a>
+            <a class="action-button reset-text" @click="resetPassword(record)">重置密码</a>
+            <a class="action-button red-text" @click="delect(record)">删除</a>
+          </div>
+        </template>
+      </span>
+
+    </s-table>
+    <userModal :visible="showModal" :storeOptionData="storeOptionData" @refresh="$refs.table.refresh(true)" :data="itemData" @close="showModal = false"></userModal>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import userModal from './userModal.vue'
+import { resetPSD, getUserList, delectUser, storeList } from '@/api/send-coupon-user.js'
+export default {
+  name: 'UserList',
+  components: {
+    STable, VSelect, userModal
+  },
+  data () {
+    return {
+      // 查询参数
+      queryParam: {
+        storeId: undefined,
+        queryWord: ''
+      },
+      showModal: false,
+      itemData: {}, // 编辑行数据
+      storeOptionData: [],
+      // 表头
+      columns: [
+        {
+          title: '序号',
+          dataIndex: 'no',
+          width: '40',
+          align: 'center'
+        },
+        {
+          title: '创建时间',
+          dataIndex: 'createDate',
+          width: '120',
+          align: 'center'
+        },
+        {
+          title: '员工姓名',
+          dataIndex: 'name',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '手机号码',
+          dataIndex: 'mobile',
+          width: '100',
+          align: 'center'
+        },
+        {
+          title: '角色',
+          width: '100',
+          align: 'center',
+          scopedSlots: { customRender: 'roleNames' }
+        },
+        {
+          title: '性别',
+          dataIndex: 'sex',
+          width: '120',
+          align: 'center',
+          scopedSlots: { customRender: 'sex' }
+        },
+        {
+          title: '所在网点',
+          dataIndex: 'store.name',
+          width: '120',
+          align: 'center'
+        },
+        {
+          title: '操作',
+          width: '100',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        return getUserList(Object.assign(parameter, this.queryParam)).then(res => {
+          const no = (res.data.pageNo - 1) * res.data.pageSize
+          for (let i = 0; i < res.data.list.length; i++) {
+            const _item = res.data.list[i]
+            _item.no = no + i + 1
+            // _item.loginFlag = _item.loginFlag + '' === '1'
+          }
+          return res.data
+        })
+      },
+      optionAlertShow: false
+    }
+  },
+  methods: {
+    // 刷新列表
+    refreshTable () {
+      this.$refs.table.refresh(true)
+    },
+    // 新建
+    openModal () {
+      this.showModal = true
+      this.itemData = {}
+    },
+    // 获取网点名称数据
+    getStoreListData () {
+      storeList({
+        pageNo: 1,
+        pageSize: 1000
+      }).then(res => {
+        console.log(res, '-----------')
+        if (res.status == 200) {
+          this.storeOptionData = res.data.list || []
+        } else {
+          this.storeOptionData = []
+        }
+      })
+    },
+    // 重置密码
+    resetPassword (record) {
+      resetPSD({
+        id: record.id
+      }).then(res => {
+        if (res.status == 200) {
+          this.$message.success('密码重置成功')
+        } else {
+          this.$message.error(res.message)
+        }
+      }).catch(() => {
+        this.$message.success('密码重置失败, 请稍后重试')
+      })
+    },
+    // 删除
+    delect (record) {
+      const _this = this
+      this.$confirm({
+        title: '警告',
+        content: '删除后无法恢复,确认删除?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          delectUser({
+            id: record.id
+          }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success('删除成功')
+              _this.$refs.table.refresh()
+            } else {
+              _this.$message.error(res.message)
+            }
+          }).catch(() => {
+            _this.$message.success('删除失败, 请稍后重试')
+          })
+        }
+      })
+    },
+    getBizStr (storeBizList) {
+      const str = []
+      storeBizList.forEach(item => {
+        str.push(item.bizTypeName)
+      })
+      return str.join(',')
+    },
+    // 编辑
+    handleEdit (record) {
+      console.log(record)
+      this.showModal = true
+      this.itemData = record
+    },
+    // 重置
+    reset () {
+      this.queryParam = {
+        storeId: undefined,
+        queryWord: ''
+      }
+      this.refreshTable()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {
+      vm.getStoreListData()
+      vm.reset()
+    })
+  }
+}
+</script>
+<style scoped>
+  .table-page-search-wrapper .ant-form-inline .ant-form-item{
+    margin-bottom: 0;
+  }
+  .action-button{
+   line-height: 40px;
+   white-space: nowrap;
+    padding: 5px 10px;
+    background-color: #1890ff;
+    border-radius: 4px;
+    color: #fff;
+    margin-right: 5px;
+  }
+  .red-text{
+    background-color: red;
+  }
+  .reset-text {
+    background-color: #31b50b;
+  }
+</style>

+ 256 - 0
src/views/CouponSendAuth/user/userModal.vue

@@ -0,0 +1,256 @@
+<template>
+  <div>
+    <a-modal class="modalBox" :title="titleText" v-model="isshow" @cancle="cancel">
+      <a-form :form="form" @submit="handleSubmit">
+        <a-row :gutter="24">
+          <a-col :span="12">
+            <!-- 用户名称 -->
+            <a-form-item label="用户名称" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder="请输入用户名称"
+                v-decorator="['formData.name', {
+                  initialValue: formData.name,
+                  rules: [{ required: true, message: '请输入用户名称!' },{pattern:'^[^<|>]{1,20}$',message:'请输入不含<或>的字符,最多20个字符'}] }]"
+              />
+            </a-form-item>
+          </a-col>
+          <a-col :span="12">
+            <!-- 手机号码 -->
+            <a-form-item label="手机号码" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <a-input
+                placeholder="请输入手机号码"
+                :maxLength="11"
+                v-decorator="['formData.mobile', {
+                  initialValue: formData.mobile,
+                  rules: [{ required: true, message: '请输入手机号码!' },{pattern:/^[1][0-9]{10}$/, message: '请输入正确的手机号码!'}] }]"
+              />
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <!-- 性别 -->
+          <a-col :span="12">
+            <a-form-item label="性别" :label-col="{ span: 8 }" :wrapper-col="{ span: 16 }">
+              <v-select
+                code="SEX"
+                v-decorator="[
+                  'formData.sex',
+                  {
+                    initialValue: formData.sex,
+                    rules: [{ required: true, message: '请选择性别!' }] },
+                ]"
+                allowClear ></v-select>
+
+            </a-form-item>
+          </a-col>
+          <!-- 状态 -->
+          <a-col :span="12">
+            <a-form-item label="所在网点" :label-col="{ span:8 }" :wrapper-col="{ span:16}">
+              <a-select
+                placeholder="请选择"
+                allowClear
+                v-decorator="[
+                  'formData.storeId',
+                  {
+                    initialValue: formData.storeId,
+                    rules: [{ required: true, message: '请选择所在网点!' }] },
+                ]">
+                <a-select-option v-for="item in storeOptionData" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :span="24">
+            <a-form-item label="角色" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
+              <a-select
+                v-decorator="[
+                  'formData.roleIds',
+                  {
+                    initialValue: formData.roleIds,
+                    rules: [{ required: true, message: '请选择状态!' }] },
+                ]"
+                mode="multiple"
+                style="width: 100%"
+                placeholder="请选择角色"
+              >
+                <a-select-option
+                  v-for="item in roleList"
+                  :key="item.id"
+                  :disabled="item.isEnable == '0' ? true : false"
+                >{{ item.name }}</a-select-option
+                >
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
+          <a-button type="primary" @click="handleSubmit()">
+            保存
+          </a-button>
+          <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()">
+            取消
+          </a-button>
+        </a-form-item>
+      </a-form>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import { getRoleList, saveUser } from '@/api/send-coupon-user.js'
+export default {
+  name: 'UserModal',
+  components: {
+    STable, VSelect
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    storeOptionData: {
+      type: Array,
+      default: function () {
+        return []
+      }
+    },
+    data: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      titleText: '添加用户',
+      isshow: this.visible,
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'miniForm' }),
+      roleList: [],
+      formData: {
+        roleIds: undefined, // 角色
+        name: '',
+        mobile: '',
+        sex: '',
+        storeId: undefined
+      }
+    }
+  },
+  methods: {
+    cancel (e) {
+      this.clear()
+      this.$emit('close')
+    },
+
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          console.log(values)
+          values.formData.roleIds = values.formData.roleIds.join(',')
+          saveUser(Object.assign({ id: this.data.id ? this.data.id : '' }, values.formData)).then(res => {
+            if (res.status + '' === '200') {
+              this.$message.success(res.message ? res.message : '保存成功')
+              this.$emit('refresh')
+              setTimeout(function () {
+                _this.cancel()
+              }, 300)
+            } else {
+              // this.$message.error(res.message)
+            }
+          })
+        }
+      })
+    },
+    // 取消
+    handleCancel () {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '确定取消吗?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          _this.clear()
+          _this.cancel()
+        }
+      })
+    },
+    clear () {
+      this.form.resetFields()
+      delete this.formData.id
+      this.formData.roleNames = []
+      this.formData.storeId = undefined
+      this.formData.name = ''
+      this.formData.mobile = ''
+      this.formData.sex = ''
+      this.formData.roleIds = undefined
+    },
+
+    // 获取角色列表接口
+    getRoleList () {
+      getRoleList().then(res => {
+        if (res.status + '' === '200') {
+          this.roleList = res.data
+        } else {
+          this.$message.warning(res.message)
+        }
+      })
+    }
+
+  },
+  mounted () {
+    this.getRoleList()
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'miniForm' })
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (newValue) {
+        if (this.data.id) { // 编辑
+          this.titleText = '编辑用户'
+          this.formData = Object.assign({}, this.data)
+          delete this.formData.no
+          let roleIds = this.formData.roleIds
+          if (roleIds) {
+            roleIds = roleIds.split(',')
+            const arr = []
+            roleIds.map(item => {
+              const row = this.roleList.find(a => {
+                return a.id == item
+              })
+              if (row) {
+                arr.push(row.id)
+              }
+            })
+            this.formData.roleIds = arr
+          } else {
+            this.formData.roleIds = []
+          }
+          // this.formData.loginFlag = Number(this.formData.loginFlag)
+        } else {
+          this.titleText = '添加用户'
+        }
+      } else {
+        this.cancel()
+      }
+    }
+  }
+}
+</script>
+
+<style >
+  .modalBox{
+  }
+  .ant-modal-footer {
+    display: none;
+  }
+</style>

+ 3 - 4
src/views/Home.vue

@@ -1,14 +1,13 @@
 <template>
   <div class="home">
-    <a-alert message="欢迎登录章鱼车管家管理后台系统" type="info" showIcon />
- </div>
+    <a-alert message="欢迎登录洗车机运营管理平台系统" type="info" showIcon />
+  </div>
 </template>
 
 <script>
 export default {
   name: 'Home',
-  components: { 
-  },
+  components: {},
   data () {
     return {}
   },

+ 353 - 0
src/views/Order/OrderCenter.vue

@@ -0,0 +1,353 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 搜索条件 -->
+    <div class="orderCenter-searchForm">
+      <a-form ref="searchForm">
+        <a-row :gutter="48">
+          <a-col :span="8">
+            <a-form-item label="下单时间" :label-col="{ span:4 }" :wrapper-col="{ span:12}">
+              <a-range-picker v-model="time" :format="dateFormat" :placeholder="['开始时间','结束时间']" @change="onChange" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item label="网点名称" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+              <a-select placeholder="请选择" allowClear v-model="storeId" mode="multiple">
+                <a-select-option v-for="item in storeOptionData" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item label="单号" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+              <a-input v-model.trim="searchForm.orderNo" placeholder="请输入" allowClear />
+            </a-form-item>
+          </a-col>
+          <a-col :span="4">
+            <a-button style="margin-right: 10px;" type="primary" @click="handleSearch">查询</a-button>
+            <a-button type="" @click="handleRest">重置</a-button>
+          </a-col>
+        </a-row>
+        <a-row :gutter="48">
+          <a-col :span="8">
+            <a-form-item label="服务项目" :label-col="{ span:4 }" :wrapper-col="{ span:12}">
+              <a-select placeholder="请选择" allowClear v-model="searchForm.itemId">
+                <a-select-option v-for="item in itemOptionData" :key="item.id" :value="item.id">{{ item.itemName }}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item label="手机号码" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+              <a-input v-model.trim="searchForm.customerMobile" placeholder="请输入" allowClear :maxLength="11" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item label="状态" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+              <v-select v-model="searchForm.orderStatus" ref="orderStatus" code="ORDER_STATUS" placeholder="请选择" allowClear></v-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 合计 -->
+    <div class="total">
+      <a-icon type="info-circle" class="iconImg" />
+      <strong>合计:</strong><span v-model="orderTotal">{{ orderTotal || 0 }} 单</span><strong style="margin-left: 15px;">实收:</strong><span
+        v-model="paymentAmountTotal">{{ paymentAmountTotal || 0 }} 元</span>
+    </div>
+    <!-- 列表 -->
+    <s-table
+      ref="table"
+      size="default"
+      :rowKey="(record) => record.id"
+      :columns="columns"
+      :data="loadData"
+      bordered>
+      <!-- 状态 -->
+      <span slot="orderStatus" slot-scope="text">
+        {{ $refs.orderStatus.getNameByCode(text) }}
+      </span>
+      <!-- 实收金额 -->
+      <span slot="paymentAmount" slot-scope="text, record">
+        <template v-if=" record.payStatus == 'PAID' ">{{ record.paymentAmount }}</template>
+        <template v-else-if=" record.payStatus != 'PAID' ">{{ 0 }}</template>
+      </span>
+      <!-- 操作 -->
+      <span slot="action" slot-scope="text, record">
+        <a-button type="primary" @click="seeDetail(record)">查看</a-button>
+        <!-- 本期暂不做 -->
+        <!-- <a-button type="danger" @click="refund(record)">退款</a-button> -->
+      </span>
+    </s-table>
+    <!-- 查看详情弹窗 -->
+    <order-detail-modal :openModal="openDetailModal" :nowId="detailId" @close="openDetailModal=false" />
+  </a-card>
+</template>
+
+<script>
+import {
+  STable,
+  VSelect
+} from '@/components'
+import getDate from '../../libs/getDate.js'
+import {
+  orderCenterList,
+  itemList,
+  storeList,
+  orderTotal
+} from '../../api/order.js'
+import OrderDetailModal from './OrderDetailModal.vue'
+import moment from 'moment'
+export default {
+  name: 'OrderCenter',
+  components: {
+    STable,
+    VSelect,
+    OrderDetailModal
+  },
+  data () {
+    return {
+      storeId: [], // 网点名称
+      // 查询参数
+      searchForm: {
+        beginDate: null, // 创建的开始时间
+        endDate: null, // 创建的结束时间
+        storeIdList: [], // 网点名称
+        orderNo: '', // 单号
+        itemId: undefined, // 服务项目
+        customerMobile: '', // 手机号码
+        orderStatus: '' // 状态
+      },
+      orderTotal: '', // 合计开单数量
+      paymentAmountTotal: '', // 合计实收金额
+      itemOptionData: [], // 服务项目数据
+      storeOptionData: [], // 网点名称数据
+      openDetailModal: false, // 查看详情弹窗 默认关闭
+      detailId: null, // 初始化id
+      // 将默认当天时间日期回显在时间选择框中
+      time: [
+        moment(getDate.getToday().starttime, this.dateFormat),
+        moment(getDate.getToday().endtime, this.dateFormat)
+      ],
+      dateFormat: 'YYYY-MM-DD',
+      columns: [{
+        title: '下单时间',
+        dataIndex: 'orderTime',
+        minWidth: '40',
+        align: 'center'
+      },
+      {
+        title: '单号',
+        dataIndex: 'orderNo',
+        minWidth: '40',
+        align: 'center'
+      },
+      {
+        title: '网点名称',
+        dataIndex: 'storeName',
+        minWidth: '40',
+        align: 'center'
+      },
+      {
+        title: '服务项目',
+        dataIndex: 'itemName',
+        minWidth: '40',
+        align: 'center'
+      },
+      {
+        title: '手机号码',
+        dataIndex: 'customerMobile',
+        minWidth: '40',
+        align: 'center'
+      },
+      {
+        title: '应收(¥)',
+        dataIndex: 'payableAmount',
+        minWidth: '40',
+        align: 'center'
+      },
+      {
+        title: '实收(¥)',
+        dataIndex: 'paymentAmount',
+        minWidth: '40',
+        align: 'center',
+        scopedSlots: {
+          customRender: 'paymentAmount'
+        }
+
+      },
+      // {
+      //   title: '优惠(¥)',
+      //   dataIndex: 'couponAmount',
+      //   minWidth: '40',
+      //   align: 'center'
+      // },
+      {
+        title: '状态',
+        dataIndex: 'orderStatus',
+        minWidth: '40',
+        align: 'center',
+        scopedSlots: {
+          customRender: 'orderStatus'
+        }
+      },
+      {
+        title: '操作',
+        dataIndex: 'action',
+        minWidth: '40',
+        align: 'center',
+        scopedSlots: {
+          customRender: 'action'
+        }
+
+      }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.searchForm.beginDate == null ? this.searchForm.beginDate = getDate.getToday().starttime : null
+        this.searchForm.endDate == null ? this.searchForm.endDate = getDate.getToday().endtime : null
+        this.searchForm.storeIdList = this.storeId
+        return orderCenterList(Object.assign(parameter, this.searchForm)).then(res => {
+          // console.log(res,'0000000000000000000')
+          if (res.status == 200) {
+            return res.data
+            this.getTotal()
+          }
+        })
+      }
+    }
+  },
+
+  methods: {
+    moment,
+    // 创建时间change
+    onChange (dates, dateStrings) {
+      if ((dates, dateStrings)) {
+        this.searchForm.beginDate = dateStrings[0]
+        this.searchForm.endDate = dateStrings[1]
+      }
+      console.log(this.searchForm.beginDate, this.searchForm.endDate)
+    },
+    // 获取服务项目数据
+    getItemListData () {
+      itemList({
+        pageNo: 1,
+        pageSize: 1000
+      }).then(res => {
+        // console.log(res, '-----------')
+        if (res.status == 200) {
+          this.itemOptionData = res.data.list || []
+        } else {
+          this.itemOptionData = []
+        }
+      })
+    },
+    // 获取网点名称数据
+    getStoreListData () {
+      storeList({
+        pageNo: 1,
+        pageSize: 1000
+      }).then(res => {
+        // console.log(res, '-----------')
+        if (res.status == 200) {
+          this.storeOptionData = res.data.list || []
+        } else {
+          this.storeOptionData = []
+        }
+      })
+    },
+    // 合计
+    getTotal () {
+      const params = {
+        beginDate: this.searchForm.beginDate,
+        endDate: this.searchForm.endDate,
+        storeIdList: this.searchForm.storeIdList,
+        orderNo: this.searchForm.orderNo,
+        itemId: this.searchForm.itemId,
+        customerMobile: this.searchForm.customerMobile,
+        orderStatus: this.searchForm.orderStatus
+      }
+      params.beginDate == null ? params.beginDate = getDate.getToday().starttime : null
+      params.endDate == null ? params.endDate = getDate.getToday().endtime : null
+      params.storeIdList = this.storeId
+      orderTotal(params).then(res => {
+        console.log(res, '--------')
+        if (res.status == 200) {
+          this.orderTotal = res.data.orderNum || 0
+          this.paymentAmountTotal = res.data.paymentAmount || 0
+        }
+      })
+    },
+    // 查看详情--跳转到对应的详情页
+    seeDetail (record) {
+      // 将当前行的id传递给详情页
+      this.openDetailModal = true
+      this.detailId = record.id
+    },
+    // 退款---暂不做
+    // refund(row) {
+    //   const _this = this
+    //   this.$confirm({
+    //     title: '警告',
+    //     content: '确认退款后 款项将通过原渠道退回 且不可撤回,确认退款?',
+    //     okText: '确定',
+    //     cancelText: '取消',
+    //     // onOk() {
+    //
+    //     // }
+    //   })
+    // },
+    // 查询
+    handleSearch () {
+      this.$refs.table.refresh()
+      this.getTotal()
+    },
+    // 重置
+    handleRest () {
+      this.searchForm.beginDate = getDate.getToday().starttime
+      this.searchForm.endDate = getDate.getToday().endtime
+      this.time = [
+        moment(getDate.getToday().starttime, this.dateFormat),
+        moment(getDate.getToday().endtime, this.dateFormat)
+      ]
+      this.storeId = []
+      this.searchForm.orderNo = ''
+      this.searchForm.itemId = undefined
+      this.searchForm.customerMobile = ''
+      this.searchForm.orderStatus = ''
+      // this.$refs.searchForm.resetFields()
+      this.$refs.table.refresh()
+      this.getTotal()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {
+      vm.getItemListData()
+      vm.handleRest()
+      vm.getStoreListData()
+    })
+  }
+}
+</script>
+<style lang="less">
+	.orderCenter-searchForm {
+
+		// 搜索框的下间距
+		.ant-form-item {
+			margin-bottom: 10px;
+		}
+	}
+
+	// 合计
+	.total {
+		margin: 15px 0 25px;
+		width: 100%;
+		background-color: #e6f7ff;
+		border: 1px solid #91d5ff;
+		padding: 8px 15px 8px 27px;
+		border-radius: 4px;
+
+		.iconImg {
+			color: #1890FF;
+			margin-right: 10px;
+		}
+	}
+</style>

+ 210 - 0
src/views/Order/OrderDetailModal.vue

@@ -0,0 +1,210 @@
+<template>
+  <div>
+    <a-modal
+      title="查看详情"
+      :footer="null"
+      :width="1100"
+      :destroyOnClose="true"
+      @cancel="isShow = false"
+      v-model="isShow">
+      <v-select ref="orderStatus" code="ORDER_STATUS" placeholder="请选择" allowClear v-show="false"></v-select>
+      <div class="orderDetail-content">
+        <a-form>
+          <a-row :gutter="24">
+            <a-col :span="8">
+              <a-form-item label="下单时间" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+                <span>{{ orderDetailData.orderTime }}</span>
+              </a-form-item>
+            </a-col>
+            <a-col :span="8">
+              <a-form-item label="单号" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+                <span>{{ orderDetailData.orderNo }}</span>
+              </a-form-item>
+            </a-col>
+            <a-col :span="8">
+              <a-form-item label="门店名称" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+                <span>{{ orderDetailData.storeName }}</span>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="24">
+            <a-col :span="8">
+              <a-form-item label="服务名称" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+                <span>{{ orderDetailData.itemName }}</span>
+              </a-form-item>
+            </a-col>
+            <a-col :span="8">
+              <a-form-item label="手机号码" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+                <span>{{ orderDetailData.customerMobile }}</span>
+              </a-form-item>
+            </a-col>
+            <a-col :span="8">
+              <a-form-item label="状态" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+                <span>{{ orderDetailData.orderStatus }}</span>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="24">
+            <a-col :span="8">
+              <a-form-item label="应付(¥)" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+                <span>{{ orderDetailData.payableAmount }} 元</span>
+              </a-form-item>
+            </a-col>
+            <a-col :span="8">
+              <a-form-item label="实付(¥)" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+                <span v-if=" orderDetailData.payStatus == 'PAID' ">{{ orderDetailData.paymentAmount }} 元</span>
+                <span v-if=" orderDetailData.payStatus != 'PAID' ">{{ 0 }} 元</span>
+              </a-form-item>
+            </a-col>
+            <a-col :span="8">
+              <a-form-item label="洗车照片" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+                <div style="display: flex;">
+                  <div class="imgBox">
+                    <div>
+                      <img v-if="orderDetailData.beginImage" class="imgCar" :src="orderDetailData.beginImage" alt="" @click="isShowBeginImageModal=true">
+                      <div v-if="!orderDetailData.beginImage" class="imgCar">--</div>
+                    </div>
+                    <div>洗车前</div>
+                  </div>
+                  <div class="imgBox">
+                    <div>
+                      <img v-if="orderDetailData.endImage" class="imgCar" :src="orderDetailData.endImage" alt="" @click="isShowEndImageModal=true">
+                      <div v-if="!orderDetailData.endImage" class="imgCar">--</div>
+                    </div>
+                    <div>洗车后</div>
+                  </div>
+
+                </div>
+              </a-form-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="24">
+            <!-- <a-col :span="8">
+              <a-form-item label="优惠(¥)" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+                <span>{{'-'}}</span>
+              </a-form-item>
+            </a-col>
+            <a-col :span="8">
+              <a-form-item label="优惠券名称" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+                <span>{{"-"}}</span>
+              </a-form-item>
+            </a-col> -->
+          </a-row>
+          <a-row style="text-align: center;margin-top: 100px;">
+            <a-col>
+              <a-form-item>
+                <a-button type="default" @click="isShow=false">返回列表</a-button>
+              </a-form-item>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+    </a-modal>
+    <!-- 查看洗车前后照片对比 -->
+    <a-modal
+      class="imgModal"
+      title="洗车前照片"
+      :width="600"
+      :footer="null"
+      :destroyOnClose="true"
+      @cancel="isShowBeginImageModal=false"
+      v-model="isShowBeginImageModal">
+      <img :src="orderDetailData.beginImage" class="pic" />
+    </a-modal>
+    <a-modal
+      class="imgModal"
+      title="洗车后照片"
+      :width="600"
+      :footer="null"
+      :destroyOnClose="true"
+      @cancel="isShowEndImageModal=false"
+      v-model="isShowEndImageModal">
+      <img :src="orderDetailData.endImage" class="pic" />
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import {
+  Upload,
+  VSelect
+} from '@/components'
+import {
+  orderDetail
+} from '../../api/order.js'
+export default {
+  components: {
+    Upload,
+    VSelect
+  },
+  name: 'OrderDetailModal',
+  props: {
+    openModal: { //  弹框是否展示
+      type: Boolean,
+      default: false
+    },
+    nowId: {
+      type: Number,
+      default: null
+    }
+  },
+  data () {
+    return {
+      orderDetailData: [],
+      isShow: this.openModal,
+      isShowBeginImageModal: false, // 洗车前图片弹窗
+      isShowEndImageModal: false // 洗车后图片弹窗
+    }
+  },
+  methods: {},
+  watch: {
+    //  父页面传过来的弹框状态以及当前行id
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    nowId (newValue, oldValue) {
+      if (newValue) {
+        orderDetail({
+          id: newValue
+        }).then(res => {
+          // console.log(res, '------------')
+          if (res.status == 200) {
+            setTimeout(() => {
+              res.data.orderStatus = this.$refs.orderStatus.getNameByCode(res.data.orderStatus)
+            }, 500)
+          }
+          this.orderDetailData = res.data
+          // console.log(this.orderDetailData, '---')
+        })
+      }
+    },
+    //  重定义的弹框状态
+    isShow (val) {
+      if (!val) {
+        this.$emit('close')
+      }
+    }
+  }
+}
+</script>
+<style lang="less">
+	.orderDetail-content .ant-form-inline .ant-form-item {
+		margin-bottom: 20px;
+	}
+
+	.imgBox {
+		text-align: center;
+		margin-left: 10px;
+		.imgCar {
+			height: 50px;
+			width: auto;
+		}
+	}
+	.pic {
+		transform: scale(1);
+		display: block;
+		max-width: 100%;
+		height: 100%;
+		margin: 0 auto;
+	}
+</style>

+ 206 - 0
src/views/RefundRecord/RefundRecord.vue

@@ -0,0 +1,206 @@
+<template>
+  <a-card :bordered="false">
+    <!-- 搜索条件 -->
+    <div class="orderCenter-searchForm">
+      <a-form ref="searchForm">
+        <a-row :gutter="48">
+          <a-col :span="8">
+            <a-form-item label="创建时间" :label-col="{ span:4 }" :wrapper-col="{ span:12}">
+              <a-range-picker v-model="time" :format="dateFormat" :placeholder="['开始时间','结束时间']" @change="onChange" />
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item label="关联订单号" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+              <a-input v-model.trim="searchForm.num" placeholder="请输入" allowClear  />
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item label="网点名称" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+              <v-select v-model="searchForm.name" placeholder="请选择" allowClear ></v-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="4">
+            <a-button style="margin-right: 10px;" type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+            <a-button type="" @click="resetForm">重置</a-button>
+          </a-col>
+        </a-row>
+        <a-row :gutter="48">
+          <a-col :span="8">
+            <a-form-item label="服务项目" :label-col="{ span:4 }" :wrapper-col="{ span:12}">
+              <v-select v-model="searchForm.fwname" placeholder="请选择" allowClear></v-select>
+            </a-form-item>
+          </a-col>
+          <a-col :span="6">
+            <a-form-item label="退款状态" :label-col="{ span:6 }" :wrapper-col="{ span:12}">
+              <v-select v-model="searchForm.status" placeholder="请选择" allowClear ></v-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 合计 -->
+    <div class="total">
+      <a-icon type="info-circle" class="iconImg"/>
+      <strong>合计:</strong><span v-model="countHJ">{{countHJ}} 单</span><strong style="margin-left: 15px;">实收:</strong><span v-model="incomeHJ">{{incomeHJ}} 元</span>
+    </div>
+    <!-- 列表 -->
+    <s-table ref="table" size="default" :rowKey="(record) => record.id" :columns="columns" :data="loadData" bordered>
+      <!-- 退款状态 -->
+      <span slot="status" slot-scope="text, record">
+        <template></template>
+      </span>
+    </s-table>
+  </a-card>
+</template>
+
+<script>
+  import { STable, VSelect } from '@/components'
+  import getDate from '../../libs/getDate.js'
+  import moment from 'moment'
+  export default {
+    components: {
+      STable,
+      VSelect
+    },
+    data() {
+      return {
+        // 查询参数
+        searchForm: {
+          beginDate: null,  // 创建的开始时间
+          endDate: null,    // 创建的结束时间
+          name: '',         // 网点名称
+          num: '',          // 单号
+          fwname:'',        // 服务项目
+          status:''         // 状态
+        },
+        time: [
+          moment(getDate.getToday().starttime, this.dateFormat),
+          moment(getDate.getToday().endtime, this.dateFormat)
+        ],
+        dateFormat: 'YYYY-MM-DD',
+        countHJ:'40',
+        incomeHJ:'2000',
+        columns: [{
+            title: '创建时间',
+            dataIndex: 'createTime',
+            minWidth: '100',
+            align: 'center'
+
+          },
+          {
+            title: '交易流水号',
+            dataIndex: 'createTime',
+            minWidth: '100',
+            align: 'center'
+
+          },
+          {
+            title: '关联订单号',
+            dataIndex: 'createTime',
+            width: '100',
+            align: 'center'
+
+          },
+          {
+            title: '网点名称',
+            dataIndex: 'createTime',
+            minWidth: '100',
+            align: 'center'
+
+          },
+          {
+            title: '退款项目',
+            dataIndex: 'createTime',
+            minWidth: '100',
+            align: 'center'
+
+          },
+          {
+            title: '退款金额(¥)',
+            dataIndex: 'createTime',
+            minWidth: '40',
+            align: 'center'
+
+          },
+          {
+            title: '退款人',
+            dataIndex: 'createTime',
+            minWidth: '100',
+            align: 'center'
+
+          },
+          {
+            title: '退款状态',
+            dataIndex: 'createTime',
+            minWidth: '100',
+            align: 'center',
+            scopedSlots: {
+              customRender: 'status'
+            }
+          },
+          {
+            title: '备注',
+            dataIndex: 'status',
+            minWidth: '100',
+            align: 'center',
+          },
+        ],
+        // 加载数据方法 必须为 Promise 对象
+        loadData: parameter => {
+          // this.searchData.beginDate == null ? this.searchData.beginDate = getDate.getToday().starttime : null
+          // this.searchData.endDate == null ? this.searchData.endDate = getDate.getToday().endtime : null
+          // return getTenantsList(Object.assign(parameter, this.searchForm)).then(res => {
+          //   if (res.status == 200) {
+          //     const no = (res.data.pageNo - 1) * res.data.pageSize
+          //     for (let i = 0; i < res.data.list.length; i++) {
+          //       const _item = res.data.list[i]
+          //       _item.no = no + i + 1
+          //       _item.status = _item.status + '' === '1'
+          //     }
+          //     return res.data
+          //   }
+          // })
+        }
+      }
+    },
+    methods: {
+      // 创建时间change
+      onChange(dates, dateStrings) {
+        if ((dates, dateStrings)) {
+          this.searchForm.beginDate = dateStrings[0]
+          this.searchForm.endDate = dateStrings[1]
+        }
+        console.log(this.searchForm.beginDate, this.searchForm.endDate)
+      },
+      // 重置
+      resetForm() {
+        this.$refs.searchForm.resetFields()
+        this.$refs.table.refresh(true)
+      },
+    },
+  }
+</script>
+
+<style lang="less">
+  .orderCenter-searchForm,
+  .addButton {
+    margin-bottom: 0;
+  }
+
+  .orderCenter-searchForm .ant-form-inline .ant-form-item {
+    margin-bottom: 15px;
+  }
+
+  .total {
+    margin-bottom: 24px;
+    width:100%;
+    background-color: #e6f7ff;
+    border: 1px solid #91d5ff;
+    padding: 8px 15px 8px 27px;
+    border-radius: 4px;
+    .iconImg{
+      color: #1890FF;
+      margin-right: 10px;
+    }
+  }
+</style>

+ 0 - 114
src/views/activity/h5View.vue

@@ -1,114 +0,0 @@
-<template>
-  <div>
-    <div class="h5Tpl">
-      <div class="mobile-head">
-         <span class="carmar"><span></span></span>
-      </div>
-      <div class="mobile-page">
-        <div v-if="type=='img'">
-          <img :src="datas" v-if="datas&&datas!=''" />
-          <p style="text-align: center;padding: 50% 30px;color: #999;" v-else>模板示例图</p>
-        </div>
-        <div v-else style="text-align: center;">
-          <iframe style="float: left;" :src="previewUrl" ref="h5Frame" width="100%" height="559px" frameborder="0" scrolling="yes"></iframe>
-        </div>
-      </div>
-      <div class="mobile-footer">
-        <span><a-icon type="left" /></span>
-        <span><a-icon type="home" /></span>
-        <span><a-icon type="unordered-list" /></span>
-      </div>
-    </div>
-  </div>
-</template>
-
-<script>
-  export default {
-    name: 'h5View',
-    components: {
-    },
-    props: {
-      datas: {
-        type: String,
-        default: ''
-      },
-      type: {
-        type: String,
-        default: 'img'
-      },
-    },
-    data() {
-      return {
-         previewUrl: window.location.origin + '/preview',
-      }
-    },
-    methods:{
-       // 给iframe传参
-       sendMessage(html) {
-         this.$refs.h5Frame.contentWindow.document.body.innerHTML = html
-       }
-    }
-  }
-</script>
-
-<style lang="less">
-  .h5Tpl{
-    width: 320px;
-    height: 640px;
-    margin: 0 auto;
-    background: #fff;
-    border-radius: 10px;
-    overflow: hidden;
-    display: flex;
-    flex-direction: column;
-    border: 1px solid #000;
-    .mobile-page{
-      flex-grow: 1;
-      overflow: auto;
-      img{
-        width: 100%;
-      }
-    }
-    .mobile-head{
-      height: 34px;
-      line-height: 34px;
-      background: #000;
-      text-align: center;
-      .carmar{
-        display: inline-block;
-        width: 18px;
-        height: 18px;
-        line-height: 15px;
-        border-radius: 50px;
-        background: #333;
-        margin-top: 8px;
-        span{
-          display: inline-block;
-          width: 6px;
-          height: 6px;
-          border-radius: 50px;
-          background: #666;
-        }
-      }
-    }
-    .mobile-footer{
-      height: 45px;
-      background: #000;
-      color: #999;
-      display: flex;
-      align-items: center;
-      span{
-        width: 50%;
-        text-align: center;
-        &:first-child{
-          text-align: right;
-          width: 25%;
-        }
-        &:last-child{
-          text-align: left;
-          width: 25%;
-        }
-      }
-    }
-  }
-</style>

+ 0 - 298
src/views/activity/hdManage/hdContent.vue

@@ -1,298 +0,0 @@
-<template>
-  <div class="hd-container">
-    <div class="hd-item" v-for="(item,index) in hdList" :key="item.id">
-      <div class="hd-item-tits">
-        <span><b>活动内容{{index+1}}</b></span>
-        <div class="btns items" @click="openServer(index)"><a-icon type="shopping" /> 选择服务</div>
-        <div class="btns parts" @click="openQueryPart(index)"><a-icon type="codepen" /> 选择配件</div>
-        <div class="btns dels" @click="delHdItem(index)"><a-icon type="delete" /> 删除活动项目</div>
-      </div>
-      <div class="hd-item-cons">
-        <div>内容标题:</div>
-        <div><a-input style="width: 200px;" v-model="item.itemName" placeholder="15个字以内" /></div>
-        <div>原价:<span>{{itemSrcPrice(index)}}</span> 元</div>
-        <div>活动价:</div>
-        <div><a-input-number style="width: 100px;" v-model="item.itemActivePrice" :min="0"/></div>
-      </div>
-      <div class="hd-item-list">
-        <div>内容项目:</div> 
-        <div><hdItemList :index="index" :list="item.children" @remove="delServer"></hdItemList></div>
-      </div>
-    </div>
-    
-    <div class="hd-add">
-      <a-button type="primary" icon="plus-circle" @click="addHdItem">添加活动项目</a-button>
-    </div>
-    
-    <!-- 选择服务弹窗 -->
-    <chooseServerItem
-      ref="chooseItem"
-      :checkedList="checkedList"
-      :openServerItemDraw="openServerItemDraw"
-      @chooseItem="chooseItem"
-      @close="openServerItemDraw = false">
-    </chooseServerItem>
-    <!-- 选择配件 -->
-    <choosePart
-      ref="choosePart"
-      :openDraw="openDrawQueryPart"
-      :checkedList="checkedList"
-      title="选择配件"
-      @choosePart="chooseItem"
-      @close="openDrawQueryPart=false">
-    </choosePart>
-    <!-- 加入服务到活动页面 -->
-    <addServerToHd
-    ref="serverToHd"
-    :index = 'curIndex'
-    @delServer="delServer"
-    @addServer="addServer"
-    :openModal="openAddServerToOrder"
-    @closeModal="openAddServerToOrder=false">
-    </addServerToHd>
-  </div>
-</template>
-
-<script>
-import chooseServerItem from '@/views/components/choose-server-item/choose-server-item.vue'
-import choosePart from '@/views/components/choose-part/choose-part.vue'
-import hdItemList from '@/views/components/hd-item-list.vue'
-import addServerToHd from '@/views/components/add-server-to-hd.vue'
-
-export default {
-  name: 'hdContent',
-  props: {
-    hdContentList: [Array]
-  },
-  components: {
-    choosePart,
-    chooseServerItem,
-    hdItemList,
-    addServerToHd
-  },
-  watch: {
-    hdContentList(newValue, oldValue) {
-      console.log(newValue,'newValue')
-      this.hdList = newValue || []
-    }
-  },
-  data () {
-    return {
-      hdList: this.hdContentList || [],
-      curIndex: 0,
-      checkedList: [],
-      openServerItemDraw: false,
-      openDrawQueryPart: false,
-      openAddServerToOrder: false
-    }
-  },
-  computed: {
-    // 计算合计
-    itemSrcPrice() {
-      return function(index){
-        let dataList = this.hdList[index].children
-        let ret = 0
-        dataList.map(item => {
-          ret = ret + Number(item.itemSrcPrice) * Number(item.itemNum)
-        })
-        this.hdList[index].itemSrcPrice = ret
-        return ret
-      }
-    },
-  },
-  methods: {
-    // 当前已选项
-    getcheckedList () {
-      let ret = []
-      if(this.hdList.length){
-        let list = this.hdList[this.curIndex].children
-        // 格式化数据
-        list.map(item => {
-          if(item.bizType == 'part'){
-            ret.push({
-              name: item.itemName,
-              partId: item.id,
-              price: item.itemSrcPrice
-            })
-          }
-          if(item.bizType == 'item'){
-            ret.push({
-              name: item.itemName,
-              itemId: item.id,
-              priceL3: item.itemSrcPrice
-            })
-          }
-        })
-      }
-      
-      this.checkedList = ret
-      console.log(this.checkedList,'this.checkedList')
-    },
-    // 打开选择配件弹框
-    openServer (index){
-      this.curIndex = index
-      this.openServerItemDraw = true
-      this.getcheckedList()
-    },
-    // 打开选择配件弹框
-    openQueryPart (index){
-      this.curIndex = index
-      this.openDrawQueryPart = true
-      this.getcheckedList()
-    },
-    // 删除活动项目
-    delHdItem (i){
-      this.$confirm({
-          title: '确认提示',
-          content: '确定删除此活动项目吗?',
-          onOk: () => {
-            this.hdList.splice(i,1)
-          }
-      })
-    },
-    // 添加活动项目
-    addHdItem (){
-      this.hdList.push({
-          itemName: '',
-          itemActivePrice: '',
-          children: []
-        })
-    },
-    // 获取当前操作的数据
-    getCurData (data){
-      let targetData = this.hdList[this.curIndex].children
-      let i = targetData.findIndex(item => {
-        return item.id == data.itemId || item.id == data.partId
-      })
-      return targetData[i]
-    },
-    // 服务列表中选择服务配件, checked 是否已选
-    chooseItem (data, checked){
-      this.openAddServerToOrder = true
-      // 格式转换
-      let temp = {}
-      if(!checked){
-        // 新增
-        if(data.itemId){
-          temp = {
-            id: data.itemId,
-            itemName: data.itemName,
-            itemNum: data.time,
-            itemSrcPrice: data.priceL3 || 0,
-            bizType: "item"
-          }
-        }
-        if(data.partId){
-          temp = {
-            id: data.partId,
-            itemName: data.partName,
-            itemNum: data.quantity,
-            itemSrcPrice: data.price || 0,
-            bizType: "part"
-          }
-        }
-      }else{
-        // 编辑
-        temp = this.getCurData(data)
-      }
-      this.$refs.serverToHd.setServerData(temp, checked)
-    },
-    // 务配件,服务或编辑加入工单, checked false 新增,true 编辑
-    addServer (data, checked){
-      console.log(data, checked)
-      let list = this.hdList[this.curIndex].children
-      if(checked){
-        // 编辑
-        let index = list.findIndex(item => {
-          return item.id == data.id
-        })
-        list.splice(index,1,data)
-      }else{
-        // 新增
-        list.push(data)
-      }
-      this.getcheckedList()
-    },
-    // 删除服务,务配件项目,data 是数字或对象类型, 活动内容 index
-    delServer (data, itemIndex) {
-      console.log(data, itemIndex, 'delServer')
-      let list = this.hdList[itemIndex].children
-      let index = list.findIndex(item => {
-        return item.id == data.id
-      })
-      list.splice(index,1)
-      this.getcheckedList()
-    },
-    // 获取数据
-    getData (){
-      return this.hdList
-    }
-  }
-}
-</script>
-
-<style lang="less">
-.hd-container{
-  background-color: #fff;
-  .hd-item{
-    margin: 5px 5px 15px;
-    background: #fafafa;
-  }
-  .hd-item-tits,
-  .hd-item-cons{
-    display: flex;
-    align-items: center;
-  }
-  .hd-item-tits{
-    padding: 6px 10px;
-    border-bottom: 1px solid #eee;
-    > span{
-      flex-grow: 1;
-    }
-    .btns{
-      color: red;
-      cursor: pointer;
-      padding: 0 10px;
-      color: #ff5500;
-      &:hover{
-        color: #F5222D;
-      }
-    }
-    .items{
-      color: #00aa00;
-      &:hover{
-        color: #55aa00;
-      }
-    }
-    .parts{
-      color: #00aaff;
-      &:hover{
-        color: #55aaff;
-      }
-    }
-  }
-  .hd-item-cons {
-    > div{
-      padding: 6px 10px;
-      span{
-        color: #1890FF;
-      }
-    }
-  }
-  .hd-item-list{
-    display: flex;
-    align-items: center;
-    > div{
-      padding: 5px 10px;
-      &:last-child{
-        flex-grow: 1;
-      }
-    }
-  }
-  .hd-add{
-    padding: 15px 0;
-    text-align: center;
-  }
-}
- 
-</style>

+ 0 - 250
src/views/activity/hdManage/hdList.vue

@@ -1,250 +0,0 @@
-<template>
-  <a-card :bordered="false">
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline">
-        <a-row :gutter="48">
-          <a-col :md="6" :sm="24">
-            <a-form-item label="活动标题">
-              <a-input allowClear v-model="queryParam.name" placeholder="请输入活动标题"/>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <a-form-item label="分类">
-              <v-select code="ACTIVE_CLZ" ref="activeClz" v-model="queryParam.activeClz" allowClear placeholder="请选择分类" ></v-select>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <a-form-item label="状态">
-              <v-select code="ACTIVE_RELEASE_STATUS" v-model="queryParam.releaseStatus" allowClear placeholder="请选择状态" ></v-select>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <a-button style="margin-right: 10px;" type="primary" @click="$refs.table.refresh(true)">查询</a-button>
-            <a-button type="" @click="resetForm">重置</a-button>
-          </a-col>
-        </a-row>
-      </a-form>
-    </div>
-    <div class="table-operator">
-      <a-button type="primary" icon="plus" @click="openTplModal">新建</a-button>
-    </div>
-
-    <s-table
-      ref="table"
-      size="default"
-      rowKey="id"
-      :columns="columns"
-      :data="loadData"
-      bordered
-    >
-      <span slot="status" slot-scope="text, record">
-        <a-switch checkedChildren="启用" unCheckedChildren="禁用" v-model="record.releaseStatus" @change="changeFlagHandle(text, record)"/>
-      </span>
-      <span slot="activeClz" slot-scope="text, record">
-        {{ $refs.activeClz.getNameByCode(text) }}
-      </span>
-      <span slot="action" slot-scope="text, record">
-        <template>
-          <a class="action-button editBtns" v-if="!record.releaseStatus" @click="handleEdit(record)">编辑</a>
-          <!-- <a class="action-button delBtns" v-if="!record.releaseStatus"  @click="delect(record)">删除</a> -->
-          <span v-if="record.releaseStatus">-</span>
-        </template>
-      </span>
-    </s-table>
-    <!-- 活动弹框 -->
-    <a-modal
-      :title="mtitle"
-      width="80%"
-      :footer="null"
-      :destroyOnClose="true"
-      @cancel="canselModal"
-      v-model="visible">
-      <newHd ref="newHd" @cansel="canselModal" @saveOk="$refs.table.refresh()"></newHd>
-    </a-modal>
-    <!-- 选择模板 -->
-    <a-modal title="选择模板" width="60%" :footer="null" @cancel="canseSelTpl" v-model="tplShow">
-      <selTplList ref="selTpl" @selTpl="selTpl"></selTplList>
-    </a-modal>
-  </a-card>
-</template>
-
-<script>
-import { STable, VSelect } from '@/components'
-import { activeList, delActive, enableActive } from '@/api/active'
-import newHd from './newHd.vue'
-import selTplList from '@/views/activity/tpl/selTplList.vue'
-export default {
-  name: 'TplList',
-  components: {
-    STable, VSelect, newHd, selTplList
-  },
-  data () {
-    return {
-      tplShow: false,
-      visible: false,
-      mtitle: '',
-      //  查询参数
-      queryParam: {
-        name: '',
-        activeClz: '',
-        releaseStatus: '',
-        staticMouldId: this.mdid
-      },
-      // 表头
-      columns: [
-        {
-          title: '序号',
-          dataIndex: 'no',
-          width: '40',
-          align: 'center'
-        },
-        {
-          title: '创建时间',
-          dataIndex: 'createDate',
-          width: '100',
-          align: 'center'
-        },
-        {
-          title: '活动标题',
-          dataIndex: 'name',
-          width: '100',
-          align: 'center'
-        },
-        {
-          title: '活动分类',
-          dataIndex: 'activeClz',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'activeClz' }
-        },
-        {
-          title: '状态',
-          dataIndex: 'releaseStatus',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'status' }
-        },
-        {
-          title: '操作',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'action' }
-        }
-      ],
-      // 加载数据方法 必须为 Promise 对象
-      loadData: parameter => {
-        return activeList(Object.assign(parameter, this.queryParam))
-          .then(res => {
-            const no = (res.data.pageNo - 1) * res.data.pageSize
-            for (let i = 0; i < res.data.list.length; i++) {
-              const _item = res.data.list[i]
-              _item.no = no + i + 1
-              _item.releaseStatus = _item.releaseStatus + '' === 'FB'
-            }
-            return res.data
-          })
-      }
-    }
-  },
-  methods: {
-    // 打开模板列表弹框
-    openTplModal () {
-      this.tplShow = true
-    },
-    canseSelTpl () {
-      this.tplShow = false
-      this.$refs.selTpl.resetForm()
-    },
-    // 选择模板
-    selTpl (id) {
-      this.tplShow = false
-      this.openModal()
-      setTimeout(() => {
-        this.$refs.newHd.setData({ staticMouldId: id })
-      }, 100)
-    },
-    // 新建活动
-    openModal () {
-      this.mtitle = '新建活动'
-      this.visible = true
-    },
-    // 取消
-    canselModal () {
-      this.visible = false
-      this.$refs.newHd.resetForm()
-    },
-    //  修改
-    handleEdit (row) {
-      this.mtitle = '编辑活动'
-      this.visible = true
-      setTimeout(() => {
-        this.$refs.newHd.setData(row)
-      }, 100)
-    },
-    // 删除
-    delect (row) {
-      const _this = this
-      this.$confirm({
-        title: '警告',
-        content: '删除后无法恢复,确认删除?',
-        okText: '确定',
-        cancelText: '取消',
-        onOk () {
-          delActive({
-            id: row.id
-          }).then(res => {
-            if (res.status == 200) {
-              _this.$message.success('删除成功')
-              _this.$refs.table.refresh()
-            }
-          })
-        }
-      })
-    },
-    // 修改状态
-    changeFlagHandle (text, record) {
-      const _data = {
-        id: record.id,
-        flag: record.releaseStatus ? 'FB' : 'CG'
-      }
-      enableActive(_data).then(res => {
-        if (res.status == '200') {
-          this.$message.success('修改成功')
-          this.$refs.table.refresh()
-        } else {
-          record.releaseStatus = !record.releaseStatus
-        }
-      })
-    },
-    resetForm () {
-      this.queryParam.name = ''
-      this.queryParam.activeClz = ''
-      this.queryParam.releaseStatus = ''
-      this.$refs.table.refresh(true)
-    }
-  }
-}
-</script>
-
-<style>
-  .action-button{
-   line-height: 40px;
-   white-space: nowrap;
-    padding: 5px 10px;
-    background-color: #1890ff;
-    border-radius: 4px;
-    color: #fff;
-    margin-right: 5px;
-    &:hover{
-      background-color: #1db8ff;
-      color: #fff;
-    }
-  }
-  .delBtns{
-    background-color: #FF0000;
-    &:hover{
-      background-color: #b91818;
-      color: #fff;
-    }
-  }
-</style>

+ 0 - 603
src/views/activity/hdManage/newHd.vue

@@ -1,603 +0,0 @@
-<template>
-  <div>
-    <div class="tplType-container" v-show="!showScanTpl">
-      <div class="tpl-left">
-        <h5View ref="h5view" type="img" :datas="thumbImg"></h5View>
-      </div>
-      <div class="tplAttr">
-        <a-form :form="form" layout="vertical">
-          <a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" >
-            <span slot="label">
-              <a-badge count="1" /> 活动主题
-            </span> 
-            <div class="themList">
-              <a-radio-group @change="onthemChange"
-                v-decorator="[
-                  'formData.themeId',
-                  { initialValue: formData.themeId,
-                    rules: [{ required: true, message: '请活动主题' }]
-                  },
-                ]"
-              >
-                <a-radio v-for="item in themeList" :key="item.id" :value="item.id" >
-                  <div class="themList-imgs">
-                    <img :src="item.basePath+'/example.jpg'" />
-                  </div>
-                  <div class="themList-name">{{item.name}}</div>
-                </a-radio>
-              </a-radio-group>
-            </div>
-          </a-form-item>
-          <a-row :gutter="20">
-            <a-col :span="12">
-              <a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" >
-                <span slot="label">
-                  <a-badge count="2" /> 活动标题
-                </span>
-                <a-input
-                  v-decorator="[
-                    'formData.activeTitle',
-                    { initialValue: formData.activeTitle,
-                      rules: [{ required: true, message: '请输入活动标题' }]
-                    },
-                  ]"
-                  placeholder="请输入活动标题"
-                />
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
-              <a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" >
-                <span slot="label">
-                  <a-badge count="3" /> 内容标题
-                </span>
-                <a-input
-                  v-decorator="[
-                    'formData.contentTitle',
-                    { initialValue: formData.contentTitle,
-                      rules: [{ required: true, message: '请输入内容标题' }]
-                    },
-                  ]"
-                  placeholder="请输入内容标题"
-                />
-              </a-form-item>
-            </a-col>
-          </a-row>
-          <a-row :gutter="20">
-            <a-col :span="24">
-              <a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" >
-                <span slot="label">
-                  <a style="color: red;">* </a> <a-badge count="4" /> 活动内容
-                </span> 
-                <div>
-                  <hdContent ref="hdContent" :hdContentList="formData.parentItemList"></hdContent>
-                </div>
-              </a-form-item>
-            </a-col>
-          </a-row>
-          <a-row :gutter="20">
-            <a-col :span="12">
-              <a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" >
-                <span slot="label">
-                  <a-badge count="5" /> 活动说明标题
-                </span>
-                <a-input
-                  v-decorator="[
-                    'formData.activeInfoTitle',
-                    { initialValue: formData.activeInfoTitle,
-                      rules: [{ required: true, message: '请输入活动说明标题' }]
-                    },
-                  ]"
-                  placeholder="请输入活动说明标题"
-                />
-              </a-form-item>
-            </a-col>
-            <a-col :span="12">
-              <a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" >
-                <span slot="label">
-                  <a-badge count="6" /> 说明详情
-                </span>
-                <a-input
-                  v-decorator="[
-                    'formData.activeInfoContent',
-                    { initialValue: formData.activeInfoContent,
-                      rules: [{ required: true, message: '请输入说明详情' }]
-                    },
-                  ]"
-                  placeholder="请输入说明详情" 
-                />
-              </a-form-item>
-            </a-col>
-          </a-row>
-          <a-row :gutter="20">
-            <a-col :span="24">
-              <a-form-item
-                :label-col="formItemLayout.labelCol"
-                :wrapper-col="formItemLayout.wrapperCol"
-                >
-                <span slot="label">
-                  <a-popover>
-                    <template slot="content">
-                      <p>用于车主在手机端分享活动生成海报时使用。</p>
-                    </template>
-                      <a-icon type="question-circle" />
-                  </a-popover>
-                   活动海报图片
-                  <em>(图片格式是jpg,png图片,最多5张,每张图片不超过300k,文件名称不能是中文)</em>
-                </span>
-                <div style="border: 1px solid #eee;overflow: hidden;padding: 8px 8px 0;">
-                  <Upload
-                    v-decorator="[
-                      'formData.activeAttachList',
-                      {
-                        initialValue: formData.activeAttachList,
-                        rules: [{required: true,message: '请上传活动海报图片!'}]
-                      }]"
-                    ref="activeAttach"
-                    :maxNums="5"
-                    :fileSize="0.35"
-                    listType="picture-card"
-                    upText="上传图片">
-                  </Upload>
-                </div>
-              </a-form-item>
-            </a-col>
-          </a-row>
-          <a-row :gutter="20">
-            <a-col :span="24">
-              <a-form-item
-                :label-col="formItemLayout.labelCol"
-                :wrapper-col="formItemLayout.wrapperCol"
-                >
-                <span slot="label">
-                  <a-popover>
-                    <template slot="content">
-                      <p>门店端活动列表展示用</p>
-                    </template>
-                      <a-icon type="question-circle" />
-                  </a-popover>
-                  活动封面图片 <em>(图片格式是jpg,png图片,不超过200k,文件名称不能是中文)</em>
-                </span>
-                <div style="border: 1px solid #eee;overflow: hidden;padding: 8px 8px 0;">
-                  <Upload
-                    v-decorator="[
-                      'formData.showPicture',
-                      {
-                        initialValue: formData.showPicture,
-                        rules: [{required: true,message: '请选择活动封面图片!'}]
-                      }]"
-                    ref="showPicture"
-                    :fileSize="0.25"
-                    listType="picture-card"
-                    upText="上传图片">
-                  </Upload>
-                </div>
-              </a-form-item>
-            </a-col>
-          </a-row>
-          <a-row :gutter="20">
-            <a-col :span="12">
-              <a-form-item
-                 :label-col="formItemLayout.labelCol"
-                 :wrapper-col="formItemLayout.wrapperCol"
-               >
-               <span slot="label">
-                 活动分类
-               </span>
-                 <v-select 
-                 code="ACTIVE_CLZ" 
-                 v-decorator="[
-                     'formData.activeClz',
-                     { initialValue: formData.activeClz,
-                       rules: [{ required: true, message: '请选择活动分类' }]
-                     },
-                   ]" 
-                   allowClear 
-                   placeholder="请选择活动分类" >
-                  </v-select>
-               </a-form-item>
-           </a-col>
-           <a-col :span="12">
-               <a-form-item
-                 :label-col="formItemLayout.labelCol"
-                 :wrapper-col="formItemLayout.wrapperCol"
-               >
-               <span slot="label">
-                 <a-popover>
-                   <template slot="content">
-                     <p>活动初次发布时展示的初始参与人数,会随着实际参与人数增加而增长。</p>
-                   </template>
-                     <a-icon type="question-circle" />
-                 </a-popover>
-                 期初购买量
-               </span>
-                 <a-input-number
-                 style="width: 100%;"
-                 v-decorator="[
-                   'formData.initBuyNum',
-                   { initialValue: formData.initBuyNum,
-                     rules: [{ required: true, message: '请输入期初购买量' }]
-                   },
-                 ]"
-                 :min="1"
-                 placeholder="请输入期初购买量" 
-                 />
-               </a-form-item>
-           </a-col>
-          </a-row>
-              <a-form-item :label-col="formTailLayout.labelCol" :wrapper-col="formTailLayout.wrapperCol">
-                <a-button type="primary" :loading="btnLoading" @click="save(0)">
-                  预览
-                </a-button>
-                <a-button style="margin-left: 20px;" @click="cansel">
-                  取消
-                </a-button>
-              </a-form-item>
-            </a-form>
-          </div>
-        </div>
-    
-    <!-- 预览模板 -->
-    <div style="text-align: center;" v-show="showScanTpl">
-        <h4>预览活动</h4>
-        <!-- <iframe :src="previewUrl" ref="h5Frame" width="360" height="647" frameborder="0" scrolling="yes"></iframe> -->
-        <h5View ref="h5DomView" type="domHtml" :datas="previewHtml"></h5View>
-        <p style="padding:20px 10px 0;text-align: center;">
-          <a-button type="primary" :loading="btnLoading" @click="save(1)">保存</a-button>
-          <a-button style="margin-left: 20px;" @click="showScanTpl=false">取消</a-button>
-        </p>
-    </div>
-    
-     <!-- 其它配文 -->
-     <!-- <a-modal title="选择其它配文" width='50%' :footer="null" @cancel="canselModal" v-model="visible">
-       <a-table
-           :columns="pwColumns"
-           :rowKey="record => record.id"
-           :dataSource="peiWenData"
-           :pagination="false"
-         >
-           <template slot="isDefault" slot-scope="row">
-             <a-button size="small" :type="row.isDefault?'primary':'default'" shape="circle" icon="check"></a-button>
-           </template>
-           <template slot="textContent" slot-scope="row">
-              <a-input v-model="row.textContent" />
-           </template>
-           <template slot="isEnable" slot-scope="row"> 
-              <a-switch checkedChildren="启用" unCheckedChildren="禁用" v-model="row.isEnable" />
-           </template>
-         </a-table>
-         <p style="padding:20px 10px 0;text-align: center;">
-           <a-button type="primary" @click="savePw">保存</a-button>
-           <a-button style="margin-left: 20px;" @click="canselModal">取消</a-button>
-         </p>
-     </a-modal> -->
-  </div>
-</template>
-
-<script>
-import h5View from '../h5View.vue'
-import { Upload, VSelect } from '@/components'
-import hdContent from './hdContent.vue'
-import { saveActive, activeViews, scanActive } from '@/api/active'
-import { getThemeByMouldId } from '@/api/theme'
-const formItemLayout = {};
-const formTailLayout = {
-  wrapperCol: {offset: 8 },
-};
-let baseForm = function (){
-  return {
-    activeAttachList: '',
-    activeClz: "",
-    // activeCompany: "",
-    // activeCompanyInfo: "",
-    activeInfoContent: "",
-    activeInfoTitle: "",
-    activeTitle: "",
-    activeType: "HDMB",
-    contentTitle: "",
-    themeId: '',
-    id: '',
-    initBuyNum: "",
-    joinerNum: 0,
-    name: "",
-    parentItemList: [],
-    showPicture: "",
-    staticMouldId: "",
-    // servicePhone: ""
-  }
-}
-export default {
-  name: 'newHd',
-  components: {
-    h5View,
-    Upload,
-    VSelect,
-    hdContent
-  },
-  data () {
-    return {
-      showScanTpl: false,
-      btnLoading: false,
-      thumbImg: '',
-      visible: false,
-      formItemLayout,
-      formTailLayout,
-      form: this.$form.createForm(this),
-      formData: baseForm(),
-      themeList: [],
-      previewHtml: '',
-      previewUrl: window.location.origin + '/preview',
-      iframeWin: null,
-      // peiWenData: [
-      //   {isDefault:false,textContent:'a撒旦解放了',isEnable:true},
-      // ],
-      // pwColumns: [
-      //     {
-      //       title: '设为默认',
-      //       key: 'isDefault',
-      //       width: 100,
-      //       scopedSlots: { customRender: 'isDefault' },
-      //     },
-      //     {
-      //       title: '配文',
-      //       key: 'textContent',
-      //       scopedSlots: { customRender: 'textContent' },
-      //     },
-      //     {
-      //       title: '启用禁用',
-      //       key: 'isEnable',
-      //       scopedSlots: { customRender: 'isEnable' },
-      //     },
-      // ]
-    }
-  },
-  methods: {
-    // 改变主题
-    onthemChange (e){
-      const curTheme = this.themeList.find(item => item.id == e.target.value)
-      this.thumbImg = curTheme?curTheme.basePath+'/example.jpg':''
-    },
-    // 获取主题列表
-    getTheme(){
-      getThemeByMouldId({staticMouldId: this.formData.staticMouldId})
-      .then(res => {
-        // console.log(res)
-        this.themeList = res.data || []
-        let def = this.formData.themeId
-        let defThem = this.themeList.find(item => item.isDefault == 1)
-        this.formData.themeId = def ? def : defThem.id
-        this.onthemChange({target:{value: def ? def : defThem.id}})
-      })
-    },
-    // // 打开配文选择
-    // openModal () {
-    //   this.visible = true
-    // },
-    // // 取消配文弹框
-    // canselModal () {
-    //   this.visible = false
-    // },
-    // // 保存配文
-    // savePw (){
-    //   console.log(this.peiWenData,'peiWenData')
-    // },
-    // 校验活动内容数据
-    vaildHdCons(data){
-      if(data.length == 0){
-        this.$message.error('请添加活动内容项目',2)
-        return false
-      }
-      let flag = []
-      data.map((item, index) => {
-        flag.push({
-          vaild: item.itemName == '',
-          message: '内容标题',
-          index: index,
-          type: 'p'
-        })
-        flag.push({
-          vaild: String(item.itemActivePrice) == '',
-          message: '活动价',
-          index: index,
-          type: 'p'
-        })
-        flag.push({
-          vaild: item.children.length == 0,
-          message: '内容项目',
-          index: index,
-          type: 'p'
-        })
-        item.children.map((citem,cindex) => {
-          flag.push({
-            vaild: !citem.itemName,
-            message: '项目名称',
-            index: index,
-            itemIndex: cindex,
-            type: 'c'
-          })
-          flag.push({
-            vaild: !citem.itemNum,
-            message: '数量',
-            index: index,
-            itemIndex: cindex,
-            type: 'c'
-          })
-          flag.push({
-            vaild: !citem.itemSrcPrice,
-            message: '原价',
-            index: index,
-            itemIndex: cindex,
-            type: 'c'
-          })
-        })
-      })
-      // console.log(flag, 'flag')
-      let hasKong = flag.find(item => item.vaild == true)
-      if(hasKong){
-        let msg = hasKong.itemIndex ? 
-        "活动内容"+(hasKong.index+1)+"中的第"+(hasKong.itemIndex+1)+"个项目中的"+hasKong.message+'不能为空' : 
-        "活动内容"+(hasKong.index+1)+"中的"+hasKong.message+'不能为空'
-        this.$message.error(msg,5)
-        return false
-      }
-      return true
-    },
-    // 1保存活动, 0 预览活动
-    save(type) {
-      const { form: { validateFields } } = this
-      let hdConList = this.$refs.hdContent.getData()
-      validateFields((errors, values) => {
-        if (!errors) {
-          let formData = Object.assign({},this.formData,values.formData)
-          // 海报处理
-          formData.activeAttach = formData.activeAttachList
-          delete formData.activeAttachList
-          // 校验活动内容数据
-          if(this.vaildHdCons(hdConList)){
-            formData.parentItemList = hdConList
-            if(type == 0){
-              this.scanForm(formData)
-            }else{
-              this.saveForm(formData)
-            }
-            
-          }
-        }
-      });
-    },
-    // 过滤底部栏
-    fiterFooter(data){
-    	let ret = data.replace(/<div class="zy-h5-bf-bar">/g,'<div class="zy-h5-bf-bar" style="display:none">')
-    	ret = ret.replace(/<div class="zy-h5-fx-bar">/g,'<div class="zy-h5-fx-bar" style="display:none">')
-    	return ret
-    },
-    // 预览
-    scanForm (formData){
-      scanActive(formData).then(res => {
-        // console.info(res,'scanForm')
-        if(res.data){
-          this.showScanTpl = true
-          this.previewHtml = this.fiterFooter(res.data)
-          //  给iframe传参
-          this.sendMessage()
-        }else{
-          this.$message.error('模板解析错误')
-        }
-      })
-    },
-    // 保存
-    saveForm (formData){
-      this.btnLoading = true
-      saveActive(formData).then(res => {
-        // console.info(res,'success')
-        if(res.status == 200){
-          this.$message.info('保存成功')
-          this.showScanTpl = false
-          this.cansel()
-          this.$emit("saveOk")
-        }else{
-          this.$message.error(res.message)
-        }
-        this.btnLoading = false
-      })
-    },
-    cansel() {
-      this.$emit("cansel")
-    },
-    setData(data){
-      // 编辑
-      if(data&&data.id){
-        activeViews({id: data.id}).then(res => {
-          if(res.status == 200){
-            this.formData = Object.assign(this.formData, res.data)
-            // console.log(this.formData)
-            let activeAttachList = []
-            this.formData.activeAttachList.map(item => {
-              activeAttachList.push(item.attachPath)
-            })
-            this.formData.activeAttachList = activeAttachList.join(',')
-            this.$refs.activeAttach.setFileList(activeAttachList.join(','))
-            this.$refs.showPicture.setFileList(this.formData.showPicture)
-            this.getTheme()
-          }
-        })
-      }else{
-        this.formData = Object.assign(this.formData, data)
-        this.getTheme()
-      }
-    },
-    resetForm(){
-      this.formData = baseForm()
-      this.themeList = []
-      this.thumbImg = ''
-      this.previewHtml = ''
-      this.$refs.activeAttach.setFileList('')
-      this.$refs.showPicture.setFileList('')
-      this.form.resetFields()
-      // console.log(this.formData)
-    },
-    // 给iframe传参
-    sendMessage() {
-      this.$refs.h5DomView.sendMessage(this.previewHtml)
-    }
-  },
-  mounted () {
-  },
-}
-</script>
-
-<style lang="less"> 
-  .tplType-container{
-    display: flex;
-    .tpl-left{
-      width: 320px;
-    }
-    .tplAttr{
-      flex-grow: 1;
-      background: #fff;
-      margin-left: 20px;
-      border-radius: 5px;
-    }
-    .themList{
-      padding: 5px 15px;
-      border: 1px solid #eee;
-      .ant-radio-wrapper-checked{
-        .themList-imgs{
-          border-color: #179bff;
-        }
-        .themList-name{
-          color: dodgerblue;
-        }
-      }
-      .themList-imgs{
-        width: 80px;
-        height: 80px;
-        border: 1px solid #eee;
-        border-radius: 3px;
-        padding: 3px;
-        img{
-          max-width: 100%;
-          max-height: 100%;
-        }
-      }
-      .ant-radio-group{
-        width: 100%;
-        overflow: hidden;
-        label{
-          float: left;
-          text-align: center;
-          width: 80px;
-          height: 150px;
-        }
-        .ant-radio{
-          margin: 5px;
-        }
-      }
-      .themList-name{
-        text-align: center;
-        width: 80px;
-        white-space: pre-wrap;
-        padding: 5px;
-      }
-    }
-  }
-</style>

+ 0 - 17
src/views/activity/preview.vue

@@ -1,17 +0,0 @@
-<template>
-  <div></div>
-</template>
-<script>
-  export default{
-    data(){
-      return{
-        msg: null
-      }
-    },
-    mounted() {
-    	 
-    }
-  }
-</script>
-<style lang="less">
-</style>

+ 0 - 101
src/views/activity/statisticModal.vue

@@ -1,101 +0,0 @@
-<template>
-  <a-modal
-    class="modalBox"
-    title="详情"
-    v-model="isshow"
-    @cancel="isshow=false"
-    width="800px"
-    footer="">
-    <s-table
-      ref="table"
-      size="default"
-      rowKey="detailId"
-      :columns="columnsDet"
-      :data="loadData"
-      bordered
-    >
-    </s-table>
-  </a-modal>
-</template>
-
-<script>
-import { STable, VSelect } from '@/components'
-import { activeDetails } from '@/api/active.js'
-export default {
-  name: 'StatisticsModal',
-  components: {
-    STable, VSelect
-  },
-  props: {
-    showDetailModal: {
-      type: Boolean,
-      default: false
-    },
-    activeId: {
-      type: [String, Number],
-      default: ''
-    }
-  },
-  watch: {
-    showDetailModal: function (newValue, oldValue) {
-      if (newValue) {
-        this.isshow = newValue
-      }
-    },
-    isshow: function (newValue, oldValue) {
-      if (newValue) {
-       this.$refs.table.refresh(true)
-      } else {
-        this.$emit('close')
-      }
-    }
-  },
-  data () {
-    return {
-      isshow: this.showDetailModal,
-       // 详情弹框 表头
-       columnsDet: [
-         {
-           title: '序号',
-           dataIndex: 'no',
-           width: '40',
-           align: 'center'
-         },
-         {
-           title: '使用企业名称',
-           dataIndex: 'storeName',
-           align: 'center'
-         },
-         {
-           title: '参加用户数',
-           dataIndex: 'joiners',
-           width: '100',
-           align: 'center'
-         }
-       ],
-       // 加载数据方法 必须为 Promise 对象
-       loadData: parameter => {
-         return activeDetails(Object.assign(parameter, { id: this.activeId }))
-           .then(res => {
-             console.log(res, 'rrrrrrrr')
-             if (res.status == 200) {
-               const no = (res.data.pageNo - 1) * res.data.pageSize
-               for (let i = 0; i < res.data.list.length; i++) {
-                 const _item = res.data.list[i]
-                 _item.no = no + i + 1
-               }
-               return res.data
-             }
-           })
-       }
-    }
-  },
-  mothods: {
-    pageInit (){
-    }
-  }
-}
-</script>
-
-<style>
-</style>

+ 0 - 219
src/views/activity/statistics.vue

@@ -1,219 +0,0 @@
-<template>
-  <a-card :bordered="false">
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline" :form="form">
-        <a-row :gutter="48">
-          <a-col :md="8" :sm="24">
-            <a-form-item label="创建时间">
-              <a-range-picker v-model="time" :placeholder="['开始时间','结束时间']" @change="onChange"/>
-              <!-- <a-input allowClear v-model="queryParam.name" placeholder="请选择创建时间"/> -->
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <a-form-item label="活动名称">
-              <a-input allowClear v-model="queryParam.name" placeholder="请输入活动名称"/>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <a-form-item label="分类">
-              <v-select ref="activeClz" code="ACTIVE_CLZ" v-model="queryParam.activeClz" allowClear placeholder="请选择" ></v-select>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <a-form-item label="状态">
-              <v-select code="ACTIVE_RELEASE_STATUS" v-model="queryParam.releaseStatus" allowClear placeholder="请选择" ></v-select>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <a-button style="margin-right: 10px;" type="primary" @click="handleSearch">查询</a-button>
-            <a-button type="" @click="handleReset">重置</a-button>
-          </a-col>
-        </a-row>
-      </a-form>
-    </div>
-    <div class="textCount" >
-      <a-icon type="info-circle" style="color: #1890FF;" />
-      <span> 合计:  {{ totalActives }} 个活动, 使用企业数 {{ totalJoiners }} 个</span>
-    </div>
-    <s-table
-      ref="table"
-      size="default"
-      rowKey="id"
-      :columns="columns"
-      :data="loadData"
-      bordered
-    >
-      <!-- 操作 -->
-      <span slot="action" slot-scope="text, record">
-        <template>
-          <a-icon type="eye" :style="{ fontSize: '20px', color: '#e29e14' }" @click="handleLook(record)"/>
-        </template>
-      </span>
-      <!-- 状态 -->
-      <template slot="status" slot-scope="text, row">
-        <span :style="{color:text == 'FB'? '#12b512':'red'}">{{ text == 'FB'? '已启用' : '已禁用' }}</span>
-      </template>
-      <!-- 活动分类 -->
-      <template slot="activeClz" slot-scope="text, row">
-        {{ $refs.activeClz.getNameByCode(text) }}
-      </template>
-    </s-table>
-    <!-- 查看详情 -->
-    <statisticsModal :showDetailModal="showDetailModal" :activeId="activeId" @close="showDetailModal=false"></statisticsModal>
-
-  </a-card>
-</template>
-
-<script>
-import { STable, VSelect } from '@/components'
-import { activeList, totalActive } from '@/api/active.js'
-import statisticsModal from './statisticModal.vue'
-export default {
-  name: 'Statistics',
-  components: {
-    STable, VSelect, statisticsModal
-  },
-  data () {
-    return {
-      time: null,
-      totalActives: '',
-      totalJoiners: '',
-      form: this.$form.createForm(this, { name: 'Statistics' }),
-      //  查询参数
-      queryParam: {
-        beginDate: null,
-        endDate: null,
-        name: '',
-        activeClz: '',
-        releaseStatus: ''
-      },
-      // 表头
-      columns: [
-        {
-          title: '序号',
-          dataIndex: 'no',
-          width: '40',
-          align: 'center'
-        },
-        {
-          title: '创建时间',
-          dataIndex: 'createDate',
-          width: '150',
-          align: 'center'
-        },
-        {
-          title: '活动名称',
-          dataIndex: 'name',
-          width: '100',
-          align: 'center'
-        },
-        {
-          title: '活动分类',
-          dataIndex: 'activeClz',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'activeClz' }
-        },
-        {
-          title: '使用企业数',
-          dataIndex: 'joiners',
-          width: '100',
-          align: 'center'
-        },
-        {
-          title: '状态',
-          dataIndex: 'releaseStatus',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'status' }
-        },
-        {
-          title: '操作',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'action' }
-        }
-      ],
-      // 加载数据方法 必须为 Promise 对象
-      loadData: parameter => {
-        return activeList(Object.assign(parameter, this.queryParam))
-          .then(res => {
-            console.log(res, 'rrrrrrrr')
-            if (res.status == 200) {
-              const no = (res.data.pageNo - 1) * res.data.pageSize
-              for (let i = 0; i < res.data.list.length; i++) {
-                const _item = res.data.list[i]
-                _item.no = no + i + 1
-              }
-              return res.data
-            }
-          })
-      },
-      showDetailModal: false,
-      activeId: ''
-    }
-  },
-  beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.handleReset()
-    })
-  },
-  methods: {
-    // 活动总数统计及使用租户数
-    getTotalActive () {
-      totalActive(this.queryParam).then(res => {
-        console.log(res, 'rrrrrrrrrrrr')
-        if (res.status == 200) {
-          this.totalActives = res.data.actives || 0
-          this.totalJoiners = res.data.joiners || 0
-        }
-      })
-    },
-    handleSearch () {
-      this.$refs.table.refresh()
-      this.getTotalActive()
-    },
-    handleReset () {
-      this.time = null
-      this.queryParam = {
-        beginDate: null,
-        endDate: null,
-        name: '',
-        activeClz: '',
-        releaseStatus: ''
-      }
-      this.$refs.table.refresh()
-      this.getTotalActive()
-    },
-    onChange (dates, dateStrings) {
-      console.log('From: ', dates[0], ', to: ', dates[1])
-      this.queryParam.beginDate = dateStrings[0]
-      this.queryParam.endDate = dateStrings[1]
-    },
-    //  查看详情
-    handleLook (row) {
-      this.showDetailModal = true
-      this.activeId = row.id
-    }
-  }
-  
-}
-</script>
-
-<style scoped>
-  .msg-con.ant-alert-info{
-    margin: 20px 0 10px;
-    /* padding: 10px 30px;
-    background-color: #efefef;
-    border: none;
-    border-radius: 41px; */
-  }
-  .textCount{
-    border: 1px solid #91d5ff;
-    background-color: #e6f7ff;
-    padding: 10px 0;
-    border-radius: 5px;
-    padding-left: 20px;
-    margin:0 0 10px 0;
-  }
-</style>

+ 0 - 158
src/views/activity/tpl/selTplList.vue

@@ -1,158 +0,0 @@
-<template>
-  <a-card :bordered="false" style="padding: 0;">
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline">
-        <a-row :gutter="48">
-          <a-col :md="12" :sm="24">
-            <a-form-item label="模板名称">
-              <a-input allowClear v-model="queryParam.name" placeholder="请输入活动名称"/>
-            </a-form-item>
-          </a-col>
-          <a-col :md="12" :sm="24">
-            <a-button style="margin-right: 10px;" type="primary" @click="$refs.table.refresh(true)">查询</a-button>
-            <a-button type="" @click="resetForm">重置</a-button>
-          </a-col>
-        </a-row>
-      </a-form>
-    </div>
-   <div class="tplTypeList">
-     <s-table
-       ref="table"
-       size="default"
-       rowKey="id"
-       :columns="columns"
-       :data="loadData"
-       bordered
-     > 
-       <span slot="action" slot-scope="text, record">
-         <template>
-           <a class="action-button themeSet" @click="themeSet(record)">选择</a>
-         </template>
-       </span>
-     </s-table>
-   </div>
-  </a-card>
-</template>
-
-<script>
-  import { STable, VSelect } from '@/components'
-  import { getThemeByMouldId } from '@/api/theme'
-  import { getTplList } from '@/api/tpl'
-  export default{
-    name: 'selTplList',
-    components: {
-      STable, VSelect
-    },
-    data(){
-      return{
-        visible: false,
-        moudelId: '',
-        moudelName: '',
-        //  查询参数
-        queryParam: {
-          name: '',
-          status: '1'
-        },
-        // 表头
-        columns: [
-          {
-            title: '序号',
-            dataIndex: 'no',
-            width: '80px',
-            align: 'center'
-          },
-          {
-            title: '模板名称',
-            dataIndex: 'name',
-            align: 'center'
-          },
-          {
-            title: '创建时间',
-            dataIndex: 'createDate',
-            width: '200px',
-            align: 'center'
-          },
-          {
-            title: '操作',
-            width: '100px',
-            align: 'center',
-            scopedSlots: { customRender: 'action' }
-          }
-        ],
-        // 加载数据方法 必须为 Promise 对象
-        loadData: parameter => {
-          return getTplList(Object.assign(parameter, this.queryParam))
-            .then(res => {
-              const no = (res.data.pageNo - 1) * res.data.pageSize
-              for (let i = 0; i < res.data.list.length; i++) {
-                const _item = res.data.list[i]
-                _item.no = no + i + 1
-                _item.status = _item.status + '' === '1'
-              }
-              return res.data
-            })
-        },
-      }
-    },
-    methods: {
-      // 主题维护
-      themeSet (row){
-        this.moudelId = row.id
-        this.getTheme()
-      },
-      // 获取主题列表
-      getTheme(){
-        getThemeByMouldId({staticMouldId: this.moudelId})
-        .then(res => {
-          console.log(res)
-           if(res.data&&res.data.length){
-             this.$emit('selTpl', this.moudelId)
-           }else{
-             this.$message.info('此模板还没有上传主题文件')
-           }
-        })
-      },
-      resetForm (){
-        this.clearForm()
-        this.$refs.table.refresh(true)
-      },
-      clearForm (){
-        this.queryParam.name = ''
-        this.queryParam.status = ''
-      }
-    }
-  }
-</script>
-
-<style lang="less">
-  .tplTypeList{
-    .action-button{
-     line-height: 40px;
-     white-space: nowrap;
-      padding: 5px 10px;
-      background-color: #1890ff;
-      border-radius: 4px;
-      color: #fff;
-      margin-right: 5px;
-      &:hover{
-        background-color: #1db8ff;
-        color: #fff;
-      }
-    }
-    .themeSet{
-      background-color: #54c71e;
-      &:hover{
-        background-color: #00aa00;
-        color: #fff;
-      }
-    }
-    .delBtns{
-      background-color: #FF0000;
-      &:hover{
-        background-color: #b91818;
-        color: #fff;
-      }
-    }
-  }
-  
-</style>

+ 0 - 193
src/views/activity/tpl/theme.vue

@@ -1,193 +0,0 @@
-<template>
-  <div class="ThemeType-container">
-     <!-- <div class="Theme-left">
-       <h5View ref="h5view" :thumbImg="formData.thumbImg"></h5View>
-     </div> -->
-     <div class="ThemeAttr">
-       <a-form :form="form">
-          <a-row>
-              <a-col :span="24">
-                 <a-form-item
-                   :label-col="formItemLayout.labelCol"
-                   :wrapper-col="formItemLayout.wrapperCol"
-                   label="主题名称"
-                 >
-                   <a-input
-                     v-decorator="[
-                       'formData.name',
-                       { initialValue: formData.name,
-                         rules: [{ required: true, message: '请输入主题名称' }]
-                       },
-                     ]"
-                     placeholder="请输入主题名称"
-                   />
-                 </a-form-item>
-             </a-col>
-             <a-col :span="24">
-                 <a-form-item
-                   :label-col="formItemLayout.labelCol"
-                   :wrapper-col="formItemLayout.wrapperCol"
-                   label="状态"
-                 >
-                    <a-radio-group
-                      name="radioGroup"
-                      v-decorator="[
-                        'formData.status',
-                        {
-                          initialValue: formData.status,
-                          rules: [{ required: true, type: 'number', message: '请选择状态!' }] },
-                      ]"
-                    >
-                      <a-radio :value="1">启用</a-radio>
-                      <a-radio :value="0">禁用</a-radio>
-                    </a-radio-group>
-                 </a-form-item>
-             </a-col>
-             <a-col :span="24">
-                 <a-form-item
-                   :label-col="formItemLayout.labelCol"
-                   :wrapper-col="formItemLayout.wrapperCol"
-                   label="是否默认"
-                 >
-                    <a-radio-group
-                      name="radioGroup"
-                      v-decorator="[
-                        'formData.isDefault',
-                        {
-                          initialValue: formData.isDefault,
-                          rules: [{ required: true, type: 'number', message: '请选择是否默认!' }] },
-                      ]"
-                    >
-                      <a-radio :value="1">是</a-radio>
-                      <a-radio :value="0">否</a-radio>
-                    </a-radio-group>
-                 </a-form-item>
-             </a-col>
-           </a-row>
-           <a-row>
-             <a-col :span="24">
-               <a-form-item
-                 label="主题文件"
-                 :label-col="formItemLayout.labelCol"
-                 :wrapper-col="formItemLayout.wrapperCol"
-                 >
-                 <div style="display: block;">
-                   <Upload
-                     v-decorator="[
-                       'formData.basePath',
-                       {
-                         initialValue: formData.basePath,
-                         rules: [{required: true,message: '请选择主题文件!'}]
-                       }]"
-                     ref="upfile"
-                     :action="action"
-                     :maxNums="1"
-                     :fileSize="1"
-                     fileType="application/x-zip-compressed"
-                     upText="主题文件">
-                   </Upload>
-                 </div>
-                 <div style="line-height: 16px;clear: both;padding-top: 10px;color: #999;">(zip格式文件,大小不能超过1M,压缩包里面的文件名称不能是中文)</div>
-               </a-form-item>
-             </a-col>
-           </a-row>
-           <a-form-item :label-col="formTailLayout.labelCol" :wrapper-col="formTailLayout.wrapperCol">
-             <a-button type="primary" @click="save">
-               保存
-             </a-button>
-             <a-button style="margin-left: 20px;" @click="cansel">
-               取消
-             </a-button>
-           </a-form-item>
-         </a-form>
-     </div>
-  </div>
-</template>
-
-<script>
-import { Upload } from '@/components'
-import { saveTheme, getThemeDetail } from '@/api/theme.js'
-const formItemLayout = {
-            labelCol: { span: 5 },
-            wrapperCol: { span: 14 },
-          };
-const formTailLayout = {
-  wrapperCol: {offset: 8 },
-};
-const vForm = {
-        staticMouldId: '',
-        id: '',
-        name: '',
-        basePath: '',
-        status: '1',
-        isDefault: '0'
-      }
-export default {
-  name: 'theme',
-  components: {
-    Upload
-  },
-  props: {
-    moudelId: {
-      type: [String, Number],
-      default: ''
-    },
-  },
-  data () {
-    return {
-      action: process.env.VUE_APP_API_BASE_URL + '/static/theme/upload',
-      formItemLayout,
-      formTailLayout,
-      form: this.$form.createForm(this),
-      formData: vForm
-    }
-  },
-  methods: { 
-    save() {
-      const { form: { validateFields } } = this
-      validateFields((errors, values) => {
-        if (!errors) {
-          this.formData.staticMouldId = this.moudelId
-          console.info(values.formData,this.formData,'success');
-          saveTheme(Object.assign({},this.formData, values.formData)).then(res => {
-            if(res.status == 200){
-              this.cansel()
-              this.$message.info(res.message)
-              this.$emit("update")
-            }
-          })
-        }
-      });
-    },
-    cansel() {
-      this.resetForm()
-      this.$emit("cansel")
-    },
-    setData(data){
-      getThemeDetail({id: data.id}).then(res => {
-         console.log(res)
-         this.formData = Object.assign({} , this.formData, res.data)
-         this.formData.status = Number(this.formData.status)
-         this.formData.isDefault = Number(this.formData.isDefault)
-         this.$refs.upfile.setFileList(this.formData.basePath)
-      })
-    },
-    resetForm(){
-      this.form.resetFields()
-      this.formData = vForm
-      this.$refs.upfile.setFileList('')
-    }
-  }
-}
-</script>
-
-<style lang="less"> 
-  .ThemeType-container{
-    .ThemeAttr{
-      padding:0;
-      flex-grow: 1;
-      background: #fff;
-      border-radius: 5px;
-    }
-  }
-</style>

+ 0 - 195
src/views/activity/tpl/themeList.vue

@@ -1,195 +0,0 @@
-<template>
-  <div class="themeList">
-    <div class="table-operator">
-      <a-button type="primary" icon="plus" @click="openModal">添加主题</a-button>
-    </div>
-    <div class="ThemeTypeList">
-      <s-table
-        ref="table"
-        size="default"
-        rowKey="id"
-        :columns="columns"
-        :data="loadData"
-        bordered
-      >
-        <span slot="status" slot-scope="text, record">
-          <a-switch checkedChildren="" unCheckedChildren="" v-model="record.status" @change="changeFlagHandle(text, record)"/>
-        </span>
-        <span slot="action" slot-scope="text, record">
-          <template>
-            <a class="action-button editBtns" @click="handleEdit(record)">编辑</a>
-            <!-- <a class="action-button delBtns" v-if="!record.status" @click="delect(record)">删除</a> -->
-          </template>
-        </span>
-      </s-table>
-    </div>
-
-    <!-- 新建主题弹框 -->
-    <a-modal :title="mtitle" width="40%" :footer="null" @cancel="canselModal" v-model="visible">
-      <theme ref="theme" :moudelId="moudelId" @update="$refs.table.refresh(true)" @cansel="canselModal"></theme>
-    </a-modal>
-  </div>
-</template>
-
-<script>
-import { STable, VSelect } from '@/components'
-import { getThemeList, updateEnableStatus, delTheme } from '@/api/theme'
-import theme from './theme.vue'
-export default {
-  name: 'ThemeList',
-  components: {
-    STable, VSelect, theme
-  },
-  props: {
-    moudelId: {
-      type: [String, Number],
-      default: ''
-    }
-  },
-  watch: {
-    moudelId (newValue, oldValue) {
-      if (newValue != '') {
-        this.mdid = newValue
-        this.$refs.table.refresh(true)
-      }
-    }
-  },
-  data () {
-    return {
-      visible: false,
-      openTheme: false,
-      mdid: this.moudelId,
-      mtitle: '新建主题',
-      // 表头
-      columns: [
-        {
-          title: '序号',
-          dataIndex: 'no',
-          width: '80px',
-          align: 'center'
-        },
-        {
-          title: '主题名称',
-          dataIndex: 'name',
-          align: 'center'
-        },
-        {
-          title: '创建时间',
-          dataIndex: 'createDate',
-          width: '200px',
-          align: 'center'
-        },
-        {
-          title: '状态',
-          width: '100px',
-          align: 'center',
-          scopedSlots: { customRender: 'status' }
-        },
-        {
-          title: '操作',
-          width: '200px',
-          align: 'center',
-          scopedSlots: { customRender: 'action' }
-        }
-      ],
-      // 加载数据方法 必须为 Promise 对象
-      loadData: parameter => {
-        return getThemeList(Object.assign(parameter, { staticMouldId: this.mdid }))
-          .then(res => {
-            const no = (res.data.pageNo - 1) * res.data.pageSize
-            for (let i = 0; i < res.data.list.length; i++) {
-              const _item = res.data.list[i]
-              _item.no = no + i + 1
-              _item.status = _item.status + '' === '1'
-            }
-            return res.data
-          })
-      }
-    }
-  },
-  methods: {
-    // 新建
-    openModal () {
-      this.mtitle = '新建主题'
-      this.visible = true
-    },
-    // 取消
-    canselModal () {
-      this.visible = false
-      this.$refs.theme.resetForm()
-    },
-    //  修改
-    handleEdit (row) {
-      this.mtitle = '编辑主题'
-      this.visible = true
-      setTimeout(() => {
-        this.$refs.theme.setData(row)
-      }, 200)
-    },
-    // 删除
-    delect (row) {
-      const _this = this
-      this.$confirm({
-        title: '警告',
-        content: '删除后无法恢复,确认删除?',
-        okText: '确定',
-        cancelText: '取消',
-        onOk () {
-          delTheme({
-            id: row.id
-          }).then(res => {
-            if (res.status == 200) {
-              _this.$message.success('删除成功')
-              _this.$refs.table.refresh()
-            }
-          })
-        }
-      })
-    },
-    // 修改状态
-    changeFlagHandle (text, record) {
-      const _data = {
-        id: record.id,
-        flag: record.status ? '1' : '0'
-      }
-      updateEnableStatus(_data).then(res => {
-        if (res.status == '200') {
-          this.$message.success('修改成功')
-          this.$refs.table.refresh()
-        } else {
-          record.status = !record.status
-        }
-      })
-    }
-  }
-}
-</script>
-
-<style lang="less">
-  .themeList{
-    .table-operator{
-      margin-bottom: 20px;
-    }
-    .action-button{
-     line-height: 40px;
-     white-space: nowrap;
-      padding: 5px 10px;
-      background-color: #1890ff;
-      border-radius: 4px;
-      color: #fff;
-      margin-right: 5px;
-      &:hover{
-        background-color: #1db8ff;
-        color: #fff;
-      }
-    }
-    .delBtns{
-      background-color: #FF0000;
-      &:hover{
-        background-color: #b91818;
-        color: #fff;
-      }
-    }
-  }
-
-</style>

+ 0 - 183
src/views/activity/tpl/tplType.vue

@@ -1,183 +0,0 @@
-<template>
-  <div class="tplType-container">
-     <!-- <div class="tpl-left">
-       <h5View ref="h5view" :thumbImg="formData.thumbImg"></h5View>
-     </div> -->
-     <div class="tplAttr">
-       <a-form :form="form" layout="vertical">
-          <a-row>
-              <a-col :span="12">
-                 <a-form-item
-                   :label-col="formItemLayout.labelCol"
-                   :wrapper-col="formItemLayout.wrapperCol"
-                   label="模板名称"
-                 >
-                   <a-input
-                     v-decorator="[
-                       'formData.name',
-                       { initialValue: formData.name,
-                         rules: [{ required: true, message: '请输入模板名称' }]
-                       },
-                     ]"
-                     placeholder="请输入模板名称"
-                   />
-                 </a-form-item>
-             </a-col>
-             <a-col :span="10" :offset="1">
-                 <a-form-item
-                   :label-col="formItemLayout.labelCol"
-                   :wrapper-col="formItemLayout.wrapperCol"
-                   label="状态"
-                 >
-                    <a-radio-group
-                      name="radioGroup"
-                      v-decorator="[
-                        'formData.status',
-                        {
-                          initialValue: formData.status,
-                          rules: [{ required: true, type: 'number', message: '请选择状态!' }] },
-                      ]"
-                    >
-                      <a-radio :value="1">启用</a-radio>
-                      <a-radio :value="0">禁用</a-radio>
-                    </a-radio-group>
-                 </a-form-item>
-             </a-col>
-           </a-row>
-           <!-- <a-row>
-             <a-col :span="24">
-               <a-form-item
-                 label="模板主题"
-                 :label-col="formItemLayout.labelCol"
-                 :wrapper-col="formItemLayout.wrapperCol"
-                 >
-                 <Upload
-                   v-decorator="[
-                     'formData.thumbImg',
-                     {
-                       initialValue: formData.thumbImg,
-                       rules: [{required: true,message: '请选择主题文件!'}]
-                     }]"
-                   ref="up7"
-                   :maxNums="5"
-                   fileType="application/x-zip-compressed"
-                   upText="主题文件">
-                 </Upload>
-               </a-form-item>
-             </a-col>
-           </a-row> -->
-           <a-form-item
-             :label-col="formItemLayout.labelCol"
-             :wrapper-col="formItemLayout.wrapperCol"
-             label="模板代码"
-           >
-             <a-textarea
-               :rows="12"
-               v-decorator="[
-                 'formData.mouldContent',
-                 { initialValue: formData.mouldContent,
-                   rules: [{ required: true, message: '请输入模板代码' }] 
-                 },
-               ]"
-               placeholder="请输入模板代码"
-             />
-           </a-form-item>
-           <a-form-item :label-col="formTailLayout.labelCol" :wrapper-col="formTailLayout.wrapperCol">
-             <a-button type="primary" @click="save">
-               保存
-             </a-button>
-             <a-button style="margin-left: 20px;" @click="cansel">
-               取消
-             </a-button>
-           </a-form-item>
-         </a-form>
-     </div>
-  </div>
-</template>
-
-<script>
-import { Upload } from '@/components'
-import { saveTpl, getTplDetail } from '@/api/tpl'
-const formItemLayout = {};
-const formTailLayout = {
-  wrapperCol: {offset: 8 },
-};
-const vForm = {
-        id: '',
-        name: '',
-        mouldContent: '',
-        status: '1'
-      }
-export default {
-  name: 'tplType',
-  components: {
-    Upload
-  },
-  data () {
-    return {
-      formItemLayout,
-      formTailLayout,
-      form: this.$form.createForm(this),
-      formData: vForm
-    }
-  },
-  methods: { 
-    save() {
-      const { form: { validateFields } } = this
-      validateFields(vForm,(errors, values) => {
-        console.log(errors)
-        if (!errors) {
-          console.info(values.formData,this.formData,'success');
-          saveTpl(Object.assign({},this.formData, values.formData)).then(res => {
-            if(res.status == 200){
-              this.cansel()
-              this.$message.info(res.message)
-              this.$emit("update")
-            }
-          })
-        }
-      });
-    },
-    cansel() {
-      this.resetForm()
-      this.$emit("cansel")
-    },
-    beforeUpload (file) {
-      console.log(file)
-      if(file.size > 200 * 1024){
-        this.$message.warning("图片不能超过200K")
-        return false
-      }
-      uploadImgOnce('serverItem', file).then(res => {
-        console.log(res)
-        this.formData.image = res.fileName
-      })
-      return false
-    },
-    setData(data){
-      getTplDetail({id: data.id}).then(res => {
-         console.log(res)
-         this.formData = Object.assign({} , this.formData, res.data)
-         this.formData.status = Number(this.formData.status)
-      })
-    },
-    resetForm(){
-      this.form.resetFields()
-      this.formData = vForm
-    }
-  }
-}
-</script>
-
-<style lang="less"> 
-  .tplType-container{
-    display: flex;
-    .tplAttr{
-      padding:15px;
-      flex-grow: 1;
-      background: #fff;
-      margin-left: 10px;
-      border-radius: 5px;
-    }
-  }
-</style>

+ 0 - 233
src/views/activity/tpl/tplTypeList.vue

@@ -1,233 +0,0 @@
-<template>
-  <a-card :bordered="false">
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline">
-        <a-row :gutter="48">
-          <a-col :md="6" :sm="24">
-            <a-form-item label="模板名称">
-              <a-input allowClear v-model="queryParam.name" placeholder="请输入活动名称"/>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <a-form-item label="状态">
-              <v-select code="CHECK_ENABLE_STATE" v-model="queryParam.status" placeholder="请选择状态" allowClear ></v-select>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="24">
-            <a-button style="margin-right: 10px;" type="primary" @click="$refs.table.refresh(true)">查询</a-button>
-            <a-button type="" @click="resetForm">重置</a-button>
-          </a-col>
-        </a-row>
-      </a-form>
-    </div>
-    <div class="table-operator">
-      <a-button type="primary" icon="plus" @click="openModal">新建</a-button>
-    </div>
-    <div class="tplTypeList">
-      <s-table
-        ref="table"
-        size="default"
-        rowKey="id"
-        :columns="columns"
-        :data="loadData"
-        bordered
-      >
-        <span slot="status" slot-scope="text, record">
-          <a-switch checkedChildren="" unCheckedChildren="" v-model="record.status" @change="changeFlagHandle(text, record)"/>
-        </span>
-        <span slot="action" slot-scope="text, record">
-          <template>
-            <a class="action-button themeSet" @click="themeSet(record)">主题设置</a>
-            <a class="action-button editBtns" @click="handleEdit(record)">编辑</a>
-            <!-- <a class="action-button delBtns" v-if="!record.status" @click="delect(record)">删除</a> -->
-          </template>
-        </span>
-      </s-table>
-    </div>
-
-    <!-- 新建模板弹框 -->
-    <a-modal :title="mtitle" width="60%" :footer="null" @cancel="canselModal" v-model="visible">
-      <tplType ref="tplType" @update="$refs.table.refresh(true)" @cansel="canselModal"></tplType>
-    </a-modal>
-    <!-- 主题维护 -->
-    <a-modal :title="'主题维护-'+moudelName" width="60%" :footer="null" @cancel="closeTheme" v-model="openTheme">
-      <themeList :moudelId="moudelId" :moudelName="moudelName"></themeList>
-    </a-modal>
-  </a-card>
-</template>
-
-<script>
-import { STable, VSelect } from '@/components'
-import themeList from './themeList.vue'
-import { getTplList, updateEnableStatus, delTpl } from '@/api/tpl'
-import tplType from './tplType.vue'
-export default {
-  name: 'TplList',
-  components: {
-    STable, VSelect, tplType, themeList
-  },
-  data () {
-    return {
-      visible: false,
-      openTheme: false,
-      mtitle: '新建模板',
-      moudelId: '',
-      moudelName: '',
-      //  查询参数
-      queryParam: {
-        name: '',
-        status: ''
-      },
-      // 表头
-      columns: [
-        {
-          title: '序号',
-          dataIndex: 'no',
-          width: '80px',
-          align: 'center'
-        },
-        {
-          title: '模板名称',
-          dataIndex: 'name',
-          align: 'center'
-        },
-        {
-          title: '创建时间',
-          dataIndex: 'createDate',
-          width: '200px',
-          align: 'center'
-        },
-        {
-          title: '状态',
-          width: '100px',
-          align: 'center',
-          scopedSlots: { customRender: 'status' }
-        },
-        {
-          title: '操作',
-          width: '300px',
-          align: 'center',
-          scopedSlots: { customRender: 'action' }
-        }
-      ],
-      // 加载数据方法 必须为 Promise 对象
-      loadData: parameter => {
-        return getTplList(Object.assign(parameter, this.queryParam))
-          .then(res => {
-            const no = (res.data.pageNo - 1) * res.data.pageSize
-            for (let i = 0; i < res.data.list.length; i++) {
-              const _item = res.data.list[i]
-              _item.no = no + i + 1
-              _item.status = _item.status + '' === '1'
-            }
-            return res.data
-          })
-      }
-    }
-  },
-  methods: {
-    // 主题维护
-    themeSet (row) {
-      this.openTheme = true
-      this.moudelId = row.id
-      this.moudelName = row.name
-    },
-    closeTheme () {
-      this.openTheme = false
-      this.moudelId = ''
-      this.moudelName = ''
-    },
-    // 新建
-    openModal () {
-      this.mtitle = '新建模板'
-      this.visible = true
-    },
-    // 取消
-    canselModal () {
-      this.visible = false
-      this.$refs.tplType.resetForm()
-    },
-    //  修改
-    handleEdit (row) {
-      this.mtitle = '编辑模板'
-      this.visible = true
-      setTimeout(() => {
-        this.$refs.tplType.setData(row)
-      }, 200)
-    },
-    // 删除
-    delect (row) {
-      const _this = this
-      this.$confirm({
-        title: '警告',
-        content: '删除后无法恢复,确认删除?',
-        okText: '确定',
-        cancelText: '取消',
-        onOk () {
-          delTpl({
-            id: row.id
-          }).then(res => {
-            if (res.status == 200) {
-              _this.$message.success('删除成功')
-              _this.$refs.table.refresh()
-            }
-          })
-        }
-      })
-    },
-    // 修改状态
-    changeFlagHandle (text, record) {
-      const _data = {
-        id: record.id,
-        flag: record.status ? '1' : '0'
-      }
-      updateEnableStatus(_data).then(res => {
-        if (res.status == '200') {
-          this.$message.success('修改成功')
-          this.$refs.table.refresh()
-        } else {
-          record.status = !record.status
-        }
-      })
-    },
-    resetForm () {
-      this.queryParam.name = ''
-      this.queryParam.status = ''
-      this.$refs.table.refresh(true)
-    }
-  }
-}
-</script>
-
-<style lang="less">
-  .tplTypeList{
-    .action-button{
-     line-height: 40px;
-     white-space: nowrap;
-      padding: 5px 10px;
-      background-color: #1890ff;
-      border-radius: 4px;
-      color: #fff;
-      margin-right: 5px;
-      &:hover{
-        background-color: #1db8ff;
-        color: #fff;
-      }
-    }
-    .themeSet{
-      background-color: #54c71e;
-      &:hover{
-        background-color: #00aa00;
-        color: #fff;
-      }
-    }
-    .delBtns{
-      background-color: #FF0000;
-      &:hover{
-        background-color: #b91818;
-        color: #fff;
-      }
-    }
-  }
-
-</style>

+ 0 - 247
src/views/appSetting/addEditionSetting.vue

@@ -1,247 +0,0 @@
-<template>
-  <div class="addPage">
-     <div class="formBox">
-       <a-form :form="form" @submit="handleSubmit">
-          <a-row>
-              <a-col :span="24">
-                 <a-form-item
-                   :label-col="formItemLayout.labelCol"
-                   :wrapper-col="formItemLayout.wrapperCol"
-                   label="版本号"
-                 >
-                  <a-input
-                    v-decorator="[
-                      'formData.version',
-                      { initialValue: formData.version,
-                        rules: [{ required: true, message: '请输入版本号' }]
-                      },
-                    ]"
-                    placeholder="请输入版本号"
-                  /> 
-                 </a-form-item>
-             </a-col>
-             <a-col :span="24">
-                 <a-form-item
-                   :label-col="formItemLayout.labelCol"
-                   :wrapper-col="formItemLayout.wrapperCol"
-                   label="请选择更新时间"
-                 >
-                   <a-date-picker
-                      show-time
-                      placeholder="年/月/日 时/分/秒"
-                      v-decorator="[
-                        'formData.updateDate',
-                        { initialValue: formData.updateDate,
-                          rules: [{required: true, message: '请选择更新时间!' }] },
-                      ]" />
-                 </a-form-item>
-             </a-col>
-             <a-col :span="24">
-                 <a-form-item
-                   :label-col="formItemLayout.labelCol"
-                   :wrapper-col="formItemLayout.wrapperCol"
-                   label="强制升级"
-                 >
-                    <a-radio-group
-                      name="radioGroup"
-                      @change="onChange"
-                      v-decorator="[
-                        'formData.forceUpgrade',
-                        {
-                          initialValue: formData.forceUpgrade,
-                          rules: [{ required: true, type: 'number', message: '请选择是否强制升级!' }] },
-                      ]"
-                    >
-                      <a-radio :value="1">是</a-radio>
-                      <a-radio :value="0">否</a-radio>
-                    </a-radio-group>
-                 </a-form-item>
-             </a-col>
-             <a-col :span="24">
-              <a-form-item
-                :label-col="formItemLayout.labelCol"
-                :wrapper-col="formItemLayout.wrapperCol"
-                label="下载链接"
-              >
-                <a-input
-                  v-decorator="[
-                    'formData.downloadUrl',
-                    { initialValue: formData.downloadUrl,
-                      rules: [{ message: '请输入下载链接' }]
-                    },
-                  ]"
-                  placeholder="请输入下载链接"
-                />
-              </a-form-item> 
-             </a-col>
-              <a-col :span="24">
-               <a-form-item
-                 :label-col="formItemLayout.labelCol"
-                 :wrapper-col="formItemLayout.wrapperCol"
-                 label="升级内容"
-               >
-                
-                 <a-textarea placeholder="请输入升级内容" auto-size  
-                 v-decorator="[
-                     'formData.upgradeContent',
-                     { initialValue: formData.upgradeContent,
-                       rules: [{ required: true, message: '请输入升级内容' }]
-                     },
-                   ]"
-                   />
-               </a-form-item> 
-              </a-col>
-           </a-row>
-           <a-row>
-             <a-col :span="24">
-               <a-form-item
-                 label="附件"
-                 :label-col="formItemLayout.labelCol"
-                 :wrapper-col="formItemLayout.wrapperCol"
-                 >
-                 <div style="display: block;">
-                   <Upload
-                     ref="upfile"
-                     :maxNums="1"
-                     :fileSize="100"
-                     v-decorator="[
-                         'formData.attachment',
-                         { initialValue: formData.attachment,
-                           rules: [{ required: true, message: '请上传app安装文件' }]
-                         },
-                       ]"
-                     fileType="application/vnd.android.package-archive"
-                     upText="附件上传">
-                   </Upload>
-                 </div>
-                 <div style="line-height: 16px;clear: both;padding-top: 10px;color: #999;">(上传apk格式文件)</div>
-               </a-form-item>
-             </a-col>
-           </a-row>
-           <a-form-item :label-col="formTailLayout.labelCol" :wrapper-col="formTailLayout.wrapperCol">
-             <a-button htmlType="submit" type="primary">
-               保存
-             </a-button>
-             <a-button style="margin-left: 20px;" @click="cansel">
-               返回列表
-             </a-button>
-           </a-form-item>
-         </a-form>
-     </div>
-  </div>
-</template>
-
-<script>
-import { Upload } from '@/components'
-import { saveItem,editItem} from '@/api/editionSetting.js'
-import moment from 'moment'
-
-const formItemLayout = {
-            labelCol: { span: 3 },
-            wrapperCol: { span: 6 },
-          };
-const formTailLayout = {
-  wrapperCol: {offset: 5 },
-};
-export default {
-  name: 'AddeditionSetting',
-  components: {
-    Upload
-  },
- 
-  data () {
-    return {
-      formItemLayout,
-      formTailLayout,
-      form: this.$form.createForm(this),
-      formData: {
-        version: '',
-        updateDate: null,
-        downloadUrl: '',
-        forceUpgrade: '0',
-        upgradeContent:'',
-        attachment:''
-      },
-      applyName:'IT后台',
-      applyCode:'zyit',
-      mode1:'time',
-    }
-  },
-  methods: {
-    // 保存
-    handleSubmit (e) {
-      e.preventDefault()
-      const _this = this
-      this.form.validateFields((err, values) => {
-        if (!err) {
-          let query = this.$route.query
-          console.log(this.formData, values.formData,{applyName:'IT后台', applyCode:'zyit'})
-          const formData = Object.assign({}, this.formData, values.formData,{applyName:'IT后台'},{applyCode:'zyit'})
-          formData.updateDate = formData.updateDate.format('YYYY-MM-DD hh:mm:ss')
-          console.log(formData)
-          saveItem(formData).then(res => {
-            console.log(res, 'rrrrrrrrr')
-            if (res.status == 200) {
-              _this.$message.success(res.message ? res.message : '保存成功')
-              _this.$router.push({ name: 'editionSetting_list' })
-            } else {
-              _this.$message.error(res.message)
-            }
-            
-          })
-        }
-      })
-    },
-    // 返回列表
-    cansel() {
-      this.$router.push({ name: 'editionSetting_list' })
-    },
-    // 选择时间
-    handleOpenChange1(open) {
-      console.log(open)
-      if (open) {
-        this.mode1 = 'time';
-      }
-    },
-    // 改变默认选项
-    onChange(e){
-      console.log('radio checked', e.target.value);
-    }
-  },
-  
-  beforeRouteEnter (to, from, next) {
-    next(vm => {
-      console.log(111)
-      // vm.loading = false
-      const params = vm.$route.query
-      console.log(params.id)
-      if (params.id) {
-        editItem({
-          id: params.id
-        }).then(res => {
-          console.log(res)
-          if (res.status == 200) {
-            const page = res.data
-            vm.formData = Object.assign(vm.formData, page)
-            vm.formData.forceUpgrade = Number(vm.formData.forceUpgrade)
-            vm.formData.updateDate = moment(vm.formData.updateDate)
-            vm.$refs.upfile.setFileList(vm.formData.attachment)
-          }
-        })
-      }
-    })
-  }
-}
-</script>
-
-<style lang="less"> 
-  .addPage{
-    .formBox{
-      padding:34px 0 10px;
-      flex-grow: 1;
-      background: #fff;
-      border-radius: 5px;
-     
-    }
-  }
-</style>

+ 0 - 349
src/views/appSetting/addVideoSetting.vue

@@ -1,349 +0,0 @@
-<template>
-  <a-card :bordered="false">
-    <div>
-      <a-form @submit="handleSubmit" :form="form">
-        <a-row :gutter="20">
-          <a-col :span="6">
-            <a-form-item
-              required
-              label="内容类型"
-              :label-col="formLayout.labelCol"
-              :wrapper-col="formLayout.wrapperCol">
-              <v-select code="BUSINESS_EXPERIRENCE_CONTENT_CLS" v-model="formData.contentCls" allowClear placeholder="请选择内容类型" ></v-select>
-            </a-form-item>
-          </a-col>
-          <a-col :span="15">
-            <a-form-item
-              label="标题"
-              :label-col="formLayout.labelCol"
-              :wrapper-col="formLayout.wrapperCol">
-              <a-input
-                v-decorator="[
-                  'formData.title',
-                  { initialValue: formData.title,
-                    rules: [{ required: true, message: '请输入标题' }]
-                  },
-                ]"
-                placeholder="请输入标题"
-              />
-            </a-form-item>
-          </a-col>
-        </a-row>
-        <a-row :gutter="20">
-
-          <a-col :span="6">
-            <a-form-item
-              label="内容格式"
-              required
-              :label-col="formLayout.labelCol"
-              :wrapper-col="formLayout.wrapperCol">
-              <v-select code="BUSINESS_EXPERIRENCE_CONTENT_TYPE" v-model="formData.contentType" allowClear placeholder="请选择内容格式" ></v-select>
-            </a-form-item>
-          </a-col>
-          <a-col :span="18">
-            <a-row :gutter="20" >
-              <a-col :span="4"></a-col>
-              <a-col :span="6">
-                <a-form-item
-                  label="首页小图"
-                  :label-col="{xs: { span: 24 },sm: { span: 10 }}"
-                  :wrapper-col="{xs: { span: 24 },sm: { span: 14 }}">
-                  <div style="border: 1px solid #eee;overflow: hidden;padding: 8px 8px 0;">
-                    <Upload
-                      v-decorator="[
-                        'formData.smallImage',
-                        {
-                          initialValue: formData.smallImage,
-                          rules: [{required: true,message: '请上传首页小图!'}]
-                        }]"
-                      ref="smallImage"
-                      :fileSize="0.25"
-                      @change="getSmallImage"
-                      listType="picture-card"
-                      upText="上传图片">
-                    </Upload>
-                  </div>
-                </a-form-item>
-              </a-col>
-              <a-col :span="6">
-                <a-form-item
-                  label="视频首页图"
-                  v-show="formData.contentType=='VIDEO'"
-                  :label-col="{xs: { span: 24 },sm: { span: 10 }}"
-                  :wrapper-col="{xs: { span: 24 },sm: { span: 14 }}">
-                  <div style="border: 1px solid #eee;overflow: hidden;padding: 8px 8px 0;">
-                    <Upload
-                      v-decorator="[
-                        'formData.normalImage',
-                        {
-                          initialValue: formData.normalImage,
-                          rules: formData.contentType=='VIDEO' ? [{required: true,message: '请上传视频首页图!'}] : []
-                        }]"
-                      ref="normalImage"
-                      @change="getNormalImage"
-                      :fileSize="0.25"
-                      listType="picture-card"
-                      upText="上传图片">
-                    </Upload>
-                  </div>
-                </a-form-item>
-              </a-col>
-              <a-col :span="6">
-                <a-form-item
-                  label="主视频"
-                  v-show="formData.contentType=='VIDEO'"
-                  :label-col="{xs: { span: 24 },sm: { span: 10 }}"
-                  :wrapper-col="{xs: { span: 24 },sm: { span: 14 }}">
-                  <div style="border: 1px solid #eee;overflow: hidden;padding: 8px 8px 0;">
-                    <Upload
-                      v-decorator="[
-                        'formData.videoPath',
-                        {
-                          initialValue: formData.videoPath,
-                          rules: formData.contentType=='VIDEO' ? [{required: true,message: '请上传主视频!'}] : []
-                        }]"
-                      ref="videoPath"
-                      @change="getVideoPath"
-                      :fileSize="300"
-                      fileType="video/mp4"
-                      listType="picture-card"
-                      upText="上传视频">
-                    </Upload>
-                  </div>
-                </a-form-item>
-              </a-col>
-            </a-row>
-          </a-col>
-        </a-row>
-        <a-row :gutter="20">
-          <a-col :span="6">
-            <a-form-item
-              label="期初浏览人数"
-              :label-col="formLayout.labelCol"
-              :wrapper-col="formLayout.wrapperCol">
-              <a-input
-                v-decorator="[
-                  'formData.initViewNum',
-                  { initialValue: formData.initViewNum,
-                    rules: []
-                  },
-                ]"
-                placeholder="期初浏览人数"
-              />
-            </a-form-item>
-          </a-col>
-          <a-col :span="15">
-            <a-form-item
-              label="排序"
-              :label-col="formLayout.labelCol"
-              :wrapper-col="formLayout.wrapperCol">
-              <a-input
-                type="number"
-                v-decorator="[
-                  'formData.sort',
-                  { initialValue: formData.sort,
-                    rules: []
-                  },
-                ]"
-                placeholder="请输入排序"
-              />
-            </a-form-item>
-          </a-col>
-        </a-row>
-        <!-- 关联广告图 -->
-        <a-row :gutter="20">
-          <a-col :span="6">
-            <a-form-item
-              label="关联广告图名称"
-              :label-col="formLayout.labelCol"
-              :wrapper-col="formLayout.wrapperCol">
-              <a-select
-                placeholder="请选择广告图名称"
-                allowClear
-                v-decorator="[
-                  'formData.relateAdvert',
-                  { initialValue:formData.relateAdvert },
-                ]">
-                <a-select-option v-for="item in optionData" :key="item.id" :value="item.id">{{ item.title }}</a-select-option>
-              </a-select>
-            </a-form-item>
-          </a-col>
-        </a-row>
-        <!-- 图文介绍 -->
-        <a-row :gutter="20">
-          <a-form-item
-            label="图文介绍"
-            :label-col="{xs: { span: 24 },sm: { span: 2 }}"
-            :wrapper-col="{xs: { span: 24 },sm: { span: 20 }}">
-            <editor ref="editor" @on-change="editorChange" :cache="false"></editor>
-          </a-form-item>
-        </a-row>
-        <a-affix :offsetBottom="this.bottom">
-          <a-row class="footerBtn">
-            <a-col :span="24">
-              <a-form-item
-                :wrapperCol="{ span: 24 }"
-                style="text-align: center"
-              >
-                <a-button htmlType="submit" :loading="loading" type="primary">保存</a-button>
-                <a-button @click="cansel" style="margin-left: 8px">返回列表</a-button>
-              </a-form-item>
-            </a-col>
-          </a-row>
-        </a-affix>
-      </a-form>
-    </div>
-  </a-card>
-</template>
-
-<script>
-import { VSelect, Upload } from '@/components'
-import { saveItem, searchDetail, aboutaDvertisementImg } from '@/api/videoSetting.js'
-import Editor from '@/components/WEeditor'
-export default {
-  name: 'VideoSettingAdd',
-  components: {
-    VSelect, Upload, Editor
-  },
-  data () {
-    return {
-      formLayout: {
-        labelCol: {
-          xs: { span: 24 },
-          sm: { span: 8 }
-        },
-        wrapperCol: {
-          xs: { span: 24 },
-          sm: { span: 16 }
-        }
-      },
-      bottom: 0,
-      form: this.$form.createForm(this),
-      loading: false,
-      optionData: [],	// 广告图数据
-      formData: {
-        contentCls: '', // 内容分类
-        contentType: '', // 内容类型
-        title: '', // 标题
-        smallImage: '', // 首页推荐图
-        normalImage: '', // 视频首页图
-        videoPath: '', // 视频路径
-        initViewNum: 0, // 初期浏览人数
-        sort: 1,
-        contentDesc: '', // 图文介绍
-        relateAdvert: ''	// 生意经广告图名称
-      }
-
-    }
-  },
-  methods: {
-    editorChange (html, text) {
-      this.formData.contentDesc = html
-    },
-    // 获取首页小图
-    getSmallImage (data) {
-      console.log(data, 'dddddd')
-      this.formData.smallImage = data
-    },
-    // 获取视频首页图
-    getNormalImage (data) {
-      console.log(data, 'dddddd')
-      this.formData.normalImage = data
-    },
-    // 获取关联广告图
-    // getRelateAdvert (data) {
-    //   console.log(data, 'dddddd')
-    //   this.formData.relateAdvert = data
-    // },
-    // 获取主视频
-    getVideoPath (data) {
-      console.log(data, 'dddddd')
-      this.formData.videoPath = data
-    },
-    // 获取关联广告图
-    getAboutaDvertisementImgList (id) {
-      aboutaDvertisementImg({ position: 'BUSINESS_BOTTOM' }).then(res => {
-        if (res.status == 200) {
-          this.optionData = res.data
-          console.log(this.optionData, '------------------')
-          //    this.optionData.forEach((r) => {
-          //      this.optionData.push({
-					  // value: r.id,
-					  // text: r.title
-          //      })
-          //    })
-          if (id) {
-            this.getDeatil(id)
-          }
-        }
-      })
-    },
-    // 差详情
-    getDeatil (id) {
-      searchDetail({
-		  id: id
-      }).then(res => {
-		  if (res.status == 200) {
-		    const page = res.data
-		    this.formData = Object.assign(this.formData, page)
-          this.formData.relateAdvert = Number(this.formData.relateAdvert)
-		    this.$refs.smallImage.setFileList(this.formData.smallImage)
-		    this.$refs.editor.setHtml(this.formData.contentDesc)
-		    if (this.formData.contentType == 'VIDEO') {
-		      this.$refs.normalImage.setFileList(this.formData.normalImage)
-		      this.$refs.videoPath.setFileList(this.formData.videoPath)
-		    }
-		  }
-      })
-    },
-    handleSubmit (e) {
-      e.preventDefault()
-      const _this = this
-      this.form.validateFields((err, values) => {
-        if (!err) {
-          if (!_this.formData.contentCls) {
-            _this.$message.error('请选择内容类型')
-          } else if (!_this.formData.contentType) {
-            _this.$message.error('请选择内容类型')
-          }
-          _this.loading = true
-          const query = this.$route.query
-          const formData = Object.assign({}, this.formData, values.formData)
-          if (formData.contentType != 'VIDEO') {
-            formData.normalImage = ''
-            formData.videoPath = ''
-          }
-          if (query.id) {
-            formData.id = query.id
-          }
-          saveItem(formData).then(res => {
-            console.log(res, 'rrrrrrrrr')
-            if (res.status == 200) {
-              _this.$message.success(res.message ? res.message : '保存成功')
-              _this.$router.push({ name: 'videoSetting_list' })
-            } else {
-              _this.$message.error(res.message)
-            }
-            _this.loading = false
-          })
-        }
-      })
-    },
-    // 返回
-    cansel () {
-      this.$router.push({ name: 'videoSetting_list' })
-    }
-  },
-  beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.loading = false
-      vm.form.resetFields()
-      const params = vm.$route.query
-	  vm.getAboutaDvertisementImgList(params.id)
-    })
-  }
-}
-</script>
-<style>
-
-</style>

+ 0 - 323
src/views/appSetting/bannerSetting.vue

@@ -1,323 +0,0 @@
-<template>
-	<a-card :bordered="false">
-		<div class="add">
-			<a-button type="primary" icon="plus" class="addBtn" @click="showModal">新建</a-button>
-		</div>
-		<v-select ref="position" style="display: none;" code="ADVERT_POSITION"></v-select>
-		<!-- table列表 -->
-		<s-table ref="table" size="default" :rowKey="(row)=> row.id" :showPagination="false" :columns="columns" :data="loadData"
-		 bordered>
-			<!-- 广告图位置 -->
-			<span slot="position" slot-scope="text,record">
-				{{ $refs.position.getNameByCode(text) }}
-			</span>
-			<span slot="action" slot-scope="text, record">
-				<template>
-					<a-icon type="eye" :style="{ fontSize: '20px', color: '#e29e14', padding: '0 10px' }" @click="handleEdit(record, 1)" />
-					<a-icon type="edit" v-if="record.status == '0'" style="font-size: 20px;color: #1890FF;padding: 0 10px;" @click="handleEdit(record, 0)" />
-					<a-icon type="delete" v-if="record.status == '0'" style="font-size: 20px;color: red;padding: 0 10px;" @click="delect(record)" />
-				</template>
-			</span>
-			<span slot="status" slot-scope="text,record">
-				<a-switch checkedChildren="启用" unCheckedChildren="禁用" v-model=" record.status==1 ? true : false " @change="changeFlagHandle(text, record)" />
-			</span>
-		</s-table>
-		<!-- 弹窗 -->
-		<a-modal :title="title" :visible="visible" :footer="null" :closable="closable" @cancel="close">
-			<a-form id="components-form-demo-validate-other" :form="form" ref="form" v-bind="formItemLayout" @submit="handleSubmit">
-				<a-form-item label="名称" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
-					<a-input v-decorator="['formData.title', { initialValue:formData.title,rules: [{ required: true, message: '请输入轮播图名称!' }] }]"
-					 :disabled="disabled" />
-				</a-form-item>
-				<a-form-item required label="广告图位置" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
-					<v-select ref="position" code="ADVERT_POSITION" v-model="formData.position" allowClear placeholder="请选择广告图位置"
-					 :disabled="disabled"></v-select>
-				</a-form-item>
-				<a-form-item label="跳转链接" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
-					<a-input v-decorator="['formData.url', { initialValue:formData.url,rules: [{ required: false, message: '请填写跳转链接!' }] }]"
-					 :disabled="disabled" />
-				</a-form-item>
-				<a-form-item label="排序" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
-					<a-input type="number" v-decorator="['formData.sort', { initialValue:formData.sort, rules: [{ required: true, message: '请排序!' }] }]"
-					 :disabled="disabled" />
-				</a-form-item>
-				<a-form-item label="状态" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
-					<a-radio-group :disabled="disabled" v-decorator="['formData.status', { initialValue:formData.status,rules: [{ required: true, message: '请选择状态!' }] }]">
-						<a-radio value="1">
-							启用
-						</a-radio>
-						<a-radio value="0">
-							禁用
-						</a-radio>
-					</a-radio-group>
-				</a-form-item>
-				<a-form-item label="上传图片" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
-					<div style="border: 1px solid #eee;overflow: hidden;padding: 8px 8px  0;">
-						<Upload v-if="title != '查看详情'" v-decorator="[
-                'formData.photo',
-                {
-                  initialValue: formData.photo,
-                  rules: [{required: true,message: '请上传轮播图!'}]
-                }]"
-						 ref="bannerImage" :fileSize="0.25" :disabled="disabled" @change="getbannerImage" listType="picture-card" upText="上传图片">
-						</Upload>
-						<img v-else :src="formData.photo" style="width:100px ;height: auto; margin-bottom: 8px;" />
-					</div>
-				</a-form-item>
-				<a-form-item :wrapper-col="{ span: 12, offset: 5 }" style="text-align: center;">
-					<a-button type="primary" html-type="submit" v-if="!disabled">
-						保存
-					</a-button>
-					<a-button @click="close()" style="margin-left: 8px">
-						返回列表
-					</a-button>
-				</a-form-item>
-			</a-form>
-		</a-modal>
-		</div>
-	</a-card>
-</template>
-
-<script>
-	import {
-		Upload,
-		STable,
-		VSelect
-	} from '@/components'
-	import {
-		getBannerSettingList,
-		changeStatus,
-		deleteItem,
-		saveItem
-	} from '@/api/bannerSetting.js'
-
-	export default {
-		components: {
-			STable,
-			Upload,
-			VSelect
-		},
-		data() {
-			return {
-				// 表头
-				columns: [{
-						title: '序号',
-						dataIndex: 'no',
-						minWidth: '40',
-						align: 'center'
-					},
-					{
-						title: '操作',
-						// dataIndex: 'action',
-						minWidth: '100',
-						align: 'center',
-						scopedSlots: {
-							customRender: 'action'
-						}
-					},
-					{
-						title: '状态',
-						minWidth: '100',
-						dataIndex: 'status',
-						align: 'center',
-						scopedSlots: {
-							customRender: 'status'
-						}
-					},
-					{
-						title: '广告图位置',
-						minWidth: '100',
-						dataIndex: 'position',
-						align: 'center',
-						scopedSlots: {
-							customRender: 'position'
-						}
-					},
-					{
-						title: '名称',
-						minWidth: '100',
-						dataIndex: 'title',
-						align: 'center'
-					},
-					{
-						title: '排序',
-						minWidth: '100',
-						dataIndex: 'sort',
-						align: 'center'
-					},
-					{
-						title: '跳转链接',
-						minWidth: '200',
-						dataIndex: 'url',
-						align: 'center'
-					}
-				],
-				// 加载数据方法 必须为 Promise 对象
-				loadData: parameter => {
-					return getBannerSettingList({
-							bannerType: 'app'
-						})
-						.then(res => {
-							console.log(res, '1111')
-							const no = 0
-							for (let i = 0; i < res.data.length; i++) {
-								const _item = res.data[i]
-								_item.no = no + i + 1
-								_item.releaseStatus = _item.releaseStatus + '' === 'FB'
-							}
-							return res.data
-						})
-				},
-
-				title: '编辑',
-				closable: true,
-				visible: false,
-				confirmLoading: false,
-				formLayout: 'horizontal',
-				form: this.$form.createForm(this),
-				formItemLayout: {
-					labelCol: {
-						span: 6
-					},
-					wrapperCol: {
-						span: 14
-					}
-				},
-				formData: {
-					title: '', // 标题
-					photo: '', // banner图片
-					url: '', // 图片路径
-					status: '', // 状态
-					sort: '', // 排序
-					position: '' // 广告图位置
-				},
-				bannerType: 'app',
-				disabled: false,
-				value: '',
-				id: '',
-				isShow: true,
-			}
-		},
-
-		beforeCreate() {
-			this.form = this.$form.createForm(this, {
-				name: 'validate_other'
-			})
-		},
-		methods: {
-			showModal() {
-				this.disabled = false
-				delete this.formData.id
-				this.visible = true
-				this.title = '新增'
-			},
-			getbannerImage(data) {
-				this.formData.photo = data
-			},
-			// 点击保存;
-			handleSubmit(e) {
-				e.preventDefault()
-				const _this = this
-				this.form.validateFields((err, values) => {
-					if (!err) {
-						console.log('Received values of form: ', values, this.formData)
-						const formData = Object.assign({}, this.formData, values.formData, {
-							bannerType: 'app'
-						})
-						console.log(formData, _this.radioGroup)
-						saveItem(formData, _this.radioGroup).then(res => {
-							console.log(res, 'rrrrrrrrr')
-							if (res.status == 200) {
-								_this.$message.success(res.message ? res.message : '保存成功')
-								_this.$refs.table.refresh()
-								_this.close()
-							} else {
-								_this.$message.error(res.message)
-							}
-						})
-					}
-				})
-			},
-			close() {
-				this.visible = false
-				this.formData.title = ''
-				this.formData.photo = ''
-				this.formData.url = ''
-				this.formData.status = ''
-				this.formData.sort = ''
-				this.formData.position = ''
-				this.title = '新增'
-				this.$refs.bannerImage.setFileList('')
-				this.form.resetFields()
-			},
-			// 赋值
-			assignment(row) {
-				this.formData.id = row.id
-				this.formData.title = row.title
-				this.formData.photo = row.photo
-				this.formData.url = row.url
-				this.formData.status = row.status
-				this.formData.sort = row.sort
-				this.formData.position = row.position
-			},
-			// 0 修改,1 查看详情
-			handleEdit(row, type) {
-				console.log(row)
-				const _this = this
-				if (type == 1) {
-					this.title = '查看详情'
-				} else if (type == 0) {
-					this.title = '编辑'
-				}
-				this.assignment(row)
-				this.disabled = type == 1
-				this.visible = true
-				console.log(this.formData.photo)
-				setTimeout(() => {
-					_this.$refs.bannerImage.setFileList(this.formData.photo)
-				}, 500)
-			},
-			// 删除
-			delect(row) {
-				const _this = this
-				this.$confirm({
-					title: '警告',
-					content: '删除后无法恢复,确认删除?',
-					okText: '确定',
-					cancelText: '取消',
-					onOk() {
-						deleteItem({
-							id: row.id
-						}).then(res => {
-							if (res.status == 200) {
-								_this.$message.success('删除成功')
-								_this.$refs.table.refresh()
-							}
-						})
-					}
-				})
-			},
-			// 更改启用禁用状态
-			changeFlagHandle(text, record) {
-				const _data = {
-					id: record.id,
-					flag: record.status == 1 ? '0' : '1'
-				}
-				changeStatus(_data).then(res => {
-					if (res.status == '200') {
-						this.$message.success('修改成功')
-						this.$refs.table.refresh()
-					} else {
-						record.status = !record.status
-					}
-				})
-			}
-		}
-	}
-</script>
-
-<style scoped>
-	.addBtn {
-		margin-bottom: 20px;
-	}
-</style>

+ 0 - 136
src/views/appSetting/editionSetting.vue

@@ -1,136 +0,0 @@
-<template>
-  <a-card :bordered="false">
-    <!-- 新建 -->
-    <div class="add">
-      <a-button type="primary" icon="plus" class="addBtn" @click="openModal()">新建</a-button>
-    </div>
-    <!-- table列表 -->
-    <s-table
-      ref="table"
-      size="default"
-      :rowKey="(row)=> row.id"
-      :columns="columns"
-      :data="loadData"
-      bordered
-    >
-    <span slot="action" slot-scope="text, record">
-      <template>
-        <a-icon type="edit" style="font-size: 20px;color: #1890FF;padding: 0 10px;" @click="handleEdit(record)" />
-      </template>
-    </span>
-    <template slot="upgradeContent" slot-scope="text, record">
-      <span :title="record.upgradeContent" style="display: inline-block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; width: 200px;">{{record.upgradeContent}}</span>
-      
-    </template>
-    <span slot="forceUpgrade" slot-scope="text, record">
-      <template>
-        <span v-if= " text == '1'">是</span>
-        <span v-if= " text == '0'">否</span>
-      </template> 
-    </span>
-    </s-table>
-  </a-card>
-</template>
-
-<script>
-  import {STable} from '@/components'
-  import {getEditionSettingList} from '@/api/editionSetting.js'
-  export default{
-    name:'EditionSetting',
-    components:{STable},
-    data(){
-      return{
-        columns:[
-          {
-            title: '序号',
-            dataIndex: 'no',
-            width:"40",
-            align:'center'
-          },
-          {
-            title: '创建时间',
-            width:"100",
-            dataIndex: 'createDate',
-            align:'center'
-          },
-          {
-            title: '版本号',
-            width:"40",
-            dataIndex:'version',
-            align:'center'
-          },
-          {
-            title: '强制升级',
-            width:"40",
-            dataIndex:'forceUpgrade',
-            align:'center',
-            scopedSlots: { customRender: 'forceUpgrade' }
-          },
-          {
-            title: '升级内容',
-            width:'200',
-            dataIndex:'upgradeContent',
-            align:'center',
-            ellipsis: true  ,//内容超过宽度 自动出现省略号
-            scopedSlots: { customRender: 'upgradeContent' }
-            
-          },
-          {
-            title: '下载地址',
-            width:'200',
-            dataIndex:'downloadUrl',
-            align:'center'
-          },
-          {
-            title: '更新时间',
-            width:'100',
-            dataIndex:'updateDate',
-            align:'center'
-          },
-          {
-            title: '操作',
-            // dataIndex: 'action',
-            width:"40",
-            align:'center',
-            scopedSlots: { customRender: 'action' }
-          },
-        ],
-        applyCode:'zyit',
-        applyName:'IT后台',
-        // 获取列表数据
-        loadData: parameter => {
-          return getEditionSettingList(Object.assign(parameter, {applyCode:'zyit'}))
-            .then(res => {
-              console.log(res,'1111')
-              const no = (res.data.pageNo - 1) * res.data.pageSize
-              for (let i = 0; i < res.data.list.length; i++) {
-                const _item = res.data.list[i]
-                _item.no = no + i + 1
-                _item.releaseStatus = _item.releaseStatus + '' === 'FB'
-              }
-              return res.data
-            })
-        },
-        id:''
-      }
-    },
-    methods:{
-      openModal(){
-        this.$router.push({ name: 'editionSetting_add' })
-      },
-      //操作修改
-      handleEdit(row){
-        console.log(row)
-        this.$router.push({ name: 'editionSetting_add', query: { id: row.id } })
-        // this.formData=Object.assign({},this.formData,row)
-      }
-    }
-  }
-</script>
-
-<style scoped>
-  .addBtn{
-    margin-bottom: 20px;
-  }
-
-</style>

+ 0 - 217
src/views/appSetting/showVideoSetting.vue

@@ -1,217 +0,0 @@
-<template>
-  <a-card :bordered="false">
-    <v-select v-show="false" ref="contentCls" code="BUSINESS_EXPERIRENCE_CONTENT_CLS" allowClear placeholder="请选择内容类型" ></v-select>
-    <v-select v-show="false" ref="contentType" code="BUSINESS_EXPERIRENCE_CONTENT_TYPE" allowClear placeholder="请选择内容格式" ></v-select>
-    <div>
-      <a-form :form="form">
-        <a-row :gutter="20">
-          <a-col :span="6">
-            <a-form-item
-              label="内容类型"
-              :label-col="formLayout.labelCol"
-              :wrapper-col="formLayout.wrapperCol">
-              <span>{{ formData.contentCls }}</span>
-            </a-form-item>
-          </a-col>
-          <a-col :span="15">
-            <a-form-item
-              label="标题"
-              :label-col="formLayout.labelCol"
-              :wrapper-col="formLayout.wrapperCol">
-              <span>{{ formData.title }}</span>
-            </a-form-item>
-          </a-col>
-        </a-row>
-        <a-row :gutter="20">
-
-          <a-col :span="6">
-            <a-form-item
-              label="内容格式"
-              :label-col="formLayout.labelCol"
-              :wrapper-col="formLayout.wrapperCol">
-              <span>{{ formData.contentType }}</span>
-            </a-form-item>
-          </a-col>
-          <a-col :span="7">
-            <a-form-item
-              label="期初浏览人数"
-              :label-col="formLayout.labelCol"
-              :wrapper-col="formLayout.wrapperCol">
-              <span>{{ formData.initViewNum }}</span>
-            </a-form-item>
-          </a-col>
-          <a-col :span="7">
-            <a-form-item
-              label="排序"
-              :label-col="formLayout.labelCol"
-              :wrapper-col="formLayout.wrapperCol">
-              <span>{{ formData.sort }}</span>
-            </a-form-item>
-          </a-col>
-          <a-col :span="18">
-            <a-row :gutter="20" >
-              <a-col :span="4"></a-col>
-              
-            </a-row>
-          </a-col>
-        </a-row>
-        <a-row :gutter="20">
-          <a-col :span="8">
-            <a-form-item
-              label="首页小图"
-              :label-col="{xs: { span: 24 },sm: { span: 6 }}"
-              :wrapper-col="{xs: { span: 24 },sm: { span: 16 }}">
-              <div style="border: 1px solid #eee;overflow: hidden;padding: 8px 8px 0;">
-                <img :src="formData.smallImage" style="width: 100%; height: 200px;" alt="example"/>
-                <!-- <span class="ant-upload-list-item-actions">
-                  <a :href="formData.smallImage" target="_blank" rel="noopener noreferrer" title="预览文件">
-                    <i aria-label="图标: eye-o" class="anticon anticon-eye-o"><svg viewBox="64 64 896 896" data-icon="eye" width="1em" height="1em" fill="currentColor" aria-hidden="true" class=""><path d="M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3a60.3 60.3 0 0 0 0 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766zm-4-430c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176zm0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z"></path></svg></i>
-                  </a>
-                </span> -->
-              </div>
-            </a-form-item>
-          </a-col>
-          <a-col :span="8">
-            <a-form-item
-              label="视频首页图"
-              v-show="formData.contentType=='视频'"
-              :label-col="{xs: { span: 24 },sm: { span: 6 }}"
-              :wrapper-col="{xs: { span: 24 },sm: { span: 16 }}">
-              <div style="border: 1px solid #eee;overflow: hidden;padding: 8px 8px 0;">
-                <img :src="formData.normalImage" style="width: 100%; height: 200px;" alt=""/>
-              </div>
-            </a-form-item>
-          </a-col>
-          <a-col :span="8">
-            <a-form-item
-              label="主视频"
-              v-show="formData.contentType=='视频'"
-              :label-col="{xs: { span: 24 },sm: { span: 6 }}"
-              :wrapper-col="{xs: { span: 24 },sm: { span: 16 }}">
-              <div style="border: 1px solid #eee;overflow: hidden;padding: 8px 8px 0;">
-                <video :src="formData.videoPath" controls="controls" style="width: 100%; height: 200px;"/>
-              </div>
-            </a-form-item>
-          </a-col>
-        </a-row>
-		<!-- 广告图回显 -->
-		<a-row :gutter="20">
-			<a-col :span="8">
-				<a-form-item
-				  label="关联广告图"
-				  :label-col="{xs: { span: 24 },sm: { span: 6 }}"
-				  :wrapper-col="{xs: { span: 24 },sm: { span: 16 }}">
-				  <div style="border: 1px solid #eee;overflow: hidden;padding: 8px 8px 0;">
-						<img :src="advertisementImg" style="width: 100%; height: 200px;" alt=""/>
-				  </div>
-				</a-form-item>
-			</a-col>
-		</a-row>	
-        <!-- 图文介绍 -->
-        <a-row :gutter="20">
-          <a-form-item
-            label="图文介绍"
-            :label-col="{xs: { span: 24 },sm: { span: 2 }}"
-            :wrapper-col="{xs: { span: 24 },sm: { span: 20 }}">
-            <div id="contentDesc"></div>
-          </a-form-item>
-        </a-row>
-        <a-affix :offsetBottom="this.bottom">
-          <a-row class="footerBtn">
-            <a-col :span="24">
-              <a-form-item
-                :wrapperCol="{ span: 24 }"
-                style="text-align: center"
-              >
-                <a-button @click="cansel" style="margin-left: 8px">返回列表</a-button>
-              </a-form-item>
-            </a-col>
-          </a-row>
-        </a-affix>
-      </a-form>
-    </div>
-  </a-card>
-</template>
-
-<script>
-import { VSelect, Upload } from '@/components'
-import { saveItem, searchDetail, searcAdhDetail } from '@/api/videoSetting.js'
-import Editor from '@/components/WEeditor'
-export default {
-  name: 'VideoSettingAdd',
-  components: {
-    VSelect, Upload, Editor
-  },
-  data () {
-    return {
-      formLayout: {
-        labelCol: {
-          xs: { span: 24 },
-          sm: { span: 8 }
-        },
-        wrapperCol: {
-          xs: { span: 24 },
-          sm: { span: 16 }
-        }
-      },
-      bottom: 0,
-      form: this.$form.createForm(this),
-      loading: false,
-      formData: {
-        contentCls: '', // 内容分类
-        contentType: '', // 内容类型
-        title: '', // 标题
-        smallImage: '', // 首页推荐图
-        normalImage: '', // 视频首页图
-        videoPath: '', // 视频路径
-        initViewNum: '', // 初期浏览人数
-        sort: '',
-        contentDesc: '' // 图文介绍
-      },
-	  advertisementImg:'', // 关联广告图
-    }
-  },
-  methods: {
-    // 返回
-    cansel () {
-      this.$router.push({ name: 'videoSetting_list' })
-    },
-	},
-
-  beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.loading = false
-      const params = vm.$route.query
-	  console.log(params)
-      if (params.id) {
-        searchDetail({
-          id: params.id
-        }).then(res => {
-          if (res.status == 200) {
-						console.log(res)
-            const page = res.data
-            vm.formData = Object.assign(vm.formData, page)
-            document.getElementById('contentDesc').innerHTML = vm.formData.contentDesc
-            setTimeout(function(){
-              vm.formData.contentCls = vm.$refs.contentCls.getNameByCode(vm.formData.contentCls)
-              vm.formData.contentType = vm.$refs.contentType.getNameByCode(vm.formData.contentType)
-            },100)
-          }
-        })
-      }
-	  if(params.relateAdvert){
-		  searcAdhDetail({
-	   			id:params.relateAdvert
-	  		}).then(res=>{
-	  			if(res.status == 200){
-					vm.advertisementImg=res.data[0].photo
-				}
-	 		})		
-	   }
-    })
-  }
-}
-</script>
-<style>
-
-</style>

+ 0 - 176
src/views/appSetting/videoSetting.vue

@@ -1,176 +0,0 @@
-<template>
-  <a-card :bordered="false">
-    <div class="table-operator">
-      <v-select v-show="false" code="BUSINESS_EXPERIRENCE_CONTENT_CLS" ref="contentCls" allowClear placeholder="请选择分类" ></v-select>
-      <a-button type="primary" icon="plus" @click="openModal">新建</a-button>
-    </div>
-    <s-table
-      ref="table"
-      size="default"
-      rowKey="id"
-      :columns="columns"
-      :data="loadData"
-      bordered
-    >
-      <span slot="status" slot-scope="text, record">
-        <a-switch checkedChildren="启用" unCheckedChildren="禁用" v-model="record.status==1 ? true : false" @change="changeFlagHandle(text, record)"/>
-      </span>
-      <span slot="contentCls" slot-scope="text, record">
-        {{ $refs.contentCls.getNameByCode(text) }}
-      </span>
-      <span slot="action" slot-scope="text, record">
-        <template>
-          <a-icon type="eye" :style="{ fontSize: '20px', color: '#e29e14', padding: '0 10px' }" @click="handleDetail(record)"/>
-          <a-icon type="edit" v-if="record.status==='0'" style="font-size: 20px;color: #1890FF;padding: 0 10px;" @click="handleEdit(record)"/>
-          <a-icon type="delete" v-if="record.status==='0'" style="font-size: 20px;color: red;padding: 0 10px;" @click="delect(record)"/>
-          <!-- <a class="action-button editBtns" v-if="!record.releaseStatus" @click="handleEdit(record)">编辑</a> -->
-          <!-- <a class="action-button delBtns" v-if="!record.releaseStatus"  @click="delect(record)">删除</a> -->
-        </template>
-      </span>
-    </s-table>
-  </a-card>
-</template>
-
-<script>
-import { STable, VSelect } from '@/components'
-import { getSettingList, changeStatus, deleteItem, searcAdhDetail } from '@/api/videoSetting.js'
-export default {
-  name: 'VideoSetting',
-  components: {
-    STable, VSelect
-  },
-  data () {
-    return {
-      // 表头
-      columns: [
-        {
-          title: '序号',
-          dataIndex: 'no',
-          width: '40',
-          align: 'center'
-        },
-        {
-          title: '名称',
-          dataIndex: 'title',
-          width: '100',
-          align: 'center'
-        },
-        {
-          title: '分类',
-          dataIndex: 'contentCls',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'contentCls' }
-        },
-        {
-          title: '状态',
-          dataIndex: 'status',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'status' }
-        },
-        {
-          title: '排序',
-          dataIndex: 'sort',
-          width: '100',
-          align: 'center'
-          // scopedSlots: { customRender: 'status' },
-        },
-        {
-          title: '操作',
-          width: '100',
-          align: 'center',
-          scopedSlots: { customRender: 'action' }
-        }
-      ],
-      // 加载数据方法 必须为 Promise 对象
-      loadData: parameter => {
-        return getSettingList(Object.assign(parameter, { title: '' }))
-          .then(res => {
-            const no = (res.data.pageNo - 1) * res.data.pageSize
-            for (let i = 0; i < res.data.list.length; i++) {
-              const _item = res.data.list[i]
-              _item.no = no + i + 1
-              _item.releaseStatus = _item.releaseStatus + '' === 'FB'
-            }
-            return res.data
-          })
-      }
-    }
-  },
-  methods: {
-    // 新建
-    openModal () {
-      this.$router.push({ name: 'videoSetting_add' })
-      // this.$router.push({name: 'addVideoSetting'})
-    },
-    //  修改
-    handleEdit (row) {
-      this.$router.push({ name: 'videoSetting_edit', query: { id: row.id } })
-    },
-    // 删除
-    delect (row) {
-      const _this = this
-      this.$confirm({
-        title: '警告',
-        content: '删除后无法恢复,确认删除?',
-        okText: '确定',
-        cancelText: '取消',
-        onOk () {
-          deleteItem({
-            id: row.id
-          }).then(res => {
-            if (res.status == 200) {
-              _this.$message.success('删除成功')
-              _this.$refs.table.refresh()
-            }
-          })
-        }
-      })
-    },
-    // 修改状态
-    changeFlagHandle (text, record) {
-      console.log(record, 'record')
-      const _data = {
-        id: record.id,
-        flag: record.status == 1 ? '0' : '1'
-      }
-      changeStatus(_data).then(res => {
-        if (res.status == '200') {
-          this.$message.success('修改成功')
-          this.$refs.table.refresh()
-        } else {
-          record.status = !record.status
-        }
-      })
-    },
-    handleDetail (record) {
-      console.log(record)
-      this.$router.push({ name: 'videoSetting_detail', query: { id: record.id, relateAdvert: record.relateAdvert } })
-    }
-  }
-}
-</script>
-
-<style>
-  .action-button{
-   line-height: 40px;
-   white-space: nowrap;
-    padding: 5px 10px;
-    background-color: #1890ff;
-    border-radius: 4px;
-    color: #fff;
-    margin-right: 5px;
-    &:hover{
-      background-color: #1db8ff;
-      color: #fff;
-    }
-  }
-  .delBtns{
-    background-color: #FF0000;
-    &:hover{
-      background-color: #b91818;
-      color: #fff;
-    }
-  }
-</style>

+ 9 - 9
src/views/bnSetting/menu/adminMenus.vue

@@ -178,14 +178,14 @@
 
       </a-col>
     </a-row>
-    <childModal parentType="admin" :visible="showChildModal" @refresh="getYyMenuList" :data="parentData" @close="showChildModal = false"></childModal>
+    <childModal parentType="admin" :visible="showChildModal" @refresh="getMenuList" :data="parentData" @close="showChildModal = false"></childModal>
   </a-card>
 </template>
 
 <script>
 import { STable, VSelect } from '@/components'
 import childModal from './childModal.vue'
-import { getYyMenuList, saveYyMenu, deleteYyMenu } from '@/api/menu.js'
+import { getMenuList, saveMenu, deleteMenu } from '@/api/menu.js'
 
 export default {
   name: 'Menu',
@@ -310,8 +310,8 @@ export default {
       })
     },
     // 获取菜单树列表
-    getYyMenuList () {
-      getYyMenuList().then(res => {
+    getMenuList () {
+      getMenuList().then(res => {
         console.log(res, 'res1111111')
         if (res.status == 200) {
           this.treeData = res.data
@@ -372,12 +372,12 @@ export default {
         okText: '确定',
         cancelText: '取消',
         onOk () {
-          deleteYyMenu({
+          deleteMenu({
             id: _this.formData.id
           }).then(res => {
             if (res.status == 200) {
               _this.$message.success('删除成功')
-              _this.getYyMenuList()
+              _this.getMenuList()
             }
           }).catch(() => {
             _this.$message.success('删除失败, 请稍后重试')
@@ -392,11 +392,11 @@ export default {
       this.form.validateFields((err, values) => {
         if (!err) {
           console.log(values.formData, ' formData.type222222222')
-          saveYyMenu(Object.assign({ id: this.formData.id }, values.formData)).then(res => {
+          saveMenu(Object.assign({ id: this.formData.id }, values.formData)).then(res => {
             console.log(res, 'res--save')
             if (res.status + '' === '200') {
               this.$message.success(res.message ? res.message : '保存成功')
-              _this.getYyMenuList()
+              _this.getMenuList()
               _this.clear()
             } else {
               // this.$message.warning(res.message)
@@ -417,7 +417,7 @@ export default {
   },
   beforeRouteEnter (to, from, next) {
     next(vm => {
-      vm.getYyMenuList()
+      vm.getMenuList()
     })
   },
   watch: {

+ 2 - 2
src/views/bnSetting/menu/childModal.vue

@@ -188,7 +188,7 @@
 
 <script>
 import { STable, VSelect } from '@/components'
-import { saveYyMenu, saveMdMenu } from '@/api/menu.js'
+import { saveMenu, saveMdMenu } from '@/api/menu.js'
 export default {
   name: 'ChildModal',
   components: {
@@ -252,7 +252,7 @@ export default {
       this.form.validateFields((err, values) => {
         if (!err) {
           console.log(values.formData, ' formData.type222222222')
-          const saveRequest = this.parentType == 'store' ? saveMdMenu : saveYyMenu
+          const saveRequest = this.parentType == 'store' ? saveMdMenu : saveMenu
           saveRequest(Object.assign(this.formData, values.formData)).then(res => {
             console.log(res, 'res--save')
             if (res.status + '' === '200') {

+ 6 - 6
src/views/bnSetting/menu/storeMenus.vue

@@ -151,7 +151,7 @@
             />
           </a-form-item>
           <!-- 连锁可用 -->
-          <a-form-item label="连锁可用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <!-- <a-form-item label="连锁可用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
             <a-radio-group
               name="radioGroup"
               v-decorator="[
@@ -164,9 +164,9 @@
               <a-radio :value="1">是</a-radio>
               <a-radio :value="0">否</a-radio>
             </a-radio-group>
-          </a-form-item>
+          </a-form-item> -->
           <!-- 单店可用 -->
-          <a-form-item label="单店可用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <!-- <a-form-item label="单店可用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
             <a-radio-group
               name="radioGroup"
               v-decorator="[
@@ -179,7 +179,7 @@
               <a-radio :value="1">是</a-radio>
               <a-radio :value="0">否</a-radio>
             </a-radio-group>
-          </a-form-item>
+          </a-form-item> -->
           <!-- 状态 -->
           <a-form-item label="启用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
             <a-radio-group
@@ -249,8 +249,8 @@ export default {
         sort: '',
         type: '0',
         isLeaf: true,
-        chainOrgUse: '',
-        singleOrgUse: '',
+        chainOrgUse: '1',
+        singleOrgUse: '0',
         status: '' // 活动状态
       }
     }

+ 0 - 145
src/views/components/add-server-to-hd.vue

@@ -1,145 +0,0 @@
-<template>
-  <a-modal 
-  :footer="null" 
-  :title="title" 
-  centered 
-  :maskClosable="false" 
-  :zIndex="5000"
-  @cancel="cancle" 
-  v-model="isShow">
-      <a-form :form="form">
-        <a-form-item label="原价" :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
-          <a-input-number
-            style="width: 90%;"
-            :min=0
-            :precision="2"
-            v-decorator="[
-              'formValidate.itemSrcPrice',
-              { initialValue: formValidate.itemSrcPrice,
-              rules: [{ required: true, type: 'number', message: '请输入原价', trigger: 'change' }] },
-            ]">
-            </a-input-number >
-            元
-        </a-form-item>
-        <a-form-item label="数量" :label-col="{ span: 5 }" :wrapper-col="{ span: 12 }">
-          <a-input-number
-          style="width: 90%;"
-          :precision="0"
-          :min=1
-          v-decorator="[
-            'formValidate.itemNum',
-            { initialValue: formValidate.itemNum,
-            rules: [{ required: true, type: 'number', message: '请输入数量', trigger: 'change' }] },
-          ]"
-          >
-          </a-input-number>
-        </a-form-item>
-        <a-form-item :wrapper-col="{ span: 18, offset:3}">
-            <a-button v-if="!checked" type="primary" style="width:100px;" @click="handleSubmit()">加入</a-button>
-            <a-button v-if="checked" type="primary" style="width:100px;" @click="handleSubmit()">保存</a-button>
-            <a-button v-if="checked" type="error" style="margin-left: 20px;width:100px;" @click="del()">删除</a-button>
-            <a-button @click="cancle()" style="margin-left: 20px;width:100px;">取消</a-button>
-        </a-form-item>
-    </a-form>
-  </a-modal>
-</template>
-<script>
-    export default {
-       name: 'addServerToHd',
-       props: {
-          openModal: {
-            type: Boolean,
-            default: false
-          },
-          index: {
-            type: [String, Number]
-          },
-       },
-       components: { },
-       watch: {
-         isShow (newValue, oldValue) {
-           if (!newValue){
-             this.$emit('closeModal')
-             this.clearData()
-           }
-         },
-         openModal (newValue, oldValue) {
-           this.isShow = newValue
-         }
-       },
-       data () {
-            return {
-              isShow: this.openModal,
-              modal_loading: false,
-              title: '加入活动内容',
-              checked: false,
-              form: this.$form.createForm(this, { name: 'serverToHd' }),
-              formValidate: {
-                  itemSrcPrice: 0,
-                  itemNum: 1
-              },
-              serverData: {},
-            }
-        },
-        methods: {
-            // 设置数据
-            setServerData (item, checked){
-              console.log(item,'000')
-              this.checked = checked
-              this.title = item.itemName
-              this.serverData = item
-              this.formValidate.itemSrcPrice = item.itemSrcPrice
-              this.formValidate.itemNum = item.itemNum
-            },
-            // 清空数据
-            clearData (){
-              this.title = ''
-              this.checked = false
-              this.serverData = {}
-              this.form.resetFields()
-            },
-            // 关闭弹窗触发
-            cancle (){
-              this.isShow = false
-            },
-            // 加入套餐,type 1新增,0编辑
-            handleSubmit () {
-                this.form.validateFields((valid,vaules) => {
-                    if (!valid) {
-                      console.log(vaules.formValidate)
-                      vaules.formValidate.itemSrcPrice = Number(vaules.formValidate.itemSrcPrice)
-                      if (!vaules.formValidate.itemNum){
-                        this.$message.info('请输入数量')
-                        return
-                      }
-                      if (!vaules.formValidate.itemSrcPrice){
-                        this.$message.info('请输入原价')
-                        return
-                      }
-                      
-                      this.serverData = Object.assign({}, this.serverData, vaules.formValidate)
-                      this.$emit('addServer', this.serverData, this.checked)
-                      this.cancle()
-                    }
-                })
-            },
-            // 取消工单
-            del (){
-              this.$emit('delServer', this.serverData, this.index)
-              this.cancle()
-            }
-        },
-        mounted (){
-        }
-    }
-</script>
-<style lang="less" scoped>
-    .ant-btn-error{
-     background: red;
-     color: #fff;
-     border: none;
-     &:hover{
-       background: firebrick;
-     }
-    }
-</style>

+ 0 - 462
src/views/components/choose-part/choose-part.vue

@@ -1,462 +0,0 @@
-<template>
-  <a-modal
-    v-model="isShow"
-    :transfer="false"
-    :width="width"
-    @cancel="closeDraw"
-    wrapClassName = 'choosePart'
-    :scrollable="true"
-    :mask-closable="true">
-    <div slot="title" >
-      <div class="drawerHeder">
-        <span class="head-span">选择配件:已选{{ checkedList.length }}个</span>
-          <div>
-            <a-input-search
-              size="large"
-              v-model="queryWord"
-              allow-clear
-              enter-button
-              placeholder="输入配件名称查询" />
-          </div>
-          <span></span>
-      </div>
-    </div>
-
-    <div class="drawerCons">
-      <div class="menus">
-        <a-tabs v-model="currentValue" @change="onTab">
-          <a-tab-pane :tab="item.label" :key="item.id" v-for="item in leve1Data"></a-tab-pane>
-        </a-tabs>
-      </div>
-      <div class="draConts">
-        <div class="smenus" id="sliderbar">
-          <a-menu v-model="curLeve2" @select="selLeve2">
-            <a-menu-item key="all">
-              全部
-            </a-menu-item>
-            <a-menu-item v-for="item in leve2Data" :key="item.id">
-              {{ item.label }}
-            </a-menu-item>
-          </a-menu>
-        </div>
-        <div class="itemBox" id="bundelScroll">
-          <div class="spin-wrap">
-            <a-spin size="large" fix v-if="loading"></a-spin>
-          </div>
-          <div class="items-list" v-for="(item, index) in partList" :key="item.id+''+new Date().getTime()">
-            <span>
-              <div>{{ item.name }}</div>
-              <p>
-                <span>型号:{{ item.type||'-' }}</span>
-                <span>规格:{{ item.specNum||'-' }}{{ item.spec }}</span>
-                <span v-if="parent=='addPurchase'">参考采购价:{{ item.initialCost||'-' }}</span>
-                <span v-else>销售价:{{ item.price||0 }}</span>
-                <span>库存:{{ item.currentInven?item.currentInven:0 }} {{ item.unit }}</span>
-              </p>
-            </span>
-            <a-button v-if="hasChecked(item)" type="success" @click="choosePart(item)">
-              已选择
-            </a-button>
-            <a-button v-if="!hasChecked(item)" type="info" @click="choosePart(item)">
-              选择
-            </a-button>
-          </div>
-        
-          <div class="noData" v-if="partList==null">请选择配件</div>
-          <div class="noData" v-if="partList&&partList.length==0">
-            {{ loading?'正在加载...':'没有查到此配件' }}
-          </div>
-          <!-- <div class="noData" v-if="noMore && partList && partList.length!=0">没有更多了</div> -->
-          <div class="noData" v-if="!noMore && partList && partList.length!=0">
-            <a-button type="warning" shape="circle" @click="getMore" ghost>更多配件+</a-button>
-          </div>
-        </div>
-      </div>
-    </div>
-  </a-modal>
-</template>
-
-<script>
-import { getPartsList } from '@/api/accessoryType'
-import { getPartLabels, getAccessoryInfoData } from '@/api/accessoryInfo'
-const delay = (function () {
-  let timer = 0
-  return function (callback, ms) {
-    clearTimeout(timer)
-    timer = setTimeout(callback, ms)
-  }
-})()
-export default {
-  name: 'ChoosePart',
-  components: {
-
-  },
-  props: {
-    openDraw: {
-      type: Boolean,
-      default: false
-    },
-    width: {
-      type: Number,
-      default: 800
-    },
-
-    title: {
-      type: String,
-      default: '标题'
-    },
-    // 已选择的项
-    checkedList: {
-      type: Array,
-      default: function () {
-        return []
-      }
-    },
-    // 父页面
-    parent: {
-      type: String,
-      default: ''
-    },
-   
-  },
-  data () {
-    return {
-      tabOpts: {
-        activeColor: '#2D8cF0'
-      },
-      isShow: this.openDraw,
-      treeData: [],
-      leve1Data: [], // 一级菜单
-      leve2Data: [], // 二级菜单
-      labelsData: [], // 标签数据
-      curLeve2: ['all'],
-      loading: false,
-      queryWord: '',
-      partList: null,
-      currentValue: '0',
-      pageNo: 1,
-      pageSize: 500,
-      noMore: false // 没有更多
-    }
-  },
-  watch: {
-    openDraw (newValue, oldValue) {
-      console.log(newValue)
-      this.isShow = newValue
-    },
-    isShow (val) {
-      if (!val) {
-        this.$emit('close')
-        this.queryWord = ''
-        this.partList = []
-      } else {
-        this.getPartLabel()
-      }
-    },
-    queryWord (){
-      delay(() => {
-          this.searchPart()
-      }, 500)
-    }
-  },
-  methods: {
-
-    // 单击一级菜单
-    onTab (id,o) {
-      console.log(id)
-      this.pageNo = 1
-      this.partList = null
-      this.queryWord = ''
-      // 滚动条返回顶部
-      document.getElementById('sliderbar').scrollTop = 0
-      document.getElementById('bundelScroll').scrollTop = 0
-      // 常用配件
-      if (id == 0) {
-        this.leve2Data = this.labelsData
-        this.selLeve2('all')
-      } else {
-        const leve2 = this.treeData.find(item => item.id == id)
-        this.leve2Data = leve2.children || []
-        this.selLeve2('all')
-      }
-    },
-    // 单击二级菜单
-    selLeve2 (v) {
-      console.log(v)
-      // 滚动条返回顶部
-      document.getElementById('bundelScroll').scrollTop = 0
-      this.pageNo = 1
-      this.partList = []
-      this.queryWord = ''
-      this.curLeve2[0] = typeof(v) == "string" ? v : v.key
-      this.getPartList()
-    },
-    closeDraw () {
-      this.isShow = false
-    },
-    // 格式化标签数据和配件分类数据一样
-    labelToPart (data) {
-      const arr = []
-      data.map(item => {
-        arr.push({
-          id: item.id,
-          label: item.name
-        })
-      })
-      return arr
-    },
-    // 获取配件标签
-    getPartLabel () {
-      const _this = this
-      getPartLabels().then(res => {
-        console.log(res, 'labelsData')
-        this.labelsData = this.labelToPart(res.data || [])
-        this.currentValue =  '0'
-        this.leve2Data = this.labelsData
-        this.selLeve2('all')
-        this.getPartClsList()
-      })
-    },
-    formatTreeData (data) {
-      const lev1 = [{ label: '常用配件', id: '0' }]
-      data.map(item => {
-        lev1.push({ label: item.label, id: String(item.id) })
-      })
-      return lev1
-    },
-    // 获取配件分类
-    getPartClsList () {
-      const _this = this
-      getPartsList().then(res => {
-        console.log(res)
-        this.leve1Data = this.formatTreeData(res.data || [])
-        this.treeData = res.data || []
-      })
-    },
-    // 获取配件列表
-    getPartList () {
-      const _this = this
-      _this.loading = true
-      const params = {
-        queryWord: this.queryWord,
-        partsClsId: '',
-        pageNo: this.pageNo,
-        pageSize: this.pageSize,
-        labels: []
-      }
-      // 常用分类
-      if (this.currentValue == 0) {
-        params.labels = this.curLeve2[0] == 'all' ? this.labelsData : [{ id: this.curLeve2[0] }]
-        params.partsClsId = params.labels.length == 0 ? '0' : ''
-      } else {
-        params.partsClsId = this.curLeve2[0] == 'all' ? this.currentValue : this.curLeve2[0]
-      }
-      console.log(params)
-      getAccessoryInfoData(params).then(res => {
-        console.log(res, '000000000000000')
-        const list = res.data.list
-        if (list && list.length) {
-          // 分页 拼接数据
-          if (_this.pageNo != 1) {
-            _this.partList = _this.partList ? _this.partList.concat(this.fiterChecked(list)) : this.fiterChecked(list)
-            document.getElementById('bundelScroll').scrollTop = 0
-          } else {
-            _this.partList = this.fiterChecked(list)
-          }
-          if (_this.partList.length == res.data.count) {
-            _this.noMore = true
-          } else {
-            _this.noMore = false
-          }
-        } else {
-          _this.partList = list || []
-        }
-        _this.loading = false
-      })
-    },
-    // 加载更多
-    getMore () {
-      this.pageNo++
-      this.getPartList()
-    },
-    // 查询配件
-    searchPart () {
-      this.pageNo = 1
-      this.curLeve2 = ['all']
-      this.partList = []
-      this.getPartList()
-    },
-    // 对比已选择项目
-    hasChecked (row) {
-      const b = this.checkedList
-      const has = b.findIndex(item => {
-        if (item.customerBundleId) {
-          return false
-        }
-        return item.partId && item.partId == row.id
-      })
-      return has >= 0
-    },
-    // 过滤已选择的
-    fiterChecked (list) {
-      this.checkedList.map(item => {
-        const p = list.find(k => {
-          if (item.customerBundleId) {
-            return false
-          }
-          return item.partId && k.id == item.partId
-        })
-        if (p) {
-          p.checked = true
-        }
-      })
-      return list
-    },
-    // 格式化数据
-    partFormat (rows) {
-      if (rows == undefined) { return null }
-      return {
-        partId: rows.id,
-        partName: rows.name,
-        partClsId: rows.partsClsId,
-        type: rows.type,
-        specNum: rows.specNum,
-        spec: rows.spec,
-        price: Number(rows.price ? rows.price : 0),
-        initialCost: Number(rows.initialCost ? rows.initialCost : 0),
-        quantity: 1,
-        unit: rows.unit,
-        amount: 0,
-        discount: 0,
-        discountType: '0',
-        finalAmount: 0,
-        currentInven: rows.currentInven == undefined ? 0 : rows.currentInven,
-        remarks: rows.remarks,
-        employeeId: '',
-        employeeName: ''
-      }
-    },
-    // 选择的配件
-    choosePart (v, i) {
-      this.$emit('choosePart', this.partFormat(v), this.hasChecked(v))
-    }
-
-  }
-}
-</script>
-
-<style lang="less">
-  .choosePart{
-    
-      .spin-wrap{
-        text-align: center;
-      }
-      .ant-modal-content{
-        padding: 0;
-      }
-      .ant-modal-footer{
-        padding: 0;
-        display: none;
-      }
-      .ant-modal-header{
-        padding: 10px 16px;
-      }
-      .drawerHeder{
-        display: flex;
-        > span{
-          flex-grow: 1;
-          font-weight: 600;
-          font-size: 14px;
-          line-height: 34px;
-        }
-        > div{
-          flex-grow: 1;
-        }
-      }
-      .drawerCons{
-        display: flex;
-        flex-direction: column;
-        height: 100%;
-      }
-      .ant-modal-close{
-        font-size: 22px;
-      }
-      .ant-modal-body{
-        padding: 0;
-        height: 500px;
-      }
-      .ant-tabs-bar{
-        margin: 0;
-      }
-      .ant-tabs{
-        margin-bottom: 0;
-      }
-      .ant-tabs-tab-prev, .ivu-tabs-nav-next{
-        line-height: 45px;
-        width: 45px;
-        text-align: center;
-        .ivu-icon{
-          font-size: 20px;
-        }
-      }
-      .noData{
-        text-align: center;
-        padding: 30px 0;
-      }
-      .draConts{
-        display: flex;
-        flex-grow: 1;
-        overflow: auto;
-        .smenus{
-          width:25%;
-          height: 100%;
-          border-right: 1px solid #eee;
-          overflow: auto;
-          padding: 10px 0;
-        }
-        .itemBox{
-          width: 75%;
-          padding: 15px;
-          height: 100%;
-          overflow: auto;
-          position: relative;
-          .items-list{
-            border: 1px solid #eee;
-            border-radius: 10px;
-            margin: 6px 0;
-            text-align: left;
-            padding: 6px 15px;
-            font-size: 14px;
-            overflow: hidden;
-            >span{
-              display: block;
-              float: left;
-              padding: 5px 0;
-              > div{
-                font-weight: bold;
-                margin-bottom: 5px;
-              }
-              p{
-                margin: 0;
-                color: #999;
-                span{margin-right: 10px;}
-              }
-            }
-            button{
-              float: right;
-              width: 80px;
-              color: #fff;
-              border: none;
-              margin-top: 10px;
-            }
-            .ant-btn-success{
-              background-color: #31B50B;
-            }
-            .ant-btn-info{
-              background-color: deepskyblue;
-            }
-          }
-        }
-      }
-  }
-</style>

+ 0 - 352
src/views/components/choose-server-item/choose-server-item.vue

@@ -1,352 +0,0 @@
-<template>
-  <div>
-    <a-modal
-      v-model="isShow"
-      :width="width"
-      :transfer="true"
-      @cancel="closeDraw"
-      :scrollable="true"
-      wrapClassName = 'chooseServer'
-      :mask-closable="true">
-      <div slot="title" >
-        <div class="drawerHeder">
-          <span>选择服务项目:已选{{ checkedList.length }}个</span>
-          <div>
-            <a-input-search
-              size="large"
-              v-model="queryWord"
-              allow-clear
-              enter-button
-              placeholder="搜索服务" />
-          </div>
-          <span></span>
-        </div>
-      </div>
-
-      <div class="drawerCons">
-        <div class="menus">
-          <VSelect
-            ref="tabs"
-            showType="tabs"
-            code="SERVICE_TYPE"
-            v-model="itemClsId"
-            @change="tabChange">
-          </VSelect>
-        </div>
-        <div class="draConts">
-          <div class="smenus">
-            <a-menu v-model="curLeve2" @select="selLeve2">
-              <a-menu-item key="all">
-                全部
-              </a-menu-item>
-              <a-menu-item v-for="item in leve2Data" :key="item.id">
-                {{ item.name }}
-              </a-menu-item>
-            </a-menu>
-          </div>
-          <div class="itemBox" id="bundelScroll">
-            <div class="spin-wrap">
-              <a-spin size="large" fix v-if="loading"></a-spin>
-            </div>
-            <div class="items-list" v-for="(item, index) in listData" :key="index">
-              <span>{{ item.name }} </span>
-              <a-button v-if="hasChecked(item)" type="success" @click="chooseItem(item)">
-                已选择
-              </a-button>
-              <a-button v-if="!hasChecked(item)" type="info" @click="chooseItem(item)">
-                选择
-              </a-button>
-            </div>
-            <div v-if="!loading&&listData.length==0" class="noData">
-              没有服务
-            </div>
-          </div>
-        </div>
-      </div>
-    </a-modal>
-  </div>
-</template>
-<script>
-import { getServerByLabelId, getServiceLabels } from '@/api/serviceItems'
-import VSelect from '@/components/Select'
-const delay = (function () {
-  let timer = 0
-  return function (callback, ms) {
-    clearTimeout(timer)
-    timer = setTimeout(callback, ms)
-  }
-})()
-
-export default {
-  name: 'ChooseServerItem',
-  props: {
-    width: {
-      type: Number,
-      default: 800
-    },
-    openServerItemDraw: {
-      type: Boolean,
-      default: false
-    },
-    // 已选择的项
-    checkedList: {
-      type: Array,
-      default: function () {
-        return []
-      }
-    },
-    orderType: {
-      type: String,
-      default: ''
-    }
-  },
-  components: {
-    VSelect,
-  },
-  data () {
-    return {
-      washCarTypeName: '洗车',
-      leve2Data: [],
-      listData: [],
-      isShow: this.openServerItemDraw,
-      loading: false,
-      itemClsId: '1',
-      curLeve1: '',
-      curLeve2: ['all'],
-      queryWord: ''
-    }
-  },
-  watch: {
-    openServerItemDraw (newValue, oldValue) {
-      this.isShow = newValue
-    },
-    isShow (val) {
-      if (!val) {
-        this.$emit('close')
-      } else {
-        // 重置页面数据
-        this.listData = []
-        this.queryWord = ''
-        // 默认选择洗车的
-        this.itemClsId =  '1'
-        this.curLeve1 = 1
-        this.getLeve2()
-      }
-    },
-    queryWord (){
-      delay(() => {
-          this.searchData()
-      }, 500)
-    }
-  },
-  methods: {
-    // 单击一级tab
-    tabChange (v,o) {
-      console.log(v,o,this.curLeve1)
-      this.queryWord = ''
-      this.curLeve1 = o.code
-      this.getLeve2()
-    },
-    // 获取二级菜单
-    getLeve2 () {
-      getServiceLabels({ clsId: this.curLeve1 }).then(res => {
-        this.leve2Data = res.data || []
-        this.curLeve2 = ['all']
-        this.initData()
-      })
-    },
-    // 选择二级菜单
-    selLeve2 (v) {
-      console.log(v,'selLeve2')
-      // 滚动条返回顶部
-      this.curLeve2 = [v.key]
-      this.queryWord = ''
-      this.initData()
-    },
-    // 关闭抽屉时触发
-    closeDraw () {
-      this.$emit('close')
-    },
-    // 搜索,默认当前分类下得全部
-    searchData () {
-      this.curLeve2 = ['all']
-      this.initData()
-    },
-    // 初始化数据
-    initData () {
-      const _this = this
-      _this.listData = []
-      this.loading = true
-      console.log(this.curLeve2,'-----------')
-      getServerByLabelId({
-        pageNo: 1,
-        pageSize: 1000,
-        queryWord: this.queryWord,
-        itemClsId: this.curLeve1,
-        labelId: this.curLeve2[0] == 'all' ? '' : this.curLeve2[0]
-      }).then(result => {
-        console.log(result, 'result')
-        if (result.status == 200) {
-          _this.listData = _this.fiterChecked(result.data.list)
-          // _this.queryWord = ''
-          // 滚动条返回顶部
-          setTimeout(() => {
-            document.getElementById('bundelScroll').scrollTop = 0
-          }, 100)
-        }
-        this.loading = false
-      })
-    },
-    // 对比已选择项目
-    hasChecked (row) {
-      const b = this.checkedList
-      const has = b.findIndex(item => {
-        if (item.customerBundleId) {
-          return false
-        }
-        return item.itemId && item.itemId == row.id
-      })
-      return has >= 0
-    },
-    // 过滤已选择的
-    fiterChecked (list) {
-      this.checkedList.map(item => {
-        const p = list.find(k => {
-          if (item.customerBundleId) {
-            return false
-          }
-          return item.itemId && k.id == item.itemId
-        })
-        if (p) {
-          p.checked = true
-        }
-      })
-      console.log(this.checkedList, list)
-      return list
-    },
-    // 选择项目
-    chooseItem (item) {
-      const data = {
-        itemId: item.id,
-        itemName: item.name, // 项目名
-        itemClsName: item.itemClsName, // 服务类型
-        price: Number(item.priceL3 ? item.priceL3 : 0), // 工时费
-        priceL3: item.priceL3,
-        time: 1, // 工时
-        discountType: '0', // 优惠方式
-        amount: item.priceL3, // 金额
-        discount: 0, // 优惠金额
-        finalAmount: 0, // 优惠后总金额
-        employeeId: [],
-        employeeName: [],
-        remarks: ''
-      }
-      this.$emit('chooseItem', data, this.hasChecked(item))
-    }
-  }
-}
-</script>
-<style lang="less">
-  .chooseServer{
-    .spin-wrap{
-      text-align: center;
-    }
-    .ant-modal-content{
-      padding: 0;
-    }
-    .ant-modal-footer{
-      padding: 0;
-      display: none;
-    }
-    .ant-modal-header{
-      padding: 10px 16px;
-    }
-    .drawerHeder{
-      display: flex;
-      > span{
-        flex-grow: 1;
-        font-weight: 600;
-        font-size: 14px;
-        line-height: 34px;
-      }
-      > div{
-        flex-grow: 1;
-      }
-    }
-    .drawerCons{
-      display: flex;
-      flex-direction: column;
-      height: 100%;
-    }
-    .ant-modal-close{
-      font-size: 22px;
-    }
-    .ant-modal-body{
-      padding: 0;
-      height: 500px;
-    }
-    .ant-tabs-bar{
-      margin: 0;
-    }
-    .ant-tabs{
-      margin-bottom: 0;
-    }
-    .ant-tabs-tab-prev, .ivu-tabs-nav-next{
-      line-height: 45px;
-      width: 45px;
-      text-align: center;
-      .ivu-icon{
-        font-size: 20px;
-      }
-    }
-    .noData{
-      text-align: center;
-      padding: 30px 0;
-    }
-    .draConts{
-      display: flex;
-      flex-grow: 1;
-      overflow: auto;
-      .smenus{
-        width:25%;
-        height: 100%;
-        border-right: 1px solid #eee;
-        overflow: auto;
-        padding: 10px 0;
-      }
-      .itemBox{
-        width: 75%;
-        padding: 15px;
-        height: 100%;
-        overflow: auto;
-        position: relative;
-        .items-list{
-          border: 1px solid #eee;
-          border-radius: 10px;
-          margin: 6px 0;
-          text-align: left;
-          padding: 6px 15px;
-          font-size: 14px;
-          overflow: hidden;
-          >span{
-            display: block;
-            float: left;
-            padding: 5px 0;
-          }
-          button{
-            float: right;
-            width: 80px;
-            color: #fff;
-            border: none;
-          }
-          .ant-btn-success{
-            background-color: #31B50B;
-          }
-          .ant-btn-info{
-            background-color: deepskyblue;
-          }
-        }
-      }
-    }
-  }
-</style>

+ 0 - 140
src/views/components/hd-item-list.vue

@@ -1,140 +0,0 @@
-<template>
-  <div class="hdItemList-item-order">
-    <a-table 
-    :pagination="false" 
-    :columns="columns" 
-    :dataSource="tableList"
-    bordered
-    size="small"
-    :rowKey="(record) => record.id"
-    >
-      <template slot="action" slot-scope="text, record">
-        <a-button
-        style="margin-left: 10px;"
-        size="small"
-        type="danger" 
-        title="删除" 
-        @click.stop="delRow(record)" 
-        shape="circle" 
-        icon="delete">
-        </a-button>
-      </template>
-      <template slot="name" slot-scope="text, record">
-        <a-input
-          style="margin: -5px 0"
-          v-model.trim="record.itemName"
-        />
-      </template>
-      <template slot="price" slot-scope="text, record">
-        <a-input-number
-          type = "number"
-          :min="1"
-          :precision="2"
-          style="margin: -5px 0"
-          v-model.trim="record.itemSrcPrice"
-        />
-      </template>
-      <template slot="quantity" slot-scope="text, record">
-        <a-input-number
-          type = "number"
-          :min="1"
-		      :precision="0"
-          style="margin: -5px 0"
-          v-model.trim="record.itemNum"
-        />
-      </template>
-    </a-table>
-  </div>
-</template>
-
-<script>
-  export default {
-    name: 'hdItemList',
-    props: {
-        orderType: {
-          type: String,
-          default: ''
-        },
-        index: {
-          type: [String, Number]
-        },
-        list: {
-          type: Array,
-          default: function (){
-            return []
-          }
-        },
-        action: {
-           type: [String, Number],
-           default: '0'
-        }
-    },
-    components: {
-    },
-    computed: {
-      tableList() {
-        let ret = []
-        this.list.map((item,index) => {
-          item.index = index
-          ret.push(item)
-        })
-        return ret
-      }
-    },
-    data () {
-      return {
-        isHide: false,
-        loading: false,
-        columns: [
-          {
-            title: '项目名称(含服务或配件)',
-            key: 'itemName',
-            align: 'center',
-            width: 150,
-            scopedSlots: { customRender: 'name' },
-          },
-          {
-            title: '原价',
-            key: 'itemSrcPrice',
-            align: 'center',
-            width: 80,
-            scopedSlots: { customRender: 'price' },
-          },
-          {
-            title: '数量',
-            key: 'itemNum',
-            align: 'center',
-            width: 80,
-            scopedSlots: { customRender: 'quantity' },
-          },
-          {
-            title: '操作',
-            width: 60,
-            key: 'action',
-            align: 'center',
-            scopedSlots: { customRender: 'action' },
-          },
-        ]
-      }
-    },
-    methods: {
-      // 删除
-      delRow (row){
-        this.$confirm({
-            title: '确认提示',
-            content: '确定删除此项目吗?',
-            onOk: () => {
-              this.$emit('remove', row, this.index, row.index)
-            }
-        })
-      },
-    }
-  }
-</script>
-
-<style lang="less">
-  .hdItemList-item-order{
-    width: 100%;
-    height: auto;
-  }
-</style>

+ 0 - 378
src/views/notice/noticeList.vue

@@ -1,378 +0,0 @@
-<template>
-  <a-card :bordered="false">
-    <div>
-      <div class="table-page-search-wrapper">
-        <a-form layout="inline">
-          <a-row :gutter="48">
-            <a-col :md="6" :sm="24">
-              <a-form-item label="通知名称">
-                <a-input allowClear v-model.trim="searchData.title" placeholder="请输入" />
-              </a-form-item>
-            </a-col>
-            <a-col :md="8" :sm="24">
-              <a-form-item label="发布时间">
-                <a-range-picker v-model="time" :placeholder="['开始时间', '结束时间']" @change="onChange" />
-              </a-form-item>
-            </a-col>
-            <a-col :md="6" :sm="24">
-              <a-button style="margin-right: 10px;" type="primary" @click="$refs.table.refresh(true)">查询</a-button>
-              <a-button type="" @click="resetForm">重置</a-button>
-            </a-col>
-          </a-row>
-        </a-form>
-      </div>
-      <div class="table-operator">
-        <a-button type="primary" icon="plus" @click="showModal">新建</a-button>
-      </div>
-      <s-table
-        ref="table"
-        size="default"
-        rowKey="id"
-        :columns="columns"
-        :data="loadData"
-        bordered>
-        <!-- 操作 -->
-        <span slot="action" slot-scope="text, record">
-          <template>
-            <a-icon type="eye" :style="{ fontSize: '20px', color: '#e29e14', padding: '0 10px' }" @click="handleEdit(record, 1)" />
-            <a-icon
-              type="edit"
-              v-if="record.sendStatus == '0'"
-              style="font-size: 20px;color: #1890FF;padding: 0 10px;"
-              @click="handleEdit(record, 0)" />
-            <a-icon type="delete" v-if="record.sendStatus == '0'" style="font-size: 20px;color: red;padding: 0 10px;" @click="delect(record)" />
-          </template>
-        </span>
-        <!-- 发布状态 -->
-        <template slot="sendStatus" slot-scope="text">
-          <span :style="{ color: text == '1' ? '#12b512' : 'red' }">{{ text == '1' ? '已发布' : '未发布' }}</span>
-        </template>
-      </s-table>
-
-      <!-- 新建通知 -->
-      <a-modal
-        :title="title"
-        :visible="visible"
-        :footer="null"
-        :closable="closable"
-        @cancel="cansel"
-        width="1300px">
-        <a-form
-          id="notice-news"
-          :form="form"
-          ref="form"
-          v-bind="formItemLayout"
-          @submit="handleSubmit"
-          :hideRequiredMark="hideRequiredMark">
-          <a-form-item label="通知名称" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
-            <a-input
-              v-decorator="['formData.title', { initialValue: formData.title, rules: [{ required: true, message: '请输入名称!' }] }]"
-              :disabled="disabled"
-              maxLength="15" />
-          </a-form-item>
-          <a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol" label="发布时间">
-            <a-date-picker
-              show-time
-              placeholder="年/月/日 时/分/秒"
-              :disabled-date="disabledDate"
-              v-decorator="['formData.releaseDate', { initialValue: formData.releaseDate, rules: [{ required: true, message: '请选择发布时间!' }] }]"
-              :disabled="disabled" />
-          </a-form-item>
-          <a-form-item required label="接收系统端" :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
-            <v-select
-              ref="toAppName"
-              code="app_name"
-              mode="multiple"
-              allowClear
-              placeholder="请选择"
-              :disabled="disabled"
-              v-decorator="['formData.toAppName', { initialValue: formData.toAppName, rules: [{ required: true, message: '请选择接收系统端!' }] }]"></v-select>
-          </a-form-item>
-          <a-form-item :label-col="formItemLayout.labelCol" :wrapper-col="formItemLayout.wrapperCol">
-            <span slot="label"><em v-if="!hideRequiredMark" style="color: red;">*</em> 通知内容</span>
-            <editor
-              ref="editor"
-              v-if="title != '查看详情'"
-              @on-change="editorChange"
-              :cache="false"></editor>
-            <!-- <div v-show="isShowTS" style="color: red;">请填写通知内容</div> -->
-            <div v-else-if="title == '查看详情'" v-html="formData.content">{{ formData.content }}</div>
-          </a-form-item>
-          <a-form-item :wrapper-col="{ span: 12, offset: 5 }" style="text-align: center;">
-            <a-button type="primary" html-type="submit" v-if="!disabled">保存</a-button>
-            <a-button @click="cansel()" style="margin-left: 8px">返回列表</a-button>
-          </a-form-item>
-        </a-form>
-      </a-modal>
-    </div>
-  </a-card>
-</template>
-
-<script>
-import {
-  STable,
-  VSelect
-} from '@/components'
-import Editor from '@/components/WEeditor'
-import moment from 'moment'
-import {
-  getNoticeList,
-  saveItem,
-  deleteItem
-} from '@/api/notice.js'
-export default {
-  name: 'NoticeList',
-  components: {
-    STable,
-    VSelect,
-    Editor
-  },
-  data () {
-    return {
-      // 弹窗
-      title: '新增', //  弹窗名称
-      closable: true,
-      visible: false,
-      disabled: false,
-      formLayout: 'horizontal',
-      hideRequiredMark: false, // 是否显示必填红色标记  false-- 显示   true-- 不显示
-      // isShowTS:false,  //
-      formItemLayout: {
-        labelCol: {
-          span: 6
-        },
-        wrapperCol: {
-          span: 14
-        }
-      },
-      formData: {
-        title: '', // 标题
-        content: '', // 通知内容
-        toAppName: '', // 接受系统终端
-        releaseDate: null // 发布时间
-      },
-      // 列表
-      form: this.$form.createForm(this, {
-        name: 'NoticeList'
-      }),
-      // 查询参数
-      searchData: {
-        title: '',
-        beginDate: null,
-        endDate: null
-      },
-      columns: [{
-        title: '序号',
-        dataIndex: 'no',
-        minWidth: '40',
-        align: 'center'
-      },
-      {
-        title: '创建时间',
-        minWidth: '100',
-        dataIndex: 'createDate',
-        align: 'center'
-      },
-      {
-        title: '通知名称',
-        minWidth: '100',
-        dataIndex: 'title',
-        align: 'center'
-      },
-      {
-        title: '发布时间',
-        minWidth: '100',
-        dataIndex: 'releaseDate',
-        align: 'center'
-      },
-      {
-        title: '发布状态',
-        minWidth: '100',
-        dataIndex: 'sendStatus',
-        align: 'center',
-        scopedSlots: {
-          customRender: 'sendStatus'
-        }
-      },
-      {
-        title: '操作',
-        // dataIndex: 'action',
-        minWidth: '100',
-        align: 'center',
-        scopedSlots: {
-          customRender: 'action'
-        }
-      }
-      ],
-      pageNo: 1,
-      pageSize: 10,
-      time: null,
-      // 加载数据方法 必须为 Promise 对象
-      loadData: parameter => {
-        return getNoticeList(Object.assign(parameter, this.searchData)).then(res => {
-          console.log(res, '1111')
-          const no = (res.data.pageNo - 1) * res.data.pageSize
-          for (let i = 0; i < res.data.list.length; i++) {
-            const _item = res.data.list[i]
-            _item.no = no + i + 1
-            _item.sendStatus = _item.sendStatus + '' === '1'
-          }
-          return res.data
-        })
-      }
-    }
-  },
-  mounted () {},
-  methods: {
-    // 限制时间
-    moment,
-    range (start, end) {
-      const result = []
-      for (let i = start; i < end; i++) {
-        result.push(i)
-      }
-      return result
-    },
-    disabledDate (current) {
-      return current && current < moment().subtract(1, 'days')
-    },
-    disabledDateTime () {
-      return {
-        disabledHours: () => this.range(0, moment().hour()),
-        disabledMinutes: () => this.range(0, moment().minute()),
-        disabledSeconds: () => this.range(0, moment().second())
-      }
-    },
-    // 文本编辑器
-    editorChange (html, text) {
-      this.formData.content = html
-    },
-    // 打开弹窗
-    showModal () {
-      this.visible = true
-      this.disabled = false
-      delete this.formData.id
-      this.form.resetFields()
-      this.hideRequiredMark = false
-    },
-    // 赋值
-    assignment (row) {
-      this.formData.id = row.id
-      this.formData.title = row.title
-      this.formData.releaseDate = moment(row.releaseDate)
-      this.formData.content = row.content
-      this.formData.toAppName = row.toAppName.split(',')
-    },
-    // 查看详情与编辑
-    handleEdit (row, type) {
-      console.log(row)
-      if (type == 1) {
-        this.title = '查看详情'
-        this.assignment(row)
-        this.hideRequiredMark = true
-      } else if (type == 0) {
-        this.title = '编辑'
-        this.assignment(row)
-        this.hideRequiredMark = false
-      } else {
-        this.title = '新增'
-      }
-      this.disabled = type == 1
-      this.visible = true
-      // 点击查看详情时给文本编辑器赋值
-      setTimeout(() => {
-        this.$refs.editor.setHtml(this.formData.content)
-      }, 200)
-    },
-    // 删除
-    delect (row) {
-      const _this = this
-      this.$confirm({
-        title: '警告',
-        content: '删除后无法恢复,确认删除?',
-        okText: '确定',
-        cancelText: '取消',
-        onOk () {
-          deleteItem({
-            id: row.id
-          }).then(res => {
-            if (res.status == 200) {
-              _this.$message.success('删除成功')
-              _this.$refs.table.refresh(true)
-            }
-          })
-        }
-      })
-    },
-    // 发布时间change
-    onChange (dates, dateStrings) {
-      console.log(dates)
-      console.log(dateStrings)
-      if ((dates, dateStrings)) {
-        if (dateStrings.length > 0) {
-          this.searchData.beginDate = dateStrings[0] + ' 00:00:00'
-          this.searchData.endDate = dateStrings[1] + ' 00:00:00'
-        } else {
-          this.searchData.beginDate = dateStrings[0]
-          this.searchData.endDate = dateStrings[1]
-        }
-      }
-    },
-    // 保存
-    handleSubmit (e) {
-      e.preventDefault()
-      this.form.validateFields((err, values) => {
-        if (!err) {
-          const formData = Object.assign({}, this.formData, values.formData)
-          let content = this.$refs.editor.getTxt()
-          content = content.replace(/&nbsp;+/g, '')
-          content = content.replace(/\s+/g, '')
-          // console.log(content,'content')
-          if (content.length == 0) {
-            this.$message.error('请填写通知内容')
-            return
-          }
-          if (moment().isSameOrAfter(formData.releaseDate, 'second')) {
-            this.$message.error('发布时间已过,请重新选择')
-            return
-          }
-          formData.toAppName = formData.toAppName.join(',')
-          formData.releaseDate = moment(formData.releaseDate).format('YYYY-MM-DD HH:mm:ss')
-          saveItem(formData).then(res => {
-            console.log(res, 'rrrrrrrrr')
-            if (res.status == 200) {
-              this.$message.success(res.message ? res.message : '保存成功')
-              this.$refs.table.refresh(true)
-              this.cansel()
-            } else {
-              this.$message.error(res.message)
-            }
-          })
-        }
-      })
-    },
-    // 返回列表
-    cansel () {
-      this.visible = false
-      this.title = '新增'
-      this.formData.title = ''
-      this.formData.content = ''
-      this.formData.releaseDate = ''
-      this.formData.toAppName = ''
-      this.$refs.editor.setHtml('')
-      this.form.resetFields()
-    },
-
-    // 重置
-    resetForm () {
-      this.searchData.title = ''
-      this.searchData.beginDate = null
-      this.searchData.endDate = null
-      this.time = null
-      this.$refs.table.refresh(true)
-    }
-  }
-}
-</script>
-
-<style></style>

+ 2 - 2
src/views/power/menu/childModal.vue

@@ -158,7 +158,7 @@
 
 <script>
 import { STable, VSelect } from '@/components'
-import { saveMenu } from '@/api/menu.js'
+import { saveYyMenu } from '@/api/menu.js'
 export default {
   name: 'ChildModal',
   components: {
@@ -216,7 +216,7 @@ export default {
       this.form.validateFields((err, values) => {
         if (!err) {
           console.log(values.formData, ' formData.type222222222')
-          saveMenu(Object.assign(this.formData, values.formData)).then(res => {
+          saveYyMenu(Object.assign(this.formData, values.formData)).then(res => {
             console.log(res, 'res--save')
             if (res.status + '' === '200') {
               this.$message.success(res.message ? res.message : '保存成功')

+ 9 - 83
src/views/power/menu/menu.vue

@@ -13,7 +13,6 @@
           <a-icon type="info-circle" style="color: #1890FF;margin-right: 10px;" />
           <span>当前选择:<span style="color: #40a9ff;font-weight: 600;">{{ selectedMenu }}</span><span v-if="selectedKeys.length" class="imgSize" @click="cancelSel">取消选择</span></span>
         </a-row>
-
         <a-row :gutter="24" >
           <a-input-search placeholder="输入搜索菜单名搜索" style="width: 100%" @change="onChange" />
           <a-tree
@@ -60,33 +59,6 @@
                 rules: [{ required: true, message: '请输入名称!' },{pattern:'^[^<|>]{1,20}$',message:'请输入不含<或>的字符,最多20个字符'}] }]"
             />
           </a-form-item>
-          <!-- 路由英文名 -->
-          <!-- <a-form-item v-if="!formData.type||formData.type=='0'" label="路由英文名" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
-            <a-input
-              placeholder="请输入路由英文名"
-              v-decorator="['formData.routeName', {
-                initialValue: formData.routeName,
-                rules: [{ required: true, message: '请输入路由英文名!' }] }]"
-            />
-          </a-form-item> -->
-          <!-- 路径 -->
-          <!-- <a-form-item v-if="!formData.type||formData.type=='0'" label="路径" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
-            <a-input
-              placeholder="请输入路径"
-              v-decorator="['formData.routePath', {
-                initialValue: formData.routePath,
-                rules: [{ required: true, message: '请输入路径!' }] }]"
-            />
-          </a-form-item> -->
-          <!-- 请求路径 -->
-          <!-- <a-form-item v-if="formData.type==1" label="请求路径" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
-            <a-input
-              placeholder="请输入请求路径"
-              v-decorator="['formData.urlPath', {
-                initialValue: formData.urlPath,
-                rules: [{ required: true, message: '请输入请求路径!' }] }]"
-            />
-          </a-form-item> -->
           <!-- 前端权限编码 -->
           <a-form-item label="前端权限编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
             <a-input
@@ -111,35 +83,6 @@
               ]"
             />
           </a-form-item>
-          <!-- 图标 -->
-          <!-- <a-form-item v-if="!formData.type ||formData.type=='0' " label="图标" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
-            <a-input
-              placeholder="请输入图标名称"
-              v-decorator="['formData.icon', {
-                initialValue: formData.icon,
-                rules: [] }]"
-            />
-          </a-form-item> -->
-          <!-- 前端组件 -->
-          <!-- <a-form-item v-if="!formData.type ||formData.type=='0'" label="前端组件" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
-            <a-input
-              placeholder="请输入前端组件路径"
-              v-decorator="['formData.componentPath', {
-                initialValue: formData.componentPath,
-                rules: [{ required: true, message: '请输入前端组件路径!' }] }]"
-            />
-          </a-form-item> -->
-
-          <!-- 第三方链接 -->
-          <!-- <a-form-item v-if="!formData.type ||formData.type=='0'" label="第三方链接" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
-            <a-input
-              placeholder="请输入第三方链接地址"
-              v-decorator="['formData.urlPath', {
-                initialValue: formData.urlPath,
-                rules: [] }]"
-            />
-          </a-form-item> -->
-
           <!-- 排序值 -->
           <a-form-item label="排序值" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
             <a-input
@@ -165,7 +108,6 @@
               <a-radio :value="0">否</a-radio>
             </a-radio-group>
           </a-form-item>
-
           <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
             <a-button type="primary" @click="handleSubmit()">
               保存
@@ -178,14 +120,14 @@
 
       </a-col>
     </a-row>
-    <childModal :visible="showChildModal" @refresh="getMenuList" :data="parentData" @close="showChildModal = false"></childModal>
+    <childModal :visible="showChildModal" @refresh="getYyMenuList" :data="parentData" @close="showChildModal = false"></childModal>
   </a-card>
 </template>
 
 <script>
 import { STable, VSelect } from '@/components'
 import childModal from './childModal.vue'
-import { getMenuList, saveMenu, deleteMenu } from '@/api/menu.js'
+import { getYyMenuList, saveYyMenu, deleteYyMenu } from '@/api/menu.js'
 
 export default {
   name: 'Menu',
@@ -231,18 +173,15 @@ export default {
   },
   methods: {
     onExpand (expandedKeys) {
-      // console.log('onExpand', expandedKeys)
       this.expandedKeys = expandedKeys
       this.autoExpandParent = false
     },
-
     onSelect (selectedKeys, info) {
       console.log('onSelect', info)
       this.selectedKeys = selectedKeys
       if (info.selected) {
         const data = info.selectedNodes[0].data.props
         const isLeaf = data.dataRef.children
-        // this.formData = Object.assign({}, this.formData, info.selectedNodes[0].data.props)
         this.formData = {
           id: data.id,
           name: data.name,
@@ -258,7 +197,6 @@ export default {
           status: data.status,
           isLeaf: !(isLeaf && isLeaf.length)
         }
-
         this.selectedMenu = this.formData.name
         this.formData.status = Number(this.formData.status)
       } else {
@@ -273,7 +211,6 @@ export default {
         this.dataList.push({ key, title: key })
         node.scopedSlots = { title: 'title' }
         node.slots = { icon: node.type == '0' ? 'file' : 'pushpin' }
-
         if (node.children) {
           this.generateList(node.children)
         }
@@ -310,12 +247,10 @@ export default {
       })
     },
     // 获取菜单树列表
-    getMenuList () {
-      getMenuList().then(res => {
-        console.log(res, 'res1111111')
+    getYyMenuList () {
+      getYyMenuList().then(res => {
         if (res.status == 200) {
           this.treeData = res.data
-          console.log(this.treeData, 'this.treeData')
         }
       })
     },
@@ -372,12 +307,12 @@ export default {
         okText: '确定',
         cancelText: '取消',
         onOk () {
-          deleteMenu({
+          deleteYyMenu({
             id: _this.formData.id
           }).then(res => {
             if (res.status == 200) {
               _this.$message.success('删除成功')
-              _this.getMenuList()
+              _this.getYyMenuList()
             }
           }).catch(() => {
             _this.$message.success('删除失败, 请稍后重试')
@@ -391,12 +326,11 @@ export default {
       const _this = this
       this.form.validateFields((err, values) => {
         if (!err) {
-          console.log(values.formData, ' formData.type222222222')
-          saveMenu(Object.assign({ id: this.formData.id }, values.formData)).then(res => {
+          saveYyMenu(Object.assign({ id: this.formData.id }, values.formData)).then(res => {
             console.log(res, 'res--save')
             if (res.status + '' === '200') {
               this.$message.success(res.message ? res.message : '保存成功')
-              _this.getMenuList()
+              _this.getYyMenuList()
               _this.clear()
             } else {
               // this.$message.warning(res.message)
@@ -409,19 +343,14 @@ export default {
       this.clear()
     }
 
-  },
-  mounted () {
   },
   beforeCreate () {
     this.form = this.$form.createForm(this, { name: 'menu' })
   },
   beforeRouteEnter (to, from, next) {
     next(vm => {
-      vm.getMenuList()
+      vm.getYyMenuList()
     })
-  },
-  watch: {
-
   }
 }
 </script>
@@ -431,7 +360,6 @@ export default {
     width: 6px;
     height: 6px ;
   }
-
   .menu-box::-webkit-scrollbar-thumb{
     width: 6px;
     height: 6px ;
@@ -439,7 +367,6 @@ export default {
     -webkit-box-shadow: inset 0 0 2px #d1d1d1;
     background: #e4e4e4;
   }
-
   .textCount{
     border: 1px solid #91d5ff;
     background-color: #e6f7ff;
@@ -453,5 +380,4 @@ export default {
     margin-left: 10px;
     font-size: 14px;
   }
-
 </style>

+ 0 - 7
src/views/power/role/menuModal.vue

@@ -62,7 +62,6 @@ export default {
   },
   methods: {
     onExpand (expandedKeys) {
-      console.log('onExpand', expandedKeys)
       // if not set autoExpandParent to false, if children expanded, parent can not collapse.
       // or, you can remove all expanded children keys.
       this.expandedKeys = expandedKeys
@@ -76,20 +75,16 @@ export default {
       this.clear()
       this.$emit('close')
     },
-
     // 保存提交
     handleSubmit () {
       const _this = this
       this.form.validateFields((err, values) => {
         if (!err) {
-          console.log(this.checkedData)
           if (this.checkedData.length == 0) {
             return this.$message.warning('请先选择菜单')
           }
           const arr = this.checkedData.join(',')
-          console.log({ id: this.id, menuIds: arr })
           addMenuPower({ id: this.id, menuIds: arr }).then(res => {
-            console.log(res, 'res--save')
             if (res.status + '' === '200') {
               this.$message.success(res.message ? res.message : '保存成功')
               this.$emit('refresh')
@@ -164,8 +159,6 @@ export default {
             this.expandedKeys = temp
             // 找出叶子节点
             this.findLeaf(this.treeData, temp)
-            // console.log(this.checkedKeys, 'this.checkedKeys----')
-            // console.log(this.checkedData, 'this.checkedData')
           }
         }
       } else {

+ 16 - 9
src/views/power/role/roleList.vue

@@ -5,17 +5,17 @@
         <a-row :gutter="48">
           <a-col :md="6" :sm="24">
             <a-form-item label="角色名称">
-              <a-input allowClear v-model="queryParam.name" placeholder="请输入角色名称"/>
+              <a-input allowClear v-model.trim="queryParam.name" @pressEnter="$refs.table.refresh(true)" placeholder="请输入角色名称"/>
             </a-form-item>
           </a-col>
-
           <a-col :md="6" :sm="24">
             <a-form-item label="状态">
               <v-select code="CHECK_ENABLE_STATE" v-model="queryParam.isEnable" allowClear placeholder="请选择状态" ></v-select>
             </a-form-item>
           </a-col>
-          <a-col :md="4" :sm="24">
+          <a-col :md="4" :sm="24" class="flex-sp">
             <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+            <a-button @click="reset">重置</a-button>
           </a-col>
         </a-row>
       </a-form>
@@ -112,8 +112,6 @@ export default {
       ],
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
-        console.log(parameter, 'parameter')
-
         return getPowerRoleList(Object.assign(parameter, this.queryParam)).then(res => {
           const no = (res.data.pageNo - 1) * res.data.pageSize
           for (let i = 0; i < res.data.list.length; i++) {
@@ -153,11 +151,17 @@ export default {
         if (res.status == 200) {
           _this.menuData = res.data
           this.showMenuModal = true
-          console.log(res.data, 'this.itemData')
         }
       })
     },
-
+    //  重置
+    reset () {
+      this.queryParam = {
+        name: '',
+        isEnable: ''
+      }
+      this.$refs.table.refresh(true)
+    },
     // 删除
     delect (row) {
       const _this = this
@@ -170,7 +174,6 @@ export default {
           delectRolePower({
             id: row.id
           }).then(res => {
-            console.log(res, 'res1111')
             if (res.status == 200) {
               _this.$message.success('删除成功')
               _this.$refs.table.refresh()
@@ -184,7 +187,6 @@ export default {
       })
     },
     handleEdit (row) {
-      console.log(row, 'row')
       this.showModal = true
       this.itemData = row
     },
@@ -209,6 +211,11 @@ export default {
   .table-page-search-wrapper .ant-form-inline .ant-form-item{
     margin-bottom: 0;
   }
+  .flex-sp{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
   .action-button{
     line-height: 40px;
     white-space: nowrap;

+ 0 - 3
src/views/power/role/roleModal.vue

@@ -99,9 +99,7 @@ export default {
       const _this = this
       this.form.validateFields((err, values) => {
         if (!err) {
-          console.log(values.formData, ' formData.type222222222')
           saveRolePower(Object.assign(this.formData, values.formData)).then(res => {
-            console.log(res, 'res--save')
             if (res.status + '' === '200') {
               this.$message.success(res.message ? res.message : '保存成功')
               this.$emit('refresh')
@@ -154,7 +152,6 @@ export default {
           this.formData = Object.assign({}, this.data)
           delete this.formData.no
           this.formData.isEnable = Number(this.formData.isEnable)
-          console.log(this.formData, 'this.formData')
         } else {
           this.titleText = '添加角色'
         }

+ 18 - 6
src/views/power/user/userList.vue

@@ -5,23 +5,22 @@
         <a-row :gutter="48">
           <a-col :md="6" :sm="24">
             <a-form-item label="用户名称">
-              <a-input allowClear v-model="queryParam.name" placeholder="请输入用户名称"/>
+              <a-input allowClear v-model.trim="queryParam.name" @pressEnter="$refs.table.refresh(true)" placeholder="请输入用户名称"/>
             </a-form-item>
           </a-col>
-
           <a-col :md="6" :sm="24">
             <a-form-item label="手机号码">
-              <a-input allowClear v-model="queryParam.phone" placeholder="请输入手机号码"/>
+              <a-input allowClear v-model.trim="queryParam.phone" @pressEnter="$refs.table.refresh(true)" placeholder="请输入手机号码"/>
             </a-form-item>
           </a-col>
-
           <a-col :md="6" :sm="24">
             <a-form-item label="状态">
               <v-select code="CHECK_ENABLE_STATE" v-model="queryParam.loginFlag" allowClear placeholder="请选择状态"></v-select>
             </a-form-item>
           </a-col>
-          <a-col :md="4" :sm="24">
+          <a-col :md="4" :sm="24" class="flex-sp">
             <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+            <a-button @click="reset">重置</a-button>
           </a-col>
         </a-row>
       </a-form>
@@ -192,6 +191,15 @@ export default {
         }
       })
     },
+    //  重置
+    reset () {
+      this.queryParam = {
+        name: '',
+        phone: '',
+        loginFlag: ''
+      }
+      this.$refs.table.refresh(true)
+    },
     getBizStr (storeBizList) {
       const str = []
       storeBizList.forEach(item => {
@@ -200,7 +208,6 @@ export default {
       return str.join(',')
     },
     handleEdit (row) {
-      console.log(row, 'row')
       this.showModal = true
       this.itemData = row
     },
@@ -225,6 +232,11 @@ export default {
   .table-page-search-wrapper .ant-form-inline .ant-form-item{
     margin-bottom: 0;
   }
+  .flex-sp{
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
   .action-button{
    line-height: 40px;
    white-space: nowrap;

+ 0 - 19
src/views/power/user/userModal.vue

@@ -26,7 +26,6 @@
             </a-form-item>
           </a-col>
         </a-row>
-
         <a-row :gutter="24">
           <!-- 性别 -->
           <a-col :span="12">
@@ -85,7 +84,6 @@
               </a-select>
             </a-form-item>
           </a-col>
-
         </a-row>
         <a-row :gutter="24">
           <a-col :span="24">
@@ -103,7 +101,6 @@
             </a-form-item>
           </a-col>
         </a-row>
-
         <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
           <a-button type="primary" @click="handleSubmit()">
             保存
@@ -113,7 +110,6 @@
           </a-button>
         </a-form-item>
       </a-form>
-
     </a-modal>
   </div>
 </template>
@@ -153,7 +149,6 @@ export default {
         sex: '',
         remarks: ''
       }
-
     }
   },
   methods: {
@@ -166,14 +161,9 @@ export default {
     handleSubmit () {
       const _this = this
       this.form.validateFields((err, values) => {
-        console.log(values, 'values222')
         if (!err) {
           values.formData.roleNames = values.formData.roleNames.join(',')
-
-          console.log(values.formData, ' formData.type222222222')
-          console.log(Object.assign({ id: this.data.id ? this.data.id : '' }, values.formData))
           saveUserPower(Object.assign({ id: this.data.id ? this.data.id : '' }, values.formData)).then(res => {
-            console.log(res, 'res--save')
             if (res.status + '' === '200') {
               this.$message.success(res.message ? res.message : '保存成功')
               this.$emit('refresh')
@@ -215,7 +205,6 @@ export default {
     // 获取角色列表接口
     getRoleList () {
       getRoleList().then(res => {
-        console.log(res, 'res--role')
         if (res.status + '' === '200') {
           this.roleList = res.data
         } else {
@@ -242,13 +231,9 @@ export default {
           this.formData = Object.assign({}, this.data)
           delete this.formData.no
           let roleNames = this.formData.roleNames
-          console.log(roleNames, 'roleNames')
           if (roleNames) {
             roleNames = roleNames.split(',')
-            console.log(roleNames, 'roleNames22')
             const arr = []
-            console.log(this.roleList, 'this.roleList')
-
             roleNames.map(item => {
               const row = this.roleList.find(a => {
                 return a.name == item
@@ -257,16 +242,12 @@ export default {
                 arr.push(row.id)
               }
             })
-
-            console.log(arr, 'arrs')
             this.formData.roleNames = arr
           } else {
             this.formData.roleNames = []
           }
 
           this.formData.loginFlag = Number(this.formData.loginFlag)
-          // this.formData.sex = Number(this.formData.sex)
-          console.log(this.formData, 'this.formData')
         } else {
           this.titleText = '添加用户'
         }

+ 0 - 281
src/views/tenants/tenantsList.vue

@@ -1,281 +0,0 @@
-<template>
-  <a-card :bordered="false">
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline">
-        <a-row :gutter="48">
-          <a-col :span="6">
-            <a-form-item label="企业名称" >
-              <a-input allowClear v-model.trim="queryParam.name" placeholder="请输入企业名称"/>
-            </a-form-item>
-          </a-col>
-          <a-col :span="6">
-            <a-form-item label="申请人手机" >
-              <a-input allowClear v-model.trim="queryParam.contactPhone" placeholder="请输入申请人手机"/>
-            </a-form-item>
-          </a-col>
-          <a-col :span="6">
-            <a-form-item label="推荐人手机" >
-              <a-input allowClear v-model.trim="queryParam.introPhone" placeholder="请输入推荐人手机"/>
-            </a-form-item>
-          </a-col>
-          <a-col :span="6">
-            <a-button type="primary" style="margin-right: 10px;" @click="$refs.table.refresh(true)">查询</a-button>
-            <a-button type="" @click="reset">重置</a-button>
-          </a-col>
-        </a-row>
-        <a-row :gutter="48">
-          <a-col :span="6">
-            <a-form-item label="是否有推荐人" >
-              <a-select
-                allowClear
-                v-model="queryParam.applyType"
-                placeholder="是否有推荐人"
-              >
-                <a-select-option :value="1">
-                  是
-                </a-select-option>
-                <a-select-option :value="0">
-                  否
-                </a-select-option>
-              </a-select>
-              <!-- <v-select ref="applyType" allowClear placeholder="是否有推荐人" v-model="queryParam.applyType" code="FLAG"></v-select> -->
-            </a-form-item>
-          </a-col>
-          <a-col :span="6">
-            <a-form-item label="状态" >
-              <v-select ref="status" allowClear placeholder="状态" v-model="queryParam.status" code="CHECK_ENABLE_STATE"></v-select>
-            </a-form-item>
-          </a-col>
-        </a-row>
-        <v-select v-show="false" ref="orgType" allowClear code="ORG_TYPE"></v-select>
-      </a-form>
-    </div>
-    <s-table
-      ref="table"
-      size="default"
-      :rowKey="(record) => record.id"
-      :columns="columns"
-      :data="loadData"
-      bordered
-    >
-      <!-- 操作 -->
-      <template slot="action" slot-scope="text, row">
-        <a size="small" class="action-button menu-text" @click="openModal(row)" type="primary" >授权</a>
-      </template>
-      <!-- 启用禁用 -->
-      <template slot="enable" slot-scope="text, row">
-        <a-switch checkedChildren="已启用" unCheckedChildren="已禁用" v-model="row.status" @change="changeFlagHandle(text, row)"/>
-      </template>
-      <!-- 门店类型 -->
-      <template slot="orgType" slot-scope="text, row">
-        {{ $refs.orgType.getNameByCode(text) }}
-      </template>
-      <!-- 地址 -->
-      <template slot="address" slot-scope="text, row">
-        {{ getAddr(row) }}
-      </template>
-    </s-table>
-    <!-- 授权弹窗 -->
-    <tenantsModal :itemData="itemData" :visible="openTenantsModal" @refresh="$refs.table.refresh()" @close="openTenantsModal=false"></tenantsModal>
-  </a-card>
-
-</template>
-
-<script>
-import { STable, VSelect } from '@/components'
-import { getTenantsList, enable } from '@/api/tenants.js'
-import tenantsModal from './tenantsModal.vue'
-import moment from 'moment'
-export default {
-  name: 'TenantsList',
-  components: {
-    STable, VSelect, tenantsModal
-  },
-  data () {
-    return {
-      moment,
-      pageNo: 1,
-      pageSize: 10,
-      openTenantsModal: false, // 打开授权弹窗
-      itemData: null, // 授权信息
-      // 查询参数
-      queryParam: {
-        name: '',
-        contactPhone: '',
-        introPhone: '',
-        applyType: undefined, // 申请来源  0:自申请  1:推荐
-        status: '' // 状态
-      },
-      // 表头
-      columns: [
-        {
-          title: '序号',
-          dataIndex: 'no',
-          width: '40',
-          align: 'center'
-        },
-        {
-          title: '申请时间',
-          dataIndex: 'applyTime',
-          width: '200',
-          align: 'center'
-        },
-        {
-          title: '企业名称',
-          dataIndex: 'name',
-          align: 'center'
-        },
-        {
-          title: '门店类型',
-          dataIndex: 'orgType',
-          width: '120',
-          align: 'center',
-          scopedSlots: {
-            customRender: 'orgType'
-          }
-        },
-        {
-          title: '申请人手机',
-          width: '120',
-          align: 'center',
-          dataIndex: 'contactPhone'
-        },
-        {
-          title: '推荐人手机',
-          width: '120',
-          align: 'center',
-          dataIndex: 'introPhone'
-        },
-        {
-          title: '地址',
-          width: '200',
-          align: 'center',
-          scopedSlots: {
-            customRender: 'address'
-          }
-        },
-        {
-          title: '有效期至',
-          width: '200',
-          align: 'center',
-          dataIndex: 'expireDate'
-        },
-        {
-          title: '启用状态',
-          width: '200',
-          align: 'center',
-          dataIndex: 'status',
-          scopedSlots: {
-            customRender: 'enable'
-          }
-        },
-        {
-          title: '操作',
-          width: '200',
-          align: 'center',
-          scopedSlots: {
-            customRender: 'action'
-          }
-        }
-      ],
-      // 加载数据方法 必须为 Promise 对象
-      loadData: parameter => {
-        return getTenantsList(Object.assign(parameter, this.queryParam)).then(res => {
-          if (res.status == 200) {
-            const no = (res.data.pageNo - 1) * res.data.pageSize
-            for (let i = 0; i < res.data.list.length; i++) {
-              const _item = res.data.list[i]
-              _item.no = no + i + 1
-              _item.status = _item.status + '' === '1'
-            }
-            return res.data
-          }
-        })
-      }
-    }
-  },
-  beforeRouteEnter (to, from, next) {
-    next(vm => {
-      vm.$refs.table.refresh()
-    })
-  },
-  methods: {
-    // 地址拼接
-    getAddr (row) {
-      const provinceName = row.provinceName ? row.provinceName : ''
-      const cityName = row.cityName ? row.cityName : ''
-      const districtName = row.districtName ? row.districtName : ''
-      const addrDetail = row.addrDetail ? row.addrDetail : ''
-      if (provinceName === cityName) {
-        return cityName + districtName + addrDetail
-      }
-      return provinceName + cityName + districtName + addrDetail
-    },
-    // 修改状态
-    changeFlagHandle (text, record) {
-      const _data = {
-        id: record.id,
-        status: record.status ? '1' : '0'
-      }
-      if (!record.expireDate && _data.status == '1') {
-        this.$message.success('请确认授权设置无误并点击【确定】后,再进行启用!')
-        record.status = !record.status
-      } else {
-        enable(_data).then(res => {
-          console.log(res.status)
-          if (res.status == '200') {
-            this.$message.success('修改成功')
-            this.$refs.table.refresh()
-          } else {
-            record.status = !record.status
-          }
-        })
-      }
-    },
-    // 打开授权弹窗
-    openModal (data) {
-      this.itemData = data
-      this.openTenantsModal = true
-    },
-    // 重置
-    reset () {
-      this.queryParam = {
-        name: '',
-        contactPhone: '',
-        introPhone: '',
-        applyType: '', // 申请来源  0:自申请  1:推荐
-        status: '' // 状态
-      }
-      this.$refs.table.refresh()
-    }
-  }
-}
-</script>
-<style>
-  .table-page-search-wrapper ,.addButton{
-    margin-bottom: 0;
-  }
-  .table-page-search-wrapper .ant-form-inline .ant-form-item{
-    margin-bottom: 10px;
-  }
-  .textCount{
-    border: 1px solid #91d5ff;
-    background-color: #e6f7ff;
-    padding: 10px 0;
-    border-radius: 5px;
-    padding-left: 20px;
-    margin: 10px 0;
-  }
-  .action-button{
-    line-height: 40px;
-    white-space: nowrap;
-    padding: 5px 10px;
-    background-color: #1890ff;
-    border-radius: 4px;
-    color: #fff;
-    margin-right: 5px;
-  }
-  .menu-text {
-    background-color: #f90;
-  }
-</style>

+ 0 - 270
src/views/tenants/tenantsModal.vue

@@ -1,270 +0,0 @@
-<template>
-  <div>
-    <a-modal class="modalBox" :title="titleText" v-model="isshow" @cancle="cancel" :width="600">
-      <a-form :form="form" @submit="handleSubmit" >
-        <!-- 企业名称 -->
-        <a-form-item label="企业名称:" :label-col="{ span: 9 }" :wrapper-col="{ span: 14 }">
-          <span>{{ itemData?itemData.name:'' }}</span>
-        </a-form-item>
-        <!-- 申请人手机 -->
-        <a-form-item label="申请人手机:" :label-col="{ span: 9 }" :wrapper-col="{ span: 14 }">
-          <span>{{ itemData?itemData.contactPhone:'' }}</span>
-        </a-form-item>
-        <!-- 推荐人手机 -->
-        <a-form-item label="推荐人手机:" :label-col="{ span: 9 }" :wrapper-col="{ span: 14 }">
-          <span>{{ itemData?itemData.introPhone:'' }}</span>
-        </a-form-item>
-
-        <!-- 使用有效期至 -->
-        <a-form-item label="使用有效期至:" :label-col="{ span: 9 }" :wrapper-col="{ span: 14 }">
-          <a-date-picker
-            style="width: 100%;"
-            @change="expireDateChange"
-            placeholder="年/月/日"
-            v-decorator="[
-              'formData.expireDate',
-              { initialValue: formData.expireDate,
-                rules: [{type: 'object', required: true, message: '请选择使用有效期!' }] },
-            ]"/>
-          <p>
-            常选:<span class="time-text" @click="timeFilter(3)">3天</span>  <span class="time-text" @click="timeFilter(30)">1个月</span>  <span class="time-text" @click="timeFilter(365)">1年</span>
-          </p>
-        </a-form-item>
-        <!-- 门店类型 -->
-        <a-form-item label="门店类型:" :label-col="{ span: 9 }" :wrapper-col="{ span: 14 }">
-          <v-select
-            ref="orgType"
-            allowClear
-            :disabled="hasOrgType"
-            @change="orgTypeChange"
-            v-decorator="[
-              'formData.orgType',
-              { initialValue: formData.orgType,
-                rules: [{ required: true, message: '请选择门店类型!' }] },
-            ]"
-            code="ORG_TYPE"></v-select>
-
-        </a-form-item>
-        <!-- 使用权限 -->
-        <a-form-item label="使用权限:" :label-col="{ span: 9 }" :wrapper-col="{ span: 14 }">
-          <v-select
-            ref="orgType"
-            allowClear
-            @change="scopeTypeChange"
-            v-decorator="[
-              'formData.scopeType',
-              { initialValue: formData.scopeType,
-                rules: [{ required: true, message: '请选择使用权限!' }] },
-            ]"
-            code="STORE_AUTH_TYPE"></v-select>
-
-        </a-form-item>
-        <!-- 最大可开通门店数 -->
-        <a-form-item v-if="formData.orgType=='ls'" label="最大可开通门店数:" :label-col="{ span: 9 }" :wrapper-col="{ span: 14 }">
-          <a-input-number
-            id="inputNumber"
-            :min="1"
-            :max="10"
-            style="width: 100%;"
-            v-decorator="[
-              'formData.childMaxNum',
-              { initialValue: formData.childMaxNum,
-                rules: [{ required: true, message: '请输入最大可开通门店数!' }] },
-            ]"
-          />
-        </a-form-item>
-        <!-- 单店最大可开通用户数 -->
-        <a-form-item v-if="formData.orgType=='ls'" label="单店最大可开通用户数:" :label-col="{ span: 9 }" :wrapper-col="{ span: 14 }">
-          <span class="labelT">( 包含管理员账号 )</span>
-          <a-input-number
-            id="inputNumber"
-            :min="1"
-            :max="100"
-            style="width: 100%;"
-            v-decorator="[
-              'formData.childUserMaxNum',
-              { initialValue: formData.childUserMaxNum,
-                rules: [{ required: true, message: '请输入单店最大可开通用户数!' }] },
-            ]"
-          />
-        </a-form-item>
-        <!-- 最大可开通用户数 -->
-        <a-form-item v-if="formData.orgType!='ls'" label="最大可开通用户数:" :label-col="{ span: 9 }" :wrapper-col="{ span: 14 }">
-          <span class="labelT">( 包含管理员账号 )</span>
-          <a-input-number
-            id="inputNumber"
-            :min="1"
-            :max="100"
-            style="width: 100%;"
-            v-decorator="[
-              'formData.childUserMaxNum',
-              { initialValue: formData.childUserMaxNum,
-                rules: [{ required: true, message: '请输入最大可开通用户数!' }] },
-            ]"
-          />
-        </a-form-item>
-
-        <a-form-item :wrapper-col="{ span: 24, offset: 10 }">
-          <a-button type="primary" @click="handleSubmit()">
-            确定
-          </a-button>
-          <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()">
-            取消
-          </a-button>
-        </a-form-item>
-      </a-form>
-
-    </a-modal>
-  </div>
-</template>
-
-<script>
-import { STable, VSelect } from '@/components'
-import { saveAuth } from '@/api/tenants.js'
-import moment from 'moment'
-export default {
-  name: 'TenantsModal',
-  components: {
-    STable, VSelect
-  },
-  props: {
-    visible: {
-      type: Boolean,
-      default: false
-    },
-    itemData: {
-      type: Object,
-      default: function () {
-        return {}
-      }
-    }
-  },
-  data () {
-    return {
-      moment,
-      titleText: '设置权限',
-      isshow: this.visible,
-      hasOrgType: false,
-      formLayout: 'horizontal',
-      form: this.$form.createForm(this, { name: 'tenantsModal' }),
-      formData: {
-        expireDate: null,
-        orgType: '',
-        scopeType: '',
-        childMaxNum: 1,
-        childUserMaxNum: 1
-      }
-
-    }
-  },
-  methods: {
-    cancel (e) {
-      this.clear()
-      this.$emit('close')
-    },
-    expireDateChange (v) {
-      console.log(v)
-      this.form.setFields({ 'formData.expireDate': { value: v, errors: '' } })
-    },
-    orgTypeChange (v) {
-      this.formData.orgType = v
-      
-    },
-    scopeTypeChange (v) {
-      this.formData.scopeType = v
-    },
-    // 快捷时间处理
-    timeFilter (time) {
-      const now = moment().add(time, 'day').format('YYYY-MM-DD')
-      this.form.setFields({ 'formData.expireDate': { value: moment(now, 'YYYY-MM-DD'), errors: '' } })
-    },
-
-    // 保存提交
-    handleSubmit () {
-      const _this = this
-      this.form.validateFields((err, values) => {
-        if (!err) {
-          console.log(values.formData, ' formData.type222222222')
-          const params = Object.assign({ id: this.itemData.id }, values.formData)
-          params.expireDate = moment(params.expireDate).format('YYYY-MM-DD')
-            console.log(params, 'ppppppppppppp')
-          saveAuth(params).then(res => {
-            console.log(res, 'res--save')
-            if (res.status + '' === '200') {
-              this.$message.success(res.message ? res.message : '保存成功')
-              this.$emit('refresh')
-              setTimeout(function () {
-                _this.cancel()
-              }, 300)
-            } else {
-              // this.$message.warning(res.message)
-            }
-          })
-        }
-      })
-    },
-    // 取消
-    handleCancel () {
-      const _this = this
-      this.$confirm({
-        title: '提示',
-        content: '确定取消吗?',
-        okText: '确定',
-        cancelText: '取消',
-        onOk () {
-          _this.clear()
-          _this.cancel()
-        }
-      })
-    },
-    clear () {
-      this.form.resetFields()
-    }
-
-  },
-  mounted () {
-  },
-  beforeCreate () {
-    this.form = this.$form.createForm(this, { name: 'tenantsModal' })
-  },
-  watch: {
-    visible (newValue, oldValue) {
-      this.isshow = newValue
-    },
-    isshow (newValue, oldValue) {
-      if (newValue) {
-        const now = moment().add(7, 'day').format('YYYY-MM-DD')
-        const expireDate = moment(now, 'YYYY-MM-DD')
-        this.formData.expireDate = this.itemData.expireDate ? moment(this.itemData.expireDate, 'YYYY-MM-DD') : expireDate
-        // this.form.setFields({ 'formData.expireDate': { value: this.formData.expireDate, errors: '' } })
-        this.formData.orgType = this.itemData.orgType ? this.itemData.orgType : ''
-        this.formData.scopeType = this.itemData.scopeType ? this.itemData.scopeType : ''
-        this.formData.childMaxNum = this.itemData.childMaxNum ? this.itemData.childMaxNum : 1
-        this.formData.childUserMaxNum = this.itemData.childUserMaxNum ? this.itemData.childUserMaxNum : 1
-        this.hasOrgType = !!this.itemData.menuMouldId
-      } else {
-        this.cancel()
-      }
-    }
-  }
-}
-</script>
-
-<style >
-  .modalBox{
-  }
-  .ant-modal-footer {
-    display: none;
-  }
-  .time-text{
-    color: #1890FF;
-    padding: 0px 20px;
-    cursor: pointer;
-  }
-  .labelT{
-     position: absolute;
-     left: -135px;
-     top: 20px;
-     color: rgba(0, 0, 0, 0.85);
-  }
-</style>

+ 0 - 2
src/views/user/ChangePwd.vue

@@ -114,13 +114,11 @@ export default {
       e.preventDefault()
       const _this = this
       this.form.validateFields((err, values) => {
-        console.log(values, 'values')
         if (!err) {
           changePwd({
             oldPassword: values.formCustom.oldPwd,
             password: values.formCustom.passwd
           }).then(res => {
-            console.log(res, 'res111111')
             if (res.status === '200') {
               _this.$message.success('修改成功, 请重新登录')
               _this.logout()

+ 7 - 2
vue.config.js

@@ -108,12 +108,17 @@ const vueConfig = {
     // If you want to turn on the proxy, please remove the mockjs /src/main.jsL11
     proxy: {
       '/api': {
-         // target: 'http://192.168.16.103:9110/zyit',
-         target: 'http://it.test.zyucgj.com/zyit',
+        target: 'http://carwash.test.zyucgj.com/cw-admin/',
+        // target: 'http://192.168.16.102:8101/cw-admin/',
+        // target: 'http://carwash.test.zyucgj.com/cw-admin/',
         ws: false,
         changeOrigin: true,
         pathRewrite: {
           '^/api': ''
+        },
+        // ÖØÐ´cookie·¾¶
+        cookiePathRewrite: {
+          '/cw-admin/': '/'
         }
       }
     }