index.tpl 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618
  1. {include file='user/header.tpl'}
  2. <script src="//{$config['jsdelivr_url']}/npm/clipboard@latest/dist/clipboard.min.js"></script>
  3. <div class="page-wrapper">
  4. <div class="container-xl">
  5. <div class="page-header d-print-none text-white">
  6. <div class="row align-items-center">
  7. <div class="col">
  8. <h2 class="page-title">
  9. <span class="home-title">用户中心</span>
  10. </h2>
  11. <div class="page-pretitle my-3">
  12. <span class="home-subtitle">在这里查看账户信息和最新公告</span>
  13. </div>
  14. </div>
  15. </div>
  16. </div>
  17. </div>
  18. <div class="page-body">
  19. <div class="container-xl">
  20. <div class="row row-deck row-cards">
  21. <div class="col-12">
  22. <div class="row row-cards">
  23. <div class="col-sm-6 col-lg-3">
  24. <div class="card card-sm">
  25. <div class="card-body">
  26. <div class="row align-items-center">
  27. <div class="col-auto">
  28. <span class="bg-blue text-white avatar">
  29. <i class="ti ti-vip icon"></i>
  30. </span>
  31. </div>
  32. <div class="col">
  33. <div class="font-weight-medium">
  34. 账户等级
  35. </div>
  36. <div class="text-secondary">
  37. {if $user->class === 0}
  38. 免费
  39. {else}
  40. Lv. {$user->class}
  41. {/if}
  42. </div>
  43. </div>
  44. </div>
  45. </div>
  46. </div>
  47. </div>
  48. <div class="col-sm-6 col-lg-3">
  49. <div class="card card-sm">
  50. <div class="card-body">
  51. <div class="row align-items-center">
  52. <div class="col-auto">
  53. <span class="bg-green text-white avatar">
  54. <i class="ti ti-coin icon"></i>
  55. </span>
  56. </div>
  57. <div class="col">
  58. <div class="font-weight-medium">
  59. 账户余额
  60. </div>
  61. <div class="text-secondary">
  62. {$user->money}
  63. </div>
  64. </div>
  65. <div class="col-auto">
  66. <a href="/user/money" class="btn btn-primary btn-icon">
  67. <i class="ti ti-plus icon"></i>
  68. </a>
  69. </div>
  70. </div>
  71. </div>
  72. </div>
  73. </div>
  74. <div class="col-sm-6 col-lg-3">
  75. <div class="card card-sm">
  76. <div class="card-body">
  77. <div class="row align-items-center">
  78. <div class="col-auto">
  79. <span class="bg-twitter text-white avatar">
  80. <i class="ti ti-devices-pc icon"></i>
  81. </span>
  82. </div>
  83. <div class="col">
  84. <div class="font-weight-medium">
  85. 同时连接IP限制
  86. </div>
  87. <div class="text-secondary">
  88. {if $user->node_iplimit !== 0}
  89. {$user->node_iplimit}
  90. {else}
  91. 不限制
  92. {/if}
  93. </div>
  94. </div>
  95. </div>
  96. </div>
  97. </div>
  98. </div>
  99. <div class="col-sm-6 col-lg-3">
  100. <div class="card card-sm">
  101. <div class="card-body">
  102. <div class="row align-items-center">
  103. <div class="col-auto">
  104. <span class="bg-facebook text-white avatar">
  105. <i class="ti ti-rocket icon"></i>
  106. </span>
  107. </div>
  108. <div class="col">
  109. <div class="font-weight-medium">
  110. 速度限制
  111. </div>
  112. <div class="text-secondary">
  113. {if $user->node_speedlimit !== 0.0}
  114. <code>{$user->node_speedlimit}</code>
  115. Mbps
  116. {else}
  117. 不限制
  118. {/if}
  119. </div>
  120. </div>
  121. </div>
  122. </div>
  123. </div>
  124. </div>
  125. </div>
  126. </div>
  127. <div class="col-lg-6 col-sm-12">
  128. <div class="card">
  129. <ul class="nav nav-tabs nav-fill" data-bs-toggle="tabs">
  130. <li class="nav-item">
  131. <a href="#sub" class="nav-link active" data-bs-toggle="tab">
  132. <i class="ti ti-rss icon"></i>
  133. &nbsp;通用订阅
  134. </a>
  135. </li>
  136. <li class="nav-item">
  137. <a href="#client-sub" class="nav-link" data-bs-toggle="tab">
  138. <i class="ti ti-rss icon"></i>
  139. &nbsp;客户端订阅
  140. </a>
  141. </li>
  142. <li class="nav-item">
  143. <a href="#windows" class="nav-link" data-bs-toggle="tab">
  144. <i class="ti ti-brand-windows icon"></i>
  145. &nbsp;Windows
  146. </a>
  147. </li>
  148. <li class="nav-item">
  149. <a href="#macos" class="nav-link" data-bs-toggle="tab">
  150. <i class="ti ti-brand-finder icon"></i>
  151. &nbsp;MacOS
  152. </a>
  153. </li>
  154. <li class="nav-item">
  155. <a href="#android" class="nav-link" data-bs-toggle="tab">
  156. <i class="ti ti-brand-android icon"></i>
  157. &nbsp;Android
  158. </a>
  159. </li>
  160. <li class="nav-item">
  161. <a href="#ios" class="nav-link" data-bs-toggle="tab">
  162. <i class="ti ti-brand-apple icon"></i>
  163. &nbsp;iOS
  164. </a>
  165. </li>
  166. <li class="nav-item">
  167. <a href="#linux" class="nav-link" data-bs-toggle="tab">
  168. <i class="ti ti-brand-redhat icon"></i>
  169. &nbsp;Linux
  170. </a>
  171. </li>
  172. <li class="nav-item">
  173. <a href="#config" class="nav-link" data-bs-toggle="tab">
  174. <i class="ti ti-file-text icon"></i>
  175. &nbsp;Config
  176. </a>
  177. </li>
  178. </ul>
  179. <div class="card-body">
  180. <div class="tab-content">
  181. <div class="tab-pane active show" id="sub">
  182. <div>
  183. <p>
  184. 通用订阅(json):<code>{$UniversalSub}/json</code>
  185. </p>
  186. <p>
  187. 通用订阅(clash):<code>{$UniversalSub}/clash</code>
  188. </p>
  189. <p>
  190. 通用订阅(sing-box):<code>{$UniversalSub}/singbox</code>
  191. </p>
  192. {if $public_setting['enable_ss_sub']}
  193. <p>
  194. 通用订阅(sip008):<code>{$UniversalSub}/sip008</code>
  195. </p>
  196. {/if}
  197. <div class="btn-list justify-content-start">
  198. <a data-clipboard-text="{$UniversalSub}/json"
  199. class="copy btn btn-primary">
  200. 复制通用订阅(json)
  201. </a>
  202. <a data-clipboard-text="{$UniversalSub}/clash"
  203. class="copy btn btn-primary">
  204. 复制通用订阅(clash)
  205. </a>
  206. <a data-clipboard-text="{$UniversalSub}/singbox"
  207. class="copy btn btn-primary">
  208. 复制通用订阅(sing-box)
  209. </a>
  210. {if $public_setting['enable_ss_sub']}
  211. <a data-clipboard-text="{$UniversalSub}/sip008"
  212. class="copy btn btn-primary">
  213. 复制通用订阅(sip008)
  214. </a>
  215. {/if}
  216. </div>
  217. </div>
  218. </div>
  219. <div class="tab-pane show" id="client-sub">
  220. <div>
  221. {if $public_setting['enable_ss_sub']}
  222. <p>
  223. 客户端订阅(Shadowsocks):<code>{$UniversalSub}/ss</code></p>
  224. <p>
  225. 客户端订阅(SIP002):<code>{$UniversalSub}/sip002</code>
  226. </p>
  227. {/if}
  228. {if $public_setting['enable_v2_sub']}
  229. <p>
  230. 客户端订阅(V2Ray):<code>{$UniversalSub}/v2ray</code>
  231. </p>
  232. {/if}
  233. {if $public_setting['enable_trojan_sub']}
  234. <p>
  235. 客户端订阅(Trojan):<code>{$UniversalSub}/trojan</code>
  236. </p>
  237. {/if}
  238. <div class="btn-list justify-content-start">
  239. {if $public_setting['enable_ss_sub']}
  240. <a data-clipboard-text="{$UniversalSub}/ss"
  241. class="copy btn btn-primary">
  242. 复制客户端订阅(Shadowsocks)
  243. </a>
  244. <a data-clipboard-text="{$UniversalSub}/sip002"
  245. class="copy btn btn-primary">
  246. 复制客户端订阅(SIP002)
  247. </a>
  248. {/if}
  249. {if $public_setting['enable_v2_sub']}
  250. <a data-clipboard-text="{$UniversalSub}/v2ray"
  251. class="copy btn btn-primary">
  252. 复制客户端订阅(V2Ray)
  253. </a>
  254. {/if}
  255. {if $public_setting['enable_trojan_sub']}
  256. <a data-clipboard-text="{$UniversalSub}/trojan"
  257. class="copy btn btn-primary">
  258. 复制客户端订阅(Trojan)
  259. </a>
  260. {/if}
  261. </div>
  262. </div>
  263. </div>
  264. <div class="tab-pane" id="windows">
  265. <div>
  266. <p>
  267. 适用于 Clash 的订阅:<code>{$UniversalSub}/clash</code>
  268. </p>
  269. <div class="btn-list justify-content-start">
  270. <a
  271. {if $config['enable_r2_client_download']}
  272. href="/user/clients/Clash.Verge.exe"
  273. {else}
  274. href="/clients/Clash.Verge.exe"
  275. {/if} class="btn btn-azure">
  276. 下载 Clash Verge
  277. </a>
  278. <a data-clipboard-text="{$UniversalSub}/clash"
  279. class="copy btn btn-primary">
  280. 复制 Clash 订阅链接
  281. </a>
  282. <a href="clash://install-config?url={$UniversalSub}/clash&name={$config['appName']}"
  283. class="btn btn-indigo">
  284. 导入 Clash
  285. </a>
  286. </div>
  287. </div>
  288. </div>
  289. <div class="tab-pane" id="macos">
  290. <p>
  291. 适用于 Clash 的订阅:<code>{$UniversalSub}/clash</code>
  292. </p>
  293. <p>
  294. 适用于 sing-box 的订阅:<code>{$UniversalSub}/singbox</code>
  295. </p>
  296. <div class="btn-list justify-content-start">
  297. <a {if $config['enable_r2_client_download']}
  298. href="/user/clients/Clash.Verge_aarch64.dmg"
  299. {else}
  300. href="/clients/Clash.Verge_aarch64.dmg"
  301. {/if} class="btn btn-azure">
  302. 下载 Clash Verge (aarch64)
  303. </a>
  304. <a data-clipboard-text="{$UniversalSub}/clash"
  305. class="copy btn btn-primary">
  306. 复制 Clash 订阅链接
  307. </a>
  308. <a href="clash://install-config?url={$UniversalSub}/clash&name={$config['appName']}"
  309. class="btn btn-indigo">
  310. 导入 Clash
  311. </a>
  312. </div>
  313. <div class="btn-list justify-content-start my-2">
  314. <a {if $config['enable_r2_client_download']}
  315. href="/user/clients/SFM.zip"
  316. {else}
  317. href="/clients/SFM.zip"
  318. {/if} class="btn btn-azure">
  319. 下载 SFM
  320. </a>
  321. <a data-clipboard-text="{$UniversalSub}/singbox"
  322. class="copy btn btn-primary">
  323. 复制 sing-box 订阅链接
  324. </a>
  325. <a href="sing-box://import-remote-profile?url={$UniversalSub}/singbox#{$config['appName']}"
  326. class="btn btn-indigo">
  327. 导入 SFM
  328. </a>
  329. </div>
  330. </div>
  331. <div class="tab-pane" id="android">
  332. <p>
  333. 适用于 Clash 的订阅:<code>{$UniversalSub}/clash</code>
  334. </p>
  335. <p>
  336. 适用于 sing-box 的订阅:<code>{$UniversalSub}/singbox</code>
  337. </p>
  338. <div class="btn-list justify-content-start">
  339. <a data-clipboard-text="{$UniversalSub}/clash"
  340. class="copy btn btn-primary">
  341. 复制 Clash 订阅链接
  342. </a>
  343. <a href="clash://install-config?url={$UniversalSub}/clash&name={$config['appName']}"
  344. class="btn btn-indigo">
  345. 导入 Clash
  346. </a>
  347. </div>
  348. <div class="btn-list justify-content-start my-2">
  349. <a {if $config['enable_r2_client_download']}
  350. href="/user/clients/SFA.apk"
  351. {else}
  352. href="/clients/SFA.apk"
  353. {/if} class="btn btn-azure">
  354. 下载 SFA
  355. </a>
  356. <a data-clipboard-text="{$UniversalSub}/singbox"
  357. class="copy btn btn-primary">
  358. 复制 sing-box 订阅链接
  359. </a>
  360. <a href="sing-box://import-remote-profile?url={$UniversalSub}/singbox#{$config['appName']}"
  361. class="btn btn-indigo">
  362. 导入 SFA
  363. </a>
  364. </div>
  365. </div>
  366. <div class="tab-pane" id="ios">
  367. <p>
  368. 适用于 Clash 兼容客户端的订阅:<code>{$UniversalSub}/clash</code>
  369. </p>
  370. <p>
  371. 适用于 sing-box 的订阅:<code>{$UniversalSub}/singbox</code>
  372. </p>
  373. <div class="btn-list justify-content-start">
  374. <a href="https://apps.apple.com/app/stash/id1596063349" target="_blank"
  375. class="btn btn-azure">
  376. 购买 Stash
  377. </a>
  378. <a data-clipboard-text="{$UniversalSub}/clash"
  379. class="copy btn btn-primary">
  380. 复制 Clash 订阅链接
  381. </a>
  382. <a href="stash://install-config?url={$UniversalSub}/clash&name={$config['appName']}"
  383. class="btn btn-indigo">
  384. 导入 Stash
  385. </a>
  386. </div>
  387. <div class="btn-list justify-content-start my-2">
  388. <a href="https://apps.apple.com/app/sing-box/id6451272673" target="_blank"
  389. class="btn btn-azure">
  390. 安裝 sing-box
  391. </a>
  392. <a data-clipboard-text="{$UniversalSub}/singbox"
  393. class="copy btn btn-primary">
  394. 复制 sing-box 订阅链接
  395. </a>
  396. <a href="sing-box://import-remote-profile?url={$UniversalSub}/singbox#{$config['appName']}"
  397. class="btn btn-indigo">
  398. 导入 sing-box
  399. </a>
  400. </div>
  401. </div>
  402. <div class="tab-pane" id="linux">
  403. <p>
  404. 适用于 Clash 的订阅:<code>{$UniversalSub}/clash</code>
  405. </p>
  406. <div class="btn-list justify-content-start">
  407. <a {if $config['enable_r2_client_download']}
  408. href="/user/clients/Clash.Verge.AppImage.tar.gz"
  409. {else}
  410. href="/clients/Clash.Verge.AppImage.tar.gz"
  411. {/if} class="btn btn-azure">
  412. 下载 Clash Verge
  413. </a>
  414. <a data-clipboard-text="{$UniversalSub}/clash"
  415. class="copy btn btn-primary">
  416. 复制 Clash 订阅链接
  417. </a>
  418. <a href="clash://install-config?url={$UniversalSub}/clash&name={$config['appName']}"
  419. class="btn btn-indigo">
  420. 导入 Clash
  421. </a>
  422. </div>
  423. </div>
  424. <div class="tab-pane" id="config">
  425. <p>你的连接信息:</p>
  426. <div class="table-responsive">
  427. <table class="table table-vcenter card-table">
  428. <tbody>
  429. <tr>
  430. <td><strong>端口</strong></td>
  431. <td>{$user->port}</td>
  432. </tr>
  433. <tr>
  434. <td><strong>连接密码</strong></td>
  435. <td>{$user->passwd}</td>
  436. </tr>
  437. <tr>
  438. <td><strong>UUID</strong></td>
  439. <td>{$user->uuid}</td>
  440. </tr>
  441. <tr>
  442. <td><strong>自定义加密</strong></td>
  443. <td>{$user->method}</td>
  444. </tr>
  445. </tbody>
  446. </table>
  447. </div>
  448. </div>
  449. </div>
  450. </div>
  451. </div>
  452. </div>
  453. <div class="col-lg-6 col-sm-12">
  454. <div class="card">
  455. <div class="card-body">
  456. <h3 class="card-title">流量用量</h3>
  457. <div class="progress progress-separated mb-3">
  458. {if $user->LastusedTrafficPercent() < '1'}
  459. <div class="progress-bar bg-primary" role="progressbar" style="width: 1%"></div>
  460. {else}
  461. <div class="progress-bar bg-primary" role="progressbar"
  462. style="width: {$user->LastusedTrafficPercent()}%">
  463. </div>
  464. {/if}
  465. {if $user->TodayusedTrafficPercent() < '1'}
  466. <div class="progress-bar bg-success" role="progressbar" style="width: 1%"></div>
  467. {else}
  468. <div class="progress-bar bg-success" role="progressbar"
  469. style="width: {$user->TodayusedTrafficPercent()}%"></div>
  470. {/if}
  471. </div>
  472. <div class="row">
  473. <div class="col-auto d-flex align-items-center pe-2">
  474. <span class="legend me-2 bg-primary"></span>
  475. <span>过去用量 {$user->LastusedTraffic()}</span>
  476. </div>
  477. <div class="col-auto d-flex align-items-center px-2">
  478. <span class="legend me-2 bg-success"></span>
  479. <span>今日用量 {$user->TodayusedTraffic()}</span>
  480. </div>
  481. <div class="col-auto d-flex align-items-center ps-2">
  482. <span class="legend me-2"></span>
  483. <span>剩余流量 {$user->unusedTraffic()}</span>
  484. </div>
  485. </div>
  486. <p class="my-3">
  487. {if $user->class === 0}
  488. 前往
  489. <a href="/user/product">商店</a>
  490. 购买套餐
  491. {else}
  492. 你的 LV. {$user->class} 账户会在 {$class_expire_days} 天后到期({$user->class_expire})
  493. {/if}
  494. </p>
  495. </div>
  496. </div>
  497. </div>
  498. <div class="col-lg-6 col-sm-12">
  499. <div class="card">
  500. <div class="ribbon ribbon-top bg-yellow">
  501. <i class="ti ti-bell-ringing icon"></i>
  502. </div>
  503. <div class="card-body">
  504. <h3 class="card-title">
  505. 最新公告
  506. {if $ann !== null}
  507. <span class="card-subtitle">{$ann->date}</span>
  508. {/if}
  509. </h3>
  510. <p class="text-secondary">
  511. {if $ann !== null}
  512. {$ann->content}
  513. {else}
  514. 暂无公告
  515. {/if}
  516. </p>
  517. </div>
  518. </div>
  519. </div>
  520. {if $config['enable_checkin']}
  521. <div class="col-lg-6 col-sm-12">
  522. <div class="card">
  523. <div class="card-stamp">
  524. <div class="card-stamp-icon bg-green">
  525. <i class="ti ti-check"></i>
  526. </div>
  527. </div>
  528. <div class="card-body">
  529. <h3 class="card-title">每日签到</h3>
  530. <p>
  531. 签到可领取
  532. {if $config['checkinMin'] !== $config['checkinMax']}
  533. &nbsp;
  534. <code>{$config['checkinMin']} MB</code>
  535. <code>{$config['checkinMax']} MB</code>
  536. 范围内的流量
  537. {else}
  538. <code>{$config['checkinMin']} MB</code>
  539. {/if}
  540. </p>
  541. <p>
  542. 上次签到时间:<code id="last-checkin-time">{$user->lastCheckInTime()}</code>
  543. </p>
  544. </div>
  545. <div class="card-footer">
  546. <div class="d-flex">
  547. {if ! $user->isAbleToCheckin()}
  548. <button id="check-in" class="btn btn-primary ms-auto" disabled>已签到</button>
  549. {else}
  550. {if $public_setting['enable_checkin_captcha']}
  551. {if $public_setting['captcha_provider'] === 'turnstile'}
  552. <div id="cf-turnstile" class="cf-turnstile"
  553. data-sitekey="{$captcha['turnstile_sitekey']}"
  554. {if $user->is_dark_mode}
  555. data-theme="dark"
  556. {else}
  557. data-theme="light"
  558. {/if}
  559. ></div>
  560. {/if}
  561. {if $public_setting['captcha_provider'] === 'geetest'}
  562. <div id="geetest"></div>
  563. {/if}
  564. {/if}
  565. <button id="check-in" class="btn btn-primary ms-auto"
  566. hx-post="/user/checkin" hx-swap="none"
  567. {if $public_setting['captcha_provider'] === 'turnstile'}
  568. hx-vals='js:{ turnstile: document.querySelector("[name=cf-turnstile-response]").value }'
  569. {/if}
  570. {if $public_setting['captcha_provider'] === 'geetest'}
  571. hx-vals='js:{ geetest: geetest_result }'
  572. {/if}>
  573. 签到
  574. </button>
  575. {/if}
  576. </div>
  577. </div>
  578. </div>
  579. </div>
  580. {/if}
  581. </div>
  582. </div>
  583. </div>
  584. <script>
  585. let clipboard = new ClipboardJS('.copy');
  586. clipboard.on('success', function (e) {
  587. $('#success-message').text('已复制到剪切板');
  588. $('#success-dialog').modal('show');
  589. });
  590. </script>
  591. {if $public_setting['enable_checkin_captcha'] && $user->isAbleToCheckin()}
  592. {if $public_setting['captcha_provider'] === 'turnstile'}
  593. <script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
  594. {/if}
  595. {if $public_setting['captcha_provider'] === 'geetest'}
  596. <script src="https://static.geetest.com/v4/gt4.js"></script>
  597. <script>
  598. let geetest_result = '';
  599. initGeetest4({
  600. captchaId: '{$captcha['geetest_id']}',
  601. product: 'float',
  602. language: "zho",
  603. riskType: 'slide'
  604. }, function (geetest) {
  605. geetest.appendTo("#geetest");
  606. geetest.onSuccess(function () {
  607. geetest_result = geetest.getValidate();
  608. });
  609. });
  610. </script>
  611. {/if}
  612. {/if}
  613. {include file='user/footer.tpl'}