feat: add Login and fix res error
This commit is contained in:
parent
77485b34c0
commit
029710f31c
@ -18,7 +18,7 @@
|
||||
"@ant-design/icons": "^5.5.1",
|
||||
"@icon-park/react": "^1.4.2",
|
||||
"@kevisual/codemirror": "^0.0.2",
|
||||
"@kevisual/query": "^0.0.2",
|
||||
"@kevisual/query": "^0.0.6",
|
||||
"@kevisual/ui": "^0.0.2",
|
||||
"@uiw/react-textarea-code-editor": "^3.0.2",
|
||||
"@xyflow/react": "^12.3.1",
|
||||
@ -46,8 +46,8 @@
|
||||
"@tailwindcss/typography": "^0.5.15",
|
||||
"@types/d3": "^7.4.3",
|
||||
"@types/lodash-es": "^4.17.12",
|
||||
"@types/node": "^22.7.2",
|
||||
"@types/react": "^18.3.9",
|
||||
"@types/node": "^22.7.4",
|
||||
"@types/react": "^18.3.10",
|
||||
"@types/react-dom": "^18.3.0",
|
||||
"@vitejs/plugin-react": "^4.3.1",
|
||||
"autoprefixer": "^10.4.20",
|
||||
|
82
pnpm-lock.yaml
generated
82
pnpm-lock.yaml
generated
@ -13,7 +13,7 @@ importers:
|
||||
version: 0.0.1-alpha.9(@emotion/css@11.13.0)(crypto-js@4.2.0)(eventemitter3@5.0.1)
|
||||
'@abearxiong/flows':
|
||||
specifier: 0.0.1-alpha.9
|
||||
version: 0.0.1-alpha.9(@xyflow/react@12.3.1(@types/react@18.3.9)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zustand@4.5.5(@types/react@18.3.9)(immer@10.1.1)(react@18.3.1))
|
||||
version: 0.0.1-alpha.9(@xyflow/react@12.3.1(@types/react@18.3.10)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zustand@4.5.5(@types/react@18.3.10)(immer@10.1.1)(react@18.3.1))
|
||||
'@abearxiong/ui':
|
||||
specifier: 0.0.1-alpha.0
|
||||
version: 0.0.1-alpha.0
|
||||
@ -27,8 +27,8 @@ importers:
|
||||
specifier: ^0.0.2
|
||||
version: 0.0.2
|
||||
'@kevisual/query':
|
||||
specifier: ^0.0.2
|
||||
version: 0.0.2
|
||||
specifier: ^0.0.6
|
||||
version: 0.0.6
|
||||
'@kevisual/ui':
|
||||
specifier: ^0.0.2
|
||||
version: 0.0.2
|
||||
@ -37,7 +37,7 @@ importers:
|
||||
version: 3.0.2(@babel/runtime@7.25.6)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@xyflow/react':
|
||||
specifier: ^12.3.1
|
||||
version: 12.3.1(@types/react@18.3.9)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
version: 12.3.1(@types/react@18.3.10)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
antd:
|
||||
specifier: ^5.21.1
|
||||
version: 5.21.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
@ -85,10 +85,10 @@ importers:
|
||||
version: 10.0.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
vite-plugin-tsconfig-paths:
|
||||
specifier: ^1.4.1
|
||||
version: 1.4.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.2))
|
||||
version: 1.4.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.4))
|
||||
zustand:
|
||||
specifier: ^4.5.5
|
||||
version: 4.5.5(@types/react@18.3.9)(immer@10.1.1)(react@18.3.1)
|
||||
version: 4.5.5(@types/react@18.3.10)(immer@10.1.1)(react@18.3.1)
|
||||
devDependencies:
|
||||
'@eslint/js':
|
||||
specifier: ^9.11.1
|
||||
@ -96,9 +96,6 @@ importers:
|
||||
'@tailwindcss/aspect-ratio':
|
||||
specifier: ^0.4.2
|
||||
version: 0.4.2(tailwindcss@3.4.13)
|
||||
'@tailwindcss/line-clamp':
|
||||
specifier: ^0.4.4
|
||||
version: 0.4.4(tailwindcss@3.4.13)
|
||||
'@tailwindcss/typography':
|
||||
specifier: ^0.5.15
|
||||
version: 0.5.15(tailwindcss@3.4.13)
|
||||
@ -109,17 +106,17 @@ importers:
|
||||
specifier: ^4.17.12
|
||||
version: 4.17.12
|
||||
'@types/node':
|
||||
specifier: ^22.7.2
|
||||
version: 22.7.2
|
||||
specifier: ^22.7.4
|
||||
version: 22.7.4
|
||||
'@types/react':
|
||||
specifier: ^18.3.9
|
||||
version: 18.3.9
|
||||
specifier: ^18.3.10
|
||||
version: 18.3.10
|
||||
'@types/react-dom':
|
||||
specifier: ^18.3.0
|
||||
version: 18.3.0
|
||||
'@vitejs/plugin-react':
|
||||
specifier: ^4.3.1
|
||||
version: 4.3.1(vite@5.4.8(@types/node@22.7.2))
|
||||
version: 4.3.1(vite@5.4.8(@types/node@22.7.4))
|
||||
autoprefixer:
|
||||
specifier: ^10.4.20
|
||||
version: 10.4.20(postcss@8.4.47)
|
||||
@ -158,7 +155,7 @@ importers:
|
||||
version: 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.6.2)
|
||||
vite:
|
||||
specifier: ^5.4.8
|
||||
version: 5.4.8(@types/node@22.7.2)
|
||||
version: 5.4.8(@types/node@22.7.4)
|
||||
|
||||
packages:
|
||||
|
||||
@ -574,8 +571,8 @@ packages:
|
||||
'@kevisual/codemirror@0.0.2':
|
||||
resolution: {integrity: sha512-z+hINypSarYBj+13en8+Hj/CqTAMVIYN3Rs0ICHRzbikvrDnsnT4ohpnFgcbFPQ/zX3E1mS9ANbx4jGSJEHaPQ==}
|
||||
|
||||
'@kevisual/query@0.0.2':
|
||||
resolution: {integrity: sha512-xE2KhqlF2WDJ8Mt/AKKYnKeBPGxlbNhh7uXSxhO1/Rz95SVfJm0QF6pCEiWi/OHQ93gxIt5qUNEGp9avXHsWxw==}
|
||||
'@kevisual/query@0.0.6':
|
||||
resolution: {integrity: sha512-J+poZwIx4r956GDN5zI8zM0YyyxJqARZVVOFYplRThaQLqpsbRNYJoYiT5DekvBftxtFjs/OlI3RzcHDOv3Fjw==}
|
||||
|
||||
'@kevisual/ui@0.0.2':
|
||||
resolution: {integrity: sha512-MDZDQTrYToLyj3WhiVJQLJ0PUHiN4D0Z5yJIyGzzPewPGpP2xwNgKO1BFX37J95cGZckzCdZwTKP0XKAOq0QtA==}
|
||||
@ -749,11 +746,6 @@ packages:
|
||||
peerDependencies:
|
||||
tailwindcss: '>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1'
|
||||
|
||||
'@tailwindcss/line-clamp@0.4.4':
|
||||
resolution: {integrity: sha512-5U6SY5z8N42VtrCrKlsTAA35gy2VSyYtHWCsg1H87NU1SXnEfekTVlrga9fzUDrrHcGi2Lb5KenUWb4lRQT5/g==}
|
||||
peerDependencies:
|
||||
tailwindcss: '>=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1'
|
||||
|
||||
'@tailwindcss/typography@0.5.15':
|
||||
resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==}
|
||||
peerDependencies:
|
||||
@ -891,8 +883,8 @@ packages:
|
||||
'@types/mdast@4.0.4':
|
||||
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
|
||||
|
||||
'@types/node@22.7.2':
|
||||
resolution: {integrity: sha512-866lXSrpGpgyHBZUa2m9YNWqHDjjM0aBTJlNtYaGEw4rqY/dcD7deRVTbBBAJelfA7oaGDbNftXF/TL/A6RgoA==}
|
||||
'@types/node@22.7.4':
|
||||
resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==}
|
||||
|
||||
'@types/parse-json@4.0.2':
|
||||
resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==}
|
||||
@ -906,8 +898,8 @@ packages:
|
||||
'@types/react-dom@18.3.0':
|
||||
resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==}
|
||||
|
||||
'@types/react@18.3.9':
|
||||
resolution: {integrity: sha512-+BpAVyTpJkNWWSSnaLBk6ePpHLOGJKnEQNbINNovPWzvEUyAe3e+/d494QdEh71RekM/qV7lw6jzf1HGrJyAtQ==}
|
||||
'@types/react@18.3.10':
|
||||
resolution: {integrity: sha512-02sAAlBnP39JgXwkAq3PeU9DVaaGpZyF3MGcC0MKgQVkZor5IiiDAipVaxQHtDJAmO4GIy/rVBy/LzVj76Cyqg==}
|
||||
|
||||
'@types/unist@2.0.11':
|
||||
resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
|
||||
@ -2621,17 +2613,17 @@ snapshots:
|
||||
eventemitter3: 5.0.1
|
||||
nanoid: 5.0.7
|
||||
|
||||
'@abearxiong/flows@0.0.1-alpha.9(@xyflow/react@12.3.1(@types/react@18.3.9)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zustand@4.5.5(@types/react@18.3.9)(immer@10.1.1)(react@18.3.1))':
|
||||
'@abearxiong/flows@0.0.1-alpha.9(@xyflow/react@12.3.1(@types/react@18.3.10)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(zustand@4.5.5(@types/react@18.3.10)(immer@10.1.1)(react@18.3.1))':
|
||||
dependencies:
|
||||
'@ant-design/icons': 5.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@icon-park/react': 1.4.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@xyflow/react': 12.3.1(@types/react@18.3.9)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
'@xyflow/react': 12.3.1(@types/react@18.3.10)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
clsx: 2.1.1
|
||||
eventemitter3: 5.0.1
|
||||
immer: 10.1.1
|
||||
react: 18.3.1
|
||||
react-tooltip: 5.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
||||
zustand: 4.5.5(@types/react@18.3.9)(immer@10.1.1)(react@18.3.1)
|
||||
zustand: 4.5.5(@types/react@18.3.10)(immer@10.1.1)(react@18.3.1)
|
||||
transitivePeerDependencies:
|
||||
- react-dom
|
||||
|
||||
@ -3037,7 +3029,7 @@ snapshots:
|
||||
|
||||
'@kevisual/codemirror@0.0.2': {}
|
||||
|
||||
'@kevisual/query@0.0.2': {}
|
||||
'@kevisual/query@0.0.6': {}
|
||||
|
||||
'@kevisual/ui@0.0.2':
|
||||
dependencies:
|
||||
@ -3183,10 +3175,6 @@ snapshots:
|
||||
dependencies:
|
||||
tailwindcss: 3.4.13
|
||||
|
||||
'@tailwindcss/line-clamp@0.4.4(tailwindcss@3.4.13)':
|
||||
dependencies:
|
||||
tailwindcss: 3.4.13
|
||||
|
||||
'@tailwindcss/typography@0.5.15(tailwindcss@3.4.13)':
|
||||
dependencies:
|
||||
lodash.castarray: 4.4.0
|
||||
@ -3359,7 +3347,7 @@ snapshots:
|
||||
dependencies:
|
||||
'@types/unist': 3.0.3
|
||||
|
||||
'@types/node@22.7.2':
|
||||
'@types/node@22.7.4':
|
||||
dependencies:
|
||||
undici-types: 6.19.8
|
||||
|
||||
@ -3371,9 +3359,9 @@ snapshots:
|
||||
|
||||
'@types/react-dom@18.3.0':
|
||||
dependencies:
|
||||
'@types/react': 18.3.9
|
||||
'@types/react': 18.3.10
|
||||
|
||||
'@types/react@18.3.9':
|
||||
'@types/react@18.3.10':
|
||||
dependencies:
|
||||
'@types/prop-types': 15.7.13
|
||||
csstype: 3.1.3
|
||||
@ -3473,24 +3461,24 @@ snapshots:
|
||||
|
||||
'@ungap/structured-clone@1.2.0': {}
|
||||
|
||||
'@vitejs/plugin-react@4.3.1(vite@5.4.8(@types/node@22.7.2))':
|
||||
'@vitejs/plugin-react@4.3.1(vite@5.4.8(@types/node@22.7.4))':
|
||||
dependencies:
|
||||
'@babel/core': 7.25.2
|
||||
'@babel/plugin-transform-react-jsx-self': 7.24.7(@babel/core@7.25.2)
|
||||
'@babel/plugin-transform-react-jsx-source': 7.24.7(@babel/core@7.25.2)
|
||||
'@types/babel__core': 7.20.5
|
||||
react-refresh: 0.14.2
|
||||
vite: 5.4.8(@types/node@22.7.2)
|
||||
vite: 5.4.8(@types/node@22.7.4)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@xyflow/react@12.3.1(@types/react@18.3.9)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||
'@xyflow/react@12.3.1(@types/react@18.3.10)(immer@10.1.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
|
||||
dependencies:
|
||||
'@xyflow/system': 0.0.43
|
||||
classcat: 5.0.5
|
||||
react: 18.3.1
|
||||
react-dom: 18.3.1(react@18.3.1)
|
||||
zustand: 4.5.5(@types/react@18.3.9)(immer@10.1.1)(react@18.3.1)
|
||||
zustand: 4.5.5(@types/react@18.3.10)(immer@10.1.1)(react@18.3.1)
|
||||
transitivePeerDependencies:
|
||||
- '@types/react'
|
||||
- immer
|
||||
@ -5275,20 +5263,20 @@ snapshots:
|
||||
'@types/unist': 3.0.3
|
||||
vfile-message: 4.0.2
|
||||
|
||||
vite-plugin-tsconfig-paths@1.4.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.2)):
|
||||
vite-plugin-tsconfig-paths@1.4.1(typescript@5.6.2)(vite@5.4.8(@types/node@22.7.4)):
|
||||
dependencies:
|
||||
typescript-paths: 1.5.1(typescript@5.6.2)
|
||||
vite: 5.4.8(@types/node@22.7.2)
|
||||
vite: 5.4.8(@types/node@22.7.4)
|
||||
transitivePeerDependencies:
|
||||
- typescript
|
||||
|
||||
vite@5.4.8(@types/node@22.7.2):
|
||||
vite@5.4.8(@types/node@22.7.4):
|
||||
dependencies:
|
||||
esbuild: 0.21.5
|
||||
postcss: 8.4.47
|
||||
rollup: 4.22.0
|
||||
optionalDependencies:
|
||||
'@types/node': 22.7.2
|
||||
'@types/node': 22.7.4
|
||||
fsevents: 2.3.3
|
||||
|
||||
web-namespaces@2.0.1: {}
|
||||
@ -5319,11 +5307,11 @@ snapshots:
|
||||
|
||||
yocto-queue@0.1.0: {}
|
||||
|
||||
zustand@4.5.5(@types/react@18.3.9)(immer@10.1.1)(react@18.3.1):
|
||||
zustand@4.5.5(@types/react@18.3.10)(immer@10.1.1)(react@18.3.1):
|
||||
dependencies:
|
||||
use-sync-external-store: 1.2.2(react@18.3.1)
|
||||
optionalDependencies:
|
||||
'@types/react': 18.3.9
|
||||
'@types/react': 18.3.10
|
||||
immer: 10.1.1
|
||||
react: 18.3.1
|
||||
|
||||
|
@ -1,9 +1,28 @@
|
||||
import { Query } from '@kevisual/query';
|
||||
export const query = new Query({});
|
||||
export const request = query.post;
|
||||
export const ws = new WebSocket('ws://localhost:6010/api/router');
|
||||
import { Query, QueryClient } from '@kevisual/query';
|
||||
import { QueryWs } from '@kevisual/query/ws';
|
||||
import { modal } from './redirect-to-login';
|
||||
import { create } from 'zustand';
|
||||
|
||||
export const query = new Query();
|
||||
query.beforeRequest = async (config) => {
|
||||
if (config.headers) {
|
||||
const token = localStorage.getItem('token');
|
||||
if (token) {
|
||||
config.headers['Authorization'] = 'Bearer ' + token;
|
||||
}
|
||||
}
|
||||
return config;
|
||||
};
|
||||
query.afterResponse = async (res) => {
|
||||
if (res.code === 401 || res.code === 403) {
|
||||
modal.setOpen(true);
|
||||
}
|
||||
return res;
|
||||
};
|
||||
export const request = query.post;
|
||||
export const queryWs = new QueryWs({
|
||||
url: '/api/router',
|
||||
});
|
||||
export const ws = queryWs.ws;
|
||||
type Store = {
|
||||
connected: boolean;
|
||||
setConnected: (connected: boolean) => void;
|
||||
@ -18,11 +37,6 @@ ws.onopen = () => {
|
||||
console.log('Connected to WebSocket server');
|
||||
useStore.getState().setConnected(true);
|
||||
};
|
||||
// 接收服务器的消息
|
||||
ws.onmessage = (event) => {
|
||||
// console.log('Received message:', event.data);
|
||||
// const message = JSON.parse(event.data);
|
||||
};
|
||||
|
||||
// 处理 WebSocket 关闭
|
||||
ws.onclose = () => {
|
||||
|
26
src/modules/redirect-to-login.ts
Normal file
26
src/modules/redirect-to-login.ts
Normal file
@ -0,0 +1,26 @@
|
||||
import { DialogModal } from '@kevisual/ui';
|
||||
import '@kevisual/ui/dist/index.css';
|
||||
|
||||
const content = document.createElement('div');
|
||||
content.innerHTML = `
|
||||
<div class="bg-white p-8 rounded shadow-md w-full max-w-md text-center">
|
||||
<h2 class="text-2xl font-bold mb-4">Token 无效</h2>
|
||||
<p class="mb-6">您的登录凭证已失效,请重新登录。</p>
|
||||
<a href="/user/login" class="inline-block bg-red-500 text-white py-2 px-4 rounded hover:bg-red-600 transition duration-200">确定</a>
|
||||
</div>
|
||||
`;
|
||||
export const modal = DialogModal.render(content, {
|
||||
id: 'redirect-to-login',
|
||||
contentStyle: {
|
||||
width: 'unset',
|
||||
},
|
||||
dialogTitleStyle: {
|
||||
display: 'none',
|
||||
padding: '0',
|
||||
},
|
||||
dialogContentStyle: {
|
||||
padding: '0',
|
||||
},
|
||||
mask: true,
|
||||
open: false,
|
||||
});
|
@ -34,7 +34,7 @@ export const useAgentStore = create<AgentStore>((set, get) => {
|
||||
if (res.code === 200) {
|
||||
set({ list: res.data });
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
updateData: async (data) => {
|
||||
@ -49,7 +49,7 @@ export const useAgentStore = create<AgentStore>((set, get) => {
|
||||
set({ showEdit: false, formData: [] });
|
||||
getList();
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
deleteData: async (id) => {
|
||||
@ -63,7 +63,7 @@ export const useAgentStore = create<AgentStore>((set, get) => {
|
||||
getList();
|
||||
message.success('Success');
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
publishData: async (data) => {
|
||||
@ -87,7 +87,7 @@ export const useAgentStore = create<AgentStore>((set, get) => {
|
||||
if (res.code === 200) {
|
||||
message.success('Success');
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -1,6 +1,6 @@
|
||||
import { useShallow } from 'zustand/react/shallow';
|
||||
import { useAiStore } from './store/ai-store';
|
||||
import { CloseOutlined } from '@ant-design/icons';
|
||||
import { CloseOutlined, HistoryOutlined } from '@ant-design/icons';
|
||||
import { Button, Form, Input } from 'antd';
|
||||
import { useEffect } from 'react';
|
||||
import { TextArea } from '../container/components/TextArea';
|
||||
@ -49,6 +49,9 @@ export const AiMoudle = () => {
|
||||
<div className='flex gap-4 bg-slate-400 p-2'>
|
||||
<Button className='position ml-4 !bg-slate-400 !border-black' onClick={() => aiStore.setOpen(false)} icon={<CloseOutlined />}></Button>
|
||||
<h1 className='ml-10'>Ai Moudle</h1>
|
||||
<div>
|
||||
<HistoryOutlined />
|
||||
</div>
|
||||
</div>
|
||||
<div className='flex-grow p-2 overflow-hidden h-full flex flex-col'>
|
||||
<div className='flex flex-col'>
|
||||
@ -58,8 +61,9 @@ export const AiMoudle = () => {
|
||||
return (
|
||||
<div key={index} className=' justify-between px-4 w-full'>
|
||||
<div className='h3 font-bold'>{message?.role}</div>
|
||||
<div className='p-4 text-xs border shadow-sm rounded-sm scrollbar max-h-[200px] w-full overflow-scroll' dangerouslySetInnerHTML={{ __html: html }}>
|
||||
</div>
|
||||
<div
|
||||
className='p-4 text-xs border shadow-sm rounded-sm scrollbar max-h-[200px] w-full overflow-scroll'
|
||||
dangerouslySetInnerHTML={{ __html: html }}></div>
|
||||
</div>
|
||||
);
|
||||
})}
|
||||
|
@ -1,4 +1,4 @@
|
||||
import { Button, Input, message, Modal, Table } from 'antd';
|
||||
import { Button, Input, message, Modal, Select, Table, Tooltip } from 'antd';
|
||||
import { Fragment, useEffect, useMemo, useState } from 'react';
|
||||
import { TextArea } from '../components/TextArea';
|
||||
import { useContainerStore } from '../store';
|
||||
@ -6,9 +6,10 @@ import { useShallow } from 'zustand/react/shallow';
|
||||
import { Form } from 'antd';
|
||||
import copy from 'copy-to-clipboard';
|
||||
import { useNavigate } from 'react-router';
|
||||
import { EditOutlined, SettingOutlined, LinkOutlined, SaveOutlined, DeleteOutlined, LeftOutlined } from '@ant-design/icons';
|
||||
import { EditOutlined, SettingOutlined, LinkOutlined, SaveOutlined, DeleteOutlined, LeftOutlined, MessageOutlined } from '@ant-design/icons';
|
||||
import clsx from 'clsx';
|
||||
import { isObjectNull } from '@/utils/is-null';
|
||||
import { CardBlank } from '@/components/card/CardBlank';
|
||||
const FormModal = () => {
|
||||
const [form] = Form.useForm();
|
||||
const containerStore = useContainerStore(
|
||||
@ -67,6 +68,9 @@ const FormModal = () => {
|
||||
<Form.Item name='description' label='description'>
|
||||
<Input.TextArea rows={4} />
|
||||
</Form.Item>
|
||||
<Form.Item name='tags' label='tags'>
|
||||
<Select mode='tags' />
|
||||
</Form.Item>
|
||||
<Form.Item name='code' label='code'>
|
||||
<TextArea />
|
||||
</Form.Item>
|
||||
@ -128,13 +132,14 @@ export const ContainerList = () => {
|
||||
}}>
|
||||
<div className='px-4 cursor-pointer'>
|
||||
<div
|
||||
className='font-bold'
|
||||
className='font-bold flex items-center'
|
||||
onClick={(e) => {
|
||||
copy(item.code);
|
||||
e.stopPropagation();
|
||||
message.success('copy code success');
|
||||
}}>
|
||||
{item.title || '-'}
|
||||
<div className='font-thin card-key ml-3 text-xs'>{item.tags ? item.tags.join(', ') : ''}</div>
|
||||
</div>
|
||||
<div className='font-light text-xs mt-2'>{item.description ? item.description : '-'}</div>
|
||||
</div>
|
||||
@ -171,9 +176,7 @@ export const ContainerList = () => {
|
||||
</Fragment>
|
||||
);
|
||||
})}
|
||||
{new Array(4).fill(0).map((_, index) => {
|
||||
return <div key={index} className='w-[400px]'></div>;
|
||||
})}
|
||||
<CardBlank className='w-[400px]' />
|
||||
{containerStore.list.length == 0 && (
|
||||
<div className='text-center' key={'no-data'}>
|
||||
No Data
|
||||
@ -184,18 +187,33 @@ export const ContainerList = () => {
|
||||
<div className={clsx('bg-gray-100 border-l border-bg-slate-300 w-[600px] flex-shrink-0', !codeEdit && 'hidden')}>
|
||||
<div className='bg-white p-2'>
|
||||
<div className='mt-2 ml-2 flex gap-2'>
|
||||
<Tooltip title='返回'>
|
||||
<Button
|
||||
onClick={() => {
|
||||
setCodeEdit(false);
|
||||
containerStore.setFormData({});
|
||||
}}
|
||||
icon={<LeftOutlined />}></Button>
|
||||
</Tooltip>
|
||||
<Tooltip title='保存'>
|
||||
<Button
|
||||
onClick={() => {
|
||||
console.log('save', containerStore.formData);
|
||||
containerStore.updateData({ ...containerStore.formData, code });
|
||||
}}
|
||||
icon={<SaveOutlined />}></Button>
|
||||
</Tooltip>
|
||||
<Tooltip title='预览'>
|
||||
<Button
|
||||
onClick={(e) => {
|
||||
// navicate('/container/preview/' + item.id);
|
||||
e.stopPropagation();
|
||||
}}
|
||||
icon={<LinkOutlined />}></Button>
|
||||
</Tooltip>
|
||||
<Tooltip title='ai编程'>
|
||||
<Button onClick={(e) => {}} icon={<MessageOutlined />}></Button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</div>
|
||||
<div className='h-[94%] p-2 rounded-2 shadow-sm'>
|
||||
|
@ -80,7 +80,7 @@ export const Preview = () => {
|
||||
};
|
||||
init([code]);
|
||||
} else {
|
||||
message.error(res.msg || 'Failed to fetch data');
|
||||
message.error(res.message || 'Failed to fetch data');
|
||||
}
|
||||
};
|
||||
const refresh = (data: any) => {
|
||||
@ -131,7 +131,7 @@ export const PreviewWrapper = () => {
|
||||
fetch();
|
||||
}, []);
|
||||
const fetch = async () => {
|
||||
const res = await query.post({
|
||||
const res = await query.post<any, any>({
|
||||
path: 'container',
|
||||
key: 'get',
|
||||
id,
|
||||
@ -149,7 +149,7 @@ export const PreviewWrapper = () => {
|
||||
};
|
||||
init([code]);
|
||||
} else {
|
||||
message.error(res.msg || 'Failed to fetch data');
|
||||
message.error(res.message || 'Failed to fetch data');
|
||||
}
|
||||
};
|
||||
const refresh = (data: any) => {
|
||||
|
@ -34,7 +34,7 @@ export const useContainerStore = create<ContainerStore>((set, get) => {
|
||||
if (res.code === 200) {
|
||||
set({ list: res.data });
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
updateData: async (data) => {
|
||||
@ -49,7 +49,7 @@ export const useContainerStore = create<ContainerStore>((set, get) => {
|
||||
set({ showEdit: false, formData: [] });
|
||||
getList();
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
deleteData: async (id) => {
|
||||
@ -63,7 +63,7 @@ export const useContainerStore = create<ContainerStore>((set, get) => {
|
||||
getList();
|
||||
message.success('Success');
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
publishData: async (data) => {
|
||||
@ -87,7 +87,7 @@ export const useContainerStore = create<ContainerStore>((set, get) => {
|
||||
if (res.code === 200) {
|
||||
message.success('Success');
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -31,8 +31,8 @@ const ServerPath = () => {
|
||||
const navigate = useNavigate();
|
||||
return (
|
||||
<div className='p-2 w-full h-full bg-gray-200'>
|
||||
<h1 className='p-4 w-1/2 m-auto h1'>Map</h1>
|
||||
<div className='flex flex-col w-1/2 m-auto bg-white p-4 border rounded-md shadow-md'>
|
||||
<h1 className='p-4 w-1/2 m-auto h1'>Site Map</h1>
|
||||
<div className='flex flex-col w-1/2 m-auto bg-white p-4 border rounded-md shadow-md min-w-[600px]'>
|
||||
{serverPath.map((item) => {
|
||||
const links = item.links.map((link) => {
|
||||
const hasId = link.includes(':id');
|
||||
|
@ -31,7 +31,7 @@ export const useEditStore = create<EditStore>((set, get) => {
|
||||
if (res.code === 200) {
|
||||
set({ list: res.data });
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
updateData: async (data) => {
|
||||
@ -46,7 +46,7 @@ export const useEditStore = create<EditStore>((set, get) => {
|
||||
set({ showEditModal: false, formData: [] });
|
||||
getList();
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
deleteData: async (id) => {
|
||||
@ -60,7 +60,7 @@ export const useEditStore = create<EditStore>((set, get) => {
|
||||
message.success('Success');
|
||||
getList();
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -50,7 +50,7 @@ export const usePanelStore = create<PanelStore>((set, get) => {
|
||||
}),
|
||||
);
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
saveNodesEdges: async ({ edges, nodes, viewport }) => {
|
||||
@ -77,7 +77,7 @@ export const usePanelStore = create<PanelStore>((set, get) => {
|
||||
}),
|
||||
);
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
updateNodeData: async (data) => {
|
||||
@ -95,7 +95,7 @@ export const usePanelStore = create<PanelStore>((set, get) => {
|
||||
message.success('Success');
|
||||
// getList();
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
updateNodeDataStyle: async (data) => {
|
||||
@ -118,7 +118,7 @@ export const usePanelStore = create<PanelStore>((set, get) => {
|
||||
// getList();
|
||||
return true;
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
return false;
|
||||
},
|
||||
|
@ -41,7 +41,7 @@ export const usePromptStore = create<PromptStore>((set, get) => {
|
||||
if (res.code === 200) {
|
||||
set({ list: res.data });
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
updateData: async (data) => {
|
||||
@ -56,7 +56,7 @@ export const usePromptStore = create<PromptStore>((set, get) => {
|
||||
set({ showEdit: false, formData: [] });
|
||||
getList();
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
deleteData: async (id) => {
|
||||
@ -70,7 +70,7 @@ export const usePromptStore = create<PromptStore>((set, get) => {
|
||||
getList();
|
||||
message.success('Success');
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
runAi: async () => {
|
||||
|
@ -33,7 +33,7 @@ export const usePublishStore = create<Store>((set, get) => {
|
||||
if (res.code === 200) {
|
||||
set({ list: res.data });
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
updateData: async (data) => {
|
||||
@ -48,7 +48,7 @@ export const usePublishStore = create<Store>((set, get) => {
|
||||
set({ showEdit: false, formData: [] });
|
||||
getList();
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
deleteData: async (id) => {
|
||||
@ -62,7 +62,7 @@ export const usePublishStore = create<Store>((set, get) => {
|
||||
getList();
|
||||
message.success('Success');
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -27,18 +27,23 @@ export const Login = () => {
|
||||
loginStore.login();
|
||||
};
|
||||
return (
|
||||
<div className='flex w-full h-full'>
|
||||
<div className='flex w-full h-full bg-slate-200'>
|
||||
<div className='w-[600px] mx-auto mt-[10%] '>
|
||||
<h1 className='mb-4 tracking-widest'>Login</h1>
|
||||
<div className='card border-t-2'>
|
||||
<Form form={form} onFinish={onFinish}>
|
||||
<div className='card border-t-2 pt-8 px-8'>
|
||||
<Form
|
||||
form={form}
|
||||
onFinish={onFinish}
|
||||
labelCol={{
|
||||
span: 4,
|
||||
}}>
|
||||
<Form.Item label='username' name='username'>
|
||||
<Input />
|
||||
</Form.Item>
|
||||
<Form.Item label='password' name='password'>
|
||||
<Input type='password' />
|
||||
</Form.Item>
|
||||
<Form.Item label=' ' noStyle colon={false}>
|
||||
<Form.Item label=' ' colon={false}>
|
||||
<div className='flex gap-2'>
|
||||
<Button type='primary' htmlType='submit'>
|
||||
Login
|
||||
|
@ -33,7 +33,7 @@ export const useUserStore = create<UserStore>((set, get) => {
|
||||
if (res.code === 200) {
|
||||
set({ list: res.data });
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
updateData: async (data) => {
|
||||
@ -48,7 +48,7 @@ export const useUserStore = create<UserStore>((set, get) => {
|
||||
set({ showEdit: false, formData: [] });
|
||||
getList();
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
deleteData: async (id) => {
|
||||
@ -62,7 +62,7 @@ export const useUserStore = create<UserStore>((set, get) => {
|
||||
getList();
|
||||
message.success('Success');
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
};
|
||||
|
@ -1,6 +1,7 @@
|
||||
import { query } from '@/modules';
|
||||
import { message } from 'antd';
|
||||
import { create } from 'zustand';
|
||||
import { history } from '@/utils/history';
|
||||
type LoginStore = {
|
||||
loading: boolean;
|
||||
setLoading: (loading: boolean) => void;
|
||||
@ -29,11 +30,14 @@ export const useLoginStore = create<LoginStore>((set, get) => {
|
||||
const res = await query.post({ path: 'user', key: 'login', username, password });
|
||||
loaded();
|
||||
if (res.code === 200) {
|
||||
const { token } = res.data;
|
||||
message.success('Success');
|
||||
set({ isLogin: true });
|
||||
localStorage.setItem('token', token);
|
||||
// 跳到某一个页面,更新localStorage
|
||||
history.push('/map');
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
register: async () => {
|
||||
@ -44,8 +48,9 @@ export const useLoginStore = create<LoginStore>((set, get) => {
|
||||
if (res.code === 200) {
|
||||
message.success('Success');
|
||||
// 跳到某一个页面
|
||||
// history.push('/map', {}, true);
|
||||
} else {
|
||||
message.error(res.msg || 'Request failed');
|
||||
message.error(res.message || 'Request failed');
|
||||
}
|
||||
},
|
||||
isLogin: false,
|
||||
|
2
theme
2
theme
@ -1 +1 @@
|
||||
Subproject commit 36f865b026b70cd8f90a44f4d3b5f9dced9709af
|
||||
Subproject commit 66aae218f3962f2e5ab8f22f3a463b74d5e17362
|
Loading…
x
Reference in New Issue
Block a user