【实战项目总结】
文章平均质量分 71
项目系列
我一直在流浪
这个作者很懒,什么都没留下…
展开
-
实战 - Restful APi 格式规范
HTTP头里面的方法决定了动作后,后端实现也应该严格根据动作来,比如,GET请求不应该对数据造成任何更改,如此,我们对权限控制便非常方便,例如,如果是访客,我们可以只开放GET方法,而对于ADMIN,我们可以开放GET,POST,DELETE等方法。类似于面向对象以对象为中心,RESTful推崇以资源为中心,说不上绝对好,但的确会引导大家考虑资源本身,关注内聚性,关注权限,关注资源间关联。HTTP协议里面规定的东西很多,例如,缓存,压缩,代理,加密,穿透,等等,都已经让HTTP帮忙完成了,给很多实现减负。原创 2023-09-06 16:26:10 · 603 阅读 · 0 评论 -
实战 - 利用 ThreadLocal 线程局部变量实现数据缓存
BranchContext 类定义了一个静态的变量,用于存储当前线程的/*** 设置 assetBranchCache} /*** 获取 assetBranchCache} /*** 清除 assetBranchCache 信息} }为了在项目的各个地方获取ThreadLocal中缓存的资产组数据,可以定义一个线程上下文资产组数据持有者类 SaasThreadContextDataHolderBranch。原创 2023-08-03 22:34:25 · 1352 阅读 · 0 评论 -
实战 - 利用ThreadLocal上下文解决查询性能问题
}利用ThreadLocal上下文存储需要缓存的数据 List} }} }} }} }进行grpc接口调用获取 List 信息/*** 获取授权信息* @return 授权信息/*** 获取授权信息* @return 授权信息。原创 2023-07-20 17:38:13 · 388 阅读 · 0 评论 -
实战 - 将接口权限按照菜单栏配置展示
【代码】实战 - 解析yml文件 (树形结构)原创 2023-01-03 11:07:36 · 311 阅读 · 0 评论 -
实战 - 不要在for循环中调用数据库
循环调用数据库会导致性能很差,所以千万不要循环调用数据库,对循环调用数据库的改进方法,就是把数据全部查出来,然后组装或者批量查询。存在的问题:for循环中存在批量查询数据库的情况,需要批量查询数据库处理掉2. 第一次改进后存在的问题:可以不要在for循环中组装map,而是放在for循环外组装好,在for循环中调用3. 第二次改进后4. 测试根据部门层级路径获取获取部门id接口比如根据 “部门/研发部/SIR” 获取SIR的部门id........................原创 2022-06-14 13:07:12 · 8113 阅读 · 0 评论 -
实战 - 从request请求头中获取远程客户端真实的IP
如果没有XFF或者另外一种相似的技术,所有通过代理服务器的连接只会显示代理服务器的IP地址(而非连接发起的原始IP地址), 这样的代理服务器实际上充当了匿名服务提供者的角色, 如果连接的原始IP地址不可得,恶意访问的检测与预防的难度将大大增加。XFF的有效性依赖于代理服务器提供的连接原始IP地址的真实性,因此, XFF的有效使用应该保证代理服务器是可信的, 比如可以通过建立可信服务器白名单的方式。)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。原创 2022-10-27 07:36:00 · 1041 阅读 · 0 评论 -
实战 - 将 List<Object> 和 List<?> 转为 List<实体类>
但是,为了保证我们要求的属性,第三方接口都给我们响应过来了,所以需要封装返回给前端的响应数据,这样即使某个字段第三方接口没有给我们,这个字段也不会不存在,而是为null。此时就可以接收到第三方接口返回的响应数据了,因为Object可以接收任意类型的数据,如果没有其他要求,那么就可以直接响应给前端了。可以看到,当传入参数的类型不同时,entities代表的对象也不同,一个entities可以接收不同类型的对象;项目背景:昨天在做一个需求,调用其第三方平台接口获取数据并展示,根据传入的类型展示不同的数据列表;原创 2022-10-24 21:10:20 · 5996 阅读 · 0 评论 -
实战 - AES对称加密算法加密和解密设备联动码
【代码】项目 - AES对称算法加密和解密。原创 2022-10-14 12:21:24 · 605 阅读 · 0 评论 -
实战 - 多租户用户体系数据库表结构设计
多租户用户体系数据库表结构设计。原创 2022-09-06 10:22:34 · 5414 阅读 · 2 评论 -
实战 - 不要在for循环里进行List集合元素的remove/add操作
foreach循环里进行元素的remove操作存在的问题:执行结果:执行结果:错误使用案例:执行结果:报错这是《阿里巴巴编码规范》中的一条:不要在foreach循环里进行元素的remove/add操作,使用迭代器的删除操作是不会有问题、能成功删除的;而使用foreach循环进行删除则会抛出ConcurrentModificationException异常用iterator遍历list的时候,如果想要删除,那么必须用iterator的remove方法来进行删除,也不可以直接在list中删除。具体原理原创 2022-06-15 13:01:02 · 998 阅读 · 0 评论 -
日志 - 02 Redis消息队列+工作线程取出用户操作日志并入库
@ConditionalOnProperty(prefix = “spring.redis”, value = { “host”, “password” }) 注解表示只有application.properties中配置了或者原创 2022-06-10 23:49:51 · 379 阅读 · 0 评论 -
日志 - 01 Spring AOP+自定义注解记录用户操作日志
2. 自定义注解 @OperateLog3. 日志打印 AOP 切面4. 工具类 OperationLogUtil5. 打印日志 IOperationLogService6. 配置类 OprLogRedisAutoConfiguration7. 配置类 OperationLogAutoConfiguration8. spring.factories配置如果想将日志报存,可以使用ORM框架保存到数据库表中:........................原创 2022-06-08 13:17:43 · 615 阅读 · 0 评论 -
日志 - Spring AOP和注解记录用户操作日志
2. 操作日志类3. 工具类HttpContextUtils4. 工具类IPUtils5. Spring AOP 切面6. 使用注解@MyLog7. 断点调试执行顺序:原创 2022-06-08 10:08:23 · 280 阅读 · 0 评论 -
实战 - MyBatis Plus的saveBatch()方法如何指定事务管理器?
1. 项目背景使用MyBatis Plus的saveBatch()方法执行批量保存时,报错:No qualifying bean of type ‘org.springframework.transaction.TransactionManager’ available: expected single matching bean but found 6: transactionManager,metadataMongoTransactionManager,tsMongoTransactionManag原创 2022-05-24 12:34:57 · 6847 阅读 · 5 评论 -
实战 - 迎学后台管理系统开发
文章目录1. 数据库表结构2. 登陆功能3. 首页导航栏展示4. 菜单权限管理1. 获取所有菜单权限数据2. 获取菜单权限树3. 新增菜单权限树5. 角色管理1. 分页获取角色数据2. 新增角色3. 多条件查询角色数据6. 部门管理1. 获取所有部门数据2. 获取部门树3. 新增部门7. 用户管理1. 分页查询用户数据2. 新增用户3. 多条件查询用户列表4. 赋予用户角色5. jwt 自动刷新6. 编辑用户7. 删除用户8. 菜单权限管理1. 编辑菜单权限2. 删除菜单权限1. 数据库表结构通常来说有原创 2022-05-15 23:41:48 · 1366 阅读 · 0 评论 -
实战 - 项目中的异常处理方式
文章目录1. 异常链2. catch+throw使用示例1. 自定义异常2. Service层抛出IncidentException3. Controller层继续抛出IncidentException4. 统一异常处理3. catch + throw使用示例1. 自定义异常QueryAlertException2. Service层抛出IOException3. Controller层捕获IOException4. 统一异常处理4. catch+throw使用示例1. 自定义异常2. 异常状态码3. Se原创 2022-05-06 01:13:28 · 2292 阅读 · 0 评论 -
实战 - 利用注解和Spring Aop实现Redis分布式锁
文章目录1. RedisLockDto2. RedisLockService3. RedisLockServiceImpl3.1 获取锁的key3.2 获取锁的值lockValue3.3 分布式锁异常RedisLockException3.4 获取锁3.5 锁续期3.6 释放锁4. 定义注解@RedisLock5. 定义注解@BusinessId6. 读取目标方法上加的注解并加锁7. Spring boot redis分布式锁自动化配置8. 测试9. 测试使用1. RedisLockDtoRedisLo原创 2022-05-01 15:22:53 · 1895 阅读 · 1 评论 -
ElasticSearch - 根据时间区间查询
文章目录1. 需求分析2. 时间区间枚举类TimeScopeEnum3. 前端请求Qo类4. 时间处理的工具类5. 执行查询1. 需求分析项目需求:根据时间区间查询elasticsearch中的数据查询最近7天的数据,前端请求路径:https://10.87.67.226/chahua/api/v1/list?endTime=1651288728694&startTime=1650683928694&timeScope=last7d查询最近30天的数据,前端请求路径:endTim原创 2022-04-30 11:42:02 · 6818 阅读 · 1 评论 -
实战 - 迎学后台管理系统~脚手架搭建
文章目录1. 项目地址2. 如何启动本项目3. 项目脚手架搭建01. 创建项目02. 数据库设计和配置03. 日志配置04. 逆向生成代码配置MyBatis05. 集成swagger206. 集成redis07. 封装统一的相应 code 工具类08. 前后端分离数据封装 DataResult09. 全局异常统一处理10. Hibernate Validator 详解11. jwt12. 用户认证签发 token13. mybatis使用 pagehelper 实现分页封装14. 自定义AccessCont原创 2022-04-06 23:43:06 · 2434 阅读 · 0 评论 -
文件 - 07 删除文件: 根据fileIds批量删除文件及文件信息
系列文章:文件 - 01 上传附件到服务器并保存信息到MySQL文件 - 02 上传临时文件到服务器文件 - 03 根据文件id获取下载链接文件 - 04 根据文件下载链接下载文件文件 - 05 根据文件Id下载文件文件 - 06 根据文件id/图片id回显给前端附件表:CREATE TABLE `t_upload_file` ( `id` int(11) NOT NULL AUTO_INCREMENT, `fileId` varchar(50) NOT NULL COMMENT '原创 2022-07-25 21:08:49 · 366 阅读 · 0 评论 -
实战 - 为什么需要做统一异常处理?
① 业务类背景新增工作组分类时,工作组名称重复,抛出异常,但是没有进行统一异常处理:@Overridepublic void addGroupCategory(GroupCategory groupCategory) { // 校验工作组分类是否重复,根据名称查询数据库 int count = groupCategoryDao.findByName(groupCategory.getName()); if(count>0){ throw new Grou原创 2022-04-06 14:39:16 · 678 阅读 · 0 评论 -
文件 - 06 回显图片: 根据文件id[图片id]回显给前端
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kI4KabeW-1658748419207)(img/image-20220725170758716.png)]原创 2022-07-25 19:29:01 · 767 阅读 · 0 评论 -
实战 - 新增和更新数据时,数据库字段不能重复
需求:新增和更新时,工作组分类名称不能重复新增时不能重复@Overridepublic void addGroupCategory(GroupCategory groupCategory) { // 校验工作组分类是否重复,根据名称查询数据库 GroupCategory category = groupCategoryDao.findByName(groupCategory.getName()); if(!Objects.isNull(category)){ t原创 2022-04-06 11:20:39 · 1844 阅读 · 0 评论 -
文件 - 05 下载文件:根据文件Id下载文件
代码】文件-05根据文件Id下载文件。原创 2022-07-25 19:10:40 · 716 阅读 · 0 评论 -
实战 - 层级只有2层的树结构设计(组分类,组)
文章目录1. 需求分析2. 数据库表结构设计3. 工作组分类实体类4. 工作组实体类5. 查询列表1. 需求分析根据需求:层级只有2层,第一层为工作组分类,第二层为工作组,所以并不是树形结构① 工作组分类的增删改查② 工作组的增删改查③ 查询所有的工作组分类和工作组分类下的工作组2. 数据库表结构设计设计两张表,一张表保存工作组分类,第二张表保存工作组,其中工作组表中需要保存工作组分类的idcreate table t_group_category ( `id` int(20) NOT原创 2022-03-31 14:46:42 · 1560 阅读 · 0 评论 -
文件 - 04 下载文件: 根据文件下载链接下载文件
代码】文件-04根据文件下载链接下载文件。原创 2022-07-25 17:32:13 · 961 阅读 · 0 评论 -
文件 - 03 下载文件:根据文件id获取下载链接
代码】文件-03根据文件id获取下载链接。原创 2022-07-25 16:49:25 · 897 阅读 · 0 评论 -
实战 - 如何在本地测试接口?
① 我们可以只使用服务器上安装的服务器。比如MySQL,Redis,ElasticSearch等服务,因此在项目中配置时,配置服务器的地址和密码:spring: redis: host: 10.87.67.226 database: 0 port: 6379 password: a40c1027e4a023e2 datasource: driver-class-name: org.mariadb.jdbc.Driver url: jdbc:maria原创 2022-03-28 10:55:09 · 5799 阅读 · 0 评论 -
实战 - 不要在for循环中调用数据库
循环调用数据库会导致性能很差,所以千万不要循环调用数据库,对循环调用数据库的改进方法,就是把数据全部查出来,然后组装或者批量查询。存在的问题:for循环中存在批量查询数据库的情况,需要批量查询数据库处理掉2. 第一次改进后存在的问题:可以不要在for循环中组装map,而是放在for循环外组装好,在for循环中调用3. 第二次改进后4. 测试根据部门层级路径获取获取部门id接口比如根据 “部门/研发部/SIR” 获取SIR的部门id........................原创 2022-06-14 13:07:12 · 8113 阅读 · 0 评论 -
文件 - 02 上传文件:上传临时文件到服务器
具体文件上传的思路可参考文章[[文件-01上传附件到服务器并保存信息到MySQL],除了过期时间改变了,其他不变(https。原创 2022-07-25 15:32:12 · 785 阅读 · 0 评论 -
实战 - 数据库表结构设计
文章目录1. 用户表2. 角色表3. 用户角色关联表4. 菜单权限表5. 角色菜单权限表6. 组织机构表1. 用户表use company_frame;DROP TABLE IF EXISTS `sys_user`;CREATE TABLE `sys_user` ( `id` varchar(64) NOT NULL COMMENT '用户id', `username` varchar(50) NOT NULL COMMENT '账户名称', `salt` varchar(20) DEF原创 2022-03-21 16:12:31 · 1909 阅读 · 0 评论 -
文件 - 01 上传文件:上传附件到服务器并保存信息到MySQL
Controller层接口逻辑:Controller层接口包含两层逻辑:1、上传附件;2、如果上传附件成功,触发一下清理过期文件的任务,如果上传附件发生异常,则不会被调用;上传附件接口逻辑:1. 读取配置文件属性配置文件中配置文件上传相关信息:application-fileupload.yml2. 校验文件和目录2.1 检查文件夹总大小是否超过限制(8G)获取服务器存储文件夹总大小将服务器存储文件夹总大小单位转为GB;如果存储文件夹总大小大于8GB,超出限制,抛出异常;1、获取存储原创 2022-07-08 01:10:57 · 2590 阅读 · 0 评论 -
ElasticSearch - 如何根据最近30天、最近14天、最近7天、最近24小时、自定义时间范围查询MySQL中的数据?
*** 时间范围枚举:根据最近30天、最近14天、最近7天、最近24小时、自定义时间范围查询/*** 最近30天* 最近14天* 最近7天* 最近24小时/*** 前端传入的参数/*** 对应的天数/*** 根据前端传入参数名称获取TimeScopeEnum* @param name 前端传入参数名称} }/*** 根据自定义时间段查询}原创 2022-07-25 15:03:11 · 1649 阅读 · 0 评论 -
实战 - 文件上传功能:校验文件类型,文件大小,获取文件真实类型
① 定义允许上传的附件类型:attachment: file: maxSize: 10 types: jpeg: FFD8FF jpg: FFD8FF bmp: 424D png: 89504E47 rtf: 7B5C727466 txt: 75736167 pdf: 255044462D312E doc: D0CF11E0 docx: 504B030414② 读取appli原创 2021-11-24 21:33:58 · 11742 阅读 · 1 评论 -
实战 - 谷粒商城项目:高级下篇Second
1. 商城业务 - 用户注册和账号密码登录1.1 整合阿里云短信服务发送验证码① 在gulimall-third-party服务中导入坐标依赖:<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId></dependency>② 发送短信接口:@ConfigurationPropertie原创 2021-11-20 15:38:12 · 930 阅读 · 1 评论 -
文件 - GridfsTemplate实现文件上传和下载
文章目录1. 校验文件类型和文件大小2. 文件上传3. 文件下载GitHub本项目的完整地址:ghh1221/FileUpload_GridFsTepmplate1. 校验文件类型和文件大小① 配置允许上传的单个文件的大小:# 允许上传的单个文件大小最大值file.maxSize=10# 单个文件大小spring.servlet.multipart.max-file-size=10MB# 总文件的上传大小spring.servlet.multipart.max-request-size=原创 2021-11-27 16:30:42 · 1321 阅读 · 0 评论 -
实战 - 谷粒商城项目:高级下篇Second
1. 商城业务 - 用户注册和账号密码登录1.1 整合阿里云短信服务发送验证码① 在gulimall-third-party服务中导入坐标依赖:<dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId></dependency>② 发送短信接口:@ConfigurationPropertie原创 2021-11-20 15:38:12 · 930 阅读 · 1 评论 -
实战 - 谷粒商城项目:高级上篇Second
1. SpringBoot整合ElasticSearch① 创建gulimall-search服务,修改pom文件的依赖版本,导入es依赖<dependency> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall-common</artifactId> <version>0.0.1-SNAPSHOT</version>原创 2021-11-05 23:08:09 · 1390 阅读 · 1 评论 -
文件 - 下载resource目录下的excel模板文件
点击“下载模板文件”,完成excel模板文件的下载功能:① 将excel模板文件放在Idea中项目的resource目录下:② 代码:@Slf4j@RestControllerpublic class TestController { @Autowired private ResourceLoader resourceLoader; /** * 实现方式1 * @param response * @param request原创 2022-03-30 09:15:53 · 1926 阅读 · 1 评论 -
实战 - 谷粒商城项目:高级上篇Second
1. SpringBoot整合ElasticSearch① 创建gulimall-search服务,修改pom文件的依赖版本,导入es依赖<dependency> <groupId>com.atguigu.gulimall</groupId> <artifactId>gulimall-common</artifactId> <version>0.0.1-SNAPSHOT</version>原创 2021-11-05 23:08:09 · 1390 阅读 · 1 评论