Add support for adding param rule / authority rule in resource page of dashboard
- Decouple rule checking from controller (now in service) Signed-off-by: Eric Zhao <sczyh16@gmail.com>
This commit is contained in:
parent
bd0de9464c
commit
eace8ab2ff
|
|
@ -55,7 +55,7 @@ public class ParamFlowRuleEntity extends AbstractRuleEntity<ParamFlowRule> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public int getBlockGrade() {
|
public int getGrade() {
|
||||||
return rule.getGrade();
|
return rule.getGrade();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -165,7 +165,7 @@ public class ParamFlowRuleController {
|
||||||
if (entity.getCount() < 0) {
|
if (entity.getCount() < 0) {
|
||||||
return Result.ofFail(-1, "count should be valid");
|
return Result.ofFail(-1, "count should be valid");
|
||||||
}
|
}
|
||||||
if (entity.getBlockGrade() != RuleConstant.FLOW_GRADE_QPS) {
|
if (entity.getGrade() != RuleConstant.FLOW_GRADE_QPS) {
|
||||||
return Result.ofFail(-1, "Unknown mode (blockGrade) for parameter flow control");
|
return Result.ofFail(-1, "Unknown mode (blockGrade) for parameter flow control");
|
||||||
}
|
}
|
||||||
if (entity.getParamIdx() == null || entity.getParamIdx() < 0) {
|
if (entity.getParamIdx() == null || entity.getParamIdx() < 0) {
|
||||||
|
|
|
||||||
|
|
@ -94,24 +94,8 @@ angular.module('sentinelDashboardApp').controller('AuthorityRuleController', ['$
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
function checkRuleValid(rule) {
|
|
||||||
if (rule.resource === undefined || rule.resource === '') {
|
|
||||||
alert('资源名称不能为空');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.limitApp === undefined || rule.limitApp === '') {
|
|
||||||
alert('流控针对应用不能为空');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.strategy === undefined) {
|
|
||||||
alert('必须选择黑白名单模式');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.saveRule = function () {
|
$scope.saveRule = function () {
|
||||||
if (!checkRuleValid($scope.currentRule.rule)) {
|
if (!AuthorityRuleService.checkRuleValid($scope.currentRule.rule)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($scope.authorityRuleDialog.type === 'add') {
|
if ($scope.authorityRuleDialog.type === 'add') {
|
||||||
|
|
@ -136,7 +120,7 @@ angular.module('sentinelDashboardApp').controller('AuthorityRuleController', ['$
|
||||||
alert("添加规则失败:未知错误");
|
alert("添加规则失败:未知错误");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function saveRuleAndPush(rule, edit) {
|
function saveRuleAndPush(rule, edit) {
|
||||||
AuthorityRuleService.saveRule(rule).success(function (data) {
|
AuthorityRuleService.saveRule(rule).success(function (data) {
|
||||||
|
|
|
||||||
|
|
@ -81,33 +81,8 @@ app.controller('DegradeCtl', ['$scope', '$stateParams', 'DegradeService', 'ngDia
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
function checkRuleValid(rule) {
|
|
||||||
if (rule.resource === undefined || rule.resource === '') {
|
|
||||||
alert('资源名称不能为空');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.grade === undefined || rule.grade < 0) {
|
|
||||||
alert('未知的降级类型');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.count === undefined || rule.count === '' || rule.count < 0) {
|
|
||||||
alert('降级阈值不能为空或小于 0');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.timeWindow === undefined || rule.timeWindow === '' || rule.timeWindow <= 0) {
|
|
||||||
alert('降级时间窗口必须大于 0');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// 异常比率类型.
|
|
||||||
if (rule.grade == 1 && rule.count > 1) {
|
|
||||||
alert('异常比率超出范围:[0.0 - 1.0]');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.saveRule = function () {
|
$scope.saveRule = function () {
|
||||||
if (!checkRuleValid($scope.currentRule)) {
|
if (!DegradeService.checkRuleValid($scope.currentRule)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($scope.degradeRuleDialog.type === 'add') {
|
if ($scope.degradeRuleDialog.type === 'add') {
|
||||||
|
|
|
||||||
|
|
@ -88,50 +88,8 @@ app.controller('FlowCtl', ['$scope', '$stateParams', 'FlowService', 'ngDialog',
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
function notNumberAtLeastZero(num) {
|
|
||||||
return num === undefined || num === '' || isNaN(num) || num < 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function notNumberGreaterThanZero(num) {
|
|
||||||
return num === undefined || num === '' || isNaN(num) || num <= 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkRuleValid(rule) {
|
|
||||||
if (rule.resource === undefined || rule.resource === '') {
|
|
||||||
alert('资源名称不能为空');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.count === undefined || rule.count < 0) {
|
|
||||||
alert('限流阈值必须大于等于 0');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.strategy === undefined || rule.strategy < 0) {
|
|
||||||
alert('无效的流控模式');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.strategy == 1 || rule.strategy == 2) {
|
|
||||||
if (rule.refResource === undefined || rule.refResource === '') {
|
|
||||||
alert('请填写关联资源或入口');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (rule.controlBehavior === undefined || rule.controlBehavior < 0) {
|
|
||||||
alert('无效的流控整形方式');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.controlBehavior == 1 && notNumberGreaterThanZero(rule.warmUpPeriodSec)) {
|
|
||||||
alert('预热时长必须大于 0');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.controlBehavior == 2 && notNumberGreaterThanZero(rule.maxQueueingTimeMs)) {
|
|
||||||
alert('排队超时时间必须大于 0');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.saveRule = function () {
|
$scope.saveRule = function () {
|
||||||
if (!checkRuleValid($scope.currentRule)) {
|
if (!FlowService.checkRuleValid($scope.currentRule)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($scope.flowRuleDialog.type === 'add') {
|
if ($scope.flowRuleDialog.type === 'add') {
|
||||||
|
|
|
||||||
|
|
@ -1,18 +1,13 @@
|
||||||
var app = angular.module('sentinelDashboardApp');
|
var app = angular.module('sentinelDashboardApp');
|
||||||
|
|
||||||
app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',
|
app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',
|
||||||
'ngDialog', 'FlowService', 'DegradeService', 'MachineService',
|
'ngDialog', 'FlowService', 'DegradeService', 'AuthorityRuleService', 'ParamFlowService', 'MachineService',
|
||||||
'$interval', '$location', '$timeout',
|
'$interval', '$location', '$timeout',
|
||||||
function ($scope, $stateParams, IdentityService, ngDialog,
|
function ($scope, $stateParams, IdentityService, ngDialog,
|
||||||
FlowService, DegradeService, MachineService, $interval, $location, $timeout) {
|
FlowService, DegradeService, AuthorityRuleService, ParamFlowService, MachineService, $interval, $location, $timeout) {
|
||||||
|
|
||||||
$scope.app = $stateParams.app;
|
$scope.app = $stateParams.app;
|
||||||
// $scope.rulesPageConfig = {
|
|
||||||
// pageSize : 10,
|
|
||||||
// currentPageIndex : 1,
|
|
||||||
// totalPage : 1,
|
|
||||||
// totalCount: 0,
|
|
||||||
// };
|
|
||||||
$scope.currentPage = 1;
|
$scope.currentPage = 1;
|
||||||
$scope.pageSize = 16;
|
$scope.pageSize = 16;
|
||||||
$scope.totalPage = 1;
|
$scope.totalPage = 1;
|
||||||
|
|
@ -90,10 +85,13 @@ app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',
|
||||||
};
|
};
|
||||||
|
|
||||||
function saveFlowRule() {
|
function saveFlowRule() {
|
||||||
|
if (!FlowService.checkRuleValid(flowRuleDialogScope.currentRule)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
FlowService.newRule(flowRuleDialogScope.currentRule).success(function (data) {
|
FlowService.newRule(flowRuleDialogScope.currentRule).success(function (data) {
|
||||||
if (data.code == 0) {
|
if (data.code == 0) {
|
||||||
flowRuleDialog.close();
|
flowRuleDialog.close();
|
||||||
var url = '/dashboard/flow/' + $scope.app;
|
let url = '/dashboard/flow/' + $scope.app;
|
||||||
$location.path(url);
|
$location.path(url);
|
||||||
} else {
|
} else {
|
||||||
alert('失败!');
|
alert('失败!');
|
||||||
|
|
@ -102,6 +100,9 @@ app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveFlowRuleAndContinue() {
|
function saveFlowRuleAndContinue() {
|
||||||
|
if (!FlowService.checkRuleValid(flowRuleDialogScope.currentRule)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
FlowService.newRule(flowRuleDialogScope.currentRule).success(function (data) {
|
FlowService.newRule(flowRuleDialogScope.currentRule).success(function (data) {
|
||||||
if (data.code == 0) {
|
if (data.code == 0) {
|
||||||
flowRuleDialog.close();
|
flowRuleDialog.close();
|
||||||
|
|
@ -148,6 +149,9 @@ app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',
|
||||||
};
|
};
|
||||||
|
|
||||||
function saveDegradeRule() {
|
function saveDegradeRule() {
|
||||||
|
if (!DegradeService.checkRuleValid(degradeRuleDialogScope.currentRule)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) {
|
DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) {
|
||||||
if (data.code == 0) {
|
if (data.code == 0) {
|
||||||
degradeRuleDialog.close();
|
degradeRuleDialog.close();
|
||||||
|
|
@ -160,6 +164,9 @@ app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',
|
||||||
}
|
}
|
||||||
|
|
||||||
function saveDegradeRuleAndContinue() {
|
function saveDegradeRuleAndContinue() {
|
||||||
|
if (!DegradeService.checkRuleValid(degradeRuleDialogScope.currentRule)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) {
|
DegradeService.newRule(degradeRuleDialogScope.currentRule).success(function (data) {
|
||||||
if (data.code == 0) {
|
if (data.code == 0) {
|
||||||
degradeRuleDialog.close();
|
degradeRuleDialog.close();
|
||||||
|
|
@ -169,9 +176,176 @@ app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let authorityRuleDialog;
|
||||||
|
let authorityRuleDialogScope;
|
||||||
|
|
||||||
|
function saveAuthorityRule() {
|
||||||
|
let ruleEntity = authorityRuleDialogScope.currentRule;
|
||||||
|
if (!AuthorityRuleService.checkRuleValid(ruleEntity.rule)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
AuthorityRuleService.addNewRule(ruleEntity).success((data) => {
|
||||||
|
if (data.success) {
|
||||||
|
authorityRuleDialog.close();
|
||||||
|
let url = '/dashboard/authority/' + $scope.app;
|
||||||
|
$location.path(url);
|
||||||
|
} else {
|
||||||
|
alert('添加规则失败:' + data.msg);
|
||||||
|
}
|
||||||
|
}).error((data) => {
|
||||||
|
if (data) {
|
||||||
|
alert('添加规则失败:' + data.msg);
|
||||||
|
} else {
|
||||||
|
alert("添加规则失败:未知错误");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveAuthorityRuleAndContinue() {
|
||||||
|
let ruleEntity = authorityRuleDialogScope.currentRule;
|
||||||
|
if (!AuthorityRuleService.checkRuleValid(ruleEntity.rule)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
AuthorityRuleService.addNewRule(ruleEntity).success((data) => {
|
||||||
|
if (data.success) {
|
||||||
|
authorityRuleDialog.close();
|
||||||
|
} else {
|
||||||
|
alert('添加规则失败:' + data.msg);
|
||||||
|
}
|
||||||
|
}).error((data) => {
|
||||||
|
if (data) {
|
||||||
|
alert('添加规则失败:' + data.msg);
|
||||||
|
} else {
|
||||||
|
alert("添加规则失败:未知错误");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.addNewAuthorityRule = function (resource) {
|
||||||
|
if (!$scope.macInputModel) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let mac = $scope.macInputModel.split(':');
|
||||||
|
authorityRuleDialogScope = $scope.$new(true);
|
||||||
|
authorityRuleDialogScope.currentRule = {
|
||||||
|
app: $scope.app,
|
||||||
|
ip: mac[0],
|
||||||
|
port: mac[1],
|
||||||
|
rule: {
|
||||||
|
resource: resource,
|
||||||
|
strategy: 0,
|
||||||
|
limitApp: '',
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
authorityRuleDialogScope.authorityRuleDialog = {
|
||||||
|
title: '新增授权规则',
|
||||||
|
type: 'add',
|
||||||
|
confirmBtnText: '新增',
|
||||||
|
saveAndContinueBtnText: '新增并继续添加'
|
||||||
|
};
|
||||||
|
authorityRuleDialogScope.saveRule = saveAuthorityRule;
|
||||||
|
authorityRuleDialogScope.saveRuleAndContinue = saveAuthorityRuleAndContinue;
|
||||||
|
|
||||||
|
authorityRuleDialog = ngDialog.open({
|
||||||
|
template: '/app/views/dialog/authority-rule-dialog.html',
|
||||||
|
width: 680,
|
||||||
|
overlay: true,
|
||||||
|
scope: authorityRuleDialogScope
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
let paramFlowRuleDialog;
|
||||||
|
let paramFlowRuleDialogScope;
|
||||||
|
|
||||||
|
function saveParamFlowRule() {
|
||||||
|
let ruleEntity = paramFlowRuleDialogScope.currentRule;
|
||||||
|
if (!ParamFlowService.checkRuleValid(ruleEntity.rule)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ParamFlowService.addNewRule(ruleEntity).success((data) => {
|
||||||
|
if (data.success) {
|
||||||
|
paramFlowRuleDialog.close();
|
||||||
|
let url = '/dashboard/paramFlow/' + $scope.app;
|
||||||
|
$location.path(url);
|
||||||
|
} else {
|
||||||
|
alert('添加热点规则失败:' + data.msg);
|
||||||
|
}
|
||||||
|
}).error((data) => {
|
||||||
|
if (data) {
|
||||||
|
alert('添加热点规则失败:' + data.msg);
|
||||||
|
} else {
|
||||||
|
alert("添加热点规则失败:未知错误");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveParamFlowRuleAndContinue() {
|
||||||
|
let ruleEntity = paramFlowRuleDialogScope.currentRule;
|
||||||
|
if (!ParamFlowService.checkRuleValid(ruleEntity.rule)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ParamFlowService.addNewRule(ruleEntity).success((data) => {
|
||||||
|
if (data.success) {
|
||||||
|
paramFlowRuleDialog.close();
|
||||||
|
} else {
|
||||||
|
alert('添加热点规则失败:' + data.msg);
|
||||||
|
}
|
||||||
|
}).error((data) => {
|
||||||
|
if (data) {
|
||||||
|
alert('添加热点规则失败:' + data.msg);
|
||||||
|
} else {
|
||||||
|
alert("添加热点规则失败:未知错误");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$scope.addNewParamFlowRule = function (resource) {
|
||||||
|
if (!$scope.macInputModel) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let mac = $scope.macInputModel.split(':');
|
||||||
|
paramFlowRuleDialogScope = $scope.$new(true);
|
||||||
|
paramFlowRuleDialogScope.currentRule = {
|
||||||
|
app: $scope.app,
|
||||||
|
ip: mac[0],
|
||||||
|
port: mac[1],
|
||||||
|
rule: {
|
||||||
|
resource: resource,
|
||||||
|
grade: 1,
|
||||||
|
paramFlowItemList: [],
|
||||||
|
count: 0,
|
||||||
|
limitApp: 'default',
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
paramFlowRuleDialogScope.paramFlowRuleDialog = {
|
||||||
|
title: '新增热点规则',
|
||||||
|
type: 'add',
|
||||||
|
confirmBtnText: '新增',
|
||||||
|
saveAndContinueBtnText: '新增并继续添加',
|
||||||
|
supportAdvanced: false,
|
||||||
|
showAdvanceButton: true
|
||||||
|
};
|
||||||
|
paramFlowRuleDialogScope.saveRule = saveParamFlowRule;
|
||||||
|
paramFlowRuleDialogScope.saveRuleAndContinue = saveParamFlowRuleAndContinue;
|
||||||
|
// paramFlowRuleDialogScope.onOpenAdvanceClick = function () {
|
||||||
|
// paramFlowRuleDialogScope.paramFlowRuleDialog.showAdvanceButton = false;
|
||||||
|
// };
|
||||||
|
// paramFlowRuleDialogScope.onCloseAdvanceClick = function () {
|
||||||
|
// paramFlowRuleDialogScope.paramFlowRuleDialog.showAdvanceButton = true;
|
||||||
|
// };
|
||||||
|
|
||||||
|
paramFlowRuleDialog = ngDialog.open({
|
||||||
|
template: '/app/views/dialog/param-flow-rule-dialog.html',
|
||||||
|
width: 680,
|
||||||
|
overlay: true,
|
||||||
|
scope: paramFlowRuleDialogScope
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
var searchHandler;
|
var searchHandler;
|
||||||
$scope.searchChange = function (searchKey) {
|
$scope.searchChange = function (searchKey) {
|
||||||
// console.info('searchKey=', searchKey);
|
|
||||||
$timeout.cancel(searchHandler);
|
$timeout.cancel(searchHandler);
|
||||||
searchHandler = $timeout(function () {
|
searchHandler = $timeout(function () {
|
||||||
$scope.searchKey = searchKey;
|
$scope.searchKey = searchKey;
|
||||||
|
|
@ -180,14 +354,14 @@ app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',
|
||||||
reInitIdentityDatas();
|
reInitIdentityDatas();
|
||||||
$scope.firstExpandAll = false;
|
$scope.firstExpandAll = false;
|
||||||
}, 600);
|
}, 600);
|
||||||
}
|
};
|
||||||
|
|
||||||
$scope.initTreeTable = function () {
|
$scope.initTreeTable = function () {
|
||||||
// if (!$scope.table) {
|
// if (!$scope.table) {
|
||||||
com_github_culmat_jsTreeTable.register(window);
|
com_github_culmat_jsTreeTable.register(window);
|
||||||
$scope.table = window.treeTable($('#identities'));
|
$scope.table = window.treeTable($('#identities'));
|
||||||
// }
|
// }
|
||||||
}
|
};
|
||||||
|
|
||||||
$scope.expandAll = function () {
|
$scope.expandAll = function () {
|
||||||
$scope.isExpand = true;
|
$scope.isExpand = true;
|
||||||
|
|
@ -198,13 +372,12 @@ app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',
|
||||||
$scope.treeView = function () {
|
$scope.treeView = function () {
|
||||||
$scope.isTreeView = true;
|
$scope.isTreeView = true;
|
||||||
queryIdentities();
|
queryIdentities();
|
||||||
}
|
};
|
||||||
$scope.listView = function () {
|
$scope.listView = function () {
|
||||||
$scope.isTreeView = false;
|
$scope.isTreeView = false;
|
||||||
queryIdentities();
|
queryIdentities();
|
||||||
}
|
};
|
||||||
|
|
||||||
queryAppMachines();
|
|
||||||
function queryAppMachines() {
|
function queryAppMachines() {
|
||||||
MachineService.getAppMachines($scope.app).success(
|
MachineService.getAppMachines($scope.app).success(
|
||||||
function (data) {
|
function (data) {
|
||||||
|
|
@ -230,7 +403,10 @@ app.controller('IdentityCtl', ['$scope', '$stateParams', 'IdentityService',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
};
|
}
|
||||||
|
|
||||||
|
// Fetch all machines by current app name.
|
||||||
|
queryAppMachines();
|
||||||
|
|
||||||
$scope.$watch('macInputModel', function () {
|
$scope.$watch('macInputModel', function () {
|
||||||
if ($scope.macInputModel) {
|
if ($scope.macInputModel) {
|
||||||
|
|
|
||||||
|
|
@ -122,7 +122,7 @@ angular.module('sentinelDashboardApp').controller('ParamFlowController', ['$scop
|
||||||
.error((data, header, config, status) => {
|
.error((data, header, config, status) => {
|
||||||
$scope.loadError = {message: "未知错误"}
|
$scope.loadError = {message: "未知错误"}
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
$scope.getMachineRules = getMachineRules;
|
$scope.getMachineRules = getMachineRules;
|
||||||
getMachineRules();
|
getMachineRules();
|
||||||
|
|
||||||
|
|
@ -134,6 +134,7 @@ angular.module('sentinelDashboardApp').controller('ParamFlowController', ['$scop
|
||||||
title: '编辑热点规则',
|
title: '编辑热点规则',
|
||||||
type: 'edit',
|
type: 'edit',
|
||||||
confirmBtnText: '保存',
|
confirmBtnText: '保存',
|
||||||
|
supportAdvanced: true,
|
||||||
showAdvanceButton: rule.rule.paramFlowItemList === undefined || rule.rule.paramFlowItemList.length <= 0
|
showAdvanceButton: rule.rule.paramFlowItemList === undefined || rule.rule.paramFlowItemList.length <= 0
|
||||||
};
|
};
|
||||||
paramFlowRuleDialog = ngDialog.open({
|
paramFlowRuleDialog = ngDialog.open({
|
||||||
|
|
@ -152,7 +153,7 @@ angular.module('sentinelDashboardApp').controller('ParamFlowController', ['$scop
|
||||||
ip: mac[0],
|
ip: mac[0],
|
||||||
port: mac[1],
|
port: mac[1],
|
||||||
rule: {
|
rule: {
|
||||||
blockGrade: 1,
|
grade: 1,
|
||||||
paramFlowItemList: [],
|
paramFlowItemList: [],
|
||||||
count: 0,
|
count: 0,
|
||||||
limitApp: 'default',
|
limitApp: 'default',
|
||||||
|
|
@ -180,38 +181,8 @@ angular.module('sentinelDashboardApp').controller('ParamFlowController', ['$scop
|
||||||
$scope.paramFlowRuleDialog.showAdvanceButton = true;
|
$scope.paramFlowRuleDialog.showAdvanceButton = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
function checkRuleValid(rule) {
|
|
||||||
if (!rule.resource || rule.resource === '') {
|
|
||||||
alert('资源名称不能为空');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.blockGrade !== 1) {
|
|
||||||
alert('未知的限流模式');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.count < 0) {
|
|
||||||
alert('限流阈值必须大于等于 0');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.paramIdx === undefined || rule.paramIdx === '' || isNaN(rule.paramIdx) || rule.paramIdx < 0) {
|
|
||||||
alert('热点参数索引必须大于等于 0');
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (rule.paramFlowItemList !== undefined) {
|
|
||||||
for (let i = 0; i < rule.paramFlowItemList.length; i++) {
|
|
||||||
let item = rule.paramFlowItemList[i];
|
|
||||||
if ($scope.notValidParamItem(item)) {
|
|
||||||
alert('热点参数例外项不合法,请检查值和类型是否正确:参数为 ' + item.object + ', 类型为 ' +
|
|
||||||
item.classType + ', 限流阈值为 ' + item.count);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$scope.saveRule = function () {
|
$scope.saveRule = function () {
|
||||||
if (!checkRuleValid($scope.currentRule.rule)) {
|
if (!ParamFlowService.checkRuleValid($scope.currentRule.rule)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if ($scope.paramFlowRuleDialog.type === 'add') {
|
if ($scope.paramFlowRuleDialog.type === 'add') {
|
||||||
|
|
@ -236,7 +207,7 @@ angular.module('sentinelDashboardApp').controller('ParamFlowController', ['$scop
|
||||||
alert("添加规则失败:未知错误");
|
alert("添加规则失败:未知错误");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
function saveRuleAndPush(rule, edit) {
|
function saveRuleAndPush(rule, edit) {
|
||||||
ParamFlowService.saveRule(rule).success(function (data) {
|
ParamFlowService.saveRule(rule).success(function (data) {
|
||||||
|
|
@ -290,7 +261,7 @@ angular.module('sentinelDashboardApp').controller('ParamFlowController', ['$scop
|
||||||
type: 'delete_rule',
|
type: 'delete_rule',
|
||||||
attentionTitle: '请确认是否删除如下热点参数限流规则',
|
attentionTitle: '请确认是否删除如下热点参数限流规则',
|
||||||
attention: '资源名: ' + ruleEntity.rule.resource + ', 热点参数索引: ' + ruleEntity.rule.paramIdx +
|
attention: '资源名: ' + ruleEntity.rule.resource + ', 热点参数索引: ' + ruleEntity.rule.paramIdx +
|
||||||
', 限流模式: ' + (ruleEntity.rule.blockGrade === 1 ? 'QPS' : '未知') + ', 限流阈值: ' + ruleEntity.rule.count,
|
', 限流模式: ' + (ruleEntity.rule.grade === 1 ? 'QPS' : '未知') + ', 限流阈值: ' + ruleEntity.rule.count,
|
||||||
confirmBtnText: '删除',
|
confirmBtnText: '删除',
|
||||||
};
|
};
|
||||||
confirmDialog = ngDialog.open({
|
confirmDialog = ngDialog.open({
|
||||||
|
|
@ -301,7 +272,7 @@ angular.module('sentinelDashboardApp').controller('ParamFlowController', ['$scop
|
||||||
};
|
};
|
||||||
|
|
||||||
$scope.confirm = function () {
|
$scope.confirm = function () {
|
||||||
if ($scope.confirmDialog.type == 'delete_rule') {
|
if ($scope.confirmDialog.type === 'delete_rule') {
|
||||||
deleteRuleAndPush($scope.currentRule);
|
deleteRuleAndPush($scope.currentRule);
|
||||||
} else {
|
} else {
|
||||||
console.error('error');
|
console.error('error');
|
||||||
|
|
|
||||||
|
|
@ -37,4 +37,20 @@ angular.module('sentinelDashboardApp').service('AuthorityRuleService', ['$http',
|
||||||
method: 'DELETE'
|
method: 'DELETE'
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.checkRuleValid = function checkRuleValid(rule) {
|
||||||
|
if (rule.resource === undefined || rule.resource === '') {
|
||||||
|
alert('资源名称不能为空');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.limitApp === undefined || rule.limitApp === '') {
|
||||||
|
alert('流控针对应用不能为空');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.strategy === undefined) {
|
||||||
|
alert('必须选择黑白名单模式');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
}]);
|
}]);
|
||||||
|
|
|
||||||
|
|
@ -60,4 +60,29 @@ app.service('DegradeService', ['$http', function ($http) {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.checkRuleValid = function (rule) {
|
||||||
|
if (rule.resource === undefined || rule.resource === '') {
|
||||||
|
alert('资源名称不能为空');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.grade === undefined || rule.grade < 0) {
|
||||||
|
alert('未知的降级类型');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.count === undefined || rule.count === '' || rule.count < 0) {
|
||||||
|
alert('降级阈值不能为空或小于 0');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.timeWindow === undefined || rule.timeWindow === '' || rule.timeWindow <= 0) {
|
||||||
|
alert('降级时间窗口必须大于 0');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// 异常比率类型.
|
||||||
|
if (rule.grade == 1 && rule.count > 1) {
|
||||||
|
alert('异常比率超出范围:[0.0 - 1.0]');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
}]);
|
}]);
|
||||||
|
|
|
||||||
|
|
@ -70,4 +70,46 @@ app.service('FlowService', ['$http', function ($http) {
|
||||||
method: 'GET'
|
method: 'GET'
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function notNumberAtLeastZero(num) {
|
||||||
|
return num === undefined || num === '' || isNaN(num) || num < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function notNumberGreaterThanZero(num) {
|
||||||
|
return num === undefined || num === '' || isNaN(num) || num <= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.checkRuleValid = function (rule) {
|
||||||
|
if (rule.resource === undefined || rule.resource === '') {
|
||||||
|
alert('资源名称不能为空');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.count === undefined || rule.count < 0) {
|
||||||
|
alert('限流阈值必须大于等于 0');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.strategy === undefined || rule.strategy < 0) {
|
||||||
|
alert('无效的流控模式');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.strategy == 1 || rule.strategy == 2) {
|
||||||
|
if (rule.refResource === undefined || rule.refResource == '') {
|
||||||
|
alert('请填写关联资源或入口');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (rule.controlBehavior === undefined || rule.controlBehavior < 0) {
|
||||||
|
alert('无效的流控整形方式');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.controlBehavior == 1 && notNumberGreaterThanZero(rule.warmUpPeriodSec)) {
|
||||||
|
alert('预热时长必须大于 0');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.controlBehavior == 2 && notNumberGreaterThanZero(rule.maxQueueingTimeMs)) {
|
||||||
|
alert('排队超时时间必须大于 0');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
}]);
|
}]);
|
||||||
|
|
|
||||||
|
|
@ -39,4 +39,66 @@ angular.module('sentinelDashboardApp').service('ParamFlowService', ['$http', fun
|
||||||
method: 'DELETE'
|
method: 'DELETE'
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function isNumberClass(classType) {
|
||||||
|
return classType === 'int' || classType === 'double' ||
|
||||||
|
classType === 'float' || classType === 'long' || classType === 'short';
|
||||||
|
}
|
||||||
|
|
||||||
|
function isByteClass(classType) {
|
||||||
|
return classType === 'byte';
|
||||||
|
}
|
||||||
|
|
||||||
|
function notNumberAtLeastZero(num) {
|
||||||
|
return num === undefined || num === '' || isNaN(num) || num < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function notGoodNumber(num) {
|
||||||
|
return num === undefined || num === '' || isNaN(num);
|
||||||
|
}
|
||||||
|
|
||||||
|
function notGoodNumberBetweenExclusive(num, l ,r) {
|
||||||
|
return num === undefined || num === '' || isNaN(num) || num < l || num > r;
|
||||||
|
}
|
||||||
|
|
||||||
|
function notValidParamItem(curExItem) {
|
||||||
|
if (isNumberClass(curExItem.classType) && notGoodNumber(curExItem.object)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (isByteClass(curExItem.classType) && notGoodNumberBetweenExclusive(curExItem.object, -128, 127)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return curExItem.object === undefined || curExItem.classType === undefined ||
|
||||||
|
notNumberAtLeastZero(curExItem.count);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.checkRuleValid = function (rule) {
|
||||||
|
if (!rule.resource || rule.resource === '') {
|
||||||
|
alert('资源名称不能为空');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.grade != 1) {
|
||||||
|
alert('未知的限流模式');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.count < 0) {
|
||||||
|
alert('限流阈值必须大于等于 0');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.paramIdx === undefined || rule.paramIdx === '' || isNaN(rule.paramIdx) || rule.paramIdx < 0) {
|
||||||
|
alert('热点参数索引必须大于等于 0');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (rule.paramFlowItemList !== undefined) {
|
||||||
|
for (var i = 0; i < rule.paramFlowItemList.length; i++) {
|
||||||
|
var item = rule.paramFlowItemList[i];
|
||||||
|
if (notValidParamItem(item)) {
|
||||||
|
alert('热点参数例外项不合法,请检查值和类型是否正确:参数为 ' + item.object + ', 类型为 ' +
|
||||||
|
item.classType + ', 限流阈值为 ' + item.count);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
}]);
|
}]);
|
||||||
|
|
|
||||||
|
|
@ -101,7 +101,7 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- exclusion item part end -->
|
<!-- exclusion item part end -->
|
||||||
<div class="form-group text-center">
|
<div class="form-group text-center" ng-if="paramFlowRuleDialog.supportAdvanced">
|
||||||
<a ng-click="onOpenAdvanceClick()" ng-if="paramFlowRuleDialog.showAdvanceButton">高级选项</a>
|
<a ng-click="onOpenAdvanceClick()" ng-if="paramFlowRuleDialog.showAdvanceButton">高级选项</a>
|
||||||
<a ng-click="onCloseAdvanceClick()" ng-if="!paramFlowRuleDialog.showAdvanceButton">关闭高级选项</a>
|
<a ng-click="onCloseAdvanceClick()" ng-if="!paramFlowRuleDialog.showAdvanceButton">关闭高级选项</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -41,13 +41,13 @@
|
||||||
<td style="width: 40%;">
|
<td style="width: 40%;">
|
||||||
资源名
|
资源名
|
||||||
</td>
|
</td>
|
||||||
<td style="width: 8%;">通过QPS</td>
|
<td style="width: 7%;">通过QPS</td>
|
||||||
<td style="width: 8%;">拒绝QPS</td>
|
<td style="width: 7%;">拒绝QPS</td>
|
||||||
<td style="width: 8%;">线程数</td>
|
<td style="width: 5%;">线程数</td>
|
||||||
<td style="width: 8%;">平均RT</td>
|
<td style="width: 6%;">平均RT</td>
|
||||||
<td style="width: 8%;">分钟通过</td>
|
<td style="width: 6%;">分钟通过</td>
|
||||||
<td style="width: 8%;">分钟拒绝</td>
|
<td style="width: 6%;">分钟拒绝</td>
|
||||||
<td style="width: 12%">操作</td>
|
<td style="width: 23%">操作</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr></tr>
|
<tr></tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
|
@ -74,6 +74,10 @@
|
||||||
<i class="fa fa-plus"></i> 流控</button>
|
<i class="fa fa-plus"></i> 流控</button>
|
||||||
<button class="btn btn-xs btn-default" type="button" ng-click="addNewDegradeRule(resource.resource)" style="font-size: 12px; height:25px;">
|
<button class="btn btn-xs btn-default" type="button" ng-click="addNewDegradeRule(resource.resource)" style="font-size: 12px; height:25px;">
|
||||||
<i class="fa fa-plus"></i> 降级</button>
|
<i class="fa fa-plus"></i> 降级</button>
|
||||||
|
<button class="btn btn-xs btn-default" type="button" ng-click="addNewParamFlowRule(resource.resource)" style="font-size: 12px; height:25px;">
|
||||||
|
<i class="fa fa-plus"></i> 热点</button>
|
||||||
|
<button class="btn btn-xs btn-default" type="button" ng-click="addNewAuthorityRule(resource.resource)" style="font-size: 12px; height:25px;">
|
||||||
|
<i class="fa fa-plus"></i> 授权</button>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
|
||||||
2
sentinel-dashboard/src/main/webapp/resources/dist/js/app.js
vendored
Executable file → Normal file
2
sentinel-dashboard/src/main/webapp/resources/dist/js/app.js
vendored
Executable file → Normal file
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue