3 Star 20 Fork 11

sprouting / 花蕾-server

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
README.md 17.09 KB
一键复制 编辑 原始数据 按行查看 历史
sprouting 提交于 2023-12-22 15:14 . 文档

花蕾

项目前端:https://gitee.com/sprouting/bud-web 项目后端:https://gitee.com/sprouting/bud-server

1、综述

一个综合了非常多系统的开源工具,比如权限、人脸识别、opencv、mq、es,这个系统的目标是建立一个最初始的模块化应用,通过配置,可以随时应用到自己的系统中,不同组件提供多个接入方式。注意,本项目是基于单机应用,不完全考虑分布式的问题,系统的目标是轻量级快速接入的开发组件。本来想做成一个一个的模块,要使用redis,就开启redis模块,后面感觉没必要,其实都是分层,搞简单点。

注意事项

原本设计之初只是放一些简单的功能,但一段时间对onnx模型非常感兴趣,加了不少了onnx模型内容,导致现在运行需要消耗非常大的内存,截止人脸模块识别的加入,单次启动内存已经在1G左右,所以运行本项目需要注意下这一块内容。

设计目标

2023年3月10日17:54:28

简单点说,这个项目力争在单机单节点下,尽量少的依赖完成各种任务,其中也包含了各种写法,比如kafka的消息发送,整合了所有发送类型,方便以后随时可以调用复制就可以使用。

比如本地视频播放,可能会直接让springboot就实现了推流,不使用nginx。

本项目的有两个目标

  • 各种好玩的、有意思的项目进行整合,可以方便以后随时进行复制使用,也类似做一个后台管理项目。
  • 尽量少的依赖

约定

所有的请求基本都是以 form-data 的方式提交,即form表单的形式提交。

2、已实现功能截图

onnx 分类检测

图像分类检测

入口 OnnxController

image-20231028231123559

image-20231028231304475

image-20231028232303494

物体识别,支持中文

image-20231221144339940

image-20231129214334426

视频分类检测

image-20230523134303174

image-20230523134303174

头盔检测

image-20231028230848882

image-20231028230937778

头盔检测支持中文

image-20231221144358170

车牌识别

image-20231028231416653

本地离线人脸检测

返回的结果比较大,只能截个图,

image-20231221143336678

返回的结果有相似度,人脸年龄、性别,坐标位置,还有识别到的人脸截图base64的图片信息。

image-20231221143444733

人脸关键点

image-20231221191703856

年龄和性别

image-20231221191740601

image-20231221191850745

image-20231221191936198

数据库文档导出

word文档

效果如下。

image-20231116113126486

image-20231116113210099

html文档

image-20231116113625088

image-20231116113638066

3、已完成功能

3.1 功能项说明

1、单机幂等性验证逻辑 @IdempotentSingle 注解 和 IdempotentSingleAop

2、自定义 validation 注解, @CheckNotNullValidator

3、项目启动打印版本号和编译时间 BeanPostConfig

4、字符画,项目启动的字符画,直接在 banner.txt 文件修改即可。其他参考 2.2.1

5、git代码有些不提交,编辑这个文件即可 .gitignore

6、开启跨域配置,CorsConfig ,启用在配置文件 bud.customize.cors.enabled

7、增加 logbak 日志,只要添加 logback-spring.xml 文件,同时在配置文件中指定文件路径即可,logging.config

image-20230316113416113

8、增加了自动初始化创建sqlite的数据库 AutoDatabaseCreate ,控制开关:bud.customize.db.create.enabled

9、集成了 liquibase ,自动创建数据库。引入maven依赖,在配置文件中指定了脚本路径即可。

10、xss白名单,XssFilter,白名单在配置中 bud.customize.xss.whites

11、支持拖动的视频播放,不需要其他的工具。 NonStaticResourceHttpRequestHandlerPlayController 。==需要配合前端才能展示效果==

12、自定义异常和通用异常处理 GlobalExceptionHandlerServiceException

13、农历信息,DateTool#toLunar

