更新AopLogQueryDto中的时间字段类型为OffsetDateTime,优化AopLogRepository中的时间范围查询逻辑,调整前端模拟数据生成器以支持新的时间格式,修复日期选择器样式,优化日志管理页面的用户体验。

This commit is contained in:
Chuck1sn
2025-07-08 14:36:51 +08:00
parent eecc8bedae
commit deece30554
15 changed files with 3258 additions and 3285 deletions

View File

@@ -3,82 +3,86 @@ import { http, HttpResponse } from "msw";
// 生成AOP日志数据
const generateAopLog = () => ({
id: faker.number.int({ min: 1, max: 1000 }),
className: faker.helpers.arrayElement([
"com.example.controller.UserController",
"com.example.service.UserService",
"com.example.controller.RoleController",
"com.example.service.RoleService",
"com.example.controller.DepartmentController",
"com.example.service.DepartmentService",
]),
methodName: faker.helpers.arrayElement([
"findById",
"save",
"update",
"delete",
"findAll",
"findByName",
"pageQuery",
]),
methodArgs: JSON.stringify([
{ name: "id", value: faker.number.int({ min: 1, max: 100 }) },
{ name: "name", value: faker.person.fullName() },
]),
returnValue: JSON.stringify({
id: faker.number.int({ min: 1, max: 100 }),
name: faker.person.fullName(),
success: true,
}),
executionTime: faker.number.int({ min: 10, max: 5000 }),
success: faker.datatype.boolean(0.9), // 90%成功率
errorMessage: faker.helpers.maybe(() => faker.lorem.sentence(), { probability: 0.1 }),
userId: faker.number.int({ min: 1, max: 100 }),
username: faker.internet.userName(),
ipAddress: faker.internet.ip(),
userAgent: faker.internet.userAgent(),
curl: `curl -X GET "${faker.internet.url()}" -H "Authorization: Bearer ${faker.string.alphanumeric(32)}"`,
createTime: faker.date.recent({ days: 30 }).toISOString(),
id: faker.number.int({ min: 1, max: 1000 }),
className: faker.helpers.arrayElement([
"com.example.controller.UserController",
"com.example.service.UserService",
"com.example.controller.RoleController",
"com.example.service.RoleService",
"com.example.controller.DepartmentController",
"com.example.service.DepartmentService",
]),
methodName: faker.helpers.arrayElement([
"findById",
"save",
"update",
"delete",
"findAll",
"findByName",
"pageQuery",
]),
methodArgs: JSON.stringify([
{ name: "id", value: faker.number.int({ min: 1, max: 100 }) },
{ name: "name", value: faker.person.fullName() },
]),
returnValue: JSON.stringify({
id: faker.number.int({ min: 1, max: 100 }),
name: faker.person.fullName(),
success: true,
}),
executionTime: faker.number.int({ min: 10, max: 5000 }),
success: faker.datatype.boolean(0.9), // 90%成功率
errorMessage: faker.helpers.maybe(() => faker.lorem.sentence(), {
probability: 0.1,
}),
userId: faker.number.int({ min: 1, max: 100 }),
username: faker.internet.userName(),
ipAddress: faker.internet.ip(),
userAgent: faker.internet.userAgent(),
curl: `curl -X GET "${faker.internet.url()}" -H "Authorization: Bearer ${faker.string.alphanumeric(32)}"`,
createTime: faker.date.recent({ days: 30 }).toISOString(),
});
export default [
// 分页查询AOP日志
http.get("/aop-log/page-query", () => {
const mockData = {
data: faker.helpers.multiple(generateAopLog, { count: 10 }),
total: 100,
};
return HttpResponse.json(mockData);
}),
// 分页查询AOP日志
http.get("/aop-log/page-query", () => {
const mockData = {
data: faker.helpers.multiple(generateAopLog, { count: 10 }),
total: 100,
};
return HttpResponse.json(mockData);
}),
// 查询单条日志详情
http.get("/aop-log/:id", ({ params }) => {
const id = params.id;
return HttpResponse.json({
...generateAopLog(),
id: Number(id),
});
}),
// 查询单条日志详情
http.get("/aop-log/:id", ({ params }) => {
const id = params.id;
return HttpResponse.json({
...generateAopLog(),
id: Number(id),
});
}),
// 删除单条日志
http.delete("/aop-log/:id", ({ params }) => {
console.log(`Captured a "DELETE /aop-log/${params.id}" request`);
return HttpResponse.json({ success: true });
}),
// 删除单条日志
http.delete("/aop-log/:id", ({ params }) => {
console.log(`Captured a "DELETE /aop-log/${params.id}" request`);
return HttpResponse.json({ success: true });
}),
// 批量删除日志
http.delete("/aop-log/batch", async ({ request }) => {
const ids = await request.json();
console.log(`Captured a "DELETE /aop-log/batch" request with ids: ${ids}`);
return HttpResponse.json(ids.length);
}),
// 批量删除日志
http.delete("/aop-log/batch", async ({ request }) => {
const ids = await request.json();
console.log(`Captured a "DELETE /aop-log/batch" request with ids: ${ids}`);
return HttpResponse.json(ids.length);
}),
// 删除指定时间前的日志
http.delete("/aop-log/before", ({ params }) => {
const { beforeTime } = Object.fromEntries(
new URL(params.request.url).searchParams
);
console.log(`Captured a "DELETE /aop-log/before" request with time: ${beforeTime}`);
return HttpResponse.json(faker.number.int({ min: 5, max: 50 }));
}),
];
// 删除指定时间前的日志
http.delete("/aop-log/before", ({ params }) => {
const { beforeTime } = Object.fromEntries(
new URL(params.request.url).searchParams,
);
console.log(
`Captured a "DELETE /aop-log/before" request with time: ${beforeTime}`,
);
return HttpResponse.json(faker.number.int({ min: 5, max: 50 }));
}),
];

