备分一下

This commit is contained in:
fy53888
2025-08-18 19:56:26 +08:00
parent 5264b47c2f
commit 645c754dd0
8 changed files with 226 additions and 139 deletions

View File

@@ -16,9 +16,9 @@ spring:
master:
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/ruoyi-ai?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
url: jdbc:mysql://127.0.0.1:3306/ruoyistore?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
username: root
password: 123456
password: root
hikari:
# 最大连接池数量

View File

@@ -162,7 +162,7 @@ tenant:
- sys_user_role
knowledge-role:
enable: true
enable: false
# MyBatisPlus配置
# https://baomidou.com/config/

View File

@@ -8,6 +8,7 @@ import lombok.EqualsAndHashCode;
import org.ruoyi.core.domain.BaseEntity;
import java.io.Serial;
import java.util.List;
/**
* 聊天模型对象 chat_model
@@ -80,5 +81,10 @@ public class ChatModel extends BaseEntity {
*/
private String remark;
/**
* 模型能力
*/
private String modelCapability;
}

View File

@@ -5,14 +5,14 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.Getter;
import org.ruoyi.common.sensitive.annotation.Sensitive;
import org.ruoyi.common.sensitive.core.SensitiveStrategy;
import org.ruoyi.domain.ChatModel;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
/**
@@ -96,4 +96,138 @@ public class ChatModelVo implements Serializable {
@ExcelProperty(value = "备注")
private String remark;
}
/**
* 模型能力
*/
@ExcelProperty(value = "模型能力")
private String modelCapability;
/**
* 模型能力列表
*/
private List<Ability> modelAbilities = getModelAbilities();
/**
* 模型能力类,类似枚举的静态内部类
*/
@Getter
public static final class Ability {
// 获取能力名称
private final String name;
private final String description;
// 静态字段存储默认能力(类似枚举常量)
public static final Ability IMAGE = new Ability("IMAGE", "图片理解");
public static final Ability VIDEO = new Ability("VIDEO", "视频理解");
public static final Ability SPEECH = new Ability("SPEECH", "语音理解");
// 动态扩展能力存储
private static final java.util.Map<String, Ability> EXTENDED_ABILITIES = new java.util.HashMap<>();
// 私有构造确保受限
private Ability(String name, String description) {
this.name = name;
this.description = description;
}
// 静态工厂方法类似枚举valueOf
public static Ability valueOf(String name) {
// 先检查默认能力
switch (name) {
case "IMAGE": return IMAGE;
case "VIDEO": return VIDEO;
case "SPEECH": return SPEECH;
default:
// 检查扩展能力
Ability ability = EXTENDED_ABILITIES.get(name);
if (ability != null) return ability;
throw new IllegalArgumentException("Unknown ability: " + name);
}
}
// 动态注册新能力(后期从数据库调用)
public static synchronized Ability registerAbility(String name, String description) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Ability name cannot be empty");
}
// 避免重复注册
if (EXTENDED_ABILITIES.containsKey(name)) {
return EXTENDED_ABILITIES.get(name);
}
// 检查是否与默认能力冲突
try {
valueOf(name);
throw new IllegalArgumentException("Ability already exists as default: " + name);
} catch (IllegalArgumentException e) {
// 正常情况,继续注册
}
Ability newAbility = new Ability(name, description);
EXTENDED_ABILITIES.put(name, newAbility);
return newAbility;
}
// 获取所有能力(默认+扩展)
public static java.util.Set<Ability> getAllAbilities() {
java.util.Map<String, Ability> all = new java.util.HashMap<>();
all.put(IMAGE.name, IMAGE);
all.put(VIDEO.name, VIDEO);
all.put(SPEECH.name, SPEECH);
all.putAll(EXTENDED_ABILITIES);
return java.util.Collections.unmodifiableSet((java.util.Set<? extends Ability>) all.values());
}
@Override
public String toString() {
return name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Ability ability = (Ability) o;
return name.equals(ability.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
}
/**
* 将 modelCapability 字符串转换为 Ability 列表
* @return Ability 列表
*/
public java.util.List<Ability> getModelAbilities() {
if (modelCapability == null || modelCapability.trim().isEmpty()) {
return java.util.Collections.emptyList();
}
// 解析 JSON 格式的字符串数组
String trimmed = modelCapability.trim();
if (!trimmed.startsWith("[") || !trimmed.endsWith("]")) {
throw new IllegalArgumentException("Invalid modelCapability format: " + modelCapability);
}
String content = trimmed.substring(1, trimmed.length() - 1).trim();
if (content.isEmpty()) {
return java.util.Collections.emptyList();
}
java.util.List<Ability> abilities = new java.util.ArrayList<>();
String[] items = content.split(",");
for (String item : items) {
String cleanedItem = item.trim();
if (cleanedItem.startsWith("\"") && cleanedItem.endsWith("\"") && cleanedItem.length() >= 2) {
String abilityName = cleanedItem.substring(1, cleanedItem.length() - 1);
abilities.add(Ability.valueOf(abilityName));
}
}
return abilities;
}
}

