瀏覽代碼

增加代理商报表页面

xuzuoyun 5 年之前
父節點
當前提交
8bf7f1816d
共有 42 個文件被更改,包括 7532 次插入3541 次删除
  1. 1 0
      public/index.html
  2. 147 147
      src/api/api.js
  3. 15 0
      src/api/manage.js
  4. 10 0
      src/api/statistics.js
  5. 83 78
      src/config/router.config.js
  6. 1 1
      src/permission.js
  7. 14 0
      src/store/modules/user.js
  8. 125 151
      src/views/list/MediaList.vue
  9. 6 6
      src/views/modules/Statistics/Statistics.vue
  10. 530 0
      src/views/modules/Statistics/alipayStatistics.vue
  11. 17 21
      src/views/modules/Statistics/components/Treeselect.vue
  12. 0 1
      src/views/modules/Statistics/dataDisplayStatistics.vue
  13. 29 72
      src/views/modules/Statistics/refuseData.vue
  14. 0 0
      src/views/modules/achievements/optimize.vue
  15. 0 32
      src/views/modules/advertiser/AdvertiserList.vue
  16. 150 184
      src/views/modules/advertiser/BindAccountLoginList.vue
  17. 67 89
      src/views/modules/advertiser/ProjectList.vue
  18. 153 26
      src/views/modules/advertiser/ProjectMemberList.vue
  19. 144 201
      src/views/modules/advertiser/UserAllocationList.vue
  20. 16 2
      src/views/modules/advertiser/modules/ProjectModal.vue
  21. 150 184
      src/views/modules/advertiser/modules/UserAllocationModal.vue
  22. 258 0
      src/views/modules/agent/KuaishouReportDailyAgentList.vue
  23. 258 0
      src/views/modules/agent/KuaishouReportDailyAgentSumList.vue
  24. 238 0
      src/views/modules/agent/modules/KuaishouReportDailyAgentModal.vue
  25. 245 0
      src/views/modules/agent/modules/KuaishouReportDailyAgentModal__Style#Drawer.vue
  26. 238 0
      src/views/modules/agent/modules/KuaishouReportDailyAgentSumModal.vue
  27. 245 0
      src/views/modules/agent/modules/KuaishouReportDailyAgentSumModal__Style#Drawer.vue
  28. 1 26
      src/views/modules/appium/AppiumTaskLogList.vue
  29. 271 282
      src/views/modules/kuaishouapp/KuaishouAdAccountList.vue
  30. 169 205
      src/views/modules/kuaishouapp/KuaishouAppAccountList.vue
  31. 68 77
      src/views/modules/kuaishouapp/account/accountIndex.vue
  32. 1004 0
      src/views/modules/material/fragmentMatemal.vue
  33. 149 260
      src/views/modules/material/materialList.vue
  34. 1148 0
      src/views/modules/material/videoMaterial.vue
  35. 232 264
      src/views/system/QuartzJobList.vue
  36. 185 200
      src/views/system/RoleList.vue
  37. 321 357
      src/views/system/UserList.vue
  38. 7 3
      src/views/system/modules/UserModal.vue
  39. 518 515
      src/views/user/Login.vue
  40. 156 156
      src/views/user/Step1.vue
  41. 162 0
      src/views/user/transferLocal.vue
  42. 1 1
      vue.config.js

+ 1 - 0
public/index.html

@@ -289,6 +289,7 @@
 
 <!-- update_begin author:sunjianlei date:20190524 for: 去指定页面的加载动画 -->
 <script src="https://ssl.captcha.qq.com/TCaptcha.js"></script>
+<script src="http://rescdn.qqmail.com/node/ww/wwopenmng/js/sso/wwLogin-1.0.0.js"></script>
 
 <script src="<%= BASE_URL %>xlsx.extendscript.js"></script>
 <script src="<%= BASE_URL %>xlsx.full.min.js"></script>

+ 147 - 147
src/api/api.js

@@ -1,147 +1,147 @@
-import {getAction, deleteAction, putAction, postAction} from '@/api/manage'
-
-////根路径
-// const doMian = "/jeecg-boot/";
-////图片预览请求地址
-// const imgView = "http://localhost:8080/jeecg-boot/sys/common/view/";
-
-//角色管理
-const addRole = (params) => postAction("/sys/role/add", params);
-const editRole = (params) => putAction("/sys/role/edit", params);
-// const getRoleList = (params)=>getAction("/sys/role/list",params);
-// const deleteRole = (params)=>deleteAction("/sys/role/delete",params);
-// const deleteRoleList = (params)=>deleteAction("/sys/role/deleteBatch",params);
-const checkRoleCode = (params) => getAction("/sys/role/checkRoleCode", params);
-const queryall = (params) => getAction("/sys/role/queryall", params);
-
-//用户管理
-const addUser = (params) => postAction("/sys/user/add", params);
-const editUser = (params) => putAction("/sys/user/edit", params);
-const queryUserRole = (params) => getAction("/sys/user/queryUserRole", params);
-const getUserList = (params) => getAction("/sys/user/list", params);
-// const deleteUser = (params)=>deleteAction("/sys/user/delete",params);
-// const deleteUserList = (params)=>deleteAction("/sys/user/deleteBatch",params);
-const frozenBatch = (params) => putAction("/sys/user/frozenBatch", params);
-//改变密码
-const changPassword = (params) => putAction("/sys/user/changPassword", params);
-//行业管理
-const getIndustryList = (params) => getAction("/industry/industry/list", params);
-const getIndustryTreeList = (params) => getAction("/industry/industry/queryTreeList", params);
-
-//验证用户是否存在
-const checkOnlyUser = (params) => getAction("/sys/user/checkOnlyUser", params);
-//权限管理
-const addPermission = (params) => postAction("/sys/permission/add", params);
-const editPermission = (params) => putAction("/sys/permission/edit", params);
-const getPermissionList = (params) => getAction("/sys/permission/list", params);
-// const deletePermission = (params)=>deleteAction("/sys/permission/delete",params);
-// const deletePermissionList = (params)=>deleteAction("/sys/permission/deleteBatch",params);
-const queryTreeList = (params) => getAction("/sys/permission/queryTreeList", params);
-const queryTreeListForRole = (params) => getAction("/sys/role/queryTreeList", params);
-const queryListAsync = (params) => getAction("/sys/permission/queryListAsync", params);
-const queryRolePermission = (params) => getAction("/sys/permission/queryRolePermission", params);
-const saveRolePermission = (params) => postAction("/sys/permission/saveRolePermission", params);
-//const queryPermissionsByUser = (params)=>getAction("/sys/permission/queryByUser",params);
-const queryPermissionsByUser = (params) => getAction("/sys/permission/getUserPermissionByToken", params);
-const loadAllRoleIds = (params) => getAction("/sys/permission/loadAllRoleIds", params);
-const getPermissionRuleList = (params) => getAction("/sys/permission/getPermRuleListByPermId", params);
-const queryPermissionRule = (params) => getAction("/sys/permission/queryPermissionRule", params);
-
-// 部门管理
-const queryDepartTreeList = (params) => getAction("/sysdepart/sysDepart/queryTreeList", params);
-const queryIdTree = (params) => getAction("/sysdepart/sysDepart/queryIdTree", params);
-const queryParentName = (params) => getAction("/sysdepart/sysDepart/queryParentName", params);
-const searchByKeywords = (params) => getAction("/sysdepart/sysDepart/searchBy", params);
-const deleteByDepartId = (params) => deleteAction("/sysdepart/sysDepart/delete", params);
-
-//日志管理
-//const getLogList = (params)=>getAction("/sys/log/list",params);
-const deleteLog = (params) => deleteAction("/sys/log/delete", params);
-const deleteLogList = (params) => deleteAction("/sys/log/deleteBatch", params);
-
-//数据字典
-const addDict = (params) => postAction("/sys/dict/add", params);
-const editDict = (params) => putAction("/sys/dict/edit", params);
-//const getDictList = (params)=>getAction("/sys/dict/list",params);
-const treeList = (params) => getAction("/sys/dict/treeList", params);
-// const delDict = (params)=>deleteAction("/sys/dict/delete",params);
-//const getDictItemList = (params)=>getAction("/sys/dictItem/list",params);
-const addDictItem = (params) => postAction("/sys/dictItem/add", params);
-const editDictItem = (params) => putAction("/sys/dictItem/edit", params);
-//const delDictItem = (params)=>deleteAction("/sys/dictItem/delete",params);
-//const delDictItemList = (params)=>deleteAction("/sys/dictItem/deleteBatch",params);
-
-//字典标签专用(通过code获取字典数组)
-export const ajaxGetDictItems = (code, params) => getAction(`/sys/dict/getDictItems/${code}`, params);
-
-//系统通告
-const doReleaseData = (params) => getAction("/sys/annountCement/doReleaseData", params);
-const doReovkeData = (params) => getAction("/sys/annountCement/doReovkeData", params);
-//获取系统访问量
-const getLoginfo = (params) => getAction("/sys/loginfo", params);
-
-const getVisitInfo = (params) => getAction("/sys/visitInfo", params);
-//数据日志访问
-// const getDataLogList = (params)=>getAction("/sys/dataLog/list",params);
-
-// 根据部门主键查询用户信息
-const queryUserByDepId = (params) => getAction("/sys/user/queryUserByDepId", params);
-
-// 查询用户角色表里的所有信息
-const queryUserRoleMap = (params) => getAction("/sys/user/queryUserRoleMap", params);
-// 重复校验
-const duplicateCheck = (params) => getAction("/sys/duplicate/check", params);
-
-export {
-  // imgView,
-  // doMian,
-  addRole,
-  editRole,
-  checkRoleCode,
-  addUser,
-  editUser,
-  queryUserRole,
-  getUserList,
-  queryall,
-  frozenBatch,
-  checkOnlyUser,
-  changPassword,
-  getPermissionList,
-  addPermission,
-  editPermission,
-  queryTreeList,
-  queryListAsync,
-  queryRolePermission,
-  saveRolePermission,
-  queryPermissionsByUser,
-  loadAllRoleIds,
-  getPermissionRuleList,
-  queryPermissionRule,
-  queryDepartTreeList,
-  queryIdTree,
-  queryParentName,
-  searchByKeywords,
-  deleteByDepartId,
-  deleteLog,
-  deleteLogList,
-  addDict,
-  editDict,
-  treeList,
-  addDictItem,
-  editDictItem,
-  doReleaseData,
-  doReovkeData,
-  getLoginfo,
-
-  getVisitInfo,
-  queryUserByDepId,
-  queryUserRoleMap,
-  duplicateCheck,
-  queryTreeListForRole,
-  getIndustryList,
-  getIndustryTreeList
-
-}
-
-
-
+import {getAction, deleteAction, putAction, postAction} from '@/api/manage'
+
+////根路径
+// const doMian = "/jeecg-boot/";
+////图片预览请求地址
+// const imgView = "http://localhost:8080/jeecg-boot/sys/common/view/";
+
+//角色管理
+const addRole = (params) => postAction("/sys/role/add", params);
+const editRole = (params) => putAction("/sys/role/edit", params);
+// const getRoleList = (params)=>getAction("/sys/role/list",params);
+// const deleteRole = (params)=>deleteAction("/sys/role/delete",params);
+// const deleteRoleList = (params)=>deleteAction("/sys/role/deleteBatch",params);
+const checkRoleCode = (params) => getAction("/sys/role/checkRoleCode", params);
+const queryall = (params) => getAction("/sys/role/queryall", params);
+
+//用户管理
+const addUser = (params) => postAction("/sys/user/add", params);
+const editUser = (params) => putAction("/sys/user/edit", params);
+const queryUserRole = (params) => getAction("/sys/user/queryUserRole", params);
+const getUserList = (params) => getAction("/sys/user/list", params);
+// const deleteUser = (params)=>deleteAction("/sys/user/delete",params);
+// const deleteUserList = (params)=>deleteAction("/sys/user/deleteBatch",params);
+const frozenBatch = (params) => putAction("/sys/user/frozenBatch", params);
+//改变密码
+const changPassword = (params) => putAction("/sys/user/changPassword", params);
+//行业管理
+const getIndustryList = (params) => getAction("/industry/industry/list", params);
+const getIndustryTreeList = (params) => getAction("/industry/industry/queryTreeList", params);
+
+//验证用户是否存在
+const checkOnlyUser = (params) => getAction("/sys/user/checkOnlyUser", params);
+//权限管理
+const addPermission = (params) => postAction("/sys/permission/add", params);
+const editPermission = (params) => putAction("/sys/permission/edit", params);
+const getPermissionList = (params) => getAction("/sys/permission/list", params);
+// const deletePermission = (params)=>deleteAction("/sys/permission/delete",params);
+// const deletePermissionList = (params)=>deleteAction("/sys/permission/deleteBatch",params);
+const queryTreeList = (params) => getAction("/sys/permission/queryTreeList", params);
+const queryTreeListForRole = (params) => getAction("/sys/role/queryTreeList", params);
+const queryListAsync = (params) => getAction("/sys/permission/queryListAsync", params);
+const queryRolePermission = (params) => getAction("/sys/permission/queryRolePermission", params);
+const saveRolePermission = (params) => postAction("/sys/permission/saveRolePermission", params);
+//const queryPermissionsByUser = (params)=>getAction("/sys/permission/queryByUser",params);
+const queryPermissionsByUser = (params) => getAction("/sys/permission/getUserPermissionByToken", params);
+const loadAllRoleIds = (params) => getAction("/sys/permission/loadAllRoleIds", params);
+const getPermissionRuleList = (params) => getAction("/sys/permission/getPermRuleListByPermId", params);
+const queryPermissionRule = (params) => getAction("/sys/permission/queryPermissionRule", params);
+
+// 部门管理
+const queryDepartTreeList = (params) => getAction("/sysdepart/sysDepart/queryTreeList", params);
+const queryIdTree = (params) => getAction("/sysdepart/sysDepart/queryIdTree", params);
+const queryParentName = (params) => getAction("/sysdepart/sysDepart/queryParentName", params);
+const searchByKeywords = (params) => getAction("/sysdepart/sysDepart/searchBy", params);
+const deleteByDepartId = (params) => deleteAction("/sysdepart/sysDepart/delete", params);
+
+//日志管理
+//const getLogList = (params)=>getAction("/sys/log/list",params);
+const deleteLog = (params) => deleteAction("/sys/log/delete", params);
+const deleteLogList = (params) => deleteAction("/sys/log/deleteBatch", params);
+
+//数据字典
+const addDict = (params) => postAction("/sys/dict/add", params);
+const editDict = (params) => putAction("/sys/dict/edit", params);
+//const getDictList = (params)=>getAction("/sys/dict/list",params);
+const treeList = (params) => getAction("/sys/dict/treeList", params);
+// const delDict = (params)=>deleteAction("/sys/dict/delete",params);
+//const getDictItemList = (params)=>getAction("/sys/dictItem/list",params);
+const addDictItem = (params) => postAction("/sys/dictItem/add", params);
+const editDictItem = (params) => putAction("/sys/dictItem/edit", params);
+//const delDictItem = (params)=>deleteAction("/sys/dictItem/delete",params);
+//const delDictItemList = (params)=>deleteAction("/sys/dictItem/deleteBatch",params);
+
+//字典标签专用(通过code获取字典数组)
+export const ajaxGetDictItems = (code, params) => getAction(`/sys/dict/getDictItems/${code}`, params);
+
+//系统通告
+const doReleaseData = (params) => getAction("/sys/annountCement/doReleaseData", params);
+const doReovkeData = (params) => getAction("/sys/annountCement/doReovkeData", params);
+//获取系统访问量
+const getLoginfo = (params) => getAction("/sys/loginfo", params);
+
+const getVisitInfo = (params) => getAction("/sys/visitInfo", params);
+//数据日志访问
+// const getDataLogList = (params)=>getAction("/sys/dataLog/list",params);
+
+// 根据部门主键查询用户信息
+const queryUserByDepId = (params) => getAction("/sys/user/queryUserByDepId", params);
+
+// 查询用户角色表里的所有信息
+const queryUserRoleMap = (params) => getAction("/sys/user/queryUserRoleMap", params);
+// 重复校验
+const duplicateCheck = (params) => getAction("/sys/duplicate/check", params);
+
+export {
+  // imgView,
+  // doMian,
+  addRole,
+  editRole,
+  checkRoleCode,
+  addUser,
+  editUser,
+  queryUserRole,
+  getUserList,
+  queryall,
+  frozenBatch,
+  checkOnlyUser,
+  changPassword,
+  getPermissionList,
+  addPermission,
+  editPermission,
+  queryTreeList,
+  queryListAsync,
+  queryRolePermission,
+  saveRolePermission,
+  queryPermissionsByUser,
+  loadAllRoleIds,
+  getPermissionRuleList,
+  queryPermissionRule,
+  queryDepartTreeList,
+  queryIdTree,
+  queryParentName,
+  searchByKeywords,
+  deleteByDepartId,
+  deleteLog,
+  deleteLogList,
+  addDict,
+  editDict,
+  treeList,
+  addDictItem,
+  editDictItem,
+  doReleaseData,
+  doReovkeData,
+  getLoginfo,
+
+  getVisitInfo,
+  queryUserByDepId,
+  queryUserRoleMap,
+  duplicateCheck,
+  queryTreeListForRole,
+  getIndustryList,
+  getIndustryTreeList
+
+}
+
+
+

+ 15 - 0
src/api/manage.js

@@ -112,6 +112,21 @@ export function downFile(url, parameter) {
   })
 }
 
