1
0

54 Commits e26bc767c2 ... 28c818a1e2

Autor SHA1 Mensagem Data
  wjx 28c818a1e2 fix há 2 semanas atrás
  wjx 2d1eb3d298 fix há 2 semanas atrás
  wjx 46aebfdd38 fix há 3 meses atrás
  wjx cd30ffc75f fix há 6 meses atrás
  wjx ffff20e002 fix há 6 meses atrás
  wjx d90e3bc51a fix há 7 meses atrás
  wjx e70fa4a3fc fix há 7 meses atrás
  wjx 50b711a8c8 fix há 7 meses atrás
  wjx a77799f2cb fix há 8 meses atrás
  wjx 8c178181f0 fix há 9 meses atrás
  wjx f0eb77ee1b fix há 9 meses atrás
  wjx c1297fa690 fix há 9 meses atrás
  wjx 6546c765f9 fix há 10 meses atrás
  wjx ada786aec3 fix há 10 meses atrás
  wjx dd80a0e982 fix há 11 meses atrás
  wjx e24f751c1d fix há 11 meses atrás
  wjx d50787e631 fix há 1 ano atrás
  wjx 0eeb2ab036 fix há 1 ano atrás
  wjx 9776216dd5 fix há 1 ano atrás
  wjx 12aa8c1fdc fix há 1 ano atrás
  wjx 6725bddba0 fix há 1 ano atrás
  wjx 969425eb30 fix há 1 ano atrás
  wjx be4e82d932 fix há 1 ano atrás
  wjx 249e9de974 fix há 1 ano atrás
  wjx f89cda1440 fix há 1 ano atrás
  wjx f297ab5623 fix há 2 anos atrás
  wjx 671a8cf928 fix há 2 anos atrás
  wjx 3bc8ea8c2d fix há 2 anos atrás
  wjx 38baf452eb fix há 2 anos atrás
  wjx 2ebe43c0f9 fix há 2 anos atrás
  wjx 055eaa0b52 fix há 2 anos atrás
  wjx 4e71758332 fix há 2 anos atrás
  wjx 5f3fefafc7 fix há 2 anos atrás
  wjx 1482c4e86d fix há 2 anos atrás
  wjx 97d60ba7e9 fix há 2 anos atrás
  wjx b5dbca8b0c fix há 2 anos atrás
  wjx 9f75ce09d3 fix há 2 anos atrás
  wjx 57d141ce72 fix há 2 anos atrás
  wjx 25bc8ee358 fix há 2 anos atrás
  wjx c27adf86da fix há 2 anos atrás
  wjx 5f206ea317 fix há 3 anos atrás
  wjx 2ce90e9470 fix há 3 anos atrás
  wjx 25a574af38 fix há 3 anos atrás
  wjx 46e64aa07d fix há 3 anos atrás
  wjx 19355b3069 fix há 3 anos atrás
  wjx 8bee422200 fix há 3 anos atrás
  shenwu f2dab89b68 新增投放渠道 há 3 anos atrás
  wjx e31c1a2aef fix há 3 anos atrás
  wjx c3c3e03c27 fix há 3 anos atrás
  wjx 5d1e5ef27c fix há 3 anos atrás
  wjx 7689b6c8fb fix há 3 anos atrás
  wjx 54d169511b fix há 3 anos atrás
  wjx d22a3fc8dc fix há 3 anos atrás
  wjx a00480e352 fix há 3 anos atrás
100 ficheiros alterados com 5116 adições e 1251 exclusões
  1. 4 3
      .env.development
  2. 3 2
      .env.production
  3. 6 1
      README.md
  4. 1 0
      package.json
  5. 7 2
      src/App.vue
  6. 9 10
      src/api/accounts/account.js
  7. 50 23
      src/api/accounts/adApi.js
  8. 41 0
      src/api/accounts/applyUse.js
  9. 4 4
      src/api/accounts/bookCity.js
  10. 256 0
      src/api/accounts/corpWeChat.js
  11. 39 0
      src/api/accounts/miniprogram.js
  12. 78 0
      src/api/accounts/qwMapping.js
  13. 148 0
      src/api/accounts/ttAdapi.js
  14. 7 0
      src/api/login.js
  15. 7 7
      src/api/system/books.js
  16. 52 0
      src/api/system/gameGroup.js
  17. 1 9
      src/api/system/group.js
  18. 94 0
      src/api/system/userBusinessGroup.js
  19. 0 0
      src/assets/icons/svg/adList.svg
  20. 1 0
      src/assets/icons/svg/alert.svg
  21. 0 0
      src/assets/icons/svg/apiOutlined.svg
  22. 1 0
      src/assets/icons/svg/appCashTrend.svg
  23. 1 0
      src/assets/icons/svg/appEveryData.svg
  24. 0 0
      src/assets/icons/svg/apply.svg
  25. 1 0
      src/assets/icons/svg/asset.svg
  26. 1 0
      src/assets/icons/svg/assetLibrary.svg
  27. 1 0
      src/assets/icons/svg/auth.svg
  28. 1 0
      src/assets/icons/svg/barChartNoval.svg
  29. 0 0
      src/assets/icons/svg/book.svg
  30. 1 0
      src/assets/icons/svg/bookData.svg
  31. 0 0
      src/assets/icons/svg/businessPlan.svg
  32. 0 0
      src/assets/icons/svg/corpWechat.svg
  33. 1 0
      src/assets/icons/svg/createRole.svg
  34. 1 0
      src/assets/icons/svg/dynamic.svg
  35. 1 0
      src/assets/icons/svg/educate.svg
  36. 1 0
      src/assets/icons/svg/extension.svg
  37. 1 0
      src/assets/icons/svg/extensionList.svg
  38. 1 0
      src/assets/icons/svg/externalMaterial.svg
  39. 1 1
      src/assets/icons/svg/game.svg
  40. 0 0
      src/assets/icons/svg/gameList.svg
  41. 1 0
      src/assets/icons/svg/gameServer.svg
  42. 0 0
      src/assets/icons/svg/gdt.svg
  43. 0 0
      src/assets/icons/svg/gift.svg
  44. 1 0
      src/assets/icons/svg/groupChatSend.svg
  45. 1 0
      src/assets/icons/svg/image.svg
  46. 1 0
      src/assets/icons/svg/imageConvert.svg
  47. 1 0
      src/assets/icons/svg/imageData.svg
  48. 1 0
      src/assets/icons/svg/interdiction.svg
  49. 1 0
      src/assets/icons/svg/manage_iaa.svg
  50. 1 0
      src/assets/icons/svg/media.svg
  51. 1 0
      src/assets/icons/svg/miniprogram.svg
  52. 0 0
      src/assets/icons/svg/moments.svg
  53. 1 0
      src/assets/icons/svg/msg.svg
  54. 1 0
      src/assets/icons/svg/novelDataSystem.svg
  55. 1 0
      src/assets/icons/svg/pa.svg
  56. 1 0
      src/assets/icons/svg/pitcherData.svg
  57. 1 0
      src/assets/icons/svg/player.svg
  58. 0 0
      src/assets/icons/svg/position.svg
  59. 0 0
      src/assets/icons/svg/realName.svg
  60. 0 0
      src/assets/icons/svg/rechargeData.svg
  61. 1 0
      src/assets/icons/svg/remitLog.svg
  62. 1 0
      src/assets/icons/svg/retained.svg
  63. 1 0
      src/assets/icons/svg/roleList.svg
  64. 0 0
      src/assets/icons/svg/roleManage.svg
  65. 1 0
      src/assets/icons/svg/shell.svg
  66. 0 0
      src/assets/icons/svg/stt.svg
  67. 1 0
      src/assets/icons/svg/subscribed.svg
  68. 0 0
      src/assets/icons/svg/system_iaa.svg
  69. 1 0
      src/assets/icons/svg/tencent_iaa.svg
  70. 1 0
      src/assets/icons/svg/tikTok.svg
  71. 0 0
      src/assets/icons/svg/trend.svg
  72. 1 0
      src/assets/icons/svg/weChatData.svg
  73. 0 0
      src/assets/icons/svg/weCom.svg
  74. 70 38
      src/layout/index.vue
  75. 10 0
      src/router/index.js
  76. 1 1
      src/store/modules/user.js
  77. 19 0
      src/utils/const.js
  78. 20 0
      src/utils/index.js
  79. 25 10
      src/views/accounts/account/components/changeRecord.vue
  80. 59 30
      src/views/accounts/account/components/cutBook.vue
  81. 366 331
      src/views/accounts/account/index.vue
  82. 167 170
      src/views/accounts/account/use.vue
  83. 266 555
      src/views/accounts/adWarrant/index.vue
  84. 86 0
      src/views/accounts/adWarrant/putUser.vue
  85. 75 0
      src/views/accounts/adWarrant/putUsers.vue
  86. 253 0
      src/views/accounts/applyUse/index.vue
  87. 242 0
      src/views/accounts/corpWechat/changeRecord.vue
  88. 409 0
      src/views/accounts/corpWechat/index.vue
  89. 239 0
      src/views/accounts/corpWechat/mailList.vue
  90. 356 0
      src/views/accounts/corpWechat/modalCorp.vue
  91. 241 0
      src/views/accounts/corpWechat/setSecret.vue
  92. 85 0
      src/views/accounts/corpWechat/setSession.vue
  93. 142 0
      src/views/accounts/miniprogram/index.vue
  94. 104 0
      src/views/accounts/miniprogram/modify.vue
  95. 38 54
      src/views/accounts/period/index.vue
  96. 341 0
      src/views/accounts/qwMapping/index.vue
  97. 232 0
      src/views/accounts/ttAdWarrant/appManage.vue
  98. 200 0
      src/views/accounts/ttAdWarrant/index.vue
  99. 143 0
      src/views/accounts/ttAdWarrant/lookAccountButton.vue
  100. 83 0
      src/views/accounts/ttAdWarrant/putUser.vue

+ 4 - 3
.env.development

@@ -2,9 +2,10 @@
 ENV = 'development'
 
 # 趣程管理系统/开发环境
-VUE_APP_BASE_API = 'http://47.97.38.17/api'
-VUE_APP_DATA_API = 'http://data.zanxiangnet.com:8009'
-VUE_APP_BASE_URL = 'http://test.erp.zanxiangnet.com'
+VUE_APP_BASE_API = 'https://testapi.zanxiangwl.com'
+VUE_APP_DATA_API = 'https://data.zanxiangnet.com:8009'
+VUE_APP_BASE_URL = 'https://testerp.zanxiangnet.com/#/login'
+VUE_APP_CORP_URL = 'https://testerp.zanxiangnet.com/#/corpDoAuth'
 VUE_APP_DDAPPID = 'dingtqel20goyqnsnekd'
 #VUE_APP_BASE_API = 'http://localhost:8081'
 

+ 3 - 2
.env.production

@@ -2,9 +2,10 @@
 ENV = 'production'
 
 # 趣程管理系统/生产环境
-VUE_APP_BASE_API = 'https://api.zanxiangnet.com'
+VUE_APP_BASE_API = 'https://api.zanxiangwl.com'
 VUE_APP_DATA_API = 'http://data.zanxiangnet.com:8009'
-VUE_APP_BASE_URL = 'http://mp.zanxiangnet.com'
+VUE_APP_BASE_URL = 'http://erp.zanxiangnet.com/admin/#/login'
+VUE_APP_CORP_URL = 'http://erp.zanxiangnet.com/#/corpDoAuth'
 VUE_APP_DDAPPID = 'dingwfmhucedfluenpuj'
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 6 - 1
README.md

@@ -27,4 +27,9 @@ npm run build:stage
 
 # 构建生产环境
 npm run build:prod
-````
+````
+
+# node-sass 问题
+nodejs版本要与node-sass版本对应当前node-sass版本支持14版本的nodejs
+# yarn安装报错
+yarn config set ignore-engines true

+ 1 - 0
package.json

@@ -55,6 +55,7 @@
     "normalize.css": "7.0.0",
     "nprogress": "0.2.0",
     "path-to-regexp": "2.4.0",
+    "qrcode": "^1.5.4",
     "qs": "^6.9.4",
     "screenfull": "4.2.0",
     "sortablejs": "1.8.4",

+ 7 - 2
src/App.vue

@@ -5,7 +5,12 @@
 </template>
 
 <script>
