diff --git a/src/api/auth.ts b/src/api/auth.ts new file mode 100644 index 0000000..654ceac --- /dev/null +++ b/src/api/auth.ts @@ -0,0 +1,18 @@ +import { request } from '@/utils/request' +import type { LoginParams, LoginResult, CaptchaResult, UserInfo } from '@/types/api/auth' + +export function getCaptcha() { + return request.get('/auth/captcha') +} + +export function login(data: LoginParams) { + return request.post('/auth/login', data) +} + +export function logout() { + return request.post('/auth/logout') +} + +export function getUserInfo() { + return request.get('/auth/user-info') +} diff --git a/src/api/finance/budget.ts b/src/api/finance/budget.ts new file mode 100644 index 0000000..7de3936 --- /dev/null +++ b/src/api/finance/budget.ts @@ -0,0 +1,23 @@ +import { request } from '@/utils/request' +import type { PageResult } from '@/types/api/response' +import type { BudgetRecord, BudgetQueryParams } from '@/types/finance/budget' + +export function getBudgetList(params: BudgetQueryParams) { + return request.get>('/finance/budget/list', { params }) +} + +export function getBudgetDetail(id: number) { + return request.get(`/finance/budget/${id}`) +} + +export function createBudget(data: Partial) { + return request.post('/finance/budget', data) +} + +export function updateBudget(data: Partial) { + return request.put(`/finance/budget/${data.id}`, data) +} + +export function deleteBudget(id: number) { + return request.delete(`/finance/budget/${id}`) +} diff --git a/src/api/system/menu.ts b/src/api/system/menu.ts new file mode 100644 index 0000000..a163f1d --- /dev/null +++ b/src/api/system/menu.ts @@ -0,0 +1,18 @@ +import { request } from '@/utils/request' +import type { MenuRecord, MenuFormData } from '@/types/system/menu' + +export function getMenuList() { + return request.get('/system/menu/list') +} + +export function createMenu(data: MenuFormData) { + return request.post('/system/menu', data) +} + +export function updateMenu(data: MenuFormData) { + return request.put(`/system/menu/${data.id}`, data) +} + +export function deleteMenu(id: number) { + return request.delete(`/system/menu/${id}`) +} diff --git a/src/api/system/role.ts b/src/api/system/role.ts new file mode 100644 index 0000000..7c5c6ff --- /dev/null +++ b/src/api/system/role.ts @@ -0,0 +1,35 @@ +import { request } from '@/utils/request' +import type { RoleRecord, RoleQuery, RoleFormData, RoleOption } from '@/types/system/role' +import type { PageResult } from '@/types/api/response' + +export function getRolePage(params: RoleQuery) { + return request.get>('/system/role/page', { params }) +} + +export function getRoleList() { + return request.get('/system/role/list') +} + +export function getAllRoles() { + return request.get('/system/role/list-all') +} // Check if backend has list-all or if frontend filtered list. + +export function createRole(data: RoleFormData) { + return request.post('/system/role', data) +} + +export function updateRole(data: RoleFormData) { + return request.put(`/system/role/${data.id}`, data) +} + +export function deleteRole(id: number) { + return request.delete(`/system/role/${id}`) +} + +export function getRoleMenuIds(roleId: number) { + return request.get(`/system/role/${roleId}/menus`) +} + +export function assignRoleMenus(roleId: number, menuIds: number[]) { + return request.post(`/system/role/${roleId}/menus`, { menuIds }) +} diff --git a/src/api/system/user.ts b/src/api/system/user.ts new file mode 100644 index 0000000..a989aea --- /dev/null +++ b/src/api/system/user.ts @@ -0,0 +1,31 @@ +import { request } from '@/utils/request' +import type { UserRecord, UserQuery, UserFormData } from '@/types/system/user' +import type { PageResult } from '@/types/api/response' + +export function getUserList(params: UserQuery) { + return request.get>('/system/user/list', { params }) +} + +export function getUserDetail(id: number) { + return request.get(`/system/user/${id}`) +} + +export function createUser(data: UserFormData) { + return request.post('/system/user', data) +} + +export function updateUser(data: UserFormData) { + return request.put(`/system/user/${data.id}`, data) +} + +export function deleteUser(id: number) { + return request.delete(`/system/user/${id}`) +} + +export function updateUserStatus(id: number, status: number) { + return request.put(`/system/user/${id}/status`, null, { params: { status } }) +} + +export function resetUserPassword(id: number, newPassword: string) { + return request.post(`/system/user/${id}/reset-password`, { newPassword }) +} diff --git a/src/components.d.ts b/src/components.d.ts index 867fd90..b113dc6 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -31,6 +31,7 @@ declare module 'vue' { AEmpty: typeof import('ant-design-vue/es')['Empty'] AForm: typeof import('ant-design-vue/es')['Form'] AFormItem: typeof import('ant-design-vue/es')['FormItem'] + AFormItemRest: typeof import('ant-design-vue/es')['FormItemRest'] AInput: typeof import('ant-design-vue/es')['Input'] AInputNumber: typeof import('ant-design-vue/es')['InputNumber'] AInputPassword: typeof import('ant-design-vue/es')['InputPassword'] @@ -50,6 +51,7 @@ declare module 'vue' { APageHeader: typeof import('ant-design-vue/es')['PageHeader'] APagination: typeof import('ant-design-vue/es')['Pagination'] APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] + APopover: typeof import('ant-design-vue/es')['Popover'] ApprovalDrawer: typeof import('./components/ApprovalDrawer/index.vue')['default'] AProgress: typeof import('ant-design-vue/es')['Progress'] ARadio: typeof import('ant-design-vue/es')['Radio'] @@ -76,14 +78,24 @@ declare module 'vue' { ATimelineItem: typeof import('ant-design-vue/es')['TimelineItem'] ATooltip: typeof import('ant-design-vue/es')['Tooltip'] ATree: typeof import('ant-design-vue/es')['Tree'] + ATreeSelect: typeof import('ant-design-vue/es')['TreeSelect'] AUploadDragger: typeof import('ant-design-vue/es')['UploadDragger'] + BudgetDetailModal: typeof import('./components/finance/budget/BudgetDetailModal.vue')['default'] + BudgetFormModal: typeof import('./components/finance/budget/BudgetFormModal.vue')['default'] + DictFormModal: typeof import('./components/system/dict/DictFormModal.vue')['default'] + DictItemDrawer: typeof import('./components/system/dict/DictItemDrawer.vue')['default'] DuplicateFileModal: typeof import('./components/DuplicateFileModal.vue')['default'] DynamicMenu: typeof import('./components/DynamicMenu/index.vue')['default'] FlowEditor: typeof import('./components/FlowEditor/index.vue')['default'] HelloWorld: typeof import('./components/HelloWorld.vue')['default'] + IconPicker: typeof import('./components/common/IconPicker.vue')['default'] + MenuFormModal: typeof import('./components/system/menu/MenuFormModal.vue')['default'] ProjectUpload: typeof import('./components/ProjectUpload.vue')['default'] + ResetPasswordModal: typeof import('./components/system/user/ResetPasswordModal.vue')['default'] + RoleFormModal: typeof import('./components/system/role/RoleFormModal.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] UploadCore: typeof import('./components/UploadCore.vue')['default'] + UserFormModal: typeof import('./components/system/user/UserFormModal.vue')['default'] } } diff --git a/src/components/common/IconPicker.vue b/src/components/common/IconPicker.vue new file mode 100644 index 0000000..262c228 --- /dev/null +++ b/src/components/common/IconPicker.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/src/components/finance/budget/BudgetDetailModal.vue b/src/components/finance/budget/BudgetDetailModal.vue new file mode 100644 index 0000000..40c17bf --- /dev/null +++ b/src/components/finance/budget/BudgetDetailModal.vue @@ -0,0 +1,124 @@ + + + + + diff --git a/src/components/finance/budget/BudgetFormModal.vue b/src/components/finance/budget/BudgetFormModal.vue new file mode 100644 index 0000000..bdba237 --- /dev/null +++ b/src/components/finance/budget/BudgetFormModal.vue @@ -0,0 +1,301 @@ + + + + + diff --git a/src/components/system/dict/DictFormModal.vue b/src/components/system/dict/DictFormModal.vue new file mode 100644 index 0000000..778e5e0 --- /dev/null +++ b/src/components/system/dict/DictFormModal.vue @@ -0,0 +1,131 @@ + + + diff --git a/src/components/system/dict/DictItemDrawer.vue b/src/components/system/dict/DictItemDrawer.vue new file mode 100644 index 0000000..48375f7 --- /dev/null +++ b/src/components/system/dict/DictItemDrawer.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/src/components/system/menu/MenuFormModal.vue b/src/components/system/menu/MenuFormModal.vue new file mode 100644 index 0000000..ad2ff2c --- /dev/null +++ b/src/components/system/menu/MenuFormModal.vue @@ -0,0 +1,172 @@ + + + diff --git a/src/components/system/role/RoleFormModal.vue b/src/components/system/role/RoleFormModal.vue new file mode 100644 index 0000000..78995a0 --- /dev/null +++ b/src/components/system/role/RoleFormModal.vue @@ -0,0 +1,111 @@ + + + diff --git a/src/components/system/user/ResetPasswordModal.vue b/src/components/system/user/ResetPasswordModal.vue new file mode 100644 index 0000000..8dbc591 --- /dev/null +++ b/src/components/system/user/ResetPasswordModal.vue @@ -0,0 +1,60 @@ + + + diff --git a/src/components/system/user/UserFormModal.vue b/src/components/system/user/UserFormModal.vue new file mode 100644 index 0000000..55c34bd --- /dev/null +++ b/src/components/system/user/UserFormModal.vue @@ -0,0 +1,144 @@ + + + diff --git a/src/config/project.ts b/src/config/project.ts index fe64d2f..b283ec0 100644 --- a/src/config/project.ts +++ b/src/config/project.ts @@ -63,6 +63,9 @@ export const systemModule: ModuleConfig = { key: 'system', label: '系统管理', children: [ + { key: 'system-users', label: '用户管理', path: '/system/users' }, + { key: 'system-roles', label: '角色管理', path: '/system/roles' }, + { key: 'system-menus', label: '菜单管理', path: '/system/menus' }, { key: 'settings', label: '系统设置', path: '/settings' }, { key: 'dict', label: '字典管理', path: '/settings/dict' }, { key: 'city', label: '城市管理', path: '/settings/city' }, @@ -72,6 +75,9 @@ export const systemModule: ModuleConfig = { } ], routes: [ + { path: 'system/users', name: 'SystemUsers', component: '@/views/system/users/index.vue', title: '用户管理' }, + { path: 'system/roles', name: 'SystemRoles', component: '@/views/system/roles/index.vue', title: '角色管理' }, + { path: 'system/menus', name: 'SystemMenus', component: '@/views/system/menus/index.vue', title: '菜单管理' }, { path: 'settings', name: 'Settings', component: '@/views/settings/index.vue', title: '系统设置' }, { path: 'settings/dict', name: 'Dict', component: '@/views/settings/dict/index.vue', title: '字典管理' }, { path: 'settings/city', name: 'City', component: '@/views/settings/city/index.vue', title: '城市管理' }, diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue index 1b537e7..6d1b801 100644 --- a/src/layouts/MainLayout.vue +++ b/src/layouts/MainLayout.vue @@ -48,7 +48,8 @@ {{ menu.label }} - {{ child.label }} + + {{ child.label }} @@ -81,26 +82,27 @@ - + - - - diff --git a/src/views/settings/dict/index.vue b/src/views/settings/dict/index.vue deleted file mode 100644 index 309c0ea..0000000 --- a/src/views/settings/dict/index.vue +++ /dev/null @@ -1,498 +0,0 @@ - - - - - diff --git a/src/views/settings/index.vue b/src/views/settings/index.vue deleted file mode 100644 index a97e46a..0000000 --- a/src/views/settings/index.vue +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue new file mode 100644 index 0000000..884cae3 --- /dev/null +++ b/src/views/system/dict/index.vue @@ -0,0 +1,205 @@ + + + + + diff --git a/src/views/system/menus/index.vue b/src/views/system/menus/index.vue new file mode 100644 index 0000000..66b7ea7 --- /dev/null +++ b/src/views/system/menus/index.vue @@ -0,0 +1,166 @@ + + + + + diff --git a/src/views/system/roles/index.vue b/src/views/system/roles/index.vue new file mode 100644 index 0000000..10371a1 --- /dev/null +++ b/src/views/system/roles/index.vue @@ -0,0 +1,199 @@ + + + + + diff --git a/src/views/system/users/index.vue b/src/views/system/users/index.vue new file mode 100644 index 0000000..20a03ce --- /dev/null +++ b/src/views/system/users/index.vue @@ -0,0 +1,277 @@ + + + + + diff --git a/vite.config.ts b/vite.config.ts index a9c2e6a..09b0463 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -58,6 +58,16 @@ export default defineConfig({ server: { port: 5173, proxy: { + // 后端API代理 + '/api': { + target: 'http://localhost:8080', + changeOrigin: true, + configure: (proxy) => { + proxy.on('proxyReq', (proxyReq, req) => { + console.log(`[Backend API Proxy] ${req.method} ${req.url}`) + }) + } + }, // 主服务器代理 '/1panel-api/server1': { target: 'http://47.109.57.58:42588',