init 初始化 react + antd 版本前端
9
.editorconfig
Normal file
@ -0,0 +1,9 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
charset = utf-8
|
||||
end_of_line = lf
|
||||
insert_final_newline = true
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
||||
15
.env.development
Normal file
@ -0,0 +1,15 @@
|
||||
VITE_APP_TITLE=RuoYi-React-Plus后台管理系统
|
||||
VITE_APP_LOGO_TITLE=RuoYi-React-Plus
|
||||
VITE_APP_ENV=development
|
||||
VITE_APP_BASE_API=/dev-api
|
||||
VITE_APP_CONTEXT_PATH=/
|
||||
VITE_APP_PORT=8000
|
||||
VITE_APP_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e
|
||||
VITE_APP_MESSAGE_ENABLED=true
|
||||
VITE_APP_MESSAGE_TRANSPORT=sse
|
||||
VITE_APP_MESSAGE_PATH=/resource/message
|
||||
VITE_APP_ENCRYPT=true
|
||||
VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvEDuRIOM3oZPWj9Ukoc5pQklR4PFH6/clnjeFqjDLIgDyQvjxhgqAZQA+E9eD6qu6FsXPmK8djcL+nh3cFHz4pX473jDvO3Sve+8yL3VRQ0n2pRgQ2a01MJsy+WwTZCBYWf0VnLRIvANUoWQgy9vz94q7Va44dg7A1/3ICf+xAwIDAQAB
|
||||
VITE_APP_RSA_PRIVATE_KEY=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAObq7yrxfvyieZtTjAYyrdvi59tYTXxjO5ajmPCRSXBY9M9wQ1tli297JN6mnY53UJMNyOFNSZVi8WSFoIXjpR87FmvChJlzeN/dZdd3SEs48Ee66XKeSePYqxa8oO5GKDsnajgpsOHKXSeeVSIysiIPS2/WsEqk0In9P4w3RsRFAgMBAAECgYBiMEWwce24SPICnRzuScBpvmsudrbEDIH7BOd0a6LZlcnLJwZNJ7mJlshPsHNQb+WgEf135+BBGEhioPtn0yuTdEuKP4kB9UdYUKiayWCoWhJpesv7sAD4RDClV7dhuV+gcd1AXD+YzyRIPbGm0VC2U+4q8/+UPRpVjqskbLVTgQJBAPRpou7g3S8n4XB527kq0D8I3+ZYwMxZhszwhrCDpJU319+ucmpLVwYIzDmZVeID2QQdUaDfIEViFHu95xDrGiUCQQDx3YOKn3yaEctk/ERVn7hDAyAXUbd8/pv2b24/M/l1ZevlsFem8U4Jk5Mu64t3z3YGJoymEjQmbucwT01iKhehAkEAxlnccsRmfFh/KkqauKE4M4++NTAd9zlInpUsmZ+cN8UEGnF2RTEzRKBrLOt1uWCqBB7PGiE6DVTVjr7FAQPrSQJAT5yeY87DcONSk9cFlzmPqV8p/QME5rvYEnHzVBKDlkUKNPyqnWToTvaoh9U4fyNmsfeWbEOprszqhFhWHG3GgQJAK8+ynmyFhaw63+Hx2KU5zR4hVuQso2IzrEurGxCxybV6mR7VBerb4502+EPx3PmOgxQL+niUFhcMWxcvBFP9+A==
|
||||
VITE_APP_MONITOR_ADMIN=http://localhost:9090/admin/applications
|
||||
VITE_APP_SNAILJOB_ADMIN=http://localhost:8800/snail-job
|
||||
15
.env.production
Normal file
@ -0,0 +1,15 @@
|
||||
VITE_APP_TITLE=RuoYi-React-Plus后台管理系统
|
||||
VITE_APP_LOGO_TITLE=RuoYi-React-Plus
|
||||
VITE_APP_ENV=production
|
||||
VITE_APP_BASE_API=/prod-api
|
||||
VITE_APP_CONTEXT_PATH=/
|
||||
VITE_APP_PORT=8000
|
||||
VITE_APP_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e
|
||||
VITE_APP_MESSAGE_ENABLED=true
|
||||
VITE_APP_MESSAGE_TRANSPORT=sse
|
||||
VITE_APP_MESSAGE_PATH=/resource/message
|
||||
VITE_APP_ENCRYPT=true
|
||||
VITE_APP_RSA_PUBLIC_KEY=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDvEDuRIOM3oZPWj9Ukoc5pQklR4PFH6/clnjeFqjDLIgDyQvjxhgqAZQA+E9eD6qu6FsXPmK8djcL+nh3cFHz4pX473jDvO3Sve+8yL3VRQ0n2pRgQ2a01MJsy+WwTZCBYWf0VnLRIvANUoWQgy9vz94q7Va44dg7A1/3ICf+xAwIDAQAB
|
||||
VITE_APP_RSA_PRIVATE_KEY=MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAObq7yrxfvyieZtTjAYyrdvi59tYTXxjO5ajmPCRSXBY9M9wQ1tli297JN6mnY53UJMNyOFNSZVi8WSFoIXjpR87FmvChJlzeN/dZdd3SEs48Ee66XKeSePYqxa8oO5GKDsnajgpsOHKXSeeVSIysiIPS2/WsEqk0In9P4w3RsRFAgMBAAECgYBiMEWwce24SPICnRzuScBpvmsudrbEDIH7BOd0a6LZlcnLJwZNJ7mJlshPsHNQb+WgEf135+BBGEhioPtn0yuTdEuKP4kB9UdYUKiayWCoWhJpesv7sAD4RDClV7dhuV+gcd1AXD+YzyRIPbGm0VC2U+4q8/+UPRpVjqskbLVTgQJBAPRpou7g3S8n4XB527kq0D8I3+ZYwMxZhszwhrCDpJU319+ucmpLVwYIzDmZVeID2QQdUaDfIEViFHu95xDrGiUCQQDx3YOKn3yaEctk/ERVn7hDAyAXUbd8/pv2b24/M/l1ZevlsFem8U4Jk5Mu64t3z3YGJoymEjQmbucwT01iKhehAkEAxlnccsRmfFh/KkqauKE4M4++NTAd9zlInpUsmZ+cN8UEGnF2RTEzRKBrLOt1uWCqBB7PGiE6DVTVjr7FAQPrSQJAT5yeY87DcONSk9cFlzmPqV8p/QME5rvYEnHzVBKDlkUKNPyqnWToTvaoh9U4fyNmsfeWbEOprszqhFhWHG3GgQJAK8+ynmyFhaw63+Hx2KU5zR4hVuQso2IzrEurGxCxybV6mR7VBerb4502+EPx3PmOgxQL+niUFhcMWxcvBFP9+A==
|
||||
VITE_APP_MONITOR_ADMIN=/admin/applications
|
||||
VITE_APP_SNAILJOB_ADMIN=/snail-job
|
||||
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
node_modules
|
||||
dist
|
||||
.umi
|
||||
.umi-production
|
||||
src/.umi
|
||||
src/.umi-production
|
||||
.env.local
|
||||
*.log
|
||||
10
.idea/.gitignore
generated
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
# Default ignored files
|
||||
/shelf/
|
||||
/workspace.xml
|
||||
# Ignored default folder with query files
|
||||
/queries/
|
||||
# Datasource local storage ignored files
|
||||
/dataSources/
|
||||
/dataSources.local.xml
|
||||
# Editor-based HTTP Client requests
|
||||
/httpRequests/
|
||||
6
.idea/compiler.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="CompilerConfiguration">
|
||||
<option name="BUILD_PROCESS_HEAP_SIZE" value="2048" />
|
||||
</component>
|
||||
</project>
|
||||
3
.idea/dictionaries/LionLi.xml
generated
Normal file
@ -0,0 +1,3 @@
|
||||
<component name="ProjectDictionaryState">
|
||||
<dictionary name="LionLi" />
|
||||
</component>
|
||||
6
.idea/encodings.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8">
|
||||
<file url="PROJECT" charset="UTF-8" />
|
||||
</component>
|
||||
</project>
|
||||
17
.idea/misc.xml
generated
Normal file
@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectInspectionProfilesVisibleTreeState">
|
||||
<entry key="Project Default">
|
||||
<profile-state>
|
||||
<selected-state>
|
||||
<State>
|
||||
<id>User defined</id>
|
||||
</State>
|
||||
</selected-state>
|
||||
</profile-state>
|
||||
</entry>
|
||||
</component>
|
||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_25" default="true" project-jdk-name="liberica-25" project-jdk-type="JavaSDK">
|
||||
<output url="file://$PROJECT_DIR$/out" />
|
||||
</component>
|
||||
</project>
|
||||
8
.idea/modules.xml
generated
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/plus-ui-react.iml" filepath="$PROJECT_DIR$/.idea/plus-ui-react.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
</project>
|
||||
6
.idea/vcs.xml
generated
Normal file
@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="VcsDirectoryMappings">
|
||||
<mapping directory="$PROJECT_DIR$" vcs="Git" />
|
||||
</component>
|
||||
</project>
|
||||
24
.oxfmtrc.json
Normal file
@ -0,0 +1,24 @@
|
||||
{
|
||||
"$schema": "./node_modules/oxfmt/configuration_schema.json",
|
||||
"ignorePatterns": ["src/.umi", "src/.umi-production", ".ai_state", ".claude", ".codex", "dist", "node_modules"],
|
||||
"printWidth": 120,
|
||||
"singleQuote": true,
|
||||
"trailingComma": "none",
|
||||
"arrowParens": "avoid",
|
||||
"htmlWhitespaceSensitivity": "ignore",
|
||||
"experimentalSortPackageJson": {
|
||||
"sortScripts": true
|
||||
},
|
||||
"sortImports": {
|
||||
"newlinesBetween": false,
|
||||
"groups": [
|
||||
"type-import",
|
||||
["value-builtin", "value-external"],
|
||||
"type-internal",
|
||||
"value-internal",
|
||||
["type-parent", "type-sibling", "type-index"],
|
||||
["value-parent", "value-sibling", "value-index"],
|
||||
"unknown"
|
||||
]
|
||||
}
|
||||
}
|
||||
40
.oxlintrc.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/npm/oxlint/configuration_schema.json",
|
||||
"plugins": ["eslint", "typescript", "unicorn", "oxc", "import", "react"],
|
||||
"rules": {
|
||||
"typescript/no-empty-function": "off",
|
||||
"typescript/no-explicit-any": "off",
|
||||
"typescript/no-unused-vars": "off",
|
||||
"typescript/no-this-alias": "off",
|
||||
"typescript/no-empty-object-type": "off",
|
||||
"typescript/no-unused-expressions": "off",
|
||||
"prefer-rest-params": "off",
|
||||
"import/no-unassigned-import": "off",
|
||||
"import/no-named-as-default-member": "off",
|
||||
"import/no-named-as-default": "off",
|
||||
"react/react-in-jsx-scope": "off",
|
||||
"react/no-unstable-nested-components": "off",
|
||||
"react/iframe-missing-sandbox": "off",
|
||||
"react-hooks/exhaustive-deps": "off",
|
||||
"no-shadow": "off",
|
||||
"unicorn/no-array-sort": "off",
|
||||
"unicorn/no-useless-fallback-in-spread": "off",
|
||||
"unicorn/prefer-add-event-listener": "off",
|
||||
"unicorn/consistent-function-scoping": "off",
|
||||
"unicorn/no-instanceof-builtins": "off"
|
||||
},
|
||||
"categories": {
|
||||
"correctness": "error",
|
||||
"suspicious": "error"
|
||||
},
|
||||
"ignorePatterns": [
|
||||
"src/.umi",
|
||||
"src/.umi-production",
|
||||
".ai_state",
|
||||
".claude",
|
||||
".codex",
|
||||
"dist/**",
|
||||
"dist-ssr/**",
|
||||
"coverage/**"
|
||||
]
|
||||
}
|
||||
22
README.md
Normal file
@ -0,0 +1,22 @@
|
||||
# plus-ui-react
|
||||
|
||||
React + Ant Design rewrite of `plus-ui-new`.
|
||||
|
||||
The first milestone keeps the existing RuoYi-Vue-Plus backend protocol:
|
||||
|
||||
- `/auth/login`
|
||||
- `/auth/code`
|
||||
- `/system/user/getInfo`
|
||||
- `/system/menu/getRouters`
|
||||
- `Authorization: Bearer <token>`
|
||||
- `clientid`
|
||||
- optional encrypted request and response bodies
|
||||
|
||||
## Scripts
|
||||
|
||||
```bash
|
||||
pnpm install
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
The development proxy forwards `/dev-api` to `http://localhost:8080`.
|
||||
40
config/config.ts
Normal file
@ -0,0 +1,40 @@
|
||||
import { defineConfig } from '@umijs/max';
|
||||
import { createUmiAppConfig } from '../vite.config';
|
||||
|
||||
const appConfig = createUmiAppConfig();
|
||||
|
||||
export default defineConfig({
|
||||
title: appConfig.title,
|
||||
antd: {},
|
||||
access: {},
|
||||
model: {},
|
||||
initialState: {},
|
||||
vite: appConfig.vite,
|
||||
npmClient: 'pnpm',
|
||||
hash: true,
|
||||
esbuildMinifyIIFE: true,
|
||||
history: {
|
||||
type: 'browser'
|
||||
},
|
||||
base: appConfig.base,
|
||||
publicPath: appConfig.publicPath,
|
||||
routes: [
|
||||
{ path: '/login', component: './login', layout: false },
|
||||
{ path: '/register', component: './register', layout: false },
|
||||
{ path: '/social-callback', component: './socialCallback', layout: false },
|
||||
{ path: '/401', component: './error/401', layout: false },
|
||||
{ path: '/404', component: './error/404', layout: false },
|
||||
{ path: '/redirect/*', component: './redirect', layout: false },
|
||||
{
|
||||
path: '/',
|
||||
component: '../layouts/BasicLayout',
|
||||
routes: [
|
||||
{ path: '/', redirect: '/index' },
|
||||
{ path: '/index', component: './index' },
|
||||
{ path: '/user/profile', component: './system/user/profile' },
|
||||
{ path: '*', component: './dynamicPage' }
|
||||
]
|
||||
}
|
||||
],
|
||||
proxy: appConfig.proxy
|
||||
});
|
||||
67
package.json
Normal file
@ -0,0 +1,67 @@
|
||||
{
|
||||
"name": "plus-ui-react",
|
||||
"version": "0.1.0",
|
||||
"private": true,
|
||||
"description": "React + Ant Design version of RuoYi-Vue-Plus UI",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"build": "pnpm build:prod",
|
||||
"build:dev": "cross-env UMI_ENV=development BABEL_POLYFILL=none max build",
|
||||
"build:prod": "cross-env UMI_ENV=production BABEL_POLYFILL=none max build",
|
||||
"dev": "cross-env UMI_ENV=development MOCK=none BABEL_POLYFILL=none max dev",
|
||||
"fmt": "oxfmt .",
|
||||
"lint": "oxlint src config vite.config.ts && cross-env UMI_ENV=development BABEL_POLYFILL=none max setup && tsc --noEmit",
|
||||
"lint:fix": "oxlint --fix src config vite.config.ts",
|
||||
"openapi": "max openapi",
|
||||
"preview": "max preview --port 8000",
|
||||
"start": "cross-env UMI_ENV=development MOCK=none BABEL_POLYFILL=none max dev"
|
||||
},
|
||||
"dependencies": {
|
||||
"@ant-design/icons": "^6.2.3",
|
||||
"@ant-design/pro-components": "^3.1.12-0",
|
||||
"@ant-design/x": "^2.7.0",
|
||||
"@iconify/react": "^6.0.2",
|
||||
"@tanstack/react-query": "^5.100.6",
|
||||
"@umijs/max": "^4.6.51",
|
||||
"@wangeditor-next/editor": "^5.6.4",
|
||||
"@wangeditor-next/editor-for-react": "^1.0.10",
|
||||
"ahooks": "^3.9.7",
|
||||
"antd": "^6.4.3",
|
||||
"antd-style": "^4.1.0",
|
||||
"axios": "1.16.1",
|
||||
"browser-image-compression": "^2.0.2",
|
||||
"clsx": "^2.1.1",
|
||||
"cropperjs": "^1.6.2",
|
||||
"crypto-js": "4.2.0",
|
||||
"dayjs": "^1.11.20",
|
||||
"echarts": "^6.0.0",
|
||||
"echarts-for-react": "^3.0.2",
|
||||
"jsencrypt": "3.5.4",
|
||||
"nprogress": "0.2.0",
|
||||
"react": "^19.2.5",
|
||||
"react-cropper": "^2.3.3",
|
||||
"react-dom": "^19.2.5",
|
||||
"react-json-view-lite": "^2.5.0",
|
||||
"react-syntax-highlighter": "^16.1.1",
|
||||
"screenfull": "^6.0.2",
|
||||
"zustand": "^5.0.14"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/crypto-js": "4.2.2",
|
||||
"@types/node": "^25.9.1",
|
||||
"@types/nprogress": "0.2.3",
|
||||
"@types/react": "^19.2.14",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@types/react-syntax-highlighter": "^15.5.13",
|
||||
"@umijs/lint": "^4.6.51",
|
||||
"@umijs/max-plugin-openapi": "^2.0.3",
|
||||
"cross-env": "^10.1.0",
|
||||
"oxfmt": "^0.51.0",
|
||||
"oxlint": "^1.66.0",
|
||||
"typescript": "^6.0.3"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=20.0.0",
|
||||
"pnpm": ">=10.0.0"
|
||||
}
|
||||
}
|
||||
16894
pnpm-lock.yaml
generated
Normal file
150
src/api/ai/agent/index.ts
Normal file
@ -0,0 +1,150 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request, { globalHeaders } from '@/api/request';
|
||||
import { useAppStore } from '@/stores/appStore';
|
||||
import { appEnv } from '@/utils/env';
|
||||
import type {
|
||||
AgentChatRequest,
|
||||
AgentChatSyncResponse,
|
||||
AgentItem,
|
||||
ConversationMessage,
|
||||
ConversationSummaryItem,
|
||||
SnailOpenApiUser
|
||||
} from './types';
|
||||
|
||||
export function fetchMyAgents() {
|
||||
return request<R<AgentItem[] | PageResult<AgentItem>>>({
|
||||
url: '/snail-ai/agents',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function fetchAgentDetail(id: number) {
|
||||
return request<R<AgentItem>>({
|
||||
url: `/snail-ai/agent/${id}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function fetchAgentConversations(
|
||||
id: number,
|
||||
params: { page?: number; size?: number; start?: string; end?: string }
|
||||
) {
|
||||
return request<R<PageResult<ConversationSummaryItem> | ConversationSummaryItem[]>>({
|
||||
url: `/snail-ai/agent/${id}/conversations`,
|
||||
method: 'get',
|
||||
params
|
||||
});
|
||||
}
|
||||
|
||||
export function fetchConversationMessages(agentId: number, conversationId: string) {
|
||||
return request<R<ConversationMessage[] | PageResult<ConversationMessage>>>({
|
||||
url: `/snail-ai/agent/${agentId}/conversation/${conversationId}/messages`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function createConversation(agentId: number, data: { title?: string }) {
|
||||
return request<R<ConversationSummaryItem>>({
|
||||
url: `/snail-ai/agent/${agentId}/conversation`,
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function deleteConversation(agentId: number, conversationId: string) {
|
||||
return request<R>({
|
||||
url: `/snail-ai/agent/${agentId}/conversation/${conversationId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function registerCurrentSnailUser() {
|
||||
return request<R<SnailOpenApiUser>>({
|
||||
url: '/snail-ai/user/register',
|
||||
method: 'post'
|
||||
});
|
||||
}
|
||||
|
||||
export function fetchChatMode() {
|
||||
return request<R<{ mode?: 'stream' | 'sync' }>>({
|
||||
url: '/snail-ai/chat/mode',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export async function fetchAgentChat(
|
||||
agentId: number,
|
||||
data: AgentChatRequest,
|
||||
options: {
|
||||
onMessage: (chunk: string) => void;
|
||||
onThinking?: (chunk: string) => void;
|
||||
onDone: () => void;
|
||||
onError: (error: Error) => void;
|
||||
signal?: AbortSignal;
|
||||
}
|
||||
) {
|
||||
const baseURL = appEnv.baseApi;
|
||||
const language = useAppStore.getState().appLocale;
|
||||
try {
|
||||
const response = await fetch(`${baseURL}/snail-ai/agent/${agentId}/chat/stream`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
...globalHeaders(),
|
||||
'Content-Language': language,
|
||||
Accept: 'text/event-stream',
|
||||
'Content-Type': 'application/json;charset=utf-8'
|
||||
},
|
||||
body: JSON.stringify(data),
|
||||
signal: options.signal
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const text = await response.text();
|
||||
throw new Error(text || `HTTP ${response.status}`);
|
||||
}
|
||||
|
||||
const reader = response.body?.getReader();
|
||||
if (!reader) throw new Error('ReadableStream not supported');
|
||||
|
||||
const decoder = new TextDecoder();
|
||||
let buffer = '';
|
||||
while (true) {
|
||||
const { done, value } = await reader.read();
|
||||
if (done) break;
|
||||
buffer += decoder.decode(value, { stream: true });
|
||||
const eventBlocks = buffer.split(/\r?\n\r?\n/);
|
||||
buffer = eventBlocks.pop() || '';
|
||||
for (const block of eventBlocks) {
|
||||
if (!block.trim()) continue;
|
||||
let eventName = 'message';
|
||||
let payload = '';
|
||||
for (const line of block.split(/\r?\n/)) {
|
||||
if (line.startsWith('event:')) eventName = line.slice(6).trim();
|
||||
if (line.startsWith('data:')) payload += line.slice(5).trim();
|
||||
}
|
||||
if (!payload && eventName !== 'done') continue;
|
||||
if (eventName === 'thinking') {
|
||||
options.onThinking?.(payload);
|
||||
} else if (eventName === 'done') {
|
||||
options.onDone();
|
||||
return;
|
||||
} else if (eventName === 'error') {
|
||||
throw new Error(payload || 'SSE stream error');
|
||||
} else {
|
||||
options.onMessage(payload);
|
||||
}
|
||||
}
|
||||
}
|
||||
options.onDone();
|
||||
} catch (error) {
|
||||
if ((error as Error).name !== 'AbortError') options.onError(error as Error);
|
||||
}
|
||||
}
|
||||
|
||||
export function fetchAgentChatSync(agentId: number, data: AgentChatRequest) {
|
||||
return request<R<AgentChatSyncResponse>>({
|
||||
url: `/snail-ai/agent/${agentId}/chat/sync`,
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
61
src/api/ai/agent/types.ts
Normal file
@ -0,0 +1,61 @@
|
||||
export interface AgentItem {
|
||||
id: number;
|
||||
name: string;
|
||||
description?: string;
|
||||
avatar?: string;
|
||||
greeting?: string;
|
||||
status?: number;
|
||||
presetQuestions?: string[];
|
||||
}
|
||||
|
||||
export interface ConversationSummaryItem {
|
||||
conversationId: string;
|
||||
agentId?: number;
|
||||
title: string;
|
||||
lastMessageDt?: string;
|
||||
createDt?: string;
|
||||
updateDt?: string;
|
||||
}
|
||||
|
||||
export interface ConversationSummaryList {
|
||||
total: number;
|
||||
rows: ConversationSummaryItem[];
|
||||
}
|
||||
|
||||
export interface ConversationMessage {
|
||||
role?: string;
|
||||
content?: string;
|
||||
thinking?: string;
|
||||
message?: string;
|
||||
text?: string;
|
||||
messageType?: string;
|
||||
senderType?: string;
|
||||
}
|
||||
|
||||
export interface AgentChatRequest {
|
||||
conversationId?: string;
|
||||
content: string;
|
||||
disabledMcpServerIds?: number[];
|
||||
disabledSkillIds?: number[];
|
||||
}
|
||||
|
||||
export interface AgentChatSyncResponse {
|
||||
conversationId?: string;
|
||||
content?: string;
|
||||
traceId?: string;
|
||||
durationMs?: number;
|
||||
text?: string;
|
||||
message?: string;
|
||||
answer?: string;
|
||||
reply?: string;
|
||||
outputText?: string;
|
||||
result?: string;
|
||||
messages?: ConversationMessage[];
|
||||
}
|
||||
|
||||
export interface SnailOpenApiUser {
|
||||
openId: string;
|
||||
nickname?: string;
|
||||
externalId?: string;
|
||||
created?: boolean;
|
||||
}
|
||||
2
src/api/ai/index.ts
Normal file
@ -0,0 +1,2 @@
|
||||
export * from './agent';
|
||||
export * from './agent/types';
|
||||
41
src/api/demo/demo/index.ts
Normal file
@ -0,0 +1,41 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { DemoForm, DemoQuery, DemoVO } from './types';
|
||||
|
||||
export function listDemo(query?: DemoQuery) {
|
||||
return request<R<PageResult<DemoVO>>>({
|
||||
url: '/demo/demo/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getDemo(id: string | number) {
|
||||
return request<R<DemoVO>>({
|
||||
url: `/demo/demo/${id}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addDemo(data: DemoForm) {
|
||||
return request<R>({
|
||||
url: '/demo/demo',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateDemo(data: DemoForm) {
|
||||
return request<R>({
|
||||
url: '/demo/demo',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delDemo(id: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/demo/demo/${id}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
27
src/api/demo/demo/types.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface DemoForm extends BaseEntity {
|
||||
id?: string | number;
|
||||
deptId?: string | number;
|
||||
userId?: string | number;
|
||||
orderNum?: number;
|
||||
testKey?: string;
|
||||
value?: string;
|
||||
}
|
||||
|
||||
export interface DemoQuery extends PageQuery {
|
||||
deptId?: string | number;
|
||||
userId?: string | number;
|
||||
orderNum?: number;
|
||||
testKey?: string;
|
||||
value?: string;
|
||||
}
|
||||
|
||||
export interface DemoVO {
|
||||
id: string | number;
|
||||
deptId: string | number;
|
||||
userId: string | number;
|
||||
orderNum: number;
|
||||
testKey: string;
|
||||
value: string;
|
||||
}
|
||||
41
src/api/demo/tree/index.ts
Normal file
@ -0,0 +1,41 @@
|
||||
import type { R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { TreeForm, TreeQuery, TreeVO } from './types';
|
||||
|
||||
export function listTree(query?: TreeQuery) {
|
||||
return request<R<TreeVO[]>>({
|
||||
url: '/demo/tree/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getTree(id: string | number) {
|
||||
return request<R<TreeVO>>({
|
||||
url: `/demo/tree/${id}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addTree(data: TreeForm) {
|
||||
return request<R>({
|
||||
url: '/demo/tree',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateTree(data: TreeForm) {
|
||||
return request<R>({
|
||||
url: '/demo/tree',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delTree(id: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/demo/tree/${id}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
25
src/api/demo/tree/types.ts
Normal file
@ -0,0 +1,25 @@
|
||||
import type { BaseEntity } from '@/api/types';
|
||||
|
||||
export interface TreeForm extends BaseEntity {
|
||||
id?: string | number;
|
||||
parentId?: string | number;
|
||||
deptId?: string | number;
|
||||
userId?: string | number;
|
||||
treeName?: string;
|
||||
}
|
||||
|
||||
export interface TreeQuery {
|
||||
parentId?: string | number;
|
||||
deptId?: string | number;
|
||||
userId?: string | number;
|
||||
treeName?: string;
|
||||
}
|
||||
|
||||
export interface TreeVO {
|
||||
id: string | number;
|
||||
parentId: string | number;
|
||||
deptId: string | number;
|
||||
userId: string | number;
|
||||
treeName: string;
|
||||
children?: TreeVO[];
|
||||
}
|
||||
75
src/api/login.ts
Normal file
@ -0,0 +1,75 @@
|
||||
import type { UserInfo } from '@/api/system/user/types';
|
||||
import type { LoginParams, LoginResult, R, RegisterParams, VerifyCodeResult } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import { appEnv } from '@/utils/env';
|
||||
|
||||
export function login(data: LoginParams) {
|
||||
return request<R<LoginResult>>({
|
||||
url: '/auth/login',
|
||||
method: 'post',
|
||||
headers: {
|
||||
isToken: false,
|
||||
isEncrypt: 'true',
|
||||
repeatSubmit: false
|
||||
},
|
||||
data: {
|
||||
...data,
|
||||
clientId: data.clientId || appEnv.clientId,
|
||||
grantType: data.grantType || 'password'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function logout() {
|
||||
return request<R>({
|
||||
url: '/auth/logout',
|
||||
method: 'post'
|
||||
});
|
||||
}
|
||||
|
||||
export function register(data: RegisterParams) {
|
||||
return request<R>({
|
||||
url: '/auth/register',
|
||||
method: 'post',
|
||||
headers: {
|
||||
isToken: false,
|
||||
isEncrypt: 'true',
|
||||
repeatSubmit: false
|
||||
},
|
||||
data: {
|
||||
...data,
|
||||
clientId: appEnv.clientId,
|
||||
grantType: 'password'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function callback(data: LoginParams) {
|
||||
return request<R<LoginResult>>({
|
||||
url: '/auth/social/callback',
|
||||
method: 'post',
|
||||
data: {
|
||||
...data,
|
||||
clientId: appEnv.clientId,
|
||||
grantType: 'social'
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function getCodeImg() {
|
||||
return request<R<VerifyCodeResult>>({
|
||||
url: '/auth/code',
|
||||
method: 'get',
|
||||
headers: {
|
||||
isToken: false
|
||||
},
|
||||
timeout: 20000
|
||||
});
|
||||
}
|
||||
|
||||
export function getInfo() {
|
||||
return request<R<UserInfo>>({
|
||||
url: '/system/user/getInfo',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
9
src/api/menu.ts
Normal file
@ -0,0 +1,9 @@
|
||||
import type { BackendRoute, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
|
||||
export function getRouters() {
|
||||
return request<R<BackendRoute[]>>({
|
||||
url: '/system/menu/getRouters',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
10
src/api/monitor/cache/index.ts
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
import type { R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { CacheVO } from './types';
|
||||
|
||||
export function getCache() {
|
||||
return request<R<CacheVO>>({
|
||||
url: '/monitor/cache',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
5
src/api/monitor/cache/types.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
export interface CacheVO {
|
||||
commandStats: Array<{ name: string; value: string | number }>;
|
||||
dbSize: number;
|
||||
info: Record<string, string>;
|
||||
}
|
||||
36
src/api/monitor/logininfo/index.ts
Normal file
@ -0,0 +1,36 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { LoginInfoQuery, LoginInfoVO } from './types';
|
||||
|
||||
export function listLoginInfo(query: LoginInfoQuery) {
|
||||
return request<R<PageResult<LoginInfoVO>>>({
|
||||
url: '/monitor/loginInfo/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function list(query: LoginInfoQuery) {
|
||||
return listLoginInfo(query);
|
||||
}
|
||||
|
||||
export function delLoginInfo(infoId: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/monitor/loginInfo/${infoId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function unlockLoginInfo(userName: string | string[]) {
|
||||
return request<R>({
|
||||
url: `/monitor/loginInfo/unlock/${userName}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function cleanLoginInfo() {
|
||||
return request<R>({
|
||||
url: '/monitor/loginInfo/clean',
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
24
src/api/monitor/logininfo/types.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import type { PageQuery } from '@/api/types';
|
||||
|
||||
export interface LoginInfoQuery extends Omit<PageQuery, 'isAsc'> {
|
||||
ipaddr?: string;
|
||||
userName?: string;
|
||||
status?: string;
|
||||
orderByColumn?: string;
|
||||
isAsc?: string;
|
||||
}
|
||||
|
||||
export interface LoginInfoVO {
|
||||
infoId: string | number;
|
||||
tenantId?: string | number;
|
||||
userName: string;
|
||||
clientKey?: string;
|
||||
deviceType?: string;
|
||||
status: string;
|
||||
ipaddr?: string;
|
||||
loginLocation?: string;
|
||||
browser?: string;
|
||||
os?: string;
|
||||
msg?: string;
|
||||
loginTime?: string;
|
||||
}
|
||||
36
src/api/monitor/online/index.ts
Normal file
@ -0,0 +1,36 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { OnlineQuery, OnlineVO } from './types';
|
||||
|
||||
export function listOnline(query: OnlineQuery) {
|
||||
return request<R<PageResult<OnlineVO>>>({
|
||||
url: '/monitor/online/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function list(query: OnlineQuery) {
|
||||
return listOnline(query);
|
||||
}
|
||||
|
||||
export function forceLogout(tokenId: string) {
|
||||
return request<R>({
|
||||
url: `/monitor/online/${tokenId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function getOnline() {
|
||||
return request<R<OnlineVO[] | PageResult<OnlineVO>>>({
|
||||
url: '/monitor/online',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function delOnline(tokenId: string) {
|
||||
return request<R>({
|
||||
url: `/monitor/online/myself/${tokenId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
19
src/api/monitor/online/types.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface OnlineQuery extends PageQuery {
|
||||
ipaddr?: string;
|
||||
userName?: string;
|
||||
}
|
||||
|
||||
export interface OnlineVO extends BaseEntity {
|
||||
tokenId: string;
|
||||
deptName?: string;
|
||||
userName: string;
|
||||
clientKey?: string;
|
||||
deviceType?: string;
|
||||
ipaddr?: string;
|
||||
loginLocation?: string;
|
||||
browser?: string;
|
||||
os?: string;
|
||||
loginTime?: number | string;
|
||||
}
|
||||
29
src/api/monitor/operlog/index.ts
Normal file
@ -0,0 +1,29 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { OperLogQuery, OperLogVO } from './types';
|
||||
|
||||
export function listOperlog(query: OperLogQuery) {
|
||||
return request<R<PageResult<OperLogVO>>>({
|
||||
url: '/monitor/operlog/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function list(query: OperLogQuery) {
|
||||
return listOperlog(query);
|
||||
}
|
||||
|
||||
export function delOperlog(operId: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/monitor/operlog/${operId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function cleanOperlog() {
|
||||
return request<R>({
|
||||
url: '/monitor/operlog/clean',
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
45
src/api/monitor/operlog/types.ts
Normal file
@ -0,0 +1,45 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface OperLogQuery extends Omit<PageQuery, 'isAsc'> {
|
||||
operIp?: string;
|
||||
title?: string;
|
||||
operName?: string;
|
||||
userId?: string;
|
||||
deptId?: string;
|
||||
clientKey?: string;
|
||||
deviceType?: string;
|
||||
browser?: string;
|
||||
os?: string;
|
||||
businessType?: string;
|
||||
status?: string;
|
||||
orderByColumn?: string;
|
||||
isAsc?: string;
|
||||
}
|
||||
|
||||
export interface OperLogVO extends BaseEntity {
|
||||
operId: string | number;
|
||||
tenantId?: string;
|
||||
title?: string;
|
||||
businessType?: number | string;
|
||||
businessTypes?: number[];
|
||||
method?: string;
|
||||
requestMethod?: string;
|
||||
operatorType?: number;
|
||||
operName?: string;
|
||||
userId?: string | number;
|
||||
deptId?: string | number;
|
||||
deptName?: string;
|
||||
clientKey?: string;
|
||||
deviceType?: string;
|
||||
browser?: string;
|
||||
os?: string;
|
||||
operUrl?: string;
|
||||
operIp?: string;
|
||||
operLocation?: string;
|
||||
operParam?: string;
|
||||
jsonResult?: string;
|
||||
status?: number | string;
|
||||
errorMsg?: string;
|
||||
operTime?: string;
|
||||
costTime?: number;
|
||||
}
|
||||
215
src/api/request.ts
Normal file
@ -0,0 +1,215 @@
|
||||
import { history } from '@umijs/max';
|
||||
import { Modal } from 'antd';
|
||||
import axios, { type AxiosError, type AxiosRequestConfig } from 'axios';
|
||||
import { useAppStore } from '@/stores/appStore';
|
||||
import { useTagsViewStore } from '@/stores/tagsViewStore';
|
||||
import { getToken, removeToken } from '@/utils/auth';
|
||||
import { decryptBase64, decryptWithAes, encryptBase64, encryptWithAes, generateAesKey } from '@/utils/crypto';
|
||||
import { appEnv } from '@/utils/env';
|
||||
import { decrypt, encrypt } from '@/utils/jsencrypt';
|
||||
import { tansParams } from '@/utils/ruoyi';
|
||||
|
||||
const SUCCESS = 200;
|
||||
const WARN = 601;
|
||||
const SERVER_ERROR = 500;
|
||||
const encryptHeader = 'encrypt-key';
|
||||
const repeatSubmitStorageKey = 'sessionObj';
|
||||
const repeatSubmitInterval = 500;
|
||||
|
||||
export interface RequestConfig<D = unknown> extends AxiosRequestConfig<D> {
|
||||
headers?: AxiosRequestConfig<D>['headers'] & {
|
||||
isToken?: false;
|
||||
isEncrypt?: 'true' | 'false' | boolean;
|
||||
repeatSubmit?: false;
|
||||
};
|
||||
}
|
||||
|
||||
export const isRelogin = { show: false };
|
||||
|
||||
export function globalHeaders() {
|
||||
return {
|
||||
Authorization: `Bearer ${getToken() || ''}`,
|
||||
clientid: appEnv.clientId
|
||||
};
|
||||
}
|
||||
|
||||
function stableDataString(data: unknown) {
|
||||
if (data instanceof FormData) return '';
|
||||
if (typeof data === 'string') return data;
|
||||
if (typeof data === 'undefined' || data === null) return '';
|
||||
if (typeof data === 'object') return JSON.stringify(data);
|
||||
return String(data);
|
||||
}
|
||||
|
||||
function getSessionSubmitRecord() {
|
||||
try {
|
||||
const text = sessionStorage.getItem(repeatSubmitStorageKey);
|
||||
return text ? (JSON.parse(text) as { url?: string; data?: string; time?: number }) : undefined;
|
||||
} catch {
|
||||
sessionStorage.removeItem(repeatSubmitStorageKey);
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
function setSessionSubmitRecord(record: { url?: string; data?: string; time: number }) {
|
||||
sessionStorage.setItem(repeatSubmitStorageKey, JSON.stringify(record));
|
||||
}
|
||||
|
||||
const service = axios.create({
|
||||
baseURL: appEnv.baseApi,
|
||||
timeout: 50000,
|
||||
headers: {
|
||||
'Content-Type': 'application/json;charset=utf-8',
|
||||
clientid: appEnv.clientId
|
||||
},
|
||||
transitional: {
|
||||
clarifyTimeoutError: true
|
||||
}
|
||||
});
|
||||
|
||||
service.interceptors.request.use(config => {
|
||||
config.headers.set('Content-Language', useAppStore.getState().appLocale);
|
||||
|
||||
const isToken = config.headers.get('isToken') === false;
|
||||
const isEncrypt = config.headers.get('isEncrypt') === 'true' || config.headers.get('isEncrypt') === true;
|
||||
const isRepeatSubmitDisabled = config.headers.get('repeatSubmit') === false;
|
||||
|
||||
if (getToken() && !isToken) {
|
||||
config.headers.set('Authorization', `Bearer ${getToken()}`);
|
||||
}
|
||||
|
||||
if (config.method === 'get' && config.params) {
|
||||
let url = `${config.url}?${tansParams(config.params)}`;
|
||||
url = url.slice(0, -1);
|
||||
config.params = {};
|
||||
config.url = url;
|
||||
}
|
||||
|
||||
if (!isRepeatSubmitDisabled && (config.method === 'post' || config.method === 'put')) {
|
||||
const requestObj = {
|
||||
url: config.url,
|
||||
data: stableDataString(config.data),
|
||||
time: Date.now()
|
||||
};
|
||||
const sessionObj = getSessionSubmitRecord();
|
||||
if (
|
||||
sessionObj &&
|
||||
sessionObj.url === requestObj.url &&
|
||||
sessionObj.data === requestObj.data &&
|
||||
requestObj.time - (sessionObj.time || 0) < repeatSubmitInterval
|
||||
) {
|
||||
return Promise.reject(new Error('数据正在处理,请勿重复提交'));
|
||||
}
|
||||
setSessionSubmitRecord(requestObj);
|
||||
}
|
||||
|
||||
if (appEnv.encryptEnabled && isEncrypt && (config.method === 'post' || config.method === 'put')) {
|
||||
const aesKey = generateAesKey();
|
||||
const encryptedKey = encrypt(encryptBase64(aesKey));
|
||||
if (encryptedKey) {
|
||||
config.headers.set(encryptHeader, encryptedKey);
|
||||
}
|
||||
const data = typeof config.data === 'object' ? JSON.stringify(config.data) : String(config.data ?? '');
|
||||
config.data = encryptWithAes(data, aesKey);
|
||||
}
|
||||
|
||||
if (config.data instanceof FormData) {
|
||||
config.headers.delete('Content-Type');
|
||||
}
|
||||
|
||||
config.headers.delete('isToken');
|
||||
config.headers.delete('isEncrypt');
|
||||
config.headers.delete('repeatSubmit');
|
||||
|
||||
return config;
|
||||
});
|
||||
|
||||
function normalizeErrorMessage(message?: string) {
|
||||
if (!message) return undefined;
|
||||
if (message === 'Network Error') return '后端接口连接异常';
|
||||
if (message.includes('timeout')) return '系统接口请求超时';
|
||||
if (message.includes('Request failed with status code')) return `系统接口${message.slice(-3)}异常`;
|
||||
return message;
|
||||
}
|
||||
|
||||
async function parseResponseErrorData(data: unknown): Promise<string | undefined> {
|
||||
if (!data) return undefined;
|
||||
if (data instanceof Blob) return parseResponseErrorData(await data.text());
|
||||
if (data instanceof ArrayBuffer) return parseResponseErrorData(new TextDecoder().decode(data));
|
||||
if (typeof data === 'string') {
|
||||
const text = data.trim();
|
||||
if (!text) return undefined;
|
||||
try {
|
||||
return parseResponseErrorData(JSON.parse(text));
|
||||
} catch {
|
||||
return text;
|
||||
}
|
||||
}
|
||||
if (typeof data === 'object') {
|
||||
const payload = data as { msg?: string; message?: string };
|
||||
return payload.msg || payload.message;
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
||||
async function getErrorMessage(error: AxiosError) {
|
||||
const responseMessage = await parseResponseErrorData(error.response?.data);
|
||||
return responseMessage || normalizeErrorMessage(error.message) || '系统未知错误';
|
||||
}
|
||||
|
||||
service.interceptors.response.use(
|
||||
response => {
|
||||
const keyStr = response.headers[encryptHeader];
|
||||
if (appEnv.encryptEnabled && keyStr) {
|
||||
const base64Str = decrypt(keyStr);
|
||||
if (base64Str) {
|
||||
const aesKey = decryptBase64(base64Str);
|
||||
response.data = JSON.parse(decryptWithAes(response.data, aesKey));
|
||||
}
|
||||
}
|
||||
|
||||
if (response.request.responseType === 'blob' || response.request.responseType === 'arraybuffer') {
|
||||
return response.data;
|
||||
}
|
||||
|
||||
const code = response.data?.code || SUCCESS;
|
||||
const msg = response.data?.msg || '系统未知错误';
|
||||
|
||||
if (code === 401) {
|
||||
if (!isRelogin.show) {
|
||||
isRelogin.show = true;
|
||||
Modal.confirm({
|
||||
title: '系统提示',
|
||||
content: '登录状态已过期,您可以继续留在该页面,或者重新登录',
|
||||
okText: '重新登录',
|
||||
cancelText: '取消',
|
||||
onOk: () => {
|
||||
isRelogin.show = false;
|
||||
removeToken();
|
||||
useTagsViewStore.getState().resetTags();
|
||||
history.replace(
|
||||
`/login?redirect=${encodeURIComponent(`${window.location.pathname || '/'}${window.location.search || ''}`)}`
|
||||
);
|
||||
},
|
||||
onCancel: () => {
|
||||
isRelogin.show = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
return Promise.reject(new Error('无效的会话,或者会话已过期,请重新登录。'));
|
||||
}
|
||||
|
||||
if (code === SERVER_ERROR || code === WARN || code !== SUCCESS) {
|
||||
return Promise.reject(new Error(msg));
|
||||
}
|
||||
|
||||
return response.data;
|
||||
},
|
||||
async error => {
|
||||
return Promise.reject(new Error(await getErrorMessage(error)));
|
||||
}
|
||||
);
|
||||
|
||||
export default function request<T = unknown, D = unknown>(config: RequestConfig<D>): Promise<T> {
|
||||
return service.request<T, T, D>(config);
|
||||
}
|
||||
49
src/api/system/client/index.ts
Normal file
@ -0,0 +1,49 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { ClientForm, ClientQuery, ClientVO } from './types';
|
||||
|
||||
export function listClient(query?: ClientQuery) {
|
||||
return request<R<PageResult<ClientVO>>>({
|
||||
url: '/system/client/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getClient(id: string | number) {
|
||||
return request<R<ClientVO>>({
|
||||
url: `/system/client/${id}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addClient(data: ClientForm) {
|
||||
return request<R>({
|
||||
url: '/system/client',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateClient(data: ClientForm) {
|
||||
return request<R>({
|
||||
url: '/system/client',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delClient(id: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/system/client/${id}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function changeStatus(clientId: string, status: string) {
|
||||
return request<R>({
|
||||
url: '/system/client/changeStatus',
|
||||
method: 'put',
|
||||
data: { clientId, status }
|
||||
});
|
||||
}
|
||||
46
src/api/system/client/types.ts
Normal file
@ -0,0 +1,46 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface ClientForm extends BaseEntity {
|
||||
id?: string | number;
|
||||
clientId?: string | number;
|
||||
clientKey?: string;
|
||||
clientSecret?: string;
|
||||
grantTypeList?: string[];
|
||||
deviceType?: string;
|
||||
accessPath?: string;
|
||||
accessPathList?: string[];
|
||||
ipWhitelist?: string;
|
||||
ipWhitelistList?: string[];
|
||||
activeTimeout?: number;
|
||||
timeout?: number;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
export interface ClientQuery extends PageQuery {
|
||||
clientId?: string | number;
|
||||
clientKey?: string;
|
||||
clientSecret?: string;
|
||||
grantType?: string;
|
||||
deviceType?: string;
|
||||
accessPath?: string;
|
||||
ipWhitelist?: string;
|
||||
activeTimeout?: number;
|
||||
timeout?: number;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
export interface ClientVO {
|
||||
id: string | number;
|
||||
clientId: string;
|
||||
clientKey: string;
|
||||
clientSecret: string;
|
||||
grantTypeList?: string[];
|
||||
deviceType?: string;
|
||||
accessPath?: string;
|
||||
accessPathList?: string[];
|
||||
ipWhitelist?: string;
|
||||
ipWhitelistList?: string[];
|
||||
activeTimeout?: number;
|
||||
timeout?: number;
|
||||
status: string;
|
||||
}
|
||||
70
src/api/system/config/index.ts
Normal file
@ -0,0 +1,70 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { ConfigForm, ConfigQuery, ConfigVO } from './types';
|
||||
|
||||
export function listConfig(query: ConfigQuery) {
|
||||
return request<R<PageResult<ConfigVO>>>({
|
||||
url: '/system/config/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getConfig(configId: string | number) {
|
||||
return request<R<ConfigVO>>({
|
||||
url: `/system/config/${configId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function getConfigKey(configKey: string) {
|
||||
return request<R<string>>({
|
||||
url: `/system/config/configKey/${configKey}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addConfig(data: ConfigForm) {
|
||||
return request<R>({
|
||||
url: '/system/config',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateConfig(data: ConfigForm) {
|
||||
return request<R>({
|
||||
url: '/system/config',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateConfigByKey(key: string, value: unknown) {
|
||||
return request<R>({
|
||||
url: '/system/config/updateByKey',
|
||||
method: 'put',
|
||||
data: {
|
||||
configKey: key,
|
||||
configValue: value
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function delConfig(configId: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/system/config/${configId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function refreshConfigCache() {
|
||||
return request<R>({
|
||||
url: '/system/config/refreshCache',
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function refreshCache() {
|
||||
return refreshConfigCache();
|
||||
}
|
||||
24
src/api/system/config/types.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface ConfigForm {
|
||||
configId?: number | string;
|
||||
configName?: string;
|
||||
configKey?: string;
|
||||
configValue?: string;
|
||||
configType?: string;
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface ConfigQuery extends PageQuery {
|
||||
configName?: string;
|
||||
configKey?: string;
|
||||
configType?: string;
|
||||
}
|
||||
|
||||
export interface ConfigVO extends BaseEntity {
|
||||
configId: number | string;
|
||||
configName: string;
|
||||
configKey: string;
|
||||
configValue: string;
|
||||
configType: string;
|
||||
}
|
||||
55
src/api/system/dept/index.ts
Normal file
@ -0,0 +1,55 @@
|
||||
import type { R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { DeptForm, DeptQuery, DeptVO } from './types';
|
||||
|
||||
export function listDept(query?: DeptQuery) {
|
||||
return request<R<DeptVO[]>>({
|
||||
url: '/system/dept/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function optionSelect(deptIds: Array<number | string>) {
|
||||
return request<R<DeptVO[]>>({
|
||||
url: `/system/dept/optionselect?deptIds=${deptIds}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function listDeptExcludeChild(deptId: string | number) {
|
||||
return request<R<DeptVO[]>>({
|
||||
url: `/system/dept/list/exclude/${deptId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function getDept(deptId: string | number) {
|
||||
return request<R<DeptVO>>({
|
||||
url: `/system/dept/${deptId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addDept(data: DeptForm) {
|
||||
return request<R>({
|
||||
url: '/system/dept',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateDept(data: DeptForm) {
|
||||
return request<R>({
|
||||
url: '/system/dept',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delDept(deptId: number | string) {
|
||||
return request<R>({
|
||||
url: `/system/dept/${deptId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
50
src/api/system/dept/types.ts
Normal file
@ -0,0 +1,50 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface DeptForm {
|
||||
parentName?: string;
|
||||
parentId?: number | string;
|
||||
children?: DeptForm[];
|
||||
deptId?: number | string;
|
||||
deptName?: string;
|
||||
deptCategory?: string;
|
||||
orderNum?: number;
|
||||
leader?: string | number;
|
||||
phone?: string;
|
||||
email?: string;
|
||||
status?: string;
|
||||
delFlag?: string;
|
||||
ancestors?: string;
|
||||
}
|
||||
|
||||
export interface DeptQuery extends PageQuery {
|
||||
deptName?: string;
|
||||
deptCategory?: string;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
export interface DeptTreeVO extends BaseEntity {
|
||||
id: number | string;
|
||||
label: string;
|
||||
parentId: number | string;
|
||||
weight: number;
|
||||
children?: DeptTreeVO[];
|
||||
disabled?: boolean;
|
||||
}
|
||||
|
||||
export interface DeptVO extends BaseEntity {
|
||||
id?: number | string;
|
||||
parentName?: string;
|
||||
parentId?: number | string;
|
||||
children?: DeptVO[];
|
||||
deptId: number | string;
|
||||
deptName: string;
|
||||
deptCategory?: string;
|
||||
orderNum?: number;
|
||||
leader?: string;
|
||||
phone?: string;
|
||||
email?: string;
|
||||
status?: string;
|
||||
delFlag?: string;
|
||||
ancestors?: string;
|
||||
menuId?: string | number;
|
||||
}
|
||||
48
src/api/system/dict/data/index.ts
Normal file
@ -0,0 +1,48 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { DictData, DictDataForm, DictDataQuery } from './types';
|
||||
|
||||
export function getDicts(dictType: string) {
|
||||
return request<R<DictData[]>>({
|
||||
url: `/system/dict/data/type/${dictType}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function listData(query: DictDataQuery) {
|
||||
return request<R<PageResult<DictData>>>({
|
||||
url: '/system/dict/data/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getData(dictCode: string | number) {
|
||||
return request<R<DictData>>({
|
||||
url: `/system/dict/data/${dictCode}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addData(data: DictDataForm) {
|
||||
return request<R>({
|
||||
url: '/system/dict/data',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateData(data: DictDataForm) {
|
||||
return request<R>({
|
||||
url: '/system/dict/data',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delData(dictCode: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/system/dict/data/${dictCode}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
32
src/api/system/dict/data/types.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface DictData extends BaseEntity {
|
||||
dictCode: string | number;
|
||||
dictSort: number;
|
||||
dictLabel: string;
|
||||
dictValue: string;
|
||||
dictType: string;
|
||||
cssClass?: string;
|
||||
listClass?: string;
|
||||
isDefault?: string;
|
||||
status: string;
|
||||
}
|
||||
|
||||
export type DictDataVO = DictData;
|
||||
|
||||
export interface DictDataForm {
|
||||
dictType?: string;
|
||||
dictCode?: string | number;
|
||||
dictLabel?: string;
|
||||
dictValue?: string;
|
||||
cssClass?: string;
|
||||
listClass?: string;
|
||||
dictSort?: number;
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface DictDataQuery extends PageQuery {
|
||||
dictName?: string;
|
||||
dictType?: string;
|
||||
dictLabel?: string;
|
||||
}
|
||||
55
src/api/system/dict/type/index.ts
Normal file
@ -0,0 +1,55 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { DictTypeForm, DictTypeQuery, DictTypeVO } from './types';
|
||||
|
||||
export function listType(query: DictTypeQuery) {
|
||||
return request<R<PageResult<DictTypeVO>>>({
|
||||
url: '/system/dict/type/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getType(dictId: number | string) {
|
||||
return request<R<DictTypeVO>>({
|
||||
url: `/system/dict/type/${dictId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addType(data: DictTypeForm) {
|
||||
return request<R>({
|
||||
url: '/system/dict/type',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateType(data: DictTypeForm) {
|
||||
return request<R>({
|
||||
url: '/system/dict/type',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delType(dictId: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/system/dict/type/${dictId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function refreshCache() {
|
||||
return request<R>({
|
||||
url: '/system/dict/type/refreshCache',
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function optionselect() {
|
||||
return request<R<DictTypeVO[]>>({
|
||||
url: '/system/dict/type/optionselect',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
19
src/api/system/dict/type/types.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface DictTypeForm {
|
||||
dictId?: number | string;
|
||||
dictName?: string;
|
||||
dictType?: string;
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface DictTypeQuery extends PageQuery {
|
||||
dictName?: string;
|
||||
dictType?: string;
|
||||
}
|
||||
|
||||
export interface DictTypeVO extends BaseEntity {
|
||||
dictId: number | string;
|
||||
dictName: string;
|
||||
dictType: string;
|
||||
}
|
||||
63
src/api/system/menu/index.ts
Normal file
@ -0,0 +1,63 @@
|
||||
import type { RoleMenuTree } from '@/api/system/role/types';
|
||||
import type { R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { MenuForm, MenuQuery, MenuTreeOption, MenuVO } from './types';
|
||||
|
||||
export function listMenu(query?: MenuQuery) {
|
||||
return request<R<MenuVO[]>>({
|
||||
url: '/system/menu/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getMenu(menuId: string | number) {
|
||||
return request<R<MenuVO>>({
|
||||
url: `/system/menu/${menuId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function treeselect() {
|
||||
return request<R<MenuTreeOption[]>>({
|
||||
url: '/system/menu/treeselect',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function roleMenuTreeselect(roleId: string | number) {
|
||||
return request<R<RoleMenuTree>>({
|
||||
url: `/system/menu/roleMenuTreeselect/${roleId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addMenu(data: MenuForm) {
|
||||
return request<R>({
|
||||
url: '/system/menu',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateMenu(data: MenuForm) {
|
||||
return request<R>({
|
||||
url: '/system/menu',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delMenu(menuId: string | number) {
|
||||
return request<R>({
|
||||
url: `/system/menu/${menuId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function cascadeDelMenu(menuIds: Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/system/menu/cascade/${menuIds}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
63
src/api/system/menu/types.ts
Normal file
@ -0,0 +1,63 @@
|
||||
import type { BaseEntity } from '@/api/types';
|
||||
|
||||
export interface MenuForm {
|
||||
parentName?: string;
|
||||
parentId?: string | number;
|
||||
children?: MenuForm[];
|
||||
menuId?: string | number;
|
||||
menuName?: string;
|
||||
orderNum?: number;
|
||||
path?: string;
|
||||
component?: string;
|
||||
queryParam?: string;
|
||||
isFrame?: string;
|
||||
isCache?: string;
|
||||
menuType?: 'M' | 'C' | 'F' | string;
|
||||
visible?: string;
|
||||
status?: string;
|
||||
icon?: string;
|
||||
activeMenu?: string;
|
||||
ext?: string;
|
||||
remark?: string;
|
||||
query?: string;
|
||||
perms?: string;
|
||||
}
|
||||
|
||||
export interface MenuQuery {
|
||||
keywords?: string;
|
||||
menuName?: string;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
export interface MenuTreeOption {
|
||||
id: string | number;
|
||||
label: string;
|
||||
parentId: string | number;
|
||||
weight: number;
|
||||
menuType?: 'M' | 'C' | 'F' | string;
|
||||
visible?: string;
|
||||
status?: string;
|
||||
disabled?: boolean;
|
||||
children?: MenuTreeOption[];
|
||||
}
|
||||
|
||||
export interface MenuVO extends BaseEntity {
|
||||
parentName?: string;
|
||||
parentId: string | number;
|
||||
children?: MenuVO[];
|
||||
menuId: string | number;
|
||||
menuName: string;
|
||||
orderNum: number;
|
||||
path: string;
|
||||
component?: string;
|
||||
queryParam?: string;
|
||||
isFrame?: string;
|
||||
isCache?: string;
|
||||
menuType: 'M' | 'C' | 'F' | string;
|
||||
visible?: string;
|
||||
status?: string;
|
||||
icon?: string;
|
||||
activeMenu?: string;
|
||||
ext?: string;
|
||||
perms?: string;
|
||||
}
|
||||
10
src/api/system/message/index.ts
Normal file
@ -0,0 +1,10 @@
|
||||
import type { R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { MessageBoxVO } from './types';
|
||||
|
||||
export function getMessageBox() {
|
||||
return request<R<MessageBoxVO>>({
|
||||
url: '/resource/message/box',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
19
src/api/system/message/types.ts
Normal file
@ -0,0 +1,19 @@
|
||||
import type { BaseEntity } from '@/api/types';
|
||||
|
||||
export interface MessageVO extends BaseEntity {
|
||||
messageId: number | string;
|
||||
category: string;
|
||||
type: string;
|
||||
source: string;
|
||||
title: string;
|
||||
message: string;
|
||||
content?: string;
|
||||
data?: Record<string, unknown> | null;
|
||||
path?: string;
|
||||
}
|
||||
|
||||
export interface MessageBoxVO {
|
||||
systemList: MessageVO[];
|
||||
noticeList: MessageVO[];
|
||||
workflowList: MessageVO[];
|
||||
}
|
||||
41
src/api/system/notice/index.ts
Normal file
@ -0,0 +1,41 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { NoticeForm, NoticeQuery, NoticeVO } from './types';
|
||||
|
||||
export function listNotice(query: NoticeQuery) {
|
||||
return request<R<PageResult<NoticeVO>>>({
|
||||
url: '/system/notice/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getNotice(noticeId: string | number) {
|
||||
return request<R<NoticeVO>>({
|
||||
url: `/system/notice/${noticeId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addNotice(data: NoticeForm) {
|
||||
return request<R>({
|
||||
url: '/system/notice',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateNotice(data: NoticeForm) {
|
||||
return request<R>({
|
||||
url: '/system/notice',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delNotice(noticeId: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/system/notice/${noticeId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
27
src/api/system/notice/types.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface NoticeForm {
|
||||
noticeId?: number | string;
|
||||
noticeTitle?: string;
|
||||
noticeType?: string;
|
||||
noticeContent?: string;
|
||||
status?: string;
|
||||
remark?: string;
|
||||
createByName?: string;
|
||||
}
|
||||
|
||||
export interface NoticeQuery extends PageQuery {
|
||||
noticeTitle?: string;
|
||||
createByName?: string;
|
||||
status?: string;
|
||||
noticeType?: string;
|
||||
}
|
||||
|
||||
export interface NoticeVO extends BaseEntity {
|
||||
noticeId: number | string;
|
||||
noticeTitle: string;
|
||||
noticeType: string;
|
||||
noticeContent: string;
|
||||
status: string;
|
||||
createByName?: string;
|
||||
}
|
||||
45
src/api/system/oss/index.ts
Normal file
@ -0,0 +1,45 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { OssQuery, OssUploadResult, OssVO } from './types';
|
||||
|
||||
export function listOss(query: OssQuery) {
|
||||
return request<R<PageResult<OssVO>>>({
|
||||
url: '/resource/oss/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function listOssByIds(ossId: string | number) {
|
||||
return request<R<OssVO[]>>({
|
||||
url: `/resource/oss/listByIds/${ossId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function listByIds(ossId: string | number) {
|
||||
return listOssByIds(ossId);
|
||||
}
|
||||
|
||||
export function uploadOss(data: FormData) {
|
||||
return request<R<OssUploadResult>>({
|
||||
url: '/resource/oss/upload',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delOss(ossId: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/resource/oss/${ossId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function downloadOss(ossId: string | number) {
|
||||
return request<Blob>({
|
||||
url: `/resource/oss/download/${ossId}`,
|
||||
method: 'get',
|
||||
responseType: 'blob'
|
||||
});
|
||||
}
|
||||
27
src/api/system/oss/types.ts
Normal file
@ -0,0 +1,27 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface OssQuery extends Omit<PageQuery, 'isAsc'> {
|
||||
fileName?: string;
|
||||
originalName?: string;
|
||||
fileSuffix?: string;
|
||||
createTime?: string;
|
||||
service?: string;
|
||||
orderByColumn?: string;
|
||||
isAsc?: string;
|
||||
}
|
||||
|
||||
export interface OssUploadResult {
|
||||
url?: string;
|
||||
fileName?: string;
|
||||
ossId?: string | number;
|
||||
}
|
||||
|
||||
export interface OssVO extends BaseEntity {
|
||||
ossId: string | number;
|
||||
fileName: string;
|
||||
originalName: string;
|
||||
fileSuffix: string;
|
||||
url: string;
|
||||
createByName?: string;
|
||||
service?: string;
|
||||
}
|
||||
49
src/api/system/ossConfig/index.ts
Normal file
@ -0,0 +1,49 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { OssConfigForm, OssConfigQuery, OssConfigVO } from './types';
|
||||
|
||||
export function listOssConfig(query: OssConfigQuery) {
|
||||
return request<R<PageResult<OssConfigVO>>>({
|
||||
url: '/resource/oss/config/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getOssConfig(ossConfigId: string | number) {
|
||||
return request<R<OssConfigVO>>({
|
||||
url: `/resource/oss/config/${ossConfigId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addOssConfig(data: OssConfigForm) {
|
||||
return request<R>({
|
||||
url: '/resource/oss/config',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateOssConfig(data: OssConfigForm) {
|
||||
return request<R>({
|
||||
url: '/resource/oss/config',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delOssConfig(ossConfigId: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/resource/oss/config/${ossConfigId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function changeOssConfigStatus(ossConfigId: string | number, status: string, configKey: string) {
|
||||
return request<R>({
|
||||
url: '/resource/oss/config/changeStatus',
|
||||
method: 'put',
|
||||
data: { ossConfigId, status, configKey }
|
||||
});
|
||||
}
|
||||
39
src/api/system/ossConfig/types.ts
Normal file
@ -0,0 +1,39 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface OssConfigForm {
|
||||
ossConfigId?: string | number;
|
||||
configKey?: string;
|
||||
accessKey?: string;
|
||||
secretKey?: string;
|
||||
bucketName?: string;
|
||||
prefix?: string;
|
||||
endpoint?: string;
|
||||
domainUrl?: string;
|
||||
isHttps?: string;
|
||||
accessPolicy?: string;
|
||||
region?: string;
|
||||
status?: string;
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface OssConfigQuery extends PageQuery {
|
||||
configKey?: string;
|
||||
bucketName?: string;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
export interface OssConfigVO extends BaseEntity {
|
||||
ossConfigId: number | string;
|
||||
configKey: string;
|
||||
accessKey: string;
|
||||
secretKey: string;
|
||||
bucketName: string;
|
||||
prefix?: string;
|
||||
endpoint: string;
|
||||
domainUrl?: string;
|
||||
isHttps: string;
|
||||
region?: string;
|
||||
status: string;
|
||||
ext1?: string;
|
||||
accessPolicy: string;
|
||||
}
|
||||
64
src/api/system/post/index.ts
Normal file
@ -0,0 +1,64 @@
|
||||
import type { DeptTreeVO } from '@/api/system/dept/types';
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { PostForm, PostQuery, PostVO } from './types';
|
||||
|
||||
export function listPost(query: PostQuery) {
|
||||
return request<R<PageResult<PostVO>>>({
|
||||
url: '/system/post/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getPost(postId: string | number) {
|
||||
return request<R<PostVO>>({
|
||||
url: `/system/post/${postId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function optionSelect(deptId?: number | string, postIds?: Array<number | string>) {
|
||||
return request<R<PostVO[]>>({
|
||||
url: '/system/post/optionselect',
|
||||
method: 'get',
|
||||
params: {
|
||||
postIds,
|
||||
deptId
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function addPost(data: PostForm) {
|
||||
return request<R>({
|
||||
url: '/system/post',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updatePost(data: PostForm) {
|
||||
return request<R>({
|
||||
url: '/system/post',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delPost(postId: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/system/post/${postId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function postDeptTreeSelect() {
|
||||
return request<R<DeptTreeVO[]>>({
|
||||
url: '/system/post/deptTree',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function deptTreeSelect() {
|
||||
return postDeptTreeSelect();
|
||||
}
|
||||
32
src/api/system/post/types.ts
Normal file
@ -0,0 +1,32 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface PostForm {
|
||||
postId?: number | string;
|
||||
deptId?: number | string;
|
||||
postCode?: string;
|
||||
postName?: string;
|
||||
postCategory?: string;
|
||||
postSort?: number;
|
||||
status?: string;
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface PostQuery extends PageQuery {
|
||||
deptId?: number | string;
|
||||
belongDeptId?: number | string;
|
||||
postCode?: string;
|
||||
postName?: string;
|
||||
postCategory?: string;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
export interface PostVO extends BaseEntity {
|
||||
postId: number | string;
|
||||
deptId: number | string;
|
||||
postCode: string;
|
||||
postName: string;
|
||||
postCategory: string;
|
||||
deptName: string;
|
||||
postSort: number;
|
||||
status: string;
|
||||
}
|
||||
115
src/api/system/role/index.ts
Normal file
@ -0,0 +1,115 @@
|
||||
import type { UserQuery, UserVO } from '@/api/system/user/types';
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { RoleDeptTree, RoleForm, RoleQuery, RoleVO } from './types';
|
||||
|
||||
export function listRole(query: RoleQuery) {
|
||||
return request<R<PageResult<RoleVO>>>({
|
||||
url: '/system/role/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function optionSelect(roleIds: Array<number | string>) {
|
||||
return request<R<RoleVO[]>>({
|
||||
url: `/system/role/optionselect?roleIds=${roleIds}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function getRole(roleId: string | number) {
|
||||
return request<R<RoleVO>>({
|
||||
url: `/system/role/${roleId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addRole(data: RoleForm) {
|
||||
return request<R>({
|
||||
url: '/system/role',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateRole(data: RoleForm) {
|
||||
return request<R>({
|
||||
url: '/system/role',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateRolePermission(data: RoleForm) {
|
||||
return request<R>({
|
||||
url: '/system/role/permission',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function changeRoleStatus(roleId: string | number, status: string) {
|
||||
return request<R>({
|
||||
url: '/system/role/changeStatus',
|
||||
method: 'put',
|
||||
data: {
|
||||
roleId,
|
||||
status
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function delRole(roleId: Array<string | number> | string | number) {
|
||||
return request<R>({
|
||||
url: `/system/role/${roleId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function allocatedUserList(query: UserQuery) {
|
||||
return request<R<PageResult<UserVO>>>({
|
||||
url: '/system/role/authUser/allocatedList',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function unallocatedUserList(query: UserQuery) {
|
||||
return request<R<PageResult<UserVO>>>({
|
||||
url: '/system/role/authUser/unallocatedList',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function authUserCancel(data: { roleId: string | number; userId: string | number }) {
|
||||
return request<R>({
|
||||
url: '/system/role/authUser/cancel',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function authUserCancelAll(data: { roleId: string | number; userIds: string }) {
|
||||
return request<R>({
|
||||
url: '/system/role/authUser/cancelAll',
|
||||
method: 'put',
|
||||
params: data
|
||||
});
|
||||
}
|
||||
|
||||
export function authUserSelectAll(data: { roleId: string | number; userIds: string }) {
|
||||
return request<R>({
|
||||
url: '/system/role/authUser/selectAll',
|
||||
method: 'put',
|
||||
params: data
|
||||
});
|
||||
}
|
||||
|
||||
export function deptTreeSelect(roleId: string | number) {
|
||||
return request<R<RoleDeptTree>>({
|
||||
url: `/system/role/deptTree/${roleId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
48
src/api/system/role/types.ts
Normal file
@ -0,0 +1,48 @@
|
||||
import type { DeptTreeVO } from '@/api/system/dept/types';
|
||||
import type { MenuTreeOption } from '@/api/system/menu/types';
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface RoleDeptTree {
|
||||
checkedKeys: Array<string | number>;
|
||||
depts: DeptTreeVO[];
|
||||
}
|
||||
|
||||
export interface RoleForm {
|
||||
roleId?: string | number;
|
||||
roleName?: string;
|
||||
roleKey?: string;
|
||||
roleSort?: number;
|
||||
status?: string;
|
||||
menuCheckStrictly?: boolean;
|
||||
deptCheckStrictly?: boolean;
|
||||
remark?: string;
|
||||
dataScope?: string;
|
||||
menuIds?: Array<string | number>;
|
||||
deptIds?: Array<string | number>;
|
||||
}
|
||||
|
||||
export interface RoleMenuTree {
|
||||
menus: MenuTreeOption[];
|
||||
checkedKeys: Array<string | number>;
|
||||
}
|
||||
|
||||
export interface RoleQuery extends PageQuery {
|
||||
roleName?: string;
|
||||
roleKey?: string;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
export interface RoleVO extends BaseEntity {
|
||||
roleId: string | number;
|
||||
roleName: string;
|
||||
roleKey: string;
|
||||
roleSort: number;
|
||||
dataScope: string;
|
||||
menuCheckStrictly?: boolean;
|
||||
deptCheckStrictly?: boolean;
|
||||
status: string;
|
||||
flag: boolean;
|
||||
admin: boolean;
|
||||
menuIds?: Array<string | number>;
|
||||
deptIds?: Array<string | number>;
|
||||
}
|
||||
24
src/api/system/social/auth.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import type { R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { SocialAuthVO } from './types';
|
||||
|
||||
export function authRouterUrl(source: string) {
|
||||
return request<R<string>>({
|
||||
url: `/auth/binding/${source}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function authUnlock(authId: string) {
|
||||
return request<R>({
|
||||
url: `/auth/unlock/${authId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function getAuthList() {
|
||||
return request<R<SocialAuthVO[]>>({
|
||||
url: '/system/social/list',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
7
src/api/system/social/types.ts
Normal file
@ -0,0 +1,7 @@
|
||||
export interface SocialAuthVO {
|
||||
id: string;
|
||||
source?: string;
|
||||
avatar?: string;
|
||||
userName?: string;
|
||||
createTime?: string;
|
||||
}
|
||||
162
src/api/system/user/index.ts
Normal file
@ -0,0 +1,162 @@
|
||||
import type { DeptTreeVO } from '@/api/system/dept/types';
|
||||
import type { RoleVO } from '@/api/system/role/types';
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import { parseStrEmpty } from '@/utils/ruoyi';
|
||||
import type { UserForm, UserInfoVO, UserQuery, UserVO } from './types';
|
||||
|
||||
export function listUser(query: UserQuery) {
|
||||
return request<R<PageResult<UserVO>>>({
|
||||
url: '/system/user/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function optionSelect(userIds: Array<number | string>) {
|
||||
return request<R<UserVO[]>>({
|
||||
url: `/system/user/optionselect?userIds=${userIds}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function getUser(userId?: string | number) {
|
||||
return request<R<UserInfoVO>>({
|
||||
url: `/system/user/${parseStrEmpty(userId)}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addUser(data: UserForm) {
|
||||
return request<R>({
|
||||
url: '/system/user',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateUser(data: UserForm) {
|
||||
return request<R>({
|
||||
url: '/system/user',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delUser(userId: Array<string | number> | string | number) {
|
||||
return request<R>({
|
||||
url: `/system/user/${userId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function resetUserPwd(userId: string | number, password: string) {
|
||||
return request<R>({
|
||||
url: '/system/user/resetPwd',
|
||||
method: 'put',
|
||||
headers: {
|
||||
isEncrypt: true,
|
||||
repeatSubmit: false
|
||||
},
|
||||
data: {
|
||||
userId,
|
||||
password
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function changeUserStatus(userId: number | string, status: string) {
|
||||
return request<R>({
|
||||
url: '/system/user/changeStatus',
|
||||
method: 'put',
|
||||
data: {
|
||||
userId,
|
||||
status
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function unlockUser(userId: number | string) {
|
||||
return request<R>({
|
||||
url: `/system/user/unlock/${userId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function getUserProfile() {
|
||||
return request<R<UserInfoVO>>({
|
||||
url: '/system/user/profile',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function updateUserProfile(data: UserForm) {
|
||||
return request<R>({
|
||||
url: '/system/user/profile',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateUserPwd(oldPassword: string, newPassword: string) {
|
||||
return request<R>({
|
||||
url: '/system/user/profile/updatePwd',
|
||||
method: 'put',
|
||||
headers: {
|
||||
isEncrypt: true,
|
||||
repeatSubmit: false
|
||||
},
|
||||
data: {
|
||||
oldPassword,
|
||||
newPassword
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export function uploadAvatar(data: FormData) {
|
||||
return request<R<{ imgUrl: string }>>({
|
||||
url: '/system/user/profile/avatar',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function importUser(data: FormData, updateSupport: boolean) {
|
||||
return request<R>({
|
||||
url: '/system/user/importData',
|
||||
method: 'post',
|
||||
params: {
|
||||
updateSupport: updateSupport ? 1 : 0
|
||||
},
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function getAuthRole(userId: string | number) {
|
||||
return request<R<{ user: UserVO; roles: RoleVO[] }>>({
|
||||
url: `/system/user/authRole/${userId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function updateAuthRole(data: { userId: string; roleIds: string }) {
|
||||
return request<R>({
|
||||
url: '/system/user/authRole',
|
||||
method: 'put',
|
||||
params: data
|
||||
});
|
||||
}
|
||||
|
||||
export function deptTreeSelect() {
|
||||
return request<R<DeptTreeVO[]>>({
|
||||
url: '/system/user/deptTree',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function listUserByDeptId(deptId: string | number) {
|
||||
return request<R<UserVO[]>>({
|
||||
url: `/system/user/list/dept/${deptId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
71
src/api/system/user/types.ts
Normal file
@ -0,0 +1,71 @@
|
||||
import type { DeptVO } from '@/api/system/dept/types';
|
||||
import type { PostVO } from '@/api/system/post/types';
|
||||
import type { RoleVO } from '@/api/system/role/types';
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface UserInfo {
|
||||
user: {
|
||||
userId: string | number;
|
||||
userName: string;
|
||||
nickName?: string;
|
||||
avatar?: string;
|
||||
deptName?: string;
|
||||
};
|
||||
roles: string[];
|
||||
permissions: string[];
|
||||
}
|
||||
|
||||
export interface UserForm {
|
||||
userId?: string | number;
|
||||
deptId?: number | string;
|
||||
userName?: string;
|
||||
nickName?: string;
|
||||
password?: string;
|
||||
phoneNumber?: string;
|
||||
email?: string;
|
||||
gender?: string;
|
||||
status?: string;
|
||||
remark?: string;
|
||||
postIds?: Array<string | number>;
|
||||
roleIds?: Array<string | number>;
|
||||
}
|
||||
|
||||
export interface UserInfoVO {
|
||||
user?: UserVO;
|
||||
roles: RoleVO[];
|
||||
roleIds: Array<string | number>;
|
||||
posts: PostVO[];
|
||||
postIds: Array<string | number>;
|
||||
roleGroup?: string;
|
||||
postGroup?: string;
|
||||
}
|
||||
|
||||
export interface UserQuery extends PageQuery {
|
||||
userName?: string;
|
||||
nickName?: string;
|
||||
phoneNumber?: string;
|
||||
status?: string;
|
||||
deptId?: string | number;
|
||||
roleId?: string | number;
|
||||
userIds?: string | number;
|
||||
}
|
||||
|
||||
export interface UserVO extends BaseEntity {
|
||||
userId?: string | number;
|
||||
tenantId?: string;
|
||||
deptId?: number | string;
|
||||
userName?: string;
|
||||
nickName?: string;
|
||||
userType?: string;
|
||||
email?: string;
|
||||
phoneNumber?: string;
|
||||
gender?: string;
|
||||
avatar?: string;
|
||||
status?: string;
|
||||
deptName?: string;
|
||||
roles?: RoleVO[];
|
||||
admin?: boolean;
|
||||
loginIp?: string;
|
||||
loginDate?: string;
|
||||
dept?: DeptVO;
|
||||
}
|
||||
78
src/api/tool/gen/index.ts
Normal file
@ -0,0 +1,78 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { DbTableQuery, DbTableVO, GenTableDetailPayload, TableQuery, TableVO } from './types';
|
||||
|
||||
export function listTable(query: TableQuery) {
|
||||
return request<R<PageResult<TableVO>>>({
|
||||
url: '/tool/gen/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function listDbTable(query: DbTableQuery) {
|
||||
return request<R<PageResult<DbTableVO>>>({
|
||||
url: '/tool/gen/db/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getGenTable(tableId: string | number) {
|
||||
return request<R<GenTableDetailPayload>>({
|
||||
url: `/tool/gen/${tableId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function updateGenTable(data: DbTableVO & { columns?: unknown[]; params?: Record<string, unknown> }) {
|
||||
return request<R>({
|
||||
url: '/tool/gen',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function importTable(data: { tables: string; dataName: string }) {
|
||||
return request<R>({
|
||||
url: '/tool/gen/importTable',
|
||||
method: 'post',
|
||||
params: data
|
||||
});
|
||||
}
|
||||
|
||||
export function previewTable(tableId: string | number) {
|
||||
return request<R<Record<string, string>>>({
|
||||
url: `/tool/gen/preview/${tableId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function delTable(tableId: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/tool/gen/${tableId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function synchDb(tableId: string | number) {
|
||||
return request<R>({
|
||||
url: `/tool/gen/synchDb/${tableId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function getDataNames() {
|
||||
return request<R<string[]>>({
|
||||
url: '/tool/gen/getDataNames',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function batchGenCode(tableIdStr: string) {
|
||||
return request<Blob>({
|
||||
url: `/tool/gen/batchGenCode?tableIdStr=${tableIdStr}`,
|
||||
method: 'get',
|
||||
responseType: 'blob'
|
||||
});
|
||||
}
|
||||
89
src/api/tool/gen/types.ts
Normal file
@ -0,0 +1,89 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface DbColumnVO extends BaseEntity {
|
||||
columnId?: string | number;
|
||||
tableId?: string | number;
|
||||
columnName?: string;
|
||||
columnComment?: string;
|
||||
columnType?: string;
|
||||
javaType?: string;
|
||||
javaField?: string;
|
||||
isPk?: string;
|
||||
isIncrement?: string;
|
||||
isRequired?: string;
|
||||
isInsert?: string;
|
||||
isEdit?: string;
|
||||
isList?: string;
|
||||
isQuery?: string;
|
||||
queryType?: string;
|
||||
htmlType?: string;
|
||||
dictType?: string;
|
||||
sort?: number;
|
||||
increment?: boolean;
|
||||
capJavaField?: string;
|
||||
usableColumn?: boolean;
|
||||
superColumn?: boolean;
|
||||
list?: boolean;
|
||||
pk?: boolean;
|
||||
insert?: boolean;
|
||||
edit?: boolean;
|
||||
query?: boolean;
|
||||
required?: boolean;
|
||||
}
|
||||
|
||||
export interface DbTableQuery extends PageQuery {
|
||||
dataName?: string;
|
||||
tableName?: string;
|
||||
tableComment?: string;
|
||||
}
|
||||
|
||||
export interface DbTableVO extends Omit<TableVO, 'tableId'> {
|
||||
tableId?: string | number;
|
||||
columns?: DbColumnVO[];
|
||||
options?: string;
|
||||
remark?: string;
|
||||
treeCode?: string;
|
||||
treeParentCode?: string;
|
||||
treeName?: string;
|
||||
menuIds?: Array<string | number>;
|
||||
parentMenuId?: string | number;
|
||||
parentMenuName?: string;
|
||||
enableExport?: boolean;
|
||||
enableStatus?: boolean;
|
||||
statusField?: string;
|
||||
enableUnique?: boolean;
|
||||
uniqueFields?: string[];
|
||||
enableSort?: boolean;
|
||||
sortField?: string;
|
||||
treeRootValue?: string;
|
||||
treeAncestorsField?: string;
|
||||
treeOrderField?: string;
|
||||
}
|
||||
|
||||
export interface GenTableDetailPayload {
|
||||
info: DbTableVO;
|
||||
rows: DbColumnVO[];
|
||||
}
|
||||
|
||||
export interface TableQuery extends PageQuery {
|
||||
tableName?: string;
|
||||
tableComment?: string;
|
||||
dataName?: string;
|
||||
}
|
||||
|
||||
export interface TableVO extends BaseEntity {
|
||||
createDept?: number | string;
|
||||
tableId: string | number;
|
||||
dataName?: string;
|
||||
tableName: string;
|
||||
tableComment?: string;
|
||||
className?: string;
|
||||
tplCategory?: string;
|
||||
packageName?: string;
|
||||
moduleName?: string;
|
||||
businessName?: string;
|
||||
functionName?: string;
|
||||
functionAuthor?: string;
|
||||
tree?: boolean;
|
||||
crud?: boolean;
|
||||
}
|
||||
88
src/api/types.ts
Normal file
@ -0,0 +1,88 @@
|
||||
import type { MenuDataItem } from '@ant-design/pro-components';
|
||||
|
||||
export interface BaseEntity {
|
||||
createBy?: string;
|
||||
createTime?: string;
|
||||
updateBy?: string;
|
||||
updateTime?: string;
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface LoginParams {
|
||||
username?: string;
|
||||
password?: string;
|
||||
code?: string;
|
||||
uuid?: string;
|
||||
rememberMe?: boolean;
|
||||
socialCode?: string;
|
||||
socialState?: string;
|
||||
source?: string;
|
||||
clientId?: string;
|
||||
grantType?: string;
|
||||
}
|
||||
|
||||
export interface LoginResult {
|
||||
access_token: string;
|
||||
}
|
||||
|
||||
export interface PageQuery {
|
||||
pageNum?: number;
|
||||
pageSize?: number;
|
||||
orderByColumn?: string;
|
||||
isAsc?: 'ascending' | 'descending';
|
||||
params?: Record<string, unknown>;
|
||||
}
|
||||
|
||||
export interface PageResult<T = unknown> {
|
||||
total: number;
|
||||
rows: T[];
|
||||
}
|
||||
|
||||
export interface R<T = unknown> {
|
||||
code: number;
|
||||
msg: string;
|
||||
data: T;
|
||||
}
|
||||
|
||||
export interface RegisterParams {
|
||||
username?: string;
|
||||
password?: string;
|
||||
confirmPassword?: string;
|
||||
code?: string;
|
||||
uuid?: string;
|
||||
userType?: string;
|
||||
clientId?: string;
|
||||
grantType?: string;
|
||||
}
|
||||
|
||||
export interface VerifyCodeResult {
|
||||
captchaEnabled: boolean;
|
||||
uuid?: string;
|
||||
img?: string;
|
||||
}
|
||||
|
||||
export interface RouteMeta {
|
||||
title?: string;
|
||||
icon?: string;
|
||||
noCache?: boolean;
|
||||
link?: string;
|
||||
hidden?: boolean;
|
||||
activeMenu?: string;
|
||||
}
|
||||
|
||||
export interface BackendRoute {
|
||||
name?: string;
|
||||
path: string;
|
||||
component?: string;
|
||||
redirect?: string;
|
||||
query?: string;
|
||||
hidden?: boolean;
|
||||
alwaysShow?: boolean;
|
||||
meta?: RouteMeta;
|
||||
children?: BackendRoute[];
|
||||
}
|
||||
|
||||
export type RuntimeMenuItem = Omit<MenuDataItem, 'routes'> & {
|
||||
backendRoute?: BackendRoute;
|
||||
routes?: RuntimeMenuItem[];
|
||||
};
|
||||
49
src/api/workflow/category/index.ts
Normal file
@ -0,0 +1,49 @@
|
||||
import type { R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { CategoryForm, CategoryQuery, CategoryTreeVO, CategoryVO } from './types';
|
||||
|
||||
export function listCategory(query?: CategoryQuery) {
|
||||
return request<R<CategoryVO[]>>({
|
||||
url: '/workflow/category/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getCategory(categoryId: string | number) {
|
||||
return request<R<CategoryVO>>({
|
||||
url: `/workflow/category/${categoryId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addCategory(data: CategoryForm) {
|
||||
return request<R>({
|
||||
url: '/workflow/category',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateCategory(data: CategoryForm) {
|
||||
return request<R>({
|
||||
url: '/workflow/category',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delCategory(categoryId: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/workflow/category/${categoryId}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function categoryTree(query?: CategoryForm) {
|
||||
return request<R<CategoryTreeVO[]>>({
|
||||
url: '/workflow/category/categoryTree',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
29
src/api/workflow/category/types.ts
Normal file
@ -0,0 +1,29 @@
|
||||
import type { BaseEntity } from '@/api/types';
|
||||
|
||||
export interface CategoryForm extends BaseEntity {
|
||||
categoryId?: string | number;
|
||||
categoryName?: string;
|
||||
parentId?: string | number;
|
||||
orderNum?: number;
|
||||
}
|
||||
|
||||
export interface CategoryQuery {
|
||||
categoryName?: string;
|
||||
}
|
||||
|
||||
export interface CategoryTreeVO {
|
||||
id: number | string;
|
||||
label: string;
|
||||
parentId: number | string;
|
||||
weight: number;
|
||||
children?: CategoryTreeVO[];
|
||||
}
|
||||
|
||||
export interface CategoryVO {
|
||||
categoryId: string | number;
|
||||
parentId?: string | number;
|
||||
categoryName: string;
|
||||
orderNum: number;
|
||||
createTime?: string;
|
||||
children?: CategoryVO[];
|
||||
}
|
||||
137
src/api/workflow/definition/index.ts
Normal file
@ -0,0 +1,137 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { definitionXmlVO, FlowDefinitionForm, FlowDefinitionQuery, FlowDefinitionVO } from './types';
|
||||
|
||||
export function listDefinition(query: FlowDefinitionQuery) {
|
||||
return request<R<PageResult<FlowDefinitionVO>>>({
|
||||
url: '/workflow/definition/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function unPublishList(query: FlowDefinitionQuery) {
|
||||
return request<R<PageResult<FlowDefinitionVO>>>({
|
||||
url: '/workflow/definition/unPublishList',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function definitionXml(definitionId: string) {
|
||||
return request<R<definitionXmlVO>>({
|
||||
url: `/workflow/definition/definitionXml/${definitionId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function deleteDefinition(id: string | string[]) {
|
||||
return request<R>({
|
||||
url: `/workflow/definition/${id}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function activeDefinition(definitionId: string, activityStatus: boolean) {
|
||||
return request<R>({
|
||||
url: `/workflow/definition/active/${definitionId}`,
|
||||
method: 'put',
|
||||
params: { active: activityStatus }
|
||||
});
|
||||
}
|
||||
|
||||
export function active(definitionId: string, activityStatus: boolean) {
|
||||
return activeDefinition(definitionId, activityStatus);
|
||||
}
|
||||
|
||||
export function importDefinition(data: FormData) {
|
||||
return request<R>({
|
||||
url: '/workflow/definition/importDef',
|
||||
method: 'post',
|
||||
data,
|
||||
headers: { repeatSubmit: false }
|
||||
});
|
||||
}
|
||||
|
||||
export function importDef(data: FormData) {
|
||||
return importDefinition(data);
|
||||
}
|
||||
|
||||
export function publishDefinition(id: string) {
|
||||
return request<R>({
|
||||
url: `/workflow/definition/publish/${id}`,
|
||||
method: 'put'
|
||||
});
|
||||
}
|
||||
|
||||
export function publish(id: string) {
|
||||
return publishDefinition(id);
|
||||
}
|
||||
|
||||
export function unPublish(id: string) {
|
||||
return request<R>({
|
||||
url: `/workflow/definition/unPublish/${id}`,
|
||||
method: 'put'
|
||||
});
|
||||
}
|
||||
|
||||
export function xmlString(id: string) {
|
||||
return request<R<string>>({
|
||||
url: `/workflow/definition/xmlString/${id}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addDefinition(data: FlowDefinitionForm) {
|
||||
return request<R>({
|
||||
url: '/workflow/definition',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function add(data: FlowDefinitionForm) {
|
||||
return addDefinition(data);
|
||||
}
|
||||
|
||||
export function editDefinition(data: FlowDefinitionForm) {
|
||||
return request<R>({
|
||||
url: '/workflow/definition',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function edit(data: FlowDefinitionForm) {
|
||||
return editDefinition(data);
|
||||
}
|
||||
|
||||
export function getDefinition(id: string) {
|
||||
return request<R<FlowDefinitionVO>>({
|
||||
url: `/workflow/definition/${id}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function getInfo(id: string | number) {
|
||||
return getDefinition(String(id));
|
||||
}
|
||||
|
||||
export function copyDefinition(id: string) {
|
||||
return request<R>({
|
||||
url: `/workflow/definition/copy/${id}`,
|
||||
method: 'post'
|
||||
});
|
||||
}
|
||||
|
||||
export function copy(id: string) {
|
||||
return copyDefinition(id);
|
||||
}
|
||||
|
||||
export function exportDefinition(id: string) {
|
||||
return request<Blob>({
|
||||
url: `/workflow/definition/exportDef/${id}`,
|
||||
method: 'post',
|
||||
responseType: 'blob'
|
||||
});
|
||||
}
|
||||
43
src/api/workflow/definition/types.ts
Normal file
@ -0,0 +1,43 @@
|
||||
import type { PageQuery } from '@/api/types';
|
||||
|
||||
export interface FlowDefinitionForm {
|
||||
id?: string;
|
||||
flowName?: string;
|
||||
flowCode?: string;
|
||||
category?: string | number;
|
||||
ext?: string;
|
||||
formPath?: string;
|
||||
formCustom?: string;
|
||||
modelValue?: string;
|
||||
}
|
||||
|
||||
export interface FlowDefinitionQuery extends PageQuery {
|
||||
flowCode?: string;
|
||||
flowName?: string;
|
||||
category?: string | number;
|
||||
isPublish?: number;
|
||||
}
|
||||
|
||||
export interface FlowDefinitionVO {
|
||||
id: string;
|
||||
flowName: string;
|
||||
flowCode: string;
|
||||
category?: string | number;
|
||||
categoryName?: string;
|
||||
formPath?: string;
|
||||
formCustom?: string;
|
||||
modelValue?: string;
|
||||
version?: string | number;
|
||||
isPublish?: number;
|
||||
activityStatus?: number;
|
||||
ext?: string;
|
||||
createTime?: string | Date;
|
||||
updateTime?: string | Date;
|
||||
}
|
||||
|
||||
export type FlowDefinitionVo = FlowDefinitionVO;
|
||||
|
||||
export interface definitionXmlVO {
|
||||
xml: string[];
|
||||
xmlStr: string;
|
||||
}
|
||||
84
src/api/workflow/instance/index.ts
Normal file
@ -0,0 +1,84 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { FlowHisTaskResult, FlowInstanceQuery, FlowInstanceVO } from './types';
|
||||
|
||||
export function pageByRunning(query: FlowInstanceQuery) {
|
||||
return request<R<PageResult<FlowInstanceVO>>>({
|
||||
url: '/workflow/instance/pageByRunning',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function pageByFinish(query: FlowInstanceQuery) {
|
||||
return request<R<PageResult<FlowInstanceVO>>>({
|
||||
url: '/workflow/instance/pageByFinish',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function pageByCurrent(query: FlowInstanceQuery) {
|
||||
return request<R<PageResult<FlowInstanceVO>>>({
|
||||
url: '/workflow/instance/pageByCurrent',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function cancelProcessApply(data: {
|
||||
id?: string | number;
|
||||
businessId?: string | number;
|
||||
comment?: string;
|
||||
message?: string;
|
||||
}) {
|
||||
return request<R>({
|
||||
url: '/workflow/instance/cancelProcessApply',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function instanceVariable(instanceId: string | number) {
|
||||
return request<R<{ variable: string }>>({
|
||||
url: `/workflow/instance/instanceVariable/${instanceId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function deleteByInstanceIds(instanceIds: Array<string | number> | string | number) {
|
||||
return request<R>({
|
||||
url: `/workflow/instance/deleteByInstanceIds/${instanceIds}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function deleteHisByInstanceIds(instanceIds: Array<string | number> | string | number) {
|
||||
return request<R>({
|
||||
url: `/workflow/instance/deleteHisByInstanceIds/${instanceIds}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
|
||||
export function invalid(data: { id: string | number; comment?: string }) {
|
||||
return request<R>({
|
||||
url: '/workflow/instance/invalid',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateVariable(data: { instanceId?: string | number; key?: string; value?: string }) {
|
||||
return request<R>({
|
||||
url: '/workflow/instance/updateVariable',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function flowHisTaskList(businessId: string | number) {
|
||||
return request<R<FlowHisTaskResult>>({
|
||||
url: `/workflow/instance/flowHisTaskList/${businessId}?t=${Math.random()}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
41
src/api/workflow/instance/types.ts
Normal file
@ -0,0 +1,41 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
import type { FlowHistoryVO, FlowTaskVO } from '@/api/workflow/task/types';
|
||||
|
||||
export interface FlowHisTaskResult {
|
||||
list: FlowHistoryVO[];
|
||||
instanceId?: string | number;
|
||||
}
|
||||
|
||||
export interface FlowInstanceQuery extends PageQuery {
|
||||
category?: string | number;
|
||||
nodeName?: string;
|
||||
flowCode?: string;
|
||||
flowName?: string;
|
||||
createByIds?: Array<string | number>;
|
||||
businessId?: string;
|
||||
}
|
||||
|
||||
export interface FlowInstanceVO extends BaseEntity {
|
||||
id: string | number;
|
||||
definitionId?: string;
|
||||
flowName?: string;
|
||||
flowCode?: string;
|
||||
version?: string | number;
|
||||
businessId: string;
|
||||
activityStatus?: number;
|
||||
tenantId?: string;
|
||||
createTime?: string;
|
||||
updateTime?: string;
|
||||
createBy?: string;
|
||||
createByName?: string;
|
||||
flowStatus?: string;
|
||||
flowStatusName?: string;
|
||||
flowTaskList?: FlowTaskVO[];
|
||||
businessCode?: string;
|
||||
businessTitle?: string;
|
||||
nodeName?: string;
|
||||
categoryName?: string;
|
||||
isSuspended?: boolean;
|
||||
formCustom?: string;
|
||||
formPath?: string;
|
||||
}
|
||||
49
src/api/workflow/leave/index.ts
Normal file
@ -0,0 +1,49 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { LeaveForm, LeaveQuery, LeaveVO } from './types';
|
||||
|
||||
export function listLeave(query?: LeaveQuery) {
|
||||
return request<R<PageResult<LeaveVO>>>({
|
||||
url: '/workflow/leave/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getLeave(id: string | number) {
|
||||
return request<R<LeaveVO>>({
|
||||
url: `/workflow/leave/${id}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addLeave(data: LeaveForm) {
|
||||
return request<R<LeaveVO>>({
|
||||
url: '/workflow/leave',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function submitAndFlowStart(data: LeaveForm) {
|
||||
return request<R<LeaveVO>>({
|
||||
url: '/workflow/leave/submitAndFlowStart',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateLeave(data: LeaveForm) {
|
||||
return request<R<LeaveVO>>({
|
||||
url: '/workflow/leave',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delLeave(id: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/workflow/leave/${id}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
28
src/api/workflow/leave/types.ts
Normal file
@ -0,0 +1,28 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface LeaveForm extends BaseEntity {
|
||||
id?: string | number;
|
||||
applyCode?: string;
|
||||
leaveType?: string;
|
||||
startDate?: string;
|
||||
endDate?: string;
|
||||
leaveDays?: number;
|
||||
remark?: string;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
export interface LeaveQuery extends PageQuery {
|
||||
startLeaveDays?: number;
|
||||
endLeaveDays?: number;
|
||||
}
|
||||
|
||||
export interface LeaveVO {
|
||||
id: string | number;
|
||||
applyCode?: string;
|
||||
leaveType?: string;
|
||||
startDate?: string;
|
||||
endDate?: string;
|
||||
leaveDays?: number;
|
||||
remark?: string;
|
||||
status?: string;
|
||||
}
|
||||
41
src/api/workflow/spel/index.ts
Normal file
@ -0,0 +1,41 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import request from '@/api/request';
|
||||
import type { SpelForm, SpelQuery, SpelVO } from './types';
|
||||
|
||||
export function listSpel(query?: SpelQuery) {
|
||||
return request<R<PageResult<SpelVO>>>({
|
||||
url: '/workflow/spel/list',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function getSpel(id: string | number) {
|
||||
return request<R<SpelVO>>({
|
||||
url: `/workflow/spel/${id}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function addSpel(data: SpelForm) {
|
||||
return request<R>({
|
||||
url: '/workflow/spel',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateSpel(data: SpelForm) {
|
||||
return request<R>({
|
||||
url: '/workflow/spel',
|
||||
method: 'put',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function delSpel(id: string | number | Array<string | number>) {
|
||||
return request<R>({
|
||||
url: `/workflow/spel/${id}`,
|
||||
method: 'delete'
|
||||
});
|
||||
}
|
||||
29
src/api/workflow/spel/types.ts
Normal file
@ -0,0 +1,29 @@
|
||||
import type { BaseEntity, PageQuery } from '@/api/types';
|
||||
|
||||
export interface SpelForm extends BaseEntity {
|
||||
id?: string | number;
|
||||
componentName?: string;
|
||||
methodName?: string;
|
||||
methodParams?: string;
|
||||
viewSpel?: string;
|
||||
status?: string;
|
||||
remark?: string;
|
||||
}
|
||||
|
||||
export interface SpelQuery extends PageQuery {
|
||||
componentName?: string;
|
||||
methodName?: string;
|
||||
methodParams?: string;
|
||||
viewSpel?: string;
|
||||
status?: string;
|
||||
}
|
||||
|
||||
export interface SpelVO {
|
||||
id: string | number;
|
||||
componentName?: string;
|
||||
methodName?: string;
|
||||
methodParams?: string;
|
||||
viewSpel?: string;
|
||||
status?: string;
|
||||
remark?: string;
|
||||
}
|
||||
129
src/api/workflow/task/index.ts
Normal file
@ -0,0 +1,129 @@
|
||||
import type { PageResult, R } from '@/api/types';
|
||||
import type { StartProcessBo } from '@/api/workflow/workflowCommon/types';
|
||||
import request from '@/api/request';
|
||||
import type { FlowNextNodeVO, FlowTaskVO, StartWorkflowResult, TaskOperationBo, TaskQuery } from './types';
|
||||
|
||||
export function pageByTaskWait(query: TaskQuery) {
|
||||
return request<R<PageResult<FlowTaskVO>>>({
|
||||
url: '/workflow/task/pageByTaskWait',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function pageByTaskFinish(query: TaskQuery) {
|
||||
return request<R<PageResult<FlowTaskVO>>>({
|
||||
url: '/workflow/task/pageByTaskFinish',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function pageByTaskCopy(query: TaskQuery) {
|
||||
return request<R<PageResult<FlowTaskVO>>>({
|
||||
url: '/workflow/task/pageByTaskCopy',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function pageByAllTaskWait(query: TaskQuery) {
|
||||
return request<R<PageResult<FlowTaskVO>>>({
|
||||
url: '/workflow/task/pageByAllTaskWait',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function pageByAllTaskFinish(query: TaskQuery) {
|
||||
return request<R<PageResult<FlowTaskVO>>>({
|
||||
url: '/workflow/task/pageByAllTaskFinish',
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}
|
||||
|
||||
export function startWorkFlow(data: StartProcessBo) {
|
||||
return request<R<StartWorkflowResult>>({
|
||||
url: '/workflow/task/startWorkFlow',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function updateAssignee(taskIdList: Array<string | number>, userId: string | number) {
|
||||
return request<R>({
|
||||
url: `/workflow/task/updateAssignee/${userId}`,
|
||||
method: 'put',
|
||||
data: taskIdList
|
||||
});
|
||||
}
|
||||
|
||||
export function urgeTask(data: { taskIdList: Array<string | number>; message?: string; messageType?: string[] }) {
|
||||
return request<R>({
|
||||
url: '/workflow/task/urgeTask',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function completeTask(data: Record<string, unknown>) {
|
||||
return request<R>({
|
||||
url: '/workflow/task/completeTask',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function backProcess(data: Record<string, unknown>) {
|
||||
return request<R>({
|
||||
url: '/workflow/task/backProcess',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function getTask(taskId: string | number) {
|
||||
return request<R<FlowTaskVO>>({
|
||||
url: `/workflow/task/getTask/${taskId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function terminationTask(data: { taskId?: string | number; comment?: string }) {
|
||||
return request<R>({
|
||||
url: '/workflow/task/terminationTask',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function getBackTaskNode(taskId: string | number, nodeCode?: string) {
|
||||
return request<R<FlowNextNodeVO[]>>({
|
||||
url: `/workflow/task/getBackTaskNode/${taskId}/${nodeCode || ''}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function taskOperation(data: TaskOperationBo, operation: string) {
|
||||
return request<R>({
|
||||
url: `/workflow/task/taskOperation/${operation}`,
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
|
||||
export function currentTaskAllUser(taskId: string | number) {
|
||||
return request<R<Array<{ userId: string | number; nickName: string; nodeName?: string }>>>({
|
||||
url: `/workflow/task/currentTaskAllUser/${taskId}`,
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
export function getNextNodeList(data: { taskId?: string | number; variables?: Record<string, unknown> }) {
|
||||
return request<R<FlowNextNodeVO[]>>({
|
||||
url: '/workflow/task/getNextNodeList',
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}
|
||||
82
src/api/workflow/task/types.ts
Normal file
@ -0,0 +1,82 @@
|
||||
import type { OssVO } from '@/api/system/oss/types';
|
||||
import type { PageQuery } from '@/api/types';
|
||||
|
||||
export interface ButtonList {
|
||||
code: string;
|
||||
show: boolean;
|
||||
}
|
||||
|
||||
export interface FlowCopyVo {
|
||||
userId: string | number;
|
||||
nickName: string;
|
||||
}
|
||||
|
||||
export interface FlowHistoryVO {
|
||||
nodeName?: string;
|
||||
approverName?: string;
|
||||
flowStatus?: string;
|
||||
message?: string;
|
||||
createTime?: string;
|
||||
updateTime?: string;
|
||||
runDuration?: string;
|
||||
ext?: string | number;
|
||||
attachmentList?: OssVO[];
|
||||
}
|
||||
|
||||
export interface FlowNextNodeVO {
|
||||
nodeCode: string;
|
||||
nodeName: string;
|
||||
permissionFlag?: string | Array<string | number>;
|
||||
}
|
||||
|
||||
export interface FlowTaskVO {
|
||||
id: string | number;
|
||||
createTime?: string | Date;
|
||||
updateTime?: string | Date;
|
||||
tenantId?: string;
|
||||
definitionId?: string;
|
||||
instanceId?: string;
|
||||
flowName?: string;
|
||||
businessId: string;
|
||||
nodeCode?: string;
|
||||
nodeName?: string;
|
||||
flowCode?: string;
|
||||
flowStatus?: string;
|
||||
flowStatusName?: string;
|
||||
flowTaskStatus?: string;
|
||||
formCustom?: string;
|
||||
formPath?: string;
|
||||
nodeType?: number;
|
||||
nodeRatio?: string | number;
|
||||
version?: string;
|
||||
applyNode?: boolean;
|
||||
buttonList?: ButtonList[];
|
||||
copyList?: FlowCopyVo[];
|
||||
varList?: Record<string, string>;
|
||||
businessCode?: string;
|
||||
businessTitle?: string;
|
||||
categoryName?: string;
|
||||
createByName?: string;
|
||||
assigneeNames?: string;
|
||||
approverName?: string;
|
||||
}
|
||||
|
||||
export interface StartWorkflowResult {
|
||||
taskId?: string | number;
|
||||
}
|
||||
|
||||
export interface TaskOperationBo {
|
||||
taskId?: string | number;
|
||||
userId?: string | number;
|
||||
userIds?: Array<string | number>;
|
||||
message?: string;
|
||||
messageType?: string[];
|
||||
variables?: Record<string, unknown>;
|
||||
}
|
||||
|
||||
export interface TaskQuery extends PageQuery {
|
||||
nodeName?: string;
|
||||
flowCode?: string;
|
||||
flowName?: string;
|
||||
createByIds?: Array<string | number>;
|
||||
}
|
||||
17
src/api/workflow/workflowCommon/index.ts
Normal file
@ -0,0 +1,17 @@
|
||||
import { history } from '@umijs/max';
|
||||
import { normalizePath } from '@/utils/ruoyi';
|
||||
import type { RouterJumpVO } from './types';
|
||||
|
||||
export function routerJump(routerJump: RouterJumpVO) {
|
||||
history.push(
|
||||
`${normalizePath(routerJump.formPath || '/workflow/leaveEdit/index')}?${new URLSearchParams({
|
||||
id: routerJump.businessId,
|
||||
type: routerJump.type,
|
||||
taskId: String(routerJump.taskId)
|
||||
}).toString()}`
|
||||
);
|
||||
}
|
||||
|
||||
export default {
|
||||
routerJump
|
||||
};
|
||||
14
src/api/workflow/workflowCommon/types.ts
Normal file
@ -0,0 +1,14 @@
|
||||
export interface RouterJumpVO {
|
||||
businessId: string;
|
||||
taskId: string | number;
|
||||
type: string;
|
||||
formCustom: string;
|
||||
formPath: string;
|
||||
}
|
||||
|
||||
export interface StartProcessBo {
|
||||
businessId: string | number;
|
||||
flowCode: string;
|
||||
variables: Record<string, unknown>;
|
||||
bizExt: Record<string, unknown>;
|
||||
}
|
||||
14
src/app.tsx
Normal file
@ -0,0 +1,14 @@
|
||||
import type { ReactNode } from 'react';
|
||||
import { QueryClientProvider } from '@tanstack/react-query';
|
||||
import { appEnv } from '@/utils/env';
|
||||
import { queryClient } from '@/utils/queryClient';
|
||||
|
||||
export async function getInitialState() {
|
||||
return {
|
||||
name: appEnv.logoTitle
|
||||
};
|
||||
}
|
||||
|
||||
export function rootContainer(container: ReactNode) {
|
||||
return <QueryClientProvider client={queryClient}>{container}</QueryClientProvider>;
|
||||
}
|
||||
1
src/assets/icons/svg/404.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M121.718 73.272v9.953c3.957-7.584 6.199-16.05 6.199-24.995C127.917 26.079 99.273 0 63.958 0 28.644 0 0 26.079 0 58.23c0 .403.028.806.028 1.21l22.97-25.953h13.34l-19.76 27.187h6.42V53.77l13.728-19.477v49.361H22.998V73.272H2.158c5.951 20.284 23.608 36.208 45.998 41.399-1.44 3.3-5.618 11.263-12.565 12.674-8.607 1.764 23.358.428 46.163-13.178 17.519-4.611 31.938-15.849 39.77-30.513h-13.506V73.272H85.02V59.464l22.998-25.977h13.008l-19.429 27.187h6.421v-7.433l13.727-19.402v39.433h-.027zm-78.24 2.822a10.516 10.516 0 0 1-.996-4.535V44.548c0-1.613.332-3.124.996-4.535a11.66 11.66 0 0 1 2.713-3.68c1.134-1.032 2.49-1.864 4.04-2.468 1.55-.605 3.21-.908 4.982-.908h11.292c1.77 0 3.431.303 4.981.908 1.522.604 2.85 1.41 3.986 2.418l-12.26 16.303v-2.898a1.96 1.96 0 0 0-.665-1.512c-.443-.403-.996-.604-1.66-.604-.665 0-1.218.201-1.661.604a1.96 1.96 0 0 0-.664 1.512v9.071L44.364 77.606a10.556 10.556 0 0 1-.886-1.512zm35.73-4.535c0 1.613-.332 3.124-.997 4.535a11.66 11.66 0 0 1-2.712 3.68c-1.134 1.032-2.49 1.864-4.04 2.469-1.55.604-3.21.907-4.982.907H55.185c-1.77 0-3.431-.303-4.981-.907-1.55-.605-2.906-1.437-4.041-2.47a12.49 12.49 0 0 1-1.384-1.512l13.727-18.217v6.375c0 .605.222 1.109.665 1.512.442.403.996.604 1.66.604.664 0 1.218-.201 1.66-.604a1.96 1.96 0 0 0 .665-1.512V53.87L75.97 36.838c.913.932 1.66 1.99 2.214 3.175.664 1.41.996 2.922.996 4.535v27.011h.028z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
1
src/assets/icons/svg/bug.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M127.88 73.143c0 1.412-.506 2.635-1.518 3.669-1.011 1.033-2.209 1.55-3.592 1.55h-17.887c0 9.296-1.783 17.178-5.35 23.645l16.609 17.044c1.011 1.034 1.517 2.257 1.517 3.67 0 1.412-.506 2.635-1.517 3.668-.958 1.033-2.155 1.55-3.593 1.55-1.438 0-2.635-.517-3.593-1.55l-15.811-16.063a15.49 15.49 0 0 1-1.196 1.06c-.532.434-1.65 1.208-3.353 2.322a50.104 50.104 0 0 1-5.192 2.974c-1.758.87-3.94 1.658-6.546 2.364-2.607.706-5.189 1.06-7.748 1.06V47.044H58.89v73.062c-2.716 0-5.417-.367-8.106-1.102-2.688-.734-5.003-1.631-6.945-2.692a66.769 66.769 0 0 1-5.268-3.179c-1.571-1.057-2.73-1.94-3.476-2.65L33.9 109.34l-14.611 16.877c-1.066 1.14-2.344 1.711-3.833 1.711-1.277 0-2.422-.434-3.434-1.304-1.012-.978-1.557-2.187-1.635-3.627-.079-1.44.333-2.705 1.236-3.794l16.129-18.51c-3.087-6.197-4.63-13.644-4.63-22.342H5.235c-1.383 0-2.58-.517-3.592-1.55S.125 74.545.125 73.132c0-1.412.506-2.635 1.518-3.668 1.012-1.034 2.21-1.55 3.592-1.55h17.887V43.939L9.308 29.833c-1.012-1.033-1.517-2.256-1.517-3.669 0-1.412.505-2.635 1.517-3.668 1.012-1.034 2.21-1.55 3.593-1.55s2.58.516 3.593 1.55l13.813 14.106h67.396l13.814-14.106c1.012-1.034 2.21-1.55 3.592-1.55 1.384 0 2.581.516 3.593 1.55 1.012 1.033 1.518 2.256 1.518 3.668 0 1.413-.506 2.636-1.518 3.67l-13.814 14.105v23.975h17.887c1.383 0 2.58.516 3.593 1.55 1.011 1.033 1.517 2.256 1.517 3.668l-.005.01zM89.552 26.175H38.448c0-7.23 2.489-13.386 7.466-18.469C50.892 2.623 56.92.082 64 .082c7.08 0 13.108 2.541 18.086 7.624 4.977 5.083 7.466 11.24 7.466 18.469z"/></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
1
src/assets/icons/svg/build.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1568899741379" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2054" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M960 591.424V368.96c0-0.288 0.16-0.512 0.16-0.768S960 367.68 960 367.424V192a32 32 0 0 0-32-32H96a32 32 0 0 0-32 32v175.424c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768v222.464c0 0.288-0.16 0.512-0.16 0.768s0.16 0.48 0.16 0.768V864a32 32 0 0 0 32 32h832a32 32 0 0 0 32-32v-271.04c0-0.288 0.16-0.512 0.16-0.768S960 591.68 960 591.424z m-560-31.232v-160H608v160h-208z m208 64V832h-208v-207.808H608z m-480-224h208v160H128v-160z m544 0h224v160h-224v-160zM896 224v112.192H128V224h768zM128 624.192h208V832H128v-207.808zM672 832v-207.808h224V832h-224z" p-id="2055"></path></svg>
|
||||
|
After Width: | Height: | Size: 954 B |
1
src/assets/icons/svg/button.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1588670460195" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1314" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M230.4 307.712c13.824 0 25.088-11.264 25.088-25.088 0-100.352 81.92-182.272 182.272-182.272s182.272 81.408 182.272 182.272c0 13.824 11.264 25.088 25.088 25.088s25.088-11.264 24.576-25.088c0-127.488-103.936-231.936-231.936-231.936S205.824 154.624 205.824 282.624c-0.512 14.336 10.752 25.088 24.576 25.088z m564.736 234.496c-11.264 0-21.504 2.048-31.232 6.144 0-44.544-40.448-81.92-88.064-81.92-14.848 0-28.16 3.584-39.936 10.24-13.824-28.16-44.544-48.128-78.848-48.128-12.288 0-24.576 2.56-35.328 7.68V284.16c0-45.568-37.888-81.92-84.48-81.92s-84.48 36.864-84.48 81.92v348.672l-69.12-112.64c-18.432-28.16-58.368-36.864-91.136-19.968-26.624 14.336-46.592 47.104-30.208 88.064 3.072 8.192 76.8 205.312 171.52 311.296 0 0 28.16 24.576 43.008 58.88 4.096 9.728 13.312 15.36 22.528 15.36 3.072 0 6.656-0.512 9.728-2.048 12.288-5.12 18.432-19.968 12.8-32.256-19.456-44.544-53.76-74.752-53.76-74.752C281.6 768 209.408 573.44 208.384 570.88c-5.12-12.8-2.56-20.992 7.168-26.112 9.216-4.608 21.504-4.608 26.112 2.56l113.152 184.32c4.096 8.704 12.8 14.336 22.528 14.336 13.824 0 25.088-10.752 25.088-25.088V284.16c0-17.92 15.36-32.256 34.816-32.256s34.816 14.336 34.816 32.256v284.16c0 13.824 10.24 25.088 24.576 25.088 13.824 0 25.088-11.264 25.088-25.088v-57.344c0-17.92 15.36-32.768 34.816-32.768 19.968 0 37.376 15.36 37.376 32.768v95.232c0 7.168 3.072 13.312 7.68 17.92 4.608 4.608 10.752 7.168 17.92 7.168 13.824 0 24.576-11.264 24.576-25.088V547.84c0-18.432 13.824-32.256 32.256-32.256 20.48 0 38.912 15.36 38.912 32.256v95.232c0 13.824 11.264 25.088 25.088 25.088s24.576-11.264 25.088-25.088v-18.944c0-18.944 12.8-32.256 30.72-32.256 18.432 0 22.528 18.944 22.528 31.744 0 1.024-11.776 99.84-50.688 173.056-30.72 58.368-45.056 112.128-51.2 146.944-2.56 13.312 6.656 26.112 19.968 28.672 1.536 0 3.072 0.512 4.608 0.512 11.776 0 22.016-8.192 24.064-20.48 5.632-31.232 18.432-79.36 46.08-132.608 43.52-81.92 55.808-186.88 56.32-193.536-0.512-50.688-29.696-83.968-72.704-83.968z"></path></svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
1
src/assets/icons/svg/caret-back.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="ionicon" viewBox="0 0 512 512"><path d="M321.94 98L158.82 237.78a24 24 0 000 36.44L321.94 414c15.57 13.34 39.62 2.28 39.62-18.22v-279.6c0-20.5-24.05-31.56-39.62-18.18z"/></svg>
|
||||
|
After Width: | Height: | Size: 223 B |
1
src/assets/icons/svg/caret-forward.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="ionicon" viewBox="0 0 512 512"><path d="M190.06 414l163.12-139.78a24 24 0 000-36.44L190.06 98c-15.57-13.34-39.62-2.28-39.62 18.22v279.6c0 20.5 24.05 31.56 39.62 18.18z"/></svg>
|
||||
|
After Width: | Height: | Size: 223 B |
1
src/assets/icons/svg/cascader.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1576153230908" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="971" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M772.87036133 734.06115723c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714843H475.90991211c-56.60705567 0-102.66723633-46.06018067-102.66723633-102.66723633V600.82446289h305.859375c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012S827.9942627 467.50537109 772.87036133 467.50537109c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714844H373.24267578V401.01062011h321.92687989c55.12390137 0 99.94812012-44.82421875 99.94812011-99.94812011V190.07312011C795.11767578 134.94921875 750.29345703 90.125 695.16955567 90.125H251.12963867C196.0057373 90.125 151.18151855 134.94921875 151.18151855 190.07312011V301.0625c0 55.12390137 44.82421875 99.94812012 99.94812012 99.94812012h55.53588867v296.96044921c0 93.35632325 75.97045898 169.32678223 169.32678224 169.32678223h203.19213866c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012s-44.90661622-99.86572266-100.03051758-99.86572265z m0-199.89624024c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857423s-14.91394043 33.28857422-33.28857422 33.28857421-33.28857422-14.91394043-33.28857422-33.28857421 14.91394043-33.28857422 33.28857422-33.28857422zM217.75866699 301.0625V190.07312011c0-18.37463379 14.91394043-33.28857422 33.28857423-33.28857421h444.03991698c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857422V301.0625c0 18.37463379-14.91394043 33.28857422-33.28857422 33.28857422H251.12963867c-18.37463379 0-33.37097168-14.91394043-33.37097168-33.28857422z m555.11169434 566.23535156c-18.37463379 0-33.28857422-14.91394043-33.28857422-33.28857422 0-18.37463379 14.91394043-33.28857422 33.28857422-33.28857422s33.28857422 14.91394043 33.28857422 33.28857422c0.08239747 18.29223633-14.91394043 33.28857422-33.28857422 33.28857422z" p-id="972"></path></svg>
|
||||
|
After Width: | Height: | Size: 2.2 KiB |
1
src/assets/icons/svg/category.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg t="1715954426124" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3305" width="200" height="200"><path d="M664.081597 1023.943114a78.246037 78.246037 0 0 1-78.985549-76.795456v-284.996471a78.27448 78.27448 0 0 1 78.985549-76.93767h280.843828A78.189152 78.189152 0 0 1 1023.939417 662.151187v284.996471a78.246037 78.246037 0 0 1-79.013992 76.795456z m-585.067605 0a78.246037 78.246037 0 0 1-78.985549-76.795456v-284.996471a78.160709 78.160709 0 0 1 78.985549-76.93767h280.786942a78.302923 78.302923 0 0 1 79.042434 76.93767v284.996471h-0.170656a78.246037 78.246037 0 0 1-78.985549 76.795456z m0-585.096048a78.217594 78.217594 0 0 1-78.985549-76.93767V76.912925a78.189152 78.189152 0 0 1 78.957106-76.795456h280.786942a78.27448 78.27448 0 0 1 79.042435 76.93767v284.996471a78.27448 78.27448 0 0 1-79.013992 76.795456z m589.675333-5.688552a77.193655 77.193655 0 0 1-77.990052-75.885288V75.888985a77.25054 77.25054 0 0 1 77.990052-75.942173h277.26004a77.25054 77.25054 0 0 1 77.961609 75.942173v281.384241a77.421197 77.421197 0 0 1-78.132266 75.885288z" p-id="3306" fill="currentColor"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
1
src/assets/icons/svg/chart.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M0 54.857h36.571V128H0V54.857zM91.429 27.43H128V128H91.429V27.429zM45.714 0h36.572v128H45.714V0z"/></svg>
|
||||
|
After Width: | Height: | Size: 179 B |
1
src/assets/icons/svg/checkbox.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575982282951" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="902" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M828.40625 90.125H195.59375C137.375 90.125 90.125 137.375 90.125 195.59375v632.8125c0 58.21875 47.25 105.46875 105.46875 105.46875h632.8125c58.21875 0 105.46875-47.25 105.46875-105.46875V195.59375c0-58.21875-47.25-105.46875-105.46875-105.46875z m52.734375 738.28125c0 29.16-23.57015625 52.734375-52.734375 52.734375H195.59375c-29.109375 0-52.734375-23.574375-52.734375-52.734375V195.59375c0-29.109375 23.625-52.734375 52.734375-52.734375h632.8125c29.16 0 52.734375 23.625 52.734375 52.734375v632.8125z" p-id="903"></path><path d="M421.52890625 709.55984375a36.28125 36.28125 0 0 1-27.55265625-12.66890625L205.17453125 476.613125a36.28546875 36.28546875 0 0 1 55.10109375-47.22890625l164.986875 192.4846875 342.16171875-298.48078125a36.2896875 36.2896875 0 0 1 47.70984375 54.68765625L445.3859375 700.6203125a36.3234375 36.3234375 0 0 1-23.85703125 8.93953125z" p-id="904"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
1
src/assets/icons/svg/clipboard.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M54.857 118.857h64V73.143H89.143c-1.902 0-3.52-.668-4.855-2.002-1.335-1.335-2.002-2.954-2.002-4.855V36.57H54.857v82.286zM73.143 16v-4.571a2.2 2.2 0 0 0-.677-1.61 2.198 2.198 0 0 0-1.609-.676H20.571c-.621 0-1.158.225-1.609.676a2.198 2.198 0 0 0-.676 1.61V16a2.2 2.2 0 0 0 .676 1.61c.451.45.988.676 1.61.676h50.285c.622 0 1.158-.226 1.61-.677.45-.45.676-.987.676-1.609zm18.286 48h21.357L91.43 42.642V64zM128 73.143v48c0 1.902-.667 3.52-2.002 4.855-1.335 1.335-2.953 2.002-4.855 2.002H52.57c-1.901 0-3.52-.667-4.854-2.002-1.335-1.335-2.003-2.953-2.003-4.855v-11.429H6.857c-1.902 0-3.52-.667-4.855-2.002C.667 106.377 0 104.759 0 102.857v-96c0-1.902.667-3.52 2.002-4.855C3.337.667 4.955 0 6.857 0h77.714c1.902 0 3.52.667 4.855 2.002 1.335 1.335 2.003 2.953 2.003 4.855V30.29c1 .622 1.856 1.29 2.569 2.003l29.147 29.147c1.335 1.335 2.478 3.145 3.429 5.43.95 2.287 1.426 4.383 1.426 6.291v-.018z"/></svg>
|
||||
|
After Width: | Height: | Size: 971 B |
1
src/assets/icons/svg/code.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1546567861908" class="icon" style="" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2422" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M318.577778 819.2L17.066667 512l301.511111-307.2 45.511111 45.511111L96.711111 512l267.377778 261.688889zM705.422222 819.2l-45.511111-45.511111L927.288889 512l-267.377778-261.688889 45.511111-45.511111L1006.933333 512zM540.785778 221.866667l55.751111 11.150222L483.157333 802.133333l-55.751111-11.093333z" p-id="2423"></path></svg>
|
||||
|
After Width: | Height: | Size: 717 B |
1
src/assets/icons/svg/color.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1577252187056" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2508" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M747.59340925 691.12859384c11.51396329 0.25305413 22.43746719-0.21087818 40.74171707-1.51832482 29.35428085-2.10878421 35.84933734-2.36183835 46.47761114-0.8856895 24.71495444 3.37405491 41.12129828 21.76265671 32.47528161 47.95376084-85.57447632 258.19957947-442.00123984 249.76444099-628.67084683 50.73735554-153.47733892-159.33976008-153.09775772-414.41833795 0.92786545-573.42069196 159.71934128-162.67163983 424.03439521-166.59397897 565.78689185 0.63263534 80.38686649 94.81095318 108.34934958 169.16669549 89.11723508 230.57450162-15.01454608 47.99593598-50.61082928 77.68762207-119.77896259 114.63352789-4.89237973 2.65706845-29.35428085 15.52065436-35.84933652 19.02123633-46.94154346 25.30541465-63.51659033 41.20565021-62.20914449 58.45550757 2.95229856 39.13904114 24.16667102 52.7196135 70.98168823 53.81618115z m44.41100207 50.10472101c-19.82257471 1.43397372-32.05352527 1.940082-45.63409763 1.6448519-70.34905207-1.60267593-115.98314969-30.91478165-121.38163769-101.64341492-3.45840683-46.05585397 24.7571304-73.13264758 89.24376132-107.96976837 6.7902866-3.66928501 31.37871396-16.57504688 36.06021551-19.06341229 57.69634516-30.83042972 85.15271997-53.73183005 94.76877722-84.47790866 12.77923398-40.78389304-9.10994898-98.94417051-79.24812286-181.6507002-121.17075953-142.97559219-350.14258521-139.60153647-489.2380134 2.06660824-134.49827774 138.84237405-134.79350784 362.12048163-0.42175717 501.637667 158.53842169 168.99799328 451.9968783 181.18676788 534.57688175-11.80919339-4.68150156 0.2952301-10.71262573 0.67481131-18.72600705 1.26527069z" p-id="2509"></path><path d="M346.03865637 637.18588562a78.82636652 78.82636652 0 0 0 78.32025825-79.29029883c0-43.69401562-35.005823-79.29029883-78.32025825-79.29029882a78.82636652 78.82636652 0 0 0-78.36243338 79.29029882c0 43.69401562 35.005823 79.29029883 78.36243338 79.29029883z m0-51.7495729a27.07679361 27.07679361 0 0 1-26.5706845-27.54072593c0-15.30977536 11.97789643-27.54072593 26.5706845-27.54072592 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072592a27.07679361 27.07679361 0 0 1-26.57068533 27.54072593zM475.7289063 807.11174353a78.82636652 78.82636652 0 0 0 78.3624334-79.29029882c0-43.69401562-34.96364785-79.29029883-78.32025825-79.29029883a78.82636652 78.82636652 0 0 0-78.32025742 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029882z m0-51.74957208a27.07679361 27.07679361 0 0 1-26.57068532-27.54072674c0-15.30977536 12.06224753-27.54072593 26.57068532-27.54072593 14.59278892 0 26.57068533 12.23095057 26.57068453 27.54072593a27.07679361 27.07679361 0 0 1-26.57068453 27.54072674zM601.24376214 377.21492718a78.82636652 78.82636652 0 0 0 78.32025742-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025742-79.29029882a78.82636652 78.82636652 0 0 0-78.32025823 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025824 79.29029883z m1e-8-51.74957208a27.07679361 27.07679361 0 0 1-26.57068534-27.54072675c0-15.30977536 11.97789643-27.54072593 26.57068534-27.54072591 14.55061295 0 26.57068533 12.23095057 26.57068451 27.54072592a27.07679361 27.07679361 0 0 1-26.57068451 27.54072674zM378.80916809 433.85687983a78.82636652 78.82636652 0 0 0 78.32025824-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025824-79.29029802a78.82636652 78.82636652 0 0 0-78.32025742 79.29029802c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029883z m0-51.74957209a27.07679361 27.07679361 0 0 1-26.57068451-27.54072674c0-15.30977536 11.97789643-27.54072593 26.57068451-27.54072593 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072593a27.07679361 27.07679361 0 0 1-26.57068533 27.54072674z" p-id="2510"></path></svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
1
src/assets/icons/svg/company.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1675914273096" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2417" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M1001.7 969.6H890.4V399.4c0-27.7-17.4-52.8-43.3-62.5L580 236.7c-14.9-5.6-31.1-5.5-45.7-0.4V76.6c0-21.9-10.7-42.4-28.7-54.9s-41-15.3-61.5-7.6L176.9 114.3c-25.9 9.7-43.3 34.9-43.3 62.5v792.8H22.3C10 969.6 0 979.6 0 991.9s10 22.3 22.3 22.3H1001.8c12.3 0 22.3-10 22.3-22.3s-10.1-22.3-22.4-22.3zM178.1 176.8c0-9.2 5.8-17.6 14.4-20.8L459.7 55.8c7-2.6 14.4-1.7 20.5 2.5s9.6 10.9 9.6 18.3v893H178.1V176.8z m356.2 792.8V299.3c0-7.4 3.5-14.1 9.6-18.3 6.1-4.2 13.6-5.2 20.5-2.5l267.1 100.2c8.6 3.2 14.4 11.6 14.4 20.8v570.2H534.3z" p-id="2418"></path><path d="M391.8 346.3H258.2c-12.3 0-22.3 10-22.3 22.3s10 22.3 22.3 22.3h133.6c12.3 0 22.3-10 22.3-22.3s-10-22.3-22.3-22.3zM748 479.9H614.4c-12.3 0-22.3 10-22.3 22.3s10 22.3 22.3 22.3H748c12.3 0 22.3-10 22.3-22.3s-10-22.3-22.3-22.3zM748 613.4H614.4c-12.3 0-22.3 10-22.3 22.3s10 22.3 22.3 22.3H748c12.3 0 22.3-10 22.3-22.3s-10-22.3-22.3-22.3zM391.8 613.4H258.2c-12.3 0-22.3 10-22.3 22.3s10 22.3 22.3 22.3h133.6c12.3 0 22.3-10 22.3-22.3s-10-22.3-22.3-22.3z" p-id="2419"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
1
src/assets/icons/svg/component.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1575804206892" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3145" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M826.56 470.016c-32.896 0-64.384 12.288-89.984 35.52l0-104.96c0-62.208-50.496-112.832-112.64-113.088L623.936 287.04 519.552 287.104C541.824 262.72 554.56 230.72 554.56 197.12c0-73.536-59.904-133.44-133.504-133.44-73.472 0-133.376 59.904-133.376 133.44 0 32.896 12.224 64.256 35.52 89.984L175.232 287.104l0 0.576C113.728 288.704 64 338.88 64 400.576l0.32 0 0.32 116.48C60.864 544.896 70.592 577.728 100.8 588.48c12.736 4.608 37.632 7.488 60.864-25.28 12.992-18.368 34.24-29.248 56.64-29.248 38.336 0 69.504 31.104 69.504 69.312 0 38.4-31.168 69.504-69.504 69.504-22.656 0-44.032-11.264-57.344-30.4C138.688 610.112 112.576 615.36 102.464 619.136c-29.824 10.752-39.104 43.776-38.144 67.392l0 160.384L64 846.912C64 909.248 114.752 960 177.216 960l446.272 0c62.4 0 113.152-50.752 113.152-113.152l0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.536 0 133.44-59.904 133.44-133.504C960 529.92 900.096 470.016 826.56 470.016zM826.56 672.896c-22.72 0-44.032-11.264-57.344-30.4-22.272-32.384-48.448-27.136-58.56-23.36-29.824 10.752-39.04 43.776-38.08 67.392l0 160.384c0 27.136-22.016 49.152-49.152 49.152L177.216 896.064C150.08 896 128 873.984 128 846.848l0.32 0 0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.6 0 133.504-59.904 133.504-133.504 0-73.472-59.904-133.376-133.504-133.376-32.896 0-64.32 12.288-89.984 35.52l0-104.96L128 400.512c0-27.072 22.08-49.152 49.216-49.152L177.216 351.04 334.656 350.72c3.776 0.512 7.616 0.832 11.52 0.832 24.896 0 50.752-10.816 60.032-37.056 4.544-12.736 7.424-37.568-25.344-60.736C362.624 240.768 351.68 219.52 351.68 197.12c0-38.272 31.104-69.44 69.376-69.44 38.336 0 69.504 31.168 69.504 69.44 0 22.72-11.264 44.032-30.528 57.472C427.968 276.736 433.088 302.784 436.8 313.024c10.752 29.888 43.072 39.232 67.392 38.08l119.232 0 0 0.384c27.136 0 49.152 22.08 49.152 49.152l0.256 116.48c-3.776 27.84 6.016 60.736 36.224 71.488 12.736 4.608 37.632 7.488 60.8-25.28 13.056-18.368 34.24-29.248 56.704-29.248C864.832 534.016 896 565.12 896 603.392 896 641.728 864.832 672.896 826.56 672.896z" p-id="3146"></path></svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
1
src/assets/icons/svg/dashboard.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg width="128" height="100" xmlns="http://www.w3.org/2000/svg"><path d="M27.429 63.638c0-2.508-.893-4.65-2.679-6.424-1.786-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.465 2.662-1.785 1.774-2.678 3.916-2.678 6.424 0 2.508.893 4.65 2.678 6.424 1.786 1.775 3.94 2.662 6.465 2.662 2.524 0 4.678-.887 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm13.714-31.801c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM71.714 65.98l7.215-27.116c.285-1.23.107-2.378-.536-3.443-.643-1.064-1.56-1.762-2.75-2.094-1.19-.33-2.333-.177-3.429.462-1.095.639-1.81 1.573-2.143 2.804l-7.214 27.116c-2.857.237-5.405 1.266-7.643 3.088-2.238 1.822-3.738 4.152-4.5 6.992-.952 3.644-.476 7.098 1.429 10.364 1.905 3.265 4.69 5.37 8.357 6.317 3.667.947 7.143.474 10.429-1.42 3.285-1.892 5.404-4.66 6.357-8.305.762-2.84.619-5.607-.429-8.305-1.047-2.697-2.762-4.85-5.143-6.46zm47.143-2.342c0-2.508-.893-4.65-2.678-6.424-1.786-1.775-3.94-2.662-6.465-2.662-2.524 0-4.678.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.786 1.775 3.94 2.662 6.464 2.662 2.524 0 4.679-.887 6.465-2.662 1.785-1.775 2.678-3.916 2.678-6.424zm-45.714-45.43c0-2.509-.893-4.65-2.679-6.425C68.68 10.01 66.524 9.122 64 9.122c-2.524 0-4.679.887-6.464 2.661-1.786 1.775-2.679 3.916-2.679 6.425 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zm32 13.629c0-2.508-.893-4.65-2.679-6.424-1.785-1.775-3.94-2.662-6.464-2.662-2.524 0-4.679.887-6.464 2.662-1.786 1.774-2.679 3.916-2.679 6.424 0 2.508.893 4.65 2.679 6.424 1.785 1.774 3.94 2.662 6.464 2.662 2.524 0 4.679-.888 6.464-2.662 1.786-1.775 2.679-3.916 2.679-6.424zM128 63.638c0 12.351-3.357 23.78-10.071 34.286-.905 1.372-2.19 2.058-3.858 2.058H13.93c-1.667 0-2.953-.686-3.858-2.058C3.357 87.465 0 76.037 0 63.638c0-8.613 1.69-16.847 5.071-24.703C8.452 31.08 13 24.312 18.714 18.634c5.715-5.68 12.524-10.199 20.429-13.559C47.048 1.715 55.333.035 64 .035c8.667 0 16.952 1.68 24.857 5.04 7.905 3.36 14.714 7.88 20.429 13.559 5.714 5.678 10.262 12.446 13.643 20.301 3.38 7.856 5.071 16.09 5.071 24.703z"/></svg>
|
||||
|
After Width: | Height: | Size: 2.3 KiB |
1
src/assets/icons/svg/date-range.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1579774833889" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1376" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M887.466667 192.853333h-100.693334V119.466667c0-10.24-6.826667-17.066667-17.066666-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H303.786667V119.466667c0-10.24-6.826667-17.066667-17.066667-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H168.96c-46.08 0-85.333333 37.546667-85.333333 85.333334V836.266667c0 46.08 37.546667 85.333333 85.333333 85.333333H887.466667c46.08 0 85.333333-37.546667 85.333333-85.333333V278.186667c0-47.786667-37.546667-85.333333-85.333333-85.333334z m-718.506667 34.133334h100.693333v66.56c0 10.24 6.826667 17.066667 17.066667 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56h450.56v66.56c0 10.24 6.826667 17.066667 17.066666 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56H887.466667c27.306667 0 51.2 22.186667 51.2 51.2v88.746666H117.76v-88.746666c0-29.013333 22.186667-51.2 51.2-51.2zM887.466667 887.466667H168.96c-27.306667 0-51.2-22.186667-51.2-51.2V401.066667H938.666667V836.266667c0 27.306667-22.186667 51.2-51.2 51.2z" p-id="1377"></path><path d="M858.453333 493.226667H327.68c-10.24 0-17.066667 6.826667-17.066667 17.066666v114.346667h-116.053333c-10.24 0-17.066667 6.826667-17.066667 17.066667v133.12c0 10.24 6.826667 17.066667 17.066667 17.066666H460.8c10.24 0 17.066667-6.826667 17.066667-17.066666v-114.346667h380.586666c10.24 0 17.066667-6.826667 17.066667-17.066667v-133.12c0-10.24-6.826667-17.066667-17.066667-17.066666z m-413.013333 34.133333v97.28h-98.986667v-97.28h98.986667z m-230.4 131.413333h98.986667v98.986667h-98.986667v-98.986667z m131.413333 97.28v-97.28h98.986667v97.28h-98.986667z m133.12-228.693333h97.28v98.986667h-97.28v-98.986667z m131.413334 0h98.986666v98.986667h-98.986666v-98.986667z m230.4 97.28h-98.986667v-98.986667h98.986667v98.986667z" p-id="1378"></path></svg>
|
||||
|
After Width: | Height: | Size: 2.1 KiB |
1
src/assets/icons/svg/date.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1577186573535" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1068" xmlns:xlink="http://www.w3.org/1999/xlink" width="81" height="81"><defs><style type="text/css"></style></defs><path d="M479.85714249 608.42857168h64.28571502c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285751s-12.85714249-32.14285751-32.14285664-32.14285664h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285662s12.85714249 32.14285751 32.14285664 32.14285753z m-2e-8 122.14285665h64.28571504c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285665s-12.85714249-32.14285751-32.14285664-32.14285751h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285751s12.85714249 32.14285751 32.14285664 32.14285664z m353.57142921-559.28571416h-128.57142921v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285664-32.14285753s-32.14285751 12.85714249-32.14285751 32.14285753v32.14285664h-257.14285665v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285752-32.14285753s-32.14285751 12.85714249-32.14285664 32.14285753v32.14285664h-128.57142919c-70.71428585 0-128.57142832 57.85714249-128.57142832 122.14285751v501.42857081c0 70.71428585 57.85714249 128.57142832 128.57142832 122.14285751h642.85714335c70.71428585 0 128.57142832-57.85714249 128.57142833-122.14285751v-501.42857081c0-70.71428585-57.85714249-122.14285753-128.57142833-122.14285751z m64.28571415 623.57142832c0 32.14285751-32.14285751 64.28571415-64.28571416 64.28571504h-642.85714335c-32.14285751 0-64.28571415-25.71428583-64.28571417-64.28571504v-372.85714249h771.42857168v372.85714249z m0-437.14285664h-771.42857168v-64.28571417c0-32.14285751 32.14285751-64.28571415 64.28571417-64.28571415h128.57142919v32.14285664c0 19.28571417 12.85714249 32.14285751 32.14285664 32.14285751s32.14285751-12.85714249 32.14285753-32.14285751v-32.14285664h257.14285665v32.14285664c0 19.28571417 12.85714249 32.14285751 32.1428575 32.14285751s32.14285751-12.85714249 32.14285664-32.14285751v-32.14285664h128.57142921c32.14285751 0 64.28571415 25.71428583 64.28571415 64.28571415v64.28571417z m-610.71428583 372.85714247h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285664s-12.85714249-32.14285751-32.14285753-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285751s12.85714249 32.14285751 32.14285751 32.14285665z m385.71428583-122.14285664h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285751s-12.85714249-32.14285751-32.14285751-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285664s12.85714249 32.14285751 32.14285753 32.14285751z m-385.71428583 0h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285751s-12.85714249-32.14285751-32.14285753-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285664s12.85714249 32.14285751 32.14285751 32.14285751z m385.71428583 122.14285665h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285665s-12.85714249-32.14285751-32.14285751-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285751s12.85714249 32.14285751 32.14285753 32.14285665z" p-id="1069"></path></svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
1
src/assets/icons/svg/dict.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1566035680909" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3601" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M1002.0848 744.672l-33.568 10.368c0.96 7.264 2.144 14.304 2.144 21.76 0 7.328-1.184 14.432-2.368 21.568l33.792 10.56c7.936 2.24 14.496 7.616 18.336 14.752 3.84 7.328 4.672 15.808 1.952 23.552-5.376 16-23.168 24.672-39.936 19.68l-34.176-10.624c-7.136 12.8-15.776 24.672-26.208 35.2l20.8 27.488a28.96 28.96 0 0 1 5.824 22.816 29.696 29.696 0 0 1-12.704 19.616 32.544 32.544 0 0 1-44.416-6.752l-20.8-27.552c-13.696 6.56-28.192 11.2-43.008 13.888v33.632c0 16.736-14.112 30.432-31.648 30.432-17.6 0-31.872-13.696-31.872-30.432v-33.632a167.616 167.616 0 0 1-42.88-13.888l-20.928 27.552c-10.72 13.76-30.08 16.64-44.288 6.752a29.632 29.632 0 0 1-12.704-19.616 29.28 29.28 0 0 1 5.696-22.816l20.896-27.808a166.72 166.72 0 0 1-27.008-34.688l-33.376 10.432c-16.8 5.184-34.56-3.552-39.936-19.616a29.824 29.824 0 0 1 20.224-38.24l33.472-10.432c-0.8-7.264-2.016-14.304-2.016-21.824 0-7.36 1.184-14.496 2.304-21.632l-33.792-10.368c-16.672-5.376-25.632-22.496-20.224-38.432 5.376-16 23.136-24.672 39.936-19.68l34.016 10.752c7.328-12.672 15.84-24.8 26.336-35.328l-20.8-27.552a29.44 29.44 0 0 1 6.944-42.432 32.704 32.704 0 0 1 44.384 6.752l20.832 27.616c13.696-6.432 28.224-11.2 43.104-13.952v-33.568c0-16.736 14.048-30.432 31.648-30.432 17.536 0 31.808 13.568 31.808 30.432v33.504c15.072 2.688 29.344 7.808 42.848 14.016l20.992-27.616a32.48 32.48 0 0 1 44.224-6.752 29.568 29.568 0 0 1 7.136 42.432l-21.024 27.808c10.432 10.432 19.872 21.888 27.04 34.752l33.376-10.432c16.768-5.12 34.56 3.68 39.936 19.68 5.536 15.936-3.712 33.056-20.32 38.304z m-206.016-74.432c-61.344 0-111.136 47.808-111.136 106.56 0 58.88 49.792 106.496 111.136 106.496 61.312 0 111.104-47.616 111.104-106.496 0-58.752-49.792-106.56-111.104-106.56z" p-id="3602"></path><path d="M802.7888 57.152h-76.448c0-22.08-21.024-38.24-42.848-38.24H39.3968a39.68 39.68 0 0 0-39.36 40.032v795.616s41.888 120.192 110.752 120.192H673.2848a227.488 227.488 0 0 1-107.04-97.44H117.6368s-40.608-13.696-40.608-41.248l470.304-0.256 1.664 3.36a227.68 227.68 0 0 1-12.64-73.632c0-60.576 24-118.624 66.88-161.44a228.352 228.352 0 0 1 123.552-63.392l-3.2 0.288 2.144-424.672h38.208l0.576 421.024c27.04 0 52.672 4.8 76.64 13.344V101.536c0.032 0-6.304-44.384-38.368-44.384zM149.7648 514.336H72.3888v-77.408H149.7648v77.408z m0-144.32H72.3888v-77.44H149.7648v77.44z m0-137.248H72.3888v-77.44H149.7648v77.44z m501.856 281.568H206.0848v-77.408h445.536v77.408z m0-144.32H206.0848v-77.44h445.536v77.44z m0-137.248H206.0848v-77.44h445.536v77.44z" p-id="3603"></path></svg>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |