|
@@ -16,9 +16,6 @@ use App\Models\NodePing;
|
|
|
use App\Models\Order;
|
|
|
use App\Models\Ticket;
|
|
|
use App\Models\TicketReply;
|
|
|
-use App\Models\UserLoginLog;
|
|
|
-use App\Models\UserSubscribe;
|
|
|
-use Auth;
|
|
|
use Cache;
|
|
|
use DB;
|
|
|
use Exception;
|
|
@@ -34,38 +31,22 @@ use Session;
|
|
|
use Str;
|
|
|
use Validator;
|
|
|
|
|
|
-/**
|
|
|
- * 用户控制器.
|
|
|
- *
|
|
|
- * Class UserController
|
|
|
- */
|
|
|
class UserController extends Controller
|
|
|
{
|
|
|
public function index()
|
|
|
{
|
|
|
+ // 用户转换
|
|
|
if (Session::has('user')) {
|
|
|
- Auth::loginUsingId(Session::get('user'));
|
|
|
+ auth()->loginUsingId(Session::get('user'));
|
|
|
Session::forget('user');
|
|
|
}
|
|
|
- $user = Auth::getUser();
|
|
|
+ $user = auth()->user();
|
|
|
$totalTransfer = $user->transfer_enable;
|
|
|
$usedTransfer = $user->usedTraffic();
|
|
|
$unusedTraffic = $totalTransfer - $usedTransfer > 0 ? $totalTransfer - $usedTransfer : 0;
|
|
|
$expireTime = $user->expired_at;
|
|
|
- $view['remainDays'] = $expireTime < date('Y-m-d') ? -1 : Helpers::daysToNow($expireTime);
|
|
|
- $view['resetDays'] = $user->reset_time ? Helpers::daysToNow($user->reset_time) : 0;
|
|
|
- $view['unusedTraffic'] = flowAutoShow($unusedTraffic);
|
|
|
- $view['expireTime'] = $expireTime;
|
|
|
- $view['banedTime'] = $user->ban_time ?: 0;
|
|
|
- $view['unusedPercent'] = $totalTransfer > 0 ? round($unusedTraffic / $totalTransfer, 2) * 100 : 0;
|
|
|
- $view['announcements'] = Article::type(2)->take(5)->latest()->Paginate(1); // 公告
|
|
|
- //流量异常判断
|
|
|
- $view['isTrafficWarning'] = $user->isTrafficWarning();
|
|
|
- //付费用户判断
|
|
|
- $view['paying_user'] = $user->activePayingUser();
|
|
|
- $view['userLoginLog'] = UserLoginLog::whereUserId($user->id)->latest()->first(); // 近期登录日志
|
|
|
-
|
|
|
- $nodes = $user->userAccessNodes()->get();
|
|
|
+
|
|
|
+ $nodes = $user->nodes()->get();
|
|
|
$subType = [];
|
|
|
if ($nodes->whereIn('type', [1, 4])->isNotEmpty()) {
|
|
|
$subType[] = 'ss';
|
|
@@ -77,18 +58,27 @@ class UserController extends Controller
|
|
|
$subType[] = 'trojan';
|
|
|
}
|
|
|
|
|
|
- $view['subscribe_status'] = $user->subscribe->status;
|
|
|
- $view['subType'] = $subType;
|
|
|
- $view['subUrl'] = route('sub', $user->subscribe->code);
|
|
|
- $view = array_merge($view, $this->dataFlowChart($user->id));
|
|
|
-
|
|
|
- return view('user.index', $view);
|
|
|
+ return view('user.index', array_merge([
|
|
|
+ 'remainDays' => $expireTime < date('Y-m-d') ? -1 : Helpers::daysToNow($expireTime),
|
|
|
+ 'resetDays' => $user->reset_time ? Helpers::daysToNow($user->reset_time) : 0,
|
|
|
+ 'unusedTraffic' => flowAutoShow($unusedTraffic),
|
|
|
+ 'expireTime' => $expireTime,
|
|
|
+ 'banedTime' => $user->ban_time ?: 0,
|
|
|
+ 'unusedPercent' => $totalTransfer > 0 ? round($unusedTraffic / $totalTransfer, 2) * 100 : 0,
|
|
|
+ 'announcements' => Article::type(2)->take(5)->latest()->Paginate(1), // 公告
|
|
|
+ 'isTrafficWarning' => $user->isTrafficWarning(), // 流量异常判断
|
|
|
+ 'paying_user' => $user->activePayingUser(), // 付费用户判断
|
|
|
+ 'userLoginLog' => $user->loginLogs()->latest()->first(), // 近期登录日志
|
|
|
+ 'subscribe_status' => $user->subscribe->status,
|
|
|
+ 'subType' => $subType,
|
|
|
+ 'subUrl' => route('sub', $user->subscribe->code),
|
|
|
+ ], $this->dataFlowChart($user->id)));
|
|
|
}
|
|
|
|
|
|
// 签到
|
|
|
public function checkIn(): JsonResponse
|
|
|
{
|
|
|
- $user = Auth::getUser();
|
|
|
+ $user = auth()->user();
|
|
|
// 系统开启登录加积分功能才可以签到
|
|
|
if (! sysConfig('is_checkin')) {
|
|
|
return Response::json(['status' => 'fail', 'message' => '系统未开启签到功能']);
|
|
@@ -118,7 +108,7 @@ class UserController extends Controller
|
|
|
// 节点列表
|
|
|
public function nodeList(Request $request)
|
|
|
{
|
|
|
- $user = Auth::getUser();
|
|
|
+ $user = auth()->user();
|
|
|
if ($request->isMethod('POST')) {
|
|
|
$infoType = $request->input('type');
|
|
|
|
|
@@ -135,9 +125,7 @@ class UserController extends Controller
|
|
|
}
|
|
|
|
|
|
// 获取当前用户可用节点
|
|
|
- $nodeList = $user->userAccessNodes()->with(['labels', 'level_table'])->get();
|
|
|
-
|
|
|
- $view['nodesGeo'] = $nodeList->pluck('name', 'geo')->toArray();
|
|
|
+ $nodeList = $user->nodes()->with(['labels', 'level_table'])->get();
|
|
|
$onlineNode = NodeHeartBeat::recently()->distinct()->pluck('node_id')->toArray();
|
|
|
$pingNodeLogs = NodePing::whereMonth('created_at', date('m'))->get(['node_id', 'ct', 'cu', 'cm', 'hk']);
|
|
|
foreach ($nodeList as $node) {
|
|
@@ -150,23 +138,23 @@ class UserController extends Controller
|
|
|
// 节点在线状态
|
|
|
$node->offline = ! in_array($node->id, $onlineNode, true);
|
|
|
}
|
|
|
- $view['nodeList'] = $nodeList ?? [];
|
|
|
|
|
|
- return view('user.nodeList', $view);
|
|
|
+ return view('user.nodeList', [
|
|
|
+ 'nodesGeo' => $nodeList->pluck('name', 'geo')->toArray(),
|
|
|
+ 'nodeList' => $nodeList,
|
|
|
+ ]);
|
|
|
}
|
|
|
|
|
|
// 公告详情
|
|
|
- public function article(Request $request)
|
|
|
+ public function article(Article $article)
|
|
|
{
|
|
|
- $view['info'] = Article::findOrFail($request->input('id'));
|
|
|
-
|
|
|
- return view('user.article', $view);
|
|
|
+ return view('user.article', compact($article));
|
|
|
}
|
|
|
|
|
|
// 修改个人资料
|
|
|
public function profile(Request $request)
|
|
|
{
|
|
|
- $user = Auth::getUser();
|
|
|
+ $user = auth()->user();
|
|
|
if ($request->isMethod('POST')) {
|
|
|
$old_password = $request->input('old_password');
|
|
|
$new_password = $request->input('new_password');
|
|
@@ -224,30 +212,26 @@ class UserController extends Controller
|
|
|
// 商品列表
|
|
|
public function services(Request $request)
|
|
|
{
|
|
|
- $user = Auth::getUser();
|
|
|
+ $user = auth()->user();
|
|
|
// 余额充值商品,只取10个
|
|
|
- $view['chargeGoodsList'] = Goods::type(3)->whereStatus(1)->orderBy('price')->limit(10)->get();
|
|
|
- $view['goodsList'] = Goods::whereStatus(1)
|
|
|
- ->where('type', '<=', '2')
|
|
|
- ->orderByDesc('type')
|
|
|
- ->orderByDesc('sort')
|
|
|
- ->paginate(10)
|
|
|
- ->appends($request->except('page'));
|
|
|
$renewOrder = Order::userActivePlan($user->id)->first();
|
|
|
$renewPrice = $renewOrder->goods ?? 0;
|
|
|
- $view['renewTraffic'] = $renewPrice->renew ?? 0;
|
|
|
// 有重置日时按照重置日为标准,否者就以过期日为标准
|
|
|
$dataPlusDays = $user->reset_time ?? $user->expired_at;
|
|
|
- $view['dataPlusDays'] = $dataPlusDays > date('Y-m-d') ? Helpers::daysToNow($dataPlusDays) : 0;
|
|
|
|
|
|
- return view('user.services', $view);
|
|
|
+ return view('user.services', [
|
|
|
+ 'chargeGoodsList' => Goods::type(3)->whereStatus(1)->orderBy('price')->limit(10)->get(),
|
|
|
+ 'goodsList' => Goods::whereStatus(1)->where('type', '<=', '2')->orderByDesc('type')->orderByDesc('sort')->paginate(10)->appends($request->except('page')),
|
|
|
+ 'renewTraffic' => $renewPrice->renew ?? 0,
|
|
|
+ 'dataPlusDays' => $dataPlusDays > date('Y-m-d') ? Helpers::daysToNow($dataPlusDays) : 0,
|
|
|
+ ]);
|
|
|
}
|
|
|
|
|
|
//重置流量
|
|
|
public function resetUserTraffic(): ?JsonResponse
|
|
|
{
|
|
|
- $user = Auth::getUser();
|
|
|
- $order = Order::userActivePlan()->first();
|
|
|
+ $user = auth()->user();
|
|
|
+ $order = Order::userActivePlan()->firstOrFail();
|
|
|
$renewCost = $order->goods->renew;
|
|
|
if ($user->credit < $renewCost) {
|
|
|
return Response::json(['status' => 'fail', 'message' => '余额不足,请充值余额']);
|
|
@@ -268,26 +252,22 @@ class UserController extends Controller
|
|
|
public function ticketList(Request $request)
|
|
|
{
|
|
|
return view('user.ticketList', [
|
|
|
- 'tickets' => Auth::user()->tickets()->latest()->paginate(10)->appends($request->except('page')),
|
|
|
+ 'tickets' => auth()->user()->tickets()->latest()->paginate(10)->appends($request->except('page')),
|
|
|
]);
|
|
|
}
|
|
|
|
|
|
// 订单
|
|
|
public function invoices(Request $request)
|
|
|
{
|
|
|
- $view['orderList'] = Auth::user()->orders()
|
|
|
- ->with(['goods', 'payment'])
|
|
|
- ->orderByDesc('id')
|
|
|
- ->paginate(10)
|
|
|
- ->appends($request->except('page'));
|
|
|
- $view['prepaidPlan'] = Order::userPrepay()->exists();
|
|
|
-
|
|
|
- return view('user.invoices', $view);
|
|
|
+ return view('user.invoices', [
|
|
|
+ 'orderList' => auth()->user()->orders()->with(['goods', 'payment'])->orderByDesc('id')->paginate(10)->appends($request->except('page')),
|
|
|
+ 'prepaidPlan' => Order::userPrepay()->exists(),
|
|
|
+ ]);
|
|
|
}
|
|
|
|
|
|
public function closePlan(): JsonResponse
|
|
|
{
|
|
|
- $activePlan = Order::userActivePlan()->first();
|
|
|
+ $activePlan = Order::userActivePlan()->firstOrFail();
|
|
|
$activePlan->is_expire = 1;
|
|
|
|
|
|
if ($activePlan->save()) {
|
|
@@ -305,15 +285,13 @@ class UserController extends Controller
|
|
|
// 订单明细
|
|
|
public function invoiceDetail($sn)
|
|
|
{
|
|
|
- $view['order'] = Order::uid()->whereOrderSn($sn)->with(['goods', 'coupon', 'payment'])->firstOrFail();
|
|
|
-
|
|
|
- return view('user.invoiceDetail', $view);
|
|
|
+ return view('user.invoiceDetail', ['order' => Order::uid()->whereOrderSn($sn)->with(['goods', 'coupon', 'payment'])->firstOrFail()]);
|
|
|
}
|
|
|
|
|
|
// 添加工单
|
|
|
public function createTicket(Request $request): ?JsonResponse
|
|
|
{
|
|
|
- $user = Auth::getUser();
|
|
|
+ $user = auth()->user();
|
|
|
$title = $request->input('title');
|
|
|
$content = clean($request->input('content'));
|
|
|
$content = str_replace(['atob', 'eval'], '', $content);
|
|
@@ -367,7 +345,7 @@ class UserController extends Controller
|
|
|
|
|
|
$obj = new TicketReply();
|
|
|
$obj->ticket_id = $id;
|
|
|
- $obj->user_id = Auth::id();
|
|
|
+ $obj->user_id = auth()->user()->id;
|
|
|
$obj->content = $content;
|
|
|
|
|
|
if ($obj->save()) {
|
|
@@ -392,10 +370,10 @@ class UserController extends Controller
|
|
|
return Response::json(['status' => 'fail', 'message' => '回复失败']);
|
|
|
}
|
|
|
|
|
|
- $view['ticket'] = $ticket;
|
|
|
- $view['replyList'] = TicketReply::whereTicketId($id)->with('user')->oldest()->get();
|
|
|
-
|
|
|
- return view('user.replyTicket', $view);
|
|
|
+ return view('user.replyTicket', [
|
|
|
+ 'ticket' => $ticket,
|
|
|
+ 'replyList' => $ticket->reply()->with('user')->oldest()->get(),
|
|
|
+ ]);
|
|
|
}
|
|
|
|
|
|
// 关闭工单
|
|
@@ -423,18 +401,18 @@ class UserController extends Controller
|
|
|
);
|
|
|
}
|
|
|
|
|
|
- $view['num'] = Auth::getUser()->invite_num; // 还可以生成的邀请码数量
|
|
|
- $view['inviteList'] = Invite::uid()->with(['invitee', 'inviter'])->paginate(10); // 邀请码列表
|
|
|
- $view['referral_traffic'] = flowAutoShow(sysConfig('referral_traffic') * MB);
|
|
|
- $view['referral_percent'] = sysConfig('referral_percent');
|
|
|
-
|
|
|
- return view('user.invite', $view);
|
|
|
+ return view('user.invite', [
|
|
|
+ 'num' => auth()->user()->invite_num, // 还可以生成的邀请码数量
|
|
|
+ 'inviteList' => Invite::uid()->with(['invitee', 'inviter'])->paginate(10), // 邀请码列表
|
|
|
+ 'referral_traffic' => flowAutoShow(sysConfig('referral_traffic') * MB),
|
|
|
+ 'referral_percent' => sysConfig('referral_percent'),
|
|
|
+ ]);
|
|
|
}
|
|
|
|
|
|
// 生成邀请码
|
|
|
public function makeInvite(): JsonResponse
|
|
|
{
|
|
|
- $user = Auth::getUser();
|
|
|
+ $user = auth()->user();
|
|
|
if ($user->invite_num <= 0) {
|
|
|
return Response::json(['status' => 'fail', 'message' => '生成失败:已无邀请码生成名额']);
|
|
|
}
|
|
@@ -483,7 +461,7 @@ class UserController extends Controller
|
|
|
return Response::json(['status' => 'fail', 'title' => '抱歉', 'message' => '优惠券已失效!']);
|
|
|
}
|
|
|
|
|
|
- if ($coupon->start_time > time()) {
|
|
|
+ if ($coupon->start_time > date('Y-m-d H:i:s')) {
|
|
|
return Response::json(['status' => 'fail', 'title' => '优惠券尚未生效', 'message' => '请等待活动正式开启']);
|
|
|
}
|
|
|
|
|
@@ -501,20 +479,17 @@ class UserController extends Controller
|
|
|
}
|
|
|
|
|
|
// 购买服务
|
|
|
- public function buy($goods_id)
|
|
|
+ public function buy(Goods $good)
|
|
|
{
|
|
|
- $user = Auth::getUser();
|
|
|
- $goods = Goods::whereId($goods_id)->whereStatus(1)->first();
|
|
|
- if (empty($goods)) {
|
|
|
- return Redirect::route('shop');
|
|
|
- }
|
|
|
+ $user = auth()->user();
|
|
|
// 有重置日时按照重置日为标准,否者就以过期日为标准
|
|
|
$dataPlusDays = $user->reset_time ?? $user->expired_at;
|
|
|
- $view['dataPlusDays'] = $dataPlusDays > date('Y-m-d') ? Helpers::daysToNow($dataPlusDays) : 0;
|
|
|
- $view['activePlan'] = Order::userActivePlan()->exists();
|
|
|
- $view['goods'] = $goods;
|
|
|
|
|
|
- return view('user.buy', $view);
|
|
|
+ return view('user.buy', [
|
|
|
+ 'dataPlusDays' => $dataPlusDays > date('Y-m-d') ? Helpers::daysToNow($dataPlusDays) : 0,
|
|
|
+ 'activePlan' => Order::userActivePlan()->exists(),
|
|
|
+ 'goods' => $good,
|
|
|
+ ]);
|
|
|
}
|
|
|
|
|
|
// 帮助中心
|
|
@@ -533,25 +508,22 @@ class UserController extends Controller
|
|
|
$data[] = 'trojan';
|
|
|
}
|
|
|
|
|
|
- $view['sub'] = $data;
|
|
|
-
|
|
|
- //付费用户判断
|
|
|
- $view['paying_user'] = Auth::user()->activePayingUser();
|
|
|
- //客户端安装
|
|
|
- $view['Shadowrocket_install'] = 'itms-services://?action=download-manifest&url='.sysConfig('website_url').'/clients/Shadowrocket.plist';
|
|
|
- $view['Quantumult_install'] = 'itms-services://?action=download-manifest&url='.sysConfig('website_url').'/clients/Quantumult.plist';
|
|
|
- // 订阅连接
|
|
|
- $subscribe = UserSubscribe::whereUserId(Auth::id())->firstOrFail();
|
|
|
- $view['subscribe_status'] = $subscribe->status;
|
|
|
+ $subscribe = auth()->user()->subscribe;
|
|
|
$subscribe_link = route('sub', $subscribe->code);
|
|
|
- $view['link'] = $subscribe_link;
|
|
|
- $view['subscribe_link'] = 'sub://'.base64url_encode($subscribe_link);
|
|
|
- $view['Shadowrocket_link'] = 'shadowrocket://add/sub://'.base64url_encode($subscribe_link).'?remarks='.(sysConfig('website_name').'-'.sysConfig('website_url'));
|
|
|
- $view['Shadowrocket_linkQrcode'] = 'sub://'.base64url_encode($subscribe_link).'#'.base64url_encode(sysConfig('website_name'));
|
|
|
- $view['Quantumult_linkOut'] = 'quantumult://configuration?server='.base64url_encode($subscribe_link).'&filter='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Pro.conf').'&rejection='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Rejection.conf');
|
|
|
- $view['Quantumult_linkIn'] = 'quantumult://configuration?server='.base64url_encode($subscribe_link).'&filter='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/BacktoCN.conf').'&rejection='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Rejection.conf');
|
|
|
-
|
|
|
- return view('user.help', $view);
|
|
|
+
|
|
|
+ return view('user.help', [
|
|
|
+ 'sub' => $data,
|
|
|
+ 'paying_user' => auth()->user()->activePayingUser(), // 付费用户判断
|
|
|
+ 'Shadowrocket_install' => 'itms-services://?action=download-manifest&url='.sysConfig('website_url').'/clients/Shadowrocket.plist', // 客户端安装
|
|
|
+ 'Quantumult_install' => 'itms-services://?action=download-manifest&url='.sysConfig('website_url').'/clients/Quantumult.plist', // 客户端安装
|
|
|
+ 'subscribe_status' => $subscribe->status, // 订阅连接
|
|
|
+ 'link' => $subscribe_link,
|
|
|
+ 'subscribe_link' => 'sub://'.base64url_encode($subscribe_link),
|
|
|
+ 'Shadowrocket_link' => 'shadowrocket://add/sub://'.base64url_encode($subscribe_link).'?remarks='.(sysConfig('website_name').'-'.sysConfig('website_url')),
|
|
|
+ 'Shadowrocket_linkQrcode' => 'sub://'.base64url_encode($subscribe_link).'#'.base64url_encode(sysConfig('website_name')),
|
|
|
+ 'Quantumult_linkOut' => 'quantumult://configuration?server='.base64url_encode($subscribe_link).'&filter='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Pro.conf').'&rejection='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Rejection.conf'),
|
|
|
+ 'Quantumult_linkIn' => 'quantumult://configuration?server='.base64url_encode($subscribe_link).'&filter='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/BacktoCN.conf').'&rejection='.base64url_encode('https://raw.githubusercontent.com/ZBrettonYe/VPN-Rules-Collection/master/Profiles/Quantumult/Rejection.conf'),
|
|
|
+ ]);
|
|
|
}
|
|
|
|
|
|
// 更换订阅地址
|
|
@@ -561,10 +533,10 @@ class UserController extends Controller
|
|
|
DB::beginTransaction();
|
|
|
|
|
|
// 更换订阅码
|
|
|
- Auth::getUser()->subscribe->update(['code' => Helpers::makeSubscribeCode()]);
|
|
|
+ auth()->user()->subscribe->update(['code' => Helpers::makeSubscribeCode()]);
|
|
|
|
|
|
// 更换连接信息
|
|
|
- Auth::getUser()->update(['passwd' => Str::random(), 'vmess_id' => Str::uuid()]);
|
|
|
+ auth()->user()->update(['passwd' => Str::random(), 'vmess_id' => Str::uuid()]);
|
|
|
|
|
|
DB::commit();
|
|
|
|
|
@@ -586,7 +558,7 @@ class UserController extends Controller
|
|
|
}
|
|
|
|
|
|
// 管理员信息重新写入user
|
|
|
- $user = Auth::loginUsingId(Session::get('admin'));
|
|
|
+ $user = auth()->loginUsingId(Session::get('admin'));
|
|
|
Session::forget('admin');
|
|
|
if ($user) {
|
|
|
return Response::json(['status' => 'success', 'message' => '身份切换成功']);
|
|
@@ -615,14 +587,14 @@ class UserController extends Controller
|
|
|
try {
|
|
|
DB::beginTransaction();
|
|
|
// 写入日志
|
|
|
- $user = Auth::getUser();
|
|
|
+ $user = auth()->user();
|
|
|
Helpers::addUserCreditLog($user->id, null, $user->credit, $user->credit + $coupon->value, $coupon->value, '用户手动充值 - [充值券:'.$request->input('coupon_sn').']');
|
|
|
|
|
|
// 余额充值
|
|
|
$user->updateCredit($coupon->value);
|
|
|
|
|
|
// 更改卡券状态
|
|
|
- Coupon::find($coupon->id)->update(['status' => 1]);
|
|
|
+ $coupon->update(['status' => 1]);
|
|
|
|
|
|
// 写入卡券日志
|
|
|
Helpers::addCouponLog('账户余额充值使用', $coupon->id);
|