项目简介:
目前功能架构(20240429)
目前技术架构(20240429)
项目未来规划以及待修复BUG:智能数据分析平台待修复BUG以及待完成需求-CSDN博客
技术介绍
前端
React18
Ant Design Pro5.X脚手架
Umi4前端框架
Ant Design组件库
Echarts可视化库
OpenAPI前端代码生成
后端
Java Spring Boot(万用后端模板)
MySQL数据库
MyBatis-Plus及MyBatis X自动生成
Redis+Redisson限流
RabbitMQ消息队列
鱼聪明AI SDK(AI能力)
JDK线程池及异步化
Easy Excel表格数据处理
Swagger+Knife4j接口文档生成
Hutool、Apache Common Utils等工具库
项目主要功能介绍:
智能数据分析模块:
数据同步分析功能(实时同步分析结果)
数据异步分析功能(实现异步化用户可以在短时间内分析多个数据,不用在数据输入界面一直等待)
图表模块:
存储用户分析结果功能(存储用户的分析结果)
搜索图表功能(可通过搜索图表名称进行模糊搜索)
查看原始数据功能(用户可查看生成图表时上传的原始数据)
删除图表功能(用户可删除自己的图表)
用户模块:
登录注册退出功能(用户可以进行登录退出和注册操作)
个人信息修改功能(用户可以修改个密码、昵称等个人信息)
管理员模块:
快速查找用户功能(可以通过账号、昵称、用户角色快速搜索和定位到用户)
注册管理用户功能(普通用户注册的用户只拥有普通权限,)
用户管理功能(管理员可以更改用户的角色、昵称以及删除和封禁用户)、图表管理功能(可以查看和删除所有用户的图表和分析结果)
安全性考虑:
1.使用自增长的方式生成用户ID,会使得用户ID变得容易猜测和推断。攻击者可以通过猜测或者暴力破解的方式,预测出下一个用户ID。这样攻击者就可以利用这些ID进行一系列的恶意行为,如盗取用户数据、伪造用户身份等。因此,使用自增长的方式生成用户ID会对用户安全产生影响。为了保障用户安全,可以考虑使用随机数或者其他加密方式生成用户ID,本项目中采用的事雪花算法的形式生成唯一的ID
-
雪花算法(雪花)是微博开源的分布式ID生成算法其核心思想就是:使用一个64位的长型的数字作为全局唯一ID。在分布式系统中的应用十分广泛,且ID引入了时间戳,基本上保持自增的。
@RequestPart("file") MultipartFile multipartFile接收客户端传给后端的文件
2.为了保护用户隐私、防止中间人攻击、避免内部威胁和符合法规要求,密码需要进行加密存储和传输。加密密码能确保即使数据库被黑客入侵,他们也无法轻易获取用户的密码。在密码传输过程中,加密能防止黑客截获数据包并获取密码。同时,内部的恶意员工或系统管理员也无法通过未加密的密码访问用户的账户信息。此外,许多国家和地区的法规也要求对用户密码进行加密存储和传输,以保护用户的隐私权,不符合这些法规可能会面临法律责任。
/** * 盐值,混淆密码 */ private static final String SALT = "yupi";
// 2. 加密 String encryptPassword = DigestUtils.md5DigestAsHex((SALT + userPassword).getBytes());
/**
* 盐值,混淆密码
*/
private static final String SALT = "yupi";
// 加密
String encryptPassword = DigestUtils.md5DigestAsHex((SALT + userPassword).getBytes());
3.为了确保系统的安全并防止用户在短时间内恶意多次调用服务,我们的后端采用了Redis+Redisson进行限流操作,限制每一个用户每一秒只能通过两个请求。
@Resource private RedissonClient redissonClient; // 限流判断,每个用户一个限流器 redisLimiterManager.doRateLimit("genChartByAi_" + loginUser.getId()); //限流操作 public void doRateLimit(String key) { // 创建一个名称为user_limiter的限流器,每秒最多访问 2 次 RRateLimiter rateLimiter = redissonClient.getRateLimiter(key); rateLimiter.trySetRate(RateType.OVERALL, 2, 1, RateIntervalUnit.SECONDS); // 每当一个操作来了后,请求一个令牌 boolean canOp = rateLimiter.tryAcquire(1); if (!canOp) { throw new BusinessException(ErrorCode.TOO_MANY_REQUEST); } }
性能设计