View File

@@ -27,10 +27,18 @@ import org.ruoyi.service.IKnowledgeAttachService;
import org.ruoyi.service.IKnowledgeFragmentService;
import org.ruoyi.service.IKnowledgeInfoService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Objects;
/**
* 知识库管理
@@ -60,7 +68,9 @@ public class KnowledgeController extends BaseController {
if (!StpUtil.isLogin()) {
throw new SecurityException("请先去登录!");
}
bo.setUid(LoginHelper.getUserId());
if (!Objects.equals(LoginHelper.getUserId(), 1L)) {
bo.setUid(LoginHelper.getUserId());
}
return knowledgeInfoService.queryPageList(bo, pageQuery);
}
@@ -72,13 +82,15 @@ public class KnowledgeController extends BaseController {
if (!StpUtil.isLogin()) {
throw new SecurityException("请先去登录!");
}
LoginUser loginUser = LoginHelper.getLoginUser();
// 管理员跳过权限
if (loginUser.getUserId().equals(1L) || !knowledgeRoleConfig.getEnable()) {
if (Objects.equals(LoginHelper.getUserId(), 1L)) {
return knowledgeInfoService.queryPageList(bo, pageQuery);
} else if (!knowledgeRoleConfig.getEnable()) {
bo.setUid(LoginHelper.getUserId());
return knowledgeInfoService.queryPageList(bo, pageQuery);
} else {
// TODO 自己创建的知识库+角色分配的知识库
return knowledgeInfoService.queryPageListByRole(pageQuery);
}
}

View File

@@ -2496,11 +2496,56 @@ CREATE TABLE prompt_template
ROW_FORMAT = Dynamic;
DROP TABLE IF EXISTS `dev_schema_group`;
create table dev_schema_group
(
id bigint auto_increment comment '主键' primary key,
name varchar(100) null comment '分组名称',
code varchar(100) null comment '分组编码',
icon varchar(100) null comment '图标',
remark varchar(500) null comment '备注',
del_flag char default '0' null comment '删除标志0代表存在 2代表删除',
create_dept bigint null comment '创建部门',
create_by bigint null comment '创建者',
create_time datetime null comment '创建时间',
update_by bigint null comment '更新者',
update_time datetime null comment '更新时间'
) ENGINE = InnoDB
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT = '数据模型分组表';
INSERT INTO dev_schema_group (id, name, code, icon, remark, del_flag, create_dept, create_by, create_time, update_by, update_time) VALUES
(1944240213530648567, '系统管理', 'system', 'eos-icons:system-group', '系统默认分组', '0', null, null, '2025-07-13 11:37:28', 1, '2025-07-13 18:42:48');
INSERT INTO dev_schema_group (id, name, code, icon, remark, del_flag, create_dept, create_by, create_time, update_by, update_time) VALUES
(1944240213530648577, '运营管理', 'operator', 'icon-park-outline:appointment', '运营管理', '0', null, null, '2025-07-13 11:39:24', 1, '2025-07-13 18:42:31');
INSERT INTO dev_schema_group (id, name, code, icon, remark, del_flag, create_dept, create_by, create_time, update_by, update_time) VALUES
(1944346023254429697, '在线开发', 'dev', 'carbon:development', '在线开发', '0', null, null, '2025-07-13 18:39:51', 1, '2025-07-13 18:42:07');
DROP TABLE IF EXISTS `dev_schema`;
create table dev_schema
(
id bigint auto_increment comment '主键' primary key,
schema_group_id bigint null comment '分组ID',
name varchar(100) null comment '模型名称',
code varchar(100) null comment '模型编码',
table_name varchar(100) null comment '表名',
remark varchar(500) null comment '备注',
del_flag char default '0' null comment '删除标志0代表存在 2代表删除',
create_dept bigint null comment '创建部门',
create_by bigint null comment '创建者',
create_time datetime null comment '创建时间',
update_by bigint null comment '更新者',
update_time datetime null comment '更新时间'
) ENGINE = InnoDB
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT = '数据模型表';
DROP TABLE IF EXISTS `dev_schema_field`;
create table dev_schema_field
(
id bigint auto_increment comment '主键'
primary key,
id bigint auto_increment comment '主键' primary key,
schema_id bigint null comment '模型ID',
schema_name varchar(64) null comment '模型名称',
name varchar(100) null comment '字段名称',
@@ -2513,17 +2558,6 @@ create table dev_schema_field
default_value varchar(200) null comment '默认值',
length int null comment '字段长度',
scale int null comment '小数位数',
sort int null comment '排序',
status char default '0' null comment '状态0正常 1停用',
extend_json text null comment '扩展配置',
remark varchar(500) null comment '备注',
del_flag char default '0' null comment '删除标志0代表存在 2代表删除',
tenant_id varchar(20) default '000000' null comment '租户编号',
create_dept bigint null comment '创建部门',
create_by bigint null comment '创建者',
create_time datetime null comment '创建时间',
update_by bigint null comment '更新者',
update_time datetime null comment '更新时间',
is_list char default '1' null comment '是否列表显示0否 1是',
is_query char default '1' null comment '是否查询字段0否 1是',
is_insert char default '1' null comment '是否插入字段0否 1是',
@@ -2531,125 +2565,23 @@ create table dev_schema_field
query_type varchar(200) default null comment '查询方式EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围',
html_type varchar(200) default 'input' null comment '显示类型input输入框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传、upload文件上传、editor富文本编辑器',
dict_type varchar(200) default '' null comment '字典类型',
constraint fk_schema_field_schema
foreign key (schema_id) references dev_schema (id)
on delete cascade
) comment '数据模型字段表';
create index idx_html_type
on dev_schema_field (html_type);
create index idx_is_list
on dev_schema_field (is_list);
create index idx_is_query
on dev_schema_field (is_query);
create index idx_query_type
on dev_schema_field (query_type);
create index idx_schema_field_code
on dev_schema_field (code);
create index idx_schema_field_schema_id
on dev_schema_field (schema_id);
create index idx_schema_field_status
on dev_schema_field (status);
create index idx_schema_field_tenant
on dev_schema_field (tenant_id);
DROP TABLE IF EXISTS `dev_schema`;
create table dev_schema
(
id bigint auto_increment comment '主键'
primary key,
schema_group_id bigint null comment '分组ID',
name varchar(100) null comment '模型名称',
code varchar(100) null comment '模型编码',
table_name varchar(100) null comment '表名',
comment varchar(500) null comment '表注释',
engine varchar(50) default 'InnoDB' null comment '存储引擎',
list_keys text null comment '列表字段',
search_form_keys text null comment '搜索表单字段',
designer longtext null comment '表单设计',
status char default '0' null comment '状态0正常 1停用',
sort int null comment '排序',
remark varchar(500) null comment '备注',
del_flag char default '0' null comment '删除标志0代表存在 2代表删除',
tenant_id varchar(20) default '000000' null comment '租户编号',
create_dept bigint null comment '创建部门',
create_by bigint null comment '创建者',
create_time datetime null comment '创建时间',
update_by bigint null comment '更新者',
update_time datetime null comment '更新时间',
constraint fk_schema_group
foreign key (schema_group_id) references dev_schema_group (id)
on delete set null
)
comment '数据模型表';
create index idx_schema_code
on dev_schema (code);
create index idx_schema_group_id
on dev_schema (schema_group_id);
create index idx_schema_status
on dev_schema (status);
create index idx_schema_table_name
on dev_schema (table_name);
create index idx_schema_tenant
on dev_schema (tenant_id);
DROP TABLE IF EXISTS `dev_schema_group`;
create table dev_schema_group
(
id bigint auto_increment comment '主键'
primary key,
name varchar(100) null comment '分组名称',
code varchar(100) null comment '分组编码',
icon varchar(100) null comment '图标',
sort int null comment '排序',
status char default '0' null comment '状态0正常 1停用',
remark varchar(500) null comment '备注',
del_flag char default '0' null comment '删除标志0代表存在 2代表删除',
tenant_id varchar(20) default '000000' null comment '租户编号',
create_dept bigint null comment '创建部门',
create_by bigint null comment '创建者',
create_time datetime null comment '创建时间',
update_by bigint null comment '更新者',
update_time datetime null comment '更新时间'
)
comment '数据模型分组表';
create index idx_schema_group_code
on dev_schema_group (code);
create index idx_schema_group_status
on dev_schema_group (status);
create index idx_schema_group_tenant
on dev_schema_group (tenant_id);
INSERT INTO dev_schema_group (id, name, code, icon, sort, status, remark, del_flag, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1944240213530648567, '系统管理', 'system', 'eos-icons:system-group', 2, '0', '系统默认分组', '0', '000000', null, null, '2025-07-13 11:37:28', 1, '2025-07-13 18:42:48');
INSERT INTO dev_schema_group (id, name, code, icon, sort, status, remark, del_flag, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1944240213530648577, '运营管理', 'operator', 'icon-park-outline:appointment', 1, '0', null, '0', '000000', null, null, '2025-07-13 11:39:24', 1, '2025-07-13 18:42:31');
INSERT INTO dev_schema_group (id, name, code, icon, sort, status, remark, del_flag, tenant_id, create_dept, create_by, create_time, update_by, update_time) VALUES (1944346023254429697, '在线开发', 'dev', 'carbon:development', 3, '0', null, '0', '000000', null, null, '2025-07-13 18:39:51', 1, '2025-07-13 18:42:07');
sort int null comment '排序',
del_flag char default '0' null comment '删除标志0代表存在 2代表删除',
create_dept bigint null comment '创建部门',
create_by bigint null comment '创建者',
create_time datetime null comment '创建时间',
update_by bigint null comment '更新者',
update_time datetime null comment '更新时间',
remark varchar(500) null comment '备注'
) ENGINE = InnoDB
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci COMMENT = '数据模型字段表';
DROP TABLE IF EXISTS `knowledge_role`;
-- ----------------------------
-- Table structure for knowledge_role
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_role`;
CREATE TABLE `knowledge_role` (
`id` bigint NOT NULL COMMENT '知识库角色id',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '知识库角色name',
@@ -2664,10 +2596,10 @@ CREATE TABLE `knowledge_role` (
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '知识库角色表' ROW_FORMAT = DYNAMIC;
DROP TABLE IF EXISTS `knowledge_role_group`;
-- ----------------------------
-- Table structure for knowledge_role_group
-- ----------------------------
DROP TABLE IF EXISTS `knowledge_role_group`;
CREATE TABLE `knowledge_role_group` (
`id` bigint NOT NULL COMMENT '知识库角色组id',
`name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '知识库角色组name',

View File

@@ -0,0 +1,3 @@
-- 聊天模型表添加模型能力字段
alter table chat_model
add model_capability varchar(255) default '[]' not null comment '模型能力';

View File

@@ -74,7 +74,7 @@ SET FOREIGN_KEY_CHECKS = 1;
-- 菜单
INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1946483381643743233, '知识库角色管理', 1775500307898949634, '12', 'knowledgeRole', 'system/knowledgeRole/index', NULL, 1, 0, 'C', '0', '0', NULL, 'ri:user-3-fill', 103, 1, '2025-07-19 16:41:17', NULL, NULL, '知识库角色管理');
INSERT INTO `sys_menu` (`menu_id`, `menu_name`, `parent_id`, `order_num`, `path`, `component`, `query_param`, `is_frame`, `is_cache`, `menu_type`, `visible`, `status`, `perms`, `icon`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `remark`) VALUES (1946483381643743233, '知识库角色管理', 1775500307898949634, '12', 'knowledgeRole', 'operator/knowledgeRole/index', NULL, 1, 0, 'C', '0', '0', NULL, 'ri:user-3-fill', 103, 1, '2025-07-19 16:41:17', NULL, NULL, '知识库角色管理');
-- 用户表添加字段
ALTER TABLE sys_user