From 12d4365fe47a652844485d125eae2fd61bd45b78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=94=E5=A7=AC=E6=A1=91?= <867057410@qq.com> Date: Sun, 16 Jan 2022 22:52:37 +0800 Subject: [PATCH] =?UTF-8?q?Bark=20&=20=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=20=E7=AD=89=E6=98=BE=E7=A4=BA=E8=B0=83=E6=95=B4=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Apply fixes from StyleCI --- app/Channels/BarkChannel.php | 15 +++- app/Channels/Components/WeChat.php | 5 +- app/Channels/PushBearChannel.php | 2 +- app/Channels/PushPlusChannel.php | 2 +- app/Channels/ServerChanChannel.php | 2 +- app/Channels/TgChatChannel.php | 2 +- app/Channels/WeChatChannel.php | 40 ++++++--- app/Components/Helpers.php | 8 +- app/Http/Controllers/MessageController.php | 21 +++++ app/Notifications/Custom.php | 12 +++ app/Notifications/NodeBlocked.php | 5 +- app/Notifications/NodeDailyReport.php | 1 + app/Notifications/NodeOffline.php | 3 + app/Notifications/PaymentConfirm.php | 5 +- app/Notifications/PaymentReceived.php | 21 +++-- app/Notifications/TicketClosed.php | 11 +++ app/Notifications/TicketCreated.php | 11 +++ app/Notifications/TicketReplied.php | 11 +++ ...1_16_160308_add_msgid_notification_log.php | 32 ++++++++ public/assets/images/notification/custom.png | Bin 0 -> 7192 bytes public/assets/images/notification/offline.png | Bin 0 -> 10008 bytes public/assets/images/notification/ticket.png | Bin 0 -> 12502 bytes resources/views/_layout.blade.php | 2 +- resources/views/components/message.blade.php | 44 ++++++++++ .../views/components/payment/detail.blade.php | 1 - .../user/components/payment/manual.blade.php | 76 +++++++++++++----- resources/views/user/help.blade.php | 28 +++---- resources/views/user/layouts.blade.php | 2 +- .../log-viewer/remark/layouts.blade.php | 4 +- routes/user.php | 1 - routes/web.php | 1 + 31 files changed, 286 insertions(+), 82 deletions(-) create mode 100644 app/Http/Controllers/MessageController.php create mode 100644 database/migrations/2022_01_16_160308_add_msgid_notification_log.php create mode 100644 public/assets/images/notification/custom.png create mode 100644 public/assets/images/notification/offline.png create mode 100644 public/assets/images/notification/ticket.png create mode 100644 resources/views/components/message.blade.php diff --git a/app/Channels/BarkChannel.php b/app/Channels/BarkChannel.php index 76e54a1f..11619ff4 100644 --- a/app/Channels/BarkChannel.php +++ b/app/Channels/BarkChannel.php @@ -5,7 +5,9 @@ namespace App\Channels; use Helpers; use Http; use Illuminate\Notifications\Notification; +use Illuminate\Support\Arr; use Log; +use Str; class BarkChannel { @@ -17,18 +19,25 @@ class BarkChannel $message = $notification->toCustom($notifiable); } - $response = Http::timeout(15)->get('https://api.day.app/'.sysConfig('bark_key').'/'.$message['title'].'/'.$message['content']); + if (isset($message['url_type'])) { // 生成对公消息查询URL + $msgId = Str::uuid(); + $message['url'] = route('message.show', ['type' => $message['url_type'], $msgId]); + unset($message['url_type']); + } + + $response = Http::timeout(15) + ->get('https://api.day.app/'.sysConfig('bark_key')."/{$message['title']}/{$message['content']}?".http_build_query(Arr::except($message, ['title', 'content']))); if ($response->ok()) { $ret = $response->json(); // 发送成功 if ($ret['code'] === 200) { - Helpers::addNotificationLog($message['title'], $message['content'], 3); + Helpers::addNotificationLog($message['title'], $message['content'], 3, 1, null, $msgId ?? null); return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'], 3, 'admin', -1, $message); + Helpers::addNotificationLog($message['title'], $message['content'], 3, -1); return false; } diff --git a/app/Channels/Components/WeChat.php b/app/Channels/Components/WeChat.php index d2067f37..bf45acfa 100644 --- a/app/Channels/Components/WeChat.php +++ b/app/Channels/Components/WeChat.php @@ -5,6 +5,7 @@ namespace App\Channels\Components; use DOMDocument; use Exception; use Log; +use Str; class WeChat { @@ -193,8 +194,8 @@ class PKCS7Encoder */ class Prpcrypt { - public $key = null; - public $iv = null; + public $key; + public $iv; public function __construct() { diff --git a/app/Channels/PushBearChannel.php b/app/Channels/PushBearChannel.php index eaca0c7e..bf023779 100644 --- a/app/Channels/PushBearChannel.php +++ b/app/Channels/PushBearChannel.php @@ -26,7 +26,7 @@ class PushBearChannel return $ret; } // 发送失败 - Helpers::addMarketing(2, $message['title'], $message['content'], -1, $ret['message']); + Helpers::addMarketing(2, $message['title'], $message['content'], -1, '无返回内容'); return false; } diff --git a/app/Channels/PushPlusChannel.php b/app/Channels/PushPlusChannel.php index c9d83361..b9c38b70 100644 --- a/app/Channels/PushPlusChannel.php +++ b/app/Channels/PushPlusChannel.php @@ -30,7 +30,7 @@ class PushPlusChannel return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'], 7, 'admin', -1, $ret ? $ret['msg'] : '未知'); + Helpers::addNotificationLog($message['title'], $message['content'], 7, -1, $ret ? $ret['msg'] : '未知'); return false; } diff --git a/app/Channels/ServerChanChannel.php b/app/Channels/ServerChanChannel.php index 81fce1e9..2707e24d 100644 --- a/app/Channels/ServerChanChannel.php +++ b/app/Channels/ServerChanChannel.php @@ -40,7 +40,7 @@ class ServerChanChannel return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'], 2, 'admin', -1, $ret ? $ret['errmsg'] : '未知'); + Helpers::addNotificationLog($message['title'], $message['content'], 2, -1, $ret ? $ret['errmsg'] : '未知'); return false; } diff --git a/app/Channels/TgChatChannel.php b/app/Channels/TgChatChannel.php index b109e312..1e947b09 100644 --- a/app/Channels/TgChatChannel.php +++ b/app/Channels/TgChatChannel.php @@ -24,7 +24,7 @@ class TgChatChannel return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'], 6, 'admin', -1, $ret ? $ret['message'] : '未知'); + Helpers::addNotificationLog($message['title'], $message['content'], 6, -1, $ret ? $ret['message'] : '未知'); return false; } diff --git a/app/Channels/WeChatChannel.php b/app/Channels/WeChatChannel.php index e23ba924..9eb0412a 100644 --- a/app/Channels/WeChatChannel.php +++ b/app/Channels/WeChatChannel.php @@ -7,7 +7,6 @@ use Cache; use Helpers; use Http; use Illuminate\Http\Request; -use Illuminate\Mail\Markdown; use Illuminate\Notifications\Notification; use Log; use Str; @@ -17,29 +16,39 @@ class WeChatChannel private $access_token; public function __construct() + { + $this->access_token = $this->getAccessToken(); + } + + private function getAccessToken() { if (Cache::has('wechat_access_token')) { - $this->access_token = Cache::get('wechat_access_token'); + $access_token = Cache::get('wechat_access_token'); } else { // https://work.weixin.qq.com/api/doc/90000/90135/91039 $response = Http::get('https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid='.sysConfig('wechat_cid').'&corpsecret='.sysConfig('wechat_secret')); if ($response->ok() && isset($response->json()['access_token'])) { - $this->access_token = $response->json()['access_token']; + $access_token = $response->json()['access_token']; Cache::put('wechat_access_token', $response->json()['access_token'], 7200); // 2小时 } else { Log::critical('Wechat消息推送异常:获取access_token失败!'.PHP_EOL.'携带访问参数:'.$response->body()); abort(400); } } + + return $access_token ?? null; } public function send($notifiable, Notification $notification) - { + { // route('message.show', ['type' => 'markdownMsg', 'msgId' => '']) $message = $notification->toCustom($notifiable); + if (! $this->access_token) { + $this->access_token = $this->getAccessToken(); + } $url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token='.$this->access_token; - if (isset($message['button'])) { + if (isset($message['button'])) { // 按钮交互型 // https://work.weixin.qq.com/api/doc/90000/90135/90236#%E6%8C%89%E9%92%AE%E4%BA%A4%E4%BA%92%E5%9E%8B $body = [ 'touser' => '@all', @@ -66,18 +75,27 @@ class WeChatChannel ], ], ]; - } else { + } elseif (isset($message['url_type'])) { // 文本卡片 + $msgId = Str::uuid(); // 生成对公消息查询URL $body = [ 'touser' => '@all', 'agentid' => sysConfig('wechat_aid'), 'msgtype' => 'textcard', 'textcard' => [ 'title' => $message['title'], - 'description' => Markdown::parse($message['content'])->toHtml(), - 'url' => route('admin.index'), - 'btntxt' => '', + 'description' => '请点击下方按钮【查看详情】', + 'url' => route('message.show', ['type' => $message['url_type'], $msgId]), + 'btntxt' => '查看详情', ], ]; + } else { // 文本消息 + $body = [ + 'touser' => '@all', + 'agentid' => sysConfig('wechat_aid'), + 'msgtype' => 'text', + 'text' => ['content' => $message['content']], + 'duplicate_check_interval' => 600, + ]; } $response = Http::timeout(15)->withBody(json_encode($body, JSON_UNESCAPED_UNICODE), 'application/json; charset=utf-8')->post($url); @@ -86,12 +104,12 @@ class WeChatChannel if ($response->ok()) { $ret = $response->json(); if (! $ret['errcode'] && $ret['errmsg'] === 'ok') { - Helpers::addNotificationLog($message['title'], $message['content'] ?? var_export($message['body'], true), 5); + Helpers::addNotificationLog($message['title'], $message['content'] ?? var_export($message['body'], true), 5, 1, null, $msgId ?? null); return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'] ?? var_export($message['body'], true), 5, 'admin', -1, $ret ? $ret['errmsg'] : '未知'); + Helpers::addNotificationLog($message['title'], $message['content'] ?? var_export($message['body'], true), 5, -1, $ret ? $ret['errmsg'] : '未知'); return false; } diff --git a/app/Components/Helpers.php b/app/Components/Helpers.php index 034de517..a5113987 100644 --- a/app/Components/Helpers.php +++ b/app/Components/Helpers.php @@ -150,15 +150,17 @@ class Helpers * @param string $title 标题 * @param string $content 内容 * @param int $type 发送类型 - * @param string $address 收信方 * @param int $status 投递状态 - * @param string $error 投递失败时记录的异常信息 + * @param string|null $error 投递失败时记录的异常信息 + * @param string|null $msgId 对公查询ID + * @param string $address 收信方 * @return int */ - public static function addNotificationLog(string $title, string $content, int $type, string $address = 'admin', int $status = 1, string $error = ''): int + public static function addNotificationLog(string $title, string $content, int $type, int $status = 1, string $error = null, string $msgId = null, string $address = 'admin'): int { $log = new NotificationLog(); $log->type = $type; + $log->msg_id = $msgId; $log->address = $address; $log->title = $title; $log->content = $content; diff --git a/app/Http/Controllers/MessageController.php b/app/Http/Controllers/MessageController.php new file mode 100644 index 00000000..4da9949f --- /dev/null +++ b/app/Http/Controllers/MessageController.php @@ -0,0 +1,21 @@ +latest()->firstOrFail(); + $title = $log->title; + $content = Markdown::parse($log->content)->toHtml(); + } + + return view('components.message', compact('title', 'content')); + } +} diff --git a/app/Notifications/Custom.php b/app/Notifications/Custom.php index a35611c9..647d128f 100644 --- a/app/Notifications/Custom.php +++ b/app/Notifications/Custom.php @@ -49,4 +49,16 @@ class Custom extends Notification implements ShouldQueue ->token(sysConfig('telegram_token')) ->content($this->content); } + + public function toBark($notifiable) + { + return [ + 'title' => $this->title, + 'content' => $this->content, + 'group' => '自定义信息', + 'icon' => asset('assets/images/notification/custom.png'), + 'sound' => 'newmail', + 'url_type' => 'markdown', + ]; + } } diff --git a/app/Notifications/NodeBlocked.php b/app/Notifications/NodeBlocked.php index eef4628c..95d262d9 100644 --- a/app/Notifications/NodeBlocked.php +++ b/app/Notifications/NodeBlocked.php @@ -53,8 +53,9 @@ class NodeBlocked extends Notification implements ShouldQueue public function toCustom($notifiable) { return [ - 'title' => trans('notification.node_block'), - 'content' => $this->markdownMessage(), + 'title' => trans('notification.node_block'), + 'content' => $this->markdownMessage(), + 'url_type' => 'markdown', ]; } diff --git a/app/Notifications/NodeDailyReport.php b/app/Notifications/NodeDailyReport.php index 9f445b3e..f99d726c 100644 --- a/app/Notifications/NodeDailyReport.php +++ b/app/Notifications/NodeDailyReport.php @@ -46,6 +46,7 @@ class NodeDailyReport extends Notification implements ShouldQueue return [ 'title' => __('Nodes Daily Report'), 'content' => $this->markdownMessage(), + 'url_type' => 'markdown', ]; } diff --git a/app/Notifications/NodeOffline.php b/app/Notifications/NodeOffline.php index 1df40d30..ca39e421 100644 --- a/app/Notifications/NodeOffline.php +++ b/app/Notifications/NodeOffline.php @@ -46,6 +46,7 @@ class NodeOffline extends Notification implements ShouldQueue return [ 'title' => trans('notification.node_offline'), 'content' => $this->markdownMessage(), + 'url_type' => 'markdown', ]; } @@ -54,6 +55,8 @@ class NodeOffline extends Notification implements ShouldQueue return [ 'title' => trans('notification.node_offline'), 'content' => $this->stringMessage(), + 'group' => '节点状态', + 'icon' => asset('assets/images/notification/offline.png'), ]; } diff --git a/app/Notifications/PaymentConfirm.php b/app/Notifications/PaymentConfirm.php index d2473cef..164e962c 100644 --- a/app/Notifications/PaymentConfirm.php +++ b/app/Notifications/PaymentConfirm.php @@ -6,7 +6,6 @@ use App\Models\Order; use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; -use NotificationChannels\Telegram\TelegramChannel; use NotificationChannels\Telegram\TelegramMessage; class PaymentConfirm extends Notification @@ -31,7 +30,7 @@ class PaymentConfirm extends Notification { $order = $this->order; $goods = $this->order->goods; - $message = sprintf("🛒 人工支付\n———————————————\n\t\tℹ️ 账号:%s\n\t\t💰 金额:%s\n\t\t📦 商品:%s\n\t\t", $order->user->username, $order->amount, $goods->name ?? '余额充值'); + $message = sprintf("🛒 人工支付\n———————————————\n\t\tℹ️ 账号:%s\n\t\t💰 金额:%1.2f\n\t\t📦 商品:%s\n\t\t", $order->user->username, $order->amount, $goods->name ?? '余额充值'); foreach (User::role('Super Admin')->get() as $admin) { if (! $admin->telegram_user_id) { continue; @@ -62,7 +61,7 @@ class PaymentConfirm extends Notification ], [ 'keyname' => '💰 金额', - 'value' => $order->amount, + 'value' => sprintf('%1.2f', $order->amount), ], [ 'keyname' => '📦 商品', diff --git a/app/Notifications/PaymentReceived.php b/app/Notifications/PaymentReceived.php index 0b6d9d8f..6b7eb444 100644 --- a/app/Notifications/PaymentReceived.php +++ b/app/Notifications/PaymentReceived.php @@ -2,7 +2,6 @@ namespace App\Notifications; -use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Notifications\Messages\MailMessage; @@ -46,17 +45,15 @@ class PaymentReceived extends Notification implements ShouldQueue // todo: 需要重新审视发送对象 public function toTelegram($notifiable) { - foreach (User::role('Super Admin')->get() as $admin) { - $message = sprintf( - "💰成功收款%s元\n———————————————\n订单号:%s", - $this->amount, - $this->sn - ); + $message = sprintf( + "💰成功收款%s元\n———————————————\n订单号:%s", + $this->amount, + $this->sn + ); - return TelegramMessage::create() - ->to($admin->telegram_user_id) - ->token(sysConfig('telegram_token')) - ->content($message); - } + return TelegramMessage::create() + ->to($notifiable->telegram_user_id) + ->token(sysConfig('telegram_token')) + ->content($message); } } diff --git a/app/Notifications/TicketClosed.php b/app/Notifications/TicketClosed.php index b7b65f64..0be08d2b 100644 --- a/app/Notifications/TicketClosed.php +++ b/app/Notifications/TicketClosed.php @@ -55,4 +55,15 @@ class TicketClosed extends Notification implements ShouldQueue ->token(sysConfig('telegram_token')) ->content($this->reason); } + + public function toBark($notifiable) + { + return [ + 'title' => trans('notification.close_ticket', ['id' => $this->ticketId, 'title' => $this->title]), + 'content' => $this->reason, + 'group' => '工单', + 'icon' => asset('assets/images/notification/ticket.png'), + 'url' => $this->url, + ]; + } } diff --git a/app/Notifications/TicketCreated.php b/app/Notifications/TicketCreated.php index 418f58d1..3bfa39d0 100644 --- a/app/Notifications/TicketCreated.php +++ b/app/Notifications/TicketCreated.php @@ -58,4 +58,15 @@ class TicketCreated extends Notification implements ShouldQueue { return "📮工单提醒 #{$ticket->id}\n———————————————\n主题:\n`{$ticket->title}`\n内容:\n`{$ticket->content}`"; } + + public function toBark($notifiable) + { + return [ + 'title' => trans('notification.new_ticket', ['title' => $this->ticket->title]), + 'content' => trans('notification.ticket_content').strip_tags($this->ticket->content), + 'group' => '工单', + 'icon' => asset('assets/images/notification/ticket.png'), + 'url' => $this->url, + ]; + } } diff --git a/app/Notifications/TicketReplied.php b/app/Notifications/TicketReplied.php index 1a939b4f..1f1bf34b 100644 --- a/app/Notifications/TicketReplied.php +++ b/app/Notifications/TicketReplied.php @@ -58,4 +58,15 @@ class TicketReplied extends Notification implements ShouldQueue { return "📮工单回复提醒 #{$reply->ticket->id}\n———————————————\n主题:\n`{$reply->ticket->title}`\n内容:\n`{$reply->content}`"; } + + public function toBark($notifiable) + { + return [ + 'title' => trans('notification.reply_ticket', ['title' => $this->reply->ticket->title]), + 'content' => trans('notification.ticket_content').strip_tags($this->reply->content), + 'group' => '工单', + 'icon' => asset('assets/images/notification/ticket.png'), + 'url' => $this->url, + ]; + } } diff --git a/database/migrations/2022_01_16_160308_add_msgid_notification_log.php b/database/migrations/2022_01_16_160308_add_msgid_notification_log.php new file mode 100644 index 00000000..a94b52d8 --- /dev/null +++ b/database/migrations/2022_01_16_160308_add_msgid_notification_log.php @@ -0,0 +1,32 @@ +uuid('msg_id')->nullable()->comment('消息对公查询号')->after('id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('notification_log', static function (Blueprint $table) { + $table->dropColumn('msg_id'); + }); + } +} diff --git a/public/assets/images/notification/custom.png b/public/assets/images/notification/custom.png new file mode 100644 index 0000000000000000000000000000000000000000..90bc8dfc840e8f1dbde2dce6b2f8ec4be2519029 GIT binary patch literal 7192 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 - + @yield('title') diff --git a/resources/views/components/message.blade.php b/resources/views/components/message.blade.php new file mode 100644 index 00000000..9b920332 --- /dev/null +++ b/resources/views/components/message.blade.php @@ -0,0 +1,44 @@ +@extends('_layout') +@section('title', sysConfig('website_name')) +@section('body_class','page-login-v3 layout-full') +@section('layout_css') + + +@endsection +@section('layout_content') +
+
+
+
+

+ {{ $title }} +

+
+
+ {!! $content !!} +
+
+
+
+@endsection diff --git a/resources/views/components/payment/detail.blade.php b/resources/views/components/payment/detail.blade.php index 1dd68971..4a148486 100644 --- a/resources/views/components/payment/detail.blade.php +++ b/resources/views/components/payment/detail.blade.php @@ -88,7 +88,6 @@ - @endsection diff --git a/resources/views/user/components/payment/manual.blade.php b/resources/views/user/components/payment/manual.blade.php index 2e9cd442..f9d7cc91 100644 --- a/resources/views/user/components/payment/manual.blade.php +++ b/resources/views/user/components/payment/manual.blade.php @@ -10,12 +10,47 @@ display: none; } + @media (max-width: 768px) { + #ad { + right: 1vw; + bottom: 20vh; + } + + #ad img { + width: 40vw; + } + } + + @media (min-width: 768px) { + #ad { + right: 3vw; + bottom: 15vh; + } + + #ad img { + width: 30vw; + } + } + + @media (min-width: 1200px) { + #ad { + right: 10vw; + bottom: 15vh; + } + + #ad img { + width: 20vw; + } + } + #ad { position: fixed; z-index: 9999; - right: 30px; - bottom: 30px; - margin-left: 535px; + margin-right: auto; + } + + #ad img { + max-width: 300px; } #ad > button { @@ -28,10 +63,8 @@ @section('content')
@@ -40,7 +73,10 @@ {{sysConfig('website_name').' '.trans('common.payment.manual')}}
-
+
+
+

扫完二维码,支付完成后。记得回来 点击👇【下一步】 直到 点击👇【{{trans('common.submit')}}】 才算正式支付完成呦!

+
1 @@ -59,7 +95,7 @@
3
- 等待 + 完成

等待支付被确认

@@ -120,7 +156,7 @@
支付时,请充值正确金额(多不退,少要补)
-
+
  • {{trans('user.shop.service').':'.$name}}
  • {{trans('user.shop.price').':¥'.$payment->amount}}
  • @@ -133,7 +169,7 @@
    - +
@@ -159,12 +195,14 @@ if (n === x.length - 1) { document.getElementById('payment-group').style.display = 'none'; - document.getElementById('nextBtn').classList.remove('btn-default'); - document.getElementById('nextBtn').classList.add('btn-primary'); - document.getElementById('nextBtn').innerHTML = '{{trans('user.status.completed')}}'; + document.getElementById('nextBtn').classList.remove('btn-primary'); + document.getElementById('nextBtn').classList.add('btn-success'); + document.getElementById('nextBtn').innerHTML = '{{trans('common.submit')}}'; } else { document.getElementById('payment-group').style.display = 'inline-flex'; document.getElementById('nextBtn').innerHTML = '下一步'; + document.getElementById('nextBtn').classList.remove('btn-success'); + document.getElementById('nextBtn').classList.add('btn-primary'); document.getElementById('nextBtn').style.display = 'inline'; } @@ -174,10 +212,8 @@ function nextPrev(n) { // This function will figure out which tab to display const x = document.getElementsByClassName('tab'); - // Hide the current tab: - x[currentTab].style.display = 'none'; // if you have reached the end of the form... : - if (currentTab === x.length - 1) { + if (currentTab === x.length - 1 && n === 1) { //...the form gets submitted: $.post('{{route('manual.inform', ['payment' => $payment->trade_no])}}', {_token: '{{csrf_token()}}'}, function(ret) { if (ret.status === 'success') { @@ -188,11 +224,11 @@ }); return false; } else { - // Increase or decrease the current tab by 1: - currentTab += n; - showTab(currentTab); + x[currentTab].style.display = 'none';// Hide the current tab: + currentTab += n;// Increase or decrease the current tab by 1: } + showTab(currentTab); } function fixStepIndicator(n) { diff --git a/resources/views/user/help.blade.php b/resources/views/user/help.blade.php index c12d5f6a..5ba269cf 100644 --- a/resources/views/user/help.blade.php +++ b/resources/views/user/help.blade.php @@ -198,25 +198,21 @@
+

方法一

+

电脑有安装任何电脑管家类的软件,都可以使用他们自带的网络修复工具来重置网络。

+

方法二

  1. - 电脑有安装任何电脑管家类的软件,都可以使用他们自带的网络修复工具来重置网络。 + 键盘操作Win + X,或右击左下角开始菜单键 + (Win键看起来像 这样)
  2. -
      -
    1. - 键盘操作Win + X,或右击左下角开始菜单键 - (Win键看起来像 这样) -
    2. -
    3. - 按下 A键 或者 手动选择 - 命令提示符(管理员)/ Windows PowerShell(管理员) -
    4. -
    5. - 输入Netsh winsock reset 后回车,再输入 - netsh advfirewall reset 后回车; -
    6. -
    + 按下 A键 或者 手动选择 + 命令提示符(管理员)/ Windows PowerShell(管理员) +
  3. +
  4. + 输入Netsh winsock reset 后回车,再输入 + netsh advfirewall reset 后回车;
@@ -237,7 +233,7 @@ 账号在2种情况下会显示禁用;
  1. - 套餐过期/流量枯竭;此情况您需要重新 + 套餐过期/流量枯竭;此情况您需要重新购买/重置 【{{trans('user.menu.shop')}}】
  2. diff --git a/resources/views/user/layouts.blade.php b/resources/views/user/layouts.blade.php index 07a97689..280e051b 100644 --- a/resources/views/user/layouts.blade.php +++ b/resources/views/user/layouts.blade.php @@ -181,7 +181,7 @@
-