diff --git a/frontend/src/pages/System/Menu/index.tsx b/frontend/src/pages/System/Menu/index.tsx index 494e40db..aacf76ff 100644 --- a/frontend/src/pages/System/Menu/index.tsx +++ b/frontend/src/pages/System/Menu/index.tsx @@ -16,7 +16,6 @@ const MenuPage: React.FC = () => { pagination, loading, loadData: fetchMenus, - onPageChange, handleCreate, handleUpdate, handleDelete @@ -26,8 +25,7 @@ const MenuPage: React.FC = () => { }, defaultParams: { sortField: 'createTime', - sortOrder: 'descend', - pageSize: 1000 + sortOrder: 'descend' } }); @@ -39,9 +37,12 @@ const MenuPage: React.FC = () => { const handleAdd = () => { setEditingMenu(null); form.resetFields(); + + const maxSort = Math.max(0, ...menus.map(menu => menu.sort)); + form.setFieldsValue({ type: MenuTypeEnum.MENU, - sort: 0, + sort: maxSort + 10, hidden: false }); setModalVisible(true); @@ -62,7 +63,6 @@ const MenuPage: React.FC = () => { sorter: SorterResult | SorterResult[] ) => { const { field, order } = Array.isArray(sorter) ? sorter[0] : sorter; - fetchMenus({ sortField: field as string, sortOrder: order @@ -319,9 +319,14 @@ const MenuPage: React.FC = () => { - + - request.get>(`${BASE_URL}/page`, { - params - }); +export const getMenus = (params?: any) => + request.get>(`${BASE_URL}/page`, { params }); // 获取菜单树 -export const getMenuTree = () => +export const getMenuTree = () => request.get(`${BASE_URL}/tree`); // 获取当前用户菜单 @@ -19,21 +17,14 @@ export const getCurrentUserMenus = () => { return request.get(`${BASE_URL}/current`); } - // 创建菜单 -export const createMenu = (data: MenuRequest) => - request.post(BASE_URL, data, { - successMessage: '创建菜单成功' - }); +export const createMenu = (data: MenuRequest) => + request.post(BASE_URL, data); // 更新菜单 -export const updateMenu = (id: number, data: MenuRequest) => - request.put(`${BASE_URL}/${id}`, data, { - successMessage: '更新菜单成功' - }); +export const updateMenu = (id: number, data: MenuRequest) => + request.put(`${BASE_URL}/${id}`, data); // 删除菜单 -export const deleteMenu = (id: number) => - request.delete(`${BASE_URL}/${id}`, { - successMessage: '删除菜单成功' - }); \ No newline at end of file +export const deleteMenu = (id: number) => + request.delete(`${BASE_URL}/${id}`); \ No newline at end of file diff --git a/frontend/src/pages/System/Role/index.tsx b/frontend/src/pages/System/Role/index.tsx index 353b8e40..54334e39 100644 --- a/frontend/src/pages/System/Role/index.tsx +++ b/frontend/src/pages/System/Role/index.tsx @@ -55,6 +55,14 @@ const RolePage: React.FC = () => { const handleAdd = () => { setEditingRole(null); form.resetFields(); + + // 获取当前最大排序值 + const maxSort = Math.max(0, ...roles.map(role => role.sort)); + + form.setFieldsValue({ + enabled: true, + sort: maxSort + 1 // 默认比最大值大1 + }); setModalVisible(true); }; @@ -345,10 +353,15 @@ const RolePage: React.FC = () => { - + diff --git a/frontend/src/pages/System/User/index.tsx b/frontend/src/pages/System/User/index.tsx index f0f6676d..b268e856 100644 --- a/frontend/src/pages/System/User/index.tsx +++ b/frontend/src/pages/System/User/index.tsx @@ -1,9 +1,9 @@ import React, {useEffect, useState} from 'react'; -import {Table, Button, Modal, Form, Input, Space, message, Switch, TreeSelect} from 'antd'; +import {Table, Button, Modal, Form, Input, Space, message, Switch, TreeSelect, Select} from 'antd'; import {PlusOutlined, EditOutlined, DeleteOutlined, KeyOutlined, TeamOutlined} from '@ant-design/icons'; import type {UserResponse, Role} from './types'; import type {DepartmentDTO} from '../Department/types'; -import {resetPassword} from './service'; +import {resetPassword, assignRoles, getAllRoles} from './service'; import {useTableData} from '@/hooks/useTableData'; import type {FixedType, AlignType, SortOrder} from 'rc-table/lib/interface'; import {Response} from "@/utils/request.ts"; @@ -16,7 +16,6 @@ const UserPage: React.FC = () => { pagination, loading, loadData: fetchUsers, - onPageChange, handleCreate, handleUpdate, handleDelete @@ -26,7 +25,7 @@ const UserPage: React.FC = () => { }, defaultParams: { sortField: 'createTime', - sortOrder: 'desc' + sortOrder: 'descend' } }); @@ -36,6 +35,14 @@ const UserPage: React.FC = () => { const [editingUser, setEditingUser] = useState(null); const [form] = Form.useForm(); const [passwordForm] = Form.useForm(); + const [roleModalVisible, setRoleModalVisible] = useState(false); + const [selectedUser, setSelectedUser] = useState(null); + const [selectedRoles, setSelectedRoles] = useState([]); + const [allRoles, setAllRoles] = useState([]); + + useEffect(() => { + getAllRoles().then(roles => setAllRoles(roles)); + }, []); const handleAdd = () => { setEditingUser(null); @@ -104,10 +111,26 @@ const UserPage: React.FC = () => { })); }; - // const handleAssignRoles = (record: UserResponse) => { - // setSelectedUser(record); - // setRoleModalVisible(true); - // }; + const handleAssignRoles = (record: UserResponse) => { + setSelectedUser(record); + setSelectedRoles(record.roles?.map(role => role.id) || []); + setRoleModalVisible(true); + }; + + const handleAssignRoleSubmit = async () => { + if (selectedUser) { + try { + await assignRoles(selectedUser.id, selectedRoles); + message.success("角色分配成功") + setRoleModalVisible(false); + fetchUsers(); + } catch (error) { + message.error("角色分配失败") + console.log(error); + } + + } + }; const columns = [ { @@ -210,6 +233,15 @@ const UserPage: React.FC = () => { > 删除 + ), }, @@ -220,7 +252,7 @@ const UserPage: React.FC = () => { filters: Record, sorter: SorterResult | SorterResult[] ) => { - const { field, order } = Array.isArray(sorter) ? sorter[0] : sorter; + const {field, order} = Array.isArray(sorter) ? sorter[0] : sorter; fetchUsers({ sortField: field as string, sortOrder: order @@ -381,6 +413,33 @@ const UserPage: React.FC = () => { + + setRoleModalVisible(false)} + width={600} + destroyOnClose + > +
+ + + +
+
); }; diff --git a/frontend/src/pages/System/User/service.ts b/frontend/src/pages/System/User/service.ts index 3b1f345e..6a744b71 100644 --- a/frontend/src/pages/System/User/service.ts +++ b/frontend/src/pages/System/User/service.ts @@ -3,33 +3,32 @@ import type { Page } from '@/types/base/page'; import type { UserResponse, UserRequest, UserQuery } from './types'; const BASE_URL = '/api/v1/user'; +const ROLE_BASE_URL = '/api/v1/role'; // 获取用户列表(分页) export const getUsers = (params?: UserQuery) => - request.get>(`${BASE_URL}/page`, { - params - }); + request.get>(`${BASE_URL}/page`, { params }); // 创建用户 export const createUser = (data: UserRequest) => - request.post(BASE_URL, data, { - successMessage: '创建用户成功' - }); + request.post(BASE_URL, data); // 更新用户 export const updateUser = (id: number, data: UserRequest) => - request.put(`${BASE_URL}/${id}`, data, { - successMessage: '更新用户成功' - }); + request.put(`${BASE_URL}/${id}`, data); // 删除用户 export const deleteUser = (id: number) => - request.delete(`${BASE_URL}/${id}`, { - successMessage: '删除用户成功' - }); + request.delete(`${BASE_URL}/${id}`); // 重置密码 export const resetPassword = (id: number, password: string) => - request.post(`${BASE_URL}/${id}/reset-password`, password, { - successMessage: '密码重置成功' - }); + request.post(`${BASE_URL}/${id}/reset-password`, { password }); + +// 分配角色 +export const assignRoles = (userId: number, roleIds: number[]) => + request.post(`${ROLE_BASE_URL}/${userId}/assignRoles`, roleIds); + +// 获取所有角色列表(不分页) +export const getAllRoles = () => + request.get(`${ROLE_BASE_URL}/list`);