可正常启用
This commit is contained in:
parent
c19b27e9d9
commit
9c949fe5c7
@ -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
|
||||||
|
|||||||
@ -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: '删除菜单成功'
|
|
||||||
});
|
|
||||||
@ -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="显示排序"
|
||||||
|
tooltip="值越大排序越靠后,默认为当前最大值+1"
|
||||||
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>
|
</Form>
|
||||||
</Modal>
|
</Modal>
|
||||||
|
|||||||
@ -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>
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
@ -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>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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`);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user