-export default  {
-  name:  'App'
+export default {
+  name: 'App'
 }
 </script>
+<style>
+.is-scrolling-none+.el-table__fixed-right {
+  height: 100% !important;
+}
+</style>

+ 9 - 10
src/api/accounts/account.js

@@ -1,11 +1,10 @@
 import request from '@/utils/request'
-import { data } from 'autoprefixer'
 
 // 获取公众号授权链接(前端新页面跳转)
 export function getAccount(query) {
   let { id, ...params } = query
   return request({
-    url: '/system/mp/auth/' + id,
+    url: '/mp-operation/mp/auth/' + id,
     method: 'get',
     params: params
   })
@@ -14,7 +13,7 @@ export function getAccount(query) {
 // 扫码成功后 在请求
 export function authSuccess(query) {
   return request({
-    url: `/system/mp/authSuccess?${query}`,
+    url: `/mp-operation/mp/authSuccess?${query}`,
     method: 'get'
   })
 }
@@ -51,7 +50,7 @@ export function editResource(data) {
 // 获取公众号列表
 export function getAccountList(data) {
   return request({
-    url: `/system/mp/admin/admin/list`,
+    url: `/mp-operation/mp/admin/admin/list`,
     method: 'POST',
     data: data
   })
@@ -61,7 +60,7 @@ export function getAccountList(data) {
 export function addAccount(data) {
   let {id, ...params} = data
   return request({
-    url: `/system/mp/admin/admin`,
+    url: `/mp-operation/mp/admin/admin`,
     method: 'POST',
     data: params
   })
@@ -71,7 +70,7 @@ export function addAccount(data) {
 export function editAccount(data) {
   let {id, ...params} = data
   return request({
-    url: `/system/mp/admin/admin/${id}`,
+    url: `/mp-operation/mp/admin/admin/${id}`,
     method: 'put',
     data: params
   })
@@ -81,7 +80,7 @@ export function editAccount(data) {
 export function editState(data) {
   let {id, ...params} = data
   return request({
-    url: `/system/mp/admin/configStatus/${id}`,
+    url: `/mp-operation/mp/admin/configStatus/${id}`,
     method: 'put',
     data: params
   })
@@ -90,7 +89,7 @@ export function editState(data) {
 // 搜索公众号列表
 export function searchList(data) {
   return request({
-    url: `/system/mp/admin/admin/search`,
+    url: `/mp-operation/mp/admin/admin/search`,
     method: 'POST',
     data: data
   })
@@ -107,7 +106,7 @@ export function assignResourceUser(data) {
 // 指派
 export function assignUser(data) {
   return request({
-    url: `/system/mp/admin/configUserBatch`,
+    url: `/mp-operation/mp/admin/configUserBatch`,
     method: 'PUT',
     data: data
   })
@@ -116,7 +115,7 @@ export function assignUser(data) {
 // 指派
 export function configUser(data) {
   return request({
-    url: `/system/mp/admin/configUser`,
+    url: `/mp-operation/mp/admin/configUser`,
     method: 'PUT',
     data: data
   })

+ 50 - 23
src/api/accounts/adApi.js

@@ -3,14 +3,14 @@ import request from '@/utils/request'
 // 查询用户列表
 // export function listAd(query) {
 //     return request({
-//         url: '/system/adMpInfo/list',
+//         url: '/mp-operation/adMpInfo/list',
 //         method: 'get',
 //         params: query
 //     })
 // }
 export function listAd(data) {
     return request({
-        url: '/ad/adAccount/list',
+        url: '/adq/admin/adAccount/list',
         method: 'POST',
         data
     })
@@ -19,7 +19,7 @@ export function listAd(data) {
 // 广告平台授权
 export function getAd(query) {
     return request({
-        url: '/system/mp/adAuth',
+        url: '/mp-operation/mp/adAuth',
         method: 'get',
         params: query
     })
@@ -28,7 +28,7 @@ export function getAd(query) {
 // 老广告平台授权
 export function getAdt(query) {
     return request({
-        url: '/system/mp/adAuthOld',
+        url: '/mp-operation/mp/adAuthOld',
         method: 'get',
         params: query
     })
@@ -36,7 +36,7 @@ export function getAdt(query) {
 // 老扫码成功后 在请求
 export function adtAuthSuccess(query) {
     return request({
-        url: `/system/mp/adAuthSuccessOld`,
+        url: `/mp-operation/mp/adAuthSuccessOld`,
         method: 'get',
         params: query
     })
@@ -44,7 +44,16 @@ export function adtAuthSuccess(query) {
 // 荣哥新 成功后 在请求
 export function adtDoAuth(query) {
     return request({
-        url: `/ad/adAccount/doAuth`,
+        url: `/adq/admin/adAccount/doAuth`,
+        method: 'POST',
+        params: query
+    })
+}
+
+export function adtYwdyDoAuth(query) {
+    return request({
+        // url: `/adq/admin/adAccount/adUnit/doAuth`,
+        url: `/adq/admin/adAccount/adUnit/doAuthV2`,
         method: 'POST',
         params: query
     })
@@ -53,7 +62,8 @@ export function adtDoAuth(query) {
 // 荣新授权
 export function toAuth(query) {
     return request({
-        url: '/ad/adAccount/toAuth',
+        url: '/adq/admin/adAccount/toAuthV2',
+        // url: '/adq/admin/adAccount/toAuth',
         method: 'POST',
         params: query
     })
@@ -62,7 +72,7 @@ export function toAuth(query) {
 // 扫码成功后 在请求
 export function adAuthSuccess(query) {
     return request({
-        url: `/system/mp/adAuthSuccess`,
+        url: `/mp-operation/mp/adAuthSuccess`,
         method: 'get',
         params: query
     })
@@ -71,7 +81,7 @@ export function adAuthSuccess(query) {
 // 列表编辑
 export function editAdMp(data) {
     return request({
-        url: '/system/adMpInfo',
+        url: '/mp-operation/adMpInfo',
         method: 'post',
         data: data
     })
@@ -80,7 +90,7 @@ export function editAdMp(data) {
 // 列表删除
 export function deleteAdMp(id) {
     return request({
-        url: '/system/adMpInfo/' + id,
+        url: '/mp-operation/adMpInfo/' + id,
         method: 'DELETE',
     })
 }
@@ -88,7 +98,7 @@ export function deleteAdMp(id) {
 // 切号
 export function switchAcc(data) {
     return request({
-        url: '/system/adMpInfo/accountChange',
+        url: '/mp-operation/adMpInfo/accountChange',
         method: 'post',
         data: data
     })
@@ -97,7 +107,7 @@ export function switchAcc(data) {
 // 切书
 export function switchBook(data) {
     return request({
-        url: '/system/adMpInfo/bookChange',
+        url: '/mp-operation/adMpInfo/bookChange',
         method: 'post',
         data: data
     })
@@ -106,7 +116,7 @@ export function switchBook(data) {
 // 切投手
 export function switchPitcher(data) {
     return request({
-        url: '/system/adMpInfo/pitcherChange',
+        url: '/mp-operation/adMpInfo/pitcherChange',
         method: 'post',
         data: data
     })
@@ -115,7 +125,7 @@ export function switchPitcher(data) {
 // 切平台
 export function switchPlatform(data) {
     return request({
-        url: '/system/adMpInfo/platformChange',
+        url: '/mp-operation/adMpInfo/platformChange',
         method: 'post',
         data: data
     })
@@ -124,7 +134,7 @@ export function switchPlatform(data) {
 // 切号记录接口
 export function getSwitchAcc(query) {
     return request({
-        url: `/system/adMpInfo/accountChangeList`,
+        url: `/mp-operation/adMpInfo/accountChangeList`,
         method: 'get',
         params: query
     })
@@ -133,7 +143,7 @@ export function getSwitchAcc(query) {
 // 切书记录接口
 export function getSwitchBook(query) {
     return request({
-        url: `/system/adMpInfo/bookChangeList`,
+        url: `/mp-operation/adMpInfo/bookChangeList`,
         method: 'get',
         params: query
     })
@@ -142,7 +152,7 @@ export function getSwitchBook(query) {
 // 切投手记录接口
 export function getSwitchPitche(query) {
     return request({
-        url: `/system/adMpInfo/pitcherChangeList`,
+        url: `/mp-operation/adMpInfo/pitcherChangeList`,
         method: 'get',
         params: query
     })
@@ -151,7 +161,7 @@ export function getSwitchPitche(query) {
 // 切平台记录接口
 export function getSwitchPlatform(query) {
     return request({
-        url: `/system/adMpInfo/platformChangeList`,
+        url: `/mp-operation/adMpInfo/platformChangeList`,
         method: 'get',
         params: query
     })
@@ -160,7 +170,7 @@ export function getSwitchPlatform(query) {
 // 获取腾讯广告管理列表
 export function getAdAppList(data) {
     return request({
-        url: `/ad/adApp/list`,
+        url: `/adq/admin/adApp/list`,
         method: 'POST',
         data
     })
@@ -168,14 +178,14 @@ export function getAdAppList(data) {
 // 获取所有腾讯广告管理列表
 export function getAdAppListAll() {
     return request({
-        url: `/ad/adApp/all`,
+        url: `/adq/admin/adApp/all`,
         method: 'GET'
     })
 }
 // 新增腾讯广告管理列表
 export function addApp(data) {
     return request({
-        url: `/ad/adApp`,
+        url: `/adq/admin/adApp`,
         method: 'POST',
         data
     })
@@ -184,7 +194,7 @@ export function addApp(data) {
 export function editApp(data) {
     let { adAppId, ...params } = data
     return request({
-        url: `/ad/adApp/${adAppId}`,
+        url: `/adq/admin/adApp/${adAppId}`,
         method: 'PUT',
         data: params
     })
@@ -193,8 +203,25 @@ export function editApp(data) {
 // 刷新服务商
 export function refreshByIds(data) {
     return request({
-        url: `/ad/adAccount/refreshByIds`,
+        url: `/adq/admin/adAccount/refreshByIds`,
         method: 'PUT',
         data
     })
+}
+
+
+// 切换投手
+export function cutPut({ adAccountId, putUserId }) {
+    return request({
+        url: `/adq/admin/adAccount/configPutUser/${adAccountId}/${putUserId}`,
+        method: 'PUT'
+    })
+}
+
+export function addAccountUser(data) {
+    return request({
+        url: `/adq/admin/adAccount/modifyAccountUser`,
+        method: 'POST',
+        data
+    })
 }

+ 41 - 0
src/api/accounts/applyUse.js

@@ -0,0 +1,41 @@
+import request from '@/utils/request'
+
+/**
+ * 获取
+ * @param {*} data 
+ * @returns 
+ */
+ export function getApplyChanelList(data) {
+    return request({
+        url: `/platform/bookPlatformPromotionChannel/list/page`,
+        method: 'POST',
+        data
+    })
+}
+
+
+/**
+ * 新增或者修改
+ * @param {*} data 
+ * @returns 
+ */
+ export function addOrEditApplyChanel(data) {
+    return request({
+        url: `/platform/bookPlatformPromotionChannel/add/or/update`,
+        method: 'POST',
+        data
+    })
+}
+
+/**
+ * 删除
+ * @param {*} params 
+ * @returns 
+ */
+ export function delApplyChanel(params) {
+    return request({
+        url: `/platform/bookPlatformPromotionChannel/delete`,
+        method: 'DELETE',
+        params
+    })
+}

+ 4 - 4
src/api/accounts/bookCity.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 新增书城
 export function addBookPlatInfo(data) {
     return request({
-        url: '/system/bookPlatInfo',
+        url: '/mp-operation/bookPlatInfo',
         method: 'put',
         data: data
     })
@@ -12,7 +12,7 @@ export function addBookPlatInfo(data) {
 // 获取书城列表
 export function getBookPlatInfo(query) {
     return request({
-        url: '/system/bookPlatInfo',
+        url: '/mp-operation/bookPlatInfo',
         method: 'GET',
         params: query
     })
@@ -21,7 +21,7 @@ export function getBookPlatInfo(query) {
 // 删除书城列表
 export function delBookPlatInfo(id) {
     return request({
-        url: '/system/bookPlatInfo/' + id,
+        url: '/mp-operation/bookPlatInfo/' + id,
         method: 'DELETE'
     })
 }
@@ -29,7 +29,7 @@ export function delBookPlatInfo(id) {
 // 修改书城
 export function editBookPlatInfo(data) {
     return request({
-        url: '/system/bookPlatInfo',
+        url: '/mp-operation/bookPlatInfo',
         method: 'post',
         data: data
     })

+ 256 - 0
src/api/accounts/corpWeChat.js

@@ -0,0 +1,256 @@
+import request from '@/utils/request'
+
+
+/**
+ * 企微去授权
+ * @param {*} params {redirectUri: 回调地址}
+ * @returns 
+ */
+export function getCorpToAuth(params) {
+    return request({
+        url: '/corp/admin/corp/toAuth',
+        method: 'get',
+        params
+    })
+}
+
+
+/**
+ * 授权成功回调
+ * @param {*} data {authCode: 回调的 code,expiresIn:"临时授权码有效时常", state: 回调的 state} 
+ * @returns 
+ */
+export function addCorpDoAuth(data) {
+    return request({
+        url: '/corp/admin/corp/doAuth',
+        method: 'POST',
+        data
+    })
+}
+
+
+/**
+ * 获取企微列表
+ * @param {*} data {pageSize: 20, pageNum: 1, corpName: "企微名", corpId: "企微 id"}
+ * @returns 
+ */
+export function getCorpList(data) {
+    return request({
+        url: '/corp/admin/corp/list',
+        method: 'POST',
+        data
+    })
+}
+
+/**
+ * 刷新企微信息
+ * @param {*} corpId 
+ * @returns 
+ */
+export function putRefreshCorp(corpId) {
+    return request({
+        url: `/corp/admin/corp/refresh/${corpId}`,
+        method: 'PUT'
+    })
+}
+
+/**
+ * 获取企微通讯录
+ * @param {*} data {pageNum: 1, pageSize: 20, corpId: "企微 id(必传)", name: ""}
+ * @returns 
+ */
+export function getCorpMailList(data) {
+    return request({
+        url: `/corp/admin/corpUser/list`,
+        method: 'POST',
+        data
+    })
+}
+
+/**
+ * 指派投手运营
+ * @param {*} data  {corpId: "", corpUserId: "", beginTime: "2023-01-01", putUserId: 1, operUserId: 2}
+ * @returns 
+ */
+export function putCorpSysUser(data) {
+    return request({
+        url: `/corp/admin/corpUser/configSysUser`,
+        method: 'PUT',
+        data
+    })
+}
+
+/**
+ * 同步企微通讯录
+ * @param {*} corpId 
+ * @returns 
+ */
+export function putSyncCorpUser(corpId) {
+    return request({
+        url: `/corp/admin/corpUser/sync/${corpId}`,
+        method: 'PUT'
+    })
+}
+
+/**
+ * 同步所有
+ * @param {*} corpId 
+ * @returns 
+ */
+export function putSyncAllCorpUser(corpId) {
+    return request({
+        url: `/corp/admin/corp/syncAll/${corpId} `,
+        method: 'PUT'
+    })
+}
+
+
+/**
+ * 更新企微明文密钥
+ * @param {*} corpId 
+ * @param {*} data {"originCorpId":"企微 id", userSecret:"通讯录密钥",externalUserSecret:"客户密钥", remark:"备注" }
+ * @returns 
+ */
+export function refreshCorp(params) {
+    const { corpId, ...data } = params
+    return request({
+        url: `/corp/admin/corp/config/${corpId}`,
+        method: 'PUT',
+        data
+    })
+}
+
+/**
+ * 设置会话存档Secret
+ * @param {*} corpId 
+ * @param {*} msgAuditSecret 
+ * @returns 
+ */
+export function setMsgSession(params) {
+    const { corpId, msgAuditSecret } = params
+    return request({
+        url: `/corp/admin/corp/config/${corpId}/${msgAuditSecret}`,
+        method: 'POST'
+    })
+}
+
+/*****************变更记录*******************/
+/**
+ * 变更记录
+ * @param {*} corpId 
+ * @param {*} corpUserId 
+ * @returns 
+ */
+export function getAllOfCorpList(corpId, corpUserId) {
+    return request({
+        url: `/corp/admin/corpUserChangeRecord/allOfCorp/${corpId}/${corpUserId}`,
+        method: 'GET'
+    })
+}
+
+/**
+ * 新增记录
+ * @param {*} data {nextId: 1, corpId: "", corpUserId:"", beginTime: "2021-01-01", putUserId: 1, operUserId: 1}
+ * @returns 
+ */
+export function addAllOfCorp(data) {
+    return request({
+        url: `/corp/admin/corpUserChangeRecord/addNewRecord`,
+        method: 'POST',
+        data
+    })
+}
+
+/**
+ * 修改记录
+ * @param {*} data {recordId: 1, beginTime: "2021-01-01", putUserId: 1, operUserId: 1}
+ * @returns 
+ */
+export function putAllOfCorp(data) {
+    return request({
+        url: `/corp/admin/corpUserChangeRecord/modifyRecord`,
+        method: 'PUT',
+        data
+    })
+}
+
+/**
+ * 删除记录
+ * @param {*} recordId 
+ * @returns 
+ */
+export function delAllOfCorp(recordId) {
+    return request({
+        url: `/corp/admin/corpUserChangeRecord/delRecord/${recordId}`,
+        method: 'DELETE',
+    })
+}
+
+/*****************变更记录*******************/
+
+
+/**
+ * 新增企业
+ * @param {*} data 
+ * @returns 
+ */
+export function addCorpApi(data) {
+    return request({
+        url: '/corp/admin/corp/add',
+        method: 'POST',
+        data
+    })
+}
+
+/**
+ * 修改企业
+ * @param {*} data 
+ * @returns 
+ */
+export function editCorpApi(data) {
+    return request({
+        url: '/corp/admin/corp/modify',
+        method: 'POST',
+        data
+    })
+}
+
+
+/**
+ * 服务商列表
+ * @returns 
+ */
+export function getProviderList() {
+    return request({
+        url: '/corp/admin/corp/provider/list',
+        method: 'GET'
+    })
+}
+
+
+/**
+ * 服务商应用授权二维码
+ * @param {*} params 
+ * @returns 
+ */
+export function getProviderAuth(params) {
+    return request({
+        url: '/corp/admin/corp/getProviderAuth',
+        method: 'GET',
+        params
+    })
+}
+
+
+/**
+ * 上传图片
+ * @param {filePrefix: corp_info/corp_icp/, suffix: jpg/png} params 
+ * @returns 
+ */
+export function uploadImageApi(params) {
+    return request({
+        url: '/corp/corp/media/formUpload',
+        method: 'GET',
+        params
+    })
+}

+ 39 - 0
src/api/accounts/miniprogram.js

@@ -0,0 +1,39 @@
+import request from '@/utils/request'
+
+/**
+ * 新增或者修改
+ * @param {*} data appDesc	string appId	stringappName	string appRemark	string id	integer($int64)
+ * @returns 
+ */
+export function modifyMini(data) {
+    return request({
+        url: '/corp/sys/app/addOrUpdate',
+        method: 'POST',
+        data: data
+    })
+}
+
+/**
+ * 删除
+ * @param {*} ids 
+ * @returns 
+ */
+export function delMinis(ids) {
+    return request({
+        url: `/corp/sys/app/delete/${ids}`,
+        method: 'DELETE'
+    })
+}
+
+/**
+ * 获取列表
+ * @param {*} data 
+ * @returns 
+ */
+export function getMiniList(data) {
+    return request({
+        url: `/corp/sys/app/listOfPage`,
+        method: 'POST',
+        data
+    })
+}

+ 78 - 0
src/api/accounts/qwMapping.js

@@ -0,0 +1,78 @@
+import request from '@/utils/request'
+
+
+/**
+ * 获取企微映射表列表
+ * @param {*} data 
+ * @returns 
+ */
+export function getQwChanelList(data) {
+    return request({
+        url: `/platform/bookPlatformQwChanel/list/page`,
+        method: 'POST',
+        data
+    })
+}
+
+/**
+ * 获取企微映射
+ * @param {*} data 
+ * @returns 
+ */
+export function getChanelList(params) {
+    return request({
+        url: `/platform/bookPlatformQwChanel/list/all`,
+        method: 'GET',
+        params
+    })
+}
+
+/**
+ * 获取书城
+ * @returns 
+ */
+export function getBookPlatformAll() {
+    return request({
+        url: `/platform/bookPlatform/all`,
+        method: 'GET'
+    })
+}
+
+/**
+ * 新增或者修改
+ * @param {*} data 
+ * @returns 
+ */
+export function addOrEditQwChanel(data) {
+    return request({
+        url: `/platform/bookPlatformQwChanel/add/or/update`,
+        method: 'POST',
+        data
+    })
+}
+
+/**
+ * 删除
+ * @param {*} params 
+ * @returns 
+ */
+export function delQwChanel(params) {
+    return request({
+        url: `/platform/bookPlatformQwChanel/delete`,
+        method: 'DELETE',
+        params
+    })
+}
+
+
+/**
+ * 搜索账号接口
+ * @param {*} params 
+ * @returns 
+ */
+export function queryApi(params) {
+    let { resourceType, resourceName } = params
+    return request({
+        url: `/erp/resource/query/10,0,3,20/${resourceName || 'null'}`
+    });
+  }

+ 148 - 0
src/api/accounts/ttAdapi.js

@@ -0,0 +1,148 @@
+import request from '@/utils/request'
+
+
+/**
+ * 获取所有应用
+ * @returns 
+ */
+export function getAdApp() {
+    return request({
+        url: '/oceanengine/admin/adApp/all',
+        method: 'GET'
+    })
+}
+
+/**
+ * 新增应用列表
+ * @returns 
+ */
+export function addAdApp(data) {
+    return request({
+        url: '/oceanengine/admin/adApp',
+        method: 'POST',
+        data
+    })
+}
+
+/**
+ * 修改应用列表
+ * @param {*} params 
+ * @returns 
+ */
+export function editAdApp(params) {
+    let { id, ...data } = params
+    return request({
+        url: `/oceanengine/admin/adApp/${id}`,
+        method: 'PUT',
+        data
+    })
+}
+
+/**
+ * 修改应用状态
+ * @param {Number} id 
+ * @param {Boolean} enabled 
+ * @returns 
+ */
+export function editAdAppEnabled(id, enabled) {
+    return request({
+        url: `/oceanengine/admin/adApp/modifyEnabled/${id}/${enabled}`,
+        method: 'PUT'
+    })
+}
+
+/**
+ * 删除应用
+ * @param {Number} id 
+ * @returns 
+ */
+export function delAdApp(id) {
+    return request({
+        url: `/oceanengine/admin/adApp/${id}`,
+        method: 'DELETE'
+    })
+}
+
+
+/**
+ * 主表格数据
+ * @param {*} data 
+ * @returns 
+ */
+export function getAuthUserList(data) {
+    return request({
+        url: `/oceanengine/admin/authUser/list`,
+        method: 'POST',
+        data
+    })
+}
+
+
+/**
+ * 主表格详细一条数据表格
+ * @param {*} data 
+ * @returns 
+ */
+export function getAdAccountList(data) {
+    return request({
+        url: `/oceanengine/admin/adAccount/list`,
+        method: 'POST',
+        data
+    })
+}
+
+/**
+ * 授权
+ * @param {*} adAppId 
+ * @param {*} callbackPage 
+ * @returns 
+ */
+export function toAuthUser(data) {
+    let { adAppId, callbackPage, adUnitType } = data
+    return request({
+        url: `/oceanengine/admin/authUser/toAuth?adAppId=${adAppId}&callbackPage=${callbackPage}&adUnitType=${adUnitType}`,
+        method: 'POST'
+    })
+}
+
+/**
+ * 回调接口
+ * @param {*} data 
+ * @returns 
+ */
+export function doAuthUser(data) {
+    let { state, auth_code } = data
+    return request({
+        url: `/oceanengine/admin/authUser/doAuth?state=${state}&auth_code=${auth_code}`,
+        method: 'POST'
+    })
+}
+
+/**
+ * 刷新广告账户
+ * @param {*} adAppId 
+ * @param {*} authUserId 
+ * @returns 
+ */
+export function refreshUser(adAppId, authUserId) {
+    return request({
+        url: `/oceanengine/admin/authUser/refreshAccount/${adAppId}/${authUserId}`,
+        method: 'PUT'
+    })
+}
+
+
+/**
+ * 配置投手
+ * @param {*} adAppId 
+ * @param {*} authUserId 
+ * @param {*} putUserId 
+ * @returns 
+ */
+export function putUser(data) {
+    return request({
+        url: `/oceanengine/admin/adAccount/configPutUser`,
+        method: 'PUT',
+        data
+    })
+}

+ 7 - 0
src/api/login.js

@@ -45,6 +45,13 @@ export function getCode(phone) {
   });
 }
 
+// 手机短信验证码获取
+export function getNoteCode(phone) {
+  return request({
+    url: `/erp/user/smsCodeLoginState/${phone}`
+  })
+}
+
 /**获取钉钉扫码前的后台KEY*/
 export function getDingKey() {
   return request({url: '/erp/user/dLoginState'})

+ 7 - 7
src/api/system/books.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询小说平台
 export function seekBook(data) {
     return request({
-        url: '/system/platform/listOfPage',
+        url: '/mp-operation/platform/listOfPage',
         method: 'post',
         data: data
     })
@@ -12,7 +12,7 @@ export function seekBook(data) {
 // 新增小说平台
 export function addBook(data) {
     return request({
-        url: '/system/platform/add',
+        url: '/mp-operation/platform/add',
         method: 'post',
         data: data
     })
@@ -22,7 +22,7 @@ export function addBook(data) {
 export function editBook(params) {
     let { platformId, ...data } = params
     return request({
-        url: '/system/platform/modify/' + platformId,
+        url: '/mp-operation/platform/modify/' + platformId,
         method: 'PUT',
         data: data
     })
@@ -32,7 +32,7 @@ export function editBook(params) {
 export function delBook(params) {
     let { platformId } = params
     return request({
-        url: '/system/platform/delete/' + platformId,
+        url: '/mp-operation/platform/delete/' + platformId,
         method: 'DELETE'
     })
 }
@@ -40,7 +40,7 @@ export function delBook(params) {
 // 新增VIP账号
 export function addVipBook(data) {
     return request({
-        url: '/system/platform/account',
+        url: '/mp-operation/platform/account',
         method: 'post',
         data: data
     })
@@ -50,7 +50,7 @@ export function addVipBook(data) {
 export function editVipBook(params) {
     let { accountId, ...data } = params
     return request({
-        url: '/system/platform/account/' + accountId,
+        url: '/mp-operation/platform/account/' + accountId,
         method: 'PUT',
         data: data
     })
@@ -59,7 +59,7 @@ export function editVipBook(params) {
 // 删除VIP账号
 export function delVipBook(platformId) {
     return request({
-        url: '/system/platform/account/' + platformId,
+        url: '/mp-operation/platform/account/' + platformId,
         method: 'DELETE'
     })
 }

+ 52 - 0
src/api/system/gameGroup.js

@@ -0,0 +1,52 @@
+import request from '@/utils/request'
+
+// 获取全部用户组
+export function getGroupAll() {
+    return request({
+        url: '/erp/gameUserGroup/all',
+        method: 'get',
+    })
+}
+
+// 分页查询用户组
+export function getList(params) {
+    return request({
+        url: '/erp/gameUserGroup/list',
+        method: 'post',
+        data: params,
+    })
+}
+
+// 获取用户组详情
+export function getDetail(groupId) {
+    return request({
+        url: '/erp/gameUserGroup/detail/' + groupId,
+        method: 'get',
+    })
+}
+
+// 新增用户组
+export function addGroup(data) {
+    return request({
+        url: '/erp/gameUserGroup/add',
+        method: 'post',
+        data,
+    })
+}
+
+// 修改用户组
+export function updateGroup(groupId, data) {
+    return request({
+        url: '/erp/gameUserGroup/modify/' + groupId,
+        method: 'put',
+        data,
+    })
+}
+
+// 用户组详情
+export function userGroupDetails(groupId) {
+    return request({
+        url: '/erp/gameUserGroup/detail/' + groupId,
+        method: 'GET'
+    })
+}

+ 1 - 9
src/api/system/group.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 获取全部用户组
 export function getGroupAll() {
     return request({
-        url: '/erp/userGroup/all',
+        url: '/erp/userBusinessGroup/all',
         method: 'get',
     })
 }
@@ -43,14 +43,6 @@ export function updateGroup(groupId, data) {
     })
 }
 
-// 删除用户组
-export function deleteGroup(groupId) {
-    return request({
-        url: '/erp/userGroup/delete/' + groupId,
-        method: 'delete'
-    })
-}
-
 // 用户组详情
 export function userGroupDetails(groupId) {
     return request({

+ 94 - 0
src/api/system/userBusinessGroup.js

@@ -0,0 +1,94 @@
+import request from '@/utils/request'
+
+/**
+ * 查询所有用户组
+ * @returns 
+ */
+export function getGroupAll() {
+    return request({
+        url: '/erp/userBusinessGroup/all',
+        method: 'get',
+    })
+}
+
+/**
+ * 分页查询用户组
+ * @param {*} params 
+ * @returns 
+ */
+export function getUserGroupList(params) {
+    for (const key in params) {
+        if (params[key] === null || params[key] === undefined || params[key] === '') {
+            delete params[key];
+        }
+    }
+    return request({
+        url: '/erp/userBusinessGroup/list',
+        method: 'post',
+        data: params,
+    })
+}
+
+/**
+ * 获取用户组详情
+ * @param {*} groupId 
+ * @returns 
+ */
+export function getUserGroupDetail(groupId) {
+    return request({
+        url: '/erp/userBusinessGroup/detail/' + groupId,
+        method: 'get',
+    })
+}
+
+/**
+ * 获取业务类型
+ * @returns 
+ */
+export function getUserGroupBusinessTypeAll() {
+    return request({
+        url: '/erp/userBusinessGroup/business/all',
+        method: 'get',
+    })
+}
+
+/**
+ * 新增用户组
+ * @param {*} data 
+ * @returns 
+ */
+export function addUserGroup(data) {
+    return request({
+        url: '/erp/userBusinessGroup/add',
+        method: 'post',
+        data,
+    })
+}
+
+
+
+/**
+ * 修改用户组
+ * @param {*} groupId 
+ * @param {*} data 
+ * @returns 
+ */
+export function updateUserGroup(groupId, data) {
+    return request({
+        url: '/erp/userBusinessGroup/modify/' + groupId,
+        method: 'put',
+        data,
+    })
+}
+
+/**
+ * 删除
+ * @param {*} groupId 
+ * @returns 
+ */
+export function delUserGroup(groupId) {
+    return request({
+        url: '/erp/userBusinessGroup/del/' + groupId,
+        method: 'DELETE'
+    })
+}

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/adList.svg


+ 1 - 0
src/assets/icons/svg/alert.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M512 176a32 32 0 0 0 32-32v-64a32 32 0 0 0-64 0v64a32 32 0 0 0 32 32zM131.872 289.152a32 32 0 0 0 45.248-45.248L131.872 198.624a32 32 0 0 0-45.248 45.248l45.248 45.28zM945.152 230.624a32 32 0 0 0-45.248 0l-45.248 45.248a32 32 0 0 0 45.248 45.248l45.248-45.248a32 32 0 0 0 0-45.248zM912 912H864v-352c0-194.4-157.6-352-352-352s-352 157.6-352 352v352H112a32 32 0 0 0 0 64h800a32 32 0 0 0 0-64z m-368 0v-128a32 32 0 0 0-64 0v128H224v-352c0-159.072 128.928-288 288-288s288 128.928 288 288v352h-256z" p-id="4935"></path><path d="M512 464a128 128 0 1 0 0 256 128 128 0 0 0 0-256z m0 192a64 64 0 1 1 0.032-128.032A64 64 0 0 1 512 656z" p-id="4936"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/apiOutlined.svg


+ 1 - 0
src/assets/icons/svg/appCashTrend.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M873.411765 842.390588a60.235294 60.235294 0 0 1-60.235294 60.235294H210.823529a60.235294 60.235294 0 0 1-60.235294-60.235294v-602.352941a60.235294 60.235294 0 0 1 60.235294-60.235294h602.352942a60.235294 60.235294 0 0 1 60.235294 60.235294v602.352941z m60.235294-783.058823H90.352941a60.235294 60.235294 0 0 0-60.235294 60.235294v843.294117a60.235294 60.235294 0 0 0 60.235294 60.235295h843.294118a60.235294 60.235294 0 0 0 60.235294-60.235295v-843.294117a60.235294 60.235294 0 0 0-60.235294-60.235294z m-542.117647 421.647059a60.235294 60.235294 0 0 0 60.235294-60.235295v-120.470588a60.235294 60.235294 0 0 0-60.235294-60.235294H271.058824a60.235294 60.235294 0 0 0-60.235295 60.235294v120.470588a60.235294 60.235294 0 0 0 60.235295 60.235295h120.470588z m361.411764-240.941177h-120.470588a60.235294 60.235294 0 0 0-60.235294 60.235294v120.470588a60.235294 60.235294 0 0 0 60.235294 60.235295h120.470588a60.235294 60.235294 0 0 0 60.235295-60.235295v-120.470588a60.235294 60.235294 0 0 0-60.235295-60.235294z m-77.884235 354.123294l-67.523765 67.46353H391.529412a60.054588 60.054588 0 0 0-42.586353 17.709176l-85.172706 85.172706a60.175059 60.175059 0 1 0 85.172706 85.172706l67.523765-67.523765H632.470588a60.054588 60.054588 0 0 0 42.586353-17.648941l85.172706-85.172706a60.175059 60.175059 0 1 0-85.172706-85.172706z" fill="" p-id="13697"></path></svg>

+ 1 - 0
src/assets/icons/svg/appEveryData.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M986.834824 535.009882a60.717176 60.717176 0 0 0-87.04 0l-68.969412 70.174118H610.183529a60.837647 60.837647 0 0 0-43.429647 18.311529l-86.979764 88.545883a63.307294 63.307294 0 0 0 0 88.485647 60.717176 60.717176 0 0 0 86.979764 0l68.969412-70.174118h220.581647c15.721412 0 31.503059-6.083765 43.489883-18.311529l87.04-88.545883a63.307294 63.307294 0 0 0 0-88.545882z m-223.472942-319.006117h-120.470588a60.235294 60.235294 0 0 0-60.235294 60.235294v120.470588a60.235294 60.235294 0 0 0 60.235294 60.235294h120.470588a60.235294 60.235294 0 0 0 60.235294-60.235294v-120.470588a60.235294 60.235294 0 0 0-60.235294-60.235294z m-481.882353 361.411764a60.235294 60.235294 0 0 0-60.235294 60.235295v120.470588a60.235294 60.235294 0 0 0 60.235294 60.235294h60.235295a60.235294 60.235294 0 0 0 60.235294-60.235294v-120.470588a60.235294 60.235294 0 0 0-60.235294-60.235295h-60.235295z m180.705883-180.705882v-120.470588a60.235294 60.235294 0 0 0-60.235294-60.235294h-120.470589a60.235294 60.235294 0 0 0-60.235294 60.235294v120.470588a60.235294 60.235294 0 0 0 60.235294 60.235294h120.470589a60.235294 60.235294 0 0 0 60.235294-60.235294z m-301.176471 421.647059v-602.352941a60.235294 60.235294 0 0 1 60.235294-60.235294h602.172236a60.235294 60.235294 0 0 1 60.235294 60.235294v181.850353l120.470588-1.264942V95.533176a60.235294 60.235294 0 0 0-60.235294-60.235294H100.713412a60.235294 60.235294 0 0 0-60.235294 60.235294v843.294118a60.235294 60.235294 0 0 0 60.235294 60.235294h361.110588l1.566118-120.470588H221.244235a60.235294 60.235294 0 0 1-60.235294-60.235294z" fill="" p-id="13554"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/apply.svg


+ 1 - 0
src/assets/icons/svg/asset.svg

@@ -0,0 +1 @@
+<svg version="1.1" p-id="2578" viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M512.5 63.9C265 63.9 64.3 264.5 64.3 512S265 960.2 512.5 960.2 960.7 759.5 960.7 512 760 63.9 512.5 63.9m201.7 477L541.3 713.7c-15.9 15.9-41.7 15.9-57.6 0L310.8 540.9c-15.9-15.9-15.9-41.7 0-57.6l172.9-172.9c15.9-15.9 41.7-15.9 57.6 0l172.9 172.9c15.9 15.9 15.9 41.6 0 57.6" fill="" p-id="2579"></path></svg>

+ 1 - 0
src/assets/icons/svg/assetLibrary.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M254.976 448.512q27.648 0 47.104 19.456t19.456 47.104q0 26.624-19.456 46.592t-47.104 19.968-47.104-19.968-19.456-46.592q0-27.648 19.456-47.104t47.104-19.456zM771.072 66.56q45.056 0 79.872 15.872t58.88 40.96 36.864 56.832 12.8 62.464l0 523.264q0 23.552-10.752 46.08t-28.672 40.96-40.96 29.696-47.616 11.264l0-572.416q0-26.624-10.24-49.664t-27.648-40.448-40.448-27.648-49.664-10.24l-575.488 0q0-22.528 10.24-45.056t27.648-40.96 40.96-29.696 50.176-11.264l514.048 0zM681.984 258.048q46.08 0 65.536 25.088t19.456 67.072l0 603.136q0 25.6-21.504 48.128t-54.272 22.528l-620.544 0q-27.648 0-49.152-22.528t-21.504-54.272l0-614.4q0-32.768 17.92-53.76t47.616-20.992l616.448 0zM640 413.696q0-11.264-7.168-18.432t-18.432-7.168l-461.824 0q-11.264 0-18.432 7.168t-7.168 18.432l0 228.352q9.216 11.264 16.896 25.088t18.944 26.112 29.696 20.992 51.2 8.704q48.128 0 78.336-15.36t53.248-38.912 43.008-50.688 47.616-51.2 68.608-40.96 105.472-18.944l0-93.184z" p-id="2537"></path></svg>

+ 1 - 0
src/assets/icons/svg/auth.svg

@@ -0,0 +1 @@
+<svg t="1692240958741" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2513" width="48" height="48"><path d="M841.922298 89.128417L549.846066 5.419971a138.510378 138.510378 0 0 0-76.481818 0L181.890235 89.128417A120.443807 120.443807 0 0 0 90.352941 204.754472v425.16664A408.304506 408.304506 0 0 0 511.906266 1023.772361a408.304506 408.304506 0 0 0 421.553326-393.851249V204.754472a120.443807 120.443807 0 0 0-91.537294-115.626055zM198.752368 146.941445l291.474013-83.708446a78.288475 78.288475 0 0 1 42.757552 0l292.076232 83.708446a60.221904 60.221904 0 0 1 48.177523 60.221903v46.973085a151.156978 151.156978 0 0 0-46.370866-23.486542L556.470475 143.93035a149.350321 149.350321 0 0 0-88.526198 0l-271.600785 84.310665a151.156978 151.156978 0 0 0-45.768647 23.486542V204.754472a60.221904 60.221904 0 0 1 48.177523-57.813027z m674.48532 481.775229A348.684822 348.684822 0 0 1 511.906266 963.550458a348.684822 348.684822 0 0 1-361.331421-333.629346V374.58024a90.332855 90.332855 0 0 1 63.835218-89.128417l270.998566-83.708446a88.526198 88.526198 0 0 1 52.995275 0l270.998566 83.708446A90.332855 90.332855 0 0 1 873.237688 372.171364v120.443807z" fill="" p-id="2514"></path><path d="M699.196387 402.884535l-219.809949 274.611881-156.576949-156.57695a30.110952 30.110952 0 0 0-42.757551 42.757552l180.66571 180.66571a30.110952 30.110952 0 0 0 16.862133 6.022191 30.110952 30.110952 0 0 0 12.044381 0h3.613314l6.022191-3.613314 240.887614-301.109518a30.110952 30.110952 0 0 0-46.973085-37.337581z" fill="" p-id="2515"></path></svg>

+ 1 - 0
src/assets/icons/svg/barChartNoval.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M289.386667 907.136c-20.608 0-37.098667-16.490667-37.098667-37.12 0-20.608 16.490667-37.098667 37.12-37.098667H721.706667c20.608 0 37.12 16.490667 37.12 37.12 0 20.608-16.512 37.098667-37.12 37.098667H289.386667zM889.429333 128A49.493333 49.493333 0 0 1 938.666667 177.237333v535.701334a49.493333 49.493333 0 0 1-49.237334 49.237333H134.570667A49.493333 49.493333 0 0 1 85.333333 712.938667V177.237333A49.493333 49.493333 0 0 1 134.570667 128h754.858666z m-127.253333 135.552L536.32 489.301333l-125.098667-125.888a7.893333 7.893333 0 0 0-11.093333 0l-180.48 179.413334a7.893333 7.893333 0 0 0 0 11.093333l38.784 38.976a7.893333 7.893333 0 0 0 11.093333 0L405.333333 457.770667l125.290667 126.08a7.893333 7.893333 0 0 0 11.093333 0l270.421334-270.314667a7.893333 7.893333 0 0 0 0-11.093333l-38.869334-38.890667a7.893333 7.893333 0 0 0-11.093333 0z" fill="currentColor" p-id="3273"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/book.svg


+ 1 - 0
src/assets/icons/svg/bookData.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M889.728 128h63.573333v896H190.976C121.173333 1024 64 966.4 64 896V128c0-70.4 57.173333-128 127.018667-128h635.221333v767.104H222.805333a95.616 95.616 0 0 0-95.274666 96c0 53.034667 42.666667 96 95.274666 96h666.922667V128zM191.018667 866.304c0-18.944 21.674667-34.304 40.533333-34.304h594.346667v68.565333H231.552c-18.773333 0-40.533333-15.36-40.533333-34.261333z" fill="currentColor" p-id="13706"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/businessPlan.svg


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/corpWechat.svg


+ 1 - 0
src/assets/icons/svg/createRole.svg

@@ -0,0 +1 @@
+<svg t="1691564641286" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5393" width="48" height="48"><path d="M224 277.3504a181.3504 181.3504 0 1 1 362.6496 0 181.3504 181.3504 0 0 1-362.6496 0z m181.3504-117.3504a117.3504 117.3504 0 1 0 0 234.6496 117.3504 117.3504 0 0 0 0-234.6496zM357.0176 565.2992H453.632c46.592 0 83.5072 0 113.2544 2.4576 30.464 2.5088 56.2176 7.68 79.7184 19.6608a202.752 202.752 0 0 1 88.576 88.576c9.1136 17.92 13.9776 39.8336 16.896 62.8224 2.9696 23.3472 4.1984 50.3808 4.7616 79.7696 1.1264 60.8256-48.5888 109.4144-108.3392 109.4144h-486.4c-59.8016 0-109.568-48.5888-108.3904-109.4144 0.5632-29.3888 1.8432-56.4224 4.8128-79.7696 2.9184-22.9888 7.7312-44.9536 16.896-62.8224 19.4048-38.144 50.3808-69.12 88.5248-88.576 23.552-11.9808 49.2544-17.152 79.7184-19.6608 29.7472-2.4576 66.6624-2.4576 113.3056-2.4576zM193.024 644.4544c-26.112 13.312-47.2576 34.5088-60.5696 60.5696-4.096 8.0896-7.8336 21.504-10.3936 41.8304-2.56 19.968-3.7376 44.2368-4.3008 72.96a43.9296 43.9296 0 0 0 44.3904 44.1856h486.4c25.0368 0 44.8-20.2752 44.3392-44.1856-0.512-28.672-1.7408-53.0432-4.2496-72.96-2.56-20.3776-6.2976-33.7408-10.4448-41.8304a138.6496 138.6496 0 0 0-60.5696-60.5696c-13.0048-6.656-29.3888-10.752-55.8592-12.9024-26.88-2.2016-61.184-2.2528-109.5168-2.2528H358.4c-48.3328 0-82.6368 0.0512-109.4656 2.2528-26.5216 2.1504-42.9056 6.2464-55.9104 12.9024zM842.6496 277.3504a32 32 0 1 0-64 0v96h-96a32 32 0 0 0 0 64h96v95.9488a32 32 0 0 0 64 0V437.2992h96a32 32 0 1 0 0-64h-96V277.3504z" fill="#86909C" p-id="5394"></path></svg>

+ 1 - 0
src/assets/icons/svg/dynamic.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M763.611429 918.162286c20.260571 0 36.937143 15.652571 38.4 35.84l0.146285 2.925714a38.765714 38.765714 0 0 1-38.546285 38.619429H260.388571a38.4 38.4 0 0 1-38.546285-38.692572 38.692571 38.692571 0 0 1 38.546285-38.692571h503.222858zM512 28.525714A406.162286 406.162286 0 0 1 744.082286 768v72.630857a38.765714 38.765714 0 0 1-38.765715 38.912H318.683429a38.838857 38.838857 0 0 1-38.765715-38.912V768A406.162286 406.162286 0 0 1 512 28.525714z m0 77.385143A328.777143 328.777143 0 0 0 357.229714 724.845714v58.002286c0 10.678857 8.704 19.309714 19.382857 19.309714H647.314286a19.309714 19.309714 0 0 0 19.382857-19.309714V724.845714A328.777143 328.777143 0 0 0 512 105.837714zM448.073143 317.44L512 419.693714l63.926857-102.253714a38.692571 38.692571 0 0 1 65.609143 0l96.694857 154.697143a38.692571 38.692571 0 1 1-65.609143 41.033143l-63.926857-102.253715-63.926857 102.253715a38.692571 38.692571 0 0 1-65.609143 0l-63.853714-102.253715-63.926857 102.253715a38.692571 38.692571 0 0 1-65.609143-40.96L382.464 317.44a38.692571 38.692571 0 0 1 65.609143 0z" p-id="5323"></path></svg>

+ 1 - 0
src/assets/icons/svg/educate.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M791.3 1024H232.7C104.7 1024 0 919.3 0 791.3V232.8C0 104.7 104.7 0 232.7 0h558.5c128 0 232.7 104.7 232.7 232.7v558.5c0.1 128.1-104.6 232.8-232.6 232.8z" fill="#1296DB" p-id="14403"></path><path d="M797.8 427.7V531l21.7 21.7-45.3 47.2-45.9-45.8 31.4-28.6V444c-133.3 55-176.1 72.1-205.7 85.4-29.6 13.3-50.9 13.3-80.2 2.2-29.3-11.1-168.9-62-238.3-95.2-46.3-22.1-49.2-36.2 0.8-55 65.3-24.8 173.2-64.5 230.4-86.2 33.9-13.7 51.8-21.2 82.9-5.6 55.5 22.9 182.3 70.5 245.4 96.5 55 24.2 18.1 32 2.8 41.6M560.5 570.3c32.2-13.3 75.7-35.3 123.1-55.6v163.1S622.3 743 514.5 743c-116.1 0-178.8-65.2-178.8-65.2V525.6c36.6 14.9 77.7 27.7 127.4 44.8 30.7 10.8 69.6 14.6 97.4-0.1" fill="#FFFFFF" p-id="14404"></path></svg>

+ 1 - 0
src/assets/icons/svg/extension.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1667282623981" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2577" width="48" height="48" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M928 512c0 115.2-44.8 217.6-121.6 294.4l44.8 44.8c89.6-89.6 140.8-204.8 140.8-339.2s-51.2-249.6-140.8-339.2l-44.8 44.8c76.8 76.8 121.6 179.2 121.6 294.4zM96 512c0-115.2 44.8-217.6 121.6-294.4l-44.8-44.8C83.2 262.4 32 377.6 32 512s51.2 249.6 140.8 339.2l44.8-44.8A410.88 410.88 0 0 1 96 512zM300.8 512c0-57.6 25.6-108.8 64-147.2L320 320c-51.2 44.8-83.2 115.2-83.2 192s32 147.2 83.2 192l44.8-44.8c-38.4-38.4-64-89.6-64-147.2zM723.2 512c0 57.6-25.6 108.8-64 147.2l44.8 44.8c51.2-51.2 83.2-115.2 83.2-192s-32-147.2-83.2-192l-44.8 44.8c38.4 38.4 64 89.6 64 147.2z" fill="#333333" p-id="2578"></path><path d="M512 512m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z" fill="#333333" p-id="2579"></path></svg>

+ 1 - 0
src/assets/icons/svg/extensionList.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1667282722082" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4410" width="48" height="48" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M831 64.2H193c-41.9 0-76 34.1-76 76v744.1c0 41.9 34.1 76 76 76h638c41.9 0 76-34.1 76-76V140.2c-0.1-41.9-34.2-76-76-76zM193 884.3V140.2h638l0.1 744.1H193z" p-id="4411"></path><path d="M701.7 241H322.3c-21 0-38 17-38 38s17 38 38 38h379.4c21 0 38-17 38-38s-17-38-38-38zM701.7 706.8H322.3c-21 0-38 17-38 38s17 38 38 38h379.4c21 0 38-17 38-38s-17-38-38-38zM293.4 644.3c6.7 4.7 14.3 6.9 21.8 6.9 11.9 0 23.7-5.6 31.1-16.1l71.3-101.7 81.5 72.4c16 14.2 37.4 21 58.6 18.7 21.3-2.3 40.6-13.6 53.2-30.9l115.9-160c12.3-17 8.5-40.7-8.5-53-17-12.3-40.7-8.5-53 8.5L549.6 549l-81.5-72.4C452 462.3 430.4 455.5 409 458s-40.9 14-53.3 31.7l-71.5 101.7c-12.1 17.1-7.9 40.8 9.2 52.9z" p-id="4412"></path></svg>

+ 1 - 0
src/assets/icons/svg/externalMaterial.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M213.48 64.22h597.04c99.5 0 149.26 49.75 149.26 149.26v597.04c0 99.5-49.75 149.26-149.26 149.26H213.48c-99.51 0-149.26-49.75-149.26-149.26V213.48c0-99.5 49.76-149.26 149.26-149.26z m0 0" fill="#4E6EF2" p-id="28675"></path><path d="M716.95 365.59H545.2L490.63 311H327.65c-10.66 0-19.46 8.77-19.46 19.46v342.73c0.04 10.73 8.73 19.42 19.46 19.46h389.3c10.66 0 19.46-8.77 19.46-19.46V385.05c0-10.68-8.77-19.46-19.46-19.46z" fill="#FFFFFF" p-id="28676"></path><path d="M599.34 523.54c0-10.57 6.5-20.06 16.37-23.87a96.02 96.02 0 0 0-10.48-25.31 25.563 25.563 0 0 1-28.51-5.25 25.54 25.54 0 0 1-5.23-28.51 96.352 96.352 0 0 0-25.3-10.45 25.593 25.593 0 0 1-23.88 16.45c-10.6-0.01-20.1-6.55-23.88-16.45a95.748 95.748 0 0 0-25.28 10.45 25.55 25.55 0 0 1-5.27 28.5c-7.49 7.49-18.83 9.59-28.5 5.26-4.65 7.81-8.17 16.3-10.48 25.31a25.613 25.613 0 0 1 16.48 23.86c0 10.94-6.86 20.18-16.48 23.88 2.3 9 5.85 17.49 10.48 25.28a25.557 25.557 0 0 1 28.53 5.25c7.49 7.51 9.57 18.87 5.21 28.54 7.81 4.63 16.3 8.18 25.3 10.45a25.617 25.617 0 0 1 23.88-16.46c10.92 0 20.18 6.86 23.88 16.46a95.049 95.049 0 0 0 25.28-10.45 25.559 25.559 0 0 1 5.24-28.5c7.48-7.5 18.82-9.6 28.49-5.29 4.66-7.79 8.2-16.28 10.51-25.28a25.591 25.591 0 0 1-16.36-23.87z m-75.51 41.65c-22.15 0-40.1-17.95-40.1-40.11 0-22.15 17.95-40.1 40.1-40.1s40.11 17.96 40.11 40.1c-0.01 22.15-17.96 40.11-40.11 40.11z" fill="#B9C8F9" p-id="28677"></path></svg>

+ 1 - 1
src/assets/icons/svg/game.svg

@@ -1 +1 @@
-<svg t="1658127644059" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3048" width="128" height="128"><path d="M725.333333 149.333333c141.376 0 256 114.624 256 256v298.666667a170.666667 170.666667 0 1 1-341.333333 0v-42.666667H383.978667L384 704a170.666667 170.666667 0 1 1-341.333333 0V405.333333C42.666667 263.957333 157.290667 149.333333 298.666667 149.333333h426.666666z m-21.333333 64H320c-115.84 0-210.090667 92.309333-213.248 207.36L106.666667 426.666667v277.333333a106.666667 106.666667 0 0 0 213.226666 4.629333L320 704v-85.333333a21.333333 21.333333 0 0 1 21.333333-21.333334h341.333334a21.333333 21.333333 0 0 1 21.333333 21.333334v85.333333a106.666667 106.666667 0 0 0 213.226667 4.629333L917.333333 704V426.666667c0-117.824-95.509333-213.333333-213.333333-213.333334z m10.666667 256a32 32 0 1 1 0 64 32 32 0 0 1 0-64z m-405.333334-128a32 32 0 0 1 32 32V405.333333h32a32 32 0 0 1 0 64H341.333333v32a32 32 0 0 1-64 0V469.333333h-32a32 32 0 0 1 0-64H277.333333v-32a32 32 0 0 1 32-32z m469.333334 64a32 32 0 1 1 0 64 32 32 0 0 1 0-64z m-128 0a32 32 0 1 1 0 64 32 32 0 0 1 0-64z m64-64a32 32 0 1 1 0 64 32 32 0 0 1 0-64z" fill="#4E4E4E" p-id="3049"></path></svg>
+<svg t="1658127644059" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3048" width="128" height="128"><path d="M725.333333 149.333333c141.376 0 256 114.624 256 256v298.666667a170.666667 170.666667 0 1 1-341.333333 0v-42.666667H383.978667L384 704a170.666667 170.666667 0 1 1-341.333333 0V405.333333C42.666667 263.957333 157.290667 149.333333 298.666667 149.333333h426.666666z m-21.333333 64H320c-115.84 0-210.090667 92.309333-213.248 207.36L106.666667 426.666667v277.333333a106.666667 106.666667 0 0 0 213.226666 4.629333L320 704v-85.333333a21.333333 21.333333 0 0 1 21.333333-21.333334h341.333334a21.333333 21.333333 0 0 1 21.333333 21.333334v85.333333a106.666667 106.666667 0 0 0 213.226667 4.629333L917.333333 704V426.666667c0-117.824-95.509333-213.333333-213.333333-213.333334z m10.666667 256a32 32 0 1 1 0 64 32 32 0 0 1 0-64z m-405.333334-128a32 32 0 0 1 32 32V405.333333h32a32 32 0 0 1 0 64H341.333333v32a32 32 0 0 1-64 0V469.333333h-32a32 32 0 0 1 0-64H277.333333v-32a32 32 0 0 1 32-32z m469.333334 64a32 32 0 1 1 0 64 32 32 0 0 1 0-64z m-128 0a32 32 0 1 1 0 64 32 32 0 0 1 0-64z m64-64a32 32 0 1 1 0 64 32 32 0 0 1 0-64z" p-id="3049"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/gameList.svg


+ 1 - 0
src/assets/icons/svg/gameServer.svg

@@ -0,0 +1 @@
+<svg t="1692066479746" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7037" width="48" height="48"><path d="M85.333333 0h853.333334v42.666667H85.333333zM85.333333 213.333333h853.333334v42.666667H85.333333zM85.333333 42.666667h42.666667v170.666666H85.333333zM896 42.666667h42.666667v170.666666h-42.666667z" fill="#2E2F30" p-id="7038"></path><path d="M213.333333 106.666667h42.666667v42.666666H213.333333z" fill="#3A3B3D" p-id="7039"></path><path d="M85.333333 426.666667h853.333334v42.666666H85.333333zM85.333333 256h42.666667v170.666667H85.333333zM896 256h42.666667v170.666667h-42.666667z" fill="#2E2F30" p-id="7040"></path><path d="M213.333333 320h42.666667v42.666667H213.333333z" fill="#3A3B3D" p-id="7041"></path><path d="M85.333333 640h853.333334v42.666667H85.333333zM85.333333 469.333333h42.666667v170.666667H85.333333zM896 469.333333h42.666667v170.666667h-42.666667z" fill="#2E2F30" p-id="7042"></path><path d="M213.333333 533.333333h42.666667v42.666667H213.333333z" fill="#3A3B3D" p-id="7043"></path><path d="M384 810.666667h42.666667v213.333333H384zM597.333333 810.666667v42.666666h-170.666666v-42.666666zM597.333333 981.333333v42.666667h-170.666666v-42.666667zM597.333333 810.666667h42.666667v213.333333h-42.666667z" fill="#2E2F30" p-id="7044"></path><path d="M0 896h426.666667v42.666667H0zM597.333333 896h426.666667v42.666667H597.333333z" fill="#2E2F30" p-id="7045"></path><path d="M490.666667 682.666667h42.666666v128h-42.666666z" fill="#3A3B3D" p-id="7046"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/gdt.svg


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/gift.svg


+ 1 - 0
src/assets/icons/svg/groupChatSend.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M658.358857 365.714286s13.458286-229.668571 218.843429-276.918857V0L1024 147.090286l-146.212571 145.92V203.849143s-132.827429-17.554286-219.428572 161.792z" fill="#5361FF" p-id="5369"></path><path d="M623.177143 73.874286a36.571429 36.571429 0 0 1 6.582857 72.411428l-6.582857 0.658286-403.456 0.146286v657.115428h656.530286V400.896a36.498286 36.498286 0 0 1 72.411428-6.582857l0.585143 6.582857v403.309714a73.142857 73.142857 0 0 1-64.585143 72.630857l-8.557714 0.512h-73.142857v72.411429a73.142857 73.142857 0 0 1-64.585143 72.704l-8.557714 0.512H73.142857l-8.557714-0.512a73.142857 73.142857 0 0 1-64-64.146286L0 949.833143 0.292571 292.571429c0.073143-37.522286 28.306286-68.388571 64.658286-72.630858L73.508571 219.428571h72.704V147.017143a73.142857 73.142857 0 0 1 64.658286-72.630857l8.484572-0.512h403.748571zM146.285714 292.571429h-72.850285v657.188571H729.965714v-72.484571H146.285714V292.571429z m550.034286 293.449142a36.425143 36.425143 0 0 1 0 72.923429H329.362286a36.425143 36.425143 0 0 1 0-72.923429H696.32zM549.522286 292.937143a36.498286 36.498286 0 0 1 0 72.996571h-220.16a36.498286 36.498286 0 1 1 0-72.996571h220.16z" fill="currentColor" p-id="5370"></path></svg>

+ 1 - 0
src/assets/icons/svg/image.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M254.976 448.512q27.648 0 47.104 19.456t19.456 47.104q0 26.624-19.456 46.592t-47.104 19.968-47.104-19.968-19.456-46.592q0-27.648 19.456-47.104t47.104-19.456zM771.072 66.56q45.056 0 79.872 15.872t58.88 40.96 36.864 56.832 12.8 62.464l0 523.264q0 23.552-10.752 46.08t-28.672 40.96-40.96 29.696-47.616 11.264l0-572.416q0-26.624-10.24-49.664t-27.648-40.448-40.448-27.648-49.664-10.24l-575.488 0q0-22.528 10.24-45.056t27.648-40.96 40.96-29.696 50.176-11.264l514.048 0zM681.984 258.048q46.08 0 65.536 25.088t19.456 67.072l0 603.136q0 25.6-21.504 48.128t-54.272 22.528l-620.544 0q-27.648 0-49.152-22.528t-21.504-54.272l0-614.4q0-32.768 17.92-53.76t47.616-20.992l616.448 0zM640 413.696q0-11.264-7.168-18.432t-18.432-7.168l-461.824 0q-11.264 0-18.432 7.168t-7.168 18.432l0 228.352q9.216 11.264 16.896 25.088t18.944 26.112 29.696 20.992 51.2 8.704q48.128 0 78.336-15.36t53.248-38.912 43.008-50.688 47.616-51.2 68.608-40.96 105.472-18.944l0-93.184z" p-id="8573"></path></svg>

+ 1 - 0
src/assets/icons/svg/imageConvert.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M153.6 656.290909c-9.309091 0-13.963636-4.654545-18.618182-9.309091-9.309091-9.309091-4.654545-23.272727 4.654546-32.581818l260.654545-186.181818 158.254546 190.836363c9.309091 9.309091 4.654545 23.272727-4.654546 32.581819-9.309091 9.309091-23.272727 4.654545-32.581818-4.654546l-130.327273-158.254545L167.563636 651.636364c-4.654545 4.654545-9.309091 4.654545-13.963636 4.654545z" fill="" p-id="9565"></path><path d="M861.090909 605.090909c-4.654545 0-13.963636-4.654545-18.618182-9.309091L670.254545 372.363636l-186.181818 186.181819c-9.309091 9.309091-23.272727 9.309091-32.581818 0-9.309091-9.309091-9.309091-23.272727 0-32.581819l223.418182-223.418181 204.8 265.30909c9.309091 9.309091 4.654545 23.272727-4.654546 32.581819 0 4.654545-9.309091 4.654545-13.963636 4.654545z" fill="" p-id="9566"></path><path d="M251.345455 274.618182m-69.818182 0a69.818182 69.818182 0 1 0 139.636363 0 69.818182 69.818182 0 1 0-139.636363 0Z" fill="" p-id="9567"></path><path d="M498.036364 884.363636H93.090909V139.636364h837.818182v479.418181h46.545454V93.090909H46.545455v837.818182h451.490909z" fill="" p-id="9568"></path><path d="M805.236364 623.709091v83.781818h-242.036364v46.545455H977.454545zM735.418182 958.836364v-83.781819H977.454545v-46.545454h-414.254545z" fill="#333333" p-id="9569"></path></svg>

+ 1 - 0
src/assets/icons/svg/imageData.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M922 82H102C46.77 82 2 126.77 2 182v660c0 55.23 44.77 100 100 100h820c55.23 0 100-44.77 100-100V182c0-55.23-44.77-100-100-100z m-601.94 84.04c55.23 0 100 44.77 100 100s-44.77 100-100 100-100-44.77-100-100 44.77-100 100-100zM860.43 822H163.59c-29.21 0-49.31-29.71-38.74-57.29l97.72-255.15c14.83-38.71 61.9-52.63 94.97-28.08l76.92 57.1c32.37 24.03 77.08 21.2 106.24-6.72L701.84 339.3c34.79-33.31 92.14-16.11 103.41 31.01l95.56 399.72c6.33 26.47-13.48 51.97-40.38 51.97z" fill="currentColor" p-id="14804"></path></svg>

+ 1 - 0
src/assets/icons/svg/interdiction.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1667371271333" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="27478" width="48" height="48" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M512.000512 63.83998c-119.683846 0-232.199433 46.615691-316.843228 131.246183-0.013303 0.020466-0.027629 0.020466-0.040932 0.026606-0.013303 0.021489-0.013303 0.034792-0.027629 0.048095C110.459253 279.80466 63.849702 392.32741 63.849702 512.004093c0 119.702266 46.623877 232.232179 131.279952 316.8903 84.643796 84.657098 197.174732 131.264603 316.870858 131.264603 119.680776 0 232.198409-46.608527 316.841182-131.23902 0.014326-0.025583 0.027629-0.025583 0.041956-0.025583 0.014326-0.027629 0.014326-0.041956 0.025583-0.056282 84.630493-84.628446 131.23902-197.160405 131.23902-316.835042 0-119.697149-46.622854-232.239342-131.278929-316.8903C744.224504 110.462834 631.695614 63.83998 512.000512 63.83998zM214.933699 809.076022c-79.364559-79.335906-123.07406-184.862311-123.07406-297.071929 0-107.524922 40.222073-208.832236 113.40484-286.939151l593.666998 593.680301c-78.106916 73.16844-179.408089 113.40484-286.930965 113.40484C399.784754 932.150082 294.284955 888.441605 214.933699 809.076022zM818.734498 798.942221 225.0675 205.26806c78.091566-73.182766 179.393763-113.418142 286.931988-113.418142 112.213711 0 217.714534 43.703361 297.064766 123.07406 79.364559 79.344093 123.07406 184.864358 123.07406 297.080116C932.139338 619.534132 891.917264 720.835306 818.734498 798.942221z" p-id="27479"></path></svg>

+ 1 - 0
src/assets/icons/svg/manage_iaa.svg

@@ -0,0 +1 @@
+<svg t="1724296975685" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9559" width="256" height="256"><path d="M263.1 844.8h497.7c22.9 0 41.5 18.6 41.5 41.5s-18.6 41.5-41.5 41.5H263.1c-22.9 0-41.5-18.6-41.5-41.5s18.6-41.5 41.5-41.5zM138.7 98.2h746.6c22.9 0 41.5 18.6 41.5 41.5v580.7c0 11-4.4 21.6-12.1 29.3-7.8 7.8-18.3 12.1-29.3 12.1H138.7c-11 0-21.6-4.4-29.3-12.1-7.8-7.8-12.1-18.3-12.1-29.3V139.7c-0.1-22.9 18.5-41.5 41.4-41.5z m331.8 478.9v60.4h83v-60.3c8.5-5.8 17.4-12.8 26.5-20.5l49.4 49.4 58.7-58.7-49.5-49.4c7.7-9 14.6-18 20.5-26.5h60.3v-83h-60.3c-6.4-9.1-13.3-18-20.5-26.5l49.4-49.4-58.7-58.6-49.4 49.4c-8.5-7.3-17.3-14.1-26.5-20.5v-60.3h-83V283c-8.5 5.8-17.4 12.8-26.5 20.5l-49.4-49.4-58.5 58.6 49.4 49.4c-7.2 8.5-14.1 17.3-20.5 26.5h-60.3v83h60.3c5.8 8.5 12.8 17.4 20.5 26.5L336 547.3l58.7 58.7 49.4-49.4c9.1 7.7 18 14.6 26.4 20.5z m0 0" p-id="9560"></path></svg>

+ 1 - 0
src/assets/icons/svg/media.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1667283002319" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5391" width="48" height="48" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M857.92 875.584H763.52a32 32 0 0 1 0-64h94.464c20.224 0 36.736-17.344 36.736-38.656V207.424c0-21.312-16.512-38.656-36.736-38.656H170.752c-20.224 0-36.736 17.344-36.736 38.656v565.504c0 21.312 16.448 38.656 36.736 38.656h384.256a32 32 0 0 1 0 64H170.752c-55.552 0-100.736-46.08-100.736-102.656V207.424c0-56.64 45.184-102.656 100.736-102.656h687.168c55.552 0 100.736 46.08 100.736 102.656v565.504c0 56.576-45.184 102.656-100.736 102.656z" p-id="5392"></path><path d="M397.76 374.464c0-35.2 24.96-49.6 55.424-32l200.32 115.712c30.528 17.6 30.528 46.4 0 64l-200.32 115.712c-30.464 17.6-55.424 3.2-55.424-32V374.464z" p-id="5393"></path></svg>

+ 1 - 0
src/assets/icons/svg/miniprogram.svg

@@ -0,0 +1 @@
+<svg t="1710914998173" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2470" width="128" height="128"><path d="M626.176 279.552c74.24 0 134.656 55.808 134.656 124.928 0 21.504-6.144 42.496-17.408 61.44-16.896 27.648-44.032 48.128-76.8 57.856-8.704 2.56-15.36 3.584-21.504 3.584-14.336 0-25.6-11.264-25.6-25.6s11.264-25.6 25.6-25.6c1.024 0 3.072 0 5.632-1.024 22.016-6.144 39.424-18.944 49.152-35.84 6.656-10.752 9.728-22.528 9.728-34.816 0-40.448-37.376-73.728-82.944-73.728-15.872 0-31.232 4.096-45.056 11.776-24.064 13.824-38.4 36.864-38.4 61.952v214.528c0 43.52-24.064 83.456-64 105.984-21.504 12.288-45.568 18.432-70.144 18.432-74.24 0-134.656-55.808-134.656-124.928 0-21.504 6.144-42.496 17.408-61.44 16.896-27.648 44.032-48.128 76.8-57.856 9.216-2.56 15.36-3.584 21.504-3.584 14.336 0 25.6 11.264 25.6 25.6s-11.264 25.6-25.6 25.6c-1.024 0-3.072 0-5.632 1.024-22.016 6.656-39.424 19.456-49.152 35.84-6.656 10.752-9.728 22.528-9.728 34.816 0 40.448 37.376 73.728 83.456 73.728 15.872 0 31.232-4.096 45.056-11.776 24.064-13.824 38.4-36.864 38.4-61.952V404.48c0-43.52 24.064-83.456 64-105.984 20.992-12.8 45.056-18.944 69.632-18.944z m-520.704 230.4c0 226.304 183.296 409.6 409.6 409.6s409.6-183.296 409.6-409.6-183.296-409.6-409.6-409.6-409.6 183.296-409.6 409.6z m-51.2 0c0-254.464 206.336-460.8 460.8-460.8s460.8 206.336 460.8 460.8-206.336 460.8-460.8 460.8-460.8-206.336-460.8-460.8z m0 0" fill="" p-id="2471"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/moments.svg


+ 1 - 0
src/assets/icons/svg/msg.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M512 227.555556c155.522844 0 281.895822 124.814222 284.404622 279.739733L796.444444 512v227.555556c0 31.419733-25.469156 56.888889-56.888888 56.888888H512c-157.092978 0-284.444444-127.351467-284.444444-284.444444s127.351467-284.444444 284.444444-284.444444z m0 34.133333c-138.24 0-250.311111 112.071111-250.311111 250.311111 0 136.863289 109.835378 248.069689 246.1696 250.276978L512 762.311111h227.555556a22.755556 22.755556 0 0 0 22.727111-21.617778l0.028444-1.137777V512.278756l-0.034133-4.431645C760.064 371.370667 648.704 261.688889 512 261.688889z" p-id="4284"></path><path d="M403.911111 438.044444m17.066667 0l210.488889 0q17.066667 0 17.066666 17.066667l0 0q0 17.066667-17.066666 17.066667l-210.488889 0q-17.066667 0-17.066667-17.066667l0 0q0-17.066667 17.066667-17.066667Z" p-id="4285"></path><path d="M403.911111 557.511111m17.066667 0l136.533333 0q17.066667 0 17.066667 17.066667l0 0q0 17.066667-17.066667 17.066666l-136.533333 0q-17.066667 0-17.066667-17.066666l0 0q0-17.066667 17.066667-17.066667Z" p-id="4286"></path></svg>

+ 1 - 0
src/assets/icons/svg/novelDataSystem.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M653.354667 170.666667a171.690667 171.690667 0 0 0 168.832 203.050666c10.453333-0.042667 20.906667-1.066667 31.146666-2.986666v340.138666C853.333333 854.016 768.896 938.666667 625.578667 938.666667H313.429333C169.813333 938.666667 85.333333 854.016 85.333333 710.869333V399.189333C85.333333 256.085333 169.770667 170.666667 313.429333 170.666667z m5.162666 255.744l-4.992 0.341333a31.146667 31.146667 0 0 0-20.778666 12.544l-102.826667 132.266667-117.034667-92.16a31.573333 31.573333 0 0 0-44.672 5.973333l-126.037333 162.56a30.72 30.72 0 0 0-6.784 19.498667l0.128 4.693333a31.488 31.488 0 0 0 58.026667 13.653333l105.429333-136.362666 117.077333 91.776a31.573333 31.573333 0 0 0 45.013334-5.589334l121.941333-157.354666V477.44a32.170667 32.170667 0 0 0-5.973333-44.586667 31.146667 31.146667 0 0 0-23.509334-6.144z" fill="currentColor" p-id="73000"></path><path d="M832 192m-106.666667 0a106.666667 106.666667 0 1 0 213.333334 0 106.666667 106.666667 0 1 0-213.333334 0Z" fill="currentColor" opacity=".4" p-id="73001"></path></svg>

+ 1 - 0
src/assets/icons/svg/pa.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M832 736v-64a80 80 0 0 0-160 0v64a64.19 64.19 0 0 0-64 64v96a64.19 64.19 0 0 0 64 64h160a64.19 64.19 0 0 0 64-64v-96a64.19 64.19 0 0 0-64-64z m-32 0h-96v-64a48 48 0 0 1 96 0z" fill="#231815" p-id="5332"></path><path d="M934.28 442.85l-97.59-19.52a32.13 32.13 0 0 1-23.86-20.62Q808 389.37 802 376.59a32.15 32.15 0 0 1 2.28-31.48l55.21-82.81a32 32 0 0 0-4-40.38l-53.41-53.41a32 32 0 0 0-40.38-4l-82.81 55.21a32.15 32.15 0 0 1-31.48 2.28q-12.77-6-26.13-10.82a32.13 32.13 0 0 1-20.62-23.86l-19.52-97.6A32 32 0 0 0 549.77 64h-75.54a32 32 0 0 0-31.38 25.72l-19.52 97.59a32.13 32.13 0 0 1-20.62 23.86Q389.37 216 376.59 222a32.15 32.15 0 0 1-31.48-2.28l-82.81-55.21a32 32 0 0 0-40.38 4l-53.41 53.41a32 32 0 0 0-4 40.38l55.21 82.81a32.15 32.15 0 0 1 2.28 31.48q-6 12.77-10.82 26.13a32.13 32.13 0 0 1-23.86 20.62l-97.6 19.51A32 32 0 0 0 64 474.23v75.53a32 32 0 0 0 25.72 31.38l97.59 19.52a32.13 32.13 0 0 1 23.86 20.62Q216 634.63 222 647.41a32.15 32.15 0 0 1-2.28 31.48l-55.21 82.81a32 32 0 0 0 4 40.38l53.41 53.41a32 32 0 0 0 40.38 4l82.81-55.21a32.15 32.15 0 0 1 31.48-2.28q12.77 6 26.13 10.82a32.13 32.13 0 0 1 20.62 23.86l19.52 97.59A32 32 0 0 0 474.23 960h75.53A32 32 0 0 0 576 946.32v-253.2a191.7 191.7 0 1 1 124.24-143A219.59 219.59 0 0 1 752 544c52.64 0 99.88 18.25 132.13 47.17l50.15-10a32 32 0 0 0 25.72-31.4v-75.54a32 32 0 0 0-25.72-31.38z" fill="currentColor" p-id="5333"></path></svg>

+ 1 - 0
src/assets/icons/svg/pitcherData.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M853.56 391.14c34.83 0 63.09 28.26 63.09 63.09V874.6c0 34.83-28.26 63.09-63.09 63.09h-84.04c-34.83 0-63.1-28.26-63.1-63.09V454.15c0-34.83 28.26-63.1 63.1-63.1h84.04v0.09z m-588.55 84.04c34.83 0 63.09 28.26 63.09 63.09v336.25c0 34.83-28.26 63.1-63.09 63.1h-84.04c-34.83 0-63.09-28.26-63.09-63.1V538.19c0-34.83 28.26-63.1 63.09-63.1h84.04v0.09z m294.27 84.04c34.83 0 63.09 28.26 63.09 63.09v252.21c0 34.83-28.26 63.1-63.09 63.1h-84.04c-34.83 0-63.1-28.26-63.1-63.1V622.31c0-34.83 28.26-63.09 63.1-63.09h84.04z m0 0M776.91 149.9l-49.63 0.33c-17.38 0.09-31.59-13.88-31.75-31.34-0.17-17.29 13.88-31.5 31.26-31.67l126.51-0.92c8.15-0.08 16.3 3 22.53 9.23 3.08 3.08 5.4 6.65 6.9 10.39 1.41 3.32 2.33 7.48 2.33 11.89V244.5c0 17.38-14.13 31.51-31.5 31.51-17.37 0-31.51-14.13-31.51-31.51v-50.54L539.58 476.42c-9.23 9.23-23.19 11.81-35.08 6.48L126.11 314.82c-15.88-7.07-23.11-25.69-16.04-41.65 7.06-15.88 25.69-23.11 41.65-16.04l358.53 159.35L776.91 149.9z m0 0" fill="currentColor" p-id="6297"></path></svg>

+ 1 - 0
src/assets/icons/svg/player.svg

@@ -0,0 +1 @@
+<svg t="1694156452152" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4692" width="48" height="48"><path d="M736 896H288c-160 0-288-128-288-288s128-288 288-288h480c134.4 0 256 137.6 256 288 0 160-128 288-288 288zM288 384c-121.6 0-224 99.2-224 224s99.2 224 224 224h448c121.6 0 224-99.2 224-224s-102.4-224-192-224H288z" fill="" p-id="4693"></path><path d="M256 480h64v256H256v-256z" fill="" p-id="4694"></path><path d="M160 576h256v64H160v-64zM544 256h-64V192c0-54.4 41.6-96 96-96v64c-19.2 0-32 12.8-32 32v64zM652.8 601.6c-12.8-12.8-32-12.8-44.8 0l-44.8-44.8c38.4-38.4 99.2-38.4 134.4 0l-44.8 44.8z" fill="" p-id="4695"></path><path d="M563.2 691.2c-19.2-19.2-28.8-41.6-28.8-67.2s9.6-51.2 28.8-67.2l44.8 44.8c-6.4 6.4-9.6 12.8-9.6 22.4 0 9.6 3.2 16 9.6 22.4l-44.8 44.8zM844.8 601.6c-12.8-12.8-32-12.8-44.8 0l-44.8-44.8c38.4-38.4 99.2-38.4 134.4 0l-44.8 44.8z" fill="" p-id="4696"></path><path d="M755.2 691.2c-19.2-19.2-28.8-41.6-28.8-67.2s9.6-51.2 28.8-67.2l44.8 44.8c-6.4 6.4-9.6 12.8-9.6 22.4 0 9.6 3.2 16 9.6 22.4l-44.8 44.8z" fill="" p-id="4697"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/position.svg


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/realName.svg


Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/rechargeData.svg


+ 1 - 0
src/assets/icons/svg/remitLog.svg

@@ -0,0 +1 @@
+<svg t="1691560606663" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4264" width="48" height="48"><path d="M762.304 64c60.288 0 109.76 46.08 112.256 104.234667l0.106667 4.629333v437.589333h-42.666667V172.864c0-35.114667-28.906667-64.128-65.706667-66.090667L762.304 106.666667H261.696C224.362667 106.666667 194.133333 134.464 192.106667 169.109333L192 172.864v678.272c0 35.114667 28.906667 64.128 65.706667 66.090667l3.989333 0.106666 357.397333 0.021334a181.333333 181.333333 0 1 1 6.677334 7.424V960H261.696c-60.288 0-109.76-46.08-112.256-104.234667L149.333333 851.136V172.864c0-58.773333 47.936-106.368 107.626667-108.778667L261.696 64h500.608zM757.333333 661.333333a138.666667 138.666667 0 1 0 0 277.333334 138.666667 138.666667 0 0 0 0-277.333334z m26.816 8.192l33.642667 26.282667-25.450667 32.554667h43.52v42.666666H778.666667v24.384h69.845333v42.666667H778.666667V917.333333h-42.666667v-79.253333H661.333333v-42.666667h74.666667v-24.384h-57.216v-42.666666h43.52l-25.429333-32.554667 33.642666-26.282667 26.816 34.346667 26.816-34.346667zM426.666667 554.666667v42.666666h-192v-42.666666h192z m128-128v42.666666H234.666667v-42.666666h320z m170.666666-128v42.666666H234.666667v-42.666666h490.666666z" fill="#333333" p-id="4265"></path></svg>

+ 1 - 0
src/assets/icons/svg/retained.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M0 0h1024v1024H0z" fill="#FFFFFF" p-id="21415"></path><path d="M744.727273 325.818182a46.545455 46.545455 0 0 1 46.545454 46.545454v372.363637a46.545455 46.545455 0 0 1-46.545454 46.545454H279.272727a46.545455 46.545455 0 0 1-46.545454-46.545454V372.363636a46.545455 46.545455 0 0 1 46.545454-46.545454h465.454546z m-465.454546-46.545455a93.090909 93.090909 0 0 0-93.090909 93.090909v372.363637a93.090909 93.090909 0 0 0 93.090909 93.090909h465.454546a93.090909 93.090909 0 0 0 93.090909-93.090909V372.363636a93.090909 93.090909 0 0 0-93.090909-93.090909H279.272727z" fill="" p-id="21416"></path><path d="M349.090909 395.636364a23.272727 23.272727 0 0 1-23.272727-23.272728v-139.636363a23.272727 23.272727 0 1 1 46.545454 0v139.636363a23.272727 23.272727 0 0 1-23.272727 23.272728zM674.909091 395.636364a23.272727 23.272727 0 0 1-23.272727-23.272728v-139.636363a23.272727 23.272727 0 1 1 46.545454 0v139.636363a23.272727 23.272727 0 0 1-23.272727 23.272728z" fill="" p-id="21417"></path><path d="M666.903273 480.744727a23.272727 23.272727 0 0 0-32.837818 2.327273l-108.683637 125.184-36.002909-84.712727a46.545455 46.545455 0 0 0-78.033454-12.241455l-79.848728 92.253091a23.272727 23.272727 0 1 0 35.188364 30.440727l79.825454-92.229818 36.026182 84.689455a46.545455 46.545455 0 0 0 77.963637 12.311272l108.706909-125.207272a23.272727 23.272727 0 0 0-2.327273-32.814546z" fill="#E83743" p-id="21418"></path></svg>

+ 1 - 0
src/assets/icons/svg/roleList.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1667370987953" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="22484" width="48" height="48" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M848.6 170.9H175.1c-49.6 0-90 40.4-90 90v501.8c0 49.6 40.4 90 90 90h673.5c49.6 0 90-40.4 90-90V260.9c0-49.6-40.4-90-90-90z m30 591.8c0 16.5-13.5 30-30 30H175.1c-16.5 0-30-13.5-30-30V260.9c0-16.5 13.5-30 30-30h673.5c16.5 0 30 13.5 30 30v501.8zM500 570.2c42.4-30.1 70.2-79.7 70.2-135.5 0-91.6-74.5-166.1-166.1-166.1s-166.2 74.4-166.2 166c0 55.9 27.7 105.4 70.2 135.5-60.6 29.5-106.3 86.2-119.7 155.7-2.8 14.6 6.7 28.7 21.3 31.5 1.7 0.3 3.4 0.5 5.1 0.5 12.6 0 23.9-9 26.4-21.8 15-77.7 83.5-134.2 162.8-134.2 79.3 0 147.8 56.4 162.8 134.2 2.8 14.6 16.9 24.2 31.5 21.3 14.6-2.8 24.2-16.9 21.3-31.5-13.3-69.4-59-126.1-119.6-155.6z m-96-23.3c-61.9 0-112.3-50.4-112.3-112.3S342.1 322.4 404 322.4s112.3 50.4 112.3 112.3S465.9 546.9 404 546.9z m406.6-230.8H640.1c-13.8 0-25 11.2-25 25s11.2 25 25 25h170.4c13.8 0 25-11.2 25-25 0.1-13.8-11.1-25-24.9-25z m0 99.6H640.1c-13.8 0-25 11.2-25 25s11.2 25 25 25h170.4c13.8 0 25-11.2 25-25s-11.1-25-24.9-25z m0 106.2H640.1c-13.8 0-25 11.2-25 25s11.2 25 25 25h170.4c13.8 0 25-11.2 25-25s-11.1-25-24.9-25z" p-id="22485"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/roleManage.svg


+ 1 - 0
src/assets/icons/svg/shell.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M512 0C337.317647 0 120.470588 289.129412 120.470588 584.282353S295.152941 1024 512 1024 903.529412 879.43529401 903.529412 584.282353 686.682353 0 512 0z m313.223529 608.376471h-72.282353l-48.188235 126.494117c-6.023529 6.023529-6.023529 12.047059-18.070588 18.070588-18.070588 12.047059-48.188235 12.047059-60.235294-12.04705799L530.070588 602.352941H204.8c-12.047059 0-24.09411801-12.047059-24.09411801-24.094117s12.047059-24.09411801 24.09411801-24.09411801h343.341176L662.588235 722.823529l60.235294-156.611764h102.4c12.047059 0 24.09411801 12.047059 24.094118 24.09411701 0 6.023529-12.047059 18.070588-24.094118 18.07058899z" p-id="1640"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/stt.svg


+ 1 - 0
src/assets/icons/svg/subscribed.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M960 786.75L854.63 681.37a32 32 0 0 0-45.25 45.25L914.75 832h-805.5l118.63-118.63A95.37 95.37 0 0 0 256 645.49V416a256.05 256.05 0 0 1 392.66-216.52 256.89 256.89 0 0 1 92.75 102.76 32 32 0 0 0 57.31-28.48A320.28 320.28 0 0 0 608 110.69V96a96 96 0 0 0-192 0v14.6A320.44 320.44 0 0 0 192 416v229.49a31.79 31.79 0 0 1-9.37 22.63L64 786.75A64 64 0 0 0 109.25 896h214c14.87 72.94 79.51 128 156.78 128h64c77.27 0 141.92-55.06 156.78-128h214A64 64 0 0 0 960 786.75zM480 96a32 32 0 0 1 64 0v1.6Q528.11 96 512 96t-32 1.57V96z m64 864h-64a96.16 96.16 0 0 1-90.51-64h245A96.16 96.16 0 0 1 544 960z" p-id="6598"></path><path d="M768 416v64h-64a32 32 0 0 0 0 64h64v64a32 32 0 0 0 64 0v-64h64a32 32 0 0 0 0-64h-64v-64a32 32 0 0 0-64 0z" p-id="6599"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/system_iaa.svg


+ 1 - 0
src/assets/icons/svg/tencent_iaa.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M681.6768 268.9024a60.928 60.928 0 0 1 10.496 85.5552l-108.288 138.752-156.16 200.192a60.7232 60.7232 0 0 1-102.656-10.8032 61.0304 61.0304 0 0 1 6.7584-64.256l156.16-200.1408 108.288-138.752a60.7744 60.7744 0 0 1 85.4016-10.5472z m108.288 138.752a60.928 60.928 0 0 1 10.496 85.6064l-108.288 138.752-0.4608 0.512-47.4112 60.8256a60.7744 60.7744 0 0 1-102.7072-10.752c-10.1888-20.992-7.5264-45.9264 6.8096-64.256l47.872-61.3376 108.2368-138.8032a60.7744 60.7744 0 0 1 85.4528-10.496zM248.576 546.5088a60.928 60.928 0 0 1 10.496 85.5552l-47.872 61.3376a60.7232 60.7232 0 0 1-102.656-10.752 61.0304 61.0304 0 0 1 6.7584-64.256l47.872-61.3376a60.7744 60.7744 0 0 1 85.4016-10.5472z m649.6256 0a60.928 60.928 0 0 1 10.496 85.5552l-47.872 61.3376a60.7232 60.7232 0 0 1-102.656-10.752c-10.24-20.992-7.5776-45.9264 6.7584-64.256l47.872-61.3376a60.7744 60.7744 0 0 1 85.4016-10.5472z m-433.0496-277.504a60.928 60.928 0 0 1 10.4448 85.504l-113.408 145.408a60.7232 60.7232 0 0 1-102.7072-10.752c-10.1888-20.992-7.5776-45.9264 6.8096-64.3072l113.408-145.408a60.7744 60.7744 0 0 1 85.4528-10.496z" p-id="3118"></path></svg>

+ 1 - 0
src/assets/icons/svg/tikTok.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M862.51879883 439.40783691c-69.21386719 0-136.53259278-22.49450684-191.90368653-64.1052246v290.28625488c0 148.23303223-114.20288086 268.28613281-255.10253905 268.28613281S160.41003418 813.82189942 160.41003418 665.58886719c0-148.23303223 114.20288086-268.28613281 255.10253907-268.28613281 14.08996583 0 27.76794434 1.23596192 41.116333 3.54309081v153.75366211c-12.77160645-5.02624512-26.3671875-7.58056641-40.04516602-7.5805664-62.8692627 0-113.87329102 53.55834961-113.87329101 119.72351074 0 66.08276367 51.00402833 119.72351075 113.87329101 119.72351075 62.78686523 0 113.79089356-53.64074708 113.79089356-119.72351075V90.125H672.67504883c0 110.82458497 85.446167 200.63781739 190.83251953 200.63781739v148.56262206l-0.98876953 0.08239747" fill="" p-id="4301"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/trend.svg


+ 1 - 0
src/assets/icons/svg/weChatData.svg

@@ -0,0 +1 @@
+<svg viewBox="64 64 896 896" focusable="false" data-icon="fund-view" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M995.837 449.01L900 353.173V217.686c0-50.237-40.725-90.958-90.962-90.958H673.552l-95.838-95.836c-35.407-35.413-93.08-35.413-128.704 0l-95.837 95.836H217.687a90.958 90.958 0 0 0-90.958 90.957v135.488L30.893 449.01c-35.414 35.409-35.414 93.08 0 128.703l95.836 95.838v135.487a90.952 90.952 0 0 0 26.64 64.316 90.954 90.954 0 0 0 64.318 26.644h135.486l95.837 95.838c35.409 35.409 93.08 35.409 128.704 0l95.838-95.838h135.486a90.95 90.95 0 0 0 64.317-26.644A90.948 90.948 0 0 0 900 809.038V673.551l95.837-95.838a90.852 90.852 0 0 0 0-128.703z m-248.286-26.078L452.192 672.916c-8.271 6.993-18.661 10.81-29.469 10.81-1.274 0-2.549 0-4.031-0.21-12.088-1.059-23.321-6.785-30.958-16.113L274.088 531.065c-16.112-19.294-13.57-47.915 5.724-64.034 19.296-16.115 47.917-13.356 64.029 5.73l84.39 101.137 260.584-220.512c19.296-16.113 47.921-13.785 64.035 5.301 16.324 19.294 13.991 48.132-5.299 64.245z m0 0" fill="currentColor" p-id="9123"></path></svg>

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
src/assets/icons/svg/weCom.svg


+ 70 - 38
src/layout/index.vue

@@ -1,9 +1,10 @@
 <template>
   <div :class="classObj" class="app-wrapper">
-    <div v-if="device==='mobile'&&sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
+    <div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
+    <div></div>
     <sidebar class="sidebar-container" />
-    <div :class="{hasTagsView:needTagsView}" class="main-container">
-      <div :class="{'fixed-header':fixedHeader}">
+    <div :class="{ hasTagsView: needTagsView }" class="main-container">
+      <div :class="{ 'fixed-header': fixedHeader }">
         <navbar />
         <tags-view v-if="needTagsView" />
       </div>
@@ -64,55 +65,86 @@ export default {
   methods: {
     handleClickOutside() {
       this.$store.dispatch('app/closeSideBar', { withoutAnimation: false })
+    },
+    canvas(dom, txt) {
+      if (!dom) return false;
+      let length = txt?.length * 50 > 247 ? txt?.length * 50 : 247; // 根据内容生成画布大小,20代表比例
+      let canvas = document.createElement('canvas');
+      canvas.id = 'myCanvas'
+      canvas.width = length;
+      canvas.id = 'myCanvas'
+      canvas.height = 150;
+      canvas.style.display = 'none';
+      document.body.appendChild(canvas);
+      let context = canvas.getContext('2d');
+      canvas.style.letterSpacing = 3 + 'px';
+      context.font = '30px "PingFangSC", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif';
+      context.fillStyle = 'rgba(255,0,0,0.06)';
+      context.rotate((-13 * Math.PI) / 80); // 画布里面文字的旋转角度
+      context.fillText(txt, (length - txt.length * 13) / 2, length / 2 + 20); // 文字的位置
+      dom.style.backgroundImage = `url(${canvas.toDataURL('image/png')})`;
+      return;
     }
   },
   created() {
     // 刷新页面后重新从服务器加载用户信息
-    this.$store.dispatch('GetInfo');
+    this.$store.dispatch('GetInfo').then(res => {
+      let div = document.createElement('div');
+      div.style = `width: 100%; height: 100%; position: fixed; left: 0px; top: 0px; z-index: 10000; pointer-events: none; background-color:rgba(0,0,0,.03); background-repeat: round;`;
+      this.$nextTick(() => {
+        let main = document.getElementById('app');
+        if (main) {
+          main.appendChild(div);
+          this.canvas(div, res.data.userInfo.nickname);
+          let myCanvas = document.getElementById('myCanvas')
+          document.body.removeChild(myCanvas)
+        }
+      })
+    });
   }
 }
 </script>
 
 <style lang="scss" scoped>
-  @import "~@/assets/styles/mixin.scss";
-  @import "~@/assets/styles/variables.scss";
-
-  .app-wrapper {
-    @include clearfix;
-    position: relative;
-    height: 100%;
-    width: 100%;
+@import "~@/assets/styles/mixin.scss";
+@import "~@/assets/styles/variables.scss";
 
-    &.mobile.openSidebar {
-      position: fixed;
-      top: 0;
-    }
-  }
+.app-wrapper {
+  @include clearfix;
+  position: relative;
+  height: 100%;
+  width: 100%;
 
-  .drawer-bg {
-    background: #000;
-    opacity: 0.3;
-    width: 100%;
-    top: 0;
-    height: 100%;
-    position: absolute;
-    z-index: 999;
-  }
-
-  .fixed-header {
+  &.mobile.openSidebar {
     position: fixed;
     top: 0;
-    right: 0;
-    z-index: 9;
-    width: calc(100% - #{$sideBarWidth});
-    transition: width 0.28s;
   }
+}
 
-  .hideSidebar .fixed-header {
-    width: calc(100% - 54px)
-  }
+.drawer-bg {
+  background: #000;
+  opacity: 0.3;
+  width: 100%;
+  top: 0;
+  height: 100%;
+  position: absolute;
+  z-index: 999;
+}
 
-  .mobile .fixed-header {
-    width: 100%;
-  }
+.fixed-header {
+  position: fixed;
+  top: 0;
+  right: 0;
+  z-index: 9;
+  width: calc(100% - #{$sideBarWidth});
+  transition: width 0.28s;
+}
+
+.hideSidebar .fixed-header {
+  width: calc(100% - 54px)
+}
+
+.mobile .fixed-header {
+  width: 100%;
+}
 </style>

+ 10 - 0
src/router/index.js

@@ -75,6 +75,16 @@ export const constantRoutes = [
     component: (resolve) => require(['@/views/ad'], resolve),
     hidden: true
   },
+  {
+    path: '/corpDoAuth',
+    component: (resolve) => require(['@/views/corpDoAuth'], resolve),
+    hidden: true
+  },
+  {
+    path: '/ttAdCode',
+    component: (resolve) => require(['@/views/ttAd'], resolve),
+    hidden: true
+  },
   {
     path: '/user',
     component: Layout,

+ 1 - 1
src/store/modules/user.js

@@ -155,7 +155,7 @@ const user = {
         dispatch('GetInfo')
         resolve();
       })
-    },
+    }
   }
 };
 

+ 19 - 0
src/utils/const.js

@@ -0,0 +1,19 @@
+export const channelList = [
+    { label: 'MP', value: 'MP' },
+    { label: 'GDT', value: 'GDT' },
+    { label: '头条', value: '头条' },
+    { label: '企微', value: '企微' },
+    { label: '混投', value: '混投' },
+    { label: 'ADQ企微', value: 'ADQ企微' },
+    { label: '头条企微', value: '头条企微' },
+    { label: 'MP企微', value: 'MP企微' },
+    { label: 'ADQ公众号', value: 'ADQ公众号' },
+    { label: '直投小程序', value: '直投小程序' },
+    { label: '公众号洗粉', value: '公众号洗粉' },
+    { label: '企微洗粉', value: '企微洗粉' },
+    { label: '公众号小说内推', value: '公众号小说内推' },
+    { label: '公众号短剧内推', value: '公众号短剧内推' },
+    { label: '企微小说内推', value: '企微小说内推' },
+    { label: '企微短剧内推', value: '企微短剧内推' },
+    { label: '腾讯IAA', value: '腾讯IAA' }
+]

+ 20 - 0
src/utils/index.js

@@ -89,6 +89,26 @@ export function getQueryObject(url) {
   return obj
 }
 
+
+/**
+ * 腾讯授权
+ * @param {string} url
+ * @returns {Object}
+ */
+export function getQueryObjectSearch() {
+  const search = window.location.search
+  const obj = {}
+  const reg = /([^?&=]+)=([^?&=]*)/g
+  search.replace(reg, (rs, $1, $2) => {
+    const name = decodeURIComponent($1)
+    let val = decodeURIComponent($2)
+    val = String(val)
+    obj[name] = val
+    return rs
+  })
+  return obj
+}
+
 /**
  * @param {string} input value
  * @returns {number} output value

+ 25 - 10
src/views/accounts/account/components/changeRecord.vue

@@ -5,8 +5,8 @@
             <div class="cut">
                 <el-button class="button" type="primary" icon="el-icon-plus" size="mini" @click="handleCutRecord">插入起始记录</el-button>
                 <el-table :data="cutData" size="mini">
-                    <el-table-column label="开始时间" prop="beginTime" align="center" width="90"/>
-                    <el-table-column label="结束时间" prop="endTime" align="center" width="90"/>
+                    <el-table-column label="开始时间" prop="beginTime" align="center" width="90" fixed="left"/>
+                    <el-table-column label="结束时间" prop="endTime" align="center" width="90" fixed="left"/>
                     <el-table-column label="资源名称" prop="resourceName" :show-overflow-tooltip="true" align="center" width="100">
                         <template slot-scope="scope" v-if="scope.row.resourceInfo">
                             <span>{{scope.row.resourceInfo.resourceName}}</span>
@@ -57,6 +57,13 @@
                             <div>{{ scope.row.platformInfo.platformName }}</div>
                         </template>
                     </el-table-column>
+                    <el-table-column prop="backCoefficient" label="回本系数" width="100" align="center">
+                        <template slot-scope="scope">
+                            <div>
+                                {{ scope.row.backCoefficient }}
+                            </div>
+                        </template>
+                    </el-table-column>
                     <el-table-column prop="createUser" label="操作人" width="90" :show-overflow-tooltip="true" align="center">
                         <template slot-scope="scope" v-if="scope.row.createUser">
                             <div>{{ scope.row.createUser.nickname }}</div>
@@ -137,15 +144,16 @@
                 </el-form-item>
                 <el-form-item label="投放渠道" prop="putChannel">
                     <el-select v-model="queryPlatformCutRecord.putChannel" size="small" placeholder="选择投放渠道" filterable style="width: 140px" clearable>
-                        <el-option label="MP" value="MP" />
-                        <el-option label="GDT" value="GDT" />
-                        <el-option label="头条" value="头条" />
-                        <el-option label="企微" value="企微" />
+                        <el-option :label="item.label" :value="item.value" :key="item.value" v-for="item in channelList"/>
                     </el-select>
                 </el-form-item>
                 <el-form-item label="充值模板" prop="rechargeTemplate">
                     <el-input v-model="queryPlatformCutRecord.rechargeTemplate" size="small" style="width: 140px" placeholder="输入充值模板" />
                 </el-form-item>
+                <el-form-item label="回本系数" prop="backCoefficient">
+                    <el-input-number v-model="queryPlatformCutRecord.backCoefficient" size="small" :min="0" :max="1"
+                        style="width: 140px" :step="0.1" placeholder="输入回本系数" />
+                </el-form-item>
             </el-form>
             <span slot="footer" class="dialog-footer">
                 <el-button @click="editCutShow = false">取 消</el-button>
@@ -158,12 +166,14 @@
 <script>
 import { gitCutRecordList, delCutRecord, insertCutRecord, editCutRecord } from "@/api/accounts/account";
 import { getBookAcc } from "@/api/system/books";
+import { channelList } from "@/utils/const.js";
 export default {
     data () {
         return {
             cutData: [],
             cutTitle: '',
             showCut: false,
+            channelList: channelList,
             cutQueryPlatForm: {
                 pageNum: 1,
                 pageSize: 10
@@ -174,6 +184,9 @@ export default {
             rulesCut: {
                 beginTime: [
                     { required: true, message: '请选择开始时间', trigger: 'change' }
+                ],
+                backCoefficient: [
+                    { required: true, message: '请选择回本系数', trigger: 'change' }
                 ]
             },
             totalCut: 0,
@@ -263,7 +276,7 @@ export default {
         },
         /** 新增记录 */
         handleCutRecord() {
-            const { id, businessGroupId, putUserId, operUserId, periodId, platformId, platformAccountId, bookId, putStatus, putChannel, rechargeTemplate } = this.resourceData
+            const { id, businessGroupId, putUserId, operUserId, periodId, backCoefficient, platformId, platformAccountId, bookId, putStatus, putChannel, rechargeTemplate } = this.resourceData
             this.editCutTitle = '插入起始记录'
             this.editCutShow = true
             this.queryPlatformCutRecord = {
@@ -277,7 +290,8 @@ export default {
                 bookId,
                 putStatus,
                 putChannel,
-                rechargeTemplate
+                rechargeTemplate,
+                backCoefficient
             }
         },
         /** 向后插入 */
@@ -291,7 +305,7 @@ export default {
             if(item.endTime) {
                 item.endTime = item.endTime.split(' ')[0]
             }
-            const { beginTime, endTime, id, resourceId, businessGroupId, operUserId, putUserId, periodId, platformId, platformAccountId, bookId, putStatus, putChannel, rechargeTemplate } = item
+            const { beginTime, endTime, id, resourceId, businessGroupId, operUserId, putUserId, backCoefficient, periodId, platformId, platformAccountId, bookId, putStatus, putChannel, rechargeTemplate } = item
             if(type === '修改') {
                 data = {beginTime, endTime, id}
             } else {
@@ -309,7 +323,8 @@ export default {
                 bookId,
                 putStatus,
                 putChannel,
-                rechargeTemplate
+                rechargeTemplate,
+                backCoefficient
             }
             if(platformId) {
                 this.selectZh(platformId, platformAccountId)

+ 59 - 30
src/views/accounts/account/components/cutBook.vue

@@ -1,10 +1,12 @@
 <template>
     <el-button size="mini" type="text" @click="handleCutBook">
-        <span><i class="el-icon-sort"></i>切书切平台</span> 
+        <span><i class="el-icon-sort"></i>切书切平台</span>
         <el-dialog :title="title" :visible.sync="open" width="330px" append-to-body @close="addClose">
-            <el-form :model="queryPlatform" :rules="rules" ref="platFormCutBook" label-position="right" label-width="80px" :inline="true">
+            <el-form :model="queryPlatform" :rules="rules" ref="platFormCutBook" label-position="right" label-width="80px"
+                :inline="true">
                 <el-form-item label="开始时间" prop="beginTime">
-                    <el-date-picker v-model="queryPlatform.beginTime" size="small" style="width: 200px" format="yyyy-MM-dd" value-format="yyyy-MM-dd" type="date" placeholder="选择开始时间" />
+                    <el-date-picker v-model="queryPlatform.beginTime" size="small" style="width: 200px" format="yyyy-MM-dd"
+                        value-format="yyyy-MM-dd" type="date" placeholder="选择开始时间" />
                 </el-form-item>
                 <el-form-item label="期数" prop="periodId">
                     <el-select v-model="queryPlatform.periodId" size="small" placeholder="选择期数" filterable clearable>
@@ -12,12 +14,14 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item label="书城" prop="platformId">
-                    <el-select v-model="queryPlatform.platformId" @change="selectZh" size="small" placeholder="选择书城" filterable clearable>
+                    <el-select v-model="queryPlatform.platformId" @change="selectZh" size="small" placeholder="选择书城"
+                        filterable clearable>
                         <el-option v-for="item in bookCity" :key="item.id" :label="item.platformName" :value="item.id" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="账号" prop="platformAccountId">
-                    <el-select v-model="queryPlatform.platformAccountId" :disabled="!queryPlatform.platformId" size="small" placeholder="选择账号" filterable clearable>
+                    <el-select v-model="queryPlatform.platformAccountId" :disabled="!queryPlatform.platformId" size="small"
+                        placeholder="选择账号" filterable clearable>
                         <el-option v-for="item in accList" :key="item.id" :label="item.account" :value="item.id" />
                     </el-select>
                 </el-form-item>
@@ -27,8 +31,10 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item label="项目组" prop="businessGroupId">
-                    <el-select v-model="queryPlatform.businessGroupId" size="small" placeholder="选择项目组" filterable clearable>
-                        <el-option v-for="item in teamsList" :key="item.id" :label="item.businessGroupName" :value="item.id" />
+                    <el-select v-model="queryPlatform.businessGroupId" size="small" placeholder="选择项目组" filterable
+                        clearable>
+                        <el-option v-for="item in teamsList" :key="item.id" :label="item.businessGroupName"
+                            :value="item.id" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="投放状态" prop="putStatus">
@@ -41,15 +47,16 @@
                 </el-form-item>
                 <el-form-item label="投放渠道" prop="putChannel">
                     <el-select v-model="queryPlatform.putChannel" size="small" placeholder="选择投放渠道" filterable>
-                        <el-option label="MP" value="MP" />
-                        <el-option label="GDT" value="GDT" />
-                        <el-option label="头条" value="头条" />
-                        <el-option label="企微" value="企微" />
+                        <el-option :label="item.label" :value="item.value" :key="item.value" v-for="item in channelList" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="充值模板" prop="rechargeTemplate">
                     <el-input v-model="queryPlatform.rechargeTemplate" size="small" placeholder="输入充值模板" />
                 </el-form-item>
+                <el-form-item label="回本系数" prop="backCoefficient">
+                    <el-input-number v-model="queryPlatform.backCoefficient" size="small" :min="0" :max="1"
+                        style="width: 140px" :step="0.1" placeholder="输入回本系数" />
+                </el-form-item>
                 <el-form-item label="备注" prop="remark">
                     <el-input v-model="queryPlatform.remark" type="textarea" size="small" placeholder="输入备注" />
                 </el-form-item>
@@ -65,16 +72,38 @@
 import { getBookAcc } from "@/api/system/books";
 import { cutBookPlatform, checkTime } from "@/api/accounts/account";
 import { formatDateYMD } from "@/utils"
+import { channelList } from "@/utils/const.js"
 export default {
-    data () {
+    data() {
         return {
             title: '',
             open: false,
+            channelList: channelList,
             accList: [],  // 账号
-            queryPlatform: {},
+            queryPlatform: {
+                backCoefficient: 1
+            },
             rules: {
                 beginTime: [
                     { required: true, message: '请选择开始时间', trigger: 'blur' }
+                ],
+                periodId: [
+                    { required: true, message: '请选择期数', trigger: 'blur' }
+                ],
+                platformId: [
+                    { required: true, message: '请选择书城', trigger: 'blur' }
+                ],
+                bookId: [
+                    { required: true, message: '请选择书', trigger: 'blur' }
+                ],
+                businessGroupId: [
+                    { required: true, message: '请选择项目组', trigger: 'blur' }
+                ],
+                putChannel: [
+                    { required: true, message: '请选择投放渠道', trigger: 'blur' }
+                ],
+                backCoefficient: [
+                    { required: true, message: '请选择回本系数', trigger: 'blur' }
                 ]
             }
         }
@@ -104,17 +133,17 @@ export default {
     methods: {
         handleCutBook() {
             this.title = this.value.resourceName + '切书切平台'
-            const { periodId, platformId, platformAccountId, bookId, id, businessGroupId, putStatus, putChannel, rechargeTemplate } = this.value
-            this.queryPlatform = { periodId, platformId, platformAccountId, bookId, resourceId: id, beginTime: formatDateYMD(new Date()), businessGroupId, putStatus, putChannel, rechargeTemplate }
+            const { periodId, platformId, platformAccountId, bookId, id, businessGroupId, putStatus, putChannel, rechargeTemplate, backCoefficient } = this.value
+            this.queryPlatform = { periodId, platformId, platformAccountId, backCoefficient, bookId, resourceId: id, beginTime: formatDateYMD(new Date()), businessGroupId, putStatus, putChannel, rechargeTemplate }
             this.open = true
-            if(platformId) {
+            if (platformId) {
                 this.selectZh(platformId, platformAccountId)
             }
         },
         /** 关闭弹窗调用 */
         addClose() {
             this.open = false
-            this.queryPlatform = {}
+            this.queryPlatform = { backCoefficient: 1 }
         },
         selectZh(e, id) {
             this.queryPlatform.platformAccountId = id || null
@@ -149,16 +178,16 @@ export default {
 </script>
 
 <style>
-    .cutBook{
-        display: inline;
-        line-height: normal;
-    }
-    .dropdownItem {
-        cursor: pointer;
-        color: #409EFF;
-        font-size: 12px;
-        padding: 4px 0;
-        display: inline;
-        line-height: normal;
-    }
-</style>
+.cutBook {
+    display: inline;
+    line-height: normal;
+}
+
+.dropdownItem {
+    cursor: pointer;
+    color: #409EFF;
+    font-size: 12px;
+    padding: 4px 0;
+    display: inline;
+    line-height: normal;
+}</style>

+ 366 - 331
src/views/accounts/account/index.vue

@@ -2,33 +2,42 @@
     <div class="app-container" ref='appFull' style="background: #fff;">
         <el-form :model="queryParams" ref="queryParams" v-show="showSearch" :inline="true">
             <el-form-item>
-                <el-select v-model="queryParams.userId" size="small" placeholder="选择用户" filterable style="width: 140px" clearable>
+                <el-select v-model="queryParams.userId" size="small" placeholder="选择用户" filterable style="width: 140px"
+                    clearable>
                     <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id" />
                 </el-select>
             </el-form-item>
             <el-form-item>
-                <el-select v-model="queryParams.resourceTag" size="small" :disabled="!queryParams.userId" placeholder="角色标签" filterable style="width: 100px" clearable>
-                    <el-option v-for="(item, index) in tagAll" :key="index" :label="item.resourceTag" :value="item.resourceTag" />
+                <el-select v-model="queryParams.resourceTag" size="small" :disabled="!queryParams.userId" placeholder="角色标签"
+                    filterable style="width: 100px" clearable>
+                    <el-option v-for="(item, index) in tagAll" :key="index" :label="item.resourceTag"
+                        :value="item.resourceTag" />
                 </el-select>
             </el-form-item>
             <el-form-item label="" prop="resourceName">
-                <el-input v-model="queryParams.resourceName" placeholder="请输入资源名称" clearable size="small" style="width: 150px" @keyup.enter.native="handleQuery" />
+                <el-input v-model="queryParams.resourceName" placeholder="请输入资源名称" clearable size="small"
+                    style="width: 150px" @keyup.enter.native="handleQuery" />
             </el-form-item>
             <el-form-item label="" prop="resourceKey">
-                <el-input v-model="queryParams.resourceKey" placeholder="请输入资源标识" clearable size="small" style="width: 150px" @keyup.enter.native="handleQuery" />
+                <el-input v-model="queryParams.resourceKey" placeholder="请输入资源标识" clearable size="small"
+                    style="width: 150px" @keyup.enter.native="handleQuery" />
             </el-form-item>
             <el-form-item label="" prop="resourceGroupId">
-                <el-select v-model="queryParams.resourceGroupId" placeholder="资源分组" clearable filterable style="width: 140px" size="small">
+                <el-select v-model="queryParams.resourceGroupId" placeholder="资源分组" clearable filterable
+                    style="width: 140px" size="small">
                     <el-option v-for="dict in groupingData" :key="dict.id" :label="dict.groupName" :value="dict.id" />
                 </el-select>
             </el-form-item>
             <el-form-item prop="resourceType">
-                <el-select style="width: 140px" v-model="queryParams.resourceType" placeholder="资源类型" filterable clearable size="small">
-                    <el-option v-for="item in resourceTypes" :key="item.value" :label="item.label" :value="item.value"></el-option>
+                <el-select style="width: 140px" v-model="queryParams.resourceType" placeholder="资源类型" filterable clearable
+                    size="small">
+                    <el-option v-for="item in resourceTypes" :key="item.value" :label="item.label"
+                        :value="item.value"></el-option>
                 </el-select>
             </el-form-item>
             <el-form-item prop="resourceType">
-                <el-select v-model="queryParams.businessGroupId" size="small" placeholder="选择项目组" filterable style="width: 140px" clearable>
+                <el-select v-model="queryParams.businessGroupId" size="small" placeholder="选择项目组" filterable
+                    style="width: 140px" clearable>
                     <el-option v-for="item in teamsList" :key="item.id" :label="item.businessGroupName" :value="item.id" />
                 </el-select>
             </el-form-item>
@@ -45,32 +54,16 @@
             <el-col :span="1.5">
                 <el-button type="success" icon="el-icon-refresh" size="mini" @click="handleRefresh">刷新服务器缓存</el-button>
             </el-col>
-            <el-col :span="1.5">
-                <el-button type="danger" icon="el-icon-delete-solid" size="mini" :disabled="delIds.length == 0" @click="handleDel">删除</el-button>
-            </el-col>
-            <!-- <el-col :span="1.5">
-                <el-button
-                    type="info"
-                    icon="el-icon-upload2"
-                    size="mini"
-                    @click="handleImport"
-                    >导入</el-button>
-            </el-col> -->
             <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
         </el-row>
 
-        <el-table 
-            :data="accountList" 
-            size="mini" 
-            v-loading="loading"
-            @selection-change="handleSelectionChange"
-        >
-            <el-table-column type="selection" width="50" align="center" fixed="left"/>
-            <el-table-column label="资源名称" prop="resourceName" :show-overflow-tooltip="true" width="120" fixed="left"/>
-            <el-table-column label="资源标识" prop="resourceKey" :show-overflow-tooltip="true" width="150" fixed="left"/>
+        <el-table :data="accountList" size="mini" v-loading="loading" @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="50" align="center" fixed="left" />
+            <el-table-column label="资源名称" prop="resourceName" :show-overflow-tooltip="true" width="120" fixed="left" />
+            <el-table-column label="资源标识" prop="resourceKey" :show-overflow-tooltip="true" width="150" fixed="left" />
             <el-table-column label="项目组" prop="businessGroupInfo" width="80" :show-overflow-tooltip="true" align="center">
                 <template slot-scope="scope" v-if="scope.row.businessGroupInfo">
-                    <span>{{scope.row.businessGroupInfo.businessGroupName}}</span>
+                    <span>{{ scope.row.businessGroupInfo.businessGroupName }}</span>
                 </template>
             </el-table-column>
             <el-table-column prop="operUserInfo" width="100" align="center" label="运营">
@@ -87,7 +80,7 @@
                 <template slot-scope="scope" v-if="scope.row.putUserInfo">
                     <el-popover :width="200" trigger="hover" placement="top" :title="scope.row.putUserInfo.nickname">
                         <div style="color: rgb(136, 136, 136); font-size: 13px">
-                        电话:{{ scope.row.putUserInfo.phone }}
+                            电话:{{ scope.row.putUserInfo.phone }}
                         </div>
                         <div slot="reference">{{ scope.row.putUserInfo.nickname }}</div>
                     </el-popover>
@@ -105,16 +98,27 @@
             </el-table-column> -->
             <el-table-column label="资源类型" prop="resourceType" align="center" width="150">
                 <template slot-scope="scope">
-                    <el-tag size="mini" :type="resourceTypes[0].type" v-if="scope.row.resourceType === 0">{{resourceTypes[0].label}}</el-tag>
-                    <el-tag size="mini" :type="resourceTypes[1].type" v-if="scope.row.resourceType === 1">{{resourceTypes[1].label}}</el-tag>
-                    <el-tag size="mini" :type="resourceTypes[2].type" v-if="scope.row.resourceType === 3">{{resourceTypes[2].label}}</el-tag>
-                    <el-tag size="mini" :type="resourceTypes[3].type" v-if="scope.row.resourceType === 10">{{resourceTypes[3].label}}</el-tag>
-                    <el-tag size="mini" :type="resourceTypes[4].type" v-if="scope.row.resourceType === 20">{{resourceTypes[4].label}}</el-tag>
+                    <el-tag size="mini" :type="resourceTypes[0].type" v-if="scope.row.resourceType === 0">{{
+                        resourceTypes[0].label }}</el-tag>
+                    <el-tag size="mini" :type="resourceTypes[1].type" v-if="scope.row.resourceType === 1">{{
+                        resourceTypes[1].label }}</el-tag>
+                    <el-tag size="mini" :type="resourceTypes[2].type" v-if="scope.row.resourceType === 3">{{
+                        resourceTypes[2].label }}</el-tag>
+                    <el-tag size="mini" :type="resourceTypes[3].type" v-if="scope.row.resourceType === 10">{{
+                        resourceTypes[3].label }}</el-tag>
+                    <el-tag size="mini" :type="resourceTypes[4].type" v-if="scope.row.resourceType === 20">{{
+                        resourceTypes[4].label }}</el-tag>
+                    <el-tag size="mini" :type="resourceTypes[5].type" v-if="scope.row.resourceType === 4">{{
+                        resourceTypes[5].label }}</el-tag>
+                    <el-tag size="mini" :type="resourceTypes[6].type" v-if="scope.row.resourceType === 5">{{
+                        resourceTypes[6].label }}</el-tag>
+                    <el-tag size="mini" :type="resourceTypes[7].type" v-if="scope.row.resourceType === 30">{{
+                        resourceTypes[7].label }}</el-tag>
                 </template>
             </el-table-column>
             <el-table-column label="所属分组" prop="groupInfo" width="120" align="center">
                 <template slot-scope="scope">
-                    <span v-if="scope.row.groupInfo">{{scope.row.groupInfo.groupName}}</span>
+                    <span v-if="scope.row.groupInfo">{{ scope.row.groupInfo.groupName }}</span>
                     <span v-else></span>
                 </template>
             </el-table-column>
@@ -128,7 +132,7 @@
                 </template>
             </el-table-column>
             <el-table-column label="投放渠道" prop="putChannel" align="center" width="80" />
-            <el-table-column label="期数"  prop="periodInfo" width="100" align="center">
+            <el-table-column label="期数" prop="periodInfo" width="100" align="center">
                 <template slot-scope="scope" v-if="scope.row.periodInfo">
                     <div>
                         {{ scope.row.periodInfo.period }}
@@ -164,6 +168,13 @@
                     </div>
                 </template>
             </el-table-column>
+            <el-table-column prop="backCoefficient" label="回本系数" width="100" align="center">
+                <template slot-scope="scope">
+                    <div>
+                        {{ scope.row.backCoefficient }}
+                    </div>
+                </template>
+            </el-table-column>
             <el-table-column label="账号" prop="platformAccountInfo" width="300">
                 <template slot-scope="scope">
                     <div v-if="scope.row.platformAccountInfo && scope.row.platformAccountInfo.account">
@@ -178,7 +189,7 @@
                     </div>
                 </template>
             </el-table-column>
-            <el-table-column label="创建时间" prop="createTime" width="135"/>
+            <el-table-column label="创建时间" prop="createTime" width="135" />
             <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="120">
                 <template slot-scope="scope">
                     <!-- <div class="Space"></div> -->
@@ -186,126 +197,138 @@
                         <div>
                             <el-row type="flex" justify="space-between" class="grouping">
                                 <span>移动至</span>
-                                <el-button
-                                    size="mini"
-                                    type="text"
-                                    :icon="gVis ? 'el-icon-close' : 'el-icon-plus'"
-                                    @click="handleGAdd"
-                                >{{gVis ? '取消' : '新增'}}</el-button>
+                                <el-button size="mini" type="text" :icon="gVis ? 'el-icon-close' : 'el-icon-plus'"
+                                    @click="handleGAdd">{{ gVis ? '取消' : '新增' }}</el-button>
                             </el-row>
-                            
+
                             <div v-show="gVis">
                                 <div class="Space"></div>
                                 <el-input placeholder="请输入内容" v-model="groupValue" class="input-with-select" size="mini">
                                     <el-button slot="append" type="primary" @click="handleAddGroup">添加</el-button>
                                 </el-input>
                             </div>
-                            
+
                             <ul class="groupingNames">
                                 <li v-for="gItem in groupingData" :key="gItem.id">
                                     <template v-if="!gItem.isUpdata">
                                         <div class="gnTxt" v-if="scope.row.groupInfo && scope.row.groupInfo.id == gItem.id">
-                                            <span style="color: red">*</span>{{gItem.groupName}}
+                                            <span style="color: red">*</span>{{ gItem.groupName }}
                                         </div>
                                         <div class="gnTxt" v-else>
-                                            {{gItem.groupName}}
+                                            {{ gItem.groupName }}
                                         </div>
-                                        <div class="gnBts gnnone" v-if="!scope.row.groupInfo || scope.row.groupInfo.id != gItem.id"  @click.stop.prevent="editAccountGroup(scope.row.id, gItem.id)">
+                                        <div class="gnBts gnnone"
+                                            v-if="!scope.row.groupInfo || scope.row.groupInfo.id != gItem.id"
+                                            @click.stop.prevent="editAccountGroup(scope.row.id, gItem.id)">
                                             <el-row type="flex" justify="space-around" align="middle" class="bts">
-                                                <el-button size="mini" type="text" icon="el-icon-edit" style="color: #409EFF" @click.stop="handleGUpdata(gItem.id)"></el-button>
+                                                <el-button size="mini" type="text" icon="el-icon-edit"
+                                                    style="color: #409EFF"
+                                                    @click.stop="handleGUpdata(gItem.id)"></el-button>
                                                 <el-popconfirm title="确定删除该分组?" @confirm="handleGroupDel(gItem.id)">
-                                                    <el-button slot="reference" size="mini" type="text" icon="el-icon-delete" style="color: red" @click.stop=""></el-button>
+                                                    <el-button slot="reference" size="mini" type="text"
+                                                        icon="el-icon-delete" style="color: red" @click.stop=""></el-button>
                                                 </el-popconfirm>
                                             </el-row>
                                         </div>
                                     </template>
                                     <template v-else>
-                                        <el-input placeholder="请输入内容" v-model="newGroupName" class="input-with-select" size="mini">
-                                            <el-button slot="append" type="primary" @click="handleGroupEdit(gItem.id, )">修改</el-button>
+                                        <el-input placeholder="请输入内容" v-model="newGroupName" class="input-with-select"
+                                            size="mini">
+                                            <el-button slot="append" type="primary"
+                                                @click="handleGroupEdit(gItem.id,)">修改</el-button>
                                         </el-input>
                                     </template>
                                 </li>
                             </ul>
                         </div>
-                        <el-button size="mini" type="text" icon="el-icon-folder-opened" slot="reference" >分组</el-button>
+                        <el-button size="mini" type="text" icon="el-icon-folder-opened" slot="reference">分组</el-button>
                     </el-popover>
                     <el-dropdown trigger="click" size="mini">
                         <span class="el-dropdown-link">
                             更多<i class="el-icon-arrow-down el-icon--right"></i>
                         </span>
                         <el-dropdown-menu slot="dropdown">
-                            <el-dropdown-item><change-record v-model="scope.row" :periodList="periodList" :bookCity="bookCity" :bookList="bookList" :teamsList="teamsList" :userAll="userAll" type="acc"/></el-dropdown-item>
-                            <el-dropdown-item><div class="dropdownItem" @click="handleEdit(scope.row)"><i class="el-icon-edit"></i>编辑</div></el-dropdown-item>
-                            <el-dropdown-item><div class="dropdownItem" @click="handleState(scope.row)"><i class="el-icon-s-check"></i> 指派</div></el-dropdown-item>
-                            <el-dropdown-item><cut-book v-model="scope.row" :periodList="periodList" :bookCity="bookCity" :bookList="bookList" @change="getList" :teamsList="teamsList"/></el-dropdown-item>
+                            <el-dropdown-item><change-record v-model="scope.row" :periodList="periodList"
+                                    :bookCity="bookCity" :bookList="bookList" :teamsList="teamsList" :userAll="userAll"
+                                    type="acc" /></el-dropdown-item>
+                            <el-dropdown-item>
+                                <div class="dropdownItem" @click="handleEdit(scope.row)"><i class="el-icon-edit"></i>编辑
+                                </div>
+                            </el-dropdown-item>
+                            <el-dropdown-item>
+                                <div class="dropdownItem" @click="handleState(scope.row)"><i class="el-icon-s-check"></i> 指派
+                                </div>
+                            </el-dropdown-item>
+                            <el-dropdown-item><cut-book v-model="scope.row" :periodList="periodList" :bookCity="bookCity"
+                                    :bookList="bookList" @change="getList" :teamsList="teamsList" /></el-dropdown-item>
                         </el-dropdown-menu>
                     </el-dropdown>
-                    
+
                 </template>
             </el-table-column>
         </el-table>
 
-        <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList"/>
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+            @pagination="getList" />
         <!-- 新增 编辑弹窗 -->
-        <el-dialog 
-            :title="isAdd ? '新增资源库' : '编辑资源库'" 
-            :visible.sync="openEdit" 
-            :width="isAdd ? '500px' : '640px'"
-            append-to-body
-            @close="addClose"
-        >
+        <el-dialog :title="isAdd ? '新增资源库' : '编辑资源库'" :visible.sync="openEdit" :width="isAdd ? '500px' : '640px'"
+            append-to-body @close="addClose">
             <el-form :model="queryPlatform" :rules="rules" ref="platForm" label-position="top" :inline="true">
                 <el-form-item label="开始时间" prop="beginTime" style="width: 100%">
-                    <el-date-picker v-model="queryPlatform.beginTime" size="small" format="yyyy-MM-dd" value-format="yyyy-MM-dd" type="date" placeholder="选择开始时间" />
+                    <el-date-picker v-model="queryPlatform.beginTime" size="small" format="yyyy-MM-dd"
+                        value-format="yyyy-MM-dd" type="date" placeholder="选择开始时间" />
                 </el-form-item>
                 <el-form-item label="资源名称" prop="resourceName" style="width: 140px">
-                    <el-input v-model="queryPlatform.resourceName" placeholder="输入资源名称"/>
+                    <el-input v-model="queryPlatform.resourceName" placeholder="输入资源名称" />
                 </el-form-item>
                 <el-form-item label="资源标识" prop="resourceKey" style="width: 140px">
-                    <el-input v-model="queryPlatform.resourceKey" placeholder="输入资源标识"/>
+                    <el-input v-model="queryPlatform.resourceKey" placeholder="输入资源标识" />
                 </el-form-item>
                 <el-form-item prop="resourceType" label="资源类型" style="width: 140px">
                     <el-select v-model="queryPlatform.resourceType" placeholder="资源类型" filterable clearable size="small">
-                        <el-option
-                            v-for="item in resourceTypes"
-                            :key="item.value"
-                            :label="item.label"
-                            :value="item.value">
+                        <el-option v-for="item in resourceTypes" :key="item.value" :label="item.label" :value="item.value">
                         </el-option>
                     </el-select>
                 </el-form-item>
                 <el-form-item label="资源分组" prop="resourceGroupId" style="width: 140px;">
                     <el-select v-model="queryPlatform.resourceGroupId" placeholder="资源分组" clearable filterable size="small">
-                        <el-option v-for="dict in groupingData" :key="dict.id" :label="dict.groupName" :value="dict.id"/>
+                        <el-option v-for="dict in groupingData" :key="dict.id" :label="dict.groupName" :value="dict.id" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="项目组" prop="businessGroupId" v-if="isAdd">
-                    <el-select v-model="queryPlatform.businessGroupId" size="small" placeholder="选择项目组" filterable style="width: 140px" clearable>
-                        <el-option v-for="item in teamsList" :key="item.id" :label="item.businessGroupName" :value="item.id" />
+                    <el-select v-model="queryPlatform.businessGroupId" size="small" placeholder="选择项目组" filterable
+                        style="width: 140px" clearable>
+                        <el-option v-for="item in teamsList" :key="item.id" :label="item.businessGroupName"
+                            :value="item.id" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="期数" prop="periodId" v-if="isAdd">
-                    <el-select v-model="queryPlatform.periodId" size="small" placeholder="选择期数" filterable style="width: 140px" clearable>
+                    <el-select v-model="queryPlatform.periodId" size="small" placeholder="选择期数" filterable
+                        style="width: 140px" clearable>
                         <el-option v-for="item in periodList" :key="item.id" :label="item.period" :value="item.id" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="书城" prop="platformId" v-if="isAdd">
-                    <el-select v-model="queryPlatform.platformId" @change="selectZh" size="small" placeholder="选择书城" filterable style="width: 140px" clearable>
+                    <el-select v-model="queryPlatform.platformId" @change="selectZh" size="small" placeholder="选择书城"
+                        filterable style="width: 140px" clearable>
                         <el-option v-for="item in bookCity" :key="item.id" :label="item.platformName" :value="item.id" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="账号" prop="platformAccountId" v-if="isAdd">
-                    <el-select v-model="queryPlatform.platformAccountId" :disabled="!queryPlatform.platformId" size="small" placeholder="选择账号" filterable style="width: 140px" clearable>
+                    <el-select v-model="queryPlatform.platformAccountId" :disabled="!queryPlatform.platformId" size="small"
+                        placeholder="选择账号" filterable style="width: 140px" clearable>
                         <el-option v-for="item in accList" :key="item.id" :label="item.account" :value="item.id" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="书" prop="bookId" v-if="isAdd">
-                    <el-select v-model="queryPlatform.bookId" size="small" placeholder="选择书" filterable style="width: 140px" clearable>
+                    <el-select v-model="queryPlatform.bookId" size="small" placeholder="选择书" filterable style="width: 140px"
+                        clearable>
                         <el-option v-for="item in bookList" :key="item.id" :label="item.bookName" :value="item.id" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="投放状态" prop="putStatus" v-if="isAdd">
-                    <el-select v-model="queryPlatform.putStatus" size="small" placeholder="选择投放状态" filterable style="width: 140px" clearable>
+                    <el-select v-model="queryPlatform.putStatus" size="small" placeholder="选择投放状态" filterable
+                        style="width: 140px" clearable>
                         <el-option label="待投放" value="wait" />
                         <el-option label="投放中" value="ing" />
                         <el-option label="停投" value="stop" />
@@ -313,15 +336,18 @@
                     </el-select>
                 </el-form-item>
                 <el-form-item label="投放渠道" prop="putChannel" v-if="isAdd">
-                    <el-select v-model="queryPlatform.putChannel" size="small" placeholder="选择投放渠道" filterable style="width: 140px" clearable>
-                        <el-option label="MP" value="MP" />
-                        <el-option label="GDT" value="GDT" />
-                        <el-option label="头条" value="头条" />
-                        <el-option label="企微" value="企微" />
+                    <el-select v-model="queryPlatform.putChannel" size="small" placeholder="选择投放渠道" filterable
+                        style="width: 140px" clearable>
+                        <el-option :label="item.label" :value="item.value" :key="item.value" v-for="item in channelList" />
                     </el-select>
                 </el-form-item>
                 <el-form-item label="充值模板" prop="rechargeTemplate" v-if="isAdd">
-                    <el-input v-model="queryPlatform.rechargeTemplate" size="small" style="width: 140px" placeholder="输入充值模板" />
+                    <el-input v-model="queryPlatform.rechargeTemplate" size="small" style="width: 140px"
+                        placeholder="输入充值模板" />
+                </el-form-item>
+                <el-form-item label="回本系数" prop="backCoefficient" v-if="isAdd">
+                    <el-input-number v-model="queryPlatform.backCoefficient" size="small" :min="0" :max="1" style="width: 140px" :step="0.1"
+                        placeholder="输入回本系数" />
                 </el-form-item>
             </el-form>
             <span slot="footer" class="dialog-footer">
@@ -331,33 +357,22 @@
         </el-dialog>
 
         <!-- 指派 -->
-        <el-dialog 
-            title="指派用户" 
-            :visible.sync="openEditType" 
-            width="450px"
-            append-to-body
-        >
-            <el-form label-width="80px" label-position="top" ref="platFormTimeType" :model="timeData" :rules="rulesTimeType">
+        <el-dialog title="指派用户" :visible.sync="openEditType" width="450px" append-to-body>
+            <el-form label-width="80px" label-position="top" ref="platFormTimeType" :model="timeData"
+                :rules="rulesTimeType">
                 <el-form-item label="开始时间(修改运营和投手后必选)" prop="beginTime">
-                    <el-date-picker
-                        v-model="timeData.beginTime"
-                        type="date"
-                        format="yyyy-MM-dd"
-                        value-format="yyyy-MM-dd"
+                    <el-date-picker v-model="timeData.beginTime" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
                         placeholder="选择开始时间">
                     </el-date-picker>
                 </el-form-item>
             </el-form>
-            <el-form :model="item" :rules="rulesType" ref="platFormType" label-width="80px" label-position="top" v-for="(item, index) in queryPlatformType" :key="index">
+            <el-form :model="item" :rules="rulesType" ref="platFormType" label-width="80px" label-position="top"
+                v-for="(item, index) in queryPlatformType" :key="index">
                 <el-row :gutter="20">
                     <el-col :span="14">
-                        <el-form-item label="用户" prop="userId" >
+                        <el-form-item label="用户" prop="userId">
                             <el-select v-model="item.userId" placeholder="请选择" filterable style="width: 100%" clearable>
-                                <el-option
-                                    v-for="item in userAll"
-                                    :key="item.id"
-                                    :label="item.nickName"
-                                    :value="item.id">
+                                <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id">
                                 </el-option>
                             </el-select>
                         </el-form-item>
@@ -365,10 +380,7 @@
                     <el-col :span="6">
                         <el-form-item label="角色标签" prop="resourceTag">
                             <el-select v-model="item.resourceTag" placeholder="角色标签" filterable clearable>
-                                <el-option
-                                    v-for="(item1, index1) in tagAll"
-                                    :key="index1"
-                                    :label="item1.resourceTag"
+                                <el-option v-for="(item1, index1) in tagAll" :key="index1" :label="item1.resourceTag"
                                     :value="item1.resourceTag">
                                 </el-option>
                             </el-select>
@@ -399,32 +411,24 @@
                     </el-col> -->
                     <el-col :span="2">
                         <div style="margin-top: 42px">
-                            <el-button @click.prevent="removeResource(index)" type="text" icon="el-icon-delete" style="color: red; margin-left: 10px"></el-button>
+                            <el-button @click.prevent="removeResource(index)" type="text" icon="el-icon-delete"
+                                style="color: red; margin-left: 10px"></el-button>
                         </div>
                     </el-col>
                 </el-row>
             </el-form>
             <el-button type="text" icon="el-icon-plus" @click="addResource">新增用户</el-button>
             <span slot="footer" class="dialog-footer">
-                <el-button @click="queryPlatformType = [];openEditType = false">取 消</el-button>
+                <el-button @click="queryPlatformType = []; openEditType = false">取 消</el-button>
                 <el-button type="primary" @click="submitState('platFormType')">确 定</el-button>
             </span>
         </el-dialog>
 
         <!-- 公众号导入对话框 -->
         <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
-            <el-upload
-                ref="upload"
-                :limit="1"
-                accept=".xlsx, .xls"
-                :headers="upload.headers"
-                :action="upload.url + '?updateSupport=' + upload.updateSupport"
-                :disabled="upload.isUploading"
-                :on-progress="handleFileUploadProgress"
-                :on-success="handleFileSuccess"
-                :auto-upload="false"
-                drag
-            >
+            <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers"
+                :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading"
+                :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
                 <i class="el-icon-upload"></i>
                 <div class="el-upload__text">
                     将文件拖到此处,或
@@ -446,12 +450,15 @@
 </template>
 
 <script>
-import { getResourceList, addResource, delResource,
+import {
+    getResourceList, addResource,
     editResource, addGroup, getGroupAllList, refreshCache,
-    delGroup, editGroup, editAccountGroup, assignResourceUser, getRoleAll } from "@/api/accounts/account";
+    delGroup, editGroup, editAccountGroup, assignResourceUser, getRoleAll
+} from "@/api/accounts/account";
 import { allUser } from "@/api/system/user";
 import { getToken } from "@/utils/auth";
 import { Copy } from "@/utils";
+import { channelList } from "@/utils/const.js";
 import { getBusinessGroupAll } from "@/api/admin/teams";
 import { getPeriodAll } from "@/api/accounts/period";
 import { getBookPlatInfoAll } from "@/api/accounts/bookCity";
@@ -464,6 +471,7 @@ export default {
     data() {
         return {
             loading: false,
+            channelList: channelList,
             upload: {
                 // 是否显示弹出层(用户导入)
                 open: false,
@@ -506,11 +514,14 @@ export default {
                 }
             ],
             resourceTypes: [
-                {label: '公众号', value: 0, type: 'success'},
-                {label: '小程序', value: 1, type: 'danger'},
-                {label: '企业微信', value: 3, type: 'info'},
-                {label: '快应用', value: 10, type: 'warning'},
-                {label: '头条账号', value: 20, type: ''}
+                { label: '公众号', value: 0, type: 'success' },
+                { label: '小程序', value: 1, type: 'danger' },
+                { label: '企业微信', value: 3, type: 'info' },
+                { label: '快应用', value: 10, type: 'warning' },
+                { label: '头条账号', value: 20, type: '' },
+                { label: '企微号', value: 4, type: 'info' },
+                { label: '腾讯广告账号', value: 5, type: 'success' },
+                { label: '游戏渠道', value: 30, type: 'danger' }
             ],
             // 编辑弹窗
             openEdit: false,
@@ -521,7 +532,7 @@ export default {
             // 分组数据
             groupingData: [],
             isAdd: true,
-            queryPlatform: {},
+            queryPlatform: {backCoefficient: 1},
             rules: {
                 beginTime: [
                     { required: true, message: '请输入开始时间', trigger: 'blur' }
@@ -537,6 +548,9 @@ export default {
                 ],
                 putStatus: [
                     { required: true, message: '请选择投放状态', trigger: 'blur' }
+                ],
+                backCoefficient: [
+                    { required: true, message: '请选择回本系数', trigger: 'blur' }
                 ]
             },
             userAll: [], //所有用户
@@ -551,9 +565,9 @@ export default {
                 ]
             },
             state: [
-                {label: 1, value: '投放中'},
-                {label: 2, value: '停投'},
-                {label: 3, value: '已注销'}
+                { label: 1, value: '投放中' },
+                { label: 2, value: '停投' },
+                { label: 3, value: '已注销' }
             ],
             // 所有资源角色标签
             tagAll: [],
@@ -574,9 +588,21 @@ export default {
             },
         }
     },
-    mounted(){
+    mounted() {
         this.total = this.accountList.length
-        window.addEventListener('storage', (e) => {
+        window.addEventListener('storage', this.listener)
+    },
+    beforeDestroy() { // 在组件生命周期结束的时候销毁。
+        window.removeEventListener('storage', this.listener, false)
+    },
+    created() {
+        this.getAll()
+        this.getList()
+        this.getGroupList()
+        this.getCutXgData()
+    },
+    methods: {
+        listener(e) {
             if (e.key === 'code') {
                 if (e.newValue === 'ok') {
                     this.$router.go(0)
@@ -587,15 +613,7 @@ export default {
                     localStorage.removeItem('code')
                 }
             }
-        })
-    },
-    created() {
-        this.getAll()
-        this.getList()
-        this.getGroupList()
-        this.getCutXgData()
-    },
-    methods: {
+        },
         selectZh(e, id) {
             // 获取所有账号
             getBookAcc(e).then(res => {
@@ -639,7 +657,7 @@ export default {
         /** 刷新缓存 */
         handleRefresh() {
             refreshCache().then(res => {
-                if(res.data) {
+                if (res.data) {
                     this.msgSuccess('刷新成功');
                 }
             })
@@ -665,21 +683,21 @@ export default {
         /** 分组拉取 */
         handlePullHide() {
             this.gVis = false
-            this.groupingData = this.groupingData.map((gitem)=>{
+            this.groupingData = this.groupingData.map((gitem) => {
                 return { ...gitem, isUpdata: false }
             })
         },
         /** 分组新增 */
-        handleGAdd(){
+        handleGAdd() {
             this.gVis = !this.gVis
         },
         /** 分组修改 */
-        handleGUpdata(id){
-            this.groupingData = this.groupingData.map((gitem)=>{
-                if(id === gitem.id){
+        handleGUpdata(id) {
+            this.groupingData = this.groupingData.map((gitem) => {
+                if (id === gitem.id) {
                     this.newGroupName = gitem.groupName
                     return { ...gitem, isUpdata: true }
-                }else{
+                } else {
                     return { ...gitem, isUpdata: false }
                 }
             })
@@ -687,10 +705,10 @@ export default {
         /** 编辑按钮方法 */
         handleEdit(value) {
             console.log(value)
-            let { id, resourceKey, resourceName, bookId, rechargeTemplate, putChannel, putStatus, platformAccountId, platformId, resourceType, resourceGroupId, businessGroupId, periodId } = value
+            let { id, resourceKey, resourceName, bookId, rechargeTemplate, putChannel, putStatus, platformAccountId, platformId, resourceType, resourceGroupId, businessGroupId, periodId, backCoefficient } = value
             this.$nextTick(() => {
                 this.queryPlatform = Object.assign({}, {
-                    id, 
+                    id,
                     resourceKey,
                     resourceName,
                     resourceType,
@@ -702,7 +720,8 @@ export default {
                     bookId,
                     putStatus,
                     putChannel,
-                    rechargeTemplate
+                    rechargeTemplate,
+                    backCoefficient
                 }) // 给表单赋值
             })
             this.isAdd = false
@@ -720,10 +739,11 @@ export default {
         },
         /** 搜索 */
         handleQuery() {
+            this.queryParams.pageNum = 1
             this.getList()
         },
         /** 状态修改 */
-        handleState(value){
+        handleState(value) {
             if (value.userRelationList && value.userRelationList.length > 0) {
                 this.queryPlatformType = value.userRelationList.map(item => {
                     return {
@@ -749,23 +769,26 @@ export default {
         resetQuery() {
             this.queryParams = {
                 pageNum: 1,
-                pageSize: 15
+                pageSize: 10
             }
             this.getList()
         },
-        // 新增公众号
+        // 新增资源
         handleAdd() {
             this.isAdd = true
             this.openEdit = true
-            this.queryPlatform = {}
+            this.queryPlatform = { backCoefficient: 1 }
         },
         /** 新增 编辑 提交 */
         submit(formName) {
             this.$refs[formName].validate((valid) => {
                 if (valid) {
-                    if(this.isAdd){
-                        addResource(this.queryPlatform).then(response => {
-                            if(response.data){
+                    let params = this.queryPlatform
+                    params.resourceName = params.resourceName.replace(/\s/, '')
+                    params.resourceKey = params.resourceKey.replace(/\s/, '')
+                    if (this.isAdd) {
+                        addResource(params).then(response => {
+                            if (response.data) {
                                 this.msgSuccess("新增成功");
                                 this.resetForm("platForm");
                                 this.openEdit = false
@@ -773,9 +796,9 @@ export default {
                             }
                             this.addClose()
                         })
-                    }else{
-                        editResource(this.queryPlatform).then(response => {
-                            if(response.data){
+                    } else {
+                        editResource(params).then(response => {
+                            if (response.data) {
                                 this.msgSuccess("修改成功");
                                 this.resetForm("platForm");
                                 this.openEdit = false
@@ -791,7 +814,7 @@ export default {
         },
         /** 状态提交 */
         submitState(formName) {
-            
+
             this.$refs['platFormTimeType'].validate((valid) => {
                 if (valid) {
                     let state = this.$refs[formName].map(async item => {
@@ -799,9 +822,9 @@ export default {
                     })
 
                     Promise.all(state).then(res => {
-                        if(res.every(item => item)) {
+                        if (res.every(item => item)) {
                             assignResourceUser({ resourceId: this.resourceId, beginTime: this.timeData.beginTime, relationList: this.queryPlatformType }).then(response => {
-                                if(response.data){
+                                if (response.data) {
                                     this.msgSuccess("指派成功");
                                     // this.resetForm(formName);
                                     this.queryPlatformType = []
@@ -814,7 +837,7 @@ export default {
                     })
                 }
             })
-            
+
         },
         stateHandle(ref) {
             return new Promise((resolve) => {
@@ -825,24 +848,8 @@ export default {
         handleSelectionChange(selection) {
             this.delIds = selection.map((item) => item.id)
         },
-        // 删除
-        handleDel() {
-            this.$confirm('确定删除?', '删除', {
-                distinguishCancelAndClose: true,
-                confirmButtonText: '确定',
-                cancelButtonText: '取消'
-            }).then(() => {
-                delResource(this.delIds.toString()).then(res => {
-                    if(res.data) {
-                        this.msgSuccess('删除成功');
-                        this.getList()
-                    }
-                })
-            })
-            
-        },
         /** 时间转换 */
-        parserTime(time){
+        parserTime(time) {
             const d = new Date(time)
             const resDate = d.getFullYear() + '-' + this.p((d.getMonth() + 1)) + '-' + this.p(d.getDate())
             return resDate
@@ -852,18 +859,18 @@ export default {
         },
         /** 关闭弹窗调用 */
         addClose() {
-            if(!this.isAdd){
+            if (!this.isAdd) {
                 this.queryPlatform = {}
             }
         },
         /** 分组新政 */
         handleAddGroup() {
-            if(this.groupValue === ''){
+            if (this.groupValue === '') {
                 this.$message.error('请输入分组');
                 return
             }
-            addGroup({groupName: this.groupValue}).then(response => {
-                if(response.data){
+            addGroup({ groupName: this.groupValue }).then(response => {
+                if (response.data) {
                     this.getGroupList()
                     this.msgSuccess("新增成功");
                     this.groupValue = ''
@@ -875,36 +882,36 @@ export default {
         getGroupList() {
             getGroupAllList().then(response => {
                 this.groupingData = response.data.map((item) => {
-                    return {...item, isUpdata: false}
+                    return { ...item, isUpdata: false }
                 })
             })
         },
         /** 删除分组 */
-        handleGroupDel(id){
+        handleGroupDel(id) {
             delGroup(id).then(response => {
-                if(response.data){
+                if (response.data) {
                     this.msgSuccess("删除成功");
                     this.getGroupList()
                 }
             })
         },
         /** 修改分组 */
-        handleGroupEdit(id){
-            if(this.newGroupName === ''){
+        handleGroupEdit(id) {
+            if (this.newGroupName === '') {
                 this.$message.error('请输入要修改的分组名字');
                 return
             }
             editGroup({ id, groupName: this.newGroupName }).then(response => {
-                if(response.data){
+                if (response.data) {
                     this.getGroupList()
                     this.msgSuccess("修改成功");
                 }
             })
         },
         /** 修改公众号分组 */
-        editAccountGroup(id, resourceGroupId){
-            editAccountGroup({id, resourceGroupId}).then(response => {
-                if(response.data){
+        editAccountGroup(id, resourceGroupId) {
+            editAccountGroup({ id, resourceGroupId }).then(response => {
+                if (response.data) {
                     this.getList()
                     this.msgSuccess("设置成功");
                 }
@@ -938,161 +945,189 @@ export default {
             this.$refs.upload.submit();
         },
         /** 复制 */
-        Copy(value){
+        Copy(value) {
             Copy(value)
         }
     }
 }
 </script>
 <style lang="scss">
-    .el-table {
-        .warning-row {
-            background: oldlace;
-        }
-        .danger-row {
-            background: rgb(253, 187, 187);
-        }
-        .info-row {
-            background: #909399;
-        }
+.el-table {
+    .warning-row {
+        background: oldlace;
     }
 
-    .el-table 
-    .el-drawer__header span:focus {
-        outline: 0;
-    }
-    .Space{
-        width: 10px;
-        display: inline-block;
+    .danger-row {
+        background: rgb(253, 187, 187);
     }
-    .my_padding{
-        margin: 0 10px 10px 10px;
+
+    .info-row {
+        background: #909399;
     }
-    .verticalCenter{
-        display: flex;
-        flex-direction: column;
-        justify-content: center;
-        margin-left: 5px;
-        &>div.child{
-            color: rgb(136, 136, 136); 
-            font-size: 13px;
-            &>span{
-                color: #606266;
-            }
-        }
-        .font12{
-            font-size: 12px;
+}
+
+.el-table .el-drawer__header span:focus {
+    outline: 0;
+}
+
+.Space {
+    width: 10px;
+    display: inline-block;
+}
+
+.my_padding {
+    margin: 0 10px 10px 10px;
+}
+
+.verticalCenter {
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    margin-left: 5px;
+
+    &>div.child {
+        color: rgb(136, 136, 136);
+        font-size: 13px;
+
+        &>span {
+            color: #606266;
         }
     }
-    .copy{
-        color: #409EFF;
-        margin-left: 5px;
-        cursor: pointer;
-    }
-    .elli{
-        display: flex;
-        justify-content: center;
-        align-items: center;
-        span{
-            flex: 1;
-            overflow:hidden;
-            text-overflow:ellipsis;
-            white-space: nowrap;
-        }
+
+    .font12 {
+        font-size: 12px;
     }
-    .myElli{
-        overflow:hidden;
-        text-overflow:ellipsis;
+}
+
+.copy {
+    color: #409EFF;
+    margin-left: 5px;
+    cursor: pointer;
+}
+
+.elli {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+
+    span {
+        flex: 1;
+        overflow: hidden;
+        text-overflow: ellipsis;
         white-space: nowrap;
     }
-    .grouping{
-        span{
-            font-size: 12px;
-        }
-        button{
-            padding: 0;
-        }
+}
+
+.myElli {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+}
+
+.grouping {
+    span {
+        font-size: 12px;
     }
-    .groupingNames{
+
+    button {
         padding: 0;
-        li{
-            list-style: none;
-            padding: 5px 2px;
-            box-sizing: border-box;
-            position: relative;
-            cursor: pointer;
-            .gnnone{
-                display: none;
-            }
-            .gnTxt{
-                overflow: hidden;
-                text-overflow:ellipsis;
-                white-space: nowrap;
-            }
-            .gnBts{
-                width: 100%;
-                height: 100%;
+    }
+}
+
+.groupingNames {
+    padding: 0;
+
+    li {
+        list-style: none;
+        padding: 5px 2px;
+        box-sizing: border-box;
+        position: relative;
+        cursor: pointer;
+
+        .gnnone {
+            display: none;
+        }
+
+        .gnTxt {
+            overflow: hidden;
+            text-overflow: ellipsis;
+            white-space: nowrap;
+        }
+
+        .gnBts {
+            width: 100%;
+            height: 100%;
+            position: absolute;
+            top: 0;
+            left: 0;
+
+            .bts {
                 position: absolute;
                 top: 0;
-                left: 0;
-                .bts{
-                    position: absolute;
-                    top: 0;
-                    right: 0;
-                    height: 100%;
-                    width: 50px;
-                    padding-right: 10px;
-                }
-            }
-            &:hover .gnnone{
-                display: block;
-                background-color: rgba(211, 211, 211, .5);
-                border-radius: 2px;
-            }
-            i{
-                cursor: pointer;
+                right: 0;
+                height: 100%;
+                width: 50px;
+                padding-right: 10px;
             }
-            
-            
         }
-        
+
+        &:hover .gnnone {
+            display: block;
+            background-color: rgba(211, 211, 211, .5);
+            border-radius: 2px;
+        }
+
+        i {
+            cursor: pointer;
+        }
+
+
+    }
+
+}
+
+.custom {
+    width: 75% !important;
+}
+
+.cut {
+    padding: 0 10px;
+    box-sizing: border-box;
+
+    .button {
+        margin-bottom: 10px;
     }
-    .custom {
-        width: 75% !important;
+
+    .el-table .cell {
+        line-height: normal;
     }
-    .cut {
-        padding: 0 10px;
-        box-sizing: border-box;
 
-        .button {
+    ul {
+        padding-left: 0;
+
+        .sumitInfo {
+            // margin-top: 20px;
+            font-weight: 600;
             margin-bottom: 10px;
-        }
-        .el-table .cell {
-            line-height: normal;
-        }
-        ul {
-            padding-left: 0;
-            .sumitInfo {
-                // margin-top: 20px;
-                font-weight: 600;
-                margin-bottom: 10px;
 
-                .button {
-                    margin-left: 20px;
-                }
+            .button {
+                margin-left: 20px;
             }
         }
     }
-    .el-dropdown-link {
-        cursor: pointer;
-        color: #409EFF;
-        font-size: 12px;
-        margin-left: 10px;
-    }
-    .dropdownItem {
-        cursor: pointer;
-        color: #409EFF;
-        font-size: 12px;
-        padding: 4px 0;
-    }
+}
+
+.el-dropdown-link {
+    cursor: pointer;
+    color: #409EFF;
+    font-size: 12px;
+    margin-left: 10px;
+}
+
+.dropdownItem {
+    cursor: pointer;
+    color: #409EFF;
+    font-size: 12px;
+    padding: 4px 0;
+}
 </style>

+ 167 - 170
src/views/accounts/account/use.vue

@@ -2,32 +2,40 @@
   <div class="app-container" ref="appFull" style="background: #fff">
     <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
       <el-form-item label="" prop="userId">
-        <el-select v-model="queryParams.userId" placeholder="运营/投手" clearable filterable style="width: 140px" size="small">
-          <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id"/>
+        <el-select v-model="queryParams.userId" placeholder="运营/投手" clearable filterable style="width: 140px"
+          size="small">
+          <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id" />
         </el-select>
       </el-form-item>
       <el-form-item label="" prop="nickName">
-        <el-input v-model="queryParams.nickName" placeholder="请输入公众号名称" clearable size="small" style="width: 150px" @keyup.enter.native="handleQuery"/>
+        <el-input v-model="queryParams.nickName" placeholder="请输入公众号名称" clearable size="small" style="width: 150px"
+          @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item label="" prop="appid">
-        <el-input v-model="queryParams.appid" placeholder="请输入APPID" clearable size="small" style="width: 150px" @keyup.enter.native="handleQuery"/>
+        <el-input v-model="queryParams.appid" placeholder="请输入APPID" clearable size="small" style="width: 150px"
+          @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item label="" prop="principalName">
-        <el-input v-model="queryParams.principalName" placeholder="请输入公司主体" clearable size="small" style="width: 150px" @keyup.enter.native="handleQuery"/>
+        <el-input v-model="queryParams.principalName" placeholder="请输入公司主体" clearable size="small" style="width: 150px"
+          @keyup.enter.native="handleQuery" />
       </el-form-item>
       <el-form-item label="" prop="resourceGroupId">
-        <el-select v-model="queryParams.resourceGroupId" placeholder="分组" clearable filterable style="width: 140px" size="small">
+        <el-select v-model="queryParams.resourceGroupId" placeholder="分组" clearable filterable style="width: 140px"
+          size="small">
           <el-option v-for="dict in groupingData" :key="dict.id" :label="dict.groupName" :value="dict.id" />
         </el-select>
       </el-form-item>
       <el-form-item prop="platformId">
-        <el-select style="width: 140px" v-model="queryParams.platformId" placeholder="请选择平台" filterable clearable size="small">
+        <el-select style="width: 140px" v-model="queryParams.platformId" placeholder="请选择平台" filterable clearable
+          size="small">
           <el-option v-for="item in bookAll" :key="item.value" :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item prop="authStatus">
-        <el-select style="width: 140px" v-model="queryParams.authStatus" placeholder="请选择授权状态" filterable clearable size="small">
-          <el-option v-for="item in [ { label: '未授权', value: 1 }, { label: '已授权', value: 0 }, ]" :key="item.value" :label="item.label" :value="item.value" />
+        <el-select style="width: 140px" v-model="queryParams.authStatus" placeholder="请选择授权状态" filterable clearable
+          size="small">
+          <el-option v-for="item in [{ label: '未授权', value: 1 }, { label: '已授权', value: 0 },]" :key="item.value"
+            :label="item.label" :value="item.value" />
         </el-select>
       </el-form-item>
       <el-form-item>
@@ -38,37 +46,33 @@
 
     <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
-        <el-button type="primary" size="mini" icon="el-icon-plus"  @click="handleAdd()">新增公众号</el-button>
+        <el-button type="primary" size="mini" icon="el-icon-plus" @click="handleAdd()">新增公众号</el-button>
       </el-col>
       <el-col :span="1.5">
-        <el-button type="primary" size="mini" :disabled="!(batchAssignPlatForm.mpIds && batchAssignPlatForm.mpIds.length > 0)" @click="handleBatchAdd()">批量指派</el-button>
+        <el-button type="primary" size="mini"
+          :disabled="!(batchAssignPlatForm.mpIds && batchAssignPlatForm.mpIds.length > 0)"
+          @click="handleBatchAdd()">批量指派</el-button>
       </el-col>
       <el-col :span="1.5" v-if="batchAssignPlatForm.mpIds && batchAssignPlatForm.mpIds.length > 0">
         <el-button type="danger" size="mini" @click="clearMpidsHandle">清空已选</el-button>
       </el-col>
       <el-col :span="1.5" v-if="batchAssignPlatForm.mpIds && batchAssignPlatForm.mpIds.length > 0">
         <el-select style="width: 140px" v-model="queryParams.platformId" placeholder="已选公众号" size="mini">
-          <el-option v-for="item in batchAssignPlatForm.mpIds" :key="item.id" :label="item.nickName" :value="item.id" disabled/>
+          <el-option v-for="item in batchAssignPlatForm.mpIds" :key="item.id" :label="item.nickName" :value="item.id"
+            disabled />
         </el-select>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    
-    <el-table :data="accountList" ref="multipleTable" row-key="id" :row-class-name="tableRowClassName" size="mini" v-loading="loading" @select="handleSelect" @select-all="handleSelectAll"> <!-- @selection-change="handleSelectionChange" -->
+
+    <el-table :data="accountList" ref="multipleTable" row-key="id" :row-class-name="tableRowClassName" size="mini"
+      v-loading="loading" @select="handleSelect" @select-all="handleSelectAll">
+      <!-- @selection-change="handleSelectionChange" -->
       <el-table-column type="selection" width="55" align="center" />
       <el-table-column label="公众号" prop="account" width="300" fixed>
         <template slot-scope="scope">
-          <el-row
-            align="middle"
-            type="flex"
-            v-if="scope.row.nickName || scope.row.userName || scope.row.appid"
-          >
-            <el-avatar
-              shape="square"
-              :size="62"
-              :src="scope.row.headImg"
-              @error="avatarErr"
-            >
+          <el-row align="middle" type="flex" v-if="scope.row.nickName || scope.row.userName || scope.row.appid">
+            <el-avatar shape="square" :size="62" :src="scope.row.headImg" @error="avatarErr">
               <img src="../../../assets/image/book.jpg" />
             </el-avatar>
             <div class="verticalCenter">
@@ -77,19 +81,11 @@
               </div>
               <div class="child">
                 <span class="font12">原始ID:</span>{{ scope.row.userName
-                }}<i
-                  v-if="scope.row.userName"
-                  class="el-icon-document-copy copy"
-                  @click="Copy(scope.row.userName)"
-                ></i>
+                }}<i v-if="scope.row.userName" class="el-icon-document-copy copy" @click="Copy(scope.row.userName)"></i>
               </div>
               <div class="child">
                 <span class="font12">APPID:</span>{{ scope.row.appid
-                }}<i
-                  v-if="scope.row.appid"
-                  class="el-icon-document-copy copy"
-                  @click="Copy(scope.row.appid)"
-                ></i>
+                }}<i v-if="scope.row.appid" class="el-icon-document-copy copy" @click="Copy(scope.row.appid)"></i>
               </div>
             </div>
           </el-row>
@@ -100,9 +96,7 @@
         <template slot="header">
           <div>
             运营
-            <el-tooltip effect="dark" content="悬浮可显示号码" placement="top"
-              ><i class="el-icon-question"></i
-            ></el-tooltip>
+            <el-tooltip effect="dark" content="悬浮可显示号码" placement="top"><i class="el-icon-question"></i></el-tooltip>
           </div>
         </template>
         <template slot-scope="scope" v-if="scope.row.operUserInfo">
@@ -118,9 +112,7 @@
         <template slot="header">
           <div>
             投手
-            <el-tooltip effect="dark" content="悬浮可显示号码" placement="top"
-              ><i class="el-icon-question"></i
-            ></el-tooltip>
+            <el-tooltip effect="dark" content="悬浮可显示号码" placement="top"><i class="el-icon-question"></i></el-tooltip>
           </div>
         </template>
         <template slot-scope="scope" v-if="scope.row.putUserInfo">
@@ -146,21 +138,11 @@
         <template slot="header">
           <div>
             管理员信息
-            <el-tooltip
-              effect="dark"
-              content="悬浮可显示详细信息"
-              placement="top"
-              ><i class="el-icon-question"></i
-            ></el-tooltip>
+            <el-tooltip effect="dark" content="悬浮可显示详细信息" placement="top"><i class="el-icon-question"></i></el-tooltip>
           </div>
         </template>
         <template slot-scope="scope">
-          <el-popover
-            width="200"
-            trigger="hover"
-            placement="top"
-            :title="scope.row.administratorName"
-          >
+          <el-popover width="200" trigger="hover" placement="top" :title="scope.row.administratorName">
             <div style="color: rgb(136, 136, 136); font-size: 13px">
               <strong>电话号码:</strong> {{ scope.row.managePhone }}
             </div>
@@ -175,12 +157,8 @@
         <template slot="header">
           <div>
             公众号账号信息
-            <el-tooltip
-              effect="dark"
-              content="悬浮可显示公众号账号/密码"
-              placement="top"
-              ><i class="el-icon-question"></i
-            ></el-tooltip>
+            <el-tooltip effect="dark" content="悬浮可显示公众号账号/密码" placement="top"><i
+                class="el-icon-question"></i></el-tooltip>
           </div>
         </template>
         <template slot-scope="scope">
@@ -195,36 +173,17 @@
           </el-popover>
         </template>
       </el-table-column>
-      <el-table-column
-        label="公司主体"
-        prop="principalName"
-        align="center"
-        width="150"
-      >
+      <el-table-column label="公司主体" prop="principalName" align="center" width="150">
         <template slot-scope="scope">
           <div class="elli" v-if="scope.row.principalName">
-            <el-tooltip
-              class="item"
-              effect="dark"
-              :content="scope.row.principalName"
-              placement="top"
-              :enterable="false"
-            >
+            <el-tooltip class="item" effect="dark" :content="scope.row.principalName" placement="top" :enterable="false">
               <span>{{ scope.row.principalName }}</span>
             </el-tooltip>
-            <i
-              class="el-icon-document-copy copy"
-              @click="Copy(scope.row.principalName)"
-            ></i>
+            <i class="el-icon-document-copy copy" @click="Copy(scope.row.principalName)"></i>
           </div>
         </template>
       </el-table-column>
-      <el-table-column
-        label="授权状态"
-        prop="authStatus"
-        align="center"
-        width="80"
-      >
+      <el-table-column label="授权状态" prop="authStatus" align="center" width="80">
         <template slot-scope="scope">
           <el-tag :type="scope.row.authStatus === 0 ? 'success' : 'danger'">{{
             scope.row.authStatus === 0 ? "已授权" : "未授权"
@@ -248,7 +207,7 @@
       </el-table-column>
       <el-table-column label="项目组" prop="businessGroupInfo" width="80" :show-overflow-tooltip="true" align="center">
         <template slot-scope="scope" v-if="scope.row.resourceInfo.businessGroupInfo">
-            <span>{{scope.row.resourceInfo.businessGroupInfo.businessGroupName}}</span>
+          <span>{{ scope.row.resourceInfo.businessGroupInfo.businessGroupName }}</span>
         </template>
       </el-table-column>
       <el-table-column label="期数" prop="period" width="100" align="center">
@@ -263,17 +222,19 @@
 
       <el-table-column label="账号信息" prop="platformInfo" width="200">
         <template slot-scope="scope">
-          <div class="elli" v-if="scope.row.resourceInfo.platformAccountInfo && scope.row.resourceInfo.platformAccountInfo.account">
+          <div class="elli"
+            v-if="scope.row.resourceInfo.platformAccountInfo && scope.row.resourceInfo.platformAccountInfo.account">
             <div style="color: rgb(136, 136, 136); font-size: 12px">
               <strong>账号:</strong>
               <span>{{ scope.row.resourceInfo.platformAccountInfo.account }}</span>
             </div>
             <i class="el-icon-document-copy copy" @click="Copy(scope.row.resourceInfo.platformAccountInfo.account)"></i>
           </div>
-          <div class="elli" v-if="scope.row.resourceInfo.platformAccountInfo && scope.row.resourceInfo.platformAccountInfo.password">
+          <div class="elli"
+            v-if="scope.row.resourceInfo.platformAccountInfo && scope.row.resourceInfo.platformAccountInfo.password">
             <div style="color: rgb(136, 136, 136); font-size: 12px">
               <strong>密码:</strong>
-              <span >{{ scope.row.resourceInfo.platformAccountInfo.password }}</span>
+              <span>{{ scope.row.resourceInfo.platformAccountInfo.password }}</span>
             </div>
             <i class="el-icon-document-copy copy" @click="Copy(scope.row.resourceInfo.platformAccountInfo.password)"></i>
           </div>
@@ -314,69 +275,84 @@
 
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="160">
         <template slot-scope="scope">
-          <el-button v-if="scope.row.authStatus === 1" size="mini" type="text" icon="el-icon-s-promotion" @click="authorizeHandle(scope.row)">授权</el-button>
+          <el-button v-if="scope.row.authStatus === 1" size="mini" type="text" icon="el-icon-s-promotion"
+            @click="authorizeHandle(scope.row)">授权</el-button>
           <el-button size="mini" type="text" icon="el-icon-s-check" @click="handleState(scope.row)">指派</el-button>
           <el-dropdown trigger="click" size="mini">
-              <span class="el-dropdown-link">
-                更多<i class="el-icon-arrow-down el-icon--right"></i>
-              </span>
-              <el-dropdown-menu slot="dropdown">
-                <el-dropdown-item><change-record v-model="scope.row" :periodList="periodList" :bookCity="bookCity" :bookList="bookList" :teamsList="teamsList" :userAll="userAll" type="use"/></el-dropdown-item>
-                <el-dropdown-item><div class="dropdownItem" @click="handleEdit(scope.row)"><i class="el-icon-edit"></i>编辑</div></el-dropdown-item>
-                <el-dropdown-item><cut-book v-model="scope.row.resourceInfo" :periodList="periodList" :bookCity="bookCity" :bookList="bookList" @change="getList" :teamsList="teamsList"/></el-dropdown-item>
-              </el-dropdown-menu>
+            <span class="el-dropdown-link">
+              更多<i class="el-icon-arrow-down el-icon--right"></i>
+            </span>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item><change-record v-model="scope.row" :periodList="periodList" :bookCity="bookCity"
+                  :bookList="bookList" :teamsList="teamsList" :userAll="userAll" type="use" /></el-dropdown-item>
+              <el-dropdown-item>
+                <div class="dropdownItem" @click="handleEdit(scope.row)"><i class="el-icon-edit"></i>编辑</div>
+              </el-dropdown-item>
+              <el-dropdown-item><cut-book v-model="scope.row.resourceInfo" :periodList="periodList" :bookCity="bookCity"
+                  :bookList="bookList" @change="getList" :teamsList="teamsList" /></el-dropdown-item>
+            </el-dropdown-menu>
           </el-dropdown>
         </template>
       </el-table-column>
     </el-table>
 
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
-    
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
     <!-- 新增 编辑弹窗 -->
     <el-dialog :title="isAdd ? '新增公众号' : '编辑公众号'" :visible.sync="openEdit" width="650px" append-to-body>
       <el-form :model="queryPlatform" :rules="rules" ref="platForm" label-position="top" append-to-body :inline="true">
         <el-form-item label="开始时间" prop="beginTime" style="width: 100%">
-          <el-date-picker v-model="queryPlatform.beginTime" size="small" format="yyyy-MM-dd" value-format="yyyy-MM-dd" type="date" placeholder="选择开始时间" />
+          <el-date-picker v-model="queryPlatform.beginTime" size="small" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
+            type="date" placeholder="选择开始时间" />
         </el-form-item>
         <el-form-item label="公众号名称" prop="nickName">
-          <el-input v-model="queryPlatform.nickName" style="width: 140px" :disabled="queryPlatform.authStatus == 0 ? true : false" size="small" placeholder="输入公众号名称"/>
+          <el-input v-model="queryPlatform.nickName" style="width: 140px"
+            :disabled="queryPlatform.authStatus == 0 ? true : false" size="small" placeholder="输入公众号名称" />
         </el-form-item>
         <el-form-item label="APPID" prop="appid">
-          <el-input v-model="queryPlatform.appid" style="width: 140px" :disabled="queryPlatform.authStatus == 0 ? true : false" size="small" placeholder="输入APPID"/>
+          <el-input v-model="queryPlatform.appid" style="width: 140px"
+            :disabled="queryPlatform.authStatus == 0 ? true : false" size="small" placeholder="输入APPID" />
         </el-form-item>
         <el-form-item label="公众号账号" prop="account">
-          <el-input v-model="queryPlatform.account" style="width: 140px" size="small" placeholder="输入公众号账号"/>
+          <el-input v-model="queryPlatform.account" style="width: 140px" size="small" placeholder="输入公众号账号" />
         </el-form-item>
         <el-form-item label="公众号密码" prop="password">
-          <el-input v-model="queryPlatform.password" style="width: 140px" size="small" placeholder="输入公众号密码"/>
+          <el-input v-model="queryPlatform.password" style="width: 140px" size="small" placeholder="输入公众号密码" />
         </el-form-item>
         <el-form-item label="项目组" prop="businessGroupId" v-if="isAdd">
-            <el-select v-model="queryPlatform.businessGroupId" size="small" placeholder="选择项目组" filterable style="width: 140px" clearable>
-                <el-option v-for="item in teamsList" :key="item.id" :label="item.businessGroupName" :value="item.id" />
-            </el-select>
+          <el-select v-model="queryPlatform.businessGroupId" size="small" placeholder="选择项目组" filterable
+            style="width: 140px" clearable>
+            <el-option v-for="item in teamsList" :key="item.id" :label="item.businessGroupName" :value="item.id" />
+          </el-select>
         </el-form-item>
         <el-form-item label="期数" prop="periodId" v-if="isAdd">
-          <el-select v-model="queryPlatform.periodId" size="small" placeholder="选择期数" filterable style="width: 140px" clearable>
+          <el-select v-model="queryPlatform.periodId" size="small" placeholder="选择期数" filterable style="width: 140px"
+            clearable>
             <el-option v-for="item in periodList" :key="item.id" :label="item.period" :value="item.id" />
           </el-select>
         </el-form-item>
         <el-form-item label="书城" prop="platformId" v-if="isAdd">
-          <el-select v-model="queryPlatform.platformId" @change="selectZh" size="small" placeholder="选择书城" filterable style="width: 140px" clearable>
+          <el-select v-model="queryPlatform.platformId" @change="selectZh" size="small" placeholder="选择书城" filterable
+            style="width: 140px" clearable>
             <el-option v-for="item in bookCity" :key="item.id" :label="item.platformName" :value="item.id" />
           </el-select>
         </el-form-item>
         <el-form-item label="账号" prop="platformAccountId" v-if="isAdd">
-          <el-select v-model="queryPlatform.platformAccountId" :disabled="!queryPlatform.platformId" size="small" placeholder="选择账号" filterable style="width: 140px" clearable>
+          <el-select v-model="queryPlatform.platformAccountId" :disabled="!queryPlatform.platformId" size="small"
+            placeholder="选择账号" filterable style="width: 140px" clearable>
             <el-option v-for="item in accList" :key="item.id" :label="item.account" :value="item.id" />
           </el-select>
         </el-form-item>
         <el-form-item label="书" prop="bookId" v-if="isAdd">
-          <el-select v-model="queryPlatform.bookId" size="small" placeholder="选择书" filterable style="width: 140px" clearable>
-              <el-option v-for="item in bookList" :key="item.id" :label="item.bookName" :value="item.id" />
+          <el-select v-model="queryPlatform.bookId" size="small" placeholder="选择书" filterable style="width: 140px"
+            clearable>
+            <el-option v-for="item in bookList" :key="item.id" :label="item.bookName" :value="item.id" />
           </el-select>
         </el-form-item>
         <el-form-item label="投放状态" prop="putStatus" v-if="isAdd">
-          <el-select v-model="queryPlatform.putStatus" size="small" placeholder="选择投放状态" filterable style="width: 140px" clearable>
+          <el-select v-model="queryPlatform.putStatus" size="small" placeholder="选择投放状态" filterable style="width: 140px"
+            clearable>
             <el-option label="待投放" value="wait" />
             <el-option label="投放中" value="ing" />
             <el-option label="停投" value="stop" />
@@ -384,45 +360,45 @@
           </el-select>
         </el-form-item>
         <el-form-item label="投放渠道" prop="putChannel" v-if="isAdd">
-          <el-select v-model="queryPlatform.putChannel" size="small" placeholder="选择投放渠道" filterable style="width: 140px" clearable>
-            <el-option label="MP" value="MP" />
-            <el-option label="GDT" value="GDT" />
-            <el-option label="头条" value="头条" />
-            <el-option label="企微" value="企微" />
+          <el-select v-model="queryPlatform.putChannel" size="small" placeholder="选择投放渠道" filterable style="width: 140px"
+            clearable>
+            <el-option :label="item.label" :value="item.value" :key="item.value" v-for="item in channelList" />
           </el-select>
         </el-form-item>
         <el-form-item label="充值模板" prop="rechargeTemplate" v-if="isAdd">
-            <el-input v-model="queryPlatform.rechargeTemplate" size="small" style="width: 140px" placeholder="输入充值模板" />
+          <el-input v-model="queryPlatform.rechargeTemplate" size="small" style="width: 140px" placeholder="输入充值模板" />
         </el-form-item>
         <el-form-item label="管理员姓名" prop="administratorName">
-          <el-input v-model="queryPlatform.administratorName" style="width: 140px" size="small" placeholder="输入管理员姓名"/>
+          <el-input v-model="queryPlatform.administratorName" style="width: 140px" size="small" placeholder="输入管理员姓名" />
         </el-form-item>
         <el-form-item label="管理员身份证" prop="administratorCard">
-          <el-input v-model="queryPlatform.administratorCard" style="width: 140px" size="small" placeholder="输入管理员身份证"/>
+          <el-input v-model="queryPlatform.administratorCard" style="width: 140px" size="small" placeholder="输入管理员身份证" />
         </el-form-item>
         <el-form-item label="管理员手机号码" prop="managePhone">
-          <el-input v-model="queryPlatform.managePhone" style="width: 140px" size="small" placeholder="输入管理员手机号"/>
+          <el-input v-model="queryPlatform.managePhone" style="width: 140px" size="small" placeholder="输入管理员手机号" />
         </el-form-item>
         <el-form-item label="管理员微信" prop="administratorWechat">
-          <el-input v-model="queryPlatform.administratorWechat" style="width: 140px" size="small" placeholder="输入管理员微信"/>
+          <el-input v-model="queryPlatform.administratorWechat" style="width: 140px" size="small" placeholder="输入管理员微信" />
         </el-form-item>
         <el-form-item label="管理员手机号码编号" prop="managePhoneNo">
-          <el-input v-model="queryPlatform.managePhoneNo" style="width: 140px" size="small" placeholder="输入管理员手机号码编号"/>
+          <el-input v-model="queryPlatform.managePhoneNo" style="width: 140px" size="small" placeholder="输入管理员手机号码编号" />
         </el-form-item>
         <el-form-item label="法人姓名" prop="legalName">
-          <el-input v-model="queryPlatform.legalName" style="width: 140px" size="small" placeholder="输入法人姓名"/>
+          <el-input v-model="queryPlatform.legalName" style="width: 140px" size="small" placeholder="输入法人姓名" />
         </el-form-item>
         <el-form-item label="法人身份证" prop="legalCard">
-          <el-input v-model="queryPlatform.legalCard" style="width: 140px" size="small" placeholder="输入法人身份证"/>
+          <el-input v-model="queryPlatform.legalCard" style="width: 140px" size="small" placeholder="输入法人身份证" />
         </el-form-item>
         <el-form-item label="法人微信" prop="legalWechat">
-          <el-input v-model="queryPlatform.legalWechat" style="width: 140px" size="small" placeholder="输入法人微信"/>
+          <el-input v-model="queryPlatform.legalWechat" style="width: 140px" size="small" placeholder="输入法人微信" />
         </el-form-item>
         <el-form-item label="认证开始时间" prop="authTime">
-          <el-date-picker v-model="queryPlatform.authTime" style="width: 140px" type="date" placeholder="选择开始时间" size="small"/>
+          <el-date-picker v-model="queryPlatform.authTime" style="width: 140px" type="date" placeholder="选择开始时间"
+            size="small" />
         </el-form-item>
         <el-form-item label="认证结束时间" prop="authTimeout">
-          <el-date-picker v-model="queryPlatform.authTimeout" style="width: 140px" type="date" placeholder="选择结束时间" size="small"/>
+          <el-date-picker v-model="queryPlatform.authTimeout" style="width: 140px" type="date" placeholder="选择结束时间"
+            size="small" />
         </el-form-item>
       </el-form>
       <span slot="footer" class="dialog-footer">
@@ -435,16 +411,12 @@
     <el-dialog title="批量指派(修改运营和投手后必选)" :visible.sync="batchOpen" width="300px" append-to-body>
       <el-form :model="batchAssignPlatForm" :rules="rules" ref="batchplatForm" label-width="80px" label-position="top">
         <el-form-item label="开始时间" prop="beginTime">
-            <el-date-picker
-              v-model="batchAssignPlatForm.beginTime"
-              type="date"
-              format="yyyy-MM-dd"
-              value-format="yyyy-MM-dd"
-              placeholder="选择开始时间">
-            </el-date-picker>
+          <el-date-picker v-model="batchAssignPlatForm.beginTime" type="date" format="yyyy-MM-dd"
+            value-format="yyyy-MM-dd" placeholder="选择开始时间">
+          </el-date-picker>
         </el-form-item>
         <el-form-item label="运营" prop="operUserId">
-          <el-select  v-model="batchAssignPlatForm.operUserId" placeholder="请选择" filterable style="width: 100%" clearable>
+          <el-select v-model="batchAssignPlatForm.operUserId" placeholder="请选择" filterable style="width: 100%" clearable>
             <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id" />
           </el-select>
         </el-form-item>
@@ -460,17 +432,13 @@
       </span>
     </el-dialog>
 
-    
+
     <el-dialog title="指派用户" :visible.sync="openEditType" width="680px" append-to-body>
       <el-form :model="assignUSerData" :rules="rulesType1" ref="platFormType" label-width="80px" label-position="top">
         <el-form-item label="开始时间(修改运营和投手后必选)" prop="beginTime">
-            <el-date-picker
-              v-model="assignUSerData.beginTime"
-              type="date"
-              format="yyyy-MM-dd"
-              value-format="yyyy-MM-dd"
-              placeholder="选择开始时间">
-            </el-date-picker>
+          <el-date-picker v-model="assignUSerData.beginTime" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
+            placeholder="选择开始时间">
+          </el-date-picker>
         </el-form-item>
         <el-row :gutter="20">
           <el-col :span="8">
@@ -503,7 +471,8 @@
     </el-dialog>
 
     <!-- 变更信息 -->
-    <AccountUpdate :drawer="drawer" v-if="drawer" @close="drawer = false" :drawerTitle="drawerTitle" :drawerId="drawerId"></AccountUpdate>
+    <AccountUpdate :drawer="drawer" v-if="drawer" @close="drawer = false" :drawerTitle="drawerTitle" :drawerId="drawerId">
+    </AccountUpdate>
   </div>
 </template>
 
@@ -512,6 +481,7 @@ import { getAccount, getAccountList, addAccount, editAccount, addGroup, getGroup
 import { allUser } from "@/api/system/user";
 import { getAllBook } from "@/api/system/books";
 import { Copy } from "@/utils";
+import { channelList } from "@/utils/const.js";
 import AccountUpdate from "./components/accountUpdate.vue";
 import { getPeriodAll } from "@/api/accounts/period";
 import { getBookPlatInfoAll } from "@/api/accounts/bookCity";
@@ -526,6 +496,7 @@ export default {
     return {
       groupValue: "",
       newGroupName: "",
+      channelList: channelList,
       queryParams: {
         pageNum: 1,
         pageSize: 10
@@ -587,12 +558,12 @@ export default {
         mpIds: [],
       },
       batchOpen: false,
-			// 表格loading
-			loading: false,
-			// 信息变更
-			drawer: false,
-			drawerTitle: '',
-			drawerId: null,
+      // 表格loading
+      loading: false,
+      // 信息变更
+      drawer: false,
+      drawerTitle: '',
+      drawerId: null,
       openEditType: false,
       rulesType1: {
         operUserId: [
@@ -644,13 +615,13 @@ export default {
       })
     },
     /** 数组去重 */
-    dedupe(array){
+    dedupe(array) {
       return Array.from(new Set(array));
     },
     handleSelect(selection, row) {
       let mpIds = this.batchAssignPlatForm.mpIds
-      if(selection.length > mpIds.length) { // 选中
-        this.batchAssignPlatForm.mpIds = this.dedupe([...mpIds, {nickName: row.nickName, id: row.id}])
+      if (selection.length > mpIds.length) { // 选中
+        this.batchAssignPlatForm.mpIds = this.dedupe([...mpIds, { nickName: row.nickName, id: row.id }])
       } else { // 取消
         this.batchAssignPlatForm.mpIds = mpIds.filter(item => item.id !== row.id)
       }
@@ -659,7 +630,7 @@ export default {
       console.log(1111, selection)
       let mpIds = this.batchAssignPlatForm.mpIds
       if (selection.length > 0) { // 选中
-        let newMpIds = selection.map(item => ({nickName: item.nickName, id: item.id}))
+        let newMpIds = selection.map(item => ({ nickName: item.nickName, id: item.id }))
         this.batchAssignPlatForm.mpIds = this.dedupe([...mpIds, ...newMpIds])
       } else { // 取消
         let newMpIds = this.accountList.map(item => item.id)
@@ -682,7 +653,7 @@ export default {
     getCutXgData() {
       // 获取项目组
       getBusinessGroupAll().then(res => {
-          this.teamsList = res.data
+        this.teamsList = res.data
       })
       // 获取期数
       getPeriodAll().then(response => {
@@ -706,7 +677,7 @@ export default {
     /** 指派提交 */
     assignUSerHandle() {
       configUser(this.assignUSerData).then(res => {
-        if(res.data) {
+        if (res.data) {
           this.msgSuccess('指派成功')
           this.getList()
           this.openEditType = false
@@ -774,18 +745,19 @@ export default {
       this.isAdd = true;
       this.openEdit = true;
       this.queryPlatform = {}
-    }, 
+    },
     /** 编辑按钮方法 */
     handleEdit(value) {
       let { id, nickName, authStatus, appid, account, password, authTime, authTimeout, administratorName, managePhone, managePhoneNo, administratorCard, administratorWechat, legalName, legalCard, legalWechat, resourceInfo } = value;
-      this.queryPlatform = { appid, account, password, authTime, authTimeout, 
-        nickName, administratorName, managePhone, managePhoneNo, authStatus, 
-        administratorCard, administratorWechat, legalName, legalCard, 
-        legalWechat, id, putStatus: resourceInfo.putStatus, 
-        putChannel: resourceInfo.putChannel, 
+      this.queryPlatform = {
+        appid, account, password, authTime, authTimeout,
+        nickName, administratorName, managePhone, managePhoneNo, authStatus,
+        administratorCard, administratorWechat, legalName, legalCard,
+        legalWechat, id, putStatus: resourceInfo.putStatus,
+        putChannel: resourceInfo.putChannel,
         rechargeTemplate: resourceInfo.rechargeTemplate,
-        periodId: resourceInfo.periodId, 
-        platformId: resourceInfo.platformId, 
+        periodId: resourceInfo.periodId,
+        platformId: resourceInfo.platformId,
         platformAccountId: resourceInfo.platformAccountId,
         bookId: resourceInfo.bookId,
         businessGroupId: resourceInfo.businessGroupId
@@ -795,9 +767,9 @@ export default {
     },
     /** 查询公众号列表 */
     getList() {
-			this.loading = true
+      this.loading = true
       getAccountList(this.queryParams).then((response) => {
-				this.loading = false
+        this.loading = false
         let data = response.data;
         this.accountList = data.records;
         this.total = data.total;
@@ -805,7 +777,7 @@ export default {
           let mpIds = this.batchAssignPlatForm.mpIds.map(item => item.id)
           this.$nextTick(() => {
             data.records.forEach(item => {
-              if(mpIds.includes(item.id)) {
+              if (mpIds.includes(item.id)) {
                 this.$refs.multipleTable.toggleRowSelection(item);
               }
             })
@@ -846,7 +818,8 @@ export default {
             authTimeout = this.parserTime(authTimeout);
             params.authTimeout = authTimeout
           }
-          
+          params.nickName = params.nickName.replace(/\s/, '')
+          params.appid = params.appid.replace(/\s/, '')
           if (this.isAdd) {
             console.log(params)
             addAccount(params).then(res => {
@@ -946,9 +919,11 @@ export default {
   .warning-row {
     background: oldlace;
   }
+
   .danger-row {
     background: rgb(253, 187, 187);
   }
+
   .info-row {
     background: #909399;
   }
@@ -957,38 +932,47 @@ export default {
 .el-table .el-drawer__header span:focus {
   outline: 0;
 }
+
 .Space {
   width: 10px;
   display: inline-block;
 }
+
 .my_padding {
   margin: 0 10px 10px 10px;
 }
+
 .verticalCenter {
   display: flex;
   flex-direction: column;
   justify-content: center;
   margin-left: 5px;
-  & > div.child {
+
+  &>div.child {
     color: rgb(136, 136, 136);
     font-size: 13px;
-    & > span {
+
+    &>span {
       color: #606266;
     }
   }
+
   .font12 {
     font-size: 12px;
   }
 }
+
 .copy {
   color: #409eff;
   margin-left: 5px;
   cursor: pointer;
 }
+
 .elli {
   display: flex;
   justify-content: flex-start;
   align-items: center;
+
   span {
     flex: 1;
     overflow: hidden;
@@ -996,41 +980,50 @@ export default {
     white-space: nowrap;
   }
 }
+
 .myElli {
   overflow: hidden;
   text-overflow: ellipsis;
   white-space: nowrap;
 }
+
 .grouping {
   span {
     font-size: 12px;
   }
+
   button {
     padding: 0;
   }
 }
+
 .groupingNames {
   padding: 0;
+
   li {
     list-style: none;
     padding: 5px 2px;
     box-sizing: border-box;
     position: relative;
     cursor: pointer;
+
     .gnnone {
       display: none;
     }
+
     .gnTxt {
       overflow: hidden;
       text-overflow: ellipsis;
       white-space: nowrap;
     }
+
     .gnBts {
       width: 100%;
       height: 100%;
       position: absolute;
       top: 0;
       left: 0;
+
       .bts {
         position: absolute;
         top: 0;
@@ -1040,22 +1033,26 @@ export default {
         padding-right: 10px;
       }
     }
+
     &:hover .gnnone {
       display: block;
       background-color: rgba(211, 211, 211, 0.5);
       border-radius: 2px;
     }
+
     i {
       cursor: pointer;
     }
   }
 }
+
 .el-dropdown-link {
   cursor: pointer;
   color: #409EFF;
   font-size: 12px;
   margin-left: 10px;
 }
+
 .dropdownItem {
   cursor: pointer;
   color: #409EFF;

Diff do ficheiro suprimidas por serem muito extensas
+ 266 - 555
src/views/accounts/adWarrant/index.vue


+ 86 - 0
src/views/accounts/adWarrant/putUser.vue

@@ -0,0 +1,86 @@
+<template>
+    <div>
+        <el-dialog title="指派投放助手" :visible.sync="show" width="450px" append-to-body>
+            <el-form :model="paramsForm" :rules="rules" ref="PUTUSER" label-width="80px" label-position="top">
+                <el-form-item label="投放助理" prop="putUserIds">
+                    <el-select v-model="paramsForm.putUserIds" multiple placeholder="请选择" filterable style="width: 100%" clearable>
+                        <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="close">取 消</el-button>
+                <el-button type="primary" @click="submitPUt('PUTUSER')" :loading="loading">确 定</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+<script>
+import { addAccountUser } from "@/api/accounts/adApi";
+export default {
+    name: 'putUser',
+    data() {
+        return {
+            loading: false,
+            paramsForm: {},
+            rules: {
+                putUserIds: [
+                    { required: true, message: '请选择投放助理', trigger: 'blur' }
+                ],
+            }
+        }
+    },
+    props: {
+        userAll: {
+            type: Array,
+            default: [],
+        },
+        putUserIds: {
+            type: Array,
+            default: [],
+        },
+        accountIds: {
+            type: Array,
+            default: [],
+        },
+        show: {
+            type: Boolean,
+            default: false
+        }
+    },
+    watch: {
+        putUserIds: {
+            handler(val) {
+                console.log('val--->', val);
+                this.$nextTick(() => {
+                    this.paramsForm['putUserIds'] = val
+                    this.$set(this.paramsForm, 'putUserIds', val)
+                })
+            },
+            immediate: true,
+        },
+    },
+    methods: {
+        submitPUt(type) {
+            this.$refs[type].validate((valid) => {
+                if (valid) {
+                    this.loading = true
+                    addAccountUser({ accountIds: this.accountIds, ...this.paramsForm }).then(res => {
+                        this.loading = false
+                        if (res.data) {
+                            this.msgSuccess('切换成功')
+                            this.paramsForm = {}
+                            this.show = false
+                            this.$emit('change')
+                        }
+                    }).catch(() => this.loading = false)
+                }
+            })
+        },
+        close() {
+            this.$emit('close')
+            this.paramsForm = {}
+        }
+    }
+}
+</script>

+ 75 - 0
src/views/accounts/adWarrant/putUsers.vue

@@ -0,0 +1,75 @@
+<template>
+    <div>
+        <el-button type="warning" size="mini" icon="el-icon-sort" :disabled="multiple" @click="putsHandle">指派投放助理</el-button>
+        <el-dialog title="指派投放助手" :visible.sync="show" width="450px" append-to-body>
+            <el-form :model="paramsForm" :rules="rules" ref="PUTUSERS" label-width="80px" label-position="top">
+                <el-form-item label="投放助理" prop="putUserIds">
+                    <el-select v-model="paramsForm.putUserIds" multiple placeholder="请选择" filterable style="width: 100%" clearable>
+                        <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id"></el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="paramsForm = {}; show = false">取 消</el-button>
+                <el-button type="primary" @click="submitPUt('PUTUSERS')" :loading="loading">确 定</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { addAccountUser } from "@/api/accounts/adApi";
+export default {
+    name: 'putUsers',
+    data() {
+        return {
+            loading: false,
+            show: false,
+            paramsForm: {
+                putUserIds: []
+            },
+            rules: {
+                putUserIds: [
+                    { required: true, message: '请选择投放助理', trigger: 'blur' }
+                ],
+            }
+        }
+    },
+    props: {
+        multiple: {
+            type: Boolean,
+            default: false
+        },
+        accountIds: {
+            type: Array,
+            default: [],
+        },
+        userAll: {
+            type: Array,
+            default: [],
+        }
+    },
+    methods: {
+        putsHandle() {
+            this.show = true
+            this.paramsForm = {}
+        },
+        submitPUt(type) {
+            this.$refs[type].validate((valid) => {
+                if (valid) {
+                    this.loading = true
+                    addAccountUser({ accountIds: this.accountIds, ...this.paramsForm }).then(res => {
+                        this.loading = false
+                        if (res.data) {
+                            this.msgSuccess('切换成功')
+                            this.paramsForm = {}
+                            this.show = false
+                            this.$emit('change')
+                        }
+                    }).catch(() => this.loading = false)
+                }
+            })
+        },
+    }
+}
+</script>

+ 253 - 0
src/views/accounts/applyUse/index.vue

@@ -0,0 +1,253 @@
+<template>
+    <div class="app-container">
+        <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
+            <el-form-item label="" prop="channel">
+                <el-input
+                    v-model="queryParams.channel"
+                    placeholder="请输入包名"
+                    clearable
+                    size="small"
+                    style="width: 240px"
+                    @keyup.enter.native="handleQuery"
+                />
+            </el-form-item>
+            <el-form-item label="" prop="platformName">
+                <el-select v-model="queryParams.platformName" size="small" placeholder="请选择书城" filterable style="width: 100%" clearable @keyup.enter.native="handleQuery">
+                    <el-option
+                        v-for="item in bookCityData"
+                        :key="item.id"
+                        :label="item.platformName"
+                        :value="item.platformName">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="" prop="promotionId">
+                <el-input
+                    v-model="queryParams.promotionId"
+                    placeholder="推广链接ID"
+                    clearable
+                    size="small"
+                    style="width: 240px"
+                    @keyup.enter.native="handleQuery"
+                />
+            </el-form-item>
+            <el-form-item>
+                <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+                <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+            </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8" align="middle">
+            <el-col :span="1.5">
+                <el-button type="primary" size="small" @click="addHandle">新增推广链接</el-button>
+            </el-col>
+            <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+
+        <el-table :data="dataList" size="mini" :border="true">
+            <el-table-column label="ID" prop="id" width="55" align="center"/>
+            <el-table-column label="推广链接ID" prop="promotionId" align="center" width="150" :show-overflow-tooltip="true"/>
+            <el-table-column label="包名" prop="channel" width="220" :show-overflow-tooltip="true"/>
+            <el-table-column label="书城名称" prop="platformName" align="center" width="100"/>
+            <el-table-column label="书城key" prop="platformKey" align="center" width="150"/>
+            <el-table-column label="开始时间" prop="startTime" align="center" width="100"/>
+            <el-table-column label="结束时间" prop="endTime" align="center" width="100"/>
+            <el-table-column label="创建时间" prop="createTime" align="center" width="135"/>
+            <el-table-column label="操作" class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                    <el-button
+                        size="mini"
+                        type="text"
+                        icon="el-icon-edit"
+                        style="margin-right: 10px"
+                        @click="handleEditTen(scope.row)"
+                    >修改</el-button>
+                    <el-popconfirm
+                        title="确定删除吗?"
+                        @confirm="handleDel(scope.row.id)"
+                    >
+                        <el-button slot="reference" type="text" size="mini" style="color: red" icon="el-icon-delete">删除</el-button>
+                    </el-popconfirm>
+                </template>
+            </el-table-column>
+        </el-table>
+
+        <pagination
+            v-show="total > 0"
+            :total="total"
+            :page.sync="queryParams.pageNum"
+            :limit.sync="queryParams.pageSize"
+            @pagination="getList"
+        />
+
+        <!-- 新增修改 -->
+        <el-dialog 
+            :title="title" 
+            :visible.sync="visible" 
+            width="450px"
+            append-to-body
+        >
+            <el-form :model="applyParamsForm" :rules="applyRulesType" ref="platFormApply" label-width="100px">
+                <el-form-item label="包名" prop="channel" >
+                    <el-select
+                        v-model="applyParamsForm.channel"
+                        filterable
+                        remote
+                        reserve-keyword
+                        placeholder="请输入关键词"
+                        :remote-method="remoteMethod"
+                        :loading="loading"
+                    >
+                        <el-option
+                            v-for="item in options"
+                            :key="item.id"
+                            :label="item.resourceName"
+                            :value="item.resourceName">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="推广链接ID" prop="promotionId" >
+                    <el-input v-model="applyParamsForm.promotionId" placeholder="请输入推广链接ID"/>
+                </el-form-item>
+                <el-form-item label="书城" prop="platformKey" >
+                    <el-select v-model="applyParamsForm.platformKey" placeholder="请选择" filterable style="width: 100%" clearable>
+                        <el-option
+                            v-for="item in bookCityData"
+                            :key="item.id"
+                            :label="item.platformName"
+                            :value="item.platformKey">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="开始时间" prop="startTime" >
+                    <el-date-picker
+                        v-model="applyParamsForm.startTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="选择日期">
+                    </el-date-picker>
+                </el-form-item>
+                <el-form-item label="结束时间" prop="endTime" >
+                    <el-date-picker
+                        v-model="applyParamsForm.endTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="选择日期">
+                    </el-date-picker>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="applyParamsForm = {platformKey: 'YOU_ZI'};visible = false">取 消</el-button>
+                <el-button type="primary" @click="submit('platFormApply')">确 定</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { getApplyChanelList, addOrEditApplyChanel, delApplyChanel } from '@/api/accounts/applyUse'
+import { getBookPlatformAll, queryApi } from '@/api/accounts/qwMapping'
+export default {
+    data () {
+        return {
+            queryParams: {
+                pageNum: 1,
+                pageSize: 10,
+                channel: null
+            },
+            dataList: [],
+            total: 0,
+            showSearch: true,
+            bookCityData: [],
+            visible: false,
+            applyParamsForm: {platformKey: 'YOU_ZI'},
+            applyRulesType: {
+                channel:  [{ required: true, message: '请输入包名', trigger: 'blur' }],
+                promotionId:  [{ required: true, message: '请输入推广链接id', trigger: 'blur' }],
+                platformKey: [{ required: true, message: '请选择书城', trigger: 'blur' }]
+            },
+            title: '新增推广链接',
+            loading: false,
+            options: []
+        }
+    },
+    created() {
+        this.getList()
+        this.getAll()
+    },
+    methods: {
+        remoteMethod(query) {
+            if (query !== '') {
+                this.loading = true;
+                queryApi({resourceName: query}).then(res => {
+                    this.options = res.data
+                    this.loading = false;
+                }).catch(err => this.loading = false)
+            } else {
+                this.options = [];
+            }
+        },
+        getList () {
+            getApplyChanelList(this.queryParams).then(res => {
+                let data = res.data
+                this.total = data.total
+                let records = data.records
+                this.dataList = records
+            })
+        },
+        getAll () {
+            getBookPlatformAll().then(res => {
+                this.bookCityData = res.data
+            })
+        },
+        handleQuery() {
+            this.queryParams = { ...this.queryParams, pageNum: 1 }
+            this.getList();
+        },
+        resetQuery() {
+            this.resetForm("queryForm");
+            this.getList();
+        },
+        addHandle() {
+            this.title = '新增推广链接'
+            this.applyParamsForm = { platformKey: 'YOU_ZI' }
+            this.visible = true
+        },
+        submit(formName) {
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    addOrEditApplyChanel(this.applyParamsForm).then(res => {
+                        console.log('addOrEditQwChanel---->', res)
+                        if (res.data) {
+                            if (this.applyParamsForm.id) { // 修改
+                                this.msgSuccess("新增成功");
+                            } else {
+                                this.msgSuccess("修改成功");
+                            }
+                            this.getList()
+                            this.applyParamsForm = { platformKey: 'YOU_ZI' }
+                            this.visible = false
+                        }
+                    })
+                } else {
+                    return false;
+                }
+            });
+        },
+        handleEditTen(row) {
+            this.title = '修改推广链接ID'
+            const { id, endTime, startTime, channel, promotionId, platformKey, resourceName} = row
+            this.applyParamsForm = { startTime, id, endTime, platformKey, resourceName, channel, promotionId }
+            this.visible = true
+        },
+        handleDel(id) {
+            delApplyChanel({id}).then(res => {
+                if (res.data) {
+                    this.msgSuccess("删除成功");
+                    this.getList()
+                }
+            })
+        },
+    }
+}
+</script>

+ 242 - 0
src/views/accounts/corpWechat/changeRecord.vue

@@ -0,0 +1,242 @@
+<template>
+    <div>
+        <el-drawer :title="recordData.name + ' 变更记录'" append-to-body :visible.sync="visible" direction="rtl"
+            :before-close="recordClose" custom-class="custom">
+            <div class="cut">
+                <el-button class="button" type="primary" icon="el-icon-plus" size="mini"
+                    @click="handleCutRecord">插入起始记录</el-button>
+                <el-table :data="recordList" size="mini" :lazy="true">
+                    <el-table-column label="开始时间" prop="beginTime" align="center" width="90" />
+                    <el-table-column label="结束时间" prop="endTime" align="center" width="90" />
+                    <el-table-column label="企业号ID" prop="corpUserId" align="center" :show-overflow-tooltip="true"
+                        width="120" />
+                    <el-table-column label="企微ID" prop="corpId" :show-overflow-tooltip="true" width="300" />
+                    <el-table-column label="运营" prop="operUserId" align="center" width="100">
+                        <template slot-scope="scope">
+                            <div>{{ scope.row.operUserId ? scope.row.operUser.nickName : '--' }}</div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="投手" prop="putUserId" align="center" width="100">
+                        <template slot-scope="scope">
+                            <div>{{ scope.row.putUserId ? scope.row.putUser.nickName : '--' }}</div>
+                        </template>
+                    </el-table-column>
+                    <el-table-column label="操作" align="center" fixed="right"
+                        width="150">
+                        <template slot-scope="scope">
+                            <div>
+                                <el-button type="text" @click="insertDownHandle(scope.row, '向后插入')"
+                                    size="mini">往后插入</el-button>
+                                <el-button type="text" @click="insertDownHandle(scope.row, '修改')" size="mini">修改</el-button>
+                                <el-button type="text" style="color: red" size="mini"
+                                    @click="delRecordHandle(scope.row)">删除</el-button>
+                            </div>
+                        </template>
+                    </el-table-column>
+                </el-table>
+            </div>
+        </el-drawer>
+
+        <!-- 新增 编辑记录弹窗 -->
+        <el-dialog :title="title" :visible.sync="editShow" width="360px" append-to-body @close="editShow = false">
+            <el-form :model="queryPlatformRecord" :rules="rules" ref="platFormRecord" label-width="80px">
+                <el-form-item label="开始时间" prop="beginTime">
+                    <el-date-picker v-model="queryPlatformRecord.beginTime" size="small" format="yyyy-MM-dd"
+                        value-format="yyyy-MM-dd" type="date" placeholder="选择开始时间" />
+                </el-form-item>
+                <el-form-item label="结束时间" prop="endTime">
+                    <el-date-picker v-model="queryPlatformRecord.endTime" size="small" format="yyyy-MM-dd"
+                        value-format="yyyy-MM-dd" type="date" placeholder="选择开始时间" />
+                </el-form-item>
+                <el-form-item label="运营" prop="operUserId">
+                    <el-select v-model="queryPlatformRecord.operUserId" size="small" placeholder="选择运营" filterable
+                        clearable>
+                        <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="投手" prop="putUserId">
+                    <el-select v-model="queryPlatformRecord.putUserId" size="small" placeholder="选择投手" filterable clearable>
+                        <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id" />
+                    </el-select>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="editShow = false; queryPlatformRecord = {}">取 消</el-button>
+                <el-button type="primary" @click="submitRecord('platFormRecord')">确 定</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { getAllOfCorpList, addAllOfCorp, putAllOfCorp, delAllOfCorp } from "@/api/accounts/corpWeChat";
+export default {
+    data() {
+        return {
+            recordList: [],
+            loading: false,
+            title: '',
+            editShow: false,
+            queryPlatformRecord: {},
+            rules: {
+                beginTime: [
+                    { required: true, message: '请选择开始时间', trigger: 'change' }
+                ]
+            }
+        }
+    },
+    props: {
+        recordData: {
+            type: Object,
+            default: {},
+        },
+        visible: {
+            type: Boolean,
+            default: false
+        },
+        userAll: {
+            type: Array,
+            default: []
+        }
+    },
+    watch: {
+        visible: {
+            handler(val) {
+                if (val) {
+                    this.$nextTick(() => {
+                        this.getList()
+                    })
+                }
+            },
+            immediate: true,
+        },
+    },
+    methods: {
+        submitRecord(formName) {
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    let params = JSON.parse(JSON.stringify(this.queryPlatformRecord))
+                    if(params.beginTime) {
+                        params.beginTime = params.beginTime
+                    }
+                    if(params.endTime) {
+                        params.endTime = params.endTime
+                    }
+                    if(!params.id) { // 新增
+                        addAllOfCorp(params).then(res => {
+                            this.msgSuccess("插入成功");
+                            this.resetForm(formName);
+                            this.editShow = false
+                            this.getList()
+                        })
+                    } else { // 修改
+                        let { id, ...data } = params
+                        putAllOfCorp({ recordId: id, ...data }).then(res => {
+                            this.msgSuccess("修改成功");
+                            this.resetForm(formName);
+                            this.editShow = false
+                            this.getList()
+                        })
+                    }
+                }
+            })
+        },
+        handleCutRecord() {
+            const { id, putUserId, operUserId, corpId, corpUserId } = this.recordData
+            this.title = '插入起始记录'
+            this.editShow = true
+            this.queryPlatformRecord = {
+                resourceId: id,
+                operUserId,
+                putUserId,
+                corpId,
+                corpUserId
+            }
+        },
+        /** 修改插入 */
+        insertDownHandle(item, type) {
+            this.title = `${type}记录`
+            this.editShow = true
+            let data = {}
+            if (item.beginTime) {
+                item.beginTime = item.beginTime.split(' ')[0]
+            }
+            if (item.endTime) {
+                item.endTime = item.endTime.split(' ')[0]
+            }
+            const { beginTime, endTime, id, operUserId, putUserId, corpId, corpUserId } = item
+            if (type === '修改') {
+                data = { beginTime, endTime, id }
+            } else {
+                data = { nextId: id, corpId, corpUserId }
+            }
+            this.queryPlatformRecord = {
+                ...data,
+                operUserId,
+                putUserId,
+            }
+        },
+        /** 删除 */
+        delRecordHandle(row) {
+            this.$confirm('确定删除?', '删除', {
+                distinguishCancelAndClose: true,
+                confirmButtonText: '确定',
+                cancelButtonText: '取消'
+            }).then(() => {
+                delAllOfCorp(row.id).then(res => {
+                    if (res.data) {
+                        this.msgSuccess('删除成功');
+                        this.getList()
+                    }
+                })
+            })
+        },
+        getList() {
+            this.loading = true
+            getAllOfCorpList(this.recordData.corpId, this.recordData.corpUserId).then(res => {
+                if (res) {
+                    this.recordList = res.data
+                }
+                this.loading = false
+            }).catch(() => this.loading = false)
+        },
+        // 关闭
+        recordClose() {
+            this.$emit("close");
+        }
+    }
+}
+</script>
+
+<style lang="scss">
+.custom {
+    width: 55% !important;
+}
+
+.cut {
+    padding: 0 10px;
+    box-sizing: border-box;
+
+    .button {
+        margin-bottom: 10px;
+    }
+
+    .el-table .cell {
+        line-height: normal;
+    }
+
+    ul {
+        padding-left: 0;
+
+        .sumitInfo {
+            // margin-top: 20px;
+            font-weight: 600;
+            margin-bottom: 10px;
+
+            .button {
+                margin-left: 20px;
+            }
+        }
+    }
+}
+</style>

+ 409 - 0
src/views/accounts/corpWechat/index.vue

@@ -0,0 +1,409 @@
+<template>
+    <div class="app-container">
+        <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
+            <el-form-item label="" prop="corpName">
+                <el-input v-model="queryParams.corpName" placeholder="企微名称" clearable size="small" style="width: 140px"
+                    @keyup.enter.native="getList" />
+            </el-form-item>
+            <el-form-item label="" prop="originCorpId">
+                <el-input v-model="queryParams.originCorpId" placeholder="企微ID" clearable size="small"
+                    style="width: 140px" @keyup.enter.native="getList" />
+            </el-form-item>
+            <el-form-item label="" prop="applicationType">
+                <el-select v-model="queryParams.applicationType" placeholder="请选择应用类型" size="small" filterable clearable
+                    style="width: 140px;">
+                    <el-option v-for="item in applicationTypeList" :key="item.value" :label="item.label"
+                        :value="item.value" />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="" prop="authStatus">
+                <el-select v-model="queryParams.authStatus" placeholder="授权状态" clearable filterable style="width: 140px"
+                    size="small" @keyup.enter.native="handleQuery">
+                    <el-option label="成功授权" :value="1" />
+                    <el-option label="取消授权" :value="-1" />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="" prop="configStatus">
+                <el-select v-model="queryParams.configStatus" placeholder="配置状态" clearable filterable
+                    style="width: 140px" size="small" @keyup.enter.native="handleQuery">
+                    <el-option label="未配置" value="ING" />
+                    <el-option label="配置成功" value="SUCCESS" />
+                    <el-option label="配置失败" value="ERROR" />
+                </el-select>
+            </el-form-item>
+            <el-form-item>
+                <el-button type="cyan" icon="el-icon-search" size="mini" @click="getList">搜索</el-button>
+                <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+            </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8" align="middle">
+            <el-col :span="1.5">
+                <div class="grid-content">
+                    <el-button type="primary" size="mini" @click="warrantHandle">新增企业</el-button>
+                </div>
+            </el-col>
+            <el-col :span="1.5">
+                <div style="padding-top: 9px;font-size: 12px;margin-left: 5px">服务商(点击授权):</div>
+            </el-col>
+            <el-col :span="1.5" v-for="item in providerList" :key="item.id">
+                <el-button size="mini" @click="getCode(item.id)">{{ item.providerName }}</el-button>
+            </el-col>
+            <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+
+        <el-table :data="corpList" v-loading="loading" size="mini">
+            <el-table-column label="企微名称" prop="corpName" width="200" fixed="left"
+                :show-overflow-tooltip="true">
+                <template slot-scope="scope">
+                    <div>{{scope.row.corpName}}</div>
+                    <div>{{scope.row.originCorpId}}</div>
+                </template>
+            </el-table-column>
+            <el-table-column label="授权方企业类型" prop="corpType" align="center" width="150">
+                <template slot-scope="scope">{{ scope.row.corpType | filterCorpType }}</template>
+            </el-table-column>
+            <el-table-column label="认证到期时间" prop="verifiedEndTime" align="center" width="135" />
+            <el-table-column label="授权状态" prop="authStatus" align="center" width="120">
+                <template slot-scope="scope">
+                    <el-tag type="success" v-if="scope.row.authStatus === 1">成功授权</el-tag>
+                    <el-tag type="danger" v-else>取消授权</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column label="配置状态" prop="configStatus" align="center" width="120">
+                <template slot-scope="scope">
+                    <el-tag type="success" v-if="scope.row.configStatus === 'SUCCESS'">配置成功</el-tag>
+                    <el-tag type="warning" v-else-if="scope.row.configStatus === 'ING'">未配置</el-tag>
+                    <el-tag type="danger" v-else>配置失败</el-tag>
+                </template>
+            </el-table-column>
+            <el-table-column label="域名备案截图" prop="configStatus" align="center" width="120">
+                <template slot-scope="scope">
+                    <div v-if="!!scope.row.domainBeianImgUrl" style="display: flex; flex-direction: row; align-items: flex-end; justify-content: center; gap: 5px;">
+                        <el-image :src="scope.row.domainBeianImgUrl" fit="fill" :preview-src-list="[scope.row.domainBeianImgUrl]" style="width: 70px; height: 70px; cursor: pointer;" />
+                        <el-link type="primary" :underline="false" style="font-size: 12px;" @click="downloadImg(scope.row.domainBeianImgUrl, scope.row.corpName)">下载</el-link>
+                    </div>
+                    <span v-else>--</span>
+                </template>
+            </el-table-column>
+            <el-table-column label="授权信息" prop="externalUserCallbackUrl" width="300" :show-overflow-tooltip="true">
+                <template slot-scope="scope">
+                    <div class="table-row">回调地址:<a style="color: #1890ff;" v-if="scope.row.agentCallbackUrl" @click="copy(scope.row.externalUserCallbackUrl)">{{scope.row.agentCallbackUrl}}</a><span v-else>--</span></div>
+                    <div class="table-row">Token:<a style="color: #1890ff;" v-if="scope.row.token" @click="copy(scope.row.externalUserToken)">{{scope.row.token}}</a><span v-else>--</span></div>
+                    <div class="table-row">AESKey:<a style="color: #1890ff;" v-if="scope.row.encodingAesKey" @click="copy(scope.row.encodingAesKey)">{{scope.row.encodingAesKey}}</a><span v-else>--</span></div>
+                </template>
+            </el-table-column>
+            <el-table-column label="授权时间" prop="createTime" width="135" :show-overflow-tooltip="true" />
+            <el-table-column label="备注" prop="remark" width="250" :show-overflow-tooltip="true" />
+            <el-table-column label="操作" width="200" class-name="small-padding fixed-width" fixed="right">
+                <template slot-scope="scope">
+                    <div v-if="scope.row.authStatus === 1" class="czCell">
+                        <el-button size="mini" type="text" icon="el-icon-edit"
+                            @click="handleRefresh(scope.row)">修改</el-button>
+                        <!-- <el-button size="mini" type="text" icon="el-icon-setting"
+                            @click="setSecretHandle(scope.row)">配置密钥</el-button>
+                        <el-button size="mini" v-if="scope.row.corpId" type="text" icon="el-icon-setting"
+                            @click="setSessionHandle(scope.row)">配置会话存档</el-button> -->
+                        <template v-if="scope.row.configStatus === 'SUCCESS'">
+                            <el-dropdown style="margin-left: 7px;">
+                                <el-button class="el-dropdown-link" size="mini" type="text">更多<i class="el-icon-arrow-down el-icon--right"></i></el-button>
+                                <el-dropdown-menu slot="dropdown">
+                                    <el-dropdown-item><el-button size="mini" type="text" icon="el-icon-refresh"
+                                            @click="handleSync(scope.row)">同步所有</el-button></el-dropdown-item>
+                                    <el-dropdown-item><el-button size="mini" type="text" icon="el-icon-tickets"
+                                            @click="handleMailList(scope.row)">企微通讯录</el-button></el-dropdown-item>
+                                </el-dropdown-menu>
+                            </el-dropdown>
+                        </template>
+                    </div>
+                </template>
+            </el-table-column>
+        </el-table>
+
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+            :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+        <setSecret :value="secretData" :applicationTypeList="applicationTypeList" :visible="setShow"
+            @close="setShow = false; secretData = { bookAgentIdMap: [] }" @change="closeSetSecret(); getList()" />
+        <mailList :corpId="corpId" :visible="mailShow" @close="mailShow = false; corpId = null" />
+        <set-session v-if="sessionVisible" :visible="sessionVisible" :msgAuditSecret="msgAuditSecret" :corpId="corpId"
+            @close="msgAuditSecret = {}; corpId = null; sessionVisible = false" @change="sessionChange()" />
+
+        <modal-corp :visible="corpVisible" :modifyData="corpData" :modalTitle="corpTitle" @onClose="corpVisible = false"
+            @onChange="corpVisible = false; getList()" />
+
+        <el-dialog title="扫码授权" :visible.sync="codeVisible" width="240px" :before-close="handleCodeClose">
+            <canvas ref="qrcodeCanvas"></canvas>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { getProviderAuth, getCorpList, getProviderList, putSyncAllCorpUser } from "@/api/accounts/corpWeChat";
+import setSecret from './setSecret.vue'
+import mailList from './mailList.vue'
+import setSession from './setSession.vue'
+import ModalCorp from './modalCorp.vue'
+import QRCode from 'qrcode';
+export default {
+    name: 'corp',
+    components: { setSecret, mailList, setSession, ModalCorp },
+    data() {
+        return {
+            showSearch: true,
+            loading: false,
+            queryParams: {
+                pageSize: 20,
+                pageNum: 1,
+                corpName: '',
+                originCorpId: '',
+                authStatus: 1
+            },
+            corpList: [],
+            total: 0,
+            setShow: false,
+            secretData: {
+                bookAgentIdMap: []
+            },
+            mailShow: false,
+            corpId: null,
+            applicationTypeList: [{ label: '内部应用', value: 'INTERNAL' }, { label: '自建应用', value: 'SELF_BUILT' }, { label: '服务商代开发应用', value: 'PROVIDER' }],
+            msgAuditSecret: null,
+            sessionVisible: false,
+
+            corpVisible: false,
+            corpData: null,
+            corpTitle: '新增企业',
+            providerList: [],
+            codeVisible: false,
+        }
+    },
+    mounted() {
+        this.$nextTick(() => {
+            window.addEventListener('storage', this.listener)
+        })
+    },
+    beforeDestroy() { // 在组件生命周期结束的时候销毁。
+        window.removeEventListener('storage', this.listener, false)
+    },
+    created() {
+        getProviderList().then(res => {
+            this.providerList = res.data
+        })
+        this.getList()
+    },
+    filters: {
+        filterCorpType(val) {
+            if (val) {
+                return { verified: '认证号', unverified: '注册号' }[val]
+            }
+            return '-1'
+        },
+        filterApplicationType(val) {
+            if (val) {
+                return { INTERNAL: '内部应用', SELF_BUILT: '自建应用', PROVIDER: '服务商代开发应用' }[val] || '-1';
+            }
+            return '-1'
+        }
+    },
+    methods: {
+        getCode(id) {
+            getProviderAuth({ providerId: id }).then(res => {
+                this.codeVisible = true
+                this.$nextTick(() => {
+                    const canvas = this.$refs.qrcodeCanvas;
+                    QRCode.toCanvas(canvas, res.data, { width: 200 }, function (error) {
+                        if (error) console.error('------->', error);
+                        console.log('QR code generated successfully!');
+                    });
+                })
+            })
+        },
+        handleCodeClose() {
+            this.codeVisible = false
+        },
+        copy(str) {
+            let element = document.createElement("textarea");
+            element.id = 'myTextarea'
+            element.textContent = str
+            document.body.append(element);
+            (document.getElementById('myTextarea')).select();
+            document.execCommand("Copy")
+            document.body.removeChild(element);
+            this.msgSuccess(`复制成功:${str}`);
+        },
+        handleSync(row) {
+            const loading = this.$loading({
+                lock: true,
+                text: 'Loading',
+                spinner: 'el-icon-loading',
+                background: 'rgba(0, 0, 0, 0.7)'
+            });
+            putSyncAllCorpUser(row.corpId).then(res => {
+                loading.close()
+                this.getList()
+            }).catch(() => loading.close())
+        },
+        handleMailList(row) {
+            this.mailShow = true
+            this.corpId = row.corpId
+        },
+        listener(e) {
+            if (e.key === 'corpAdMp') {
+                if (e.newValue === 'ok') {
+                    this.getList()
+                    this.msgSuccess("授权成功");
+                    localStorage.removeItem('corpAdMp')
+                } else {
+                    this.$message.error('授权失败');
+                    localStorage.removeItem('corpAdMp')
+                }
+            }
+        },
+        getList() {
+            this.loading = true
+            getCorpList(this.queryParams).then(res => {
+                this.corpList = res.data.records
+                this.total = res.data.total
+                this.loading = false
+            }).catch(() => this.loading = false)
+        },
+        /** 重置搜索条件 */
+        resetQuery() {
+            this.resetForm("queryForm");
+            this.getList();
+        },
+        /** 企微授权 */
+        warrantHandle() {
+            // getCorpToAuth({ redirectUri: encodeURIComponent(process.env.VUE_APP_CORP_URL) }).then(res => {
+            //     if (res.data) {
+            //         window.open(res.data)
+            //     }
+            // })
+            this.corpVisible = true
+            this.corpData = null
+            this.corpTitle = '新增企业'
+        },
+        /** 刷新企微信息 */
+        handleRefresh(row) {
+            // const loading = this.$loading({
+            //     lock: true,
+            //     text: 'Loading',
+            //     spinner: 'el-icon-loading',
+            //     background: 'rgba(0, 0, 0, 0.7)'
+            // });
+            // putRefreshCorp(row.corpId).then(res => {
+            //     loading.close()
+            //     this.getList()
+            // }).catch(() => loading.close())
+            const { originCorpId, corpId, corpFullName, corpName, bookAgentIdMap, bookAgentId, msgAuditSecret, msgAuditSeq, openAppId, openAppName, remark } = row
+            this.corpVisible = true
+            
+            this.corpData = { 
+                originCorpId, 
+                corpId, 
+                corpFullName, 
+                corpName,
+                bookAgentIdMap: [],
+                bookAgentId,
+                msgAuditSecret,
+                msgAuditSeq,
+                openAppId,
+                openAppName,
+                remark
+            }
+            if (bookAgentIdMap && Object.keys(bookAgentIdMap).length > 0) {
+                this.corpData.bookAgentIdMap = Object.keys(bookAgentIdMap).map(key => {
+                    return {
+                        bookCityId: key,
+                        bookAgentId: bookAgentIdMap[key]
+                    }
+                })
+            }
+            this.corpTitle = '修改企业'
+        },
+        /** 配置密钥 */
+        setSecretHandle(row) {
+            this.setShow = true
+            this.secretData = {
+                corpId: row.corpId,
+                originCorpId: row.originCorpId,
+                externalUserSecret: row.externalUserSecret,
+                bookAgentIdMap: [],
+                applicationType: row.applicationType,
+                remark: row.remark,
+                sysUserGroupIds: row.sysUserGroupIds
+            }
+            if (row.bookAgentIdMap && Object.keys(row.bookAgentIdMap).length > 0) {
+                this.secretData.bookAgentIdMap = Object.keys(row.bookAgentIdMap).map(key => {
+                    return {
+                        bookCityId: key,
+                        bookAgentId: row.bookAgentIdMap[key]
+                    }
+                })
+            }
+        },
+        /** 关闭配置 */
+        closeSetSecret() {
+            this.setShow = false
+            this.secretData = {}
+        },
+        /** 配置会话存档 */
+        setSessionHandle(row) {
+            this.corpId = row.corpId
+            this.msgAuditSecret = row.msgAuditSecret
+            this.sessionVisible = true
+        },
+        sessionChange() {
+            this.msgAuditSecret = {};
+            this.corpId = null;
+            this.sessionVisible = false;
+            this.getList()
+        },
+        downloadImg(url, name) {
+            // 获取扩展名
+            let ext = 'png';
+            if (url) {
+                const match = url.match(/\.([^.?#]+)(?:[?#]|$)/);
+                if (match && match[1]) {
+                    ext = match[1].toLowerCase();
+                }
+            }
+
+            // 针对阿里云 OSS 等跨域图片,直接用纯原生 window.open 或者是 a 标签在新窗口打开。
+            // 因为 OSS 匿名用户不支持重写 response header,同时 fetch 会报跨域错误,所以直接让浏览器接管(通常会直接打开图片预览)。
+            const a = document.createElement('a');
+            a.href = url;
+            a.download = `${name || '域名备案截图'}.${ext}`; // 尝试设置下载属性(跨域时浏览器可能忽略并直接打开)
+            a.target = '_blank';
+            document.body.appendChild(a);
+            a.click();
+            a.remove();
+        }
+    }
+}
+</script>
+
+<style scoped lang="scss">
+.czCell {
+    display: flex;
+    gap: 0px 5px;
+    flex-wrap: wrap;
+
+    >button {
+        padding: 0;
+        margin-left: 0;
+    }
+}
+.table-row {
+    display: flex;
+    
+    a {
+        overflow: hidden;
+        text-overflow: ellipsis;
+        white-space: nowrap;
+        display: inline-block;
+        flex: 1;
+    }
+}
+</style>

+ 239 - 0
src/views/accounts/corpWechat/mailList.vue

@@ -0,0 +1,239 @@
+<template>
+    <div>
+        <el-dialog title="企微通讯录" v-if="visible" :visible.sync="visible" :before-close="beforeClose" width="900px">
+            <el-row :gutter="10" class="mb8" align="middle">
+                <el-col :span="1.5">
+                    <el-input v-model="queryParams.name" placeholder="企微号名称" clearable size="small" style="width: 140px"
+                        @keyup.enter.native="handleQuery" />
+                </el-col>
+                <el-col :span="1.5"><el-button type="cyan" icon="el-icon-search" size="mini"
+                        @click="handleQuery">搜索</el-button></el-col>
+                <el-col :span="1.5"><el-button size="mini" type="primary" icon="el-icon-sort"
+                        :disabled="corpUserIds.length === 0"
+                        @click="handlePut({ corpUserIds: corpUserIds })">批量指派</el-button></el-col>
+                <el-col :span="1.5">
+                    <div class="grid-content">
+                        <el-button type="primary" size="mini" @click="syncHandle">同步通讯录</el-button>
+                    </div>
+                </el-col>
+            </el-row>
+            <el-table :data="mailList" v-loading="loading" size="mini" @selection-change="handleSelectionChange">
+                <el-table-column type="selection" width="50" align="center" fixed="left" />
+                <el-table-column label="企微号ID" prop="corpUserId" width="140" align="center" :show-overflow-tooltip="true" />
+                <el-table-column label="企微号" prop="name" width="120" align="center" />
+                <el-table-column label="运营" prop="operUserId" align="center" width="100">
+                    <template slot-scope="scope">
+                        <div>{{ scope.row.operUserId ? scope.row.operUser.nickName : '--' }}</div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="投手" prop="putUserId" align="center" width="100">
+                    <template slot-scope="scope">
+                        <div>{{ scope.row.putUserId ? scope.row.putUser.nickName : '--' }}</div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="状态" prop="status" align="center" width="100">
+                    <template slot-scope="scope">
+                        <div>{{ scope.row.status === 1 ? '已激活' : scope.row.status === 2 ? '已禁用' : scope.row.status === 4 ?
+                            '未激活' : scope.row.status === 5 ? '退出企业' : '--' }}</div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="创建时间" prop="createTime" align="center" width="150" />
+                <el-table-column label="操作" width="150" align="center" class-name="small-padding fixed-width" fixed="right">
+                    <template slot-scope="scope">
+                        <template>
+                            <el-button size="mini" type="text" icon="el-icon-sort"
+                                @click="handlePut(scope.row)">指派</el-button>
+                            <el-button size="mini" type="text" icon="el-icon-tickets"
+                                @click="handleRecord(scope.row)">变更记录</el-button>
+                        </template>
+                    </template>
+                </el-table-column>
+            </el-table>
+
+            <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+                :limit.sync="queryParams.pageSize" @pagination="getList" />
+        </el-dialog>
+
+        <el-dialog title="指派" :visible.sync="openSys" width="500px" append-to-body>
+            <el-form :model="assignUSerData" :rules="rules" ref="platFormSysType" label-width="80px" label-position="top">
+                <el-form-item label="开始时间" prop="beginTime">
+                    <el-date-picker v-model="assignUSerData.beginTime" type="date" format="yyyy-MM-dd"
+                        value-format="yyyy-MM-dd" placeholder="选择开始时间"></el-date-picker>
+                </el-form-item>
+                <el-form-item label="运营" prop="operUserId">
+                    <el-select v-model="assignUSerData.operUserId" placeholder="请选择" filterable style="width: 100%"
+                        clearable>
+                        <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="投手" prop="putUserId">
+                    <el-select v-model="assignUSerData.putUserId" placeholder="请选择" filterable style="width: 100%"
+                        clearable>
+                        <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id" />
+                    </el-select>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="openSys = false; assignUSerData = {}">取 消</el-button>
+                <el-button type="primary" @click="assignUSerSubmit">确 定</el-button>
+            </span>
+        </el-dialog>
+        <changeRecord :visible="recordShow" :recordData="recordData" :userAll="userAll"
+            @close=" recordShow = false; recordData = {}" />
+    </div>
+</template>
+
+<script>
+import { putSyncCorpUser, getCorpMailList, putCorpSysUser } from "@/api/accounts/corpWeChat";
+import { allUser } from "@/api/system/user";
+import { formatDateYMD } from "@/utils"
+import changeRecord from './changeRecord.vue'
+export default {
+    name: 'mailList',
+    components: { changeRecord },
+    data() {
+        return {
+            queryParams: {
+                pageNum: 1,
+                pageSize: 20
+            },
+            mailList: [],
+            loading: false,
+            total: 0,
+            openSys: false,
+            userAll: [], //所有用户
+            assignUSerData: {},
+            rules: {
+                beginTime: [
+                    { required: true, message: '请输入开始时间', trigger: 'blur' }
+                ],
+                operUserId: [
+                    { required: true, message: '请选择运营', trigger: 'blur' }
+                ],
+                putUserId: [
+                    { required: true, message: '请选择投手', trigger: 'blur' }
+                ],
+            },
+            recordShow: false,
+            recordData: {},
+            corpUserIds: []
+        }
+    },
+    props: {
+        corpId: {
+            type: String,
+            default: '',
+        },
+        visible: {
+            type: Boolean,
+            default: false
+        }
+    },
+    watch: {
+        visible: {
+            handler(val) {
+                if (val) {
+                    this.$nextTick(() => {
+                        this.getList()
+                        this.getAll()
+                    })
+                }
+            },
+            immediate: true,
+        },
+    },
+    methods: {
+        /** 搜索 */
+        handleQuery() {
+            this.queryParams = {
+                ...this.queryParams,
+                pageNum: 1
+            }
+            this.$nextTick(() => {
+                this.getList()
+            })
+		},
+        handleSelectionChange(selection) {
+            this.corpUserIds = selection.map((item) => item.corpUserId)
+        },
+        // 变更记录
+        handleRecord(row) {
+            this.recordShow = true
+            this.recordData = row
+        },
+        // 指派
+        handlePut(row) {
+            this.openSys = true
+            this.assignUSerData = {
+                beginTime: formatDateYMD(new Date()),
+                operUserId: row.operUserId,
+                putUserId: row.putUserId,
+                corpId: this.corpId,
+                corpUserIds: row.corpUserId ? [row.corpUserId] : row.corpUserIds
+            }
+        },
+        assignUSerSubmit() {
+            this.$refs['platFormSysType'].validate((valid) => {
+                if (valid) {
+                    console.log(this.assignUSerData);
+                    const loading = this.$loading({
+                        lock: true,
+                        text: 'Loading',
+                        spinner: 'el-icon-loading',
+                        background: 'rgba(0, 0, 0, 0.7)'
+                    });
+                    putCorpSysUser(this.assignUSerData).then(res => {
+                        if (res.data) {
+                            this.$message({
+                                showClose: true,
+                                message: '指派成功',
+                                type: 'success'
+                            });
+                            this.openSys = false
+                            this.assignUSerData = {}
+                            this.getList()
+                        }
+                        loading.close()
+                    }).catch(() => loading.close())
+                }
+            })
+        },
+        getAll() {
+            // 所有用户
+            allUser().then((response) => {
+                let data = response.data;
+                this.userAll = data.map((item) => {
+                    return { id: item.userId, nickName: item.nickname };
+                });
+            });
+        },
+        beforeClose() {
+            this.$emit("close");
+        },
+        syncHandle() {
+            const loading = this.$loading({
+                lock: true,
+                text: 'Loading',
+                spinner: 'el-icon-loading',
+                background: 'rgba(0, 0, 0, 0.7)'
+            });
+            putSyncCorpUser(this.corpId).then(res => {
+                this.msgSuccess("同步成功");
+                loading.close()
+                this.getList()
+            }).catch(() => loading.close())
+        },
+        getList() {
+            this.loading = true
+            getCorpMailList({ corpId: this.corpId, ...this.queryParams }).then(res => {
+                this.mailList = res.data.records
+                this.total = res.data.total
+                this.loading = false
+            }).catch(() => this.loading = false)
+        },
+        onClose() {
+            this.visible = false
+        }
+    }
+}
+</script>

+ 356 - 0
src/views/accounts/corpWechat/modalCorp.vue

@@ -0,0 +1,356 @@
+<template>
+    <div>
+        <el-dialog :title="modalTitle" :visible.sync="visible" width="600px" :before-close="onClose">
+            <el-form :model="queryParams" :rules="rules" ref="queryParamsCorpModify" label-position="top">
+                <el-form-item label="企业ID" prop="originCorpId">
+                    <el-input v-model="queryParams.originCorpId" :disabled="!!queryParams.corpId" placeholder="请输入企业ID" clearable size="small" />
+                </el-form-item>
+                <el-form-item label="企业简称" prop="corpName">
+                    <el-input v-model="queryParams.corpName" placeholder="请输入企业简称" clearable size="small" />
+                </el-form-item>
+                <el-form-item label="企业全称" prop="corpFullName">
+                    <el-input v-model="queryParams.corpFullName" placeholder="请输入企业全称" clearable size="small" />
+                </el-form-item>
+                <template v-if="queryParams.corpId">
+                    <!-- 修改 -->
+                    <el-form-item label="当前在投的书城企微应用ID" prop="bookAgentId">
+                        <el-input v-model="queryParams.bookAgentId" placeholder="请输入当前在投的书城企微应用ID" clearable size="small" oninput="value=value.replace(/[^\d]/g,'')" />
+                    </el-form-item>
+                    <el-form-item label="书城企微应用ID">
+                        <el-form :model="item" :rules="rulesBookCityType" ref="bookCityType" label-width="80px" label-position="top"
+                            v-for="(item, index) in queryParams.bookAgentIdMap" :key="index">
+                            <el-row :gutter="20">
+                                <el-col :span="8">
+                                    <el-form-item label="书城" prop="bookCityId">
+                                        <el-select v-model="item.bookCityId" size="small" placeholder="选择书城" filterable clearable>
+                                            <el-option v-for="item in bookCity" :disabled="item.disabled" :key="item.id"
+                                                :label="item.platformName" :value="item.platformKey" />
+                                        </el-select>
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="12">
+                                    <el-form-item label="书城应用ID" prop="bookAgentId">
+                                        <el-input v-model.number="item.bookAgentId" placeholder="请输入书城应用ID" clearable
+                                            size="small" />
+                                    </el-form-item>
+                                </el-col>
+                                <el-col :span="2">
+                                    <div style="margin-top: 42px">
+                                        <el-button @click.prevent="removeResource(index)" type="text" icon="el-icon-delete"
+                                            style="color: red; margin-left: 10px"></el-button>
+                                    </div>
+                                </el-col>
+                            </el-row>
+                        </el-form>
+                        <el-button type="text" icon="el-icon-plus" @click="addResource">新增书城</el-button>
+                    </el-form-item>
+                    <el-form-item label="会话存档密钥" prop="msgAuditSecret">
+                        <el-input v-model="queryParams.msgAuditSecret" placeholder="请输入会话存档密钥" clearable size="small" />
+                    </el-form-item>
+                    <el-form-item label="会话存档Seq" prop="msgAuditSeq">
+                        <el-input v-model="queryParams.msgAuditSeq" placeholder="请输入会话存档Seq" clearable size="small" />
+                    </el-form-item>
+                    <el-form-item label="开放平台绑定的小程序/公众号名字" prop="openAppName">
+                        <el-input v-model="queryParams.openAppName" placeholder="请输入开放平台绑定的小程序/公众号的AppId" clearable size="small" />
+                    </el-form-item>
+                    <el-form-item label="开放平台绑定的小程序/公众号的AppId" prop="openAppId">
+                        <el-input v-model="queryParams.openAppId" placeholder="请输入开放平台绑定的小程序/公众号的AppId" clearable size="small" />
+                    </el-form-item>
+                </template>
+                <template v-else>
+                    <el-form-item label="应用类型" prop="authType">
+                        <el-radio-group v-model="queryParams.authType">
+                            <el-radio label="SELF_BUILT">自建应用</el-radio>
+                            <el-radio label="INTERNAL">内部应用</el-radio>
+                            <el-radio label="AUTH_PROVIDER">服务商代开发应用</el-radio>
+                        </el-radio-group>
+                    </el-form-item>
+                    <el-form-item label="应用ID" prop="agentId">
+                        <el-input v-model="queryParams.agentId" placeholder="请输入应用ID" clearable size="small" oninput="value=value.replace(/[^\d]/g,'')" />
+                    </el-form-item>
+                    <el-form-item label="应用密钥" prop="agentSecret">
+                        <el-input v-model="queryParams.agentSecret" placeholder="请输入应用密钥" clearable size="small" />
+                    </el-form-item>
+                    <template v-if="queryParams.authType === 'SELF_BUILT'">
+                        <el-form-item label="企微请求代理地址" prop="proxyUrl">
+                            <el-input v-model="queryParams.proxyUrl" placeholder="请输入企微请求代理地址" clearable size="small" />
+                        </el-form-item>
+                        <el-form-item label="备案的域名" prop="domain">
+                            <el-input v-model="queryParams.domain" placeholder="请输入备案的域名" clearable size="small" />
+                        </el-form-item>
+                        <el-form-item label="域名备案查询截图" prop="domainBeianImgUrl">
+                            <el-upload
+                                class="avatar-uploader"
+                                action=""
+                                :show-file-list="false"
+                                :http-request="handleUpload"
+                                :before-upload="beforeUpload"
+                                accept="image/jpeg,image/png,image/jpg"
+                            >
+                                <img v-if="queryParams.domainBeianImgUrl" :src="queryParams.domainBeianImgUrl" class="avatar">
+                                <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+                            </el-upload>
+                        </el-form-item>
+                    </template>
+                </template>
+                
+                <el-form-item label="企业备注" prop="remark">
+                    <el-input v-model="queryParams.remark" placeholder="请输入企业备注" clearable size="small" />
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="onClose()">取 消</el-button>
+                <el-button type="primary" :loading="loading" @click="submit('queryParamsCorpModify')">确 定</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { addCorpApi, editCorpApi, uploadImageApi } from "@/api/accounts/corpWeChat";
+import axios from 'axios';
+import { getBookPlatInfoAll } from "@/api/accounts/bookCity";
+export default {
+    data() {
+        return {
+            queryParams: {
+                corpFullName: null,
+                corpName: null,
+                originCorpId: null,
+                authType: 'SELF_BUILT',
+                agentId: null,
+                agentSecret: null,
+                proxyUrl: null,
+                domain: null,
+                domainBeianImgUrl: null,
+                remark: null
+            },
+            rulesBookCityType: {
+                bookCityId: [
+                    { required: true, message: '请选择书城', trigger: 'change' }
+                ],
+                bookAgentId: [
+                    { required: true, message: '请输入书城应用ID', trigger: 'change' }
+                ]
+            },
+            rules: {
+                corpFullName: [
+                    { required: true, message: '请输入企业全称', trigger: 'blur' }
+                ],
+                originCorpId: [
+                    { required: true, message: '请输入企业ID', trigger: 'blur' }
+                ],
+                corpName: [
+                    { required: true, message: '请输入企业简称', trigger: 'blur' }
+                ],
+                authType: [
+                    { required: true, message: '请选择应用类型', trigger: 'blur' }
+                ],
+                agentId: [
+                    { required: true, message: '请输入应用ID', trigger: 'blur' }
+                ],
+                agentSecret: [
+                    { required: true, message: '请输入应用密钥', trigger: 'blur' }
+                ]
+            },
+            loading: false,
+            bookCity: [],
+            bookCityCS: [],
+        }
+    },
+    props: {
+        visible: {
+            type: Boolean,
+            default: false,
+        },
+        modifyData: {
+            type: Object,
+            default: null
+        },
+        modalTitle: {
+            type: String,
+            default: '新增企业'
+        }
+    },
+    watch: {
+        modifyData: {
+            handler(val) {
+                if (val && Object.keys(val).length > 0) {
+                    this.queryParams = val
+                    this.queryParams.bookAgentIdMap = val.bookAgentIdMap || []
+                } else {
+                    this.queryParams = {
+                        corpFullName: null,
+                        corpName: null,
+                        originCorpId: null,
+                        authType: 'SELF_BUILT',
+                        agentId: null,
+                        agentSecret: null,
+                        proxyUrl: null,
+                        domain: null,
+                        domainBeianImgUrl: null,
+                        remark: null
+                    }
+                }
+            },
+            immediate: true,
+        },
+        'queryParams.bookAgentIdMap': {
+            handler(val) {
+                if (val && val.length > 0) {
+                    let data = this.bookCityCS.map(item => {
+                        if (val.some(i => i.bookCityId === item.platformKey)) {
+                            return { ...item, disabled: true }
+                        }
+                        return { ...item, disabled: false }
+                    })
+                    this.bookCity = data
+                } else {
+                    this.bookCity = this.bookCityCS
+                }
+            },
+            deep: true,
+            immediate: false,
+        }
+    },
+    created() {
+        this.getAllData()
+    },
+    methods: {
+        /** 新增用户 */
+        addResource() {
+            let oldData = JSON.parse(JSON.stringify(this.queryParams.bookAgentIdMap))
+            oldData.push({
+                bookCityId: null,
+                bookAgentId: null
+            })
+            this.queryParams.bookAgentIdMap = oldData
+        },
+         /** 删除用户 */
+        removeResource(index) {
+            this.queryParams.bookAgentIdMap.splice(index, 1)
+        },
+        getAllData() {
+            // 获取所有书城
+            getBookPlatInfoAll().then(res => {
+                this.bookCity = res.data
+                this.bookCityCS = res.data
+            })
+        },
+        onClose() {
+            this.$emit("onClose");
+        },
+        submit(formName) {
+            this.$refs[formName].validate(async (valid) => {
+                if (valid) {
+                    this.loading = true
+                    let data = null
+                    if (this.modifyData && this.modifyData.corpId) {
+                        let params = JSON.parse(JSON.stringify(this.queryParams))
+                        // 新增应用时,bookAgentIdMap 为空
+                        if (params.bookAgentIdMap && params.bookAgentIdMap.length > 0) {
+                            
+                            let bookAgentIdMap = {}
+                            params.bookAgentIdMap.forEach(item => {
+                                bookAgentIdMap[item.bookCityId] = item.bookAgentId
+                            })
+                            params.bookAgentIdMap = bookAgentIdMap
+                        }
+                        data = await editCorpApi({ ...params, corpId: this.modifyData.corpId }).catch(err => {
+                            this.loading = false
+                        })
+                    } else {
+                        data = await addCorpApi(this.queryParams).catch(err => {
+                            this.loading = false
+                        })
+                    }
+
+                    this.loading = false
+                    if (data.data) {
+                        this.$message({
+                            message: (this.modifyData && this.modifyData.corpId) ? '修改成功' : '新增成功',
+                            type: 'success'
+                        });
+                        this.resetForm(formName);
+                        this.$emit("onChange");
+                    }
+                }
+            })
+        },
+        async handleUpload(option) {
+            const file = option.file;
+            const suffix = file.name.substring(file.name.lastIndexOf('.') + 1);
+            try {
+                const res = await uploadImageApi({ filePrefix: 'corp_info/corp_icp/', suffix: 'image/' + suffix });
+                if (res.code === 200 && res.data) {
+                    const data = res.data;
+                    const formData = new FormData();
+                    
+                    for (let key in data) {
+                        if (key !== 'host' && key !== 'ossUrl' && key !== 'domain') {
+                            formData.append(key, data[key]);
+                        }
+                    }
+                    formData.append('file', file);
+                    
+                    const uploadUrl = data.ossUrl;
+                    
+                    const uploadRes = await axios.post(uploadUrl, formData, {
+                        headers: { 'Content-Type': 'multipart/form-data' }
+                    });
+                    // Depending on what is returned by the OSS or common upload
+                    if (uploadRes.data.data) {
+                        this.queryParams.domainBeianImgUrl = uploadRes.data.data;
+                        this.$message.success('上传成功');
+                    } else {
+                        this.$message.error('上传失败');
+                    }
+                } else {
+                    this.$message.error(res.msg || '获取上传凭证失败');
+                }
+            } catch (error) {
+                console.error(error);
+                this.$message.error('上传失败');
+            }
+        },
+        beforeUpload(file) {
+            const isImage = file.type.indexOf("image/") !== -1;
+            if (!isImage) {
+                this.$message.error("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。");
+            }
+            const isLt10M = file.size / 1024 / 1024 < 10;
+            if (!isLt10M) {
+                this.$message.error("上传图片大小不能超过 10MB!");
+            }
+            return isImage && isLt10M;
+        }
+
+    }
+}
+</script>
+
+<style scoped>
+.avatar-uploader ::v-deep .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+}
+.avatar-uploader ::v-deep .el-upload:hover {
+    border-color: #409EFF;
+}
+.avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 100px;
+    height: 100px;
+    line-height: 100px;
+    text-align: center;
+}
+.avatar {
+    width: 100px;
+    height: 100px;
+    display: block;
+}
+</style>

+ 241 - 0
src/views/accounts/corpWechat/setSecret.vue

@@ -0,0 +1,241 @@
+<template>
+    <el-dialog :title="title" :visible.sync="visible" width="450px" :before-close="onClose">
+        <el-form :model="queryForm" ref="setSecret" :rules="rules">
+            <el-form-item label="企微ID" prop="originCorpId">
+                <el-input v-model.number="queryForm.originCorpId" placeholder="请输入企微ID" clearable size="small" />
+            </el-form-item>
+            <el-form-item label="应用类型" prop="applicationType">
+                <el-select v-model="queryForm.applicationType" placeholder="请选择应用类型" size="small" filterable clearable style="width: 100%;">
+                    <el-option v-for="item in applicationTypeList" :key="item.value" :label="item.label" :value="item.value" />
+                </el-select>
+            </el-form-item>
+            <el-form-item label="客户密钥" v-if="queryForm.applicationType !== 'PROVIDER'" prop="externalUserSecret">
+                <el-input v-model="queryForm.externalUserSecret" placeholder="请输入客户密钥" clearable size="small" />
+            </el-form-item>
+            <!-- <el-form-item label="书城应用ID" prop="bookAgentId">
+                <el-input v-model.number="queryForm.bookAgentId" placeholder="请输入书城应用ID" clearable size="small" />
+            </el-form-item> -->
+            <el-form-item label="用户分组" prop="sysUserGroupIds">
+                <el-select v-model="queryForm.sysUserGroupIds" placeholder="请选择" size="small" multiple filterable clearable style="width: 100%;">
+                    <el-option v-for="item in groupsOptions" :key="item.id" :label="item.groupName" :value="item.id" />
+                </el-select>
+            </el-form-item>
+            <div>
+                <el-form :model="item" :rules="rulesBookCityType" ref="bookCityType" label-width="80px" label-position="top"
+                    v-for="(item, index) in queryPlatformBookCity" :key="index">
+                    <el-row :gutter="20">
+                        <el-col :span="8">
+                            <el-form-item label="书城" prop="bookCityId">
+                                <el-select v-model="item.bookCityId" size="small" placeholder="选择书城" filterable clearable>
+                                    <el-option v-for="item in bookCity" :disabled="item.disabled" :key="item.id"
+                                        :label="item.platformName" :value="item.platformKey" />
+                                </el-select>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="书城应用ID" prop="bookAgentId">
+                                <el-input v-model.number="item.bookAgentId" placeholder="请输入书城应用ID" clearable
+                                    size="small" />
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="2">
+                            <div style="margin-top: 42px">
+                                <el-button @click.prevent="removeResource(index)" type="text" icon="el-icon-delete"
+                                    style="color: red; margin-left: 10px"></el-button>
+                            </div>
+                        </el-col>
+                    </el-row>
+                </el-form>
+                <el-button type="text" icon="el-icon-plus" @click="addResource">新增书城</el-button>
+            </div>
+            <el-form-item label="备注" prop="remark">
+                <el-input type="textarea" v-model="queryForm.remark" placeholder="请输入备注" clearable size="small" />
+            </el-form-item>
+        </el-form>
+
+        <span slot="footer" class="dialog-footer">
+            <el-button @click="onClose">取 消</el-button>
+            <el-button type="primary" @click="onSubmit()">确 定</el-button>
+        </span>
+    </el-dialog>
+</template>
+<script>
+import { refreshCorp } from "@/api/accounts/corpWeChat";
+import { getBookPlatInfoAll } from "@/api/accounts/bookCity";
+import { getGroupAll } from "@/api/system/group";
+export default {
+    name: 'setSecret',
+    data() {
+        return {
+            title: '配置通讯录',
+            rules: {
+                originCorpId: [
+                    { required: true, message: '请输入企微ID', trigger: 'blur' }
+                ],
+                applicationType: [
+                    { required: true, message: '请选择应用类型', trigger: 'blur' }
+                ],
+                externalUserSecret: [
+                    { required: true, message: '请输入客户密钥', trigger: 'blur' }
+                ],
+            },
+            queryForm: {
+
+            },
+            queryPlatformBookCity: [],
+            rulesBookCityType: {
+                bookCityId: [
+                    { required: true, message: '请选择书城', trigger: 'change' }
+                ],
+                bookAgentId: [
+                    { required: true, message: '请输入书城应用ID', trigger: 'change' }
+                ]
+            },
+            bookCity: [],
+            bookCityCS: [],
+            groupsOptions: []
+        }
+    },
+    props: {
+        /* 编辑器的内容 */
+        value: {
+            type: Object,
+            default: {},
+        },
+        visible: {
+            type: Boolean,
+            default: false
+        },
+        applicationTypeList: {
+            type: Array,
+            default: []
+        }
+    },
+    watch: {
+        visible: {
+            handler(val) {
+                console.log('11111-->', val)
+            },
+            immediate: true,
+        },
+        value: {
+            handler(val) {
+                let { bookAgentIdMap, ...data } = val
+                this.queryForm = data
+                this.queryPlatformBookCity = bookAgentIdMap
+            },
+            immediate: true,
+        },
+        queryPlatformBookCity: {
+            handler(val) {
+                if (val && val.length > 0) {
+                    let data = this.bookCityCS.map(item => {
+                        if (val.some(i => i.bookCityId === item.platformKey)) {
+                            return { ...item, disabled: true }
+                        }
+                        return { ...item, disabled: false }
+                    })
+                    this.bookCity = data
+                } else {
+                    this.bookCity = this.bookCityCS
+                }
+            },
+            deep: true,
+            immediate: false,
+        }
+    },
+    created() {
+        this.getAllData()
+    },
+    methods: {
+        /** 新增用户 */
+        addResource() {
+            let oldData = JSON.parse(JSON.stringify(this.queryPlatformBookCity))
+            oldData.push({
+                bookCityId: null,
+                bookAgentId: null
+            })
+            this.queryPlatformBookCity = oldData
+        },
+        /** 删除用户 */
+        removeResource(index) {
+            this.queryPlatformBookCity.splice(index, 1)
+        },
+        getAllData() {
+            // 获取所有书城
+            getBookPlatInfoAll().then(res => {
+                this.bookCity = res.data
+                this.bookCityCS = res.data
+            })
+            // 获取用户分组列表
+            getGroupAll().then(res => {
+                this.groupsOptions = res.data;
+            });
+        },
+        onClose() {
+            this.$emit("close");
+        },
+        stateHandle(ref) {
+            return new Promise((resolve) => {
+                ref.validate(valid => resolve(valid))
+            })
+        },
+        onSubmit() {
+            this.$refs['setSecret'].validate(async (valid) => {
+                if (valid) {
+                    let isOk = true
+                    if (this.$refs['bookCityType']) {
+                        let state = this.$refs['bookCityType'].map(async item => {
+                            return await this.stateHandle(item)
+                        })
+                        let okList = await Promise.all(state)
+                        if (okList.every(item => item)) {
+                            isOk = true
+                        } else {
+                            isOk = false
+                        }
+                    }
+                    if (isOk) {
+                        let bookAgentIdMap = {}
+                        this.queryPlatformBookCity.forEach(item => {
+                            bookAgentIdMap[item.bookCityId] = item.bookAgentId
+                        })
+                        const loading = this.$loading({
+                            lock: true,
+                            text: 'Loading',
+                            spinner: 'el-icon-loading',
+                            background: 'rgba(0, 0, 0, 0.7)'
+                        });
+                        refreshCorp({ ...this.queryForm, bookAgentIdMap }).then(res => {
+                            const h = this.$createElement;
+                            this.$msgbox({
+                                customClass: 'boxsss',
+                                title: '配置成功',
+                                closeOnPressEscape: false,
+                                closeOnClickModal: false,
+                                closeOnHashChange: false,
+                                showClose: false,
+                                message: h('div', null, [
+                                    h('div', { style: { 'overflow': 'hidden' } }, `URL: ${res.data.externalUserCallbackUrl}`),
+                                    h('div', null, `AESKey: ${res.data.aesKey}`),
+                                    h('div', null, `Token: ${res.data.token}`),
+                                ]),
+                                confirmButtonText: '确定'
+                            }).then(action => {
+                                this.$emit("change");
+                                loading.close()
+                            });
+
+                        }).catch(() => loading.close())
+                    }
+                }
+            })
+        }
+    }
+}
+</script>
+<style>
+.boxsss {
+    width: 600px !important;
+}
+</style>

+ 85 - 0
src/views/accounts/corpWechat/setSession.vue

@@ -0,0 +1,85 @@
+<template>
+    <el-dialog :title="title" :visible.sync="visible" width="450px" :before-close="onClose">
+        <el-form :model="queryForm" ref="setSession" :rules="rules">
+            <el-form-item label="存档Secret" prop="msgAuditSecret">
+                <el-input v-model="queryForm.msgAuditSecret" placeholder="请输入会话存档Secret" clearable size="small" />
+            </el-form-item>
+        </el-form>
+
+        <span slot="footer" class="dialog-footer">
+            <el-button @click="onClose">取 消</el-button>
+            <el-button type="primary" @click="onSubmit()">确 定</el-button>
+        </span>
+    </el-dialog>
+</template>
+
+<script>
+import { setMsgSession } from "@/api/accounts/corpWeChat";
+export default {
+    name: 'setSession',
+    data() {
+        return {
+            title: '配置通会话存档',
+            rules: {
+                msgAuditSecret: [
+                    { required: true, message: '请输入会话存档Secret', trigger: 'blur' }
+                ]
+            },
+            queryForm: { msgAuditSecret: null }
+        }
+    },
+    props: {
+        corpId: {
+            type: String,
+            default: null,
+        },
+        msgAuditSecret: {
+            type: String,
+            default: null,
+        },
+        visible: {
+            type: Boolean,
+            default: false
+        }
+    },
+    watch: {
+        msgAuditSecret: {
+            handler(val) {
+                this.queryForm.msgAuditSecret = val
+            },
+            immediate: true,
+        }
+    },
+    methods: {
+        onClose() {
+            this.$emit("close");
+        },
+        onSubmit() {
+            if (!this.corpId) {
+                this.$message.error('没有企业ID');
+                return
+            }
+            this.$refs['setSession'].validate(async (valid) => {
+                if (valid) {
+                    const loading = this.$loading({
+                        lock: true,
+                        text: 'Loading',
+                        spinner: 'el-icon-loading',
+                        background: 'rgba(0, 0, 0, 0.7)'
+                    });
+                    const params = { corpId: this.corpId, ...this.queryForm }
+                    console.log(params)
+                    setMsgSession(params).then(res => {
+                        this.$message({
+                            message: '配置成功',
+                            type: 'success'
+                        });
+                        loading.close()
+                        this.$emit("change");
+                    }).catch(() => loading.close())
+                }
+            })
+        }
+    }
+}
+</script>

+ 142 - 0
src/views/accounts/miniprogram/index.vue

@@ -0,0 +1,142 @@
+<template>
+    <div class="app-container">
+        <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
+            <el-form-item label="" prop="appName">
+                <el-input v-model="queryParams.appName" placeholder="请输入小程序名称" clearable size="small"
+                    @keyup.enter.native="handleQuery" />
+            </el-form-item>
+            <el-form-item label="" prop="appId">
+                <el-input v-model="queryParams.appId" placeholder="请输入AppId" clearable size="small"
+                    @keyup.enter.native="handleQuery" />
+            </el-form-item>
+            <el-form-item label="" prop="appDesc">
+                <el-input v-model="queryParams.appDesc" placeholder="请输入小程序详情" clearable size="small"
+                    @keyup.enter.native="handleQuery" />
+            </el-form-item>
+            <el-form-item label="" prop="appRemark">
+                <el-input v-model="queryParams.appRemark" placeholder="请输入小程序备注" clearable size="small"
+                    @keyup.enter.native="handleQuery" />
+            </el-form-item>
+            <el-form-item>
+                <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+                <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+            </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+                <el-button type="primary" icon="el-icon-plus" size="mini"
+                    @click="modifyData = null; handleAdd()">新增</el-button>
+            </el-col>
+            <el-col :span="1.5">
+                <el-popconfirm title="确定删除吗?" @confirm="handleDelete(selectIds)">
+                    <el-button slot="reference" :disabled="selectIds.length === 0" :loading="deleteLoading" size="mini" type="danger"
+                        icon="el-icon-delete">批量删除</el-button>
+                </el-popconfirm>
+            </el-col>
+            <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+
+        <el-table :data="miniprogramList" :loading="loading" :border="true" size="mini"
+            @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="55" />
+            <el-table-column label="小程序名称" prop="appName" align="center" width="150px" :show-overflow-tooltip="true" />
+            <el-table-column label="AppId" prop="appId" align="center" width="150px" :show-overflow-tooltip="true" />
+            <el-table-column label="小程序详情" prop="appDesc" :show-overflow-tooltip="true" width="350px" />
+            <el-table-column label="小程序备注" prop="appRemark" :show-overflow-tooltip="true" />
+            <el-table-column label="创建人" prop="createName" align="center" width="90px" />
+            <el-table-column label="创建时间" prop="createTime" align="center" width="160px" />
+            <el-table-column label="操作" align="center" width="120px">
+                <template slot-scope="scope">
+                    <el-button size="mini" type="text" icon="el-icon-edit" @click="handleEdit(scope.row)">编辑</el-button>
+                    <div style="display: inline-block;width: 10px"></div>
+                    <el-popconfirm title="确定删除吗?" @confirm="handleDelete(scope.row.id)">
+                        <el-button slot="reference" :loading="deleteLoading" size="mini" type="text" style="color: red"
+                            icon="el-icon-delete">删除</el-button>
+                    </el-popconfirm>
+                </template>
+            </el-table-column>
+        </el-table>
+        <!-- 翻页 -->
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+            :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+        <modify-mini :visible="visible" :modifyData="modifyData" @onClose="visible = false"
+            @onChange="visible = false; getList()" />
+    </div>
+</template>
+<script>
+import { getMiniList, delMinis } from "@/api/accounts/miniprogram";
+import modifyMini from './modify'
+export default {
+    components: { modifyMini },
+    data() {
+        return {
+            queryParams: {
+                pageNum: 1,
+                pageSize: 10,
+                appDesc: null,
+                appId: null,
+                appName: null,
+                appRemark: null,
+            },
+            showSearch: true,
+            total: 0,
+            loading: false,
+            miniprogramList: [],
+            visible: false,
+            modifyData: null,
+            deleteLoading: false,
+            multipleSelection: [],
+            selectIds: '',
+        }
+    },
+    created() {
+        this.getList()
+    },
+    methods: {
+        handleSelectionChange(val) {
+            this.multipleSelection = val;
+            this.selectIds = val.map(item => item.id).toString()
+        },
+        getList() {
+            this.loading = true
+            getMiniList(this.queryParams).then(response => {
+                this.loading = false
+                let data = response.data
+                this.total = data.total
+                let records = data.records
+                this.miniprogramList = records
+            }).catch(() => this.loading = false)
+        },
+        handleAdd() {
+            this.visible = true
+        },
+        /** 搜索 */
+        handleQuery() {
+            this.getList()
+        },
+        /** 搜索条件重置 */
+        resetQuery() {
+            this.resetForm("queryForm");
+            this.getList()
+        },
+        handleEdit(row) {
+            const { appName, appId, appDesc, appRemark, id } = row
+            this.modifyData = { appName, appId, appDesc, appRemark, id }
+            this.visible = true
+        },
+        handleDelete(ids) {
+            this.deleteLoading = true
+            delMinis(ids).then(() => {
+                this.deleteLoading = false
+                this.getList()
+                this.$message({
+                    message: '删除成功',
+                    type: 'success'
+                });
+            }).catch(() => this.deleteLoading = false)
+        }
+    }
+}
+</script>

+ 104 - 0
src/views/accounts/miniprogram/modify.vue

@@ -0,0 +1,104 @@
+<template>
+    <div>
+        <el-dialog :title="title" :visible.sync="visible" width="30%" :before-close="onClose">
+            <el-form :model="queryParams" :rules="rules" ref="queryParamsModify" label-position="left" label-width="100px">
+                <el-form-item label="小程序名称" prop="appName">
+                    <el-input v-model="queryParams.appName" placeholder="请输入小程序名称" clearable size="small" />
+                </el-form-item>
+                <el-form-item label="AppId" prop="appId">
+                    <el-input v-model="queryParams.appId" placeholder="请输入AppId" clearable size="small" />
+                </el-form-item>
+                <el-form-item label="小程序详情" prop="appDesc">
+                    <el-input v-model="queryParams.appDesc" placeholder="请输入小程序详情" clearable size="small" />
+                </el-form-item>
+                <el-form-item label="小程序备注" prop="appRemark">
+                    <el-input v-model="queryParams.appRemark" placeholder="请输入小程序备注" clearable size="small"
+                        type="textarea" :rows="2" />
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="onClose()">取 消</el-button>
+                <el-button type="primary" :loading="loading" @click="submit('queryParamsModify')">确 定</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { modifyMini } from "@/api/accounts/miniprogram";
+export default {
+    data() {
+        return {
+            queryParams: {
+                appDesc: null,
+                appId: null,
+                appName: null,
+                appRemark: null,
+            },
+            title: '新增小程序',
+            rules: {
+                appName: [
+                    { required: true, message: '请输入小程序名称', trigger: 'blur' }
+                ],
+                appId: [
+                    { required: true, message: '请输入AppId', trigger: 'blur' }
+                ],
+                appDesc: [
+                    { required: true, message: '请输入小程序详情', trigger: 'blur' }
+                ]
+            },
+            loading: false
+        }
+    },
+    props: {
+        visible: {
+            type: Boolean,
+            default: false,
+        },
+        modifyData: {
+            type: Object,
+            default: null
+        }
+    },
+    watch: {
+        modifyData: {
+            handler(val) {
+                if (val && Object.keys(val).length > 0) {
+                    this.queryParams = val
+                } else {
+                    this.queryParams = {
+                        appDesc: null,
+                        appId: null,
+                        appName: null,
+                        appRemark: null,
+                    }
+                }
+            },
+            immediate: true,
+        },
+    },
+    methods: {
+        onClose() {
+            this.$emit("onClose");
+        },
+        submit(formName) {
+            this.$refs[formName].validate(async (valid) => {
+                if (valid) {
+                    this.loading = true
+                    let data = await modifyMini(this.queryParams)
+                    this.loading = false
+                    if (data.data) {
+                        this.$message({
+                            message: this.queryParams.id ? '修改成功' : '新增成功',
+                            type: 'success'
+                        });
+                        this.resetForm(formName);
+                        this.$emit("onChange");
+                    }
+                }
+            })
+        },
+
+    }
+}
+</script>

+ 38 - 54
src/views/accounts/period/index.vue

@@ -1,67 +1,46 @@
 <template>
     <div class="app-container">
-        
+
         <el-row :gutter="10" class="mb8">
+            <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+                <el-form-item label="期数名称" prop="period">
+                    <el-input v-model="queryParams.period" placeholder="请输入期数名称" clearable size="small" style="width: 140px"
+                        @keyup.enter.native="getList()" />
+                </el-form-item>
+                <el-form-item>
+                    <el-button type="cyan" icon="el-icon-search" size="mini" @click="getList()">搜索</el-button>
+                    <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+                </el-form-item>
+            </el-form>
             <el-col :span="1.5">
-                <el-button
-                    type="primary"
-                    icon="el-icon-plus"
-                    size="mini"
-                    @click="handleAdd"
-                >添加</el-button>
+                <el-button type="primary" icon="el-icon-plus" size="mini" @click="handleAdd">添加</el-button>
             </el-col>
+
         </el-row>
 
         <el-table :data="periodList">
-            <el-table-column label="ID" prop="id" align="center"/>
-            <el-table-column label="期数" prop="period" align="center"/>
-            <el-table-column label="操作" align="center" >
+            <el-table-column label="ID" prop="id" align="center" width="120" />
+            <el-table-column label="期数" prop="period" align="center" width="350" />
+            <el-table-column label="操作">
                 <template slot-scope="scope">
-                    <el-button
-                        size="mini"
-                        type="text"
-                        icon="el-icon-edit"
-                        @click="handleEdit(scope.row)"
-                    >编辑</el-button>
+                    <el-button size="mini" type="text" icon="el-icon-edit" @click="handleEdit(scope.row)">编辑</el-button>
                     <div style="display: inline-block;width: 10px"></div>
-                    <el-popconfirm
-                        title="确定删除吗?"
-                        @confirm="handleDelete(scope.row)"
-                    >
-                        <el-button
-                            slot="reference"
-                            size="mini"
-                            type="text"
-                            icon="el-icon-delete"
-                        >删除</el-button>
+                    <el-popconfirm title="确定删除吗?" @confirm="handleDelete(scope.row)">
+                        <el-button slot="reference" size="mini" type="text" icon="el-icon-delete">删除</el-button>
                     </el-popconfirm>
                 </template>
-            </el-table-column>    
+            </el-table-column>
         </el-table>
 
         <!-- 翻页 -->
-        <pagination
-            v-show="total>0"
-            :total="total"
-            :page.sync="queryParams.pageNum"
-            :limit.sync="queryParams.pageSize"
-            @pagination="getList"
-        />
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+            @pagination="getList" />
 
         <!-- 添加弹窗 -->
-        <el-dialog 
-            :title="isAdd ? '添加期数' : '编辑期数'" 
-            :visible.sync="openEdit" 
-            width="400px"
-            @close="dialogClose"
-            >
+        <el-dialog :title="isAdd ? '添加期数' : '编辑期数'" :visible.sync="openEdit" width="400px" @close="dialogClose">
             <el-form :model="queryPlatform" :rules="rules" ref="platForm">
                 <el-form-item label="期数名称" prop="period">
-                    <el-input
-                        clearable
-                        size="small"
-                        v-model="queryPlatform.period"
-                    />
+                    <el-input clearable size="small" v-model="queryPlatform.period" />
                 </el-form-item>
             </el-form>
             <span slot="footer" class="dialog-footer">
@@ -99,6 +78,11 @@ export default {
         this.getList()
     },
     methods: {
+        /** 重置按钮操作 */
+        resetQuery() {
+            this.resetForm("queryForm");
+            this.getList();
+        },
         /** 期数新增 */
         handleAdd() {
             this.isAdd = true
@@ -115,12 +99,12 @@ export default {
         handleEdit(value) {
             this.openEdit = true
             this.isAdd = false
-            this.queryPlatform = {...value}
+            this.queryPlatform = { ...value }
         },
         /** 列表删除 */
         handleDelete(value) {
             delPeriod(value.id).then(response => {
-                if(response.data){
+                if (response.data) {
                     this.msgSuccess("删除成功");
                     this.getList()
                 }
@@ -130,11 +114,11 @@ export default {
         submitForm(formName) {
             this.$refs[formName].validate((valid) => {
                 if (valid) {
-                    if(this.isAdd) {
-                        
+                    if (this.isAdd) {
+
                         addPeriod(this.queryPlatform).then(response => {
                             this.openEdit = false
-                            if(response.data){
+                            if (response.data) {
                                 this.msgSuccess("添加成功");
                                 this.getList()
                                 this.queryPlatform = {
@@ -145,11 +129,11 @@ export default {
                             this.openEdit = false
                         });
 
-                    }else {
+                    } else {
                         console.log(this.queryPlatform)
                         editPeriod(this.queryPlatform).then(response => {
                             this.openEdit = false
-                            if(response.data){
+                            if (response.data) {
                                 this.msgSuccess("修改成功");
                                 this.getList()
                             }
@@ -157,7 +141,7 @@ export default {
                             this.openEdit = false
                         });
                     }
-                    
+
 
                 } else {
                     return false;
@@ -166,7 +150,7 @@ export default {
         },
         /** 弹窗关闭触发 */
         dialogClose() {
-            if(!this.isAdd){
+            if (!this.isAdd) {
                 this.queryPlatform = {
                     period: ''
                 }

+ 341 - 0
src/views/accounts/qwMapping/index.vue

@@ -0,0 +1,341 @@
+<template>
+    <div class="app-container">
+        <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
+            <el-form-item label="" prop="channel">
+                <el-input
+                    v-model="queryParams.channel"
+                    placeholder="请输入公众号"
+                    clearable
+                    size="small"
+                    style="width: 200px"
+                    @keyup.enter.native="handleQuery"
+                />
+            </el-form-item>
+            <el-form-item label="" prop="platformName">
+                <el-select v-model="queryParams.platformName" placeholder="请选择书城" size="small" filterable style="width: 100%" clearable @keyup.enter.native="handleQuery">
+                    <el-option
+                        v-for="item in bookCityData"
+                        :key="item.id"
+                        :label="item.platformName"
+                        :value="item.platformName">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="" prop="qwName">
+                <el-input
+                    v-model="queryParams.qwName"
+                    placeholder="企微号"
+                    clearable
+                    size="small"
+                    style="width: 200px"
+                    @keyup.enter.native="handleQuery"
+                />
+            </el-form-item>
+            <el-form-item label="" prop="resourceName">
+                <el-input
+                    v-model="queryParams.resourceName"
+                    placeholder="资源名称"
+                    clearable
+                    size="small"
+                    style="width: 200px"
+                    @keyup.enter.native="handleQuery"
+                />
+            </el-form-item>
+            <el-form-item prop="startTime" >
+                <el-date-picker
+                    v-model="queryParams.startTime"
+                    type="date"
+                    size="small"
+                    value-format="yyyy-MM-dd"
+                    placeholder="选择开始日期">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item prop="endTime" >
+                <el-date-picker
+                    v-model="queryParams.endTime"
+                    type="date"
+                    size="small"
+                    value-format="yyyy-MM-dd"
+                    placeholder="选择结束日期">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item>
+                <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+                <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+            </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8" align="middle">
+            <el-col :span="1.5">
+                <el-button type="primary" size="small" @click="addHandle">新增企微映射</el-button>
+            </el-col>
+            <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+
+        <el-table :data="dataList" size="mini" :border="true">
+            <el-table-column label="ID" prop="id" width="55" align="center"/>
+            <el-table-column label="资源名称" prop="resourceName" align="center" width="140" :show-overflow-tooltip="true"/>
+            <el-table-column label="公众号appName" prop="mpAppName" width="120" align="center"/>
+            <el-table-column label="公众号appId" prop="mpAppId" align="center" width="160"/>
+            <el-table-column label="书城名称" prop="platformName" align="center" width="100"/>
+            <el-table-column label="书城key" prop="platformKey" align="center" width="100"/>
+            <el-table-column label="企微appName" prop="qwAppName" align="center" width="150"/>
+            <el-table-column label="企微appId" prop="qwAppId" align="center" width="160" :show-overflow-tooltip="true"/>
+            <el-table-column label="开始时间" prop="startTime" align="center" width="100"/>
+            <el-table-column label="结束时间" prop="endTime" align="center" width="100"/>
+            <el-table-column label="创建时间" prop="createTime" align="center" width="135"/>
+            <el-table-column label="操作" class-name="small-padding fixed-width">
+                <template slot-scope="scope">
+                    <el-button
+                        size="mini"
+                        type="text"
+                        icon="el-icon-edit"
+                        style="margin-right: 10px"
+                        @click="handleEditTen(scope.row)"
+                    >修改</el-button>
+                    <el-popconfirm
+                        title="确定删除吗?"
+                        @confirm="handleDel(scope.row.id)"
+                    >
+                        <el-button slot="reference" type="text" size="mini" style="color: red" icon="el-icon-delete">删除</el-button>
+                    </el-popconfirm>
+                </template>
+            </el-table-column>
+        </el-table>
+
+        <pagination
+            v-show="total > 0"
+            :total="total"
+            :page.sync="queryParams.pageNum"
+            :limit.sync="queryParams.pageSize"
+            @pagination="getList"
+        />
+
+        <!-- 新增修改 -->
+        <el-dialog 
+            :title="title" 
+            :visible.sync="visible" 
+            width="450px"
+            append-to-body
+        >
+            <el-form :model="qwParamsForm" :rules="qwRulesType" ref="platFormQw" label-width="80px">
+                <el-form-item label="资源名称" prop="resourceName">
+                    <el-select
+                        v-model="qwParamsForm.resourceName"
+                        filterable
+                        remote
+                        reserve-keyword
+                        placeholder="请输入关键词"
+                        :remote-method="remoteMethod"
+                        :loading="loading"
+                    >
+                        <el-option
+                            v-for="item in options"
+                            :key="item.id"
+                            :label="item.resourceName"
+                            :value="item.resourceName">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="书城" prop="platformKey" >
+                    <el-select v-model="qwParamsForm.platformKey" placeholder="请选择" filterable style="width: 100%" clearable>
+                        <el-option
+                            v-for="item in bookCityData"
+                            :key="item.id"
+                            :label="item.platformName"
+                            :value="item.platformKey">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="公众号" prop="mpAppData" >
+                    <el-select v-model="qwParamsForm.mpAppData" placeholder="请选择" filterable style="width: 100%" clearable>
+                        <el-option
+                            v-for="item in gzhData"
+                            :key="item.id"
+                            :label="item.appName"
+                            :value="item.appName + ',' + item.appId">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="企微" prop="qwAppData" >
+                    <el-select v-model="qwParamsForm.qwAppData" placeholder="请选择" filterable style="width: 100%" clearable>
+                        <el-option
+                            v-for="item in qwData"
+                            :key="item.id"
+                            :label="item.appName"
+                            :value="item.appName + ',' + item.appId">
+                        </el-option>
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="开始时间" prop="startTime" >
+                    <el-date-picker
+                        v-model="qwParamsForm.startTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="选择日期">
+                    </el-date-picker>
+                </el-form-item>
+                <el-form-item label="结束时间" prop="endTime" >
+                    <el-date-picker
+                        v-model="qwParamsForm.endTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        placeholder="选择日期">
+                    </el-date-picker>
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="qwParamsForm = {platformKey: 'YOU_ZI'};visible = false">取 消</el-button>
+                <el-button type="primary" @click="submit('platFormQw')">确 定</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { getQwChanelList, addOrEditQwChanel, getChanelList, getBookPlatformAll, delQwChanel, queryApi } from '@/api/accounts/qwMapping'
+export default {
+    data () {
+        return {
+            queryParams: {
+                pageNum: 1,
+                pageSize: 20,
+                channel: null
+            },
+            dataList: [],
+            total: 0,
+            showSearch: true,
+            visible: false,
+            qwParamsForm: {
+                platformKey: 'YOU_ZI'
+            },
+            qwRulesType: {
+                resourceName:  [{ required: true, message: '请输入资源名称', trigger: 'blur' }],
+                platformKey: [{ required: true, message: '请选择书城', trigger: 'blur' }]
+            },
+            title: '新增企微映射',
+            bookCityData: [],
+            gzhData: [],
+            qwData: [],
+            loading: false,
+            options: []
+        }
+    },
+    watch: {
+        'qwParamsForm.platformKey': {
+            handler(val) {
+                if (val) {
+                    getChanelList({ platformKey: val }).then(res => {
+                        let data = res.data
+                        if (data && Array.isArray(data)) {
+                            this.gzhData = data.filter(item => item.type === 0 || item.type === -1)
+                            this.qwData = data.filter(item => item.type === 1)
+                        }
+                    })
+                }
+            },
+            immediate: true,
+        }
+    },
+    created() {
+        this.getList()
+        this.getAll()
+    },
+    methods: {
+        remoteMethod(query) {
+            if (query !== '') {
+                this.loading = true;
+                queryApi({resourceName: query}).then(res => {
+                    this.options = res.data
+                    this.loading = false;
+                }).catch(err => this.loading = false)
+            } else {
+                this.options = [];
+            }
+        },
+        getAll () {
+            getBookPlatformAll().then(res => {
+                this.bookCityData = res.data
+            })
+        },
+        getList () {
+            getQwChanelList(this.queryParams).then(res => {
+                let data = res.data
+                this.total = data.total
+                let records = data.records
+                this.dataList = records
+            })
+        },
+        handleQuery() {
+            this.queryParams = { ...this.queryParams, pageNum: 1 }
+            this.getList();
+        },
+        resetQuery() {
+            this.resetForm("queryForm");
+            this.getList();
+        },
+        addHandle() {
+            this.visible = true
+            this.title = '新增企微映射'
+        },
+        handleEditTen(row) {
+            console.log('修改--->', row)
+            this.title = '修改企微映射'
+            const { id, endTime, startTime, mpAppId, mpAppName, platformKey, qwAppId, qwAppName, resourceName} = row
+            this.qwParamsForm = { startTime, id, endTime, platformKey, resourceName }
+            if (mpAppId && mpAppName) {
+                this.$set(this.qwParamsForm, 'mpAppData', mpAppName + ',' + mpAppId);
+            }
+            if (qwAppId && qwAppName) {
+                this.$set(this.qwParamsForm, 'qwAppData', qwAppName + ',' + qwAppId);
+            }
+            this.visible = true
+        },
+        handleDel(id) {
+            delQwChanel({id}).then(res => {
+                if (res.data) {
+                    this.msgSuccess("删除成功");
+                    this.getList()
+                }
+            })
+        },
+        submit(formName) {
+            this.$refs[formName].validate((valid) => {
+                if (valid) {
+                    console.log('11111', this.qwParamsForm);
+                    if (Object.keys(this.qwParamsForm).includes('mpAppData') || Object.keys(this.qwParamsForm).includes('qwAppData')) {
+                        let params = JSON.parse(JSON.stringify(this.qwParamsForm))
+                        if (Object.keys(this.qwParamsForm).includes('mpAppData')) {
+                            params.mpAppName = params.mpAppData.split(',')[0]
+                            params.mpAppId = params.mpAppData.split(',')[1]
+                            delete params.mpAppData
+                        }
+                        if (Object.keys(this.qwParamsForm).includes('qwAppData')) {
+                            params.qwAppName = params.qwAppData.split(',')[0]
+                            params.qwAppId = params.qwAppData.split(',')[1]
+                            delete params.qwAppData
+                        }
+                        addOrEditQwChanel(params).then(res => {
+                            console.log('addOrEditQwChanel---->', res)
+                            if (res.data) {
+                                if (this.qwParamsForm.id) { // 修改
+                                    this.msgSuccess("新增成功");
+                                } else {
+                                    this.msgSuccess("修改成功");
+                                }
+                                this.getList()
+                                this.qwParamsForm = { platformKey: 'YOU_ZI' }
+                                this.visible = false
+                            }
+                        })
+                    } else {
+                        this.$message.error('公众号和企微必须选择一个');
+                    }
+                } else {
+                    return false;
+                }
+            });
+        }
+    }
+}
+</script>

+ 232 - 0
src/views/accounts/ttAdWarrant/appManage.vue

@@ -0,0 +1,232 @@
+<template>
+    <div>
+        <el-button type="primary" size="mini" @click="handleEdit" >头条广告应用管理</el-button>
+        <el-dialog 
+            title="头条广告应用管理"
+            :visible.sync="visible"
+            width="950px"
+        >
+            <el-form :model="queryForm" ref="ttqueryForm" :inline="true">
+                <el-form-item>
+                    <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">刷新</el-button>
+                    <el-button type="primary" icon="el-icon-plus" size="mini" @click="addApp">新建</el-button>
+                </el-form-item>
+            </el-form>
+            <el-table :data="appList" v-loading="loading">
+                <el-table-column label="应用名称" prop="appName" align="center" width="90"/>
+                <el-table-column label="应用ID" prop="appId" align="center" width="150"/>
+                <el-table-column label="应用密钥" prop="appSecret" align="center"/>
+                <el-table-column label="归属" prop="useType" align="center" width="90">
+                    <template slot-scope="scope">
+                        <div>{{scope.row.useType === 0 ? '数据系统' : scope.row.useType === 1 ? '监控系统' : scope.row.useType === 2 ? '游戏数据' : '其它'}}</div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="Enable?" prop="enabled" align="center" width="90">
+                    <template slot-scope="scope">
+                        <el-switch
+                            v-model="scope.row.enabled"
+                            @change="handleStatusChange(scope.row)"
+                        ></el-switch>
+                    </template>
+                </el-table-column>
+                <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="150">
+                    <template slot-scope="scope" v-if="scope.row.id && typeof scope.row.id === 'number'">
+                        <el-button
+                            size="mini"
+                            type="text"
+                            icon="el-icon-edit"
+                            @click="handleEditApp(scope.row)"
+                        >编辑</el-button>
+                        <el-button
+                            size="mini"
+                            type="text"
+                            icon="el-icon-delete-solid"
+                            style="color: red"
+                            @click="handleDel(scope.row)"
+                        >删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <!-- <span slot="footer" class="dialog-footer">
+                <el-button @click="openTenEditSwitch = false">关 闭</el-button>
+            </span> -->
+        </el-dialog>
+
+        <el-dialog 
+            title="新增头条广告应用"
+            :visible.sync="addVisible"
+            width="350px"
+        >
+            <el-form :model="addQueryForm" ref="addqueryForm" :rules="rules">
+                <el-form-item label="应用名称" prop="appName">
+                    <el-input
+                        v-model="addQueryForm.appName"
+                        placeholder="应用名称"
+                        clearable
+                        size="small"
+                    />
+                </el-form-item>
+                <el-form-item label="应用ID" prop="appId">
+                    <el-input
+                        v-model.number="addQueryForm.appId"
+                        placeholder="请输入应用ID"
+                        clearable
+                        size="small"
+                    />
+                </el-form-item>
+                <el-form-item label="应用密钥" prop="appSecret">
+                    <el-input
+                        v-model="addQueryForm.appSecret"
+                        placeholder="请输入应用密钥"
+                        clearable
+                        size="small"
+                    />
+                </el-form-item>
+                <el-form-item label="Enable?" prop="enabled">
+                    <el-switch v-model="addQueryForm.enabled"></el-switch>
+                </el-form-item>
+                <el-form-item label="归属" prop="useType">
+                    <el-select v-model="addQueryForm.useType" placeholder="请选择" size="small">
+                        <el-option label="数据系统" value="0"></el-option>
+                        <el-option label="监控系统" value="1"></el-option>
+                        <el-option label="游戏数据" value="2"></el-option>
+                        <el-option label="其它" value="-1"></el-option>
+                    </el-select>
+                </el-form-item>
+            </el-form>
+
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="addVisible = false">取 消</el-button>
+                <el-button type="primary" @click="onSubmitSwitch()">确 定</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+import { getAdApp, addAdApp, editAdApp, editAdAppEnabled, delAdApp } from "@/api/accounts/ttAdapi";
+export default {
+    data () {
+        return {
+            visible: false,
+            queryForm: {
+                enabled: true
+            },
+            appList: [],
+            loading: false,
+
+            addVisible: false,
+            addQueryForm: {},
+            rules: {
+                appName: [ { required: true, message: '请输入应用名称', trigger: 'blur' } ],
+                appId: [
+                    { required: true, message: '请输入应用ID', trigger: 'blur' },
+                    { type: 'number', message: '应用ID必须为数字值'}
+                ],
+                appSecret: [ { required: true, message: '请输入应用密钥', trigger: 'blur' } ],
+                enabled: [ { required: true, message: '请选择是否可用', trigger: 'blur' } ],
+                useType: [ { required: true, message: '请选择归属', trigger: 'blur' } ]
+            },
+        }
+    },
+    props: {
+
+    },
+    watch: {
+        visible(val) {
+            if (!val) {
+                this.$emit("onChange");
+            }
+        }
+    },
+    methods: {
+        /** 显示隐藏 */
+        handleEdit() {
+            this.visible = true;
+            this.getList()
+        },
+        /** 获取数据 */
+        getList() {
+            this.loading = true;
+            getAdApp().then(res => {
+                this.loading = false
+                this.appList = res.data
+            }).catch(err => this.loading = false)
+        },
+        /** 搜索 */
+        handleQuery() {
+            this.getList()
+        },
+        /** 新建按钮 */
+        addApp() {
+            this.addQueryForm = { enabled: true }
+            this.addVisible = true
+        },
+        /** 新增应用 */
+        onSubmitSwitch() {
+            this.$refs['addqueryForm'].validate((valid) => {
+                if (valid) {
+                    console.log(this.addQueryForm);
+                    if (this.addQueryForm.id) {
+                        editAdApp(this.addQueryForm).then(res => {
+                            if(res.data){
+                                this.msgSuccess("修改成功");
+                                this.addVisible = false
+                                this.getList()
+                            }else{
+                                console.error(res)
+                            }
+                        })
+                    } else {
+                        addAdApp(this.addQueryForm).then(res => {
+                            if(res.data){
+                                this.msgSuccess("新增成功");
+                                this.addVisible = false
+                                this.getList()
+                            }else{
+                                console.error(res)
+                            }
+                        })
+                    }
+                }
+            })
+        },
+        /** 编辑应用 */
+        handleEditApp(row) {
+            this.addQueryForm = { ...row, useType: row.useType.toString() }
+            this.addVisible = true
+        },
+        /** 修改状态 */
+        handleStatusChange(row) {
+            let text = row.enabled ? "启用" : "停用";
+            this.$confirm('确认要"' + text + '""' + row.appName + '"应用吗?', "警告", {
+                confirmButtonText: "确定",
+                cancelButtonText: "取消",
+                type: "warning"
+            }).then(function() {
+                return editAdAppEnabled(row.id, row.enabled);
+            }).then(() => {
+                this.msgSuccess(text + "成功");
+            }).catch(function() {
+                row.enabled = row.enabled ? false : true;
+            });
+        },
+        /** 删除应用 */
+        handleDel(row) {
+            this.$confirm('确定删除?', '删除', {
+                distinguishCancelAndClose: true,
+                confirmButtonText: '确定',
+                cancelButtonText: '取消'
+            }).then(() => {
+                delAdApp(row.id).then(res => {
+                    if(res.data) {
+                        this.msgSuccess('删除成功');
+                        this.getList()
+                    }
+                })
+            })
+            
+        },
+    }
+}
+</script>

+ 200 - 0
src/views/accounts/ttAdWarrant/index.vue

@@ -0,0 +1,200 @@
+<template>
+    <div class="app-container">
+        <el-form :model="queryParams" ref="queryForm" v-show="showSearch" :inline="true">
+            <el-form-item label="" prop="adUnitType">
+                <el-select v-model="queryParams.adUnitType" placeholder="请选择业务单元类型" clearable filterable style="width: 140px"
+                    size="small" @keyup.enter.native="handleQuery">
+                    <el-option label="小说" value="NOVEL" />
+                    <el-option label="小说IAA" value="NOVEL_IAA" />
+                    <el-option label="游戏" value="GAME" />
+                    <el-option label="游戏IAA" value="GAME_IAA" />
+                    <el-option label="电商" value="SHOP" />
+                </el-select>
+            </el-form-item>
+            <el-form-item>
+                <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+                <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+            </el-form-item>
+        </el-form>
+        <el-row :gutter="10" class="mb8" align="middle">
+            <el-col :span="1.5">
+                <div class="grid-content">
+                    <el-radio-group v-model="queryParams.adAppId" size="small" @change="getList">
+                        <el-radio :label="item.id" v-for="item in allList" :key="item.id">{{item.appName}}</el-radio>
+                    </el-radio-group>
+                </div>
+            </el-col>
+            <el-col :span="1.5">
+                <div class="grid-content">
+                    <el-dropdown @command="handleWarrantOld">
+                        <span class="el-dropdown-link">
+                            <el-button type="success" icon="el-icon-plus" size="mini">授权广告平台<i
+                                    class="el-icon-arrow-down el-icon--right"></i></el-button>
+                        </span>
+                        <el-dropdown-menu slot="dropdown">
+                            <el-dropdown-item command="NOVEL" v-if="queryParams.adAppId === 1">小说</el-dropdown-item>
+                            <el-dropdown-item command="NOVEL_IAA" v-if="queryParams.adAppId === 1">小说IAA</el-dropdown-item>
+                            <el-dropdown-item command="GAME" v-if="queryParams.adAppId === 2">游戏</el-dropdown-item>
+                            <el-dropdown-item command="GAME_IAA" v-if="queryParams.adAppId === 2">游戏IAA</el-dropdown-item>
+                            <el-dropdown-item command="SHOP" v-if="queryParams.adAppId === 1">电商</el-dropdown-item>
+                        </el-dropdown-menu>
+                    </el-dropdown>
+                </div>
+            </el-col>
+            <el-col :span="1.5">
+                <div class="grid-content">
+                    <app-manage @onChange="getAll()"/>
+                </div>
+            </el-col>
+            <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :isshowSearch="false"></right-toolbar>
+        </el-row>
+
+        <el-table :data="adList">
+            <el-table-column label="广告应用ID" prop="adAppId" align="center" fixed/>
+            <el-table-column label="授权人ID" prop="createBy" align="center"/>
+            <el-table-column label="企业ID" prop="companyId" align="center"/>
+            <el-table-column label="授权用户ID" prop="authUserId" align="center" :show-overflow-tooltip="true"/>
+            <el-table-column label="邮箱" prop="email" align="center" :show-overflow-tooltip="true"/>
+            <el-table-column label="账号" prop="displayName" align="center" :show-overflow-tooltip="true"/>
+            <el-table-column label="业务单元类型" prop="adUnitType" align="center" width="100">
+                <template slot-scope="scope">
+                    <div>{{ scope.row.adUnitType === 'NOVEL' ? '小说' : scope.row.adUnitType === 'NOVEL_IAA' ? '小说IAA' : scope.row.adUnitType === 'GAME' ? '游戏' : scope.row.adUnitType === 'GAME_IAA' ? '游戏IAA' : scope.row.adUnitType === 'SHOP' ? '电商' : '--' }}</div>
+                </template>
+            </el-table-column>
+            <!-- <el-table-column label="accessToken" prop="accessToken" align="center" width="200">
+                <template slot-scope="scope">
+                    <el-tooltip placement="top" effect="light">
+                        <div slot="content">{{scope.row.accessToken}}</div>
+                        <div class="name-wrapper">
+                            <p>{{ scope.row.accessToken }}</p>
+                        </div>
+                    </el-tooltip>
+                </template>
+            </el-table-column>
+            <el-table-column label="refreshToken" prop="refreshToken" align="center" width="200">
+                <template slot-scope="scope">
+                    <el-tooltip placement="top" effect="light">
+                        <div slot="content">{{scope.row.refreshToken}}</div>
+                        <div class="name-wrapper">
+                            <p>{{ scope.row.refreshToken }}</p>
+                        </div>
+                    </el-tooltip>
+                </template>
+            </el-table-column> -->
+            <el-table-column label="授权时间" align="center" prop="createTime" width="150">
+                <template slot-scope="scope">
+                    <span>{{ parseTime(scope.row.createTime) }}</span>
+                </template>
+            </el-table-column>
+            <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="250">
+                <template slot-scope="scope">
+                    <!-- 刷新账户 -->
+                    <refresh-user-button :adAppId="queryParams.adAppId" :authUserId="scope.row.authUserId" @onChange="getList()"/>
+                    <!-- 查看账户 -->
+                    <look-account-button :adAppId="queryParams.adAppId" :authUserId="scope.row.authUserId" />
+                </template>
+            </el-table-column>
+        </el-table>
+
+        <pagination
+            v-show="total>0"
+            :total="total"
+            :page.sync="queryParams.pageNum"
+            :limit.sync="queryParams.pageSize"
+            @pagination="getList"
+        />
+    </div>
+</template>
+
+
+<script>
+import { getAdApp, getAuthUserList, toAuthUser } from "@/api/accounts/ttAdapi";
+import appManage from "./appManage.vue"
+import refreshUserButton from "./refreshUserButton.vue"
+import lookAccountButton from "./lookAccountButton.vue"
+export default {
+    components: { appManage, refreshUserButton, lookAccountButton },
+    data () {
+        return {
+            queryParams: {
+                pageNum: 1,
+                pageSize: 10,
+            },
+            total: 0,
+            showSearch: true,
+            // 所有授权平台
+            allList: [],
+            adList: [],
+            // 表格选中ID
+            ids: [],
+            // 总修改按钮控制 非多个禁用
+            multiple: true
+        }
+    },
+    created() {
+        this.getAll()
+    },
+    mounted(){
+        window.addEventListener('storage', this.listener)
+    },
+    beforeDestroy() { // 在组件生命周期结束的时候销毁。
+        window.removeEventListener('storage', this.listener, false)
+    },
+    methods: {
+        /** 搜索 */
+        handleQuery() {
+            this.queryParams = { ...this.queryParams, pageNum: 1 }
+            this.getList();
+        },
+        /** 重置搜索条件 */
+        resetQuery() {
+            this.resetForm("queryForm");
+            this.getList();
+        },
+        listener(e) {
+            if (e.key === 'ttAdMp') {
+                if (e.newValue === 'ok') {
+                    this.getList()
+                    this.msgSuccess("授权成功");
+                    localStorage.removeItem('ttAdMp')
+                } else {
+                    this.$message.error('授权失败');
+                    localStorage.removeItem('ttAdMp')
+                }
+            }
+        },
+        /** 获取所有应用 */
+        getAll() {
+            getAdApp().then(res => {
+                if (res.data.length > 0) {
+                    this.allList = res.data
+                    this.queryParams.adAppId = res.data[0].id
+                    this.getList()
+                } else {
+                    this.allList = []
+                }
+            })
+        },
+        /** 获取数据 */
+        getList() {
+            this.loading = true
+            getAuthUserList(this.queryParams).then(res => {
+                console.log('res.data.records---->', res.data.records);
+                this.total = res.data.total
+                this.adList = res.data.records
+                this.loading = false
+            }).catch(() => this.loading = false)
+        },
+        /** 授权 */
+        handleWarrantOld(adUnitType) {
+            console.log('---->', adUnitType)
+            toAuthUser({ adAppId: this.queryParams.adAppId, adUnitType, callbackPage: encodeURIComponent(window.location.origin + '/ttAdCode') }).then(res => {
+            // toAuthUser({ adAppId: this.queryParams.adAppId, callbackPage: encodeURIComponent('http://erp.zanxiangnet.com/ttAdCode') }).then(res => {
+                if (res.data) {
+                    window.open(res.data)
+                }
+            })
+        },
+    }
+}
+</script>

+ 143 - 0
src/views/accounts/ttAdWarrant/lookAccountButton.vue

@@ -0,0 +1,143 @@
+<template>
+    <el-button size="mini" type="text" icon="el-icon-view" @click="lookHangdle()">
+        <span>查看账号</span>
+        <el-dialog :title="'查看 ' + authUserId" :visible.sync="visible" width="900px" append-to-body v-if="visible">
+
+            <el-row :gutter="10" class="mb8" align="middle">
+                <el-col :span="10">
+                    <el-input type="textarea" autosize v-model="queryParams.accountIds" placeholder="输入账号ID(多个,,)" />
+                </el-col>
+                <el-col :span="1.5">
+                    <el-button type="cyan" icon="el-icon-search" @click="getList">搜索</el-button>
+                </el-col>
+                <el-col :span="1.5">
+                    <el-button type="primary" icon="el-icon-sort" @click="putuser"
+                        :disabled="adAccountList.length === 0">批量指派</el-button>
+                </el-col>
+            </el-row>
+            <el-table :data="accountList" ref="multipleTable" :loading="loading" @selection-change="handleSelectionChange">
+                <el-table-column type="selection" width="50" align="center" />
+                <el-table-column label="账号ID" prop="accountId" align="center" fixed width="150"
+                    :show-overflow-tooltip="true" />
+                <el-table-column label="账号名称" prop="accountName" align="center" :show-overflow-tooltip="true" width="300" />
+                <el-table-column label="业务单元类型" prop="adUnitType" align="center" width="100">
+                    <template slot-scope="scope">
+                        <div>{{ scope.row.adUnitType === 'NOVEL' ? '小说' : scope.row.adUnitType === 'NOVEL_IAA' ? '小说IAA' : scope.row.adUnitType === 'GAME' ? '游戏' : scope.row.adUnitType === 'GAME_IAA' ? '游戏IAA' : scope.row.adUnitType === 'SHOP' ? '电商' : '--' }}</div>
+                    </template>
+                </el-table-column>
+                <el-table-column label="投手" prop="putUser" align="center" width="120" :show-overflow-tooltip="true">
+                    <template slot-scope="scope">
+                        <span v-if="scope.row.putUser">{{ scope.row.putUser.nickName }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="投手ID" prop="putUserId" align="center" width="120" :show-overflow-tooltip="true" />
+                <el-table-column label="运营账号" prop="operationUserList" align="center" width="120"
+                    :show-overflow-tooltip="true">
+                    <template slot-scope="scope">
+                        <span>{{ scope.row.operationUserList | filterUser }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="所属组" prop="groupName" align="center" width="120" :show-overflow-tooltip="true" />
+                <el-table-column label="Enabled?" prop="enabled" align="center" width="80">
+                    <template slot-scope="scope">
+                        <span>{{ scope.row.enabled ? '可用' : '禁用' }}</span>
+                    </template>
+                </el-table-column>
+                <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="90">
+                    <template slot-scope="scope">
+                        <!-- 指派 -->
+                        <put-user-button :accountId="scope.row.accountId" :authUserId="scope.row.authUserId"
+                            :putUserId="scope.row.putUserId" @onChange="getList()" />
+                    </template>
+                </el-table-column>
+            </el-table>
+            <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+                :limit.sync="queryParams.pageSize" @pagination="getList" />
+
+            <putUser :visible="putuserVisible" :adAccountList="adAccountList" @onChange="getList()" @onClose="onClose()" />
+        </el-dialog>
+    </el-button>
+</template>
+<script>
+import { getAdAccountList } from "@/api/accounts/ttAdapi";
+import putUserButton from "./putUserButton.vue"
+import putUser from "./putUser.vue"
+export default {
+    components: { putUserButton, putUser },
+    data() {
+        return {
+            visible: false,
+            loading: false,
+            queryParams: {
+                pageNum: 1,
+                pageSize: 10,
+            },
+            accountList: [],
+            total: 0,
+            ids: [],
+            adAccountList: [],
+            putuserVisible: false
+        }
+    },
+    filters: {
+        filterUser(val) {
+            if (val && val.length > 0) {
+                return val.map(item => item.nickname).toString()
+            }
+            return '-1'
+        }
+    },
+    props: {
+        adAppId: {
+            type: Number,
+            default: null,
+        },
+        authUserId: {
+            type: Number,
+            default: null,
+        }
+    },
+    methods: {
+        onClose() {
+            this.putuserVisible = false
+            // this.$nextTick(() => {
+            //     this.adAccountList = []
+            //     this.ids = []
+            //     this.$refs.multipleTable.clearSelection();
+            // })
+        },
+        // 批量指派
+        putuser() {
+            this.putuserVisible = true
+        },
+        handleSelectionChange(selection) {
+            console.log(selection)
+            this.adAccountList = selection.map(item => ({ accountId: item.accountId, authUserId: this.authUserId }));
+            this.ids = selection.map(item => item.accountId);
+        },
+        lookHangdle() {
+            this.visible = true
+            this.queryParams.pageNum = 1
+            this.getList()
+        },
+        getList() {
+            this.$nextTick(() => {
+                this.putuserVisible = false
+                this.adAccountList = []
+                this.ids = []
+                this.$refs.multipleTable.clearSelection();
+            })
+
+            if (this.adAppId && this.authUserId) {
+                let params = { ...this.queryParams, adAppId: this.adAppId, authUserId: this.authUserId, accountIds: this.queryParams.accountIds ? this.queryParams.accountIds.split(/[,,\n\s]+/ig) : [] }
+                this.loading = true
+                getAdAccountList(params).then(res => {
+                    this.loading = false
+                    this.accountList = res.data.records
+                    this.total = res.data.total
+                }).catch(() => this.loading = false)
+            }
+        }
+    }
+}
+</script>

+ 83 - 0
src/views/accounts/ttAdWarrant/putUser.vue

@@ -0,0 +1,83 @@
+<template>
+    <el-dialog title="批量指派投手" :visible.sync="visible" width="450px" append-to-body :show-close="false">
+        <el-form :model="paramsForm" :rules="rulesType" ref="platFormPut1" label-width="80px" label-position="top">
+            <el-form-item label="用户" prop="putUserId">
+                <el-select v-model="paramsForm.putUserId" clearable placeholder="请选择" filterable style="width: 100%">
+                    <el-option v-for="item in userAll" :key="item.id" :label="item.nickName" :value="item.id" />
+                </el-select>
+            </el-form-item>
+        </el-form>
+        <span slot="footer" class="dialog-footer">
+            <el-button @click="onClose()">取 消</el-button>
+            <el-button type="primary" @click="onSubmit('platFormPut1')" :loading="loading">确 定</el-button>
+        </span>
+    </el-dialog>
+</template>
+<script>
+/**
+ * 指派投手
+ */
+import { allUser } from "@/api/system/user";
+import { putUser } from "@/api/accounts/ttAdapi";
+export default {
+    data() {
+        return {
+            rulesType: {
+                putUserId: [
+                    { required: true, message: '请选择投手', trigger: 'blur' }
+                ]
+            },
+            paramsForm: {},
+            userAll: [],
+            loading: false
+        }
+    },
+    props: {
+        visible: {
+            type: Boolean,
+            default: false
+        },
+        adAccountList: {
+            type: Array,
+            default: [],
+        }
+    },
+    created() {
+        this.getUserAllHandle()
+    },
+    methods: {
+        onClose() {
+            this.paramsForm = {};
+            this.$emit("onClose");
+        },
+        onSubmit(val) {
+            this.$refs[val].validate((valid) => {
+                if (valid && this.adAccountList) {
+                    this.loading = true
+                    putUser({ putUserId: this.paramsForm.putUserId, adAccountList: this.adAccountList }).then(res => {
+                        this.loading = false
+                        if (res.data) {
+                            this.$message({
+                                showClose: true,
+                                message: '指派成功',
+                                type: 'success'
+                            });
+                            this.$emit("onChange");
+                            this.visible = false
+                        }
+                    }).catch(() => this.loading = false)
+                }
+            })
+        },
+        getUserAllHandle() {
+            // 所有用户
+            allUser().then(response => {
+                let data = response.data
+                this.userAll = data.map((item) => {
+                    return { id: item.userId, nickName: item.nickname }
+                })
+            })
+        }
+    }
+}
+</script>

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff