可正常启用

This commit is contained in:
戚辰先生 2024-12-01 14:16:38 +08:00
parent c19b27e9d9
commit 9c949fe5c7
5 changed files with 120 additions and 53 deletions

View File

@ -16,7 +16,6 @@ const MenuPage: React.FC = () => {
pagination, pagination,
loading, loading,
loadData: fetchMenus, loadData: fetchMenus,
onPageChange,
handleCreate, handleCreate,
handleUpdate, handleUpdate,
handleDelete handleDelete
@ -26,8 +25,7 @@ const MenuPage: React.FC = () => {
}, },
defaultParams: { defaultParams: {
sortField: 'createTime', sortField: 'createTime',
sortOrder: 'descend', sortOrder: 'descend'
pageSize: 1000
} }
}); });
@ -39,9 +37,12 @@ const MenuPage: React.FC = () => {
const handleAdd = () => { const handleAdd = () => {
setEditingMenu(null); setEditingMenu(null);
form.resetFields(); form.resetFields();
const maxSort = Math.max(0, ...menus.map(menu => menu.sort));
form.setFieldsValue({ form.setFieldsValue({
type: MenuTypeEnum.MENU, type: MenuTypeEnum.MENU,
sort: 0, sort: maxSort + 10,
hidden: false hidden: false
}); });
setModalVisible(true); setModalVisible(true);
@ -62,7 +63,6 @@ const MenuPage: React.FC = () => {
sorter: SorterResult<MenuResponse> | SorterResult<MenuResponse>[] sorter: SorterResult<MenuResponse> | SorterResult<MenuResponse>[]
) => { ) => {
const { field, order } = Array.isArray(sorter) ? sorter[0] : sorter; const { field, order } = Array.isArray(sorter) ? sorter[0] : sorter;
fetchMenus({ fetchMenus({
sortField: field as string, sortField: field as string,
sortOrder: order sortOrder: order
@ -319,9 +319,14 @@ const MenuPage: React.FC = () => {
<Form.Item <Form.Item
name="sort" name="sort"
label="显示排序" label="显示排序"
tooltip="值越大排序越靠后,默认为当前最大值+10"
rules={[{ required: true, message: '请输入显示排序' }]} rules={[{ required: true, message: '请输入显示排序' }]}
> >
<InputNumber style={{ width: '100%' }} min={0} placeholder="请输入显示排序" /> <InputNumber
style={{ width: '100%' }}
min={0}
placeholder="请输入显示排序"
/>
</Form.Item> </Form.Item>
<Form.Item <Form.Item

View File

@ -1,14 +1,12 @@
import request from '@/utils/request'; import request from '@/utils/request';
import type {Page} from '@/types/base/page'; import type { Page } from '@/types/base/page';
import type {MenuResponse, MenuRequest, MenuQuery} from './types'; import type { MenuResponse, MenuRequest } from './types';
const BASE_URL = '/api/v1/menu'; const BASE_URL = '/api/v1/menu';
// 获取菜单列表(分页) // 获取菜单列表(分页)
export const getMenus = (params?: MenuQuery) => export const getMenus = (params?: any) =>
request.get<Page<MenuResponse>>(`${BASE_URL}/page`, { request.get<Page<MenuResponse>>(`${BASE_URL}/page`, { params });
params
});
// 获取菜单树 // 获取菜单树
export const getMenuTree = () => export const getMenuTree = () =>
@ -19,21 +17,14 @@ export const getCurrentUserMenus = () => {
return request.get<MenuResponse[]>(`${BASE_URL}/current`); return request.get<MenuResponse[]>(`${BASE_URL}/current`);
} }
// 创建菜单 // 创建菜单
export const createMenu = (data: MenuRequest) => export const createMenu = (data: MenuRequest) =>
request.post<MenuResponse>(BASE_URL, data, { request.post<MenuResponse>(BASE_URL, data);
successMessage: '创建菜单成功'
});
// 更新菜单 // 更新菜单
export const updateMenu = (id: number, data: MenuRequest) => export const updateMenu = (id: number, data: MenuRequest) =>
request.put<MenuResponse>(`${BASE_URL}/${id}`, data, { request.put<MenuResponse>(`${BASE_URL}/${id}`, data);
successMessage: '更新菜单成功'
});
// 删除菜单 // 删除菜单
export const deleteMenu = (id: number) => export const deleteMenu = (id: number) =>
request.delete(`${BASE_URL}/${id}`, { request.delete(`${BASE_URL}/${id}`);
successMessage: '删除菜单成功'
});

View File

@ -55,6 +55,14 @@ const RolePage: React.FC = () => {
const handleAdd = () => { const handleAdd = () => {
setEditingRole(null); setEditingRole(null);
form.resetFields(); form.resetFields();
// 获取当前最大排序值
const maxSort = Math.max(0, ...roles.map(role => role.sort));
form.setFieldsValue({
enabled: true,
sort: maxSort + 1 // 默认比最大值大1
});
setModalVisible(true); setModalVisible(true);
}; };
@ -345,10 +353,15 @@ const RolePage: React.FC = () => {
<Form.Item <Form.Item
name="sort" name="sort"
label="排序" label="显示排序"
rules={[{required: true, message: '请输入排序'}]} tooltip="值越大排序越靠后,默认为当前最大值+1"
rules={[{ required: true, message: '请输入排序' }]}
> >
<InputNumber style={{width: '100%'}} min={0} placeholder="请输入排序"/> <InputNumber
style={{ width: '100%' }}
min={0}
placeholder="请输入排序"
/>
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>

View File

@ -1,9 +1,9 @@
import React, {useEffect, useState} from 'react'; 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 {PlusOutlined, EditOutlined, DeleteOutlined, KeyOutlined, TeamOutlined} from '@ant-design/icons';
import type {UserResponse, Role} from './types'; import type {UserResponse, Role} from './types';
import type {DepartmentDTO} from '../Department/types'; import type {DepartmentDTO} from '../Department/types';
import {resetPassword} from './service'; import {resetPassword, assignRoles, getAllRoles} from './service';
import {useTableData} from '@/hooks/useTableData'; import {useTableData} from '@/hooks/useTableData';
import type {FixedType, AlignType, SortOrder} from 'rc-table/lib/interface'; import type {FixedType, AlignType, SortOrder} from 'rc-table/lib/interface';
import {Response} from "@/utils/request.ts"; import {Response} from "@/utils/request.ts";
@ -16,7 +16,6 @@ const UserPage: React.FC = () => {
pagination, pagination,
loading, loading,
loadData: fetchUsers, loadData: fetchUsers,
onPageChange,
handleCreate, handleCreate,
handleUpdate, handleUpdate,
handleDelete handleDelete
@ -26,7 +25,7 @@ const UserPage: React.FC = () => {
}, },
defaultParams: { defaultParams: {
sortField: 'createTime', sortField: 'createTime',
sortOrder: 'desc' sortOrder: 'descend'
} }
}); });
@ -36,6 +35,14 @@ const UserPage: React.FC = () => {
const [editingUser, setEditingUser] = useState<UserResponse | null>(null); const [editingUser, setEditingUser] = useState<UserResponse | null>(null);
const [form] = Form.useForm(); const [form] = Form.useForm();
const [passwordForm] = Form.useForm(); const [passwordForm] = Form.useForm();
const [roleModalVisible, setRoleModalVisible] = useState(false);
const [selectedUser, setSelectedUser] = useState<UserResponse | null>(null);
const [selectedRoles, setSelectedRoles] = useState<number[]>([]);
const [allRoles, setAllRoles] = useState<RoleResponse[]>([]);
useEffect(() => {
getAllRoles().then(roles => setAllRoles(roles));
}, []);
const handleAdd = () => { const handleAdd = () => {
setEditingUser(null); setEditingUser(null);
@ -104,10 +111,26 @@ const UserPage: React.FC = () => {
})); }));
}; };
// const handleAssignRoles = (record: UserResponse) => { const handleAssignRoles = (record: UserResponse) => {
// setSelectedUser(record); setSelectedUser(record);
// setRoleModalVisible(true); 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 = [ const columns = [
{ {
@ -210,6 +233,15 @@ const UserPage: React.FC = () => {
> >
</Button> </Button>
<Button
type="link"
size="small"
icon={<TeamOutlined/>}
onClick={() => handleAssignRoles(record)}
disabled={record.username === 'admin'}
>
</Button>
</Space> </Space>
), ),
}, },
@ -220,7 +252,7 @@ const UserPage: React.FC = () => {
filters: Record<string, FilterValue | null>, filters: Record<string, FilterValue | null>,
sorter: SorterResult<UserResponse> | SorterResult<UserResponse>[] sorter: SorterResult<UserResponse> | SorterResult<UserResponse>[]
) => { ) => {
const { field, order } = Array.isArray(sorter) ? sorter[0] : sorter; const {field, order} = Array.isArray(sorter) ? sorter[0] : sorter;
fetchUsers({ fetchUsers({
sortField: field as string, sortField: field as string,
sortOrder: order sortOrder: order
@ -381,6 +413,33 @@ const UserPage: React.FC = () => {
</Form.Item> </Form.Item>
</Form> </Form>
</Modal> </Modal>
<Modal
title="分配角色"
open={roleModalVisible}
onOk={handleAssignRoleSubmit}
onCancel={() => setRoleModalVisible(false)}
width={600}
destroyOnClose
>
<Form layout="vertical">
<Form.Item label="选择角色">
<Select
mode="multiple"
placeholder="请选择角色"
value={selectedRoles}
onChange={setSelectedRoles}
style={{width: '100%'}}
>
{allRoles.map(role => (
<Select.Option key={role.id} value={role.id}>
{role.name}
</Select.Option>
))}
</Select>
</Form.Item>
</Form>
</Modal>
</div> </div>
); );
}; };

View File

@ -3,33 +3,32 @@ import type { Page } from '@/types/base/page';
import type { UserResponse, UserRequest, UserQuery } from './types'; import type { UserResponse, UserRequest, UserQuery } from './types';
const BASE_URL = '/api/v1/user'; const BASE_URL = '/api/v1/user';
const ROLE_BASE_URL = '/api/v1/role';
// 获取用户列表(分页) // 获取用户列表(分页)
export const getUsers = (params?: UserQuery) => export const getUsers = (params?: UserQuery) =>
request.get<Page<UserResponse>>(`${BASE_URL}/page`, { request.get<Page<UserResponse>>(`${BASE_URL}/page`, { params });
params
});
// 创建用户 // 创建用户
export const createUser = (data: UserRequest) => export const createUser = (data: UserRequest) =>
request.post<UserResponse>(BASE_URL, data, { request.post<UserResponse>(BASE_URL, data);
successMessage: '创建用户成功'
});
// 更新用户 // 更新用户
export const updateUser = (id: number, data: UserRequest) => export const updateUser = (id: number, data: UserRequest) =>
request.put<UserResponse>(`${BASE_URL}/${id}`, data, { request.put<UserResponse>(`${BASE_URL}/${id}`, data);
successMessage: '更新用户成功'
});
// 删除用户 // 删除用户
export const deleteUser = (id: number) => export const deleteUser = (id: number) =>
request.delete(`${BASE_URL}/${id}`, { request.delete(`${BASE_URL}/${id}`);
successMessage: '删除用户成功'
});
// 重置密码 // 重置密码
export const resetPassword = (id: number, password: string) => export const resetPassword = (id: number, password: string) =>
request.post(`${BASE_URL}/${id}/reset-password`, password, { request.post(`${BASE_URL}/${id}/reset-password`, { password });
successMessage: '密码重置成功'
}); // 分配角色
export const assignRoles = (userId: number, roleIds: number[]) =>
request.post(`${ROLE_BASE_URL}/${userId}/assignRoles`, roleIds);
// 获取所有角色列表(不分页)
export const getAllRoles = () =>
request.get<RoleResponse[]>(`${ROLE_BASE_URL}/list`);