UserController.php 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Helpers\DataChart;
  4. use App\Models\Article;
  5. use App\Services\NodeService;
  6. use App\Services\UserService;
  7. use App\Utils\Helpers;
  8. use Cache;
  9. use DB;
  10. use Exception;
  11. use Hash;
  12. use Illuminate\Http\JsonResponse;
  13. use Illuminate\Http\RedirectResponse;
  14. use Illuminate\Http\Request;
  15. use Log;
  16. use Redirect;
  17. use Response;
  18. use Session;
  19. use Str;
  20. class UserController extends Controller
  21. {
  22. use DataChart;
  23. public function index(NodeService $nodeService)
  24. {
  25. // 用户转换
  26. if (Session::has('user')) {
  27. auth()->loginUsingId(Session::pull('user'));
  28. }
  29. $user = auth()->user();
  30. $totalTransfer = $user->transfer_enable;
  31. $usedTransfer = $user->used_traffic;
  32. $unusedTraffic = max($totalTransfer - $usedTransfer, 0);
  33. return view('user.index', array_merge([
  34. 'remainDays' => now()->diffInDays($user->expired_at, false),
  35. 'resetDays' => $user->reset_time ? now()->diffInDays($user->reset_time, false) : null,
  36. 'unusedTraffic' => $unusedTraffic,
  37. 'expireTime' => $user->expiration_date,
  38. 'banedTime' => $user->ban_time,
  39. 'unusedPercent' => $totalTransfer > 0 ? round($unusedTraffic / $totalTransfer, 2) * 100 : 0,
  40. 'announcements' => Article::type(2)->lang()->latest()->simplePaginate(1), // 公告
  41. 'isTrafficWarning' => $user->isTrafficWarning(), // 流量异常判断
  42. 'paying_user' => (new UserService)->isActivePaying(), // 付费用户判断
  43. 'userLoginLog' => $user->loginLogs()->latest()->first(), // 近期登录日志
  44. 'subscribe_status' => $user->subscribe->status,
  45. 'subMsg' => $user->subscribe->ban_desc,
  46. 'subType' => $nodeService->getActiveNodeTypes($user->nodes()),
  47. 'subUrl' => $user->subUrl(),
  48. ], $this->dataFlowChart($user->id)));
  49. }
  50. // 签到
  51. public function checkIn(): JsonResponse
  52. {
  53. $user = auth()->user();
  54. // 系统开启登录加积分功能才可以签到
  55. if (! sysConfig('is_checkin')) {
  56. return Response::json(['status' => 'fail', 'title' => trans('common.failed'), 'message' => trans('user.home.attendance.disable')]);
  57. }
  58. // 已签到过,验证是否有效
  59. if (Cache::has('userCheckIn_'.$user->id)) {
  60. return Response::json(['status' => 'success', 'title' => trans('common.success'), 'message' => trans('user.home.attendance.done')]);
  61. }
  62. $traffic = random_int((int) sysConfig('min_rand_traffic'), (int) sysConfig('max_rand_traffic')) * MiB;
  63. if (! $user->incrementData($traffic)) {
  64. return Response::json(['status' => 'fail', 'title' => trans('common.failed'), 'message' => trans('user.home.attendance.failed')]);
  65. }
  66. Helpers::addUserTrafficModifyLog($user->id, $user->transfer_enable, $user->transfer_enable + $traffic, trans('user.home.attendance.attribute'));
  67. // 多久后可以再签到
  68. $ttl = sysConfig('traffic_limit_time') ? sysConfig('traffic_limit_time') * Minute : Day;
  69. Cache::put('userCheckIn_'.$user->id, '1', $ttl);
  70. return Response::json(['status' => 'success', 'message' => trans('user.home.attendance.success', ['data' => formatBytes($traffic)])]);
  71. }
  72. // 修改个人资料
  73. public function profile()
  74. {
  75. $user = auth()->user();
  76. $auth = $user->userAuths()->pluck('type')->toArray();
  77. return view('user.profile', compact('auth'));
  78. }
  79. public function updateProfile(Request $request): RedirectResponse
  80. {
  81. $user = auth()->user();
  82. // 修改密码
  83. if ($request->has(['password', 'new_password'])) {
  84. $data = $request->only(['password', 'new_password']);
  85. if (! Hash::check($data['password'], $user->password)) {
  86. return Redirect::back()->withErrors(trans('auth.password.reset.error.wrong'));
  87. }
  88. if (Hash::check($data['new_password'], $user->password)) {
  89. return Redirect::back()->withErrors(trans('auth.password.reset.error.same'));
  90. }
  91. // 演示环境禁止改管理员密码
  92. if ($user->id === 1 && config('app.env') === 'demo') {
  93. return Redirect::back()->withErrors(trans('auth.password.reset.error.demo'));
  94. }
  95. if (! $user->update(['password' => $data['new_password']])) {
  96. return Redirect::back()->withErrors(trans('common.failed_item', ['attribute' => trans('common.update')]));
  97. }
  98. return Redirect::back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.update')]));
  99. // 修改代理密码
  100. }
  101. if ($request->has('passwd')) {
  102. $passwd = $request->input('passwd');
  103. if (! $user->update(['passwd' => $passwd])) {
  104. return Redirect::back()->withErrors(trans('common.failed_item', ['attribute' => trans('common.update')]));
  105. }
  106. return Redirect::back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.update')]));
  107. }
  108. // 修改联系方式
  109. if ($request->has(['nickname', 'wechat', 'qq'])) {
  110. $data = $request->only(['nickname', 'wechat', 'qq']);
  111. if (empty($data['nickname'])) {
  112. return Redirect::back()->withErrors(trans('validation.required', ['attribute' => trans('model.user.nickname')]));
  113. }
  114. if (! $user->update($data)) {
  115. return Redirect::back()->withErrors(trans('common.failed_item', ['attribute' => trans('common.update')]));
  116. }
  117. }
  118. return Redirect::back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.update')]));
  119. }
  120. public function exchangeSubscribe(): ?JsonResponse
  121. { // 更换订阅地址
  122. try {
  123. DB::beginTransaction();
  124. $user = auth()->user();
  125. // 更换订阅码
  126. $user->subscribe->update(['code' => Helpers::makeSubscribeCode()]);
  127. // 更换连接信息
  128. $user->update(['passwd' => Str::random(), 'vmess_id' => Str::uuid()]);
  129. DB::commit();
  130. return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.change')])]);
  131. } catch (Exception $e) {
  132. DB::rollBack();
  133. Log::error(trans('user.subscribe.error').':'.$e->getMessage());
  134. return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.change')]).$e->getMessage()]);
  135. }
  136. }
  137. public function switchToAdmin(): JsonResponse
  138. { // 转换成管理员的身份
  139. if (! Session::has('admin')) {
  140. return Response::json(['status' => 'fail', 'message' => trans('http-statuses.401')]);
  141. }
  142. // 管理员信息重新写入user
  143. $user = auth()->loginUsingId(Session::pull('admin'));
  144. if ($user) {
  145. return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.toggle')])]);
  146. }
  147. return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.toggle')])]);
  148. }
  149. public function switchCurrency(string $code): RedirectResponse
  150. { // 切换语言
  151. Session::put('currency', $code);
  152. return Redirect::back();
  153. }
  154. }