diff --git a/.gitignore b/.gitignore index d9cc6d06..f4016dc4 100644 --- a/.gitignore +++ b/.gitignore @@ -21,10 +21,13 @@ target/ ### IntelliJ IDEA ### .idea +.claude +.github *.iws *.iml *.ipr + ### JRebel ### rebel.xml diff --git a/README.md b/README.md index 003e6971..bb8c4859 100644 --- a/README.md +++ b/README.md @@ -137,6 +137,29 @@ --- + +## 📺 视频教程 + +
+ + + + + + + +
+微信二维码
+打开抖音扫一扫
+获取免费视频教程 +
+QQ群二维码
+打开B站扫一扫
+获取免费视频教程 +
+ +
+
**[⭐ 点个Star支持一下](https://github.com/ageerle/ruoyi-ai)** • **[ Fork 开始贡献](https://github.com/ageerle/ruoyi-ai/fork)** • **[📚 English](README_EN.md)** • **[📖 查看完整文档](https://doc.pandarobot.chat)** diff --git a/README_EN.md b/README_EN.md index 3ae559e1..20e4a54e 100644 --- a/README_EN.md +++ b/README_EN.md @@ -1,3 +1,4 @@ + # RuoYi AI
@@ -115,21 +116,7 @@ Thanks to the following excellent open-source projects for their support:
- - - - - - -
-WeChat QR Code
-Scan to Add Author's WeChat
-Invitation to join the group -
-QQ Group QR Code
-QQ Technical Discussion Group
-Technical discussions -
+**[📱 Join Telegram Group](https://t.me/+LqooQAc5HxRmYmE1)**
diff --git a/docs/image/bibi.png b/docs/image/bibi.png new file mode 100644 index 00000000..bafba054 Binary files /dev/null and b/docs/image/bibi.png differ diff --git a/docs/image/dy.png b/docs/image/dy.png new file mode 100644 index 00000000..c303e76a Binary files /dev/null and b/docs/image/dy.png differ diff --git a/pom.xml b/pom.xml index 36bf6d39..8771fb18 100644 --- a/pom.xml +++ b/pom.xml @@ -50,9 +50,9 @@ 1.8.2 - 4.4.0 + 4.6.0 - 2.20.1 + 2.18.2 1.11.0 1.11.0-beta19 diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index 03b7bc24..42ef9fff 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -90,7 +90,7 @@ spring: sys: upload: path: D:\\DownLoad - + --- # redis 单机配置(单机与集群只能开启一个另一个需要注释掉) spring.data: redis: @@ -268,4 +268,4 @@ justauth: client-secret: 1f7d08**********5b7**********29e redirect-uri: ${justauth.address}/social-callback?source=gitea -AGENT_ALLOWED_TABLES: "abtest_rule,abtest_project,agent_ban_log,agent_ban_logs,agent_install_sub_task,agent_install_sum_task,agent_install_task" \ No newline at end of file +AGENT_ALLOWED_TABLES: "abtest_rule,abtest_project,agent_ban_log,agent_ban_logs,agent_install_sub_task,agent_install_sum_task,agent_install_task" diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index ca371e3d..5743c299 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -125,7 +125,9 @@ security: - /*/api-docs/** - /warm-flow-ui/config - /workflow/run - + - /user/qrcode + - /user/login/qrcode + - /weixin/check # 多租户配置 tenant: # 是否开启 @@ -309,6 +311,7 @@ wechat: secret: '' token: '' aesKey: '' + --- # Neo4j 知识图谱配置 neo4j: uri: bolt://117.72.192.162:7687 diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/ruoyi/common/core/service/ConfigService.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/ruoyi/common/core/service/ConfigService.java index 7a5cf5b5..c2ebc98b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/ruoyi/common/core/service/ConfigService.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/ruoyi/common/core/service/ConfigService.java @@ -15,4 +15,13 @@ public interface ConfigService { */ String getConfigValue(String configKey); + /** + * 根据配置类型和配置key获取值 + * + * @param category 配置类型 + * @param configKey 配置key + * @return 配置属性 + */ + String getConfigValue(String category, String configKey); + } diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/controller/chat/ChatConfigController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatConfigController.java similarity index 78% rename from ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/controller/chat/ChatConfigController.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatConfigController.java index 994334d2..7c15462c 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/controller/chat/ChatConfigController.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/controller/system/ChatConfigController.java @@ -1,26 +1,27 @@ -package org.ruoyi.controller.chat; +package org.ruoyi.system.controller.system; -import java.util.List; - -import lombok.RequiredArgsConstructor; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; -import org.ruoyi.common.web.core.BaseController; -import org.ruoyi.service.chat.IChatConfigService; -import org.springframework.web.bind.annotation.*; -import org.springframework.validation.annotation.Validated; -import org.ruoyi.common.idempotent.annotation.RepeatSubmit; -import org.ruoyi.common.log.annotation.Log; -import org.ruoyi.common.mybatis.core.page.PageQuery; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; import org.ruoyi.common.core.domain.R; import org.ruoyi.common.core.validate.AddGroup; import org.ruoyi.common.core.validate.EditGroup; -import org.ruoyi.common.log.enums.BusinessType; import org.ruoyi.common.excel.utils.ExcelUtil; -import org.ruoyi.domain.vo.chat.ChatConfigVo; -import org.ruoyi.domain.bo.chat.ChatConfigBo; +import org.ruoyi.common.idempotent.annotation.RepeatSubmit; +import org.ruoyi.common.log.annotation.Log; +import org.ruoyi.common.log.enums.BusinessType; +import org.ruoyi.common.mybatis.core.page.PageQuery; import org.ruoyi.common.mybatis.core.page.TableDataInfo; +import org.ruoyi.common.web.core.BaseController; +import org.ruoyi.system.domain.bo.ChatConfigBo; +import org.ruoyi.system.domain.vo.ChatConfigVo; +import org.ruoyi.system.service.IChatConfigService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; /** * 配置信息 @@ -79,6 +80,25 @@ public class ChatConfigController extends BaseController { return toAjax(chatConfigService.insertByBo(bo)); } + /** + * 新增或者修改配置信息 + */ + @SaCheckPermission("system:config:add") + @Log(title = "新增或者修改配置信息", businessType = BusinessType.UPDATE) + @RepeatSubmit() + @PostMapping("/saveOrUpdate") + public R saveOrUpdate(@RequestBody List boList) { + for (ChatConfigBo chatConfigBo : boList) { + if (chatConfigBo.getId() == null) { + chatConfigService.insertByBo(chatConfigBo); + } else { + chatConfigService.updateByBo(chatConfigBo); + } + } + return toAjax(true); + } + + /** * 修改配置信息 */ diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/entity/chat/ChatConfig.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/ChatConfig.java similarity index 80% rename from ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/entity/chat/ChatConfig.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/ChatConfig.java index eaa8020b..a9f0e510 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/entity/chat/ChatConfig.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/ChatConfig.java @@ -1,9 +1,12 @@ -package org.ruoyi.domain.entity.chat; +package org.ruoyi.system.domain; -import org.ruoyi.common.tenant.core.TenantEntity; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.Version; import lombok.Data; import lombok.EqualsAndHashCode; +import org.ruoyi.common.tenant.core.TenantEntity; import java.io.Serial; diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/bo/chat/ChatConfigBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/ChatConfigBo.java similarity index 88% rename from ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/bo/chat/ChatConfigBo.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/ChatConfigBo.java index 5167fb58..8f38bb7c 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/bo/chat/ChatConfigBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/bo/ChatConfigBo.java @@ -1,13 +1,14 @@ -package org.ruoyi.domain.bo.chat; +package org.ruoyi.system.domain.bo; -import org.ruoyi.common.core.validate.AddGroup; -import org.ruoyi.common.core.validate.EditGroup; -import org.ruoyi.domain.entity.chat.ChatConfig; -import org.ruoyi.common.mybatis.core.domain.BaseEntity; import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; -import jakarta.validation.constraints.*; +import org.ruoyi.common.core.validate.AddGroup; +import org.ruoyi.common.core.validate.EditGroup; +import org.ruoyi.common.mybatis.core.domain.BaseEntity; +import org.ruoyi.system.domain.ChatConfig; /** * 配置信息业务对象 chat_config diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/chat/ChatConfigVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ChatConfigVo.java similarity index 93% rename from ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/chat/ChatConfigVo.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ChatConfigVo.java index b5188404..7365ef08 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/domain/vo/chat/ChatConfigVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/domain/vo/ChatConfigVo.java @@ -1,16 +1,15 @@ -package org.ruoyi.domain.vo.chat; +package org.ruoyi.system.domain.vo; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; -import org.ruoyi.domain.entity.chat.ChatConfig; +import org.ruoyi.system.domain.ChatConfig; import java.io.Serial; import java.io.Serializable; - /** * 配置信息视图对象 chat_config * diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/mapper/chat/ChatConfigMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatConfigMapper.java similarity index 64% rename from ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/mapper/chat/ChatConfigMapper.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatConfigMapper.java index 11ca95bb..d740a9f2 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/mapper/chat/ChatConfigMapper.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/mapper/ChatConfigMapper.java @@ -1,8 +1,8 @@ -package org.ruoyi.mapper.chat; +package org.ruoyi.system.mapper; -import org.ruoyi.domain.entity.chat.ChatConfig; -import org.ruoyi.domain.vo.chat.ChatConfigVo; import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus; +import org.ruoyi.system.domain.ChatConfig; +import org.ruoyi.system.domain.vo.ChatConfigVo; /** * 配置信息Mapper接口 diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/chat/IChatConfigService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IChatConfigService.java similarity index 91% rename from ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/chat/IChatConfigService.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IChatConfigService.java index 3c7f25c5..13a917b9 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/chat/IChatConfigService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/IChatConfigService.java @@ -1,9 +1,9 @@ -package org.ruoyi.service.chat; +package org.ruoyi.system.service; import org.ruoyi.common.mybatis.core.page.PageQuery; import org.ruoyi.common.mybatis.core.page.TableDataInfo; -import org.ruoyi.domain.bo.chat.ChatConfigBo; -import org.ruoyi.domain.vo.chat.ChatConfigVo; +import org.ruoyi.system.domain.bo.ChatConfigBo; +import org.ruoyi.system.domain.vo.ChatConfigVo; import java.util.Collection; import java.util.List; diff --git a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/chat/impl/ChatConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/ChatConfigServiceImpl.java similarity index 93% rename from ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/chat/impl/ChatConfigServiceImpl.java rename to ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/ChatConfigServiceImpl.java index ee1954a0..b79c256f 100644 --- a/ruoyi-modules/ruoyi-chat/src/main/java/org/ruoyi/service/chat/impl/ChatConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/ChatConfigServiceImpl.java @@ -1,24 +1,24 @@ -package org.ruoyi.service.chat.impl; +package org.ruoyi.system.service.impl; -import org.ruoyi.common.core.utils.MapstructUtils; -import org.ruoyi.common.core.utils.StringUtils; -import org.ruoyi.common.mybatis.core.page.TableDataInfo; -import org.ruoyi.common.mybatis.core.page.PageQuery; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.ruoyi.service.chat.IChatConfigService; +import org.ruoyi.common.core.utils.MapstructUtils; +import org.ruoyi.common.core.utils.StringUtils; +import org.ruoyi.common.mybatis.core.page.PageQuery; +import org.ruoyi.common.mybatis.core.page.TableDataInfo; +import org.ruoyi.system.domain.ChatConfig; +import org.ruoyi.system.domain.bo.ChatConfigBo; +import org.ruoyi.system.domain.vo.ChatConfigVo; +import org.ruoyi.system.mapper.ChatConfigMapper; +import org.ruoyi.system.service.IChatConfigService; import org.springframework.stereotype.Service; -import org.ruoyi.domain.bo.chat.ChatConfigBo; -import org.ruoyi.domain.vo.chat.ChatConfigVo; -import org.ruoyi.domain.entity.chat.ChatConfig; -import org.ruoyi.mapper.chat.ChatConfigMapper; +import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Collection; /** * 配置信息Service业务层处理 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysConfigServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysConfigServiceImpl.java index 7f285089..b3b77a97 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysConfigServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/SysConfigServiceImpl.java @@ -18,9 +18,11 @@ import org.ruoyi.common.mybatis.core.page.PageQuery; import org.ruoyi.common.mybatis.core.page.TableDataInfo; import org.ruoyi.common.redis.utils.CacheUtils; import org.ruoyi.common.tenant.helper.TenantHelper; +import org.ruoyi.system.domain.ChatConfig; import org.ruoyi.system.domain.SysConfig; import org.ruoyi.system.domain.bo.SysConfigBo; import org.ruoyi.system.domain.vo.SysConfigVo; +import org.ruoyi.system.mapper.ChatConfigMapper; import org.ruoyi.system.mapper.SysConfigMapper; import org.ruoyi.system.service.ISysConfigService; import org.springframework.cache.annotation.CachePut; @@ -41,6 +43,9 @@ public class SysConfigServiceImpl implements ISysConfigService, ConfigService { private final SysConfigMapper baseMapper; + + private final ChatConfigMapper configMapper; + /** * 分页查询参数配置列表 * @@ -212,4 +217,12 @@ public class SysConfigServiceImpl implements ISysConfigService, ConfigService { return SpringUtils.getAopProxy(this).selectConfigByKey(configKey); } + @Override + public String getConfigValue(String category, String configKey) { + ChatConfig config = configMapper.selectOne(new LambdaQueryWrapper() + .eq(ChatConfig::getCategory, category) + .eq(ChatConfig::getConfigName, configKey)); + return ObjectUtils.notNullGetter(config, ChatConfig::getConfigValue, StringUtils.EMPTY); + } + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/UserLoginServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/UserLoginServiceImpl.java index 4fa230cb..fb06e69b 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/UserLoginServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/ruoyi/system/service/impl/UserLoginServiceImpl.java @@ -7,8 +7,10 @@ import cn.hutool.crypto.digest.BCrypt; import lombok.RequiredArgsConstructor; import org.apache.commons.lang3.math.NumberUtils; import org.ruoyi.common.core.constant.Constants; +import org.ruoyi.common.core.constant.SystemConstants; import org.ruoyi.common.core.domain.dto.VisitorLoginUserDto; import org.ruoyi.common.core.enums.UserType; +import org.ruoyi.common.core.exception.ServiceException; import org.ruoyi.common.core.service.UserLoginService; import org.ruoyi.common.core.utils.MessageUtils; import org.ruoyi.common.satoken.utils.LoginHelper; @@ -33,12 +35,19 @@ public class UserLoginServiceImpl implements UserLoginService { public VisitorLoginUserDto mpLogin(String openid, String clientId) { + // 校验客户端 + SysClientVo client = clientService.queryByClientId(clientId); + if (ObjectUtil.isNull(client)) { + throw new ServiceException(MessageUtils.message("auth.grant.type.error")); + } else if (!SystemConstants.NORMAL.equals(client.getStatus())) { + throw new ServiceException(MessageUtils.message("auth.grant.type.blocked")); + } // 使用 openid 查询绑定用户 如未绑定用户 则根据业务自行处理 例如 创建默认用户 SysUserVo user = userService.selectUserByOpenId(openid); VisitorLoginUserDto loginUser = new VisitorLoginUserDto(); if (ObjectUtil.isNull(user)) { SysUserBo sysUser = new SysUserBo(); - String name = "用户" + UUID.randomUUID().toString().replace("-", ""); + String name = "用户" + UUID.randomUUID().toString().replace("-", "").substring(0, 7); // 设置默认用户名 sysUser.setUserName(name); // 设置默认昵称 @@ -47,6 +56,8 @@ public class UserLoginServiceImpl implements UserLoginService { sysUser.setPassword(BCrypt.hashpw("123456")); // 设置微信openId sysUser.setOpenId(openid); + // 设置用户类型 + sysUser.setUserType(UserType.SYS_USER.getUserType()); // 设置默认余额 sysUser.setUserBalance(NumberUtils.toDouble("1")); // 注册用户,设置默认租户为0 @@ -54,16 +65,15 @@ public class UserLoginServiceImpl implements UserLoginService { // 构建登录用户信息 loginUser.setUserId(sysUser.getUserId()); loginUser.setUsername(sysUser.getUserName()); - loginUser.setUserType(UserType.APP_USER.getUserType()); + loginUser.setUserType(UserType.SYS_USER.getUserType()); loginUser.setOpenid(openid); } else { // 此处可根据登录用户的数据不同 自行创建 loginUser loginUser.setUserId(user.getUserId()); loginUser.setUsername(user.getUserName()); - loginUser.setUserType(user.getUserType()); + loginUser.setUserType(UserType.SYS_USER.getUserType()); loginUser.setOpenid(openid); } - SysClientVo client = clientService.queryByClientId(clientId); SaLoginParameter model = new SaLoginParameter(); model.setDeviceType(client.getDeviceType()); // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 diff --git a/ruoyi-modules/ruoyi-wechat/src/main/java/org/ruoyi/util/WeixinApiUtil.java b/ruoyi-modules/ruoyi-wechat/src/main/java/org/ruoyi/util/WeixinApiUtil.java index 97fd19e4..ceef7554 100644 --- a/ruoyi-modules/ruoyi-wechat/src/main/java/org/ruoyi/util/WeixinApiUtil.java +++ b/ruoyi-modules/ruoyi-wechat/src/main/java/org/ruoyi/util/WeixinApiUtil.java @@ -74,6 +74,6 @@ public class WeixinApiUtil { } public String getKey(String key) { - return configService.getConfigValue("weixin"); + return configService.getConfigValue("wechat",key); } }