index.html 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  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>门店采集 · 门店装修工具</title>
  7. <link rel="icon" href="/assets/logo.png">
  8. <link rel="stylesheet" href="/style.css">
  9. </head>
  10. <body>
  11. <!-- Splash Screen -->
  12. <div class="splash" id="splash">
  13. <img src="/assets/logo.png" alt="门店装修工具" class="splash-logo">
  14. <div class="splash-name">门店装修工具</div>
  15. <div class="splash-sub">淘宝闪购专业版</div>
  16. <div class="splash-bar"><span></span></div>
  17. <div class="splash-powered">
  18. <span>powered by</span>
  19. <img src="/assets/powered-by.png" alt="Hyreal IDE">
  20. </div>
  21. </div>
  22. <div class="app-frame">
  23. <aside class="sidebar">
  24. <div class="sidebar-brand">
  25. <div class="sidebar-logo"><img src="/assets/logo.png" alt="门"></div>
  26. <div class="sidebar-titles">
  27. <div class="t1">门店装修工具</div>
  28. <div class="t2">淘宝闪购专业版</div>
  29. </div>
  30. </div>
  31. <div class="nav-section-label">采集</div>
  32. <button class="nav-item active" data-view="crawl"><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 6h16M4 12h10M4 18h16"/></svg></span><span>门店采集</span></button>
  33. <div class="nav-section-label">生成</div>
  34. <button class="nav-item" data-view="gen"><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3l1.8 4.9L19 9.7l-4.3 3 1.2 5.3-3.9-3-3.9 3 1.2-5.3-4.3-3 5.2-1.8z"/></svg></span><span>视觉生成</span></button>
  35. <button class="nav-item" data-view="tasks"><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 7h10M4 12h16M4 17h7"/><circle cx="18" cy="7" r="2"/><circle cx="15" cy="17" r="2"/></svg></span><span>任务中心</span></button>
  36. <button class="nav-item" data-view="history"><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="4" width="18" height="16" rx="3"/><circle cx="9" cy="10" r="1.8"/><path d="M21 16l-5-5-6 6"/></svg></span><span>历史创作</span></button>
  37. <div class="nav-section-label">设置</div>
  38. <button class="nav-item" data-view="settings"><span class="ico"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="3"/><path d="M19.4 15a1.7 1.7 0 0 0 .34 1.87l.06.06a2 2 0 1 1-2.83 2.83l-.06-.06A1.7 1.7 0 0 0 15 19.4a1.7 1.7 0 0 0-1 1.55V21a2 2 0 1 1-4 0v-.05A1.7 1.7 0 0 0 9 19.4a1.7 1.7 0 0 0-1.87.34l-.06.06a2 2 0 1 1-2.83-2.83l.06-.06A1.7 1.7 0 0 0 4.6 15a1.7 1.7 0 0 0-1.55-1H3a2 2 0 1 1 0-4h.05A1.7 1.7 0 0 0 4.6 9a1.7 1.7 0 0 0-.34-1.87l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06A1.7 1.7 0 0 0 9 4.6h.09A1.7 1.7 0 0 0 10 3.05V3a2 2 0 1 1 4 0v.05A1.7 1.7 0 0 0 15 4.6a1.7 1.7 0 0 0 1.87-.34l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06A1.7 1.7 0 0 0 19.4 9v.09a1.7 1.7 0 0 0 1.55.91H21a2 2 0 1 1 0 4h-.05a1.7 1.7 0 0 0-1.55 1z"/></svg></span><span>系统设置</span></button>
  39. <div class="sidebar-bottom">
  40. <span>v1.0.0</span>
  41. <img src="/assets/powered-by.png" alt="Hyreal IDE" class="sidebar-powered">
  42. </div>
  43. </aside>
  44. <div class="main-wrap">
  45. <!-- ==================== 门店采集 ==================== -->
  46. <div id="viewCrawl" class="view active">
  47. <main class="content">
  48. <div class="page-header">
  49. <div>
  50. <h1>门店采集</h1>
  51. <div class="sub">从淘宝闪购后台按店铺批量采集菜品图,用于后续视觉美化</div>
  52. </div>
  53. </div>
  54. <div class="crawl-grid">
  55. <div class="left-col">
  56. <div class="panel panel-narrow panel-designed">
  57. <div class="stage-marker"><span class="stage-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 7h16M4 17h16"/><circle cx="9" cy="7" r="2.2"/><circle cx="15" cy="17" r="2.2"/></svg></span><span>抓取设置</span></div>
  58. <span class="panel-watermark"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M12 3a9 9 0 1 0 0 18 9 9 0 0 0 0-18Z"/><path d="M12 8v4l3 2"/></svg></span>
  59. <div class="panel-body">
  60. <div class="field">
  61. <label>抓取内容</label>
  62. <select disabled><option>菜品图片 + 名称</option></select>
  63. </div>
  64. <button class="collapse-trigger" id="advToggle" aria-expanded="false">
  65. <span>高级设置</span><span class="chev"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M9 6l6 6-6 6"/></svg></span>
  66. </button>
  67. <div id="advBody" class="collapse">
  68. <div style="padding-top:12px;display:flex;flex-direction:column;gap:12px;">
  69. <label style="display:flex;align-items:center;gap:6px;font-size:13px;cursor:pointer;">
  70. <input type="checkbox" id="forceFullCrawl">
  71. <span>强制全量抓取(覆盖已有图片)</span>
  72. </label>
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. <button class="btn btn-primary btn-block" id="startBtn">
  78. <span id="startBtnIcon"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M8 5v14l11-7z"/></svg></span>
  79. <span id="startBtnText">开始抓取</span>
  80. </button>
  81. <button class="btn btn-danger btn-block" id="stopBtn" disabled style="display:none;"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><rect x="6" y="6" width="12" height="12" rx="2"/></svg><span>停止</span></button>
  82. <div class="panel panel-fixed panel-progress">
  83. <div class="panel-title">
  84. <span>进度列表</span>
  85. <span class="actions"><span class="badge" id="crawlStatusBadge"></span></span>
  86. </div>
  87. <div id="progressList"></div>
  88. </div>
  89. </div>
  90. <div class="right-col">
  91. <div class="panel panel-fixed panel-shops">
  92. <div class="panel-title">
  93. <span>店铺清单</span>
  94. <span class="actions">
  95. <span class="badge badge-info" id="shopCount">0 家</span>
  96. <button class="btn btn-ghost btn-small" id="btnToggleAdd">+ 添加店铺</button>
  97. </span>
  98. </div>
  99. <div style="overflow-x:auto;">
  100. <table class="data-table">
  101. <thead>
  102. <tr>
  103. <th style="width:36px;"><input type="checkbox" id="selectAllCb"></th>
  104. <th style="min-width:220px;">店铺</th>
  105. <th style="width:100px;">shopId</th>
  106. <th style="width:100px;">状态</th>
  107. <th style="width:220px;">文件夹</th>
  108. </tr>
  109. </thead>
  110. <tbody id="shopTableBody"></tbody>
  111. </table>
  112. <div id="shopTableEmpty" class="empty-hint">
  113. <div class="empty-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="5" y="4" width="14" height="17" rx="2"/><path d="M9 4a3 3 0 0 1 6 0"/><path d="M9 10h6M9 14h6M9 18h4"/></svg></div>
  114. <p>尚无店铺<br><small>点击右上角「+ 添加店铺」手动录入</small></p>
  115. </div>
  116. </div>
  117. </div>
  118. </div>
  119. </div>
  120. </main>
  121. </div>
  122. <!-- ==================== 视觉生成 ==================== -->
  123. <div id="viewGen" class="view">
  124. <main class="content">
  125. <div class="page-header">
  126. <div>
  127. <h1>视觉生成</h1>
  128. <div class="sub">基于已采集的菜品图片,批量生成 LOGO / 海报 / 招牌 / 贴纸 + 菜品图</div>
  129. </div>
  130. <div class="toolbar">
  131. <button class="btn btn-ghost btn-small" id="btnRefreshGen">
  132. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12a8 8 0 1 1-2.3-5.6"/><path d="M20 4v5h-5"/></svg>
  133. 刷新
  134. </button>
  135. </div>
  136. </div>
  137. <div class="gen-overview">
  138. <div class="stats-grid" id="statsBar">
  139. <div class="metric accent"><span class="metric-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20V9l8-5 8 5v11"/><path d="M9 20v-6h6v6"/></svg></span><span class="metric-body"><span class="metric-label">店铺</span><span class="metric-value" id="statShops">—</span><span class="stat-delta" id="statShopsDelta"></span></span></div>
  140. <div class="metric ok"><span class="metric-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M5 12.5l4.5 4.5L19 7.5"/></svg></span><span class="metric-body"><span class="metric-label">已生成</span><span class="metric-value" id="statDone">—</span><span class="stat-delta" id="statDoneDelta"></span></span></div>
  141. <div class="metric warn"><span class="metric-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M7 3h10M7 21h10"/><path d="M8 3c0 8 8 8 8 18M16 3c0 8-8 8-8 18"/></svg></span><span class="metric-body"><span class="metric-label">待处理</span><span class="metric-value" id="statPending">—</span><span class="stat-delta" id="statPendingDelta"></span></span></div>
  142. <div class="metric fail"><span class="metric-icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="9"/><path d="M12 7v6M12 16.5v.5"/></svg></span><span class="metric-body"><span class="metric-label">失败</span><span class="metric-value" id="statFail">—</span><span class="stat-delta" id="statFailDelta"></span></span></div>
  143. </div>
  144. <div class="gen-controls">
  145. <div class="field">
  146. <label>扫描范围</label>
  147. <div class="scan-dropdown" id="scanDropdown">
  148. <button type="button" class="scan-dropdown-trigger" id="scanDropdownTrigger" aria-expanded="false" aria-haspopup="listbox">
  149. <span id="scanDropdownText">全量扫描</span>
  150. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M6 9l6 6 6-6"/></svg>
  151. </button>
  152. <div class="scan-dropdown-menu" id="scanDropdownMenu" role="listbox" aria-multiselectable="true" hidden></div>
  153. </div>
  154. </div>
  155. <button class="btn btn-primary" id="scanBtn">
  156. <span id="scanIcon"><svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M8 5v14l11-7z"/></svg></span>
  157. <span id="scanText">扫描店铺</span>
  158. </button>
  159. </div>
  160. </div>
  161. <div class="shop-cards" id="shopList"></div>
  162. </main>
  163. </div>
  164. <!-- ==================== 历史创作 ==================== -->
  165. <div id="viewTasks" class="view">
  166. <main class="content">
  167. <div class="page-header">
  168. <div>
  169. <h1>任务中心</h1>
  170. <div class="sub">跟踪生成任务状态,服务重启后可恢复进行中的生成任务</div>
  171. </div>
  172. <div class="toolbar">
  173. <button class="btn btn-ghost btn-small" id="btnRefreshTasks">
  174. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12a8 8 0 1 1-2.3-5.6"/><path d="M20 4v5h-5"/></svg>
  175. 刷新
  176. </button>
  177. </div>
  178. </div>
  179. <div class="tasks-overview panel panel-designed">
  180. <span class="panel-watermark"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 7h10M4 12h16M4 17h7"/><circle cx="18" cy="7" r="2"/><circle cx="15" cy="17" r="2"/></svg></span>
  181. <div class="tasks-stats">
  182. <div class="task-stat"><span>全部</span><strong id="taskCountAll">0</strong></div>
  183. <div class="task-stat running"><span>进行中</span><strong id="taskCountRunning">0</strong></div>
  184. <div class="task-stat queued"><span>排队</span><strong id="taskCountQueued">0</strong></div>
  185. <div class="task-stat success"><span>成功</span><strong id="taskCountSuccess">0</strong></div>
  186. <div class="task-stat failed"><span>失败</span><strong id="taskCountFailed">0</strong></div>
  187. </div>
  188. <div class="tasks-filters" id="taskFilters">
  189. <button class="history-filter active" data-filter="all">全部</button>
  190. <button class="history-filter" data-filter="running">进行中</button>
  191. <button class="history-filter" data-filter="queued">排队中</button>
  192. <button class="history-filter" data-filter="success">已完成</button>
  193. <button class="history-filter" data-filter="failed">失败</button>
  194. </div>
  195. </div>
  196. <div class="history-summary" id="taskSummary">正在加载任务…</div>
  197. <div class="task-list" id="taskList"></div>
  198. </main>
  199. </div>
  200. <!-- ==================== 历史创作 ==================== -->
  201. <div id="viewHistory" class="view">
  202. <main class="content">
  203. <div class="page-header">
  204. <div>
  205. <h1>历史创作</h1>
  206. <div class="sub">以图片墙回顾已生成的品牌物料与菜品作品</div>
  207. </div>
  208. <div class="toolbar">
  209. <button class="btn btn-ghost btn-small" id="btnRefreshHistory">
  210. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 12a8 8 0 1 1-2.3-5.6"/><path d="M20 4v5h-5"/></svg>
  211. 刷新
  212. </button>
  213. </div>
  214. </div>
  215. <div class="history-toolbar panel">
  216. <div class="history-search">
  217. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="11" cy="11" r="6.5"/><path d="M20 20l-4.2-4.2"/></svg>
  218. <input type="text" id="historySearch" placeholder="搜索门店或作品名称">
  219. </div>
  220. <div class="history-filters" id="historyFilters">
  221. <button class="history-filter active" data-filter="all">全部</button>
  222. <button class="history-filter" data-filter="logo">LOGO</button>
  223. <button class="history-filter" data-filter="banner">海报</button>
  224. <button class="history-filter" data-filter="signage">招牌</button>
  225. <button class="history-filter" data-filter="sticker">贴纸</button>
  226. <button class="history-filter" data-filter="dish">菜品</button>
  227. </div>
  228. </div>
  229. <div class="history-summary" id="historySummary">加载中…</div>
  230. <div class="history-gallery" id="historyGallery"></div>
  231. </main>
  232. </div>
  233. <!-- ==================== 系统设置 ==================== -->
  234. <div id="viewSettings" class="view">
  235. <main class="content">
  236. <div class="page-header">
  237. <div>
  238. <h1>系统设置</h1>
  239. <div class="sub">API 密钥与采集配置,保存后立即生效</div>
  240. </div>
  241. </div>
  242. <div class="settings-workspace">
  243. <div class="settings-forms">
  244. <div class="panel panel-narrow">
  245. <div class="stage-marker"><span class="num">1</span><span>API 设置</span></div>
  246. <span class="panel-watermark"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="7.5" cy="15.5" r="4.5"/><path d="M11 12L21 2"/><path d="M16 7l3 3"/></svg></span>
  247. <div class="panel-body">
  248. <div class="field">
  249. <div class="field-label-row">
  250. <label>API Key<span class="req">*</span></label>
  251. <a class="settings-link settings-link-compact" href="https://o-hubs.com/api/console/keys" target="_blank" rel="noopener noreferrer">
  252. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="7.5" cy="15.5" r="4.5"/><path d="M11 12L21 2"/><path d="M16 7l3 3"/></svg>
  253. <span>获取 API Key</span>
  254. </a>
  255. </div>
  256. <input type="text" id="settingsApiKey" placeholder="sk-...">
  257. </div>
  258. <div class="field">
  259. <label>API 地址</label>
  260. <input type="text" id="settingsApiBase" value="https://api.lk888.ai" disabled>
  261. </div>
  262. <div class="field">
  263. <label>默认模型</label>
  264. <select id="settingsModel"></select>
  265. </div>
  266. <div class="settings-links">
  267. <a class="settings-link" href="https://o-hubs.com/home" target="_blank" rel="noopener noreferrer">
  268. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="3" y="6" width="18" height="13" rx="3"/><path d="M3 10h18"/><path d="M7 15h3"/></svg>
  269. <span>充值</span>
  270. </a>
  271. </div>
  272. </div>
  273. </div>
  274. <div class="panel panel-narrow">
  275. <div class="stage-marker"><span class="num">2</span><span>采集配置</span></div>
  276. <span class="panel-watermark"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z"/><path d="M3 11h18"/></svg></span>
  277. <div class="panel-body">
  278. <div class="field">
  279. <label>输出根目录</label>
  280. <input type="text" id="settingsRootDir" placeholder="/path/to/workspace">
  281. </div>
  282. <div class="field-row">
  283. <div class="field">
  284. <label>每页条数</label>
  285. <input type="number" id="pageSizeInput" min="1" value="50">
  286. </div>
  287. <div class="field">
  288. <label>间隔 (ms)</label>
  289. <input type="number" id="delayInput" min="0" value="300">
  290. <div class="help">建议 ≥ 200</div>
  291. </div>
  292. </div>
  293. <div class="field">
  294. <label>Cookie(淘宝闪购)</label>
  295. <textarea id="settingsCookie" rows="3" placeholder="登录 melody.shop.ele.me 后从 DevTools 复制"></textarea>
  296. <div class="help">Cookie 保存后不再回显;会话过期时粘贴新值即可更新</div>
  297. </div>
  298. <div style="display:flex;align-items:center;gap:8px;">
  299. <button class="btn btn-primary btn-small" id="btnSaveSettings">保存设置</button>
  300. <span id="settingsStatus" class="badge"></span>
  301. </div>
  302. </div>
  303. </div>
  304. </div>
  305. <div class="panel panel-fixed panel-log settings-log">
  306. <div class="panel-title">
  307. <span>实时日志</span>
  308. <span class="actions">
  309. <button class="btn btn-ghost btn-small" id="btnClearLog">清空日志</button>
  310. </span>
  311. </div>
  312. <span class="panel-watermark log-watermark"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 5h16v11H8l-4 4Z"/><path d="M8 9h8M8 12h5"/></svg></span>
  313. <div class="log-box" id="logPanel"></div>
  314. </div>
  315. </div>
  316. </main>
  317. </div>
  318. </div>
  319. </div>
  320. <div class="toast-wrap" id="toast-wrap"></div>
  321. <!-- 添加店铺弹窗 -->
  322. <div class="modal-overlay" id="modalAddShop" hidden>
  323. <div class="modal">
  324. <div class="modal-header">
  325. <div class="modal-title">
  326. <span class="modal-status-icon">
  327. <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 20V9l8-5 8 5v11"/><path d="M9 20v-6h6v6"/></svg>
  328. </span>
  329. <span>添加店铺</span>
  330. </div>
  331. <button class="modal-close" id="btnCloseModal">&times;</button>
  332. </div>
  333. <div class="modal-body">
  334. <div class="field">
  335. <label>店铺清单</label>
  336. <textarea id="manualInput" rows="5" placeholder="每行一个:shopId 店铺名&#10;507068342 鑫龙福麻辣烫(康诺美食城店)"></textarea>
  337. <div class="help">每行一条,shopId 和店铺名用空格或逗号分隔</div>
  338. </div>
  339. </div>
  340. <div class="modal-footer">
  341. <button class="btn btn-ghost btn-small" id="btnCancelAdd">取消</button>
  342. <button class="btn btn-primary btn-small" id="useManualBtn">确认添加</button>
  343. </div>
  344. </div>
  345. </div>
  346. <script src="/crawl.js"></script>
  347. <script src="/gen.js"></script>
  348. <script src="/tasks.js"></script>
  349. <script src="/history.js"></script>
  350. <script src="/app.js"></script>
  351. </body>
  352. </html>