1010use App \Http \Models \SsNodeOnlineLog ;
1111use App \Http \Models \User ;
1212use App \Http \Models \UserTrafficLog ;
13+ use App \Http \Models \Verify ;
14+ use App \Mail \resetPassword ;
1315use Illuminate \Http \Request ;
1416use Redirect ;
1517use Response ;
18+ use Cache ;
19+ use Mail ;
1620
1721class UserController extends BaseController
1822{
@@ -22,7 +26,7 @@ public function index(Request $request)
2226 return Redirect::to ('login ' );
2327 }
2428
25- $ view ['articleList ' ] = Article::orderBy ('sort ' , 'desc ' )->orderBy ('id ' , 'desc ' )->limit ( 5 )-> get ( );
29+ $ view ['articleList ' ] = Article::orderBy ('sort ' , 'desc ' )->orderBy ('id ' , 'desc ' )->paginate ( 5 );
2630 $ view ['info ' ] = $ request ->session ()->get ('user ' );
2731
2832 return Response::view ('user/index ' , $ view );
@@ -176,13 +180,15 @@ public function nodeList(Request $request)
176180 // 生成文本配置信息
177181 $ txt = <<<TXT
178182服务器: {$ node ->server }
179- 端口: {$ user ['port ' ]}
183+ 远程端口: {$ user ['port ' ]}
184+ 本地端口:1080
180185密码: {$ user ['passwd ' ]}
181- 加密方式 : {$ user ['method ' ]}
186+ 加密方法 : {$ user ['method ' ]}
182187协议: {$ user ['protocol ' ]}
183188协议参数: {$ user ['protocol_param ' ]}
184- 混淆 : {$ user ['obfs ' ]}
189+ 混淆方式 : {$ user ['obfs ' ]}
185190混淆参数: {$ user ['obfs_param ' ]}
191+ 路由:绕过局域网及中国大陆地址
186192TXT ;
187193
188194 $ node ->txt = $ txt ;
@@ -226,9 +232,9 @@ public function invite(Request $request)
226232
227233 // 已生成的邀请码数量
228234 $ num = Invite::where ('uid ' , $ user ['id ' ])->count ();
229- $ inviteNum = Config:: where ( ' id ' , 3 )-> pluck ( ' value ' );
235+ $ config = $ this -> systemConfig ( );
230236
231- $ view ['num ' ] = $ inviteNum [ 0 ] - $ num ; // 还可以生成的邀请码数量
237+ $ view ['num ' ] = $ config [ ' invite_num ' ] - $ num <= 0 ? 0 : $ config [ ' invite_num ' ] - $ num ; // 还可以生成的邀请码数量
232238 $ view ['inviteList ' ] = Invite::where ('uid ' , $ user ['id ' ])->with (['generator ' , 'user ' ])->paginate (10 ); // 邀请码列表
233239
234240 return Response::view ('user/invite ' , $ view );
@@ -245,20 +251,145 @@ public function makeInvite(Request $request)
245251
246252 // 已生成的邀请码数量
247253 $ num = Invite::where ('uid ' , $ user ['id ' ])->count ();
248- $ inviteNum = Config:: where ( ' id ' , 3 )-> pluck ( ' value ' );
249- if ($ num >= $ inviteNum [ 0 ]) {
250- return Response::json (['status ' => 'fail ' , 'data ' => '' , 'message ' => '生成失败:最多只能生成 ' . $ inviteNum [ 0 ] . '个邀请码 ' ]);
254+ $ config = $ this -> systemConfig ( );
255+ if ($ num >= $ config [ ' invite_num ' ]) {
256+ return Response::json (['status ' => 'fail ' , 'data ' => '' , 'message ' => '生成失败:最多只能生成 ' . $ config [ ' invite_num ' ] . '个邀请码 ' ]);
251257 }
252258
253259 $ obj = new Invite ();
254260 $ obj ->uid = $ user ['id ' ];
255261 $ obj ->fuid = 0 ;
256- $ obj ->code = strtoupper (md5 (microtime () . $ this ->makeRandStr (6 )));
262+ $ obj ->code = strtoupper (mb_substr ( md5 (microtime () . $ this ->makeRandStr (6 )), 8 , 16 ));
257263 $ obj ->status = 0 ;
258- $ obj ->dateline = date ('Y-m-d H:i:s ' , strtotime ("+ 7days " ));
264+ $ obj ->dateline = date ('Y-m-d H:i:s ' , strtotime ("+7 days " ));
259265 $ obj ->save ();
260266
261267 return Response::json (['status ' => 'success ' , 'data ' => '' , 'message ' => '生成成功 ' ]);
262268 }
263269
270+ // 重设密码
271+ public function resetPassword (Request $ request )
272+ {
273+ $ config = $ this ->systemConfig ();
274+
275+ if ($ request ->method () == 'POST ' ) {
276+ $ username = trim ($ request ->get ('username ' ));
277+
278+ // 是否开启重设密码
279+ if (!$ config ['is_reset_password ' ]) {
280+ $ request ->session ()->flash ('errorMsg ' , '系统未开启重置密码功能,请联系管理员 ' );
281+
282+ return Redirect::back ()->withInput ();
283+ }
284+
285+ // 查找账号
286+ $ user = User::where ('username ' , $ username )->first ();
287+ if (!$ user ) {
288+ $ request ->session ()->flash ('errorMsg ' , '账号不存在,请重试 ' );
289+
290+ return Redirect::back ();
291+ }
292+
293+ // 24小时内重设密码次数限制
294+ $ resetTimes = 0 ;
295+ if (Cache::has ('resetPassword_ ' . md5 ($ username ))) {
296+ $ resetTimes = Cache::get ('resetPassword_ ' . md5 ($ username ));
297+ if ($ resetTimes >= $ config ['reset_password_times ' ]) {
298+ $ request ->session ()->flash ('errorMsg ' , '同一个账号24小时内只能重设密码 ' . $ config ['reset_password_times ' ] . '次,请勿频繁操作 ' );
299+
300+ return Redirect::back ();
301+ }
302+ }
303+
304+ // 生成取回密码的地址
305+ $ token = md5 ($ config ['website_name ' ] . $ username . microtime ());
306+ $ verify = new Verify ();
307+ $ verify ->user_id = $ user ->id ;
308+ $ verify ->username = $ username ;
309+ $ verify ->token = $ token ;
310+ $ verify ->status = 0 ;
311+ $ verify ->save ();
312+
313+ // 发送邮件
314+ $ resetPasswordUrl = $ config ['website_url ' ] . '/reset/ ' . $ token ;
315+ Mail::to ($ user ->username )->send (new resetPassword ($ config ['website_name ' ], $ resetPasswordUrl ));
316+
317+ Cache::put ('resetPassword_ ' . md5 ($ username ), $ resetTimes + 1 , 1440 );
318+ $ request ->session ()->flash ('successMsg ' , '重置成功,请查看邮箱 ' );
319+
320+ return Redirect::back ();
321+ } else {
322+ $ view ['is_reset_password ' ] = $ config ['is_reset_password ' ];
323+
324+ return Response::view ('user/resetPassword ' , $ view );
325+ }
326+ }
327+
328+ // 重设密码
329+ public function reset (Request $ request , $ token )
330+ {
331+ if ($ request ->method () == 'POST ' ) {
332+ $ password = trim ($ request ->get ('password ' ));
333+ $ repassword = trim ($ request ->get ('repassword ' ));
334+
335+ if (empty ($ token )) {
336+ return Redirect::to ('login ' );
337+ } else if (empty ($ password ) || empty ($ repassword )) {
338+ $ request ->session ()->flash ('errorMsg ' , '密码不能为空 ' );
339+
340+ return Redirect::back ();
341+ } else if (md5 ($ password ) != md5 ($ repassword )) {
342+ $ request ->session ()->flash ('errorMsg ' , '两次输入密码不一致,请重新输入 ' );
343+
344+ return Redirect::back ();
345+ }
346+
347+ // 校验账号
348+ $ verify = Verify::where ('token ' , $ token )->with ('User ' )->first ();
349+ if (empty ($ verify )) {
350+ return Redirect::to ('login ' );
351+ } else if ($ verify ->status == 1 ) {
352+ $ request ->session ()->flash ('errorMsg ' , '该链接已失效 ' );
353+
354+ return Redirect::back ();
355+ } else if (!$ verify ->user ->enable ) {
356+ $ request ->session ()->flash ('errorMsg ' , '账号已被禁用 ' );
357+
358+ return Redirect::back ();
359+ } else if (md5 ($ password ) == $ verify ->user ->password ) {
360+ $ request ->session ()->flash ('errorMsg ' , '新旧密码一样,请重新输入 ' );
361+
362+ return Redirect::back ();
363+ }
364+
365+ // 更新密码
366+ $ ret = User::where ('id ' , $ verify ->user_id )->update (['password ' => md5 ($ password )]);
367+ if (!$ ret ) {
368+ $ request ->session ()->flash ('errorMsg ' , '重设密码失败 ' );
369+
370+ return Redirect::back ();
371+ }
372+
373+ // 更新verify
374+ $ verify ->status = 1 ;
375+ $ verify ->save ();
376+
377+ $ request ->session ()->flash ('successMsg ' , '新密码设置成功,请自行登录 ' );
378+
379+ return Redirect::back ();
380+ } else {
381+ if (empty ($ token )) {
382+ return Redirect::to ('login ' );
383+ }
384+
385+ $ verify = Verify::where ('token ' , $ token )->with ('user ' )->first ();
386+ if (empty ($ verify )) {
387+ return Redirect::to ('login ' );
388+ }
389+
390+ $ view ['verify ' ] = $ verify ;
391+
392+ return Response::view ('user/reset ' , $ view );
393+ }
394+ }
264395}
0 commit comments