Code Shared & Review(20201214-20201220)
发布于: 2020 年 12 月 21 日

一、后端
1.stream 应用
1.1 字符串转 List
// 无法处理异常如字符创包含非数字类型(英文、汉字、空格等其他字符)List<Integer> idList = Arrays.stream(idListStr.split(seperator))      .map(Integer::parseInt)      .collect(Collectors.toList());
gradeIdList.stream().map(String::valueOf).collect(Collectors.joining(",")))复制代码
 1.2 List 转字符串
gradeSortedMap.values().stream().collect(Collectors.joining(","));String.join(",", gradeSortedMap.values());attachmentListTmp.stream()  .filter(e -> AttachmentTypeEnum.AV.getCode().equals(e.getTypeCode()))  .map(Attachment::getOriginalFileName)  .collect(Collectors.joining(","));复制代码
 1.3 List<Object> -> map<T,Object>
		Map<String, Udc> gradeUdc = GlobalDataCache.udcCache				.stream()				.filter(e -> UdcMeta.grade.getUdcCode().equals(e.getUdcCode()))				.collect(Collectors.toMap(Udc::getValDesc, Function.identity()))     复制代码
 1.4 List<Object> -> map<T,List<Object>>
Map<String, List<Chunk>> mapTmp = chunkList.stream()  .collect(Collectors.groupingBy(Chunk::getIdentifier));复制代码
 1.5 List 中对象的属性是否包含指定值
courseList.stream().noneMatch(e -> e.getId() == dra.getCourseId()) == true复制代码
 2.清除 warning
2.1 类注释
 
 2.2 import
 
 2.3 多余的变量定义
ExamBase examBase = examBaseService.findById(id);return ResultUtil.success(examBase);==>return ResultUtil.success(examBaseService.findById(id));复制代码
 3.注入方式 autowired -> 构造器注入
@Autowiredprivate ExamBaseService examBaseService;
// 构造器注入private final ExamBaseService examBaseService;
public ExamBaseController(ExamBaseService examBaseService) {	this.examBaseService = examBaseService;}复制代码
 4.关于日志
controller层入参使用log.infolog.debug("[ExamBase-PAGE] query={}", query); =>log.info("[ExamBase-PAGE] query={}", query); 复制代码
 if (ToolUtil.isEmpty(id)) {	return ResultUtil.fail("请求数据不完整或格式错误!");}log.debug("[ExamBase-findById] id={}", id);==>log.info("[ExamBase-findById] id={}", id);if (ToolUtil.isEmpty(id) || id < 1) {	return ResultUtil.fail(BizExceptionEnum.PARAM_IMCOMPLETE);}
