DESKTOP-7E9LH09\admin 2 недель назад
Родитель
Сommit
acf003752c

+ 393 - 352
src/router/index.js

@@ -1,9 +1,9 @@
-import Vue from 'vue'
-import Router from 'vue-router'
+import Vue from "vue";
+import Router from "vue-router";
 /* Layout */
-import Layout from '@/layout'
+import Layout from "@/layout";
 
-Vue.use(Router)
+Vue.use(Router);
 
 /**
  * Note: sub-menu only appear when route children.length >= 1
@@ -31,254 +31,259 @@ Vue.use(Router)
  */
 export const constantRoutes = [
   {
-    path: '/login',
-    component: () => import('@/views/login/index'),
-    hidden: true
+    path: "/login",
+    component: () => import("@/views/login/index"),
+    hidden: true,
   },
 
   {
-    path: '/404',
-    component: () => import('@/views/404'),
-    hidden: true
+    path: "/404",
+    component: () => import("@/views/404"),
+    hidden: true,
   },
   {
-    path: '/test',
+    path: "/test",
     component: Layout,
     children: [
       {
-        path: 'test',
-        component: () => import('@/views/test/index'),
-        name: '示例',
-        meta: { title: '示例', icon: 'table' }
-      }
-    ]
+        path: "test",
+        component: () => import("@/views/test/index"),
+        name: "示例",
+        meta: { title: "示例", icon: "table" },
+      },
+    ],
   },
   {
-    path: '/',
-    name: '/',
+    path: "/",
+    name: "/",
     component: Layout,
-    redirect: '/Homepage',
-    meta: { title: '统计面板', icon: 'form' },
+    redirect: "/Homepage",
+    meta: { title: "统计面板", icon: "form" },
     children: [
       {
-        path: 'Homepage',
-        component: () => import('@/views/Homepage/Homepage/index'),
-        name: 'Homepage',
-        meta: { title: '统计面板' }
-      }
-
-    ]
+        path: "Homepage",
+        component: () => import("@/views/Homepage/Homepage/index"),
+        name: "Homepage",
+        meta: { title: "统计面板" },
+      },
+    ],
   },
   {
-    path: '/user',
-    name: 'user',
+    path: "/user",
+    name: "user",
     component: Layout,
-    redirect: '/user/userList',
-    meta: { title: '会员管理', icon: 'form' },
+    redirect: "/user/userList",
+    meta: { title: "会员管理", icon: "form" },
     children: [
       {
-        path: 'userList',
-        component: () => import('@/views/user/userList/index'),
-        name: 'userList',
-        meta: { title: '会员列表' }
+        path: "userList",
+        component: () => import("@/views/user/userList/index"),
+        name: "userList",
+        meta: { title: "会员列表" },
       },
-       {
-        path: 'userLevel',
-        component: () => import('@/views/user/userLevel/index'),
-        name: 'userLevel',
-        meta: { title: '会员等级' }
+      {
+        path: "userLevel",
+        component: () => import("@/views/user/userLevel/index"),
+        name: "userLevel",
+        meta: { title: "会员等级" },
       },
       {
-        path: 'userStatistics',
-        component: () => import('@/views/user/userStatistics/index'),
-        name: 'userStatistics',
-        meta: { title: '会员统计' }
+        path: "userStatistics",
+        component: () => import("@/views/user/userStatistics/index"),
+        name: "userStatistics",
+        meta: { title: "会员统计" },
       },
       {
-        path: 'userDiary',
-        component: () => import('@/views/user/userDiary/index'),
-        name: 'userDiary',
-        meta: { title: '会员登录日志' }
+        path: "userDiary",
+        component: () => import("@/views/user/userDiary/index"),
+        name: "userDiary",
+        meta: { title: "会员登录日志" },
       },
       {
-        path: 'userOnlineSummary',
-        component: () => import('@/views/user/userOnlineSummary/index'),
-        name: 'userOnlineSummary',
-        meta: { title: '在线汇总' }
-      }
-
-      ]
+        path: "userOnlineSummary",
+        component: () => import("@/views/user/userOnlineSummary/index"),
+        name: "userOnlineSummary",
+        meta: { title: "在线汇总" },
+      },
+      {
+        path: "userLoginLog",
+        component: () => import("@/views/user/userLoginLog/index"),
+        name: "userLoginLog",
+        meta: { title: "用户登录日志" },
+      },
+    ],
   },
   {
-    path: '/chamber',
-    name: 'chamber',
+    path: "/chamber",
+    name: "chamber",
     component: Layout,
-    redirect: '/chamber/room',
-    meta: { title: '房间管理', icon: 'form' },
+    redirect: "/chamber/room",
+    meta: { title: "房间管理", icon: "form" },
     children: [
       {
-        path: 'room',
-        component: () => import('@/views/chamber/room/index'),
-        name: 'room',
-        meta: { title: '游戏房间' }
+        path: "room",
+        component: () => import("@/views/chamber/room/index"),
+        name: "room",
+        meta: { title: "游戏房间" },
       },
       {
-        path: 'game',
-        component: () => import('@/views/chamber/game/index'),
-        name: 'game',
-        meta: { title: '游戏管理' }
-      }
-    ]
+        path: "game",
+        component: () => import("@/views/chamber/game/index"),
+        name: "game",
+        meta: { title: "游戏管理" },
+      },
+    ],
   },
   {
-    path: '/withdraw',
-    name: 'withdraw',
+    path: "/withdraw",
+    name: "withdraw",
     component: Layout,
-    redirect: '/withdraw/listUSDT',
-    meta: { title: '提现列表USDT', icon: 'form' },
+    redirect: "/withdraw/listUSDT",
+    meta: { title: "提现列表USDT", icon: "form" },
     children: [
-    {
-        path: 'withdraw/ManualTopUp',
-        component: () => import('@/views/withdraw/ManualTopUp/index'),
-        name: 'ManualTopUp',
-        meta: { title: '人工充值' }
+      {
+        path: "withdraw/ManualTopUp",
+        component: () => import("@/views/withdraw/ManualTopUp/index"),
+        name: "ManualTopUp",
+        meta: { title: "人工充值" },
       },
       {
-        path: 'withdraw/MemberBonus',
-        component: () => import('@/views/withdraw/MemberBonus/index'),
-        name: 'MemberBonus',
-        meta: { title: '会员彩金' }
+        path: "withdraw/MemberBonus",
+        component: () => import("@/views/withdraw/MemberBonus/index"),
+        name: "MemberBonus",
+        meta: { title: "会员彩金" },
       },
       {
-        path: 'withdraw/Manualwithdrawal',
-        component: () => import('@/views/withdraw/Manualwithdrawal/index'),
-        name: 'Manualwithdrawal',
-        meta: { title: '人工提现' }
+        path: "withdraw/Manualwithdrawal",
+        component: () => import("@/views/withdraw/Manualwithdrawal/index"),
+        name: "Manualwithdrawal",
+        meta: { title: "人工提现" },
       },
       {
-        path: 'withdraw/topUp',
+        path: "withdraw/topUp",
         // component: () => import('@/views/wallet/topUp/index'),
-        component: () => import('@/views/A_NewPage/Finance/TopUpList/index.vue'),
-        name: 'withdraw/topUp',
-        meta: { title: '充值列表' }
+        component: () =>
+          import("@/views/A_NewPage/Finance/TopUpList/index.vue"),
+        name: "withdraw/topUp",
+        meta: { title: "充值列表" },
       },
       {
-        path: 'treePay',
-        component: () => import('@/views/treePay/list/index.vue'),
-        name: 'treePay',
-        meta: { title: '第三方支付' }
+        path: "treePay",
+        component: () => import("@/views/treePay/list/index.vue"),
+        name: "treePay",
+        meta: { title: "第三方支付" },
       },
       {
-        path: 'balance',
-        component: () => import('@/views/balance/log/index'),
-        name: 'balance',
-        meta: { title: '钱包记录' }
+        path: "balance",
+        component: () => import("@/views/balance/log/index"),
+        name: "balance",
+        meta: { title: "钱包记录" },
       },
       {
-        path: 'listUSDT',
+        path: "listUSDT",
         // component: () => import('@/views/withdraw/listUSDT/index'),
-        component: () => import('@/views/A_NewPage/Finance/WithdrawList/index.vue'),
-        name: 'listUSDT',
-        meta: { title: '提现列表USDT' }
+        component: () =>
+          import("@/views/A_NewPage/Finance/WithdrawList/index.vue"),
+        name: "listUSDT",
+        meta: { title: "提现列表USDT" },
       },
       {
-        path: 'listRMB',
-        component: () => import('@/views/withdraw/listRMB/index'),
-        name: 'listRMB',
-        meta: { title: '提现列表RMB' }
+        path: "listRMB",
+        component: () => import("@/views/withdraw/listRMB/index"),
+        name: "listRMB",
+        meta: { title: "提现列表RMB" },
       },
-        {
-        path: 'yuebao',
-        component: () => import('@/views/yuebao/index'),
-        name: 'yuebao',
-        meta: { title: '余额宝记录' }
+      {
+        path: "yuebao",
+        component: () => import("@/views/yuebao/index"),
+        name: "yuebao",
+        meta: { title: "余额宝记录" },
       },
       {
-        path: 'topUpChannel',
-        component: () => import('@/views/wallet/topUpChannel/index'),
-        name: 'topUpChannel',
-        meta: { title: '充值通道' }
+        path: "topUpChannel",
+        component: () => import("@/views/wallet/topUpChannel/index"),
+        name: "topUpChannel",
+        meta: { title: "充值通道" },
       },
-    ]
+    ],
   },
   {
-    path: '/Activity',
-    name: 'Activity',
+    path: "/Activity",
+    name: "Activity",
     component: Layout,
-    redirect: '/Activity/ActivityUser',
-    meta: { title: '活动管理', icon: 'form' },
+    redirect: "/Activity/ActivityUser",
+    meta: { title: "活动管理", icon: "form" },
     children: [
       {
-        path: 'ActivityUser',
-        component: () => import('@/views/Activity/ActivityUser/index'),
-        name: 'ActivityUser',
-        meta: { title: '参与列表' }
+        path: "ActivityUser",
+        component: () => import("@/views/Activity/ActivityUser/index"),
+        name: "ActivityUser",
+        meta: { title: "参与列表" },
       },
       {
-        path: 'ActivityReward',
-        component: () => import('@/views/Activity/ActivityReward/index'),
-        name: 'ActivityReward',
-        meta: { title: '活动列表' }
+        path: "ActivityReward",
+        component: () => import("@/views/Activity/ActivityReward/index"),
+        name: "ActivityReward",
+        meta: { title: "活动列表" },
       },
       {
-        path: 'Banner',
-        component: () => import('@/views/Activity/Banner/index'),
-        name: 'Banner',
-        meta: { title: 'Banner' }
-      }
-    ]
+        path: "Banner",
+        component: () => import("@/views/Activity/Banner/index"),
+        name: "Banner",
+        meta: { title: "Banner" },
+      },
+    ],
   },
   {
-    path: '/config',
-    name: '配置管理',
+    path: "/config",
+    name: "配置管理",
     component: Layout,
-    redirect: '/config/getAll',
-    meta: { title: '所有配置', icon: 'form' },
+    redirect: "/config/getAll",
+    meta: { title: "所有配置", icon: "form" },
     children: [
       {
-        path: 'reply',
-        component: () => import('@/views/reply/list/index'),
-        name: 'reply',
-        meta: { title: '回复管理' }
+        path: "reply",
+        component: () => import("@/views/reply/list/index"),
+        name: "reply",
+        meta: { title: "回复管理" },
       },
       {
-        path: 'configlist',
-        component: () => import('@/views/config/list/index'),
-        name: 'configlist',
-        meta: { title: '配置列表' }
+        path: "configlist",
+        component: () => import("@/views/config/list/index"),
+        name: "configlist",
+        meta: { title: "配置列表" },
       },
       {
-        path: 'playing',
-        component: () => import('@/views/playing/list/index'),
-        name: 'playing',
-        meta: { title: '玩法管理' }
+        path: "playing",
+        component: () => import("@/views/playing/list/index"),
+        name: "playing",
+        meta: { title: "玩法管理" },
       },
       {
-        path: 'getAll',
-        component: () => import('@/views/config/getAll/index'),
-        name: 'getAll',
-        meta: { title: '所有配置' }
+        path: "getAll",
+        component: () => import("@/views/config/getAll/index"),
+        name: "getAll",
+        meta: { title: "所有配置" },
       },
       {
-        path: 'Message',
-        component: () => import('@/views/config/Message/index'),
-        name: 'Message',
-        meta: { title: '频道管理' }
+        path: "Message",
+        component: () => import("@/views/config/Message/index"),
+        name: "Message",
+        meta: { title: "频道管理" },
       },
       {
-        path: 'pcConfig',
-        component: () => import('@/views/config/pcConfig/index'),
-        name: 'pcConfig',
-        meta: { title: 'PC28设置' }
+        path: "pcConfig",
+        component: () => import("@/views/config/pcConfig/index"),
+        name: "pcConfig",
+        meta: { title: "PC28设置" },
       },
       {
-        path: 'LotteryManagement',
-        component: () => import('@/views/config/LotteryManagement/index'),
-        name: 'LotteryManagement',
-        meta: { title: '彩票玩法设置' }
+        path: "LotteryManagement",
+        component: () => import("@/views/config/LotteryManagement/index"),
+        name: "LotteryManagement",
+        meta: { title: "彩票玩法设置" },
       },
-
-    ]
+    ],
   },
 
   // {
