- Decouple rule checking from controller (now in service) Signed-off-by: Eric Zhao <sczyh16@gmail.com>master
@@ -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: 8%;">拒绝QPS</td> | |||||
<td style="width: 8%;">线程数</td> | |||||
<td style="width: 8%;">平均RT</td> | |||||
<td style="width: 8%;">分钟通过</td> | |||||
<td style="width: 8%;">分钟拒绝</td> | |||||
<td style="width: 12%">操作</td> | |||||
<td style="width: 7%;">通过QPS</td> | |||||
<td style="width: 7%;">拒绝QPS</td> | |||||
<td style="width: 5%;">线程数</td> | |||||
<td style="width: 6%;">平均RT</td> | |||||
<td style="width: 6%;">分钟通过</td> | |||||
<td style="width: 6%;">分钟拒绝</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> | ||||