feat: admin image

This commit is contained in:
archer
2023-06-10 00:35:26 +08:00
parent 2378615887
commit e19ac56fe5
21 changed files with 6045 additions and 416 deletions

View File

@@ -4,18 +4,34 @@ import {
ListTable,
Resource,
Tushan,
fetchJSON
} from 'tushan';
import { authProvider } from './auth';
import { userFields,payFields,kbFields,ModelFields } from './fields';
import { userFields, payFields, kbFields, ModelFields } from './fields';
const dataProvider = jsonServerProvider('http://localhost:3001');
const authStorageKey = 'tushan:auth';
const httpClient: typeof fetchJSON = (url, options = {}) => {
try {
if (!options.headers) {
options.headers = new Headers({ Accept: 'application/json' });
}
const { token } = JSON.parse(window.localStorage.getItem(authStorageKey) ?? '{}');
(options.headers as Headers).set('Authorization', `Bearer ${token}`);
return fetchJSON(url, options);
} catch (err) {
return Promise.reject();
}
};
const dataProvider = jsonServerProvider(import.meta.env.VITE_PUBLIC_SERVER_URL, httpClient);
function App() {
return (
<Tushan
basename="/"
header={'fastgpt-admin'}
footer={'Build with stakeswky'}
header={'FastGpt-Admin'}
dataProvider={dataProvider}
authProvider={authProvider}
>
@@ -25,12 +41,12 @@ function App() {
list={
<ListTable
filter={[
createTextField('q', {
label: 'Query',
}),
createTextField('username', {
label: 'username'
})
]}
fields={userFields}
action={{ create: true, detail: true, edit: true, delete: true }}
action={{ create: true, detail: true, edit: true }}
/>
}
/>
@@ -40,6 +56,11 @@ function App() {
label="支付记录"
list={
<ListTable
filter={[
createTextField('userId', {
label: 'userId'
})
]}
fields={payFields}
action={{ detail: true }}
/>
@@ -50,6 +71,11 @@ function App() {
label="知识库"
list={
<ListTable
filter={[
createTextField('tag', {
label: 'tag'
})
]}
fields={kbFields}
action={{ detail: true }}
/>
@@ -57,13 +83,8 @@ function App() {
/>
<Resource
name="models"
label="Ai模型"
list={
<ListTable
fields={ModelFields}
action={{ detail: true }}
/>
}
label="应用"
list={<ListTable fields={ModelFields} action={{ detail: true }} />}
/>
</Tushan>
);

View File

@@ -1,33 +1,5 @@
import { AuthProvider } from 'tushan';
import { createAuthProvider, type 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(''),
};
export const authProvider: AuthProvider = createAuthProvider({
loginUrl: `${import.meta.env.VITE_PUBLIC_SERVER_URL}api/login`
});

View File

@@ -1,46 +1,39 @@
import {
createTextField,
createUrlField,
createNumberField,
createAvatarField
} from 'tushan';
import { createTextField, createNumberField } 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' }),
createTextField('username', { label: '用户名' }),
createNumberField('balance', { label: '余额', list: { sort: true } }),
createTextField('createTime', { label: 'Create Time', list: { sort: true } })
];
export const payFields = [
createTextField('id', { label: 'ID' }),
createTextField('name', { label: '用户名', list: { sort: true } }),
createTextField('userId', { label: '用户Id' }),
createNumberField('price', { label: '支付金额' }),
createTextField('orderId', { label: 'orderId' }),
createTextField('status', { label: '状态' }),
createTextField('createTime', { label: 'Create Time' }),
createTextField('createTime', { label: 'Create Time', list: { sort: true } })
];
export const kbFields = [
createTextField('id', { label: 'ID' }),
createTextField('user', { label: '所属用户' }),
createTextField('name', { label: '知识库', list: { sort: true } }),
createTextField('tags', { label: 'Tags' }),
createAvatarField('avatar', { label: 'Avatar' }),
createTextField('userId', { label: '所属用户' }),
createTextField('name', { label: '知识库' }),
createTextField('tags', { label: 'Tags' })
];
export const ModelFields = [
createTextField('id', { label: 'ID' }),
createTextField('name', { label: 'Ai助手', list: { sort: true } }),
createTextField('user', { label: '所属用户' }),
createTextField('userId', { label: '所属用户' }),
createTextField('name', { label: '名字' }),
createTextField('relatedKbs', { label: '引用的知识库' }),
createTextField('searchMode', { label: '搜索模式' }),
createTextField('systemPrompt', { label: '提示词' }),
createTextField('temperature', { label: '温度' }),
createTextField('isShare', { label: '是否分享' }),
createTextField('isShareDetail', { label: '分享详情' }),
createAvatarField('avatar', { label: 'Avatar' }),
];
createTextField('systemPrompt', {
label: '提示词',
list: {
width: 400
}
}),
createTextField('temperature', { label: '温度' })
];

View File

@@ -2,6 +2,4 @@ import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
<App />
);
ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(<App />);