# hxBI
基于springboot以及ChatGPT接口的智能BI(Business Intelligence)项目 , 用户只需要输入分析诉求并导入XLS数据, 即可通过AI进行图表生成与数据分析 , 实现数据分析的降本增效。
线上地址 : http://bi.dhx.icu
测试用户:
testuser@163.com
adorabled4
## 版本信息
包含了主要项的版本信息,更多内容请参考**pom.xml**
| 项 | 版本 |
| ------------ | ------ |
| JDK | 1.8 |
| springboot | 2.5.7 |
| MySQL | 5.7.32 |
| Redis | 6.2.6 |
| Maven | 3.8.6 |
| Mybatis-plus | 3.5.3 |
| MongoDB | 7.0.1 |
## 主要内容
1. 通过**MongoDB**进行生成图表结果存储 , 原始数据量较大 , 通过对原始数据与图表结果的**分库存储** , 一方面减小MySQL压力, 另一方面也可以提高原始数据的安全性(默认用户删除图表是删除生成的结果 , 对于原始数据需要走单独的删除接口)
2. 通过**策略模式**以及反向压力思想, 根据当前系统负载进行策略选择
3. 通过**Spring-Retry**进行失败重试
4. 通过对生成图表JSON数据进行**压缩** , 实测平均节约**35+%**空间
5. 通过**Docker**进行项目部署, 同时通过Github Actions实现**Docker镜像构建与推送到阿里云镜像仓库的自动化**
6. 通过**WebSocket**进行图表生成结果的实时推送
7. 通过阿里云**OSS**进行用户图表存储(主要是头像)
8. 更改用户注册登录方式为**邮箱**
9. JWT + Redis**双Token单点登录**
10. **Logback**日志配置以及基于**AOP**的日志处理
项目地址 :
- 后端 : https://github.com/adorabled4/hxBI
- https://github.com/adorabled4/hxBI-frontend
目前的主要业务流程
<img src="C:/Users/dhx/Desktop/image-20230831165848356.png" style="zoom:67%;" />
**下面我简单描述下部分扩展点的实现细节**
### MongoDB
MongoDB是一个面向文档的NoSQL数据库,它以JSON样式的文档存储数据。这种灵活的数据模型使得可以轻松地存储和检索不同结构的数据
对于生成的图表, 主要的操作更多是查询 , 也就是 `读>>写`
这里使用MongoDB进行信息存储 , 数据库查询速度提高了 3~4倍 , 接口响应速度快了`40%+` , 因此我认为这一点还是十分有必要的。
要点在于我们如果去做好图表生成的CRUD操作以及MySQL与图表之间的数据一致性
关于CRUD操作 , 建议参考`spring-data-mongodb`的官方文档 , 这里给出地址
https://docs.spring.io/spring-data/mongodb/docs/3.3.10/reference/html/
<u>**另外, 十分建议直接使用docker去进行服务搭建 (只需要就记住一次命令 , 基本是属于一劳永逸)**</u>
还有一点需要注意的就是MongoDB的id , 这里我使用的是MongoDB自带的Object ID , 实际在查询的过程中仍然使用我们业务中的ChartId , 好处是这样用户生成图表会更加的方便
> 如果使用chartId作为主键 , 对于一些生成失败的图表就会占用主键 , 会大大增加编码的复杂性
只需要添加一个version字段用来标记即可
---
关于数据一致性 , 做法是在生成图表成功的时候进行数据的同步 , 这样也十分契合我们进行数据隔离存储的目的 , 也就是说我们的MySQL中不再存储图表生成的结果
### 反向压力与策略模式
反向压力的思想鱼总在直播的过程中已经介绍过了, 这里不再重复
详细内容可以查看 https://blog.csdn.net/weixin_41701290/article/details/119994997
使用的是`java.lang.management`包下的工具类
这里给出代码
```java
public class ServerMetricsUtil {
private static OperatingSystemMXBean osBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
private static MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
private static ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();
/**
* 获取当前服务器CPU使用占比
*
* @return CPU usage percentage.
*/
public static double getCpuUsagePercentage() {
return osBean.getProcessCpuLoad() * 100; // Convert to percentage
}
/**
* 获取当前服务器内存使用占比
*
* @return Memory usage percentage.
*/
public static double getMemoryUsagePercentage() {
long usedMemory = memoryBean.getHeapMemoryUsage().getUsed();
long maxMemory = memoryBean.getHeapMemoryUsage().getMax();
return ((double) usedMemory / maxMemory) * 100; // Convert to percentage
}
/**
* 判断当前使用同步还是异步进行服务
* based on CPU and memory usage.
*
* @return true for synchronous, false for asynchronous.
*/
public static boolean shouldProvideSync() {
double cpuUsagePercentage = getCpuUsagePercentage();
double memoryUsagePercentage = getMemoryUsagePercentage();
// Threshold values for CPU and memory usage
double cpuThreshold = 70.0; // Example threshold value
double memoryThreshold = 80.0; // Example threshold value
if (cpuUsagePercentage < cpuThreshold && memoryUsagePercentage < memoryThreshold) {
return true; // Provide service synchronously
} else {
return false; // Provide service asynchronously
}
}
public static ServerLoadInfo getLoadInfo() {
double cpuUsagePercentage = getCpuUsagePercentage();
double memoryUsagePercentage = getMemoryUsagePercentage();
return new ServerLoadInfo(cpuUsagePercentage,memoryUsagePercentage);
}
}
```
这里我的实现并不好 , 每次服务都需要去查询负载 , 并且这个方法执行很慢 , 并且仅仅是通过CPU以及内存占用来进行负载判断
> 更好的应该是结合更多的参数, **比如磁盘I/O 网络I/O等**
如果不熟悉策略模式 , 建议浏览 https://www.runoob.com/design-pattern/strategy-pattern.html
简单来讲就是通过一个接口统一方法的各项信息(参数 , 名称, 返回值等) , 然后我们定义不同的策略去实现接口中的执行方法
由于在进行图表生成的过程中会使用到大量的Spring控制的Bean , 于是我把所有的策略实现类都交给了Spring管理
通过`@Compoennet(value="xxxx")` 来指明Bean的名称 , 然后在 **策略选择器**的代码中通过注入`Map<String, Strategy>` 来获取具体的执行策略
> **通过枚举类枚举了策略的Bean名称 , 便于代码维护**
```java
@Component
public class StrategySelector {
/**
* Spring会自动将strategy接口的实现类注入到这个Map中,key为bean id,value值则为对应的策略实现类
*/
@Resource
Map<String, GenChartStrategy> strategyMap;
/**
* 选择对应的生成图表执行策略
*
* @param info 服务器当前负载信息
* @return {@link GenChartStrategy}
*/
public GenChartStrategy selectStrategy(ServerLoadInfo info) {
if (info.isVeryHighLoad()) {
return strategyMap.get(GenChartStrategyEnum.GEN_REJECT.getValue());
} else if (info.isHighLoad()) {
return strategyMap.get(GenChartStrategyEnum.GEN_MQ.getValue());
} else if (info.isMediumLoad()) {
return strategyMap.get(GenChartStrategyEnum.GEN_THREAD_POOL.getValue());
} else {
return strategyMap.get(GenChartStrategyEnum.GEN_SYNC.getValue());
}
}
}
```
那么具体的执行策略也就是原本我们生成图表的方式
1. 同步
2. 线程池异步
3. RabbitMQ异步
这里我新加了一条 **拒绝策略** , 只会在服务器负载特别高的时候去执行
### 图表结果压缩
我们在开发的过程中大多经常与JSON打交道, 那么常用的JSON网站大家应该都有印象
<img src="http://oss.dhx.icu/dhx/image-20230831174722917.png" style="zoom:67%;" />
图表生成的JSON数据中是有很多的**制表符**以及**空格**的 ,
没有合适的资源?快使用搜索试试~ 我知道了~
基于springboot以及ChatGPT接口的智能BI(Business Intelligence)项目 ,
共114个文件
java:95个
yml:5个
xml:5个
需积分: 0 1 下载量 21 浏览量
2023-12-24
13:14:04
上传
评论
收藏 121KB ZIP 举报
温馨提示
AIGC(Artificial Intelligence Generated Content,人工智能生成内容)的重要性体现在以下几个方面: 内容创作效率提升: AIGC能够快速生成大量高质量的内容,包括文本、图像、音频、视频等,极大地提高了创作效率。这不仅降低了人力成本,也使得内容更新和迭代的速度加快,满足了信息爆炸时代人们对新鲜内容的高需求。 个性化和定制化服务: AIGC可以根据用户的需求和偏好自动生成个性化的内容。这种能力在教育、娱乐、营销等领域具有巨大价值,能够提供高度定制化的用户体验,增强用户黏性和满意度。 创新与发现新应用: AIGC技术的不断发展和普及促进了新的应用场景和商业模式的诞生。通过降低开发门槛,更多的开发者和企业能够探索和实验AIGC的应用,有可能催生出全新的现象级应用和服务。 商业效益增长: AIGC在数字商业化领域具有显著优势。它能够赋能营销策略,提高广告和推广的精准度和效果,从而带动企业收入的增长。同时,通过自动化的内容生成,企业可以节省资源并专注于核心业务的创新和发展。 知识传播与教育: AIGC能够生成教育材料、教程和知识摘要,帮助人们更高效地获取和学习新知识。在教育领域,AIGC可以个性化定制学习路径和内容,适应不同学生的学习速度和方式。 行业效率优化: 在保险、出版、法律等行业,AIGC可以自动处理大量的文档、报告和合同,提高工作效率,减少人为错误,并提供数据分析和决策支持。 学术研究与伦理考量: AIGC在学术研究中的应用需要遵循特定的使用边界和准则,以防止学术不端行为。明确的指南有助于确保研究成果的真实性和可信度,同时推动AI技术在科研领域的健康发展。
资源推荐
资源详情
资源评论
收起资源包目录
基于springboot以及ChatGPT接口的智能BI(Business Intelligence)项目 , (114个子文件)
mvnw.cmd 7KB
Dockerfile 625B
.gitignore 423B
ChartController.java 15KB
ChartServiceImpl.java 9KB
UserController.java 9KB
UserServiceImpl.java 7KB
SysLogAOP.java 7KB
BiMqMessageConsumer.java 7KB
GenChartThreadPool.java 6KB
UserEntity.java 6KB
JwtTokensServiceImpl.java 5KB
ChartEntity.java 5KB
DateUtils.java 5KB
WebSocketServer.java 5KB
AiManager.java 4KB
GenChartSync.java 4KB
Chart.java 3KB
ReFreshTokenInterceptor.java 3KB
GlobalExceptionHandler.java 3KB
OssManager.java 3KB
ChartLogEntity.java 3KB
ExcelUtils.java 3KB
AuthCheckAOP.java 2KB
ChartService.java 2KB
ServerMetricsUtil.java 2KB
ResultUtil.java 2KB
MvcConfig.java 2KB
AopUtil.java 2KB
BIApplicationTests.java 2KB
UserService.java 2KB
MessageServiceImpl.java 2KB
BaseResponse.java 2KB
UserConstant.java 1KB
ChartLogServiceImpl.java 1KB
SystemController.java 1KB
ChartUtil.java 1KB
ChartUpdateRequest.java 1KB
ErrorCode.java 1KB
StrategySelector.java 1KB
UserRoleEnum.java 1KB
ChartLogController.java 1KB
FileUploadBizEnum.java 1KB
MailConfig.java 1KB
RedisLimiterManager.java 1KB
RedisConstant.java 1KB
ServerLoadInfo.java 1KB
JwtTokensService.java 1KB
ChartVO.java 1KB
RedissonConfig.java 1KB
ThrowUtils.java 1KB
BusinessException.java 1KB
GenChartException.java 1KB
ThreadPoolConfig.java 985B
OSSConfig.java 959B
UserUpdateRequest.java 910B
GenChartMQ.java 891B
UserVO.java 858B
ChartQueryRequest.java 851B
MailEnum.java 799B
MybatisConfig.java 782B
VerifyCodeRegisterRequest.java 771B
ChartLogService.java 760B
ChartEditRequest.java 744B
UserBaseInfoVo.java 730B
JwtToken.java 729B
ChartRepository.java 718B
LoginEmailRequest.java 695B
ChartAddRequest.java 695B
GenChartReject.java 681B
BiMqMessageProducer.java 668B
BIApplication.java 628B
BiMqConstant.java 615B
ChartLogMapper.java 575B
QuickLoginEmailRequest.java 572B
ChartStatusEnum.java 569B
PageRequest.java 541B
UserDTO.java 530B
SqlUtils.java 527B
WebSocketConfig.java 501B
FileUploadResult.java 499B
GenChartByAIRequest.java 488B
ThreadPoolConfigProperties.java 486B
AuthCheck.java 478B
GenChartStrategyEnum.java 447B
GenChartStrategy.java 422B
UserHolder.java 407B
MessageService.java 405B
ChartLogDTO.java 390B
CommonConstant.java 386B
BiResponse.java 377B
ChartMapper.java 365B
UserMapper.java 355B
JobExample.java 334B
DeleteRequest.java 332B
JwtConstant.java 321B
AIConstant.java 282B
SysLog.java 263B
LICENSE 1KB
README.md 29KB
共 114 条
- 1
- 2
资源评论
极致人生-010
- 粉丝: 2903
- 资源: 2822
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功