init 初始化 react + antd 版本前端

This commit is contained in:
疯狂的狮子Li 2026-06-01 12:01:08 +08:00
commit ea09d081c5
324 changed files with 39871 additions and 0 deletions

9
.editorconfig Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View File

@ -0,0 +1,3 @@
<component name="ProjectDictionaryState">
<dictionary name="LionLi" />
</component>

6
.idea/encodings.xml generated Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

150
src/api/ai/agent/index.ts Normal file
View 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
View 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
View File

@ -0,0 +1,2 @@
export * from './agent';
export * from './agent/types';

View 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'
});
}

View 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;
}

View 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'
});
}

View 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
View 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
View 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
View 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
View File

@ -0,0 +1,5 @@
export interface CacheVO {
commandStats: Array<{ name: string; value: string | number }>;
dbSize: number;
info: Record<string, string>;
}

View 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'
});
}

View 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;
}

View 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'
});
}

View 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;
}

View 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'
});
}

View 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
View 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);
}

View 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 }
});
}

View 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;
}

View 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();
}

View 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;
}

View 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'
});
}

View 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;
}

View 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'
});
}

View 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;
}

View 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'
});
}

View 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;
}

View 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'
});
}

View 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;
}

View 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'
});
}

View 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[];
}

View 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'
});
}

View 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;
}

View 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'
});
}

View 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;
}

View 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 }
});
}

View 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;
}

View 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();
}

View 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;
}

View 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'
});
}

View 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>;
}

View 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'
});
}

View File

@ -0,0 +1,7 @@
export interface SocialAuthVO {
id: string;
source?: string;
avatar?: string;
userName?: string;
createTime?: string;
}

View 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'
});
}

View 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
View 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
View 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
View 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[];
};

View 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
});
}

View 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[];
}

View 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'
});
}

View 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;
}

View 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'
});
}

View 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;
}

View 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'
});
}

View 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;
}

View 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'
});
}

View 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;
}

View 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
});
}

View 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>;
}

View 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
};

View 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
View 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>;
}

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

Some files were not shown because too many files have changed in this diff Show More