广行天下车GO项目经验

1.如果有对象返回已有对象,没有创建新对象

 QuesionnairResult result = this.get(id).map(QuesionnairMapper.INSTANCE::toResult).orElseGet(QuesionnairResult::new);

2.类加上 @Transactional(readOnly = true)只读数据
创建更新删除方法加上 表示异常就回滚

  @Transactional(rollbackFor = Exception.class) 

3.流式计算的坑,属性名需要大小(注解是mybatis的名字)不然得不到属性

    @Column(name = "q_title")private String QTitle;weekendCriteria.andEqualTo(Quesionnair::getQTitle, "用车");

4.命名规范不要 一个字母加一个单词,这样lombok生成错误 qTitle(x) quesTitle(对)

5.代理生成的代码需要清除后运行,特别是实体类名字更改,导致其他实体类名字也更改,转换实体类生成的代码出错

   git需要打钩再把时间提交上去

6.swagger访问页面是http://localhost:8080//swagger-ui/index.html#/

7.判断字符串先判断null,后判断空

 if ( param.getTitle() != null && !(param.getTitle()).equals("") ) {

8.springmvc识别不出date对象,使用字符串最方便

 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private String createTime; //而且mybatis支持

9.jrebel 注解和静态页面刷新不了需要重启

10.使用雪花策略,比自增长好,可以解决分布式自增长导致id重复的问题

public class BaseAutoIdEntity extends BaseEntity {@Id@KeySql(genId = CustomerIdGenerator.class)private Long id;public BaseAutoIdEntity(Long id) {this.id = id;}public Long getId() {return this.id;}public void setId(final Long id) {this.id = id;}public boolean equals(final Object o) {if (o == this) {return true;} else if (!(o instanceof BaseAutoIdEntity)) {return false;} else {BaseAutoIdEntity other = (BaseAutoIdEntity)o;if (!other.canEqual(this)) {return false;} else {Object this$id = this.getId();Object other$id = other.getId();if (this$id == null) {if (other$id != null) {return false;}} else if (!this$id.equals(other$id)) {return false;}return true;}}}protected boolean canEqual(final Object other) {return other instanceof BaseAutoIdEntity;}public int hashCode() {int PRIME = true;int result = 1;Object $id = this.getId();int result = result * 59 + ($id == null ? 43 : $id.hashCode());return result;}public String toString() {return "BaseAutoIdEntity(id=" + this.getId() + ")";}public BaseAutoIdEntity() {}
}

//继承即可,不能写id字段,因为父类已经指定了

11.前端拉取项目需要用 全局安装git,package-lock.json要删除不然安装不了

12.注解可能导错包 导致传不了数据

@RequestBody

13.以前数据库自增长id想返回 需要写配置文件和mapper,雪花id恰好解决问题 可自己手动生成根据表和列名
//雪花自增长

CustomerIdGenerator customerIdGenerator = new CustomerIdGenerator();
Long aLong = customerIdGenerator.genId("q_useranswer", "id");
qUseranswerSaveParam.setId(aLong);

//mysql自带的自增长

<insert id="insertAdvantage" parameterType="SysAdvantage" useGeneratedKeys="true" keyProperty="advantageId">insert into sys_advantage(<if test="advantageId != null and advantageId != 0">advantage_id,</if><if test="advantageName != null and advantageName != ''">advantage_name,</if><if test="advantageSort != null and advantageSort != ''">advantage_sort,</if><if test="status != null and status != ''">status,</if><if test="remark != null and remark != ''">remark,</if><if test="createBy != null and createBy != ''">create_by,</if>create_time)values(<if test="advantageId != null and advantageId != 0">#{advantageId},</if><if test="advantageName != null and advantageName != ''">#{advantageName},</if><if test="advantageSort != null and advantageSort != ''">#{advantageSort},</if><if test="status != null and status != ''">#{status},</if><if test="remark != null and remark != ''">#{remark},</if><if test="createBy != null and createBy != ''">#{createBy},</if>sysdate())</insert>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 全局参数 --><settings><!-- 使全局的映射器启用或禁用缓存 --><setting name="cacheEnabled"             value="true"   /><!-- 允许JDBC 支持自动生成主键 --><setting name="useGeneratedKeys"         value="true"   /><!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 --><setting name="defaultExecutorType"      value="SIMPLE" /><!-- 指定 MyBatis 所用日志的具体实现 --><setting name="logImpl"                  value="SLF4J"  /><!-- 使用驼峰命名法转换字段 --><!-- <setting name="mapUnderscoreToCamelCase" value="true"/> --></settings></configuration>

14.动态sql判断int是否为空

<!-- 判断 int 类型参数是否为空 -->
<if test="param != null and param != 0"><!-- 如果参数不为空,则执行相应的 SQL 语句 -->#{param}
</if>

15.加密方式

   1.对称加密 用相同的秘钥加密解密 DES AES2.非对称加密 使用公钥加密 私钥解密 3.散列加密 MD5 SHA 不可逆 4.消息认证码 MAC 秘钥和消息生成固定长度的字符串,验证信息完整性和真实性 HMAC5.数字签名 私钥加密 公钥解密, 也属于一种特殊的对称加密
//注意,长度必须是16的倍数,使用hash不影响原来位数,和hash配合使用
//我使用了AES(DES的升级)分块加密
//使用MD5和AES混合加密
public class AESUtil {private static final String ALGORITHM = "AES";public static String encrypt(String data,String md5Key) throws Exception {SecretKeySpec keySpec = new SecretKeySpec(md5Key.getBytes(), ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, keySpec);byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encryptedBytes);}public static String decrypt(String encryptedData,String md5Key) throws Exception {SecretKeySpec keySpec = new SecretKeySpec(md5Key.getBytes(), ALGORITHM);Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, keySpec);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));return new String(decryptedBytes, StandardCharsets.UTF_8);}public static void main(String[] args) throws Exception {String originalData = "Hello, World!xxxxxx";System.out.println("Original Data: " + originalData);String s = MD5Utils.md5Hex(originalData.getBytes());String s1 = MD5Utils.md5Hex(s.getBytes());String encryptedData = AESUtil.encrypt(originalData,s1);System.out.println("Encrypted Data: " + encryptedData);String decryptedData = AESUtil.decrypt(encryptedData,s1);System.out.println("Decrypted Data: " + decryptedData);}
}
public class AESKeyGenerator {public static String generateAESKeyFromUUID() {UUID uuid = UUID.randomUUID();ByteBuffer bb = ByteBuffer.wrap(new byte[16]);bb.putLong(uuid.getMostSignificantBits());bb.putLong(uuid.getLeastSignificantBits());byte[] keyBytes = bb.array();SecretKeySpec aes = new SecretKeySpec(keyBytes, "AES");return bytesToHex(aes.getEncoded());}public static void main(String[] args) {String s = AESKeyGenerator.generateAESKeyFromUUID();System.out.println(s);}private static String bytesToHex(byte[] bytes) {StringBuilder result = new StringBuilder();for (byte b : bytes) {result.append(String.format("%02X", b));}return result.toString();}
}

