mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-30 18:48:55 +00:00
后台 (#77)
This commit is contained in:
72
admin/src/App.tsx
Normal file
72
admin/src/App.tsx
Normal file
@@ -0,0 +1,72 @@
|
||||
import {
|
||||
createTextField,
|
||||
jsonServerProvider,
|
||||
ListTable,
|
||||
Resource,
|
||||
Tushan,
|
||||
} from 'tushan';
|
||||
import { authProvider } from './auth';
|
||||
import { userFields,payFields,kbFields,ModelFields } from './fields';
|
||||
|
||||
const dataProvider = jsonServerProvider('http://localhost:3001');
|
||||
|
||||
function App() {
|
||||
return (
|
||||
<Tushan
|
||||
basename="/"
|
||||
header={'fastgpt-admin'}
|
||||
footer={'Build with stakeswky'}
|
||||
dataProvider={dataProvider}
|
||||
authProvider={authProvider}
|
||||
>
|
||||
<Resource
|
||||
name="users"
|
||||
label="用户信息"
|
||||
list={
|
||||
<ListTable
|
||||
filter={[
|
||||
createTextField('q', {
|
||||
label: 'Query',
|
||||
}),
|
||||
]}
|
||||
fields={userFields}
|
||||
action={{ create: true, detail: true, edit: true, delete: true }}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
|
||||
<Resource
|
||||
name="pays"
|
||||
label="支付记录"
|
||||
list={
|
||||
<ListTable
|
||||
fields={payFields}
|
||||
action={{ detail: true }}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<Resource
|
||||
name="kbs"
|
||||
label="知识库"
|
||||
list={
|
||||
<ListTable
|
||||
fields={kbFields}
|
||||
action={{ detail: true }}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<Resource
|
||||
name="models"
|
||||
label="Ai模型"
|
||||
list={
|
||||
<ListTable
|
||||
fields={ModelFields}
|
||||
action={{ detail: true }}
|
||||
/>
|
||||
}
|
||||
/>
|
||||
</Tushan>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
33
admin/src/auth.ts
Normal file
33
admin/src/auth.ts
Normal file
@@ -0,0 +1,33 @@
|
||||
import { AuthProvider } from 'tushan';
|
||||
|
||||
export const authProvider: AuthProvider = {
|
||||
login: ({ username, password }) => {
|
||||
if (username !== 'tushan' || password !== 'tushan') {
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
localStorage.setItem('username', username);
|
||||
return Promise.resolve();
|
||||
},
|
||||
logout: () => {
|
||||
localStorage.removeItem('username');
|
||||
return Promise.resolve();
|
||||
},
|
||||
checkAuth: () =>
|
||||
localStorage.getItem('username') ? Promise.resolve() : Promise.reject(),
|
||||
checkError: (error) => {
|
||||
const status = error.status;
|
||||
if (status === 401 || status === 403) {
|
||||
localStorage.removeItem('username');
|
||||
return Promise.reject();
|
||||
}
|
||||
|
||||
return Promise.resolve();
|
||||
},
|
||||
getIdentity: () =>
|
||||
Promise.resolve({
|
||||
id: '0',
|
||||
fullName: 'Admin',
|
||||
}),
|
||||
getPermissions: () => Promise.resolve(''),
|
||||
};
|
46
admin/src/fields.ts
Normal file
46
admin/src/fields.ts
Normal file
@@ -0,0 +1,46 @@
|
||||
import {
|
||||
createTextField,
|
||||
createUrlField,
|
||||
createNumberField,
|
||||
createAvatarField
|
||||
} from 'tushan';
|
||||
|
||||
export const userFields = [
|
||||
createTextField('id', { label: 'ID' }),
|
||||
createTextField('username', { label: '用户名', list: { sort: true } }),
|
||||
createTextField('password', { label: '密码(加密)' }),
|
||||
createNumberField('balance', { label: '余额' }),
|
||||
createTextField('openaiKey', { label: 'OpenAI Key' }),
|
||||
createTextField('createTime', { label: 'Create Time' }),
|
||||
createAvatarField('avatar', { label: 'Avatar' }),
|
||||
];
|
||||
|
||||
export const payFields = [
|
||||
createTextField('id', { label: 'ID' }),
|
||||
createTextField('name', { label: '用户名', list: { sort: true } }),
|
||||
createNumberField('price', { label: '支付金额' }),
|
||||
createTextField('orderId', { label: 'orderId' }),
|
||||
createTextField('status', { label: '状态' }),
|
||||
createTextField('createTime', { label: 'Create Time' }),
|
||||
];
|
||||
|
||||
export const kbFields = [
|
||||
createTextField('id', { label: 'ID' }),
|
||||
createTextField('user', { label: '所属用户' }),
|
||||
createTextField('name', { label: '知识库', list: { sort: true } }),
|
||||
createTextField('tags', { label: 'Tags' }),
|
||||
createAvatarField('avatar', { label: 'Avatar' }),
|
||||
];
|
||||
|
||||
export const ModelFields = [
|
||||
createTextField('id', { label: 'ID' }),
|
||||
createTextField('name', { label: 'Ai助手', list: { sort: true } }),
|
||||
createTextField('user', { label: '所属用户' }),
|
||||
createTextField('relatedKbs', { label: '引用的知识库' }),
|
||||
createTextField('searchMode', { label: '搜索模式' }),
|
||||
createTextField('systemPrompt', { label: '提示词' }),
|
||||
createTextField('temperature', { label: '温度' }),
|
||||
createTextField('isShare', { label: '是否分享' }),
|
||||
createTextField('isShareDetail', { label: '分享详情' }),
|
||||
createAvatarField('avatar', { label: 'Avatar' }),
|
||||
];
|
7
admin/src/main.tsx
Normal file
7
admin/src/main.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom/client';
|
||||
import App from './App';
|
||||
|
||||
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
|
||||
<App />
|
||||
);
|
1
admin/src/vite-env.d.ts
vendored
Normal file
1
admin/src/vite-env.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/// <reference types="vite/client" />
|
Reference in New Issue
Block a user