复制代码
 5.swagger 及 JSON 转换
    @ApiOperation("新增考试基础表信息")    @BussinessLog(value = "新增考试基础表")    @RequestMapping(value = "/save", method = RequestMethod.POST)    public ResultUtil save(@ApiParam(name="examBaseConfig",value = "JSON类型[ExamBase,List<ExamCourseFullMark>],要求:examName必填")                                       String examBaseConfig) {        if (ToolUtil.isOneEmpty(examBaseConfig)) {            return ResultUtil.fail("请求数据不完整或格式错误!");        }        CourseFullMarkBean courseFullMarkBean = JSONObject.parseObject(examBaseConfig, CourseFullMarkBean.class);
        log.debug("[ExamBase-save] examBase={}", courseFullMarkBean); // 无法输出内容,        ResultUtil result = examBaseService.save(courseFullMarkBean);        return result;    }复制代码
     @BussinessLog(value = "新增考试基础表")    @ApiOperation("新增考试基础表信息")    @ApiParam(name="examBaseConfig",value = "JSON类型[ExamBase,List<ExamCourseFullMark>],要求:examName必填")    @RequestMapping(value = "/save", method = RequestMethod.POST)    public ResultUtil save(String examBaseConfig) {        log.info("[ExamBase-save] examBaseConfig={}", examBaseConfig);        if (ToolUtil.isOneEmpty(examBaseConfig)) {            return ResultUtil.fail(BizExceptionEnum.PARAM_IMCOMPLETE);        }                try {            CourseFullMarkBean courseFullMarkBean = JSONObject.parseObject(examBaseConfig, CourseFullMarkBean.class);            log.debug("[ExamBase-save] courseFullMarkBean={}", courseFullMarkBean);            return examBaseService.save(courseFullMarkBean);        }catch(JSONException exception) {            return ResultUtil.fail(BizExceptionEnum.JSON_FORMAT_EXCEPTION);        }    }复制代码
 6.e.printStackTrace()
1.只调用 e.printStackTrace(),是不会把日志文件输出到 logback 管理的日志文件。只会写入 tomcat 中的 catalina.out
2.应该使用 log.error("tips",e) 。输出异常信息 + 异常类型,不包括异常堆栈
7.controlle
controller 层只检测入参和处理出参,不负责业务逻辑。下面的代码中,异常逻辑处理需要放在 initBaseImportStu 中。
 try {   return examBaseService.initBaseImportStu(examBaseId, file); } catch (Exception e) {   e.printStackTrace();   examBaseService.updateStatus(examBaseId, Constant.EXAM_INIT_STATUS_START);   return ResultUtil.fail("导入学生信息失败"); }复制代码
 8.SQL delete 返回结果只又两种 >0 or ==0
int result = examBaseService.deleteById(examBaseId);if (result==-1){	return ResultUtil.fail("基础考试已经被使用在报告配置中,无法删除");}复制代码
 9.C/U/D 必须加事务控制
@Override	public int batchExamCourseFullMark(Long examBaseId, List<ExamCourseFullMark> marks) {		return examCourseFullMarkMapper.batchInsertFullMark(examBaseId,marks);	}
	@Transactional(rollbackFor = Exception.class)	@Override	public int deleteByExamBaseId(Long id){		return this.examCourseFullMarkMapper.deleteById(id);	}
	@Override	public ExamCourseFullMark findFullMark(Long examBaseId, Long courseId) {
		return examCourseFullMarkMapper.findFullMark(examBaseId, courseId);	}复制代码
 12.代码分析
@Transactional(rollbackFor = Exception.class)@Overridepublic ResultUtil save(CourseFullMarkBean courseFullMarkBean) {        //验证科目        List<ExamCourseFullMark> marks = courseFullMarkBean.getFullMarks();        ExamBase examBase = courseFullMarkBean.getExamBase();        if(marks == null || marks.size() == 0){            return ResultUtil.fail("没有选择科目信息");        }        StringBuilder courseNames = new StringBuilder();        for (ExamCourseFullMark mark: marks             ) {            ExamCourse examCourse = examCourseService.findById(mark.getCourseId());            if (examCourse!=null){                courseNames.append(mark.getCourseId()).append(",");            }else{                return ResultUtil.fail("科目信息错误[科目ID:"+mark.getCourseId()+"]");            }        }        //赋值exam科目属性        examBase.setExamCourse(courseNames.substring(0,courseNames.length()-1));        examBaseMapper.insertExamBase(examBase);        //添加fullMarks        examCourseFullMarkService.batchExamCourseFullMark(examBase.getId(),marks);        return ResultUtil.success("考试创建成功");    }复制代码
 - service 层不要使用 resultUtil. 
- 异常可以使用 throw new ServiceException(BizException.****). 
- 参数校验放在数据库操作之前 
- for 循环中,不要使用数据库连接这种耗时操作,可以先把数据一次性查出来。 
- StringBuilder.substring() => List<Integer>. 使用“,”连接。参考 1.2 
- 变量命名必须符合实际意义。names 中不能添加 id。 
- 事务无法对 mapper 层的方法生效 
- service 层,的 C/U/D 必须加事务 
- WHERE IN 语句 
WHERE("T.code in " + SqlUtil.toSqlStringSet(codes));复制代码
 7.关于 Update 属性为空的判断
// 基本类型 varchar ,int ,日期等if(StringUtils.isNotEmpty(obj.getField()))==>if(null != obj.getField() )
// 集合类型if(ToolUtil.isNotEmpty(obj.getField())
 // 该语句会导致空字符串无法更新的bug		if(StringUtils.notEmpty(obj.getSendTime())){  SET("sendTime = #{obj.sendTime}");}   // 正确写法   if(null != obj.getChannel() ){     SET("channel = #{obj.channel}");   }
复制代码
 二、前端
1.Variable named rule
 
 2.Element 行选择的理解及命名方式
    handleSelectionChange(selectRow) {      this.selectRowsId = []      selectRow.forEach(element => {        this.selectRowsId.push(element.id)      })    },复制代码
 3.不要让客户清理缓存
静态资源,比如图片等。
4.民族选择器如何设计
5.Hard Code
<el-image 	:preview-src-list="getImgPreview('http://xzzz.zzedu.net.cn/ppst/upload/file/'+scope.row.imgSignUrl)" 	fit="scale-down"   :src="'http://xzzz.zzedu.net.cn/ppst/upload/file/'+scope.row.imgSignUrl"   style="width:80px;height:50px;vertical-align: top" />    selGrade_onChanged(value) {    this.$http.request_get('business/exam/findCourseDataSource', { gradeCode: value, examId: this.examId }).then(response => {      if (response.data.success) {        this.selCourseDataSourceList = response.data.data        if (this.selCourseDataSourceList.length !== 0) {          this.courseId = this.selCourseDataSourceList[0].id        }      } else {        this.courseId = ''        this.selCourseDataSourceList = []      }    })  },    btnRelationExam_Click() {      console.log(this.selectRowsId)      this.$http.request_get('business/exam/findCourseDataSource', { gradeCode: value, examId: this.examId }).then(response => {        if (response.data.success) {          this.selCourseDataSourceList = response.data.data          if (this.selCourseDataSourceList.length !== 0) {            this.courseId = this.selCourseDataSourceList[0].id          }        } else {          this.courseId = ''          this.selCourseDataSourceList = []        }      })      this.$refs.eltable.clearSelection()      this.selectRowsId = []    },复制代码
 3.English
    btnRelationChanel_Click() {      this.dialogVisible = false      this.$refs.eltable.clearSelection()      this.selectRowsId = []    },复制代码
 划线
评论
复制
发布于: 2020 年 12 月 21 日阅读数: 1195

刘璐
关注
还未添加个人签名 2018.03.29 加入
还未添加个人简介











 
    
评论