Some checks failed
Build and Deploy (admin.xpcool.com) / build-and-deploy (push) Failing after 1h0m4s
227 lines
5.6 KiB
TypeScript
227 lines
5.6 KiB
TypeScript
import { requestClient } from '#/api/request';
|
||
|
||
// ---------- 管理员(/api/service/admin/admin) ----------
|
||
export interface AdminItem {
|
||
id: number;
|
||
username: string;
|
||
nickname: string;
|
||
status: number;
|
||
roleIds: number[];
|
||
roleNames: string[];
|
||
createdAt: string;
|
||
}
|
||
|
||
export interface AdminListResp {
|
||
list: AdminItem[];
|
||
total: number;
|
||
}
|
||
|
||
export function getAdminList(data: {
|
||
keyword?: string;
|
||
page: number;
|
||
size: number;
|
||
}) {
|
||
return requestClient.post<AdminListResp>(
|
||
'/api/service/admin/admin/list',
|
||
data,
|
||
);
|
||
}
|
||
|
||
export function createAdmin(data: {
|
||
nickname: string;
|
||
password: string;
|
||
roleIds: number[];
|
||
username: string;
|
||
}) {
|
||
return requestClient.post<{ id: number }>(
|
||
'/api/service/admin/admin/create',
|
||
data,
|
||
);
|
||
}
|
||
|
||
export function updateAdmin(
|
||
id: number,
|
||
data: { nickname: string; roleIds: number[]; status: number; },
|
||
) {
|
||
return requestClient.post(`/api/service/admin/admin/update/${id}`, data);
|
||
}
|
||
|
||
export function resetAdminPassword(id: number, password: string) {
|
||
return requestClient.post(`/api/service/admin/admin/resetPwd/${id}`, {
|
||
password,
|
||
});
|
||
}
|
||
|
||
export function deleteAdmin(id: number) {
|
||
return requestClient.post(`/api/service/admin/admin/delete/${id}`);
|
||
}
|
||
|
||
// ---------- 角色(/api/service/admin/system/role) ----------
|
||
export interface RoleItem {
|
||
id: number;
|
||
code: string;
|
||
name: string;
|
||
status: number;
|
||
menuIds: number[];
|
||
createdAt: string;
|
||
}
|
||
|
||
export interface RoleListResp {
|
||
list: RoleItem[];
|
||
total: number;
|
||
}
|
||
|
||
export function getRoleList(data: {
|
||
keyword?: string;
|
||
page: number;
|
||
size: number;
|
||
}) {
|
||
return requestClient.post<RoleListResp>(
|
||
'/api/service/admin/system/role/list',
|
||
data,
|
||
);
|
||
}
|
||
|
||
export function createRole(data: {
|
||
code: string;
|
||
menuIds: number[];
|
||
name: string;
|
||
status: number;
|
||
}) {
|
||
return requestClient.post<{ id: number }>(
|
||
'/api/service/admin/system/role/create',
|
||
data,
|
||
);
|
||
}
|
||
|
||
export function updateRole(
|
||
id: number,
|
||
data: { menuIds: number[]; name: string; status: number; },
|
||
) {
|
||
return requestClient.post(
|
||
`/api/service/admin/system/role/update/${id}`,
|
||
data,
|
||
);
|
||
}
|
||
|
||
export function deleteRole(id: number) {
|
||
return requestClient.post(`/api/service/admin/system/role/delete/${id}`);
|
||
}
|
||
|
||
// ---------- 菜单(/api/service/admin/system/menu) ----------
|
||
export interface MenuNode {
|
||
id: number;
|
||
parentId: number;
|
||
name: string;
|
||
icon: string;
|
||
type: number;
|
||
path: string;
|
||
component: string;
|
||
permission: string;
|
||
sort: number;
|
||
status: number;
|
||
hidden: boolean;
|
||
children?: MenuNode[];
|
||
}
|
||
|
||
export function getMenuTree() {
|
||
return requestClient.post<{ tree: MenuNode[] }>(
|
||
'/api/service/admin/system/menu/tree',
|
||
);
|
||
}
|
||
|
||
export function createMenu(data: Partial<MenuNode>) {
|
||
return requestClient.post<{ id: number }>(
|
||
'/api/service/admin/system/menu/create',
|
||
data,
|
||
);
|
||
}
|
||
|
||
export function updateMenu(id: number, data: Partial<MenuNode>) {
|
||
return requestClient.post(
|
||
`/api/service/admin/system/menu/update/${id}`,
|
||
data,
|
||
);
|
||
}
|
||
|
||
export function deleteMenu(id: number) {
|
||
return requestClient.post(`/api/service/admin/system/menu/delete/${id}`);
|
||
}
|
||
|
||
// ---------- 操作日志(/api/service/admin/system/log) ----------
|
||
// 注意:接口规范为全部 POST、URL 不带参数、入参走 body。
|
||
export interface LogItem {
|
||
id: number;
|
||
adminId: number;
|
||
adminUsername: string; // 操作账号(写入时冗余落库,免 JOIN)
|
||
permission: string; // 权限标识
|
||
method: string; // HTTP 方法
|
||
path: string; // 请求路径
|
||
ip: string; // 来源 IP
|
||
ipLocation: string; // IP 归属地(如「中国 江苏省 苏州市 电信」)
|
||
param: string; // 请求参数(已脱敏)
|
||
durationMs: number; // 耗时(ms)
|
||
statusCode: number; // HTTP 状态码
|
||
errorMessage: string; // 失败原因(响应非 2xx 时填充)
|
||
userAgent: string; // 浏览器 UA
|
||
createdAt: string; // 操作时间
|
||
}
|
||
|
||
export interface LogListResp {
|
||
list: LogItem[];
|
||
total: number;
|
||
}
|
||
|
||
// 操作日志分页查询参数;覆盖时间、账号、IP、归属地、方法、结果、耗时、排序等维度。
|
||
export interface LogQuery {
|
||
page: number;
|
||
size: number;
|
||
adminId?: number; // 按管理员ID精确过滤
|
||
username?: string; // 按账号模糊过滤
|
||
ip?: string; // 按来源 IP 模糊过滤
|
||
ipLocation?: string; // 按 IP 归属地模糊过滤
|
||
method?: string; // 按 HTTP 方法精确过滤(GET/POST/PUT/DELETE)
|
||
status?: number; // 0 全部 / 1 成功(2xx) / 2 失败(非2xx)
|
||
keyword?: string; // 权限码/路径/IP 关键字
|
||
startTime?: string; // 起始时间 yyyy-MM-dd HH:mm:ss
|
||
endTime?: string; // 结束时间 yyyy-MM-dd HH:mm:ss
|
||
minDuration?: number; // 耗时下限(ms),0 不限
|
||
maxDuration?: number; // 耗时上限(ms),0 不限
|
||
orderBy?: string; // createdAt(默认) | durationMs
|
||
orderDir?: string; // desc(默认) | asc
|
||
}
|
||
|
||
/** 操作日志分页查询 */
|
||
export function getSystemLogList(data: LogQuery) {
|
||
return requestClient.post<LogListResp>('/api/service/admin/system/log', data);
|
||
}
|
||
|
||
// ---------- 登录日志(/api/service/admin/system/login-log) ----------
|
||
export interface LoginLogItem {
|
||
id: number;
|
||
username: string;
|
||
ip: string;
|
||
userAgent: string;
|
||
status: number; // 1 成功 0 失败
|
||
failReason: string;
|
||
createdAt: string;
|
||
}
|
||
|
||
export interface LoginLogListResp {
|
||
list: LoginLogItem[];
|
||
total: number;
|
||
}
|
||
|
||
/** 登录日志分页查询(username 匹配账号,status 按结果过滤) */
|
||
export function getLoginLogList(data: {
|
||
page: number;
|
||
size: number;
|
||
status?: number;
|
||
username?: string;
|
||
}) {
|
||
return requestClient.post<LoginLogListResp>(
|
||
'/api/service/admin/system/login-log',
|
||
data,
|
||
);
|
||
}
|