181 lines
5.3 KiB
TypeScript
181 lines
5.3 KiB
TypeScript
import { Hono } from "hono";
|
|
import debug from "debug";
|
|
import {
|
|
DeleteStatus,
|
|
} from "../client/share/types.ts";
|
|
|
|
import type { Variables, WithAuth } from "./app.tsx";
|
|
|
|
const log = {
|
|
api: debug("api:sys"),
|
|
};
|
|
|
|
|
|
// 创建图表数据路由
|
|
export function createChartRoutes(withAuth: WithAuth) {
|
|
const chartRoutes = new Hono<{ Variables: Variables }>();
|
|
|
|
// 获取用户活跃度图表数据
|
|
chartRoutes.get("/user-activity", withAuth, async (c) => {
|
|
try {
|
|
const apiClient = c.get('apiClient');
|
|
|
|
// 获取过去30天的数据
|
|
const days = 30;
|
|
const result = [];
|
|
|
|
// 当前日期
|
|
const currentDate = new Date();
|
|
|
|
// 生成过去30天的日期范围
|
|
for (let i = days - 1; i >= 0; i--) {
|
|
const date = new Date();
|
|
date.setDate(currentDate.getDate() - i);
|
|
|
|
// 格式化日期为 YYYY-MM-DD
|
|
const formattedDate = `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
|
|
|
|
// 查询当天的登录次数
|
|
const loginCount = await apiClient.database
|
|
.table('login_history')
|
|
.whereRaw(`DATE(login_time) = ?`, [formattedDate])
|
|
.count();
|
|
|
|
result.push({
|
|
date: formattedDate,
|
|
count: Number(loginCount),
|
|
});
|
|
}
|
|
|
|
return c.json({
|
|
message: "获取用户活跃度数据成功",
|
|
data: result,
|
|
});
|
|
} catch (error) {
|
|
log.api("获取用户活跃度数据失败:", error);
|
|
return c.json({ error: "获取用户活跃度数据失败" }, 500);
|
|
}
|
|
});
|
|
|
|
// 获取文件上传统计图表数据
|
|
chartRoutes.get("/file-uploads", withAuth, async (c) => {
|
|
try {
|
|
const apiClient = c.get('apiClient');
|
|
|
|
// 获取过去12个月的数据
|
|
const months = 12;
|
|
const result = [];
|
|
|
|
// 当前日期
|
|
const currentDate = new Date();
|
|
|
|
// 生成过去12个月的月份范围
|
|
for (let i = months - 1; i >= 0; i--) {
|
|
const date = new Date();
|
|
date.setMonth(currentDate.getMonth() - i);
|
|
|
|
// 获取年月
|
|
const year = date.getFullYear();
|
|
const month = date.getMonth() + 1;
|
|
|
|
// 月份标签
|
|
const monthLabel = `${year}-${String(month).padStart(2, '0')}`;
|
|
|
|
// 查询当月的文件上传数量
|
|
const fileCount = await apiClient.database
|
|
.table('file_library')
|
|
.whereRaw(`YEAR(created_at) = ? AND MONTH(created_at) = ?`, [year, month])
|
|
.count();
|
|
|
|
result.push({
|
|
month: monthLabel,
|
|
count: Number(fileCount),
|
|
});
|
|
}
|
|
|
|
return c.json({
|
|
message: "获取文件上传统计数据成功",
|
|
data: result,
|
|
});
|
|
} catch (error) {
|
|
log.api("获取文件上传统计数据失败:", error);
|
|
return c.json({ error: "获取文件上传统计数据失败" }, 500);
|
|
}
|
|
});
|
|
|
|
// 获取文件类型分布图表数据
|
|
chartRoutes.get("/file-types", withAuth, async (c) => {
|
|
try {
|
|
const apiClient = c.get('apiClient');
|
|
|
|
// 查询不同文件类型的数量
|
|
const fileTypeStats = await apiClient.database
|
|
.table('file_library')
|
|
.select('file_type',apiClient.database.raw('count(id) as count'))
|
|
.where('is_deleted', DeleteStatus.NOT_DELETED)
|
|
.groupBy('file_type');
|
|
|
|
// 将结果转换为饼图所需格式
|
|
const result = fileTypeStats.map(item => ({
|
|
type: item.file_type || '未知',
|
|
value: Number(item.count),
|
|
}));
|
|
|
|
return c.json({
|
|
message: "获取文件类型分布数据成功",
|
|
data: result,
|
|
});
|
|
} catch (error) {
|
|
log.api("获取文件类型分布数据失败:", error);
|
|
return c.json({ error: "获取文件类型分布数据失败" }, 500);
|
|
}
|
|
});
|
|
|
|
// 获取仪表盘概览数据
|
|
chartRoutes.get("/dashboard-overview", withAuth, async (c) => {
|
|
try {
|
|
const apiClient = c.get('apiClient');
|
|
|
|
// 获取用户总数
|
|
const userCount = await apiClient.database
|
|
.table('users')
|
|
.where('is_deleted', DeleteStatus.NOT_DELETED)
|
|
.count();
|
|
|
|
// 获取文件总数
|
|
const fileCount = await apiClient.database
|
|
.table('file_library')
|
|
.where('is_deleted', DeleteStatus.NOT_DELETED)
|
|
.count();
|
|
|
|
// 获取知识库文章总数
|
|
const articleCount = await apiClient.database
|
|
.table('know_info')
|
|
.where('is_deleted', DeleteStatus.NOT_DELETED)
|
|
.count();
|
|
|
|
// 获取今日登录次数
|
|
const today = new Date().toISOString().split('T')[0];
|
|
const todayLoginCount = await apiClient.database
|
|
.table('login_history')
|
|
.whereRaw(`DATE(login_time) = ?`, [today])
|
|
.count();
|
|
|
|
return c.json({
|
|
message: "获取仪表盘概览数据成功",
|
|
data: {
|
|
userCount: Number(userCount),
|
|
fileCount: Number(fileCount),
|
|
articleCount: Number(articleCount),
|
|
todayLoginCount: Number(todayLoginCount),
|
|
},
|
|
});
|
|
} catch (error) {
|
|
log.api("获取仪表盘概览数据失败:", error);
|
|
return c.json({ error: "获取仪表盘概览数据失败" }, 500);
|
|
}
|
|
});
|
|
|
|
return chartRoutes;
|
|
}
|