+/**
+ * 下载文件 用于excel导出
+ * @param url
+ * @param parameter
+ * @returns {*}
+ */
+export function downFilePost(url, parameter) {
+    return axios({
+      url: url,
+      data: parameter,
+      method: 'post',
+      responseType: 'blob'
+    })
+  }
+
 export function getProvince(url, parameter) {
     return axios({
       url: url,

+ 10 - 0
src/api/statistics.js

@@ -30,6 +30,16 @@ export function getStatistics(parameter) {
 }
 
 
+
+// getDailyReport 
+export function getDailyReport(parameter) {
+    return axios({
+      url: "/ctop/daily/getDailyReport",
+      method: 'post',
+      data: parameter
+    })
+}
+
 // /materialReport/getKuaiShouMaterialMarket
 //素材大盘
 export function getKuaiShouMaterialMarket(parameter) {

+ 83 - 78
src/config/router.config.js

@@ -1,78 +1,83 @@
-import {UserLayout, TabLayout, RouteView, BlankLayout, PageView} from '@/components/layouts'
-
-/**
- * 走菜单,走权限控制
- * @type {[null,null]}
- */
-export const asyncRouterMap = [
-
-  {
-    path: '/',
-    name: 'dashboard',
-    component: TabLayout,
-    meta: {title: '首页'},
-    redirect: '/dashboard/workplace',
-    children: []
-  },
-  {
-    path: '*', redirect: '/404', hidden: true
-  }
-]
-
-/**
- * 基础路由
- * @type { *[] }
- */
-export const constantRouterMap = [
-  {
-    path: '/user',
-    component: UserLayout,
-    redirect: '/user/login',
-    hidden: true,
-    children: [
-      {
-        path: 'login',
-        name: 'login',
-        component: () => import(/* webpackChunkName: "user" */ '@/views/user/Login')
-      },
-      {
-        path: 'register',
-        name: 'register',
-        component: () => import(/* webpackChunkName: "user" */ '@/views/user/Register')
-      },
-      {
-        path: 'register-result',
-        name: 'registerResult',
-        component: () => import(/* webpackChunkName: "user" */ '@/views/user/RegisterResult')
-      },
-      {
-        path: 'alteration',
-        name: 'alteration',
-        component: () => import(/* webpackChunkName: "user" */ '@/views/user/Alteration')
-      },
-      {
-        path: 'layer',
-        name: 'layer',
-        component: () => import(/* webpackChunkName: "user" */ '@/views/user/layer')
-      }
-    ]
-  },
-
-
-  {
-    path: '/test',
-    component: BlankLayout,
-    redirect: '/test/home',
-    children: [
-      {
-        path: 'home',
-        name: 'TestHome',
-        component: () => import('@/views/Home')
-      }
-    ]
-  },
-  {
-    path: '/404',
-    component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404')
-  },
-]
+import {UserLayout, TabLayout, RouteView, BlankLayout, PageView} from '@/components/layouts'
+
+/**
+ * 走菜单,走权限控制
+ * @type {[null,null]}
+ */
+export const asyncRouterMap = [
+
+  {
+    path: '/',
+    name: 'dashboard',
+    component: TabLayout,
+    meta: {title: '首页'},
+    redirect: '/dashboard/workplace',
+    children: []
+  },
+  {
+    path: '*', redirect: '/404', hidden: true
+  }
+]
+
+/**
+ * 基础路由
+ * @type { *[] }
+ */
+export const constantRouterMap = [
+  {
+    path: '/user',
+    component: UserLayout,
+    redirect: '/user/login',
+    hidden: true,
+    children: [
+      {
+        path: 'login',
+        name: 'login',
+        component: () => import(/* webpackChunkName: "user" */ '@/views/user/Login')
+      },
+      {
+        path: 'transfer-local',
+        name: 'transfer-local',
+        component: () => import(/* webpackChunkName: "user" */ '@/views/user/transferLocal')
+      },
+      {
+        path: 'register',
+        name: 'register',
+        component: () => import(/* webpackChunkName: "user" */ '@/views/user/Register')
+      },
+      {
+        path: 'register-result',
+        name: 'registerResult',
+        component: () => import(/* webpackChunkName: "user" */ '@/views/user/RegisterResult')
+      },
+      {
+        path: 'alteration',
+        name: 'alteration',
+        component: () => import(/* webpackChunkName: "user" */ '@/views/user/Alteration')
+      },
+      {
+        path: 'layer',
+        name: 'layer',
+        component: () => import(/* webpackChunkName: "user" */ '@/views/user/layer')
+      }
+    ]
+  },
+
+
+  {
+    path: '/test',
+    component: BlankLayout,
+    redirect: '/test/home',
+    children: [
+      {
+        path: 'home',
+        name: 'TestHome',
+        component: () => import('@/views/Home')
+      }
+    ]
+  },
+  {
+    path: '/404',
+    component: () => import(/* webpackChunkName: "fail" */ '@/views/exception/404')
+  },
+]

+ 1 - 1
src/permission.js

@@ -10,7 +10,7 @@ import {generateIndexRouter} from "@/utils/util"
 NProgress.configure({showSpinner: false}) // NProgress Configuration
 
 
-const whiteList = ['/user/login', '/user/register', '/user/register-result', '/user/alteration'] // no redirect whitelist
+const whiteList = ['/user/login', '/user/register', '/user/register-result', '/user/alteration','/user/transfer-local'] // no redirect whitelist
 
 router.beforeEach((to, from, next) => {
   NProgress.start() // start progress bar

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

@@ -58,6 +58,20 @@ const user = {
         })
       })
     },
+    //企业微信登录
+    wxLogin({commit}, userInfos) {
+
+              const result = userInfos.result
+              const userInfo = result.userInfo
+              Vue.ls.set(ACCESS_TOKEN, result.token, 7 * 24 * 60 * 60 * 1000)
+              Vue.ls.set(USER_NAME, userInfo.username, 7 * 24 * 60 * 60 * 1000)
+              Vue.ls.set(USER_INFO, userInfo, 7 * 24 * 60 * 60 * 1000)
+              commit('SET_TOKEN', result.token)
+              commit('SET_INFO', userInfo)
+              commit('SET_NAME', {username: userInfo.username, realname: userInfo.realname, welcome: welcome()})
+              commit('SET_AVATAR', userInfo.avatar)
+
+      },
     //手机号登录
     PhoneLogin({commit}, userInfo) {
       return new Promise((resolve, reject) => {

+ 125 - 151
src/views/list/MediaList.vue

@@ -1,152 +1,126 @@
-<template>
-  <a-card :bordered="false">
-
-    <!-- 查询区域 -->
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline">
-        <a-row :gutter="24">
-
-          <a-col :md="6" :sm="8">
-            <a-form-item label="媒体名称">
-              <a-input placeholder="请输入媒体名称" v-model="queryParam.name"></a-input>
-            </a-form-item>
-          </a-col>
-
-          <a-col :md="6" :sm="8">
-            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
-              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
-              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
-              <a @click="handleToggleSearch" style="margin-left: 8px">
-                {{ toggleSearchStatus ? '收起' : '展开' }}
-                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
-              </a>
-            </span>
-          </a-col>
-
-        </a-row>
-      </a-form>
-    </div>
-
-    <!-- 操作按钮区域 -->
-    <div class="table-operator">
-      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
-      <a-button type="primary" icon="download" @click="handleExportXls('媒体表')">导出</a-button>
-      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl"
-                @change="handleImportExcel">
-        <a-button type="primary" icon="import">导入</a-button>
-      </a-upload>
-      <a-dropdown v-if="selectedRowKeys.length > 0">
-        <a-menu slot="overlay">
-          <a-menu-item key="1" @click="batchDel">
-            <a-icon type="delete"/>
-            删除
-          </a-menu-item>
-        </a-menu>
-        <a-button style="margin-left: 8px"> 批量操作
-          <a-icon type="down"/>
-        </a-button>
-      </a-dropdown>
-    </div>
-
-    <!-- table区域-begin -->
-    <div>
-      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
-        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
-        selectedRowKeys.length }}</a>项
-        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
-      </div>
-
-      <a-table
-        ref="table"
-        size="middle"
-        bordered
-        rowKey="id"
-        :columns="columns"
-        :dataSource="dataSource"
-        :pagination="ipagination"
-        :loading="loading"
-        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
-        @change="handleTableChange">
-
-        <span slot="action" slot-scope="text, record">
-          <a @click="handleEdit(record)">编辑</a>
-
-          <a-divider type="vertical"/>
-          <a-dropdown>
-            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
-            <a-menu slot="overlay">
-              <a-menu-item>
-                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
-                  <a>删除</a>
-                </a-popconfirm>
-              </a-menu-item>
-            </a-menu>
-          </a-dropdown>
-        </span>
-
-      </a-table>
-    </div>
-    <!-- table区域-end -->
-
-    <!-- 表单区域 -->
-    <media-modal ref="modalForm" @ok="modalFormOk"></media-modal>
-  </a-card>
-</template>
-
-<script>
-  import MediaModal from './modules/MediaModal'
-  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
-
-  export default {
-    name: "MediaList",
-    mixins: [JeecgListMixin],
-    components: {
-      MediaModal
-    },
-    data() {
-      return {
-        description: '媒体表管理页面',
-        // 表头
-        columns: [
-          {
-            title: '#',
-            dataIndex: '',
-            key: 'rowIndex',
-            width: 60,
-            align: "center",
-            customRender: function (t, r, index) {
-              return parseInt(index) + 1;
-            }
-          },
-          {
-            title: '媒体名称',
-            align: "center",
-            dataIndex: 'name'
-          },
-          {
-            title: '操作',
-            dataIndex: 'action',
-            align: "center",
-            scopedSlots: {customRender: 'action'},
-          }
-        ],
-        url: {
-          list: "/ctop/media/list",
-          delete: "/ctop/media/delete",
-          deleteBatch: "/ctop/media/deleteBatch",
-          exportXlsUrl: "/ctop/media/exportXls",
-          importExcelUrl: "/ctop/media/importExcel",
-        },
-      }
-    },
-    computed: {
-      importExcelUrl: function () {
-        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
-      }
-    },
-    methods: {}
-  }
-</script>
-<style scoped>
-  @import '~@assets/less/common.less'
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="8">
+            <a-form-item label="媒体名称">
+              <a-input placeholder="请输入媒体名称" v-model="queryParam.name"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <media-modal ref="modalForm" @ok="modalFormOk"></media-modal>
+  </a-card>
+</template>
+
+<script>
+  import MediaModal from './modules/MediaModal'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "MediaList",
+    mixins: [JeecgListMixin],
+    components: {
+      MediaModal
+    },
+    data() {
+      return {
+        description: '媒体表管理页面',
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key: 'rowIndex',
+            width: 60,
+            align: "center",
+            customRender: function (t, r, index) {
+              return parseInt(index) + 1;
+            }
+          },
+          {
+            title: '媒体名称',
+            align: "center",
+            dataIndex: 'name'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align: "center",
+            scopedSlots: {customRender: 'action'},
+          }
+        ],
+        url: {
+          list: "/ctop/media/list",
+          delete: "/ctop/media/delete",
+          deleteBatch: "/ctop/media/deleteBatch",
+          exportXlsUrl: "/ctop/media/exportXls",
+          importExcelUrl: "/ctop/media/importExcel",
+        },
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {}
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
 </style>

+ 6 - 6
src/views/modules/Statistics/Statistics.vue

@@ -1362,12 +1362,12 @@ export default {
 
       var option = {
         backgroundColor: '#fff',
-        toolbox: {
-          show: true,
-          feature: {
-            dataView: { readOnly: false }
-          }
-        },
+        // toolbox: {
+        //   show: true,
+        //   feature: {
+        //     dataView: { readOnly: false }
+        //   }
+        // },
         tooltip: {
           trigger: 'axis',
           formatter: function(params) {

+ 530 - 0
src/views/modules/Statistics/alipayStatistics.vue

@@ -0,0 +1,530 @@
+<style lang="scss" scoped>
+.search-bar {
+  display: flex;
+  align-items: center;
+}
+.search-box p {
+  display: inline-block;
+  border: 1px solid #f2f2f2;
+  border-radius: 5px;
+  margin-right: 10px;
+  padding: 5px 10px;
+  cursor: pointer;
+}
+</style>
+<style>
+/* .data-display-statistics .ant-card-body {
+  padding: 0 15px;
+} */
+.data-display-statistics .ant-col-6 {
+  margin: 10px 0;
+}
+.data-display-statistics .ant-col-6 .ant-card-body {
+  display: flex;
+  justify-content: center;
+}
+.data-display-statistics .ant-col-6 p,
+.data-display-statistics .ant-col-6 span {
+  text-align: center;
+  line-height: 40px;
+  font-size: 30px;
+  font-weight: 600;
+  color: red;
+  margin: 0;
+}
+.search-box .ant-card-body {
+  padding: 5px 15px;
+}
+.data-display-statistics .ant-col-6 .ant-card-body .styleElse {
+  line-height: 60px;
+  height: 40px;
+  font-size: 16px;
+  font-weight: 400;
+  margin-left: 10px;
+}
+.ant-modal-wrap .yincang .ant-modal-content .ant-modal-footer {
+  display: none !important;
+}
+.yincang .ant-col-6 p {
+  text-align: left;
+  color: red;
+  font-size: 16px;
+  font-weight: 500;
+}
+.ant-table-thead div {
+  font-weight: 700;
+}
+.tool-tip {
+  position: absolute;
+  top: 65px;
+  right: 10px;
+}
+th div {
+  white-space: nowrap;
+}
+</style>
+<template>
+  <div class="data-statistics">
+    <a-row class="image-list-heading vm-panel">
+      <a-row type="flex" align="middle" justify="space-between" class="panel-body">
+        <div class="search-bar" style="width:100%">
+          <span>账户选择:</span>
+          <treeselect :appId.sync="appId" style="width:400px" />
+          <span style="margin-left:10px">返点比例:</span>
+          <a-input-number
+            :min="1"
+            :max="10"
+            :step="0.1"
+            v-model="discount"
+            placeholder="请输入折扣"
+            style="width:100px"
+          />
+          <span style="margin-left:10px">日期选择:</span>
+          <a-date-picker @change="getDate" :disabledDate="disabledDate" />
+          <a-button type="primary" style="margin:10px" @click="addUser">搜索</a-button>
+          <a-button
+            type="primary"
+            icon="reload"
+            @click="getDataReset"
+            style="background-color:#67c23a;border-color:#67c23a"
+            >刷新</a-button
+          >
+        </div>
+      </a-row>
+    </a-row>
+    <a-row :gutter="10" style="margin-top:10px">
+      <a-col :span="24">
+        <a-card
+          style="width:100%"
+          :tabList="tabListNoTitle"
+          :activeTabKey="noTitleKey"
+          @tabChange="key => onTabChange(key, 'noTitleKey')"
+        >
+          <div style="display:flex;margin-bottom:15px">
+            <!-- <a-select style="width: 120px" v-model="statHour" @change="getElseData" allowClear>
+              <a-select-option v-for="item of 24" :key="item - 1" :value="item - 1">{{ item - 1 }}</a-select-option>
+            </a-select> -->
+            <a-button type="primary" @click="exportExcel">导出</a-button>
+          </div>
+          <a-table
+            size="middle"
+            :columns="columns"
+            :dataSource="data"
+            bordered
+            id="outTable"
+            :pagination="ipagination"
+            :scroll="{ x: 1900 }"
+            :loading="loading"
+          >
+            <span slot="statDate" slot-scope="statDate">{{ statDate | formatDate }}</span>
+            <span slot="disCountCost" slot-scope="disCountCost">{{ disCountCost | toFixtwo }}</span>
+
+            <span slot="clickConversionRate" slot-scope="clickConversionRate">{{ clickConversionRate | getBo }}</span>
+
+            <span slot="cost" slot-scope="cost">{{ cost | toFixtwo }}</span>
+            <span slot="photoClickCost" slot-scope="photoClickCost">{{ photoClickCost | toFixtwo }}</span>
+            <span slot="impression1kCost" slot-scope="impression1kCost">{{ impression1kCost | toFixtwo }}</span>
+            <span slot="conversionPrice" slot-scope="conversionPrice">{{ conversionPrice | toFixtwo }}</span>
+            <span slot="discountConversionPrice" slot-scope="discountConversionPrice">{{
+              discountConversionPrice | toFixtwo
+            }}</span>
+            <span slot="contractRebateRealCharged" slot-scope="contractRebateRealCharged">{{
+              contractRebateRealCharged | toFixtwo
+            }}</span>
+            <span slot="actualCost" slot-scope="actualCost">{{ actualCost | toFixtwo }}</span>
+
+            <span slot="photoClickRatio" slot-scope="photoClickRatio">{{ photoClickRatio | getBo }}</span>
+            <span slot="actionRatio" slot-scope="actionRatio">{{ actionRatio | getBo }}</span>
+            <span slot="conversionRate" slot-scope="conversionRate">{{ conversionRate | getBo }}</span>
+            <span slot="photoClickRatio" slot-scope="photoClickRatio">{{ photoClickRatio | getBo }}</span>
+          </a-table>
+        </a-card>
+      </a-col>
+    </a-row>
+  </div>
+</template>
+
+<script>
+import ARow from 'ant-design-vue/es/grid/Row'
+import ACol from 'ant-design-vue/es/grid/Col'
+import countTo from 'vue-count-to'
+import moment from 'moment'
+import { getDailyReport } from '@api/statistics'
+import { getAction, postAction, downFile, downFilePost } from '@/api/manage'
+import axios from 'axios'
+import lifting from './components/lifting'
+import timeCheck from './components/timeCheck'
+import Treeselect from './components/Treeselect.vue'
+
+import { JeecgListMixin } from '@/mixins/ipagination'
+
+var length = 0
+var active = 1
+const columns = [
+  {
+    title: '消耗(¥)',
+    dataIndex: 'cost',
+    scopedSlots: { customRender: 'cost' },
+    align: 'center'
+  },
+  {
+    title: '展示数',
+    dataIndex: 'photoShow',
+    align: 'center'
+  },
+  {
+    title: '点击数',
+    dataIndex: 'photoClick',
+    align: 'center'
+  },
+  {
+    title: '点击率',
+    dataIndex: 'photoClickRatio',
+    align: 'center',
+    scopedSlots: { customRender: 'photoClickRatio' }
+  },
+  {
+    title: '平均点击花费',
+    dataIndex: 'photoClickCost',
+    align: 'center',
+    scopedSlots: { customRender: 'photoClickCost' }
+  },
+  {
+    title: '行为数',
+    dataIndex: 'bclick',
+    align: 'center'
+  },
+  {
+    title: '行为率',
+    dataIndex: 'actionRatio',
+    align: 'center',
+    scopedSlots: { customRender: 'actionRatio' }
+  },
+  {
+    title: '平均千次展示花费(¥)',
+    dataIndex: 'impression1kCost',
+    align: 'center',
+    scopedSlots: { customRender: 'impression1kCost' }
+  },
+
+  {
+    title: '转化数',
+    dataIndex: 'conversions',
+    align: 'center'
+  },
+  {
+    title: '转化单价(¥)',
+    dataIndex: 'conversionPrice',
+    align: 'center',
+    scopedSlots: { customRender: 'conversionPrice' }
+  },
+  {
+    title: '转化率',
+    dataIndex: 'conversionRate',
+    align: 'center',
+    scopedSlots: { customRender: 'conversionRate' }
+  },
+  {
+    title: '折后转化成本(¥)',
+    dataIndex: 'discountConversionPrice',
+    align: 'center',
+    scopedSlots: { customRender: 'discountConversionPrice' }
+  },
+  {
+    title: '激励花费(¥)',
+    dataIndex: 'contractRebateRealCharged',
+    align: 'center',
+    scopedSlots: { customRender: 'contractRebateRealCharged' }
+  },
+  {
+    title: '实际消耗(¥)',
+    dataIndex: 'actualCost',
+    align: 'center',
+    scopedSlots: { customRender: 'actualCost' }
+  }
+]
+
+const columnsGroup = [
+  {
+    title: '日期',
+    dataIndex: 'statDate',
+    scopedSlots: { customRender: 'statDate' },
+    align: 'center'
+  },
+  {
+    title: '账号',
+    dataIndex: 'accountId',
+    align: 'center'
+  },
+  {
+    title: '账号名称',
+    dataIndex: 'authName',
+    align: 'center'
+  },
+  {
+    title: '计划名称',
+    dataIndex: 'campaignName',
+    align: 'center'
+  },
+  {
+    title: '广告组名称',
+    dataIndex: 'unitName',
+    align: 'center'
+  },
+  {
+    title: '消耗',
+    dataIndex: 'cost',
+    align: 'center',
+    scopedSlots: { customRender: 'cost' }
+  },
+  {
+    title: '折后消耗',
+    dataIndex: 'disCountCost',
+    align: 'center',
+    scopedSlots: { customRender: 'cost' }
+  },
+  {
+    title: '展示数',
+    dataIndex: 'photoShow',
+    align: 'center'
+  },
+  {
+    title: '点击数',
+    dataIndex: 'photoClick',
+    align: 'center'
+  },
+  {
+    title: '点击率',
+    dataIndex: 'photoClickRatio',
+    align: 'center',
+    scopedSlots: { customRender: 'photoClickRatio' }
+  },
+
+  {
+    title: '行为数',
+    dataIndex: 'bclick',
+    align: 'center'
+  },
+  {
+    title: '行为率',
+    dataIndex: 'actionRatio',
+    align: 'center',
+    scopedSlots: { customRender: 'actionRatio' }
+  },
+  {
+    title: '平均千次展示花费(¥)',
+    dataIndex: 'impression1kCost',
+    align: 'center',
+    scopedSlots: { customRender: 'impression1kCost' }
+  },
+  {
+    title: '平均点击花费',
+    dataIndex: 'photoClickCost',
+    align: 'center',
+    scopedSlots: { customRender: 'photoClickCost' }
+  },
+  {
+    title: '转化数',
+    dataIndex: 'conversions',
+    align: 'center'
+  },
+  {
+    title: '转化单价(¥)',
+    dataIndex: 'conversionPrice',
+    align: 'center',
+    scopedSlots: { customRender: 'conversionPrice' }
+  },
+  {
+    title: '转化率',
+    dataIndex: 'conversionRate',
+    align: 'center',
+    scopedSlots: { customRender: 'conversionRate' }
+  },
+  {
+    title: '折后转化成本(¥)',
+    dataIndex: 'discountConversionPrice',
+    align: 'center',
+    scopedSlots: { customRender: 'discountConversionPrice' }
+  },
+  {
+    title: '点击转化率',
+    dataIndex: 'clickConversionRate',
+    align: 'center',
+    scopedSlots: { customRender: 'clickConversionRate' }
+  }
+]
+
+export default {
+  name: 'data-display-statistics',
+  components: {
+    ACol,
+    ARow,
+    countTo,
+    lifting,
+    timeCheck,
+    Treeselect
+  },
+  mixins: [JeecgListMixin],
+  data: function() {
+    return {
+      title: '账户数据展示',
+      show: true,
+      data: [],
+      dataAll: null,
+      columns: columns,
+      options: [],
+      list: [],
+      appId: [],
+      tabListNoTitle: [
+        {
+          key: 'day',
+          tab: '分日数据'
+        },
+        {
+          key: 'group',
+          tab: '分组数据'
+        }
+      ],
+      noTitleKey: 'day',
+      discount: 1,
+      date: '',
+      loading: false
+    }
+  },
+  filters: {
+    formatDate: function(value) {
+      let date = new Date(value)
+      let y = date.getFullYear()
+      let MM = date.getMonth() + 1
+      MM = MM < 10 ? '0' + MM : MM
+      let d = date.getDate()
+      d = d < 10 ? '0' + d : d
+      let h = date.getHours()
+      h = h < 10 ? '0' + h : h
+      let m = date.getMinutes()
+      m = m < 10 ? '0' + m : m
+      let s = date.getSeconds()
+      s = s < 10 ? '0' + s : s
+      return y + '-' + MM + '-' + d
+    },
+    toFixtwo: function(value) {
+      if (value) {
+        return value.toFixed(2)
+      } else {
+        return 0.0
+      }
+    },
+    getBo: function(value) {
+      if (value) {
+        return (value * 100).toFixed(2) + '%'
+      } else {
+        return '0.00%'
+      }
+    }
+  },
+  methods: {
+    moment,
+    onTabChange(key, type) {
+      console.log(key, type)
+      this[type] = key
+      this.data = []
+      if (key == 'day') {
+        this.columns = columns
+        this.data.push({ ...this.dataAll.dailyAccountReport, key: 1 })
+      } else {
+        this.columns = columnsGroup
+        this.data = this.dataAll.dailyGroupReport.map((item, index) => {
+          return {
+            ...item,
+            key: index
+          }
+        })
+      }
+      this.ipagination.total = this.data.length
+      this.ipagination.current = 1
+    },
+    disabledDate(current) {
+      return current && current > moment().subtract(1, 'day')
+    },
+    getDataReset() {
+      this.addUser()
+    },
+    addUser() {
+      var that = this
+      if (this.appId.length > 0 && this.date != '') {
+        that.getDailyReport()
+      } else {
+        this.$message.error('请选择账户及时间')
+      }
+    },
+    getDailyReport() {
+      var params = {}
+      params.accountIds = JSON.stringify(this.appId)
+      params.date = this.date
+      params.discount = this.discount
+      this.data = []
+      this.loading = true
+      getDailyReport(params).then(res => {
+        if (res.success) {
+          this.loading = false
+          this.dataAll = res.result
+          if (this.noTitleKey == 'day') {
+            this.data.push({ ...res.result.dailyAccountReport, key: 1 })
+          } else {
+            this.data = res.result.dailyGroupReport.map((item, index) => {
+              return {
+                ...item,
+                key: index
+              }
+            })
+          }
+          this.ipagination.total = this.data.length
+        }
+      })
+    },
+    getDate(value) {
+      if (value) {
+        let date = new Date(value)
+        let y = date.getFullYear()
+        let MM = date.getMonth() + 1
+        MM = MM < 10 ? '0' + MM : MM
+        let d = date.getDate()
+        d = d < 10 ? '0' + d : d
+        this.date = y + '-' + MM + '-' + d
+      } else {
+        let date = new Date()
+        let y = date.getFullYear()
+        let MM = date.getMonth() + 1
+        MM = MM < 10 ? '0' + MM : MM
+        let d = date.getDate()
+        d = d < 10 ? '0' + d : d
+        this.date = y + '-' + MM + '-' + d
+      }
+    },
+    exportExcel() {
+      var params = {}
+      params.accountIds = JSON.stringify(this.appId)
+      params.date = this.date
+      params.discount = this.discount
+      downFilePost('/ctop/daily/exportDailyReport', params).then(res => {
+        let blob = new Blob([res], {
+          type: 'application/vnd.ms-excel'
+        })
+        let downloadElement = document.createElement('a')
+        let href = window.URL.createObjectURL(blob) //创建下载的链接
+        downloadElement.href = href
+        downloadElement.download = this.date + '-日报' //下载后文件名
+        document.body.appendChild(downloadElement)
+        downloadElement.click() //点击下载
+        document.body.removeChild(downloadElement) //下载完成移除元素
+        window.URL.revokeObjectURL(href) //释放掉blob对象
+      })
+    }
+  },
+  watch: {},
+  distoryed() {},
+  mounted: function() {
+    this.$nextTick(() => {})
+  }
+}
+</script>

+ 17 - 21
src/views/modules/Statistics/components/Treeselect.vue

@@ -6,7 +6,8 @@
 <template>
   <div class="select-project">
     <treeselect
-      :multiple="true"
+      :multiple="multiple"
+      :disable-branch-nodes="!multiple"
       :options="options"
       :load-options="loadOptions"
       placeholder="请选择项目以及账户"
@@ -14,6 +15,10 @@
       :value-consists-of="valueConsistsOf"
       @select="update"
       @input="emitValue"
+      :limit="2"
+      :limitText="(count)=>{return '隐藏'+count+'条'}"
+      noChildrenText="该项目下暂无账号"
+      noOptionsText="暂无项目"
     />
   </div>
 </template>
@@ -34,25 +39,16 @@ export default {
   data: () => ({
     value: null,
     valueConsistsOf: 'LEAF_PRIORITY',
-    options: [
-      {
-        id: 'success',
-        label: 'With children',
-        // Declare an unloaded branch node.
-        children: null
-      },
-      {
-        id: 'no-children',
-        label: 'With no children',
-        children: null
-      },
-      {
-        id: 'failure',
-        label: 'Demonstrates error handling',
-        children: null
-      }
-    ]
+    options: []
   }),
+  props: {
+    multiple: {
+      type: Boolean,
+      default() {
+        return true
+      }
+    }
+  },
   components: { Treeselect },
   watch: {
     $route(n, o) {
@@ -63,6 +59,7 @@ export default {
     ...mapGetters(['nickname', 'avatar', 'userInfo']),
     update(node, id) {
       console.log(node, id)
+
       getAction('/ctop/userAllocation/getAccountListByProjectId', { projectId: node.id }).then(res => {
         console.log(res)
         if (res.code == 0) {
@@ -88,7 +85,6 @@ export default {
       // Typically, do the AJAX stuff here.
       // Once the server has responded,
       // assign children options to the parent node & call the callback.
-      console.log(action)
       if (action === LOAD_CHILDREN_OPTIONS) {
         getAction('/ctop/userAllocation/getAccountListByProjectId', { projectId: parentNode.id }).then(res => {
           console.log(res)
@@ -127,7 +123,7 @@ export default {
       })
     }
   },
-  activated() {
+  mounted() {
     this.getParticipateList()
   }
 }

+ 0 - 1
src/views/modules/Statistics/dataDisplayStatistics.vue

@@ -66,7 +66,6 @@ th div {
 <template>
   <div class="data-statistics">
     <a-row class="image-list-heading vm-panel">
-      <div class="panel-heading">{{ title }}</div>
       <a-row type="flex" align="middle" justify="space-between" class="panel-body">
         <div class="search-bar" style="width:100%">
           <span>账户选择:</span>

+ 29 - 72
src/views/modules/Statistics/refuseData.vue

@@ -1,76 +1,11 @@
-<style>
-/* .data-display-statistics .ant-col-6 {
-  margin: 10px 0;
-}
-.data-display-statistics .ant-col-6 .ant-card-body {
-  display: flex;
-  justify-content: center;
-}
-.data-display-statistics .ant-col-6 p,
-.data-display-statistics .ant-col-6 span {
-  text-align: center;
-  line-height: 40px;
-  font-size: 30px;
-  font-weight: 600;
-  color: red;
-  margin: 0;
-}
-.search-box .ant-card-body {
-  padding: 5px 15px;
-}
-.data-display-statistics .ant-col-6 .ant-card-body .styleElse {
-  line-height: 60px;
-  height: 40px;
-  font-size: 16px;
-  font-weight: 400;
-  margin-left: 10px;
-}
-.ant-modal-wrap .yincang .ant-modal-content .ant-modal-footer {
-  display: none !important;
-}
-.yincang .ant-col-6 p {
-  text-align: left;
-  color: red;
-  font-size: 16px;
-  font-weight: 500;
-}
-.ant-table-thead div {
-  font-weight: 700;
-}
-.tool-tip {
-  position: absolute;
-  top: 65px;
-  right: 10px;
-}
-th div {
-  white-space: nowrap;
-}
-.data-display-statistics th {
-  text-align: center !important;
-} */
-</style>
+<style></style>
 <template>
   <div class="data-refuse-statistics">
     <a-row class="image-list-heading vm-panel">
-      <div class="panel-heading" style="display:flex;justify-content: space-between;">{{ title }}</div>
       <a-row type="flex" align="middle" justify="space-between" class="panel-body">
         <div class="search-bar" style="width:100%;display:flex">
-          <span style="line-height:35px">账户选择:</span>
-          <treeselect :appId.sync="appId" />
-          <!-- <a-select
-            v-model="appId"
-            showSearch
-            allowClear
-            placeholder="请选择账户"
-            optionFilterProp="children"
-            style="width:600px"
-          >
-            <a-select-option
-              v-for="appModel in options"
-              :key="appModel.id+new Date().getTime()"
-              :value="appModel.accountId"
-            >{{appModel.advertiserName}}&#12288;&#12288;{{appModel.accountId}}&#12288;&nbsp;&#12288;{{appModel.authName}}&#12288;&#12288;{{appModel.operationName}}</a-select-option>
-          </a-select> -->
+          <span style="line-height:35px;margin-left:15px">账户选择:</span>
+          <treeselect :appId.sync="appId" :multiple="false" />
           <a-button type="primary" style="margin-left:10px" @click="addUser">搜索</a-button>
         </div>
       </a-row>
@@ -83,7 +18,14 @@ th div {
             <a-button type="primary" style="margin-left:10px" @click="addUserKey">搜索</a-button>
           </div>
 
-          <a-table :columns="columns" :dataSource="dataList" bordered :loading="loading">
+          <a-table
+            :columns="columns"
+            :dataSource="dataList"
+            bordered
+            :loading="loading"
+            size="middle"
+            :pagination="ipagination"
+          >
             <div slot="videoUrl" slot-scope="videoUrl">
               <video class="video" :src="videoUrl" controls="controls" style="height:200px;width:112.5px">
                 您的浏览器不支持 video 标签。
@@ -93,14 +35,12 @@ th div {
               <img :src="coverUrl" controls="controls" style="height:200px;width:112.5px" />
             </div>
             <template slot="creativeName" slot-scope="text, record">
-              <!-- <editable-cell :text="text" @change="onCellChange(record, 'creativeName', $event)" /> -->
               <div>
                 {{ text }}
                 <a-icon type="edit" style="cursor: pointer;" @click="onCellChange(record, 'creativeName')" />
               </div>
             </template>
             <template slot="description" slot-scope="text, record">
-              <!-- <editable-cell :text="text" @change="onCellChange(record, 'description', $event)" /> -->
               <div>
                 {{ text }}
                 <a-icon type="edit" style="cursor: pointer;" @click="onCellChange(record, 'description')" />
@@ -214,7 +154,23 @@ export default {
       confirmLoading: false,
       visible: false,
       editWord: '',
-      nowData: null
+      nowData: null,
+      ipagination: {
+        current: 1,
+        pageSize: 10,
+        //   pageSizeOptions: ['10', '20', '30'],
+        showTotal: (total, range) => {
+          return range[0] + '-' + range[1] + ' 共' + total + '条'
+        },
+        showQuickJumper: true,
+        //   showSizeChanger: true,
+        total: 0,
+        onChange: current => {
+          // 切换分页时的回调,
+          // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+          this.ipagination.current = current
+        }
+      }
     }
   },
   filters: {},
@@ -266,6 +222,7 @@ export default {
             })
             this.list = this.dataList
             this.loading = false
+            this.ipagination.total = this.dataList.length
           }
         })
       } else {

+ 0 - 0
src/views/modules/achievements/optimize.vue


+ 0 - 32
src/views/modules/advertiser/AdvertiserList.vue

@@ -38,31 +38,10 @@
     <!-- 操作按钮区域 -->
     <div class="table-operator">
       <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
-      <!--      <a-button type="primary" icon="download" @click="handleExportXls('广告主信息表')">导出</a-button>-->
-      <!--      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl"-->
-      <!--                @change="handleImportExcel">-->
-      <!--        <a-button type="primary" icon="import">导入</a-button>-->
-      <!--      </a-upload>-->
-      <a-dropdown v-if="selectedRowKeys.length > 0">
-        <a-menu slot="overlay">
-          <a-menu-item key="1" @click="batchDel">
-            <a-icon type="delete"/>
-            删除
-          </a-menu-item>
-        </a-menu>
-        <a-button style="margin-left: 8px"> 批量操作
-          <a-icon type="down"/>
-        </a-button>
-      </a-dropdown>
     </div>
 
     <!-- table区域-begin -->
     <div>
-      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
-        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
-        selectedRowKeys.length }}</a>项
-        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
-      </div>
 
       <a-table
         ref="table"
@@ -73,7 +52,6 @@
         :dataSource="dataSource"
         :pagination="ipagination"
         :loading="loading"
-        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
         @change="handleTableChange">
         <span slot="action" slot-scope="text, record">
           <a @click="handleEdit(record)">编辑</a>
@@ -228,16 +206,6 @@
         // 表头
         columns: [
           {
-            title: '#',
-            dataIndex: '',
-            key: 'rowIndex',
-            width: 60,
-            align: 'center',
-            customRender: function (t, r, index) {
-              return parseInt(index) + 1;
-            }
-          },
-          {
             title: '广告主名称',
             align: 'center',
             dataIndex: 'name'

+ 150 - 184
src/views/modules/advertiser/BindAccountLoginList.vue

@@ -1,185 +1,151 @@
-<template>
-  <a-card :bordered="false">
-
-    <!-- 查询区域 -->
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline">
-        <a-row :gutter="24">
-
-          <a-col :md="6" :sm="8">
-            <a-form-item label="账号">
-              <a-input placeholder="请输入账号" v-model="queryParam.accountName"></a-input>
-            </a-form-item>
-          </a-col>
-
-          <a-col :md="6" :sm="8">
-            <a-form-item label="广告主名称">
-              <a-input placeholder="请输入广告主名称" v-model="queryParam.advertiserName"></a-input>
-            </a-form-item>
-          </a-col>
-
-
-          </a-col>
-
-
-          <a-col :md="6" :sm="8">
-            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
-              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
-              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
-
-            </span>
-          </a-col>
-
-        </a-row>
-      </a-form>
-    </div>
-
-    <!-- 操作按钮区域 -->
-    <div class="table-operator">
-      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
-      <a-button type="primary" icon="download" @click="handleExportXls('绑定账号密码')">导出</a-button>
-      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl"
-                @change="handleImportExcel">
-        <a-button type="primary" icon="import">导入</a-button>
-      </a-upload>
-      <a-dropdown v-if="selectedRowKeys.length > 0">
-        <a-menu slot="overlay">
-          <a-menu-item key="1" @click="batchDel">
-            <a-icon type="delete"/>
-            删除
-          </a-menu-item>
-        </a-menu>
-        <a-button style="margin-left: 8px"> 批量操作
-          <a-icon type="down"/>
-        </a-button>
-      </a-dropdown>
-    </div>
-
-    <!-- table区域-begin -->
-    <div>
-      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
-        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
-        selectedRowKeys.length }}</a>项
-        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
-      </div>
-
-      <a-table
-        ref="table"
-        size="middle"
-        bordered
-        rowKey="id"
-        :columns="columns"
-        :dataSource="dataSource"
-        :pagination="ipagination"
-        :loading="loading"
-        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
-        @change="handleTableChange">
-
-        <span slot="action" slot-scope="text, record">
-          <a @click="handleEdit(record)">编辑</a>
-
-          <a-divider type="vertical"/>
-          <a-dropdown>
-            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
-            <a-menu slot="overlay">
-              <a-menu-item>
-                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
-                  <a>删除</a>
-                </a-popconfirm>
-              </a-menu-item>
-            </a-menu>
-          </a-dropdown>
-        </span>
-
-        <div
-          slot="loginTypeShow"
-          slot-scope="text, record"
-        >{{typeJson[record.loginType]}}</div>
-      </a-table>
-    </div>
-    <!-- table区域-end -->
-
-    <!-- 表单区域 -->
-    <bindAccountLogin-modal ref="modalForm" @ok="modalFormOk"></bindAccountLogin-modal>
-  </a-card>
-</template>
-
-<script>
-  import BindAccountLoginModal from './modules/BindAccountLoginModal'
-  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
-
-  export default {
-    name: "BindAccountLoginList",
-    mixins: [JeecgListMixin],
-    components: {
-      BindAccountLoginModal
-    },
-    data() {
-      return {
-
-        typeJson: {"kuaishou": "快手", "bytedance": "头条"},
-
-        description: '绑定账号密码管理页面',
-        // 表头
-        columns: [
-          {
-            title: '#',
-            dataIndex: '',
-            key: 'rowIndex',
-            width: 60,
-            align: "center",
-            customRender: function (t, r, index) {
-              return parseInt(index) + 1;
-            }
-          },
-          {
-            title: '广告主名称',
-            align: "center",
-            dataIndex: 'advertiserName'
-          },
-          {
-            title: '账号',
-            align: "center",
-            dataIndex: 'accountName'
-          },
-
-          {
-            title: '媒体类型',
-            align: "center",
-            dataIndex: 'loginTypeShow',
-            scopedSlots: { customRender: 'loginTypeShow' },
-          },
-
-          {
-            title: '账号标识',
-            align: "center",
-            dataIndex: 'accountId'
-
-          },
-          {
-            title: '操作',
-            dataIndex: 'action',
-            align: "center",
-            scopedSlots: {customRender: 'action'},
-          }
-        ],
-        url: {
-          list: "/ctop/bindAccountLogin/list",
-          delete: "/ctop/bindAccountLogin/delete",
-          deleteBatch: "/ctop/bindAccountLogin/deleteBatch",
-          exportXlsUrl: "ctop/bindAccountLogin/exportXls",
-          importExcelUrl: "ctop/bindAccountLogin/importExcel",
-        },
-      }
-    },
-    computed: {
-      importExcelUrl: function () {
-        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
-      }
-    },
-    methods: {}
-  }
-</script>
-<style scoped>
-  @import '~@assets/less/common.less'
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="8">
+            <a-form-item label="账号">
+              <a-input placeholder="请输入账号" v-model="queryParam.accountName"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="6" :sm="8">
+            <a-form-item label="广告主名称">
+              <a-input placeholder="请输入广告主名称" v-model="queryParam.advertiserName"></a-input>
+            </a-form-item>
+          </a-col>
+
+
+
+          <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+        <div
+          slot="loginTypeShow"
+          slot-scope="text, record"
+        >{{typeJson[record.loginType]}}</div>
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <bindAccountLogin-modal ref="modalForm" @ok="modalFormOk"></bindAccountLogin-modal>
+  </a-card>
+</template>
+
+<script>
+  import BindAccountLoginModal from './modules/BindAccountLoginModal'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "BindAccountLoginList",
+    mixins: [JeecgListMixin],
+    components: {
+      BindAccountLoginModal
+    },
+    data() {
+      return {
+
+        typeJson: {"kuaishou": "快手", "bytedance": "头条"},
+
+        description: '绑定账号密码管理页面',
+        // 表头
+        columns: [
+          {
+            title: '广告主名称',
+            align: "center",
+            dataIndex: 'advertiserName'
+          },
+          {
+            title: '账号',
+            align: "center",
+            dataIndex: 'accountName'
+          },
+
+          {
+            title: '媒体类型',
+            align: "center",
+            dataIndex: 'loginTypeShow',
+            scopedSlots: { customRender: 'loginTypeShow' },
+          },
+
+          {
+            title: '账号标识',
+            align: "center",
+            dataIndex: 'accountId'
+
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align: "center",
+            scopedSlots: {customRender: 'action'},
+          }
+        ],
+        url: {
+          list: "/ctop/bindAccountLogin/list",
+          delete: "/ctop/bindAccountLogin/delete",
+          deleteBatch: "/ctop/bindAccountLogin/deleteBatch",
+          exportXlsUrl: "ctop/bindAccountLogin/exportXls",
+          importExcelUrl: "ctop/bindAccountLogin/importExcel",
+        },
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {}
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
 </style>

+ 67 - 89
src/views/modules/advertiser/ProjectList.vue

@@ -1,29 +1,27 @@
 <template>
   <a-card :bordered="false">
-
     <!-- 查询区域 -->
     <div class="table-page-search-wrapper">
       <a-form layout="inline">
         <a-row :gutter="24">
-
           <a-col :md="6" :sm="8">
             <a-form-item label="项目名称">
               <a-input placeholder="请输入项目名称" v-model="queryParam.projectName"></a-input>
             </a-form-item>
           </a-col>
           <a-col :md="6" :sm="8">
-            <a-form-item label="广告主id">
-              <a-input placeholder="请输入广告主id" v-model="queryParam.advertiserId"></a-input>
-            </a-form-item>
-          </a-col>
-        <template>
-        <a-col :md="6" :sm="8">
-            <a-form-item label="负责人">
-              <a-input placeholder="请输入负责人" v-model="queryParam.responsible"></a-input>
+            <a-form-item label="广告主名称">
+              <a-input placeholder="请输入广告主名称" v-model="queryParam.advertiserName"></a-input>
             </a-form-item>
           </a-col>
+          <template>
+            <a-col :md="6" :sm="8">
+              <a-form-item label="负责人">
+                <a-input placeholder="请输入负责人" v-model="queryParam.responsible"></a-input>
+              </a-form-item>
+            </a-col>
           </template>
-          <a-col :md="6" :sm="8" >
+          <a-col :md="6" :sm="8">
             <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
               <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
               <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
@@ -33,7 +31,6 @@
               </a> -->
             </span>
           </a-col>
-
         </a-row>
       </a-form>
     </div>
@@ -41,21 +38,10 @@
     <!-- 操作按钮区域 -->
     <div class="table-operator">
       <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
-      <a-dropdown v-if="selectedRowKeys.length > 0">
-        <a-menu slot="overlay">
-          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
-        </a-menu>
-        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
-      </a-dropdown>
     </div>
 
     <!-- table区域-begin -->
     <div>
-      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
-        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
-        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
-      </div>
-
       <a-table
         ref="table"
         size="middle"
@@ -65,20 +51,18 @@
         :dataSource="dataSource"
         :pagination="ipagination"
         :loading="loading"
-        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
-        @change="handleTableChange">
-
+        @change="handleTableChange"
+      >
+        <span slot="maxBid" slot-scope="text">{{ text / 1000 }}</span>
         <span slot="action" slot-scope="text, record">
           <a @click="handleEdit(record)">编辑</a>
 
           <a-divider type="vertical" />
-         
+
           <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
             <a>删除</a>
           </a-popconfirm>
-
         </span>
-
       </a-table>
     </div>
     <!-- table区域-end -->
@@ -89,71 +73,65 @@
 </template>
 
 <script>
-  import ProjectModal from './modules/ProjectModal'
-  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+import ProjectModal from './modules/ProjectModal'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
 
-  export default {
-    name: "ProjectList",
-    mixins:[JeecgListMixin],
-    components: {
-      ProjectModal
-    },
-    data () {
-      return {
-        description: '项目管理页面',
-        // 表头
-        columns: [
-          {
-            title: '#',
-            dataIndex: '',
-            key:'rowIndex',
-            width:60,
-            align:"center",
-            customRender:function (t,r,index) {
-              return parseInt(index)+1;
-            }
-           },
-		   {
-            title: '项目名称',
-            align:"center",
-            dataIndex: 'projectName'
-           },
-		   {
-            title: '广告主名称',
-            align:"center",
-            dataIndex: 'advertiserName'
-           },
-		   {
-            title: '负责人',
-            align:"center",
-            dataIndex: 'responsibleName'
-           },
-          {
-            title: '操作',
-            dataIndex: 'action',
-            align:"center",
-            scopedSlots: { customRender: 'action' },
-          }
-        ],
-		url: {
-          list: "/ctop/project/list",
-          delete: "/ctop/project/delete",
-          deleteBatch: "/ctop/project/deleteBatch",
-          exportXlsUrl: "ctop/project/exportXls",
-          importExcelUrl: "ctop/project/importExcel",
-       },
+export default {
+  name: 'ProjectList',
+  mixins: [JeecgListMixin],
+  components: {
+    ProjectModal
+  },
+  data() {
+    return {
+      description: '项目管理页面',
+      // 表头
+      columns: [
+        {
+          title: '项目名称',
+          align: 'center',
+          dataIndex: 'projectName'
+        },
+        {
+          title: '广告主名称',
+          align: 'center',
+          dataIndex: 'advertiserName'
+        },
+        {
+          title: '最高出价',
+          align: 'center',
+          dataIndex: 'maxBid',
+          scopedSlots: { customRender: 'maxBid' }
+        },
+        {
+          title: '负责人',
+          align: 'center',
+          dataIndex: 'responsibleName'
+        },
+        {
+          title: '操作',
+          dataIndex: 'action',
+          align: 'center',
+          scopedSlots: { customRender: 'action' }
+        }
+      ],
+      url: {
+        list: '/ctop/project/list',
+        delete: '/ctop/project/delete',
+        deleteBatch: '/ctop/project/deleteBatch',
+        exportXlsUrl: 'ctop/project/exportXls',
+        importExcelUrl: 'ctop/project/importExcel'
+      }
     }
   },
   computed: {
-    importExcelUrl: function(){
-      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    importExcelUrl: function() {
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
     }
   },
-    methods: {
-     
-    }
-  }
+  methods: {}
+}
 </script>
 <style scoped>
-  @import '~@assets/less/common.less'
-</style>
+@import '~@assets/less/common.less';
+</style>

+ 153 - 26
src/views/modules/advertiser/ProjectMemberList.vue

@@ -3,6 +3,9 @@
   display: flex;
   justify-content: center;
 }
+.close-account-my-project .ant-modal-footer .ant-btn-primary {
+  display: none;
+}
 </style>
 <template>
   <a-card
@@ -43,18 +46,19 @@
         :pagination="ipagination"
         :loading="loading"
       >
+        <span slot="maxBid" slot-scope="maxBid">{{ maxBid / 1000 }}</span>
         <span slot="mediaId" slot-scope="mediaId">{{ mediaId == 1 ? '头条' : '快手' }}</span>
         <span slot="action" slot-scope="text, record">
           <a @click="handleEdit(record)">{{ noTitleKey == 'myProject' ? '查看成员' : '账号绑定' }}</a>
-          <a-divider type="vertical" v-show="noTitleKey == 'myProject'" />
-          <a @click="addParams(record)" v-show="noTitleKey == 'myProject'">新增人员</a>
+          <a-divider type="vertical" />
+          <a @click="addParams(record)">{{ noTitleKey == 'myProject' ? '新增人员' : '查看账户' }}</a>
         </span>
       </a-table>
     </div>
     <!-- table区域-end -->
 
     <!--  查看项目成员 -->
-    <a-modal title="查看项目成员" v-model="visible" @ok="handleOk" width="800px">
+    <a-modal :title="title" v-model="visible" @ok="handleOk" width="800px" class="close-account-my-project">
       <div style="display:flex;line-height:50px;flex-wrap: wrap;">
         <div style="width:25%;text-align:center;" v-for="(item, index) of memberList" :key="index">
           <a-tag color="#2db7f5" @close="log(item.id)" closable
@@ -67,7 +71,7 @@
     </a-modal>
 
     <!--  添加项目成员 -->
-    <a-modal title="添加项目成员" v-model="visibleAdd" @ok="handleOkAdd">
+    <a-modal title="添加项目成员" v-model="visibleAdd" @ok="handleOkAdd" :confirmLoading="confirmLoading">
       <!-- /sys/user/getAllUserList -->
       <a-select
         v-model="appId"
@@ -88,7 +92,9 @@
           v-for="appModel in options"
           :key="appModel.userId + new Date().getTime()"
           :value="appModel.userId"
-          >{{ appModel.realName }}&#12288;&#12288;{{ appModel.roleName }}</a-select-option
+        >
+          {{ appModel.realName }}
+          &#12288;&#12288;{{ appModel.roleName }}</a-select-option
         >
       </a-select>
     </a-modal>
@@ -142,6 +148,28 @@
         </a-form-item>
       </a-form>
     </a-modal>
+
+    <!--  查看项目下的账号 -->
+    <a-modal
+      :title="titleAccount"
+      v-model="visibleAccount"
+      @ok="handleOk"
+      width="800px"
+      class="close-account-my-project"
+    >
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columnsAccount"
+        :dataSource="dataAccount"
+        :pagination="ipaginationAccount"
+        :loading="loadingAccount"
+      >
+        <span slot="createTime" slot-scope="createTime">{{ createTime | getDate }}</span>
+      </a-table>
+    </a-modal>
   </a-card>
 </template>
 
@@ -153,14 +181,18 @@ import { mapGetters } from 'vuex'
 
 import JSelectUserByDep from '@/components/jeecgbiz/JSelectUserByDep'
 
+import { JeecgListMixin } from '@/mixins/ipagination'
 export default {
   name: 'ProjectMemberList',
   components: {
     ProjectMemberModal,
     JSelectUserByDep
   },
+  mixins: [JeecgListMixin],
   data() {
     return {
+      title: '',
+      titleAccount: '',
       description: '我的项目',
       // 表头
       visible: false,
@@ -207,15 +239,61 @@ export default {
           scopedSlots: { customRender: 'mediaId' }
         },
         {
+          title: '最高出价',
+          align: 'center',
+          dataIndex: 'maxBid',
+          scopedSlots: { customRender: 'maxBid' }
+        },
+        {
           title: '操作',
           dataIndex: 'action',
           align: 'center',
           scopedSlots: { customRender: 'action' }
         }
       ],
+      columnsAccount: [
+        {
+          title: '账户id',
+          align: 'center',
+          dataIndex: 'accountId'
+        },
+        {
+          title: '账户名称',
+          align: 'center',
+          dataIndex: 'authName'
+        },
+        {
+          title: '所属人',
+          align: 'center',
+          dataIndex: 'userName'
+        },
+        {
+          title: '授权时间',
+          align: 'center',
+          dataIndex: 'createTime',
+          scopedSlots: { customRender: 'createTime' }
+        }
+      ],
+      ipaginationAccount: {
+        current: 1,
+        pageSize: 10,
+        //   pageSizeOptions: ['10', '20', '30'],
+        showTotal: (total, range) => {
+          return range[0] + '-' + range[1] + ' 共' + total + '条'
+        },
+        showQuickJumper: true,
+        //   showSizeChanger: true,
+        total: 0,
+        onChange: current => {
+          // 切换分页时的回调,
+          // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+          this.ipaginationAccount.current = current
+        }
+      },
+      loadingAccount: false,
+      dataAccount: [],
       dataSource: [],
       dataElse: [],
-      ipagination: {},
       loading: false,
       memberList: [],
       visibleAdd: false,
@@ -226,7 +304,9 @@ export default {
       bindAuthorizationUrl: '/ctop/bindAccountAuth/authorization',
       appId: [],
       list: [],
-      options: []
+      options: [],
+      visibleAccount: false,
+      confirmLoading: false
     }
   },
   computed: {
@@ -251,9 +331,19 @@ export default {
       } else {
         return '暂无'
       }
+    },
+    getDate(value) {
+      let date = new Date(value)
+      let y = date.getFullYear()
+      let MM = date.getMonth() + 1
+      MM = MM < 10 ? '0' + MM : MM
+      let d = date.getDate()
+      d = d < 10 ? '0' + d : d
+      return y + '-' + MM + '-' + d
     }
   },
   methods: {
+    //   /ctop/userAllocation/getAccountsByProjectId    projectId  userId
     ...mapGetters(['nickname', 'avatar', 'userInfo']),
     add(value, key) {
       var dataValue = value.split(',')
@@ -266,9 +356,11 @@ export default {
     },
     log(id) {
       deleteAction('/ctop/projectMember/delete', { id: id }).then(res => {
-        console.log(res)
         if (res.success) {
           this.getMemberList(this.projectId)
+          this.$message.success('删除成功')
+        } else {
+          this.$message.error(res.message)
         }
       })
     },
@@ -296,17 +388,28 @@ export default {
               dataIndex: 'projectName'
             },
             {
-              title: '管理人',
+              title: '广告主名称',
               align: 'center',
               dataIndex: 'advertiserName'
             },
             {
+              title: '管理人',
+              align: 'center',
+              dataIndex: 'responsibleName'
+            },
+            {
               title: '媒体类型',
               align: 'center',
               dataIndex: 'mediaId',
               scopedSlots: { customRender: 'mediaId' }
             },
             {
+              title: '最高出价',
+              align: 'center',
+              dataIndex: 'maxBid',
+              scopedSlots: { customRender: 'maxBid' }
+            },
+            {
               title: '操作',
               dataIndex: 'action',
               align: 'center',
@@ -351,6 +454,12 @@ export default {
               scopedSlots: { customRender: 'mediaId' }
             },
             {
+              title: '最高出价',
+              align: 'center',
+              dataIndex: 'maxBid',
+              scopedSlots: { customRender: 'maxBid' }
+            },
+            {
               title: '操作',
               dataIndex: 'action',
               align: 'center',
@@ -373,38 +482,56 @@ export default {
       })
     },
     handleOk(e) {
-      console.log(e)
       this.visible = false
     },
     handleOkAdd(e) {
-      console.log(e)
-
       var params = {}
       params.projectId = this.itemJson.id
       params.projectName = this.itemJson.projectName
       params.memberArr = this.appId
-
+      this.confirmLoading = true
       httpAction('/ctop/projectMember/batchAdd', params, 'post').then(res => {
-        console.log(res)
-        this.visibleAdd = false
-        this.appId = []
-      })
-    },
-    addParams(item) {
-      this.visibleAdd = true
-      this.itemJson = item
-      console.log(this.itemJson)
-      getAction('/sys/user/getAllUserList', '').then(res => {
-        console.log(res)
+        this.confirmLoading = false
         if (res.success) {
-          this.list = res.result
-          this.options = res.result
+          this.visibleAdd = false
+          this.appId = []
+          this.$message.success('添加成功')
+        } else {
+          this.$message.error('添加失败')
         }
       })
     },
+    addParams(item) {
+      if (this.noTitleKey == 'myProject') {
+        this.visibleAdd = true
+        this.itemJson = item
+        console.log(this.itemJson)
+        getAction('/sys/user/getAllUserList', '').then(res => {
+          if (res.success) {
+            this.list = res.result
+            this.options = res.result
+          }
+        })
+      } else {
+        this.visibleAccount = true
+        this.titleAccount = item.projectName
+        this.loadingAccount = true
+        getAction('/ctop/userAllocation/getAccountsByProjectId', {
+          projectId: item.projectId,
+          userId: this.userInfo().id
+        }).then(res => {
+          if (res.success) {
+            this.dataAccount = res.result
+            this.loadingAccount = false
+            this.ipaginationAccount.total = res.result.length
+          }
+        })
+      }
+    },
     handleAdd() {},
     handleEdit(item) {
       if (this.noTitleKey == 'myProject') {
+        this.title = item.projectName
         this.projectId = item.id
         this.getMemberList(item.id)
       } else {

+ 144 - 201
src/views/modules/advertiser/UserAllocationList.vue

@@ -1,202 +1,145 @@
-<template>
-  <a-card :bordered="false">
-
-    <!-- 查询区域 -->
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline">
-        <a-row :gutter="24">
-
-
-          <template>
-            <a-col :md="6" :sm="8">
-              <a-form-item label="广告主ID">
-                <a-input placeholder="请输入广告主ID" v-model="queryParam.advertiserId"></a-input>
-              </a-form-item>
-            </a-col>
-
-
-            <a-col :md="6" :sm="8">
-              <a-form-item label="广告主名称">
-                <a-input placeholder="请输入广告主名称" v-model="queryParam.advertiserName"></a-input>
-              </a-form-item>
-            </a-col>
-
-
-          </template>
-          <a-col :md="6" :sm="8">
-            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
-              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
-              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
-              <!-- <a @click="handleToggleSearch" style="margin-left: 8px">
-                 {{ toggleSearchStatus ? '收起' : '展开' }}
-                 <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
-               </a>-->
-            </span>
-          </a-col>
-
-        </a-row>
-      </a-form>
-    </div>
-
-    <!-- 操作按钮区域 -->
-    <div class="table-operator">
-      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
-      <a-button type="primary" icon="download" @click="handleExportXls('用户分配')">导出</a-button>
-      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl"
-                @change="handleImportExcel">
-        <a-button type="primary" icon="import">导入</a-button>
-      </a-upload>
-      <a-dropdown v-if="selectedRowKeys.length > 0">
-        <a-menu slot="overlay">
-          <a-menu-item key="1" @click="batchDel">
-            <a-icon type="delete"/>
-            删除
-          </a-menu-item>
-        </a-menu>
-        <a-button style="margin-left: 8px"> 批量操作
-          <a-icon type="down"/>
-        </a-button>
-      </a-dropdown>
-    </div>
-
-    <!-- table区域-begin -->
-    <div>
-      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
-        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
-        selectedRowKeys.length }}</a>项
-        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
-      </div>
-
-      <a-table
-        ref="table"
-        size="middle"
-        bordered
-        rowKey="id"
-        :columns="columns"
-        :dataSource="dataSource"
-        :pagination="ipagination"
-        :loading="loading"
-        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
-        @change="handleTableChange">
-
-        <span slot="action" slot-scope="text, record">
-          <a @click="handleEdit(record)">编辑</a>
-
-          <a-divider type="vertical"/>
-          <a-dropdown>
-            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
-            <a-menu slot="overlay">
-              <a-menu-item>
-                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
-                  <a>删除</a>
-                </a-popconfirm>
-              </a-menu-item>
-            </a-menu>
-          </a-dropdown>
-        </span>
-
-
-        <div
-          slot="mediaIdShow"
-          slot-scope="text, record"
-        >{{typeArr[record.mediaId]}}</div>
-
-      </a-table>
-    </div>
-    <!-- table区域-end -->
-
-    <!-- 表单区域 -->
-    <userAllocation-modal ref="modalForm" @ok="modalFormOk"></userAllocation-modal>
-  </a-card>
-</template>
-
-<script>
-  import UserAllocationModal from './modules/UserAllocationModal'
-  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
-
-  export default {
-    name: "UserAllocationList",
-    mixins: [JeecgListMixin],
-    components: {
-      UserAllocationModal
-    },
-    data() {
-      return {
-        typeArr: ['', '头条', '快手'],
-
-        description: '用户分配管理页面',
-        // 表头
-        columns: [
-          {
-            title: '序号',
-            dataIndex: '',
-            key: 'rowIndex',
-            width: 60,
-            align: "center",
-            customRender: function (t, r, index) {
-              return parseInt(index) + 1;
-            }
-          },
-
-          {
-            title: '指定分配人',
-            align: "center",
-            dataIndex: 'distributionName'
-          },
-
-          {
-            title: '广告主名称',
-            align: "center",
-            dataIndex: 'advertiserName'
-          },
-          {
-            title: '登录账号',
-            align: "center",
-            dataIndex: 'accountName'
-          },
-          {
-            title: '操作人姓名',
-            align: "center",
-            dataIndex: 'operationName'
-          },
-
-          {
-            title: '授权账户昵称',
-            align: "center",
-            dataIndex: 'authName'
-          },
-
-          {
-            title: '平台类型',
-            align: 'center',
-            dataIndex: 'mediaIdShow',
-            scopedSlots: { customRender: 'mediaIdShow' },
-           // dataIndex: 'mediaId'
-          },
-          {
-            title: '操作',
-            dataIndex: 'action',
-            align: "center",
-            scopedSlots: {customRender: 'action'},
-          }
-        ],
-        url: {
-          list: "/ctop/userAllocation/list",
-          delete: "/ctop/userAllocation/delete",
-          deleteBatch: "/ctop/userAllocation/deleteBatch",
-          exportXlsUrl: "ctop/userAllocation/exportXls",
-          importExcelUrl: "ctop/userAllocation/importExcel",
-        },
-      }
-    },
-    computed: {
-      importExcelUrl: function () {
-        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
-      }
-    },
-    methods: {}
-  }
-</script>
-<style scoped>
-  @import '~@assets/less/common.less'
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+          <a-col :md="8" :sm="8">
+            <a-form-item label="账号所属人">
+              <a-input placeholder="请输入所属人" v-model="queryParam.userName"></a-input>
+            </a-form-item>
+          </a-col>
+        <template>
+          <a-col :md="8" :sm="8">
+            <a-form-item label="广告主名称">
+              <a-input placeholder="请输入广告主名称" v-model="queryParam.advertiserName"></a-input>
+            </a-form-item>
+          </a-col>
+          </template>
+          <a-col :md="6" :sm="8" >
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+    <!-- 操作按钮区域 -->
+    <br>
+    <!-- table区域-begin -->
+    <div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        @change="handleTableChange">
+
+        <span slot="mediaId" slot-scope="text">{{text==1?'头条':"快手"}}</span>
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+            <a>删除</a>
+          </a-popconfirm>
+
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <userAllocation-modal ref="modalForm" @ok="modalFormOk"></userAllocation-modal>
+  </a-card>
+</template>
+
+<script>
+  import UserAllocationModal from './modules/UserAllocationModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "UserAllocationList",
+    mixins:[JeecgListMixin],
+    components: {
+      UserAllocationModal
+    },
+    data () {
+      return {
+        description: '账号绑定管理页面',
+        // 表头
+        columns: [
+		   {
+            title: '账号所属人',
+            align:"center",
+            dataIndex: 'userName'
+           },
+		   {
+            title: '授权',
+            align:"center",
+            dataIndex: 'accountId'
+           },
+		   {
+            title: '广告主名称',
+            align:"center",
+            dataIndex: 'advertiserName'
+           },
+		   {
+            title: '项目名称',
+            align:"center",
+            dataIndex: 'projectName'
+           },
+		//    {
+        //     title: '输入账号  --登陆',
+        //     align:"center",
+        //     dataIndex: 'accountName'
+        //    },
+		   {
+            title: '授权名称',
+            align:"center",
+            dataIndex: 'authName'
+           },
+		   {
+            title: '平台类型',
+            align:"center",
+            dataIndex: 'mediaId',
+            scopedSlots: { customRender: 'mediaId' },
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/ctop/userAllocation/list",
+          delete: "/ctop/userAllocation/delete",
+          deleteBatch: "/ctop/userAllocation/deleteBatch",
+          exportXlsUrl: "ctop/userAllocation/exportXls",
+          importExcelUrl: "ctop/userAllocation/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
 </style>

+ 16 - 2
src/views/modules/advertiser/modules/ProjectModal.vue

@@ -26,6 +26,9 @@
             }}</a-select-option>
           </a-select>
         </a-form-item>
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="最高出价">
+          <a-input placeholder="请输入最高出价" v-decorator="['maxBid', validatorRules.maxBid]" addonAfter="元" />
+        </a-form-item>
         <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="负责人">
           <a-select
             showSearch
@@ -83,7 +86,8 @@ export default {
       validatorRules: {
         projectName: { rules: [{ required: true, message: '请输入项目名称!' }] },
         advertiserId: { rules: [{ required: true, message: '请选择广告主!' }] },
-        responsibleName: { rules: [{ required: true, message: '请选择负责人!' }] }
+        responsibleName: { rules: [{ required: true, message: '请选择负责人!' }] },
+        maxBid: { rules: [{ required: true, message: '请输入最高出价!' }, { validator: this.validateInputCode }] }
       },
       url: {
         add: '/ctop/project/add',
@@ -97,6 +101,13 @@ export default {
   },
   created() {},
   methods: {
+    validateInputCode(rule, value, callback) {
+      if (!value || value > 0) {
+        callback()
+      } else {
+        callback('请输入大于0的最高报价!')
+      }
+    },
     ...mapGetters(['nickname', 'avatar', 'userInfo']),
     onChange(e) {
       console.log(`checked = ${e.target.value}`)
@@ -140,11 +151,13 @@ export default {
       if (params.advertiserId) {
         params.advertiserId = { key: params.advertiserId, label: params.advertiserName }
       }
+      console.log(record)
       this.form.resetFields()
       this.model = Object.assign({}, params)
+      this.model.maxBid = this.model.maxBid ? this.model.maxBid / 1000 : 0
       this.visible = true
       this.$nextTick(() => {
-        this.form.setFieldsValue(pick(this.model, 'projectName', 'advertiserId', 'responsibleName'))
+        this.form.setFieldsValue(pick(this.model, 'projectName', 'advertiserId', 'responsibleName', 'maxBid'))
         this.resId = record.responsibleId
         getAction('/sys/user/getAllUserList', '').then(res => {
           console.log(res)
@@ -176,6 +189,7 @@ export default {
           }
           var data = values.advertiserId
           let formData = Object.assign(this.model, values)
+          formData.maxBid = formData.maxBid * 1000
           //时间格式化
           formData.advertiserId = data.key
           formData.advertiserName = data.label

+ 150 - 184
src/views/modules/advertiser/modules/UserAllocationModal.vue

@@ -1,184 +1,150 @@
-<template>
-  <a-modal
-    :title="title"
-    :width="800"
-    :visible="visible"
-    :confirmLoading="confirmLoading"
-    @ok="handleOk"
-    @cancel="handleCancel"
-    cancelText="关闭">
-    
-    <a-spin :spinning="confirmLoading">
-      <a-form :form="form">
-      
-        <a-form-item
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol"
-          label="登陆人id">
-          <a-input placeholder="请输入登陆人id" v-decorator="['userId', {}]" />
-        </a-form-item>
-        <a-form-item
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol"
-          label="账户id --授权">
-          <a-input placeholder="请输入账户id --授权" v-decorator="['accountId', {}]" />
-        </a-form-item>
-        <a-form-item
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol"
-          label="广告主ID">
-          <a-input placeholder="请输入广告主ID" v-decorator="['advertiserId', {}]" />
-        </a-form-item>
-        <a-form-item
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol"
-          label="指定分配人">
-          <a-input placeholder="请输入指定分配人" v-decorator="['distributionName', {}]" />
-        </a-form-item>
-        <a-form-item
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol"
-          label="部门id">
-          <a-input placeholder="请输入部门id" v-decorator="['departmentId', {}]" />
-        </a-form-item>
-        <a-form-item
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol"
-          label="管理员名称">
-          <a-input placeholder="请输入管理员名称" v-decorator="['adminName', {}]" />
-        </a-form-item>
-        <a-form-item
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol"
-          label="广告主名称">
-          <a-input placeholder="请输入广告主名称" v-decorator="['advertiserName', {}]" />
-        </a-form-item>
-        <a-form-item
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol"
-          label="输入账号  --登陆">
-          <a-input placeholder="请输入输入账号  --登陆" v-decorator="['accountName', {}]" />
-        </a-form-item>
-        <a-form-item
-                :labelCol="labelCol"
-                :wrapperCol="wrapperCol"
-                label="操作人姓名">
-            <a-input placeholder="请输入操作人姓名" v-decorator="['operationName', {}]"/>
-        </a-form-item>
-        <a-form-item
-                :labelCol="labelCol"
-                :wrapperCol="wrapperCol"
-                label="授权名称">
-            <a-input placeholder="请输入授权名称" v-decorator="['authName', {}]"/>
-        </a-form-item>
-        <a-form-item
-          :labelCol="labelCol"
-          :wrapperCol="wrapperCol"
-          label="平台类型 1 头条 2快手">
-          <a-input placeholder="请输入平台类型 1 头条 2快手" v-decorator="['mediaId', {}]" />
-        </a-form-item>
-		
-      </a-form>
-    </a-spin>
-  </a-modal>
-</template>
-
-<script>
-  import { httpAction } from '@/api/manage'
-  import pick from 'lodash.pick'
-  import moment from "moment"
-
-  export default {
-    name: "UserAllocationModal",
-    data () {
-      return {
-        title:"操作",
-        visible: false,
-        model: {},
-        labelCol: {
-          xs: { span: 24 },
-          sm: { span: 5 },
-        },
-        wrapperCol: {
-          xs: { span: 24 },
-          sm: { span: 16 },
-        },
-
-        confirmLoading: false,
-        form: this.$form.createForm(this),
-        validatorRules:{
-        },
-        url: {
-          add: "/ctop/userAllocation/add",
-          edit: "/ctop/userAllocation/edit",
-        },
-      }
-    },
-    created () {
-    },
-    methods: {
-      add () {
-        this.edit({});
-      },
-      edit (record) {
-        this.form.resetFields();
-        this.model = Object.assign({}, record);
-        this.visible = true;
-        this.$nextTick(() => {
-            this.form.setFieldsValue(pick(this.model, 'userId', 'accountId', 'advertiserId', 'distributionName', 'departmentId', 'adminName', 'advertiserName', 'accountName', 'operationName', 'authName', 'mediaId'))
-		  //时间格式化
-        });
-
-      },
-      close () {
-        this.$emit('close');
-        this.visible = false;
-      },
-      handleOk () {
-        const that = this;
-        // 触发表单验证
-        this.form.validateFields((err, values) => {
-          if (!err) {
-            that.confirmLoading = true;
-            let httpurl = '';
-            let method = '';
-            if(!this.model.id){
-              httpurl+=this.url.add;
-              method = 'post';
-            }else{
-              httpurl+=this.url.edit;
-               method = 'put';
-            }
-            let formData = Object.assign(this.model, values);
-            //时间格式化
-            
-            console.log(formData)
-            httpAction(httpurl,formData,method).then((res)=>{
-              if(res.success){
-                that.$message.success(res.message);
-                that.$emit('ok');
-              }else{
-                that.$message.warning(res.message);
-              }
-            }).finally(() => {
-              that.confirmLoading = false;
-              that.close();
-            })
-
-
-
-          }
-        })
-      },
-      handleCancel () {
-        this.close()
-      },
-
-
-    }
-  }
-</script>
-
-<style lang="less" scoped>
-
-</style>
+<template>
+  <a-modal
+    :title="title"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭"
+  >
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="账户所属人">
+          <a-input placeholder="请输入userName" v-decorator="['userName', {}]" disabled/>
+        </a-form-item>
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="账号id">
+          <a-input placeholder="请输入账户id --授权" v-decorator="['accountId', {}]" disabled />
+        </a-form-item>
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="广告主名称">
+          <a-input placeholder="请输入广告主名称" v-decorator="['advertiserName', {}]" disabled/>
+        </a-form-item>
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="项目名称">
+          <a-input placeholder="请输入项目名称" v-decorator="['projectName', {}]" disabled />
+        </a-form-item>
+        <!-- <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="输入账号  --登陆">
+          <a-input placeholder="请输入输入账号  --登陆" v-decorator="['accountName', {}]" />
+        </a-form-item> -->
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="授权名称">
+          <a-input placeholder="请输入授权名称" v-decorator="['authName', {}]" />
+        </a-form-item>
+        <a-form-item :labelCol="labelCol" :wrapperCol="wrapperCol" label="媒体类型">
+          <!-- <a-input placeholder="请输入平台类型 1 头条 2快手" /> -->
+          <a-select v-decorator="['mediaId', {}]" disabled>
+            <a-select-option value="1">头条</a-select-option>
+            <a-select-option value="2">快手</a-select-option>
+          </a-select>
+        </a-form-item>
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+import { httpAction } from '@/api/manage'
+import pick from 'lodash.pick'
+import moment from 'moment'
+
+export default {
+  name: 'UserAllocationModal',
+  data() {
+    return {
+      title: '操作',
+      visible: false,
+      model: {},
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 5 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 16 }
+      },
+
+      confirmLoading: false,
+      form: this.$form.createForm(this),
+      validatorRules: {},
+      url: {
+        add: '/ctop/userAllocation/add',
+        edit: '/ctop/userAllocation/edit'
+      }
+    }
+  },
+  created() {},
+  methods: {
+    add() {
+      this.edit({})
+    },
+    edit(record) {
+      this.form.resetFields()
+      this.model = Object.assign({}, record)
+      this.visible = true
+      this.$nextTick(() => {
+        this.form.setFieldsValue(
+          pick(
+            this.model,
+            'userId',
+            'userName',
+            'accountId',
+            'advertiserId',
+            'advertiserName',
+            'projectId',
+            'projectName',
+            'accountName',
+            'authName',
+            'mediaId'
+          )
+        )
+        //时间格式化
+      })
+    },
+    close() {
+      this.$emit('close')
+      this.visible = false
+    },
+    handleOk() {
+      const that = this
+      // 触发表单验证
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          that.confirmLoading = true
+          let httpurl = ''
+          let method = ''
+          if (!this.model.id) {
+            httpurl += this.url.add
+            method = 'post'
+          } else {
+            httpurl += this.url.edit
+            method = 'put'
+          }
+          let formData = Object.assign(this.model, values)
+          //时间格式化
+
+          console.log(formData)
+          httpAction(httpurl, formData, method)
+            .then(res => {
+              if (res.success) {
+                that.$message.success(res.message)
+                that.$emit('ok')
+              } else {
+                that.$message.warning(res.message)
+              }
+            })
+            .finally(() => {
+              that.confirmLoading = false
+              that.close()
+            })
+        }
+      })
+    },
+    handleCancel() {
+      this.close()
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped></style>

+ 258 - 0
src/views/modules/agent/KuaishouReportDailyAgentList.vue

@@ -0,0 +1,258 @@
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="8">
+            <a-form-item label="日期">
+              <a-input placeholder="请输入日期" v-model="queryParam.date"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="账户ID">
+              <a-input placeholder="请输入账户ID" v-model="queryParam.accountId"></a-input>
+            </a-form-item>
+          </a-col>
+        <template v-if="toggleSearchStatus">
+        <a-col :md="6" :sm="8">
+            <a-form-item label="快手ID">
+              <a-input placeholder="请输入快手ID" v-model="queryParam.kid"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="广告主名称">
+              <a-input placeholder="请输入广告主名称" v-model="queryParam.advertiserName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="广告主创建时间">
+              <a-input placeholder="请输入广告主创建时间" v-model="queryParam.advertiserCreateTime"></a-input>
+            </a-form-item>
+          </a-col>
+          </template>
+          <a-col :md="6" :sm="8" >
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('代理商报表')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <kuaishouReportDailyAgent-modal ref="modalForm" @ok="modalFormOk"></kuaishouReportDailyAgent-modal>
+  </a-card>
+</template>
+
+<script>
+  import KuaishouReportDailyAgentModal from './modules/KuaishouReportDailyAgentModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "KuaishouReportDailyAgentList",
+    mixins:[JeecgListMixin],
+    components: {
+      KuaishouReportDailyAgentModal
+    },
+    data () {
+      return {
+        description: '代理商报表管理页面',
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+           },
+		   {
+            title: '日期',
+            align:"center",
+            dataIndex: 'date'
+           },
+		   {
+            title: '账户ID',
+            align:"center",
+            dataIndex: 'accountId'
+           },
+		   {
+            title: '快手ID',
+            align:"center",
+            dataIndex: 'kid'
+           },
+		   {
+            title: '广告主名称',
+            align:"center",
+            dataIndex: 'advertiserName'
+           },
+		   {
+            title: '广告主创建时间',
+            align:"center",
+            dataIndex: 'advertiserCreateTime'
+           },
+		   {
+            title: '有消费计划数',
+            align:"center",
+            dataIndex: 'costCampaignCount'
+           },
+		   {
+            title: '总余额',
+            align:"center",
+            dataIndex: 'balance'
+           },
+		   {
+            title: '总消耗',
+            align:"center",
+            dataIndex: 'cost'
+           },
+		   {
+            title: '现金消耗',
+            align:"center",
+            dataIndex: 'xianjinCost'
+           },
+		   {
+            title: '后返消耗',
+            align:"center",
+            dataIndex: 'fandianCost'
+           },
+		   {
+            title: '框返消耗',
+            align:"center",
+            dataIndex: 'kuangfanCost'
+           },
+		   {
+            title: '激励账户消耗',
+            align:"center",
+            dataIndex: 'jiliCost'
+           },
+		   {
+            title: '信用账户消耗',
+            align:"center",
+            dataIndex: 'xinyongCost'
+           },
+		   {
+            title: '封面曝光数',
+            align:"center",
+            dataIndex: 'fengmianShowCount'
+           },
+		   {
+            title: '封面点击数',
+            align:"center",
+            dataIndex: 'fengmianClickCount'
+           },
+		   {
+            title: '素材曝光数',
+            align:"center",
+            dataIndex: 'sucaiShowCount'
+           },
+		   {
+            title: '行为数',
+            align:"center",
+            dataIndex: 'convertCount'
+           },
+		   {
+            title: '封面点击率',
+            align:"center",
+            dataIndex: 'fengmianClickRate'
+           },
+		   {
+            title: '转化点击率',
+            align:"center",
+            dataIndex: 'convertLickRate'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/report/kuaishouReportDailyAgent/list",
+          delete: "/report/kuaishouReportDailyAgent/delete",
+          deleteBatch: "/report/kuaishouReportDailyAgent/deleteBatch",
+          exportXlsUrl: "report/kuaishouReportDailyAgent/exportXls",
+          importExcelUrl: "report/kuaishouReportDailyAgent/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 258 - 0
src/views/modules/agent/KuaishouReportDailyAgentSumList.vue

@@ -0,0 +1,258 @@
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="8">
+            <a-form-item label="日期">
+              <a-input placeholder="请输入日期" v-model="queryParam.date"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="账户ID">
+              <a-input placeholder="请输入账户ID" v-model="queryParam.accountId"></a-input>
+            </a-form-item>
+          </a-col>
+        <template v-if="toggleSearchStatus">
+        <a-col :md="6" :sm="8">
+            <a-form-item label="快手ID">
+              <a-input placeholder="请输入快手ID" v-model="queryParam.kid"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="广告主名称">
+              <a-input placeholder="请输入广告主名称" v-model="queryParam.advertiserName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="广告主创建时间">
+              <a-input placeholder="请输入广告主创建时间" v-model="queryParam.advertiserCreateTime"></a-input>
+            </a-form-item>
+          </a-col>
+          </template>
+          <a-col :md="6" :sm="8" >
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+              <a @click="handleToggleSearch" style="margin-left: 8px">
+                {{ toggleSearchStatus ? '收起' : '展开' }}
+                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
+              </a>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+      <a-button type="primary" icon="download" @click="handleExportXls('代理商日汇总表')">导出</a-button>
+      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
+        <a-button type="primary" icon="import">导入</a-button>
+      </a-upload>
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical" />
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <kuaishouReportDailyAgentSum-modal ref="modalForm" @ok="modalFormOk"></kuaishouReportDailyAgentSum-modal>
+  </a-card>
+</template>
+
+<script>
+  import KuaishouReportDailyAgentSumModal from './modules/KuaishouReportDailyAgentSumModal'
+  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+  export default {
+    name: "KuaishouReportDailyAgentSumList",
+    mixins:[JeecgListMixin],
+    components: {
+      KuaishouReportDailyAgentSumModal
+    },
+    data () {
+      return {
+        description: '代理商日汇总表管理页面',
+        // 表头
+        columns: [
+          {
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+           },
+		   {
+            title: '日期',
+            align:"center",
+            dataIndex: 'date'
+           },
+		   {
+            title: '账户ID',
+            align:"center",
+            dataIndex: 'accountId'
+           },
+		   {
+            title: '快手ID',
+            align:"center",
+            dataIndex: 'kid'
+           },
+		   {
+            title: '广告主名称',
+            align:"center",
+            dataIndex: 'advertiserName'
+           },
+		   {
+            title: '广告主创建时间',
+            align:"center",
+            dataIndex: 'advertiserCreateTime'
+           },
+		   {
+            title: '有消费计划数',
+            align:"center",
+            dataIndex: 'costCampaignCount'
+           },
+		   {
+            title: '总余额',
+            align:"center",
+            dataIndex: 'balance'
+           },
+		   {
+            title: '总消耗',
+            align:"center",
+            dataIndex: 'cost'
+           },
+		   {
+            title: '现金消耗',
+            align:"center",
+            dataIndex: 'xianjinCost'
+           },
+		   {
+            title: '后返消耗',
+            align:"center",
+            dataIndex: 'fandianCost'
+           },
+		   {
+            title: '框返消耗',
+            align:"center",
+            dataIndex: 'kuangfanCost'
+           },
+		   {
+            title: '激励账户消耗',
+            align:"center",
+            dataIndex: 'jiliCost'
+           },
+		   {
+            title: '信用账户消耗',
+            align:"center",
+            dataIndex: 'xinyongCost'
+           },
+		   {
+            title: '封面曝光数',
+            align:"center",
+            dataIndex: 'fengmianShowCount'
+           },
+		   {
+            title: '封面点击数',
+            align:"center",
+            dataIndex: 'fengmianClickCount'
+           },
+		   {
+            title: '素材曝光数',
+            align:"center",
+            dataIndex: 'sucaiShowCount'
+           },
+		   {
+            title: '行为数',
+            align:"center",
+            dataIndex: 'convertCount'
+           },
+		   {
+            title: '封面点击率',
+            align:"center",
+            dataIndex: 'fengmianClickRate'
+           },
+		   {
+            title: '转化点击率',
+            align:"center",
+            dataIndex: 'convertClickRate'
+           },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align:"center",
+            scopedSlots: { customRender: 'action' },
+          }
+        ],
+		url: {
+          list: "/report/kuaishouReportDailyAgentSum/list",
+          delete: "/report/kuaishouReportDailyAgentSum/delete",
+          deleteBatch: "/report/kuaishouReportDailyAgentSum/deleteBatch",
+          exportXlsUrl: "report/kuaishouReportDailyAgentSum/exportXls",
+          importExcelUrl: "report/kuaishouReportDailyAgentSum/importExcel",
+       },
+    }
+  },
+  computed: {
+    importExcelUrl: function(){
+      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+    }
+  },
+    methods: {
+     
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
+</style>

+ 238 - 0
src/views/modules/agent/modules/KuaishouReportDailyAgentModal.vue

@@ -0,0 +1,238 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="日期">
+          <a-date-picker v-decorator="[ 'date', validatorRules.date ]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="账户ID">
+          <a-input placeholder="请输入账户ID" v-decorator="['accountId', validatorRules.accountId ]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="快手ID">
+          <a-input placeholder="请输入快手ID" v-decorator="['kid', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告主名称">
+          <a-input placeholder="请输入广告主名称" v-decorator="['advertiserName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告主创建时间">
+          <a-date-picker v-decorator="[ 'advertiserCreateTime', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="有消费计划数">
+          <a-input-number v-decorator="[ 'costCampaignCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="总余额">
+          <a-input-number v-decorator="[ 'balance', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="总消耗">
+          <a-input-number v-decorator="[ 'cost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="现金消耗">
+          <a-input-number v-decorator="[ 'xianjinCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="后返消耗">
+          <a-input-number v-decorator="[ 'fandianCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="框返消耗">
+          <a-input-number v-decorator="[ 'kuangfanCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="激励账户消耗">
+          <a-input-number v-decorator="[ 'jiliCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="信用账户消耗">
+          <a-input-number v-decorator="[ 'xinyongCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面曝光数">
+          <a-input-number v-decorator="[ 'fengmianShowCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面点击数">
+          <a-input-number v-decorator="[ 'fengmianClickCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="素材曝光数">
+          <a-input-number v-decorator="[ 'sucaiShowCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="行为数">
+          <a-input-number v-decorator="[ 'convertCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面点击率">
+          <a-input-number v-decorator="[ 'fengmianClickRate', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="转化点击率">
+          <a-input-number v-decorator="[ 'convertLickRate', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "KuaishouReportDailyAgentModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        date:{rules: [{ required: true, message: '请输入日期!' }]},
+        accountId:{rules: [{ required: true, message: '请输入账户ID!' }]},
+        },
+        url: {
+          add: "/report/kuaishouReportDailyAgent/add",
+          edit: "/report/kuaishouReportDailyAgent/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'accountId','kid','advertiserName','costCampaignCount','balance','cost','xianjinCost','fandianCost','kuangfanCost','jiliCost','xinyongCost','fengmianShowCount','fengmianClickCount','sucaiShowCount','convertCount','fengmianClickRate','convertLickRate'))
+		  //时间格式化
+          this.form.setFieldsValue({date:this.model.date?moment(this.model.date):null})
+          this.form.setFieldsValue({advertiserCreateTime:this.model.advertiserCreateTime?moment(this.model.advertiserCreateTime):null})
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            formData.date = formData.date?formData.date.format():null;
+            formData.advertiserCreateTime = formData.advertiserCreateTime?formData.advertiserCreateTime.format():null;
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+
+</style>

+ 245 - 0
src/views/modules/agent/modules/KuaishouReportDailyAgentModal__Style#Drawer.vue

@@ -0,0 +1,245 @@
+<template>
+  <a-drawer
+      :title="title"
+      :width="800"
+      placement="right"
+      :closable="false"
+      @close="close"
+      :visible="visible"
+  >
+
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="日期">
+          <a-date-picker v-decorator="[ 'date', validatorRules.date ]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="账户ID">
+          <a-input placeholder="请输入账户ID" v-decorator="['accountId', validatorRules.accountId ]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="快手ID">
+          <a-input placeholder="请输入快手ID" v-decorator="['kid', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告主名称">
+          <a-input placeholder="请输入广告主名称" v-decorator="['advertiserName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告主创建时间">
+          <a-date-picker v-decorator="[ 'advertiserCreateTime', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="有消费计划数">
+          <a-input-number v-decorator="[ 'costCampaignCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="总余额">
+          <a-input-number v-decorator="[ 'balance', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="总消耗">
+          <a-input-number v-decorator="[ 'cost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="现金消耗">
+          <a-input-number v-decorator="[ 'xianjinCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="后返消耗">
+          <a-input-number v-decorator="[ 'fandianCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="框返消耗">
+          <a-input-number v-decorator="[ 'kuangfanCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="激励账户消耗">
+          <a-input-number v-decorator="[ 'jiliCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="信用账户消耗">
+          <a-input-number v-decorator="[ 'xinyongCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面曝光数">
+          <a-input-number v-decorator="[ 'fengmianShowCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面点击数">
+          <a-input-number v-decorator="[ 'fengmianClickCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="素材曝光数">
+          <a-input-number v-decorator="[ 'sucaiShowCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="行为数">
+          <a-input-number v-decorator="[ 'convertCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面点击率">
+          <a-input-number v-decorator="[ 'fengmianClickRate', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="转化点击率">
+          <a-input-number v-decorator="[ 'convertLickRate', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+    <a-button type="primary" @click="handleOk">确定</a-button>
+    <a-button type="primary" @click="handleCancel">取消</a-button>
+  </a-drawer>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "KuaishouReportDailyAgentModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        date:{rules: [{ required: true, message: '请输入日期!' }]},
+        accountId:{rules: [{ required: true, message: '请输入账户ID!' }]},
+        },
+        url: {
+          add: "/report/kuaishouReportDailyAgent/add",
+          edit: "/report/kuaishouReportDailyAgent/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'accountId','kid','advertiserName','costCampaignCount','balance','cost','xianjinCost','fandianCost','kuangfanCost','jiliCost','xinyongCost','fengmianShowCount','fengmianClickCount','sucaiShowCount','convertCount','fengmianClickRate','convertLickRate'))
+		  //时间格式化
+          this.form.setFieldsValue({date:this.model.date?moment(this.model.date):null})
+          this.form.setFieldsValue({advertiserCreateTime:this.model.advertiserCreateTime?moment(this.model.advertiserCreateTime):null})
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            formData.date = formData.date?formData.date.format():null;
+            formData.advertiserCreateTime = formData.advertiserCreateTime?formData.advertiserCreateTime.format():null;
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+</style>

+ 238 - 0
src/views/modules/agent/modules/KuaishouReportDailyAgentSumModal.vue

@@ -0,0 +1,238 @@
+<template>
+  <a-modal
+    :title="title"
+    :width="800"
+    :visible="visible"
+    :confirmLoading="confirmLoading"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="关闭">
+    
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="日期">
+          <a-date-picker v-decorator="[ 'date', validatorRules.date ]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="账户ID">
+          <a-input placeholder="请输入账户ID" v-decorator="['accountId', validatorRules.accountId ]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="快手ID">
+          <a-input placeholder="请输入快手ID" v-decorator="['kid', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告主名称">
+          <a-input placeholder="请输入广告主名称" v-decorator="['advertiserName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告主创建时间">
+          <a-date-picker v-decorator="[ 'advertiserCreateTime', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="有消费计划数">
+          <a-input-number v-decorator="[ 'costCampaignCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="总余额">
+          <a-input-number v-decorator="[ 'balance', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="总消耗">
+          <a-input-number v-decorator="[ 'cost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="现金消耗">
+          <a-input-number v-decorator="[ 'xianjinCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="后返消耗">
+          <a-input-number v-decorator="[ 'fandianCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="框返消耗">
+          <a-input-number v-decorator="[ 'kuangfanCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="激励账户消耗">
+          <a-input-number v-decorator="[ 'jiliCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="信用账户消耗">
+          <a-input-number v-decorator="[ 'xinyongCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面曝光数">
+          <a-input-number v-decorator="[ 'fengmianShowCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面点击数">
+          <a-input-number v-decorator="[ 'fengmianClickCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="素材曝光数">
+          <a-input-number v-decorator="[ 'sucaiShowCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="行为数">
+          <a-input-number v-decorator="[ 'convertCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面点击率">
+          <a-input-number v-decorator="[ 'fengmianClickRate', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="转化点击率">
+          <a-input-number v-decorator="[ 'convertClickRate', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "KuaishouReportDailyAgentSumModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        date:{rules: [{ required: true, message: '请输入日期!' }]},
+        accountId:{rules: [{ required: true, message: '请输入账户ID!' }]},
+        },
+        url: {
+          add: "/report/kuaishouReportDailyAgentSum/add",
+          edit: "/report/kuaishouReportDailyAgentSum/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'accountId','kid','advertiserName','costCampaignCount','balance','cost','xianjinCost','fandianCost','kuangfanCost','jiliCost','xinyongCost','fengmianShowCount','fengmianClickCount','sucaiShowCount','convertCount','fengmianClickRate','convertClickRate'))
+		  //时间格式化
+          this.form.setFieldsValue({date:this.model.date?moment(this.model.date):null})
+          this.form.setFieldsValue({advertiserCreateTime:this.model.advertiserCreateTime?moment(this.model.advertiserCreateTime):null})
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            formData.date = formData.date?formData.date.format():null;
+            formData.advertiserCreateTime = formData.advertiserCreateTime?formData.advertiserCreateTime.format():null;
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+
+</style>

+ 245 - 0
src/views/modules/agent/modules/KuaishouReportDailyAgentSumModal__Style#Drawer.vue

@@ -0,0 +1,245 @@
+<template>
+  <a-drawer
+      :title="title"
+      :width="800"
+      placement="right"
+      :closable="false"
+      @close="close"
+      :visible="visible"
+  >
+
+    <a-spin :spinning="confirmLoading">
+      <a-form :form="form">
+      
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="日期">
+          <a-date-picker v-decorator="[ 'date', validatorRules.date ]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="账户ID">
+          <a-input placeholder="请输入账户ID" v-decorator="['accountId', validatorRules.accountId ]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="快手ID">
+          <a-input placeholder="请输入快手ID" v-decorator="['kid', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告主名称">
+          <a-input placeholder="请输入广告主名称" v-decorator="['advertiserName', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="广告主创建时间">
+          <a-date-picker v-decorator="[ 'advertiserCreateTime', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="有消费计划数">
+          <a-input-number v-decorator="[ 'costCampaignCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="总余额">
+          <a-input-number v-decorator="[ 'balance', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="总消耗">
+          <a-input-number v-decorator="[ 'cost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="现金消耗">
+          <a-input-number v-decorator="[ 'xianjinCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="后返消耗">
+          <a-input-number v-decorator="[ 'fandianCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="框返消耗">
+          <a-input-number v-decorator="[ 'kuangfanCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="激励账户消耗">
+          <a-input-number v-decorator="[ 'jiliCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="信用账户消耗">
+          <a-input-number v-decorator="[ 'xinyongCost', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面曝光数">
+          <a-input-number v-decorator="[ 'fengmianShowCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面点击数">
+          <a-input-number v-decorator="[ 'fengmianClickCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="素材曝光数">
+          <a-input-number v-decorator="[ 'sucaiShowCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="行为数">
+          <a-input-number v-decorator="[ 'convertCount', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="封面点击率">
+          <a-input-number v-decorator="[ 'fengmianClickRate', {}]" />
+        </a-form-item>
+        <a-form-item
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          label="转化点击率">
+          <a-input-number v-decorator="[ 'convertClickRate', {}]" />
+        </a-form-item>
+		
+      </a-form>
+    </a-spin>
+    <a-button type="primary" @click="handleOk">确定</a-button>
+    <a-button type="primary" @click="handleCancel">取消</a-button>
+  </a-drawer>
+</template>
+
+<script>
+  import { httpAction } from '@/api/manage'
+  import pick from 'lodash.pick'
+  import moment from "moment"
+
+  export default {
+    name: "KuaishouReportDailyAgentSumModal",
+    data () {
+      return {
+        title:"操作",
+        visible: false,
+        model: {},
+        labelCol: {
+          xs: { span: 24 },
+          sm: { span: 5 },
+        },
+        wrapperCol: {
+          xs: { span: 24 },
+          sm: { span: 16 },
+        },
+
+        confirmLoading: false,
+        form: this.$form.createForm(this),
+        validatorRules:{
+        date:{rules: [{ required: true, message: '请输入日期!' }]},
+        accountId:{rules: [{ required: true, message: '请输入账户ID!' }]},
+        },
+        url: {
+          add: "/report/kuaishouReportDailyAgentSum/add",
+          edit: "/report/kuaishouReportDailyAgentSum/edit",
+        },
+      }
+    },
+    created () {
+    },
+    methods: {
+      add () {
+        this.edit({});
+      },
+      edit (record) {
+        this.form.resetFields();
+        this.model = Object.assign({}, record);
+        this.visible = true;
+        this.$nextTick(() => {
+          this.form.setFieldsValue(pick(this.model,'accountId','kid','advertiserName','costCampaignCount','balance','cost','xianjinCost','fandianCost','kuangfanCost','jiliCost','xinyongCost','fengmianShowCount','fengmianClickCount','sucaiShowCount','convertCount','fengmianClickRate','convertClickRate'))
+		  //时间格式化
+          this.form.setFieldsValue({date:this.model.date?moment(this.model.date):null})
+          this.form.setFieldsValue({advertiserCreateTime:this.model.advertiserCreateTime?moment(this.model.advertiserCreateTime):null})
+        });
+
+      },
+      close () {
+        this.$emit('close');
+        this.visible = false;
+      },
+      handleOk () {
+        const that = this;
+        // 触发表单验证
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            that.confirmLoading = true;
+            let httpurl = '';
+            let method = '';
+            if(!this.model.id){
+              httpurl+=this.url.add;
+              method = 'post';
+            }else{
+              httpurl+=this.url.edit;
+               method = 'put';
+            }
+            let formData = Object.assign(this.model, values);
+            //时间格式化
+            formData.date = formData.date?formData.date.format():null;
+            formData.advertiserCreateTime = formData.advertiserCreateTime?formData.advertiserCreateTime.format():null;
+            
+            console.log(formData)
+            httpAction(httpurl,formData,method).then((res)=>{
+              if(res.success){
+                that.$message.success(res.message);
+                that.$emit('ok');
+              }else{
+                that.$message.warning(res.message);
+              }
+            }).finally(() => {
+              that.confirmLoading = false;
+              that.close();
+            })
+
+
+
+          }
+        })
+      },
+      handleCancel () {
+        this.close()
+      },
+
+
+    }
+  }
+</script>
+
+<style lang="less" scoped>
+/** Button按钮间距 */
+  .ant-btn {
+    margin-left: 30px;
+    margin-bottom: 30px;
+    float: right;
+  }
+</style>

+ 1 - 26
src/views/modules/appium/AppiumTaskLogList.vue

@@ -5,18 +5,7 @@
     <div class="table-page-search-wrapper">
       <a-form layout="inline">
         <a-row :gutter="24">
-
-          <a-col :md="6" :sm="8">
-            <a-form-item label="任务ID">
-              <a-input placeholder="请输入任务ID" v-model="queryParam.taskId"></a-input>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="8">
-            <a-form-item label="设备ID">
-              <a-input placeholder="请输入设备ID" v-model="queryParam.deviceId"></a-input>
-            </a-form-item>
-          </a-col>
-        <template v-if="toggleSearchStatus">
+        <template>
         <a-col :md="6" :sm="8">
             <a-form-item label="任务名称">
               <a-input placeholder="请输入任务名称" v-model="queryParam.taskName"></a-input>
@@ -37,10 +26,6 @@
             <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
               <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
               <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
-              <a @click="handleToggleSearch" style="margin-left: 8px">
-                {{ toggleSearchStatus ? '收起' : '展开' }}
-                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
-              </a>
             </span>
           </a-col>
 
@@ -51,20 +36,10 @@
     <!-- 操作按钮区域 -->
     <div class="table-operator">
       <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
-      <a-dropdown v-if="selectedRowKeys.length > 0">
-        <a-menu slot="overlay">
-          <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item>
-        </a-menu>
-        <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button>
-      </a-dropdown>
     </div>
 
     <!-- table区域-begin -->
     <div>
-      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
-        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项
-        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
-      </div>
 
       <a-table
         ref="table"

+ 271 - 282
src/views/modules/kuaishouapp/KuaishouAdAccountList.vue

@@ -1,283 +1,272 @@
-<template>
-  <a-card :bordered="false">
-
-    <!-- 查询区域 -->
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline">
-        <a-row :gutter="24">
-          <a-col :md="6" :sm="6">
-            <a-form-item label="行业">
-              <j-tree-select
-                v-model="queryParam.industry"
-                ref="treeSelect"
-                placeholder="请选择行业"
-                dict="sys_category,name,id"
-                pidField="pid"
-                pidValue="67d69117968be1eecb1e705b399b9d93">
-              </j-tree-select>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="6">
-            <a-form-item label="广告主公司">
-              <a-select
-                showSearch
-                v-model="queryParam.company"
-                placeholder="请输入公司名称"
-                :defaultActiveFirstOption="false"
-                :showArrow="false"
-                :filterOption="false"
-                @search="handleCompanySearch"
-                @change="handleCompanyChange"
-                :notFoundContent="null"
-              >
-                <a-select-option v-for="d in companyData" :key="d.value">{{d.text}}</a-select-option>
-              </a-select>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="6">
-            <a-form-item label="推广产品">
-              <a-select
-                showSearch
-                v-model="queryParam.product"
-                placeholder="请输入产品名称"
-                :defaultActiveFirstOption="false"
-                :showArrow="false"
-                :filterOption="false"
-                @search="handleProductSearch"
-                @change="handleProductChange"
-                :notFoundContent="null"
-              >
-                <a-select-option v-for="d in productData" :key="d.value">{{d.text}}</a-select-option>
-              </a-select>
-            </a-form-item>
-          </a-col>
-        </a-row>
-        <a-row :gutter="24">
-          <a-col :md="6" :sm="6">
-            <a-form-item label="快手ID">
-              <a-input placeholder="请输入快手ID" v-model="queryParam.ksid"></a-input>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="6">
-            <a-form-item label="快手昵称">
-              <a-input placeholder="请输入快手昵称" v-model="queryParam.name"></a-input>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="6">
-            <a-form-item label="完整度">
-              <a-radio-group v-model="queryParam.dataProcess">
-                <a-radio-button value="full">完整</a-radio-button>
-                <a-radio-button value="industry">缺失行业</a-radio-button>
-                <a-radio-button value="company">缺失企业</a-radio-button>
-                <a-radio-button value="product">缺失产品</a-radio-button>
-              </a-radio-group>
-            </a-form-item>
-          </a-col>
-        </a-row>
-        <a-row>
-          <a-col :md="6" :sm="6">
-            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
-              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
-              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
-            </span>
-          </a-col>
-
-        </a-row>
-      </a-form>
-    </div>
-
-    <!-- 操作按钮区域 -->
-<!--    <div class="table-operator">-->
-<!--      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>-->
-<!--    </div>-->
-
-    <!-- table区域-begin -->
-    <div>
-
-      <a-table
-        ref="table"
-        size="middle"
-        bordered
-        rowKey="id"
-        :columns="columns"
-        :dataSource="dataSource"
-        :pagination="ipagination"
-        :loading="loading"
-        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
-        @change="handleTableChange">
-
-        <span slot="action" slot-scope="text, record">
-          <a @click="handleEdit(record)">编辑</a>
-        </span>
-
-      </a-table>
-    </div>
-    <!-- table区域-end -->
-
-    <!-- 表单区域 -->
-    <kuaishouAdAccount-modal ref="modalForm" @ok="modalFormOk"></kuaishouAdAccount-modal>
-  </a-card>
-</template>
-
-<script>
-  import KuaishouAdAccountModal from './modules/KuaishouAdAccountModal'
-  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
-  import {getAction} from '@/api/manage'
-  import JTreeSelect from '@/components/jeecg/JTreeSelect'
-  import ARow from "ant-design-vue/es/grid/Row";
-  let timeout;
-  let currentValue;
-  function fetch(value, callback) {
-    if (timeout) {
-      clearTimeout(timeout);
-      timeout = null;
-    }
-    currentValue = value;
-
-    function fake() {
-    }
-
-    timeout = setTimeout(fake, 300);
-  }
-  export default {
-    name: "KuaishouAdAccountList",
-    mixins: [JeecgListMixin],
-    components: {
-      ARow,
-      KuaishouAdAccountModal,
-      JTreeSelect
-    },
-    data() {
-      return {
-        description: '快手广告主信息管理页面',
-        // 表头
-        columns: [
-          {
-            title: '#',
-            dataIndex: '',
-            key: 'rowIndex',
-            width: 60,
-            align: "center",
-            customRender: function (t, r, index) {
-              return parseInt(index) + 1;
-            }
-          },
-          {
-            title: '快手ID',
-            align: "center",
-            dataIndex: 'ksid'
-          },
-          {
-            title: '快手广告主ID',
-            align: "center",
-            dataIndex: 'kaid'
-          },
-          {
-            title: '快手昵称',
-            align: "center",
-            dataIndex: 'name'
-          },
-          {
-            title: '行业分类',
-            align: "center",
-            dataIndex: 'industryCategory'
-          },
-          {
-            title: '一级行业',
-            align: "center",
-            dataIndex: 'firstIndustry'
-          },
-          {
-            title: '二级行业',
-            align: "center",
-            dataIndex: 'secondIndustry'
-          },
-          {
-            title: '广告主企业名称',
-            align: "center",
-            dataIndex: 'company'
-          },
-          {
-            title: '推广产品',
-            align: "center",
-            dataIndex: 'product'
-          },
-          {
-            title: '操作',
-            dataIndex: 'action',
-            align: "center",
-            scopedSlots: {customRender: 'action'},
-          }
-        ],
-        url: {
-          list: "/ctop/kuaishou/advertiser/list",
-          delete: "/ctop/kuaishou/advertiser/delete",
-          deleteBatch: "/ctop/kuaishou/advertiser/deleteBatch",
-          exportXlsUrl: "/ctop/kuaishou/advertiser/exportXls",
-          importExcelUrl: "/ctop/kuaishou/advertiser/importExcel",
-          companySugestUrl: '/ctop/kuaishou/advertiser/companysugest',
-          productSugestUrl: '/ctop/kuaishou/advertiser/productsugest',
-        },
-        queryParam:{
-          dataProcess:'full'
-        },
-        companyData: [],
-        productData: [],
-        value: undefined,
-      }
-    },
-    computed: {
-      importExcelUrl: function () {
-        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
-      }
-    },
-    methods: {
-      handleProductSearch(value) {
-        getAction(this.url.productSugestUrl, {product: value})
-          .then((res) => {
-            console.log(res)
-            if (currentValue === value) {
-              const result = res.result;
-              const data = [];
-              result.forEach((r) => {
-                data.push({
-                  value: r,
-                  text: r,
-                });
-              });
-              this.productData = data
-            }
-          });
-        fetch(value);
-      },
-      handleProductChange(value) {
-        this.value = value
-        fetch(value, data => this.productData = data);
-      },
-      handleCompanySearch(value) {
-        getAction(this.url.companySugestUrl, {company: value})
-          .then((res) => {
-            if (currentValue === value) {
-              const result = res.result;
-              const data = [];
-              result.forEach((r) => {
-                data.push({
-                  value: r,
-                  text: r,
-                });
-              });
-              this.companyData = data
-            }
-          });
-        fetch(value);
-      },
-      handleCompanyChange(value) {
-        this.value = value
-        fetch(value, data => this.companyData = data);
-      },
-    }
-  }
-</script>
-<style scoped>
-  @import '~@assets/less/common.less'
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+          <a-col :md="6" :sm="6">
+            <a-form-item label="行业">
+              <j-tree-select
+                v-model="queryParam.industry"
+                ref="treeSelect"
+                placeholder="请选择行业"
+                dict="sys_category,name,id"
+                pidField="pid"
+                pidValue="67d69117968be1eecb1e705b399b9d93">
+              </j-tree-select>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="6">
+            <a-form-item label="广告主公司">
+              <a-select
+                showSearch
+                v-model="queryParam.company"
+                placeholder="请输入公司名称"
+                :defaultActiveFirstOption="false"
+                :showArrow="false"
+                :filterOption="false"
+                @search="handleCompanySearch"
+                @change="handleCompanyChange"
+                :notFoundContent="null"
+              >
+                <a-select-option v-for="d in companyData" :key="d.value">{{d.text}}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="6">
+            <a-form-item label="推广产品">
+              <a-select
+                showSearch
+                v-model="queryParam.product"
+                placeholder="请输入产品名称"
+                :defaultActiveFirstOption="false"
+                :showArrow="false"
+                :filterOption="false"
+                @search="handleProductSearch"
+                @change="handleProductChange"
+                :notFoundContent="null"
+              >
+                <a-select-option v-for="d in productData" :key="d.value">{{d.text}}</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row :gutter="24">
+          <a-col :md="6" :sm="6">
+            <a-form-item label="快手ID">
+              <a-input placeholder="请输入快手ID" v-model="queryParam.ksid"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="6">
+            <a-form-item label="快手昵称">
+              <a-input placeholder="请输入快手昵称" v-model="queryParam.name"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="6">
+            <a-form-item label="完整度">
+              <a-radio-group v-model="queryParam.dataProcess">
+                <a-radio-button value="full">完整</a-radio-button>
+                <a-radio-button value="industry">缺失行业</a-radio-button>
+                <a-radio-button value="company">缺失企业</a-radio-button>
+                <a-radio-button value="product">缺失产品</a-radio-button>
+              </a-radio-group>
+            </a-form-item>
+          </a-col>
+        </a-row>
+        <a-row>
+          <a-col :md="6" :sm="6">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+<!--    <div class="table-operator">-->
+<!--      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>-->
+<!--    </div>-->
+
+    <!-- table区域-begin -->
+    <div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <kuaishouAdAccount-modal ref="modalForm" @ok="modalFormOk"></kuaishouAdAccount-modal>
+  </a-card>
+</template>
+
+<script>
+  import KuaishouAdAccountModal from './modules/KuaishouAdAccountModal'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+  import {getAction} from '@/api/manage'
+  import JTreeSelect from '@/components/jeecg/JTreeSelect'
+  import ARow from "ant-design-vue/es/grid/Row";
+  let timeout;
+  let currentValue;
+  function fetch(value, callback) {
+    if (timeout) {
+      clearTimeout(timeout);
+      timeout = null;
+    }
+    currentValue = value;
+
+    function fake() {
+    }
+
+    timeout = setTimeout(fake, 300);
+  }
+  export default {
+    name: "KuaishouAdAccountList",
+    mixins: [JeecgListMixin],
+    components: {
+      ARow,
+      KuaishouAdAccountModal,
+      JTreeSelect
+    },
+    data() {
+      return {
+        description: '快手广告主信息管理页面',
+        // 表头
+        columns: [
+          {
+            title: '快手ID',
+            align: "center",
+            dataIndex: 'ksid'
+          },
+          {
+            title: '快手广告主ID',
+            align: "center",
+            dataIndex: 'kaid'
+          },
+          {
+            title: '快手昵称',
+            align: "center",
+            dataIndex: 'name'
+          },
+          {
+            title: '行业分类',
+            align: "center",
+            dataIndex: 'industryCategory'
+          },
+          {
+            title: '一级行业',
+            align: "center",
+            dataIndex: 'firstIndustry'
+          },
+          {
+            title: '二级行业',
+            align: "center",
+            dataIndex: 'secondIndustry'
+          },
+          {
+            title: '广告主企业名称',
+            align: "center",
+            dataIndex: 'company'
+          },
+          {
+            title: '推广产品',
+            align: "center",
+            dataIndex: 'product'
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align: "center",
+            scopedSlots: {customRender: 'action'},
+          }
+        ],
+        url: {
+          list: "/ctop/kuaishou/advertiser/list",
+          delete: "/ctop/kuaishou/advertiser/delete",
+          deleteBatch: "/ctop/kuaishou/advertiser/deleteBatch",
+          exportXlsUrl: "/ctop/kuaishou/advertiser/exportXls",
+          importExcelUrl: "/ctop/kuaishou/advertiser/importExcel",
+          companySugestUrl: '/ctop/kuaishou/advertiser/companysugest',
+          productSugestUrl: '/ctop/kuaishou/advertiser/productsugest',
+        },
+        queryParam:{
+          dataProcess:'full'
+        },
+        companyData: [],
+        productData: [],
+        value: undefined,
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      handleProductSearch(value) {
+        getAction(this.url.productSugestUrl, {product: value})
+          .then((res) => {
+            console.log(res)
+            if (currentValue === value) {
+              const result = res.result;
+              const data = [];
+              result.forEach((r) => {
+                data.push({
+                  value: r,
+                  text: r,
+                });
+              });
+              this.productData = data
+            }
+          });
+        fetch(value);
+      },
+      handleProductChange(value) {
+        this.value = value
+        fetch(value, data => this.productData = data);
+      },
+      handleCompanySearch(value) {
+        getAction(this.url.companySugestUrl, {company: value})
+          .then((res) => {
+            if (currentValue === value) {
+              const result = res.result;
+              const data = [];
+              result.forEach((r) => {
+                data.push({
+                  value: r,
+                  text: r,
+                });
+              });
+              this.companyData = data
+            }
+          });
+        fetch(value);
+      },
+      handleCompanyChange(value) {
+        this.value = value
+        fetch(value, data => this.companyData = data);
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
 </style>

+ 169 - 205
src/views/modules/kuaishouapp/KuaishouAppAccountList.vue

@@ -1,206 +1,170 @@
-<template>
-  <a-card :bordered="false">
-
-    <!-- 查询区域 -->
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline">
-        <a-row :gutter="24">
-
-          <a-col :md="6" :sm="8">
-            <a-form-item label="请求地址">
-              <a-input placeholder="请输入请求地址" v-model="queryParam.url"></a-input>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="8">
-            <a-form-item label="请求路径">
-              <a-input placeholder="请输入请求路径" v-model="queryParam.path"></a-input>
-            </a-form-item>
-          </a-col>
-          <template v-if="toggleSearchStatus">
-            <a-col :md="6" :sm="8">
-              <a-form-item label="令牌">
-                <a-input placeholder="请输入令牌" v-model="queryParam.token"></a-input>
-              </a-form-item>
-            </a-col>
-            <a-col :md="6" :sm="8">
-              <a-form-item label="url参数">
-                <a-input placeholder="请输入url参数" v-model="queryParam.urlParam"></a-input>
-              </a-form-item>
-            </a-col>
-            <a-col :md="6" :sm="8">
-              <a-form-item label="body参数">
-                <a-input placeholder="请输入body参数" v-model="queryParam.bodyParam"></a-input>
-              </a-form-item>
-            </a-col>
-          </template>
-          <a-col :md="6" :sm="8">
-            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
-              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
-              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
-              <a @click="handleToggleSearch" style="margin-left: 8px">
-                {{ toggleSearchStatus ? '收起' : '展开' }}
-                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
-              </a>
-            </span>
-          </a-col>
-
-        </a-row>
-      </a-form>
-    </div>
-
-    <!-- 操作按钮区域 -->
-    <div class="table-operator">
-      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
-      <a-button type="primary" icon="download" @click="handleExportXls('快手APP账号表')">导出</a-button>
-      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl"
-                @change="handleImportExcel">
-        <a-button type="primary" icon="import">导入</a-button>
-      </a-upload>
-      <a-dropdown v-if="selectedRowKeys.length > 0">
-        <a-menu slot="overlay">
-          <a-menu-item key="1" @click="batchDel">
-            <a-icon type="delete"/>
-            删除
-          </a-menu-item>
-        </a-menu>
-        <a-button style="margin-left: 8px"> 批量操作
-          <a-icon type="down"/>
-        </a-button>
-      </a-dropdown>
-    </div>
-
-    <!-- table区域-begin -->
-    <div>
-      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
-        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
-        selectedRowKeys.length }}</a>项
-        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
-      </div>
-
-      <a-table
-        ref="table"
-        size="middle"
-        bordered
-        rowKey="id"
-        :columns="columns"
-        :dataSource="dataSource"
-        :pagination="ipagination"
-        :loading="loading"
-        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
-        @change="handleTableChange">
-        <span slot="dataContent" slot-scope="text, record">
-          <j-ellipsis :value="text" :length="60"/>
-        </span>
-        <span slot="action" slot-scope="text, record">
-          <a @click="handleEdit(record)">编辑</a>
-
-          <a-divider type="vertical"/>
-          <a-dropdown>
-            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
-            <a-menu slot="overlay">
-              <a-menu-item>
-                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
-                  <a>删除</a>
-                </a-popconfirm>
-              </a-menu-item>
-            </a-menu>
-          </a-dropdown>
-        </span>
-
-      </a-table>
-    </div>
-    <!-- table区域-end -->
-
-    <!-- 表单区域 -->
-    <kuaishouAppAccount-modal ref="modalForm" @ok="modalFormOk"></kuaishouAppAccount-modal>
-  </a-card>
-</template>
-
-<script>
-  import KuaishouAppAccountModal from './modules/KuaishouAppAccountModal'
-  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
-  import JEllipsis from "@/components/jeecg/JEllipsis";
-
-  export default {
-    name: "KuaishouAppAccountList",
-    mixins: [JeecgListMixin],
-    components: {
-      KuaishouAppAccountModal,
-      JEllipsis
-    },
-    data() {
-      return {
-        description: '快手APP账号表管理页面',
-        // 表头
-        columns: [
-          {
-            title: '#',
-            dataIndex: '',
-            key: 'rowIndex',
-            width: 60,
-            align: "center",
-            customRender: function (t, r, index) {
-              return parseInt(index) + 1;
-            }
-          },
-          {
-            title: '请求地址',
-            align: "center",
-            dataIndex: 'url'
-          },
-          {
-            title: '请求路径',
-            align: "center",
-            dataIndex: 'path'
-          },
-          {
-            title: '令牌',
-            align: "center",
-            dataIndex: 'token',
-            scopedSlots: {customRender: 'dataContent'}
-          },
-          {
-            title: 'url参数',
-            align: "center",
-            dataIndex: 'urlParam',
-            scopedSlots: {customRender: 'dataContent'}
-          },
-          {
-            title: 'body参数',
-            align: "center",
-            dataIndex: 'bodyParam',
-            scopedSlots: {customRender: 'dataContent'}
-          },
-          {
-            title: 'header参数',
-            align: "center",
-            dataIndex: 'headerParam',
-            scopedSlots: {customRender: 'dataContent'}
-          },
-          {
-            title: '操作',
-            dataIndex: 'action',
-            align: "center",
-            scopedSlots: {customRender: 'action'},
-          }
-        ],
-        url: {
-          list: "/ctop/kuaishouAppAccount/list",
-          delete: "/ctop/kuaishouAppAccount/delete",
-          deleteBatch: "/ctop/kuaishouAppAccount/deleteBatch",
-          exportXlsUrl: "ctop/kuaishouAppAccount/exportXls",
-          importExcelUrl: "ctop/kuaishouAppAccount/importExcel",
-        },
-      }
-    },
-    computed: {
-      importExcelUrl: function () {
-        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
-      }
-    },
-    methods: {}
-  }
-</script>
-<style scoped>
-  @import '~@assets/less/common.less'
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="8">
+            <a-form-item label="请求地址">
+              <a-input placeholder="请输入请求地址" v-model="queryParam.url"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="8">
+            <a-form-item label="请求路径">
+              <a-input placeholder="请输入请求路径" v-model="queryParam.path"></a-input>
+            </a-form-item>
+          </a-col>
+          <template>
+            <a-col :md="6" :sm="8">
+              <a-form-item label="令牌">
+                <a-input placeholder="请输入令牌" v-model="queryParam.token"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="8">
+              <a-form-item label="url参数">
+                <a-input placeholder="请输入url参数" v-model="queryParam.urlParam"></a-input>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="8">
+              <a-form-item label="body参数">
+                <a-input placeholder="请输入body参数" v-model="queryParam.bodyParam"></a-input>
+              </a-form-item>
+            </a-col>
+          </template>
+          <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        @change="handleTableChange">
+        <span slot="dataContent" slot-scope="text, record">
+          <j-ellipsis :value="text" :length="60"/>
+        </span>
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <kuaishouAppAccount-modal ref="modalForm" @ok="modalFormOk"></kuaishouAppAccount-modal>
+  </a-card>
+</template>
+
+<script>
+  import KuaishouAppAccountModal from './modules/KuaishouAppAccountModal'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+  import JEllipsis from "@/components/jeecg/JEllipsis";
+
+  export default {
+    name: "KuaishouAppAccountList",
+    mixins: [JeecgListMixin],
+    components: {
+      KuaishouAppAccountModal,
+      JEllipsis
+    },
+    data() {
+      return {
+        description: '快手APP账号表管理页面',
+        // 表头
+        columns: [
+          {
+            title: '请求地址',
+            align: "center",
+            dataIndex: 'url'
+          },
+          {
+            title: '请求路径',
+            align: "center",
+            dataIndex: 'path'
+          },
+          {
+            title: '令牌',
+            align: "center",
+            dataIndex: 'token',
+            scopedSlots: {customRender: 'dataContent'}
+          },
+          {
+            title: 'url参数',
+            align: "center",
+            dataIndex: 'urlParam',
+            scopedSlots: {customRender: 'dataContent'}
+          },
+          {
+            title: 'body参数',
+            align: "center",
+            dataIndex: 'bodyParam',
+            scopedSlots: {customRender: 'dataContent'}
+          },
+          {
+            title: 'header参数',
+            align: "center",
+            dataIndex: 'headerParam',
+            scopedSlots: {customRender: 'dataContent'}
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align: "center",
+            scopedSlots: {customRender: 'action'},
+          }
+        ],
+        url: {
+          list: "/ctop/kuaishouAppAccount/list",
+          delete: "/ctop/kuaishouAppAccount/delete",
+          deleteBatch: "/ctop/kuaishouAppAccount/deleteBatch",
+          exportXlsUrl: "ctop/kuaishouAppAccount/exportXls",
+          importExcelUrl: "ctop/kuaishouAppAccount/importExcel",
+        },
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {}
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
 </style>

+ 68 - 77
src/views/modules/kuaishouapp/account/accountIndex.vue

@@ -8,38 +8,20 @@
 <template>
   <div class="account-statistics">
     <a-row class="image-list-heading vm-panel">
-      <a-row>
-        <!-- <div class="panel-heading">{{ title }}</div> -->
-        <!-- <a-select defaultValue="jack" style="width:30%" class="panel-heading">
-          <a-select-option value="jack">账户1</a-select-option>
-          <a-select-option value="lucy">账户2</a-select-option>
-          <a-select-option value="Yiminghe">账户3</a-select-option>
-        </a-select>-->
-        <a-select
-          v-model="appId"
-          showSearch
-          allowClear
-          placeholder="请选择账户"
-          optionFilterProp="children"
-          style="width:600px;margin-left:20px"
-        >
-          <a-select-option
-            v-for="appModel in options"
-            :key="appModel.id+new Date().getTime()"
-            :value="appModel.accountId"
-          >{{appModel.advertiserName}}&#12288;&#12288;{{appModel.accountId}}&#12288;&nbsp;&#12288;{{appModel.authName}}&#12288;&#12288;{{appModel.operationName}}</a-select-option>
-        </a-select>
+      <a-col :span="24" style="display:flex">
+        <Treeselect :appId.sync="appId" :multiple="false" style="margin:8px 20px" />
         <a-button type="primary" style="margin:10px" @click="addUser">搜索</a-button>
-      </a-row>
+      </a-col>
     </a-row>
     <a-row :gutter="15" style="margin-top:15px">
-      <a-col :span="8">
+      <a-col :span="12">
         <a-card hoverable title="总花费">
-          <countTo :startVal="0" :endVal="1000" :duration="duration" :decimals="2" class="count"></countTo>
+          <countTo :startVal="0" :endVal="cost" :duration="duration" :decimals="2" class="count"></countTo>
         </a-card>
       </a-col>
-      <a-col :span="8">
+      <!-- <a-col :span="8">
         <a-card hoverable title="预算">
+          
           <countTo
             :startVal="0"
             :endVal="many"
@@ -48,24 +30,19 @@
             v-show="!showEdit"
             class="count"
           ></countTo>
-          <a-input-number
-            :min="0"
-            :step="0.01"
-            v-show="showEdit"
-            v-model="manyTwo"
-            style="width:200px"
-          />
-          <!-- <a-input v-show="showEdit" v-model="manyTwo" style="width:200px"></a-input> -->
+          <span v-show="!showEdit" class="count">{{ many > 0 ? many.toFixed(2) : '不限制预算' }}</span>
+          <a-input-number :min="0" :step="0.01" v-show="showEdit" v-model="manyTwo" style="width:200px" />
+          <a-input v-show="showEdit" v-model="manyTwo" style="width:200px"></a-input>
           <a-icon
-            :type="showEdit?'check':'edit'"
-            @click="showEdit=!showEdit,show()"
+            :type="showEdit ? 'check' : 'edit'"
+            @click=";(showEdit = !showEdit), show()"
             style="margin-left:10px"
           />
         </a-card>
-      </a-col>
-      <a-col :span="8">
+      </a-col> -->
+      <a-col :span="12">
         <a-card hoverable title="余额">
-          <countTo :startVal="0" :endVal="1000" :duration="duration" :decimals="2" class="count"></countTo>
+          <countTo :startVal="0" :endVal="balance" :duration="duration" :decimals="2" class="count"></countTo>
         </a-card>
       </a-col>
     </a-row>
@@ -73,6 +50,7 @@
       <a-card>
         <a-button @click="dianji" style="margin-bottom:15px">新增广告计划</a-button>
         <a-table
+          size="middle"
           :columns="columns"
           :dataSource="dataList"
           bordered
@@ -80,19 +58,20 @@
           :customRow="rowClick"
           :pagination="ipagination"
         >
-          <template slot="dayBudget" slot-scope="text,record">
+          <template slot="dayBudget" slot-scope="text, record">
             <div style="display:flex;justify-content: center;">
-              <span v-show="!record.edit" class="count">{{text?text.toFixed(2):'不限制预算'}}</span>
+              <span v-show="!record.edit" class="count">{{ text ? text.toFixed(2) : '不限制预算' }}</span>
               <a-input-number
                 :min="0"
                 :step="0.01"
                 v-show="record.edit"
                 v-model="record.elseMoney"
                 style="width:150px"
+                @fouse.stop
               />
               <a-icon
-                :type="record.edit?'check':'edit'"
-                @click.stop="record.edit=!record.edit,editShow(record)"
+                :type="record.edit ? 'check' : 'edit'"
+                @click.stop=";(record.edit = !record.edit), editShow(record)"
                 style="margin-left:10px"
                 class="count"
               />
@@ -110,11 +89,12 @@ import ACol from 'ant-design-vue/es/grid/Col'
 import moment from 'moment'
 import countTo from 'vue-count-to'
 import { mapGetters } from 'vuex'
-import { deleteAction, getAction } from '@/api/manage'
+import { deleteAction, getAction, postAction } from '@/api/manage'
 
 import { getMaterialAccount } from '@api/statistics'
 
-// import lifting from './components/lifting'
+import Treeselect from '@/views/modules/Statistics/components/Treeselect.vue'
+
 var columns = [
   {
     title: '广告计划名称',
@@ -133,7 +113,7 @@ var columns = [
   {
     title: '计划类型',
     align: 'center',
-    dataIndex: 'type'
+    dataIndex: 'campaignType'
   },
   {
     title: '应用创建id',
@@ -151,28 +131,23 @@ var columns = [
     align: 'center',
     dataIndex: 'url'
   },
-
-  {
-    title: '操作',
-    dataIndex: 'action',
-    align: 'center',
-    scopedSlots: { customRender: 'action' }
-  }
 ]
 export default {
   name: 'account-statistics',
   components: {
     ACol,
     ARow,
-    countTo
+    countTo,
+    Treeselect
   },
-
   data: function() {
     return {
       duration: 1000,
       showEdit: false,
-      many: 1200,
-      manyTwo: null,
+      many: 0,
+      manyTwo: 0,
+      cost: 0,
+      balance: 0,
       columns,
       dataList: [],
       appId: '',
@@ -205,21 +180,19 @@ export default {
       ipagination: {
         current: 1,
         pageSize: 10,
-        pageSizeOptions: ['10', '20', '30'],
         showTotal: (total, range) => {
           return range[0] + '-' + range[1] + ' 共' + total + '条'
         },
         showQuickJumper: true,
-        showSizeChanger: true,
+        onChange: current => {
+          // 切换分页时的回调,
+          // 当在页面定义change事件时,切记要把此处的事件清除,因为这两个事件重叠了,可能到时候会导致一些莫名的bug
+          this.ipagination.current = current
+          this.addUser()
+        },
         total: 0
       },
-      url: {
-        list: '/kuaishou/kuaiShouCampaignTemplate/list',
-        delete: '/kuaishou/kuaiShouCampaignTemplate/delete',
-        deleteBatch: '/kuaishou/kuaiShouCampaignTemplate/deleteBatch',
-        exportXlsUrl: 'kuaishou/kuaiShouCampaignTemplate/exportXls',
-        importExcelUrl: 'kuaishou/kuaiShouCampaignTemplate/importExcel'
-      }
+      url: {}
     }
   },
   methods: {
@@ -228,25 +201,43 @@ export default {
       this.loading = true
       this.dataList = []
       var params = {}
-    //   params.accountId = this.appId + ''
+      params.accountId = this.appId + ''
       params.pageNo = this.ipagination.current
       params.pageSize = this.ipagination.pageSize
       if (this.appId) {
-        getAction(this.url.list, params).then(res => {
-          if (res.code == 0) {
-            this.dataList = res.result.records.map((v, index) => {
-              return {
-                ...v,
-                key: index,
-                edit: false
-              }
-            })
-          }
-        })
+        this.getSpend(params)
+        this.getCampaignList(params)
       } else {
         this.$message.error('请选择账户')
       }
     },
+    getCampaignList(params) {
+      getAction('/kuaishou/batch/getCampaignList', params).then(res => {
+        if (res.code == 0) {
+          this.dataList = res.result.records.map((v, index) => {
+            return {
+              ...v,
+              key: index,
+              edit: false
+            }
+          })
+          this.ipagination.total = res.result.total
+        }
+      })
+    },
+    getSpend(item) {
+      getAction('/kuaishou/batch/spend', { accountId: item.accountId }).then(res => {
+        if (res.success) {
+          console.log(res)
+          this.many = res.result.budget
+          this.manyTwo = res.result.budget
+          this.cost = res.result.cost
+          this.balance = res.result.balance
+        } else {
+          this.$message.error(res.message)
+        }
+      })
+    },
     show() {
       if (!this.showEdit) {
         this.many = this.manyTwo

文件差異過大導致無法顯示
+ 1004 - 0
src/views/modules/material/fragmentMatemal.vue


+ 149 - 260
src/views/modules/material/materialList.vue

@@ -184,139 +184,129 @@ a {
 
     <!-- table区域-begin -->
     <!-- <div> -->
-    <a-tabs @change="callback" type="card" id="material-card" v-model="activeKey" style="position:relative;z-index:100">
-      <a-tab-pane :tab="item.tab" v-for="item of materialList" :key="item.value">
-        <!-- 操作按钮区域 -->
 
-        <div class="table-operator" style="position:relative;z-index:100">
-          <a-button @click="visible = true" type="primary" icon="plus">新增</a-button>
-          <a-button @click="onCheckAllChange" v-if="queryParam.projectId && active == '1'">{{
-            checkAll ? '取消  (  ' + checkArr.length + '  )' : '全选'
-          }}</a-button>
-          <a-button v-if="queryParam.projectId && active == '1'" :disabled="checkArr.length == 0" @click="tongbu"
-            >一键同步</a-button
-          >
-        </div>
+    <div class="table-operator" style="position:relative;z-index:100">
+      <a-button @click="visible = true" type="primary" icon="plus">新增</a-button>
+      <a-button @click="onCheckAllChange" v-if="queryParam.projectId && active == '1'">{{
+        checkAll ? '取消  (  ' + checkArr.length + '  )' : '全选'
+      }}</a-button>
+      <a-button v-if="queryParam.projectId && active == '1'" :disabled="checkArr.length == 0" @click="tongbu"
+        >一键同步</a-button
+      >
+    </div>
 
-        <a-tabs @change="callbackTwo" v-model="active">
-          <a-tab-pane :tab="item.tab" v-for="item of examinelList" :key="item.value">
-            <a-checkbox-group @change="onChangeCheck" v-model="checkArr" class="home-card">
-              <div class="home-item" v-for="(items, index) in dataSource" :key="index" @click="showDetail(items)">
-                <div class="home-right">
-                  <a-badge
-                    :count="checkArr.indexOf(items.id) > -1 ? checkArr.indexOf(items.id) + 1 : 0"
-                    :numberStyle="{ backgroundColor: '#52c41a' }"
-                    style="width:100%"
+    <a-tabs @change="callbackTwo" v-model="active" id="material-card" type="card">
+      <a-tab-pane :tab="item.tab" v-for="item of examinelList" :key="item.value">
+        <div v-if="dataSource.length > 0">
+          <a-checkbox-group @change="onChangeCheck" v-model="checkArr" class="home-card">
+            <div class="home-item" v-for="(items, index) in dataSource" :key="index" @click="showDetail(items)">
+              <div class="home-right">
+                <a-badge
+                  :count="checkArr.indexOf(items.id) > -1 ? checkArr.indexOf(items.id) + 1 : 0"
+                  :numberStyle="{ backgroundColor: '#52c41a' }"
+                  style="width:100%"
+                >
+                  <span
+                    style="color: #999; fontSize: 16px;padding-bottom:10px;display:block;width:100%;overflow: hidden;text-overflow: ellipsis;"
                   >
-                    <span
-                      style="color: #999; fontSize: 16px;padding-bottom:10px;display:block;width:100%;overflow: hidden;text-overflow: ellipsis;"
-                    >
-                      {{ items.materialName }}
-                    </span>
-                  </a-badge>
-                  <div style="display:flex;justify-content:center;width:100%;height:200px;position:relative">
-                    <div
-                      class="home-num bg"
-                      v-if="activeKey == 'image'"
-                      :style="{
-                        backgroundImage: 'url(' + items.url + ')',
-                        backgroundSize: 'cover',
-                        backgroundRepeat: 'no-repeat',
-                        backgroundPosition: 'center center',
-                        overflow: 'hidden',
-                        position: 'relative',
-                        width: '100%',
-                        height: '100%'
-                      }"
-                    ></div>
+                    {{ items.materialName }}
+                  </span>
+                </a-badge>
+                <div style="display:flex;justify-content:center;width:100%;height:200px;position:relative">
+                  <div
+                    class="home-num bg"
+                    v-if="activeKey == 'image'"
+                    :style="{
+                      backgroundImage: 'url(' + items.url + ')',
+                      backgroundSize: 'cover',
+                      backgroundRepeat: 'no-repeat',
+                      backgroundPosition: 'center center',
+                      overflow: 'hidden',
+                      position: 'relative',
+                      width: '100%',
+                      height: '100%'
+                    }"
+                  ></div>
+                  <img
+                    v-if="activeKey == 'image'"
+                    :src="items.url"
+                    style="height:200px;max-width:100%;position:absolute;z-index:10;"
+                  />
+                </div>
 
-                    <img
-                      v-if="activeKey == 'image'"
-                      :src="items.url"
-                      style="height:200px;max-width:100%;position:absolute;z-index:10;"
-                    />
-                    <div v-else style="display:flex;justify-content:center;width:100%;height:200px;position:relative">
-                      <video
-                        :src="items.url"
-                        @canplay="a(items)"
-                        style="height:200px;max-width:100%;position:absolute;z-index:10;"
-                      />
-                      <img
-                        src="./timg.gif"
-                        v-if="!items.showVideo"
-                        alt=""
-                        style="height:200px;max-width:100%;position:absolute;z-index:11;"
-                        @click.stop
-                      />
+                <div v-if="active == '2'" class="bh">驳回原因:{{ items.refuseReason }}</div>
+                <span style="color: black; fontSize: 16px;padding-top:10px;display:block;width:100%" @click.stop>
+                  {{ items.createTime | getDate }}
+                  <a
+                    href="javascript:;"
+                    style="margin-left:20px"
+                    @click="edit(items, '2')"
+                    v-show="active == '2'"
+                    v-if="items.userId == userInfo().id"
+                  >
+                    修改</a
+                  >
+                  <a-popconfirm
+                    @confirm="okEditShow(items, '2')"
+                    v-show="active != '2'"
+                    v-if="
+                      role.roleCode == 'operator' ||
+                        role.roleCode == 'kuaishouOperationManager' ||
+                        role.roleCode == 'admin'
+                    "
+                  >
+                    <div slot="title">
+                      <div>
+                        驳回原因:
+                        <a-textarea
+                          placeholder="请输入原因"
+                          v-model="refuseReason"
+                          :autosize="{ minRows: 3, maxRows: 10 }"
+                        />
+                      </div>
+                      <div>
+                        截图:
+                        <upload-to-ali
+                          v-model="refuseFile"
+                          :customDomain="customDomain"
+                          multiple
+                          preview
+                          :region="region"
+                          :bucket="bucket"
+                          :accept="acceptImage"
+                          :max="10"
+                          :size="1024000"
+                          :accessKeyId="accessKeyId"
+                          :accessKeySecret="accessKeySecret"
+                          :dir="dirImg"
+                        ></upload-to-ali>
+                      </div>
                     </div>
-                  </div>
+                    <a href="javascript:;" style="margin-left:20px">驳回</a>
+                  </a-popconfirm>
 
-                  <div v-if="active == '2'" class="bh">驳回原因:{{ items.refuseReason }}</div>
-                  <span style="color: black; fontSize: 16px;padding-top:10px;display:block;width:100%" @click.stop>
-                    {{ items.createTime | getDate }}
+                  <a-popconfirm
+                    @confirm="okEditShow(items, '1')"
+                    v-show="active != '1'"
+                    v-if="
+                      role.roleCode == 'operator' ||
+                        role.roleCode == 'kuaishouOperationManager' ||
+                        role.roleCode == 'admin'
+                    "
+                  >
+                    <div slot="title">
+                      <div>
+                        广告语:
+                        <a-textarea
+                          placeholder="请输入"
+                          v-model="refuseReason"
+                          :autosize="{ minRows: 3, maxRows: 10 }"
+                        />
+                      </div>
+                    </div>
                     <a
                       href="javascript:;"
                       style="margin-left:20px"
-                      @click="edit(items, '2')"
-                      v-show="active == '2'"
-                      v-if="items.userId == userInfo().id"
-                    >
-                      修改</a
-                    >
-                    <!-- <a
-                      href="javascript:;"
-                      style="margin-left:20px"
-                      @click="edit(items, '2')"
-                      v-show="active == '0' || active == '1'"
-                      v-if="
-                        role.roleCode == 'operator' ||
-                          role.roleCode == 'kuaishouOperationManager' ||
-                          role.roleCode == 'admin'
-                      "
-                    >
-                      驳回</a
-                    > -->
-                    <a-popconfirm
-                      @confirm="okEditShow(items, '2')"
-                      v-show="active != '2'"
-                      v-if="
-                        role.roleCode == 'operator' ||
-                          role.roleCode == 'kuaishouOperationManager' ||
-                          role.roleCode == 'admin'
-                      "
-                    >
-                      <div slot="title">
-                        <div>
-                          驳回原因:
-                          <a-textarea
-                            placeholder="请输入原因"
-                            v-model="refuseReason"
-                            :autosize="{ minRows: 3, maxRows: 10 }"
-                          />
-                        </div>
-                        <div>
-                          截图:
-                          <upload-to-ali
-                            v-model="refuseFile"
-                            :customDomain="customDomain"
-                            multiple
-                            preview
-                            :region="region"
-                            :bucket="bucket"
-                            :accept="acceptImage"
-                            :max="10"
-                            :size="1024000"
-                            :accessKeyId="accessKeyId"
-                            :accessKeySecret="accessKeySecret"
-                            :dir="dirImg"
-                          ></upload-to-ali>
-                        </div>
-                      </div>
-                      <a href="javascript:;" style="margin-left:20px">驳回</a>
-                    </a-popconfirm>
-
-                    <a-popconfirm
-                      @confirm="okEditShow(items, '1')"
                       v-show="active != '1'"
                       v-if="
                         role.roleCode == 'operator' ||
@@ -324,47 +314,35 @@ a {
                           role.roleCode == 'admin'
                       "
                     >
-                      <div slot="title">
-                        <div>
-                          广告语:
-                          <a-textarea
-                            placeholder="请输入"
-                            v-model="refuseReason"
-                            :autosize="{ minRows: 3, maxRows: 10 }"
-                          />
-                        </div>
-                      </div>
-                      <a
-                        href="javascript:;"
-                        style="margin-left:20px"
-                        v-show="active != '1'"
-                        v-if="
-                          role.roleCode == 'operator' ||
-                            role.roleCode == 'kuaishouOperationManager' ||
-                            role.roleCode == 'admin'
-                        "
-                      >
-                        通过审核</a
-                      >
-                    </a-popconfirm>
-                    <a-checkbox :value="items.id" style="float:right"></a-checkbox
-                  ></span>
-                </div>
+                      通过审核</a
+                    >
+                  </a-popconfirm>
+                  <a-checkbox :value="items.id" style="float:right"></a-checkbox
+                ></span>
               </div>
-            </a-checkbox-group>
-            <a-pagination
-              style="float:right"
-              v-if="dataSource.length > 0"
-              showQuickJumper
-              :pageSize.sync="ipagination.pageSize"
-              :total="ipagination.total"
-              v-model="ipagination.current"
-              @change="getDataSource"
-          /></a-tab-pane>
-        </a-tabs>
+            </div>
+          </a-checkbox-group>
+          <a-pagination
+            size="small"
+            :showTotal="ipagination.showTotal"
+            style="float:right"
+            v-if="dataSource.length > 0"
+            showQuickJumper
+            :pageSize.sync="ipagination.pageSize"
+            :total="ipagination.total"
+            v-model="ipagination.current"
+            @change="getDataSource"
+          />
+        </div>
+        <div v-else style="width:100%;height:400px;display:flex;justify-content: center;align-items: center;">
+          <img
+            src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1575627350102&di=02972956f2243933bffc0d85099adbfe&imgtype=jpg&src=http%3A%2F%2Fimg0.imgtn.bdimg.com%2Fit%2Fu%3D1095310825%2C1528244349%26fm%3D214%26gp%3D0.jpg"
+            alt=""
+          />
+        </div>
       </a-tab-pane>
     </a-tabs>
-    <a-modal title="添加素材" v-model="visible" @ok="handleOk" @cancel="close">
+    <a-modal title="添加素材" v-model="visible" @ok="handleOk" @cancel="close" :maskClosable="false">
       <a-form :form="form">
         <a-form-item :label-col="labelCol" :wrapper-col="wrapperCol" label="项目选择">
           <a-select
@@ -379,11 +357,7 @@ a {
             </a-select-option>
           </a-select>
         </a-form-item>
-        <a-form-item
-          :label-col="labelCol"
-          :wrapper-col="wrapperCol"
-          :label="activeKey == 'image' ? '图片素材上传' : '视频素材上传'"
-        >
+        <a-form-item :label-col="labelCol" :wrapper-col="wrapperCol" label="图片素材上传">
           <upload-to-ali
             v-model="urlList.url"
             :customDomain="customDomain"
@@ -417,71 +391,10 @@ a {
             @loaded="overUpload"
           ></upload-to-ali>
         </a-form-item>
-        <div v-if="activeKey == 'video'">
-          <a-form-item :label-col="labelCol" :wrapper-col="wrapperCol" label="策划" v-if="activeKey == 'video'">
-            <a-select
-              v-decorator="[
-                'planId', // 给表单赋值或拉取表单时,该input对应的key
-                { rules: [{ required: true, message: '请选择策划!' }] }
-              ]"
-            >
-              <a-select-option :value="item.userId" v-for="item of ascription.clipId" :key="item.userId">
-                {{ item.userName }}
-              </a-select-option>
-            </a-select>
-          </a-form-item>
-          <a-form-item :label-col="labelCol" :wrapper-col="wrapperCol" label="拍摄" v-if="activeKey == 'video'">
-            <a-select
-              v-decorator="[
-                'shotId', // 给表单赋值或拉取表单时,该input对应的key
-                { rules: [{ required: true, message: '请选择策划!' }] }
-              ]"
-            >
-              <a-select-option :value="item.userId" v-for="item of ascription.shotId" :key="item.userId">
-                {{ item.userName }}
-              </a-select-option>
-            </a-select>
-          </a-form-item>
-          <a-form-item :label-col="labelCol" :wrapper-col="wrapperCol" label="剪辑">
-            <a-select
-              v-decorator="[
-                'clipId', // 给表单赋值或拉取表单时,该input对应的key
-                { rules: [{ required: true, message: '请选择策划!' }] }
-              ]"
-            >
-              <a-select-option :value="item.userId" v-for="item of ascription.clipId" :key="item.userId">
-                {{ item.userName }}
-              </a-select-option>
-            </a-select>
-          </a-form-item>
-          <a-form-item :label-col="labelCol" :wrapper-col="wrapperCol" label="平面" v-if="activeKey == 'image'">
-            <a-select
-              v-decorator="[
-                'planeId', // 给表单赋值或拉取表单时,该input对应的key
-                { rules: [{ required: true, message: '请选择策划!' }] }
-              ]"
-            >
-              <a-select-option :value="item.userId" v-for="item of ascription.planeId" :key="item.userId">
-                {{ item.userName }}
-              </a-select-option>
-            </a-select>
-          </a-form-item>
-        </div>
-        <div v-else>
-          <a-form-item :label-col="labelCol" :wrapper-col="wrapperCol" :label="role.roleName">
-            <!-- <a-select
-              v-decorator="[
-                role.roleCode, // 给表单赋值或拉取表单时,该input对应的key
-                { rules: [{ required: true, message: '请选择' + role.roleName }] }
-              ]"
-            >
-              <a-select-option :value="item.userId" v-for="item of ascription.clipId" :key="item.userId">
-                {{ item.userName }}
-              </a-select-option>
-            </a-select> -->
-            <span>{{ userInfo().realname }}</span>
-          </a-form-item>
-        </div>
+
+        <a-form-item :label-col="labelCol" :wrapper-col="wrapperCol" :label="role.roleName">
+          <span>{{ userInfo().realname }}</span>
+        </a-form-item>
         <a-form-item
           :label-col="labelCol"
           :wrapper-col="{
@@ -540,35 +453,15 @@ a {
           style="width:50%;padding:10px;box-sizing:border-box;display:flex;justify-content:center;border-right:1px solid #f2f2f2"
         >
           <img :src="showUrl" alt="" v-if="activeKey == 'image'" style="height:100%" />
-          <video class="video" :src="showUrl" controls="controls" v-else style="width:100%">
-            您的浏览器不支持 video 标签。
-          </video>
         </div>
         <div style="flex:3;padding:10px;box-sizing:border-box;">
           <a-form v-if="detail" class="detail">
-            <a-form-item label="素材id" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
-              {{ detail.parameter.materialId }}
-            </a-form-item>
-            <a-form-item
-              label="视频时长"
-              :label-col="{ span: 6 }"
-              :wrapper-col="{ span: 18 }"
-              v-if="activeKey == 'video'"
-            >
-              {{ detail.parameter.second }}秒
-            </a-form-item>
             <a-form-item label="尺寸" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
               {{ detail.parameter.width }}*{{ detail.parameter.height }}
             </a-form-item>
             <a-form-item label="大小" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }">
               {{ detail.parameter.size }}
             </a-form-item>
-            <a-form-item label="策划" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" v-if="activeKey == 'video'">
-              {{ detail.ascription.planName }}
-            </a-form-item>
-            <a-form-item label="拍摄" :label-col="{ span: 6 }" :wrapper-col="{ span: 18 }" v-if="activeKey == 'video'">
-              {{ detail.ascription.shotName }}
-            </a-form-item>
             <a-form-item
               label="剪辑"
               :label-col="{ span: 6 }"
@@ -722,10 +615,6 @@ export default {
       visibleDetail: false,
       activeKey: 'image',
       active: '0',
-      materialList: [
-        { value: 'image', tab: '图片素材' },
-        { value: 'video', tab: '视频素材' }
-      ],
       examinelList: [
         { value: '0', tab: '未审核' },
         { value: '1', tab: '已批准' },
@@ -1119,10 +1008,10 @@ export default {
       })
     },
     close() {
-    //   this.form.resetFields()
-    //   this.urlList = { url: '', md5: '', name: '' }
-    //   this.watermarkUrl = { url: '', md5: '', name: '' }
-    //   this.tags = []
+      //   this.form.resetFields()
+      //   this.urlList = { url: '', md5: '', name: '' }
+      //   this.watermarkUrl = { url: '', md5: '', name: '' }
+      //   this.tags = []
     },
     onChange(date, dateString) {},
     callback(key) {

文件差異過大導致無法顯示
+ 1148 - 0
src/views/modules/material/videoMaterial.vue


+ 232 - 264
src/views/system/QuartzJobList.vue

@@ -1,265 +1,233 @@
-<template>
-  <a-card :bordered="false">
-
-    <!-- 查询区域 -->
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline">
-        <a-row :gutter="24">
-
-          <a-col :md="6" :sm="10">
-            <a-form-item label="任务类名">
-              <a-input placeholder="请输入任务类名" v-model="queryParam.jobClassName"></a-input>
-            </a-form-item>
-          </a-col>
-          <a-col :md="6" :sm="10">
-            <a-form-item label="任务状态">
-              <a-select style="width: 220px" v-model="queryParam.status" placeholder="请选择状态">
-                <a-select-option value="">全部</a-select-option>
-                <a-select-option value="0">正常</a-select-option>
-                <a-select-option value="-1">停止</a-select-option>
-              </a-select>
-            </a-form-item>
-          </a-col>
-
-          <a-col :md="6" :sm="10">
-            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
-              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
-              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
-            </span>
-          </a-col>
-
-        </a-row>
-      </a-form>
-    </div>
-
-    <!-- 操作按钮区域 -->
-    <div class="table-operator">
-      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
-      <a-button type="primary" icon="download" @click="handleExportXls('定时任务信息')">导出</a-button>
-      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl"
-                @change="handleImportExcel">
-        <a-button type="primary" icon="import">导入</a-button>
-      </a-upload>
-      <a-dropdown v-if="selectedRowKeys.length > 0">
-        <a-menu slot="overlay">
-          <a-menu-item key="1" @click="batchDel">
-            <a-icon type="delete"/>
-            删除
-          </a-menu-item>
-        </a-menu>
-        <a-button style="margin-left: 8px"> 批量操作
-          <a-icon type="down"/>
-        </a-button>
-      </a-dropdown>
-    </div>
-
-    <!-- table区域-begin -->
-    <div>
-      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
-        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{
-        selectedRowKeys.length }}</a>项
-        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
-      </div>
-
-      <a-table
-        ref="table"
-        size="middle"
-        bordered
-        rowKey="id"
-        :columns="columns"
-        :dataSource="dataSource"
-        :pagination="ipagination"
-        :loading="loading"
-        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
-        @change="handleTableChange">
-
-        <!-- 字符串超长截取省略号显示-->
-        <span slot="description" slot-scope="text">
-          <j-ellipsis :value="text" :length="25"/>
-        </span>
-
-
-        <span slot="action" slot-scope="text, record">
-          <a @click="resumeJob(record)" v-if="record.status==-1">启动</a>
-          <a @click="pauseJob(record)" v-if="record.status==0">停止</a>
-
-          <a-divider type="vertical"/>
-          <a-dropdown>
-            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
-            <a-menu slot="overlay">
-              <a-menu-item><a @click="handleEdit(record)">编辑</a></a-menu-item>
-              <a-menu-item>
-                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
-                  <a>删除</a>
-                </a-popconfirm>
-              </a-menu-item>
-            </a-menu>
-          </a-dropdown>
-        </span>
-
-        <!-- 状态渲染模板 -->
-        <template slot="customRenderStatus" slot-scope="status">
-          <a-tag v-if="status==0" color="green">已启动</a-tag>
-          <a-tag v-if="status==-1" color="orange">已暂停</a-tag>
-        </template>
-      </a-table>
-    </div>
-    <!-- table区域-end -->
-
-    <!-- 表单区域 -->
-    <quartzJob-modal ref="modalForm" @ok="modalFormOk"></quartzJob-modal>
-  </a-card>
-</template>
-
-<script>
-  import QuartzJobModal from './modules/QuartzJobModal'
-  import {getAction} from '@/api/manage'
-  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
-  import JEllipsis from "@/components/jeecg/JEllipsis";
-
-  export default {
-    name: "QuartzJobList",
-    mixins: [JeecgListMixin],
-    components: {
-      QuartzJobModal,
-      JEllipsis
-    },
-    data() {
-      return {
-        description: '定时任务在线管理',
-        // 查询条件
-        queryParam: {},
-        // 表头
-        columns: [
-          {
-            title: '#',
-            dataIndex: '',
-            key: 'rowIndex',
-            width: 60,
-            align: "center",
-            customRender: function (t, r, index) {
-              return parseInt(index) + 1;
-            }
-          },
-          {
-            title: '任务类名',
-            align: "center",
-            dataIndex: 'jobClassName',
-            sorter: true,
-            /*            customRender:function (text) {
-                          return "*"+text.substring(9,text.length);
-                        }*/
-          },
-          {
-            title: 'cron表达式',
-            align: "center",
-            dataIndex: 'cronExpression'
-          },
-          {
-            title: '参数',
-            align: "center",
-            dataIndex: 'parameter'
-          },
-          {
-            title: '描述',
-            align: "center",
-            width: 300,
-            dataIndex: 'description',
-            scopedSlots: {customRender: 'description'},
-          },
-          {
-            title: '状态',
-            align: "center",
-            dataIndex: 'status',
-            scopedSlots: {customRender: 'customRenderStatus'},
-            filterMultiple: false,
-            filters: [
-              {text: '已启动', value: '0'},
-              {text: '已暂停', value: '-1'},
-            ]
-          },
-          {
-            title: '操作',
-            dataIndex: 'action',
-            align: "center",
-            width: 180,
-            scopedSlots: {customRender: 'action'},
-          }
-        ],
-        url: {
-          list: "/sys/quartzJob/list",
-          delete: "/sys/quartzJob/delete",
-          deleteBatch: "/sys/quartzJob/deleteBatch",
-          pause: "/sys/quartzJob/pause",
-          resume: "/sys/quartzJob/resume",
-          exportXlsUrl: "sys/quartzJob/exportXls",
-          importExcelUrl: "sys/quartzJob/importExcel",
-        },
-      }
-    },
-    computed: {
-      importExcelUrl: function () {
-        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
-      }
-    },
-
-    methods: {
-
-      //筛选需要重写handleTableChange
-      handleTableChange(pagination, filters, sorter) {
-        //分页、排序、筛选变化时触发
-        //TODO 筛选
-        if (Object.keys(sorter).length > 0) {
-          this.isorter.column = sorter.field;
-          this.isorter.order = "ascend" == sorter.order ? "asc" : "desc"
-        }
-        //这种筛选方式只支持单选
-        this.filters.status = filters.status[0];
-        this.ipagination = pagination;
-        this.loadData();
-      },
-      pauseJob: function (record) {
-        var that = this;
-        //暂停定时任务
-        this.$confirm({
-          title: "确认暂停",
-          content: "是否暂停选中任务?",
-          onOk: function () {
-            getAction(that.url.pause, {jobClassName: record.jobClassName}).then((res) => {
-              if (res.success) {
-                that.$message.success(res.message);
-                that.loadData();
-                that.onClearSelected();
-              } else {
-                that.$message.warning(res.message);
-              }
-            });
-          }
-        });
-
-      },
-      resumeJob: function (record) {
-        var that = this;
-        //恢复定时任务
-        this.$confirm({
-          title: "确认启动",
-          content: "是否启动选中任务?",
-          onOk: function () {
-            getAction(that.url.resume, {jobClassName: record.jobClassName}).then((res) => {
-              if (res.success) {
-                that.$message.success(res.message);
-                that.loadData();
-                that.onClearSelected();
-              } else {
-                that.$message.warning(res.message);
-              }
-            });
-          }
-        });
-      },
-    }
-  }
-</script>
-<style scoped>
-  @import '~@assets/less/common.less'
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="10">
+            <a-form-item label="任务类名">
+              <a-input placeholder="请输入任务类名" v-model="queryParam.jobClassName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="6" :sm="10">
+            <a-form-item label="任务状态">
+              <a-select style="width: 220px" v-model="queryParam.status" placeholder="请选择状态">
+                <a-select-option value="">全部</a-select-option>
+                <a-select-option value="0">正常</a-select-option>
+                <a-select-option value="-1">停止</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="6" :sm="10">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        @change="handleTableChange">
+
+        <!-- 字符串超长截取省略号显示-->
+        <span slot="description" slot-scope="text">
+          <j-ellipsis :value="text" :length="25"/>
+        </span>
+
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="resumeJob(record)" v-if="record.status==-1">启动</a>
+          <a @click="pauseJob(record)" v-if="record.status==0">停止</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">更多 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item><a @click="handleEdit(record)">编辑</a></a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+        <!-- 状态渲染模板 -->
+        <template slot="customRenderStatus" slot-scope="status">
+          <a-tag v-if="status==0" color="green">已启动</a-tag>
+          <a-tag v-if="status==-1" color="orange">已暂停</a-tag>
+        </template>
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <quartzJob-modal ref="modalForm" @ok="modalFormOk"></quartzJob-modal>
+  </a-card>
+</template>
+
+<script>
+  import QuartzJobModal from './modules/QuartzJobModal'
+  import {getAction} from '@/api/manage'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+  import JEllipsis from "@/components/jeecg/JEllipsis";
+
+  export default {
+    name: "QuartzJobList",
+    mixins: [JeecgListMixin],
+    components: {
+      QuartzJobModal,
+      JEllipsis
+    },
+    data() {
+      return {
+        description: '定时任务在线管理',
+        // 查询条件
+        queryParam: {},
+        // 表头
+        columns: [
+          {
+            title: '任务类名',
+            align: "center",
+            dataIndex: 'jobClassName',
+            sorter: true,
+            /*            customRender:function (text) {
+                          return "*"+text.substring(9,text.length);
+                        }*/
+          },
+          {
+            title: 'cron表达式',
+            align: "center",
+            dataIndex: 'cronExpression'
+          },
+          {
+            title: '参数',
+            align: "center",
+            dataIndex: 'parameter'
+          },
+          {
+            title: '描述',
+            align: "center",
+            width: 300,
+            dataIndex: 'description',
+            scopedSlots: {customRender: 'description'},
+          },
+          {
+            title: '状态',
+            align: "center",
+            dataIndex: 'status',
+            scopedSlots: {customRender: 'customRenderStatus'},
+            filterMultiple: false,
+            filters: [
+              {text: '已启动', value: '0'},
+              {text: '已暂停', value: '-1'},
+            ]
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align: "center",
+            width: 180,
+            scopedSlots: {customRender: 'action'},
+          }
+        ],
+        url: {
+          list: "/sys/quartzJob/list",
+          delete: "/sys/quartzJob/delete",
+          deleteBatch: "/sys/quartzJob/deleteBatch",
+          pause: "/sys/quartzJob/pause",
+          resume: "/sys/quartzJob/resume",
+          exportXlsUrl: "sys/quartzJob/exportXls",
+          importExcelUrl: "sys/quartzJob/importExcel",
+        },
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+
+    methods: {
+
+      //筛选需要重写handleTableChange
+      handleTableChange(pagination, filters, sorter) {
+        //分页、排序、筛选变化时触发
+        //TODO 筛选
+        console.log(filters)
+        if (Object.keys(sorter).length > 0) {
+          this.isorter.column = sorter.field;
+          this.isorter.order = "ascend" == sorter.order ? "asc" : "desc"
+        }
+        //这种筛选方式只支持单选
+        this.ipagination = pagination;
+        this.loadData();
+      },
+      pauseJob: function (record) {
+        var that = this;
+        //暂停定时任务
+        this.$confirm({
+          title: "确认暂停",
+          content: "是否暂停选中任务?",
+          onOk: function () {
+            getAction(that.url.pause, {jobClassName: record.jobClassName}).then((res) => {
+              if (res.success) {
+                that.$message.success(res.message);
+                that.loadData();
+                that.onClearSelected();
+              } else {
+                that.$message.warning(res.message);
+              }
+            });
+          }
+        });
+
+      },
+      resumeJob: function (record) {
+        var that = this;
+        //恢复定时任务
+        this.$confirm({
+          title: "确认启动",
+          content: "是否启动选中任务?",
+          onOk: function () {
+            getAction(that.url.resume, {jobClassName: record.jobClassName}).then((res) => {
+              if (res.success) {
+                that.$message.success(res.message);
+                that.loadData();
+                that.onClearSelected();
+              } else {
+                that.$message.warning(res.message);
+              }
+            });
+          }
+        });
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
 </style>

+ 185 - 200
src/views/system/RoleList.vue

@@ -1,201 +1,186 @@
-<template>
-  <a-card :bordered="false" class="card-area">
-
-    <!-- 查询区域 -->
-    <div class="table-page-search-wrapper">
-      <!-- 搜索区域 -->
-      <a-form layout="inline">
-        <a-row :gutter="24">
-          <a-col :md="6" :sm="8">
-            <a-form-item label="名称" :labelCol="{span: 5}" :wrapperCol="{span: 18, offset: 1}">
-              <a-input placeholder="请输入名称查询" v-model="queryParam.roleName"></a-input>
-            </a-form-item>
-          </a-col>
-          <a-col :md="10" :sm="12">
-            <a-form-item label="创建时间" :labelCol="{span: 5}" :wrapperCol="{span: 18, offset: 1}">
-              <j-date v-model="queryParam.createTime_begin" :showTime="true" date-format="YYYY-MM-DD HH:mm:ss"
-                      style="width:45%" placeholder="请选择开始时间"></j-date>
-              <span style="width: 10px;">~</span>
-              <j-date v-model="queryParam.createTime_end" :showTime="true" date-format="YYYY-MM-DD HH:mm:ss"
-                      style="width:45%" placeholder="请选择结束时间"></j-date>
-            </a-form-item>
-          </a-col>
-          <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
-            <a-col :md="6" :sm="24">
-              <a-button type="primary" @click="searchQuery">查询</a-button>
-              <a-button style="margin-left: 8px" @click="searchReset">重置</a-button>
-            </a-col>
-          </span>
-        </a-row>
-      </a-form>
-    </div>
-
-    <!-- 操作按钮区域 -->
-    <div class="table-operator" style="margin-top: 5px">
-      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
-      <a-button type="primary" icon="download" @click="handleExportXls('角色信息')">导出</a-button>
-      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl"
-                @change="handleImportExcel">
-        <a-button type="primary" icon="import">导入</a-button>
-      </a-upload>
-
-      <a-dropdown v-if="selectedRowKeys.length > 0">
-        <a-menu slot="overlay">
-          <a-menu-item key="1" @click="batchDel">
-            <a-icon type="delete"/>
-            删除
-          </a-menu-item>
-        </a-menu>
-        <a-button style="margin-left: 8px">
-          批量操作
-          <a-icon type="down"/>
-        </a-button>
-      </a-dropdown>
-    </div>
-
-    <!-- table区域-begin -->
-    <div>
-      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
-        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择&nbsp;<a style="font-weight: 600">{{
-        selectedRowKeys.length }}</a>项&nbsp;&nbsp;
-        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
-      </div>
-
-      <a-table
-        ref="table"
-        size="middle"
-        bordered
-        rowKey="id"
-        :columns="columns"
-        :dataSource="dataSource"
-        :pagination="ipagination"
-        :loading="loading"
-        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
-        @change="handleTableChange">
-
-        <span slot="action" slot-scope="text, record">
-          <a @click="handleEdit(record)">编辑</a>
-
-          <a-divider type="vertical"/>
-          <a-dropdown>
-            <a class="ant-dropdown-link">
-              更多 <a-icon type="down"/>
-            </a>
-            <a-menu slot="overlay">
-              <a-menu-item>
-                <a @click="handlePerssion(record.id)">授权</a>
-              </a-menu-item>
-              <a-menu-item>
-                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
-                  <a>删除</a>
-                </a-popconfirm>
-              </a-menu-item>
-            </a-menu>
-          </a-dropdown>
-        </span>
-
-
-      </a-table>
-    </div>
-    <!-- table区域-end -->
-
-    <!-- 表单区域 -->
-    <role-modal ref="modalForm" @ok="modalFormOk"></role-modal>
-    <user-role-modal ref="modalUserRole"></user-role-modal>
-  </a-card>
-</template>
-
-<script>
-  import RoleModal from './modules/RoleModal'
-  import UserRoleModal from './modules/UserRoleModal'
-  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
-  import JDate from '@/components/jeecg/JDate'
-
-  export default {
-    name: "RoleList",
-    mixins: [JeecgListMixin],
-    components: {
-      RoleModal,
-      UserRoleModal,
-      JDate
-    },
-    data() {
-      return {
-
-        description: '角色管理页面',
-        // 查询条件
-        queryParam: {roleName: '',},
-        // 表头
-        columns: [
-          {
-            title: '#',
-            dataIndex: '',
-            key: 'rowIndex',
-            width: 60,
-            align: "center",
-            customRender: function (t, r, index) {
-              return parseInt(index) + 1;
-            }
-          },
-          {
-            title: '角色名称',
-            align: "center",
-            dataIndex: 'roleName'
-          },
-          {
-            title: '角色编码',
-            align: "center",
-            dataIndex: 'roleCode'
-          },
-          {
-            title: '备注',
-            align: "center",
-            dataIndex: 'description'
-          },
-          {
-            title: '创建时间',
-            dataIndex: 'createTime',
-            align: "center",
-            sorter: true
-          },
-          {
-            title: '更新时间',
-            dataIndex: 'updateTime',
-            align: "center",
-            sorter: true
-          },
-          {
-            title: '操作',
-            dataIndex: 'action',
-            align: "center",
-            scopedSlots: {customRender: 'action'},
-          }
-        ],
-        url: {
-          list: "/sys/role/list",
-          delete: "/sys/role/delete",
-          deleteBatch: "/sys/role/deleteBatch",
-          exportXlsUrl: "/sys/role/exportXls",
-          importExcelUrl: "sys/role/importExcel",
-        },
-      }
-    },
-    computed: {
-      importExcelUrl: function () {
-        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
-      }
-    },
-    methods: {
-      handlePerssion: function (roleId) {
-        // alert(roleId);
-        this.$refs.modalUserRole.show(roleId);
-      },
-      onChangeDate(date, dateString) {
-        console.log(date, dateString);
-      },
-    }
-  }
-</script>
-<style scoped>
-  @import '~@assets/less/common.less'
+<template>
+  <a-card :bordered="false" class="card-area">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <!-- 搜索区域 -->
+      <a-form layout="inline">
+        <a-row :gutter="24">
+          <a-col :md="6" :sm="8">
+            <a-form-item label="名称" :labelCol="{span: 5}" :wrapperCol="{span: 18, offset: 1}">
+              <a-input placeholder="请输入名称查询" v-model="queryParam.roleName"></a-input>
+            </a-form-item>
+          </a-col>
+          <a-col :md="10" :sm="12">
+            <a-form-item label="创建时间" :labelCol="{span: 5}" :wrapperCol="{span: 18, offset: 1}">
+              <j-date v-model="queryParam.createTime_begin" :showTime="true" date-format="YYYY-MM-DD HH:mm:ss"
+                      style="width:45%" placeholder="请选择开始时间"></j-date>
+              <span style="width: 10px;">~</span>
+              <j-date v-model="queryParam.createTime_end" :showTime="true" date-format="YYYY-MM-DD HH:mm:ss"
+                      style="width:45%" placeholder="请选择结束时间"></j-date>
+            </a-form-item>
+          </a-col>
+          <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+            <a-col :md="6" :sm="24">
+              <a-button type="primary" @click="searchQuery">查询</a-button>
+              <a-button style="margin-left: 8px" @click="searchReset">重置</a-button>
+            </a-col>
+          </span>
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator" style="margin-top: 5px">
+      <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>
+
+      <a-dropdown v-if="selectedRowKeys.length > 0">
+        <a-menu slot="overlay">
+          <a-menu-item key="1" @click="batchDel">
+            <a-icon type="delete"/>
+            删除
+          </a-menu-item>
+        </a-menu>
+        <a-button style="margin-left: 8px">
+          批量操作
+          <a-icon type="down"/>
+        </a-button>
+      </a-dropdown>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
+        <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择&nbsp;<a style="font-weight: 600">{{
+        selectedRowKeys.length }}</a>项&nbsp;&nbsp;
+        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
+      </div>
+
+      <a-table
+        ref="table"
+        size="middle"
+        bordered
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+        @change="handleTableChange">
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+
+          <a-divider type="vertical"/>
+          <a-dropdown>
+            <a class="ant-dropdown-link">
+              更多 <a-icon type="down"/>
+            </a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a @click="handlePerssion(record.id)">授权</a>
+              </a-menu-item>
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <!-- 表单区域 -->
+    <role-modal ref="modalForm" @ok="modalFormOk"></role-modal>
+    <user-role-modal ref="modalUserRole"></user-role-modal>
+  </a-card>
+</template>
+
+<script>
+  import RoleModal from './modules/RoleModal'
+  import UserRoleModal from './modules/UserRoleModal'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+  import JDate from '@/components/jeecg/JDate'
+
+  export default {
+    name: "RoleList",
+    mixins: [JeecgListMixin],
+    components: {
+      RoleModal,
+      UserRoleModal,
+      JDate
+    },
+    data() {
+      return {
+
+        description: '角色管理页面',
+        // 查询条件
+        queryParam: {roleName: '',},
+        // 表头
+        columns: [
+          {
+            title: '角色名称',
+            align: "center",
+            dataIndex: 'roleName'
+          },
+          {
+            title: '角色编码',
+            align: "center",
+            dataIndex: 'roleCode'
+          },
+          {
+            title: '备注',
+            align: "center",
+            dataIndex: 'description'
+          },
+          {
+            title: '创建时间',
+            dataIndex: 'createTime',
+            align: "center",
+            sorter: true
+          },
+          {
+            title: '更新时间',
+            dataIndex: 'updateTime',
+            align: "center",
+            sorter: true
+          },
+          {
+            title: '操作',
+            dataIndex: 'action',
+            align: "center",
+            scopedSlots: {customRender: 'action'},
+          }
+        ],
+        url: {
+          list: "/sys/role/list",
+          delete: "/sys/role/delete",
+          deleteBatch: "/sys/role/deleteBatch",
+          exportXlsUrl: "/sys/role/exportXls",
+          importExcelUrl: "sys/role/importExcel",
+        },
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      handlePerssion: function (roleId) {
+        // alert(roleId);
+        this.$refs.modalUserRole.show(roleId);
+      },
+      onChangeDate(date, dateString) {
+        console.log(date, dateString);
+      },
+    }
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
 </style>

+ 321 - 357
src/views/system/UserList.vue

@@ -1,358 +1,322 @@
-<template>
-  <a-card :bordered="false">
-
-    <!-- 查询区域 -->
-    <div class="table-page-search-wrapper">
-      <a-form layout="inline">
-        <a-row :gutter="24">
-
-          <a-col :md="6" :sm="12">
-            <a-form-item label="账号">
-              <a-input placeholder="请输入账号查询" v-model="queryParam.username"></a-input>
-            </a-form-item>
-          </a-col>
-
-          <a-col :md="6" :sm="8">
-            <a-form-item label="性别">
-              <a-select v-model="queryParam.sex" placeholder="请选择性别查询">
-                <a-select-option value="">请选择性别查询</a-select-option>
-                <a-select-option value="1">男性</a-select-option>
-                <a-select-option value="2">女性</a-select-option>
-              </a-select>
-            </a-form-item>
-          </a-col>
-
-
-          <template v-if="toggleSearchStatus">
-            <a-col :md="6" :sm="8">
-              <a-form-item label="邮箱">
-                <a-input placeholder="请输入邮箱查询" v-model="queryParam.email"></a-input>
-              </a-form-item>
-            </a-col>
-
-            <a-col :md="6" :sm="8">
-              <a-form-item label="手机号码">
-                <a-input placeholder="请输入手机号码查询" v-model="queryParam.phone"></a-input>
-              </a-form-item>
-            </a-col>
-
-            <a-col :md="6" :sm="8">
-              <a-form-item label="状态">
-                <a-select v-model="queryParam.status" placeholder="请选择用户状态查询">
-                  <a-select-option value="">请选择用户状态</a-select-option>
-                  <a-select-option value="1">正常</a-select-option>
-                  <a-select-option value="2">解冻</a-select-option>
-                </a-select>
-              </a-form-item>
-            </a-col>
-          </template>
-
-          <a-col :md="6" :sm="8">
-            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
-              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
-              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
-              <a @click="handleToggleSearch" style="margin-left: 8px">
-                {{ toggleSearchStatus ? '收起' : '展开' }}
-                <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/>
-              </a>
-            </span>
-          </a-col>
-
-        </a-row>
-      </a-form>
-    </div>
-
-    <!-- 操作按钮区域 -->
-    <div class="table-operator" style="border-top: 5px">
-      <a-button @click="handleAdd" v-has="'user:add'" type="primary" icon="plus">添加用户</a-button>
-      <a-button type="primary" icon="download" @click="handleExportXls('用户信息')">导出</a-button>
-      <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl"
-                @change="handleImportExcel">
-        <a-button type="primary" icon="import">导入</a-button>
-      </a-upload>
-      <a-dropdown v-if="selectedRowKeys.length > 0">
-        <a-menu slot="overlay" @click="handleMenuClick">
-          <a-menu-item key="1">
-            <a-icon type="delete" @click="batchDel"/>
-            删除
-          </a-menu-item>
-          <a-menu-item key="2">
-            <a-icon type="lock" @click="batchFrozen('2')"/>
-            冻结
-          </a-menu-item>
-          <a-menu-item key="3">
-            <a-icon type="unlock" @click="batchFrozen('1')"/>
-            解冻
-          </a-menu-item>
-        </a-menu>
-        <a-button style="margin-left: 8px">
-          批量操作
-          <a-icon type="down"/>
-        </a-button>
-      </a-dropdown>
-    </div>
-
-    <!-- table区域-begin -->
-    <div>
-      <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
-        <i class="anticon anticon-info-circle ant-alert-icon"></i>已选择&nbsp;<a style="font-weight: 600">{{
-        selectedRowKeys.length }}</a>项&nbsp;&nbsp;
-        <a style="margin-left: 24px" @click="onClearSelected">清空</a>
-      </div>
-
-      <a-table
-        ref="table"
-        bordered
-        size="middle"
-        rowKey="id"
-        :columns="columns"
-        :dataSource="dataSource"
-        :pagination="ipagination"
-        :loading="loading"
-        :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
-        @change="handleTableChange">
-
-        <template slot="avatarslot" slot-scope="text, record, index">
-          <div class="anty-img-wrap">
-            <a-avatar shape="square" :src="getAvatarView(record.avatar)" icon="user"/>
-          </div>
-        </template>
-
-        <span slot="action" slot-scope="text, record">
-          <a @click="handleEdit(record)">编辑</a>
-          <a-divider type="vertical"/>
-
-          <a-dropdown>
-            <a class="ant-dropdown-link">
-              更多 <a-icon type="down"/>
-            </a>
-            <a-menu slot="overlay">
-              <a-menu-item>
-                <a href="javascript:;" @click="handleDetail(record)">详情</a>
-              </a-menu-item>
-
-              <a-menu-item>
-                <a href="javascript:;" @click="handleChangePassword(record.username)">密码</a>
-              </a-menu-item>
-
-              <a-menu-item>
-                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
-                  <a>删除</a>
-                </a-popconfirm>
-              </a-menu-item>
-
-              <a-menu-item v-if="record.status==1">
-                <a-popconfirm title="确定冻结吗?" @confirm="() => handleFrozen(record.id,2)">
-                  <a>冻结</a>
-                </a-popconfirm>
-              </a-menu-item>
-
-              <a-menu-item v-if="record.status==2">
-                <a-popconfirm title="确定解冻吗?" @confirm="() => handleFrozen(record.id,1)">
-                  <a>解冻</a>
-                </a-popconfirm>
-              </a-menu-item>
-
-              <a-menu-item>
-                <a href="javascript:;" @click="handleAgentSettings(record.username)">代理人</a>
-              </a-menu-item>
-
-            </a-menu>
-          </a-dropdown>
-        </span>
-
-
-      </a-table>
-    </div>
-    <!-- table区域-end -->
-
-    <user-modal ref="modalForm" @ok="modalFormOk"></user-modal>
-
-    <password-modal ref="passwordmodal" @ok="passwordModalOk"></password-modal>
-
-    <sys-user-agent-modal ref="sysUserAgentModal"></sys-user-agent-modal>
-  </a-card>
-</template>
-
-<script>
-  import UserModal from './modules/UserModal'
-  import PasswordModal from './modules/PasswordModal'
-  import {putAction} from '@/api/manage';
-  import {frozenBatch} from '@/api/api'
-  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
-  import SysUserAgentModal from "./modules/SysUserAgentModal";
-
-  export default {
-    name: "UserList",
-    mixins: [JeecgListMixin],
-    components: {
-      SysUserAgentModal,
-      UserModal,
-      PasswordModal
-    },
-    data() {
-      return {
-        description: '这是用户管理页面',
-        queryParam: {},
-        columns: [
-          /*{
-            title: '#',
-            dataIndex: '',
-            key:'rowIndex',
-            width:60,
-            align:"center",
-            customRender:function (t,r,index) {
-              return parseInt(index)+1;
-            }
-          },*/
-          {
-            title: '用户账号',
-            align: "center",
-            dataIndex: 'username',
-            width: 120
-          },
-          {
-            title: '真实姓名',
-            align: "center",
-            width: 100,
-            dataIndex: 'realname',
-          },
-          {
-            title: '头像',
-            align: "center",
-            width: 120,
-            dataIndex: 'avatar',
-            scopedSlots: {customRender: "avatarslot"}
-          },
-
-          {
-            title: '性别',
-            align: "center",
-            width: 80,
-            dataIndex: 'sex_dictText',
-            sorter: true
-          },
-          {
-            title: '生日',
-            align: "center",
-            width: 180,
-            dataIndex: 'birthday'
-          },
-          {
-            title: '手机号码',
-            align: "center",
-            width: 100,
-            dataIndex: 'phone'
-          },
-          {
-            title: '邮箱',
-            align: "center",
-            dataIndex: 'email'
-          },
-          {
-            title: '状态',
-            align: "center",
-            width: 80,
-            dataIndex: 'status_dictText'
-          },
-          /* {
-             title: '创建时间',
-             align: "center",
-             width: 150,
-             dataIndex: 'createTime',
-             sorter: true
-           },*/
-          {
-            title: '操作',
-            dataIndex: 'action',
-            scopedSlots: {customRender: 'action'},
-            align: "center",
-            width: 170
-          }
-
-        ],
-        url: {
-          imgerver: window._CONFIG['domianURL'] + "/sys/common/view",
-          syncUser: "/process/extActProcess/doSyncUser",
-          list: "/sys/user/list",
-          delete: "/sys/user/delete",
-          deleteBatch: "/sys/user/deleteBatch",
-          exportXlsUrl: "/sys/user/exportXls",
-          importExcelUrl: "sys/user/importExcel",
-        },
-      }
-    },
-    computed: {
-      importExcelUrl: function () {
-        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
-      }
-    },
-    methods: {
-      getAvatarView: function (avatar) {
-        return this.url.imgerver + "/" + avatar;
-      },
-
-      batchFrozen: function (status) {
-        if (this.selectedRowKeys.length <= 0) {
-          this.$message.warning('请选择一条记录!');
-          return false;
-        } else {
-          let ids = "";
-          let that = this;
-          that.selectedRowKeys.forEach(function (val) {
-            ids += val + ",";
-          });
-          that.$confirm({
-            title: "确认操作",
-            content: "是否" + (status == 1 ? "解冻" : "冻结") + "选中账号?",
-            onOk: function () {
-              frozenBatch({ids: ids, status: status}).then((res) => {
-                if (res.success) {
-                  that.$message.success(res.message);
-                  that.loadData();
-                  that.onClearSelected();
-                } else {
-                  that.$message.warning(res.message);
-                }
-              });
-            }
-          });
-        }
-      },
-      handleMenuClick(e) {
-        if (e.key == 1) {
-          this.batchDel();
-        } else if (e.key == 2) {
-          this.batchFrozen(2);
-        } else if (e.key == 3) {
-          this.batchFrozen(1);
-        }
-      },
-      handleFrozen: function (id, status) {
-        let that = this;
-        frozenBatch({ids: id, status: status}).then((res) => {
-          if (res.success) {
-            that.$message.success(res.message);
-            that.loadData();
-          } else {
-            that.$message.warning(res.message);
-          }
-        });
-      },
-      handleChangePassword(username) {
-        this.$refs.passwordmodal.show(username);
-      },
-      handleAgentSettings(username) {
-        this.$refs.sysUserAgentModal.agentSettings(username);
-        this.$refs.sysUserAgentModal.title = "用户代理人设置";
-      },
-      passwordModalOk() {
-        //TODO 密码修改完成 不需要刷新页面,可以把datasource中的数据更新一下
-      }
-    }
-
-  }
-</script>
-<style scoped>
-  @import '~@assets/less/common.less'
+<template>
+  <a-card :bordered="false">
+
+    <!-- 查询区域 -->
+    <div class="table-page-search-wrapper">
+      <a-form layout="inline">
+        <a-row :gutter="24">
+
+          <a-col :md="6" :sm="12">
+            <a-form-item label="账号">
+              <a-input placeholder="请输入账号查询" v-model="queryParam.username"></a-input>
+            </a-form-item>
+          </a-col>
+
+          <a-col :md="6" :sm="8">
+            <a-form-item label="性别">
+              <a-select v-model="queryParam.sex" placeholder="请选择性别查询">
+                <a-select-option value="">请选择性别查询</a-select-option>
+                <a-select-option value="1">男性</a-select-option>
+                <a-select-option value="2">女性</a-select-option>
+              </a-select>
+            </a-form-item>
+          </a-col>
+
+
+
+            <a-col :md="6" :sm="8">
+              <a-form-item label="邮箱">
+                <a-input placeholder="请输入邮箱查询" v-model="queryParam.email"></a-input>
+              </a-form-item>
+            </a-col>
+
+            <a-col :md="6" :sm="8">
+              <a-form-item label="手机号码">
+                <a-input placeholder="请输入手机号码查询" v-model="queryParam.phone"></a-input>
+              </a-form-item>
+            </a-col>
+
+            <a-col :md="6" :sm="8">
+              <a-form-item label="状态">
+                <a-select v-model="queryParam.status" placeholder="请选择用户状态查询">
+                  <a-select-option value="">请选择用户状态</a-select-option>
+                  <a-select-option value="1">正常</a-select-option>
+                  <a-select-option value="2">解冻</a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+
+          <a-col :md="6" :sm="8">
+            <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
+              <a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
+              <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
+            </span>
+          </a-col>
+
+        </a-row>
+      </a-form>
+    </div>
+
+    <!-- 操作按钮区域 -->
+    <div class="table-operator" style="border-top: 5px">
+      <a-button @click="handleAdd" v-has="'user:add'" type="primary" icon="plus">添加用户</a-button>
+    </div>
+
+    <!-- table区域-begin -->
+    <div>
+
+      <a-table
+        ref="table"
+        bordered
+        size="middle"
+        rowKey="id"
+        :columns="columns"
+        :dataSource="dataSource"
+        :pagination="ipagination"
+        :loading="loading"
+        @change="handleTableChange">
+
+        <template slot="avatarslot" slot-scope="text, record">
+          <div class="anty-img-wrap">
+            <a-avatar shape="square" :src="getAvatarView(record.avatar)" icon="user"/>
+          </div>
+        </template>
+
+        <span slot="action" slot-scope="text, record">
+          <a @click="handleEdit(record)">编辑</a>
+          <a-divider type="vertical"/>
+
+          <a-dropdown>
+            <a class="ant-dropdown-link">
+              更多 <a-icon type="down"/>
+            </a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a href="javascript:;" @click="handleDetail(record)">详情</a>
+              </a-menu-item>
+
+              <a-menu-item>
+                <a href="javascript:;" @click="handleChangePassword(record.username)">密码</a>
+              </a-menu-item>
+
+              <a-menu-item>
+                <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
+                  <a>删除</a>
+                </a-popconfirm>
+              </a-menu-item>
+
+              <a-menu-item v-if="record.status==1">
+                <a-popconfirm title="确定冻结吗?" @confirm="() => handleFrozen(record.id,2)">
+                  <a>冻结</a>
+                </a-popconfirm>
+              </a-menu-item>
+
+              <a-menu-item v-if="record.status==2">
+                <a-popconfirm title="确定解冻吗?" @confirm="() => handleFrozen(record.id,1)">
+                  <a>解冻</a>
+                </a-popconfirm>
+              </a-menu-item>
+
+              <a-menu-item>
+                <a href="javascript:;" @click="handleAgentSettings(record.username)">代理人</a>
+              </a-menu-item>
+
+            </a-menu>
+          </a-dropdown>
+        </span>
+
+
+      </a-table>
+    </div>
+    <!-- table区域-end -->
+
+    <user-modal ref="modalForm" @ok="modalFormOk"></user-modal>
+
+    <password-modal ref="passwordmodal" @ok="passwordModalOk"></password-modal>
+
+    <sys-user-agent-modal ref="sysUserAgentModal"></sys-user-agent-modal>
+  </a-card>
+</template>
+
+<script>
+  import UserModal from './modules/UserModal'
+  import PasswordModal from './modules/PasswordModal'
+  import {putAction} from '@/api/manage';
+  import {frozenBatch} from '@/api/api'
+  import {JeecgListMixin} from '@/mixins/JeecgListMixin'
+  import SysUserAgentModal from "./modules/SysUserAgentModal";
+
+  export default {
+    name: "UserList",
+    mixins: [JeecgListMixin],
+    components: {
+      SysUserAgentModal,
+      UserModal,
+      PasswordModal
+    },
+    data() {
+      return {
+        description: '这是用户管理页面',
+        queryParam: {},
+        columns: [
+          /*{
+            title: '#',
+            dataIndex: '',
+            key:'rowIndex',
+            width:60,
+            align:"center",
+            customRender:function (t,r,index) {
+              return parseInt(index)+1;
+            }
+          },*/
+          {
+            title: '用户账号',
+            align: "center",
+            dataIndex: 'username',
+            width: 120
+          },
+          {
+            title: '真实姓名',
+            align: "center",
+            width: 100,
+            dataIndex: 'realname',
+          },
+          {
+            title: '头像',
+            align: "center",
+            width: 120,
+            dataIndex: 'avatar',
+            scopedSlots: {customRender: "avatarslot"}
+          },
+
+          {
+            title: '性别',
+            align: "center",
+            width: 80,
+            dataIndex: 'sex_dictText',
+            sorter: true
+          },
+          {
+            title: '生日',
+            align: "center",
+            width: 180,
+            dataIndex: 'birthday'
+          },
+          {
+            title: '手机号码',
+            align: "center",
+            width: 100,
+            dataIndex: 'phone'
+          },
+          {
+            title: '邮箱',
+            align: "center",
+            dataIndex: 'email'
+          },
+          {
+            title: '状态',
+            align: "center",
+            width: 80,
+            dataIndex: 'status_dictText'
+          },
+          /* {
+             title: '创建时间',
+             align: "center",
+             width: 150,
+             dataIndex: 'createTime',
+             sorter: true
+           },*/
+          {
+            title: '操作',
+            dataIndex: 'action',
+            scopedSlots: {customRender: 'action'},
+            align: "center",
+            width: 170
+          }
+
+        ],
+        url: {
+          imgerver: window._CONFIG['domianURL'] + "/sys/common/view",
+          syncUser: "/process/extActProcess/doSyncUser",
+          list: "/sys/user/list",
+          delete: "/sys/user/delete",
+          deleteBatch: "/sys/user/deleteBatch",
+          exportXlsUrl: "/sys/user/exportXls",
+          importExcelUrl: "sys/user/importExcel",
+        },
+      }
+    },
+    computed: {
+      importExcelUrl: function () {
+        return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
+      }
+    },
+    methods: {
+      getAvatarView: function (avatar) {
+        return this.url.imgerver + "/" + avatar;
+      },
+
+      batchFrozen: function (status) {
+        if (this.selectedRowKeys.length <= 0) {
+          this.$message.warning('请选择一条记录!');
+          return false;
+        } else {
+          let ids = "";
+          let that = this;
+          that.selectedRowKeys.forEach(function (val) {
+            ids += val + ",";
+          });
+          that.$confirm({
+            title: "确认操作",
+            content: "是否" + (status == 1 ? "解冻" : "冻结") + "选中账号?",
+            onOk: function () {
+              frozenBatch({ids: ids, status: status}).then((res) => {
+                if (res.success) {
+                  that.$message.success(res.message);
+                  that.loadData();
+                  that.onClearSelected();
+                } else {
+                  that.$message.warning(res.message);
+                }
+              });
+            }
+          });
+        }
+      },
+      handleMenuClick(e) {
+        if (e.key == 1) {
+          this.batchDel();
+        } else if (e.key == 2) {
+          this.batchFrozen(2);
+        } else if (e.key == 3) {
+          this.batchFrozen(1);
+        }
+      },
+      handleFrozen: function (id, status) {
+        let that = this;
+        frozenBatch({ids: id, status: status}).then((res) => {
+          if (res.success) {
+            that.$message.success(res.message);
+            that.loadData();
+          } else {
+            that.$message.warning(res.message);
+          }
+        });
+      },
+      handleChangePassword(username) {
+        this.$refs.passwordmodal.show(username);
+      },
+      handleAgentSettings(username) {
+        this.$refs.sysUserAgentModal.agentSettings(username);
+        this.$refs.sysUserAgentModal.title = "用户代理人设置";
+      },
+      passwordModalOk() {
+        //TODO 密码修改完成 不需要刷新页面,可以把datasource中的数据更新一下
+      }
+    }
+
+  }
+</script>
+<style scoped>
+  @import '~@assets/less/common.less'
 </style>

+ 7 - 3
src/views/system/modules/UserModal.vue

@@ -40,6 +40,11 @@
         <a-form-item label="用户名字" :labelCol="labelCol" :wrapperCol="wrapperCol">
           <a-input placeholder="请输入用户名称" v-decorator="[ 'realname', validatorRules.realname]"/>
         </a-form-item>
+
+        <a-form-item label="邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol">
+          <a-input placeholder="请输入邮箱" v-decorator="[ 'email', validatorRules.email]"/>
+        </a-form-item>
+        
         <a-form-item label="角色分配" :labelCol="labelCol" :wrapperCol="wrapperCol" v-show="!roleDisabled">
           <a-select
             style="width: 100%"
@@ -93,9 +98,7 @@
           </a-select>
         </a-form-item>
 
-        <a-form-item label="邮箱" :labelCol="labelCol" :wrapperCol="wrapperCol">
-          <a-input placeholder="请输入邮箱" v-decorator="[ 'email', validatorRules.email]"/>
-        </a-form-item>
+
 
         <a-form-item label="手机号码" :labelCol="labelCol" :wrapperCol="wrapperCol">
           <a-input placeholder="请输入手机号码" :disabled="isDisabledAuth('user:form:phone')"
@@ -181,6 +184,7 @@
           phone: {rules: [{validator: this.validatePhone}]},
           email: {
             rules: [{
+              required: true,
               validator: this.validateEmail
             }],
           },

文件差異過大導致無法顯示
+ 518 - 515
src/views/user/Login.vue


+ 156 - 156
src/views/user/Step1.vue

@@ -1,157 +1,157 @@
-<template>
-  <div class="main">
-
-    <a-form style="max-width: 500px; margin: 40px auto 0;" :form="form">
-      <a-form-item>
-        <a-input
-          v-decorator="['username',validatorRules.username]"
-          size="large"
-          type="text"
-          autocomplete="false"
-          placeholder="请输入用户名或手机号">
-          <a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }"/>
-        </a-input>
-      </a-form-item>
-      <a-row :gutter="0">
-        <a-col :span="14">
-          <a-form-item>
-            <a-input
-              v-decorator="['inputCode',validatorRules.inputCode]"
-              size="large"
-              type="text"
-              @change="inputCodeChange"
-              placeholder="请输入验证码">
-              <a-icon slot="prefix" v-if=" inputCodeContent==verifiedCode " type="smile"
-                      :style="{ color: 'rgba(0,0,0,.25)' }"/>
-              <a-icon slot="prefix" v-else type="frown" :style="{ color: 'rgba(0,0,0,.25)' }"/>
-            </a-input>
-          </a-form-item>
-        </a-col>
-        <a-col :span="10">
-          <j-graphic-code @success="generateCode" style="float: right"></j-graphic-code>
-        </a-col>
-      </a-row>
-      <a-form-item :wrapperCol="{span: 19, offset: 5}">
-        <a-button type="primary" @click="nextStep">下一步</a-button>
-      </a-form-item>
-    </a-form>
-  </div>
-</template>
-
-<script>
-  import JGraphicCode from '@/components/jeecg/JGraphicCode'
-  import {getAction} from '@/api/manage'
-  import {duplicateCheck} from '@/api/api'
-
-  export default {
-    name: "Step1",
-    components: {
-      JGraphicCode
-    },
-    data() {
-      return {
-        form: this.$form.createForm(this),
-        inputCodeContent: "",
-        inputCodeNull: true,
-        verifiedCode: "",
-        validatorRules: {
-          username: {rules: [{required: false}, {validator: this.validateInputUsername}]},
-          inputCode: {rules: [{required: true, message: '请输入验证码!'}, {validator: this.validateInputCode}]},
-        },
-
-      }
-    },
-    methods: {
-      nextStep() {
-        let that = this
-        this.form.validateFields((err, values) => {
-          if (!err) {
-            var params = {}
-            var reg = /^[1-9]\d*$|^0$/;
-            var username = values.username;
-            if (reg.test(username) == true) {
-              params.phone = username;
-            } else {
-              params.username = username;
-            }
-            getAction("/sys/user/querySysUser", params).then((res) => {
-              if (res.success) {
-                var userList = {
-                  username: res.result.username,
-                  phone: res.result.phone
-                };
-                setTimeout(function () {
-                  that.$emit('nextStep', userList)
-                })
-              }
-            });
-          }
-        })
-
-      },
-      validateInputCode(rule, value, callback) {
-        if (!value || this.verifiedCode == this.inputCodeContent) {
-          callback();
-        } else {
-          callback(new Error("您输入的验证码不正确!"));
-        }
-      },
-      inputCodeChange(e) {
-        this.inputCodeContent = e.target.value;
-        console.log(this.inputCodeContent)
-        if (!e.target.value || 0 == e.target.value) {
-          this.inputCodeNull = true
-        } else {
-          this.inputCodeContent = this.inputCodeContent.toLowerCase()
-          this.inputCodeNull = false
-        }
-      },
-      generateCode(value) {
-        this.verifiedCode = value.toLowerCase();
-        console.log(this.verifiedCode);
-      },
-      validateInputUsername(rule, value, callback) {
-        console.log(value);
-        var reg = /^[0-9]+.?[0-9]*/;
-        if (!value) {
-          callback("请输入用户名和手机号!");
-        }
-
-        if (reg.test(value)) {
-          var params = {
-            tableName: 'sys_user',
-            fieldName: 'phone',
-            fieldVal: value,
-            dataId: null
-          };
-          duplicateCheck(params).then((res) => {
-            if (res.success) {
-              callback("用户名不存在!")
-            } else {
-              callback()
-            }
-          })
-        } else {
-          var params = {
-            tableName: 'sys_user',
-            fieldName: 'username',
-            fieldVal: value,
-            dataId: null
-          };
-          duplicateCheck(params).then((res) => {
-            if (res.success) {
-              callback("用户名不存在!")
-            } else {
-              callback()
-            }
-          })
-        }
-      },
-
-    }
-  }
-</script>
-
-<style scoped>
-
+<template>
+  <div class="main">
+
+    <a-form style="max-width: 500px; margin: 40px auto 0;" :form="form">
+      <a-form-item>
+        <a-input
+          v-decorator="['username',validatorRules.username]"
+          size="large"
+          type="text"
+          autocomplete="false"
+          placeholder="请输入用户名或手机号">
+          <a-icon slot="prefix" type="lock" :style="{ color: 'rgba(0,0,0,.25)' }"/>
+        </a-input>
+      </a-form-item>
+      <a-row :gutter="0">
+        <a-col :span="14">
+          <a-form-item>
+            <a-input
+              v-decorator="['inputCode',validatorRules.inputCode]"
+              size="large"
+              type="text"
+              @change="inputCodeChange"
+              placeholder="请输入验证码">
+              <a-icon slot="prefix" v-if=" inputCodeContent==verifiedCode " type="smile"
+                      :style="{ color: 'rgba(0,0,0,.25)' }"/>
+              <a-icon slot="prefix" v-else type="frown" :style="{ color: 'rgba(0,0,0,.25)' }"/>
+            </a-input>
+          </a-form-item>
+        </a-col>
+        <a-col :span="10">
+          <j-graphic-code @success="generateCode" style="float: right"></j-graphic-code>
+        </a-col>
+      </a-row>
+      <a-form-item :wrapperCol="{span: 19, offset: 5}">
+        <a-button type="primary" @click="nextStep">下一步</a-button>
+      </a-form-item>
+    </a-form>
+  </div>
+</template>
+
+<script>
+  import JGraphicCode from '@/components/jeecg/JGraphicCode'
+  import {getAction} from '@/api/manage'
+  import {duplicateCheck} from '@/api/api'
+
+  export default {
+    name: "Step1",
+    components: {
+      JGraphicCode
+    },
+    data() {
+      return {
+        form: this.$form.createForm(this),
+        inputCodeContent: "",
+        inputCodeNull: true,
+        verifiedCode: "",
+        validatorRules: {
+          username: {rules: [{required: false}, {validator: this.validateInputUsername}]},
+          inputCode: {rules: [{required: true, message: '请输入验证码!'}, {validator: this.validateInputCode}]},
+        },
+
+      }
+    },
+    methods: {
+      nextStep() {
+        let that = this
+        this.form.validateFields((err, values) => {
+          if (!err) {
+            var params = {}
+            var reg = /^[1-9]\d*$|^0$/;
+            var username = values.username;
+            if (reg.test(username) == true) {
+              params.phone = username;
+            } else {
+              params.username = username;
+            }
+            getAction("/sys/user/querySysUser", params).then((res) => {
+              if (res.success) {
+                var userList = {
+                  username: res.result.username,
+                  phone: res.result.phone
+                };
+                setTimeout(function () {
+                  that.$emit('nextStep', userList)
+                })
+              }
+            });
+          }
+        })
+
+      },
+      validateInputCode(rule, value, callback) {
+        if (!value || this.verifiedCode == this.inputCodeContent) {
+          callback();
+        } else {
+          callback(new Error("您输入的验证码不正确!"));
+        }
+      },
+      inputCodeChange(e) {
+        this.inputCodeContent = e.target.value;
+        console.log(this.inputCodeContent)
+        if (!e.target.value || 0 == e.target.value) {
+          this.inputCodeNull = true
+        } else {
+          this.inputCodeContent = this.inputCodeContent.toLowerCase()
+          this.inputCodeNull = false
+        }
+      },
+      generateCode(value) {
+        this.verifiedCode = value.toLowerCase();
+        console.log(this.verifiedCode);
+      },
+      validateInputUsername(rule, value, callback) {
+        console.log(value);
+        var reg = /^[0-9]+.?[0-9]*/;
+        if (!value) {
+          callback("请输入用户名和手机号!");
+        }
+
+        if (reg.test(value)) {
+          var params = {
+            tableName: 'sys_user',
+            fieldName: 'phone',
+            fieldVal: value,
+            dataId: null
+          };
+          duplicateCheck(params).then((res) => {
+            if (res.success) {
+              callback("用户名不存在!")
+            } else {
+              callback()
+            }
+          })
+        } else {
+          var params = {
+            tableName: 'sys_user',
+            fieldName: 'username',
+            fieldVal: value,
+            dataId: null
+          };
+          duplicateCheck(params).then((res) => {
+            if (res.success) {
+              callback("用户名不存在!")
+            } else {
+              callback()
+            }
+          })
+        }
+      },
+
+    }
+  }
+</script>
+
+<style scoped>
+
 </style>

+ 162 - 0
src/views/user/transferLocal.vue

@@ -0,0 +1,162 @@
+<style scoped>
+.bounce {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+  color: black;
+  height: 100%;
+  font: normal bold 2rem 'Product Sans', sans-serif;
+  white-space: nowrap;
+}
+
+.letter {
+  animation: bounce 0.75s cubic-bezier(0.05, 0, 0.2, 1) infinite alternate;
+  display: inline-block;
+  transform: translate3d(0, 0, 0);
+  margin-top: 0.5em;
+  text-shadow: rgba(255, 255, 255, 0.4) 0 0 0.05em;
+  font: normal 500 2rem 'Varela Round', sans-serif;
+}
+.letter:nth-child(1) {
+  animation-delay: 0s;
+}
+.letter:nth-child(2) {
+  animation-delay: 0.1s;
+}
+.letter:nth-child(3) {
+  animation-delay: 0.2s;
+}
+.letter:nth-child(4) {
+  animation-delay: 0.3s;
+}
+.letter:nth-child(5) {
+  animation-delay: 0.4s;
+}
+.letter:nth-child(6) {
+  animation-delay: 0.5s;
+}
+.letter:nth-child(7) {
+  animation-delay: 0.6s;
+}
+.letter:nth-child(8) {
+  animation-delay: 0.7s;
+}
+.letter:nth-child(9) {
+  animation-delay: 0.8s;
+}
+.letter:nth-child(10) {
+  animation-delay: 0.9s;
+}
+
+@keyframes bounce {
+  0% {
+    transform: translate3d(0, 0, 0);
+    text-shadow: rgba(255, 255, 255, 0.4) 0 0 0.05em;
+  }
+  100% {
+    transform: translate3d(0, -1em, 0);
+    text-shadow: rgba(255, 255, 255, 0.4) 0 1em 0.35em;
+  }
+}
+</style>
+<template>
+  <div style="margin:100px 0">
+    <div style="text-align:center;width:300%;margin-left:-100%;font-size:30px" class="bounce">
+      <span class="letter">企</span>
+      <span class="letter">业</span>
+      <span class="letter">微</span>
+      <span class="letter">信</span>
+      <span class="letter">登</span>
+      <span class="letter">录</span>
+      <span class="letter">中</span>
+      ,
+      <span class="letter">请</span>
+      <span class="letter">稍</span>
+      <span class="letter">候</span>
+    </div>
+  </div>
+</template>
+
+<script>
+import { postAction } from '@/api/manage'
+import { mapActions } from 'vuex'
+import { timeFix } from '@/utils/util'
+import qs from 'qs'
+import Vue from 'vue'
+export default {
+  name: 'transfer',
+  components: {},
+  data() {
+    return {}
+  },
+  methods: {
+    ...mapActions(['Login', 'Logout', 'PhoneLogin', 'wxLogin']),
+    login(values) {
+      this.wxLogin(values)
+      this.loginSuccess()
+    },
+    departConfirm(res) {
+      if (res.success) {
+        let multi_depart = res.result.multi_depart
+        //0:无部门 1:一个部门 2:多个部门
+        if (multi_depart == 0) {
+          this.loginSuccess()
+          this.$notification.warn({
+            message: '提示',
+            description: `您尚未归属部门,请确认账号信息`,
+            duration: 3
+          })
+        } else if (multi_depart == 2) {
+          this.departVisible = true
+          this.currentUsername = this.form.getFieldValue('username')
+          this.departList = res.result.departs
+        } else {
+          this.loginSuccess()
+        }
+      } else {
+        this.requestFailed(res)
+        this.Logout()
+      }
+    },
+    requestFailed(err) {
+      this.$notification['error']({
+        message: '登录失败',
+        description: ((err.response || {}).data || {}).message || err.message || '请求出现错误,请稍后再试',
+        duration: 4
+      })
+      this.loginBtn = false
+    },
+    loginSuccess() {
+      this.$router.push({ name: 'dashboard' })
+      this.$notification.success({
+        message: '欢迎',
+        description: `${timeFix()},欢迎回来`
+      })
+    }
+  },
+  mounted() {
+    this.$nextTick(() => {
+      console.log(window.location.search)
+      var data = window.location.search.split('?')[1]
+      var arr = data.split('=')
+      var json = {}
+      json[arr[0]] = arr[1]
+      var params = qs.stringify(json)
+      postAction('/sys/wxlogin', params).then(res => {
+        console.log(res)
+        if (res.success) {
+          this.login(res)
+        } else {
+          //   this.$message.error('企业微信登录失败,请选择账户登录')
+
+          this.requestFailed(res)
+          this.$router.push({ name: 'login' })
+        }
+      })
+    })
+  }
+}
+</script>
+
+<style scoped></style>

+ 1 - 1
vue.config.js

@@ -69,7 +69,7 @@ module.exports = {
         // target: 'http://192.168.2.130:8080', //请求本地 需要jeecg-boot后台项目  蒙蒙
         // target: 'http://192.168.2.133:8080', //请求本地 需要jeecg-boot后台项目  英豪
         // target: 'http://192.168.2.132:8080', //请求本地 需要jeecg-boot后台项目
-        target:'http://127.0.0.1:8080',
+        target: 'http://192.168.2.174:8080', //请求本地 需要jeecg-boot后台项目  祚云
         ws: false,
         changeOrigin: true
       },