From 6698804e0bcdaefedbb4198561ab59a944c292e7 Mon Sep 17 00:00:00 2001 From: lepdou Date: Tue, 26 Apr 2016 16:07:34 +0800 Subject: [PATCH] add miss envs --- .../java/com/ctrip/apollo/portal/api/API.java | 1 - .../portal/controller/AppController.java | 15 ++- .../ctrip/apollo/portal/entity/AppInfoVO.java | 31 +++++ .../apollo/portal/service/AppService.java | 27 +++- .../src/main/resources/static/img/close.png | Bin 0 -> 2939 bytes .../src/main/resources/static/img/info.png | Bin 0 -> 6067 bytes .../src/main/resources/static/img/open.png | Bin 0 -> 2223 bytes .../src/main/resources/static/img/plus.png | Bin 0 -> 2517 bytes .../src/main/resources/static/index.html | 1 + .../main/resources/static/scripts/AppUtils.js | 12 ++ .../src/main/resources/static/scripts/app.js | 9 +- .../scripts/controller/CreateAppController.js | 10 +- .../scripts/controller/IndexController.js | 8 +- .../controller/app/AppConfigController.js | 67 ++++++++-- .../static/scripts/services/AppService.js | 10 +- .../resources/static/styles/common-style.css | 21 +++ .../src/main/resources/static/views/app.html | 122 ++++++++++++++---- .../resources/static/views/create-app.html | 4 +- 18 files changed, 272 insertions(+), 66 deletions(-) create mode 100644 apollo-portal/src/main/java/com/ctrip/apollo/portal/entity/AppInfoVO.java create mode 100644 apollo-portal/src/main/resources/static/img/close.png create mode 100644 apollo-portal/src/main/resources/static/img/info.png create mode 100644 apollo-portal/src/main/resources/static/img/open.png create mode 100644 apollo-portal/src/main/resources/static/img/plus.png create mode 100644 apollo-portal/src/main/resources/static/scripts/AppUtils.js diff --git a/apollo-portal/src/main/java/com/ctrip/apollo/portal/api/API.java b/apollo-portal/src/main/java/com/ctrip/apollo/portal/api/API.java index bfd7aede5..9d4b7663f 100644 --- a/apollo-portal/src/main/java/com/ctrip/apollo/portal/api/API.java +++ b/apollo-portal/src/main/java/com/ctrip/apollo/portal/api/API.java @@ -27,5 +27,4 @@ public class API { public String getAdminServiceHost(Env env) { return serviceLocator.getAdminService(env).getHomepageUrl(); } - } diff --git a/apollo-portal/src/main/java/com/ctrip/apollo/portal/controller/AppController.java b/apollo-portal/src/main/java/com/ctrip/apollo/portal/controller/AppController.java index 97c7e7b83..e1297ee72 100644 --- a/apollo-portal/src/main/java/com/ctrip/apollo/portal/controller/AppController.java +++ b/apollo-portal/src/main/java/com/ctrip/apollo/portal/controller/AppController.java @@ -12,6 +12,7 @@ import com.ctrip.apollo.core.dto.AppDTO; import com.ctrip.apollo.core.enums.Env; import com.ctrip.apollo.core.exception.BadRequestException; import com.ctrip.apollo.core.utils.StringUtils; +import com.ctrip.apollo.portal.entity.AppInfoVO; import com.ctrip.apollo.portal.entity.ClusterNavTree; import com.ctrip.apollo.portal.service.AppService; @@ -25,7 +26,7 @@ public class AppController { private AppService appService; - @RequestMapping("/env/{env}") + @RequestMapping("/envs/{env}") public List findAllApp(@PathVariable String env){ if (StringUtils.isEmpty(env)){ throw new BadRequestException("env can not be empty"); @@ -42,17 +43,21 @@ public class AppController { return appService.buildClusterNavTree(appId); } - @RequestMapping(value = "", method = RequestMethod.POST, consumes = {"application/json"}) - public ResponseEntity create(@RequestBody AppDTO app) { + @RequestMapping(value = "/envs/{env}", method = RequestMethod.POST, consumes = {"application/json"}) + public ResponseEntity create(@PathVariable String env, @RequestBody AppDTO app) { if (isInvalidApp(app)){ throw new BadRequestException("request payload contains empty"); } - appService.save(app); + if ("ALL".equals(env)){ + appService.save(app); + } else { + appService.save(Env.valueOf(env), app); + } return ResponseEntity.ok().build(); } @RequestMapping(value = "/{appId}", method = RequestMethod.GET) - public AppDTO load(@PathVariable String appId){ + public AppInfoVO load(@PathVariable String appId){ if (StringUtils.isEmpty(appId)){ throw new BadRequestException("app id can not be empty."); } diff --git a/apollo-portal/src/main/java/com/ctrip/apollo/portal/entity/AppInfoVO.java b/apollo-portal/src/main/java/com/ctrip/apollo/portal/entity/AppInfoVO.java new file mode 100644 index 000000000..cd2806c4d --- /dev/null +++ b/apollo-portal/src/main/java/com/ctrip/apollo/portal/entity/AppInfoVO.java @@ -0,0 +1,31 @@ +package com.ctrip.apollo.portal.entity; + +import com.ctrip.apollo.core.dto.AppDTO; +import com.ctrip.apollo.core.enums.Env; + +import java.util.List; + +public class AppInfoVO { + + private AppDTO app; + /** + * 在创建app的时候可能在某些环境下创建失败 + */ + private List missEnvs; + + public AppDTO getApp() { + return app; + } + + public void setApp(AppDTO app) { + this.app = app; + } + + public List getMissEnvs() { + return missEnvs; + } + + public void setMissEnvs(List missEnvs) { + this.missEnvs = missEnvs; + } +} diff --git a/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/AppService.java b/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/AppService.java index 3733db78f..131c45b79 100644 --- a/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/AppService.java +++ b/apollo-portal/src/main/java/com/ctrip/apollo/portal/service/AppService.java @@ -1,5 +1,7 @@ package com.ctrip.apollo.portal.service; +import java.util.Arrays; +import java.util.LinkedList; import java.util.List; import org.slf4j.Logger; @@ -17,6 +19,7 @@ import com.ctrip.apollo.core.exception.BadRequestException; import com.ctrip.apollo.core.exception.ServiceException; import com.ctrip.apollo.portal.PortalSettings; import com.ctrip.apollo.portal.api.AdminServiceAPI; +import com.ctrip.apollo.portal.entity.AppInfoVO; import com.ctrip.apollo.portal.entity.ClusterNavTree; @Service @@ -37,16 +40,19 @@ public class AppService { return appAPI.findApps(env); } - public AppDTO load(String appId) { + public AppInfoVO load(String appId) { //轮询环境直到能找到此app的信息 AppDTO app = null; + List missEnvs = new LinkedList<>(); for (Env env : portalSettings.getEnvs()) { try { + app = appAPI.loadApp(env, appId); - break; + } catch (HttpClientErrorException e) { //not exist maybe because create app fail. if (e.getStatusCode() == HttpStatus.NOT_FOUND) { + missEnvs.add(env); logger.warn("app:{} in {} not exist", appId, env); } else { logger.error("load app info({}) from env:{} error.", appId, env); @@ -54,11 +60,15 @@ public class AppService { } } } - if (app == null){ + if (app == null) { throw new BadRequestException(String.format("invalid app id %s", appId)); } - return app; + AppInfoVO appInfo = new AppInfoVO(); + appInfo.setApp(app); + appInfo.setMissEnvs(missEnvs); + + return appInfo; } @@ -86,4 +96,13 @@ public class AppService { } } + public void save(Env env, AppDTO app) { + try { + appAPI.save(env, app); + } catch (HttpStatusCodeException e) { + logger.error(ExceptionUtils.toString(e)); + throw e; + } + } + } diff --git a/apollo-portal/src/main/resources/static/img/close.png b/apollo-portal/src/main/resources/static/img/close.png new file mode 100644 index 0000000000000000000000000000000000000000..66485ccfd4b25696614a44d200206ee08e090b81 GIT binary patch literal 2939 zcmeHJ`(IMo7Dqt?Gs8y-J_^OMrfUxRDK+ydiYPwEO4EE)_#_NPGeb**vd9<(oP1PT zO_q}=TKOO~W0Ht+%xRoL5nrLBsi4yMAWiS_-oN4gHb3mgS^KPYzWe)K`|Ne?hajI# zdS-ec5NH#@7k3C4CF>2U3-q<&{0b0gqbC7}J#sEaSsqQ1hZ*6oV@IX;=+y4mCzs;F z;540(uoGk*&Qa7Upo7QjEYzUh>EZk6?bl(#=abQ?i9z>pGR8qDV_>onp?J z35(8k=?a+0FxGF5VH+s9?+y&^XeJrqu$G00dbN~3amGwA}pBvJ*q00x5+>l*k@azEjMM>jr z^ZCrjlV4-+w@)O1wIEcP+0p38!F_LAuZ~TrJw|uKN_PAayzI&T+#9nP#jPIl&Pm1< z>@=(PRSzimxvn8=k6OLiuugZ8U@Wff_D{i@@1(vJM&N!l9-jSB>h>K`E-QnBrABR4 zZj1m>ql37%+z^v$_iLomPz3*L_T5QC#m9H~2to1i@7u5}kC@Jr=750(816DrOfAt! zd544e8_GJ@vD6Hcx&sG!1aYEccIj z?*lPt7)s*%L-S_G0_t^(tNj$yXOl8DwbPUPM4vcpd8z>ADs0)JC{8!%s-4XAStfm$ zzpv`f8fvs9a~vr1JW^$Ln(R(!=1+IQkiL5od~@{>OHf?Gd%7BTb)@qHt&{vOkq|wM zmOyVlf836z(Ij7GGx~DSG>Q}xmnl17A zZFvTaWV&NKE3)8&bzixT>#nejoFUp{MbLE`ZmOn9k zy3N=}Q{wP3w%79CGpKYHl}z^6kMf`GUU;Namd=WdBm#>JCuNVGk(IdC4zsRkB?EVz zO70BMudyvvS=yXp@$BaU{fQ?me?7uLyuN!sB~*Gt+tT_Q1c~rtMe;Uff@kol zbByrU0_!xRZ;LKW`fL9uN!VfwMS=a?H=ko-q5tYN!7Dv=q%_B6W%bS*uPtw5FBC7N zPGGs}BFfO8dPh~dF`vKILaG zzV}-iVcyHi&%F>=fPMkC_k?$lEym{VjKs>15mE}x!g2gUF|6gSP-`s*Kz1mY^48Z!!!#Nh}%PZs(4jVfiz8_eu9 z)IqzVf zs9lVyXGU2t+j_@sFGfI#2t~1yy%3g>Xu98^xe{@%jsaJ^i}&yEj`g+bT=Z*qnD~~q z)Nyn*mDC~hz<%uIL(siW-5w--nCTbM@R;GN8| zeFj81a(V*x5N@SgfrAs}u(Lgk*4yd&$$KTK_CcEP&~M36DsgoEmdxV)Qbg|&07W6f zsc^e=&%QzTotXME0PLHyUvQn}k^0HjP>c%Kx`Wi5o=@ii+61;-vMhEhL4?~e<5_#G zqZFyVXWm~a_0q2~x{Pp=gH;7e8HFl(?{*PtPiAYR*`FVprnU@(7t3dMz{FjZn&P~8Qc3Ru0}&po(h^+)XSGo0H(6hRYn?Twd}0j^>&b8lNHyu%nxl#iNc z<&T-a7MAe%YvThnib>q}e-G(yT%Py%FKaf@D|vvYi!CkT;<)`##?UV2`=?>osGF+s zrkjnwZwXU(R!_NW(uSHc*=hXQu8za~=O7r0&cU0iAR$Uubu@ZyX+cs1^<=eXQ%NVi z?(ScQY#Wrk6}M)AZcg0Vhk8)*!0;E~fai+LD7!VZ4d+AxSK+7MNw6g1@bbSk$v@JD z%A4wL;oB`An-JxOY-dr4a4#m6_PqqnshfFN8>xeI0b%$l1IW`Gw9&D{Kjsc^Z{x=3 zE=7-48oE47U+cWuDAAxf>3r(+4;X`ijr25i`_|9ErKt)St^#vZROyT7Da6fsX{{kH z_L`+!3bN0?9NED2aB(7Cu~nVlo2L1F`(iod(QWfCD>zU+UEYHKOza^?X3smp53jY$FeNu#C0kpAXa5 Zz=ty+I)05)p+Hd$B6tVk_?{;i{{bP=I=uh@ literal 0 HcmV?d00001 diff --git a/apollo-portal/src/main/resources/static/img/info.png b/apollo-portal/src/main/resources/static/img/info.png new file mode 100644 index 0000000000000000000000000000000000000000..19724d5f3a5192aefe6639fc474c0d4d5f4d0ec6 GIT binary patch literal 6067 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 literal 0 HcmV?d00001 diff --git a/apollo-portal/src/main/resources/static/img/open.png b/apollo-portal/src/main/resources/static/img/open.png new file mode 100644 index 0000000000000000000000000000000000000000..ff423c16e8e9b787988a2e7078f34d4393f7bf56 GIT binary patch literal 2223 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 bz2FKEnmxYQ+FWa@j%$Fs%Rzd%Q!wW*GjI~U literal 0 HcmV?d00001 diff --git a/apollo-portal/src/main/resources/static/index.html b/apollo-portal/src/main/resources/static/index.html index 48b0518e0..1f1f598f2 100644 --- a/apollo-portal/src/main/resources/static/index.html +++ b/apollo-portal/src/main/resources/static/index.html @@ -79,6 +79,7 @@ + diff --git a/apollo-portal/src/main/resources/static/scripts/AppUtils.js b/apollo-portal/src/main/resources/static/scripts/AppUtils.js new file mode 100644 index 000000000..acbfbe6fc --- /dev/null +++ b/apollo-portal/src/main/resources/static/scripts/AppUtils.js @@ -0,0 +1,12 @@ +appUtil.service('AppUtil', [function () { + + return { + errorMsg: function (response) { + var msg = "Code:" + response.status; + if (response.data.message != null){ + msg += " Msg:" + response.data.message; + } + return msg; + } + } +}]); diff --git a/apollo-portal/src/main/resources/static/scripts/app.js b/apollo-portal/src/main/resources/static/scripts/app.js index 7cd7ecd9e..8ac1b82fd 100644 --- a/apollo-portal/src/main/resources/static/scripts/app.js +++ b/apollo-portal/src/main/resources/static/scripts/app.js @@ -1,13 +1,16 @@ /**service module 定义*/ var appService = angular.module('app.service', ['ngResource']); +/**utils*/ +var appUtil = angular.module('app.util', []); + /** page module 定义*/ // 首页 -var index_module = angular.module('index', ['toastr', 'app.service', 'angular-loading-bar']); +var index_module = angular.module('index', ['toastr', 'app.service', 'app.util', 'angular-loading-bar']); //项目主页 -var application_module = angular.module('application', ['app.service', 'toastr', 'angular-loading-bar']); +var application_module = angular.module('application', ['app.service', 'app.util', 'toastr', 'angular-loading-bar']); //创建项目页面 -var create_app_module = angular.module('create_app', ['ngResource', 'toastr', 'app.service', 'angular-loading-bar']); +var create_app_module = angular.module('create_app', ['ngResource', 'toastr', 'app.service', 'app.util', 'angular-loading-bar']); diff --git a/apollo-portal/src/main/resources/static/scripts/controller/CreateAppController.js b/apollo-portal/src/main/resources/static/scripts/controller/CreateAppController.js index ae699a77b..bb92c4c53 100644 --- a/apollo-portal/src/main/resources/static/scripts/controller/CreateAppController.js +++ b/apollo-portal/src/main/resources/static/scripts/controller/CreateAppController.js @@ -1,14 +1,14 @@ -create_app_module.controller('CreateAppController', ['$scope', '$window', 'toastr', 'AppService', - function ($scope, $window, toastr, AppService) { +create_app_module.controller('CreateAppController', ['$scope', '$window', 'toastr', 'AppService', 'AppUtil', + function ($scope, $window, toastr, AppService, AppUtil) { - $scope.save = function () { - AppService.add($scope.app).then(function (result) { + $scope.create = function () { + AppService.create('ALL', $scope.app).then(function (result) { toastr.success('添加成功!'); setInterval(function () { $window.location.href = '/views/app.html?#appid=' + result.appId; }, 1000); }, function (result) { - toastr.error(result.status + result.data.message, '添加失败!'); + toastr.error(AppUtil.errorMsg(result), '添加失败!'); }); }; diff --git a/apollo-portal/src/main/resources/static/scripts/controller/IndexController.js b/apollo-portal/src/main/resources/static/scripts/controller/IndexController.js index 0ce984c38..17136ac05 100644 --- a/apollo-portal/src/main/resources/static/scripts/controller/IndexController.js +++ b/apollo-portal/src/main/resources/static/scripts/controller/IndexController.js @@ -1,5 +1,5 @@ -index_module.controller('IndexController', ['$scope', '$window', 'toastr', 'AppService', 'EnvService', - function ($scope, $window, toastr, AppService, EnvService) { +index_module.controller('IndexController', ['$scope', '$window', 'toastr', 'AppService', 'AppUtil', 'EnvService', + function ($scope, $window, toastr, AppService, AppUtil, EnvService) { $scope.envs = []; $scope.selectedEnv = ''; @@ -8,7 +8,7 @@ index_module.controller('IndexController', ['$scope', '$window', 'toastr', 'AppS //default select first env $scope.switchEnv($scope.envs[0]); }, function (result) { - toastr.error(result.status + result.data.message, "load env error"); + toastr.error(AppUtil.errorMsg(result), "load env error"); }); var apps = []; @@ -25,7 +25,7 @@ index_module.controller('IndexController', ['$scope', '$window', 'toastr', 'AppS $scope.appsCount = apps.length; $scope.selectedEnv = env; }, function (result) { - toastr.error(result.status + result.data.message, "load apps error"); + toastr.error(AppUtil.errorMsg(result), "load apps error"); }); }; diff --git a/apollo-portal/src/main/resources/static/scripts/controller/app/AppConfigController.js b/apollo-portal/src/main/resources/static/scripts/controller/app/AppConfigController.js index a7b706f15..16a84de81 100644 --- a/apollo-portal/src/main/resources/static/scripts/controller/app/AppConfigController.js +++ b/apollo-portal/src/main/resources/static/scripts/controller/app/AppConfigController.js @@ -1,6 +1,6 @@ application_module.controller("AppConfigController", - ['$scope', '$location', 'toastr', 'AppService', 'ConfigService', - function ($scope, $location, toastr, AppService, ConfigService) { + ['$scope', '$location', 'toastr', 'AppService', 'AppUtil', 'ConfigService', + function ($scope, $location, toastr, AppService, AppUtil, ConfigService) { var appId = $location.$$url.split("=")[1]; var currentUser = 'test_user'; @@ -12,7 +12,7 @@ application_module.controller("AppConfigController", $scope.pageContext = pageContext; - ///////////// load cluster nav tree ///////// + ////// load cluster nav tree ////// AppService.load_nav_tree($scope.pageContext.appId).then(function (result) { var navTree = []; @@ -58,18 +58,20 @@ application_module.controller("AppConfigController", } }); }, function (result) { - toastr.error(result.status + result.data.message, "加载导航出错"); + toastr.error(AppUtil.errorMsg(result), "加载导航出错"); }); - /////////// app info //////////// + ////// app info ////// AppService.load($scope.pageContext.appId).then(function (result) { - $scope.appInfo = result; + $scope.appBaseInfo = result.app; + $scope.missEnvs = result.missEnvs; + $scope.selectedEnvs = angular.copy($scope.missEnvs); },function (result) { - toastr.error(result.status + result.data.message, "加载App信息出错"); + toastr.error(AppUtil.errorMsg(result), "加载App信息出错"); }); - /////////// namespace //////////// + ////// namespace ////// var namespace_view_type = { TEXT:'text', @@ -103,11 +105,11 @@ application_module.controller("AppConfigController", } }, function (result) { - toastr.error(result.status + result.data.message, "加载配置信息出错"); + toastr.error(AppUtil.errorMsg(result), "加载配置信息出错"); }); } - ////////////global view oper ///////////// + ////// global view oper ////// $scope.switchView = function (namespace, viewType) { @@ -138,7 +140,7 @@ application_module.controller("AppConfigController", return result; } - ////////// text view oper ///////// + ////// text view oper ////// $scope.draft = {}; //保存草稿 @@ -161,7 +163,7 @@ application_module.controller("AppConfigController", $scope.toggleTextEditStatus($scope.draft); }, function (result) { - toastr.error(result.status + result.data.message, "更新失败"); + toastr.error(AppUtil.errorMsg(result), "更新失败"); } ); @@ -169,6 +171,7 @@ application_module.controller("AppConfigController", $scope.isItemsViewOpened = true; $scope.toggleItemView = function (isOpened) { + $scope.isItemsViewOpened = isOpened; }; @@ -185,7 +188,7 @@ application_module.controller("AppConfigController", } }; - ////////// table view oper ///////// + ////// table view oper ////// //查看旧值 $scope.queryOldValue = function (key, oldValue) { @@ -215,11 +218,47 @@ application_module.controller("AppConfigController", refreshNamespaces(); }, function (result) { - toastr.error(result.status + result.data.message, "发布失败"); + toastr.error(AppUtil.errorMsg(result), "发布失败"); } ); } + + ////// create env ////// + + $scope.toggleSelection = function toggleSelection(env) { + var idx = $scope.selectedEnvs.indexOf(env); + + // is currently selected + if (idx > -1) { + $scope.selectedEnvs.splice(idx, 1); + } + + // is newly selected + else { + $scope.selectedEnvs.push(env); + } + }; + + $scope.createEnvs = function () { + var count = 0; + $scope.selectedEnvs.forEach(function (env) { + AppService.create(env, $scope.appBaseInfo).then(function (result) { + toastr.success(env, '创建成功'); + count ++; + if (count == $scope.selectedEnvs){ + $route.reload(); + } + }, function (result) { + toastr.error(AppUtil.errorMsg(result), '创建失败:' + env); + count ++; + if (count == $scope.selectedEnvs){ + $route.reload(); + } + }); + }); + }; + }]); diff --git a/apollo-portal/src/main/resources/static/scripts/services/AppService.js b/apollo-portal/src/main/resources/static/scripts/services/AppService.js index 7df7e5bcc..9d5952444 100644 --- a/apollo-portal/src/main/resources/static/scripts/services/AppService.js +++ b/apollo-portal/src/main/resources/static/scripts/services/AppService.js @@ -3,7 +3,7 @@ appService.service('AppService', ['$resource', '$q', function ($resource, $q) { find_all_app:{ method: 'GET', isArray: true, - url:'/apps/env/:env' + url:'/apps/envs/:env' }, load_navtree:{ methode: 'GET', @@ -14,9 +14,9 @@ appService.service('AppService', ['$resource', '$q', function ($resource, $q) { method: 'GET', isArray: false }, - add_app: { + create_app: { method: 'POST', - url: '/apps' + url: '/apps/envs/:env' } }); return { @@ -42,9 +42,9 @@ appService.service('AppService', ['$resource', '$q', function ($resource, $q) { }); return d.promise; }, - add: function (app) { + create: function (env, app) { var d = $q.defer(); - app_resource.add_app({}, app, function (result) { + app_resource.create_app({env:env}, app, function (result) { d.resolve(result); }, function (result) { d.reject(result); diff --git a/apollo-portal/src/main/resources/static/styles/common-style.css b/apollo-portal/src/main/resources/static/styles/common-style.css index e8c3f6b16..32ea95ad8 100644 --- a/apollo-portal/src/main/resources/static/styles/common-style.css +++ b/apollo-portal/src/main/resources/static/styles/common-style.css @@ -16,6 +16,21 @@ a { cursor: pointer; } +.i-20{ + height: 20px; + width: 20px; +} + +.i-25-20{ + height: 20px; + width: 25px; +} + +.i-15{ + height: 15px; + width: 15px; +} + .apollo-container { min-height: 90%; } @@ -122,6 +137,12 @@ table th { font-weight: 300; } +.project-info th { + text-align: right; + padding: 4px 6px; + white-space: nowrap; +} + .project-info td { word-wrap: break-word; word-break: break-all; diff --git a/apollo-portal/src/main/resources/static/views/app.html b/apollo-portal/src/main/resources/static/views/app.html index 12d6354b6..fc5c7707b 100644 --- a/apollo-portal/src/main/resources/static/views/app.html +++ b/apollo-portal/src/main/resources/static/views/app.html @@ -28,35 +28,71 @@
- 应用信息 - - - + 应用信息 + + +
- + - + - + - + + + + +
应用ID:{{appInfo.appId}}{{appBaseInfo.appId}}
应用名:{{appInfo.name}}{{appBaseInfo.name}}
Owner:{{appInfo.ownerName}}{{appBaseInfo.ownerName}}
Owner Email:{{appInfo.ownerEmail}}{{appBaseInfo.ownerEmail}}
缺失的环境: + + {{env}} + +
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+
@@ -65,12 +101,14 @@
-
+
+ + {{namespace.namespace.namespaceName}} 有修改,可发布 {{namespace.itemModifiedCnt}}
-
+
- @@ -145,7 +184,7 @@ ng-show="isItemsViewOpened && namespace.viewType == 'table'"> - + Key @@ -164,7 +203,8 @@ - + {{config.item.key}} @@ -175,7 +215,7 @@ ng-show="config.modified" ng-click="queryOldValue(config.item.key, config.oldValue)"> {{config.item.value}} - + {{config.item.comment}} @@ -192,7 +232,8 @@
-
+
@@ -244,39 +285,40 @@
-