UNPKG

shadowsocks-manager

Version:

A shadowsocks manager tool for multi user and traffic control.

357 lines (350 loc) 11.9 kB
const app = angular.module('app'); app.controller('AdminController', ['$scope', '$mdMedia', '$mdSidenav', '$state', '$http', '$document', '$interval', '$timeout', '$localStorage', 'configManager', ($scope, $mdMedia, $mdSidenav, $state, $http, $document, $interval, $timeout, $localStorage, configManager) => { const config = configManager.getConfig(); if(config.status === 'normal') { return $state.go('user.index'); } else if(!config.status) { return $state.go('home.index'); } else { $scope.setMainLoading(false); } $scope.setConfig(config); $scope.setId(config.id); $scope.innerSideNav = true; $scope.sideNavWidth = () => { if($scope.innerSideNav) { return { width: '200px', }; } else { return { width: '60px', }; } }; $scope.menus = [{ name: '首页', icon: 'home', click: 'admin.index', }, { name: '服务器', icon: 'cloud', click: 'admin.server', hide: !!($scope.id !== 1), }, { name: '用户', icon: 'people', click: 'admin.user', }, { name: '账号', icon: 'account_circle', click: 'admin.account', }, { name: '订单', icon: 'attach_money', click: 'admin.pay', }, { name: '设置', icon: 'settings', click: 'admin.settings', }, { name: 'divider', }, { name: '退出', icon: 'exit_to_app', click: function() { $http.post('/api/home/logout').then(() => { $localStorage.home = {}; $localStorage.admin = {}; configManager.deleteConfig(); $state.go('home.index'); }); }, }]; $scope.menuButton = function() { if($scope.menuButtonIcon) { return $scope.menuButtonClick(); } if ($mdMedia('gt-sm')) { $scope.innerSideNav = !$scope.innerSideNav; } else { $mdSidenav('left').toggle(); } }; $scope.menuClick = (index) => { $mdSidenav('left').close(); if(typeof $scope.menus[index].click === 'function') { $scope.menus[index].click(); } else { $state.go($scope.menus[index].click); } }; $scope.title = ''; $scope.setTitle = str => { $scope.title = str; }; $scope.fabButton = false; $scope.fabButtonIcon = ''; $scope.fabButtonClick = () => {}; $scope.setFabButton = (fn, icon = '') => { $scope.fabButtonIcon = icon; if(!fn) { $scope.fabButton = false; $scope.fabButtonClick = () => {}; return; } $scope.fabButton = true; $scope.fabButtonClick = fn; }; $scope.menuButtonIcon = ''; $scope.menuButtonClick = () => {}; let isHistoryBackClick = false; let menuButtonHistoryBackState = ''; let menuButtonHistoryBackStateParams = {}; const menuButtonBackFn = (to, toParams = {}) => { if(menuButtonHistoryBackState) { return function () { isHistoryBackClick = true; $state.go(menuButtonHistoryBackState, menuButtonHistoryBackStateParams); }; } else { return function () { isHistoryBackClick = false; $state.go(to, toParams); }; } }; $scope.setMenuButton = (icon, to, toParams = {}) => { $scope.menuButtonIcon = icon; if(typeof to === 'string') { $scope.menuButtonClick = menuButtonBackFn(to, toParams); } else { isHistoryBackClick = true; $scope.menuButtonClick = to; } }; $scope.menuRightButtonIcon = ''; $scope.menuRightButtonClick = () => { $scope.$broadcast('RightButtonClick', 'click'); }; $scope.setMenuRightButton = (icon) => { $scope.menuRightButtonIcon = icon; }; $scope.menuSearchButtonIcon = ''; $scope.menuSearch = { input: false, text: '', }; $scope.menuSearchButtonClick = () => { $scope.menuSearch.input = true; }; $scope.setMenuSearchButton = (icon) => { $scope.menuSearchButtonIcon = icon; }; $scope.cancelSearch = () => { $scope.menuSearch.text = ''; $scope.menuSearch.input = false; $scope.$broadcast('cancelSearch', 'cancel'); }; $scope.interval = null; $scope.setInterval = interval => { $scope.interval = interval; }; $scope.$on('$stateChangeStart', function(event, toUrl, fromUrl) { $scope.fabButton = false; $scope.fabButtonIcon = ''; $scope.title = ''; $scope.menuButtonIcon = ''; $scope.menuRightButtonIcon = ''; $scope.menuSearchButtonIcon = ''; $scope.menuSearch.text = ''; $scope.menuSearch.input = false; $scope.interval && $interval.cancel($scope.interval); if(!isHistoryBackClick) { const str = angular.copy($state.current.name); const obj = angular.copy($state.params); menuButtonHistoryBackState = str; menuButtonHistoryBackStateParams = obj; } else { isHistoryBackClick = false; menuButtonHistoryBackState = ''; menuButtonHistoryBackStateParams = {}; } }); } ]) .controller('AdminIndexController', ['$scope', '$state', 'adminApi', '$localStorage', '$interval', 'orderDialog', ($scope, $state, adminApi, $localStorage, $interval, orderDialog) => { $scope.setTitle('首页'); if($localStorage.admin.indexInfo) { $scope.signupUsers = $localStorage.admin.indexInfo.data.signup; $scope.loginUsers = $localStorage.admin.indexInfo.data.login; $scope.orders = $localStorage.admin.indexInfo.data.order; $scope.paypalOrders = $localStorage.admin.indexInfo.data.paypalOrder; $scope.topFlow = $localStorage.admin.indexInfo.data.topFlow; } $scope.toUser = id => { $state.go('admin.userPage', { userId: id }); }; const updateIndexInfo = () => { adminApi.getIndexInfo().then(success => { $localStorage.admin.indexInfo = { time: Date.now(), data: success, }; $scope.signupUsers = success.signup; $scope.loginUsers = success.login; $scope.orders = success.order; $scope.paypalOrders = success.paypalOrder; $scope.topFlow = success.topFlow; }); }; updateIndexInfo(); $scope.$on('visibilitychange', (event, status) => { if(status === 'visible') { if($localStorage.admin.indexInfo && Date.now() - $localStorage.admin.indexInfo.time >= 15 * 1000) { updateIndexInfo(); } } }); $scope.setInterval($interval(() => { if($localStorage.admin.indexInfo && Date.now() - $localStorage.admin.indexInfo.time >= 90 * 1000) { updateIndexInfo(); } }, 15 * 1000)); $scope.showOrderInfo = order => { orderDialog.show(order); }; $scope.toTopUser = top => { if(top.email) { $state.go('admin.userPage', { userId: top.userId }); } else { $state.go('admin.accountPage', { accountId: top.accountId }); } }; } ]) .controller('AdminPayController', ['$scope', 'adminApi', 'orderDialog', '$mdMedia', '$localStorage', 'orderFilterDialog', '$timeout', '$state', ($scope, adminApi, orderDialog, $mdMedia, $localStorage, orderFilterDialog, $timeout, $state) => { $scope.setTitle('订单'); $scope.setMenuSearchButton('search'); $scope.showOrderInfo = order => { orderDialog.show(order); }; $scope.myPayType = ''; let tabSwitchTime = 0; $scope.payTypes = []; if($scope.config.alipay) { $scope.payTypes.push({ name: '支付宝' }); } if($scope.config.paypal) { $scope.payTypes.push({ name: 'Paypal' }); } if($scope.config.giftcard) { $scope.payTypes.push({ name: '充值码' }); } if($scope.config.refCode) { $scope.payTypes.push({ name: '邀请码' }); } if($scope.payTypes.length) { $scope.myPayType = $scope.payTypes[0].name; } $scope.selectPayType = type => { tabSwitchTime = Date.now(); $scope.myPayType = type; $scope.orders = []; $scope.currentPage = 1; $scope.isOrderPageFinish = false; $scope.getOrders(); }; if(!$localStorage.admin.orderFilterSettings) { $localStorage.admin.orderFilterSettings = { filter: { CREATE: true, WAIT_BUYER_PAY: true, TRADE_SUCCESS: true, FINISH: true, TRADE_CLOSED: true, }, group: -1, }; } $scope.orderFilter = $localStorage.admin.orderFilterSettings; $scope.currentPage = 1; $scope.isOrderLoading = false; $scope.isOrderPageFinish = false; $scope.orders = []; const getPageSize = () => { if($mdMedia('xs')) { return 30; } if($mdMedia('sm')) { return 30; } if($mdMedia('md')) { return 40; } if($mdMedia('gt-md')) { return 50; } }; $scope.getOrders = search => { if(!$scope.payTypes.length) { return; } const oldTabSwitchTime = tabSwitchTime; $scope.isOrderLoading = true; adminApi.getOrder($scope.myPayType, { start: $scope.orderFilter.start, end: $scope.orderFilter.end, page: $scope.currentPage, pageSize: getPageSize(), search, // sort: $scope.userSort.sort, group: $scope.orderFilter.group, filter: Object.keys($scope.orderFilter.filter).filter(f => $scope.orderFilter.filter[f]), }).then(success => { if(oldTabSwitchTime !== tabSwitchTime) { return; } if(!search && $scope.menuSearch.text) { return; } if(search && search !== $scope.menuSearch.text) { return; } success.orders.forEach(f => { $scope.orders.push(f); }); if(success.maxPage > $scope.currentPage) { $scope.currentPage++; } else { $scope.isOrderPageFinish = true; } $scope.isOrderLoading = false; }).catch(() => { if($state.current.name !== 'admin.pay') { return; } $timeout(() => { $scope.getOrders(search); }, 5000); }); }; $scope.$on('cancelSearch', () => { $scope.orders = []; $scope.currentPage = 1; $scope.isOrderPageFinish = false; $scope.getOrders(); }); let timeoutPromise; const orderFilter = () => { $scope.orders = []; $scope.currentPage = 1; $scope.isOrderPageFinish = false; $scope.getOrders($scope.menuSearch.text); }; $scope.$watch('menuSearch.text', () => { if(!$scope.menuSearch.text) { return; } timeoutPromise && $timeout.cancel(timeoutPromise); timeoutPromise = $timeout(() => { orderFilter(); }, 500); }); $scope.view = (inview) => { if(!inview || $scope.isOrderLoading || $scope.isOrderPageFinish) { return; } $scope.getOrders(); }; $scope.setMenuRightButton('sort_by_alpha'); $scope.orderFilterDialog = () => { orderFilterDialog.show($scope.id).then(() => { $scope.orders = []; $scope.currentPage = 1; $scope.isOrderPageFinish = false; $scope.getOrders(); }); }; $scope.$on('RightButtonClick', () => { $scope.orderFilterDialog(); }); $scope.setFabButton(() => { adminApi.getCsvOrder($scope.myPayType, { start: $scope.orderFilter.start, end: $scope.orderFilter.end, group: $scope.orderFilter.group, filter: Object.keys($scope.orderFilter.filter).filter(f => $scope.orderFilter.filter[f]), }); }, 'get_app'); } ]);