View File

@@ -3,90 +3,95 @@ import { http, HttpResponse } from "msw";
// 生成模拟的知识库数据
const generateLibrary = () => ({
id: faker.number.int({ min: 1, max: 100 }),
name: faker.lorem.words(2),
description: faker.lorem.sentence(),
createTime: faker.date.recent().toISOString()
id: faker.number.int({ min: 1, max: 100 }),
name: faker.lorem.words(2),
description: faker.lorem.sentence(),
createTime: faker.date.recent().toISOString(),
});
// 生成模拟的文档数据
const generateDoc = (libId: number) => ({
id: faker.number.int({ min: 1, max: 1000 }),
libId,
name: faker.system.fileName(),
identify: faker.string.uuid(),
path: faker.system.filePath(),
meta: {},
enable: faker.datatype.boolean(),
status: faker.helpers.arrayElement(["SUCCESS", "INDEXING"]),
createTime: faker.date.recent().toISOString(),
updateTime: faker.date.recent().toISOString()
id: faker.number.int({ min: 1, max: 1000 }),
libId,
name: faker.system.fileName(),
identify: faker.string.uuid(),
path: faker.system.filePath(),
meta: {},
enable: faker.datatype.boolean(),
status: faker.helpers.arrayElement(["SUCCESS", "INDEXING"]),
createTime: faker.date.recent().toISOString(),
updateTime: faker.date.recent().toISOString(),
});
// 生成模拟的文档段落数据
const generateSegment = (docId: number) => ({
id: faker.number.int({ min: 1, max: 10000 }),
docId,
embeddingId: faker.string.uuid(),
content: faker.lorem.paragraphs(),
tokenUsage: faker.number.int({ min: 10, max: 1000 })
id: faker.number.int({ min: 1, max: 10000 }),
docId,
embeddingId: faker.string.uuid(),
content: faker.lorem.paragraphs(),
tokenUsage: faker.number.int({ min: 10, max: 1000 }),
});
export default [
// 获取知识库列表
http.get("/knowledge/libraries", () => {
const libraries = faker.helpers.multiple(generateLibrary, { count: 5 });
return HttpResponse.json(libraries);
}),
// 获取知识库列表
http.get("/knowledge/libraries", () => {
const libraries = faker.helpers.multiple(generateLibrary, { count: 5 });
return HttpResponse.json(libraries);
}),
// 获取文档列表
http.get("/knowledge/docs", ({ request }) => {
const url = new URL(request.url);
const libraryId = Number(url.searchParams.get("libraryId"));
if (Number.isNaN(libraryId)) {
return new HttpResponse(null, { status: 400 });
}
const docs = faker.helpers.multiple(() => generateDoc(libraryId), { count: 8 });
return HttpResponse.json(docs);
}),
// 获取文档列表
http.get("/knowledge/docs", ({ request }) => {
const url = new URL(request.url);
const libraryId = Number(url.searchParams.get("libraryId"));
// 获取文档段落
http.get("/knowledge/segments", ({ request }) => {
const url = new URL(request.url);
const libraryDocId = Number(url.searchParams.get("libraryDocId"));
if (Number.isNaN(libraryDocId)) {
return new HttpResponse(null, { status: 400 });
}
const segments = faker.helpers.multiple(() => generateSegment(libraryDocId), { count: 12 });
return HttpResponse.json(segments);
}),
if (Number.isNaN(libraryId)) {
return new HttpResponse(null, { status: 400 });
}
// 创建/更新知识库
http.post("/knowledge/library", async () => {
return HttpResponse.json({ success: true });
}),
const docs = faker.helpers.multiple(() => generateDoc(libraryId), {
count: 8,
});
return HttpResponse.json(docs);
}),
// 删除知识库
http.delete("/knowledge/library", () => {
return HttpResponse.json({ success: true });
}),
// 获取文档段落
http.get("/knowledge/segments", ({ request }) => {
const url = new URL(request.url);
const libraryDocId = Number(url.searchParams.get("libraryDocId"));
// 更新文档
http.put("/knowledge/doc", async () => {
return HttpResponse.json({ success: true });
}),
if (Number.isNaN(libraryDocId)) {
return new HttpResponse(null, { status: 400 });
}
// 删除文档
http.delete("/knowledge/doc", () => {
return HttpResponse.json({ success: true });
}),
const segments = faker.helpers.multiple(
() => generateSegment(libraryDocId),
{ count: 12 },
);
return HttpResponse.json(segments);
}),
// 上传文档
http.post("/knowledge/doc/upload", async () => {
return HttpResponse.text("upload-success");
}),
];
// 创建/更新知识库
http.post("/knowledge/library", async () => {
return HttpResponse.json({ success: true });
}),
// 删除知识库
http.delete("/knowledge/library", () => {
return HttpResponse.json({ success: true });
}),
// 更新文档
http.put("/knowledge/doc", async () => {
return HttpResponse.json({ success: true });
}),
// 删除文档
http.delete("/knowledge/doc", () => {
return HttpResponse.json({ success: true });
}),
// 上传文档
http.post("/knowledge/doc/upload", async () => {
return HttpResponse.text("upload-success");
}),
];

File diff suppressed because it is too large Load Diff