index.html 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  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>BindVault MVP</title>
  7. <link rel="stylesheet" href="styles.css" />
  8. </head>
  9. <body>
  10. <section id="license-gate" class="license-gate" hidden>
  11. <div class="license-card">
  12. <button class="license-close" type="button" data-close-license aria-label="关闭">×</button>
  13. <div class="license-brand">
  14. <div class="brand-mark">BV</div>
  15. <div>
  16. <h1>BindVault</h1>
  17. <p>个人数字资产台账</p>
  18. </div>
  19. </div>
  20. <div class="license-tabs">
  21. <button class="license-tab active" data-tab="register">获取激活码</button>
  22. <button class="license-tab" data-tab="activate">已有激活码</button>
  23. </div>
  24. <div id="license-panel-register" class="license-panel">
  25. <p class="license-desc">输入邮箱,系统会自动发送一个 <strong>7 天免费激活码</strong>。</p>
  26. <form id="license-register-form" class="license-form">
  27. <input id="license-email" type="email" placeholder="[email protected]" autocomplete="email" required />
  28. <button class="primary-button" type="submit" id="license-register-btn">发送激活码</button>
  29. </form>
  30. <p id="license-register-msg" class="license-msg" hidden></p>
  31. </div>
  32. <div id="license-panel-activate" class="license-panel" hidden>
  33. <p class="license-desc">输入邮件中收到的激活码以继续使用。</p>
  34. <form id="license-activate-form" class="license-form">
  35. <input id="license-key" type="text" placeholder="BV-XXXXXXXX-XXXXXXXX-XXXXXXXX" autocomplete="off" spellcheck="false" required />
  36. <button class="primary-button" type="submit" id="license-activate-btn">激活</button>
  37. </form>
  38. <p id="license-activate-msg" class="license-msg" hidden></p>
  39. </div>
  40. </div>
  41. </section>
  42. <div class="app-shell" hidden>
  43. <aside class="sidebar">
  44. <div class="brand">
  45. <div class="brand-mark">BV</div>
  46. <div>
  47. <h1>BindVault</h1>
  48. <p>个人数字资产台账</p>
  49. </div>
  50. </div>
  51. <nav id="nav" class="nav"></nav>
  52. <div class="account-menu-wrap sidebar-account">
  53. <div id="account-menu" class="account-menu account-menu-up" hidden>
  54. <div class="account-menu-license">
  55. <span id="account-menu-tier-label">Free 套餐</span>
  56. <strong id="account-menu-license-key">未激活</strong>
  57. <small id="account-menu-license-status">-</small>
  58. </div>
  59. <button type="button" data-account-action="upgrade">升级套餐</button>
  60. <button type="button" data-account-action="profile">个人中心</button>
  61. <button type="button" data-account-action="guide">新手指引</button>
  62. <button type="button" data-account-action="signout">退出登录</button>
  63. </div>
  64. <button class="sidebar-user" type="button" id="topbar-avatar" aria-label="个人中心" aria-expanded="false">
  65. <span class="sidebar-user-avatar" id="sidebar-user-avatar">B</span>
  66. <span class="sidebar-user-info">
  67. <strong id="sidebar-user-email">未激活</strong>
  68. <small id="sidebar-user-tier">Free</small>
  69. </span>
  70. <svg class="sidebar-user-caret" viewBox="0 0 24 24" aria-hidden="true"><path d="M8 9l4-4 4 4M16 15l-4 4-4-4"/></svg>
  71. </button>
  72. </div>
  73. </aside>
  74. <main class="main">
  75. <header class="topbar">
  76. <div class="topbar-heading">
  77. <p class="eyebrow">MVP workspace</p>
  78. <h2 id="page-title">Dashboard</h2>
  79. </div>
  80. <div class="topbar-actions">
  81. <label class="global-search">
  82. <svg class="search-icon" viewBox="0 0 24 24" aria-hidden="true"><circle cx="11" cy="11" r="6.5"/><path d="M16 16l4 4"/></svg>
  83. <input id="global-search" type="search" placeholder="搜索资源、账号或关系..." />
  84. </label>
  85. <label class="language-select-wrap" aria-label="Language">
  86. <select id="language-select">
  87. <option value="zh">中文</option>
  88. <option value="en">English</option>
  89. </select>
  90. </label>
  91. <button id="topbar-refresh" class="icon-pill" type="button" title="刷新" aria-label="刷新">
  92. <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M4 12a8 8 0 0 1 13.7-5.6L20 4M20 4v6h-6"/><path d="M20 12a8 8 0 0 1-13.7 5.6L4 20M4 20v-6h6"/></svg>
  93. </button>
  94. <button id="topbar-new" class="primary-button topbar-primary" type="button">
  95. <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M12 5v14M5 12h14"/></svg>
  96. <span>新建绑定</span>
  97. </button>
  98. <button id="topbar-bell" class="icon-pill" type="button" title="通知" aria-label="通知">
  99. <svg viewBox="0 0 24 24" aria-hidden="true"><path d="M6 16V11a6 6 0 0 1 12 0v5l1.5 2H4.5L6 16Z"/><path d="M10 20a2 2 0 0 0 4 0"/></svg>
  100. <span class="bell-dot" aria-hidden="true"></span>
  101. </button>
  102. <button id="seed-demo" class="ghost-button utility-action" type="button">示例数据</button>
  103. <button id="export-json" class="ghost-button utility-action" type="button">导出 JSON</button>
  104. <label class="file-button utility-action">
  105. 导入 JSON
  106. <input id="import-json" type="file" accept="application/json" />
  107. </label>
  108. </div>
  109. </header>
  110. <section id="content" class="content"></section>
  111. </main>
  112. </div>
  113. <div id="toast" class="toast" role="status" aria-live="polite" popover="manual">
  114. <span id="toast-icon" class="toast-icon">OK</span>
  115. <span id="toast-message">已保存</span>
  116. </div>
  117. <dialog id="record-dialog" class="dialog">
  118. <form id="record-form" method="dialog">
  119. <div class="dialog-head">
  120. <div>
  121. <p class="eyebrow" id="dialog-kicker">Record</p>
  122. <h3 id="dialog-title">新增</h3>
  123. </div>
  124. <button class="icon-button" value="cancel" type="button" data-close-dialog aria-label="关闭">×</button>
  125. </div>
  126. <div id="form-fields" class="form-grid"></div>
  127. <div class="dialog-actions">
  128. <button class="ghost-button" value="cancel" type="button" data-close-dialog>取消</button>
  129. <button class="primary-button" id="save-record" value="default" type="submit">保存</button>
  130. </div>
  131. </form>
  132. </dialog>
  133. <dialog id="onboarding-dialog" class="onboarding-dialog">
  134. <div class="onboarding-panel">
  135. <div class="onboarding-head">
  136. <div>
  137. <p class="eyebrow">Getting Started</p>
  138. <h3>快速建立第一条账号链路</h3>
  139. </div>
  140. <button class="icon-button" type="button" data-close-onboarding aria-label="关闭">×</button>
  141. </div>
  142. <div class="onboarding-steps">
  143. <article class="onboarding-step">
  144. <span class="onboarding-step-index">1</span>
  145. <div>
  146. <h4>先填写邮箱</h4>
  147. <p>先录入一个可收信邮箱,马上用它作为账号登录邮箱。</p>
  148. <button class="primary-button" type="button" data-guide-action="email">新增邮箱</button>
  149. </div>
  150. </article>
  151. <article class="onboarding-step">
  152. <span class="onboarding-step-index">2</span>
  153. <div>
  154. <h4>新建账号并选择登录邮箱</h4>
  155. <p>平台可以填 BindVault,登录邮箱选择刚才录入的邮箱。</p>
  156. <button class="ghost-button" type="button" data-guide-action="account">新增账号</button>
  157. </div>
  158. </article>
  159. <article class="onboarding-step">
  160. <span class="onboarding-step-index">3</span>
  161. <div>
  162. <h4>自动生成登录绑定</h4>
  163. <p>保存账号后,系统会自动创建邮箱到账号的登录绑定关系。</p>
  164. <button class="ghost-button" type="button" data-guide-action="account">继续账号</button>
  165. </div>
  166. </article>
  167. <article class="onboarding-step">
  168. <span class="onboarding-step-index">4</span>
  169. <div>
  170. <h4>查看绑定拓扑</h4>
  171. <p>进入绑定关系页,查看邮箱和账号之间的第一条资产链路。</p>
  172. <button class="ghost-button" type="button" data-guide-action="binding">查看拓扑</button>
  173. </div>
  174. </article>
  175. </div>
  176. <div class="onboarding-actions">
  177. <button class="ghost-button" type="button" data-close-onboarding>稍后再说</button>
  178. <button class="primary-button" type="button" data-guide-action="email">开始录入</button>
  179. </div>
  180. </div>
  181. </dialog>
  182. <dialog id="pricing-dialog" class="dialog pricing-dialog">
  183. <div class="pricing-head">
  184. <div>
  185. <p class="eyebrow">Upgrade</p>
  186. <h3>选择适合你的套餐</h3>
  187. <p class="pricing-sub">从基础台账到全功能解锁,按需升级。</p>
  188. </div>
  189. <button class="icon-button" type="button" data-close-pricing aria-label="关闭">×</button>
  190. </div>
  191. <div class="pricing-grid">
  192. <article class="pricing-card" data-tier-card="free">
  193. <header>
  194. <h4>Free</h4>
  195. <div class="pricing-price"><span class="pricing-currency">¥</span><span class="pricing-amount">0</span><span class="pricing-period">/ 月</span></div>
  196. <p class="pricing-desc">本地管理你的数字资产</p>
  197. </header>
  198. <button class="pricing-cta pricing-cta-current" type="button" data-pricing-action="free">当前套餐</button>
  199. <ul class="pricing-features">
  200. <li>基础资产管理(手机 / 邮箱 / 域名)</li>
  201. <li>账号与绑定关系图</li>
  202. <li>风险事件追踪</li>
  203. <li>本地 SQLite 存储</li>
  204. <li>JSON 导入 / 导出</li>
  205. <li>最多 3 台设备使用</li>
  206. </ul>
  207. </article>
  208. <article class="pricing-card pricing-card-pro" data-tier-card="pro">
  209. <div class="pricing-badge">推荐</div>
  210. <header>
  211. <h4>Pro</h4>
  212. <div class="pricing-price"><span class="pricing-currency">¥</span><span class="pricing-amount">29</span><span class="pricing-period">/ 月</span></div>
  213. <p class="pricing-desc">解锁全部高级能力</p>
  214. </header>
  215. <button class="pricing-cta pricing-cta-upgrade" type="button" data-pricing-action="pro">升级至 Pro</button>
  216. <p class="pricing-includes">包含 Free 所有功能,并解锁:</p>
  217. <ul class="pricing-features pricing-features-pro">
  218. <li>多设备云端同步</li>
  219. <li>每日自动备份</li>
  220. <li>数据端到端加密</li>
  221. <li>高级风险检测(恢复链路异常 / 单点故障预警)</li>
  222. <li>批量 CSV 导入与导出</li>
  223. <li>无限制账号与绑定数量</li>
  224. <li>优先邮件支持</li>
  225. </ul>
  226. </article>
  227. </div>
  228. </dialog>
  229. <dialog id="profile-dialog" class="dialog profile-dialog">
  230. <div class="dialog-head">
  231. <div>
  232. <p class="eyebrow">Account</p>
  233. <h3>个人中心</h3>
  234. </div>
  235. <button class="icon-button" type="button" data-close-profile aria-label="关闭">×</button>
  236. </div>
  237. <div class="profile-body">
  238. <section class="profile-section">
  239. <h4>账号信息</h4>
  240. <div class="profile-grid">
  241. <div class="profile-item">
  242. <span>邮箱</span>
  243. <strong id="profile-email">-</strong>
  244. </div>
  245. <div class="profile-item">
  246. <span>设备 ID</span>
  247. <strong id="profile-device-id" class="mono">-</strong>
  248. </div>
  249. </div>
  250. </section>
  251. <section class="profile-section">
  252. <h4>授权状态</h4>
  253. <div class="profile-grid">
  254. <div class="profile-item">
  255. <span>激活码</span>
  256. <strong id="profile-key" class="mono">-</strong>
  257. </div>
  258. <div class="profile-item">
  259. <span>套餐</span>
  260. <strong id="profile-plan">-</strong>
  261. </div>
  262. <div class="profile-item">
  263. <span>授权状态</span>
  264. <strong id="profile-license-status">-</strong>
  265. </div>
  266. </div>
  267. </section>
  268. <section class="profile-section">
  269. <h4>本地数据</h4>
  270. <div class="profile-grid">
  271. <div class="profile-item">
  272. <span>资产总数</span>
  273. <strong id="profile-asset-count">-</strong>
  274. </div>
  275. <div class="profile-item">
  276. <span>账号总数</span>
  277. <strong id="profile-account-count">-</strong>
  278. </div>
  279. <div class="profile-item">
  280. <span>绑定关系</span>
  281. <strong id="profile-binding-count">-</strong>
  282. </div>
  283. </div>
  284. </section>
  285. </div>
  286. <div class="dialog-actions">
  287. <button class="ghost-button" type="button" data-close-profile>关闭</button>
  288. </div>
  289. </dialog>
  290. <script src="locales.js"></script>
  291. <script src="data/Regin.js"></script>
  292. <script src="platformCatalog.js"></script>
  293. <script src="platformAssets.js"></script>
  294. <script src="app.js"></script>
  295. </body>
  296. </html>