| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618 |
- {include file='user/header.tpl'}
- <script src="//{$config['jsdelivr_url']}/npm/jquery/dist/jquery.min.js"></script>
- <div class="page-wrapper">
- <div class="container-xl">
- <div class="page-header d-print-none text-white">
- <div class="row align-items-center">
- <div class="col">
- <h2 class="page-title">
- <span class="home-title">资料修改</span>
- </h2>
- <div class="page-pretitle my-3">
- <span class="home-subtitle">修改账户的部分信息</span>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="page-body">
- <div class="container-xl">
- <div class="row row-deck row-cards">
- <div class="col-12">
- <div class="card">
- <ul class="nav nav-tabs nav-fill" data-bs-toggle="tabs" role="tablist">
- <li class="nav-item" role="presentation">
- <a href="#personal_information" class="nav-link active" data-bs-toggle="tab"
- aria-selected="true" role="tab">
- <i class="ti ti-chart-candle icon"></i>
- 资料
- </a>
- </li>
- <li class="nav-item" role="presentation">
- <a href="#login_security" class="nav-link" data-bs-toggle="tab" aria-selected="true"
- role="tab">
- <i class="ti ti-shield-lock icon"></i>
- 登录
- </a>
- </li>
- <li class="nav-item" role="presentation">
- <a href="#use_safety" class="nav-link" data-bs-toggle="tab" aria-selected="false"
- tabindex="-1" role="tab">
- <i class="ti ti-brand-telegram icon"></i>
- 使用
- </a>
- </li>
- <li class="nav-item" role="presentation">
- <a href="#other_settings" class="nav-link" data-bs-toggle="tab" aria-selected="false"
- tabindex="-1" role="tab">
- <i class="ti ti-settings icon"></i>
- 其他
- </a>
- </li>
- </ul>
- <div class="card-body">
- <div class="tab-content">
- <div class="tab-pane active show" id="personal_information" role="tabpanel">
- <div class="row row-deck row-cards">
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">登录邮箱</h3>
- <p>当前邮箱:<code id="email">{$user->email}</code></p>
- <div class="mb-3">
- <input id="new-email" type="email" class="form-control"
- placeholder="新邮箱"
- {if ! $config['enable_change_email']}disabled=""{/if}>
- </div>
- {if $public_setting['reg_email_verify'] && $config['enable_change_email']}
- <div class="mb-3">
- <input id="email-code" type="text" class="form-control"
- placeholder="验证码">
- </div>
- {/if}
- </div>
- <div class="card-footer">
- <div class="d-flex">
- {if $public_setting['reg_email_verify'] && $config['enable_change_email']}
- <button class="btn btn-link"
- hx-post="/user/send" hx-swap="none"
- hx-vals='js:{ email: document.getElementById("newemail").value }'>
- 获取验证码
- </button>
- <button class="btn btn-primary ms-auto"
- hx-post="/user/email" hx-swap="none"
- hx-vals='js:{
- newemail: document.getElementById("new-email").value,
- emailcode: document.getElementById("email-code").value
- }'>
- 修改
- </button>
- {elseif $config['enable_change_email']}
- <button class="btn btn-primary ms-auto"
- hx-post="/user/email" hx-swap="none"
- hx-vals='js:{ newemail: document.getElementById("new-email").value }'>
- 修改
- </button>
- {else}
- <button class="btn btn-primary ms-auto"
- disabled>不允许修改
- </button>
- {/if}
- </div>
- </div>
- </div>
- </div>
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">用戶名</h3>
- <p>当前用戶名:<code id="username">{$user->user_name}</code></p>
- <div class="mb-3">
- <input id="new-username" type="text" class="form-control"
- placeholder="新用戶名" autocomplete="off">
- </div>
- </div>
- <div class="card-footer">
- <div class="d-flex">
- <button class="btn btn-primary ms-auto"
- hx-post="/user/username" hx-swap="none"
- hx-vals='js:{ newusername: document.getElementById("new-username").value }'>
- 修改
- </button>
- </div>
- </div>
- </div>
- </div>
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">IM 账号绑定</h3>
- <div class="mb-3">
- <select id="imtype" class="form-select"
- {if $user->im_type !== 0 && $user->im_value !== ''}disabled=""{/if}>
- <option value="0" {if $user->im_type === 0}selected{/if}>
- 未绑定
- </option>
- <option value="1" {if $user->im_type === 1}selected{/if}>
- Slack
- </option>
- <option value="2" {if $user->im_type === 2}selected{/if}>
- Discord
- </option>
- <option value="4" {if $user->im_type === 4}selected{/if}>
- Telegram
- </option>
- </select>
- </div>
- <div class="mb-3">
- <input id="imvalue" type="text" class="form-control"
- disabled="" value="{$user->im_value}">
- </div>
- </div>
- <div class="card-footer">
- <div class="d-flex btn-list justify-content-end"
- id="oauth-provider"></div>
- </div>
- </div>
- </div>
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">解绑 IM 账户</h3>
- {if $user->im_type === 0}
- <p>你的账户当前没有绑定任何 IM 服务</p>
- {else}
- <p>
- 当前绑定的 IM 服务:{$user->imType()}
- <br>
- 账户 ID:<code>{$user->im_value}</code>
- </p>
- {/if}
- </div>
- {if $user->im_type !== 0}
- <div class="card-footer">
- <div class="d-flex">
- <button class="btn btn-red ms-auto"
- hx-post="/user/unbind_im" hx-swap="none">
- 解绑
- </button>
- </div>
- </div>
- {/if}
- </div>
- </div>
- </div>
- </div>
- <div class="tab-pane" id="login_security" role="tabpanel">
- <div class="row row-deck row-cards">
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">多因素认证</h3>
- <div class="col-md-12">
- <div class="col-sm-6 col-md-6">
- <i class="ti ti-brand-apple"></i>
- <a target="view_window"
- href="https://apps.apple.com/us/app/google-authenticator/id388497605">iOS
- 客户端
- </a>
-
- <i class="ti ti-brand-android"></i>
- <a target="view_window"
- href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Android
- 客户端
- </a>
- </div>
- </div>
- <br>
- <div class="row">
- <div class="col-md-3">
- <p id="qrcode"></p>
- </div>
- <div class="col-md-9">
- <div class="mb-3">
- <select id="ga-enable" class="form-select">
- <option value="0">不使用</option>
- <option value="1"
- {if $user->ga_enable === '1'}selected{/if}>
- 使用两步认证登录
- </option>
- </select>
- </div>
- <div class="mb-3">
- <input id="ga-test-code" type="text"
- class="form-control"
- placeholder="测试两步认证验证码">
- </div>
- <div class="col-md-12">
- <p>密钥:
- <code id="ga-token">
- {$user->ga_token}
- </code>
- </p>
- </div>
- </div>
- </div>
- </div>
- <div class="card-footer">
- <div class="d-flex">
- <button class="btn btn-link"
- hx-post="/user/ga_reset" hx-swap="none" >
- 重置
- </button>
- <button class="btn btn-link"
- hx-post="/user/ga_check" hx-swap="none"
- hx-vals='js:{ code: document.getElementById("ga-test-code").value }'>
- 测试
- </button>
- <button class="btn btn-primary ms-auto"
- hx-post="/user/ga_set" hx-swap="none"
- hx-vals='js:{ enable: document.getElementById("ga-enable").value }'>
- 设置
- </button>
- </div>
- </div>
- </div>
- </div>
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">修改登录密码</h3>
- <div class="mb-3">
- <form>
- <input id="password" type="password" class="form-control"
- placeholder="当前登录密码" autocomplete="off">
- </form>
- </div>
- <div class="mb-3">
- <form>
- <input id="new_password" type="password"
- class="form-control" placeholder="输入新密码"
- autocomplete="off">
- </form>
- </div>
- <div class="mb-3">
- <form>
- <input id="confirm_new_password" type="password"
- class="form-control" placeholder="再次输入新密码"
- autocomplete="off">
- </form>
- </div>
- </div>
- <div class="card-footer">
- <div class="d-flex">
- <button class="btn btn-primary ms-auto"
- hx-post="/user/password" hx-swap="none"
- hx-vals='js:{
- new_password: document.getElementById("new_password").value,
- confirm_new_password: document.getElementById("confirm_new_password").value,
- password: document.getElementById("password").value
- }'>
- 修改
- </button>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="tab-pane" id="use_safety" role="tabpanel">
- <div class="row row-deck row-cards">
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">更换加密方式</h3>
- <p>
- 不同的客户端支持的加密方式可能会有所不同,请参考客户端支持列表进行设置</p>
- <div class="mb-3">
- <select id="user-method" class="form-select">
- {foreach $methods as $method}
- <option value="{$method}"
- {if $user->method === $method}selected{/if}>
- {$method}
- </option>
- {/foreach}
- </select>
- </div>
- </div>
- <div class="card-footer">
- <div class="d-flex">
- <button class="btn btn-primary ms-auto"
- hx-post="/user/method" hx-swap="none"
- hx-vals='js:{ method: document.getElementById("user-method").value }'>
- 修改
- </button>
- </div>
- </div>
- </div>
- </div>
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">重置订阅地址</h3>
- <p>重置订阅地址后,旧的订阅地址将无法获取配置,但节点配置仍能使用。
- 如果希望作废旧节点配置请配合重置连接密码操作</p>
- </div>
- <div class="card-footer">
- <div class="d-flex">
- <button class="btn btn-primary ms-auto bg-red"
- hx-post="/user/url_reset" hx-swap="none">
- 重置
- </button>
- </div>
- </div>
- </div>
- </div>
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">重置连接密码</h3>
- <p>重置连接密码与UUID ,重置后需更新订阅,才能继续使用</p>
- <p>当前连接密码:<code id="passwd">{$user->passwd}</code></p>
- <p>当前UUID:<code id="uuid">{$user->uuid}</code></p>
- </div>
- <div class="card-footer">
- <div class="d-flex">
- <button class="btn btn-primary ms-auto bg-red"
- hx-post="/user/passwd_reset" hx-swap="none">
- 重置
- </button>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="tab-pane" id="other_settings" role="tabpanel">
- <div class="row row-deck row-cards">
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">每日流量报告</h3>
- <div class="mb-3">
- <select id="daily-mail" class="form-select">
- <option value="0"
- {if $user->daily_mail_enable === 0}selected{/if}>
- 不接收
- </option>
- <option value="1"
- {if $user->daily_mail_enable === 1}selected{/if}>
- 邮件接收
- </option>
- <option value="2"
- {if $user->daily_mail_enable === 2}selected{/if}>
- IM 接收
- </option>
- </select>
- </div>
- </div>
- <div class="card-footer">
- <div class="d-flex">
- <button class="btn btn-primary ms-auto"
- hx-post="/user/daily_mail" hx-swap="none"
- hx-vals='js:{ mail: document.getElementById("daily-mail").value }'>
- 修改
- </button>
- </div>
- </div>
- </div>
- </div>
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">偏好的联系方式</h3>
- <p>当 IM 未绑定时站点依然会向账户邮箱发送通知信息</p>
- <div class="mb-3">
- <select id="contact-method" class="form-select">
- <option value="1"
- {if $user->contact_method === 1}selected{/if}>
- 邮件
- </option>
- <option value="2"
- {if $user->contact_method === 2}selected{/if}>
- IM
- </option>
- </select>
- </div>
- </div>
- <div class="card-footer">
- <div class="d-flex">
- <button class="btn btn-primary ms-auto"
- hx-post="/user/contact_method" hx-swap="none"
- hx-vals='js:{ contact: document.getElementById("contact-method").value }'>
- 修改
- </button>
- </div>
- </div>
- </div>
- </div>
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-body">
- <h3 class="card-title">修改主题</h3>
- <div class="mb-3">
- <select id="user-theme" class="form-select">
- {foreach $themes as $theme}
- <option value="{$theme}"
- {if $user->theme === $theme}selected{/if}>{$theme}
- </option>
- {/foreach}
- </select>
- </div>
- </div>
- <div class="card-footer">
- <div class="d-flex">
- <button class="btn btn-primary ms-auto"
- hx-post="/user/theme" hx-swap="none"
- hx-vals='js:{ theme: document.getElementById("user-theme").value }'>
- 修改
- </button>
- </div>
- </div>
- </div>
- </div>
- {if $config['enable_kill']}
- <div class="col-sm-12 col-md-6">
- <div class="card">
- <div class="card-stamp">
- <div class="card-stamp-icon bg-red">
- <i class="ti ti-circle-x"></i>
- </div>
- </div>
- <div class="card-body">
- <h3 class="card-title">删除账户数据</h3>
- </div>
- <div class="card-footer">
- <button class="btn btn-red" data-bs-toggle="modal"
- data-bs-target="#destroy-account">
- <i class="ti ti-trash icon"></i>
- 确认删除
- </button>
- </div>
- </div>
- </div>
- {/if}
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- {if $config['enable_kill']}
- <div class="modal modal-blur fade" id="destroy-account" tabindex="-1" role="dialog" aria-hidden="true">
- <div class="modal-dialog modal-sm modal-dialog-centered" role="document">
- <div class="modal-content">
- <button class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
- <div class="modal-status bg-danger"></div>
- <div class="modal-body text-center py-4">
- <i class="ti ti-alert-circle icon mb-2 text-danger icon-lg" style="font-size:3.5rem;"></i>
- <h3>删除确认</h3>
- <div class="text-secondary">
- 请确认是否真的要删除你的账户,此操作无法撤销,你的所有账户数据将会被从服务器上彻底删除
- </div>
- <div class="py-3">
- <form>
- <input id="confirm_kill_password" type="password" class="form-control"
- placeholder="输入登录密码" autocomplete="off">
- </form>
- </div>
- </div>
- <div class="modal-footer">
- <div class="w-100">
- <div class="row">
- <div class="col">
- <button class="btn w-100" data-bs-dismiss="modal">
- 取消
- </button>
- </div>
- <div class="col">
- <button href="#" class="btn btn-danger w-100" data-bs-dismiss="modal"
- hx-post="/user/kill" hx-swap="none"
- hx-vals='js:{ password: document.getElementById("confirm_kill_password").value }'>
- 确认
- </button>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- {/if}
- <script>
- let qrcode = new QRCode('qrcode', {
- text: "{$ga_url}",
- width: 128,
- height: 128,
- colorDark: '#000000',
- colorLight: '#ffffff',
- correctLevel: QRCode.CorrectLevel.H
- });
- {if $user->im_type === 0 && $user->im_value === ''}
- let oauthProvider = $('#oauth-provider');
- $("#imtype").on('change', function () {
- if ($(this).val() === '0') {
- oauthProvider.empty();
- } else if ($(this).val() === '1') {
- oauthProvider.empty();
- oauthProvider.append(
- "<a id='bind-slack' class='btn btn-azure ms-auto'>绑定 Slack</a>"
- );
- } else if ($(this).val() === '2') {
- oauthProvider.empty();
- oauthProvider.append(
- "<a id='bind-discord' class='btn btn-indigo ms-auto'>绑定 Discord</a>"
- );
- } else if ($(this).val() === '4') {
- oauthProvider.empty();
- oauthProvider.append(
- '<script async src=\"https://telegram.org/js/telegram-widget.js?22\"' +
- ' data-telegram-login=\"' + "{$public_setting['telegram_bot']}" +
- '\" data-size=\"large" data-onauth=\"onTelegramAuth(user)\"' +
- ' data-request-access=\"write\"><\/script>'
- );
- }
- });
- oauthProvider.on('click', '#bind-slack', function () {
- $.ajax({
- type: "POST",
- url: "/oauth/slack",
- dataType: "json",
- success: function (data) {
- handleOauthResult(data, 'slack')
- }
- })
- });
- oauthProvider.on('click', '#bind-discord', function () {
- $.ajax({
- type: "POST",
- url: "/oauth/discord",
- dataType: "json",
- success: function (data) {
- handleOauthResult(data, 'discord')
- }
- })
- });
- function onTelegramAuth(user) {
- $.ajax({
- type: "POST",
- url: "/oauth/telegram",
- dataType: "json",
- data: {
- user: JSON.stringify(user),
- },
- success: function (data) {
- handleOauthResult(data, 'telegram')
- }
- })
- }
- function handleOauthResult(data, type = 'telegram') {
- if (data.ret === 1) {
- if (type === 'telegram') {
- $('#success-message').text(data.msg);
- $('#success-dialog').modal('show');
- } else {
- window.location.replace(data.redir);
- }
- } else {
- $('#error-message').text(data.msg);
- $('#fail-dialog').modal('show');
- }
- }
- {/if}
- </script>
- {include file='user/footer.tpl'}
|