refactor: 将 WebUI 源码纳入仓库,移除打包产物

- 新增 webui/ 前端源码目录(React+Vite+TypeScript+Tailwind)
- 删除 api/webui/ 中旧的打包静态资源
- 更新 .gitignore 忽略 api/webui/ 构建输出和 webui/node_modules
- 更新 README 增加前端构建说明
This commit is contained in:
程序员阿江(Relakkes)
2026-07-01 23:05:03 +08:00
parent 2ac0716c41
commit 65ddaa8828
68 changed files with 9064 additions and 356 deletions
+57
View File
@@ -0,0 +1,57 @@
import i18n from 'i18next'
import { initReactI18next } from 'react-i18next'
import LanguageDetector from 'i18next-browser-languagedetector'
// 中文翻译
import zhCommon from './locales/zh-CN/common.json'
import zhConfig from './locales/zh-CN/config.json'
import zhTerminal from './locales/zh-CN/terminal.json'
import zhData from './locales/zh-CN/data.json'
import zhEnv from './locales/zh-CN/env.json'
import zhLicense from './locales/zh-CN/license.json'
// 英文翻译
import enCommon from './locales/en-US/common.json'
import enConfig from './locales/en-US/config.json'
import enTerminal from './locales/en-US/terminal.json'
import enData from './locales/en-US/data.json'
import enEnv from './locales/en-US/env.json'
import enLicense from './locales/en-US/license.json'
const resources = {
'zh-CN': {
common: zhCommon,
config: zhConfig,
terminal: zhTerminal,
data: zhData,
env: zhEnv,
license: zhLicense,
},
'en-US': {
common: enCommon,
config: enConfig,
terminal: enTerminal,
data: enData,
env: enEnv,
license: enLicense,
},
}
i18n
.use(LanguageDetector)
.use(initReactI18next)
.init({
resources,
fallbackLng: 'zh-CN',
defaultNS: 'common',
interpolation: {
escapeValue: false,
},
detection: {
order: ['localStorage', 'navigator'],
caches: ['localStorage'],
lookupLocalStorage: 'mediacrawler_language',
},
})
export default i18n
+26
View File
@@ -0,0 +1,26 @@
{
"status": {
"active": "ACTIVE",
"standby": "STANDBY",
"idle": "IDLE",
"running": "RUNNING",
"stopping": "STOPPING",
"error": "ERROR"
},
"sidebar": {
"title": "MediaCrawler",
"api": "API",
"local": "LOCAL",
"disclaimer": "For personal learning only, commercial use prohibited",
"license": "License"
},
"action": {
"loading": "Loading...",
"skip": "SKIP_CHECK",
"retry": "RETRY_SCAN"
},
"unit": {
"entries": "entries",
"records": "records"
}
}
+71
View File
@@ -0,0 +1,71 @@
{
"section": {
"targetMatrix": {
"title": "TARGET_MATRIX",
"description": "Platform, mode & search parameters"
},
"authMatrix": {
"title": "AUTH_MATRIX",
"description": "Login method configuration"
},
"outputConfig": {
"title": "OUTPUT_CONFIG",
"description": "Save format & comment options"
},
"runtime": {
"title": "RUNTIME",
"description": "Runtime parameters"
}
},
"field": {
"platform": "PLATFORM",
"platformPlaceholder": "Select platform",
"crawlType": "CRAWL_TYPE",
"crawlTypePlaceholder": "Select type",
"startPage": "START_PAGE",
"keywords": "KEYWORDS",
"keywordsHint": "Press Enter to add keyword",
"keywordsPlaceholder": "Type keyword, press Enter to add...",
"specifiedIds": "POST/VIDEO_ID",
"specifiedIdsHint": "Enter post or video ID/URL, one per line or comma-separated",
"specifiedIdsPlaceholder": {
"bili": "Examples:\nBV1xxxx\nhttps://www.bilibili.com/video/BV1xxxx",
"xhs": "Examples:\nhttps://www.xiaohongshu.com/explore/xxx?xsec_token=xxx\n(must include xsec_token)",
"dy": "Examples:\n7525538910311632128\nhttps://www.douyin.com/video/xxx\nhttps://v.douyin.com/xxx (short link)",
"wb": "Examples:\n4982041758140155\nhttps://weibo.com/xxx/xxx",
"ks": "Examples:\n3xf8enb8dbj6uig\nhttps://www.kuaishou.com/short-video/xxx",
"default": "Enter post/video ID or URL..."
},
"creatorIds": "CREATOR_ID",
"creatorIdsHint": "Enter creator ID/URL, one per line or comma-separated",
"creatorIdsPlaceholder": {
"bili": "Examples:\n434377496\nhttps://space.bilibili.com/434377496",
"xhs": "Examples:\nhttps://www.xiaohongshu.com/user/profile/xxx?xsec_token=xxx\n(must include xsec_token)",
"dy": "Examples:\nMS4wLjABAAAAxxx\nhttps://www.douyin.com/user/MS4wLjABAAAAxxx",
"wb": "Examples:\n5533390220\nhttps://weibo.com/u/5533390220",
"ks": "Examples:\n3x84qugg4ch9zhs\nhttps://www.kuaishou.com/profile/xxx",
"default": "Enter creator ID or URL..."
},
"loginMethod": "LOGIN_METHOD",
"loginMethodPlaceholder": "Select login method",
"cookies": "COOKIES",
"cookiesHint": "Paste cookie string",
"cookiesPlaceholder": "Paste cookies here...",
"saveFormat": "SAVE_FORMAT",
"saveFormatPlaceholder": "Select format",
"commentExtraction": "Comment Extraction",
"subComments": "Sub-comments",
"headlessMode": "HEADLESS_MODE",
"headlessModeHint": "Run browser without GUI"
},
"button": {
"initiateScan": "INITIATE SCAN",
"initiating": "INITIATING...",
"terminate": "TERMINATE",
"stopping": "STOPPING..."
},
"warning": {
"cookieSlider": "[Note] Cookie login is not recommended for Xiaohongshu and Douyin due to slider captcha",
"xhsToken": "[Important] Xiaohongshu URLs must contain xsec_token parameter, please copy the full URL from browser"
}
}
+29
View File
@@ -0,0 +1,29 @@
{
"dialog": {
"button": "PAYLOAD_MATRIX",
"title": "DATA_EXPLORER"
},
"explorer": {
"title": "CAPTURED_PAYLOAD_MATRIX",
"records": "{{count}} RECORDS",
"rescan": "RESCAN",
"loading": "[LOADING] Scanning payload directory...",
"noData": "NO_DATA_CAPTURED",
"noDataHint": "Initialize crawler to begin data extraction sequence. Results will appear here upon completion.",
"allCategories": "ALL"
},
"file": {
"entries": "{{count}} entries",
"extract": "EXTRACT",
"preview": "PREVIEW"
},
"preview": {
"title": "Data Preview",
"records": "{{count}} RECORDS",
"download": "DOWNLOAD",
"loading": "[LOADING] Decoding payload...",
"error": "[ERROR] Failed to decode payload",
"searchPlaceholder": "Search in data...",
"showing": "Showing {{filtered}} of {{total}} records"
}
}
+18
View File
@@ -0,0 +1,18 @@
{
"title": "ENV_DIAGNOSTICS",
"scanning": "[SCAN] Analyzing MediaCrawler environment...",
"success": "[OK] {{message}}",
"error": "[ERR] {{message}}",
"defaultError": "Cannot connect to API server",
"defaultErrorHint": "Please ensure backend service is running (uvicorn api.main:app --port 8080)",
"showDetails": "[+] SHOW_DETAILS",
"hideDetails": "[-] HIDE_DETAILS",
"requirements": "[REQUIREMENTS]",
"requirementsList": {
"1": "Install uv package manager",
"2": "Execute uv sync in project root",
"3": "Verify all dependencies installed"
},
"skipCheck": "SKIP_CHECK",
"retryCheck": "RETRY_SCAN"
}
+21
View File
@@ -0,0 +1,21 @@
{
"title": "Usage Notice",
"warning": "Please read the following terms carefully",
"content": {
"line1": "This project is for personal learning and research purposes only",
"line2": "Commercial use or profit-making activities are strictly prohibited",
"line3": "By using this project, you agree to comply with all applicable laws",
"line4": "Users bear full responsibility for any consequences of misuse"
},
"license": "View Full License",
"github": "Visit GitHub Repository",
"confirm": "I understand and agree to the above terms",
"decline": "Disagree, Exit",
"author": {
"name": "Relakkes (阿江)",
"tagline": "40K+ Star Open Source Author",
"description": "Author of MediaCrawler (40K stars), focused on crawler tech and AI Agent knowledge sharing",
"support": "If you find this project helpful, please follow the author on social media",
"slogan": "Open source is hard, please star ⭐"
}
}
@@ -0,0 +1,16 @@
{
"header": {
"title": "SYSTEM_CONSOLE",
"entries": "{{count}} entries",
"active": "ACTIVE",
"clear": "CLEAR",
"restore": "RESTORE ALL LOGS"
},
"banner": {
"systemInit": "[SYS] System initialized successfully",
"configHint": "[INFO] Configure parameters and initiate scan sequence..."
},
"footer": {
"awaiting": "awaiting_command..."
}
}
+26
View File
@@ -0,0 +1,26 @@
{
"status": {
"active": "运行中",
"standby": "待机",
"idle": "空闲",
"running": "运行中",
"stopping": "停止中",
"error": "错误"
},
"sidebar": {
"title": "MediaCrawler",
"api": "API",
"local": "本地",
"disclaimer": "仅供个人学习研究使用,禁止商业用途",
"license": "查看协议"
},
"action": {
"loading": "加载中...",
"skip": "跳过检测",
"retry": "重新扫描"
},
"unit": {
"entries": "条记录",
"records": "条"
}
}
+71
View File
@@ -0,0 +1,71 @@
{
"section": {
"targetMatrix": {
"title": "目标配置",
"description": "平台、模式与搜索参数"
},
"authMatrix": {
"title": "登录配置",
"description": "登录方式配置"
},
"outputConfig": {
"title": "输出配置",
"description": "保存格式与评论选项"
},
"runtime": {
"title": "运行参数",
"description": "运行时参数"
}
},
"field": {
"platform": "平台",
"platformPlaceholder": "选择平台",
"crawlType": "爬取类型",
"crawlTypePlaceholder": "选择类型",
"startPage": "起始页",
"keywords": "关键词",
"keywordsHint": "输入关键词后按回车添加",
"keywordsPlaceholder": "输入关键词,按回车添加...",
"specifiedIds": "帖子/视频 ID",
"specifiedIdsHint": "输入帖子或视频的ID/URL,每行一个或用逗号分隔",
"specifiedIdsPlaceholder": {
"bili": "示例:\nBV1xxxx\nhttps://www.bilibili.com/video/BV1xxxx",
"xhs": "示例:\nhttps://www.xiaohongshu.com/explore/xxx?xsec_token=xxx\n(必须包含xsec_token参数)",
"dy": "示例:\n7525538910311632128\nhttps://www.douyin.com/video/xxx\nhttps://v.douyin.com/xxx (短链接)",
"wb": "示例:\n4982041758140155\nhttps://weibo.com/xxx/xxx",
"ks": "示例:\n3xf8enb8dbj6uig\nhttps://www.kuaishou.com/short-video/xxx",
"default": "输入帖子/视频 ID 或 URL..."
},
"creatorIds": "创作者 ID",
"creatorIdsHint": "输入创作者的ID/URL,每行一个或用逗号分隔",
"creatorIdsPlaceholder": {
"bili": "示例:\n434377496\nhttps://space.bilibili.com/434377496",
"xhs": "示例:\nhttps://www.xiaohongshu.com/user/profile/xxx?xsec_token=xxx\n(必须包含xsec_token参数)",
"dy": "示例:\nMS4wLjABAAAAxxx\nhttps://www.douyin.com/user/MS4wLjABAAAAxxx",
"wb": "示例:\n5533390220\nhttps://weibo.com/u/5533390220",
"ks": "示例:\n3x84qugg4ch9zhs\nhttps://www.kuaishou.com/profile/xxx",
"default": "输入创作者 ID 或 URL..."
},
"loginMethod": "登录方式",
"loginMethodPlaceholder": "选择登录方式",
"cookies": "Cookies",
"cookiesHint": "粘贴 Cookie 字符串",
"cookiesPlaceholder": "在此粘贴 Cookies...",
"saveFormat": "保存格式",
"saveFormatPlaceholder": "选择格式",
"commentExtraction": "评论抓取",
"subComments": "子评论",
"headlessMode": "无头模式",
"headlessModeHint": "无 GUI 运行浏览器"
},
"button": {
"initiateScan": "开始爬虫",
"initiating": "启动中...",
"terminate": "终止",
"stopping": "停止中..."
},
"warning": {
"cookieSlider": "[提示] 小红书和抖音平台不建议使用 Cookie 登录,因为可能会触发滑块验证",
"xhsToken": "[重要] 小红书 URL 必须包含 xsec_token 参数,请从浏览器复制完整 URL"
}
}
+29
View File
@@ -0,0 +1,29 @@
{
"dialog": {
"button": "数据管理",
"title": "数据浏览器"
},
"explorer": {
"title": "数据文件管理",
"records": "{{count}} 条",
"rescan": "重新扫描",
"loading": "[加载中] 正在扫描数据目录...",
"noData": "暂无数据",
"noDataHint": "启动爬虫开始数据采集,完成后结果将显示在此处。",
"allCategories": "全部"
},
"file": {
"entries": "{{count}} 条",
"extract": "下载",
"preview": "预览"
},
"preview": {
"title": "数据预览",
"records": "{{count}} 条记录",
"download": "下载",
"loading": "[加载中] 正在解析数据...",
"error": "[错误] 数据解析失败",
"searchPlaceholder": "搜索数据...",
"showing": "显示 {{filtered}} / {{total}} 条记录"
}
}
+18
View File
@@ -0,0 +1,18 @@
{
"title": "环境检测",
"scanning": "[扫描] 正在分析 MediaCrawler 环境...",
"success": "[成功] {{message}}",
"error": "[错误] {{message}}",
"defaultError": "无法连接到 API 服务器",
"defaultErrorHint": "请确保后端服务已启动 (uvicorn api.main:app --port 8080)",
"showDetails": "[+] 显示详情",
"hideDetails": "[-] 隐藏详情",
"requirements": "[环境要求]",
"requirementsList": {
"1": "安装 uv 包管理器",
"2": "在项目根目录执行 uv sync",
"3": "确认所有依赖已安装"
},
"skipCheck": "跳过检测",
"retryCheck": "重新检测"
}
+21
View File
@@ -0,0 +1,21 @@
{
"title": "使用须知",
"warning": "请仔细阅读以下条款",
"content": {
"line1": "本项目仅供个人学习和研究爬虫技术使用",
"line2": "严禁将本项目用于任何商业用途或盈利活动",
"line3": "使用本项目即表示您同意遵守相关法律法规",
"line4": "任何因违规使用造成的后果由使用者自行承担"
},
"license": "查看完整协议",
"github": "访问 GitHub 仓库",
"confirm": "我已知晓并同意上述条款",
"decline": "不同意,退出",
"author": {
"name": "程序员阿江-Relakkes",
"tagline": "40K+ Star 开源项目作者",
"description": "40K开源项目MediaCrawler作者,专注爬虫技术和AI Agent知识分享",
"support": "如果觉得项目有帮助,欢迎关注作者的社交媒体账号",
"slogan": "开源不易,求个关注 ⭐"
}
}
@@ -0,0 +1,16 @@
{
"header": {
"title": "系统控制台",
"entries": "{{count}} 条记录",
"active": "活跃",
"clear": "清除",
"restore": "恢复所有日志"
},
"banner": {
"systemInit": "[系统] 系统初始化成功",
"configHint": "[信息] 配置参数并启动扫描序列..."
},
"footer": {
"awaiting": "等待命令..."
}
}