shadowsocks-manager
Version:
A shadowsocks manager tool for multi user and traffic control.
357 lines (350 loc) • 11.9 kB
JavaScript
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');
}
]);