54 Achegas e26bc767c2 ... 28c818a1e2

Autor SHA1 Mensaxe Data
  wjx 28c818a1e2 fix hai 2 semanas
  wjx 2d1eb3d298 fix hai 2 semanas
  wjx 46aebfdd38 fix hai 3 meses
  wjx cd30ffc75f fix hai 6 meses
  wjx ffff20e002 fix hai 6 meses
  wjx d90e3bc51a fix hai 7 meses
  wjx e70fa4a3fc fix hai 7 meses
  wjx 50b711a8c8 fix hai 7 meses
  wjx a77799f2cb fix hai 8 meses
  wjx 8c178181f0 fix hai 9 meses
  wjx f0eb77ee1b fix hai 9 meses
  wjx c1297fa690 fix hai 9 meses
  wjx 6546c765f9 fix hai 10 meses
  wjx ada786aec3 fix hai 10 meses
  wjx dd80a0e982 fix hai 11 meses
  wjx e24f751c1d fix hai 11 meses
  wjx d50787e631 fix hai 1 ano
  wjx 0eeb2ab036 fix hai 1 ano
  wjx 9776216dd5 fix hai 1 ano
  wjx 12aa8c1fdc fix hai 1 ano
  wjx 6725bddba0 fix hai 1 ano
  wjx 969425eb30 fix hai 1 ano
  wjx be4e82d932 fix hai 1 ano
  wjx 249e9de974 fix hai 1 ano
  wjx f89cda1440 fix hai 1 ano
  wjx f297ab5623 fix %!s(int64=2) %!d(string=hai) anos
  wjx 671a8cf928 fix %!s(int64=2) %!d(string=hai) anos
  wjx 3bc8ea8c2d fix %!s(int64=2) %!d(string=hai) anos
  wjx 38baf452eb fix %!s(int64=2) %!d(string=hai) anos
  wjx 2ebe43c0f9 fix %!s(int64=2) %!d(string=hai) anos
  wjx 055eaa0b52 fix %!s(int64=2) %!d(string=hai) anos
  wjx 4e71758332 fix %!s(int64=2) %!d(string=hai) anos
  wjx 5f3fefafc7 fix %!s(int64=2) %!d(string=hai) anos
  wjx 1482c4e86d fix %!s(int64=2) %!d(string=hai) anos
  wjx 97d60ba7e9 fix %!s(int64=2) %!d(string=hai) anos
  wjx b5dbca8b0c fix %!s(int64=2) %!d(string=hai) anos
  wjx 9f75ce09d3 fix %!s(int64=2) %!d(string=hai) anos
  wjx 57d141ce72 fix %!s(int64=2) %!d(string=hai) anos
  wjx 25bc8ee358 fix %!s(int64=2) %!d(string=hai) anos
  wjx c27adf86da fix %!s(int64=2) %!d(string=hai) anos
  wjx 5f206ea317 fix %!s(int64=3) %!d(string=hai) anos
  wjx 2ce90e9470 fix %!s(int64=3) %!d(string=hai) anos
  wjx 25a574af38 fix %!s(int64=3) %!d(string=hai) anos
  wjx 46e64aa07d fix %!s(int64=3) %!d(string=hai) anos
  wjx 19355b3069 fix %!s(int64=3) %!d(string=hai) anos
  wjx 8bee422200 fix %!s(int64=3) %!d(string=hai) anos
  shenwu f2dab89b68 新增投放渠道 %!s(int64=3) %!d(string=hai) anos
  wjx e31c1a2aef fix %!s(int64=3) %!d(string=hai) anos
  wjx c3c3e03c27 fix %!s(int64=3) %!d(string=hai) anos
  wjx 5d1e5ef27c fix %!s(int64=3) %!d(string=hai) anos
  wjx 7689b6c8fb fix %!s(int64=3) %!d(string=hai) anos
  wjx 54d169511b fix %!s(int64=3) %!d(string=hai) anos
  wjx d22a3fc8dc fix %!s(int64=3) %!d(string=hai) anos
  wjx a00480e352 fix %!s(int64=3) %!d(string=hai) anos
Modificáronse 100 ficheiros con 5116 adicións e 1251 borrados
  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'
+    })
+}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
src/assets/icons/svg/businessPlan.svg


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
src/assets/icons/svg/gdt.svg


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
src/assets/icons/svg/position.svg


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
src/assets/icons/svg/realName.svg


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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;

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 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>

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio