3 Star 19 Fork 10

sprouting / 花蕾-server

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

花蕾

项目前端: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
MIT License Copyright (c) 2023 sprouting Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

一个综合了非常多系统的开源工具,比如权限、人脸识别、车牌识别、目标检查、opencv、mq、es,这个系统的目标是建立一个最初始的模块化应用,通过配置,可以随时应用到主机的系统中,不同组件提供多个接入方式。注意,本项目是基于单机应用,不完全考虑分布式的问题,系统的目标是轻量级快速接入的开发组件 展开 收起
Java 等 3 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/sprouting/bud-server.git
git@gitee.com:sprouting/bud-server.git
sprouting
bud-server
花蕾-server
master

搜索帮助