6
web/.gitignore
vendored
@@ -24,9 +24,3 @@ dist-ssr
|
||||
*.sw?
|
||||
|
||||
package-lock.json
|
||||
|
||||
# 文档和截图(不上传到仓库)
|
||||
操作说明.md
|
||||
记忆熊系统功能使用说明.md
|
||||
截图清单.md
|
||||
images/
|
||||
91
web/README.md
Normal file
@@ -0,0 +1,91 @@
|
||||
# Memory Bear 前端项目
|
||||
|
||||
基于 React + TypeScript + Vite + Ant Design 构建的知识库管理系统前端应用。
|
||||
|
||||
## 技术栈
|
||||
|
||||
- **框架**: React 18 + TypeScript
|
||||
- **构建工具**: Vite
|
||||
- **UI 组件库**: Ant Design 5
|
||||
- **样式**: Tailwind CSS 4
|
||||
- **路由**: React Router 6
|
||||
- **状态管理**: Zustand
|
||||
- **国际化**: i18next
|
||||
- **图表**: ECharts
|
||||
- **其他**: React Markdown
|
||||
|
||||
## 环境要求
|
||||
|
||||
- Node.js >= 20.19+, 22.12+
|
||||
- npm 或 yarn
|
||||
|
||||
## 安装
|
||||
|
||||
```bash
|
||||
# 克隆项目
|
||||
git clone <repository-url>
|
||||
|
||||
# 进入项目目录
|
||||
cd memory-bear-font-end
|
||||
|
||||
# 安装依赖
|
||||
npm install
|
||||
```
|
||||
|
||||
## 运行
|
||||
|
||||
### 开发环境
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
启动后访问: `http://localhost:5173`
|
||||
|
||||
### 生产构建
|
||||
|
||||
```bash
|
||||
npm run build
|
||||
```
|
||||
|
||||
构建产物输出到 `dist` 目录。
|
||||
|
||||
### 预览构建结果
|
||||
|
||||
```bash
|
||||
npm run preview
|
||||
```
|
||||
|
||||
## 代码检查
|
||||
|
||||
```bash
|
||||
npm run lint
|
||||
```
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
src/
|
||||
├── api/ # API 接口
|
||||
├── assets/ # 静态资源
|
||||
├── components/ # 公共组件
|
||||
├── hooks/ # 自定义 Hooks
|
||||
├── i18n/ # 国际化配置
|
||||
├── routes/ # 路由配置
|
||||
├── store/ # 状态管理
|
||||
├── styles/ # 全局样式
|
||||
├── utils/ # 工具函数
|
||||
├── views/ # 页面视图
|
||||
├── App.tsx # 应用入口组件
|
||||
└── main.tsx # 应用入口文件
|
||||
```
|
||||
|
||||
## 配置说明
|
||||
|
||||
- 开发服务器默认监听 `0.0.0.0:5173`
|
||||
- API 代理配置在 `vite.config.ts` 中
|
||||
- 路径别名 `@` 指向 `src` 目录
|
||||
|
||||
## License
|
||||
|
||||
Private
|
||||
205
web/i18n-comparison-report.md
Normal file
@@ -0,0 +1,205 @@
|
||||
# i18n 中英文对比报告
|
||||
|
||||
## 📊 统计概览
|
||||
|
||||
- **中文键总数**: 1136
|
||||
- **英文键总数**: 1052
|
||||
- **中文缺失**: 27 个键
|
||||
- **英文缺失**: 111 个键
|
||||
|
||||
---
|
||||
|
||||
## ❌ 英文缺失的翻译(111个)
|
||||
|
||||
### 1. Application 模块 (3个)
|
||||
- `application.cluster` - 集群
|
||||
- `application.clusterDesc` - 创建Agent集群
|
||||
- `application.fullAmount` - 全量
|
||||
|
||||
### 2. Role 角色管理模块 (15个)
|
||||
- `role.roleManagement` - 角色管理
|
||||
- `role.roleId` - 角色ID
|
||||
- `role.roleName` - 角色名称
|
||||
- `role.roleCode` - 角色编码
|
||||
- `role.description` - 角色描述
|
||||
- `role.status` - 状态
|
||||
- `role.enabled` - 已启用
|
||||
- `role.disabled` - 已停用
|
||||
- `role.createTime` - 创建时间
|
||||
- `role.createRole` - 新建角色
|
||||
- `role.editRole` - 编辑角色
|
||||
- `role.roleTemplate` - 角色模板
|
||||
- `role.emptyTemplate` - 空模板
|
||||
- `role.adminTemplate` - 管理员模板
|
||||
- `role.userTemplate` - 用户模板
|
||||
- `role.confirmDelete` - 确定要删除这个角色吗?
|
||||
- `role.createSuccess` - 角色创建成功
|
||||
- `role.updateSuccess` - 角色更新成功
|
||||
- `role.deleteSuccess` - 角色删除成功
|
||||
- `role.createFailed` - 角色创建失败
|
||||
- `role.updateFailed` - 角色更新失败
|
||||
- `role.deleteFailed` - 角色删除失败
|
||||
|
||||
### 3. Tenant 租户管理模块 (20个)
|
||||
- `tenant.tenantId` - 租户ID
|
||||
- `tenant.tenantName` - 租户名称
|
||||
- `tenant.contactPerson` - 联系人
|
||||
- `tenant.contactInfo` - 联系方式
|
||||
- `tenant.status` - 状态
|
||||
- `tenant.enabled` - 启用
|
||||
- `tenant.disabled` - 禁用
|
||||
- `tenant.expiryDate` - 到期时间
|
||||
- `tenant.createTenant` - 新增租户
|
||||
- `tenant.editTenant` - 编辑租户
|
||||
- `tenant.searchPlaceholder` - 搜索租户ID、名称、联系人或联系方式
|
||||
- `tenant.confirmDelete` - 确定要删除该租户吗?
|
||||
- `tenant.confirmBatchDelete` - 确定要批量删除选中的租户吗?
|
||||
- `tenant.fetchFailed` - 获取租户数据失败
|
||||
- `tenant.batchEnableSuccess` - 批量启用成功
|
||||
- `tenant.batchEnableFailed` - 批量启用失败
|
||||
- `tenant.batchDisableSuccess` - 批量停用成功
|
||||
- `tenant.batchDisableFailed` - 批量停用失败
|
||||
- `tenant.exportSuccess` - 导出成功
|
||||
- `tenant.batchDeleteSuccess` - 批量删除成功
|
||||
- `tenant.batchDeleteFailed` - 批量删除失败
|
||||
- `tenant.saveFailed` - 保存失败
|
||||
- `tenant.batchImport` - 批量导入
|
||||
|
||||
### 4. User 用户管理模块 (13个)
|
||||
- `user.tenantName` - 所属租户
|
||||
- `user.password` - 密码
|
||||
- `user.expiryDate` - 有效期
|
||||
- `user.expiryDateDue` - 有效期至
|
||||
- `user.batchImport` - 批量导入
|
||||
- `user.batchImportUser` - 批量导入用户
|
||||
- `user.downloadTemplate` - 下载导入模板
|
||||
- `user.templateDownloadSuccess` - 模板下载成功
|
||||
- `user.startImport` - 开始导入
|
||||
- `user.batchImportSuccess` - 批量导入成功
|
||||
- `user.importFailed` - 导入失败,请检查文件格式
|
||||
- `user.noFileSelected` - 请选择要导入的文件
|
||||
- `user.onlyXlsxOrCsv` - 只能上传 .xlsx 或 .csv 格式的文件
|
||||
- `user.reselect` - 重新选择
|
||||
- `user.noFileSelectedTip` - 未选择任何文件
|
||||
- `user.downloadTemplateTip` - 请下载模板,填写用户信息后上传。
|
||||
|
||||
### 5. Product 产品管理模块 (13个)
|
||||
- `product.applicationManagement` - 应用管理
|
||||
- `product.createApplication` - 创建应用
|
||||
- `product.applicationName` - 应用名称
|
||||
- `product.applicationIcon` - 应用图标
|
||||
- `product.applicationNameRequired` - 请输入应用名称
|
||||
- `product.associationStatus` - 关联状态
|
||||
- `product.associated` - 已关联
|
||||
- `product.notAssociated` - 未关联
|
||||
- `product.unassociate` - 解除关联
|
||||
- `product.unassociateSuccess` - 解除关联成功
|
||||
- `product.unassociateFailed` - 解除关联失败
|
||||
- `product.viewKey` - 查看KEY
|
||||
- `product.viewStats` - 查看统计
|
||||
- `product.disableSuccess` - 停用成功
|
||||
- `product.enableSuccess` - 启用成功
|
||||
- `product.operationFailed` - 操作失败
|
||||
|
||||
### 6. 其他模块 (47个)
|
||||
- `count` - 计数: {{count}}
|
||||
- `increment` - 增加
|
||||
- `decrement` - 减少
|
||||
- `reset` - 重置
|
||||
- `switchLanguage` - 切换语言
|
||||
- `home.title` - 首页
|
||||
- `home.welcome` - 欢迎使用我们的带单页路由的 React 应用!
|
||||
- `home.counterCard` - 计数器演示
|
||||
- `home.aboutCard` - 关于我们
|
||||
- `home.workflowCard` - 工作流编辑器
|
||||
- `home.websocketDemoCard` - WebSocket 演示
|
||||
- `home.sseDemoCard` - SSE演示
|
||||
- `workflow.title` - 工作流编辑器
|
||||
- `workflow.description` - 拖拽节点创建连接,构建您的工作流程。点击节点可进行配置。
|
||||
- `workflow.addNode` - 添加节点
|
||||
- `workflow.deleteNode` - 删除选中
|
||||
- `workflow.saveWorkflow` - 保存工作流
|
||||
- `workflow.startNode` - 触发节点
|
||||
- `workflow.conditionNode` - 条件判断
|
||||
- `workflow.actionNode` - 执行动作
|
||||
- `workflow.endNode` - 结束节点
|
||||
- `workflow.newNode` - 新节点
|
||||
- `workflow.node` - 节点
|
||||
- `workflow.nodesCreated` - 已创建节点
|
||||
- `workflow.loadingNodes` - 正在加载节点 {{progress}}%
|
||||
- `workflow.loadingFailed` - 加载节点失败
|
||||
- `workflow.create5kNodes` - 创建5000节点
|
||||
- `workflow.create10kNodes` - 创建10000节点
|
||||
- `notFound.title` - 页面未找到
|
||||
- `notFound.description` - 请求的页面不存在。
|
||||
- `notFound.backToHome` - 返回首页
|
||||
|
||||
---
|
||||
|
||||
## ✅ 中文缺失的翻译(27个)
|
||||
|
||||
### 1. Common 通用模块 (1个)
|
||||
- `common.operateSuccess` - Operation successful
|
||||
|
||||
### 2. KnowledgeBase 知识库模块 (3个)
|
||||
- `knowledgeBase.models` - Model
|
||||
- `knowledgeBase.owner` - Owner
|
||||
- `knowledgeBase.operation` - Operation
|
||||
|
||||
### 3. Application 应用模块 (15个)
|
||||
- `application.multi_agent` - Cluster
|
||||
- `application.multi_agentDesc` - Create an Agent Cluster
|
||||
- `application.current` - Current
|
||||
- `application.versionName` - Version Name
|
||||
- `application.versionNameTip` - Version number format: v[major version number].[next version number].[revision number] (e.g. v1.3.0)
|
||||
- `application.agentName` - Agent Name
|
||||
- `application.roleType` - Role Type
|
||||
- `application.coordinator` - Coordinator
|
||||
- `application.analyzer` - Analyzer
|
||||
- `application.executor` - Executor
|
||||
- `application.reviewer` - Reviewer
|
||||
- `application.updateSubAgent` - Update Sub Agent
|
||||
- `application.subAgentMaxLength` - Sub Agent maximum {{maxLength}}
|
||||
- `application.capabilities` - Capabilities
|
||||
|
||||
### 4. Space 空间模块 (5个)
|
||||
- `space.storageType` - Storage Type
|
||||
- `space.rag` - RAG storage
|
||||
- `space.ragDesc` - Based on vector retrieval, suitable for document Q&A and semantic search
|
||||
- `space.neo4j` - Graph storage
|
||||
- `space.neo4jDesc` - Based on knowledge graph, suitable for relational reasoning and path query
|
||||
|
||||
### 5. MemoryExtractionEngine 记忆提取引擎模块 (4个)
|
||||
- `memoryExtractionEngine.coreEntitiesAfterDedup` - Core entities after deduplication
|
||||
- `memoryExtractionEngine.extractRelationalTriples` - Extracted relational triples (partial)
|
||||
- `memoryExtractionEngine.extractRelationalTriplesDesc` - There are a total of {{count}} segments with clear semantic boundaries
|
||||
- `memoryExtractionEngine.theEffectOfEntityDisambiguationLLMDriven` - The effect of entity disambiguation (LLM driven)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 建议
|
||||
|
||||
### 优先级 1 - 核心功能模块(需要立即补充)
|
||||
1. **Role 角色管理** - 完整模块缺失(15个键)
|
||||
2. **Tenant 租户管理** - 完整模块缺失(20个键)
|
||||
3. **Product 产品管理** - 完整模块缺失(13个键)
|
||||
4. **User 用户管理扩展** - 批量导入功能缺失(13个键)
|
||||
|
||||
### 优先级 2 - 功能增强(建议补充)
|
||||
1. **Application 应用模块** - 多代理相关功能(15个键)
|
||||
2. **Space 空间模块** - 存储类型配置(5个键)
|
||||
3. **MemoryExtractionEngine** - 实体去重相关(4个键)
|
||||
|
||||
### 优先级 3 - 演示/测试功能(可选)
|
||||
1. **Home/Workflow/NotFound** - 演示页面(30个键)
|
||||
2. **通用计数器功能** - 测试功能(5个键)
|
||||
|
||||
---
|
||||
|
||||
## 📝 下一步行动
|
||||
|
||||
1. **补充英文翻译**: 优先补充 Role、Tenant、Product、User 模块的英文翻译
|
||||
2. **补充中文翻译**: 补充 Application、Space、MemoryExtractionEngine 模块的中文翻译
|
||||
3. **清理无用翻译**: 如果 Home/Workflow 等演示功能不再使用,可以考虑从中文文件中移除
|
||||
4. **建立翻译规范**: 建议建立翻译键的命名规范和审查流程,避免未来出现遗漏
|
||||
|
||||
10
web/public/auto-imports.d.ts
vendored
@@ -6,31 +6,22 @@
|
||||
// biome-ignore lint: disable
|
||||
export {}
|
||||
declare global {
|
||||
const Activity: typeof import('react').Activity
|
||||
const Fragment: typeof import('react').Fragment
|
||||
const Link: typeof import('react-router-dom').Link
|
||||
const NavLink: typeof import('react-router-dom').NavLink
|
||||
const Navigate: typeof import('react-router-dom').Navigate
|
||||
const Outlet: typeof import('react-router-dom').Outlet
|
||||
const Route: typeof import('react-router-dom').Route
|
||||
const Routes: typeof import('react-router-dom').Routes
|
||||
const Suspense: typeof import('react').Suspense
|
||||
const cache: typeof import('react').cache
|
||||
const cacheSignal: typeof import('react').cacheSignal
|
||||
const createContext: typeof import('react').createContext
|
||||
const createRef: typeof import('react').createRef
|
||||
const forwardRef: typeof import('react').forwardRef
|
||||
const lazy: typeof import('react').lazy
|
||||
const memo: typeof import('react').memo
|
||||
const startTransition: typeof import('react').startTransition
|
||||
const use: typeof import('react').use
|
||||
const useActionState: typeof import('react').useActionState
|
||||
const useCallback: typeof import('react').useCallback
|
||||
const useContext: typeof import('react').useContext
|
||||
const useDebugValue: typeof import('react').useDebugValue
|
||||
const useDeferredValue: typeof import('react').useDeferredValue
|
||||
const useEffect: typeof import('react').useEffect
|
||||
const useEffectEvent: typeof import('react').useEffectEvent
|
||||
const useHref: typeof import('react-router-dom').useHref
|
||||
const useId: typeof import('react').useId
|
||||
const useImperativeHandle: typeof import('react').useImperativeHandle
|
||||
@@ -42,7 +33,6 @@ declare global {
|
||||
const useMemo: typeof import('react').useMemo
|
||||
const useNavigate: typeof import('react-router-dom').useNavigate
|
||||
const useNavigationType: typeof import('react-router-dom').useNavigationType
|
||||
const useOptimistic: typeof import('react').useOptimistic
|
||||
const useOutlet: typeof import('react-router-dom').useOutlet
|
||||
const useOutletContext: typeof import('react-router-dom').useOutletContext
|
||||
const useParams: typeof import('react-router-dom').useParams
|
||||
|
||||
@@ -28,6 +28,8 @@ import 'dayjs/locale/zh-cn'
|
||||
import 'dayjs/plugin/timezone'
|
||||
import 'dayjs/plugin/utc'
|
||||
|
||||
|
||||
|
||||
function App() {
|
||||
const { t } = useTranslation();
|
||||
const { locale, language, timeZone } = useI18n()
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { request } from "@/utils/request";
|
||||
import { request, cookieUtils } from "@/utils/request";
|
||||
import type { AxiosProgressEvent } from "axios";
|
||||
import type {
|
||||
ShareRequestParams,
|
||||
@@ -15,7 +15,7 @@ import type {
|
||||
KnowledgeBaseDocumentData,
|
||||
KnowledgeBaseListResponse,
|
||||
KnowledgeBaseShareListResponse,
|
||||
} from "./types";
|
||||
} from "@/views/KnowledgeBase/types";
|
||||
|
||||
const apiPrefix = '';
|
||||
|
||||
@@ -151,7 +151,7 @@ export const uploadFile = async (data: FormData, options?: UploadFileOptions) =>
|
||||
|
||||
// 下载文件
|
||||
export const downloadFile = async (fileId: string, fileName?: string) => {
|
||||
const token = localStorage.getItem('token');
|
||||
const token = cookieUtils.get('authToken');
|
||||
const url = `${apiPrefix}/files/${fileId}`;
|
||||
|
||||
try {
|
||||
@@ -1,5 +1,6 @@
|
||||
import { request } from '@/utils/request'
|
||||
import type { CreateModalData } from '@/views/UserManagement/types'
|
||||
import { cookieUtils } from '@/utils/request'
|
||||
|
||||
// 用户信息
|
||||
export const getUsers = () => {
|
||||
@@ -15,7 +16,7 @@ export const login = (data: { email: string; password: string; invite?: string;
|
||||
// 刷新token
|
||||
export const refreshTokenUrl = '/refresh'
|
||||
export const refreshToken = () => {
|
||||
return request.post(refreshTokenUrl, { refresh_token: localStorage.getItem('refresh_token') })
|
||||
return request.post(refreshTokenUrl, { refresh_token: cookieUtils.get('refreshToken') })
|
||||
}
|
||||
// 重置密码
|
||||
export const changePassword = (data: { user_id: string; new_password: string }) => {
|
||||
|
||||
BIN
web/src/assets/images/application/chat.png
Normal file
|
After Width: | Height: | Size: 152 KiB |
@@ -1,54 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="200px" height="200px" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>常见问题</title>
|
||||
<defs>
|
||||
<polygon id="path-1" points="0 0 200 0 200 200 0 200"></polygon>
|
||||
</defs>
|
||||
<g id="V1.0版" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="应用管理-编排-操作状态-1" transform="translate(-980, -346)">
|
||||
<g id="常见问题" transform="translate(980, 346)">
|
||||
<mask id="mask-2" fill="white">
|
||||
<use xlink:href="#path-1"></use>
|
||||
</mask>
|
||||
<g id="路径"></g>
|
||||
<g id="编组" mask="url(#mask-2)">
|
||||
<g transform="translate(17.4844, 21.9453)">
|
||||
<path d="M99.171875,0 L137.679688,0 C150.505859,0 160.998047,10.4921875 160.998047,23.3183594 C160.998047,36.1445313 150.505859,46.6367187 137.679688,46.6367187 L104.820313,46.6367187 C101.443359,50.90625 97.3554688,53.4335938 91.5449219,53.4335938 C88.1679688,53.4335938 88.6542969,51.4667969 90.0078125,50.7460938 C93.2519531,49.0214844 93.265625,46.1210938 91.53125,45.3417969 C82.4277344,42.1601562 75.8515625,33.4707031 75.8515625,23.3183594 C75.8515625,10.4921875 86.34375,0 99.1699219,0 L99.171875,0 Z" id="路径" stroke="none" fill="#D2D3D5" fill-rule="evenodd"></path>
|
||||
<path d="M99.171875,0 L137.679688,0 C150.505859,0 160.998047,10.4921875 160.998047,23.3183594 C160.998047,36.1445313 150.505859,46.6367187 137.679688,46.6367187 L104.820313,46.6367187 C101.443359,50.90625 97.3554688,53.4335938 91.5449219,53.4335938 C88.1679688,53.4335938 88.6542969,51.4667969 90.0078125,50.7460938 C93.2519531,49.0214844 93.265625,46.1210938 91.53125,45.3417969 C82.4277344,42.1601562 75.8515625,33.4707031 75.8515625,23.3183594 C75.8515625,10.4921875 86.34375,0 99.1699219,0 L99.171875,0 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M96.4863281,25.5234375 C97.5449219,25.8222656 98.4199219,26.265625 99.1074219,26.8515625 C100.185547,25.8671875 100.726563,24.3867188 100.726563,22.4101563 C100.726563,21.2871094 100.535156,20.3046875 100.152344,19.4667969 C99.7695313,18.625 99.2128906,17.9746094 98.4785156,17.5097656 C97.7441406,17.046875 96.9179688,16.8125 96.0039063,16.8125 C94.6347656,16.8125 93.4960938,17.28125 92.5957031,18.21875 C91.6914063,19.1582031 91.2421875,20.5566406 91.2421875,22.4199219 C91.2421875,24.2832031 91.6894531,25.609375 92.5800781,26.578125 C93.4746094,27.5429688 94.6132813,28.0253906 96.0039063,28.0253906 C96.6582031,28.0253906 97.2773438,27.9023438 97.859375,27.65625 C97.2832031,27.2832031 96.6777344,27.0175781 96.0429688,26.859375 L96.4863281,25.5214844 L96.4863281,25.5234375 Z M100.529297,27.875 C101.386719,28.4648438 102.177734,28.8925781 102.904297,29.1640625 L102.357422,30.4472656 C101.357422,30.0878906 100.359375,29.5214844 99.3652344,28.7441406 C98.3359375,29.3164063 97.1972656,29.6015625 95.9550781,29.6015625 C94.7128906,29.6015625 93.5585938,29.296875 92.5351563,28.6914063 C91.5117188,28.0859375 90.7246094,27.2304688 90.1699219,26.1328125 C89.6152344,25.03125 89.3398438,23.7949219 89.3398438,22.4140625 C89.3398438,21.0332031 89.6191406,19.796875 90.1757813,18.6699219 C90.7304688,17.5449219 91.5234375,16.6914063 92.5507813,16.1015625 C93.578125,15.515625 94.7265625,15.2207031 95.9960938,15.2207031 C97.265625,15.2207031 98.4355469,15.5253906 99.4648438,16.1347656 C100.494141,16.7460938 101.28125,17.5996094 101.822266,18.6972656 C102.363281,19.7910156 102.632813,21.0292969 102.632813,22.40625 C102.632813,23.5527344 102.457031,24.5800781 102.107422,25.4921875 C101.761719,26.40625 101.232422,27.1992188 100.529297,27.8769531 L100.529297,27.875 Z" id="形状" stroke="none" fill="#373435" fill-rule="nonzero"></path>
|
||||
<line x1="0" y1="165.273437" x2="167.083984" y2="165.273437" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></line>
|
||||
<path d="M64.2675781,150.136719 C64.4511719,150.486328 28.28125,150.136719 28.28125,150.136719 C28.28125,150.136719 31.0527344,94.3164063 31.5664062,91.6171875 L58.40625,83.0507813 C61.46875,96.8964844 63.8613281,107.716797 66.921875,121.5625 C68.1308594,126.810547 68.9414063,128.412109 67.578125,136.029297 L64.265625,150.136719 L64.2675781,150.136719 Z" id="路径" stroke="none" fill="#FBFDFF" fill-rule="evenodd"></path>
|
||||
<path d="M64.2675781,150.136719 C64.4511719,150.486328 28.28125,150.136719 28.28125,150.136719 C28.28125,150.136719 31.0527344,94.3164063 31.5664062,91.6171875 L58.40625,83.0507813 C61.46875,96.8964844 63.8613281,107.716797 66.921875,121.5625 C68.1308594,126.810547 68.9414063,128.412109 67.578125,136.029297 L64.265625,150.136719 L64.2675781,150.136719 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M46.6152344,148.816406 C46.5058594,149.458984 45.8808594,165.298828 45.8808594,165.298828 C45.8808594,165.298828 81.1640625,165.345703 81.1328332,165.238281 C78.3945312,155.724609 69.6699219,158.808594 64.2851562,148.808594 L46.6132812,148.816406 L46.6152344,148.816406 Z" id="路径" stroke="none" fill="#D2D3D5" fill-rule="evenodd"></path>
|
||||
<path d="M46.6152344,148.816406 C46.5058594,149.458984 45.8808594,165.298828 45.8808594,165.298828 C45.8808594,165.298828 81.1640625,165.345703 81.1328332,165.238281 C78.3945312,155.724609 69.6699219,158.808594 64.2851562,148.808594 L46.6132812,148.816406 L46.6152344,148.816406 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M28.3925781,148.792969 C28.2636719,149.435547 27.4453125,165.298828 27.4453125,165.298828 C27.4453125,165.298828 62.7148438,165.347656 62.6992239,165.238281 C61.1914063,155.458984 53.7089844,158.808594 48.6230469,148.808594 L28.3925781,148.792969 Z" id="路径" stroke="none" fill="#D2D3D5" fill-rule="evenodd"></path>
|
||||
<path d="M28.3925781,148.792969 C28.2636719,149.435547 27.4453125,165.298828 27.4453125,165.298828 C27.4453125,165.298828 62.7148438,165.347656 62.6992239,165.238281 C61.1914063,155.458984 53.7089844,158.808594 48.6230469,148.808594 L28.3925781,148.792969 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M50.8007813,45.5703125 L40.5019531,45.4667969 L40.1542969,36.9140625 L39.7792969,21.578125 C39.5,16.8300781 44.4375,13.7226562 48.5019531,17.2304687 C49.6855469,18.2519531 52.7910156,23.0117187 53.8945313,24.5742187 C56.140625,27.7519531 58.5097656,31.2949219 57.1953125,33.5371094 C56.4335938,34.8339844 54.1796875,36.1269531 50.1367188,35.3066406 L50.8007813,45.5683594 L50.8007813,45.5703125 Z" id="路径" stroke="none" fill="#FBFDFF" fill-rule="evenodd"></path>
|
||||
<path d="M50.8007813,45.5703125 L40.5019531,45.4667969 L40.1542969,36.9140625 L39.7792969,21.578125 C39.5,16.8300781 44.4375,13.7226562 48.5019531,17.2304687 C49.6855469,18.2519531 52.7910156,23.0117187 53.8945313,24.5742187 C56.140625,27.7519531 58.5097656,31.2949219 57.1953125,33.5371094 C56.4335938,34.8339844 54.1796875,36.1269531 50.1367188,35.3066406 L50.8007813,45.5683594 L50.8007813,45.5703125 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M52.0566406,28.8710937 C51.0371094,29.40625 48.5097656,30.890625 47,28.0761719" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M48.4902344,149.302734 C48.9765625,147.740234 50.9277344,137.789063 51.7167969,134.609375 C52.9550781,129.621094 53.1074219,126.101563 52.1738281,121.041016 L50.4179688,106.847656" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M50.5839844,45.6113281 C50.7519531,46.0976562 59.1601562,87.2519531 60.328133,92.4394531 C60.3457031,92.515625 31.3847656,92.5957031 31.3847656,92.5957031 C32.9589844,84.484375 35.2128906,60.9707031 37.140625,48.9238281 C37.2324219,48.3535156 37.6679687,45.6738281 40.1777344,45.6308594 C41.8886719,45.6015625 50.5839844,45.6113281 50.5839844,45.6113281 Z" id="路径" stroke="none" fill="#373435" fill-rule="evenodd"></path>
|
||||
<path d="M50.5839844,45.6113281 C50.7519531,46.0976562 59.1601562,87.2519531 60.328133,92.4394531 C60.3457031,92.515625 31.3847656,92.5957031 31.3847656,92.5957031 C32.9589844,84.484375 35.2128906,60.9707031 37.140625,48.9238281 C37.2324219,48.3535156 37.6679687,45.6738281 40.1777344,45.6308594 C41.8886719,45.6015625 50.5839844,45.6113281 50.5839844,45.6113281 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M37.4550781,58.703125 L36.8535156,47.5175781 L9.51367187,67.3066406 C6.36914062,69.8398438 3.56054687,74.0292969 6.82226562,78.8125 L13.859375,87.2773438 L19.1679687,93.7597656 L37.2871094,76.3242188 L26.0019531,68.984375 L37.453125,58.7011719 L37.4550781,58.703125 Z" id="路径" stroke="none" fill="#373435" fill-rule="evenodd"></path>
|
||||
<path d="M37.4550781,58.703125 L36.8535156,47.5175781 L9.51367187,67.3066406 C6.36914062,69.8398438 3.56054687,74.0292969 6.82226562,78.8125 L13.859375,87.2773438 L19.1679687,93.7597656 L37.2871094,76.3242188 L26.0019531,68.984375 L37.453125,58.7011719 L37.4550781,58.703125 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<polyline id="路径" stroke="#FBFDFF" stroke-width="0.4" fill="none" stroke-linecap="round" points="28.8886719 69.3144531 38.9902344 76.3574219 28.3125 86.7949219"></polyline>
|
||||
<path d="M19.6445312,94.3789063 L38.9902344,76.1269531 C41.7265625,76.6542969 41.9804687,76.6660156 44.859375,77.390625 C49.2772804,78.5019531 51.5488281,83.8652344 46.0195312,87.3007813 C45.0039062,87.9316406 34.8046875,89.5429688 34.8046875,89.5429688 C34.7597656,89.5820313 30.7675781,106.208984 30.265625,109.689453 C29.4453125,115.388672 19.9960937,115.066406 21.1914062,108.142578 C22.125,102.730469 21.6289062,97.5644531 19.6445312,94.3789063 Z" id="路径" stroke="none" fill="#FBFDFF" fill-rule="evenodd"></path>
|
||||
<path d="M19.6445312,94.3789063 L38.9902344,76.1269531 C41.7265625,76.6542969 41.9804687,76.6660156 44.859375,77.390625 C49.2772804,78.5019531 51.5488281,83.8652344 46.0195312,87.3007813 C45.0039062,87.9316406 34.8046875,89.5429688 34.8046875,89.5429688 C34.7597656,89.5820313 30.7675781,106.208984 30.265625,109.689453 C29.4453125,115.388672 19.9960937,115.066406 21.1914062,108.142578 C22.125,102.730469 21.6289062,97.5644531 19.6445312,94.3789063 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M51.9394531,63.6679688 L71.3417969,45.3183594 C68.3144531,41.2519531 66.6367187,39.8847656 68.1132812,36.5507813 C69.2910156,33.890625 71.5976562,32.0273438 70.5839844,29.0839844 C68.9160156,24.2363281 61.0136719,25.4648438 57.4121094,33.0058594 C56.5527344,34.8027344 55.5859375,35.2109375 52.5371094,34.5507813 C47.9570312,33.5585938 40.7890625,30.6425781 38.0585937,29.8535156 C35.3535156,29.0703125 33.4824219,29.5566406 32.4140625,30.828125 C31.5136719,31.8984375 31.1230469,33.5507813 31.8886719,35.2636719 C32.9277344,37.5957031 35.7421875,38.7246094 35.7421875,38.7246094 C35.5839844,38.7832031 34.8984375,38.5917969 34.2792969,38.6757813 C32.640625,38.8984375 31.9023437,40.171875 31.703125,41.5 C31.5664062,42.4140625 31.7597656,43.3808594 32.1503906,44.296875 C33.6191406,47.7460938 36.6035156,48.8261719 39.703125,50.0898438 C39.8066406,50.1308594 39.59375,50.28125 39.5449219,50.3769531 C39.1835937,51.0976563 39.0546875,51.8632813 39.1328125,52.6542969 C39.5058594,56.359375 44.4882812,60.6328125 51.9414062,63.6699219 L51.9394531,63.6679688 Z" id="路径" stroke="none" fill="#FBFDFF" fill-rule="evenodd"></path>
|
||||
<path d="M51.9394531,63.6679688 L71.3417969,45.3183594 C68.3144531,41.2519531 66.6367187,39.8847656 68.1132812,36.5507813 C69.2910156,33.890625 71.5976562,32.0273438 70.5839844,29.0839844 C68.9160156,24.2363281 61.0136719,25.4648438 57.4121094,33.0058594 C56.5527344,34.8027344 55.5859375,35.2109375 52.5371094,34.5507813 C47.9570312,33.5585938 40.7890625,30.6425781 38.0585937,29.8535156 C35.3535156,29.0703125 33.4824219,29.5566406 32.4140625,30.828125 C31.5136719,31.8984375 31.1230469,33.5507813 31.8886719,35.2636719 C32.9277344,37.5957031 35.7421875,38.7246094 35.7421875,38.7246094 C35.5839844,38.7832031 34.8984375,38.5917969 34.2792969,38.6757813 C32.640625,38.8984375 31.9023437,40.171875 31.703125,41.5 C31.5664062,42.4140625 31.7597656,43.3808594 32.1503906,44.296875 C33.6191406,47.7460938 36.6035156,48.8261719 39.703125,50.0898438 C39.8066406,50.1308594 39.59375,50.28125 39.5449219,50.3769531 C39.1835937,51.0976563 39.0546875,51.8632813 39.1328125,52.6542969 C39.5058594,56.359375 44.4882812,60.6328125 51.9414062,63.6699219 L51.9394531,63.6679688 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M35.296875,38.515625 C36.4707031,39.2929687 44.9765625,42.6777344 47.8886719,43.2128906" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M39.3808594,49.9765625 C41.6855469,50.7910156 44.2773438,51.59375 44.7246094,51.6367188" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M51.9394531,63.6679687 L71.3417969,45.3183594 L85.4863281,61.5390625 C95.4433594,72.8535156 87.4316406,80.890625 75.5273438,76.1152344 L51.9414063,63.6679687 L51.9394531,63.6679687 Z" id="路径" stroke="none" fill="#373435" fill-rule="evenodd"></path>
|
||||
<path d="M51.9394531,63.6679687 L71.3417969,45.3183594 L85.4863281,61.5390625 C95.4433594,72.8535156 87.4316406,80.890625 75.5273438,76.1152344 L51.9414063,63.6679687 L51.9394531,63.6679687 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M142.570313,58.0371094 L114.582031,58.0371094 C105.259766,58.0371094 97.6328125,65.6640625 97.6328125,74.9863281 C97.6328125,84.3085938 105.259766,91.9355469 114.582031,91.9355469 L138.464844,91.9355469 C140.919922,95.0390625 143.890625,96.875 148.113281,96.875 C150.568359,96.875 150.214844,95.4453125 149.230469,94.921875 C146.873047,93.6679688 146.863281,91.5605469 148.123047,90.9941406 C154.740234,88.6816406 159.519531,82.3652344 159.519531,74.9863281 C159.519531,65.6640625 151.892578,58.0371094 142.570313,58.0371094 Z" id="路径" stroke="none" fill="#FBFDFF" fill-rule="evenodd"></path>
|
||||
<path d="M142.570313,58.0371094 L114.582031,58.0371094 C105.259766,58.0371094 97.6328125,65.6640625 97.6328125,74.9863281 C97.6328125,84.3085938 105.259766,91.9355469 114.582031,91.9355469 L138.464844,91.9355469 C140.919922,95.0390625 143.890625,96.875 148.113281,96.875 C150.568359,96.875 150.214844,95.4453125 149.230469,94.921875 C146.873047,93.6679688 146.863281,91.5605469 148.123047,90.9941406 C154.740234,88.6816406 159.519531,82.3652344 159.519531,74.9863281 C159.519531,65.6640625 151.892578,58.0371094 142.570313,58.0371094 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M85.5371094,103.792969 L139.652344,103.792969 C151.527344,103.792969 161.242188,113.507813 161.242188,125.382813 C161.242188,137.257812 151.527344,146.972656 139.652344,146.972656 L90.7675781,146.972656 C87.640625,150.925781 83.8554688,153.265625 78.4765625,153.265625 C75.3496094,153.265625 75.8007813,151.445312 77.0546875,150.777344 C80.0585938,149.179687 80.0703125,146.496094 78.4667969,145.775391 C70.0390625,142.830078 63.9492188,134.785156 63.9492188,125.384766 C63.9492188,113.509766 73.6640625,103.794922 85.5390625,103.794922 L85.5371094,103.792969 Z" id="路径" stroke="none" fill="#D2D3D5" fill-rule="evenodd"></path>
|
||||
<path d="M85.5371094,103.792969 L139.652344,103.792969 C151.527344,103.792969 161.242188,113.507813 161.242188,125.382813 C161.242188,137.257812 151.527344,146.972656 139.652344,146.972656 L90.7675781,146.972656 C87.640625,150.925781 83.8554688,153.265625 78.4765625,153.265625 C75.3496094,153.265625 75.8007813,151.445312 77.0546875,150.777344 C80.0585938,149.179687 80.0703125,146.496094 78.4667969,145.775391 C70.0390625,142.830078 63.9492188,134.785156 63.9492188,125.384766 C63.9492188,113.509766 73.6640625,103.794922 85.5390625,103.794922 L85.5371094,103.792969 Z" id="路径" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M113.896484,75.1796875 L118.638672,75.1796875 L117.1875,71.3222656 C116.75,70.1503906 116.419922,69.1816406 116.189453,68.4160156 C115.998047,69.3222656 115.742188,70.2128906 115.421875,71.09375 L113.896484,75.1777344 L113.896484,75.1796875 Z M109.892578,80.8925781 L115.230469,66.9785156 L117.253906,66.9785156 L122.917969,80.8925781 L120.822266,80.8925781 L119.212891,76.6757813 L113.353516,76.6757813 L111.84375,80.8925781 L109.890625,80.8925781 L109.892578,80.8925781 Z" id="形状" stroke="none" fill="#373435" fill-rule="nonzero"></path>
|
||||
<path d="M85.1503906,128.585938 C86.2089844,128.884766 87.0839844,129.328125 87.7714844,129.914062 C88.8496094,128.929688 89.390625,127.449219 89.390625,125.472656 C89.390625,124.349609 89.1992188,123.367187 88.8164063,122.529297 C88.4335938,121.6875 87.8769531,121.037109 87.1425781,120.572266 C86.4082031,120.109375 85.5820313,119.875 84.6679688,119.875 C83.2988281,119.875 82.1601563,120.34375 81.2617188,121.28125 C80.3574219,122.220703 79.9082031,123.619141 79.9082031,125.482422 C79.9082031,127.345703 80.3554688,128.671875 81.2460938,129.640625 C82.140625,130.605469 83.2792969,131.087891 84.6699219,131.087891 C85.3242188,131.087891 85.9433594,130.964844 86.5253906,130.71875 C85.9492188,130.345703 85.34375,130.080078 84.7089844,129.921875 L85.1523438,128.583984 L85.1503906,128.585938 Z M89.1914063,130.9375 C90.0488281,131.527344 90.8398438,131.955078 91.5644531,132.226562 L91.0175781,133.509766 C90.0175781,133.150391 89.0195313,132.583984 88.0253906,131.806641 C86.9960938,132.378906 85.8574219,132.664062 84.6152344,132.664062 C83.3730469,132.664062 82.21875,132.359375 81.1953125,131.753906 C80.171875,131.148438 79.3847656,130.292969 78.8300781,129.195312 C78.2753906,128.09375 78,126.857422 78,125.476562 C78,124.095703 78.2792969,122.859375 78.8359375,121.732422 C79.390625,120.609375 80.1835938,119.753906 81.2109375,119.164062 C82.2382813,118.578125 83.3867188,118.283203 84.65625,118.283203 C85.9257813,118.283203 87.0957031,118.587891 88.125,119.197266 C89.1542969,119.808594 89.9414063,120.662109 90.4824219,121.759766 C91.0234375,122.853516 91.2929688,124.091797 91.2929688,125.46875 C91.2929688,126.615234 91.1171875,127.642578 90.7675781,128.554688 C90.421875,129.46875 89.8925781,130.261719 89.1894531,130.939453 L89.1914063,130.9375 Z" id="形状" stroke="none" fill="#373435" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 19 KiB |
BIN
web/src/assets/images/application/debuggingEmpty.png
Normal file
|
After Width: | Height: | Size: 184 KiB |
@@ -1,54 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="200px" height="200px" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>分类</title>
|
||||
<defs>
|
||||
<polygon id="path-1" points="0 0 200 0 200 200 0 200"></polygon>
|
||||
</defs>
|
||||
<g id="V1.0版" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="应用管理-编排-默认状态" transform="translate(-980, -330)">
|
||||
<g id="分类" transform="translate(980, 330)">
|
||||
<mask id="mask-2" fill="white">
|
||||
<use xlink:href="#path-1"></use>
|
||||
</mask>
|
||||
<g id="路径"></g>
|
||||
<g id="编组" mask="url(#mask-2)">
|
||||
<g transform="translate(18.7578, 31.6328)" id="路径">
|
||||
<line x1="167.083984" y1="150.638672" x2="0" y2="150.638672" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></line>
|
||||
<path d="M88.1347656,108.53125 C90.6191406,128.699219 76.28125,147.064453 56.1132813,149.546875 C35.9433594,152.03125 17.5800781,137.693359 15.0957031,117.525391 C12.6132813,97.3554688 26.9492188,78.9921875 47.1191406,76.5097656 C67.2871094,74.0253906 85.6503906,88.3632813 88.1347656,108.53125 Z" stroke="none" fill="#373435" fill-rule="nonzero"></path>
|
||||
<path d="M88.1347656,108.53125 C90.6191406,128.699219 76.28125,147.064453 56.1132813,149.546875 C35.9433594,152.03125 17.5800781,137.693359 15.0957031,117.525391 C12.6132813,97.3554688 26.9492188,78.9921875 47.1191406,76.5097656 C67.2871094,74.0253906 85.6503906,88.3632813 88.1347656,108.53125 Z" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<polygon stroke="none" fill="#D2D3D5" fill-rule="nonzero" points="87.2597656 77.6855469 160.005859 77.6855469 160.005859 150.431641 87.2597656 150.431641"></polygon>
|
||||
<polygon stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round" points="87.2597656 77.6855469 160.005859 77.6855469 160.005859 150.431641 87.2597656 150.431641"></polygon>
|
||||
<polygon stroke="none" fill="#373435" fill-rule="evenodd" points="123.40625 77.15625 132.476562 66.4941406 146.082031 69.7890625 147.154297 55.8320313 160.097656 50.5 152.759766 38.578125 160.097656 26.65625 147.154297 21.3261719 146.082031 7.3671875 132.476562 10.6621094 123.40625 0 114.335938 10.6621094 100.730469 7.3671875 99.6601562 21.3261719 86.7167969 26.65625 94.0546875 38.578125 86.7167969 50.5 99.6601562 55.8320313 100.730469 69.7890625 114.335938 66.4941406"></polygon>
|
||||
<polygon stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round" points="123.40625 77.15625 132.476562 66.4941406 146.082031 69.7890625 147.154297 55.8320313 160.097656 50.5 152.759766 38.578125 160.097656 26.65625 147.154297 21.3261719 146.082031 7.3671875 132.476562 10.6621094 123.40625 0 114.335938 10.6621094 100.730469 7.3671875 99.6601562 21.3261719 86.7167969 26.65625 94.0546875 38.578125 86.7167969 50.5 99.6601562 55.8320313 100.730469 69.7890625 114.335938 66.4941406"></polygon>
|
||||
<path d="M21.8027344,123.046875 C21.6835938,123.396484 37.2871094,133.470703 37.4628906,133.470703 C37.4902344,133.462891 43.1816406,130.501953 46.6972656,128.455078 C50.6386719,126.160156 52.5058594,124.615234 53.5761719,121.802734 C55.5039063,116.736328 55.671875,116.490234 55.5683594,116.490234 C55.359375,116.490234 62.8808594,135.707031 62.8808594,135.707031 L83.1367188,135.707031 L69.2148438,80.7148438 L39.5996094,78.2421875 C37.9960938,86.546875 35.9785156,96.4453125 34.375,104.748047 C33.8085938,108.234375 33.4238281,110.140625 31.0351563,112.927734 L21.8046875,123.046875 L21.8027344,123.046875 Z" stroke="none" fill="#FBFDFF" fill-rule="evenodd"></path>
|
||||
<path d="M21.8027344,123.046875 C21.6835938,123.396484 37.2871094,133.470703 37.4628906,133.470703 C37.4902344,133.462891 43.1816406,130.501953 46.6972656,128.455078 C50.6386719,126.160156 52.5058594,124.615234 53.5761719,121.802734 C55.5039063,116.736328 55.671875,116.490234 55.5683594,116.490234 C55.359375,116.490234 62.8808594,135.707031 62.8808594,135.707031 L83.1367188,135.707031 L69.2148438,80.7148438 L39.5996094,78.2421875 C37.9960938,86.546875 35.9785156,96.4453125 34.375,104.748047 C33.8085938,108.234375 33.4238281,110.140625 31.0351563,112.927734 L21.8046875,123.046875 L21.8027344,123.046875 Z" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M21.8027344,123.046875 C21.2949219,123.441406 9.56054688,135.255859 9.56054688,135.255859 C9.56054688,135.255859 25.3398438,145.332031 35.0644531,150.638672 C35.0644531,150.638672 46.0332031,150.671875 46.0332031,150.638672 C45.9414063,144.558594 39.5195312,142.71875 39.1972656,141.865234 C39.1972656,141.865234 38.1914062,135.769531 38.1191406,133.605469 L21.8027344,123.044922 L21.8027344,123.046875 Z" stroke="none" fill="#D2D3D5" fill-rule="evenodd"></path>
|
||||
<path d="M21.8027344,123.046875 C21.2949219,123.441406 9.56054688,135.255859 9.56054688,135.255859 C9.56054688,135.255859 25.3398438,145.332031 35.0644531,150.638672 C35.0644531,150.638672 46.0332031,150.671875 46.0332031,150.638672 C45.9414063,144.558594 39.5195312,142.71875 39.1972656,141.865234 C39.1972656,141.865234 38.1914062,135.769531 38.1191406,133.605469 L21.8027344,123.044922 L21.8027344,123.046875 Z" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M62.7167969,134.289063 C62.5859375,134.935547 62.1875,150.652344 62.1875,150.652344 C62.1875,150.652344 99.4003906,150.701172 99.3847705,150.591797 C97.9082031,140.748047 87.8945313,144.371094 82.8398438,134.304688 L62.7167969,134.289063 Z" stroke="none" fill="#D2D3D5" fill-rule="evenodd"></path>
|
||||
<path d="M62.7167969,134.289063 C62.5859375,134.935547 62.1875,150.652344 62.1875,150.652344 C62.1875,150.652344 99.4003906,150.701172 99.3847705,150.591797 C97.9082031,140.748047 87.8945313,144.371094 82.8398438,134.304688 L62.7167969,134.289063 Z" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M56.8164062,36.6992188 L58.2890625,27.859375 C62.2597656,29.8671875 64.2421875,29.0976563 65.2382812,28.1230469 C66.9589844,26.4394531 65.1523438,22.4101563 63.4101562,18.7578125 C62.5527344,16.9609375 60.2070313,11.5722656 59.1777344,10.2578125 C55.6425781,5.74023438 50.0917969,7.1171875 49.5644531,11.625 L47.328125,26.0273438 L46.1777344,33.203125 L56.8144531,36.6992188 L56.8164062,36.6992188 Z" stroke="none" fill="#FBFDFF" fill-rule="evenodd"></path>
|
||||
<path d="M56.8164062,36.6992188 L58.2890625,27.859375 C62.2597656,29.8671875 64.2421875,29.0976563 65.2382812,28.1230469 C66.9589844,26.4394531 65.1523438,22.4101563 63.4101562,18.7578125 C62.5527344,16.9609375 60.2070313,11.5722656 59.1777344,10.2578125 C55.6425781,5.74023438 50.0917969,7.1171875 49.5644531,11.625 L47.328125,26.0273438 L46.1777344,33.203125 L56.8144531,36.6992188 L56.8164062,36.6992188 Z" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M55.6601563,116.699219 L52.0664063,104.957031 C49.8222656,103.294922 46.796875,100.296875 46.7402344,94.9160156" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<line x1="58.2890625" y1="27.859375" x2="59.0292969" y2="24.0292969" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></line>
|
||||
<path d="M46.2714844,32.3886719 C46.1328093,32.8222656 38.9941406,74.3574219 38.1328093,79.2109375 C38.1210938,79.28125 70.2597656,84.3652344 70.2597656,84.3652344 C70.2597656,84.3652344 60.2988281,49.5996094 58.03125,39.9023437 C57.8886719,39.2929688 57.3027344,36.4199219 54.7734375,35.4921875 C53.0488281,34.859375 46.2714844,32.3867188 46.2714844,32.3867188 L46.2714844,32.3886719 Z" stroke="none" fill="#373435" fill-rule="evenodd"></path>
|
||||
<path d="M46.2714844,32.3886719 C46.1328093,32.8222656 38.9941406,74.3574219 38.1328093,79.2109375 C38.1210938,79.28125 70.2597656,84.3652344 70.2597656,84.3652344 C70.2597656,84.3652344 60.2988281,49.5996094 58.03125,39.9023437 C57.8886719,39.2929688 57.3027344,36.4199219 54.7734375,35.4921875 C53.0488281,34.859375 46.2714844,32.3867188 46.2714844,32.3867188 L46.2714844,32.3886719 Z" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M39.4492187,142.140625 C38.4511719,141.728516 36.3554688,141.150391 34.6328125,141.925781" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<polygon stroke="none" fill="#373435" fill-rule="evenodd" points="38.4414062 80.7382812 46.4101562 32.7421875 24.3554688 78.0175781"></polygon>
|
||||
<polygon stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round" points="38.4414062 80.7382812 46.4101562 32.7421875 24.3554688 78.0175781"></polygon>
|
||||
<line x1="39.2304688" y1="80.1484375" x2="45.2734375" y2="42.9160156" stroke="#FEFEFE" stroke-width="0.4" fill="none" stroke-linecap="round"></line>
|
||||
<path d="M55.15625,41.6230469 L55.6113281,36.2148438 L71.5429688,44.9199219 C74.5117188,45.9101563 75.609375,46.0585938 80.7011719,42.8476562 C83.7207031,40.9433594 91.7128906,34.4335938 92.59375,34.1289062 L107.111328,57.0078125 C106.539063,56.96875 101.650391,58.3710938 98.8789062,59.2949219 C78.3066406,66.1523438 78.2167969,64.6269531 71.6757813,58.0175781 L55.15625,41.6210938 L55.15625,41.6230469 Z" stroke="none" fill="#373435" fill-rule="evenodd"></path>
|
||||
<path d="M55.15625,41.6230469 L55.6113281,36.2148438 L71.5429688,44.9199219 C74.5117188,45.9101563 75.609375,46.0585938 80.7011719,42.8476562 C83.7207031,40.9433594 91.7128906,34.4335938 92.59375,34.1289062 L107.111328,57.0078125 C106.539063,56.96875 101.650391,58.3710938 98.8789062,59.2949219 C78.3066406,66.1523438 78.2167969,64.6269531 71.6757813,58.0175781 L55.15625,41.6210938 L55.15625,41.6230469 Z" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M104.138672,57.6386719 L90.4296875,35.5273437 C93.1992188,33.4316406 94.1230469,31.5273437 96.1210938,27.8867187 C96.890625,26.484375 97.3457031,24.0859375 99.3808594,22.5996094 C101.798828,20.8359375 106.550781,21.96875 107.71875,25.203125 C107.941406,25.8183594 114.216797,22.4570312 119.806641,22.0644531 C122.621094,21.8671875 124.285156,22.7382812 124.958984,24.2070312 C125.527344,25.4472656 125.443359,27.1464844 124.234375,28.6660156 C122.589844,30.7324219 114.632812,34.4589844 114.632812,34.4589844 C117.207031,33.7871094 120.224609,33.9433594 121.136719,36.7460937 C121.822266,38.8535156 120.599609,41.4394531 119.566406,42.6171875 C119.498047,42.6933594 120.857422,43.2558594 121.460937,44.71875 C121.964844,45.9394531 121.90625,47.9160156 120.404297,49.5449219 C118.365234,51.7578125 111.826172,55.0839844 104.136719,57.640625 L104.138672,57.6386719 Z" stroke="none" fill="#FBFDFF" fill-rule="evenodd"></path>
|
||||
<path d="M104.138672,57.6386719 L90.4296875,35.5273437 C93.1992188,33.4316406 94.1230469,31.5273437 96.1210938,27.8867187 C96.890625,26.484375 97.3457031,24.0859375 99.3808594,22.5996094 C101.798828,20.8359375 106.550781,21.96875 107.71875,25.203125 C107.941406,25.8183594 114.216797,22.4570312 119.806641,22.0644531 C122.621094,21.8671875 124.285156,22.7382812 124.958984,24.2070312 C125.527344,25.4472656 125.443359,27.1464844 124.234375,28.6660156 C122.589844,30.7324219 114.632812,34.4589844 114.632812,34.4589844 C117.207031,33.7871094 120.224609,33.9433594 121.136719,36.7460937 C121.822266,38.8535156 120.599609,41.4394531 119.566406,42.6171875 C119.498047,42.6933594 120.857422,43.2558594 121.460937,44.71875 C121.964844,45.9394531 121.90625,47.9160156 120.404297,49.5449219 C118.365234,51.7578125 111.826172,55.0839844 104.136719,57.640625 L104.138672,57.6386719 Z" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M119.796875,42.3847656 C119.425781,43.0214844 117.113281,44.1894531 114.943359,44.7871094" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<line x1="116.09375" y1="33.7910156" x2="111.978516" y2="35.734375" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></line>
|
||||
<line x1="109.123047" y1="24.8808594" x2="104.021484" y2="27.2324219" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></line>
|
||||
<path d="M39.0039063,80.390625 L24.3554688,78.0175781 C19.8808594,83.8164062 15.0214844,98.2949219 23.3339844,102.654297 C25.0117188,103.533203 29.2890625,102.554687 29.1640625,99.40625 C29.1445313,98.8964844 30.7871094,103.091797 34.8613281,102.246094 L39.0039063,80.3925781 L39.0039063,80.390625 Z" stroke="none" fill="#FBFDFF" fill-rule="evenodd"></path>
|
||||
<path d="M39.0039063,80.390625 L24.3554688,78.0175781 C19.8808594,83.8164062 15.0214844,98.2949219 23.3339844,102.654297 C25.0117188,103.533203 29.2890625,102.554687 29.1640625,99.40625 C29.1445313,98.8964844 30.7871094,103.091797 34.8613281,102.246094 L39.0039063,80.3925781 L39.0039063,80.390625 Z" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
<path d="M29.1640625,99.40625 C28.2070312,97.1621094 27.1132812,94.8984375 27.5976562,91.6601562" stroke="#373435" stroke-width="0.4" fill="none" stroke-linecap="round"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 14 KiB |
BIN
web/src/assets/images/conversation/analysisEmpty.png
Normal file
|
After Width: | Height: | Size: 189 KiB |
BIN
web/src/assets/images/empty/404.png
Normal file
|
After Width: | Height: | Size: 118 KiB |
@@ -1,47 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="200px" height="200px" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>404</title>
|
||||
<g id="V1.0版" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="红熊空间-一般空状态" transform="translate(-119, -106)">
|
||||
<g id="404" transform="translate(119, 106)">
|
||||
<g id="编组" transform="translate(20, 8)">
|
||||
<path d="M80.100062,0 L80.100062,0 C118.465873,0 149.855401,31.4054758 149.855401,69.7907779 L149.855401,183.049219 L10.3447228,183.049219 L10.3447228,69.7926492 C10.3447228,31.4073471 41.7342513,0.0018712671 80.100062,0.0018712671 L80.100062,0 Z" id="路径" fill="#D2D3D5"></path>
|
||||
<path d="M80.100062,0 L80.100062,0 C118.465873,0 149.855401,31.4054758 149.855401,69.7907779 L149.855401,183.049219 L10.3447228,183.049219 L10.3447228,69.7926492 C10.3447228,31.4073471 41.7342513,0.0018712671 80.100062,0.0018712671 L80.100062,0 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<polygon id="路径" fill="#FBFDFF" points="51.452418 80.1819242 65.8613394 93.561484 43.2791331 183.051091 10.3447228 183.051091 10.3447228 96.5723527"></polygon>
|
||||
<polygon id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round" points="51.452418 80.1819242 65.8613394 93.561484 43.2791331 183.051091 10.3447228 183.051091 10.3447228 96.5723527"></polygon>
|
||||
<path d="M87.117491,51.6245169 C87.1380645,51.6376158 89.6442891,52.2888167 91.7296924,55.5616629 C91.8643553,55.7712448 91.3425369,56.1829236 91.1891709,56.3494663 L67.4436275,82.8391235 L68.7603306,90.0322742 L65.8613394,93.561484 L51.452418,80.1819242 L54.4019077,77.0381954 L62.3432733,78.6250299 L87.1156207,51.6245169 L87.117491,51.6245169 Z" id="路径" fill="#373435"></path>
|
||||
<path d="M87.117491,51.6245169 C87.1380645,51.6376158 89.6442891,52.2888167 91.7296924,55.5616629 C91.8643553,55.7712448 91.3425369,56.1829236 91.1891709,56.3494663 L67.4436275,82.8391235 L68.7603306,90.0322742 L65.8613394,93.561484 L51.452418,80.1819242 L54.4019077,77.0381954 L62.3432733,78.6250299 L87.1156207,51.6245169 L87.117491,51.6245169 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<line x1="0" y1="183.051091" x2="160" y2="183.051091" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></line>
|
||||
<path d="M143.756298,159.576045 C143.874128,159.911002 129.884157,170.863528 129.717699,170.863528 C129.685904,170.854172 121.69965,164.935354 116.831216,161.226502 C109.591219,155.708136 108.055689,151.028097 106.639859,146.559511 C106.580009,146.368642 93.7889114,168.65169 93.7533753,168.565612 L78.4074252,160.66138 L94.9485078,112.246086 L121.454639,110.434699 L130.151613,145.416167 L143.760038,159.577916 L143.756298,159.576045 Z" id="路径" fill="#FBFDFF"></path>
|
||||
<path d="M143.756298,159.576045 C143.874128,159.911002 129.884157,170.863528 129.717699,170.863528 C129.685904,170.854172 121.69965,164.935354 116.831216,161.226502 C109.591219,155.708136 108.055689,151.028097 106.639859,146.559511 C106.580009,146.368642 93.7889114,168.65169 93.7533753,168.565612 L78.4074252,160.66138 L94.9485078,112.246086 L121.454639,110.434699 L130.151613,145.416167 L143.760038,159.577916 L143.756298,159.576045 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M140.124142,155.878421 C140.69833,156.218992 154.044911,168.921153 154.044911,168.921153 C154.044911,168.921153 139.136615,181.726234 137.404702,182.875192 C137.404702,182.875192 123.81676,182.996824 123.81676,182.955656 C123.792535,177.603832 128.724561,175.992671 129.594258,175.457489 C129.594258,175.457489 128.088653,171.295791 127.370451,168.984776 L140.124142,155.878421 Z" id="路径" fill="#D2D3D5"></path>
|
||||
<path d="M140.124142,155.878421 C140.69833,156.218992 154.044911,168.921153 154.044911,168.921153 C154.044911,168.921153 139.136615,181.726234 137.404702,182.875192 C137.404702,182.875192 123.81676,182.996824 123.81676,182.955656 C123.792535,177.603832 128.724561,175.992671 129.594258,175.457489 C129.594258,175.457489 128.088653,171.295791 127.370451,168.984776 L140.124142,155.878421 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M94.1910295,168.125864 C94.01709,168.698472 87.1511567,182.747945 87.1511567,182.747945 C87.1511567,182.747945 56.492922,166.892699 56.5545494,166.815977 C62.2722012,159.693935 69.8694285,165.872859 78.8450793,160.221632 L94.1910295,168.125864 Z" id="路径" fill="#D2D3D5"></path>
|
||||
<path d="M94.1910295,168.125864 C94.01709,168.698472 87.1511567,182.747945 87.1511567,182.747945 C87.1511567,182.747945 56.492922,166.892699 56.5545494,166.815977 C62.2722012,159.693935 69.8694285,165.872859 78.8450793,160.221632 L94.1910295,168.125864 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<line x1="107.674144" y1="149.575993" x2="101.692871" y2="132.163853" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></line>
|
||||
<path d="M129.592388,175.457489 C131.694624,175.167442 132.048114,175.1637 134.079278,175.1637" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M108.525138,68.6324636 L118.387319,68.5332864 L118.720236,60.3390078 L119.079337,45.6476898 C119.346792,41.0986394 114.618631,38.1214535 110.726501,41.4822492 C109.593089,42.4609219 106.621156,47.0211998 105.562556,48.5182135 C103.411692,51.5627651 101.142997,54.9572436 102.401721,57.1054582 C103.131144,58.3479796 105.28949,59.5867584 109.161046,58.8008262 L108.525138,68.6324636 Z" id="路径" fill="#FBFDFF"></path>
|
||||
<path d="M108.525138,68.6324636 L118.387319,68.5332864 L118.720236,60.3390078 L119.079337,45.6476898 C119.346792,41.0986394 114.618631,38.1214535 110.726501,41.4822492 C109.593089,42.4609219 106.621156,47.0211998 105.562556,48.5182135 C103.411692,51.5627651 101.142997,54.9572436 102.401721,57.1054582 C103.131144,58.3479796 105.28949,59.5867584 109.161046,58.8008262 L108.525138,68.6324636 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M107.322524,52.6312586 C108.29883,53.1439858 110.71902,54.5661488 112.164775,51.8696529" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M119.053152,68.1646468 C119.146668,68.6287211 121.57621,107.975854 121.98581,112.934712 C121.99142,113.00582 94.7465136,113.082542 94.7465136,113.082542 C94.9559891,112.438827 103.791366,75.2080962 104.879891,71.3289595 C105.033257,70.7825495 105.828141,68.2226561 108.229628,68.1814882 C109.866155,68.1534192 119.053152,68.1627756 119.053152,68.1627756 L119.053152,68.1646468 Z" id="路径" fill="#373435"></path>
|
||||
<path d="M119.053152,68.1646468 C119.146668,68.6287211 121.57621,107.975854 121.98581,112.934712 C121.99142,113.00582 94.7465136,113.082542 94.7465136,113.082542 C94.9559891,112.438827 103.791366,75.2080962 104.879891,71.3289595 C105.033257,70.7825495 105.828141,68.2226561 108.229628,68.1814882 C109.866155,68.1534192 119.053152,68.1627756 119.053152,68.1627756 L119.053152,68.1646468 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M72.7478462,81.2017647 L96.336283,70.9771613 C95.0233205,67.913897 94.5613522,66.3888143 95.4404012,59.3472362 C95.7265597,57.0605478 96.0950121,51.3082727 91.3705916,50.8011594 C90.8169778,50.7412788 89.5133669,51.085592 89.5133669,51.085592 C88.817609,49.4931437 86.5414334,46.9051813 83.7228658,47.5582535 C78.2278747,48.8325864 79.7615346,55.0189954 79.6250015,55.002154 C74.5863677,52.5957045 71.2609443,58.3704348 73.3182929,62.9512967 C70.1817714,62.3188084 66.620688,65.3334197 68.8744199,73.4172936 C69.3008522,74.9479901 72.7478462,81.203636 72.7478462,81.203636 L72.7478462,81.2017647 Z" id="路径" fill="#FBFDFF"></path>
|
||||
<path d="M72.7478462,81.2017647 L96.336283,70.9771613 C95.0233205,67.913897 94.5613522,66.3888143 95.4404012,59.3472362 C95.7265597,57.0605478 96.0950121,51.3082727 91.3705916,50.8011594 C90.8169778,50.7412788 89.5133669,51.085592 89.5133669,51.085592 C88.817609,49.4931437 86.5414334,46.9051813 83.7228658,47.5582535 C78.2278747,48.8325864 79.7615346,55.0189954 79.6250015,55.002154 C74.5863677,52.5957045 71.2609443,58.3704348 73.3182929,62.9512967 C70.1817714,62.3188084 66.620688,65.3334197 68.8744199,73.4172936 C69.3008522,74.9479901 72.7478462,81.203636 72.7478462,81.203636 L72.7478462,81.2017647 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M149.702035,102.749405 L127.750126,110.648024 C128.462716,113.286511 127.041276,115.099768 126.497013,119.82846 C125.761979,126.201996 130.228296,129.297072 133.394742,128.005898 C135.078027,127.319143 135.255707,127.530596 136.005704,129.179182 C138.068664,133.711391 144.743825,132.292971 143.836721,126.750277 C143.470139,124.515984 143.862906,124.821001 144.457667,126.31053 C146.455165,131.308684 154.873461,129.033223 152.277462,122.556768 C149.889067,116.602396 151.013127,120.969933 152.898407,122.61852 C156.206997,125.51337 162.036775,121.203842 158.099758,115.369231 C157.370334,114.287638 149.702035,102.747534 149.702035,102.747534 L149.702035,102.749405 Z" id="路径" fill="#FBFDFF"></path>
|
||||
<path d="M149.702035,102.749405 L127.750126,110.648024 C128.462716,113.286511 127.041276,115.099768 126.497013,119.82846 C125.761979,126.201996 130.228296,129.297072 133.394742,128.005898 C135.078027,127.319143 135.255707,127.530596 136.005704,129.179182 C138.068664,133.711391 144.743825,132.292971 143.836721,126.750277 C143.470139,124.515984 143.862906,124.821001 144.457667,126.31053 C146.455165,131.308684 154.873461,129.033223 152.277462,122.556768 C149.889067,116.602396 151.013127,120.969933 152.898407,122.61852 C156.206997,125.51337 162.036775,121.203842 158.099758,115.369231 C157.370334,114.287638 149.702035,102.747534 149.702035,102.747534 L149.702035,102.749405 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M134.316808,122.798161 C133.5612,116.525674 140.030626,114.811593 142.162788,120.22704 C142.684606,121.553769 143.434603,123.612162 143.638468,125.02684" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M141.021894,118.357644 C140.52252,114.888315 146.694566,111.858734 149.363508,116.847532 C149.445802,117.000976 151.624721,120.889469 151.624721,120.889469" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M148.821116,116.001719 C147.988825,112.676477 151.858511,109.740459 154.976329,111.60237 C155.703882,112.036504 157.020585,113.846019 157.615346,114.603883" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M115.987703,75.4981426 L115.776357,70.3689995 L102.841245,85.2006626 L96.4634645,71.0688534 L72.545852,80.8986195 C72.5739067,80.8873919 86.9042748,105.505782 88.9485312,107.886034 C90.9591219,110.226989 97.2639602,111.85312 100.548237,105.460871 C103.600594,99.523341 110.167276,89.2033029 112.946567,83.5707889 C115.252668,78.8982349 115.697804,76.0651365 115.985832,75.4981426 L115.987703,75.4981426 Z" id="路径" fill="#373435"></path>
|
||||
<path d="M115.987703,75.4981426 L115.776357,70.3689995 L102.841245,85.2006626 L96.4634645,71.0688534 L72.545852,80.8986195 C72.5739067,80.8873919 86.9042748,105.505782 88.9485312,107.886034 C90.9591219,110.226989 97.2639602,111.85312 100.548237,105.460871 C103.600594,99.523341 110.167276,89.2033029 112.946567,83.5707889 C115.252668,78.8982349 115.697804,76.0651365 115.985832,75.4981426 L115.987703,75.4981426 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M92.5788163,110.924971 C95.2084819,111.418986 98.4516114,110.561946 100.51083,106.555563 C103.563187,100.616161 110.12987,90.2979941 112.909161,84.6654802" id="路径" stroke="#D2D3D5" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M118.832455,68.1646468 L132.773797,79.9349169 C137.879762,83.8701916 138.001333,84.076031 141.424013,89.5382597 L149.700165,102.749405 L127.856734,111.405887 L124.581809,91.9709069 L118.318118,74.7982887 L118.832455,68.1627756 L118.832455,68.1646468 Z" id="路径" fill="#373435"></path>
|
||||
<path d="M118.832455,68.1646468 L132.773797,79.9349169 C137.879762,83.8701916 138.001333,84.076031 141.424013,89.5382597 L149.700165,102.749405 L127.856734,111.405887 L124.581809,91.9709069 L118.318118,74.7982887 L118.832455,68.1627756 L118.832455,68.1646468 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<line x1="89.1804505" y1="50.4587175" x2="92.1261996" y2="56.4299308" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></line>
|
||||
<polygon id="路径" fill="#373435" points="91.3949057 54.7158501 95.6835424 49.3715113 90.6243352 45.5896805 88.2696062 48.4115513"></polygon>
|
||||
<polygon id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round" points="91.3949057 54.7158501 95.6835424 49.3715113 90.6243352 45.5896805 88.2696062 48.4115513"></polygon>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 14 KiB |
BIN
web/src/assets/images/empty/noPermission.png
Normal file
|
After Width: | Height: | Size: 160 KiB |
@@ -1,62 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="200px" height="200px" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>订单</title>
|
||||
<g id="V1.0版" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="红熊空间-一般空状态" transform="translate(-119, -486)">
|
||||
<g id="订单" transform="translate(119, 486)">
|
||||
<g id="编组" transform="translate(16, 11)">
|
||||
<line x1="0" y1="177.892337" x2="184" y2="177.892337" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></line>
|
||||
<path d="M120.557361,161.2045 C120.370234,161.589935 160.187501,161.2045 160.187501,161.2045 C160.187501,161.2045 154.547869,99.6640658 153.855283,96.6882477 L123.901994,87.244009 C121.172515,102.508534 119.038833,114.437646 116.309354,129.702171 C115.221004,135.488006 114.401515,137.253687 116.257733,145.651437 L120.559512,161.206653 L120.557361,161.2045 Z" id="路径" fill="#FBFDFF"></path>
|
||||
<path d="M120.557361,161.2045 C120.370234,161.589935 160.187501,161.2045 160.187501,161.2045 C160.187501,161.2045 154.79307,100.742854 154.100484,97.7670356 L123.914652,87.3709662 C121.185173,102.635492 119.038833,114.437646 116.309354,129.702171 C115.221004,135.488006 114.401515,137.253687 116.257733,145.651437 L120.475627,159.740277 L120.557361,161.2045 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M139.936876,159.74889 C140.087438,160.457316 141.509176,177.920329 141.509176,177.920329 C141.509176,177.920329 102.655507,177.972008 102.685602,177.853578 C105.260234,167.365003 115.012368,170.765015 120.475627,159.740277 L139.936876,159.74889 Z" id="路径" fill="#D2D3D5"></path>
|
||||
<path d="M139.936876,159.74889 C140.087438,160.457316 141.509176,177.920329 141.509176,177.920329 C141.509176,177.920329 102.655507,177.972008 102.685602,177.853578 C105.260234,167.365003 115.012368,170.765015 120.475627,159.740277 L139.936876,159.74889 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M160.002525,159.723051 C160.174596,160.431476 161.811423,177.920329 161.811423,177.920329 C161.811423,177.920329 122.97281,177.974161 122.985712,177.853578 C124.192364,167.072159 132.587286,170.765015 137.725762,159.740277 L160.004676,159.723051 L160.002525,159.723051 Z" id="路径" fill="#D2D3D5"></path>
|
||||
<path d="M160.002525,159.723051 C160.174596,160.431476 161.811423,177.920329 161.811423,177.920329 C161.811423,177.920329 122.97281,177.974161 122.985712,177.853578 C124.192364,167.072159 132.587286,170.765015 137.725762,159.740277 L160.004676,159.723051 L160.002525,159.723051 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M130.537489,45.9227726 L141.874828,45.8086494 L141.861922,36.3794835 L141.562949,19.4720135 C141.648984,14.2374161 136.069577,10.8115647 131.754892,14.6788363 C130.498773,15.8049961 127.3004,21.0525132 126.156127,22.7751285 C123.831015,26.2784976 121.385453,30.1845279 122.936245,32.656481 C123.835317,34.0862517 126.377668,35.511716 130.791294,34.6073429 L130.535338,45.9206194 L130.537489,45.9227726 Z" id="路径" fill="#FBFDFF"></path>
|
||||
<path d="M130.537489,45.9227726 L141.874828,45.8086494 L141.861922,36.3794835 L141.562949,19.4720135 C141.648984,14.2374161 136.069577,10.8115647 131.754892,14.6788363 C130.498773,15.8049961 127.3004,21.0525132 126.156127,22.7751285 C123.831015,26.2784976 121.385453,30.1845279 122.936245,32.656481 C123.835317,34.0862517 126.377668,35.511716 130.791294,34.6073429 L130.535338,45.9206194 L130.537489,45.9227726 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M128.382297,27.5123208 C129.528721,28.1023166 132.380801,29.7388012 133.914385,26.6359402" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M137.671783,159.740277 C135.674461,151.641114 134.336677,146.423025 133.658429,144.08601 C132.062469,138.58656 131.731232,134.706369 132.527061,129.127249 L133.802539,113.479441" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M130.535338,45.9206194 C130.374021,46.4567834 123.267482,91.875691 122.21993,97.5947741 C122.204942,97.6787516 154.100484,97.7670356 154.100484,97.7670356 C151.990461,88.8245086 148.417834,62.9013004 145.735674,49.6199359 C145.608772,48.9911813 145.004372,46.0368959 142.238328,45.9916773 C140.982208,45.9701446 137.081212,45.9464586 130.535338,45.9206194 Z" id="路径" fill="#373435"></path>
|
||||
<path d="M130.535338,45.9206194 C130.374021,46.4567834 123.267482,91.875691 122.21993,97.5947741 C122.204942,97.6787516 154.100484,97.7670356 154.100484,97.7670356 C151.990461,88.8245086 148.417834,62.9013004 145.735674,49.6199359 C145.608772,48.9911813 145.004372,46.0368959 142.238328,45.9916773 C140.982208,45.9701446 137.081212,45.9464586 130.535338,45.9206194 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M130.853669,57.2855743 L130.61277,46.0110567 L113.197017,53.803738 C112.026933,54.3614347 109.024291,54.2688441 107.98111,53.4032299 L87.3820401,39.2088792 L65.1784069,52.6000605 L61.7004185,54.475558 L97.5471442,69.7400835 C102.683469,72.0440815 108.308045,72.5694792 113.330372,69.4278594 L130.853669,57.2855743 Z" id="路径" fill="#373435"></path>
|
||||
<path d="M130.853669,57.2855743 L130.56578,46.0633486 L113.197017,53.803738 C112.026933,54.3614347 109.024291,54.2688441 107.98111,53.4032299 L87.3820401,39.2088792 L65.1784069,52.6000605 L61.7004185,54.475558 L97.5471442,69.7400835 C102.683469,72.0440815 108.308045,72.5694792 113.330372,69.4278594 L130.853669,57.2855743 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M140.562785,55.7309139 L142.67926,81.3569709 C142.756692,85.2134761 138.717322,84.3823142 137.708554,83.4736345 L122.942697,72.959221 L109.583522,97.0349241 C109.468808,97.6177423 120.391703,97.8490954 142.352207,97.7289833 L150.994599,90.3145709 L140.562785,55.7309139 Z" id="路径" fill="#373435"></path>
|
||||
<path d="M140.562785,55.7309139 L142.67926,81.3569709 C142.756692,85.2134761 138.717322,84.3823142 137.708554,83.4736345 L122.942697,72.959221 L109.583522,97.0349241 C109.468808,97.6177423 120.391703,97.8490954 142.352207,97.7289833 L150.994599,90.3145709 L140.562785,55.7309139 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<polygon id="路径" fill="#FBFDFF" fill-rule="nonzero" points="2.23262338 6.96367265 95.6887756 6.96367265 95.6887756 129.086336 2.23262338 129.086336"></polygon>
|
||||
<polygon id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round" points="2.23262338 6.96367265 95.6887756 6.96367265 95.6887756 129.086336 2.23262338 129.086336"></polygon>
|
||||
<polygon id="路径" fill="#D2D3D5" fill-rule="nonzero" points="83.7190751 6.96367265 95.6887756 6.96367265 95.6887756 129.086336 83.7190751 129.086336"></polygon>
|
||||
<polygon id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round" points="83.7190751 6.96367265 95.6887756 6.96367265 95.6887756 129.086336 83.7190751 129.086336"></polygon>
|
||||
<path d="M95.6887756,6.96367265 L2.23262338,6.96367265 L2.23262338,2.53009133 C2.23262338,1.13907942 3.37044397,0 4.75991864,0 L93.1614804,0 C94.550955,0 95.6887756,1.13907942 95.6887756,2.53009133 L95.6887756,6.96367265 Z" id="路径" fill="#FBFDFF"></path>
|
||||
<path d="M95.6887756,6.96367265 L2.23262338,6.96367265 L2.23262338,2.53009133 C2.23262338,1.13907942 3.37044397,0 4.75991864,0 L93.1614804,0 C94.550955,0 95.6887756,1.13907942 95.6887756,2.53009133 L95.6887756,6.96367265 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M7.14095341,2.34275691 C7.78622028,2.34275691 8.31103734,2.8681546 8.31103734,3.51413537 C8.31103734,4.16011613 7.78622028,4.68551382 7.14095341,4.68551382 C6.49568653,4.68551382 5.97086947,4.16011613 5.97086947,3.51413537 C5.97086947,2.8681546 6.49568653,2.34275691 7.14095341,2.34275691" id="路径" fill="#373435"></path>
|
||||
<path d="M10.4167582,2.34275691 C9.77149136,2.34275691 9.2466743,2.8681546 9.2466743,3.51413537 C9.2466743,4.16011613 9.77149136,4.68551382 10.4167582,4.68551382 C11.0620251,4.68551382 11.5868422,4.16011613 11.5868422,3.51413537 C11.5868422,2.8681546 11.0620251,2.34275691 10.4167582,2.34275691" id="路径" fill="#373435"></path>
|
||||
<path d="M13.8861431,2.34275691 C13.2408763,2.34275691 12.7160592,2.8681546 12.7160592,3.51413537 C12.7160592,4.16011613 13.2408763,4.68551382 13.8861431,4.68551382 C14.53141,4.68551382 15.0562271,4.16011613 15.0562271,3.51413537 C15.0562271,2.8681546 14.53141,2.34275691 13.8861431,2.34275691" id="路径" fill="#373435"></path>
|
||||
<path d="M89.6791901,41.8358677 L89.6791901,41.8358677 C92.9700512,41.8358677 95.6393052,44.510228 95.6393052,47.8025767 L95.6393052,87.1923305 C95.6393052,90.4868324 92.9679003,93.1590395 89.6791901,93.1590395 L89.6791901,93.1590395 C86.3883291,93.1590395 83.7169242,90.4846791 83.7169242,87.1901772 L83.7169242,47.8025767 C83.7169242,44.5080748 86.3883291,41.8337144 89.6791901,41.8337144 L89.6791901,41.8358677 Z" id="路径" fill="#FBFDFF" fill-rule="nonzero"></path>
|
||||
<path d="M89.6791901,41.8358677 L89.6791901,41.8358677 C92.9700512,41.8358677 95.6393052,44.510228 95.6393052,47.8025767 L95.6393052,87.1923305 C95.6393052,90.4868324 92.9679003,93.1590395 89.6791901,93.1590395 L89.6791901,93.1590395 C86.3883291,93.1590395 83.7169242,90.4846791 83.7169242,87.1901772 L83.7169242,47.8025767 C83.7169242,44.5080748 86.3883291,41.8337144 89.6791901,41.8337144 L89.6791901,41.8358677 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M16.1789914,80.0004113 L68.3423655,80.0004113 C69.2650971,80.0004113 70.1491128,80.3664671 70.8008323,81.0210609 C71.4547027,81.6735015 71.820354,82.5584951 71.820354,83.4822476 L71.820354,83.4822476 C71.820354,84.4060001 71.4547027,85.2909938 70.8008323,85.9434343 C70.1491128,86.5980282 69.2650971,86.964084 68.3423655,86.964084 L16.1789914,86.964084 C15.2562598,86.964084 14.3722442,86.5980282 13.7205246,85.9434343 C13.0666542,85.2909938 12.701003,84.4060001 12.701003,83.4822476 L12.701003,83.4822476 C12.701003,82.5584951 13.0666542,81.6735015 13.7205246,81.0210609 C14.3722442,80.3664671 15.2562598,80.0004113 16.1789914,80.0004113 Z" id="路径" fill="#FBFDFF" fill-rule="nonzero"></path>
|
||||
<path d="M16.1789914,80.0004113 L68.3423655,80.0004113 C69.2650971,80.0004113 70.1491128,80.3664671 70.8008323,81.0210609 C71.4547027,81.6735015 71.820354,82.5584951 71.820354,83.4822476 L71.820354,83.4822476 C71.820354,84.4060001 71.4547027,85.2909938 70.8008323,85.9434343 C70.1491128,86.5980282 69.2650971,86.964084 68.3423655,86.964084 L16.1789914,86.964084 C15.2562598,86.964084 14.3722442,86.5980282 13.7205246,85.9434343 C13.0666542,85.2909938 12.701003,84.4060001 12.701003,83.4822476 L12.701003,83.4822476 C12.701003,82.5584951 13.0666542,81.6735015 13.7205246,81.0210609 C14.3722442,80.3664671 15.2562598,80.0004113 16.1789914,80.0004113 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M19.9236902,104.371112 L64.5976668,104.371112 C68.5832651,104.371112 71.820354,107.611782 71.820354,111.60179 L71.820354,111.60179 C71.820354,115.593951 68.5832651,118.832468 64.5976668,118.832468 L19.9236902,118.832468 C15.9380918,118.832468 12.701003,115.591798 12.701003,111.60179 L12.701003,111.60179 C12.701003,107.609629 15.9380918,104.371112 19.9236902,104.371112 Z" id="路径" fill="#D2D3D5" fill-rule="nonzero"></path>
|
||||
<path d="M19.9236902,104.371112 L64.5976668,104.371112 C68.5832651,104.371112 71.820354,107.611782 71.820354,111.60179 L71.820354,111.60179 C71.820354,115.593951 68.5832651,118.832468 64.5976668,118.832468 L19.9236902,118.832468 C15.9380918,118.832468 12.701003,115.591798 12.701003,111.60179 L12.701003,111.60179 C12.701003,107.609629 15.9380918,104.371112 19.9236902,104.371112 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M16.1789914,90.979931 L36.4769364,90.979931 C38.3955299,90.979931 39.9549248,92.5410512 39.9549248,94.4617674 L39.9549248,94.4617674 C39.9549248,96.3824835 38.3976808,97.9436037 36.4769364,97.9436037 L16.1789914,97.9436037 C14.2603979,97.9436037 12.701003,96.3846368 12.701003,94.4617674 L12.701003,94.4617674 C12.701003,92.5410512 14.2603979,90.979931 16.1789914,90.979931 Z" id="路径" fill="#FBFDFF" fill-rule="nonzero"></path>
|
||||
<path d="M16.1789914,90.979931 L36.4769364,90.979931 C38.3955299,90.979931 39.9549248,92.5410512 39.9549248,94.4617674 L39.9549248,94.4617674 C39.9549248,96.3824835 38.3976808,97.9436037 36.4769364,97.9436037 L16.1789914,97.9436037 C14.2603979,97.9436037 12.701003,96.3846368 12.701003,94.4617674 L12.701003,94.4617674 C12.701003,92.5410512 14.2603979,90.979931 16.1789914,90.979931 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M59.293573,90.979931 L68.2004068,90.979931 C70.1190003,90.979931 71.6783952,92.5410512 71.6783952,94.4617674 L71.6783952,94.4617674 C71.6783952,96.3824835 70.1211512,97.9436037 68.2004068,97.9436037 L59.293573,97.9436037 C57.3749795,97.9436037 55.8155846,96.3846368 55.8155846,94.4617674 L55.8155846,94.4617674 C55.8155846,92.5410512 57.3749795,90.979931 59.293573,90.979931 Z" id="路径" fill="#FBFDFF" fill-rule="nonzero"></path>
|
||||
<path d="M59.293573,90.979931 L68.2004068,90.979931 C70.1190003,90.979931 71.6783952,92.5410512 71.6783952,94.4617674 L71.6783952,94.4617674 C71.6783952,96.3824835 70.1211512,97.9436037 68.2004068,97.9436037 L59.293573,97.9436037 C57.3749795,97.9436037 55.8155846,96.3846368 55.8155846,94.4617674 L55.8155846,94.4617674 C55.8155846,92.5410512 57.3749795,90.979931 59.293573,90.979931 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M110.147055,97.2287183 L124.510696,74.0380088 C121.460735,71.727551 120.443364,69.6281135 118.243004,65.6144196 C117.395553,64.0683723 116.894396,61.4241577 114.653169,59.7855199 C111.990368,57.8411178 106.757253,59.0900139 105.471021,62.6558277 C105.22582,63.3341075 98.3150118,59.6283312 92.1591658,59.1955241 C89.0597339,58.9780439 87.227176,59.938402 86.4851191,61.5576604 C85.8592102,62.9249864 85.9516985,64.7983306 87.2830992,66.4735741 C89.0941482,68.7517329 97.8568723,72.8601706 97.8568723,72.8601706 C95.0219999,72.119446 91.6988755,72.2917075 90.69441,75.3816488 C89.9394478,77.7050263 91.2859047,80.5559548 92.4237252,81.8543761 C92.4990064,81.9383536 91.0019872,82.5584951 90.3373624,84.1712938 C89.7824328,85.517087 89.8469595,87.6961955 91.5009936,89.492022 C93.7486732,91.931676 98.271994,96.0853324 110.149206,97.2308716 L110.147055,97.2287183 Z" id="路径" fill="#FBFDFF"></path>
|
||||
<path d="M110.147055,97.2287183 L124.510696,74.0380088 C121.460735,71.727551 120.443364,69.6281135 118.243004,65.6144196 C117.395553,64.0683723 116.894396,61.4241577 114.653169,59.7855199 C111.990368,57.8411178 106.757253,59.0900139 105.471021,62.6558277 C105.22582,63.3341075 98.3150118,59.6283312 92.1591658,59.1955241 C89.0597339,58.9780439 87.227176,59.938402 86.4851191,61.5576604 C85.8592102,62.9249864 85.9516985,64.7983306 87.2830992,66.4735741 C89.0941482,68.7517329 97.8568723,72.8601706 97.8568723,72.8601706 C95.0219999,72.119446 91.6988755,72.2917075 90.69441,75.3816488 C89.9394478,77.7050263 91.2859047,80.5559548 92.4237252,81.8543761 C92.4990064,81.9383536 91.0019872,82.5584951 90.3373624,84.1712938 C89.7824328,85.517087 89.8469595,87.6961955 91.5009936,89.492022 C93.7486732,91.931676 98.271994,96.0853324 110.149206,97.2308716 L110.147055,97.2287183 Z" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M91.9333224,81.2170084 C92.3419914,81.9189742 95.1209408,83.5877578 97.5105791,84.2466582" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<line x1="96.2437051" y1="72.1237525" x2="100.77778" y2="74.2662554" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></line>
|
||||
<line x1="103.922381" y1="62.3005383" x2="109.540505" y2="64.8930745" id="路径" stroke="#373435" stroke-width="0.4" stroke-linecap="round"></line>
|
||||
<path d="M125.886541,74.5257227 L138.177448,81.3225186 C139.229233,81.9125144 141.993127,81.8156173 141.993127,79.7786246 L140.84025,59.1115466" id="路径" stroke="#FBFDFF" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<path d="M126.62287,99.1838868 L144.387067,99.2441783 C150.018096,99.6231537 155.249059,96.546132 153.642344,88.2022138" id="路径" stroke="#FEFEFE" stroke-width="0.4" stroke-linecap="round"></path>
|
||||
<g id="锁" transform="translate(21, 21)">
|
||||
<g id="编组-5" transform="translate(6, 4)">
|
||||
<path d="M6.5625,21.8445574 L6.5625,10.9375 C6.5625,4.89688555 11.4593855,0 17.5,0 C23.5406145,-1.77635684e-15 28.4375,4.89688555 28.4375,10.9375 L28.4375,21.8445574 L28.4375,21.8445574" id="路径" stroke="#373435" stroke-width="0.4"></path>
|
||||
<rect id="矩形" fill="#373435" x="0" y="14.7865312" width="35" height="26.2134688" rx="3.3"></rect>
|
||||
<path d="M19.2495215,27.7092935 L19.2495215,32.3196897 C19.2495215,33.2842634 18.4667383,34.0670836 17.4997437,34.0670836 C16.533313,34.0670836 15.7499146,33.2842634 15.7499146,32.3196897 L15.7499146,27.7092935 C14.7050928,27.1048989 14.0000854,25.9783341 14.0000854,24.6853241 C14.0000854,22.7551014 15.5668311,21.1905362 17.4997437,21.1905362 C19.4326562,21.1905362 20.9999146,22.7551014 20.9999146,24.6853241 C20.9999146,25.9783341 20.2954712,27.1049501 19.2495728,27.7092935 L19.2495215,27.7092935 Z" id="路径" fill="#FBFDFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 143 KiB |
|
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 175 KiB |
18
web/src/assets/images/menu/userMemory_active.svg
Normal file
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>编组 29</title>
|
||||
<g id="V1.0版" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="红熊空间-应用管理" transform="translate(-24, -249)" stroke="#212332">
|
||||
<g id="记忆库" transform="translate(12, 241)">
|
||||
<g id="编组-29" transform="translate(12, 8)">
|
||||
<g id="编组-30" transform="translate(1.5, 2)">
|
||||
<path d="M5.15208739,12 L3.96504286,11.9873871 C3.14287934,11.9786512 2.48098017,11.3096817 2.48098017,10.4874718 L2.48098017,8.17573134 L2.48098017,8.17573134 L0.701703053,7.96314675 C0.482349244,7.93693878 0.325773604,7.73787163 0.351981572,7.51851782 C0.360586526,7.44649662 0.388612869,7.37817062 0.433061291,7.3208519 L1.79815052,5.56049306 L1.79815052,5.56049306 L1.79815052,5.43150782 C1.79815052,2.43176888 4.30576994,0 7.39907526,0 C10.4923806,0 13,2.43176888 13,5.43150782" id="路径" stroke-linecap="round"></path>
|
||||
<path d="M8,6 L11,6 C11.5522847,6 12,6.44771525 12,7 L12,11 C12,11.5522847 11.5522847,12 11,12 L8,12 C7.44771525,12 7,11.5522847 7,11 L7,7 C7,6.44771525 7.44771525,6 8,6 Z" id="矩形"></path>
|
||||
<line x1="7" y1="8" x2="12" y2="8" id="路径-26"></line>
|
||||
<line x1="7" y1="10" x2="12" y2="10" id="路径-26备份"></line>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -2,6 +2,7 @@ import { useState, useEffect, type FC } from 'react';
|
||||
import { Spin, Alert, Button } from 'antd';
|
||||
import { ReloadOutlined } from '@ant-design/icons';
|
||||
import RbMarkdown from '../Markdown';
|
||||
import { cookieUtils } from '@/utils/request'
|
||||
|
||||
type PreviewMode = 'office' | 'google';
|
||||
|
||||
@@ -156,7 +157,7 @@ const DocumentPreview: FC<DocumentPreviewProps> = ({
|
||||
const response = await fetch(requestUrl, {
|
||||
credentials: 'include', // 包含认证信息
|
||||
headers: {
|
||||
'Authorization': `Bearer ${localStorage.getItem('token') || ''}`,
|
||||
'Authorization': `Bearer ${cookieUtils.get('authToken') || ''}`,
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ interface EmptyProps {
|
||||
url?: string;
|
||||
size?: number | number[];
|
||||
title?: string;
|
||||
isNeedSubTitle?: boolean;
|
||||
subTitle?: string;
|
||||
className?: string;
|
||||
}
|
||||
@@ -13,6 +14,7 @@ const Empty: FC<EmptyProps> = ({
|
||||
url,
|
||||
size = 200,
|
||||
title,
|
||||
isNeedSubTitle = true,
|
||||
subTitle,
|
||||
className = '',
|
||||
}) => {
|
||||
@@ -20,12 +22,12 @@ const Empty: FC<EmptyProps> = ({
|
||||
const width = Array.isArray(size) ? size[0] : size ? size : url ? 200 : 88;
|
||||
const height = Array.isArray(size) ? size[1] : size ? size : url ? 200 : 88;
|
||||
|
||||
subTitle = subTitle || t('empty.tableEmpty');
|
||||
const curSubTitle = isNeedSubTitle ? (subTitle || t('empty.tableEmpty')) : null;
|
||||
return (
|
||||
<div className={`rb:flex rb:items-center rb:justify-center rb:flex-col ${className}`}>
|
||||
<img src={url || emptyIcon} alt="404" style={{ width: `${width}px`, height: `${height}px` }} />
|
||||
{title && <div className="rb:mt-[8px] rb:leading-[20px]">{title}</div>}
|
||||
{subTitle && <div className={`rb:mt-[${url ? 8 : 5}px] rb:leading-[16px] rb:text-[#5B6167]`}>{subTitle}</div>}
|
||||
{title && <div className="rb:mt-2 rb:leading-5">{title}</div>}
|
||||
{curSubTitle && <div className={`rb:mt-[${url ? 8 : 5}px] rb:leading-4 rb:text-[12px] rb:text-[#A8A9AA]`}>{subTitle}</div>}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -66,10 +66,30 @@ const AppHeader: FC<{source?: 'space' | 'manage';}> = ({source = 'manage'}) => {
|
||||
},
|
||||
];
|
||||
const formatBreadcrumbNames = () => {
|
||||
return breadcrumbs.map((menu, index) => ({
|
||||
title: menu.i18nKey ? t(menu.i18nKey) : menu.label,
|
||||
path: index === breadcrumbs.length - 1 ? undefined : menu.path
|
||||
}))
|
||||
return breadcrumbs.map((menu, index) => {
|
||||
const item: any = {
|
||||
title: menu.i18nKey ? t(menu.i18nKey) : menu.label,
|
||||
};
|
||||
|
||||
// 如果是最后一项,不设置 path
|
||||
if (index === breadcrumbs.length - 1) {
|
||||
return item;
|
||||
}
|
||||
|
||||
// 如果有自定义 onClick,使用 onClick 并设置 href 为 '#' 以显示手型光标
|
||||
if ((menu as any).onClick) {
|
||||
item.onClick = (e: React.MouseEvent) => {
|
||||
e.preventDefault();
|
||||
(menu as any).onClick(e);
|
||||
};
|
||||
item.href = '#';
|
||||
} else if (menu.path && menu.path !== '#') {
|
||||
// 只有当 path 不是 '#' 时才设置 path
|
||||
item.path = menu.path;
|
||||
}
|
||||
|
||||
return item;
|
||||
});
|
||||
}
|
||||
return (
|
||||
<Header className={styles.header}>
|
||||
|
||||
@@ -6,6 +6,7 @@ import { useNavigationBreadcrumbs } from '@/hooks/useNavigationBreadcrumbs';
|
||||
import AppHeader from '@/components/Header';
|
||||
import Sider from '@/components/SiderMenu'
|
||||
import { useUser } from '@/store/user';
|
||||
import { cookieUtils } from '@/utils/request';
|
||||
|
||||
|
||||
const { Content } = Layout;
|
||||
@@ -18,7 +19,12 @@ const AuthLayout: FC = () => {
|
||||
// 自动更新面包屑导航
|
||||
useNavigationBreadcrumbs('manage');
|
||||
useEffect(() => {
|
||||
getUserInfo()
|
||||
const authToken = cookieUtils.get('authToken')
|
||||
if (!authToken && !window.location.hash.includes('#/login')) {
|
||||
window.location.href = `/#/login`;
|
||||
} else {
|
||||
getUserInfo()
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
|
||||
@@ -6,6 +6,7 @@ import { useNavigationBreadcrumbs } from '@/hooks/useNavigationBreadcrumbs';
|
||||
import AppHeader from '@/components/Header';
|
||||
import Sider from '@/components/SiderMenu';
|
||||
import { useUser } from '@/store/user';
|
||||
import { cookieUtils } from '@/utils/request';
|
||||
|
||||
|
||||
const { Content } = Layout;
|
||||
@@ -18,8 +19,13 @@ const AuthSpaceLayout: FC = () => {
|
||||
// 自动更新面包屑导航
|
||||
useNavigationBreadcrumbs('space');
|
||||
useEffect(() => {
|
||||
getUserInfo()
|
||||
getStorageType()
|
||||
const authToken = cookieUtils.get('authToken')
|
||||
if (!authToken && !window.location.hash.includes('#/login')) {
|
||||
window.location.href = `/#/login`;
|
||||
} else {
|
||||
getUserInfo()
|
||||
getStorageType()
|
||||
}
|
||||
}, []);
|
||||
|
||||
return (
|
||||
|
||||
@@ -6,6 +6,7 @@ import type { UploadProps, UploadFile } from 'antd';
|
||||
import type { UploadProps as RcUploadProps } from 'antd/es/upload/interface';
|
||||
import CloudUploadOutlined from '@/assets/images/CloudUploadOutlined.png'
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { cookieUtils } from '@/utils/request'
|
||||
|
||||
const { confirm } = Modal;
|
||||
const { Dragger } = Upload;
|
||||
@@ -219,7 +220,7 @@ const UploadFiles = forwardRef<UploadFilesRef, UploadFilesProps>(({
|
||||
fileList,
|
||||
beforeUpload,
|
||||
headers: {
|
||||
authorization: localStorage.getItem('token') || '',
|
||||
authorization: cookieUtils.get('authToken') || '',
|
||||
},
|
||||
onRemove: handleRemove,
|
||||
onChange: handleChange,
|
||||
|
||||
@@ -5,6 +5,7 @@ import type { GetProp, UploadFile, UploadProps } from 'antd';
|
||||
import type { UploadProps as RcUploadProps } from 'antd/es/upload/interface';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import PlusIcon from '@/assets/images/plus.svg'
|
||||
import { cookieUtils } from '@/utils/request'
|
||||
|
||||
const { confirm } = Modal;
|
||||
|
||||
@@ -166,7 +167,7 @@ const UploadImages = forwardRef<UploadImagesRef, UploadImagesProps>(({
|
||||
fileList,
|
||||
beforeUpload,
|
||||
headers: {
|
||||
authorization: localStorage.getItem('token') || '',
|
||||
authorization: cookieUtils.get('authToken') || '',
|
||||
},
|
||||
onPreview: handlePreview,
|
||||
onRemove: handleRemove,
|
||||
|
||||
@@ -403,6 +403,7 @@ export const en = {
|
||||
apiKeyName: 'API Key Name',
|
||||
},
|
||||
knowledgeBase: {
|
||||
home: 'Home',
|
||||
selectSpace: 'Please select a workspace.',
|
||||
preview:'Preview',
|
||||
pleaseUploadFileFirst: 'Please upload file first',
|
||||
@@ -1171,6 +1172,8 @@ Memory Bear: After the rebellion, regional warlordism intensified for several re
|
||||
quickReply: 'Quick Reply',
|
||||
web_search: 'Online search',
|
||||
memory: 'Memory',
|
||||
memoryConversationAnalysisEmpty: 'There is currently no dialogue analysis content available',
|
||||
memoryConversationAnalysisEmptySubTitle: 'After entering your user ID, click on "Send" to view the conversation memory'
|
||||
},
|
||||
login: {
|
||||
title: 'Red Bear Memory Science',
|
||||
|
||||
@@ -35,6 +35,7 @@ export const zh = {
|
||||
userMemoryDetail: '用户记忆详情',
|
||||
},
|
||||
knowledgeBase: {
|
||||
home: '首页',
|
||||
selectSpace: '请选择空间',
|
||||
preview:'预览',
|
||||
pleaseUploadFileFirst: '请先上传文件',
|
||||
@@ -1241,6 +1242,8 @@ export const zh = {
|
||||
startANewConversation: '开始新对话',
|
||||
normalReply: '正常回复',
|
||||
quickReply: '快速回复',
|
||||
memoryConversationAnalysisEmpty: '当前没有可用的对话分析内容',
|
||||
memoryConversationAnalysisEmptySubTitle: '输入用户ID后,单击“发送”查看对话记忆'
|
||||
},
|
||||
login: {
|
||||
title: '红熊记忆科学',
|
||||
|
||||
@@ -23,6 +23,7 @@ export interface MenuItem {
|
||||
disposable?: boolean;
|
||||
appSystem?: string | null;
|
||||
subs: MenuItem[] | null;
|
||||
onClick?: (e?: React.MouseEvent) => void | boolean;
|
||||
}
|
||||
interface MenuState {
|
||||
collapsed: boolean;
|
||||
|
||||
@@ -3,6 +3,7 @@ import { clearAuthData } from '@/utils/auth';
|
||||
import type { User } from '@/views/UserManagement/types'
|
||||
import { getUsers, refreshToken, logout } from '@/api/user'
|
||||
import { getWorkspaceStorageType } from '@/api/workspaces';
|
||||
import { cookieUtils } from '@/utils/request'
|
||||
|
||||
export interface LoginInfo {
|
||||
access_token: string;
|
||||
@@ -21,17 +22,18 @@ export interface UserState {
|
||||
logout: () => void;
|
||||
getStorageType: () => void;
|
||||
}
|
||||
|
||||
export const useUser = create<UserState>((set, get) => ({
|
||||
user: localStorage.getItem('user') ? JSON.parse(localStorage.getItem('user') || '{}') as User : {} as User,
|
||||
loginInfo: {} as LoginInfo,
|
||||
storageType: null,
|
||||
updateLoginInfo: (values: LoginInfo) => {
|
||||
localStorage.setItem('token', values.access_token);
|
||||
localStorage.setItem('refresh_token', values.refresh_token);
|
||||
cookieUtils.set('authToken', values.access_token);
|
||||
cookieUtils.set('refreshToken', values.refresh_token);
|
||||
set({ loginInfo: values });
|
||||
},
|
||||
getUserInfo: async (flag?: boolean) => {
|
||||
if (!localStorage.getItem('token')) {
|
||||
if (!cookieUtils.get('authToken')) {
|
||||
return
|
||||
}
|
||||
const localUser = JSON.parse(localStorage.getItem('user') || '{}') as User;
|
||||
@@ -70,7 +72,7 @@ export const useUser = create<UserState>((set, get) => ({
|
||||
refreshToken()
|
||||
.then((res) => {
|
||||
const response = res as { refresh_token: string }
|
||||
localStorage.setItem('token', response.refresh_token);
|
||||
cookieUtils.set('authToken', response.refresh_token);
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error('Failed to refresh token:', err)
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import { cookieUtils } from './request'
|
||||
export const clearAuthData = () => {
|
||||
console.log("Clearing auth data and redirecting to login");
|
||||
sessionStorage.clear();
|
||||
localStorage.clear()
|
||||
cookieUtils.clear();
|
||||
}
|
||||
@@ -27,6 +27,7 @@ interface data {
|
||||
const service = axios.create({
|
||||
baseURL: '/api', // 与vite.config.ts中的代理配置对应
|
||||
// timeout: 10000, // 请求超时时间
|
||||
withCredentials: false,
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
@@ -46,11 +47,12 @@ let requests: RequestQueueItem[] = [];
|
||||
service.interceptors.request.use(
|
||||
(config) => {
|
||||
if (!config.headers.Authorization) {
|
||||
const token = localStorage.getItem('token');
|
||||
const token = cookieUtils.get('authToken');
|
||||
if (token) {
|
||||
config.headers.Authorization = `Bearer ${token}`;
|
||||
}
|
||||
}
|
||||
config.headers.Cookie = undefined
|
||||
return config;
|
||||
},
|
||||
(error) => {
|
||||
@@ -63,7 +65,7 @@ service.interceptors.request.use(
|
||||
// 刷新token的函数
|
||||
const tokenRefresh = async (): Promise<string> => {
|
||||
try {
|
||||
const refresh_token = localStorage.getItem('refresh_token');
|
||||
const refresh_token = cookieUtils.get('refreshToken');
|
||||
if (window.location.hash.includes('#/invite-register')) {
|
||||
throw new Error(i18n.t('common.refreshTokenNotExist'));
|
||||
}
|
||||
@@ -73,7 +75,7 @@ const tokenRefresh = async (): Promise<string> => {
|
||||
// 使用原生axios调用refresh接口,避免触发拦截器导致的循环调用
|
||||
const response: any = await refreshToken();
|
||||
const newToken = response.access_token;
|
||||
localStorage.setItem('token', newToken);
|
||||
cookieUtils.set('authToken', newToken);
|
||||
return newToken;
|
||||
} catch (error) {
|
||||
// 如果refresh接口也返回401,则退出登录
|
||||
@@ -274,6 +276,7 @@ export const request = {
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data',
|
||||
},
|
||||
withCredentials: false,
|
||||
...config
|
||||
});
|
||||
},
|
||||
@@ -295,4 +298,38 @@ export const request = {
|
||||
};
|
||||
|
||||
|
||||
|
||||
// 获取父级域名
|
||||
const getParentDomain = () => {
|
||||
const hostname = window.location.hostname
|
||||
const parts = hostname.split('.')
|
||||
return parts.length > 2 ? `.${parts.slice(-2).join('.')}` : hostname
|
||||
}
|
||||
|
||||
// Cookie操作工具
|
||||
export const cookieUtils = {
|
||||
set: (name: string, value: string, domain = getParentDomain()) => {
|
||||
document.cookie = `${name}=${value}; domain=${domain}; path=/; secure; samesite=strict`
|
||||
},
|
||||
get: (name: string) => {
|
||||
const value = `; ${document.cookie}`
|
||||
const parts = value.split(`; ${name}=`)
|
||||
return parts.length === 2 ? parts.pop()?.split(';').shift() : null
|
||||
},
|
||||
remove: (name: string, domain = getParentDomain()) => {
|
||||
document.cookie = `${name}=; domain=${domain}; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`
|
||||
},
|
||||
clear: (domain = getParentDomain()) => {
|
||||
document.cookie.split(';').forEach(cookie => {
|
||||
const eqPos = cookie.indexOf('=');
|
||||
const name = eqPos > -1 ? cookie.substr(0, eqPos).trim() : cookie.trim();
|
||||
if (name) {
|
||||
document.cookie = `${name}=; domain=${domain}; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`;
|
||||
document.cookie = `${name}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`;
|
||||
}
|
||||
});
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
export default service;
|
||||
@@ -1,10 +1,11 @@
|
||||
import { message } from 'antd';
|
||||
import i18n from '@/i18n'
|
||||
import { cookieUtils } from './request'
|
||||
const API_PREFIX = '/api'
|
||||
|
||||
export const handleSSE = async (url: string, data: any, onMessage?: (data: string) => void, config = {}) => {
|
||||
try {
|
||||
const token = localStorage.getItem('token');
|
||||
const token = cookieUtils.get('authToken');
|
||||
const response = await fetch(`${API_PREFIX}${url}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
|
||||
@@ -24,7 +24,7 @@ import { saveAgentConfig } from '@/api/application'
|
||||
import Knowledge from './components/Knowledge'
|
||||
import VariableList from './components/VariableList'
|
||||
import { getApplicationConfig } from '@/api/application'
|
||||
import { getKnowledgeBaseList } from '@/views/KnowledgeBase/service'
|
||||
import { getKnowledgeBaseList } from '@/api/knowledgeBase'
|
||||
import { memoryConfigListUrl } from '@/api/memory'
|
||||
import CustomSelect from '@/components/CustomSelect'
|
||||
|
||||
|
||||
@@ -44,12 +44,22 @@ const Cluster: FC<{application: SubAgentItem}> = ({application}) => {
|
||||
priority: 1,
|
||||
}))
|
||||
}
|
||||
console.log('params', params)
|
||||
form.validateFields().then(() => {
|
||||
saveMultiAgentConfig(id as string, params).then(() => {
|
||||
if (flag) {
|
||||
message.success(t('common.saveSuccess'))
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
form.validateFields().then(() => {
|
||||
saveMultiAgentConfig(id as string, params)
|
||||
.then(() => {
|
||||
if (flag) {
|
||||
message.success(t('common.saveSuccess'))
|
||||
}
|
||||
resolve(true)
|
||||
})
|
||||
.catch(error => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
.catch(error => {
|
||||
reject(error)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
@@ -2,9 +2,9 @@ import { type FC, useRef, useEffect, useState } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import clsx from 'clsx'
|
||||
import { Input, Form } from 'antd'
|
||||
import ChatIcon from '@/assets/images/application/chat.svg'
|
||||
import ChatIcon from '@/assets/images/application/chat.png'
|
||||
import ChatSendIcon from '@/assets/images/application/chatSend.svg'
|
||||
import DebuggingEmpty from '@/assets/images/application/debuggingEmpty.svg'
|
||||
import DebuggingEmpty from '@/assets/images/application/debuggingEmpty.png'
|
||||
import type { ChatItem, ChatData, Config } from '../types'
|
||||
import { runCompare, draftRun } from '@/api/application'
|
||||
import Empty from '@/components/Empty'
|
||||
@@ -114,6 +114,7 @@ const Chat: FC<ChatProps> = ({ chatList, data, updateChatList, handleSave, sourc
|
||||
if (index === targetIndex) {
|
||||
return {
|
||||
...item,
|
||||
conversation_id: parsed.conversation_id,
|
||||
list: item.list?.map((msg, msgIndex) => {
|
||||
if (msgIndex === item.list!.length - 1 && msg.role === 'answer') {
|
||||
return { ...msg, content: msg.content + parsed.content };
|
||||
@@ -126,10 +127,6 @@ const Chat: FC<ChatProps> = ({ chatList, data, updateChatList, handleSave, sourc
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
if (parsed.conversation_id) {
|
||||
setConversationId(parsed.conversation_id);
|
||||
}
|
||||
} else if (line.startsWith('data:') && (isCluster && currentEvent === 'message')) {
|
||||
const jsonData = line.substring(5).trim();
|
||||
const parsed = JSON.parse(jsonData);
|
||||
@@ -175,10 +172,6 @@ const Chat: FC<ChatProps> = ({ chatList, data, updateChatList, handleSave, sourc
|
||||
}))
|
||||
}
|
||||
}
|
||||
|
||||
if (parsed.conversation_id) {
|
||||
setConversationId(parsed.conversation_id);
|
||||
}
|
||||
} else if (line.startsWith('data:') && (isCluster && currentEvent === 'model_end')) {
|
||||
const jsonData = line.substring(5).trim();
|
||||
const parsed = JSON.parse(jsonData);
|
||||
@@ -247,6 +240,7 @@ const Chat: FC<ChatProps> = ({ chatList, data, updateChatList, handleSave, sourc
|
||||
{chatList.length === 0
|
||||
? <Empty
|
||||
url={DebuggingEmpty}
|
||||
size={[300, 200]}
|
||||
title={t('application.debuggingEmpty')}
|
||||
subTitle={t('application.debuggingEmptyDesc')}
|
||||
className="rb:h-full"
|
||||
@@ -278,7 +272,7 @@ const Chat: FC<ChatProps> = ({ chatList, data, updateChatList, handleSave, sourc
|
||||
</div>
|
||||
}
|
||||
{!chat.list || chat.list.length === 0
|
||||
? <Empty url={ChatIcon} title={t('application.chatEmpty')} className="rb:h-full" />
|
||||
? <Empty url={ChatIcon} title={t('application.chatEmpty')} isNeedSubTitle={false} className="rb:h-full" size={[240, 200]} />
|
||||
: (
|
||||
<div ref={el => scrollContainerRefs.current[index] = el} className={clsx(`rb:relative rb:overflow-y-auto rb:overflow-x-hidden`, {
|
||||
'rb:h-[calc(100vh-186px)]': isCluster,
|
||||
|
||||
@@ -5,7 +5,7 @@ import clsx from 'clsx'
|
||||
import type { KnowledgeModalRef, KnowledgeBase } from '../types'
|
||||
import type { KnowledgeBaseListItem } from '@/views/KnowledgeBase/types'
|
||||
import RbModal from '@/components/RbModal'
|
||||
import { getKnowledgeBaseList } from '@/views/KnowledgeBase/service'
|
||||
import { getKnowledgeBaseList } from '@/api/knowledgeBase'
|
||||
import SearchInput from '@/components/SearchInput'
|
||||
import Empty from '@/components/Empty'
|
||||
import { formatDateTime } from '@/utils/format';
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { type FC, useRef, useEffect, useState } from 'react'
|
||||
import { type FC, useRef, useEffect, useState, useMemo, useCallback } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import ReactEcharts from 'echarts-for-react';
|
||||
import type { ConfigForm } from '../types'
|
||||
@@ -30,6 +30,7 @@ const LineChart: FC<LineCardProps> = ({ config }) => {
|
||||
const { t } = useTranslation()
|
||||
const chartRef = useRef<ReactEcharts>(null);
|
||||
const debounceRef = useRef()
|
||||
const resizeScheduledRef = useRef(false)
|
||||
const xAxisData = [1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60]
|
||||
const [initialData, setInitialData] = useState([])
|
||||
const [currentData, setCurrentData] = useState({
|
||||
@@ -38,7 +39,7 @@ const LineChart: FC<LineCardProps> = ({ config }) => {
|
||||
data: [],
|
||||
config: {}
|
||||
})
|
||||
const seriesData = [
|
||||
const seriesData = useMemo(() => [
|
||||
{
|
||||
...SeriesConfig,
|
||||
name: `${t('forgettingEngine.quicklyForget')}(λ_time=0.3)`,
|
||||
@@ -51,56 +52,77 @@ const LineChart: FC<LineCardProps> = ({ config }) => {
|
||||
data: [],
|
||||
config: {lambda_mem: 1, lambda_time: 0.3, offset: 0.2}
|
||||
}
|
||||
]
|
||||
], [t])
|
||||
|
||||
useEffect(() => {
|
||||
getInitData()
|
||||
}, [])
|
||||
|
||||
useEffect(() => {
|
||||
const handleResize = () => {
|
||||
if (chartRef.current && !resizeScheduledRef.current) {
|
||||
resizeScheduledRef.current = true
|
||||
requestAnimationFrame(() => {
|
||||
chartRef.current?.getEchartsInstance().resize();
|
||||
resizeScheduledRef.current = false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const resizeObserver = new ResizeObserver(handleResize)
|
||||
const chartElement = chartRef.current?.getEchartsInstance().getDom().parentElement
|
||||
if (chartElement) {
|
||||
resizeObserver.observe(chartElement)
|
||||
}
|
||||
|
||||
return () => {
|
||||
resizeObserver.disconnect()
|
||||
}
|
||||
}, [initialData])
|
||||
useEffect(() => {
|
||||
if (config) {
|
||||
clearTimeout(debounceRef.current)
|
||||
debounceRef.current = setTimeout(() => {
|
||||
getCaculateData(config)
|
||||
}, 500)
|
||||
}, 300)
|
||||
}
|
||||
return () => {
|
||||
console.log('clearTimeout')
|
||||
clearTimeout(debounceRef.current)
|
||||
}
|
||||
}, [config])
|
||||
|
||||
// 快速遗忘:lambda_mem=0.3,lambda_time=1,offset=0.05;
|
||||
// 慢速遗忘:lambda_mem=1,lambda_time=0.3,offset=0.2
|
||||
const getInitData = () => {
|
||||
const getInitData = useCallback(() => {
|
||||
const list = seriesData.map(item => ({
|
||||
...item,
|
||||
data: formatData(item.config)
|
||||
}))
|
||||
setInitialData(list)
|
||||
}
|
||||
}, [seriesData])
|
||||
|
||||
const calculateSeriesData = (days: number, data: ConfigForm) => {
|
||||
const { offset, lambda_time, lambda_mem } = data;
|
||||
const S = 1
|
||||
const calculateSeriesData = useCallback((days: number, data: ConfigForm) => {
|
||||
const offset = Number(data.offset)
|
||||
const lambda_time = Number(data.lambda_time)
|
||||
const lambda_mem = Number(data.lambda_mem)
|
||||
// R = offset + (1 - offset) × e^(-λtime × t / (λmem × S))
|
||||
return (Number(offset) + (1 - Number(offset)) * Math.exp(-Number(lambda_time) * days / (Number(lambda_mem) * S))).toFixed(4)
|
||||
}
|
||||
const formatData = (data: ConfigForm) => {
|
||||
return +(offset + (1 - offset) * Math.exp(-lambda_time * days / lambda_mem)).toFixed(4)
|
||||
}, [])
|
||||
const formatData = useCallback((data: ConfigForm) => {
|
||||
return xAxisData.map(days => Number(calculateSeriesData(days, data)))
|
||||
}
|
||||
}, [calculateSeriesData])
|
||||
|
||||
const getCaculateData = (data: ConfigForm) => {
|
||||
const getCaculateData = useCallback((data: ConfigForm) => {
|
||||
if (!data) {
|
||||
return
|
||||
}
|
||||
console.log('getCaculateData', data)
|
||||
setCurrentData({
|
||||
...currentData,
|
||||
setCurrentData(prev => ({
|
||||
...prev,
|
||||
config: data,
|
||||
name: `${t('forgettingEngine.currentConfig')}(λ_time=${data.lambda_time})`,
|
||||
data: xAxisData.map(days => Number(calculateSeriesData(days, data)))
|
||||
})
|
||||
}
|
||||
}))
|
||||
}, [t, calculateSeriesData])
|
||||
|
||||
return (
|
||||
<>
|
||||
@@ -175,17 +197,6 @@ const LineChart: FC<LineCardProps> = ({ config }) => {
|
||||
opts={{ renderer: 'canvas' }}
|
||||
notMerge={true}
|
||||
lazyUpdate={true}
|
||||
onEvents={{
|
||||
// 图表渲染完成后再次调整大小,确保宽度正确
|
||||
// 使用 setTimeout 避免在主渲染过程中调用 resize
|
||||
rendered: () => {
|
||||
if (chartRef.current) {
|
||||
setTimeout(() => {
|
||||
chartRef.current?.getEchartsInstance().resize();
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
|
||||
@@ -39,10 +39,12 @@ export interface CurveRecord {
|
||||
}
|
||||
|
||||
export interface ConfigForm {
|
||||
config_id?: string;
|
||||
statement_granularity?: string;
|
||||
include_dialogue_context?: boolean;
|
||||
max_context?: string;
|
||||
lambda_time: string | number;
|
||||
lambda_mem: string | number;
|
||||
offset: string | number;
|
||||
[key: string]: any;
|
||||
}
|
||||
@@ -156,17 +156,6 @@ const LineCard: FC<LineCardProps> = ({ chartData, limit, onChange, type, classNa
|
||||
opts={{ renderer: 'canvas' }}
|
||||
notMerge={true}
|
||||
lazyUpdate={true}
|
||||
onEvents={{
|
||||
// 图表渲染完成后再次调整大小,确保宽度正确
|
||||
// 使用 setTimeout 避免在主渲染过程中调用 resize
|
||||
rendered: () => {
|
||||
if (chartRef.current) {
|
||||
setTimeout(() => {
|
||||
chartRef.current?.getEchartsInstance().resize();
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
}}
|
||||
/>
|
||||
) : <Empty size={120} className="rb:mt-[48px] rb:mb-[81px]" />}
|
||||
</Card>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { type FC, useRef } from 'react'
|
||||
import { type FC, useRef, useEffect } from 'react'
|
||||
import { useTranslation } from 'react-i18next'
|
||||
import ReactEcharts from 'echarts-for-react';
|
||||
import Card from './Card'
|
||||
@@ -14,6 +14,29 @@ const Colors = ['#155EEF', '#31E8FF', '#AD88FF', '#FFB048', '#4DA8FF', '#03BDFF'
|
||||
const PieCard: FC<PieCardProps> = ({ chartData, loading }) => {
|
||||
const { t } = useTranslation()
|
||||
const chartRef = useRef<ReactEcharts>(null);
|
||||
const resizeScheduledRef = useRef(false)
|
||||
|
||||
useEffect(() => {
|
||||
const handleResize = () => {
|
||||
if (chartRef.current && !resizeScheduledRef.current) {
|
||||
resizeScheduledRef.current = true
|
||||
requestAnimationFrame(() => {
|
||||
chartRef.current?.getEchartsInstance().resize();
|
||||
resizeScheduledRef.current = false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const resizeObserver = new ResizeObserver(handleResize)
|
||||
const chartElement = chartRef.current?.getEchartsInstance().getDom().parentElement
|
||||
if (chartElement) {
|
||||
resizeObserver.observe(chartElement)
|
||||
}
|
||||
|
||||
return () => {
|
||||
resizeObserver.disconnect()
|
||||
}
|
||||
}, [chartData])
|
||||
|
||||
return (
|
||||
<Card
|
||||
@@ -92,17 +115,6 @@ const PieCard: FC<PieCardProps> = ({ chartData, loading }) => {
|
||||
style={{ height: '265px', width: '100%', minWidth: '400px' }}
|
||||
notMerge={true}
|
||||
lazyUpdate={true}
|
||||
onEvents={{
|
||||
// 图表渲染完成后再次调整大小,确保宽度正确
|
||||
// 使用 setTimeout 避免在主渲染过程中调用 resize
|
||||
rendered: () => {
|
||||
if (chartRef.current) {
|
||||
setTimeout(() => {
|
||||
chartRef.current?.getEchartsInstance().resize();
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
}}
|
||||
/>
|
||||
}
|
||||
</Card>
|
||||
|
||||
@@ -4,11 +4,11 @@ import { useTranslation } from 'react-i18next';
|
||||
import { useLocation, useNavigate, useParams } from 'react-router-dom';
|
||||
import Table, { type TableRef } from '@/components/Table'
|
||||
import type { AnyObject } from 'antd/es/_util/type';
|
||||
import type { UploadFileResponse,KnowledgeBaseDocumentData } from '../types';
|
||||
import type { UploadFileResponse,KnowledgeBaseDocumentData } from '@/views/KnowledgeBase/types';
|
||||
import type { ColumnsType } from 'antd/es/table';
|
||||
import UploadFiles from '@/components/Upload/UploadFiles';
|
||||
import type { UploadRequestOption } from 'rc-upload/lib/interface';
|
||||
import { uploadFile, getDocumentList, previewDocumentChunk, parseDocument, updateDocument, deleteDocument } from '../service';
|
||||
import { uploadFile, getDocumentList, previewDocumentChunk, parseDocument, updateDocument, deleteDocument } from '@/api/knowledgeBase';
|
||||
import exitIcon from '@/assets/images/knowledgeBase/exit.png';
|
||||
import { NoData } from '../components/noData';
|
||||
import noDataIcon from '@/assets/images/knowledgeBase/noData.png';
|
||||
@@ -227,7 +227,7 @@ const CreateDataset = () => {
|
||||
return (
|
||||
<span className="rb:text-xs rb:border rb:border-[#DFE4ED] rb:bg-[#FBFDFF] rb:rounded rb:items-center rb:text-[#212332] rb:py-1 rb:px-2">
|
||||
<span className="rb:inline-block rb:w-[5px] rb:h-[5px] rb:mr-2 rb:rounded-full" style={{ backgroundColor: value === 1 ? '#369F21' : '#FF8A4C' }}></span>
|
||||
<span>{value === 1 ? 'Completed' : 'Processing'}</span>
|
||||
<span>{value === 1 ? t('knowledgeBase.completed') : value === 0 ? t('knowledgeBase.pending') : t('knowledgeBase.processing')}</span>
|
||||
</span>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -10,8 +10,8 @@ import { useEffect, useState, useRef, type FC } from 'react';
|
||||
import { useNavigate, useParams, useLocation } from 'react-router-dom';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { Button, Spin, message, Switch } from 'antd';
|
||||
import { getDocumentDetail, getDocumentChunkList, downloadFile, updateDocument, updateDocumentChunk, createDocumentChunk } from '../service';
|
||||
import type { KnowledgeBaseDocumentData, RecallTestData } from '../types';
|
||||
import { getDocumentDetail, getDocumentChunkList, downloadFile, updateDocument, updateDocumentChunk, createDocumentChunk } from '@/api/knowledgeBase';
|
||||
import type { KnowledgeBaseDocumentData, RecallTestData } from '@/views/KnowledgeBase/types';
|
||||
import { formatDateTime } from '@/utils/format';
|
||||
import InfoPanel, { type InfoItem } from '../components/InfoPanel';
|
||||
import RecallTestResult from '../components/RecallTestResult';
|
||||
|
||||
@@ -12,7 +12,7 @@ import { MoreOutlined } from '@ant-design/icons';
|
||||
import folderIcon from '@/assets/images/knowledgeBase/folder.png';
|
||||
import textIcon from '@/assets/images/knowledgeBase/text.png';
|
||||
import editIcon from '@/assets/images/knowledgeBase/edit.png';
|
||||
import { getKnowledgeBaseDetail, deleteDocument, downloadFile, updateKnowledgeBase } from '../service';
|
||||
import { getKnowledgeBaseDetail, deleteDocument, downloadFile, updateKnowledgeBase } from '@/api/knowledgeBase';
|
||||
import type {
|
||||
CreateModalRef,
|
||||
KnowledgeBaseListItem,
|
||||
@@ -22,7 +22,7 @@ import type {
|
||||
ShareModalRef,
|
||||
CreateDatasetModalRef,FolderFormData,
|
||||
KnowledgeBaseDocumentData
|
||||
} from '../types';
|
||||
} from '@/views/KnowledgeBase/types';
|
||||
import RecallTestDrawer from '../components/RecallTestDrawer';
|
||||
import CreateFolderModal from '../components/CreateFolderModal';
|
||||
import CreateModal from '../components/CreateModal';
|
||||
@@ -64,6 +64,7 @@ const Private: FC = () => {
|
||||
const [folderTreeRefreshKey, setFolderTreeRefreshKey] = useState(0);
|
||||
const { allBreadcrumbs, setCustomBreadcrumbs } = useMenu();
|
||||
const [folderPath, setFolderPath] = useState<Array<{ id: string; name: string }>>([]);
|
||||
const [selectedKeys, setSelectedKeys] = useState<React.Key[]>([]);
|
||||
useEffect(() => {
|
||||
if (knowledgeBaseId) {
|
||||
let url = `/documents/${knowledgeBaseId}/${parentId}/documents`;
|
||||
@@ -143,8 +144,23 @@ const Private: FC = () => {
|
||||
disposable: false,
|
||||
appSystem: null,
|
||||
subs: [],
|
||||
onClick: (e?: React.MouseEvent) => {
|
||||
// 阻止默认行为和事件冒泡
|
||||
e?.preventDefault();
|
||||
e?.stopPropagation();
|
||||
// 点击知识库名称,回到根目录
|
||||
setParentId(knowledgeBaseId);
|
||||
setFolder({
|
||||
kb_id: knowledgeBaseId ?? '',
|
||||
parent_id: knowledgeBaseId ?? ''
|
||||
});
|
||||
setTableApi(`/documents/${knowledgeBaseId}/${knowledgeBaseId}/documents`);
|
||||
setFolderPath([]);
|
||||
setSelectedKeys([knowledgeBaseId ?? '']);
|
||||
return false;
|
||||
},
|
||||
},
|
||||
...folderPath.map((folder) => ({
|
||||
...folderPath.map((folder, index) => ({
|
||||
id: 0,
|
||||
parent: 0,
|
||||
code: null,
|
||||
@@ -166,6 +182,22 @@ const Private: FC = () => {
|
||||
disposable: false,
|
||||
appSystem: null,
|
||||
subs: [],
|
||||
onClick: (e?: React.MouseEvent) => {
|
||||
// 阻止默认行为和事件冒泡
|
||||
e?.preventDefault();
|
||||
e?.stopPropagation();
|
||||
// 点击文件夹,回到该文件夹层级
|
||||
setParentId(folder.id);
|
||||
setFolder({
|
||||
kb_id: knowledgeBaseId ?? '',
|
||||
parent_id: folder.id
|
||||
});
|
||||
setTableApi(`/documents/${knowledgeBaseId}/${folder.id}/documents`);
|
||||
// 更新文件夹路径,只保留到当前点击的文件夹
|
||||
setFolderPath(folderPath.slice(0, index + 1));
|
||||
setSelectedKeys([folder.id]);
|
||||
return false;
|
||||
},
|
||||
})),
|
||||
];
|
||||
|
||||
@@ -173,17 +205,18 @@ const Private: FC = () => {
|
||||
};
|
||||
|
||||
// 处理树节点选择
|
||||
const onSelect = (selectedKeys: React.Key[]) => {
|
||||
if (!selectedKeys.length) return;
|
||||
const onSelect = (keys: React.Key[]) => {
|
||||
if (!keys.length) return;
|
||||
if (!folder) return;
|
||||
const f = {
|
||||
...folder,
|
||||
parent_id: String(selectedKeys[0]),
|
||||
parent_id: String(keys[0]),
|
||||
}
|
||||
let url = `/documents/${knowledgeBaseId}/${String(selectedKeys[0])}/documents`;
|
||||
let url = `/documents/${knowledgeBaseId}/${String(keys[0])}/documents`;
|
||||
setTableApi(url);
|
||||
setParentId(String(selectedKeys[0]))
|
||||
setParentId(String(keys[0]))
|
||||
setFolder(f)
|
||||
setSelectedKeys(keys)
|
||||
};
|
||||
|
||||
// 处理文件夹路径变化
|
||||
@@ -511,6 +544,7 @@ const Private: FC = () => {
|
||||
refreshKey={folderTreeRefreshKey}
|
||||
onRootLoad={handleRootTreeLoad}
|
||||
onFolderPathChange={handleFolderPathChange}
|
||||
selectedKeys={selectedKeys}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { useEffect, useState, useRef, type FC } from 'react';
|
||||
import { useParams } from 'react-router-dom';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import type { KnowledgeBaseListItem, RecallTestDrawerRef } from '../types';
|
||||
import type { KnowledgeBaseListItem, RecallTestDrawerRef } from '@/views/KnowledgeBase/types';
|
||||
import RecallTest from '../components/RecallTest';
|
||||
import InfoPanel, { type InfoItem } from '../components/InfoPanel';
|
||||
import shareUserIcon from '@/assets/images/knowledgeBase/share-user.png';
|
||||
@@ -13,8 +13,9 @@ import kbSizeIcon from '@/assets/images/knowledgeBase/kb-size.png';
|
||||
import kbModelIcon from '@/assets/images/knowledgeBase/kb-model.png';
|
||||
|
||||
import kbHistoryIcon from '@/assets/images/knowledgeBase/kb-history.png';
|
||||
import { getKnowledgeBaseDetail } from '../service';
|
||||
import { getKnowledgeBaseDetail } from '@/api/knowledgeBase';
|
||||
import { formatDateTime } from '@/utils/format';
|
||||
import { useMenu } from '@/store/menu';
|
||||
|
||||
const Share: FC = () => {
|
||||
const { t } = useTranslation();
|
||||
@@ -24,6 +25,7 @@ const Share: FC = () => {
|
||||
const [knowledgeBase, setKnowledgeBase] = useState<KnowledgeBaseListItem | null>(null);
|
||||
const recallTestRef = useRef<RecallTestDrawerRef>(null);
|
||||
const [infoItems, setInfoItems] = useState<InfoItem[]>([]);
|
||||
const { allBreadcrumbs, setCustomBreadcrumbs } = useMenu();
|
||||
useEffect(() => {
|
||||
console.log('Share.tsx - useParams result:', params);
|
||||
console.log('Share.tsx - knowledgeBaseId:', knowledgeBaseId);
|
||||
@@ -40,6 +42,13 @@ const Share: FC = () => {
|
||||
console.warn('Share.tsx - knowledgeBaseId is undefined or empty');
|
||||
}
|
||||
}, [knowledgeBaseId]);
|
||||
|
||||
// 更新面包屑
|
||||
useEffect(() => {
|
||||
if (knowledgeBase) {
|
||||
updateBreadcrumbs();
|
||||
}
|
||||
}, [knowledgeBase]);
|
||||
const formatInfoItems = (data: KnowledgeBaseListItem): InfoItem[] => {
|
||||
const items: InfoItem[] = [
|
||||
{
|
||||
@@ -103,6 +112,47 @@ const Share: FC = () => {
|
||||
});
|
||||
};
|
||||
|
||||
// 更新面包屑,包含知识库名称
|
||||
const updateBreadcrumbs = () => {
|
||||
if (!knowledgeBase) return;
|
||||
|
||||
const baseBreadcrumbs = allBreadcrumbs['space'] || [];
|
||||
// 只保留知识库菜单项之前的面包屑
|
||||
const knowledgeBaseMenuIndex = baseBreadcrumbs.findIndex(item => item.path === '/knowledge-base');
|
||||
const filteredBaseBreadcrumbs = knowledgeBaseMenuIndex >= 0
|
||||
? baseBreadcrumbs.slice(0, knowledgeBaseMenuIndex + 1)
|
||||
: baseBreadcrumbs;
|
||||
|
||||
const customBreadcrumbs = [
|
||||
...filteredBaseBreadcrumbs,
|
||||
{
|
||||
id: 0,
|
||||
parent: 0,
|
||||
code: null,
|
||||
label: knowledgeBase.name,
|
||||
i18nKey: null,
|
||||
path: null,
|
||||
enable: true,
|
||||
display: true,
|
||||
level: 0,
|
||||
sort: 0,
|
||||
icon: null,
|
||||
iconActive: null,
|
||||
menuDesc: null,
|
||||
deleted: null,
|
||||
updateTime: 0,
|
||||
new_: null,
|
||||
keepAlive: false,
|
||||
master: null,
|
||||
disposable: false,
|
||||
appSystem: null,
|
||||
subs: [],
|
||||
},
|
||||
];
|
||||
|
||||
setCustomBreadcrumbs(customBreadcrumbs, 'space');
|
||||
};
|
||||
|
||||
// const handleBack = () => {
|
||||
// navigate('/knowledge-base');
|
||||
// };
|
||||
|
||||
@@ -11,7 +11,7 @@ import type { RadioChangeEvent } from 'antd';
|
||||
import { Flex, Radio } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import type { CreateDatasetModalRef, CreateDatasetModalRefProps} from '../types';
|
||||
import type { CreateDatasetModalRef, CreateDatasetModalRefProps} from '@/views/KnowledgeBase/types';
|
||||
import RbModal from '@/components/RbModal'
|
||||
const style: React.CSSProperties = {
|
||||
display: 'flex',
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
import { forwardRef, useImperativeHandle, useState } from 'react';
|
||||
import { Form, Input } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import type { FolderFormData, KnowledgeBaseFormData, CreateFolderModalRef, CreateFolderModalRefProps } from '../types';
|
||||
import type { FolderFormData, KnowledgeBaseFormData, CreateFolderModalRef, CreateFolderModalRefProps } from '@/views/KnowledgeBase/types';
|
||||
import RbModal from '@/components/RbModal'
|
||||
import { createFolder, updateKnowledgeBase } from '../service';
|
||||
import { createFolder, updateKnowledgeBase } from '@/api/knowledgeBase';
|
||||
const CreateFolderModal = forwardRef<CreateFolderModalRef,CreateFolderModalRefProps>(({
|
||||
refreshTable
|
||||
}, ref) => {
|
||||
|
||||
@@ -2,11 +2,11 @@ import { forwardRef, useImperativeHandle, useState, useRef } from 'react';
|
||||
import { Form, Input } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import type { UploadFile } from 'antd';
|
||||
import type { CreateImageModalRef, CreateImageMoealRefProps,UploadFileResponse } from '../types';
|
||||
import type { CreateImageModalRef, CreateImageMoealRefProps,UploadFileResponse } from '@/views/KnowledgeBase/types';
|
||||
import type { UploadRequestOption } from 'rc-upload/lib/interface';
|
||||
import RbModal from '@/components/RbModal';
|
||||
import UploadFiles from '@/components/Upload/UploadFiles';
|
||||
import { uploadFile } from '../service';
|
||||
import { uploadFile } from '@/api/knowledgeBase';
|
||||
|
||||
interface ImageDatasetFormData {
|
||||
name: string;
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react';
|
||||
import { Form, Input, Select, Modal } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import type { KnowledgeBaseListItem, KnowledgeBaseFormData, CreateModalRef, CreateModalRefProps } from '../types';
|
||||
import { getModelTypeList, getModelList, createKnowledgeBase, updateKnowledgeBase } from '../service'
|
||||
import type { KnowledgeBaseListItem, KnowledgeBaseFormData, CreateModalRef, CreateModalRefProps } from '@/views/KnowledgeBase/types';
|
||||
import { getModelTypeList, getModelList, createKnowledgeBase, updateKnowledgeBase } from '@/api/knowledgeBase'
|
||||
import RbModal from '@/components/RbModal'
|
||||
const { TextArea } = Input;
|
||||
const { confirm } = Modal
|
||||
@@ -15,7 +15,7 @@ const CreateModal = forwardRef<CreateModalRef, CreateModalRefProps>(({
|
||||
const [modelTypeList, setModelTypeList] = useState<string[]>([]);
|
||||
const [modelOptionsByType, setModelOptionsByType] = useState<Record<string, { label: string; value: string }[]>>({});
|
||||
const [datasets, setDatasets] = useState<KnowledgeBaseListItem | null>(null);
|
||||
const [currentType, setCurrentType] = useState<string>('General'); // 保存当前 type
|
||||
const [currentType, setCurrentType] = useState<'General' | 'Web' | 'Third-party' | 'Folder'>('General');
|
||||
const [form] = Form.useForm<KnowledgeBaseFormData>();
|
||||
const [loading, setLoading] = useState(false)
|
||||
|
||||
@@ -102,7 +102,7 @@ const CreateModal = forwardRef<CreateModalRef, CreateModalRefProps>(({
|
||||
const handleOpen = (record?: KnowledgeBaseListItem | null, type?: string) => {
|
||||
setDatasets(record || null);
|
||||
const nextType = type || currentType;
|
||||
setCurrentType(nextType);
|
||||
setCurrentType(nextType as any);
|
||||
setBaseFields(record || null, nextType);
|
||||
getTypeList(record || null);
|
||||
setVisible(true);
|
||||
|
||||
@@ -8,7 +8,7 @@ import textIcon from '@/assets/images/knowledgeBase/text.png';
|
||||
import imageIcon from '@/assets/images/knowledgeBase/image.png';
|
||||
import datasetsIcon from '@/assets/images/knowledgeBase/datasets.png';
|
||||
import switcherIcon from '@/assets/images/knowledgeBase/switcher.png';
|
||||
import { getFolderList } from '../service';
|
||||
import { getFolderList } from '@/api/knowledgeBase';
|
||||
|
||||
const { DirectoryTree } = Tree;
|
||||
|
||||
@@ -59,6 +59,7 @@ interface FolderTreeProps {
|
||||
refreshKey?: number;
|
||||
onRootLoad?: (nodes: TreeNodeData[] | null) => void;
|
||||
onFolderPathChange?: (path: Array<{ id: string; name: string }>) => void;
|
||||
selectedKeys?: React.Key[];
|
||||
}
|
||||
|
||||
const renderIcon = (icon?: string) => {
|
||||
@@ -273,6 +274,7 @@ const FolderTree: FC<FolderTreeProps> = ({
|
||||
refreshKey = 0,
|
||||
onRootLoad,
|
||||
onFolderPathChange,
|
||||
selectedKeys,
|
||||
}) => {
|
||||
const [treeData, setTreeData] = useState<TreeNodeData[]>([]);
|
||||
|
||||
@@ -396,6 +398,7 @@ const FolderTree: FC<FolderTreeProps> = ({
|
||||
onExpand={onExpand}
|
||||
loadData={onLoadData}
|
||||
treeData={treeNodes}
|
||||
selectedKeys={selectedKeys}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -2,10 +2,10 @@
|
||||
import { forwardRef, useImperativeHandle, useState, useEffect } from 'react';
|
||||
import { Form, Input, Select, Button, InputNumber } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import type { RecallTestDrawerRef, RecallTestData, RecallTestParams } from '../types';
|
||||
import type { RecallTestDrawerRef, RecallTestData, RecallTestParams } from '@/views/KnowledgeBase/types';
|
||||
// import refreshIcon from '@/assets/images/knowledgeBase/refresh-blue.png';
|
||||
import RecallTestResult from './RecallTestResult';
|
||||
import { reChunks, getRetrievalModeType } from '../service';
|
||||
import { reChunks, getRetrievalModeType } from '@/api/knowledgeBase';
|
||||
import { hybrid } from 'react-syntax-highlighter/dist/esm/styles/hljs';
|
||||
|
||||
const { TextArea } = Input;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import { forwardRef, useImperativeHandle, useState, useRef, useLayoutEffect, useCallback } from 'react';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import RbDrawer from '@/components/RbDrawer';
|
||||
import type { RecallTestDrawerRef } from '../types';
|
||||
import type { RecallTestDrawerRef } from '@/views/KnowledgeBase/types';
|
||||
import RecallTest from './RecallTest';
|
||||
|
||||
const RecallTestDrawer = forwardRef<RecallTestDrawerRef>(({},ref) => {
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import { FileOutlined, FieldTimeOutlined, EditOutlined } from '@ant-design/icons';
|
||||
import { Skeleton } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import type { RecallTestData } from '../types';
|
||||
import type { RecallTestData } from '@/views/KnowledgeBase/types';
|
||||
import { NoData } from './noData';
|
||||
import { formatDateTime } from '@/utils/format';
|
||||
import InfiniteScroll from 'react-infinite-scroll-component';
|
||||
|
||||
@@ -10,14 +10,14 @@ import { forwardRef, useImperativeHandle, useState, useRef } from 'react';
|
||||
import { Switch } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { message } from 'antd';
|
||||
import type { ShareModalRef, ShareModalRefProps, KnowledgeBase} from '../types';
|
||||
import type { ShareModalRef, ShareModalRefProps, KnowledgeBase} from '@/views/KnowledgeBase/types';
|
||||
import RbModal from '@/components/RbModal'
|
||||
// import betchControlIcon from '@/assets/images/knowledgeBase/betch-control.png';
|
||||
import kbIcon from '@/assets/images/knowledgeBase/knowledge-management.png';
|
||||
// import robotIcon from '@/assets/images/knowledgeBase/robot.png';
|
||||
import { updateKnowledgeBase, getWorkspaceAuthorizationList } from '../service';
|
||||
import { updateKnowledgeBase, getWorkspaceAuthorizationList } from '@/api/knowledgeBase';
|
||||
import { NoData } from './noData';
|
||||
import type { ListQuery, ShareSpaceModalRef } from '../types';
|
||||
import type { ListQuery, ShareSpaceModalRef } from '@/views/KnowledgeBase/types';
|
||||
import { formatDateTime } from '@/utils/format';
|
||||
import ShareSpaceModal from './ShareSpaceModal'
|
||||
const ShareModal = forwardRef<ShareModalRef,ShareModalRefProps>(({ handleShare: onShare }, ref) => {
|
||||
|
||||
@@ -10,14 +10,14 @@ import { forwardRef, useImperativeHandle, useState } from 'react';
|
||||
import { Switch } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import { message } from 'antd';
|
||||
import type { ShareModalRef, ShareModalRefProps, KnowledgeBase} from '../types';
|
||||
import type { ShareModalRef, ShareModalRefProps, KnowledgeBase} from '@/views/KnowledgeBase/types';
|
||||
import RbModal from '@/components/RbModal'
|
||||
// import betchControlIcon from '@/assets/images/knowledgeBase/betch-control.png';
|
||||
import kbIcon from '@/assets/images/knowledgeBase/knowledge-management.png';
|
||||
// import robotIcon from '@/assets/images/knowledgeBase/robot.png';
|
||||
import { getSpaceList, shareKnowledgeBase } from '../service';
|
||||
import { getSpaceList, shareKnowledgeBase } from '@/api/knowledgeBase';
|
||||
import { NoData } from './noData';
|
||||
import type { SpaceItem } from '../types';
|
||||
import type { SpaceItem } from '@/views/KnowledgeBase/types';
|
||||
import { formatDateTime } from '@/utils/format';
|
||||
const ShareModal = forwardRef<ShareModalRef,ShareModalRefProps>(({ handleShare: onShare }, ref) => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
@@ -5,7 +5,7 @@ import { Button } from 'antd';
|
||||
import { ArrowLeftOutlined } from '@ant-design/icons';
|
||||
|
||||
import { request } from '@/utils/request';
|
||||
import type { KnowledgeBase } from './types';
|
||||
import type { KnowledgeBase } from '@/views/KnowledgeBase/types';
|
||||
|
||||
const Datasets: FC = () => {
|
||||
const { t } = useTranslation();
|
||||
|
||||
@@ -10,14 +10,16 @@ import folderIcon from '@/assets/images/knowledgeBase/folder.png';
|
||||
import generalIcon from '@/assets/images/knowledgeBase/datasets.png';
|
||||
import webIcon from '@/assets/images/knowledgeBase/general.png';
|
||||
import tpIcon from '@/assets/images/knowledgeBase/text.png';
|
||||
import type { KnowledgeBaseListItem, CreateModalRef, KnowledgeBaseListResponse, ListQuery } from './types'
|
||||
import type { KnowledgeBaseListItem, CreateModalRef, KnowledgeBaseListResponse, ListQuery } from '@/views/KnowledgeBase/types'
|
||||
import CreateModal from './components/CreateModal'
|
||||
import RbCard from '@/components/RbCard'
|
||||
import SearchInput from '@/components/SearchInput'
|
||||
import Empty from '@/components/Empty'
|
||||
import { getKnowledgeBaseList, getModelList, getModelTypeList, deleteKnowledgeBase, getKnowledgeBaseTypeList } from './service'
|
||||
import { getKnowledgeBaseList, getModelList, getModelTypeList, deleteKnowledgeBase, getKnowledgeBaseTypeList } from '@/api/knowledgeBase'
|
||||
const { confirm } = Modal;
|
||||
import InfiniteScroll from 'react-infinite-scroll-component';
|
||||
import { useMenu } from '@/store/menu';
|
||||
|
||||
type ModelMenuInfo = {
|
||||
menu: NonNullable<MenuProps['items']>;
|
||||
summary: string[];
|
||||
@@ -41,6 +43,10 @@ const KnowledgeBaseManagement: FC = () => {
|
||||
const modalRef = useRef<CreateModalRef>(null)
|
||||
const [messageApi, contextHolder] = message.useMessage();
|
||||
|
||||
// 使用 menu store 管理面包屑
|
||||
const { allBreadcrumbs, setCustomBreadcrumbs } = useMenu();
|
||||
const [folderPath, setFolderPath] = useState<Array<{ id: string; name: string }>>([]);
|
||||
|
||||
|
||||
// 生成下拉菜单项(根据当前 item)
|
||||
const getOptMenuItems = (item: KnowledgeBaseListItem): MenuProps['items'] => {
|
||||
@@ -105,7 +111,17 @@ const KnowledgeBaseManagement: FC = () => {
|
||||
|
||||
// 处理创建
|
||||
const handleCreate = (type?: string) => {
|
||||
modalRef?.current?.handleOpen(null, type)
|
||||
// 如果在文件夹内,使用 folderPath 的最后一项作为 parent_id
|
||||
// 这样更可靠,因为 folderPath 是直接管理的状态
|
||||
const currentParentId = folderPath.length > 0
|
||||
? folderPath[folderPath.length - 1].id
|
||||
: query.parent_id; // 降级使用 query.parent_id
|
||||
|
||||
const record = currentParentId ? {
|
||||
parent_id: currentParentId as string,
|
||||
} as KnowledgeBaseListItem : null;
|
||||
|
||||
modalRef?.current?.handleOpen(record, type)
|
||||
}
|
||||
|
||||
// 动态生成 createItems
|
||||
@@ -118,7 +134,7 @@ const KnowledgeBaseManagement: FC = () => {
|
||||
handleCreate(type);
|
||||
},
|
||||
}));
|
||||
}, [knowledgeBaseTypes, t]);
|
||||
}, [knowledgeBaseTypes, t, folderPath, query]);
|
||||
const typeToFieldKey = (type: string) => {
|
||||
const normalized = (type || '').toLowerCase();
|
||||
switch (normalized) {
|
||||
@@ -176,7 +192,7 @@ const KnowledgeBaseManagement: FC = () => {
|
||||
const fetchKnowledgeBaseTypes = async () => {
|
||||
try {
|
||||
let types = await getKnowledgeBaseTypeList();
|
||||
types = types.filter(type => (type === 'General' )); //|| type === 'Folder'
|
||||
types = types.filter(type => (type === 'General' || type === 'Folder' )); //
|
||||
//暂时未实现 ,过滤掉未实现
|
||||
setKnowledgeBaseTypes(types);
|
||||
} catch (error) {
|
||||
@@ -337,6 +353,25 @@ const KnowledgeBaseManagement: FC = () => {
|
||||
};
|
||||
// 处理跳转详情
|
||||
const handleToDetail = (knowledgeBase: KnowledgeBaseListItem) => {
|
||||
// 如果是 Folder 类型,刷新当前页面,显示该文件夹下的知识库列表
|
||||
if (knowledgeBase.type === 'Folder' || knowledgeBase.type === 'folder') {
|
||||
// 添加到文件夹路径
|
||||
const newFolderPath = [
|
||||
...folderPath,
|
||||
{
|
||||
id: knowledgeBase.id,
|
||||
name: knowledgeBase.name,
|
||||
},
|
||||
];
|
||||
setFolderPath(newFolderPath);
|
||||
|
||||
setQuery((prev) => ({
|
||||
...prev,
|
||||
parent_id: knowledgeBase.id,
|
||||
}));
|
||||
return;
|
||||
}
|
||||
|
||||
// 根据权限类型跳转到不同的详情页
|
||||
if (knowledgeBase.permission_id === 'Private' || knowledgeBase.permission_id === 'private') {
|
||||
navigate(`/knowledge-base/${knowledgeBase.id}/private`)
|
||||
@@ -344,6 +379,83 @@ const KnowledgeBaseManagement: FC = () => {
|
||||
navigate(`/knowledge-base/${knowledgeBase.id}/share`)
|
||||
}
|
||||
}
|
||||
// 更新面包屑的函数
|
||||
const updateBreadcrumbs = () => {
|
||||
const baseBreadcrumbs = allBreadcrumbs['space'] || [];
|
||||
// 只保留知识库菜单项之前的面包屑
|
||||
const knowledgeBaseMenuIndex = baseBreadcrumbs.findIndex(item => item.path === '/knowledge-base');
|
||||
const filteredBaseBreadcrumbs = knowledgeBaseMenuIndex >= 0
|
||||
? baseBreadcrumbs.slice(0, knowledgeBaseMenuIndex + 1)
|
||||
: baseBreadcrumbs;
|
||||
|
||||
// 给"知识库管理"添加点击事件,返回根目录
|
||||
const breadcrumbsWithClick = filteredBaseBreadcrumbs.map((item) => {
|
||||
if (item.path === '/knowledge-base') {
|
||||
return {
|
||||
...item,
|
||||
onClick: (e?: React.MouseEvent) => {
|
||||
e?.preventDefault();
|
||||
e?.stopPropagation();
|
||||
// 返回根目录
|
||||
setFolderPath([]);
|
||||
setQuery((prev) => ({
|
||||
...prev,
|
||||
parent_id: undefined,
|
||||
}));
|
||||
return false;
|
||||
},
|
||||
};
|
||||
}
|
||||
return item;
|
||||
});
|
||||
|
||||
const customBreadcrumbs = [
|
||||
...breadcrumbsWithClick,
|
||||
...folderPath.map((folder, index) => ({
|
||||
id: 0,
|
||||
parent: 0,
|
||||
code: null,
|
||||
label: folder.name,
|
||||
i18nKey: null,
|
||||
path: null,
|
||||
enable: true,
|
||||
display: true,
|
||||
level: 0,
|
||||
sort: 0,
|
||||
icon: null,
|
||||
iconActive: null,
|
||||
menuDesc: null,
|
||||
deleted: null,
|
||||
updateTime: 0,
|
||||
new_: null,
|
||||
keepAlive: false,
|
||||
master: null,
|
||||
disposable: false,
|
||||
appSystem: null,
|
||||
subs: [],
|
||||
onClick: (e?: React.MouseEvent) => {
|
||||
e?.preventDefault();
|
||||
e?.stopPropagation();
|
||||
// 点击文件夹,回到该文件夹层级
|
||||
const newFolderPath = folderPath.slice(0, index + 1);
|
||||
setFolderPath(newFolderPath);
|
||||
setQuery((prev) => ({
|
||||
...prev,
|
||||
parent_id: folder.id,
|
||||
}));
|
||||
return false;
|
||||
},
|
||||
})),
|
||||
];
|
||||
|
||||
setCustomBreadcrumbs(customBreadcrumbs, 'space');
|
||||
};
|
||||
|
||||
// 更新面包屑
|
||||
useEffect(() => {
|
||||
updateBreadcrumbs();
|
||||
}, [folderPath]);
|
||||
|
||||
useEffect(() => {
|
||||
fetchModelTypes();
|
||||
fetchKnowledgeBaseTypes();
|
||||
|
||||
@@ -4,7 +4,7 @@ import { Col, Row, App, Skeleton, Space, Select } from 'antd'
|
||||
import clsx from 'clsx'
|
||||
|
||||
import ConversationEmptyIcon from '@/assets/images/conversation/conversationEmpty.svg'
|
||||
import AnalysisEmptyIcon from '@/assets/images/conversation/analysisEmpty.svg'
|
||||
import AnalysisEmptyIcon from '@/assets/images/conversation/analysisEmpty.png'
|
||||
import Card from './components/Card'
|
||||
import Chat from './components/Chat'
|
||||
import { readService, getUserMemoryList } from '@/api/memory'
|
||||
@@ -139,6 +139,9 @@ const MemoryConversation: FC = () => {
|
||||
<Empty
|
||||
url={AnalysisEmptyIcon}
|
||||
className="rb:h-full"
|
||||
title={t('memoryConversation.memoryConversationAnalysisEmpty')}
|
||||
subTitle={t('memoryConversation.memoryConversationAnalysisEmptySubTitle')}
|
||||
size={[270, 170]}
|
||||
/>
|
||||
: <Space size={12} direction="vertical" style={{width: '100%'}}>
|
||||
{logs.map((log, logIndex) => (
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import noPermission from '@/assets/images/empty/noPermission.svg';
|
||||
import noPermission from '@/assets/images/empty/noPermission.png';
|
||||
import Empty from '@/components/Empty';
|
||||
|
||||
const NoPermission = () => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { useTranslation } from 'react-i18next';
|
||||
import notFoundImg from '@/assets/images/empty/404.svg';
|
||||
import notFoundImg from '@/assets/images/empty/404.png';
|
||||
import Empty from '@/components/Empty';
|
||||
|
||||
const NotFound = () => {
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
import { forwardRef, useImperativeHandle, useState } from 'react';
|
||||
import { Form, Input, App } from 'antd';
|
||||
import { forwardRef, useImperativeHandle, useState, useEffect } from 'react';
|
||||
import { Form, Input, App, Select } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import type { SpaceModalData, SpaceModalRef, Space } from '../types'
|
||||
import RbModal from '@/components/RbModal'
|
||||
import { createWorkspace } from '@/api/workspaces'
|
||||
import RadioGroupCard from '@/components/RadioGroupCard'
|
||||
import { getModelListUrl } from '@/api/models'
|
||||
import { getModelListUrl, getModelList } from '@/api/models'
|
||||
import CustomSelect from '@/components/CustomSelect'
|
||||
import type { Model } from '@/views/ModelManagement/types'
|
||||
|
||||
const FormItem = Form.Item;
|
||||
|
||||
@@ -28,6 +29,7 @@ const SpaceModal = forwardRef<SpaceModalRef, SpaceModalProps>(({
|
||||
const [form] = Form.useForm<SpaceModalData>();
|
||||
const [loading, setLoading] = useState(false)
|
||||
const [editVo, setEditVo] = useState<Space | null>(null)
|
||||
const [modelList, setModelList] = useState<Model[]>([])
|
||||
|
||||
const values = Form.useWatch([], form);
|
||||
|
||||
@@ -73,6 +75,21 @@ const SpaceModal = forwardRef<SpaceModalRef, SpaceModalProps>(({
|
||||
});
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
getModels()
|
||||
}, [])
|
||||
|
||||
const getModels = () => {
|
||||
const requests = [getModelList({ type: 'llm', pagesize: 100, page: 1 }), getModelList({ type: 'chat', pagesize: 100, page: 1 })]
|
||||
Promise.all(requests)
|
||||
.then(responses => {
|
||||
const [chatRes, modelRes] = responses as { items: Model[] }[]
|
||||
const chatList = chatRes.items || []
|
||||
const modelList = modelRes.items || []
|
||||
setModelList([...chatList, ...modelList])
|
||||
})
|
||||
}
|
||||
|
||||
// 暴露给父组件的方法
|
||||
useImperativeHandle(ref, () => ({
|
||||
handleOpen,
|
||||
@@ -104,13 +121,13 @@ const SpaceModal = forwardRef<SpaceModalRef, SpaceModalProps>(({
|
||||
name="llm"
|
||||
rules={[{ required: true, message: t('common.pleaseSelect') }]}
|
||||
>
|
||||
<CustomSelect
|
||||
url={getModelListUrl}
|
||||
params={{ type: 'llm', pagesize: 100 }}
|
||||
valueKey="id"
|
||||
labelKey="name"
|
||||
hasAll={false}
|
||||
style={{width: '100%'}}
|
||||
<Select
|
||||
placeholder={t('common.pleaseSelect')}
|
||||
fieldNames={{
|
||||
label: 'name',
|
||||
value: 'id',
|
||||
}}
|
||||
options={modelList}
|
||||
/>
|
||||
</Form.Item>
|
||||
<Form.Item
|
||||
|
||||
@@ -10,6 +10,7 @@ const Colors = ['#155EEF', '#4DA8FF', '#03BDFF', '#31E8FF', '#AD88FF', '#FFB048'
|
||||
const PieCard: FC = () => {
|
||||
const { id } = useParams()
|
||||
const chartRef = useRef<ReactEcharts>(null);
|
||||
const resizeScheduledRef = useRef(false)
|
||||
const [loading, setLoading] = useState(false)
|
||||
const [data, setData] = useState<Array<Record<string, string | number>>>([])
|
||||
|
||||
@@ -30,6 +31,29 @@ const PieCard: FC = () => {
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
useEffect(() => {
|
||||
const handleResize = () => {
|
||||
if (chartRef.current && !resizeScheduledRef.current) {
|
||||
resizeScheduledRef.current = true
|
||||
requestAnimationFrame(() => {
|
||||
chartRef.current?.getEchartsInstance().resize();
|
||||
resizeScheduledRef.current = false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const resizeObserver = new ResizeObserver(handleResize)
|
||||
const chartElement = chartRef.current?.getEchartsInstance().getDom().parentElement
|
||||
if (chartElement) {
|
||||
resizeObserver.observe(chartElement)
|
||||
}
|
||||
|
||||
return () => {
|
||||
resizeObserver.disconnect()
|
||||
}
|
||||
}, [data])
|
||||
|
||||
return (
|
||||
<>
|
||||
{loading
|
||||
@@ -108,17 +132,6 @@ const PieCard: FC = () => {
|
||||
style={{ height: '340px', width: '100%' }}
|
||||
notMerge={true}
|
||||
lazyUpdate={true}
|
||||
onEvents={{
|
||||
// 图表渲染完成后再次调整大小,确保宽度正确
|
||||
// 使用 setTimeout 避免在主渲染过程中调用 resize
|
||||
rendered: () => {
|
||||
if (chartRef.current) {
|
||||
setTimeout(() => {
|
||||
chartRef.current?.getEchartsInstance().resize();
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
}}
|
||||
/>
|
||||
}
|
||||
</>
|
||||
|
||||
@@ -23,6 +23,7 @@ const RelationshipNetwork:FC = () => {
|
||||
const { t } = useTranslation()
|
||||
const { id } = useParams()
|
||||
const chartRef = useRef<ReactEcharts>(null)
|
||||
const resizeScheduledRef = useRef(false)
|
||||
const [nodes, setNodes] = useState<Node[]>([])
|
||||
const [links, setLinks] = useState<Edge[]>([])
|
||||
const [categories, setCategories] = useState<{ name: string }[]>([])
|
||||
@@ -83,6 +84,28 @@ const RelationshipNetwork:FC = () => {
|
||||
setNodes(uniqueNodes)
|
||||
})
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
const handleResize = () => {
|
||||
if (chartRef.current && !resizeScheduledRef.current) {
|
||||
resizeScheduledRef.current = true
|
||||
requestAnimationFrame(() => {
|
||||
chartRef.current?.getEchartsInstance().resize();
|
||||
resizeScheduledRef.current = false
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const resizeObserver = new ResizeObserver(handleResize)
|
||||
const chartElement = chartRef.current?.getEchartsInstance().getDom().parentElement
|
||||
if (chartElement) {
|
||||
resizeObserver.observe(chartElement)
|
||||
}
|
||||
|
||||
return () => {
|
||||
resizeObserver.disconnect()
|
||||
}
|
||||
}, [nodes])
|
||||
return (
|
||||
<>
|
||||
{/* 关系网络 */}
|
||||
@@ -147,15 +170,6 @@ const RelationshipNetwork:FC = () => {
|
||||
notMerge={false}
|
||||
lazyUpdate={true}
|
||||
onEvents={{
|
||||
// 图表渲染完成后再次调整大小,确保宽度正确
|
||||
// 使用 setTimeout 避免在主渲染过程中调用 resize
|
||||
rendered: () => {
|
||||
if (chartRef.current) {
|
||||
setTimeout(() => {
|
||||
chartRef.current?.getEchartsInstance().resize();
|
||||
}, 0);
|
||||
}
|
||||
},
|
||||
// 节点点击事件处理
|
||||
click: (params: { dataType: string; data: Node }) => {
|
||||
if (params.dataType === 'node') {
|
||||
|
||||
@@ -11,7 +11,7 @@ export default defineConfig({
|
||||
proxy: {
|
||||
// 主要API代理,支持 /api 和 /api/* 格式
|
||||
'/api': {
|
||||
target: 'http://127.0.0.1:8000', // 后端服务地址
|
||||
target: 'http://0.0.0.0:5173', // 后端服务地址
|
||||
changeOrigin: true,
|
||||
|
||||
// 匹配所有以/api开头的请求,包括/api/token
|
||||
|
||||