shadowsocks-manager
Version:
A shadowsocks manager tool for multi user and traffic control.
320 lines (311 loc) • 10.6 kB
JavaScript
const app = angular.module('app');
app.controller('AdminUserController', ['$scope', '$state', '$stateParams', 'adminApi', '$mdMedia', '$localStorage', 'userSortDialog', '$timeout',
($scope, $state, $stateParams, adminApi, $mdMedia, $localStorage, userSortDialog, $timeout) => {
$scope.setTitle('用户');
$scope.setMenuSearchButton('search');
$scope.setFabButton(() => {
$state.go('admin.addUser');
});
if(!$localStorage.admin.userSortSettings) {
$localStorage.admin.userSortSettings = {
sort: 'id_asc',
type: {
normal: true,
},
group: -1,
};
}
$scope.userSort = $localStorage.admin.userSortSettings;
$scope.setMenuRightButton('sort_by_alpha');
$scope.currentPage = 1;
$scope.isUserLoading = false;
$scope.isUserPageFinish = false;
$scope.users = [];
const getPageSize = () => {
if($mdMedia('xs')) { return 30; }
if($mdMedia('sm')) { return 30; }
if($mdMedia('md')) { return 60; }
if($mdMedia('gt-md')) { return 80; }
};
$scope.getUsers = (search) => {
$scope.isUserLoading = true;
adminApi.getUser({
page: $scope.currentPage,
pageSize: getPageSize(),
search,
sort: $scope.userSort.sort,
type: $scope.userSort.type,
group: $scope.userSort.group,
}).then(success => {
$scope.total = success.total;
if(!search && $scope.menuSearch.text) { return; }
if(search && search !== $scope.menuSearch.text) { return; }
success.users.forEach(f => {
$scope.users.push(f);
});
if(success.maxPage > $scope.currentPage) {
$scope.currentPage++;
} else {
$scope.isUserPageFinish = true;
}
$scope.isUserLoading = false;
}).catch(() => {
if($state.current.name !== 'admin.user') { return; }
$timeout(() => {
$scope.getUsers(search);
}, 5000);
});
};
const userFilter = () => {
$scope.users = [];
$scope.currentPage = 1;
$scope.isUserPageFinish = false;
$scope.getUsers($scope.menuSearch.text);
};
$scope.toUser = user => {
if(user.type === 'normal') {
$state.go('admin.userPage', { userId: user.id });
} else {
$state.go('admin.adminPage', { userId: user.id });
}
};
$scope.$on('cancelSearch', () => {
$scope.users = [];
$scope.currentPage = 1;
$scope.isUserPageFinish = false;
$scope.getUsers();
});
let timeoutPromise;
$scope.$watch('menuSearch.text', () => {
if(!$scope.menuSearch.text) { return; }
timeoutPromise && $timeout.cancel(timeoutPromise);
timeoutPromise = $timeout(() => {
userFilter();
}, 500);
});
$scope.view = (inview) => {
if(!inview || $scope.isUserLoading || $scope.isUserPageFinish) { return; }
$scope.getUsers();
};
$scope.userSortDialog = () => {
userSortDialog.show($scope.id).then(() => {
$scope.users = [];
$scope.currentPage = 1;
$scope.isUserPageFinish = false;
$scope.getUsers();
});
};
$scope.$on('RightButtonClick', () => {
$scope.userSortDialog();
});
$scope.userColor = user => {
if(!user.port) {
return {
background: 'red-50', 'border-color': 'blue-300',
};
}
return {};
};
}
])
.controller('AdminUserPageController', ['$scope', '$state', '$stateParams', '$http', 'editUserCommentDialog', 'adminApi', 'orderDialog', 'confirmDialog', 'emailDialog', 'addAccountDialog', 'setGroupDialog',
($scope, $state, $stateParams, $http, editUserCommentDialog, adminApi, orderDialog, confirmDialog, emailDialog, addAccountDialog, setGroupDialog) => {
$scope.setTitle('用户信息');
$scope.setMenuButton('arrow_back', 'admin.user');
const userId = $stateParams.userId;
$scope.user = { username: '...' };
const getUserData = () => {
adminApi.getUserData(userId).then(success => {
$scope.user = success.user;
$scope.server = success.server;
$scope.alipayOrders = success.alipayOrders;
$scope.paypalOrders = success.paypalOrders;
$scope.giftCardOrders = success.giftCardOrders;
$scope.refOrders = success.refOrders;
$scope.refUsers = success.refUsers;
$scope.refCodes = success.refCodes;
$scope.user.account.forEach(f => {
adminApi.getUserPortLastConnect(f.id).then(success => {
f.lastConnect = success.lastConnect;
});
});
$scope.user.macAccount = success.macAccount;
}).catch(err => {
$state.go('admin.user');
});
};
getUserData();
$scope.deleteUserAccount = (accountId) => {
confirmDialog.show({
text: '将此账号移除出该用户的列表?',
cancel: '取消',
confirm: '移除',
error: '移除账号失败',
fn: function () { return $http.delete(`/api/admin/user/${ userId }/${ accountId }`); },
}).then(() => {
getUserData();
}).catch(() => {
});
};
$scope.deleteMacAccount = accountId => {
confirmDialog.show({
text: '删除该账号?',
cancel: '取消',
confirm: '删除',
error: '删除账号失败',
fn: function () { return $http.delete('/api/admin/account/mac/', {
params: { id: accountId },
}); },
}).then(() => {
getUserData();
}).catch(() => {
});
};
$scope.setFabButton(() => {
addAccountDialog.show(userId, $scope.user.account, $scope.server, $scope.id).then(success => {
getUserData();
});
});
$scope.editMacAccount = account => {
addAccountDialog.edit(account, $scope.user.account, $scope.server).then(success => {
getUserData();
});
};
$scope.toAccountPage = port => {
adminApi.getAccountId(port).then(id => {
$state.go('admin.accountPage', { accountId: id });
});
};
$scope.showOrderInfo = order => {
orderDialog.show(order);
};
$scope.deleteUser = () => {
confirmDialog.show({
text: '真的要删除该用户吗?',
cancel: '取消',
confirm: '删除',
error: '删除用户失败',
fn: function () {
return $http.delete(`/api/admin/user/${ userId }`);
},
}).then(() => {
$state.go('admin.user');
});
};
$scope.sendEmail = () => {
emailDialog.show(userId);
};
$scope.setUserGroup = () => {
setGroupDialog.show(userId, $scope.user.group).then(success => {
getUserData();
});
};
$http.get('/api/admin/group').then(success => {
$scope.groups = success.data;
$scope.groupInfo = {};
$scope.groups.forEach(f => {
$scope.groupInfo[f.id] = { name: f.name, comment: f.comment };
});
});
$scope.toRefUser = userId => {
$state.go('admin.userPage', { userId });
};
$scope.deleteRefUser = refUserId => {
confirmDialog.show({
text: '删除该邀请关系?',
cancel: '取消',
confirm: '删除',
error: '删除邀请关系失败',
fn: function () { return $http.delete(`/api/admin/ref/${ userId }/${ refUserId }`); },
}).then(() => {
getUserData();
}).catch(() => {
});
};
$scope.deleteRefCode = code => {
confirmDialog.show({
text: '删除该邀请码?\n注意,邀请码对应的邀请关系也会一并删除',
cancel: '取消',
confirm: '删除',
error: '删除邀请码失败',
fn: function () { return $http.delete(`/api/admin/ref/${ code }`); },
}).then(() => {
getUserData();
}).catch(() => {
});
};
$scope.editComment = () => {
editUserCommentDialog.show($scope.user.id, $scope.user.comment).then(() => {
getUserData();
});
};
}
])
.controller('AdminAddUserController', ['$scope', '$state', '$stateParams', '$http', 'alertDialog',
($scope, $state, $stateParams, $http, alertDialog) => {
$scope.setTitle('添加用户');
$scope.setMenuButton('arrow_back', 'admin.user');
$scope.user = { type: 'normal' };
$scope.confirm = () => {
alertDialog.loading();
$http.post('/api/admin/user/add', {
email: $scope.user.email,
password: $scope.user.password,
type: $scope.user.type,
}, {
timeout: 15000,
}).then(success => {
alertDialog.show('添加用户成功', '确定');
$state.go('admin.user');
}).catch(() => {
alertDialog.show('添加用户失败', '确定');
});
};
$scope.cancel = () => {
$state.go('admin.user');
};
}
])
.controller('AdminAdminPageController', ['$scope', '$state', '$stateParams', '$http', 'adminApi', 'setGroupDialog', 'confirmDialog',
($scope, $state, $stateParams, $http, adminApi, setGroupDialog, confirmDialog) => {
$scope.setTitle('管理员信息');
$scope.setMenuButton('arrow_back', 'admin.user');
const userId = $stateParams.userId;
$scope.user = { username: '...' };
const getAdminData = () => {
adminApi.getAdminData(userId).then(success => {
$scope.user = success.user;
}).catch(err => {
$state.go('admin.user');
});
};
getAdminData();
$scope.deleteUser = () => {
confirmDialog.show({
text: '真的要删除该用户吗?',
cancel: '取消',
confirm: '删除',
error: '删除用户失败',
fn: function () {
return $http.delete(`/api/admin/user/${ userId }`);
},
}).then(() => {
$state.go('admin.user');
});
};
$scope.setUserGroup = () => {
setGroupDialog.show(userId, $scope.user.group).then(success => {
getAdminData();
});
};
$http.get('/api/admin/group').then(success => {
$scope.groups = success.data;
$scope.groups.unshift({ id: 0, name: '无分组', comment: '' });
$scope.groupInfo = {};
$scope.groups.forEach(f => {
$scope.groupInfo[f.id] = { name: f.name, comment: f.comment };
});
});
}
])
;