可正常启用
This commit is contained in:
parent
c19b27e9d9
commit
9c949fe5c7
@ -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<MenuResponse> | SorterResult<MenuResponse>[]
|
||||
) => {
|
||||
const { field, order } = Array.isArray(sorter) ? sorter[0] : sorter;
|
||||
|
||||
fetchMenus({
|
||||
sortField: field as string,
|
||||
sortOrder: order
|
||||
@ -319,9 +319,14 @@ const MenuPage: React.FC = () => {
|
||||
<Form.Item
|
||||
name="sort"
|
||||
label="显示排序"
|
||||
tooltip="值越大排序越靠后,默认为当前最大值+10"
|
||||
rules={[{ required: true, message: '请输入显示排序' }]}
|
||||
>
|
||||
<InputNumber style={{ width: '100%' }} min={0} placeholder="请输入显示排序" />
|
||||
<InputNumber
|
||||
style={{ width: '100%' }}
|
||||
min={0}
|
||||
placeholder="请输入显示排序"
|
||||
/>
|
||||
</Form.Item>
|
||||
|
||||
<Form.Item
|
||||
|
||||
@ -1,14 +1,12 @@
|
||||
import request from '@/utils/request';
|
||||
import type {Page} from '@/types/base/page';
|
||||
import type {MenuResponse, MenuRequest, MenuQuery} from './types';
|
||||
import type { Page } from '@/types/base/page';
|
||||
import type { MenuResponse, MenuRequest } from './types';
|
||||
|
||||
const BASE_URL = '/api/v1/menu';
|
||||
|
||||
// 获取菜单列表(分页)
|
||||
export const getMenus = (params?: MenuQuery) =>
|
||||
request.get<Page<MenuResponse>>(`${BASE_URL}/page`, {
|
||||
params
|
||||
});
|
||||
export const getMenus = (params?: any) =>
|
||||
request.get<Page<MenuResponse>>(`${BASE_URL}/page`, { params });
|
||||
|
||||
// 获取菜单树
|
||||
export const getMenuTree = () =>
|
||||
@ -19,21 +17,14 @@ export const getCurrentUserMenus = () => {
|
||||
return request.get<MenuResponse[]>(`${BASE_URL}/current`);
|
||||
}
|
||||
|
||||
|
||||
// 创建菜单
|
||||
export const createMenu = (data: MenuRequest) =>
|
||||
request.post<MenuResponse>(BASE_URL, data, {
|
||||
successMessage: '创建菜单成功'
|
||||
});
|
||||
request.post<MenuResponse>(BASE_URL, data);
|
||||
|
||||
// 更新菜单
|
||||
export const updateMenu = (id: number, data: MenuRequest) =>
|
||||
request.put<MenuResponse>(`${BASE_URL}/${id}`, data, {
|
||||
successMessage: '更新菜单成功'
|
||||
});
|
||||
request.put<MenuResponse>(`${BASE_URL}/${id}`, data);
|
||||
|
||||
// 删除菜单
|
||||
export const deleteMenu = (id: number) =>
|
||||
request.delete(`${BASE_URL}/${id}`, {
|
||||
successMessage: '删除菜单成功'
|
||||
});
|
||||
request.delete(`${BASE_URL}/${id}`);
|
||||
@ -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 = () => {
|
||||
|
||||
<Form.Item
|
||||
name="sort"
|
||||
label="排序"
|
||||
rules={[{required: true, message: '请输入排序'}]}
|
||||
label="显示排序"
|
||||
tooltip="值越大排序越靠后,默认为当前最大值+1"
|
||||
rules={[{ required: true, message: '请输入排序' }]}
|
||||
>
|
||||
<InputNumber style={{width: '100%'}} min={0} placeholder="请输入排序"/>
|
||||
<InputNumber
|
||||
style={{ width: '100%' }}
|
||||
min={0}
|
||||
placeholder="请输入排序"
|
||||
/>
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</Modal>
|
||||
|
||||
@ -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<UserResponse | null>(null);
|
||||
const [form] = 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 = () => {
|
||||
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 = () => {
|
||||
>
|
||||
删除
|
||||
</Button>
|
||||
<Button
|
||||
type="link"
|
||||
size="small"
|
||||
icon={<TeamOutlined/>}
|
||||
onClick={() => handleAssignRoles(record)}
|
||||
disabled={record.username === 'admin'}
|
||||
>
|
||||
分配角色
|
||||
</Button>
|
||||
</Space>
|
||||
),
|
||||
},
|
||||
@ -220,7 +252,7 @@ const UserPage: React.FC = () => {
|
||||
filters: Record<string, FilterValue | null>,
|
||||
sorter: SorterResult<UserResponse> | SorterResult<UserResponse>[]
|
||||
) => {
|
||||
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 = () => {
|
||||
</Form.Item>
|
||||
</Form>
|
||||
</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>
|
||||
);
|
||||
};
|
||||
|
||||
@ -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<Page<UserResponse>>(`${BASE_URL}/page`, {
|
||||
params
|
||||
});
|
||||
request.get<Page<UserResponse>>(`${BASE_URL}/page`, { params });
|
||||
|
||||
// 创建用户
|
||||
export const createUser = (data: UserRequest) =>
|
||||
request.post<UserResponse>(BASE_URL, data, {
|
||||
successMessage: '创建用户成功'
|
||||
});
|
||||
request.post<UserResponse>(BASE_URL, data);
|
||||
|
||||
// 更新用户
|
||||
export const updateUser = (id: number, data: UserRequest) =>
|
||||
request.put<UserResponse>(`${BASE_URL}/${id}`, data, {
|
||||
successMessage: '更新用户成功'
|
||||
});
|
||||
request.put<UserResponse>(`${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<RoleResponse[]>(`${ROLE_BASE_URL}/list`);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user