refactor(analytics): 将时间戳存储从字符串改为数字类型
统一使用数字类型存储时间戳,提高时间处理效率和一致性。修改相关类型定义和格式化函数以支持新旧数据格式。
This commit is contained in:
@@ -97,7 +97,7 @@ export type VisitPageItem = {
|
|||||||
postTitle: string | null;
|
postTitle: string | null;
|
||||||
postUrl: string | null;
|
postUrl: string | null;
|
||||||
pv: number;
|
pv: number;
|
||||||
lastVisitAt: string | null;
|
lastVisitAt: number | null;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type VisitPagesResponse = {
|
export type VisitPagesResponse = {
|
||||||
|
|||||||
@@ -127,13 +127,27 @@ function showToast(msg: string, type: "success" | "error" = "success") {
|
|||||||
}, 2000);
|
}, 2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatTime(value: string | null): string {
|
function formatTime(value: string | number | null | undefined): string {
|
||||||
if (!value) {
|
if (!value) {
|
||||||
return "-";
|
return "-";
|
||||||
}
|
}
|
||||||
const date = new Date(value);
|
let date: Date;
|
||||||
|
if (typeof value === "number") {
|
||||||
|
date = new Date(value);
|
||||||
|
} else {
|
||||||
|
const trimmed = value.trim();
|
||||||
|
if (!trimmed) {
|
||||||
|
return "-";
|
||||||
|
}
|
||||||
|
if (/^\d+$/.test(trimmed)) {
|
||||||
|
const ts = Number(trimmed);
|
||||||
|
date = new Date(ts);
|
||||||
|
} else {
|
||||||
|
date = new Date(trimmed);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (Number.isNaN(date.getTime())) {
|
if (Number.isNaN(date.getTime())) {
|
||||||
return value;
|
return "-";
|
||||||
}
|
}
|
||||||
const y = date.getFullYear();
|
const y = date.getFullYear();
|
||||||
const m = String(date.getMonth() + 1).padStart(2, "0");
|
const m = String(date.getMonth() + 1).padStart(2, "0");
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ export const getVisitOverview = async (
|
|||||||
const domainFilter = rawDomain.trim().toLowerCase();
|
const domainFilter = rawDomain.trim().toLowerCase();
|
||||||
|
|
||||||
await c.env.CWD_DB.prepare(
|
await c.env.CWD_DB.prepare(
|
||||||
'CREATE TABLE IF NOT EXISTS page_stats (id INTEGER PRIMARY KEY AUTOINCREMENT, post_slug TEXT UNIQUE NOT NULL, post_title TEXT, post_url TEXT, pv INTEGER NOT NULL DEFAULT 0, last_visit_at TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL)'
|
'CREATE TABLE IF NOT EXISTS page_stats (id INTEGER PRIMARY KEY AUTOINCREMENT, post_slug TEXT UNIQUE NOT NULL, post_title TEXT, post_url TEXT, pv INTEGER NOT NULL DEFAULT 0, last_visit_at INTEGER, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL)'
|
||||||
).run();
|
).run();
|
||||||
|
|
||||||
await c.env.CWD_DB.prepare(
|
await c.env.CWD_DB.prepare(
|
||||||
@@ -59,7 +59,7 @@ export const getVisitOverview = async (
|
|||||||
post_title: string | null;
|
post_title: string | null;
|
||||||
post_url: string | null;
|
post_url: string | null;
|
||||||
pv: number;
|
pv: number;
|
||||||
last_visit_at: string | null;
|
last_visit_at: number | null;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
let totalPv = 0;
|
let totalPv = 0;
|
||||||
@@ -150,7 +150,7 @@ export const getVisitPages = async (c: Context<{ Bindings: Bindings }>) => {
|
|||||||
const domainFilter = rawDomain.trim().toLowerCase();
|
const domainFilter = rawDomain.trim().toLowerCase();
|
||||||
|
|
||||||
await c.env.CWD_DB.prepare(
|
await c.env.CWD_DB.prepare(
|
||||||
'CREATE TABLE IF NOT EXISTS page_stats (id INTEGER PRIMARY KEY AUTOINCREMENT, post_slug TEXT UNIQUE NOT NULL, post_title TEXT, post_url TEXT, pv INTEGER NOT NULL DEFAULT 0, last_visit_at TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL)'
|
'CREATE TABLE IF NOT EXISTS page_stats (id INTEGER PRIMARY KEY AUTOINCREMENT, post_slug TEXT UNIQUE NOT NULL, post_title TEXT, post_url TEXT, pv INTEGER NOT NULL DEFAULT 0, last_visit_at INTEGER, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL)'
|
||||||
).run();
|
).run();
|
||||||
|
|
||||||
const { results } = await c.env.CWD_DB.prepare(
|
const { results } = await c.env.CWD_DB.prepare(
|
||||||
@@ -160,7 +160,7 @@ export const getVisitPages = async (c: Context<{ Bindings: Bindings }>) => {
|
|||||||
post_title: string | null;
|
post_title: string | null;
|
||||||
post_url: string | null;
|
post_url: string | null;
|
||||||
pv: number;
|
pv: number;
|
||||||
last_visit_at: string | null;
|
last_visit_at: number | null;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
const items: VisitPageItem[] = [];
|
const items: VisitPageItem[] = [];
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ export const trackVisit = async (c: Context<{ Bindings: Bindings }>) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await c.env.CWD_DB.prepare(
|
await c.env.CWD_DB.prepare(
|
||||||
'CREATE TABLE IF NOT EXISTS page_stats (id INTEGER PRIMARY KEY AUTOINCREMENT, post_slug TEXT UNIQUE NOT NULL, post_title TEXT, post_url TEXT, pv INTEGER NOT NULL DEFAULT 0, last_visit_at TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL)'
|
'CREATE TABLE IF NOT EXISTS page_stats (id INTEGER PRIMARY KEY AUTOINCREMENT, post_slug TEXT UNIQUE NOT NULL, post_title TEXT, post_url TEXT, pv INTEGER NOT NULL DEFAULT 0, last_visit_at INTEGER, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL)'
|
||||||
).run();
|
).run();
|
||||||
|
|
||||||
await c.env.CWD_DB.prepare(
|
await c.env.CWD_DB.prepare(
|
||||||
@@ -47,6 +47,7 @@ export const trackVisit = async (c: Context<{ Bindings: Bindings }>) => {
|
|||||||
).run();
|
).run();
|
||||||
|
|
||||||
const nowDate = new Date();
|
const nowDate = new Date();
|
||||||
|
const nowTs = nowDate.getTime();
|
||||||
const nowIso = nowDate.toISOString();
|
const nowIso = nowDate.toISOString();
|
||||||
const today = nowIso.slice(0, 10);
|
const today = nowIso.slice(0, 10);
|
||||||
|
|
||||||
@@ -70,9 +71,9 @@ export const trackVisit = async (c: Context<{ Bindings: Bindings }>) => {
|
|||||||
rawPostTitle || null,
|
rawPostTitle || null,
|
||||||
rawPostUrl || null,
|
rawPostUrl || null,
|
||||||
1,
|
1,
|
||||||
nowIso,
|
nowTs,
|
||||||
nowIso,
|
nowTs,
|
||||||
nowIso
|
nowTs
|
||||||
)
|
)
|
||||||
.run();
|
.run();
|
||||||
} else {
|
} else {
|
||||||
@@ -84,8 +85,8 @@ export const trackVisit = async (c: Context<{ Bindings: Bindings }>) => {
|
|||||||
rawPostTitle || null,
|
rawPostTitle || null,
|
||||||
rawPostUrl || null,
|
rawPostUrl || null,
|
||||||
newPv,
|
newPv,
|
||||||
nowIso,
|
nowTs,
|
||||||
nowIso,
|
nowTs,
|
||||||
existing.id
|
existing.id
|
||||||
)
|
)
|
||||||
.run();
|
.run();
|
||||||
|
|||||||
Reference in New Issue
Block a user