feat(product): 新增产品管理模块与字典组件功能
- 新增产品管理相关路由和页面(dashboard、list、requirement、setting) - 实现产品基础信息编辑弹窗组件(base-info-dialog.vue) - 添加运行时字典功能(dict-select、dict-text、dict-tag组件) - 集成字典管理store和API调用 - 规范ID类型定义为string避免精度丢失问题 - 完善国际化资源文件支持中英文对照 - 新增对象上下文业务域入口页导航实现说明 - 添加Vue DevTools浮动入口注释说明 - 统一权限控制支持全局和对象作用域区分 - 规范分页查询参数类型定义与使用方式
This commit is contained in:
@@ -1,6 +1,12 @@
|
||||
import { SYSTEM_SERVICE_PREFIX } from '@/constants/service';
|
||||
import { request } from '../request';
|
||||
import type { ServiceRequestResult } from './shared';
|
||||
import {
|
||||
type ServiceRequestResult,
|
||||
mapServiceResult,
|
||||
normalizeNullableStringId,
|
||||
normalizeStringId,
|
||||
safeJsonRequestConfig
|
||||
} from './shared';
|
||||
import UserManagementRelationQueryReqVO = Api.SystemManage.UserManagementRelationQueryReqVO;
|
||||
|
||||
const ROLE_PREFIX = `${SYSTEM_SERVICE_PREFIX}/role`;
|
||||
@@ -45,10 +51,18 @@ function createRolePageQuery(params?: Api.SystemManage.RoleSearchParams) {
|
||||
}
|
||||
});
|
||||
|
||||
if (params.scopeType) {
|
||||
query.append('scopeType', params.scopeType);
|
||||
}
|
||||
|
||||
if (params.objectType) {
|
||||
query.append('objectType', params.objectType);
|
||||
}
|
||||
|
||||
return query.toString();
|
||||
}
|
||||
|
||||
function createBatchDeleteQuery(ids: number[]) {
|
||||
function createBatchDeleteQuery(ids: Array<string | number>) {
|
||||
const query = new URLSearchParams();
|
||||
|
||||
ids.forEach(id => {
|
||||
@@ -58,39 +72,160 @@ function createBatchDeleteQuery(ids: number[]) {
|
||||
return query.toString();
|
||||
}
|
||||
|
||||
type UserSimpleResponse = Omit<Api.SystemManage.UserSimple, 'id'> & {
|
||||
id: string | number;
|
||||
};
|
||||
|
||||
type RoleResponse = Omit<Api.SystemManage.Role, 'id'> & {
|
||||
id: string | number;
|
||||
};
|
||||
|
||||
type RolePageResponse = Api.SystemManage.PageResult<RoleResponse>;
|
||||
|
||||
type RoleSimpleResponse = Omit<Api.SystemManage.RoleSimple, 'id'> & {
|
||||
id: string | number;
|
||||
};
|
||||
|
||||
type MenuResponse = Omit<Api.SystemManage.Menu, 'id' | 'parentId' | 'children'> & {
|
||||
id: string | number;
|
||||
parentId: string | number;
|
||||
children?: MenuResponse[] | null;
|
||||
};
|
||||
|
||||
type MenuSimpleResponse = Omit<Api.SystemManage.MenuSimple, 'id' | 'parentId' | 'children'> & {
|
||||
id: string | number;
|
||||
parentId: string | number;
|
||||
children?: MenuSimpleResponse[] | null;
|
||||
};
|
||||
|
||||
type UserManagementRelationResponse = Omit<
|
||||
Api.SystemManage.UserManagementRelation,
|
||||
'id' | 'managerUserId' | 'subordinateUserId'
|
||||
> & {
|
||||
id: string | number | null;
|
||||
managerUserId: string | number | null;
|
||||
subordinateUserId: string | number | null;
|
||||
};
|
||||
|
||||
type UserManagementRelationTreeResponse = Omit<
|
||||
Api.SystemManage.UserManagementRelationTreeRespVO,
|
||||
'id' | 'userId' | 'managerUserId' | 'children'
|
||||
> & {
|
||||
id: string | number | null;
|
||||
userId: string | number;
|
||||
managerUserId: string | number | null;
|
||||
children?: UserManagementRelationTreeResponse[] | null;
|
||||
};
|
||||
|
||||
function normalizeUserSimple(user: UserSimpleResponse): Api.SystemManage.UserSimple {
|
||||
return {
|
||||
...user,
|
||||
id: normalizeStringId(user.id)
|
||||
};
|
||||
}
|
||||
|
||||
function normalizeRole(role: RoleResponse): Api.SystemManage.Role {
|
||||
return {
|
||||
...role,
|
||||
id: normalizeStringId(role.id)
|
||||
};
|
||||
}
|
||||
|
||||
function normalizeRoleSimple(role: RoleSimpleResponse): Api.SystemManage.RoleSimple {
|
||||
return {
|
||||
...role,
|
||||
id: normalizeStringId(role.id)
|
||||
};
|
||||
}
|
||||
|
||||
function normalizeMenu(menu: MenuResponse): Api.SystemManage.Menu {
|
||||
return {
|
||||
...menu,
|
||||
id: normalizeStringId(menu.id),
|
||||
parentId: normalizeStringId(menu.parentId),
|
||||
children: menu.children?.map(normalizeMenu) ?? null
|
||||
};
|
||||
}
|
||||
|
||||
function normalizeMenuSimple(menu: MenuSimpleResponse): Api.SystemManage.MenuSimple {
|
||||
return {
|
||||
...menu,
|
||||
id: normalizeStringId(menu.id),
|
||||
parentId: normalizeStringId(menu.parentId),
|
||||
children: menu.children?.map(normalizeMenuSimple) ?? null
|
||||
};
|
||||
}
|
||||
|
||||
function normalizeUserManagementRelation(
|
||||
relation: UserManagementRelationResponse
|
||||
): Api.SystemManage.UserManagementRelation {
|
||||
return {
|
||||
...relation,
|
||||
id: normalizeNullableStringId(relation.id),
|
||||
managerUserId: normalizeNullableStringId(relation.managerUserId),
|
||||
subordinateUserId: normalizeNullableStringId(relation.subordinateUserId)
|
||||
};
|
||||
}
|
||||
|
||||
function normalizeUserManagementRelationTree(
|
||||
relation: UserManagementRelationTreeResponse
|
||||
): Api.SystemManage.UserManagementRelationTreeRespVO {
|
||||
return {
|
||||
...relation,
|
||||
id: normalizeNullableStringId(relation.id),
|
||||
userId: normalizeStringId(relation.userId),
|
||||
managerUserId: normalizeNullableStringId(relation.managerUserId),
|
||||
children: relation.children?.map(normalizeUserManagementRelationTree) ?? null
|
||||
};
|
||||
}
|
||||
|
||||
/** 获取角色分页 */
|
||||
export function fetchGetRolePage(params?: Api.SystemManage.RoleSearchParams) {
|
||||
export async function fetchGetRolePage(params?: Api.SystemManage.RoleSearchParams) {
|
||||
const query = createRolePageQuery(params);
|
||||
|
||||
return request<Api.SystemManage.RoleList>({
|
||||
const result = await request<RolePageResponse>({
|
||||
...safeJsonRequestConfig,
|
||||
url: query ? `${ROLE_PREFIX}/page?${query}` : `${ROLE_PREFIX}/page`,
|
||||
method: 'get'
|
||||
});
|
||||
|
||||
return mapServiceResult(result as ServiceRequestResult<RolePageResponse>, data => ({
|
||||
...data,
|
||||
list: data.list.map(normalizeRole)
|
||||
}));
|
||||
}
|
||||
|
||||
/** 为兼容旧代码保留原函数名 */
|
||||
export const fetchGetRoleList = fetchGetRolePage;
|
||||
|
||||
/** 获取角色详情 */
|
||||
export function fetchGetRole(id: number) {
|
||||
return request<Api.SystemManage.Role>({
|
||||
export async function fetchGetRole(id: string) {
|
||||
const result = await request<RoleResponse>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${ROLE_PREFIX}/get`,
|
||||
method: 'get',
|
||||
params: { id }
|
||||
});
|
||||
|
||||
return mapServiceResult(result as ServiceRequestResult<RoleResponse>, normalizeRole);
|
||||
}
|
||||
|
||||
/** 创建角色 */
|
||||
export function fetchCreateRole(data: Api.SystemManage.SaveRoleParams) {
|
||||
return request<number>({
|
||||
export async function fetchCreateRole(data: Api.SystemManage.SaveRoleParams) {
|
||||
const result = await request<string | number>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${ROLE_PREFIX}/create`,
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
|
||||
return mapServiceResult(result as ServiceRequestResult<string | number>, normalizeStringId);
|
||||
}
|
||||
|
||||
/** 更新角色 */
|
||||
export function fetchUpdateRole(data: { id: number } & Api.SystemManage.SaveRoleParams) {
|
||||
export function fetchUpdateRole(
|
||||
data: { id: string } & Omit<Api.SystemManage.SaveRoleParams, 'scopeType' | 'objectType'>
|
||||
) {
|
||||
return request<boolean>({
|
||||
url: `${ROLE_PREFIX}/update`,
|
||||
method: 'put',
|
||||
@@ -99,7 +234,7 @@ export function fetchUpdateRole(data: { id: number } & Api.SystemManage.SaveRole
|
||||
}
|
||||
|
||||
/** 删除角色 */
|
||||
export function fetchDeleteRole(id: number) {
|
||||
export function fetchDeleteRole(id: string) {
|
||||
return request<boolean>({
|
||||
url: `${ROLE_PREFIX}/delete`,
|
||||
method: 'delete',
|
||||
@@ -108,7 +243,7 @@ export function fetchDeleteRole(id: number) {
|
||||
}
|
||||
|
||||
/** 批量删除角色 */
|
||||
export function fetchBatchDeleteRole(ids: number[]) {
|
||||
export function fetchBatchDeleteRole(ids: string[]) {
|
||||
return request<boolean>({
|
||||
url: `${ROLE_PREFIX}/delete-list?${createBatchDeleteQuery(ids)}`,
|
||||
method: 'delete'
|
||||
@@ -121,7 +256,8 @@ export function fetchBatchDeleteRole(ids: number[]) {
|
||||
* 为当前用户页面保留 `roleName / roleCode` 字段,直到该页面完成重构
|
||||
*/
|
||||
export async function fetchGetAllRoles(): Promise<ServiceRequestResult<Api.SystemManage.AllRole[]>> {
|
||||
const result = await request<Api.SystemManage.RoleSimpleList>({
|
||||
const result = await request<RoleSimpleResponse[]>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${ROLE_PREFIX}/simple-list`,
|
||||
method: 'get'
|
||||
});
|
||||
@@ -132,20 +268,28 @@ export async function fetchGetAllRoles(): Promise<ServiceRequestResult<Api.Syste
|
||||
|
||||
return {
|
||||
...result,
|
||||
data: result.data.map(item => ({
|
||||
...item,
|
||||
roleName: item.name,
|
||||
roleCode: item.code
|
||||
}))
|
||||
data: result.data.map(item => {
|
||||
const role = normalizeRoleSimple(item);
|
||||
|
||||
return {
|
||||
...role,
|
||||
roleName: role.name,
|
||||
roleCode: role.code
|
||||
};
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
/** 获取启用状态的角色简表 */
|
||||
export function fetchGetRoleSimpleList() {
|
||||
return request<Api.SystemManage.RoleSimpleList>({
|
||||
export async function fetchGetRoleSimpleList(params?: Api.SystemManage.ScopeQueryParams) {
|
||||
const result = await request<RoleSimpleResponse[]>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${ROLE_PREFIX}/simple-list`,
|
||||
method: 'get'
|
||||
method: 'get',
|
||||
params
|
||||
});
|
||||
|
||||
return mapServiceResult(result as ServiceRequestResult<RoleSimpleResponse[]>, data => data.map(normalizeRoleSimple));
|
||||
}
|
||||
|
||||
/** 获取部门列表 */
|
||||
@@ -300,10 +444,13 @@ export function fetchBatchDeletePost(ids: number[]) {
|
||||
|
||||
/** 获取用户简单列表(用于用户选择下拉框) */
|
||||
export function fetchGetUserSimpleList() {
|
||||
return request<Api.SystemManage.UserSimple[]>({
|
||||
return request<UserSimpleResponse[]>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${USER_PREFIX}/simple-list`,
|
||||
method: 'get'
|
||||
});
|
||||
}).then(result =>
|
||||
mapServiceResult(result as ServiceRequestResult<UserSimpleResponse[]>, data => data.map(normalizeUserSimple))
|
||||
);
|
||||
}
|
||||
|
||||
/** 获取用户分页 */
|
||||
@@ -320,11 +467,14 @@ export const fetchGetUserList = fetchGetUserPage;
|
||||
|
||||
/** 通过部门id获取用户详情 */
|
||||
export function fetchGetUserListByDeptId(deptId: any) {
|
||||
return request<Api.SystemManage.UserSimple[]>({
|
||||
return request<UserSimpleResponse[]>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${USER_PREFIX}/list-by-dept-id`,
|
||||
method: 'get',
|
||||
params: { deptId }
|
||||
});
|
||||
}).then(result =>
|
||||
mapServiceResult(result as ServiceRequestResult<UserSimpleResponse[]>, data => data.map(normalizeUserSimple))
|
||||
);
|
||||
}
|
||||
|
||||
/** 获取用户详情 */
|
||||
@@ -390,34 +540,45 @@ export function fetchBatchDeleteUser(ids: number[]) {
|
||||
}
|
||||
|
||||
/** 获取菜单列表 */
|
||||
export function fetchGetMenuList(params?: Api.SystemManage.MenuSearchParams) {
|
||||
return request<Api.SystemManage.MenuList>({
|
||||
export async function fetchGetMenuList(params?: Api.SystemManage.MenuSearchParams) {
|
||||
const result = await request<MenuResponse[]>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${MENU_PREFIX}/list`,
|
||||
method: 'get',
|
||||
params
|
||||
});
|
||||
|
||||
return mapServiceResult(result as ServiceRequestResult<MenuResponse[]>, data => data.map(normalizeMenu));
|
||||
}
|
||||
|
||||
/** 获取菜单详情 */
|
||||
export function fetchGetMenu(id: number) {
|
||||
return request<Api.SystemManage.Menu>({
|
||||
export async function fetchGetMenu(id: string) {
|
||||
const result = await request<MenuResponse>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${MENU_PREFIX}/get`,
|
||||
method: 'get',
|
||||
params: { id }
|
||||
});
|
||||
|
||||
return mapServiceResult(result as ServiceRequestResult<MenuResponse>, normalizeMenu);
|
||||
}
|
||||
|
||||
/** 创建菜单 */
|
||||
export function fetchCreateMenu(data: Api.SystemManage.SaveMenuParams) {
|
||||
return request<number>({
|
||||
export async function fetchCreateMenu(data: Api.SystemManage.SaveMenuParams) {
|
||||
const result = await request<string | number>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${MENU_PREFIX}/create`,
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
|
||||
return mapServiceResult(result as ServiceRequestResult<string | number>, normalizeStringId);
|
||||
}
|
||||
|
||||
/** 更新菜单 */
|
||||
export function fetchUpdateMenu(data: { id: number } & Api.SystemManage.SaveMenuParams) {
|
||||
export function fetchUpdateMenu(
|
||||
data: { id: string } & Omit<Api.SystemManage.SaveMenuParams, 'scopeType' | 'objectType'>
|
||||
) {
|
||||
return request<boolean>({
|
||||
url: `${MENU_PREFIX}/update`,
|
||||
method: 'put',
|
||||
@@ -426,7 +587,7 @@ export function fetchUpdateMenu(data: { id: number } & Api.SystemManage.SaveMenu
|
||||
}
|
||||
|
||||
/** 删除菜单 */
|
||||
export function fetchDeleteMenu(id: number) {
|
||||
export function fetchDeleteMenu(id: string) {
|
||||
return request<boolean>({
|
||||
url: `${MENU_PREFIX}/delete`,
|
||||
method: 'delete',
|
||||
@@ -435,7 +596,7 @@ export function fetchDeleteMenu(id: number) {
|
||||
}
|
||||
|
||||
/** 批量删除菜单 */
|
||||
export function fetchBatchDeleteMenu(ids: number[]) {
|
||||
export function fetchBatchDeleteMenu(ids: string[]) {
|
||||
return request<boolean>({
|
||||
url: `${MENU_PREFIX}/delete-list?${createBatchDeleteQuery(ids)}`,
|
||||
method: 'delete'
|
||||
@@ -443,20 +604,27 @@ export function fetchBatchDeleteMenu(ids: number[]) {
|
||||
}
|
||||
|
||||
/** 获取启用状态的菜单简表 */
|
||||
export function fetchGetMenuSimpleList() {
|
||||
return request<Api.SystemManage.MenuSimpleList>({
|
||||
export async function fetchGetMenuSimpleList(params?: Api.SystemManage.ScopeQueryParams) {
|
||||
const result = await request<MenuSimpleResponse[]>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${MENU_PREFIX}/simple-list`,
|
||||
method: 'get'
|
||||
method: 'get',
|
||||
params
|
||||
});
|
||||
|
||||
return mapServiceResult(result as ServiceRequestResult<MenuSimpleResponse[]>, data => data.map(normalizeMenuSimple));
|
||||
}
|
||||
|
||||
/** 获取角色关联的菜单 ID 列表 */
|
||||
export function fetchGetRoleMenuIds(roleId: number) {
|
||||
return request<number[]>({
|
||||
export async function fetchGetRoleMenuIds(roleId: string) {
|
||||
const result = await request<Array<string | number>>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${PERMISSION_PREFIX}/list-role-menus`,
|
||||
method: 'get',
|
||||
params: { roleId }
|
||||
});
|
||||
|
||||
return mapServiceResult(result as ServiceRequestResult<Array<string | number>>, data => data.map(normalizeStringId));
|
||||
}
|
||||
|
||||
/** 分配角色菜单 */
|
||||
@@ -469,12 +637,15 @@ export function fetchAssignRoleMenus(data: Api.SystemManage.AssignRoleMenuParams
|
||||
}
|
||||
|
||||
/** 获取用户关联的角色 ID 列表 */
|
||||
export function fetchGetUserRoleIds(userId: number) {
|
||||
return request<number[]>({
|
||||
export async function fetchGetUserRoleIds(userId: number) {
|
||||
const result = await request<Array<string | number>>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${PERMISSION_PREFIX}/list-user-roles`,
|
||||
method: 'get',
|
||||
params: { userId }
|
||||
});
|
||||
|
||||
return mapServiceResult(result as ServiceRequestResult<Array<string | number>>, data => data.map(normalizeStringId));
|
||||
}
|
||||
|
||||
/** 分配用户角色 */
|
||||
@@ -497,11 +668,16 @@ export function fetchAssignUserRoles(data: Api.SystemManage.AssignUserRoleParams
|
||||
* - 叶子节点:基层员工,没有下级
|
||||
*/
|
||||
export function fetchGetUserManagementRelationTree(query: UserManagementRelationQueryReqVO) {
|
||||
return request<Api.SystemManage.UserManagementRelationTreeRespVO[]>({
|
||||
return request<UserManagementRelationTreeResponse[]>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${USER_MANAGEMENT_RELATION_PREFIX}/tree`,
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}).then(result =>
|
||||
mapServiceResult(result as ServiceRequestResult<UserManagementRelationTreeResponse[]>, data =>
|
||||
data.map(normalizeUserManagementRelationTree)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -509,11 +685,16 @@ export function fetchGetUserManagementRelationTree(query: UserManagementRelation
|
||||
* 用于树形控件展示,包含用户的上下级层级关系
|
||||
*/
|
||||
export function fetchGetUserManagementRelationQuery(query: UserManagementRelationQueryReqVO) {
|
||||
return request<Api.SystemManage.UserManagementRelationTreeRespVO[]>({
|
||||
return request<UserManagementRelationTreeResponse[]>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${USER_MANAGEMENT_RELATION_PREFIX}/query`,
|
||||
method: 'get',
|
||||
params: query
|
||||
});
|
||||
}).then(result =>
|
||||
mapServiceResult(result as ServiceRequestResult<UserManagementRelationTreeResponse[]>, data =>
|
||||
data.map(normalizeUserManagementRelationTree)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -523,12 +704,15 @@ export function fetchGetUserManagementRelationQuery(query: UserManagementRelatio
|
||||
*
|
||||
* @param id 关系记录主键 ID
|
||||
*/
|
||||
export function fetchGetUserManagementRelation(id: number) {
|
||||
return request<Api.SystemManage.UserManagementRelation>({
|
||||
export function fetchGetUserManagementRelation(id: string) {
|
||||
return request<UserManagementRelationResponse>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${USER_MANAGEMENT_RELATION_PREFIX}/get`,
|
||||
method: 'get',
|
||||
params: { id }
|
||||
});
|
||||
}).then(result =>
|
||||
mapServiceResult(result as ServiceRequestResult<UserManagementRelationResponse>, normalizeUserManagementRelation)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -539,11 +723,12 @@ export function fetchGetUserManagementRelation(id: number) {
|
||||
* @param data 创建请求参数
|
||||
*/
|
||||
export function fetchCreateUserManagementRelation(data: Api.SystemManage.UserManagementRelationSaveReqVO) {
|
||||
return request<number>({
|
||||
return request<string | number>({
|
||||
...safeJsonRequestConfig,
|
||||
url: `${USER_MANAGEMENT_RELATION_PREFIX}/create`,
|
||||
method: 'post',
|
||||
data
|
||||
});
|
||||
}).then(result => mapServiceResult(result as ServiceRequestResult<string | number>, normalizeStringId));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -554,7 +739,7 @@ export function fetchCreateUserManagementRelation(data: Api.SystemManage.UserMan
|
||||
* @param data 更新请求参数(包含 id)
|
||||
*/
|
||||
export function fetchUpdateUserManagementRelation(
|
||||
data: { id: number } & Api.SystemManage.UserManagementRelationSaveReqVO
|
||||
data: { id: string } & Api.SystemManage.UserManagementRelationSaveReqVO
|
||||
) {
|
||||
return request<boolean>({
|
||||
url: `${USER_MANAGEMENT_RELATION_PREFIX}/update`,
|
||||
@@ -570,7 +755,7 @@ export function fetchUpdateUserManagementRelation(
|
||||
*
|
||||
* @param id 关系记录主键 ID
|
||||
*/
|
||||
export function fetchDeleteUserManagementRelation(id: number | null) {
|
||||
export function fetchDeleteUserManagementRelation(id: string | null) {
|
||||
return request<boolean>({
|
||||
url: `${USER_MANAGEMENT_RELATION_PREFIX}/delete`,
|
||||
method: 'delete',
|
||||
@@ -585,7 +770,7 @@ export function fetchDeleteUserManagementRelation(id: number | null) {
|
||||
*
|
||||
* @param ids 关系记录主键 ID 列表
|
||||
*/
|
||||
export function fetchBatchDeleteUserManagementRelation(ids: number[]) {
|
||||
export function fetchBatchDeleteUserManagementRelation(ids: string[]) {
|
||||
return request<boolean>({
|
||||
url: `${USER_MANAGEMENT_RELATION_PREFIX}/delete-list?${createBatchDeleteQuery(ids)}`,
|
||||
method: 'delete'
|
||||
|
||||
Reference in New Issue
Block a user