14、真实IP工具 NetTool

15、==重要==资源拦截、不用nginx的配置资源映射、静态资源访问实现, ResourcesAndSaTokenInterceptor.addResourceHandlers ,直接可以访问指定的资源书籍

16、controller 的请求配置指定前缀,ResourcesAndSaTokenInterceptor.configurePathMatch ,主要解决,前端访问不想加前缀访问资源,后端因为同一拦截了,需要对controller的进行特殊处理,添加指定前缀访问

17、启动脚本 startup.bat

18、权限获取,sa-token 中 session 获取,StpInterfaceCore

19、备份sqlite数据库,DatabaseBackupTask

20、定时清理文件 ClearFileTask

21、代码生成工具 GenerateTool

22、增加验证码工具 CaptchaTool

23、文件存储服务,找到 com.sprouting.bud.strategy 下就是minio和亚马逊S3对象存储的2个实现

24、excel的导入导出工具。[2023年8月23日18:19:06 升级版本,并且支持 导出带下拉框,ExcelTool]

25、完成站内信,完成缓存消息

26、批量插入支持,只需要关注,MybatisPlusConfig.mybatisPlusInsertBatchInjectorBaseDaoMapper 即可,这个只支持mysql和sqlite

27、整合es,加入了easy-es

28、引入swarm2 参考:https://blog.csdn.net/A2254536570/article/details/121767271

Swagger2和Swagger3是两个不同版本的API文档生成工具。

其中,Swagger2是OpenAPI规范的前身,Swagger3是OpenAPI规范的官方版本,相较于Swagger2,Swagger3在以下几个方面有所改进:

\1. OpenAPI规范的支持:Swagger3采用OpenAPI规范来定义API,这使得API定义更加规范化和标准化;

\2. 引入YAML语法:Swagger3除了支持JSON格式,还支持YAML格式,可以减少文本长度;

\3. 支持响应式API:Swagger3支持异步API、Webhook等特性;

\4. 组件化:Swagger3采用了组件化的方式来定义API元素,更加模块化和可扩展。

总体来说,Swagger3在支持标准化、规范化方面比Swagger2更加出色,同时也支持更多新的特性,使得开发人员能够更好地设计和维护API文档。

主要代码,引入maven依赖后,配置 SwaggerConfig,对拦截器进行处理 ResourcesAndSaTokenInterceptor

还需要注意,配置文件中的 spring.mvc.pathmatch.matching-strategy ,不设置会导致springboot2.6以上版本无法启动swagger。

29、整合 knife4j,基本不需要加什么,只要添加依赖,然后在权限部分排除掉路径即可

30、数据权限过滤,注解 DataScope.javaUnitDataPermissionIntercept.java

31、虹软人脸识别,核心文件:CoreEngineArcSoftController

32、bean自动注入,自定义start的时候最有用了,AutoInjectionorg.springframework.boot.autoconfigure.AutoConfiguration.imports

33、离线IP获取工具 IpTool ,注意拷贝二进制的时候,如果文件变大了,说明文件被动了

image-20230425155203781

34、日志注解 LogRecordLogRecordAop

35、集群的幂等性注解,IdempotentCluster

36、增加xss代码校验注解,CheckXss ,不过由于项目做了整体的xss代码过滤,一般不需要考虑这个注解

37、增加了动态sms服务 com.sprouting.bud.sms 包下现有2个实现,一个是腾讯云的,一个是阿里云的sms服务实现

38、全局线程池 ThreadPoolConfig

39、增加了websocket,支持单机和集群模式,WebSocketServer

40、流式查询的例子 SelectFlowTest (这是mybatis支持的),增加了mp的流式查询,也在SelectFlowTest

41、增加了Spire的例子,对word家族文档进行处理,SpireDemo

42、mq这一块暂时不打算加入,可以参考 dubbo-test 项目,里面集成了kafka、rocketMQ

43、深度优先搜索算法,防止树死循环,CamelServerNodeController.checkDeadCycle

44、javacv推送摄像头数据的几个处理,路径在 com.sprouting.bud.video.javacv.camera, 入口在 CameraController.start()

45、rtspToFlv,这个是rtsp 转flv的例子,还不能用,但流程和思路是可以参考的,代码中定义了 FlvConverterInterface 接口,几个要做的事情,然后定义了抽象类 FlvConverterInterfaceAbstract ,将其中公共的方法写在里面,最后,有2个实现,一个是标准的不需要转码的 h264 和 acc 的音频的,直接转 flv。

46、整合添加了 quartz, 这个代码要看就看 JobController 的保存,其实springboot2.0已经默认添加了 quartz,已经简化非常多,我们的改造多了日志,多了可配置的选项,能马上执行,定时执行,暂停、恢复等等。

使用的话,涉及到2张表,日志 bud_job 和日志记录表 bud_job_log ,参考 TestTask 类,只要继承 TaskJobExecInterfaces 接口即可,然后录入的bean将放到spring中管理,将要执行的代码放到exec方法中。需要注意一点,bean的名字应该第一个是小写,其实就是类的名字,假设一个项目中有多个这样的类名,估计会有一定的问题。但应该是通不过检测的。

47、javacv相关的几个可以参考下 package com.sprouting.bud.video; 下的 package-info.java 。

48、封装了ffmpeg,增加了一些工具信息,FfmpegTool

49、注解支持el表达式,LogRecord 注解的 remark 开始支持EL表达式,使用上请看,如果没有使用el表达式,则如下,

@LogRecord(remark = "sdasddfd")
public ResultJson loginPc(LoginDTO loginDTO){}

结果会抛出一个异常获取不到EL1007E: Property or field 'sdasddfd' cannot be found on null的错误但现在做了处理只有 # 才会进入到el

实在el表达式

@LogRecord(remark = "#loginDTO.key")
public ResultJson loginPc(LoginDTO loginDTO){}

结果正常获取到参数1231dssd三大

直接使用对象也可以

@LogRecord(remark = "#loginDTO")
 public ResultJson loginPc(LoginDTO loginDTO){}
 
 结果:{"key":"1231dssd三大"}

放入了一个找不到的

@LogRecord(remark = "#loginDTObak")
public ResultJson loginPc(LoginDTO loginDTO){}

这里会得到一个空

如果给一个未知的属性去获取

 @LogRecord(remark = "#loginDTO.ss")
public ResultJson loginPc(LoginDTO loginDTO){}

结果会抛出获取不到的异常

50、科大讯飞语音识别,本来写完,发现限制太多,而且要收费,算了,不集成了

51、集成了英文tts工具marytts,不支持中文 VoiceController

52、增加了Tika,可以识别各种文档类型,不在需要从后缀判断,毕竟后缀判断是不准确的,同时可以读取文档的内容,但不保证一定成功。TikaController

53、集成了短信发送功能,支持主流的短信发送平台,TextMessageTool,更多文档看 https://wind.kim/doc/start/

54、根据对象获取属性名称,EntityTool.getFieldName ,比如 EntityTool.getFieldName(IndicatorTreeDTO::getId) 得到id

55、统一文件存储,官网:https://spring-file-storage.xuyanwu.cn/ 。支持各种云存储等,of方法支持 File、MultipartFile、byte[]、InputStream、URL、URI、String,大文件会自动分片上传。

2023年11月16日16:48:35 原本的 UploadFileController 做的太简陋了,但这一块又有点不太好用,打算将这一块封装到 UnifiedFileStorageController 中。

56、支持onnx模型在Java中的运行,具体代码在 onnx 包下面,注意,这里需要去 application.properties 配置文件,否则可能会出现后处理有异常,配置为:bud.customize.onnx.type ,常用的调用方法在 OnnxController 中。项目参考:https://gitee.com/agricultureiot/yolo-onnx-java

57、车牌检测,可实际项目使用的,参考的:https://gitee.com/open-visual/open-anpr