@@ -297,263 +302,299 @@ export const constantRoutes = [
   //   ]
   // },
   {
-    path: '/certification',
-    name: 'certification',
+    path: "/certification",
+    name: "certification",
     component: Layout,
-    redirect: '/certification/issuenumber',
-    meta: { title: '开奖记录', icon: 'form' },
+    redirect: "/certification/issuenumber",
+    meta: { title: "开奖记录", icon: "form" },
     children: [
       {
-        path: 'issuenumber',
-        component: () => import('@/views/certification/issuenumber/index'),
-        name: 'issuenumber',
-        meta: { title: 'PC28' }
+        path: "issuenumber",
+        component: () => import("@/views/certification/issuenumber/index"),
+        name: "issuenumber",
+        meta: { title: "PC28" },
       },
       {
-        path: 'abnormal',
-        component: () => import('@/views/certification/abnormal/index'),
-        name: 'abnormal',
-        meta: { title: '错误分页' }
+        path: "abnormal",
+        component: () => import("@/views/certification/abnormal/index"),
+        name: "abnormal",
+        meta: { title: "错误分页" },
       },
       {
-        path: 'pcIssue',
-        component: () => import('@/views/certification/pcIssue/index'),
-        name: 'pcIssue',
-        meta: { title: '极速28' }
+        path: "pcIssue",
+        component: () => import("@/views/certification/pcIssue/index"),
+        name: "pcIssue",
+        meta: { title: "极速28" },
       },
       {
-        path: 'jisuGame',
-        component: () => import('@/views/certification/jisuGame/index'),
-        name: 'jisuGame',
-        meta: { title: '彩票赔率设置' }
+        path: "jisuGame",
+        component: () => import("@/views/certification/jisuGame/index"),
+        name: "jisuGame",
+        meta: { title: "彩票赔率设置" },
       },
       {
-        path: 'jisuOrder',
-        component: () => import('@/views/certification/jisuOrder/index'),
-        name: 'jisuOrder',
-        meta: { title: '极速游戏订单' }
+        path: "jisuOrder",
+        component: () => import("@/views/certification/jisuOrder/index"),
+        name: "jisuOrder",
+        meta: { title: "极速游戏订单" },
       },
       {
-        path: 'jisuOrderDetail',
-        component: () => import('@/views/certification/jisuDetail/index'),
-        name: 'jisuOrderDetail',
-        meta: { title: '极速游戏订单详情' }
+        path: "jisuOrderDetail",
+        component: () => import("@/views/certification/jisuDetail/index"),
+        name: "jisuOrderDetail",
+        meta: { title: "极速游戏订单详情" },
       },
       {
-        path: 'jisuHistory',
-        component: () => import('@/views/certification/jisuHistory/index'),
-        name: 'jisuHistory',
-        meta: { title: '彩票预开奖设置' }
+        path: "jisuHistory",
+        component: () => import("@/views/certification/jisuHistory/index"),
+        name: "jisuHistory",
+        meta: { title: "彩票预开奖设置" },
       },
-
-    ]
+    ],
   },
   {
-    path: '/order',
-    name: 'order',
+    path: "/order",
+    name: "order",
     component: Layout,
-    redirect: '/order/index',
-    meta: { title: '投注记录', icon: 'form' },
+    redirect: "/order/index",
+    meta: { title: "投注记录", icon: "form" },
     children: [
       {
-        path: 'order',
-        component: () => import('@/views/order/list/index'),
-        name: 'order',
-        meta: { title: '投注记录' }
-      }
-    ]
+        path: "order",
+        component: () => import("@/views/order/list/index"),
+        name: "order",
+        meta: { title: "投注记录" },
+      },
+    ],
   },
   {
-    path: '/Digital',
-    name: 'Digital',
+    path: "/Digital",
+    name: "Digital",
     component: Layout,
-    redirect: '/Digital/index',
-    meta: { title: '六合彩', icon: 'form' },
+    redirect: "/Digital/index",
+    meta: { title: "六合彩", icon: "form" },
     children: [
       {
-        path: 'DigitalOrder',
-        component: () => import('@/views/Digital/order/index'),
-        name: 'DigitalOrder',
-        meta: { title: '彩票订单列表' }
+        path: "DigitalOrder",
+        component: () => import("@/views/Digital/order/index"),
+        name: "DigitalOrder",
+        meta: { title: "彩票订单列表" },
       },
       {
-        path: 'DigitalHistory',
-        component: () => import('@/views/Digital/history/index'),
-        name: 'DigitalHistory',
-        meta: { title: '彩票开奖历史' }
+        path: "DigitalHistory",
+        component: () => import("@/views/Digital/history/index"),
+        name: "DigitalHistory",
+        meta: { title: "彩票开奖历史" },
       },
       {
-        path: 'DigitalNumberManage',
-        component: () => import('@/views/Digital/number/index'),
-        name: 'DigitalNumberManage',
-        meta: { title: '号码管理' }
+        path: "DigitalNumberManage",
+        component: () => import("@/views/Digital/number/index"),
+        name: "DigitalNumberManage",
+        meta: { title: "号码管理" },
       },
       {
-        path: 'MacauMarkSix',
-        component: () => import('@/views/Digital/MacauMarkSix/index'),
-        name: 'MacauMarkSix',
-        meta: { title: '澳门六合彩' }
+        path: "MacauMarkSix",
+        component: () => import("@/views/Digital/MacauMarkSix/index"),
+        name: "MacauMarkSix",
+        meta: { title: "澳门六合彩" },
       },
-
-    ]
+    ],
   },
   {
-    path: '/rebate',
-    name: 'rebate',
+    path: "/rebate",
+    name: "rebate",
     component: Layout,
-    redirect: '/rebate/rebate',
-    meta: { title: '返拥管理', icon: 'form' },
+    redirect: "/rebate/rebate",
+    meta: { title: "返拥管理", icon: "form" },
     children: [
       {
-        path: 'rebate',
-        component: () => import('@/views/rebate/list/index.vue'),
-        name: 'rebate',
-        meta: { title: '笔笔返' }
+        path: "rebate",
+        component: () => import("@/views/rebate/list/index.vue"),
+        name: "rebate",
+        meta: { title: "笔笔返" },
       },
       {
-        path: 'backflow',
-        component: () => import('@/views/rebate/backflow/index.vue'),
-        name: 'backflow',
-        meta: { title: '回水返' }
-      }
-    ]
+        path: "backflow",
+        component: () => import("@/views/rebate/backflow/index.vue"),
+        name: "backflow",
+        meta: { title: "回水返" },
+      },
+    ],
   },
   {
-    path: '/authority',
-    name: 'authority',
+    path: "/authority",
+    name: "authority",
     component: Layout,
-    redirect: '/authority/menu',
-    meta: { title: '权限管理', icon: 'form' },
+    redirect: "/authority/menu",
+    meta: { title: "权限管理", icon: "form" },
     children: [
       {
-        path: 'menu',
-        component: () => import('@/views/authority/menu/index'),
-        name: 'menu',
-        meta: { title: '菜单管理' }
+        path: "menu",
+        component: () => import("@/views/authority/menu/index"),
+        name: "menu",
+        meta: { title: "菜单管理" },
       },
       {
-        path: 'role',
-        component: () => import('@/views/authority/role/index'),
-        name: 'role',
-        meta: { title: '角色管理' }
+        path: "role",
+        component: () => import("@/views/authority/role/index"),
+        name: "role",
+        meta: { title: "角色管理" },
       },
       {
-        path: 'account',
-        component: () => import('@/views/authority/account/index'),
-        name: 'account',
-        meta: { title: '账号管理' }
-      }
-    ]
+        path: "account",
+        component: () => import("@/views/authority/account/index"),
+        name: "account",
+        meta: { title: "账号管理" },
+      },
+    ],
   },
   {
-    path: '/operation',
-    name: 'operation',
+    path: "/operation",
+    name: "operation",
     component: Layout,
-    redirect: '/operation/index',
-    meta: { title: '运营数据', icon: 'chart' }, // icon 可以改成你项目中已有的 svg 图标名,比如 'chart' 或 'form'
+    redirect: "/operation/index",
+    meta: { title: "运营数据", icon: "chart" }, // icon 可以改成你项目中已有的 svg 图标名,比如 'chart' 或 'form'
     children: [
       {
-        path: 'operationIndex',
-        component: () => import('@/views/operationalData/index'), // 注意:你需要在 views 目录下创建对应的 vue 文件
-        name: 'operationIndex',
-        meta: { title: '数据概览' } // 你的二级菜单名称
-      }
-    ]
+        path: "operationIndex",
+        component: () => import("@/views/operationalData/index"), // 注意:你需要在 views 目录下创建对应的 vue 文件
+        name: "operationIndex",
+        meta: { title: "数据概览" }, // 你的二级菜单名称
+      },
+    ],
   },
   {
-    path: '/userReports',
-    name: 'userReports',
+    path: "/userReports",
+    name: "userReports",
     component: Layout,
-    redirect: '/userReports/index',
-    meta: { title: '用户报表', icon: 'chart' }, // icon 可以改成你项目中已有的 svg 图标名,比如 'chart' 或 'form'
+    redirect: "/userReports/index",
+    meta: { title: "用户报表", icon: "chart" }, // icon 可以改成你项目中已有的 svg 图标名,比如 'chart' 或 'form'
     children: [
       {
-        path: 'userReportsIndex',
-        component: () => import('@/views/userReports/index'), // 注意:你需要在 views 目录下创建对应的 vue 文件
-        name: 'userReportsIndex',
-        meta: { title: '用户报表' } // 你的二级菜单名称
-      }
-    ]
+        path: "userReportsIndex",
+        component: () => import("@/views/userReports/index"), // 注意:你需要在 views 目录下创建对应的 vue 文件
+        name: "userReportsIndex",
+        meta: { title: "用户报表" }, // 你的二级菜单名称
+      },
+    ],
   },
