UserController.php 7.1 KB

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