(int) $this->user->transfer_enable === 0 ? 0 : ($this->user->u + $this->user->d - $this->user->last_day_t) / $this->user->transfer_enable * 100, 'past_traffic_usage' => (int) $this->user->transfer_enable === 0 ? 0 : $this->user->last_day_t / $this->user->transfer_enable * 100, 'residual_flow' => (int) $this->user->transfer_enable === 0 ? 0 : ($this->user->transfer_enable - ($this->user->u + $this->user->d)) / $this->user->transfer_enable * 100, ]; return $response->write( $this->view() ->assign('ann', Ann::orderBy('date', 'desc')->first()) ->assign('getUniversalSub', SubController::getUniversalSub($this->user)) ->assign('data', $data) ->assign('captcha', $captcha) ->display('user/index.tpl') ); } /** * @param array $args */ public function code(Request $request, Response $response, array $args) { $pageNum = $request->getQueryParams()['page'] ?? 1; $codes = Code::where('type', '<>', '-2') ->where('userid', '=', $this->user->id) ->orderBy('id', 'desc') ->paginate(15, ['*'], 'page', $pageNum); $render = Tools::paginateRender($codes); return $response->write( $this->view() ->assign('codes', $codes) ->assign('payments', Payment::getPaymentsEnabled()) ->assign('render', $render) ->display('user/code.tpl') ); } /** * @param array $args */ public function codeCheck(Request $request, Response $response, array $args) { $time = $request->getQueryParams()['time']; $codes = Code::where('userid', '=', $this->user->id) ->where('usedatetime', '>', date('Y-m-d H:i:s', $time)) ->first(); if ($codes !== null && strpos($codes->code, '充值') !== false) { return $response->withJson([ 'ret' => 1, ]); } return $response->withJson([ 'ret' => 0, ]); } /** * @param array $args */ public function codePost(Request $request, Response $response, array $args) { $code = trim($request->getParam('code')); if ($code === '') { return ResponseHelper::error($response, '请填写充值码'); } $codeq = Code::where('code', $code)->where('isused', 0)->first(); if ($codeq === null) { return ResponseHelper::error($response, '没有这个充值码'); } $user = $this->user; $codeq->isused = 1; $codeq->usedatetime = date('Y-m-d H:i:s'); $codeq->userid = $user->id; $codeq->save(); if ($codeq->type === -1) { $user->money += $codeq->number; $user->save(); // 返利 if ($user->ref_by > 0 && Setting::obtain('invitation_mode') === 'after_recharge') { Payback::rebate($user->id, $codeq->number); } return $response->withJson([ 'ret' => 1, 'msg' => '兑换成功,金额为 ' . $codeq->number . ' 元', ]); } if ($codeq->type === 10001) { $user->transfer_enable += $codeq->number * 1024 * 1024 * 1024; $user->save(); } if ($codeq->type === 10002) { if (\time() > strtotime($user->expire_in)) { $user->expire_in = date('Y-m-d H:i:s', \time() + $codeq->number * 86400); } else { $user->expire_in = date('Y-m-d H:i:s', strtotime($user->expire_in) + $codeq->number * 86400); } $user->save(); } if ($codeq->type >= 1 && $codeq->type <= 10000) { if ($user->class === 0 || $user->class !== $codeq->type) { $user->class_expire = date('Y-m-d H:i:s', \time()); $user->save(); } $user->class_expire = date('Y-m-d H:i:s', strtotime($user->class_expire) + $codeq->number * 86400); $user->class = $codeq->type; $user->save(); } return $response->withJson([ 'ret' => 1, 'msg' => '', ]); } /** * @param array $args */ public function checkGa(Request $request, Response $response, array $args) { $code = $request->getParam('code'); if ($code === '') { return $response->withJson([ 'ret' => 0, 'msg' => '二维码不能为空', ]); } $user = $this->user; $ga = new GA(); $rcode = $ga->verifyCode($user->ga_token, $code); if (! $rcode) { return $response->withJson([ 'ret' => 0, 'msg' => '测试错误', ]); } return $response->withJson([ 'ret' => 1, 'msg' => '测试成功', ]); } /** * @param array $args */ public function setGa(Request $request, Response $response, array $args) { $enable = $request->getParam('enable'); if ($enable === '') { return $response->withJson([ 'ret' => 0, 'msg' => '选项无效', ]); } $user = $this->user; $user->ga_enable = $enable; $user->save(); return $response->withJson([ 'ret' => 1, 'msg' => '设置成功', ]); } /** * @param array $args */ public function resetPort(Request $request, Response $response, array $args) { $temp = $this->user->resetPort(); return $response->withJson([ 'ret' => ($temp['ok'] === true ? 1 : 0), 'msg' => $temp['msg'], ]); } /** * @param array $args */ public function specifyPort(Request $request, Response $response, array $args) { $temp = $this->user->specifyPort((int) $request->getParam('port')); return $response->withJson([ 'ret' => ($temp['ok'] === true ? 1 : 0), 'msg' => $temp['msg'], ]); } /** * @param array $args */ public function resetGa(Request $request, Response $response, array $args) { $ga = new GA(); $secret = $ga->createSecret(); $user = $this->user; $user->ga_token = $secret; $user->save(); return $response->withStatus(302)->withHeader('Location', '/user/edit'); } /** * @param array $args */ public function profile(Request $request, Response $response, array $args) { $pageNum = $request->getQueryParams()['page'] ?? 1; $paybacks = Payback::where('ref_by', $this->user->id) ->orderBy('datetime', 'desc') ->paginate(15, ['*'], 'page', $pageNum); // 登录IP $totallogin = LoginIp::where('userid', '=', $this->user->id)->where('type', '=', 0)->orderBy('datetime', 'desc')->take(10)->get(); // 使用IP $userip = []; $iplocation = new QQWry(); $total = Ip::where('datetime', '>=', \time() - 300)->where('userid', '=', $this->user->id)->get(); foreach ($total as $single) { $single->ip = Tools::getRealIp($single->ip); $is_node = Node::where('node_ip', $single->ip)->first(); if ($is_node) { continue; } if (! isset($userip[$single->ip])) { $location = $iplocation->getlocation($single->ip); $userip[$single->ip] = iconv('gbk', 'utf-8//IGNORE', $location['country'] . $location['area']); } } if ($request->getParam('json') === 1) { return $response->withJson([ 'ret' => 1, 'paybacks' => $paybacks, 'userloginip' => $totallogin, 'userip' => $userip, ]); } $boughts = Bought::where('userid', $this->user->id)->orderBy('id', 'desc')->get(); return $response->write( $this->view() ->assign('boughts', $boughts) ->assign('userip', $userip) ->assign('userloginip', $totallogin) ->assign('paybacks', $paybacks) ->registerClass('Tools', Tools::class) ->display('user/profile.tpl') ); } /** * @param array $args */ public function announcement(Request $request, Response $response, array $args) { $Anns = Ann::orderBy('date', 'desc')->get(); if ($request->getParam('json') === 1) { return $response->withJson([ 'Anns' => $Anns, 'ret' => 1, ]); } return $response->write( $this->view() ->assign('anns', $Anns) ->display('user/announcement.tpl') ); } /** * @param array $args */ public function docs(Request $request, Response $response, array $args) { $docs = Docs::orderBy('id', 'desc')->get(); if ($request->getParam('json') === 1) { return $response->withJson([ 'docs' => $docs, 'ret' => 1, ]); } return $response->write( $this->view() ->assign('docs', $docs) ->display('user/docs.tpl') ); } /** * @param array $args */ public function media(Request $request, Response $response, array $args) { $results = []; $db = new DatatablesHelper(); $nodes = $db->query('SELECT DISTINCT node_id FROM stream_media'); foreach ($nodes as $node_id) { $node = Node::where('id', $node_id)->first(); $unlock = StreamMedia::where('node_id', $node_id) ->orderBy('id', 'desc') ->where('created_at', '>', \time() - 86460) // 只获取最近一天零一分钟内上报的数据 ->first(); if ($unlock !== null && $node !== null) { $details = \json_decode($unlock->result, true); $details = str_replace('Originals Only', '仅限自制', $details); $details = str_replace('Oversea Only', '仅限海外', $details); foreach ($details as $key => $value) { $info = [ 'node_name' => $node->name, 'created_at' => $unlock->created_at, 'unlock_item' => $details, ]; } array_push($results, $info); } } if ($_ENV['streaming_media_unlock_multiplexing'] !== null) { foreach ($_ENV['streaming_media_unlock_multiplexing'] as $key => $value) { $key_node = Node::where('id', $key)->first(); $value_node = StreamMedia::where('node_id', $value) ->orderBy('id', 'desc') ->where('created_at', '>', \time() - 86460) // 只获取最近一天零一分钟内上报的数据 ->first(); if ($value_node !== null) { $details = \json_decode($value_node->result, true); $details = str_replace('Originals Only', '仅限自制', $details); $details = str_replace('Oversea Only', '仅限海外', $details); $info = [ 'node_name' => $key_node->name, 'created_at' => $value_node->created_at, 'unlock_item' => $details, ]; array_push($results, $info); } } } array_multisort(array_column($results, 'node_name'), SORT_ASC, $results); return $this->view() ->assign('results', $results) ->display('user/media.tpl'); } /** * @param array $args */ public function edit(Request $request, Response $response, array $args) { $themes = Tools::getDir(BASE_PATH . '/resources/views'); $bind_token = TelegramSessionManager::addBindSession($this->user); $methods = Config::getSupportParam('method'); return $this->view() ->assign('user', $this->user) ->assign('themes', $themes) ->assign('bind_token', $bind_token) ->assign('methods', $methods) ->assign('telegram_bot', $_ENV['telegram_bot']) ->registerClass('Config', Config::class) ->registerClass('URL', URL::class) ->display('user/edit.tpl'); } /** * @param array $args */ public function invite(Request $request, Response $response, array $args) { $code = InviteCode::where('user_id', $this->user->id)->first(); if ($code === null) { $this->user->addInviteCode(); $code = InviteCode::where('user_id', $this->user->id)->first(); } $pageNum = $request->getQueryParams()['page'] ?? 1; $paybacks = Payback::where('ref_by', $this->user->id) ->orderBy('id', 'desc') ->paginate(15, ['*'], 'page', $pageNum); $paybacks_sum = Payback::where('ref_by', $this->user->id)->sum('ref_get'); if (! $paybacks_sum) { $paybacks_sum = 0; } $render = Tools::paginateRender($paybacks); $invite_url = $_ENV['baseUrl'] . '/auth/register?code=' . $code->code; return $this->view() ->assign('code', $code) ->assign('render', $render) ->assign('paybacks', $paybacks) ->assign('invite_url', $invite_url) ->assign('paybacks_sum', $paybacks_sum) ->display('user/invite.tpl'); } /** * @param array $args */ public function buyInvite(Request $request, Response $response, array $args) { $price = Setting::obtain('invite_price'); $num = $request->getParam('num'); $num = trim($num); if (! Tools::isInt($num) || $price < 0 || $num <= 0) { return ResponseHelper::error($response, '非法请求'); } $amount = $price * $num; $user = $this->user; if (! $user->isLogin) { return $response->withJson([ 'ret' => -1 ]); } if ($user->money < $amount) { return ResponseHelper::error($response, '余额不足,总价为' . $amount . '元。'); } $user->invite_num += $num; $user->money -= $amount; $user->save(); return ResponseHelper::successfully($response, '邀请次数添加成功'); } /** * @param array $args */ public function customInvite(Request $request, Response $response, array $args) { $price = Setting::obtain('custom_invite_price'); $customcode = $request->getParam('customcode'); $customcode = trim($customcode); if (Tools::isSpecialChars($customcode) || $price < 0 || $customcode === '' || strlen($customcode) > 32) { return ResponseHelper::error( $response, '定制失败,邀请链接不能为空,后缀不能包含特殊符号且长度不能大于32字符' ); } if (InviteCode::where('code', $customcode)->count() !== 0) { return ResponseHelper::error($response, '此后缀名被抢注了'); } $user = $this->user; if (! $user->isLogin) { return $response->withJson([ 'ret' => -1 ]); } if ($user->money < $price) { return ResponseHelper::error( $response, '余额不足,总价为' . $price . '元。' ); } $code = InviteCode::where('user_id', $user->id)->first(); $code->code = $customcode; $user->money -= $price; $user->save(); $code->save(); return ResponseHelper::successfully($response, '定制成功'); } /** * @param array $args */ public function updatePassword(Request $request, Response $response, array $args) { $oldpwd = $request->getParam('oldpwd'); $pwd = $request->getParam('pwd'); $repwd = $request->getParam('repwd'); $user = $this->user; if (! Hash::checkPassword($user->pass, $oldpwd)) { return ResponseHelper::error($response, '旧密码错误'); } if ($pwd !== $repwd) { return ResponseHelper::error($response, '两次输入不符合'); } if (strlen($pwd) < 8) { return ResponseHelper::error($response, '密码太短啦'); } $hashPwd = Hash::passwordHash($pwd); $user->pass = $hashPwd; $user->save(); if ($_ENV['enable_forced_replacement'] === true) { $user->cleanLink(); } return ResponseHelper::successfully($response, '修改成功'); } /** * @param array $args */ public function updateEmail(Request $request, Response $response, array $args) { $user = $this->user; $newemail = $request->getParam('newemail'); $oldemail = $user->email; $otheruser = User::where('email', $newemail)->first(); if ($_ENV['enable_change_email'] !== true) { return ResponseHelper::error($response, '此项不允许自行修改,请联系管理员操作'); } if (Setting::obtain('reg_email_verify')) { $emailcode = $request->getParam('emailcode'); $mailcount = EmailVerify::where('email', '=', $newemail)->where('code', '=', $emailcode)->where('expire_in', '>', \time())->first(); if ($mailcount === null) { return ResponseHelper::error($response, '您的邮箱验证码不正确'); } } if ($newemail === '') { return ResponseHelper::error($response, '未填写邮箱'); } $check_res = Check::isEmailLegal($newemail); if ($check_res['ret'] === 0) { return $response->withJson($check_res); } if ($otheruser !== null) { return ResponseHelper::error($response, '邮箱已经被使用了'); } if ($newemail === $oldemail) { return ResponseHelper::error($response, '新邮箱不能和旧邮箱一样'); } $antiXss = new AntiXSS(); $user->email = $antiXss->xss_clean($newemail); $user->save(); return ResponseHelper::successfully($response, '修改成功'); } /** * @param array $args */ public function updateUsername(Request $request, Response $response, array $args) { $newusername = $request->getParam('newusername'); $user = $this->user; $antiXss = new AntiXSS(); $user->user_name = $antiXss->xss_clean($newusername); $user->save(); return ResponseHelper::successfully($response, '修改成功'); } /** * @param array $args */ public function bought(Request $request, Response $response, array $args) { $pageNum = $request->getQueryParams()['page'] ?? 1; $shops = Bought::where('userid', $this->user->id)->orderBy('id', 'desc')->paginate(15, ['*'], 'page', $pageNum); if ($request->getParam('json') === 1) { foreach ($shops as $shop) { $shop->datetime = $shop->datetime(); $shop->name = $shop->shop()->name; $shop->content = $shop->shop()->content(); } return $response->withJson([ 'ret' => 1, 'shops' => $shops, ]); } $render = Tools::paginateRender($shops); return $this->view() ->assign('shops', $shops) ->assign('render', $render) ->display('user/bought.tpl'); } /** * @param array $args */ public function deleteBoughtGet(Request $request, Response $response, array $args) { $id = $request->getParam('id'); $shop = Bought::where('id', $id)->where('userid', $this->user->id)->first(); if ($shop === null) { return ResponseHelper::error($response, '关闭自动续费失败,订单不存在。'); } if ($this->user->id === $shop->userid) { $shop->renew = 0; } if (! $shop->save()) { return ResponseHelper::error($response, '关闭自动续费失败'); } return ResponseHelper::successfully($response, '关闭自动续费成功'); } /** * @param array $args */ public function updateContact(Request $request, Response $response, array $args) { $type = $request->getParam('imtype'); $contact = trim($request->getParam('contact')); $user = $this->user; if ($user->telegram_id !== null) { return ResponseHelper::error( $response, '您绑定了 Telegram ,所以此项并不能被修改。' ); } if ($contact === '' || $type === '') { return ResponseHelper::error($response, '非法输入'); } $user1 = User::where('im_value', $contact)->where('im_type', $type)->first(); if ($user1 !== null) { return ResponseHelper::error($response, '此联络方式已经被注册'); } $user->im_type = $type; $antiXss = new AntiXSS(); $user->im_value = $antiXss->xss_clean($contact); $user->save(); return ResponseHelper::successfully($response, '修改成功'); } /** * @param array $args */ public function updateSSR(Request $request, Response $response, array $args) { $protocol = $request->getParam('protocol'); $obfs = $request->getParam('obfs'); $obfs_param = $request->getParam('obfs_param'); $obfs_param = trim($obfs_param); $user = $this->user; if ($obfs === '' || $protocol === '') { return ResponseHelper::error($response, '非法输入'); } if (! Tools::isParamValidate('obfs', $obfs)) { return ResponseHelper::error($response, '协议无效'); } if (! Tools::isParamValidate('protocol', $protocol)) { return ResponseHelper::error($response, '协议无效'); } $antiXss = new AntiXSS(); $user->protocol = $antiXss->xss_clean($protocol); $user->obfs = $antiXss->xss_clean($obfs); $user->obfs_param = $antiXss->xss_clean($obfs_param); if (! Tools::checkNoneProtocol($user)) { return ResponseHelper::error( $response, '系统检测到您目前的加密方式为 none ,但您将要设置为的协议并不在以下协议
' . implode(',', Config::getSupportParam('allow_none_protocol')) . '
之内,请您先修改您的加密方式,再来修改此处设置。' ); } if (! URL::SSCanConnect($user) && ! URL::SSRCanConnect($user)) { return ResponseHelper::error( $response, '您这样设置之后,就没有客户端能连接上了,所以系统拒绝了您的设置,请您检查您的设置之后再进行操作。' ); } $user->save(); if (! URL::SSCanConnect($user)) { return ResponseHelper::error( $response, '设置成功,但您目前的协议,混淆,加密方式设置会导致 Shadowsocks原版客户端无法连接,请您自行更换到 ShadowsocksR 客户端。' ); } if (! URL::SSRCanConnect($user)) { return ResponseHelper::error( $response, '设置成功,但您目前的协议,混淆,加密方式设置会导致 ShadowsocksR 客户端无法连接,请您自行更换到 Shadowsocks 客户端。' ); } return ResponseHelper::successfully($response, '设置成功,您可自由选用客户端来连接。'); } /** * @param array $args */ public function updateTheme(Request $request, Response $response, array $args) { $theme = $request->getParam('theme'); $user = $this->user; if ($theme === '') { return ResponseHelper::error($response, '非法输入'); } $antiXss = new AntiXSS(); $user->theme = $antiXss->xss_clean($theme); $user->save(); return ResponseHelper::successfully($response, '设置成功'); } /** * @param array $args */ public function updateMail(Request $request, Response $response, array $args) { $value = (int) $request->getParam('mail'); if (\in_array($value, [0, 1, 2])) { $user = $this->user; if ($value === 2 && $_ENV['enable_telegram'] === false) { return ResponseHelper::error( $response, '修改失败,当前无法使用 Telegram 接收每日报告' ); } $user->sendDailyMail = $value; $user->save(); return ResponseHelper::successfully($response, '修改成功'); } return ResponseHelper::error($response, '非法输入'); } /** * @param array $args */ public function resetPasswd(Request $request, Response $response, array $args) { $user = $this->user; $pwd = Tools::genRandomChar(16); $current_timestamp = \time(); $new_uuid = Uuid::uuid3(Uuid::NAMESPACE_DNS, $user->email . '|' . $current_timestamp); $existing_uuid = User::where('uuid', $new_uuid)->first(); if ($existing_uuid !== null) { return ResponseHelper::error($response, '目前出现一些问题,请稍后再试'); } $user->uuid = $new_uuid; $user->passwd = $pwd; $user->save(); return ResponseHelper::successfully($response, '修改成功'); } /** * @param array $args */ public function updateMethod(Request $request, Response $response, array $args) { $user = $this->user; $antiXss = new AntiXSS(); $method = strtolower($antiXss->xss_clean($request->getParam('method'))); if ($method === '') { ResponseHelper::error($response, '非法输入'); } if (! Tools::isParamValidate('method', $method)) { ResponseHelper::error($response, '加密无效'); } $user->method = $method; $user->save(); return ResponseHelper::successfully($response, '修改成功'); } /** * @param array $args */ public function logout(Request $request, Response $response, array $args) { Auth::logout(); return $response->withStatus(302)->withHeader('Location', '/'); } /** * @param array $args */ public function doCheckIn(Request $request, Response $response, array $args) { if ($_ENV['enable_checkin'] === false) { return ResponseHelper::error($response, '暂时还不能签到'); } if (Setting::obtain('enable_checkin_captcha') === true) { $ret = Captcha::verify($request->getParams()); if (! $ret) { return ResponseHelper::error($response, '系统无法接受您的验证结果,请刷新页面后重试'); } } if (strtotime($this->user->expire_in) < \time()) { return ResponseHelper::error($response, '没有过期的账户才可以签到'); } $checkin = $this->user->checkin(); if ($checkin['ok'] === false) { return ResponseHelper::error($response, $checkin['msg']); } return $response->withJson([ 'ret' => 1, 'trafficInfo' => [ 'todayUsedTraffic' => $this->user->todayUsedTraffic(), 'lastUsedTraffic' => $this->user->lastUsedTraffic(), 'unUsedTraffic' => $this->user->unusedTraffic(), ], 'traffic' => Tools::flowAutoShow($this->user->transfer_enable), 'unflowtraffic' => $this->user->transfer_enable, 'msg' => $checkin['msg'], ]); } /** * @param array $args */ public function kill(Request $request, Response $response, array $args) { return $this->view()->display('user/kill.tpl'); } /** * @param array $args */ public function handleKill(Request $request, Response $response, array $args) { $user = $this->user; $passwd = $request->getParam('passwd'); if (! Hash::checkPassword($user->pass, $passwd)) { return ResponseHelper::error($response, '密码错误'); } if ($_ENV['enable_kill'] === true) { Auth::logout(); $user->killUser(); return ResponseHelper::successfully($response, '您的帐号已经从我们的系统中删除。欢迎下次光临'); } return ResponseHelper::error($response, '管理员不允许删除,如需删除请联系管理员。'); } /** * @param array $args */ public function banned(Request $request, Response $response, array $args) { $user = $this->user; return $this->view() ->assign('banned_reason', $user->banned_reason) ->display('user/banned.tpl'); } /** * @param array $args */ public function resetTelegram(Request $request, Response $response, array $args) { $user = $this->user; $user->telegramReset(); return ResponseHelper::successfully($response, '重置成功'); } /** * @param array $args */ public function resetURL(Request $request, Response $response, array $args) { $user = $this->user; $user->cleanLink(); return ResponseHelper::successfully($response, '重置成功'); } /** * @param array $args */ public function resetInviteURL(Request $request, Response $response, array $args) { $user = $this->user; $user->clearInviteCodes(); return ResponseHelper::successfully($response, '重置成功'); } /** * @param array $args */ public function backtoadmin(Request $request, Response $response, array $args) { $userid = Cookie::get('uid'); $adminid = Cookie::get('old_uid'); $user = User::find($userid); $admin = User::find($adminid); if (! $admin->is_admin || ! $user) { Cookie::set([ 'uid' => null, 'email' => null, 'key' => null, 'ip' => null, 'expire_in' => null, 'old_uid' => null, 'old_email' => null, 'old_key' => null, 'old_ip' => null, 'old_expire_in' => null, 'old_local' => null, ], \time() - 1000); } $expire_in = Cookie::get('old_expire_in'); $local = Cookie::get('old_local'); Cookie::set([ 'uid' => Cookie::get('old_uid'), 'email' => Cookie::get('old_email'), 'key' => Cookie::get('old_key'), 'ip' => Cookie::get('old_ip'), 'expire_in' => $expire_in, 'old_uid' => null, 'old_email' => null, 'old_key' => null, 'old_ip' => null, 'old_expire_in' => null, 'old_local' => null, ], $expire_in); return $response->withStatus(302)->withHeader('Location', $local); } /** * @param array $args */ public function getUserAllURL(Request $request, Response $response, array $args) { $user = $this->user; $type = $request->getQueryParams()['type']; $return = ''; switch ($type) { case 'ss': $return .= URL::getNewAllUrl($user, ['type' => 'ss']) . PHP_EOL; break; case 'ssr': $return .= URL::getNewAllUrl($user, ['type' => 'ssr']) . PHP_EOL; break; case 'v2ray': $return .= URL::getNewAllUrl($user, ['type' => 'vmess']) . PHP_EOL; break; default: $return .= '悟空别闹!'; break; } $response = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8') ->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate') ->withHeader('Content-Disposition', ' attachment; filename=node.txt'); return $response->write($return); } /** * 订阅记录 * * @param array $args */ public function subscribeLog(Request $request, Response $response, array $args) { if ($_ENV['subscribeLog_show'] === false) { return $response->withStatus(302)->withHeader('Location', '/user'); } $pageNum = $request->getQueryParams()['page'] ?? 1; $logs = UserSubscribeLog::orderBy('id', 'desc')->where('user_id', $this->user->id)->paginate(15, ['*'], 'page', $pageNum); $render = Tools::paginateRender($logs); return $this->view() ->assign('logs', $logs) ->assign('render', $render) ->registerClass('Tools', Tools::class) ->fetch('user/subscribe_log.tpl'); } /** * @param array $args */ public function switchThemeMode(Request $request, Response $response, array $args) { $user = $this->user; if ($user->is_dark_mode === 1) { $user->is_dark_mode = 0; } else { $user->is_dark_mode = 1; } $user->save(); return $response->withJson([ 'ret' => 1, 'msg' => '切换成功', ]); } }