可正常启用

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,
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

View File

@ -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 { 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}`);

View File

@ -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="排序"
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>

View File

@ -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>
),
},
@ -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>
);
};

View File

@ -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`);