目录
1、应用背景
最近项目在做学习系统课程成绩综合评分的时候,需要给学员的成绩按照分数进行不同等级的评分,并且需求要求评分等级能够自定义。具体实现如下图所示:
其中有如下要求:
- 等级名称自定义
- 每个等级有最小值和最大值区间为[90,100],[80,90)
- 区间除去第一个取闭区间外,其他区间为左开右闭区间,需要后端验证区间内容最小值必须小于最大值
- 最后区间必须是[0,N),如果最后区间不是从0开始就会出现一部分未参与学习学员成绩无法落在区间
- 相邻两个区间的之间 前一区间的最小值min,和后一个区间的最大值相等,就是两个区间之间是连续的。
- 其中前端开发人员需要限定输入必须为数字,同时控制最大值不用输入。
2、二维数组判断区间是否连续
courseWeight.validate.gradeRule.minZero=成绩等级规则最小值必须为0
courseWeight.validate.gradeRule.maxHundred=成绩等级规则最大值必须为100
courseWeight.validate.gradeRule.minGreaterMax=成绩等级区间 {0} 最小值应小于最大值
courseWeight.validate.gradeRule.intervalContinuity=成绩等级区间 {0} {1} 之间不连续
/**
* 验证等级成绩是否连续
*
* @param gradeRuleList
* @return
*/
private String validGradeRuleInterval(List<GradeRuleVO> gradeRuleList) {
String validResult = null;
// List 转换 二维数组
Integer gradeRuleSize = gradeRuleList.size();
Long[][] gradeRuleArray = new Long[gradeRuleSize][2];
for (int i = 0; i < gradeRuleSize; i++) {
GradeRuleVO gradeRuleVO = gradeRuleList.get(i);
gradeRuleArray[i][0] = gradeRuleVO.getMin();
gradeRuleArray[i][1] = gradeRuleVO.getMax();
}
//验证等级规则最大值必须100
if (!BusinessConstants.CONSTANT_LONG_HUNDRED.equals(gradeRuleArray[0][1])) {
validResult = MessageUtils.message("courseWeight.validate.gradeRule.maxHundred");
return validResult;
}
//判断最后区间是否未0-某个值
if (!BusinessConstants.CONSTANT_LONG_ZERO.equals(gradeRuleArray[gradeRuleSize - 1][0])) {
validResult = MessageUtils.message("courseWeight.validate.gradeRule.minZero");
return validResult;
}
StringBuffer mutiIntervalValid = new StringBuffer();
boolean isError = false;
for (int k = 0; k < gradeRuleArray.length; k++) {
//验证区间最小值大于最大值情况
if (gradeRuleArray[k][0] >= gradeRuleArray[k][1]) {
String preIntervalInfo = "";
if (k == 0) {
preIntervalInfo = " [" + gradeRuleArray[k][0] + "," + gradeRuleArray[k][1] + "] ";
validResult = MessageUtils.message("courseWeight.validate.gradeRule.minGreaterMax");
validResult = MessageFormat.format(validResult, preIntervalInfo);
} else {
preIntervalInfo = " [" + gradeRuleArray[k][0] + "," + gradeRuleArray[k][1] + ") ";
validResult = MessageUtils.message("courseWeight.validate.gradeRule.minGreaterMax");
validResult = MessageFormat.format(validResult, preIntervalInfo);
}
mutiIntervalValid.append("\n" + validResult);
isError = true;
}
}
if (isError) {
return mutiIntervalValid.toString();
}
for (int k = 0; k < gradeRuleArray.length - 1; k++) {
//验证区间不连续
if (!gradeRuleArray[k][0].equals(gradeRuleArray[k + 1][1])) {
String preIntervalInfo = "";
validResult = MessageUtils.message("courseWeight.validate.gradeRule.intervalContinuity");
if (k == 0) {
preIntervalInfo = " [" + gradeRuleArray[k][0] + "," + gradeRuleArray[k][1] + "] ";
} else {
preIntervalInfo = " [" + gradeRuleArray[k][0] + "," + gradeRuleArray[k][1] + ") ";
}
String nextIntervalInfo = "[" + gradeRuleArray[k + 1][0] + "," + gradeRuleArray[k + 1][1] + ")";
validResult = MessageFormat.format(validResult, preIntervalInfo, nextIntervalInfo);
mutiIntervalValid.append("\n" + validResult);
isError = true;
}
}
if (isError) {
return mutiIntervalValid.toString();
} else {
return null;
}
3、成果展现
4、总结
我们在实际实现功能过程之中,需要后端需要做相关验证,同时也需要前端限定最大值不能输入,开始产品设计过程之中最大值如果输入就很难控制。同时有些验证需要前端进行验证和限定。通过此次功能的实现,能够使用二维数组进行验证区间之间的连续性,验证区间之间的连续性不仅仅适用于等级评分,还可以应用时段之间的连续性验证。
原始原型设计图:
以前其他系统实现的方案