58、数据库表结构导出和表信息获取。本来想将我另外一个项目集成进来的,但考虑到该项目需要一些依赖,很多同学可能没有去注意,到时候启动反而麻烦,另外,开源的另外一个项目实际已经封装的很好了,只要配置一下即可使用,无需处理如此麻烦。故而考虑再三,不进行集成,但记录下来,https://gitee.com/sprouting/database-metadata 通过该项目可以随时导出文档和表结构。

2023年11月16日11:30:20 还是集成了进来,打包为jar,然后maven依赖进去。

测试:访问接口 http://127.0.0.1:8086/bud/export/exportMysql 注意,要导入其他的文档,要将对应的数据库驱动导入。

59、增加了人脸识别模块,基于Onnx模型,参考项目:https://gitee.com/open-visual/face-search/tree/master/face-search-core

入口controller:FaceController

60、vosk的声音识别demo,入口:VoskController

暂时不进行集成模块

1、支付模块暂不加入,因为无法测试,但记录下可以参考的代码。

2、暂不集成消息推送模块,https://gitee.com/zhongfucheng/austin#https://gitee.com/link?target=http%3A%2F%2F139.9.66.219%3A3000%2F 这种大型推送的还没必要,其实上面集成了定时任务,已经可以完成这种简单的消息推送了。

3、t-io暂时不考虑集成,可以参考 t-io-test 项目,已经非常棒了。

4、mqtt 这一块的技术选项较多,是netty,还是 tio,还是这个,都不确定,但代码其实很简单 https://smartboot.gitee.io/smart-mqtt/bridge.html#mqtt-bridge

5、后续可以参考的一些优秀项目

下一步计划

  • 讯飞

  • EasyMedia

  • video 要加配置

  • ClearFileTask 定时任务开启,数据清理超过多长时间的,都从配置中来。

  • DatabaseBackupTask 要设置可配置的定时任务,设置保留的文件数量

  • 多节点雪花算法

  • 参考 camle 在 usp系统

3.2 子功能说明

3.2.1 字符画

生成字符画的网站:https://www.bootschool.net/ascii

颜色可以在这里配置:${AnsiColor:BLUE} 字符画可选的颜色有如下

DEFAULT("49"),
BLACK("40"),
RED("41"),
GREEN("42"),
YELLOW("43"),
BLUE("44"),
MAGENTA("45"),
CYAN("46"),
WHITE("47"),
BRIGHT_BLACK("100"),
BRIGHT_RED("101"),
BRIGHT_GREEN("102"),
BRIGHT_YELLOW("103"),
BRIGHT_BLUE("104"),
BRIGHT_MAGENTA("105"),
BRIGHT_CYAN("106"),
BRIGHT_WHITE("107");

不开启字符画只要将这一行代码放开注释即可

image-20230316104921036

3.2.2 Quartz框架封装后结构

image-20231020101531518

3.3.3 缓存

所有的缓存相关暂时全部走的本地缓存。

模拟缓存使用

private static TimedCache<String, String> timedCache = CacheUtil.newTimedCache(30 * 1000);

锁释放则使用如下方式

// 通过再次设置这个值,并将过期时间设置为1毫秒,实现释放锁的功能
timedCache.put(key, "1", 1);

4、常见问题

项目无法启动,参数太长

项目中一旦使用了 javacv-platform 的依赖,那么就会出现这个错误,项目无法起来。问题原因就是参数太长。但这个依赖不加入,调用ffmpeg就会出现依赖问题。

解决办法很简单,idea中配置下即可。

image-20230523134303174

如下,将 shorten command line 旋转为上图这种,不要选 none ,即可。有些idea无法看到该选项,则在 modify options 中找到勾选即可。

软件架构

软件架构说明

安装教程

参与贡献

  1. Fork 本仓库
  2. 新建 Feat_xxx 分支
  3. 提交代码
  4. 新建 Pull Request
Java
1
https://gitee.com/sprouting/bud-server.git
git@gitee.com:sprouting/bud-server.git
sprouting
bud-server
花蕾-server
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891