index.tpl 35 KB

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