优化数据库 与 简化控制器 & more

1. 继续修改表表关系,与关联字段的限制;
2. 通过表表关系,简化一部分代码,自动让Laravel建立关联;
3. 拆分验证 与 优化数据创建与修改的获取数据操作;
4. 修改部分无意义的数据名称;
This commit is contained in:
兔姬桑
2020-12-28 12:03:26 +08:00
parent a20f077566
commit f25f2aea62
117 changed files with 1883 additions and 1982 deletions

View File

@@ -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);