一、概述
根据官方解释的话,apollo-portal-1.2.0-github.zip 默认是只有apollo是有权限的,所以我们只能采取 build的方式去打包编译,官方搭建步骤:https://github.com/ctripcorp/apollo/wiki。虽然官方说,我只需要在数据库的ApolloPortalDB中的ServerConfig 表中去添加,但是还是只能看到 DEV 的环境的 配置文件,所以我们怎么来控制呐。今天我来写一下。
- 前端js修改
- 数据库中添加
二、前端js修改
首先我们应该到官网上去下载源码,apollo-xxxx.tar.gz,版本自己定,我这边用xxx表示,然后在我们的windows机器上去解压。然后我们进入到 apollo-portal中,路径如下:
C:\apollo-xxxx\apollo-portal\src\main\resources\static\scripts\controller\config\ConfigBaseInfoController.js
修改ConfigBaseInfoController.js 文件:
function loadNavTree() { //172行,修改的函数名 ..... EventManager.emit(EventManager.EventType.REFRESH_NAMESPACE); //178行 //登录人账号 var loginUserId=$rootScope.pageContext.userId; var adminUserIdList=[\'admin\',\'xxx\',\'apollo\'] //新增账号 nodes.forEach(function (env) { ....... } node.nodes = clusterNodes; /** * xxx 项目管理员权限才能查看其它环境配置,默认只能看dev配置 * 管理员名单 * $rootScope.pageContext.userId */ if(node.text==\'DEV\'){ //权限控制 navTree.push(node); }else{ $.each(adminUserIdList,function(i,v){ if(v===loginUserId) navTree.push(node); }); } }); //init treeview $(\'#treeview\').treeview({ .....}) }
然后再编译 build.bat 文件,当然我们是在 windows下,如果在Linux下就是./build.sh了
C:\apollo-1.2.0\scripts\build.bat
从而获取最新的apollo-portal-xxx.jar,然后你再改名为 apollo-portal.jar 上传到服务器上重启服务就可以了。修改后完整的源码文件:
application_module.controller("ConfigBaseInfoController", [\'$rootScope\', \'$scope\', \'$window\', \'$location\', \'toastr\', \'EventManager\', \'UserService\', \'AppService\', \'FavoriteService\', \'PermissionService\', \'AppUtil\', ConfigBaseInfoController]); function ConfigBaseInfoController($rootScope, $scope, $window, $location, toastr, EventManager, UserService, AppService, FavoriteService, PermissionService, AppUtil) { var urlParams = AppUtil.parseParams($location.$$url); var appId = urlParams.appid; if (!appId) { $window.location.href = \'/index.html\'; return; } initPage(); function initPage() { $rootScope.hideTip = JSON.parse(localStorage.getItem("hideTip")); //load session storage to recovery scene var scene = JSON.parse(sessionStorage.getItem(appId)); $rootScope.pageContext = { appId: appId, env: urlParams.env ? urlParams.env : (scene ? scene.env : \'\'), clusterName: urlParams.cluster ? urlParams.cluster : (scene ? scene.cluster : \'default\') }; //storage page context to session storage sessionStorage.setItem( $rootScope.pageContext.appId, JSON.stringify({ env: $rootScope.pageContext.env, cluster: $rootScope.pageContext.clusterName })); UserService.load_user().then(function (result) { $rootScope.pageContext.userId = result.userId; loadAppInfo(); handleFavorite(); }, function (result) { toastr.error(AppUtil.errorMsg(result), "获取用户登录信息失败"); }); handlePermission(); } function loadAppInfo() { $scope.notFoundApp = true; AppService.load($rootScope.pageContext.appId).then(function (result) { $scope.notFoundApp = false; $scope.appBaseInfo = result; $scope.appBaseInfo.orgInfo = result.orgName + \'(\' + result.orgId + \')\'; loadNavTree(); recordVisitApp(); findMissEnvs(); $(".J_appFound").removeClass("hidden"); }, function (result) { $(".J_appNotFound").removeClass("hidden"); }); } $scope.createAppInMissEnv = function () { var count = 0; $scope.missEnvs.forEach(function (env) { AppService.create_remote(env, $scope.appBaseInfo).then(function (result) { toastr.success(env, \'创建成功\'); count++; if (count == $scope.missEnvs.length) { location.reload(true); } }, function (result) { toastr.error(AppUtil.errorMsg(result), \'创建失败:\' + env); count++; if (count == $scope.missEnvs.length) { location.reload(true); } }); }); }; $scope.createMissingNamespaces = function () { AppService.create_missing_namespaces($rootScope.pageContext.appId, $rootScope.pageContext.env, $rootScope.pageContext.clusterName).then(function (result) { toastr.success("创建成功"); location.reload(true); }, function (result) { toastr.error(AppUtil.errorMsg(result), "创建失败"); } ); }; function findMissEnvs() { $scope.missEnvs = []; AppService.find_miss_envs($rootScope.pageContext.appId).then(function (result) { $scope.missEnvs = AppUtil.collectData(result); if ($scope.missEnvs.length > 0) { toastr.warning("当前项目有环境缺失,请点击页面左侧『补缺环境』补齐数据"); } $scope.findMissingNamespaces(); }); } EventManager.subscribe(EventManager.EventType.CHANGE_ENV_CLUSTER, function () { $scope.findMissingNamespaces(); }); $scope.findMissingNamespaces = function () { $scope.missingNamespaces = []; // only check missing private namespaces when app exists in current env if ($rootScope.pageContext.env && $scope.missEnvs.indexOf($rootScope.pageContext.env) === -1) { AppService.find_missing_namespaces($rootScope.pageContext.appId, $rootScope.pageContext.env, $rootScope.pageContext.clusterName).then(function (result) { $scope.missingNamespaces = AppUtil.collectData(result); if ($scope.missingNamespaces.length > 0) { toastr.warning("当前环境有Namespace缺失,请点击页面左侧『补缺Namespace』补齐数据"); } }); } }; function recordVisitApp() { //save user recent visited apps var VISITED_APPS_STORAGE_KEY = "VisitedAppsV2"; var visitedAppsObject = JSON.parse(localStorage.getItem(VISITED_APPS_STORAGE_KEY)); var hasSaved = false; if (!visitedAppsObject) { visitedAppsObject = {}; } if (!visitedAppsObject[$rootScope.pageContext.userId]) { visitedAppsObject[$rootScope.pageContext.userId] = []; } var visitedApps = visitedAppsObject[$rootScope.pageContext.userId]; if (visitedApps && visitedApps.length > 0) { visitedApps.forEach(function (app) { if (app == appId) { hasSaved = true; return; } }); } var currentUserVisitedApps = visitedAppsObject[$rootScope.pageContext.userId]; if (!hasSaved) { //if queue\'s length bigger than 6 will remove oldest app if (currentUserVisitedApps.length >= 6) { currentUserVisitedApps.splice(0, 1); } currentUserVisitedApps.push($rootScope.pageContext.appId); localStorage.setItem(VISITED_APPS_STORAGE_KEY, JSON.stringify(visitedAppsObject)); } } function loadNavTree() { AppService.load_nav_tree($rootScope.pageContext.appId).then(function (result) { var navTree = []; var nodes = AppUtil.collectData(result); if (!nodes || nodes.length == 0) { toastr.error("系统出错,请重试或联系系统负责人"); return; } //default first env if session storage is empty if (!$rootScope.pageContext.env) { $rootScope.pageContext.env = nodes[0].env; } EventManager.emit(EventManager.EventType.REFRESH_NAMESPACE); //登录人账号 var loginUserId=$rootScope.pageContext.userId; var adminUserIdList=[\'admin\',\'zhangqg\',\'apollo\',\'maoxy\'] nodes.forEach(function (env) { if (!env.clusters || env.clusters.length == 0) { return; } var node = {}; node.text = env.env; var clusterNodes = []; //如果env下面只有一个default集群则不显示集群列表 if (env.clusters && env.clusters.length == 1 && env.clusters[0].name == \'default\') { if ($rootScope.pageContext.env == env.env) { node.state = {}; node.state.selected = true; } node.selectable = true; } else { node.selectable = false; //cluster list env.clusters.forEach(function (cluster) { var clusterNode = {}, parentNode = []; //default selection from session storage or first env & first cluster if ($rootScope.pageContext.env == env.env && $rootScope.pageContext.clusterName == cluster.name) { clusterNode.state = {}; clusterNode.state.selected = true; } clusterNode.text = cluster.name; parentNode.push(node.text); clusterNode.tags = [\'集群\']; clusterNode.parentNode = parentNode; clusterNodes.push(clusterNode); }); } node.nodes = clusterNodes; /** * rsp 项目管理员权限才能查看其它环境配置,默认只能看dev配置 * 管理员名单 * $rootScope.pageContext.userId */ if(node.text==\'DEV\'){ navTree.push(node); }else{ $.each(adminUserIdList,function(i,v){ if(v===loginUserId) navTree.push(node); }); } }); //init treeview $(\'#treeview\').treeview({ color: "#797979", showBorder: true, data: navTree, levels: 99, expandIcon: \'\', collapseIcon: \'\', showTags: true, onNodeSelected: function (event, data) { if (!data.parentNode) {//first nav node $rootScope.pageContext.env = data.text; $rootScope.pageContext.clusterName = \'default\'; } else {//second cluster node $rootScope.pageContext.env = data.parentNode[0]; $rootScope.pageContext.clusterName = data.text; } //storage scene sessionStorage.setItem( $rootScope.pageContext.appId, JSON.stringify({ env: $rootScope.pageContext.env, cluster: $rootScope.pageContext.clusterName })); $window.location.href = "/config.html#/appid=" + $rootScope.pageContext.appId + "&env=" + $rootScope.pageContext.env + "&cluster=" + $rootScope.pageContext.clusterName; EventManager.emit(EventManager.EventType.REFRESH_NAMESPACE); EventManager.emit(EventManager.EventType.CHANGE_ENV_CLUSTER); $rootScope.showSideBar = false; } }); var envMapClusters = {}; navTree.forEach(function (node) { if (node.nodes && node.nodes.length > 0) { var clusterNames = []; node.nodes.forEach(function (cluster) { if (cluster.text != \'default\') { clusterNames.push(cluster.text); } }); envMapClusters[node.text] = clusterNames.join(","); } }); $rootScope.envMapClusters = envMapClusters; }, function (result) { toastr.error(AppUtil.errorMsg(result), "系统出错,请重试或联系系统负责人"); }); } function handleFavorite() { FavoriteService.findFavorites($rootScope.pageContext.userId, $rootScope.pageContext.appId) .then(function (result) { if (result && result.length) { $scope.favoriteId = result[0].id; } }); $scope.addFavorite = function () { var favorite = { userId: $rootScope.pageContext.userId, appId: $rootScope.pageContext.appId }; FavoriteService.addFavorite(favorite) .then(function (result) { $scope.favoriteId = result.id; toastr.success("收藏成功"); }, function (result) { toastr.error(AppUtil.errorMsg(result), "收藏失败"); }) }; $scope.deleteFavorite = function () { FavoriteService.deleteFavorite($scope.favoriteId) .then(function (result) { $scope.favoriteId = 0; toastr.success("取消收藏成功"); }, function (result) { toastr.error(AppUtil.errorMsg(result), "取消收藏失败"); }) }; } function handlePermission() { //permission PermissionService.has_create_namespace_permission(appId).then(function (result) { $scope.hasCreateNamespacePermission = result.hasPermission; }, function (result) { }); PermissionService.has_create_cluster_permission(appId).then(function (result) { $scope.hasCreateClusterPermission = result.hasPermission; }, function (result) { }); PermissionService.has_assign_user_permission(appId).then(function (result) { $scope.hasAssignUserPermission = result.hasPermission; }, function (result) { }); $scope.showMasterPermissionTips = function () { $("#masterNoPermissionDialog").modal(\'show\'); }; } var VIEW_MODE_SWITCH_WIDTH = 1156; if (window.innerWidth <= VIEW_MODE_SWITCH_WIDTH) { $rootScope.viewMode = 2; $rootScope.showSideBar = false; } else { $rootScope.viewMode = 1; } $rootScope.adaptScreenSize = function () { if (window.innerWidth <= VIEW_MODE_SWITCH_WIDTH) { $rootScope.viewMode = 2; } else { $rootScope.viewMode = 1; $rootScope.showSideBar = false; } }; $(window).resize(function () { $scope.$apply(function () { $rootScope.adaptScreenSize(); }); }); }
三、修改数据库
如果光上面修改的话,还是不能是 管理员权限,但是 如果赋权限的话,能看到 DEV,FAT,UAT,PRO等4个环境了,但是还是不能达到管理员的权限,所以我们要在 数据库的ApolloPortalDB中的ServerConfig 表中去添加相关权限:
只能在key中的 superAdmin 的 Value中添加相关账号,并且用 逗号 隔开。
权限设置完成之后,效果如下: