1
0

index.tpl 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  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. 适用于 sing-box 的订阅:<code>{$UniversalSub}/singbox</code>
  382. </p>
  383. <div class="btn-list justify-content-start my-2">
  384. <a href="https://apps.apple.com/app/sing-box/id6451272673" target="_blank"
  385. class="btn btn-azure">
  386. 安裝 sing-box
  387. </a>
  388. <a data-clipboard-text="{$UniversalSub}/singbox"
  389. class="copy btn btn-primary">
  390. 复制 sing-box 订阅链接
  391. </a>
  392. <a href="sing-box://import-remote-profile?url={$UniversalSub}/singbox#{$config['appName']}"
  393. class="btn btn-indigo">
  394. 导入 sing-box
  395. </a>
  396. </div>
  397. </div>
  398. <div class="tab-pane" id="linux">
  399. <p>
  400. 适用于 Clash 的订阅:<code>{$UniversalSub}/clash</code>
  401. </p>
  402. <div class="btn-list justify-content-start">
  403. <a {if $config['enable_r2_client_download']}
  404. href="/user/clients/Clash.Verge.AppImage.tar.gz"
  405. {else}
  406. href="/clients/Clash.Verge.AppImage.tar.gz"
  407. {/if} class="btn btn-azure">
  408. 下载 Clash Verge
  409. </a>
  410. <a data-clipboard-text="{$UniversalSub}/clash"
  411. class="copy btn btn-primary">
  412. 复制 Clash 订阅链接
  413. </a>
  414. <a href="clash://install-config?url={$UniversalSub}/clash&name={$config['appName']}"
  415. class="btn btn-indigo">
  416. 导入 Clash
  417. </a>
  418. </div>
  419. </div>
  420. <div class="tab-pane" id="config">
  421. <p>你的连接信息:</p>
  422. <div class="table-responsive">
  423. <table class="table table-vcenter card-table">
  424. <tbody>
  425. <tr>
  426. <td><strong>端口</strong></td>
  427. <td>{$user->port}</td>
  428. </tr>
  429. <tr>
  430. <td><strong>连接密码</strong></td>
  431. <td>{$user->passwd}</td>
  432. </tr>
  433. <tr>
  434. <td><strong>UUID</strong></td>
  435. <td>{$user->uuid}</td>
  436. </tr>
  437. <tr>
  438. <td><strong>自定义加密</strong></td>
  439. <td>{$user->method}</td>
  440. </tr>
  441. </tbody>
  442. </table>
  443. </div>
  444. </div>
  445. </div>
  446. </div>
  447. </div>
  448. </div>
  449. <div class="col-lg-6 col-sm-12">
  450. <div class="card">
  451. <div class="card-body">
  452. <h3 class="card-title">流量用量</h3>
  453. <div class="progress progress-separated mb-3">
  454. {if $user->LastusedTrafficPercent() < '1'}
  455. <div class="progress-bar bg-primary" role="progressbar" style="width: 1%"></div>
  456. {else}
  457. <div class="progress-bar bg-primary" role="progressbar"
  458. style="width: {$user->LastusedTrafficPercent()}%">
  459. </div>
  460. {/if}
  461. {if $user->TodayusedTrafficPercent() < '1'}
  462. <div class="progress-bar bg-success" role="progressbar" style="width: 1%"></div>
  463. {else}
  464. <div class="progress-bar bg-success" role="progressbar"
  465. style="width: {$user->TodayusedTrafficPercent()}%"></div>
  466. {/if}
  467. </div>
  468. <div class="row">
  469. <div class="col-auto d-flex align-items-center pe-2">
  470. <span class="legend me-2 bg-primary"></span>
  471. <span>过去用量 {$user->LastusedTraffic()}</span>
  472. </div>
  473. <div class="col-auto d-flex align-items-center px-2">
  474. <span class="legend me-2 bg-success"></span>
  475. <span>今日用量 {$user->TodayusedTraffic()}</span>
  476. </div>
  477. <div class="col-auto d-flex align-items-center ps-2">
  478. <span class="legend me-2"></span>
  479. <span>剩余流量 {$user->unusedTraffic()}</span>
  480. </div>
  481. </div>
  482. <p class="my-3">
  483. {if $user->class === 0}
  484. 前往
  485. <a href="/user/product">商店</a>
  486. 购买套餐
  487. {else}
  488. 你的 LV. {$user->class} 账户会在 {$class_expire_days} 天后到期({$user->class_expire})
  489. {/if}
  490. </p>
  491. </div>
  492. </div>
  493. </div>
  494. <div class="col-lg-6 col-sm-12">
  495. <div class="card">
  496. <div class="ribbon ribbon-top bg-yellow">
  497. <i class="ti ti-bell-ringing icon"></i>
  498. </div>
  499. <div class="card-body">
  500. <h3 class="card-title">
  501. 最新公告
  502. {if $ann !== null}
  503. <span class="card-subtitle">{$ann->date}</span>
  504. {/if}
  505. </h3>
  506. <p class="text-secondary">
  507. {if $ann !== null}
  508. {$ann->content}
  509. {else}
  510. 暂无公告
  511. {/if}
  512. </p>
  513. </div>
  514. </div>
  515. </div>
  516. {if $public_setting['enable_checkin']}
  517. <div class="col-lg-6 col-sm-12">
  518. <div class="card">
  519. <div class="card-stamp">
  520. <div class="card-stamp-icon bg-green">
  521. <i class="ti ti-check"></i>
  522. </div>
  523. </div>
  524. <div class="card-body">
  525. <h3 class="card-title">每日签到</h3>
  526. <p>
  527. 签到可领取
  528. {if $public_setting['checkin_min'] !== $public_setting['checkin_max']}
  529. &nbsp;
  530. <code>{$public_setting['checkin_min']} MB</code>
  531. <code>{$public_setting['checkin_max']} MB</code>
  532. 范围内的流量
  533. {else}
  534. <code>{$public_setting['checkin_min']} MB</code>
  535. {/if}
  536. </p>
  537. <p>
  538. 上次签到时间:<code id="last-checkin-time">{$user->lastCheckInTime()}</code>
  539. </p>
  540. </div>
  541. <div class="card-footer">
  542. <div class="d-flex">
  543. {if ! $user->isAbleToCheckin()}
  544. <button id="check-in" class="btn btn-primary ms-auto" disabled>已签到</button>
  545. {else}
  546. {if $public_setting['enable_checkin_captcha']}
  547. {include file='captcha_div.tpl'}
  548. {/if}
  549. <button id="check-in" class="btn btn-primary ms-auto"
  550. hx-post="/user/checkin" hx-swap="none"
  551. {if $public_setting['enable_checkin_captcha']}
  552. {if $public_setting['captcha_provider'] === 'turnstile'}
  553. hx-vals='js:{ turnstile: document.querySelector("[name=cf-turnstile-response]").value }'
  554. {/if}
  555. {if $public_setting['captcha_provider'] === 'geetest'}
  556. hx-vals='js:{ geetest: geetest_result }'
  557. {/if}
  558. {/if}>
  559. 签到
  560. </button>
  561. {/if}
  562. </div>
  563. </div>
  564. </div>
  565. </div>
  566. {/if}
  567. </div>
  568. </div>
  569. </div>
  570. {if $public_setting['enable_checkin_captcha'] && $user->isAbleToCheckin()}
  571. {include file='captcha_js.tpl'}
  572. {/if}
  573. {include file='user/footer.tpl'}