index.html 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>TrendRadar 配置文件编辑器</title>
  7. <!-- Tailwind CSS -->
  8. <script src="https://cdn.tailwindcss.com"></script>
  9. <!-- FontAwesome -->
  10. <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
  11. <!-- js-yaml -->
  12. <script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js"></script>
  13. <!-- SortableJS (拖拽排序库) -->
  14. <script src="https://cdnjs.cloudflare.com/ajax/libs/Sortable/1.15.0/Sortable.min.js"></script>
  15. <!-- 自定义样式 -->
  16. <link rel="stylesheet" href="./assets/style.css">
  17. </head>
  18. <body class="bg-gray-100 text-gray-800 font-sans h-screen flex flex-col overflow-hidden">
  19. <!-- 顶部导航 -->
  20. <nav class="bg-white shadow-sm border-b border-gray-200 flex-shrink-0 z-20">
  21. <div class="max-w-full mx-auto px-4 sm:px-6 lg:px-8 h-14 flex items-center justify-between">
  22. <a href="https://github.com/sansan0/TrendRadar" target="_blank" class="flex items-center gap-3 hover:opacity-80 transition-opacity">
  23. <i class="fa-solid fa-sliders text-blue-600 text-lg"></i>
  24. <span class="font-bold text-lg tracking-tight text-gray-900">TrendRadar <span class="text-gray-500 text-xs font-normal ml-2">可视化配置编辑器 </span></span>
  25. </a>
  26. <!-- 隐私安全提示 -->
  27. <div class="hidden lg:flex items-center text-xs text-gray-500 bg-gray-50 px-3 py-1.5 rounded-full border border-gray-100 select-none">
  28. <i class="fa-solid fa-shield-halved mr-1.5 text-green-500"></i>
  29. <span>纯静态页面,数据仅保存在你的本地浏览器,请放心使用</span>
  30. </div>
  31. <div class="flex gap-3">
  32. <button onclick="openLoadConfigModal()" class="text-xs text-blue-600 hover:text-blue-800 underline flex items-center gap-1">
  33. <i class="fa-solid fa-cloud-arrow-down"></i>加载官网最新配置
  34. </button>
  35. <button onclick="copyResult()" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-1.5 rounded text-sm font-medium transition-colors shadow-sm">
  36. <i class="fa-regular fa-copy mr-1.5"></i>复制配置
  37. </button>
  38. </div>
  39. </div>
  40. </nav>
  41. <!-- 主界面:左右分栏 -->
  42. <main class="flex-grow flex overflow-hidden">
  43. <!-- 左侧:源代码编辑器 (Source) -->
  44. <div class="w-1/2 flex flex-col border-r border-gray-200 bg-[#1e1e1e]">
  45. <!-- Tab 切换 -->
  46. <div class="flex items-center bg-[#252526] border-b border-[#333]">
  47. <button id="tab-config" onclick="switchTab('config')" class="tab-button active px-4 py-2 text-xs font-bold text-gray-300 hover:bg-[#2d2d30] transition-colors border-b-2 border-blue-500">
  48. <i class="fa-solid fa-code mr-2"></i>config.yaml
  49. </button>
  50. <button id="tab-frequency" onclick="switchTab('frequency')" class="tab-button px-4 py-2 text-xs font-bold text-gray-500 hover:bg-[#2d2d30] transition-colors border-b-2 border-transparent">
  51. <i class="fa-solid fa-filter mr-2"></i>frequency_words.txt
  52. </button>
  53. <button id="tab-timeline" onclick="switchTab('timeline')" class="tab-button px-4 py-2 text-xs font-bold text-gray-500 hover:bg-[#2d2d30] transition-colors border-b-2 border-transparent">
  54. <i class="fa-solid fa-calendar-week mr-2"></i>timeline.yaml
  55. </button>
  56. <div class="flex-grow"></div>
  57. <!-- 保存时间显示 -->
  58. <div id="save-time-config" class="save-time-badge px-3 text-[10px] text-gray-500 flex items-center gap-1">
  59. <i class="fa-regular fa-clock"></i>
  60. <span id="config-save-label" class="hidden">已保存: </span>
  61. <span id="config-save-time" class="text-gray-400" title="未保存">未保存</span>
  62. </div>
  63. <div id="save-time-frequency" class="save-time-badge hidden px-3 text-[10px] text-gray-500 flex items-center gap-1">
  64. <i class="fa-regular fa-clock"></i>
  65. <span id="frequency-save-label" class="hidden">已保存: </span>
  66. <span id="frequency-save-time" class="text-gray-400" title="未保存">未保存</span>
  67. </div>
  68. <div id="save-time-timeline" class="save-time-badge hidden px-3 text-[10px] text-gray-500 flex items-center gap-1">
  69. <i class="fa-regular fa-clock"></i>
  70. <span id="timeline-save-label" class="hidden">已保存: </span>
  71. <span id="timeline-save-time" class="text-gray-400" title="未保存">未保存</span>
  72. </div>
  73. </div>
  74. <!-- Config 编辑器 -->
  75. <div id="yaml-editor-wrap" class="tab-content highlight-editor-wrap flex-grow w-full h-full bg-[#1e1e1e]">
  76. <div id="yaml-backdrop" class="highlight-backdrop"></div>
  77. <textarea id="yaml-editor" class="highlight-textarea" spellcheck="false"></textarea>
  78. </div>
  79. <!-- Frequency 编辑器 -->
  80. <div id="frequency-editor-wrap" class="tab-content hidden highlight-editor-wrap flex-grow w-full h-full bg-[#1e1e1e]">
  81. <div id="frequency-backdrop" class="highlight-backdrop"></div>
  82. <textarea id="frequency-editor" class="highlight-textarea" spellcheck="false"></textarea>
  83. </div>
  84. <!-- Timeline 编辑器 -->
  85. <div id="timeline-editor-wrap" class="tab-content hidden highlight-editor-wrap flex-grow w-full h-full bg-[#1e1e1e]">
  86. <div id="timeline-backdrop" class="highlight-backdrop"></div>
  87. <textarea id="timeline-editor" class="highlight-textarea" spellcheck="false"></textarea>
  88. </div>
  89. </div>
  90. <!-- 右侧:可视化配置 + 支持侧栏 -->
  91. <div class="w-1/2 flex">
  92. <!-- 可视化配置 (Visual) -->
  93. <div class="flex-1 flex flex-col bg-gray-50 min-w-0">
  94. <div class="flex items-center justify-between px-6 py-3 bg-white border-b border-gray-200">
  95. <div class="flex items-center gap-3">
  96. <span class="text-sm font-bold text-gray-700"><i class="fa-solid fa-list-check mr-2"></i><span id="right-panel-title">配置模块</span></span>
  97. <button id="version-check-btn" onclick="checkVersion()" class="text-xs bg-indigo-500 hover:bg-indigo-600 text-white px-3 py-1 rounded shadow-sm transition-all flex items-center gap-1.5" title="检测 config.yaml 版本">
  98. <i class="fa-solid fa-code-compare"></i>
  99. <span>版本检测</span>
  100. </button>
  101. <button onclick="resetToDefault()" class="text-xs text-gray-400 hover:text-red-500 transition-colors px-2 py-1" title="重置当前内容为默认状态">
  102. <i class="fa-solid fa-rotate-left"></i>
  103. </button>
  104. </div>
  105. </div>
  106. <!-- 模块导航栏 -->
  107. <div id="module-nav" class="tab-content bg-white border-b border-gray-200 px-4 py-2 flex flex-wrap gap-1">
  108. </div>
  109. <!-- Config 可视化面板 -->
  110. <div id="config-panel" class="tab-content flex-grow overflow-y-auto p-6 space-y-6">
  111. </div>
  112. <!-- Frequency 可视化面板 -->
  113. <div id="frequency-panel" class="tab-content hidden flex-grow overflow-y-auto p-6 space-y-6">
  114. </div>
  115. <!-- Timeline 可视化面板 -->
  116. <div id="timeline-panel" class="tab-content hidden flex-grow overflow-y-auto p-6 space-y-6">
  117. </div>
  118. </div>
  119. <!-- 支持侧栏 (固定,不随内容滚动) -->
  120. <div class="support-sidebar-wrap flex-shrink-0 relative">
  121. <!-- 折叠/展开按钮 (侧栏左边缘) -->
  122. <button id="sidebar-toggle-btn" class="sidebar-toggle-btn" onclick="toggleSupportSidebar()" title="收起侧栏">
  123. <i class="fa-solid fa-chevron-right text-[10px]"></i>
  124. </button>
  125. <div id="support-sidebar" class="support-sidebar border-l border-gray-200 bg-gradient-to-b from-orange-50/30 via-white to-pink-50/20 flex flex-col">
  126. <!-- 侧栏标题 -->
  127. <div class="px-3 py-3 border-b border-gray-100 bg-white/80 sidebar-header-hover group/header">
  128. <div class="flex items-center gap-2">
  129. <div class="w-6 h-6 bg-gradient-to-br from-orange-400 to-pink-500 rounded-lg flex items-center justify-center">
  130. <i class="fa-solid fa-heart text-white text-[10px]"></i>
  131. </div>
  132. <span class="text-sm font-bold text-gray-700 tracking-tight">支持项目</span>
  133. </div>
  134. <p class="sidebar-quote text-[10px] text-gray-400 mt-1.5 leading-relaxed italic">若 TrendRadar 曾为你捕捉价值,不妨为它注入动力,助其持续进化</p>
  135. </div>
  136. <!-- 卡片列表 -->
  137. <div class="flex-1 p-3 space-y-3 overflow-y-auto sidebar-scroll">
  138. <!-- 01: 点亮 Star -->
  139. <a href="https://github.com/sansan0/TrendRadar" target="_blank" class="sidebar-card group block">
  140. <div class="flex items-center gap-2 mb-2.5">
  141. <div class="sidebar-card-icon bg-orange-100 text-orange-500 group-hover:bg-orange-200">
  142. <i class="fa-solid fa-star"></i>
  143. </div>
  144. <div class="min-w-0">
  145. <div class="text-xs font-bold text-gray-800 leading-tight">点亮 Star</div>
  146. <div class="text-[10px] text-gray-400 leading-tight mt-0.5">让更多人发现它</div>
  147. </div>
  148. </div>
  149. <div class="sidebar-cta bg-gradient-to-r from-orange-400 to-red-500 text-white group-hover:from-orange-500 group-hover:to-red-600 shadow-sm group-hover:shadow-md">
  150. <i class="fa-brands fa-github mr-1"></i>前往 GitHub
  151. </div>
  152. </a>
  153. <!-- 02: 不迷路 (微信) -->
  154. <div class="sidebar-card sidebar-card-clickable group" onclick="openQrModal('weixin')">
  155. <div class="flex items-center gap-2 mb-2.5">
  156. <div class="sidebar-card-icon bg-green-100 text-green-600 group-hover:bg-green-200">
  157. <i class="fa-brands fa-weixin"></i>
  158. </div>
  159. <div class="min-w-0">
  160. <div class="text-xs font-bold text-gray-800 leading-tight">不迷路</div>
  161. <div class="text-[10px] text-gray-400 leading-tight mt-0.5">获取更新通知</div>
  162. </div>
  163. </div>
  164. <div class="flex justify-center relative">
  165. <div class="sidebar-qr group-hover:shadow-md">
  166. <img src="./assets/weixin.webp" alt="微信公众号" class="w-full h-full object-contain">
  167. </div>
  168. <div class="sidebar-enlarge-hint">
  169. <i class="fa-solid fa-expand mr-1"></i>点击放大
  170. </div>
  171. </div>
  172. <p class="text-[10px] text-gray-400 text-center mt-2">扫码关注公众号</p>
  173. </div>
  174. <!-- 03: 随心赞赏 -->
  175. <div class="sidebar-card sidebar-card-clickable group" onclick="openQrModal('donate')">
  176. <div class="flex items-center gap-2 mb-2.5">
  177. <div class="sidebar-card-icon bg-emerald-100 text-emerald-600 group-hover:bg-emerald-200">
  178. <i class="fa-solid fa-hand-holding-heart"></i>
  179. </div>
  180. <div class="min-w-0">
  181. <div class="text-xs font-bold text-gray-800 leading-tight">随心赞赏</div>
  182. <div class="text-[10px] text-gray-400 leading-tight mt-0.5">1 元也是鼓励</div>
  183. </div>
  184. </div>
  185. <div class="flex justify-center relative">
  186. <div class="sidebar-qr group-hover:shadow-md">
  187. <img src="https://cdn-1258574687.cos.ap-shanghai.myqcloud.com/img/%2F2026%2F01%2F18ecce7c224ce0ea4c59394c29e408f8-e0d1db45.webp" alt="微信支付" class="w-full h-full object-contain">
  188. </div>
  189. <div class="sidebar-enlarge-hint">
  190. <i class="fa-solid fa-expand mr-1"></i>点击放大
  191. </div>
  192. </div>
  193. <p class="text-[10px] text-gray-400 text-center mt-2">微信扫码 · 丰俭由人</p>
  194. </div>
  195. <!-- 04: 探索更多 -->
  196. <a href="https://sansan0.github.io/mao-map/" target="_blank" class="sidebar-card group block">
  197. <div class="flex items-center gap-2 mb-2.5">
  198. <div class="sidebar-card-icon bg-red-100 text-red-500 group-hover:bg-red-200">
  199. <i class="fa-solid fa-map-location-dot"></i>
  200. </div>
  201. <div class="min-w-0">
  202. <div class="text-xs font-bold text-gray-800 leading-tight">探索更多</div>
  203. <div class="text-[10px] text-gray-400 leading-tight mt-0.5">另一个用心的作品</div>
  204. </div>
  205. </div>
  206. <div class="sidebar-cta bg-red-50 text-red-600 border border-red-100 group-hover:bg-red-100 group-hover:text-red-700">
  207. <i class="fa-solid fa-arrow-up-right-from-square mr-1"></i>去看看
  208. </div>
  209. </a>
  210. </div>
  211. <!-- 底部寄语 -->
  212. <div class="px-3 py-2.5 border-t border-gray-100 bg-white/60">
  213. <p class="text-[10px] text-gray-300 text-center italic font-serif tracking-wide">"开源不易,感谢支持"</p>
  214. </div>
  215. </div>
  216. </div>
  217. </div>
  218. </main>
  219. <!-- RSS 添加弹窗 -->
  220. <div id="rss-modal" class="modal-overlay hidden">
  221. <div class="modal-content">
  222. <div class="flex items-center justify-between mb-4">
  223. <h3 class="text-lg font-bold text-gray-800"><i class="fa-solid fa-rss mr-2 text-orange-500"></i>添加 RSS 源</h3>
  224. <button onclick="closeRssModal()" class="text-gray-400 hover:text-gray-600"><i class="fa-solid fa-times text-xl"></i></button>
  225. </div>
  226. <div class="space-y-4">
  227. <div>
  228. <label class="block text-xs font-bold text-gray-600 mb-1">源 ID(唯一标识,英文)</label>
  229. <input type="text" id="rss-id" placeholder="例如: my-blog" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  230. </div>
  231. <div>
  232. <label class="block text-xs font-bold text-gray-600 mb-1">显示名称</label>
  233. <input type="text" id="rss-name" placeholder="例如: 我的博客" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  234. </div>
  235. <div>
  236. <label class="block text-xs font-bold text-gray-600 mb-1">RSS URL</label>
  237. <input type="text" id="rss-url" placeholder="https://example.com/feed.xml" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  238. </div>
  239. <div>
  240. <label class="block text-xs font-bold text-gray-600 mb-1">最大文章年龄(天,可选)</label>
  241. <input type="number" id="rss-max-age" placeholder="留空使用全局设置" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  242. </div>
  243. </div>
  244. <!-- RSS 灵感折叠区 -->
  245. <div class="mt-5 border-t border-gray-100 pt-4">
  246. <button type="button" onclick="toggleRssTips()" class="w-full flex items-center justify-between text-xs text-orange-600 hover:text-orange-700 bg-orange-50 hover:bg-orange-100 px-3 py-2 rounded-lg transition-all group">
  247. <span class="font-bold flex items-center gap-1.5">
  248. <i class="fa-regular fa-lightbulb"></i> RSS 订阅灵感 & 参考库 <span class="font-normal opacity-70 ml-1">(内附常用源)</span>
  249. </span>
  250. <i id="rss-tips-icon" class="fa-solid fa-chevron-down transition-transform duration-200 text-orange-400 group-hover:text-orange-600" style="transform: rotate(180deg);"></i>
  251. </button>
  252. <div id="rss-tips-panel" class="mt-2 space-y-3 pl-1">
  253. <!-- 必应新闻 -->
  254. <div class="bg-white border border-gray-100 rounded-lg p-3 shadow-sm">
  255. <div class="flex items-center gap-2 mb-2">
  256. <i class="fa-brands fa-microsoft text-blue-500"></i>
  257. <span class="font-bold text-gray-700">Bing 新闻 (支持任意关键词)</span>
  258. </div>
  259. <div class="grid grid-cols-2 gap-2 mb-2">
  260. <button onclick="fillRssUrl('https://www.bing.com/news/search?q=科技+编程&format=RSS')" class="text-left text-[10px] border border-gray-200 hover:border-blue-400 hover:bg-blue-50 hover:text-blue-600 rounded px-2 py-1.5 transition-colors truncate" title="点击填入">
  261. 🚀 科技/编程
  262. </button>
  263. <button onclick="fillRssUrl('https://www.bing.com/news/search?q=全球新闻&format=RSS')" class="text-left text-[10px] border border-gray-200 hover:border-blue-400 hover:bg-blue-50 hover:text-blue-600 rounded px-2 py-1.5 transition-colors truncate" title="点击填入">
  264. 🌍 全球新闻
  265. </button>
  266. <button onclick="fillRssUrl('https://www.bing.com/news/search?q=人工智能&format=RSS')" class="text-left text-[10px] border border-gray-200 hover:border-blue-400 hover:bg-blue-50 hover:text-blue-600 rounded px-2 py-1.5 transition-colors truncate" title="点击填入">
  267. 🤖 人工智能
  268. </button>
  269. <button onclick="fillRssUrl('https://www.bing.com/news/search?q=黄金价格+走势&format=RSS')" class="text-left text-[10px] border border-gray-200 hover:border-blue-400 hover:bg-blue-50 hover:text-blue-600 rounded px-2 py-1.5 transition-colors truncate" title="点击填入">
  270. 💰 黄金/财经
  271. </button>
  272. </div>
  273. <div class="text-[10px] text-gray-400">
  274. 💡 小贴士:修改 URL 中的 <code class="bg-gray-100 px-1 rounded text-gray-600">q=</code> 参数即可监控任何你感兴趣的话题。
  275. </div>
  276. </div>
  277. <!-- 更多参考 -->
  278. <div class="bg-white border border-gray-100 rounded-lg p-3 shadow-sm">
  279. <div class="flex items-center gap-2 mb-2">
  280. <i class="fa-solid fa-book-open text-purple-500"></i>
  281. <span class="font-bold text-gray-700">更多 RSS 源参考</span>
  282. </div>
  283. <div class="flex flex-wrap gap-2 text-xs">
  284. <a href="https://github.com/tuan3w/awesome-tech-rss" target="_blank" class="text-blue-600 hover:underline flex items-center bg-blue-50 px-2 py-1 rounded">
  285. <i class="fa-brands fa-github mr-1"></i>科技/编程
  286. </a>
  287. <a href="https://github.com/plenaryapp/awesome-rss-feeds" target="_blank" class="text-blue-600 hover:underline flex items-center bg-blue-50 px-2 py-1 rounded">
  288. <i class="fa-brands fa-github mr-1"></i>全球新闻
  289. </a>
  290. </div>
  291. </div>
  292. <!-- 免责声明 -->
  293. <div class="text-[10px] text-gray-400 italic leading-relaxed px-1">
  294. <i class="fa-solid fa-shield-halved mr-1 text-gray-300"></i>免责声明:以上 RSS 示例及第三方工具均源自互联网,开发者未一一验证其长期有效性,请你在使用前自行核实。
  295. </div>
  296. </div>
  297. </div>
  298. <div class="flex justify-end gap-2 mt-6">
  299. <button onclick="closeRssModal()" class="px-4 py-2 text-gray-600 hover:bg-gray-100 rounded-lg">取消</button>
  300. <button onclick="confirmAddRss()" class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700">添加</button>
  301. </div>
  302. </div>
  303. </div>
  304. <!-- 平台添加弹窗 -->
  305. <div id="platform-modal" class="modal-overlay hidden">
  306. <div class="modal-content">
  307. <div class="flex items-center justify-between mb-4">
  308. <h3 class="text-lg font-bold text-gray-800"><i class="fa-solid fa-layer-group mr-2 text-green-600"></i>添加热榜平台</h3>
  309. <button onclick="closePlatformModal()" class="text-gray-400 hover:text-gray-600"><i class="fa-solid fa-times text-xl"></i></button>
  310. </div>
  311. <!-- 标签页切换 -->
  312. <div class="flex border-b border-gray-200 mb-4">
  313. <button onclick="switchPlatformTab('select')" id="tab-platform-select" class="flex-1 py-2 text-sm font-bold text-blue-600 border-b-2 border-blue-600 transition-colors">
  314. <i class="fa-solid fa-list mr-1"></i>选择预设
  315. </button>
  316. <button onclick="switchPlatformTab('custom')" id="tab-platform-custom" class="flex-1 py-2 text-sm font-bold text-gray-500 border-b-2 border-transparent hover:text-gray-700 transition-colors">
  317. <i class="fa-solid fa-pen-to-square mr-1"></i>手动输入
  318. </button>
  319. </div>
  320. <!-- 1. 选择预设平台 -->
  321. <div id="platform-select-panel" class="space-y-4">
  322. <div id="available-platforms-list" class="space-y-2 max-h-60 overflow-y-auto pr-1">
  323. <!-- 动态生成可用平台 -->
  324. </div>
  325. <div id="no-platforms-tip" class="hidden text-center py-6 text-gray-500 text-sm bg-gray-50 rounded">
  326. <i class="fa-solid fa-check-circle text-green-500 mr-2"></i>所有预设平台已添加
  327. </div>
  328. </div>
  329. <!-- 2. 手动输入平台 -->
  330. <div id="platform-custom-panel" class="hidden space-y-4">
  331. <div class="bg-blue-50 border border-blue-100 rounded p-3 mb-3 text-xs text-blue-800">
  332. <i class="fa-solid fa-info-circle mr-1"></i>自定义平台需要后端爬虫支持,此处仅用于配置占位。
  333. </div>
  334. <div>
  335. <label class="block text-xs font-bold text-gray-600 mb-1">平台 Key(英文)</label>
  336. <input type="text" id="custom-platform-key" placeholder="例如: sspai" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  337. </div>
  338. <div>
  339. <label class="block text-xs font-bold text-gray-600 mb-1">显示名称</label>
  340. <input type="text" id="custom-platform-name" placeholder="例如: 少数派" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
  341. </div>
  342. </div>
  343. <div class="flex justify-end gap-2 mt-6">
  344. <button onclick="closePlatformModal()" class="px-4 py-2 text-gray-600 hover:bg-gray-100 rounded-lg">取消</button>
  345. <button onclick="confirmAddPlatform()" class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700">添加</button>
  346. </div>
  347. </div>
  348. </div>
  349. <!-- 词组类型选择弹窗 -->
  350. <div id="wordgroup-type-modal" class="modal-overlay hidden">
  351. <div class="modal-content max-w-2xl">
  352. <div class="flex items-center justify-between mb-4">
  353. <h3 class="text-lg font-bold text-gray-800"><i class="fa-solid fa-layer-group mr-2 text-blue-500"></i>选择词组类型</h3>
  354. <button onclick="closeWordGroupTypeModal()" class="text-gray-400 hover:text-gray-600"><i class="fa-solid fa-times text-xl"></i></button>
  355. </div>
  356. <div class="space-y-3">
  357. <!-- 组别名类型 -->
  358. <div onclick="confirmAddWordGroup('group')" class="cursor-pointer border-2 border-orange-200 bg-orange-50 rounded-lg p-4 hover:border-orange-400 hover:bg-orange-100 transition-all">
  359. <div class="flex items-center gap-3">
  360. <span class="text-xs bg-orange-500 text-white px-2 py-1 rounded font-bold">组别名</span>
  361. <span class="font-bold text-gray-800">多关键词词组(推荐)</span>
  362. </div>
  363. <div class="mt-2 text-sm text-gray-600">
  364. <div class="font-mono bg-white rounded p-2 text-xs border border-orange-200">
  365. <div class="text-orange-600">[东亚]</div>
  366. <div>日本</div>
  367. <div>韩国</div>
  368. <div>朝鲜</div>
  369. </div>
  370. <div class="mt-2 text-xs text-gray-500">
  371. <i class="fa-solid fa-check-circle text-orange-500 mr-1"></i>适用于:多个关键词归为一组,统一显示为组名
  372. </div>
  373. </div>
  374. </div>
  375. <!-- 单个别名类型 -->
  376. <div onclick="confirmAddWordGroup('alias')" class="cursor-pointer border-2 border-teal-200 bg-teal-50 rounded-lg p-4 hover:border-teal-400 hover:bg-teal-100 transition-all">
  377. <div class="flex items-center gap-3">
  378. <span class="text-xs bg-teal-500 text-white px-2 py-1 rounded font-bold">单个别名</span>
  379. <span class="font-bold text-gray-800">正则/关键词 + 别名</span>
  380. </div>
  381. <div class="mt-2 text-sm text-gray-600">
  382. <div class="font-mono bg-white rounded p-2 text-xs border border-teal-200">
  383. <div>/胖东来|于东来/ <span class="text-teal-600">=></span> 胖东来</div>
  384. </div>
  385. <div class="mt-2 text-xs text-gray-500">
  386. <i class="fa-solid fa-check-circle text-teal-500 mr-1"></i>适用于:用正则匹配多个词,显示为一个别名(前后有空行分隔)
  387. </div>
  388. </div>
  389. </div>
  390. <!-- 连续别名类型 -->
  391. <div onclick="confirmAddWordGroup('multi-alias')" class="cursor-pointer border-2 border-purple-200 bg-purple-50 rounded-lg p-4 hover:border-purple-400 hover:bg-purple-100 transition-all">
  392. <div class="flex items-center gap-3">
  393. <span class="text-xs bg-purple-500 text-white px-2 py-1 rounded font-bold">连续别名组</span>
  394. <span class="font-bold text-gray-800">多个相关品牌/词组</span>
  395. </div>
  396. <div class="mt-2 text-sm text-gray-600">
  397. <div class="font-mono bg-white rounded p-2 text-xs border border-purple-200">
  398. <div>/智元|灵犀|稚晖君/ <span class="text-purple-600">=></span> 智元机器人</div>
  399. <div>/众擎|EngineAI/ <span class="text-purple-600">=></span> 众擎机器人</div>
  400. </div>
  401. <div class="mt-2 text-xs text-gray-500">
  402. <i class="fa-solid fa-check-circle text-purple-500 mr-1"></i>适用于:多个相关品牌放在一起(<strong>无空行分隔</strong>)
  403. </div>
  404. </div>
  405. </div>
  406. <!-- 普通词组类型 -->
  407. <div onclick="confirmAddWordGroup('plain')" class="cursor-pointer border-2 border-gray-200 bg-gray-50 rounded-lg p-4 hover:border-gray-400 hover:bg-gray-100 transition-all">
  408. <div class="flex items-center gap-3">
  409. <span class="text-xs bg-gray-500 text-white px-2 py-1 rounded font-bold">普通词组</span>
  410. <span class="font-bold text-gray-800">简单关键词</span>
  411. </div>
  412. <div class="mt-2 text-sm text-gray-600">
  413. <div class="font-mono bg-white rounded p-2 text-xs border border-gray-200">
  414. <div>申奥</div>
  415. </div>
  416. <div class="mt-2 text-xs text-gray-500">
  417. <i class="fa-solid fa-check-circle text-gray-500 mr-1"></i>适用于:单个或少量普通关键词
  418. </div>
  419. </div>
  420. </div>
  421. </div>
  422. <div class="flex justify-end gap-2 mt-6">
  423. <button onclick="closeWordGroupTypeModal()" class="px-4 py-2 text-gray-600 hover:bg-gray-100 rounded-lg">取消</button>
  424. </div>
  425. </div>
  426. </div>
  427. <!-- 二维码放大弹窗 -->
  428. <div id="qr-modal" class="modal-overlay hidden" onclick="if(event.target===this){closeQrModal()}">
  429. <div class="modal-content support-modal-content max-w-sm w-[90%] p-6 text-center">
  430. <div class="flex items-center justify-between mb-5">
  431. <div class="flex items-center gap-3">
  432. <div id="qr-modal-icon" class="w-10 h-10 rounded-xl flex items-center justify-center text-lg"></div>
  433. <div class="text-left">
  434. <h3 id="qr-modal-title" class="text-lg font-bold text-gray-800"></h3>
  435. <p id="qr-modal-subtitle" class="text-xs text-gray-500 mt-0.5"></p>
  436. </div>
  437. </div>
  438. <button onclick="closeQrModal()" class="w-8 h-8 flex items-center justify-center rounded-full hover:bg-gray-100 text-gray-400 transition-colors">
  439. <i class="fa-solid fa-times"></i>
  440. </button>
  441. </div>
  442. <div class="flex justify-center">
  443. <div class="w-56 h-56 bg-white border border-gray-100 rounded-2xl p-3 shadow-sm">
  444. <img id="qr-modal-img" src="" alt="" class="w-full h-full object-contain">
  445. </div>
  446. </div>
  447. <p id="qr-modal-hint" class="text-xs text-gray-400 mt-4"></p>
  448. </div>
  449. </div>
  450. <!-- 新建调度模式弹窗 -->
  451. <div id="tl-new-preset-modal" class="modal-overlay hidden">
  452. <div class="modal-content">
  453. <div class="flex items-center justify-between mb-4">
  454. <h3 class="text-lg font-bold text-gray-800"><i class="fa-solid fa-calendar-plus mr-2 text-purple-600"></i>新建调度模式</h3>
  455. <button onclick="closeTlNewPresetModal()" class="text-gray-400 hover:text-gray-600"><i class="fa-solid fa-times text-xl"></i></button>
  456. </div>
  457. <div class="space-y-4">
  458. <div>
  459. <label class="block text-xs font-bold text-gray-600 mb-1">模式标识 (key)</label>
  460. <input type="text" id="tl-new-preset-key" placeholder="英文标识,如 my_schedule" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 text-sm">
  461. <p class="text-[10px] text-gray-400 mt-1">仅支持英文、数字和下划线,将作为 YAML 中的 key</p>
  462. </div>
  463. <div>
  464. <label class="block text-xs font-bold text-gray-600 mb-1">显示名称</label>
  465. <input type="text" id="tl-new-preset-name" placeholder="如:我的调度" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 text-sm">
  466. </div>
  467. <div>
  468. <label class="block text-xs font-bold text-gray-600 mb-1">描述(可选)</label>
  469. <input type="text" id="tl-new-preset-desc" placeholder="简短描述此模式的用途" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 text-sm">
  470. </div>
  471. <div>
  472. <label class="block text-xs font-bold text-gray-600 mb-1">基于模板</label>
  473. <select id="tl-new-preset-template" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-purple-500 focus:border-purple-500 text-sm">
  474. <option value="">空白模板(仅采集,不推送不分析)</option>
  475. </select>
  476. <p class="text-[10px] text-gray-400 mt-1">复制已有模式的全部配置作为起点</p>
  477. </div>
  478. </div>
  479. <div class="flex justify-end gap-2 mt-6">
  480. <button onclick="closeTlNewPresetModal()" class="px-4 py-2 text-gray-600 hover:bg-gray-100 rounded-lg">取消</button>
  481. <button onclick="confirmTlNewPreset()" class="px-4 py-2 bg-purple-600 text-white rounded-lg hover:bg-purple-700">创建</button>
  482. </div>
  483. </div>
  484. </div>
  485. <!-- 新增时间段弹窗 -->
  486. <div id="tl-new-period-modal" class="modal-overlay hidden">
  487. <div class="modal-content">
  488. <div class="flex items-center justify-between mb-4">
  489. <h3 class="text-lg font-bold text-gray-800"><i class="fa-solid fa-clock-rotate-left mr-2 text-blue-600"></i>新增时间段</h3>
  490. <button onclick="closeTlNewPeriodModal()" class="text-gray-400 hover:text-gray-600"><i class="fa-solid fa-times text-xl"></i></button>
  491. </div>
  492. <div class="space-y-4">
  493. <div>
  494. <label class="block text-xs font-bold text-gray-600 mb-1">时间段标识 (key)</label>
  495. <input type="text" id="tl-new-period-key" placeholder="英文标识,如 morning_push" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm">
  496. <p class="text-[10px] text-gray-400 mt-1">仅支持英文、数字和下划线</p>
  497. </div>
  498. <div>
  499. <label class="block text-xs font-bold text-gray-600 mb-1">显示名称</label>
  500. <input type="text" id="tl-new-period-name" placeholder="如:晨间推送" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm">
  501. </div>
  502. <div class="grid grid-cols-2 gap-4">
  503. <div>
  504. <label class="block text-xs font-bold text-gray-600 mb-1">开始时间</label>
  505. <input type="time" id="tl-new-period-start" value="09:00" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm">
  506. </div>
  507. <div>
  508. <label class="block text-xs font-bold text-gray-600 mb-1">结束时间</label>
  509. <input type="time" id="tl-new-period-end" value="11:00" class="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm">
  510. </div>
  511. </div>
  512. <div class="bg-blue-50 border border-blue-100 rounded p-3 text-xs text-blue-700">
  513. <i class="fa-solid fa-info-circle mr-1"></i>如果开始时间 > 结束时间(如 22:00~01:00),将自动识别为跨午夜时间段。
  514. </div>
  515. </div>
  516. <div class="flex justify-end gap-2 mt-6">
  517. <button onclick="closeTlNewPeriodModal()" class="px-4 py-2 text-gray-600 hover:bg-gray-100 rounded-lg">取消</button>
  518. <button onclick="confirmTlNewPeriod()" class="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700">添加</button>
  519. </div>
  520. </div>
  521. </div>
  522. <script src="./assets/script.js"></script>
  523. </body>
  524. </html>