mirror of
https://github.com/ProxyPanel/ProxyPanel.git
synced 2026-04-05 03:58:39 +00:00
优化数据库 与 简化控制器 & more
1. 继续修改表表关系,与关联字段的限制; 2. 通过表表关系,简化一部分代码,自动让Laravel建立关联; 3. 拆分验证 与 优化数据创建与修改的获取数据操作; 4. 修改部分无意义的数据名称;
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user