Moon TV后续 创建后台和多设备同步记录

🌙 Moon TV 多设备同步 & 多用户设置教程 📺

上一个教程中我们已经成功搭建了 Moon TV ✅
但你可能发现:搜索历史和观看记录在不同设备上无法同步!
别急,这篇教程将手把手教你:

  • ✅ 多设备同步数据
  • ✅ 设置多个访问账户
  • ✅ 轻松管理数据

🛠️ 第一步:创建数据库(Cloudflare D1)

  1. 打开 Cloudflare Dashboard,点击左侧导航中的 「存储和数据库」 → 「D1 SQL 数据库」
  2. 点击 ➕ 创建数据库,名称随意填写。

🔍 第二步:导入数据库结构

  1. 进入你刚创建的数据库
  2. 点击右上角的 「Explore Data」
  3. 将以下内容粘贴进 Query 窗口,并点击 Run All 执行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
CREATE TABLE IF NOT EXISTS users (
username TEXT PRIMARY KEY,
password TEXT NOT NULL,
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
);

CREATE TABLE IF NOT EXISTS play_records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
key TEXT NOT NULL,
title TEXT NOT NULL,
source_name TEXT NOT NULL,
cover TEXT NOT NULL,
year TEXT NOT NULL,
index_episode INTEGER NOT NULL,
total_episodes INTEGER NOT NULL,
play_time INTEGER NOT NULL,
total_time INTEGER NOT NULL,
save_time INTEGER NOT NULL,
search_title TEXT,
UNIQUE(username, key)
);

CREATE TABLE IF NOT EXISTS favorites (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
key TEXT NOT NULL,
title TEXT NOT NULL,
source_name TEXT NOT NULL,
cover TEXT NOT NULL,
year TEXT NOT NULL,
total_episodes INTEGER NOT NULL,
save_time INTEGER NOT NULL,
UNIQUE(username, key)
);

CREATE TABLE IF NOT EXISTS search_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
keyword TEXT NOT NULL,
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')),
UNIQUE(username, keyword)
);

CREATE TABLE IF NOT EXISTS admin_config (
id INTEGER PRIMARY KEY DEFAULT 1,
config TEXT NOT NULL,
updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now'))
);

CREATE TABLE IF NOT EXISTS skip_configs (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
source TEXT NOT NULL,
id_video TEXT NOT NULL,
enable INTEGER NOT NULL DEFAULT 0,
intro_time INTEGER NOT NULL DEFAULT 0,
outro_time INTEGER NOT NULL DEFAULT 0,
UNIQUE(username, source, id_video)
);

-- 基本索引
CREATE INDEX IF NOT EXISTS idx_play_records_username ON play_records(username);
CREATE INDEX IF NOT EXISTS idx_favorites_username ON favorites(username);
CREATE INDEX IF NOT EXISTS idx_search_history_username ON search_history(username);

-- 复合索引优化查询性能
-- 播放记录:用户名+键值的复合索引,用于快速查找特定记录
CREATE INDEX IF NOT EXISTS idx_play_records_username_key ON play_records(username, key);
-- 播放记录:用户名+保存时间的复合索引,用于按时间排序的查询
CREATE INDEX IF NOT EXISTS idx_play_records_username_save_time ON play_records(username, save_time DESC);

-- 收藏:用户名+键值的复合索引,用于快速查找特定收藏
CREATE INDEX IF NOT EXISTS idx_favorites_username_key ON favorites(username, key);
-- 收藏:用户名+保存时间的复合索引,用于按时间排序的查询
CREATE INDEX IF NOT EXISTS idx_favorites_username_save_time ON favorites(username, save_time DESC);

-- 搜索历史:用户名+关键词的复合索引,用于快速查找/删除特定搜索记录
CREATE INDEX IF NOT EXISTS idx_search_history_username_keyword ON search_history(username, keyword);
-- 搜索历史:用户名+创建时间的复合索引,用于按时间排序的查询
CREATE INDEX IF NOT EXISTS idx_search_history_username_created_at ON search_history(username, created_at DESC);

-- 跳过片头片尾配置:用户名+源+视频ID的复合索引,用于快速查找特定配置
CREATE INDEX IF NOT EXISTS idx_skip_configs_username_source_id ON skip_configs(username, source, id_video);

-- 搜索历史清理查询的优化索引
CREATE INDEX IF NOT EXISTS idx_search_history_username_id_created_at ON search_history(username, id, created_at DESC);
⏳ 等待执行完成即可!

⚙️ 第三步:绑定数据库到 Pages 项目

  1. 回到你的 Cloudflare Pages 项目
  2. 点击 「设置」 → 「绑定」
  3. 添加一个 D1 绑定,选择你刚刚创建的数据库
    • 变量名称填写为(大写字母):DB

🌐 第四步:配置环境变量

进入 Pages 的「设置」→「环境变量」,添加以下两项:

1
NEXT_PUBLIC_STORAGE_TYPE

值为(小写字母):d1

1
USERNAME

值为你的用户名
注意:如需多用户,请在管理页面添加用户,而非新增环境变量。


🔁 第五步:重新部署项目

点击 重新部署,使配置生效。🌟


🔐 管理后台入口

部署完成后,在你的站点地址后加上 /admin 即可进入管理后台:

1
/admin

你可以:

  • 🧑‍💻 添加 / 删除 用户
  • 🗃️ 查看搜索/观看记录
  • 🔧 修改站点配置

🎉 完成!

你现在拥有了:

  • ✅ 多设备同步功能
  • 👥 多用户访问权限
  • 📊 管理后台支持

如果觉得有用,不妨分享给朋友!🚀


📌 后续计划预告

  • 支持账号密码登录
  • 历史记录云端恢复
  • UI管理界面优化

敬请期待 👀