写点什么

Code Shared & Review(20201214-20201220)

用户头像
刘璐
关注
发布于: 2020 年 12 月 21 日
Code Shared & Review(20201214-20201220)

一、后端

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("考试创建成功");    }
复制代码


  1. service 层不要使用 resultUtil.

  2. 异常可以使用 throw new ServiceException(BizException.****).

  3. 参数校验放在数据库操作之前

  4. for 循环中,不要使用数据库连接这种耗时操作,可以先把数据一次性查出来。

  5. StringBuilder.substring() => List<Integer>. 使用“,”连接。参考 1.2

  6. 变量命名必须符合实际意义。names 中不能添加 id。

  7. 事务无法对 mapper 层的方法生效

  8. service 层,的 C/U/D 必须加事务

  9. 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 = []    },
复制代码


用户头像

刘璐

关注

还未添加个人签名 2018.03.29 加入

还未添加个人简介

评论

发布
暂无评论
Code Shared & Review(20201214-20201220)