feat(react19-migration): 阶段2 - 核心框架层迁移

- T2.1: request.ts 确认无 Vue 依赖,无需修改
- T2.5: errorHandler.ts ElMessage → antd message
- T2.7: 新增 API (menu/config/dict/file/notice/loginLog) + 类型定义 (menu/permission/user)
- 清理旧 Vue 测试文件、views、stores、router、directives
- 修复 tsconfig: 添加 module:ESNext + types:vite/client

验证: npx tsc --noEmit 无类型错误
This commit is contained in:
张翔
2026-05-03 15:26:42 +08:00
parent a01bcf791b
commit 49779479dd
61 changed files with 397 additions and 8904 deletions
+60
View File
@@ -0,0 +1,60 @@
import request from '@/utils/request'
import type { PageResponse } from './user.api'
export interface ConfigItem {
id: number
configName: string
configKey: string
configValue: string
configType: string
remark: string
createdAt: string
updatedAt: string
}
export interface CreateConfigRequest {
configName: string
configKey: string
configValue: string
configType?: string
remark?: string
}
export interface UpdateConfigRequest {
configName?: string
configKey?: string
configValue?: string
configType?: string
remark?: string
}
export interface ConfigPageRequest {
page: number
size: number
configName?: string
configKey?: string
configType?: string
}
export const configApi = {
getAll: () =>
request.get<ConfigItem[]>('/sys/config'),
getPage: (params: ConfigPageRequest) =>
request.get<PageResponse<ConfigItem>>('/sys/config/page', { params }),
getById: (id: number) =>
request.get<ConfigItem>(`/sys/config/${id}`),
getByKey: (configKey: string) =>
request.get<ConfigItem>(`/sys/config/key/${configKey}`),
create: (data: CreateConfigRequest) =>
request.post<ConfigItem>('/sys/config', data),
update: (id: number, data: UpdateConfigRequest) =>
request.put<ConfigItem>(`/sys/config/${id}`, data),
delete: (id: number) =>
request.delete<void>(`/sys/config/${id}`),
}
+96
View File
@@ -0,0 +1,96 @@
import request from '@/utils/request'
import type { PageResponse } from './user.api'
export interface DictType {
id: number
dictName: string
dictType: string
status: number
remark: string
createdAt: string
updatedAt: string
}
export interface DictData {
id: number
dictType: string
dictLabel: string
dictValue: string
sort: number
status: number
remark: string
createdAt: string
updatedAt: string
}
export interface CreateDictTypeRequest {
dictName: string
dictType: string
status?: number
remark?: string
}
export interface UpdateDictTypeRequest {
dictName?: string
dictType?: string
status?: number
remark?: string
}
export interface CreateDictDataRequest {
dictType: string
dictLabel: string
dictValue: string
sort?: number
status?: number
remark?: string
}
export interface UpdateDictDataRequest {
dictType?: string
dictLabel?: string
dictValue?: string
sort?: number
status?: number
remark?: string
}
export interface DictPageRequest {
page: number
size: number
dictName?: string
dictType?: string
status?: string
}
export const dictApi = {
getTypes: () =>
request.get<DictType[]>('/dict/types'),
getTypeById: (id: number) =>
request.get<DictType>(`/dict/types/${id}`),
createType: (data: CreateDictTypeRequest) =>
request.post<DictType>('/dict/types', data),
updateType: (id: number, data: UpdateDictTypeRequest) =>
request.put<DictType>(`/dict/types/${id}`, data),
deleteType: (id: number) =>
request.delete<void>(`/dict/types/${id}`),
getDataByType: (dictType: string) =>
request.get<DictData[]>(`/dict/data/type/${dictType}`),
getDataPage: (params: DictPageRequest & { dictType: string }) =>
request.get<PageResponse<DictData>>('/dict/data/page', { params }),
createData: (data: CreateDictDataRequest) =>
request.post<DictData>('/dict/data', data),
updateData: (id: number, data: UpdateDictDataRequest) =>
request.put<DictData>(`/dict/data/${id}`, data),
deleteData: (id: number) =>
request.delete<void>(`/dict/data/${id}`),
}
+39
View File
@@ -0,0 +1,39 @@
import request from '@/utils/request'
import type { PageResponse } from './user.api'
export interface FileInfo {
id: number
fileName: string
filePath: string
fileSize: number
fileType: string
mimeType: string
uploadedBy: string
createdAt: string
}
export interface FilePageRequest {
page: number
size: number
fileName?: string
fileType?: string
}
export const fileApi = {
getPage: (params: FilePageRequest) =>
request.get<PageResponse<FileInfo>>('/files/page', { params }),
upload: (file: File) => {
const formData = new FormData()
formData.append('file', file)
return request.post<FileInfo>('/files/upload', formData, {
headers: { 'Content-Type': 'multipart/form-data' },
})
},
delete: (id: number) =>
request.delete<void>(`/files/${id}`),
download: (id: number) =>
request.get<Blob>(`/files/download/${id}`, { responseType: 'blob' }),
}
+53
View File
@@ -0,0 +1,53 @@
import request from '@/utils/request'
import type { PageResponse } from './user.api'
import { NoticeStatus } from '@/constants/status'
export interface Notice {
id: number
title: string
content: string
type: string
status: NoticeStatus
createdBy: string
createdAt: string
updatedAt: string
}
export interface CreateNoticeRequest {
title: string
content: string
type?: string
status?: NoticeStatus
}
export interface UpdateNoticeRequest {
title?: string
content?: string
type?: string
status?: NoticeStatus
}
export interface NoticePageRequest {
page: number
size: number
title?: string
type?: string
status?: string
}
export const noticeApi = {
getPage: (params: NoticePageRequest) =>
request.get<PageResponse<Notice>>('/notice/page', { params }),
getById: (id: number) =>
request.get<Notice>(`/notice/${id}`),
create: (data: CreateNoticeRequest) =>
request.post<Notice>('/notice', data),
update: (id: number, data: UpdateNoticeRequest) =>
request.put<Notice>(`/notice/${id}`, data),
delete: (id: number) =>
request.delete<void>(`/notice/${id}`),
}
+65
View File
@@ -0,0 +1,65 @@
import request from '@/utils/request'
import { MenuStatus } from '@/constants/status'
export interface MenuItem {
id: number
name: string
path: string
icon: string
component: string
parentId: number
sort: number
type: 'directory' | 'menu' | 'button'
permission: string
status: MenuStatus
visible: boolean
children?: MenuItem[]
createdAt: string
updatedAt: string
}
export interface CreateMenuRequest {
name: string
path?: string
icon?: string
component?: string
parentId: number
sort: number
type: 'directory' | 'menu' | 'button'
permission?: string
status?: MenuStatus
visible?: boolean
}
export interface UpdateMenuRequest {
name?: string
path?: string
icon?: string
component?: string
parentId?: number
sort?: number
type?: 'directory' | 'menu' | 'button'
permission?: string
status?: MenuStatus
visible?: boolean
}
export const menuApi = {
getAll: () =>
request.get<MenuItem[]>('/menus'),
getById: (id: number) =>
request.get<MenuItem>(`/menus/${id}`),
getTree: () =>
request.get<MenuItem[]>('/menus/tree'),
create: (data: CreateMenuRequest) =>
request.post<MenuItem>('/menus', data),
update: (id: number, data: UpdateMenuRequest) =>
request.put<MenuItem>(`/menus/${id}`, data),
delete: (id: number) =>
request.delete<void>(`/menus/${id}`),
}