16.对数据库数据进行加密,废掉了mysql的模糊查询功能? 敏感的加密数据需要查询(特殊情况可能需要使用触发器解决,最后使用了加密较为隐私的手机号)

17.git查询代码量,直接在gitlab查看变化数量,git的指定了但是不能查(查出了全部代码)

18.前端想要post发送请求,后端请求题接收不到get的参数,用rest风格可以

19.跨域,访问任何路径都会200,需要debug

20.以字段名perPage 为准,注解名字无效的

public class PageableParam {("页码,不传是默认为1")private Integer page = 1;("每页数量,不传是默认为10")("per_page")private Integer perPage = 10;
  1. pom文件设置仓库(实用)
<repositories><repository><id>aliyunmaven</id><name>Aliyun Maven Repository</name><url>https://maven.aliyun.com/repository/public</url></repository>
</repositories>

22.给前端最好提供内网穿透效率比较高(免费内网穿透的网站)
//网上有大量教程
https://ngrok.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/241711.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乐才无代码开发:连接CRM提升电商与营销系统

无缝API连接的商业价值 在电子商务生态系统中&#xff0c;无缝的系统连接是保证业务流程顺畅、提高客户满意度的关键。乐才API提供了一种无需编码的集成方法&#xff0c;使得企业能够在不具备深度技术能力的情况下&#xff0c;实现电商平台与各种服务和工具的紧密连接。这种解…

【Spring实战】04 Lombok集成及常用注解

文章目录 0. 集成1. Data2. Getter 和 Setter3. NoArgsConstructor&#xff0c;AllArgsConstructor和RequiredArgsConstructor4. ToString5. EqualsAndHashCode6. NonNull7. Builder总结 Lombok 是一款 Java 开发的工具&#xff0c;它通过注解的方式简化了 Java 代码的编写&…

建立百科词条能带给企业什么营销价值?

也许很多网友都发现了&#xff0c;在网上查资料&#xff0c;百科词条往往是优先展示的。一方面因为百科是搜索引擎自身的平台&#xff0c;另一方面就是因为百科信息权威&#xff0c;网友认可度高。所以企业开展网络营销&#xff0c;百科营销是一块重要阵地。 也有的企业认为百科…

go从0到1项目实战体系二十:单元测试

initRouter\initRouter.go package initRouter import ("github.com/gin-gonic/gin""net/http" )func SetupRouter() *gin.Engine {router : gin.Default()// 添加 Get 请求路由router.GET("/", func(context *gin.Context) {context.String(ht…

Quartz.NET 事件监听器

1、调度器监听器 调度器本身收到的一些事件通知&#xff0c;接口ISchedulerListener&#xff0c;如作业的添加、删除、停止、挂起等事件通知&#xff0c;调度器的启动、关闭、出错等事件通知&#xff0c;触发器的暂停、挂起等事件通知&#xff0c;接口部分定义如下&#xff1a…

Linux账号管理与ACL权限设定

目录 账号/etc/passwd/etc/shadow 群组/etc/groupgroups 命令newgrp 命令 /etc/gshadow账号管理useradd 命令login.defs passwd 命令chage 命令usermod 命令userdel 命令 普通用户账号命令SUIDid 命令finger 命令chfn 命令chsh 命令 新增或移除群组groupadd 命令groupmod 命令g…

算数平均数、调和平均数、几何平均数的计算方法与应用场合

一 定义 1、算数平均数&#xff1a;又称均值&#xff0c;是统计学中最基本&#xff0c;最常用的一种平均指标&#xff0c;分为简单算术平均数、加权算术平均数。 2、调和平均数&#xff1a;又称倒数平均数&#xff0c;是总体各统计变量倒数的算数平均数的倒数。分为数学调和平…

[架构之路-265]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 如何做好详细设计

目录 一、详细设计概述 1.1 什么是详细设计 1.2 软件概要设计、软件架构、软件详细设计比较 二、软件详细设计说明书 2.1 概述 2.2 撰写步骤 2.3 主要内容 三、详细设计详解 3.1 引言 3.2 系统架构设计 3.3 模块设计 3.3.1 模块描述 3.3.2 模块间接口设计与UML图 …

深度学习中的池化

1 深度学习池化概述 1.1 什么是池化 池化层是卷积神经网络中常用的一个组件&#xff0c;池化层经常用在卷积层后边&#xff0c;通过池化来降低卷积层输出的特征向量&#xff0c;避免出现过拟合的情况。池化的基本思想就是对不同位置的特征进行聚合统计。池化层主要是模仿人的…

ubuntu22.04+ROS2推荐匹配的gazebo版本

放大以后看到&#xff1a; 可以看到ros2推荐使用版本是humble-----匹配的是Ubuntu22.04LTS -------匹配gazebo Harmonic

二叉树进阶题目(超详解)

文章目录 前言根据二叉树创建字符串题目分析写代码 二叉树的层序遍历题目分析 写代码二叉树的层序遍历II题目分析写代码 二叉树的最近公共祖先题目分析写代码时间复杂度 优化思路优化的代码 二叉搜索树与双向链表题目分析写代码 从前序与中序遍历序列构造二叉树题目分析写代码从…

每日一题——LeetCode860

个人方法&#xff1a; 用change数组保存我们拥有的零钱的数量&#xff0c;change数组只有change[5]、change[10]、change[20]是有效的&#xff0c;其值代表了不同面值的零钱拥有多少张 顾客付了多少钱&#xff0c;先把钱存入零钱数组&#xff0c;然后计算需要找零的金额&…

【计数DP】牛客小白月赛19

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先做法一定是计数 dp 然后状态设计&#xff0c;先设 dp[i] 然后看影响决策的因素&#xff1a;两边的火焰情况&#xff0c;那就 dp[i][0/1][0/1]表示 前 i 个&#xff0c;该位有无火焰&#xff0c;该位右边有无火焰的方案数…

【SpringBoot】之Security进阶使用(登陆授权)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringBoot开发之Security系列》。&#x1f3af…

智能优化算法应用:基于天鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于天鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于天鹰算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.天鹰算法4.实验参数设定5.算法结果6.参考文献7.MA…

八股文打卡day8——计算机网络(8)

面试题&#xff1a;什么是强缓存和协商缓存&#xff1f; 我的回答&#xff1a; 强缓存&#xff1a;浏览器不需要发送请求到服务器&#xff0c;直接从浏览器缓存中获取数据。浏览器不需要和服务器进行交互就可以获取数据&#xff0c;这样极大提高了页面访问速度。 协商缓存&am…

Vue2和Vue3组件间通信方式汇总(3)------$bus

组件间通信方式是前端必不可少的知识点&#xff0c;前端开发经常会遇到组件间通信的情况&#xff0c;而且也是前端开发面试常问的知识点之一。接下来开始组件间通信方式第三弹------$bus,并讲讲分别在Vue2、Vue3中的表现。 Vue2Vue3组件间通信方式汇总&#xff08;1&#xff09…

动态代理jdk的Proxy与Spring的CGlib

动态代理jdk的Proxy与Spring的CGlib 文章目录 动态代理jdk的Proxy与Spring的CGlib1. 为什么要使用动态代理&#xff1f;2. JDK Proxy 动态代理面向接口的动态代理3. CGlib动态代理4. 两个动态代理的区别 1. 为什么要使用动态代理&#xff1f; 动态代理&#xff1a;在不改变原有…

如何通过UMC配置外围组件

随着云计算技术的不断发展&#xff0c;在信息化建设模式上云是大势所趋。对于企业而言&#xff0c;已建立的内部集成并不能支撑其快速搭建开发环境、快速部署集群服务&#xff0c;并且动态水平扩展对多组织情况许可费用高昂、没有敏捷快速迭代机制&#xff0c;导致开发完毕就落…

增量式旋转编码器在STM32平台上的应用

背景 旋钮是仪器仪表上一种常见的输入设备&#xff0c;它的内部是一个旋转编码器&#xff0c;知乎上的这篇科普文章对其工作原理做了深入浅出的介绍。 我们公司的功率分析仪的前面板也用到了该类设备&#xff0c;最近前面板的MCU从MSP430切换成了STM32&#xff0c;因此我要将…