当前位置: 首页 > news >正文

后端代码规范

1、报文入参尽量避免使用实体类(如果用实体类接受参数,一定要写好注解,具体用到了实体类的哪一个属性

/*** * @Description: 新增玉米观测记录主表信息* @param @param params* @param @return 参数* @return Result 返回类型* @author 魏振申* @throws*/@ApiOperation(value = "玉米选定测产信息新增", notes = "玉米选定测产信息新增接口")@ApiResponses(value = { @ApiResponse(code = 200, message = "查询成功", responseContainer = "com.rhxt.util.Result"),@ApiResponse(code = 650, message = "参数缺失")})@RequestMapping(value = "/insertMaizeRInfo", method = RequestMethod.POST)public Result insertMaizeRInfo(@ApiJsonObject(name = "insertMaizeRInfo", value = {@ApiJsonProperty(key = "userId", example = "1", description = "当前登录用户id ", type = "string", required = true),})@RequestBody JSONObject params) {Result result = new Result();Map<String, Object> dataMap = new HashMap<>();if (JSONUtils.checkParams(params, "userId", "testCode", "cropKind")) {String rowNum = params.containsKey("rowNum")?params.getString("rowNum"):null;String rowLength = params.containsKey("rowLength")?params.getString("rowLength"):null;String spikeNum = params.containsKey("spikeNum")?params.getString("spikeNum"):null;String plantNum = params.containsKey("plantNum")?params.getString("plantNum"):null;String doubleSpikeNum = params.containsKey("doubleSpikeNum")?params.getString("doubleSpikeNum"):null;String emptyRodNum = params.containsKey("emptyRodNum")?params.getString("emptyRodNum"):null;String downNum = params.containsKey("downNum")?params.getString("downNum"):null;String theoryYield = params.containsKey("theoryYield")?params.getString("theoryYield"):null;String actualYield = params.containsKey("actualYield")?params.getString("actualYield"):null;String quadratArea = params.containsKey("quadratArea")?params.getString("quadratArea"):null;String maizeRId = params.containsKey("maizeRId")?params.getString("maizeRId"):null;String userId = params.getString("userId");String testCode = params.getString("testCode");String cropKind = params.getString("cropKind");int count = iMaizeTestService.insertMaizeRInfo(rowNum, rowLength, spikeNum, plantNum, doubleSpikeNum, emptyRodNum, downNum, theoryYield, actualYield, quadratArea, userId, testCode, cropKind, maizeRId);switch (count) {case 0: case 2: case 3:result.setCode(ResponseEnum.OPERATION_ERROR.getCode());result.setMsg(ResponseEnum.OPERATION_ERROR.getMsg());break;case 1:result.setCode(ResponseEnum.OPERATION_SUCCESS.getCode());result.setMsg(ResponseEnum.OPERATION_SUCCESS.getMsg());dataMap = iMaizeTestService.selectMaizeYieldInfo(testCode);break;default:break;}} else {result.setCode(ResponseEnum.PARAM_LOSE_EXCEPTION.getCode());result.setMsg(ResponseEnum.PARAM_LOSE_EXCEPTION.getMsg());}result.setObj(dataMap);return result;}


2、入参必填校验务必要做,入参类型为map、JSONObject类型的我们均配置的有统一校验方法

JSONUtils.checkParams(params, "userId", "testCode", "cropKind")


3、响应数据务必使用封装好的枚举类及对应的结果类

响应枚举类尽量放在controller层处理
4、修改数据配合前端失焦及延时保存传值,应做到哪个发生变化,修改哪个,而不是每次全行修改


5、swagger注解务必添加,并配备真实入参及描述信息


6、如使用@RequestMapping注解,需指定method类型


7、关键点增加日志记录及异常信息捕捉输出


8、service层方法入参应以具体的参数为主,而非对象传参

所有的参数在controller层中接受成具体的属性,之后传到service中


9、mybatis中sql关键字必须大写


10、删除无用引入包、无用变量、无用mapper方法

11、为了避免obj为null的现象,应该这样写

查询

新增 ,修改,删除这样写(在setObj的时候把查询的列表数据放进去,因为前端还要做列表刷新)

/*** * @Description: 新增玉米叶绿素含量记录* @param @param params* @param @return 参数* @return Result 返回类型* @author 魏振申* @throws*/@ApiOperation(value = "新增玉米叶绿素含量记录", notes = "新增玉米叶绿素含量记录")@ApiResponses(value = { @ApiResponse(code = 200, message = "查询成功", responseContainer = "com.rhxt.util.Result"),@ApiResponse(code = 650, message = "参数缺失")})@RequestMapping(value = "/insertChlorophyllInfo", method = RequestMethod.POST)public Result insertChlorophyllInfo(@ApiJsonObject(name = "insertChlorophyllInfo", value = {@ApiJsonProperty(key = "userId", example = "1", description = "当前登录用户id ", type = "string", required = true),})@RequestBody JSONObject params) {Result result = new Result();List<ChlorophyllRPojo> listData = new ArrayList<>();if (JSONUtils.checkParams(params, "userId", "testCode", "cropKind")) {String cropPhase = params.containsKey("cropPhase")?params.getString("cropPhase"):null;String chlorophyll = params.containsKey("chlorophyll")?params.getString("chlorophyll"):null;String chlId = params.containsKey("chlId")?params.getString("chlId"):null;String userId = params.getString("userId");String testCode = params.getString("testCode");String cropKind = params.getString("cropKind");int count = iMaizeTestService.insertChlorophyllInfo(cropPhase, chlorophyll, userId, testCode, cropKind, chlId);switch (count) {case 0:result.setCode(ResponseEnum.OPERATION_ERROR.getCode());result.setMsg(ResponseEnum.OPERATION_ERROR.getMsg());break;case 1:result.setCode(ResponseEnum.OPERATION_SUCCESS.getCode());result.setMsg(ResponseEnum.OPERATION_SUCCESS.getMsg());listData = iMaizeTestService.selectChlorophyllInfo(testCode, cropKind);break;case 2:result.setCode(ResponseEnum.OPERATION_ERROR.getCode());result.setMsg("数据存储入库异常");break;case 3:result.setCode(ResponseEnum.OPERATION_ERROR.getCode());result.setMsg("数据转换异常");break;}} else {result.setCode(ResponseEnum.PARAM_LOSE_EXCEPTION.getCode());result.setMsg(ResponseEnum.PARAM_LOSE_EXCEPTION.getMsg());}result.setObj(listData);return result;}

 12、批量的新增需要批量新增

这种需要处理成批量插入(错误写法)

 正确示范

service

/*** @description: 主阀关联批量添加分阀(新增)* @author: 赵书正* @date: 2023/3/27 17:28* @param: [fCodes, zCode]* @return: int**/@Overridepublic int insertValveZF(String fCodes, String zCode) {int count = 0;//先删除掉所有跟zCode关联的分阀门try {count = valveZFMapper.deleteByZCode(zCode);} catch (Exception e) {log.info("删除掉所有跟zCode关联的分阀门出现异常,异常位置:ValveZFServiceImpl.deleteByZCode,异常原因:", e);}List<ValveZFPojo> list = new ArrayList<>();if (G4Utils.isNotEmpty(fCodes)) {String[] fCodeArr = fCodes.split(",");for (String fCode : fCodeArr) {ValveZFPojo valveZFPojo = new ValveZFPojo();valveZFPojo.setId(G4Utils.getUUID());valveZFPojo.setzCode(zCode);valveZFPojo.setfCode(fCode);valveZFPojo.setCreateTime(G4Utils.getLocalDateTime("yyyy-MM-dd HH:mm:ss"));list.add(valveZFPojo);}try {count = valveZFMapper.insertValveZF(list);} catch (Exception e) {log.info("主阀关联批量添加分阀出现异常,异常位置:ValveZFServiceImpl.insertValveZF,异常原因:", e);}} else {count = 1;}return count;}

xml

<insert id="insertValveZF" parameterType="com.rhxt.platform.basic.pojo.ValveZFPojo">insert into VALVE_Z_F (ID, Z_CODE, F_CODE, CREATE_USE, CREATE_TIME)values<foreach collection="list" index="index" item="item" separator=",">(#{item.id,jdbcType=VARCHAR},#{item.zCode,jdbcType=VARCHAR},#{item.fCode,jdbcType=VARCHAR},#{item.createUse,jdbcType=VARCHAR},#{item.createTime,jdbcType=TIMESTAMP})</foreach></insert>

13.批量删除也要做成批量的

错误写法(改成批量的

 正确写法

/*** @description: 主阀关联批量添加分阀(移除)* @author: 赵书正* @date: 2023/3/27 17:29* @param: [fCodeArr, zCode]* @return: int**/@Overridepublic int deleteValveZF(String[] fCodeArr, String zCode) {int count = 0;try {count = valveZFMapper.deleteValveZF(fCodeArr, zCode);} catch (Exception e) {log.info("主阀关联批量添加分阀出现异常,异常位置:ValveZFServiceImpl.deleteValveZF,异常原因:", e);}return count;}

xml

<delete id="deleteValveZF" parameterType="java.lang.String">delete from VALVE_Z_Fwhere Z_CODE = #{zCode,jdbcType=VARCHAR} AND F_CODE in #{fCodeArr}</delete>

14、无用的定义要去掉(无用的定义,浪费系统资源)

 

相关文章:

后端代码规范

1、报文入参尽量避免使用实体类&#xff08;如果用实体类接受参数&#xff0c;一定要写好注解&#xff0c;具体用到了实体类的哪一个属性&#xff09; /*** * Description: 新增玉米观测记录主表信息* param param params* param return 参数* return Result 返回类型* author…...

web自动化测试:Selenium+Python基础方法封装(建议收藏)

01、目的 web自动化测试作为软件自动化测试领域中绕不过去的一个“香饽饽”&#xff0c;通常都会作为广大测试从业者的首选学习对象&#xff0c;相较于C/S架构的自动化来说&#xff0c;B/S有着其无法忽视的诸多优势&#xff0c;从行业发展趋、研发模式特点、测试工具支持&…...

while实现1到100相加求和-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)

【案例2-7】while实现1到100相加求和 一、案例描述 考核知识点 while循环语句 练习目标 掌握while循环语句。 需求分析 1-100之间的数相加求和&#xff0c;本案例通过while循环语句来实现。 案例分析 效果如图2-10所示。1-100所有数的和 具体实现步骤如下&#xff1a; 在&l…...

Thingsboard(2.4 postgresql版)数据库表结构说明

本文描述的表结构是根据thingsboard2.4&#xff08;postgresql版&#xff09;数据库中整理出来的&#xff0c;不一定完整&#xff0c;后续有新的发现再补充文档。 一、数据库E-R关系 Thingsboard2.4社区版共22个表&#xff0c;主要包括实体信息表、关系信息表、字典表和系统配…...

IDS反病毒与APT的具体介绍

文章目录一&#xff0c;IDS1. 什么是IDS&#xff1f;2. IDS和防火墙有什么不同&#xff1f;3. IDS工作原理&#xff1f;4. IDS的主要检测方法有哪些详细说明&#xff1f;5. IDS的部署方式有哪些&#xff1f;6. IDS的签名是什么意思&#xff1f;签名过滤器有什么作用&#xff1f…...

while do..while验证用户名和密码-课后程序(JavaScript前端开发案例教程-黑马程序员编著-第2章-课后作业)

【案例2-8】while do..while验证用户名和密码 一、案例描述 考核知识点 while、do…while循环语句 练习目标 掌握while语句。do…while循环语句。 需求分析 在网站上登录时会用到表单&#xff0c;让用户属于用户名和密码&#xff0c;输入正确才可以进入&#xff0c;本案例将…...

tmux常用操作指令

创建会话tmux new -s 会话名 恢复会话tmux at -t 会话名 tmux attach -t 会话名 杀死会话tmux kill-session -t 编号 tmux kill-session -t 会话名 查询会话tmux ls tmux list-session 划分窗格划分上下两个窗格&#xff1a; tmux split-window 划分左右两个窗格&#xff1a;…...

【Linux】线程安全

线程安全&#xff1a;在多线程运行的时候&#xff0c;不论线程的调度顺序怎样&#xff0c;最终的结果都是 一样的、正确的&#xff0c;这个线程就是安全的。 保证线程安全的要求&#xff1a; 1. 对线程同步&#xff0c;保证同一时刻只有一个线程访问临界资源。 2.在多线程中使用…...

Redis-mysql 缓存实战

本文基于Springboot&#xff0c;mybatis plus&#xff0c;mysql&#xff0c;redis&#xff0c; Jedis模拟redis缓存实现 目录 1. 添加所需maven依赖 2. 设置数据库及数据表 3. 构建实体类 4. 构建工具类实现 redis 数据库连接池&#xff0c;redis 的读取&#xff0c;写入功…...

蓝桥杯:通电

蓝桥杯&#xff1a; 通电https://www.lanqiao.cn/problems/162/learning/ 目录 题目描述 输入描述 输出描述 输入输出样例 输入 输出 题目分析(最小生成树)&#xff1a; AC代码(Java) 题目描述 2015 年&#xff0c;全中国实现了户户通电。作为一名电力建设者&#xff0…...

一文搞懂 Kubernetes 的 Limits 和 Requests

当在Kubernetes中使用容器时&#xff0c;重要的是要知道所涉及的资源是什么以及如何需要它们。有些进程比其他进程需要更多的CPU或内存。有些是关键的&#xff0c;不应该被饿死。知道了这一点&#xff0c;我们应该正确配置我们的容器和Pod&#xff0c;以获得两者的最佳效果。在…...

【C++】手撕红黑树

文章目录前言一、红黑树的概念二、红黑树的节点结构三、红黑树的插入四、红黑树的调整1、叔叔存在且为红2、叔叔不存在或存在且为黑3、插入完整代码4、总结五、红黑树的验证六、红黑树的删除七、红黑树与 AVL 树的比较八、红黑树的代码实现前言 在网络上流传着这样一张图片&am…...

Java中的CAS实现原理

文章目录一、什么是CAS&#xff1f;二、JAVA中如何实现CAS操作三、CAS在JUC中的运用四、ABA问题一、什么是CAS&#xff1f; 在计算机科学中&#xff0c;比较和交换&#xff08;Conmpare And Swap&#xff09;是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行…...

什么是华为云对象存储OBS?它有什么优势?

华为对象存储OBS&#xff08;Object Storage Service&#xff09;是一种高可用、高可靠、高性能的云存储服务&#xff0c;能够为企业和个人用户提供强大的数据存储和管理功能。本文将对华为对象存储OBS的特点、优势和未来发展进行详细介绍。 一、华为对象存储OBS的特点 1.对象…...

你知道照片怎么变清晰吗?增强照片清晰度的方法

相信很多小伙伴都会有这种的经历&#xff0c;去游玩时高高兴兴的拍照留念&#xff0c;结果拍出来的照片不是很尽人意。或者是画面还没聚焦好&#xff0c;就按下快门&#xff0c;导致拍摄出来的照片变模糊了。很多小伙伴遇到这种情况都很烦恼&#xff0c;照片丢了可惜&#xff0…...

NOIP模拟赛 轰炸(bomb)

题目描述 有nnn座城市&#xff0c;城市之间建立了mmm条有向的地下通道。 你需要发起若干轮轰炸&#xff0c;每轮可以轰炸任意多的城市。但在每次轰炸城市中&#xff0c;不能同时存在两个城市i,ji,ji,j满足可以通过地下通道从城市iii到达城市jjj。你需要求出最少需要多少轮可以…...

Linux系统之安装PHP环境

Linux系统之安装PHP环境 一、PHP介绍1.PHP简介2.PHP优势3.php7版本特点二、本地环境介绍1.环境规划2.检查操作系统版本3.检查当前yum仓库三、安装PHP5.4版本1.查看可安装php版本2.使用yum安装php3.安装httpd服务4.关闭selinux和设置防火墙5.编辑index.php测试文件6.测试php环境…...

MySQL8的安装教程

MySQL8的安装教程 1.安装包的下载 如果不想去官网下载的话可以去百度网盘进行下载。 MySQL :: Download MySQL Community Server mysql-8.0.28-winx64.zip_免费高速下载|百度网盘-分享无限制 (baidu.com) 提取码&#xff1a;0001 2.解压 3.创建一个my.ini的文件 最好是创建…...

日入500+的程序员都在用的“接私活”平台

网上总说程序员的薪资很高&#xff0c;这我可就不同意了&#xff1a; 程序员的薪资哪里是很高&#xff0c;而是非常高&#xff01;而会接私活的程序员更是能拿到更高的收入&#xff01;作为一个程序员&#xff0c;这些接私活的网站一定要收藏起来&#xff0c;让你在“八小时外…...

MySQL表设计思路(一对多、多对多...)

要开始单独负责需求了&#xff0c;捋一捋表设计的思路。 文章目录一、MySQL中的数据类型二、一对一的关系设计二、一对多的关系设计三、多对多的关系设计四、经验总结一、MySQL中的数据类型 字符串类型 varchar&#xff1a;即variable char &#xff0c;可边长度的字符串&#…...

Go语言构建高效命令行工具集:从设计到工程化实践

1. 项目概述&#xff1a;一个“好用的”开源工具集最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的仓库&#xff0c;叫ImGoodBai/goodable。光看这个名字&#xff0c;就透着一股子“实用主义”的气息——“好用的”。作为一名常年混迹于开源社区&#xff0c;喜欢折腾各种工…...

3分钟完成Windows和Office永久激活:KMS智能激活脚本终极指南

3分钟完成Windows和Office永久激活&#xff1a;KMS智能激活脚本终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗&#xff1f;Office突然变成只读模式让你工…...

换个角度思考【牛客tracker 每日一题】

换个角度思考 时间限制&#xff1a;1秒 空间限制&#xff1a;256M 知识点&#xff1a;线段树 网页链接 牛客tracker 牛客tracker & 每日一题&#xff0c;完成每日打卡&#xff0c;即可获得牛币。获得相应数量的牛币&#xff0c;能在【牛币兑换中心】&#xff0c;换取相…...

图解人工智能(10)人工智能的发展历程

人工智能自20世纪50年代发展至今&#xff0c;经历了若干次高潮和低谷。每到陷入困境的时候&#xff0c;总有一些科学家勇敢地打破传统思想的束缚&#xff0c;创造出新理论、新方法&#xff0c;使人工智能重现生机。例如&#xff0c;在符号主义陷入危机的时候&#xff0c;费根鲍…...

Android系统开发避坑:为什么你改了config.xml,导航栏还是不显示?

Android系统导航栏显示失效的深度排查指南 当你熬夜修改了config.xml文件&#xff0c;满怀期待地刷入系统&#xff0c;却发现导航栏依然不见踪影——这种挫败感我太熟悉了。导航栏显示问题看似简单&#xff0c;实则涉及Android资源覆盖机制的复杂层级。本文将带你深入AOSP的底层…...

别再只用轮盘赌了!遗传算法选择算子实战对比:Python代码实现与性能调优心得

遗传算法选择算子深度实战&#xff1a;从轮盘赌到锦标赛的Python优化指南 在解决复杂优化问题时&#xff0c;遗传算法展现出了惊人的适应能力。但许多开发者止步于基础的轮盘赌选择&#xff08;Roulette Wheel Selection&#xff09;&#xff0c;却不知不同选择策略对算法性能的…...

【限时公开】谷歌内部未文档化Gemini JavaScript SDK隐藏能力:流式响应中断控制、上下文压缩率提升63%实测数据

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini JavaScript SDK核心能力概览 Gemini JavaScript SDK 是 Google 官方提供的轻量级客户端库&#xff0c;专为在浏览器和 Node.js 环境中无缝集成 Gemini 模型能力而设计。它抽象了底层 HTTP 请求、…...

Next.js功能开关实践:用happykit/flags实现灰度发布与A/B测试

1. 项目概述&#xff1a;为什么我们需要一个功能开关系统&#xff1f;在软件开发&#xff0c;尤其是现代Web应用和微服务架构的迭代过程中&#xff0c;我们经常面临一个经典困境&#xff1a;新功能开发完成后&#xff0c;是直接全量发布给所有用户&#xff0c;还是先小范围灰度…...

工程师实战指南:从原理到选型,全面解析电池核心技术参数与应用

1. 项目概述&#xff1a;为什么我们需要重新认识电池&#xff1f;干了三十多年电气工程&#xff0c;从数字电路、模拟信号到电源设计、通信协议和微控制器&#xff0c;我几乎把电子行业的各个角落都摸了一遍。现在我在一家叫MaxVision的公司&#xff0c;专门搞那种性能极端、皮…...

解决Claude Code频繁封号与Token不足的替代接入方案

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 解决Claude Code频繁封号与Token不足的替代接入方案 1. 场景与核心思路 对于依赖Claude Code进行编程辅助的开发者而言&#xff0…...