• Apollo配置中心添加管理员账号权限


    一、概述

       根据官方解释的话,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-xxxxapollo-portalsrcmain
    esourcesstaticscriptscontrollerconfigConfigBaseInfoController.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.0scriptsuild.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();
            });
        });
    
    }
    ConfigBaseInfoController.js

    三、修改数据库

    如果光上面修改的话,还是不能是 管理员权限,但是 如果赋权限的话,能看到  DEV,FAT,UAT,PRO等4个环境了,但是还是不能达到管理员的权限,所以我们要在 数据库的ApolloPortalDB中的ServerConfig 表中去添加相关权限:

    只能在key中的 superAdmin 的 Value中添加相关账号,并且用 逗号 隔开。

    权限设置完成之后,效果如下:

  • 相关阅读:
    剑指17.树的子结构
    剑指16.合并两个排序的链表
    剑指15.反转链表
    剑指14.链表中倒数第k个结点
    剑指13.调整数组顺序使奇数位于偶数前面
    剑指12.数值的整数次方
    剑指11.二进制中1的个数
    剑指10.矩形覆盖
    剑指09.变态跳台阶
    JS 中动态创建json,动态为json添加属性、属性值
  • 原文地址:https://www.cnblogs.com/zhangqigao/p/13845717.html
Copyright © 2020-2023  润新知