-    {
-    path: '/promoteUsers',
-    name: 'promoteUsers',
+  {
+    path: "/promoteUsers",
+    name: "promoteUsers",
     component: Layout,
-    redirect: '/promoteUsers/index',
-    meta: { title: '推广用户', icon: 'chart' }, // icon 可以改成你项目中已有的 svg 图标名,比如 'chart' 或 'form'
+    redirect: "/promoteUsers/index",
+    meta: { title: "推广用户", icon: "chart" }, // icon 可以改成你项目中已有的 svg 图标名,比如 'chart' 或 'form'
     children: [
       {
-        path: 'promoteUsersIndex',
-        component: () => import('@/views/promoteUsersIndex/index'), // 注意:你需要在 views 目录下创建对应的 vue 文件
-        name: 'promoteUsersIndex',
-        meta: { title: '推广用户' } // 你的二级菜单名称
-      }
-    ]
+        path: "promoteUsersIndex",
+        component: () => import("@/views/promoteUsersIndex/index"), // 注意:你需要在 views 目录下创建对应的 vue 文件
+        name: "promoteUsersIndex",
+        meta: { title: "推广用户" }, // 你的二级菜单名称
+      },
+    ],
   },
 
   {
-    path: '/views/orderManage',
-    name: '体育管理',
+    path: "/views/orderManage",
+    name: "体育管理",
     component: Layout,
-    redirect: '/views/orderManage',
-    meta: { title: '体育管理', icon: 'form' },
+    redirect: "/views/orderManage",
+    meta: { title: "体育管理", icon: "form" },
     children: [
       {
-        path: 'TotalSoccerAdvance',
-        component: () => import('@/views/orderManage/TotalSoccerAdvance/index.vue'),
+        path: "TotalSoccerAdvance",
+        component: () =>
+          import("@/views/orderManage/TotalSoccerAdvance/index.vue"),
         // component: () => import('@/views/orderManage/List/index.vue'),
-        name: 'TotalSoccerAdvance',
-        meta: { title: '冠军足球' }
+        name: "TotalSoccerAdvance",
+        meta: { title: "冠军足球" },
+      },
+      {
+        path: "TotalSoccerAdvanceOrder",
+        component: () =>
+          import("@/views/orderManage/TotalSoccerAdvanceOrder/index.vue"),
+        name: "TotalSoccerAdvanceOrder",
+        meta: { title: "冠军足球订单列表" },
+      },
+      {
+        path: "TotalSoccerAdvanceOrderDetail",
+        component: () =>
+          import("@/views/orderManage/TotalSoccerAdvanceOrderDetail/index.vue"),
+        name: "TotalSoccerAdvanceOrderDetail",
+        meta: { title: "冠军足球订单详情" },
+      },
+      {
+        path: "orderList",
+        component: () => import("@/views/orderManage/List/index.vue"),
+        name: "orderList",
+        meta: { title: "订单列表" },
       },
       {
-        path: 'TotalSoccerAdvanceOrder',
-        component: () => import('@/views/orderManage/TotalSoccerAdvanceOrder/index.vue'),
-        name: 'TotalSoccerAdvanceOrder',
-        meta: { title: '冠军足球订单列表' }
+        path: "EventList",
+        component: () => import("@/views/orderManage/EventList/index.vue"),
+        name: "EventList",
+        meta: { title: "赛事列表" },
       },
       {
-        path: 'TotalSoccerAdvanceOrderDetail',
-        component: () => import('@/views/orderManage/TotalSoccerAdvanceOrderDetail/index.vue'),
-        name: 'TotalSoccerAdvanceOrderDetail',
-        meta: { title: '冠军足球订单详情' }
+        path: "EventErrorList",
+        component: () => import("@/views/orderManage/EventErrorList/index.vue"),
+        name: "EventErrorList",
+        meta: { title: "异常赛事" },
       },
       {
-        path: 'orderList',
-        component: () => import('@/views/orderManage/List/index.vue'),
-        name: 'orderList',
-        meta: { title: '订单列表' }
+        path: "orderDetail",
+        component: () => import("@/views/orderManage/Detail/index.vue"),
+        name: "orderDetail",
+        meta: { title: "订单详情" },
       },
       {
-        path: 'EventList',
-        component: () => import('@/views/orderManage/EventList/index.vue'),
-        name: 'EventList',
-        meta: { title: '赛事列表' }
+        path: "EventInformationIndex",
+        component: () => import("@/views/EventInformation/index"), // 注意:你需要在 views 目录下创建对应的 vue 文件
+        name: "EventInformationIndex",
+        meta: { title: "赛事信息" }, // 你的二级菜单名称
       },
       {
-        path: 'EventErrorList',
-        component: () => import('@/views/orderManage/EventErrorList/index.vue'),
-        name: 'EventErrorList',
-        meta: { title: '异常赛事' }
+        path: "FootballGameplayList",
+        component: () =>
+          import("@/views/orderManage/FootballGameplayList/index.vue"),
+        name: "FootballGameplayList",
+        meta: { title: "玩法列表" },
       },
+    ],
+  },
+  {
+    path: "/agent",
+    name: "代理管理",
+    component: Layout,
+    redirect: "/agent/agentList",
+    meta: { title: "代理管理", icon: "form" },
+    children: [
       {
-        path: 'orderDetail',
-        component: () => import('@/views/orderManage/Detail/index.vue'),
-        name: 'orderDetail',
-        meta: { title: '订单详情' }
+        path: "agentList",
+        component: () => import("@/views/agent/index.vue"),
+        // component: () => import('@/views/orderManage/List/index.vue'),
+        name: "agentList",
+        meta: { title: "代理列表" },
       },
       {
-        path: 'EventInformationIndex',
-        component: () => import('@/views/EventInformation/index'), // 注意:你需要在 views 目录下创建对应的 vue 文件
-        name: 'EventInformationIndex',
-        meta: { title: '赛事信息' } // 你的二级菜单名称
+        path: "agentWithdrawLog",
+        component: () => import("@/views/agent/withdrawLog/index.vue"),
+        name: "agentWithdrawLog",
+        meta: { title: "代理提现记录" },
       },
-         {
-        path: 'FootballGameplayList',
-        component: () => import('@/views/orderManage/FootballGameplayList/index.vue'),
-        name: 'FootballGameplayList',
-        meta: { title: '玩法列表' }
+      {
+        path: "agentReport",
+        component: () => import("@/views/agent/report/index.vue"),
+        name: "agentReport",
+        meta: { title: "代理报表" },
+      },
+      {
+        path: "agentLoginLog",
+        component: () => import("@/views/agent/loginLog/index.vue"),
+        name: "agentLoginLog",
+        meta: { title: "代理登录日志" },
       },
-    ]
+    ],
   },
   // {
   //   path: '/EventInformation',
@@ -571,22 +612,22 @@ export const constantRoutes = [
   //   ]
   // },
   // 404 page must be placed at the end !!!
-  { path: '*', redirect: '/404', hidden: true },
-]
+  { path: "*", redirect: "/404", hidden: true },
+];
 
-const createRouter = () => new Router({
-  // mode: 'history', // require service support
-  scrollBehavior: () => ({ y: 0 }),
-  routes: constantRoutes
-})
+const createRouter = () =>
+  new Router({
+    // mode: 'history', // require service support
+    scrollBehavior: () => ({ y: 0 }),
+    routes: constantRoutes,
+  });
 
-const router = createRouter()
+const router = createRouter();
 
 // Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
 export function resetRouter() {
-  const newRouter = createRouter()
-  router.matcher = newRouter.matcher // reset router
+  const newRouter = createRouter();
+  router.matcher = newRouter.matcher; // reset router
 }
 
-export default router
-
+export default router;

+ 992 - 0
src/views/agent/index.vue

@@ -0,0 +1,992 @@
+<template>
+  <div class="agent-page">
+    <div class="agent-panel">
+      <el-form
+        ref="queryForm"
+        :model="query"
+        class="agent-search"
+        inline
+        size="small"
+      >
+        <el-form-item label="代理账号" prop="agent_account">
+          <el-input
+            v-model="query.agent_account"
+            placeholder="代理账号"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item label="真实姓名" prop="real_name">
+          <el-input
+            v-model="query.real_name"
+            placeholder="真实姓名"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item label="账号状态" prop="status">
+          <el-select v-model="query.status" placeholder="账号状态" clearable>
+            <el-option label="启用" :value="1" />
+            <el-option label="禁用" :value="0" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="注册时间" prop="date_range">
+          <el-date-picker
+            v-model="query.date_range"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="yyyy-MM-dd"
+          />
+        </el-form-item>
+        <el-form-item class="search-actions">
+          <el-button @click="handleSearch">查询</el-button>
+          <el-button type="primary" icon="el-icon-plus" @click="handleAdd">
+            新增
+          </el-button>
+        </el-form-item>
+      </el-form>
+
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        border
+        height="calc(100vh - 255px)"
+        class="agent-table"
+        :row-class-name="tableRowClassName"
+      >
+        <el-table-column prop="id" label="ID" width="58" align="center" />
+        <el-table-column prop="agent_account" label="代理账号" min-width="120" align="center" />
+        <el-table-column prop="invite_code" label="邀请码" min-width="120" align="center" />
+        <el-table-column prop="real_name" label="真实姓名" min-width="120" align="center" />
+        <el-table-column prop="parent_agent" label="上级代理" min-width="100" align="center" />
+        <el-table-column prop="balance" label="账户余额" min-width="100" align="center">
+          <template slot-scope="{ row }">
+            {{ formatMoney(row.balance) }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="deposit_fee_rate" label="存款手续费比例" min-width="130" align="center">
+          <template slot-scope="{ row }">
+            {{ formatRate(row.deposit_fee_rate) }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="withdraw_fee_rate" label="取款手续费比例" min-width="130" align="center">
+          <template slot-scope="{ row }">
+            {{ formatRate(row.withdraw_fee_rate) }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="pc_agent_link" label="电脑代理链接" min-width="130" align="center">
+          <template slot-scope="{ row }">
+            <div class="link-cell">{{ row.pc_agent_link || '--' }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="h5_agent_link" label="手机代理链接" min-width="130" align="center">
+          <template slot-scope="{ row }">
+            <div class="link-cell">{{ row.h5_agent_link || '--' }}</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="status" label="账号状态" width="100" align="center">
+          <template slot-scope="{ row }">
+            <el-switch
+              v-model="row.status"
+              :active-value="1"
+              :inactive-value="0"
+              active-color="#20c76a"
+              inactive-color="#dcdfe6"
+              @change="handleStatusChange(row)"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column prop="login_status" label="登录状态" width="90" align="center">
+          <template slot-scope="{ row }">
+            <el-tag
+              size="mini"
+              :type="row.login_status === 1 ? 'success' : 'info'"
+              effect="plain"
+            >
+              {{ row.login_status === 1 ? '在线' : '离线' }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="login_time" label="登录时间" min-width="150" align="center">
+          <template slot-scope="{ row }">
+            {{ row.login_time || '--' }}
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="200" fixed="right" align="center">
+          <template slot-scope="{ row }">
+            <div class="row-actions">
+              <el-button type="text" size="mini" @click="handleEdit(row)">修改</el-button>
+              <el-button type="text" size="mini" @click="handleBindDomain(row)">绑定域名</el-button>
+              <el-button type="text" size="mini" @click="handleAdjustBalance(row)">加/扣款</el-button>
+              <el-button type="text" size="mini" @click="handleQuota(row)">额度管理</el-button>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <el-pagination
+        background
+        class="agent-pagination"
+        layout="total, sizes, prev, pager, next, jumper"
+        :current-page="page"
+        :page-size="limit"
+        :page-sizes="[10, 20, 50, 100]"
+        :total="total"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+
+    <el-dialog
+      :title="agentDialogTitle"
+      :visible.sync="agentDialogVisible"
+      width="620px"
+      @close="resetAgentForm"
+    >
+      <el-form
+        ref="agentForm"
+        :model="agentForm"
+        :rules="agentRules"
+        label-width="120px"
+        size="small"
+      >
+        <el-form-item label="代理账号" prop="agent_account">
+          <el-input v-model="agentForm.agent_account" placeholder="请输入代理账号" />
+        </el-form-item>
+        <el-form-item v-if="agentDialogType === 'add'" label="登录密码" prop="password">
+          <el-input v-model="agentForm.password" placeholder="请输入登录密码" show-password />
+        </el-form-item>
+        <el-form-item label="真实姓名" prop="real_name">
+          <el-input v-model="agentForm.real_name" placeholder="请输入真实姓名" />
+        </el-form-item>
+        <el-form-item label="上级代理" prop="parent_agent">
+          <el-input v-model="agentForm.parent_agent" placeholder="请输入上级代理" />
+        </el-form-item>
+        <el-form-item label="账户余额" prop="balance">
+          <el-input-number
+            v-model="agentForm.balance"
+            :min="0"
+            :precision="2"
+            :step="100"
+            controls-position="right"
+            class="full-input"
+          />
+        </el-form-item>
+        <el-form-item label="存款手续费比例" prop="deposit_fee_rate">
+          <el-input-number
+            v-model="agentForm.deposit_fee_rate"
+            :min="0"
+            :max="100"
+            :precision="2"
+            :step="0.1"
+            controls-position="right"
+            class="full-input"
+          />
+        </el-form-item>
+        <el-form-item label="取款手续费比例" prop="withdraw_fee_rate">
+          <el-input-number
+            v-model="agentForm.withdraw_fee_rate"
+            :min="0"
+            :max="100"
+            :precision="2"
+            :step="0.1"
+            controls-position="right"
+            class="full-input"
+          />
+        </el-form-item>
+        <el-form-item label="账号状态" prop="status">
+          <el-radio-group v-model="agentForm.status">
+            <el-radio :label="1">启用</el-radio>
+            <el-radio :label="0">禁用</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button size="small" @click="agentDialogVisible = false">取消</el-button>
+        <el-button type="primary" size="small" @click="submitAgent">确定</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog
+      title="绑定域名"
+      :visible.sync="domainDialogVisible"
+      width="560px"
+    >
+      <el-form :model="domainForm" label-width="120px" size="small">
+        <el-form-item label="电脑代理链接">
+          <el-input v-model="domainForm.pc_agent_link" placeholder="请输入电脑代理链接" />
+        </el-form-item>
+        <el-form-item label="手机代理链接">
+          <el-input v-model="domainForm.h5_agent_link" placeholder="请输入手机代理链接" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button size="small" @click="domainDialogVisible = false">取消</el-button>
+        <el-button type="primary" size="small" @click="submitDomain">确定</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog
+      title="加/扣款"
+      :visible.sync="balanceDialogVisible"
+      width="520px"
+    >
+      <el-form ref="balanceForm" :model="balanceForm" :rules="balanceRules" label-width="100px" size="small">
+        <el-form-item label="类型" prop="type">
+          <el-radio-group v-model="balanceForm.type">
+            <el-radio label="plus">加款</el-radio>
+            <el-radio label="minus">扣款</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="金额" prop="amount">
+          <el-input-number
+            v-model="balanceForm.amount"
+            :min="0.01"
+            :precision="2"
+            :step="100"
+            controls-position="right"
+            class="full-input"
+          />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="balanceForm.remark" type="textarea" :rows="3" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button size="small" @click="balanceDialogVisible = false">取消</el-button>
+        <el-button type="primary" size="small" @click="submitBalance">确定</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog
+      title="额度管理"
+      :visible.sync="quotaDialogVisible"
+      width="1000px"
+      custom-class="quota-dialog"
+    >
+      <div class="quota-content">
+        <el-form
+          ref="quotaTransferForm"
+          :model="quotaTransferForm"
+          :rules="quotaTransferRules"
+          class="quota-transfer-form"
+          inline
+          label-width="86px"
+          size="small"
+        >
+          <div class="quota-top-row">
+            <el-form-item label="用户余额">
+              <el-input v-model="quotaTransferForm.user_balance" readonly />
+            </el-form-item>
+            <el-button type="danger" size="small" @click="refreshUserBalance">
+              刷新余额
+            </el-button>
+            <el-button type="danger" size="small" @click="refreshAllPlatformBalance">
+              一键刷新
+            </el-button>
+            <el-button type="danger" size="small" @click="transferAllOut">
+              一键转出
+            </el-button>
+          </div>
+
+          <div class="quota-transfer-row">
+            <el-form-item label="转账类型" prop="transfer_type" required>
+              <el-select v-model="quotaTransferForm.transfer_type" placeholder="转账类型">
+                <el-option label="转入平台" value="in" />
+                <el-option label="转出平台" value="out" />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="转账平台" prop="platform" required>
+              <el-select v-model="quotaTransferForm.platform" placeholder="转账平台">
+                <el-option
+                  v-for="item in platformBalances"
+                  :key="item.key"
+                  :label="item.name"
+                  :value="item.key"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="转账金额" prop="amount" required>
+              <el-input
+                v-model="quotaTransferForm.amount"
+                placeholder="请输入转账金额"
+              />
+            </el-form-item>
+            <el-button type="success" size="small" @click="submitQuotaTransfer">
+              额度转换
+            </el-button>
+          </div>
+        </el-form>
+
+        <div class="platform-grid">
+          <div
+            v-for="item in platformBalances"
+            :key="item.key"
+            class="platform-card"
+          >
+            <div class="platform-refresh">
+              <el-input
+                :value="formatPlatformBalance(item)"
+                readonly
+                placeholder="请刷新"
+              />
+              <el-button icon="el-icon-refresh" @click="refreshPlatformBalance(item)" />
+            </div>
+            <div class="platform-name">{{ item.name }}</div>
+          </div>
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'AgentList',
+  data() {
+    return {
+      loading: false,
+      query: {
+        agent_account: '',
+        real_name: '',
+        status: '',
+        date_range: []
+      },
+      page: 1,
+      limit: 10,
+      total: 0,
+      tableData: [],
+      agentDialogVisible: false,
+      agentDialogType: 'add',
+      agentForm: this.getDefaultAgentForm(),
+      agentRules: {
+        agent_account: [
+          { required: true, message: '请输入代理账号', trigger: 'blur' }
+        ],
+        password: [
+          { required: true, message: '请输入登录密码', trigger: 'blur' }
+        ]
+      },
+      domainDialogVisible: false,
+      domainForm: {
+        id: '',
+        pc_agent_link: '',
+        h5_agent_link: ''
+      },
+      balanceDialogVisible: false,
+      balanceForm: {
+        id: '',
+        type: 'plus',
+        amount: 0,
+        remark: ''
+      },
+      balanceRules: {
+        amount: [
+          { required: true, message: '请输入金额', trigger: 'blur' }
+        ],
+        remark: [
+          { required: true, message: '请输入备注', trigger: 'blur' }
+        ]
+      },
+      quotaDialogVisible: false,
+      activeQuotaAgent: null,
+      quotaTransferForm: {
+        id: '',
+        user_balance: 0,
+        transfer_type: '',
+        platform: '',
+        amount: ''
+      },
+      quotaTransferRules: {
+        transfer_type: [
+          { required: true, message: '请选择转账类型', trigger: 'change' }
+        ],
+        platform: [
+          { required: true, message: '请选择转账平台', trigger: 'change' }
+        ],
+        amount: [
+          { required: true, message: '请输入转账金额', trigger: 'blur' }
+        ]
+      },
+      platformBalances: this.getDefaultPlatformBalances()
+    }
+  },
+  computed: {
+    agentDialogTitle() {
+      return this.agentDialogType === 'add' ? '新增代理' : '修改代理'
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getDefaultPlatformBalances() {
+      return [
+        { key: 'fg', name: 'FG钱包', balance: null },
+        { key: 'esb', name: 'ESB电竞', balance: null },
+        { key: 'db5', name: 'DB5电竞', balance: null },
+        { key: 'bg', name: 'BG钱包', balance: null },
+        { key: 'ag', name: 'AG钱包', balance: null },
+        { key: 'ss', name: 'SS体育', balance: null },
+        { key: 'mw', name: 'MW钱包', balance: null },
+        { key: 'newbb', name: 'NEWBB体育', balance: null },
+        { key: 'cq9', name: 'CQ9钱包', balance: null },
+        { key: 'jdb', name: 'JDB钱包', balance: null },
+        { key: 'saba', name: 'SABA体育', balance: null },
+        { key: 'ky', name: 'KY钱包', balance: null },
+        { key: 'pt', name: 'PT捕鱼', balance: null },
+        { key: 'tf', name: 'TF电竞', balance: null },
+        { key: 'mt', name: 'MT钱包', balance: null },
+        { key: 'cmd', name: 'CMD体育', balance: null },
+        { key: 'wl', name: 'WL钱包', balance: null },
+        { key: 'mg', name: 'MG钱包', balance: null },
+        { key: 'joker', name: 'JOKER钱包', balance: null },
+        { key: 'db7', name: 'DB7棋牌', balance: null },
+        { key: 'panda', name: 'PANDA体育', balance: null },
+        { key: 'db3', name: 'DB3彩票', balance: null },
+        { key: 'db2', name: 'DB2电子', balance: null },
+        { key: 'db1', name: 'DB1真人', balance: null },
+        { key: 'pg', name: 'PG电子', balance: null },
+        { key: 'og', name: 'OG真人', balance: null },
+        { key: 'db6', name: 'DB6捕鱼', balance: null },
+        { key: 'sexy', name: 'SEXY真人', balance: null },
+        { key: 'leg', name: 'LEG钱包', balance: null },
+        { key: 'sgwin', name: 'SGWIN彩票', balance: null }
+      ]
+    },
+    getDefaultAgentForm() {
+      return {
+        id: '',
+        agent_account: '',
+        password: '',
+        invite_code: '',
+        real_name: '',
+        parent_agent: '',
+        balance: 0,
+        deposit_fee_rate: 0,
+        withdraw_fee_rate: 0,
+        status: 1
+      }
+    },
+    getMockRows() {
+      return [
+        {
+          id: 495,
+          agent_account: 'qwe775825',
+          invite_code: '',
+          real_name: '',
+          parent_agent: 'agent',
+          balance: 1000000,
+          deposit_fee_rate: 0,
+          withdraw_fee_rate: 0,
+          pc_agent_link: 'https://pc-yx.ng-demo.xyz/?directAgent=495#/user/register',
+          h5_agent_link: 'https://h5-yx.ng-demo.xyz/?directAgent=495#/pages/login/login?type=reg',
+          status: 1,
+          login_status: 0,
+          login_time: ''
+        },
+        {
+          id: 494,
+          agent_account: 'gifvip999',
+          invite_code: '',
+          real_name: '',
+          parent_agent: 'agent',
+          balance: 0,
+          deposit_fee_rate: 0,
+          withdraw_fee_rate: 0,
+          pc_agent_link: 'https://pc-yx.ng-demo.xyz/?directAgent=494#/user/register',
+          h5_agent_link: 'https://h5-yx.ng-demo.xyz/?directAgent=494#/pages/login/login?type=reg',
+          status: 1,
+          login_status: 0,
+          login_time: ''
+        },
+        {
+          id: 493,
+          agent_account: 'aasd5396625',
+          invite_code: '',
+          real_name: '',
+          parent_agent: 'agent',
+          balance: 0,
+          deposit_fee_rate: 0,
+          withdraw_fee_rate: 0,
+          pc_agent_link: 'https://pc-yx.ng-demo.xyz/?directAgent=493#/user/register',
+          h5_agent_link: 'https://h5-yx.ng-demo.xyz/?directAgent=493#/pages/login/login?type=reg',
+          status: 1,
+          login_status: 0,
+          login_time: ''
+        },
+        {
+          id: 492,
+          agent_account: 'aasd775825',
+          invite_code: '',
+          real_name: '',
+          parent_agent: 'agent',
+          balance: 0,
+          deposit_fee_rate: 0,
+          withdraw_fee_rate: 0,
+          pc_agent_link: 'https://web.google.com/?directAgent=492#/user/register',
+          h5_agent_link: 'https://wap.google.com/?directAgent=492#/pages/login/login?type=reg',
+          status: 1,
+          login_status: 0,
+          login_time: ''
+        },
+        {
+          id: 479,
+          agent_account: 'sub8007',
+          invite_code: '',
+          real_name: 's',
+          parent_agent: 'agpwn27963',
+          balance: 0,
+          deposit_fee_rate: 0,
+          withdraw_fee_rate: 0,
+          pc_agent_link: 'https://pc-yx.ng-demo.xyz/?directAgent=479#/user/register',
+          h5_agent_link: 'https://h5-yx.ng-demo.xyz/?directAgent=479#/pages/login/login?type=reg',
+          status: 1,
+          login_status: 0,
+          login_time: ''
+        }
+      ]
+    },
+    getList() {
+      this.loading = true
+      const rows = this.getMockRows().filter(item => {
+        const accountMatched = !this.query.agent_account || item.agent_account.indexOf(this.query.agent_account) > -1
+        const realNameMatched = !this.query.real_name || item.real_name.indexOf(this.query.real_name) > -1
+        const statusMatched = this.query.status === '' || item.status === this.query.status
+        return accountMatched && realNameMatched && statusMatched
+      })
+      this.total = rows.length
+      this.tableData = rows.slice((this.page - 1) * this.limit, this.page * this.limit)
+      this.loading = false
+    },
+    handleSearch() {
+      this.page = 1
+      this.getList()
+    },
+    handleSizeChange(val) {
+      this.limit = val
+      this.page = 1
+      this.getList()
+    },
+    handleCurrentChange(val) {
+      this.page = val
+      this.getList()
+    },
+    tableRowClassName({ rowIndex }) {
+      return rowIndex % 2 === 1 ? 'agent-row-tint' : ''
+    },
+    formatMoney(value) {
+      const numberValue = Number(value)
+      if (Number.isNaN(numberValue)) return value || 0
+      return Number.isInteger(numberValue) ? numberValue : numberValue.toFixed(2)
+    },
+    formatRate(value) {
+      const numberValue = Number(value)
+      if (Number.isNaN(numberValue)) return value || 0
+      return numberValue
+    },
+    handleAdd() {
+      this.agentDialogType = 'add'
+      this.agentForm = this.getDefaultAgentForm()
+      this.agentDialogVisible = true
+      this.$nextTick(() => {
+        this.$refs.agentForm && this.$refs.agentForm.clearValidate()
+      })
+    },
+    handleEdit(row) {
+      this.agentDialogType = 'edit'
+      this.agentForm = Object.assign(this.getDefaultAgentForm(), row)
+      this.agentDialogVisible = true
+      this.$nextTick(() => {
+        this.$refs.agentForm && this.$refs.agentForm.clearValidate()
+      })
+    },
+    submitAgent() {
+      this.$refs.agentForm.validate(valid => {
+        if (!valid) return
+        if (this.agentDialogType === 'add') {
+          const row = Object.assign({}, this.agentForm, {
+            id: Date.now(),
+            invite_code: this.agentForm.invite_code || '',
+            pc_agent_link: '',
+            h5_agent_link: '',
+            login_status: 0,
+            login_time: ''
+          })
+          this.tableData.unshift(row)
+          this.total += 1
+          this.$message.success('新增成功')
+        } else {
+          this.tableData = this.tableData.map(item => {
+            return item.id === this.agentForm.id ? Object.assign({}, item, this.agentForm) : item
+          })
+          this.$message.success('修改成功')
+        }
+        this.agentDialogVisible = false
+      })
+    },
+    resetAgentForm() {
+      if (this.$refs.agentForm) {
+        this.$refs.agentForm.resetFields()
+      }
+    },
+    handleBindDomain(row) {
+      this.domainForm = {
+        id: row.id,
+        pc_agent_link: row.pc_agent_link || '',
+        h5_agent_link: row.h5_agent_link || ''
+      }
+      this.domainDialogVisible = true
+    },
+    submitDomain() {
+      this.tableData = this.tableData.map(item => {
+        return item.id === this.domainForm.id ? Object.assign({}, item, this.domainForm) : item
+      })
+      this.domainDialogVisible = false
+      this.$message.success('绑定成功')
+    },
+    handleAdjustBalance(row) {
+      this.balanceForm = {
+        id: row.id,
+        type: 'plus',
+        amount: 0,
+        remark: ''
+      }
+      this.balanceDialogVisible = true
+      this.$nextTick(() => {
+        this.$refs.balanceForm && this.$refs.balanceForm.clearValidate()
+      })
+    },
+    submitBalance() {
+      this.$refs.balanceForm.validate(valid => {
+        if (!valid) return
+        this.tableData = this.tableData.map(item => {
+          if (item.id !== this.balanceForm.id) return item
+          const amount = this.balanceForm.type === 'plus' ? this.balanceForm.amount : -this.balanceForm.amount
+          return Object.assign({}, item, {
+            balance: Number(item.balance || 0) + amount
+          })
+        })
+        this.balanceDialogVisible = false
+        this.$message.success('操作成功')
+      })
+    },
+    handleQuota(row) {
+      this.activeQuotaAgent = row
+      this.platformBalances = this.getDefaultPlatformBalances()
+      this.quotaTransferForm = {
+        id: row.id,
+        user_balance: this.formatMoney(row.balance),
+        transfer_type: '',
+        platform: '',
+        amount: ''
+      }
+      this.quotaDialogVisible = true
+      this.$nextTick(() => {
+        this.$refs.quotaTransferForm && this.$refs.quotaTransferForm.clearValidate()
+      })
+    },
+    formatPlatformBalance(item) {
+      if (item.balance === null || item.balance === undefined || item.balance === '') return ''
+      return this.formatMoney(item.balance)
+    },
+    refreshUserBalance() {
+      if (!this.activeQuotaAgent) return
+      const row = this.tableData.find(item => item.id === this.activeQuotaAgent.id)
+      this.quotaTransferForm.user_balance = this.formatMoney(row ? row.balance : this.activeQuotaAgent.balance)
+      this.$message.success('刷新成功')
+    },
+    refreshPlatformBalance(platform) {
+      platform.balance = Number((Math.random() * 10000).toFixed(2))
+      this.$message.success(`${platform.name}刷新成功`)
+    },
+    refreshAllPlatformBalance() {
+      this.platformBalances = this.platformBalances.map(item => {
+        return Object.assign({}, item, {
+          balance: Number((Math.random() * 10000).toFixed(2))
+        })
+      })
+      this.$message.success('一键刷新成功')
+    },
+    transferAllOut() {
+      this.platformBalances = this.platformBalances.map(item => {
+        return Object.assign({}, item, {
+          balance: 0
+        })
+      })
+      this.$message.success('一键转出成功')
+    },
+    submitQuotaTransfer() {
+      this.$refs.quotaTransferForm.validate(valid => {
+        if (!valid) return
+        const amount = Number(this.quotaTransferForm.amount)
+        if (!amount || amount <= 0) {
+          this.$message.error('请输入正确的转账金额')
+          return
+        }
+        const platform = this.platformBalances.find(item => item.key === this.quotaTransferForm.platform)
+        if (!platform) return
+
+        const currentUserBalance = Number(this.quotaTransferForm.user_balance || 0)
+        const currentPlatformBalance = Number(platform.balance || 0)
+        if (this.quotaTransferForm.transfer_type === 'in') {
+          if (currentUserBalance < amount) {
+            this.$message.error('用户余额不足')
+            return
+          }
+          this.quotaTransferForm.user_balance = this.formatMoney(currentUserBalance - amount)
+          platform.balance = currentPlatformBalance + amount
+        } else {
+          if (currentPlatformBalance < amount) {
+            this.$message.error('平台余额不足')
+            return
+          }
+          this.quotaTransferForm.user_balance = this.formatMoney(currentUserBalance + amount)
+          platform.balance = currentPlatformBalance - amount
+        }
+        this.tableData = this.tableData.map(item => {
+          return item.id === this.quotaTransferForm.id
+            ? Object.assign({}, item, { balance: Number(this.quotaTransferForm.user_balance) })
+            : item
+        })
+        this.$message.success('额度转换成功')
+      })
+    },
+    handleStatusChange(row) {
+      this.$message.success(row.status === 1 ? '已启用' : '已禁用')
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.agent-page {
+  width: 100%;
+  height: 100%;
+  padding: 16px;
+  overflow: hidden;
+  background: #f3f6f8;
+}
+
+.agent-panel {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  padding: 20px 20px 12px;
+  overflow: hidden;
+  background: #fff;
+}
+
+.agent-search {
+  flex-shrink: 0;
+  padding-bottom: 8px;
+
+  ::v-deep .el-form-item {
+    margin-right: 22px;
+    margin-bottom: 14px;
+  }
+
+  ::v-deep .el-form-item__label {
+    color: #303133;
+    font-weight: 500;
+  }
+
+  ::v-deep .el-input,
+  ::v-deep .el-select {
+    width: 236px;
+  }
+
+  ::v-deep .el-date-editor--daterange.el-input__inner {
+    width: 400px;
+  }
+}
+
+.search-actions {
+  margin-right: 0;
+
+  ::v-deep .el-form-item__content {
+    display: flex;
+    gap: 10px;
+  }
+}
+
+.agent-table {
+  flex: 1;
+  min-height: 0;
+
+  ::v-deep th {
+    height: 44px;
+    background: #fff;
+    color: #7b8794;
+    font-weight: 600;
+  }
+
+  ::v-deep td {
+    height: 136px;
+    color: #334155;
+  }
+
+  ::v-deep .agent-row-tint td {
+    background: #e9fbfb;
+  }
+
+  ::v-deep .el-table__fixed-right::before,
+  ::v-deep .el-table__fixed::before {
+    background-color: #ebeef5;
+  }
+}
+
+.link-cell {
+  white-space: normal;
+  word-break: break-all;
+  line-height: 1.55;
+}
+
+.row-actions {
+  display: flex;
+  flex-wrap: wrap;
+  justify-content: center;
+  gap: 6px 14px;
+
+  .el-button {
+    margin: 0;
+    color: #05a58f;
+    font-weight: 600;
+  }
+}
+
+.agent-pagination {
+  flex-shrink: 0;
+  padding-top: 12px;
+  text-align: right;
+}
+
+.full-input {
+  width: 100%;
+}
+
+::v-deep .quota-dialog {
+  margin-top: 4vh !important;
+
+  .el-dialog__header {
+    padding: 20px 20px 10px;
+  }
+
+  .el-dialog__body {
+    padding: 28px 30px 34px;
+    max-height: 78vh;
+    overflow-y: auto;
+  }
+}
+
+.quota-content {
+  width: 100%;
+}
+
+.quota-transfer-form {
+  ::v-deep .el-form-item {
+    margin-right: 10px;
+    margin-bottom: 20px;
+  }
+
+  ::v-deep .el-form-item__label {
+    color: #303133;
+  }
+
+  ::v-deep .el-input,
+  ::v-deep .el-select {
+    width: 140px;
+  }
+}
+
+.quota-top-row,
+.quota-transfer-row {
+  display: flex;
+  align-items: flex-start;
+  flex-wrap: wrap;
+}
+
+.quota-top-row {
+  margin-bottom: 2px;
+
+  ::v-deep .el-form-item:first-child .el-input {
+    width: 300px;
+  }
+}
+
+.quota-transfer-row {
+  .el-button--success {
+    background: #55c333;
+    border-color: #55c333;
+  }
+}
+
+.platform-grid {
+  display: grid;
+  grid-template-columns: repeat(5, 150px);
+  gap: 30px;
+  justify-content: start;
+  padding-top: 10px;
+}
+
+.platform-card {
+  height: 80px;
+  overflow: hidden;
+  border: 1px solid #e4e7ed;
+  border-radius: 4px;
+  background: #fff;
+  box-shadow: 0 5px 14px rgba(0, 0, 0, 0.16);
+}
+
+.platform-refresh {
+  display: grid;
+  grid-template-columns: 1fr 56px;
+  height: 36px;
+
+  ::v-deep .el-input__inner {
+    height: 36px;
+    border: 0;
+    border-right: 1px solid #dcdfe6;
+    border-bottom: 1px solid #dcdfe6;
+    border-radius: 0;
+    color: #606266;
+  }
+
+  .el-button {
+    height: 36px;
+    padding: 0;
+    border: 0;
+    border-bottom: 1px solid #dcdfe6;
+    border-radius: 0;
+    background: #f8fafc;
+    color: #8a97a6;
+  }
+}
+
+.platform-name {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  height: 44px;
+  color: #ff0000;
+  font-size: 12px;
+  font-weight: 700;
+}
+
+@media (max-width: 1280px) {
+  .agent-search {
+    ::v-deep .el-input,
+    ::v-deep .el-select {
+      width: 190px;
+    }
+
+    ::v-deep .el-date-editor--daterange.el-input__inner {
+      width: 330px;
+    }
+  }
+
+  .platform-grid {
+    grid-template-columns: repeat(4, 150px);
+  }
+}
+</style>

+ 347 - 0
src/views/agent/loginLog/index.vue

@@ -0,0 +1,347 @@
+<template>
+  <div class="agent-login-log-page">
+    <div class="login-log-panel">
+      <el-alert
+        class="ip-alert"
+        type="success"
+        title="点击IP可在线查询归属地"
+        :closable="true"
+        show-icon
+      />
+
+      <el-form
+        ref="queryForm"
+        :model="query"
+        class="login-log-search"
+        inline
+        size="small"
+      >
+        <el-form-item label="会员账号" prop="member_account">
+          <el-input
+            v-model="query.member_account"
+            placeholder="会员账号"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item label="IP地址" prop="ip">
+          <el-input
+            v-model="query.ip"
+            placeholder="IP地址"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item label="登录时间" prop="date_range">
+          <el-date-picker
+            v-model="query.date_range"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="yyyy-MM-dd"
+          />
+        </el-form-item>
+        <el-form-item class="search-actions">
+          <el-button @click="handleSearch">查询</el-button>
+        </el-form-item>
+      </el-form>
+
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        border
+        height="calc(100vh - 290px)"
+        class="login-log-table"
+      >
+        <el-table-column prop="id" label="ID" width="116" align="center" />
+        <el-table-column prop="member_account" label="会员账号" min-width="180" align="center" />
+        <el-table-column prop="login_time" label="登录时间" min-width="210" align="center" />
+        <el-table-column prop="domain" label="访问域名" min-width="360" align="center" />
+        <el-table-column prop="ip" label="IP地址" min-width="210" align="center">
+          <template slot-scope="{ row }">
+            <span class="ip-link" @click="openIpLookup(row.ip)">
+              {{ row.ip }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="device" label="设备" min-width="180" align="center">
+          <template slot-scope="{ row }">
+            <el-tag
+              size="small"
+              :type="row.device === '手机端' ? 'success' : ''"
+              effect="light"
+            >
+              {{ row.device }}
+            </el-tag>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <el-pagination
+        background
+        class="login-log-pagination"
+        layout="total, sizes, prev, pager, next, jumper"
+        :current-page="page"
+        :page-size="limit"
+        :page-sizes="[10, 20, 50, 100]"
+        :total="total"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'AgentLoginLog',
+  data() {
+    return {
+      loading: false,
+      query: {
+        member_account: '',
+        ip: '',
+        date_range: []
+      },
+      page: 1,
+      limit: 10,
+      total: 0,
+      tableData: []
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getMockRows() {
+      return [
+        {
+          id: 1,
+          member_account: 'qwe775825',
+          login_time: '2026-07-28 09:23:13',
+          domain: 'http://api-agent.ng-demo.xyz',
+          ip: '103.43.78.192',
+          device: '电脑端'
+        },
+        {
+          id: 2,
+          member_account: 'agent',
+          login_time: '2026-07-28 09:17:17',
+          domain: 'http://api-agent.ng-demo.xyz',
+          ip: '103.43.78.192',
+          device: '电脑端'
+        },
+        {
+          id: 3,
+          member_account: 'agent',
+          login_time: '2026-07-27 19:32:34',
+          domain: 'http://api-agent.ng-demo.xyz',
+          ip: '103.95.34.4',
+          device: '电脑端'
+        },
+        {
+          id: 4,
+          member_account: 'agent',
+          login_time: '2026-07-26 14:12:22',
+          domain: 'http://api-agent.ng-demo.xyz',
+          ip: '61.140.220.87',
+          device: '手机端'
+        },
+        {
+          id: 5,
+          member_account: 'agent',
+          login_time: '2026-07-26 04:04:26',
+          domain: 'http://api-agent.ng-demo.xyz',
+          ip: '188.253.12.37',
+          device: '电脑端'
+        },
+        {
+          id: 6,
+          member_account: 'agent',
+          login_time: '2026-07-25 23:16:13',
+          domain: 'http://api-agent.ng-demo.xyz',
+          ip: '95.41.10.57',
+          device: '手机端'
+        },
+        {
+          id: 7,
+          member_account: 'agent',
+          login_time: '2026-07-25 11:44:46',
+          domain: 'http://api-agent.ng-demo.xyz',
+          ip: '63.140.1.198',
+          device: '手机端'
+        },
+        {
+          id: 8,
+          member_account: 'agent',
+          login_time: '2026-07-25 03:08:45',
+          domain: 'http://api-agent.ng-demo.xyz',
+          ip: '61.140.220.87',
+          device: '手机端'
+        },
+        {
+          id: 9,
+          member_account: 'agent',
+          login_time: '2026-07-24 02:56:15',
+          domain: 'http://api-agent.ng-demo.xyz',
+          ip: '23.249.17.194',
+          device: '电脑端'
+        },
+        {
+          id: 10,
+          member_account: 'agent',
+          login_time: '2026-07-24 02:52:13',
+          domain: 'http://api-agent.ng-demo.xyz',
+          ip: '154.92.130.88',
+          device: '电脑端'
+        }
+      ]
+    },
+    getList() {
+      this.loading = true
+      const rows = this.getMockRows().filter(item => {
+        const accountMatched = !this.query.member_account || item.member_account.indexOf(this.query.member_account) > -1
+        const ipMatched = !this.query.ip || item.ip.indexOf(this.query.ip) > -1
+        return accountMatched && ipMatched
+      })
+      this.total = 546
+      this.tableData = rows.slice((this.page - 1) * this.limit, this.page * this.limit)
+      this.loading = false
+    },
+    handleSearch() {
+      this.page = 1
+      this.getList()
+    },
+    handleSizeChange(val) {
+      this.limit = val
+      this.page = 1
+      this.getList()
+    },
+    handleCurrentChange(val) {
+      this.page = val
+      this.getList()
+    },
+    openIpLookup(ip) {
+      this.$message.info(`查询IP归属地:${ip}`)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.agent-login-log-page {
+  width: 100%;
+  height: 100%;
+  padding: 16px;
+  overflow: hidden;
+  background: #f3f6f8;
+}
+
+.login-log-panel {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  padding: 20px 20px 12px;
+  overflow: hidden;
+  background: #fff;
+  box-shadow: 0 1px 8px rgba(0, 0, 0, 0.08);
+}
+
+.ip-alert {
+  flex-shrink: 0;
+  margin-bottom: 0;
+  border: 0;
+  border-radius: 3px;
+  background: #f1fbec;
+
+  ::v-deep .el-alert__title {
+    color: #31c323;
+    font-size: 18px;
+    font-weight: 700;
+  }
+}
+
+.login-log-search {
+  flex-shrink: 0;
+  padding-top: 0;
+  padding-bottom: 8px;
+
+  ::v-deep .el-form-item {
+    margin-right: 22px;
+    margin-bottom: 14px;
+  }
+
+  ::v-deep .el-form-item__label {
+    color: #303133;
+    font-weight: 500;
+  }
+
+  ::v-deep .el-input {
+    width: 236px;
+  }
+
+  ::v-deep .el-date-editor--daterange.el-input__inner {
+    width: 400px;
+  }
+}
+
+.search-actions {
+  margin-right: 0;
+}
+
+.login-log-table {
+  flex: 1;
+  min-height: 0;
+
+  ::v-deep th {
+    height: 44px;
+    background: #fff;
+    color: #7b8794;
+    font-weight: 600;
+  }
+
+  ::v-deep td {
+    height: 49px;
+    color: #334155;
+  }
+}
+
+.ip-link {
+  color: #20bfb2;
+  font-weight: 700;
+  cursor: pointer;
+}
+
+::v-deep .el-tag {
+  min-width: 58px;
+}
+
+::v-deep .el-tag--success {
+  color: #38c52f;
+  border-color: #c8efbf;
+  background-color: #effceb;
+}
+
+::v-deep .el-tag--light:not(.el-tag--success) {
+  color: #02a8e8;
+  border-color: #b8ddff;
+  background-color: #eef8ff;
+}
+
+.login-log-pagination {
+  flex-shrink: 0;
+  padding-top: 12px;
+  text-align: right;
+}
+
+@media (max-width: 1280px) {
+  .login-log-search {
+    ::v-deep .el-input {
+      width: 190px;
+    }
+
+    ::v-deep .el-date-editor--daterange.el-input__inner {
+      width: 330px;
+    }
+  }
+}
+</style>

+ 590 - 0
src/views/agent/report/index.vue

@@ -0,0 +1,590 @@
+<template>
+  <div class="agent-report-page">
+    <div class="report-panel">
+      <el-alert
+        class="formula-alert"
+        type="error"
+        :closable="true"
+        show-icon
+      >
+        <template slot="title">
+          公司盈亏计算方式:【总存款 减去 总提款 减去 总加送金额 减去 总优惠 减去 总红包 减去 总活动彩金 减去 总返水】 其中未包含【手动加/扣款】
+        </template>
+      </el-alert>
+
+      <el-form
+        ref="queryForm"
+        :model="query"
+        class="report-search"
+        inline
+        size="small"
+      >
+        <el-form-item label="代理账号" prop="agent_account">
+          <el-input
+            v-model="query.agent_account"
+            placeholder="代理账号"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item label="真实姓名" prop="real_name">
+          <el-input
+            v-model="query.real_name"
+            placeholder="真实姓名"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item label="时间" prop="date_range">
+          <el-date-picker
+            v-model="query.date_range"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="yyyy-MM-dd"
+          />
+        </el-form-item>
+        <el-form-item class="search-actions">
+          <el-button @click="handleSearch">查询</el-button>
+          <el-button type="primary" plain @click="handleExport">导出Excel</el-button>
+        </el-form-item>
+      </el-form>
+
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        border
+        height="calc(100vh - 305px)"
+        class="report-table"
+      >
+        <el-table-column prop="id" label="ID" width="54" align="center" fixed="left" />
+        <el-table-column label="代理自身" align="center">
+          <el-table-column prop="agent_account" label="账号" min-width="82" align="center" />
+          <el-table-column prop="real_name" label="真实姓名" min-width="82" align="center" />
+          <el-table-column prop="balance" label="账户余额" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.balance) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="locked_wallet" label="锁定钱包" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.locked_wallet) }}
+            </template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column label="下级数量" align="center">
+          <el-table-column prop="sub_count" label="代理数/会员数" min-width="90" align="center">
+            <template slot-scope="{ row }">
+              <span class="count-blue">({{ row.agent_count }})</span>
+              <span> / </span>
+              <span class="count-red">({{ row.member_count }})</span>
+            </template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column label="下级金额" align="center">
+          <el-table-column prop="member_balance" label="会员余额" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.member_balance) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="total_deposit" label="总存款" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              <span class="amount-red">{{ formatMoney(row.total_deposit) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column prop="total_bonus" label="总加送金额" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.total_bonus) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="total_withdraw" label="总提款" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.total_withdraw) }}
+            </template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column label="加/扣款" align="center">
+          <el-table-column prop="total_add" label="总加款" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.total_add) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="total_subtract" label="总扣款" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.total_subtract) }}
+            </template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column label="下级红利" align="center">
+          <el-table-column prop="total_discount" label="总优惠" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.total_discount) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="total_red_packet" label="总红包" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.total_red_packet) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="total_activity_bonus" label="总活动彩金" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.total_activity_bonus) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="total_rebate" label="总返水" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.total_rebate) }}
+            </template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column label="下级投注" align="center">
+          <el-table-column prop="total_bet" label="总投注" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.total_bet) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="total_valid_bet" label="总有效投注" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              {{ formatMoney(row.total_valid_bet) }}
+            </template>
+          </el-table-column>
+          <el-table-column prop="total_win" label="总输赢" min-width="82" align="center">
+            <template slot-scope="{ row }">
+              <el-tag
+                size="mini"
+                :type="Number(row.total_win) < 0 ? 'danger' : 'info'"
+                effect="plain"
+              >
+                {{ formatMoney(row.total_win) }}
+              </el-tag>
+            </template>
+          </el-table-column>
+        </el-table-column>
+        <el-table-column prop="company_profit" label="公司盈亏" min-width="82" align="center" fixed="right">
+          <template slot-scope="{ row }">
+            {{ formatMoney(row.company_profit) }}
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <el-pagination
+        background
+        class="report-pagination"
+        layout="total, sizes, prev, pager, next, jumper"
+        :current-page="page"
+        :page-size="limit"
+        :page-sizes="[10, 20, 50, 100]"
+        :total="total"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'AgentReport',
+  data() {
+    return {
+      loading: false,
+      query: {
+        agent_account: '',
+        real_name: '',
+        date_range: []
+      },
+      page: 1,
+      limit: 10,
+      total: 0,
+      tableData: []
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getMockRows() {
+      return [
+        {
+          id: 1,
+          agent_account: 'agent',
+          real_name: 'agent',
+          balance: 1234,
+          locked_wallet: 0,
+          agent_count: 14,
+          member_count: 3,
+          member_balance: 6105645.33,
+          total_deposit: 0,
+          total_bonus: 0,
+          total_withdraw: 999800,
+          total_add: 7127344,
+          total_subtract: 21899,
+          total_discount: 0,
+          total_red_packet: 0,
+          total_activity_bonus: 0,
+          total_rebate: 0.1115,
+          total_bet: 398.8,
+          total_valid_bet: 398.8,
+          total_win: -138,
+          company_profit: -999800.11
+        },
+        {
+          id: 2,
+          agent_account: 'zxc123',
+          real_name: 'zxc123',
+          balance: 0.33,
+          locked_wallet: 0,
+          agent_count: 1,
+          member_count: 0,
+          member_balance: 0,
+          total_deposit: 0,
+          total_bonus: 0,
+          total_withdraw: 0,
+          total_add: 0,
+          total_subtract: 0,
+          total_discount: 0,
+          total_red_packet: 0,
+          total_activity_bonus: 0,
+          total_rebate: 0,
+          total_bet: 0,
+          total_valid_bet: 0,
+          total_win: 0,
+          company_profit: 0
+        },
+        {
+          id: 3,
+          agent_account: 'a112411',
+          real_name: '',
+          balance: 0.03,
+          locked_wallet: 0,
+          agent_count: 0,
+          member_count: 0,
+          member_balance: 0,
+          total_deposit: 0,
+          total_bonus: 0,
+          total_withdraw: 0,
+          total_add: 0,
+          total_subtract: 0,
+          total_discount: 0,
+          total_red_packet: 0,
+          total_activity_bonus: 0,
+          total_rebate: 0,
+          total_bet: 0,
+          total_valid_bet: 0,
+          total_win: 0,
+          company_profit: 0
+        },
+        {
+          id: 4,
+          agent_account: '112411',
+          real_name: '',
+          balance: 0,
+          locked_wallet: 0,
+          agent_count: 0,
+          member_count: 0,
+          member_balance: 0,
+          total_deposit: 0,
+          total_bonus: 0,
+          total_withdraw: 0,
+          total_add: 0,
+          total_subtract: 0,
+          total_discount: 0,
+          total_red_packet: 0,
+          total_activity_bonus: 0,
+          total_rebate: 0,
+          total_bet: 0,
+          total_valid_bet: 0,
+          total_win: 0,
+          company_profit: 0
+        },
+        {
+          id: 5,
+          agent_account: '112400',
+          real_name: '',
+          balance: 0,
+          locked_wallet: 0,
+          agent_count: 0,
+          member_count: 0,
+          member_balance: 0,
+          total_deposit: 0,
+          total_bonus: 0,
+          total_withdraw: 0,
+          total_add: 0,
+          total_subtract: 0,
+          total_discount: 0,
+          total_red_packet: 0,
+          total_activity_bonus: 0,
+          total_rebate: 0,
+          total_bet: 0,
+          total_valid_bet: 0,
+          total_win: 0,
+          company_profit: 0
+        },
+        {
+          id: 6,
+          agent_account: 'zxc1122',
+          real_name: '',
+          balance: 122122,
+          locked_wallet: 0,
+          agent_count: 0,
+          member_count: 1,
+          member_balance: 5000,
+          total_deposit: 0,
+          total_bonus: 0,
+          total_withdraw: 0,
+          total_add: 100000,
+          total_subtract: 95000,
+          total_discount: 0,
+          total_red_packet: 0,
+          total_activity_bonus: 0,
+          total_rebate: 0,
+          total_bet: 0,
+          total_valid_bet: 0,
+          total_win: 0,
+          company_profit: 0
+        },
+        {
+          id: 7,
+          agent_account: 'zxc123456',
+          real_name: '',
+          balance: 100,
+          locked_wallet: 0,
+          agent_count: 0,
+          member_count: 0,
+          member_balance: 0,
+          total_deposit: 0,
+          total_bonus: 0,
+          total_withdraw: 0,
+          total_add: 0,
+          total_subtract: 0,
+          total_discount: 0,
+          total_red_packet: 0,
+          total_activity_bonus: 0,
+          total_rebate: 0,
+          total_bet: 0,
+          total_valid_bet: 0,
+          total_win: 0,
+          company_profit: 0
+        },
+        {
+          id: 8,
+          agent_account: 'admin',
+          real_name: '',
+          balance: 9999999,
+          locked_wallet: 0,
+          agent_count: 0,
+          member_count: 0,
+          member_balance: 0,
+          total_deposit: 0,
+          total_bonus: 0,
+          total_withdraw: 0,
+          total_add: 0,
+          total_subtract: 0,
+          total_discount: 0,
+          total_red_packet: 0,
+          total_activity_bonus: 0,
+          total_rebate: 0,
+          total_bet: 0,
+          total_valid_bet: 0,
+          total_win: 0,
+          company_profit: 0
+        },
+        {
+          id: 9,
+          agent_account: 'abc123',
+          real_name: '',
+          balance: 1222,
+          locked_wallet: 0,
+          agent_count: 0,
+          member_count: 0,
+          member_balance: 0,
+          total_deposit: 0,
+          total_bonus: 0,
+          total_withdraw: 0,
+          total_add: 0,
+          total_subtract: 0,
+          total_discount: 0,
+          total_red_packet: 0,
+          total_activity_bonus: 0,
+          total_rebate: 0,
+          total_bet: 0,
+          total_valid_bet: 0,
+          total_win: 0,
+          company_profit: 0
+        },
+        {
+          id: 10,
+          agent_account: 'abc1233',
+          real_name: '',
+          balance: 1999,
+          locked_wallet: 0,
+          agent_count: 0,
+          member_count: 0,
+          member_balance: 0,
+          total_deposit: 0,
+          total_bonus: 0,
+          total_withdraw: 0,
+          total_add: 0,
+          total_subtract: 0,
+          total_discount: 0,
+          total_red_packet: 0,
+          total_activity_bonus: 0,
+          total_rebate: 0,
+          total_bet: 0,
+          total_valid_bet: 0,
+          total_win: 0,
+          company_profit: 0
+        }
+      ]
+    },
+    getList() {
+      this.loading = true
+      const rows = this.getMockRows().filter(item => {
+        const accountMatched = !this.query.agent_account || item.agent_account.indexOf(this.query.agent_account) > -1
+        const realNameMatched = !this.query.real_name || item.real_name.indexOf(this.query.real_name) > -1
+        return accountMatched && realNameMatched
+      })
+      this.total = rows.length
+      this.tableData = rows.slice((this.page - 1) * this.limit, this.page * this.limit)
+      this.loading = false
+    },
+    handleSearch() {
+      this.page = 1
+      this.getList()
+    },
+    handleExport() {
+      this.$message.success('导出任务已创建')
+    },
+    handleSizeChange(val) {
+      this.limit = val
+      this.page = 1
+      this.getList()
+    },
+    handleCurrentChange(val) {
+      this.page = val
+      this.getList()
+    },
+    formatMoney(value) {
+      const numberValue = Number(value)
+      if (Number.isNaN(numberValue)) return value || 0
+      return Number.isInteger(numberValue) ? numberValue : numberValue.toFixed(2)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.agent-report-page {
+  width: 100%;
+  height: 100%;
+  padding: 0 16px 16px;
+  overflow: hidden;
+  background: #f3f6f8;
+}
+
+.report-panel {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  padding: 0 20px 12px;
+  overflow: hidden;
+  background: #fff;
+  box-shadow: 0 1px 8px rgba(0, 0, 0, 0.08);
+}
+
+.formula-alert {
+  flex-shrink: 0;
+  margin-bottom: 16px;
+  border: 0;
+  border-radius: 3px;
+  background: #fff0f0;
+
+  ::v-deep .el-alert__title {
+    color: #ff4d4f;
+    font-size: 18px;
+    font-weight: 700;
+  }
+}
+
+.report-search {
+  flex-shrink: 0;
+  padding-bottom: 8px;
+
+  ::v-deep .el-form-item {
+    margin-right: 18px;
+    margin-bottom: 14px;
+  }
+
+  ::v-deep .el-form-item__label {
+    color: #303133;
+    font-weight: 500;
+  }
+
+  ::v-deep .el-input {
+    width: 236px;
+  }
+
+  ::v-deep .el-date-editor--daterange.el-input__inner {
+    width: 350px;
+  }
+}
+
+.search-actions {
+  margin-right: 0;
+
+  ::v-deep .el-button--primary.is-plain {
+    color: #00a996;
+    border-color: #91dfd8;
+    background: #eafffc;
+  }
+}
+
+.report-table {
+  flex: 1;
+  min-height: 0;
+
+  ::v-deep th {
+    height: 44px;
+    background: #f5f7fa;
+    color: #7b8794;
+    font-weight: 600;
+  }
+
+  ::v-deep td {
+    height: 49px;
+    color: #334155;
+  }
+
+  ::v-deep .el-table__row:nth-child(even) td {
+    background: #f6f8fb;
+  }
+}
+
+.count-blue {
+  color: #003cff;
+  font-weight: 700;
+}
+
+.count-red,
+.amount-red {
+  color: #ff0000;
+  font-weight: 700;
+}
+
+.report-pagination {
+  flex-shrink: 0;
+  padding-top: 12px;
+  text-align: right;
+}
+
+@media (max-width: 1280px) {
+  .report-search {
+    ::v-deep .el-input {
+      width: 190px;
+    }
+
+    ::v-deep .el-date-editor--daterange.el-input__inner {
+      width: 310px;
+    }
+  }
+}
+</style>

+ 398 - 0
src/views/agent/withdrawLog/index.vue

@@ -0,0 +1,398 @@
+<template>
+  <div class="agent-withdraw-page">
+    <div class="withdraw-panel">
+      <el-form
+        ref="queryForm"
+        :model="query"
+        class="withdraw-search"
+        inline
+        size="small"
+      >
+        <el-form-item label="会员账号" prop="member_account">
+          <el-input
+            v-model="query.member_account"
+            placeholder="会员账号"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item label="订单号" prop="order_no">
+          <el-input
+            v-model="query.order_no"
+            placeholder="订单号"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item label="启用状态" prop="status">
+          <el-select v-model="query.status" placeholder="启用状态" clearable>
+            <el-option label="待处理" value="pending" />
+            <el-option label="成功" value="success" />
+            <el-option label="失败" value="failed" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="申请日期" prop="date_range">
+          <el-date-picker
+            v-model="query.date_range"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="开始日期"
+            end-placeholder="结束日期"
+            value-format="yyyy-MM-dd"
+          />
+        </el-form-item>
+        <el-form-item class="search-actions">
+          <el-button @click="handleSearch">查询</el-button>
+        </el-form-item>
+      </el-form>
+
+      <el-table
+        v-loading="loading"
+        :data="tableData"
+        border
+        height="calc(100vh - 275px)"
+        class="withdraw-table"
+        :row-class-name="tableRowClassName"
+      >
+        <el-table-column prop="order_no" label="订单号" min-width="200" align="center" />
+        <el-table-column prop="member_account" label="会员账号" min-width="150" align="center" />
+        <el-table-column prop="real_name" label="真实姓名" min-width="150" align="center" />
+        <el-table-column prop="withdraw_amount" label="提现金额" min-width="160" align="center">
+          <template slot-scope="{ row }">
+            {{ formatMoney(row.withdraw_amount) }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="withdraw_fee" label="提现手续费" min-width="150" align="center">
+          <template slot-scope="{ row }">
+            {{ formatMoney(row.withdraw_fee) }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="usdt_amount" label="出款USDT数量" min-width="150" align="center">
+          <template slot-scope="{ row }">
+            {{ formatMoney(row.usdt_amount) }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="withdraw_method" label="取款方式" min-width="180" align="center" />
+        <el-table-column prop="withdraw_type" label="取款类型" min-width="150" align="center">
+          <template slot-scope="{ row }">
+            <el-tag size="mini" type="success" effect="light">
+              {{ row.withdraw_type }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column prop="withdraw_address" label="取款地址" min-width="220" align="center" />
+        <el-table-column prop="created_at" label="申请时间" min-width="170" align="center">
+          <template slot-scope="{ row }">
+            {{ row.created_at || '--' }}
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="100" fixed="right" align="center">
+          <template>
+            <span class="empty-action">--</span>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <el-pagination
+        background
+        class="withdraw-pagination"
+        layout="total, sizes, prev, pager, next, jumper"
+        :current-page="page"
+        :page-size="limit"
+        :page-sizes="[10, 20, 50, 100]"
+        :total="total"
+        @size-change="handleSizeChange"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'AgentWithdrawLog',
+  data() {
+    return {
+      loading: false,
+      query: {
+        member_account: '',
+        order_no: '',
+        status: '',
+        date_range: []
+      },
+      page: 1,
+      limit: 10,
+      total: 0,
+      tableData: []
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    getMockRows() {
+      return [
+        {
+          order_no: '26041907503087021681',
+          member_account: 'zxc123',
+          real_name: 'zxc123',
+          withdraw_amount: 9800,
+          withdraw_fee: 0,
+          usdt_amount: 0,
+          withdraw_method: '支付宝',
+          withdraw_type: '即时取款',
+          withdraw_address: '18408708806',
+          status: 'success',
+          created_at: ''
+        },
+        {
+          order_no: '26041907444978896357',
+          member_account: 'zxc123',
+          real_name: 'zxc123',
+          withdraw_amount: 90000,
+          withdraw_fee: 0,
+          usdt_amount: 0,
+          withdraw_method: '支付宝',
+          withdraw_type: '即时取款',
+          withdraw_address: '18408708806',
+          status: 'success',
+          created_at: ''
+        },
+        {
+          order_no: '26041907441669305898',
+          member_account: 'zxc123',
+          real_name: 'zxc123',
+          withdraw_amount: 900000,
+          withdraw_fee: 0,
+          usdt_amount: 0,
+          withdraw_method: '支付宝',
+          withdraw_type: '即时取款',
+          withdraw_address: '18408708806',
+          status: 'success',
+          created_at: ''
+        },
+        {
+          order_no: '26031112595929507936',
+          member_account: 'agent',
+          real_name: 'agent',
+          withdraw_amount: 1234,
+          withdraw_fee: 0,
+          usdt_amount: 0,
+          withdraw_method: 'K豆钱包(代付)',
+          withdraw_type: '即时取款',
+          withdraw_address: 'a',
+          status: 'success',
+          created_at: ''
+        },
+        {
+          order_no: '26020109555433162264',
+          member_account: 'agent',
+          real_name: 'agent',
+          withdraw_amount: 1234,
+          withdraw_fee: 0,
+          usdt_amount: 0,
+          withdraw_method: 'K豆钱包(代付)',
+          withdraw_type: '即时取款',
+          withdraw_address: 'a',
+          status: 'success',
+          created_at: ''
+        },
+        {
+          order_no: '25082602570070976086',
+          member_account: 'agent',
+          real_name: 'agent',
+          withdraw_amount: 2500,
+          withdraw_fee: 0,
+          usdt_amount: 347.22,
+          withdraw_method: 'USDT提币',
+          withdraw_type: '即时取款',
+          withdraw_address: '演示数据',
+          status: 'success',
+          created_at: ''
+        },
+        {
+          order_no: '25082602560856350122',
+          member_account: 'agent',
+          real_name: 'agent',
+          withdraw_amount: 10000,
+          withdraw_fee: 0,
+          usdt_amount: 1388.89,
+          withdraw_method: 'USDT提币',
+          withdraw_type: '即时取款',
+          withdraw_address: '演示数据',
+          status: 'success',
+          created_at: ''
+        },
+        {
+          order_no: '25082602555492512945',
+          member_account: 'agent',
+          real_name: 'agent',
+          withdraw_amount: 10000,
+          withdraw_fee: 0,
+          usdt_amount: 1388.89,
+          withdraw_method: 'USDT提币',
+          withdraw_type: '即时取款',
+          withdraw_address: '演示数据',
+          status: 'success',
+          created_at: ''
+        },
+        {
+          order_no: '25073020481092019401',
+          member_account: 'agent',
+          real_name: 'agent',
+          withdraw_amount: 34917,
+          withdraw_fee: 0,
+          usdt_amount: 0,
+          withdraw_method: '支付宝',
+          withdraw_type: '即时取款',
+          withdraw_address: '演示数据',
+          status: 'success',
+          created_at: ''
+        },
+        {
+          order_no: '25073020463230869159',
+          member_account: 'agent',
+          real_name: 'agent',
+          withdraw_amount: 5000,
+          withdraw_fee: 0,
+          usdt_amount: 0,
+          withdraw_method: '支付宝',
+          withdraw_type: '即时取款',
+          withdraw_address: '演示数据',
+          status: 'success',
+          created_at: ''
+        }
+      ]
+    },
+    getList() {
+      this.loading = true
+      const rows = this.getMockRows().filter(item => {
+        const accountMatched = !this.query.member_account || item.member_account.indexOf(this.query.member_account) > -1
+        const orderMatched = !this.query.order_no || item.order_no.indexOf(this.query.order_no) > -1
+        const statusMatched = !this.query.status || item.status === this.query.status
+        return accountMatched && orderMatched && statusMatched
+      })
+      this.total = rows.length
+      this.tableData = rows.slice((this.page - 1) * this.limit, this.page * this.limit)
+      this.loading = false
+    },
+    handleSearch() {
+      this.page = 1
+      this.getList()
+    },
+    handleSizeChange(val) {
+      this.limit = val
+      this.page = 1
+      this.getList()
+    },
+    handleCurrentChange(val) {
+      this.page = val
+      this.getList()
+    },
+    tableRowClassName({ rowIndex }) {
+      return rowIndex === 5 ? 'withdraw-row-tint' : ''
+    },
+    formatMoney(value) {
+      const numberValue = Number(value)
+      if (Number.isNaN(numberValue)) return value || 0
+      return Number.isInteger(numberValue) ? numberValue : numberValue.toFixed(2)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.agent-withdraw-page {
+  width: 100%;
+  height: 100%;
+  padding: 16px;
+  overflow: hidden;
+  background: #f3f6f8;
+}
+
+.withdraw-panel {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+  padding: 20px 20px 12px;
+  overflow: hidden;
+  background: #fff;
+  box-shadow: 0 1px 8px rgba(0, 0, 0, 0.08);
+}
+
+.withdraw-search {
+  flex-shrink: 0;
+  padding-bottom: 8px;
+
+  ::v-deep .el-form-item {
+    margin-right: 22px;
+    margin-bottom: 14px;
+  }
+
+  ::v-deep .el-form-item__label {
+    color: #303133;
+    font-weight: 500;
+  }
+
+  ::v-deep .el-input,
+  ::v-deep .el-select {
+    width: 236px;
+  }
+
+  ::v-deep .el-date-editor--daterange.el-input__inner {
+    width: 400px;
+  }
+}
+
+.search-actions {
+  margin-right: 0;
+}
+
+.withdraw-table {
+  flex: 1;
+  min-height: 0;
+
+  ::v-deep th {
+    height: 44px;
+    background: #fff;
+    color: #7b8794;
+    font-weight: 600;
+  }
+
+  ::v-deep td {
+    height: 45px;
+    color: #334155;
+  }
+
+  ::v-deep .withdraw-row-tint td {
+    background: #e9fbfb;
+  }
+
+  ::v-deep .el-tag--success {
+    color: #18c80a;
+    border-color: #c8efbf;
+    background-color: #effceb;
+  }
+}
+
+.withdraw-pagination {
+  flex-shrink: 0;
+  padding-top: 12px;
+  text-align: right;
+}
+
+.empty-action {
+  color: #909399;
+}
+
+@media (max-width: 1280px) {
+  .withdraw-search {
+    ::v-deep .el-input,
+    ::v-deep .el-select {
+      width: 190px;
+    }
+
+    ::v-deep .el-date-editor--daterange.el-input__inner {
+      width: 330px;
+    }
+  }
+}
+</style>