[ISSUE #5]Different pages are displayed based on the user role. (#7)

* [ISSUE #5]Different pages are displayed based on the user role.

* Put the role judgment logic into js

Co-authored-by: zhangjidi <zhangjidi@cmss.chinamobile.com>
This commit is contained in:
zhangjidi2016
2021-08-19 12:29:16 +08:00
committed by GitHub
parent 62a4cafea0
commit 1a751091b3
14 changed files with 413 additions and 333 deletions

View File

@@ -19,6 +19,7 @@ package org.apache.rocketmq.dashboard.controller;
import org.apache.rocketmq.dashboard.config.RMQConfigure; import org.apache.rocketmq.dashboard.config.RMQConfigure;
import org.apache.rocketmq.dashboard.model.LoginInfo; import org.apache.rocketmq.dashboard.model.LoginInfo;
import org.apache.rocketmq.dashboard.model.LoginResult;
import org.apache.rocketmq.dashboard.model.User; import org.apache.rocketmq.dashboard.model.User;
import org.apache.rocketmq.dashboard.model.UserInfo; import org.apache.rocketmq.dashboard.model.UserInfo;
import org.apache.rocketmq.dashboard.service.UserService; import org.apache.rocketmq.dashboard.service.UserService;
@@ -65,7 +66,7 @@ public class LoginController {
@RequestMapping(value = "/login.do", method = RequestMethod.POST) @RequestMapping(value = "/login.do", method = RequestMethod.POST)
@ResponseBody @ResponseBody
public JsonResult<String> login(@RequestParam("username") String username, public Object login(@RequestParam("username") String username,
@RequestParam(value = "password") String password, @RequestParam(value = "password") String password,
HttpServletRequest request, HttpServletRequest request,
HttpServletResponse response) throws Exception { HttpServletResponse response) throws Exception {
@@ -80,7 +81,8 @@ public class LoginController {
WebUtil.setSessionValue(request, WebUtil.USER_INFO, userInfo); WebUtil.setSessionValue(request, WebUtil.USER_INFO, userInfo);
WebUtil.setSessionValue(request, WebUtil.USER_NAME, username); WebUtil.setSessionValue(request, WebUtil.USER_NAME, username);
userInfo.setSessionId(WebUtil.getSessionId(request)); userInfo.setSessionId(WebUtil.getSessionId(request));
return new JsonResult<>(contextPath); LoginResult result = new LoginResult(username, user.getType(), contextPath);
return result;
} }
} }

View File

@@ -0,0 +1,36 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.rocketmq.dashboard.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginResult {
private String loginUserName;
/**
* 0: normal 1: admin
*/
private int loginUserRole;
private String contextPath;
}

View File

@@ -17,7 +17,7 @@
var module = app; var module = app;
module.controller('consumerController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) { module.controller('consumerController', ['$scope', 'ngDialog', '$http', 'Notification', '$window', function ($scope, ngDialog, $http, Notification, $window) {
$scope.paginationConf = { $scope.paginationConf = {
currentPage: 1, currentPage: 1,
totalItems: 0, totalItems: 0,
@@ -41,19 +41,29 @@ module.controller('consumerController', ['$scope', 'ngDialog', '$http','Notifica
$scope.sortKey = key; $scope.sortKey = key;
$scope.doSort(); $scope.doSort();
}; };
$scope.userRole = $window.sessionStorage.getItem("userrole");
$scope.writeOperationEnabled = $scope.userRole == null ? true : ($scope.userRole == 1 ? true : false);
$scope.doSort = function () {// todo how to change this fe's code ? (it's dirty) $scope.doSort = function () {// todo how to change this fe's code ? (it's dirty)
if ($scope.sortKey == 'diffTotal') { if ($scope.sortKey == 'diffTotal') {
$scope.allConsumerGrouopList.sort(function(a,b) {return (a.diffTotal > b.diffTotal) ? $scope.sortOrder : ((b.diffTotal > a.diffTotal) ? -$scope.sortOrder : 0);} ); $scope.allConsumerGrouopList.sort(function (a, b) {
return (a.diffTotal > b.diffTotal) ? $scope.sortOrder : ((b.diffTotal > a.diffTotal) ? -$scope.sortOrder : 0);
});
} }
if ($scope.sortKey == 'group') { if ($scope.sortKey == 'group') {
$scope.allConsumerGrouopList.sort(function(a,b) {return (a.group > b.group) ? $scope.sortOrder : ((b.group > a.group) ? -$scope.sortOrder : 0);} ); $scope.allConsumerGrouopList.sort(function (a, b) {
return (a.group > b.group) ? $scope.sortOrder : ((b.group > a.group) ? -$scope.sortOrder : 0);
});
} }
if ($scope.sortKey == 'count') { if ($scope.sortKey == 'count') {
$scope.allConsumerGrouopList.sort(function(a,b) {return (a.count > b.count) ? $scope.sortOrder : ((b.count > a.count) ? -$scope.sortOrder : 0);} ); $scope.allConsumerGrouopList.sort(function (a, b) {
return (a.count > b.count) ? $scope.sortOrder : ((b.count > a.count) ? -$scope.sortOrder : 0);
});
} }
if ($scope.sortKey == 'consumeTps') { if ($scope.sortKey == 'consumeTps') {
$scope.allConsumerGrouopList.sort(function(a,b) {return (a.consumeTps > b.consumeTps) ? $scope.sortOrder : ((b.consumeTps > a.consumeTps) ? -$scope.sortOrder : 0);} ); $scope.allConsumerGrouopList.sort(function (a, b) {
return (a.consumeTps > b.consumeTps) ? $scope.sortOrder : ((b.consumeTps > a.consumeTps) ? -$scope.sortOrder : 0);
});
} }
$scope.filterList($scope.paginationConf.currentPage) $scope.filterList($scope.paginationConf.currentPage)
}; };
@@ -181,7 +191,8 @@ module.controller('consumerController', ['$scope', 'ngDialog', '$http','Notifica
consumerRequestList: request, consumerRequestList: request,
allClusterNameList: Object.keys(resp.data.clusterInfo.clusterAddrTable), allClusterNameList: Object.keys(resp.data.clusterInfo.clusterAddrTable),
allBrokerNameList: Object.keys(resp.data.brokerServer), allBrokerNameList: Object.keys(resp.data.brokerServer),
bIsUpdate:bIsUpdate bIsUpdate: bIsUpdate,
writeOperationEnabled: $scope.writeOperationEnabled
} }
}); });
} else { } else {
@@ -278,9 +289,11 @@ module.controller('consumerMonitorDialogController', function ($scope, ngDialog,
$http({ $http({
method: "POST", method: "POST",
url: "monitor/createOrUpdateConsumerMonitor.do", url: "monitor/createOrUpdateConsumerMonitor.do",
params:{consumeGroupName:$scope.ngDialogData.consumerGroupName, params: {
consumeGroupName: $scope.ngDialogData.consumerGroupName,
minCount: $scope.ngDialogData.data.minCount, minCount: $scope.ngDialogData.data.minCount,
maxDiffTotal:$scope.ngDialogData.data.maxDiffTotal} maxDiffTotal: $scope.ngDialogData.data.maxDiffTotal
}
}).success(function (resp) { }).success(function (resp) {
if (resp.status == 0) { if (resp.status == 0) {
Notification.info({message: "update success!", delay: 2000}); Notification.info({message: "update success!", delay: 2000});
@@ -303,8 +316,10 @@ module.controller('deleteConsumerDialogController', ['$scope', 'ngDialog', '$htt
$http({ $http({
method: "POST", method: "POST",
url: "consumer/deleteSubGroup.do", url: "consumer/deleteSubGroup.do",
data:{groupName:$scope.ngDialogData.consumerGroupName, data: {
brokerNameList:$scope.selectedBrokerNameList} groupName: $scope.ngDialogData.consumerGroupName,
brokerNameList: $scope.selectedBrokerNameList
}
}).success(function (resp) { }).success(function (resp) {
if (resp.status == 0) { if (resp.status == 0) {
Notification.info({message: "delete success!", delay: 2000}); Notification.info({message: "delete success!", delay: 2000});
@@ -351,8 +366,10 @@ module.controller('consumerTopicViewDialogController', ['$scope', 'ngDialog', '$
if (resp.status == 0) { if (resp.status == 0) {
ngDialog.open({ ngDialog.open({
template: 'consumerClientDialog', template: 'consumerClientDialog',
data:{consumerClientInfo:resp.data, data: {
clientId:clientId} consumerClientInfo: resp.data,
clientId: clientId
}
}); });
} else { } else {
Notification.error({message: resp.errMsg, delay: 2000}); Notification.error({message: resp.errMsg, delay: 2000});
@@ -361,6 +378,3 @@ module.controller('consumerTopicViewDialogController', ['$scope', 'ngDialog', '$
}; };
}] }]
); );

View File

@@ -20,6 +20,9 @@ var en = {
"CONSUMER":"Consumer", "CONSUMER":"Consumer",
"PRODUCER":"Producer", "PRODUCER":"Producer",
"MESSAGE":"Message", "MESSAGE":"Message",
"MESSAGE_DETAIL":"Message Detail",
"RESEND_MESSAGE":"Resend Message",
"VIEW_EXCEPTION":"View Exception",
"MESSAGETRACE":"MessageTrace", "MESSAGETRACE":"MessageTrace",
"COMMIT": "Commit", "COMMIT": "Commit",
"OPERATION": "Operation", "OPERATION": "Operation",

View File

@@ -21,6 +21,9 @@ var zh = {
"CONSUMER":"消费者", "CONSUMER":"消费者",
"PRODUCER":"生产者", "PRODUCER":"生产者",
"MESSAGE":"消息", "MESSAGE":"消息",
"MESSAGE_DETAIL":"消息详情",
"RESEND_MESSAGE":"重新消费",
"VIEW_EXCEPTION":"查看异常",
"MESSAGETRACE":"消息轨迹", "MESSAGETRACE":"消息轨迹",
"OPERATION": "操作", "OPERATION": "操作",
"ADD": "新增", "ADD": "新增",

View File

@@ -33,8 +33,9 @@ app.controller('loginController', ['$scope','$location','$http','Notification','
}).success(function (resp) { }).success(function (resp) {
if (resp.status == 0) { if (resp.status == 0) {
Notification.info({message: 'Login successful, redirect now', delay: 2000}); Notification.info({message: 'Login successful, redirect now', delay: 2000});
$window.sessionStorage.setItem("username", $("#username").val()); $window.sessionStorage.setItem("username", resp.data.loginUserName);
window.location = resp.data; $window.sessionStorage.setItem("userrole", resp.data.loginUserRole);
window.location = resp.data.contextPath;
initFlag = false; initFlag = false;
} else { } else {
Notification.error({message: resp.errMsg, delay: 2000}); Notification.error({message: resp.errMsg, delay: 2000});

View File

@@ -39,8 +39,8 @@ module.controller('messageController', ['$scope', 'ngDialog', '$http','Notificat
Notification.error({message: resp.errMsg, delay: 2000}); Notification.error({message: resp.errMsg, delay: 2000});
} }
}); });
$scope.timepickerBegin = moment().subtract(1, 'hour').format('YYYY-MM-DD HH:mm'); $scope.timepickerBegin = moment().subtract(3, 'hour').format('YYYY-MM-DD HH:mm');
$scope.timepickerEnd = moment().add(1,'hour').format('YYYY-MM-DD HH:mm'); $scope.timepickerEnd = moment().format('YYYY-MM-DD HH:mm');
$scope.timepickerOptions = {format: 'YYYY-MM-DD HH:mm', showClear: true}; $scope.timepickerOptions = {format: 'YYYY-MM-DD HH:mm', showClear: true};
$scope.taskId = ""; $scope.taskId = "";
@@ -237,8 +237,7 @@ module.controller('messageDetailViewDialogController',['$scope', 'ngDialog', '$h
result: resp.data result: resp.data
} }
}); });
} } else {
else {
ngDialog.open({ ngDialog.open({
template: 'operationResultDialog', template: 'operationResultDialog',
data: { data: {

View File

@@ -15,10 +15,12 @@
* limitations under the License. * limitations under the License.
*/ */
app.controller('opsController', ['$scope','$location','$http','Notification','remoteApi','tools', function ($scope,$location,$http,Notification,remoteApi,tools) { app.controller('opsController', ['$scope', '$location', '$http', 'Notification', 'remoteApi', 'tools', '$window', function ($scope, $location, $http, Notification, remoteApi, tools, $window) {
$scope.namesvrAddrList = ""; $scope.namesvrAddrList = "";
$scope.useVIPChannel = true; $scope.useVIPChannel = true;
$scope.useTLS = false; $scope.useTLS = false;
$scope.userRole = $window.sessionStorage.getItem("userrole");
$scope.writeOperationEnabled = $scope.userRole == null ? true : ($scope.userRole == 1 ? true : false);
$http({ $http({
method: "GET", method: "GET",
url: "ops/homePage.query" url: "ops/homePage.query"

View File

@@ -17,7 +17,7 @@ module.directive('ngConfirmClick', [
} }
}; };
}]); }]);
module.controller('topicController', ['$scope', 'ngDialog', '$http','Notification',function ($scope, ngDialog, $http,Notification) { module.controller('topicController', ['$scope', 'ngDialog', '$http', 'Notification', '$window', function ($scope, ngDialog, $http, Notification, $window) {
$scope.paginationConf = { $scope.paginationConf = {
currentPage: 1, currentPage: 1,
totalItems: 0, totalItems: 0,
@@ -36,6 +36,8 @@ module.controller('topicController', ['$scope', 'ngDialog', '$http','Notificatio
$scope.filterSystem = false $scope.filterSystem = false
$scope.allTopicList = []; $scope.allTopicList = [];
$scope.topicShowList = []; $scope.topicShowList = [];
$scope.userRole = $window.sessionStorage.getItem("userrole");
$scope.writeOperationEnabled = $scope.userRole == null ? true : ($scope.userRole == 1 ? true : false);
$scope.refreshTopicList = function () { $scope.refreshTopicList = function () {
$http({ $http({
@@ -339,7 +341,8 @@ module.controller('topicController', ['$scope', 'ngDialog', '$http','Notificatio
topicRequestList: request, topicRequestList: request,
allClusterNameList: Object.keys(resp.data.clusterInfo.clusterAddrTable), allClusterNameList: Object.keys(resp.data.clusterInfo.clusterAddrTable),
allBrokerNameList: Object.keys(resp.data.brokerServer), allBrokerNameList: Object.keys(resp.data.brokerServer),
bIsUpdate:bIsUpdate bIsUpdate: bIsUpdate,
writeOperationEnabled: $scope.writeOperationEnabled
} }
}); });
} }
@@ -463,7 +466,6 @@ module.controller('sendTopicMessageDialogController', ['$scope', 'ngDialog', '$h
}) })
} }
}] }]
); );
module.controller('routerViewDialogController', ['$scope', 'ngDialog', '$http', 'Notification', function ($scope, ngDialog, $http, Notification) { module.controller('routerViewDialogController', ['$scope', 'ngDialog', '$http', 'Notification', function ($scope, ngDialog, $http, Notification) {
@@ -481,5 +483,4 @@ module.controller('routerViewDialogController', ['$scope', 'ngDialog', '$http','
}) })
}; };
}] }]
); );

View File

@@ -25,13 +25,11 @@
<input type="text" class="form-control" ng-model="filterStr"> <input type="text" class="form-control" ng-model="filterStr">
</div> </div>
<div class="form-group form-group-sm"> <div class="form-group form-group-sm">
<button class="btn btn-raised btn-sm btn-primary" type="button" ng-show="{{writeOperationEnabled}}"
<button class="btn btn-raised btn-sm btn-primary" type="button" ng-click="openAddDialog()">{{'ADD' | ng-click="openAddDialog()">{{'ADD' | translate}}/ {{'UPDATE' | translate}}
translate}}/ {{'UPDATE' | translate}}
</button> </button>
</div> </div>
<div class="form-group form-group-sm"> <div class="form-group form-group-sm">
<button class="btn btn-raised btn-sm btn-primary" type="button" ng-click="refreshConsumerData()"> <button class="btn btn-raised btn-sm btn-primary" type="button" ng-click="refreshConsumerData()">
{{'REFRESH' | translate}} {{'REFRESH' | translate}}
</button> </button>
@@ -48,8 +46,7 @@
<div id="deployList" class="row"> <div id="deployList" class="row">
<table class="table table-bordered"> <table class="table table-bordered">
<tr> <tr>
<th class="text-center"><a ng-click="sortByKey('group')">{{ 'SUBSCRIPTION_GROUP' | <th class="text-center"><a ng-click="sortByKey('group')">{{ 'SUBSCRIPTION_GROUP' | translate}}</a></th>
translate}}</a></th>
<th class="text-center"><a ng-click="sortByKey('count')">{{ 'QUANTITY' | translate}}</a></th> <th class="text-center"><a ng-click="sortByKey('count')">{{ 'QUANTITY' | translate}}</a></th>
<th class="text-center">{{ 'VERSION' | translate}}</th> <th class="text-center">{{ 'VERSION' | translate}}</th>
<th class="text-center">{{ 'TYPE' | translate}}</th> <th class="text-center">{{ 'TYPE' | translate}}</th>
@@ -83,6 +80,7 @@
<!--</button>--> <!--</button>-->
<button name="client" ng-click="delete(consumerGroup.group)" <button name="client" ng-click="delete(consumerGroup.group)"
class="btn btn-raised btn-sm btn-danger" class="btn btn-raised btn-sm btn-danger"
ng-show="{{writeOperationEnabled}}"
type="button">{{'DELETE' | translate}} type="button">{{'DELETE' | translate}}
</button> </button>
@@ -242,7 +240,8 @@
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-4">consumeEnable:</label> <label class="control-label col-sm-4">consumeEnable:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<md-switch class="md-primary" md-no-ink aria-label="Switch No Ink" ng-model="item.subscriptionGroupConfig.consumeEnable"> <md-switch class="md-primary" ng-disabled="{{!ngDialogData.writeOperationEnabled}}" md-no-ink
aria-label="Switch No Ink" ng-model="item.subscriptionGroupConfig.consumeEnable">
</md-switch> </md-switch>
<!--<input class="form-control" ng-model="item.subscriptionGroupConfig.consumeEnable"--> <!--<input class="form-control" ng-model="item.subscriptionGroupConfig.consumeEnable"-->
<!--type="text"--> <!--type="text"-->
@@ -260,7 +259,9 @@
<div class="form-group"> <div class="form-group">
<label class="control-label col-sm-4">consumeBroadcastEnable:</label> <label class="control-label col-sm-4">consumeBroadcastEnable:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<md-switch class="md-primary" md-no-ink aria-label="Switch No Ink" ng-model="item.subscriptionGroupConfig.consumeBroadcastEnable"> <md-switch class="md-primary" ng-disabled="{{!ngDialogData.writeOperationEnabled}}" md-no-ink
aria-label="Switch No Ink"
ng-model="item.subscriptionGroupConfig.consumeBroadcastEnable">
</md-switch> </md-switch>
</div> </div>
</div> </div>
@@ -268,7 +269,7 @@
<label class="control-label col-sm-4">retryQueueNums:</label> <label class="control-label col-sm-4">retryQueueNums:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" ng-model="item.subscriptionGroupConfig.retryQueueNums" <input class="form-control" ng-model="item.subscriptionGroupConfig.retryQueueNums"
type="text" type="text" ng-disabled="{{!ngDialogData.writeOperationEnabled}}"
required/> required/>
<span class="text-danger" ng-show="addAppForm.name.$error.required">编号不能为空.</span> <span class="text-danger" ng-show="addAppForm.name.$error.required">编号不能为空.</span>
</div> </div>
@@ -286,7 +287,7 @@
<label class="control-label col-sm-4">brokerId:</label> <label class="control-label col-sm-4">brokerId:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" ng-model="item.subscriptionGroupConfig.brokerId" type="text" <input class="form-control" ng-model="item.subscriptionGroupConfig.brokerId" type="text"
required/> ng-disabled="{{!ngDialogData.writeOperationEnabled}}" required/>
<span class="text-danger" ng-show="addAppForm.name.$error.required">编号不能为空.</span> <span class="text-danger" ng-show="addAppForm.name.$error.required">编号不能为空.</span>
</div> </div>
</div> </div>
@@ -295,15 +296,23 @@
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" <input class="form-control"
ng-model="item.subscriptionGroupConfig.whichBrokerWhenConsumeSlowly" type="text" ng-model="item.subscriptionGroupConfig.whichBrokerWhenConsumeSlowly" type="text"
required/> ng-disabled="{{!ngDialogData.writeOperationEnabled}}" required/>
<span class="text-danger" ng-show="addAppForm.name.$error.required">编号不能为空.</span> <span class="text-danger" ng-show="addAppForm.name.$error.required">编号不能为空.</span>
</div> </div>
</div> </div>
</form> </form>
<div class="modal-footer"> <div class="modal-footer">
<button type="button" class="btn btn-raised btn-primary" ng-disabled="addAppForm.$invalid" <div class="ngdialog-buttons">
<button type="button" class="ngdialog-button ngdialog-button-primary"
ng-disabled="addAppForm.$invalid"
ng-show="{{ngDialogData.writeOperationEnabled}}"
ng-click="postConsumerRequest(item)">{{ 'COMMIT' | translate }} ng-click="postConsumerRequest(item)">{{ 'COMMIT' | translate }}
</button> </button>
<button type="button" class="ngdialog-button ngdialog-button-secondary"
ng-click="closeThisDialog('Cancel')">{{ 'CLOSE' | translate }}
</button>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
@@ -396,7 +405,9 @@
<td><label>{{ 'DELAY' | translate }}</label></td> <td><label>{{ 'DELAY' | translate }}</label></td>
<td>{{consumeDetail.diffTotal}}</td> <td>{{consumeDetail.diffTotal}}</td>
<td><label>{{ 'LAST_CONSUME_TIME' | translate }}</label></td> <td><label>{{ 'LAST_CONSUME_TIME' | translate }}</label></td>
<td>{{(consumeDetail.lastTimestamp == 0)?"N/A":consumeDetail.lastTimestamp | date:'yyyy-MM-dd HH:mm:ss'}}</td> <td>{{(consumeDetail.lastTimestamp == 0)?"N/A":consumeDetail.lastTimestamp |
date:'yyyy-MM-dd HH:mm:ss'}}
</td>
</tr> </tr>
</table> </table>
</td> </td>
@@ -422,7 +433,8 @@
<td class="text-center">{{item.brokerOffset}}</td> <td class="text-center">{{item.brokerOffset}}</td>
<td class="text-center">{{item.consumerOffset}}</td> <td class="text-center">{{item.consumerOffset}}</td>
<td class="text-center">{{item.brokerOffset-item.consumerOffset}}</td> <td class="text-center">{{item.brokerOffset-item.consumerOffset}}</td>
<td class="text-center">{{(item.lastTimestamp == 0)?"N/A":item.lastTimestamp | date:'yyyy-MM-dd HH:mm:ss'}}</td> <td class="text-center">{{(item.lastTimestamp == 0)?"N/A":item.lastTimestamp | date:'yyyy-MM-dd HH:mm:ss'}}
</td>
</tr> </tr>
</table> </table>
</td> </td>

View File

@@ -41,7 +41,8 @@
<div class="form-group "> <div class="form-group ">
<label>{{'BEGIN' | translate}}:</label> <label>{{'BEGIN' | translate}}:</label>
<div class="input-group"> <div class="input-group">
<input class="form-control" datetimepicker ng-change="onChangeQueryCondition()" ng-model="timepickerBegin" <input class="form-control" datetimepicker
ng-change="onChangeQueryCondition()" ng-model="timepickerBegin"
options="timepickerOptions"/> options="timepickerOptions"/>
<span class="input-group-addon"><span <span class="input-group-addon"><span
class="glyphicon glyphicon-calendar"></span></span> class="glyphicon glyphicon-calendar"></span></span>
@@ -50,7 +51,8 @@
<div class="form-group"> <div class="form-group">
<label>{{'END' | translate}}:</label> <label>{{'END' | translate}}:</label>
<div class="input-group"> <div class="input-group">
<input class="form-control" datetimepicker ng-change="onChangeQueryCondition()" ng-model="timepickerEnd" <input class="form-control" datetimepicker
ng-change="onChangeQueryCondition()" ng-model="timepickerEnd"
options="timepickerOptions"/> options="timepickerOptions"/>
<span class="input-group-addon"><span <span class="input-group-addon"><span
class="glyphicon glyphicon-calendar"></span></span> class="glyphicon glyphicon-calendar"></span></span>
@@ -79,8 +81,7 @@
</td> </td>
<td class="text-center"> <td class="text-center">
<button class="btn btn-raised btn-sm btn-primary" type="button" <button class="btn btn-raised btn-sm btn-primary" type="button"
ng-click="queryMessageByMessageId(item.msgId,item.topic)">Message ng-click="queryMessageByMessageId(item.msgId,item.topic)">{{'MESSAGE_DETAIL' | translate}}
Detail
</button> </button>
</td> </td>
</tr> </tr>
@@ -237,11 +238,11 @@
<td class="text-center"> <td class="text-center">
<button class="btn btn-raised btn-sm btn-primary" type="button" <button class="btn btn-raised btn-sm btn-primary" type="button"
ng-click="resendMessage(ngDialogData.messageView,item.consumerGroup)"> ng-click="resendMessage(ngDialogData.messageView,item.consumerGroup)">
Resend Message {{ 'RESEND_MESSAGE' | translate}}
</button> </button>
<button class="btn btn-raised btn-sm btn-primary" type="button" <button class="btn btn-raised btn-sm btn-primary" type="button"
ng-click="showExceptionDesc(item.exceptionDesc)"> ng-click="showExceptionDesc(item.exceptionDesc)">
View Exception {{ 'VIEW_EXCEPTION' | translate}}
</button> </button>
</td> </td>
</tr> </tr>

View File

@@ -18,21 +18,24 @@
<div class="page-content"> <div class="page-content">
<h2 class="md-title">NameServerAddressList</h2> <h2 class="md-title">NameServerAddressList</h2>
<div class="pull-left"> <div class="pull-left">
<input type="text" class="form-control" ng-model="namesvrAddrList" /> <input type="text" class="form-control" ng-model="namesvrAddrList" ng-disabled="{{!writeOperationEnabled}}"/>
</div> </div>
<div class="pull-left"> <div class="pull-left">
<button class="btn btn-raised btn-sm btn-primary" type="button" ng-click="updateNameSvrAddr()">{{'UPDATE' | translate}} <button class="btn btn-raised btn-sm btn-primary" type="button" ng-show="{{writeOperationEnabled}}"
ng-click="updateNameSvrAddr()">{{'UPDATE' | translate}}
</button> </button>
</div> </div>
<br/> <br/>
<br/> <br/>
<h2 class="md-title">IsUseVIPChannel</h2> <h2 class="md-title">IsUseVIPChannel</h2>
<div class="pull-left"> <div class="pull-left">
<md-switch class="md-primary" md-no-ink aria-label="Switch No Ink" ng-model="useVIPChannel"> <md-switch class="md-primary" ng-disabled="{{!writeOperationEnabled}}" md-no-ink aria-label="Switch No Ink"
ng-model="useVIPChannel">
</md-switch> </md-switch>
</div> </div>
<div class="pull-left"> <div class="pull-left">
<button class="btn btn-raised btn-sm btn-primary" type="button" ng-click="updateIsVIPChannel()">{{'UPDATE' | translate}} <button class="btn btn-raised btn-sm btn-primary" type="button" ng-show="{{writeOperationEnabled}}"
ng-click="updateIsVIPChannel()">{{'UPDATE' | translate}}
</button> </button>
</div> </div>
@@ -41,11 +44,13 @@
<br/> <br/>
<h2 class="md-title">useTLS</h2> <h2 class="md-title">useTLS</h2>
<div class="pull-left"> <div class="pull-left">
<md-switch class="md-primary" md-no-ink aria-label="Switch No Ink" ng-model="useTLS"> <md-switch class="md-primary" ng-disabled="{{!writeOperationEnabled}}" md-no-ink aria-label="Switch No Ink"
ng-model="useTLS">
</md-switch> </md-switch>
</div> </div>
<div class="pull-left"> <div class="pull-left">
<button class="btn btn-raised btn-sm btn-primary" type="button" ng-click="updateUseTLS()">{{'UPDATE' | translate}} <button class="btn btn-raised btn-sm btn-primary" type="button" ng-show="{{writeOperationEnabled}}"
ng-click="updateUseTLS()">{{'UPDATE' | translate}}
</button> </button>
</div> </div>
</div> </div>

View File

@@ -30,8 +30,8 @@
</md-checkbox> </md-checkbox>
<md-checkbox aria-label="Checkbox" ng-model="filterSystem" class="md-primary">{{'SYSTEM' | translate}} <md-checkbox aria-label="Checkbox" ng-model="filterSystem" class="md-primary">{{'SYSTEM' | translate}}
</md-checkbox> </md-checkbox>
<button class="btn btn-raised btn-sm btn-primary" type="button" ng-click="openAddDialog()">{{'ADD' | <button class="btn btn-raised btn-sm btn-primary" type="button" ng-show="{{writeOperationEnabled}}"
translate}}/ {{'UPDATE' | translate}} ng-click="openAddDialog()">{{'ADD' | translate}}/ {{'UPDATE' | translate}}
</button> </button>
<button class="btn btn-raised btn-sm btn-primary" type="button" ng-click="refreshTopicList()"> <button class="btn btn-raised btn-sm btn-primary" type="button" ng-click="refreshTopicList()">
{{'REFRESH' | translate}} {{'REFRESH' | translate}}
@@ -68,15 +68,16 @@
ng-click="openSendTopicMessageDialog(topic)">{{'SEND_MSG' | translate}} ng-click="openSendTopicMessageDialog(topic)">{{'SEND_MSG' | translate}}
</button> </button>
<button class="btn btn-raised btn-sm btn-danger" type="button" <button class="btn btn-raised btn-sm btn-danger" type="button"
ng-show="{{!sysFlag}}" ng-show="{{!sysFlag && writeOperationEnabled}}"
ng-click="openConsumerResetOffsetDialog(topic)">{{'RESET_CUS_OFFSET' | translate}} ng-click="openConsumerResetOffsetDialog(topic)">{{'RESET_CUS_OFFSET' | translate}}
</button> </button>
<button class="btn btn-raised btn-sm btn-danger" type="button" <button class="btn btn-raised btn-sm btn-danger" type="button"
ng-show="{{!sysFlag}}" ng-show="{{!sysFlag && writeOperationEnabled}}"
ng-click="openSkipMessageAccumulateDialog(topic)">{{'SKIP_MESSAGE_ACCUMULATE' | translate}} ng-click="openSkipMessageAccumulateDialog(topic)">{{'SKIP_MESSAGE_ACCUMULATE' |
translate}}
</button> </button>
<button class="btn btn-raised btn-sm btn-danger" type="button" <button class="btn btn-raised btn-sm btn-danger" type="button"
ng-show="{{!sysFlag}}" ng-show="{{!sysFlag && writeOperationEnabled}}"
ng-confirm-click="Are you sure to delete?" ng-confirm-click="Are you sure to delete?"
confirmed-click="deleteTopic(topic)">{{'DELETE' | translate}} confirmed-click="deleteTopic(topic)">{{'DELETE' | translate}}
</button> </button>
@@ -192,7 +193,7 @@
<label class="control-label col-sm-2">{{'WRITE_QUEUE_NUMS'|translate}}:</label> <label class="control-label col-sm-2">{{'WRITE_QUEUE_NUMS'|translate}}:</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input class="form-control" ng-model="item.writeQueueNums" name="writeQueueNums" type="text" <input class="form-control" ng-model="item.writeQueueNums" name="writeQueueNums" type="text"
required/> ng-disabled="{{!ngDialogData.writeOperationEnabled}}" required/>
<span class="text-danger" ng-show="addAppForm.writeQueueNums.$error.required">{{'WRITE_QUEUE_NUMS'|translate}}不能为空.</span> <span class="text-danger" ng-show="addAppForm.writeQueueNums.$error.required">{{'WRITE_QUEUE_NUMS'|translate}}不能为空.</span>
</div> </div>
</div> </div>
@@ -200,7 +201,7 @@
<label class="control-label col-sm-2">{{'READ_QUEUE_NUMS'|translate}}:</label> <label class="control-label col-sm-2">{{'READ_QUEUE_NUMS'|translate}}:</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input class="form-control" ng-model="item.readQueueNums" name="readQueueNums" type="text" <input class="form-control" ng-model="item.readQueueNums" name="readQueueNums" type="text"
required/> ng-disabled="{{!ngDialogData.writeOperationEnabled}}" required/>
<span class="text-danger" ng-show="addAppForm.readQueueNums.$error.required">{{'READ_QUEUE_NUMS'|translate}}不能为空.</span> <span class="text-danger" ng-show="addAppForm.readQueueNums.$error.required">{{'READ_QUEUE_NUMS'|translate}}不能为空.</span>
</div> </div>
</div> </div>
@@ -208,7 +209,7 @@
<label class="control-label col-sm-2">{{'PERM'|translate}}:</label> <label class="control-label col-sm-2">{{'PERM'|translate}}:</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input class="form-control" ng-model="item.perm" name="perm" type="text" <input class="form-control" ng-model="item.perm" name="perm" type="text"
required/> ng-disabled="{{!ngDialogData.writeOperationEnabled}}" required/>
<span class="text-danger" ng-show="addAppForm.perm.$error.required">{{'PERM'|translate}}不能为空.</span> <span class="text-danger" ng-show="addAppForm.perm.$error.required">{{'PERM'|translate}}不能为空.</span>
</div> </div>
</div> </div>
@@ -216,7 +217,7 @@
<div class="modal-footer"> <div class="modal-footer">
<div class="ngdialog-buttons"> <div class="ngdialog-buttons">
<button type="button" class="ngdialog-button ngdialog-button-primary" <button type="button" class="ngdialog-button ngdialog-button-primary"
ng-show="{{!ngDialogData.sysFlag}}" ng-show="{{!ngDialogData.sysFlag && ngDialogData.writeOperationEnabled}}"
ng-click="postTopicRequest(item)">{{ 'COMMIT' | translate }} ng-click="postTopicRequest(item)">{{ 'COMMIT' | translate }}
</button> </button>
<button type="button" class="ngdialog-button ngdialog-button-secondary" <button type="button" class="ngdialog-button ngdialog-button-secondary"

View File

@@ -96,7 +96,7 @@ public class LoginControllerTest extends BaseControllerTest {
.param("password", rightPwd); .param("password", rightPwd);
perform = mockMvc.perform(requestBuilder); perform = mockMvc.perform(requestBuilder);
perform.andExpect(status().isOk()) perform.andExpect(status().isOk())
.andExpect(jsonPath("$.data").value(contextPath)); .andExpect(jsonPath("$.data.contextPath").value(contextPath));
} }