UserController.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Models\Article;
  4. use App\Http\Models\Config;
  5. use App\Http\Models\Invite;
  6. use App\Http\Models\SsNode;
  7. use App\Http\Models\SsNodeInfo;
  8. use App\Http\Models\SsNodeOnlineLog;
  9. use App\Http\Models\User;
  10. use App\Http\Models\UserTrafficLog;
  11. use Illuminate\Http\Request;
  12. use Redirect;
  13. use Response;
  14. class UserController extends BaseController
  15. {
  16. public function index(Request $request)
  17. {
  18. if (!$request->session()->has('user')) {
  19. return Redirect::to('login');
  20. }
  21. $view['articleList'] = Article::orderBy('sort', 'desc')->orderBy('id', 'desc')->limit(5)->get();
  22. $view['info'] = $request->session()->get('user');
  23. return Response::view('user/index', $view);
  24. }
  25. // 公告详情
  26. public function article(Request $request)
  27. {
  28. $id = $request->get('id');
  29. $view['info'] = Article::where('id', $id)->first();
  30. return Response::view('user/article', $view);
  31. }
  32. // 修改个人资料
  33. public function profile(Request $request)
  34. {
  35. if (!$request->session()->has('user')) {
  36. return Redirect::to('login');
  37. }
  38. $user = $request->session()->get('user');
  39. if ($request->method() == 'POST') {
  40. $old_password = $request->get('old_password');
  41. $new_password = $request->get('new_password');
  42. $port = trim($request->get('port'));
  43. $passwd = trim($request->get('passwd'));
  44. $method = $request->get('method');
  45. $protocol = $request->get('protocol');
  46. $obfs = $request->get('obfs');
  47. // 修改密码
  48. if (!empty($old_password) && !empty($new_password)) {
  49. $old_password = md5(trim($old_password));
  50. $new_password = md5(trim($new_password));
  51. $user = User::where('id', $user['id'])->first();
  52. if ($user->password != $old_password) {
  53. $request->session()->flash('errorMsg', '旧密码错误,请重新输入');
  54. return Redirect::to('user/profile#tab_1');
  55. } else if ($user->password == $new_password) {
  56. $request->session()->flash('errorMsg', '新密码不可与旧密码一样,请重新输入');
  57. return Redirect::to('user/profile#tab_1');
  58. }
  59. $ret = User::where('id', $user['id'])->update(['password' => $new_password]);
  60. if (!$ret) {
  61. $request->session()->flash('errorMsg', '修改失败');
  62. return Redirect::to('user/profile#tab_1');
  63. } else {
  64. $request->session()->flash('successMsg', '修改成功');
  65. return Redirect::to('user/profile#tab_1');
  66. }
  67. }
  68. // 修改SS信息
  69. if (empty($port)) {
  70. $request->session()->flash('errorMsg', '端口不能为空');
  71. return Redirect::to('user/profile#tab_2');
  72. }
  73. if (empty($passwd)) {
  74. $request->session()->flash('errorMsg', '密码不能为空');
  75. return Redirect::to('user/profile#tab_2');
  76. }
  77. $data = [
  78. //'port' => $port,
  79. 'passwd' => $passwd,
  80. 'method' => $method,
  81. 'protocol' => $protocol,
  82. 'obfs' => $obfs
  83. ];
  84. $ret = User::where('id', $user['id'])->update($data);
  85. if (!$ret) {
  86. $request->session()->flash('errorMsg', '修改失败');
  87. return Redirect::to('user/profile#tab_2');
  88. } else {
  89. // 更新session
  90. $user = User::where('id', $user['id'])->first()->toArray();
  91. $request->session()->remove('user');
  92. $request->session()->put('user', $user);
  93. $request->session()->flash('successMsg', '修改成功');
  94. return Redirect::to('user/profile#tab_2');
  95. }
  96. } else {
  97. // 加密方式、协议、混淆
  98. $view['method_list'] = $this->methodList();
  99. $view['protocol_list'] = $this->protocolList();
  100. $view['obfs_list'] = $this->obfsList();
  101. $view['info'] = User::where('id', $user['id'])->first();
  102. return Response::view('user/profile', $view);
  103. }
  104. }
  105. // 节点列表
  106. public function nodeList(Request $request)
  107. {
  108. if (!$request->session()->has('user')) {
  109. return Redirect::to('login');
  110. }
  111. $user = $request->session()->get('user');
  112. $nodeList = SsNode::paginate(10);
  113. foreach ($nodeList as &$node) {
  114. // 在线人数
  115. $online_log = SsNodeOnlineLog::where('node_id', $node->id)->orderBy('id', 'desc')->first();
  116. $node->online_users = empty($online_log) ? 0 : $online_log->online_user;
  117. // 已产生流量
  118. $u = UserTrafficLog::where('node_id', $node->id)->sum('u');
  119. $d = UserTrafficLog::where('node_id', $node->id)->sum('d');
  120. $node->transfer = $this->flowAutoShow($u + $d);
  121. // 负载
  122. $node_info = SsNodeInfo::where('node_id', $node->id)->orderBy('id', 'desc')->first();
  123. $node->load = empty($node_info->load) ? 0 : $node_info->load;
  124. // 生成ssr scheme
  125. $ssr_str = '';
  126. $ssr_str .= $node->server . ':' . $user['port'];
  127. $ssr_str .= ':' . $user['protocol'] . ':' . $user['method'];
  128. $ssr_str .= ':' . $user['obfs'] . ':' . base64_encode($user['passwd']);
  129. $ssr_str .= '/?obfsparam=' . $user['obfs_param'];
  130. $ssr_str .= '&=protoparam' . $user['protocol_param'];
  131. $ssr_str .= '&remarks=' . base64_encode('VPN');
  132. $ssr_str = $this->base64url_encode($ssr_str);
  133. $ssr_scheme = 'ssr://' . $ssr_str;
  134. // 生成ss scheme
  135. $ss_str = '';
  136. $ss_str .= $user['method'] . ':' . $user['passwd'] . '@';
  137. $ss_str .= $node->server . ':' . $user['port'];
  138. $ss_str = $this->base64url_encode($ss_str) . '#' . 'VPN';
  139. $ss_scheme = 'ss://' . $ss_str;
  140. // 生成文本配置信息
  141. $txt = <<<TXT
  142. 服务器:{$node->server}
  143. 端口:{$user['port']}
  144. 密码:{$user['passwd']}
  145. 加密方式:{$user['method']}
  146. 协议:{$user['protocol']}
  147. 协议参数:{$user['protocol_param']}
  148. 混淆:{$user['obfs']}
  149. 混淆参数:{$user['obfs_param']}
  150. TXT;
  151. $node->txt = $txt;
  152. $node->ssr_scheme = $ssr_scheme;
  153. $node->ss_scheme = $ss_scheme;
  154. }
  155. $view['nodeList'] = $nodeList;
  156. return Response::view('user/nodeList', $view);
  157. }
  158. // 流量日志
  159. public function trafficLog(Request $request)
  160. {
  161. if (!$request->session()->has('user')) {
  162. return Redirect::to('login');
  163. }
  164. $user = $request->session()->get('user');
  165. // 30天内的流量
  166. $trafficList = \DB::select("SELECT date(from_unixtime(log_time)) AS dd, SUM(u) AS u, SUM(d) AS d FROM `user_traffic_log` WHERE `user_id` = {$user['id']} GROUP BY `dd`");
  167. foreach ($trafficList as $key => &$val) {
  168. $val->total = ($val->u + $val->d) / (1024 * 1024); // 以M为单位
  169. }
  170. $view['trafficList'] = $trafficList;
  171. return Response::view('user/trafficLog', $view);
  172. }
  173. // 邀请码
  174. public function invite(Request $request)
  175. {
  176. if (!$request->session()->has('user')) {
  177. return Redirect::to('login');
  178. }
  179. $user = $request->session()->get('user');
  180. // 已生成的邀请码数量
  181. $num = Invite::where('uid', $user['id'])->count();
  182. $inviteNum = Config::where('id', 3)->pluck('value');
  183. $view['num'] = $inviteNum[0] - $num; // 还可以生成的邀请码数量
  184. $view['inviteList'] = Invite::where('uid', $user['id'])->with(['generator', 'user'])->paginate(10); // 邀请码列表
  185. return Response::view('user/invite', $view);
  186. }
  187. // 生成邀请码
  188. public function makeInvite(Request $request)
  189. {
  190. if (!$request->session()->has('user')) {
  191. return Redirect::to('login');
  192. }
  193. $user = $request->session()->get('user');
  194. // 已生成的邀请码数量
  195. $num = Invite::where('uid', $user['id'])->count();
  196. $inviteNum = Config::where('id', 3)->pluck('value');
  197. if ($num >= $inviteNum[0]) {
  198. return Response::json(['status' => 'fail', 'data' => '', 'message' => '生成失败:最多只能生成' . $inviteNum[0] . '个邀请码']);
  199. }
  200. $obj = new Invite();
  201. $obj->uid = $user['id'];
  202. $obj->fuid = 0;
  203. $obj->code = strtoupper(md5(microtime() . $this->makeRandStr(6)));
  204. $obj->status = 0;
  205. $obj->dateline = date('Y-m-d H:i:s', strtotime("+ 7days"));
  206. $obj->save();
  207. return Response::json(['status' => 'success', 'data' => '', 'message' => '生成成功']);
  208. }
  209. }