Skip to content

Commit 75d4006

Browse files
awesomeYGawesomeYG
andauthored
feat: 更新UI界面和文件重构 (#49)
- 更新admin端AI相关页面(doc, qa, web) - 更新用户管理页面 - 更新ImportDoc组件常量 - 更新前端ProfileContent组件 - 移动proxy.ts文件到src目录 Co-authored-by: awesomeYG <gang.yang@chaitin.com>
1 parent 8065e21 commit 75d4006

File tree

7 files changed

+46
-36
lines changed

7 files changed

+46
-36
lines changed

ui/admin/src/components/ImportDoc/const.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ export const StepText = {
1919
},
2020
};
2121

22-
export const fileType: Record<ModelFileType, string> = {
23-
[ModelFileType.FileTypeUnknown]: '未知',
22+
export const fileType: Record<Exclude<ModelFileType, ModelFileType.FileTypeMax | ModelFileType.FileTypeUnknown>, string> = {
2423
[ModelFileType.FileTypeMarkdown]: 'Markdown',
2524
[ModelFileType.FileTypeHTML]: 'HTML',
2625
[ModelFileType.FileTypeJSON]: 'JSON',
2726
[ModelFileType.FileTypeURL]: 'URL',
2827
[ModelFileType.FileTypeDOCX]: 'DOCX',
28+
[ModelFileType.FileTypeDOC]: 'DOC',
2929
[ModelFileType.FileTypePPTX]: 'PPTX',
3030
[ModelFileType.FileTypeXLSX]: 'XLSX',
3131
[ModelFileType.FileTypeXLS]: 'XLS',
@@ -35,5 +35,6 @@ export const fileType: Record<ModelFileType, string> = {
3535
[ModelFileType.FileTypeXML]: 'XML',
3636
[ModelFileType.FileTypeZIP]: 'ZIP',
3737
[ModelFileType.FileTypeEPub]: 'EPub',
38-
[ModelFileType.FileTypeMax]: 'Max',
38+
[ModelFileType.FileTypeFolder]: '文件夹',
39+
[ModelFileType.FileTypeFile]: '文件',
3940
}

ui/admin/src/pages/ai/doc.tsx

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
deleteAdminKbKbIdDocumentDocId,
33
getAdminKbKbIdDocument,
44
getAdminKbKbIdDocumentDocId,
5+
ModelFileType,
56
ModelKBDocumentDetail,
67
SvcDocListItem,
78
} from '@/api';
@@ -10,7 +11,7 @@ import { fileType } from '@/components/ImportDoc/const';
1011
import StatusBadge from '@/components/StatusBadge';
1112
import { useListQueryParams } from '@/hooks/useListQueryParams';
1213
import { Ellipsis, message, Modal, Table } from '@ctzhian/ui';
13-
import { Box, Button, Stack, TextField, Typography } from '@mui/material';
14+
import { Box, Button, FormControl, InputLabel, MenuItem, Select, Stack, TextField, Typography } from '@mui/material';
1415
import { useRequest } from 'ahooks';
1516
import { ColumnsType } from '@ctzhian/ui/dist/Table';
1617
import dayjs from 'dayjs';
@@ -31,11 +32,14 @@ const fetchMarkdownContent = async (url: string): Promise<string> => {
3132
};
3233

3334
const AdminDocument = () => {
34-
const { query, page, size, setParams } = useListQueryParams();
35+
const { query, page, size, setParams, setSearch } = useListQueryParams();
3536
const [searchParams] = useSearchParams();
3637
const kb_id = +searchParams.get('id')!;
3738
const [title, setTitle] = useState(query.title);
38-
const [file_type, setFile_type] = useState(query.file_type);
39+
const [file_type, setFile_type] = useState<ModelFileType | ''>(() => {
40+
if (query.file_type === undefined || query.file_type === '') return '';
41+
return Number(query.file_type) as ModelFileType;
42+
});
3943
const {
4044
data,
4145
loading,
@@ -106,9 +110,8 @@ const AdminDocument = () => {
106110
title: '类型',
107111
dataIndex: 'file_type',
108112
render: (_, record) => {
109-
return record?.file_type !== undefined
110-
? fileType[record.file_type!] || record?.file_type
111-
: '-';
113+
if (record?.file_type === undefined) return '-';
114+
return fileType[record.file_type as keyof typeof fileType] || record.file_type;
112115
},
113116
},
114117
{
@@ -159,25 +162,35 @@ const AdminDocument = () => {
159162
onChange={e => setTitle(e.target.value)}
160163
onKeyDown={e => {
161164
if (e.key === 'Enter') {
162-
setParams({
165+
setSearch({
163166
title,
164167
});
165168
}
166169
}}
167170
/>
168-
<TextField
169-
label="类型"
170-
value={file_type}
171-
size="small"
172-
onChange={e => setFile_type(e.target.value)}
173-
onKeyDown={e => {
174-
if (e.key === 'Enter') {
175-
setParams({
176-
file_type,
171+
<FormControl size="small" sx={{ minWidth: 120 }}>
172+
<InputLabel>类型</InputLabel>
173+
<Select
174+
value={file_type}
175+
label="类型"
176+
onChange={e => {
177+
const value = e.target.value as ModelFileType | '';
178+
setFile_type(value);
179+
setSearch({
180+
file_type: value || undefined,
177181
});
178-
}
179-
}}
180-
/>
182+
}}
183+
>
184+
<MenuItem value="">
185+
<em>全部</em>
186+
</MenuItem>
187+
{Object.entries(fileType).map(([key, label]) => (
188+
<MenuItem key={key} value={Number(key)}>
189+
{label}
190+
</MenuItem>
191+
))}
192+
</Select>
193+
</FormControl>
181194
</Stack>
182195
<DocImport refresh={fetchData} allowedImportTypes={['OfflineFile']} />
183196
</Stack>

ui/admin/src/pages/ai/qa.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import LoadingBtn from '@/components/LoadingButton';
2020
import { ColumnsType } from '@ctzhian/ui/dist/Table';
2121

2222
const AdminDocument = () => {
23-
const { query, page, size, setParams } = useListQueryParams();
23+
const { query, page, size, setParams, setSearch } = useListQueryParams();
2424
const [searchParams] = useSearchParams();
2525
const kb_id = +searchParams.get('id')!;
2626
const [title, setTitle] = useState(query.title);
@@ -175,7 +175,7 @@ const AdminDocument = () => {
175175
onChange={e => setTitle(e.target.value)}
176176
onKeyDown={e => {
177177
if (e.key === 'Enter') {
178-
setParams({
178+
setSearch({
179179
title,
180180
});
181181
}

ui/admin/src/pages/ai/web.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ const fetchMarkdownContent = async (url: string): Promise<string> => {
3333
};
3434

3535
const AdminDocument = () => {
36-
const { query, page, size, setParams } = useListQueryParams();
36+
const { query, page, size, setParams, setSearch } = useListQueryParams();
3737
const [searchParams] = useSearchParams();
3838
const kb_id = +searchParams.get('id')!;
3939
const [title, setTitle] = useState(query.title);
@@ -177,7 +177,7 @@ const AdminDocument = () => {
177177
onChange={e => setTitle(e.target.value)}
178178
onKeyDown={e => {
179179
if (e.key === 'Enter') {
180-
setParams({
180+
setSearch({
181181
title,
182182
});
183183
}

ui/admin/src/pages/user/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ const transRole: Record<ModelUserRole, string> = {
3636

3737

3838
const AdminDocument = () => {
39-
const { query, page, size, setParams } = useListQueryParams();
39+
const { query, page, size, setParams, setSearch } = useListQueryParams();
4040
const { reset, register, handleSubmit, watch, control } = useForm({
4141
defaultValues: {
4242
name: '',
@@ -175,7 +175,7 @@ const AdminDocument = () => {
175175
onChange={e => setName(e.target.value)}
176176
onKeyDown={e => {
177177
if (e.key === 'Enter') {
178-
setParams({
178+
setSearch({
179179
name,
180180
});
181181
}

ui/front/src/app/profile/ui/ProfileContent.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ function TabPanel(props: TabPanelProps) {
6666
}
6767

6868
export default function ProfileContent({ initialUser }: ProfileContentProps) {
69-
const { user, setUser } = useContext(AuthContext)
69+
const { user, setUser, fetchUser } = useContext(AuthContext)
7070
const tabValue = 0
7171
const [isEditingName, setIsEditingName] = useState(false)
7272
const [editName, setEditName] = useState(user?.username || '')
@@ -117,11 +117,8 @@ export default function ProfileContent({ initialUser }: ProfileContentProps) {
117117
try {
118118
await putUser({ avatar: file })
119119

120-
// 创建本地预览URL
121-
const previewUrl = URL.createObjectURL(file)
122-
setUser({ ...user, avatar: previewUrl })
123-
124-
// TODO: 实际项目中应该从API响应中获取新的头像URL
120+
// 头像上传成功后,重新获取用户信息以获取最新的头像URL
121+
await fetchUser()
125122
} catch (error) {
126123
console.error('头像上传失败:', error)
127124
alert('头像上传失败,请重试')

ui/front/proxy.ts renamed to ui/front/src/proxy.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
import { NextResponse } from 'next/server';
88
import type { NextRequest } from 'next/server';
9-
import { getServerPublicAccessStatus } from './src/utils/serverAuthConfig';
9+
import { getServerPublicAccessStatus } from './utils/serverAuthConfig';
1010

1111
// 需要认证的路由
1212
const PROTECTED_ROUTES = [
@@ -122,7 +122,6 @@ export async function proxy(request: NextRequest) {
122122
try {
123123
const baseURL = process.env.TARGET || '';
124124
const publicAccess = await getServerPublicAccessStatus(baseURL, request);
125-
126125
// 如果public_access为false,强制跳转到登录页面
127126
if (!publicAccess) {
128127
const loginUrl = new URL('/login', request.url);

0 commit comments

Comments
 (0)