├── .env.example ├── .gitattributes ├── .gitignore ├── _ide_helper.php ├── app ├── Blades │ ├── Blade.php │ └── MenuBlade.php ├── Console │ ├── Commands │ │ └── ConserveTarget.php │ └── Kernel.php ├── Exceptions │ ├── Handler.php │ └── ValidatorException.php ├── Http │ ├── Controllers │ │ ├── Admin │ │ │ ├── AuthController.php │ │ │ ├── CategorysController.php │ │ │ ├── FriendshipsController.php │ │ │ ├── IndexController.php │ │ │ ├── MenusController.php │ │ │ ├── NominatesController.php │ │ │ ├── PermissionsController.php │ │ │ ├── ProposalsController.php │ │ │ ├── RolesController.php │ │ │ ├── TagsController.php │ │ │ ├── TargetsController.php │ │ │ ├── TriggersController.php │ │ │ └── UsersController.php │ │ ├── CategorysController.php │ │ ├── Controller.php │ │ ├── IndexController.php │ │ ├── NominatesController.php │ │ ├── ProposalsController.php │ │ ├── Traits │ │ │ └── Helpers.php │ │ └── TriggersController.php │ ├── Kernel.php │ └── Middleware │ │ ├── Authentication.php │ │ ├── EncryptCookies.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── TrimStrings.php │ │ ├── TrustProxies.php │ │ └── VerifyCsrfToken.php ├── Models │ ├── Category.php │ ├── Favorite.php │ ├── Friendship.php │ ├── Menu.php │ ├── Nominate.php │ ├── Proposal.php │ ├── Tag.php │ ├── Target.php │ ├── Traits │ │ └── Helpers.php │ ├── Trigger.php │ └── User.php ├── Observers │ ├── Observer.php │ └── UserObserver.php ├── Providers │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── BroadcastServiceProvider.php │ ├── EventServiceProvider.php │ └── RouteServiceProvider.php └── Services │ └── MenuService.php ├── artisan ├── bootstrap ├── app.php ├── cache │ └── .gitignore └── helpers.php ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── backup.php ├── broadcasting.php ├── cache.php ├── database.php ├── filesystems.php ├── hunt.php ├── image.php ├── mail.php ├── permission.php ├── poems.php ├── queue.php ├── rules.php ├── services.php ├── session.php └── view.php ├── database ├── .gitignore ├── factories │ └── UserFactory.php ├── migrations │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2017_11_05_150426_create_permission_tables.php │ ├── 2017_11_05_150646_create_menus_table.php │ ├── 2017_11_11_162910_create_categories_table.php │ ├── 2017_11_12_023826_create_triggers_table.php │ ├── 2017_11_12_153948_create_friendships_table.php │ ├── 2017_11_12_160543_create_proposals_table.php │ ├── 2017_11_12_204925_create_nominates_table.php │ ├── 2017_11_12_212626_create_tags_table.php │ ├── 2017_11_12_223112_create_targets_table.php │ └── 2017_11_13_204352_create_favorites_table.php └── seeds │ ├── CategoriesTableSeeder.php │ ├── DatabaseSeeder.php │ ├── FriendshipsTableSeeder.php │ ├── MenusTableSeeder.php │ ├── PermissionsTableSeeder.php │ ├── RolesTableSeeder.php │ ├── TagsTableSeeder.php │ ├── TriggersTableSeeder.php │ └── UsersTableSeeder.php ├── package-lock.json ├── package.json ├── phpunit.xml ├── public ├── .htaccess ├── css │ └── app.css ├── favicon.ico ├── fonts │ ├── ODelI1aHBYDBqgeIAH2zlJbPFduIYtoLzwST68uhz_Y.woff2 │ ├── bg.svg │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ ├── fontawesome-webfont.woff2 │ ├── toadOcfmlt9b38dHJxOBGCP2LEk6lMzYsRqr3dHFImA.woff2 │ ├── toadOcfmlt9b38dHJxOBGJkF8H8ye47wsfpWywda8og.woff2 │ ├── toadOcfmlt9b38dHJxOBGMzFoXZ-Kj537nB_-9jJhlA.woff2 │ └── whale.svg ├── images │ ├── bg.svg │ ├── favicon.ico │ ├── slider.jpg │ └── whale.png ├── index.php ├── js │ ├── adminlte.js │ ├── app.js │ ├── bootstrap.js │ ├── iconpicker.js │ ├── jquery.js │ ├── modal.js │ ├── nprogress.js │ ├── pjax.js │ ├── plugins │ │ ├── html5shiv.js │ │ └── respond.js │ ├── script.js │ ├── toast.js │ └── url.js ├── mix-manifest.json ├── robots.txt └── web.config ├── readme.md ├── resources ├── assets │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── ODelI1aHBYDBqgeIAH2zlJbPFduIYtoLzwST68uhz_Y.woff2 │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ ├── fontawesome-webfont.woff2 │ │ ├── toadOcfmlt9b38dHJxOBGCP2LEk6lMzYsRqr3dHFImA.woff2 │ │ ├── toadOcfmlt9b38dHJxOBGJkF8H8ye47wsfpWywda8og.woff2 │ │ └── toadOcfmlt9b38dHJxOBGMzFoXZ-Kj537nB_-9jJhlA.woff2 │ ├── images │ │ ├── bg.svg │ │ └── slider.jpg │ ├── js │ │ ├── app.js │ │ └── bootstrap.js │ └── sass │ │ ├── adminlte.scss │ │ ├── app.scss │ │ ├── bootstrap.scss │ │ ├── font-awesome.scss │ │ ├── iconpicker.scss │ │ ├── modal.scss │ │ ├── nprogress.scss │ │ └── toast.scss ├── lang │ ├── en │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ └── validation.php │ ├── vendor │ │ └── backup │ │ │ ├── ar │ │ │ └── notifications.php │ │ │ ├── da │ │ │ └── notifications.php │ │ │ ├── de │ │ │ └── notifications.php │ │ │ ├── en │ │ │ └── notifications.php │ │ │ ├── es │ │ │ └── notifications.php │ │ │ ├── fr │ │ │ └── notifications.php │ │ │ ├── it │ │ │ └── notifications.php │ │ │ ├── pt-BR │ │ │ └── notifications.php │ │ │ ├── ro │ │ │ └── notifications.php │ │ │ ├── ru │ │ │ └── notifications.php │ │ │ └── uk │ │ │ └── notifications.php │ └── zh-CN │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ └── validation.php └── views │ ├── admin │ ├── auths │ │ └── login.blade.php │ ├── categorys │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ └── index.blade.php │ ├── errors │ │ └── unauthentication.blade.php │ ├── friendships │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ └── index.blade.php │ ├── index │ │ ├── examples.blade.php │ │ └── index.blade.php │ ├── layouts │ │ ├── app.blade.php │ │ ├── basic.blade.php │ │ ├── footer.blade.php │ │ └── menus.blade.php │ ├── menus │ │ ├── _show.blade.php │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ └── index.blade.php │ ├── nominates │ │ └── index.blade.php │ ├── permissions │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ └── index.blade.php │ ├── proposals │ │ └── index.blade.php │ ├── roles │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ └── index.blade.php │ ├── tags │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ └── index.blade.php │ ├── targets │ │ └── index.blade.php │ ├── triggers │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ └── index.blade.php │ └── users │ │ ├── create.blade.php │ │ ├── edit.blade.php │ │ └── index.blade.php │ ├── categorys │ └── index.blade.php │ ├── index │ ├── about.blade.php │ ├── friendships.blade.php │ └── index.blade.php │ ├── layouts │ ├── app.blade.php │ ├── footer.blade.php │ └── tools.blade.php │ ├── nominates │ └── nominate.blade.php │ ├── proposals │ └── proposal.blade.php │ └── tiggers │ └── show.blade.php ├── routes ├── admin.php ├── api.php ├── channels.php ├── console.php └── web.php ├── server.php ├── storage ├── app │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── tests ├── CreatesApplication.php ├── Feature │ └── ExampleTest.php ├── TestCase.php └── Unit │ └── ExampleTest.php └── webpack.mix.js /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=production 3 | APP_KEY= 4 | APP_DEBUG=false 5 | APP_LOG_LEVEL=debug 6 | APP_URL=http://localhost 7 | 8 | DB_CONNECTION=mysql 9 | DB_HOST=192.168.10.10 10 | DB_PORT=3306 11 | DB_DATABASE=homestead 12 | DB_USERNAME=homestead 13 | DB_PASSWORD=secret 14 | 15 | BROADCAST_DRIVER=log 16 | CACHE_DRIVER=file 17 | SESSION_DRIVER=file 18 | QUEUE_DRIVER=sync 19 | 20 | REDIS_HOST=127.0.0.1 21 | REDIS_PASSWORD=null 22 | REDIS_PORT=6379 23 | 24 | MAIL_DRIVER=smtp 25 | MAIL_HOST=smtp.mailtrap.io 26 | MAIL_PORT=2525 27 | MAIL_USERNAME=null 28 | MAIL_PASSWORD=null 29 | MAIL_ENCRYPTION=null 30 | 31 | PUSHER_APcP_ID= 32 | PUSHER_APP_KEY= 33 | PUSHER_APP_SECRET= -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | CHANGELOG.md export-ignore 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /public/storage 4 | /storage/*.key 5 | /vendor 6 | /.idea 7 | /.vagrant 8 | Homestead.json 9 | Homestead.yaml 10 | npm-debug.log 11 | yarn-error.log 12 | .env 13 | -------------------------------------------------------------------------------- /app/Blades/Blade.php: -------------------------------------------------------------------------------- 1 | slug) 16 | ? auth()->user()->can($menu->slug) 17 | : (($menu->childers->count() 18 | ? (boolean) $menu->childers->first(function($childer) { 19 | return auth()->user()->can($childer->slug); 20 | }) 21 | : false))) 22 | : true; 23 | } 24 | ); 25 | } 26 | } 27 | 28 | -------------------------------------------------------------------------------- /app/Console/Commands/ConserveTarget.php: -------------------------------------------------------------------------------- 1 | pull('targets',[]); 41 | 42 | $count = count($targets); 43 | 44 | if ($count) { 45 | \DB::table('targets')->insert($targets); 46 | } 47 | 48 | $this->info("链接跳转记录已保存,共执行{$count}条。"); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('conserve-target')->hourly(); 28 | $schedule->command('backup:clean')->daily()->at('01:00'); 29 | $schedule->command('backup:run')->daily()->at('02:00'); 30 | } 31 | 32 | /** 33 | * Register the commands for the application. 34 | * 35 | * @return void 36 | */ 37 | protected function commands() 38 | { 39 | $this->load(__DIR__ . '/Commands'); 40 | 41 | require base_path('routes/console.php'); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | validator('admin.users.login'); 15 | } catch (ValidatorException $exception) { 16 | return failed($exception->getMessage()); 17 | } 18 | 19 | return auth()->attempt($needs, true) 20 | ? succeed('Welcome back!') 21 | : failed('This password is wrong!'); 22 | } 23 | 24 | public function logout() 25 | { 26 | auth()->logout(); 27 | return succeed(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/IndexController.php: -------------------------------------------------------------------------------- 1 | validator('admin.upload')); 34 | } catch (ValidatorException $exception) { 35 | return failed($exception->getMessage()); 36 | } 37 | 38 | return succeed(['url' => $this->fetch($file)]); 39 | } 40 | 41 | public function clear() 42 | { 43 | cache()->forget('menus'); 44 | return succeed('缓存清除成功。'); 45 | } 46 | 47 | public function examples() 48 | { 49 | return view('admin.index.examples'); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/MenusController.php: -------------------------------------------------------------------------------- 1 | get('keyword'); 20 | $menus = Menu::tops()->search($keyword)->with('childers')->paginate(10); 21 | return view('admin.menus.index', compact('menus','keyword')); 22 | } 23 | 24 | /** 25 | * Show the form for creating a new resource. 26 | * 27 | * @return \Illuminate\Http\Response 28 | */ 29 | public function create() 30 | { 31 | $menus = Menu::tops()->get(); 32 | return view('admin.menus.create', compact('menus')); 33 | } 34 | 35 | /** 36 | * Store a newly created resource in storage. 37 | * 38 | * @param \Illuminate\Http\Request $request 39 | * @return \Illuminate\Http\Response 40 | */ 41 | public function store(Request $request) 42 | { 43 | try { 44 | $needs = $this->validator('admin.menus.store'); 45 | } catch (ValidatorException $exception) { 46 | return failed($exception->getMessage()); 47 | } 48 | Menu::create($needs); 49 | return succeed('新的菜单栏已经添加。'); 50 | } 51 | 52 | /** 53 | * Display the specified resource. 54 | * 55 | * @param int $id 56 | * @return \Illuminate\Http\Response 57 | */ 58 | public function show($id) 59 | { 60 | // 61 | } 62 | 63 | /** 64 | * Show the form for editing the specified resource. 65 | * 66 | * @param int $id 67 | * @return \Illuminate\Http\Response 68 | */ 69 | public function edit(Menu $menu) 70 | { 71 | $menus = Menu::tops()->get(); 72 | return view('admin.menus.edit', compact('menu', 'menus')); 73 | } 74 | 75 | /** 76 | * Update the specified resource in storage. 77 | * 78 | * @param \Illuminate\Http\Request $request 79 | * @param int $id 80 | * @return \Illuminate\Http\Response 81 | */ 82 | public function update(Request $request, Menu $menu) 83 | { 84 | try { 85 | $needs = $this->validator('admin.menus.update'); 86 | } catch (ValidatorException $exception) { 87 | return failed($exception->getMessage()); 88 | } 89 | $menu->update($needs); 90 | return succeed('此菜单栏已经更新。'); 91 | } 92 | 93 | /** 94 | * Remove the specified resource from storage. 95 | * 96 | * @param int $id 97 | * @return \Illuminate\Http\Response 98 | */ 99 | public function destroy(Menu $menu) 100 | { 101 | $menu->childers->each->delete(); 102 | $menu->delete(); 103 | return succeed('删除菜单栏成功!'); 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/NominatesController.php: -------------------------------------------------------------------------------- 1 | delete(); 86 | return succeed('删除推荐信息成功。'); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/ProposalsController.php: -------------------------------------------------------------------------------- 1 | delete(); 86 | return succeed('删除反馈建议成功。'); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/TargetsController.php: -------------------------------------------------------------------------------- 1 | paginate(10); 19 | return view('admin.targets.index',compact('targets')); 20 | } 21 | 22 | /** 23 | * Show the form for creating a new resource. 24 | * 25 | * @return \Illuminate\Http\Response 26 | */ 27 | public function create() 28 | { 29 | // 30 | } 31 | 32 | /** 33 | * Store a newly created resource in storage. 34 | * 35 | * @param \Illuminate\Http\Request $request 36 | * @return \Illuminate\Http\Response 37 | */ 38 | public function store(Request $request) 39 | { 40 | // 41 | } 42 | 43 | /** 44 | * Display the specified resource. 45 | * 46 | * @param int $id 47 | * @return \Illuminate\Http\Response 48 | */ 49 | public function show($id) 50 | { 51 | // 52 | } 53 | 54 | /** 55 | * Show the form for editing the specified resource. 56 | * 57 | * @param int $id 58 | * @return \Illuminate\Http\Response 59 | */ 60 | public function edit($id) 61 | { 62 | // 63 | } 64 | 65 | /** 66 | * Update the specified resource in storage. 67 | * 68 | * @param \Illuminate\Http\Request $request 69 | * @param int $id 70 | * @return \Illuminate\Http\Response 71 | */ 72 | public function update(Request $request, $id) 73 | { 74 | // 75 | } 76 | 77 | /** 78 | * Remove the specified resource from storage. 79 | * 80 | * @param int $id 81 | * @return \Illuminate\Http\Response 82 | */ 83 | public function destroy(Target $target) 84 | { 85 | $target->delete(); 86 | return succeed('删除跳转记录成功。'); 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /app/Http/Controllers/CategorysController.php: -------------------------------------------------------------------------------- 1 | triggers->groupBy('tag_id')->toArray(); 14 | $tags = Tag::whereIn('id', array_keys($triggers))->sort()->get(); 15 | return view('categorys.index', compact('category', 'triggers', 'tags')); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | remember('categorys',10,function(){ 14 | return Category::active()->sort()->withCount('triggers')->get(); 15 | }); 16 | return view('index.index',compact('categorys')); 17 | } 18 | 19 | public function friendships() 20 | { 21 | $friendships = cache()->remember('friend',10,function(){ 22 | return Friendship::active()->get(); 23 | }); 24 | return view('index.friendships',compact('friendships')); 25 | } 26 | 27 | public function about() 28 | { 29 | return view('index.about'); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/Http/Controllers/NominatesController.php: -------------------------------------------------------------------------------- 1 | validator('nominates'); 15 | }catch (ValidatorException $exception) { 16 | return failed($exception->getMessage()); 17 | } 18 | 19 | $needs['agents'] = json_encode(agent(),JSON_UNESCAPED_UNICODE); 20 | 21 | Nominate::create($needs); 22 | 23 | return succeed('感谢你的推荐,祝你幸福。'); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Controllers/ProposalsController.php: -------------------------------------------------------------------------------- 1 | validator('proposals'); 15 | }catch (ValidatorException $exception) { 16 | return failed($exception->getMessage()); 17 | } 18 | 19 | $needs['agents'] = json_encode(agent(),JSON_UNESCAPED_UNICODE); 20 | 21 | Proposal::create($needs); 22 | 23 | return succeed('感谢你的反馈,祝你幸福。'); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /app/Http/Controllers/Traits/Helpers.php: -------------------------------------------------------------------------------- 1 | only(array_keys($rules)); 15 | 16 | $result = \Validator::make($needs, $rules); 17 | 18 | if (!$result->fails()) return $needs; 19 | 20 | throw new ValidatorException($result->errors()->first()); 21 | } 22 | 23 | public function fetch(UploadedFile $file) 24 | { 25 | return \Storage::url($file->store('uploads', 'public')); 26 | } 27 | } -------------------------------------------------------------------------------- /app/Http/Controllers/TriggersController.php: -------------------------------------------------------------------------------- 1 | $trigger->id, 18 | 'agents' => json_encode(agent(), JSON_UNESCAPED_UNICODE), 19 | 'created_at' => Carbon::now(), 20 | 'updated_at' => Carbon::now(), 21 | ]; 22 | 23 | cache()->forever('targets', $targets); 24 | 25 | $trigger->increment('read_count'); 26 | 27 | return redirect($trigger->link); 28 | } 29 | 30 | public function favorite(Trigger $trigger) 31 | { 32 | Favorite::toggle($trigger); 33 | return succeed(); 34 | } 35 | 36 | public function show() 37 | { 38 | $triggers = Trigger::whereIn('id',Favorite::favorite()->pluck('trigger_id'))->get(); 39 | return view('tiggers.show',compact('triggers')); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Http/Kernel.php: -------------------------------------------------------------------------------- 1 | [ 32 | \App\Http\Middleware\EncryptCookies::class, 33 | \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, 34 | \Illuminate\Session\Middleware\StartSession::class, 35 | // \Illuminate\Session\Middleware\AuthenticateSession::class, 36 | \Illuminate\View\Middleware\ShareErrorsFromSession::class, 37 | \App\Http\Middleware\VerifyCsrfToken::class, 38 | \Illuminate\Routing\Middleware\SubstituteBindings::class, 39 | ], 40 | 41 | 'api' => [ 42 | 'throttle:60,1', 43 | 'bindings', 44 | ], 45 | ]; 46 | 47 | /** 48 | * The application's route middleware. 49 | * 50 | * These middleware may be assigned to groups or used individually. 51 | * 52 | * @var array 53 | */ 54 | protected $routeMiddleware = [ 55 | 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 56 | 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 57 | 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 58 | 'can' => \Illuminate\Auth\Middleware\Authorize::class, 59 | 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 60 | 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 61 | 'authentication' => \App\Http\Middleware\Authentication::class, 62 | ]; 63 | } 64 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authentication.php: -------------------------------------------------------------------------------- 1 | check() 19 | ? (!config('app.debug') 20 | ? (auth()->user()->can($request->route()->getName()) 21 | ? $next($request) 22 | : ($request->ajax() 23 | ? failed('无权进行此操作!') 24 | : response()->view('admin.errors.unauthentication'))) 25 | : $next($request)) 26 | : redirect()->route('admin.auth.login'); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | check()) { 21 | return redirect('/home'); 22 | } 23 | 24 | return $next($request); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | 'FORWARDED', 24 | Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR', 25 | Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST', 26 | Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT', 27 | Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO', 28 | ]; 29 | } 30 | -------------------------------------------------------------------------------- /app/Http/Middleware/VerifyCsrfToken.php: -------------------------------------------------------------------------------- 1 | hasMany(Trigger::class); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/Models/Favorite.php: -------------------------------------------------------------------------------- 1 | where('ip',request()->getClientIp()); 17 | } 18 | 19 | public function trigger() 20 | { 21 | return $this->belongsTo(Trigger::class); 22 | } 23 | 24 | public function isFavorite($trigger_id) 25 | { 26 | return $this->where([ 27 | 'ip' => request()->getClientIp(), 28 | 'trigger_id' => $trigger_id, 29 | ])->exists(); 30 | } 31 | 32 | public static function toggle(Trigger $trigger) 33 | { 34 | $needs = [ 35 | 'ip' => request()->getClientIp(), 36 | 'trigger_id' => $trigger->id, 37 | ]; 38 | 39 | $favorite = static::where($needs)->first(); 40 | 41 | return $favorite 42 | ? $favorite->delete() && $trigger->decrement('favorite_count') 43 | : static::create($needs) && $trigger->increment('favorite_count'); 44 | } 45 | 46 | 47 | } 48 | -------------------------------------------------------------------------------- /app/Models/Friendship.php: -------------------------------------------------------------------------------- 1 | where('top_id', $parent); 17 | } 18 | 19 | public function childers() 20 | { 21 | return $this->hasMany(self::class, 'top_id'); 22 | } 23 | 24 | public function top() 25 | { 26 | return $this->belongsTo(self::class); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Models/Nominate.php: -------------------------------------------------------------------------------- 1 | hasMany(Trigger::class); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/Models/Target.php: -------------------------------------------------------------------------------- 1 | belongsTo(Trigger::class); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Models/Traits/Helpers.php: -------------------------------------------------------------------------------- 1 | hommization($date); 28 | } 29 | 30 | public function getUpdatedAtAttribute($date) 31 | { 32 | return $this->hommization($date); 33 | } 34 | 35 | public function scopeSearch($query, $keyword, $attribute = 'name') 36 | { 37 | return $query->where($attribute, 'like', "%{$keyword}%"); 38 | } 39 | 40 | public function scopeActive($query, $active = true) 41 | { 42 | return $query->where('is_active', $active); 43 | } 44 | 45 | public function scopeSort($query, $type = true, $attribute = 'weight') 46 | { 47 | return $query->orderBy($attribute, $type ? 'desc' : 'asc'); 48 | } 49 | } -------------------------------------------------------------------------------- /app/Models/Trigger.php: -------------------------------------------------------------------------------- 1 | where('tag_id', $tag_id) : $query; 17 | } 18 | 19 | public function scopeWhereCategory($query, $category_id = '') 20 | { 21 | return $category_id ? $query->where('category_id', $category_id) : $query; 22 | } 23 | 24 | public function category() 25 | { 26 | return $this->belongsTo(Category::class)->withDefault(); 27 | } 28 | 29 | public function tag() 30 | { 31 | return $this->belongsTo(Tag::class)->withDefault(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /app/Models/User.php: -------------------------------------------------------------------------------- 1 | attributes['password'] = bcrypt($password); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Observers/Observer.php: -------------------------------------------------------------------------------- 1 | api_token = str_random(64); 10 | } 11 | } -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | 'App\Policies\ModelPolicy', 17 | ]; 18 | 19 | /** 20 | * Register any authentication / authorization services. 21 | * 22 | * @return void 23 | */ 24 | public function boot() 25 | { 26 | $this->registerPolicies(); 27 | 28 | // 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 17 | 'App\Listeners\UpdateCache', 18 | ], 19 | ]; 20 | 21 | /** 22 | * Register any events for your application. 23 | * 24 | * @return void 25 | */ 26 | public function boot() 27 | { 28 | parent::boot(); 29 | 30 | // 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/Providers/RouteServiceProvider.php: -------------------------------------------------------------------------------- 1 | mapApiRoutes(); 39 | 40 | $this->mapWebRoutes(); 41 | 42 | $this->mapAdminRoutes(); 43 | 44 | // 45 | } 46 | 47 | /** 48 | * Define the "web" routes for the application. 49 | * 50 | * These routes all receive session state, CSRF protection, etc. 51 | * 52 | * @return void 53 | */ 54 | protected function mapWebRoutes() 55 | { 56 | Route::middleware('web') 57 | ->namespace($this->namespace) 58 | ->group(base_path('routes/web.php')); 59 | } 60 | 61 | /** 62 | * Define the "web" routes for the application. 63 | * 64 | * These routes all receive session state, CSRF protection, etc. 65 | * 66 | * @return void 67 | */ 68 | protected function mapAdminRoutes() 69 | { 70 | Route::prefix('admin') 71 | ->middleware('web') 72 | ->namespace($this->namespace . '\Admin') 73 | ->group(base_path('routes/admin.php')); 74 | } 75 | 76 | /** 77 | * Define the "api" routes for the application. 78 | * 79 | * These routes are typically stateless. 80 | * 81 | * @return void 82 | */ 83 | protected function mapApiRoutes() 84 | { 85 | Route::prefix('api') 86 | ->middleware('api') 87 | ->namespace($this->namespace) 88 | ->group(base_path('routes/api.php')); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /app/Services/MenuService.php: -------------------------------------------------------------------------------- 1 | menus = Cache::remember('menus', 120, function() { 15 | return Menu::tops()->with('childers')->orderBy('weight', 'desc')->get(); 16 | }); 17 | } 18 | } -------------------------------------------------------------------------------- /artisan: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | make(Illuminate\Contracts\Console\Kernel::class); 34 | 35 | $status = $kernel->handle( 36 | $input = new Symfony\Component\Console\Input\ArgvInput, 37 | new Symfony\Component\Console\Output\ConsoleOutput 38 | ); 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Shutdown The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once Artisan has finished running, we will fire off the shutdown events 46 | | so that any final work may be done by the application before we shut 47 | | down the process. This is the last thing to happen to the request. 48 | | 49 | */ 50 | 51 | $kernel->terminate($input, $status); 52 | 53 | exit($status); 54 | -------------------------------------------------------------------------------- /bootstrap/app.php: -------------------------------------------------------------------------------- 1 | singleton( 32 | Illuminate\Contracts\Http\Kernel::class, 33 | App\Http\Kernel::class 34 | ); 35 | 36 | $app->singleton( 37 | Illuminate\Contracts\Console\Kernel::class, 38 | App\Console\Kernel::class 39 | ); 40 | 41 | $app->singleton( 42 | Illuminate\Contracts\Debug\ExceptionHandler::class, 43 | App\Exceptions\Handler::class 44 | ); 45 | 46 | /* 47 | |-------------------------------------------------------------------------- 48 | | Return The Application 49 | |-------------------------------------------------------------------------- 50 | | 51 | | This script returns the application instance. The instance is given to 52 | | the calling script so we can separate the building of the instances 53 | | from the actual running of the application and sending responses. 54 | | 55 | */ 56 | 57 | return $app; 58 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /bootstrap/helpers.php: -------------------------------------------------------------------------------- 1 | json(['status' => $status, is_string($respond) ? 'message' : 'data' => $respond]); 13 | } 14 | 15 | /** 16 | * 自定义 Ajax 成功返回 17 | * 18 | * @param $respond 19 | * @return \Illuminate\Http\JsonResponse 20 | */ 21 | function succeed($respond = 'Request success!') 22 | { 23 | return respond(true, $respond); 24 | } 25 | 26 | /** 27 | * 自定义 Ajax 失败返回 28 | * 29 | * @param $respond 30 | * @return \Illuminate\Http\JsonResponse 31 | */ 32 | function failed($respond = 'Request failed!') 33 | { 34 | return respond(false, $respond); 35 | } 36 | 37 | /** 38 | * 人性化显示时间戳 39 | * 40 | * @param $date 41 | * @return string|static 42 | */ 43 | function hommization($date) 44 | { 45 | return \Carbon\Carbon::now() > \Carbon\Carbon::parse($date)->addDays(10) 46 | ? \Carbon\Carbon::parse($date) 47 | : \Carbon\Carbon::parse($date)->diffForHumans(); 48 | } 49 | 50 | /** 51 | * 随机返回设定的诗句 52 | * 53 | * @return mixed 54 | */ 55 | function poem() 56 | { 57 | return array_random(config('poems')); 58 | } 59 | 60 | /** 61 | * 检查路由是否存在,依检查结果返回 link 或 slug 62 | * 63 | * @param $slug 64 | * @return string 65 | */ 66 | function linker($slug = null) 67 | { 68 | return \Route::has($slug) ? route($slug) : $slug; 69 | } 70 | 71 | /** 72 | * 拉取用户信息 73 | * 74 | * @param bool $device 75 | * @return array|\Illuminate\Foundation\Application|mixed 76 | */ 77 | function agent($device = true) 78 | { 79 | $agent = app(\Jenssegers\Agent\Agent::class); 80 | 81 | return $device ? [ 82 | 'ip' => request()->getClientIps(), 83 | '设备' => $agent->device(), 84 | '浏览器' => $agent->browser(), 85 | '系统版本' => $agent->platform(), 86 | '机器人' => $agent->isRobot() ? '是' : '否', 87 | '语言' => $agent->languages(), 88 | '系统版本' => $agent->version($agent->platform()), 89 | '浏览器版本' => $agent->version($agent->browser()), 90 | ] : $agent; 91 | } 92 | 93 | /** 94 | * 判断是否收藏了此链接 95 | * 96 | * @param $trigger_id 97 | * @return mixed 98 | */ 99 | function favorite($trigger_id) 100 | { 101 | return app(\App\Models\Favorite::class)->isFavorite($trigger_id); 102 | } 103 | 104 | /** 105 | * 读取自定义配置 106 | * 107 | * @param $config_name 108 | */ 109 | function hunt($config_name) 110 | { 111 | return config("hunt.{$config_name}"); 112 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "laravel/laravel", 3 | "description": "The Laravel Framework.", 4 | "keywords": ["framework", "laravel"], 5 | "license": "MIT", 6 | "type": "project", 7 | "require": { 8 | "php": ">=7.0.0", 9 | "fideloper/proxy": "~3.3", 10 | "jenssegers/agent": "^2.6", 11 | "laravel/framework": "5.5.*", 12 | "laravel/tinker": "~1.0", 13 | "predis/predis": "^1.1", 14 | "spatie/laravel-backup": "^5.1", 15 | "spatie/laravel-permission": "^2.7", 16 | "spatie/laravel-pjax": "^1.3" 17 | }, 18 | "require-dev": { 19 | "barryvdh/laravel-ide-helper": "^2.4", 20 | "filp/whoops": "~2.0", 21 | "fzaninotto/faker": "~1.4", 22 | "mockery/mockery": "0.9.*", 23 | "phpunit/phpunit": "~6.0" 24 | }, 25 | "autoload": { 26 | "classmap": [ 27 | "database/seeds", 28 | "database/factories" 29 | ], 30 | "psr-4": { 31 | "App\\": "app/" 32 | } 33 | }, 34 | "autoload-dev": { 35 | "psr-4": { 36 | "Tests\\": "tests/" 37 | } 38 | }, 39 | "extra": { 40 | "laravel": { 41 | "dont-discover": [ 42 | ] 43 | } 44 | }, 45 | "scripts": { 46 | "post-root-package-install": [ 47 | "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" 48 | ], 49 | "post-create-project-cmd": [ 50 | "@php artisan key:generate" 51 | ], 52 | "post-autoload-dump": [ 53 | "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", 54 | "@php artisan package:discover" 55 | ] 56 | }, 57 | "config": { 58 | "preferred-install": "dist", 59 | "sort-packages": true, 60 | "optimize-autoloader": true 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /config/broadcasting.php: -------------------------------------------------------------------------------- 1 | env('BROADCAST_DRIVER', 'null'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Broadcast Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the broadcast connections that will be used 26 | | to broadcast events to other systems or over websockets. Samples of 27 | | each available type of connection are provided inside this array. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'pusher' => [ 34 | 'driver' => 'pusher', 35 | 'key' => env('PUSHER_APP_KEY'), 36 | 'secret' => env('PUSHER_APP_SECRET'), 37 | 'app_id' => env('PUSHER_APP_ID'), 38 | 'options' => [ 39 | // 40 | ], 41 | ], 42 | 43 | 'redis' => [ 44 | 'driver' => 'redis', 45 | 'connection' => 'default', 46 | ], 47 | 48 | 'log' => [ 49 | 'driver' => 'log', 50 | ], 51 | 52 | 'null' => [ 53 | 'driver' => 'null', 54 | ], 55 | 56 | ], 57 | 58 | ]; 59 | -------------------------------------------------------------------------------- /config/cache.php: -------------------------------------------------------------------------------- 1 | env('CACHE_DRIVER', 'file'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Cache Stores 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may define all of the cache "stores" for your application as 26 | | well as their drivers. You may even define multiple stores for the 27 | | same cache driver to group types of items stored in your caches. 28 | | 29 | */ 30 | 31 | 'stores' => [ 32 | 33 | 'apc' => [ 34 | 'driver' => 'apc', 35 | ], 36 | 37 | 'array' => [ 38 | 'driver' => 'array', 39 | ], 40 | 41 | 'database' => [ 42 | 'driver' => 'database', 43 | 'table' => 'cache', 44 | 'connection' => null, 45 | ], 46 | 47 | 'file' => [ 48 | 'driver' => 'file', 49 | 'path' => storage_path('framework/cache/data'), 50 | ], 51 | 52 | 'memcached' => [ 53 | 'driver' => 'memcached', 54 | 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), 55 | 'sasl' => [ 56 | env('MEMCACHED_USERNAME'), 57 | env('MEMCACHED_PASSWORD'), 58 | ], 59 | 'options' => [ 60 | // Memcached::OPT_CONNECT_TIMEOUT => 2000, 61 | ], 62 | 'servers' => [ 63 | [ 64 | 'host' => env('MEMCACHED_HOST', '127.0.0.1'), 65 | 'port' => env('MEMCACHED_PORT', 11211), 66 | 'weight' => 100, 67 | ], 68 | ], 69 | ], 70 | 71 | 'redis' => [ 72 | 'driver' => 'redis', 73 | 'connection' => 'default', 74 | ], 75 | 76 | ], 77 | 78 | /* 79 | |-------------------------------------------------------------------------- 80 | | Cache Key Prefix 81 | |-------------------------------------------------------------------------- 82 | | 83 | | When utilizing a RAM based store such as APC or Memcached, there might 84 | | be other applications utilizing the same cache. So, we'll specify a 85 | | value to get prefixed to all our keys so we can avoid collisions. 86 | | 87 | */ 88 | 89 | 'prefix' => 'laravel', 90 | 91 | ]; 92 | -------------------------------------------------------------------------------- /config/filesystems.php: -------------------------------------------------------------------------------- 1 | env('FILESYSTEM_DRIVER', 'local'), 17 | 18 | /* 19 | |-------------------------------------------------------------------------- 20 | | Default Cloud Filesystem Disk 21 | |-------------------------------------------------------------------------- 22 | | 23 | | Many applications store files both locally and in the cloud. For this 24 | | reason, you may specify a default "cloud" driver here. This driver 25 | | will be bound as the Cloud disk implementation in the container. 26 | | 27 | */ 28 | 29 | 'cloud' => env('FILESYSTEM_CLOUD', 's3'), 30 | 31 | /* 32 | |-------------------------------------------------------------------------- 33 | | Filesystem Disks 34 | |-------------------------------------------------------------------------- 35 | | 36 | | Here you may configure as many filesystem "disks" as you wish, and you 37 | | may even configure multiple disks of the same driver. Defaults have 38 | | been setup for each driver as an example of the required options. 39 | | 40 | | Supported Drivers: "local", "ftp", "s3", "rackspace" 41 | | 42 | */ 43 | 44 | 'disks' => [ 45 | 46 | 'local' => [ 47 | 'driver' => 'local', 48 | 'root' => storage_path('app'), 49 | ], 50 | 51 | 'public' => [ 52 | 'driver' => 'local', 53 | 'root' => storage_path('app/public'), 54 | 'url' => env('APP_URL').'/storage', 55 | 'visibility' => 'public', 56 | ], 57 | 58 | 's3' => [ 59 | 'driver' => 's3', 60 | 'key' => env('AWS_KEY'), 61 | 'secret' => env('AWS_SECRET'), 62 | 'region' => env('AWS_REGION'), 63 | 'bucket' => env('AWS_BUCKET'), 64 | ], 65 | 66 | ], 67 | 68 | ]; 69 | -------------------------------------------------------------------------------- /config/hunt.php: -------------------------------------------------------------------------------- 1 | '', 5 | 6 | 'keywords' => 'Web 开发工程师师网站导航, PHP 资源导航, 前端资源导航, CSS导航,HTML导航, DIV+CSS, Homestead, Vuejs, React, Web 开发, 设计导航, 运营导航, 极客导航 hunt.seaony.cn', 7 | 8 | 'description' => '糖果盒子是一个专注 Web 开发工程师的分类导航,专注分享优质 Web开发资源站点,是 Web 开发工程师的书签导航,设计教程、开发规范、颜色搭配、灵感创意、前端框架、数据库管理、开发者工具、互联网新品推荐、运营数据分析、自媒体和工具利器好用的分类导航大全', 9 | ]; -------------------------------------------------------------------------------- /config/image.php: -------------------------------------------------------------------------------- 1 | 'imagick' 19 | 20 | ]; 21 | -------------------------------------------------------------------------------- /config/permission.php: -------------------------------------------------------------------------------- 1 | [ 6 | 7 | /* 8 | * When using the "HasRoles" trait from this package, we need to know which 9 | * Eloquent model should be used to retrieve your permissions. Of course, it 10 | * is often just the "Permission" model but you may use whatever you like. 11 | * 12 | * The model you want to use as a Permission model needs to implement the 13 | * `Spatie\Permission\Contracts\Permission` contract. 14 | */ 15 | 16 | 'permission' => Spatie\Permission\Models\Permission::class, 17 | 18 | /* 19 | * When using the "HasRoles" trait from this package, we need to know which 20 | * Eloquent model should be used to retrieve your roles. Of course, it 21 | * is often just the "Role" model but you may use whatever you like. 22 | * 23 | * The model you want to use as a Role model needs to implement the 24 | * `Spatie\Permission\Contracts\Role` contract. 25 | */ 26 | 27 | 'role' => Spatie\Permission\Models\Role::class, 28 | 29 | ], 30 | 31 | 'table_names' => [ 32 | 33 | /* 34 | * When using the "HasRoles" trait from this package, we need to know which 35 | * table should be used to retrieve your roles. We have chosen a basic 36 | * default value but you may easily change it to any table you like. 37 | */ 38 | 39 | 'roles' => 'roles', 40 | 41 | /* 42 | * When using the "HasRoles" trait from this package, we need to know which 43 | * table should be used to retrieve your permissions. We have chosen a basic 44 | * default value but you may easily change it to any table you like. 45 | */ 46 | 47 | 'permissions' => 'permissions', 48 | 49 | /* 50 | * When using the "HasRoles" trait from this package, we need to know which 51 | * table should be used to retrieve your models permissions. We have chosen a 52 | * basic default value but you may easily change it to any table you like. 53 | */ 54 | 55 | 'model_has_permissions' => 'model_has_permissions', 56 | 57 | /* 58 | * When using the "HasRoles" trait from this package, we need to know which 59 | * table should be used to retrieve your models roles. We have chosen a 60 | * basic default value but you may easily change it to any table you like. 61 | */ 62 | 63 | 'model_has_roles' => 'model_has_roles', 64 | 65 | /* 66 | * When using the "HasRoles" trait from this package, we need to know which 67 | * table should be used to retrieve your roles permissions. We have chosen a 68 | * basic default value but you may easily change it to any table you like. 69 | */ 70 | 71 | 'role_has_permissions' => 'role_has_permissions', 72 | ], 73 | 74 | /* 75 | * By default all permissions will be cached for 24 hours unless a permission or 76 | * role is updated. Then the cache will be flushed immediately. 77 | */ 78 | 79 | 'cache_expiration_time' => 60 * 24, 80 | ]; 81 | -------------------------------------------------------------------------------- /config/poems.php: -------------------------------------------------------------------------------- 1 | env('QUEUE_DRIVER', 'sync'), 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Queue Connections 23 | |-------------------------------------------------------------------------- 24 | | 25 | | Here you may configure the connection information for each server that 26 | | is used by your application. A default configuration has been added 27 | | for each back-end shipped with Laravel. You are free to add more. 28 | | 29 | */ 30 | 31 | 'connections' => [ 32 | 33 | 'sync' => [ 34 | 'driver' => 'sync', 35 | ], 36 | 37 | 'database' => [ 38 | 'driver' => 'database', 39 | 'table' => 'jobs', 40 | 'queue' => 'default', 41 | 'retry_after' => 90, 42 | ], 43 | 44 | 'beanstalkd' => [ 45 | 'driver' => 'beanstalkd', 46 | 'host' => 'localhost', 47 | 'queue' => 'default', 48 | 'retry_after' => 90, 49 | ], 50 | 51 | 'sqs' => [ 52 | 'driver' => 'sqs', 53 | 'key' => 'your-public-key', 54 | 'secret' => 'your-secret-key', 55 | 'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id', 56 | 'queue' => 'your-queue-name', 57 | 'region' => 'us-east-1', 58 | ], 59 | 60 | 'redis' => [ 61 | 'driver' => 'redis', 62 | 'connection' => 'default', 63 | 'queue' => 'default', 64 | 'retry_after' => 90, 65 | ], 66 | 67 | ], 68 | 69 | /* 70 | |-------------------------------------------------------------------------- 71 | | Failed Queue Jobs 72 | |-------------------------------------------------------------------------- 73 | | 74 | | These options configure the behavior of failed queue job logging so you 75 | | can control which database and table are used to store the jobs that 76 | | have failed. You may change them to any database / table you wish. 77 | | 78 | */ 79 | 80 | 'failed' => [ 81 | 'database' => env('DB_CONNECTION', 'mysql'), 82 | 'table' => 'failed_jobs', 83 | ], 84 | 85 | ]; 86 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | ], 21 | 22 | 'ses' => [ 23 | 'key' => env('SES_KEY'), 24 | 'secret' => env('SES_SECRET'), 25 | 'region' => 'us-east-1', 26 | ], 27 | 28 | 'sparkpost' => [ 29 | 'secret' => env('SPARKPOST_SECRET'), 30 | ], 31 | 32 | 'stripe' => [ 33 | 'model' => App\Models\User::class, 34 | 'key' => env('STRIPE_KEY'), 35 | 'secret' => env('STRIPE_SECRET'), 36 | ], 37 | 38 | ]; 39 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => realpath(storage_path('framework/views')), 32 | 33 | ]; 34 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | define(App\User::class, function (Faker $faker) { 17 | static $password; 18 | 19 | return [ 20 | 'name' => $faker->name, 21 | 'email' => $faker->unique()->safeEmail, 22 | 'password' => $password ?: $password = bcrypt('secret'), 23 | 'remember_token' => str_random(10), 24 | ]; 25 | }); 26 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('email')->unique(); 20 | $table->string('password'); 21 | $table->string('api_token', 64)->unique(); 22 | $table->rememberToken(); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('users'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2017_11_05_150646_create_menus_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name')->comment('名称'); 19 | $table->string('describe')->nullable()->comment('简介'); 20 | $table->string('icon')->nullable()->comment('显示图标'); 21 | $table->string('slug')->comment('路由名称'); 22 | $table->integer('weight')->default(0)->comment('显示排序'); 23 | $table->integer('top_id')->references('id')->on('menus')->onDelete('cascade')->default(0)->comment('父级ID,默认为零'); 24 | $table->timestamps(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('menus'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /database/migrations/2017_11_11_162910_create_categories_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('cover'); 20 | $table->string('describe'); 21 | $table->integer('weight')->default(0); 22 | $table->boolean('is_active')->default(true); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('categories'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2017_11_12_023826_create_triggers_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('cover'); 20 | $table->string('describe'); 21 | $table->string('link'); 22 | $table->string('form')->nullable(); 23 | $table->integer('read_count')->default(0); 24 | $table->integer('favorite_count')->default(0); 25 | $table->boolean('is_active')->default(true); 26 | $table->integer('category_id')->references('id')->on('categories')->onDelete('cascade'); 27 | $table->integer('tag_id')->references('id')->on('tags')->onDelete('cascade'); 28 | $table->timestamps(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('triggers'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /database/migrations/2017_11_12_153948_create_friendships_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('cover'); 20 | $table->string('describe'); 21 | $table->string('link'); 22 | $table->boolean('is_active')->default(true); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('friendships'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2017_11_12_160543_create_proposals_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('email'); 20 | $table->string('content'); 21 | $table->json('agents'); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('proposals'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/migrations/2017_11_12_204925_create_nominates_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('link'); 20 | $table->string('describe'); 21 | $table->json('agents'); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('nominates'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/migrations/2017_11_12_212626_create_tags_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('name'); 19 | $table->string('icon'); 20 | $table->string('describe'); 21 | $table->integer('weight')->default(0); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('tags'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/migrations/2017_11_12_223112_create_targets_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->integer('trigger_id')->references('id')->on('triggers')->onDelete('cascade'); 19 | $table->json('agents'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('targets'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/migrations/2017_11_13_204352_create_favorites_table.php: -------------------------------------------------------------------------------- 1 | increments('id'); 18 | $table->string('ip'); 19 | $table->integer('trigger_id')->references('id')->on('triggers')->onDelete('cascade'); 20 | $table->timestamps(); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | * 27 | * @return void 28 | */ 29 | public function down() 30 | { 31 | Schema::dropIfExists('favorites'); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/seeds/CategoriesTableSeeder.php: -------------------------------------------------------------------------------- 1 | 'Laravel', 18 | 'cover' => 'http://owst2hgsv.bkt.clouddn.com/u=3979453105,1717514132&fm=27&gp=0.jpg', 19 | 'describe' => '为 Web 艺术家创造的 PHP 框架', 20 | 'created_at' => $timestamp, 21 | 'updated_at' => $timestamp, 22 | ]; 23 | 24 | $categorys = []; 25 | for ($i = 0; $i < 10; $i ++) { 26 | $categorys[] = $category; 27 | } 28 | 29 | DB::table('categories')->insert($categorys); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/seeds/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | call(PermissionsTableSeeder::class); 15 | $this->call(RolesTableSeeder::class); 16 | $this->call(MenusTableSeeder::class); 17 | $this->call(UsersTableSeeder::class); 18 | $this->call(CategoriesTableSeeder::class); 19 | $this->call(TagsTableSeeder::class); 20 | $this->call(TriggersTableSeeder::class); 21 | $this->call(FriendshipsTableSeeder::class); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /database/seeds/FriendshipsTableSeeder.php: -------------------------------------------------------------------------------- 1 | '流浪小猫', 16 | 'cover' => 'http://chuangzaoshi.com/assets/images/F/xcatliu.png', 17 | 'describe' => 'A cat who writes code', 18 | 'link' => 'https://www.baidu.com' 19 | ]; 20 | 21 | $frs = []; 22 | for ($i = 0;$i<10;$i++) { 23 | $frs[] = $data; 24 | } 25 | 26 | DB::table('friendships')->insert($frs); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /database/seeds/PermissionsTableSeeder.php: -------------------------------------------------------------------------------- 1 | $value) { 20 | $data[] = [ 21 | 'name' => $index, 22 | 'alias' => $index, 23 | 'describe' => $index, 24 | 'guard_name' => 'web', 25 | 'created_at' => $timestamp, 26 | 'updated_at' => $timestamp, 27 | ]; 28 | } 29 | 30 | DB::table('permissions')->insert($data); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/seeds/RolesTableSeeder.php: -------------------------------------------------------------------------------- 1 | 'Admin', 'name' => 'admin', 'describe' => '后台管理员'] 18 | )->syncPermissions( 19 | Permission::pluck('name')->toArray() 20 | ); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /database/seeds/TagsTableSeeder.php: -------------------------------------------------------------------------------- 1 | array_random($names), 25 | 'icon' => array_random($icons), 26 | 'describe' => '长相思兮长相忆,短相思兮无穷极,早知如此绊人心,何若当初无相识。', 27 | 'created_at' => $timestamp, 28 | 'updated_at' => $timestamp, 29 | ]; 30 | } 31 | 32 | DB::table('tags')->insert($tags); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /database/seeds/TriggersTableSeeder.php: -------------------------------------------------------------------------------- 1 | toArray(); 15 | 16 | $tags = \App\Models\Tag::pluck('id')->toArray(); 17 | 18 | $covers = [ 19 | 'http://chuangzaoshi.com/assets/images/D/google.png', 20 | 'http://chuangzaoshi.com/assets/images/D/foodiesfeed.png', 21 | 'http://chuangzaoshi.com/assets/images/D/fubiz.png', 22 | 'http://chuangzaoshi.com/assets/images/D/uigradients.png', 23 | 'http://chuangzaoshi.com/assets/images/D/vimeo.png', 24 | 'http://chuangzaoshi.com/assets/images/D/panda.png', 25 | 'http://chuangzaoshi.com/assets/images/D/bestfolios.png', 26 | 'http://chuangzaoshi.com/assets/images/D/cssdesignawards.png', 27 | 'http://chuangzaoshi.com/assets/images/D/theinspirationgrid.png', 28 | ]; 29 | 30 | $datas = []; 31 | 32 | $timestamp = \Carbon\Carbon::now(); 33 | 34 | for ($i = 0; $i < 1000; $i ++) { 35 | $datas[] = [ 36 | 'name' => 'Material 设计', 37 | 'link' => 'http://www.baidu.com', 38 | 'cover' => array_random($covers), 39 | 'describe' => 'MaterialDesign 设计官方指南', 40 | 'form' => rand(0,10) ==10 ? 'Seaony' : '', 41 | 'category_id' => array_random($categorys), 42 | 'tag_id' => array_random($tags), 43 | 'created_at' => $timestamp, 44 | 'updated_at' => $timestamp, 45 | ]; 46 | } 47 | 48 | DB::table('triggers')->insert($datas); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /database/seeds/UsersTableSeeder.php: -------------------------------------------------------------------------------- 1 | 'admin', 18 | 'email' => 'admin@admin.com', 19 | 'password' => '123456', 20 | ])->syncRoles(Role::pluck('name')->toArray()); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "dev": "npm run development", 5 | "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 6 | "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", 7 | "watch-poll": "npm run watch -- --watch-poll", 8 | "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", 9 | "prod": "npm run production", 10 | "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" 11 | }, 12 | "devDependencies": { 13 | "axios": "^0.16.2", 14 | "cross-env": "^5.0.1", 15 | "laravel-mix": "^1.0", 16 | "lodash": "^4.17.4" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | ./tests/Feature 14 | 15 | 16 | 17 | ./tests/Unit 18 | 19 | 20 | 21 | 22 | ./app 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Redirect Trailing Slashes If Not A Folder... 9 | RewriteCond %{REQUEST_FILENAME} !-d 10 | RewriteCond %{REQUEST_URI} (.+)/$ 11 | RewriteRule ^ %1 [L,R=301] 12 | 13 | # Handle Front Controller... 14 | RewriteCond %{REQUEST_FILENAME} !-d 15 | RewriteCond %{REQUEST_FILENAME} !-f 16 | RewriteRule ^ index.php [L] 17 | 18 | # Handle Authorization Header 19 | RewriteCond %{HTTP:Authorization} . 20 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 21 | 22 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts/ODelI1aHBYDBqgeIAH2zlJbPFduIYtoLzwST68uhz_Y.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/fonts/ODelI1aHBYDBqgeIAH2zlJbPFduIYtoLzwST68uhz_Y.woff2 -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /public/fonts/toadOcfmlt9b38dHJxOBGCP2LEk6lMzYsRqr3dHFImA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/fonts/toadOcfmlt9b38dHJxOBGCP2LEk6lMzYsRqr3dHFImA.woff2 -------------------------------------------------------------------------------- /public/fonts/toadOcfmlt9b38dHJxOBGJkF8H8ye47wsfpWywda8og.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/fonts/toadOcfmlt9b38dHJxOBGJkF8H8ye47wsfpWywda8og.woff2 -------------------------------------------------------------------------------- /public/fonts/toadOcfmlt9b38dHJxOBGMzFoXZ-Kj537nB_-9jJhlA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/fonts/toadOcfmlt9b38dHJxOBGMzFoXZ-Kj537nB_-9jJhlA.woff2 -------------------------------------------------------------------------------- /public/fonts/whale.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/images/favicon.ico -------------------------------------------------------------------------------- /public/images/slider.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/images/slider.jpg -------------------------------------------------------------------------------- /public/images/whale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/public/images/whale.png -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | define('LARAVEL_START', microtime(true)); 11 | 12 | /* 13 | |-------------------------------------------------------------------------- 14 | | Register The Auto Loader 15 | |-------------------------------------------------------------------------- 16 | | 17 | | Composer provides a convenient, automatically generated class loader for 18 | | our application. We just need to utilize it! We'll simply require it 19 | | into the script here so that we don't have to worry about manual 20 | | loading any of our classes later on. It feels great to relax. 21 | | 22 | */ 23 | 24 | require __DIR__.'/../vendor/autoload.php'; 25 | 26 | /* 27 | |-------------------------------------------------------------------------- 28 | | Turn On The Lights 29 | |-------------------------------------------------------------------------- 30 | | 31 | | We need to illuminate PHP development, so let us turn on the lights. 32 | | This bootstraps the framework and gets it ready for use, then it 33 | | will load up this application so that we can run it and send 34 | | the responses back to the browser and delight our users. 35 | | 36 | */ 37 | 38 | $app = require_once __DIR__.'/../bootstrap/app.php'; 39 | 40 | /* 41 | |-------------------------------------------------------------------------- 42 | | Run The Application 43 | |-------------------------------------------------------------------------- 44 | | 45 | | Once we have the application, we can handle the incoming request 46 | | through the kernel, and send the associated response back to 47 | | the client's browser allowing them to enjoy the creative 48 | | and wonderful application we have prepared for them. 49 | | 50 | */ 51 | 52 | $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 53 | 54 | $response = $kernel->handle( 55 | $request = Illuminate\Http\Request::capture() 56 | ); 57 | 58 | $response->send(); 59 | 60 | $kernel->terminate($request, $response); 61 | -------------------------------------------------------------------------------- /public/js/plugins/html5shiv.js: -------------------------------------------------------------------------------- 1 | !function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); -------------------------------------------------------------------------------- /public/js/url.js: -------------------------------------------------------------------------------- 1 | "use strict";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol?"symbol":typeof e};!function(e){if("object"===("undefined"==typeof exports?"undefined":_typeof(exports))&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Url=e()}}(function(){return function e(t,n,o){function r(a,u){if(!n[a]){if(!t[a]){var c="function"==typeof require&&require;if(!u&&c)return c(a,!0);if(i)return i(a,!0);var f=new Error("Cannot find module '"+a+"'");throw f.code="MODULE_NOT_FOUND",f}var s=n[a]={exports:{}};t[a][0].call(s.exports,function(e){var n=t[a][1][e];return r(n?n:e)},s,s.exports,e,t,n,o)}return n[a].exports}for(var i="function"==typeof require&&require,a=0;an?(n=o[r].length,i=!0):i=decodeURIComponent(o[r].slice(n+1)),t[decodeURIComponent(o[r].slice(0,n))]=i;return t},stringify:function(e){if(!e||e.constructor!==Object)throw new Error("Query object should be an object.");var t="";return Object.keys(e).forEach(function(n){var o=e[n];t+=n,o!==!0&&(t+="="+encodeURIComponent(e[n])),t+="&"}),t=t.replace(/\&$/g,"")},updateSearchParam:function(e,t,o,r){if("object"!==("undefined"==typeof e?"undefined":_typeof(e))){var i=this.parseQuery();if(void 0===t)delete i[e];else{if(i[e]===t)return n;i[e]=t}var a="?"+this.stringify(i);return this._updateAll(window.location.pathname+a+location.hash,o,r),n}for(var u in e)e.hasOwnProperty(u)&&this.updateSearchParam(u,e[u],o,r)},getLocation:function(){return window.location.pathname+window.location.search+window.location.hash},hash:function(e,t){return void 0===e?location.hash.substring(1):(t||(setTimeout(function(){n._isHash=!1},0),n._isHash=!0),location.hash=e)},_updateAll:function(e,t,o){return window.history[t?"pushState":"replaceState"](null,"",e),o&&n.triggerPopStateCb({}),e},pathname:function(e,t,n){return void 0===e?location.pathname:this._updateAll(e+window.location.search+window.location.hash,t,n)},triggerPopStateCb:function(e){this._isHash||this._onPopStateCbs.forEach(function(t){t(e)})},onPopState:function(e){this._onPopStateCbs.push(e)},removeHash:function(e,t){this._updateAll(window.location.pathname+window.location.search,e||!1,t||!1)},removeQuery:function(e,t){this._updateAll(window.location.pathname+window.location.hash,e||!1,t||!1)},version:"2.5.0"}},{}]},{},[1])(1)}); -------------------------------------------------------------------------------- /public/mix-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "/css/app.css": "/css/app.css", 3 | "/js/app.js": "/js/app.js" 4 | } -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/web.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 |

糖果盒子 - WEB 开发者的书签导航

2 |
3 |

4 |
5 | 6 | --- 7 | 8 |

9 |
10 |

11 |
12 | 13 | ## 项目概述 14 | 15 | 糖果盒子是采用 Laravel 5.5 + Pjax 开发的站点导航应用,专注分享优质 Web 开发资源站点,希望成为 Web 开发人员最喜爱的的书签导航。 16 | 17 | ## 环境要求 18 | 19 | * Nginx 1.8+ 20 | * PHP 7.1+ 21 | * Mysql 5.7+ 22 | * Redis 3.0+ 23 | 24 | ## 部署/安装 25 | 26 | 本项目代码使用 PHP 框架 [Laravel 5.5](https://d.laravel-china.org/docs/5.5/) 开发,本地开发环境使用 [Laravel Homestead](https://d.laravel-china.org/docs/5.5/homestead)。 27 | 28 | 下文将在假定读者已经安装好了 Homestead 的情况下进行说明。如果您还未安装 Homestead,可以参照 [Homestead 安装与设置](https://laravel-china.org/docs/5.5/homestead#installation-and-setup) 进行安装配置。 29 | 30 | ### 安装 31 | 32 | #### 1. 克隆代码 33 | 34 | > git clone https://github.com/Seaony/Hunt.git 35 | 36 | #### 2. 安装依赖 37 | 38 | > composer install 39 | 40 | #### 3. 生成配置文件 41 | 42 | ``` 43 | cp .env.example .env 44 | ``` 45 | 46 | 你可以根据情况修改 `.env` 文件里的内容,如数据库连接、缓存、项目名称设置等。 47 | 48 | #### 4. 生成秘钥 49 | 50 | ```shell 51 | php artisan key:generate 52 | ``` 53 | 54 | #### 5. 生成数据表及生成测试数据 55 | 56 | 在网站根目录下运行以下命令 57 | 58 | ```shell 59 | $ php artisan migrate --seed 60 | ``` 61 | 62 | 初始的用户角色权限以及前台测试数据已使用数据迁移生成。 63 | 64 | ### 前端框架安装 65 | 66 | #### 安装 node.js 与 npm 67 | 68 | 在官网 [https://nodejs.org/en/](https://nodejs.org/en/) 下载安装,最新版本已附带 `npm`。 69 | 70 | #### 安装 Laravel Mix 71 | 72 | ```shell 73 | npm install 74 | ``` 75 | 76 | #### 编译前端内容 77 | 78 | ```shell 79 | // 运行所有 Mix 任务... 80 | npm run dev 81 | 82 | // 运行所有 Mix 任务并缩小输出.. 83 | npm run production 84 | ``` 85 | 86 | #### 监控修改并自动编译 87 | 88 | ```shell 89 | npm run watch 90 | 91 | // 在某些环境中,当文件更改时,Webpack 不会更新。如果系统出现这种情况,请考虑使用 watch-poll 命令: 92 | npm run watch-poll 93 | ``` 94 | 95 | ### 链接入口 96 | 97 | * 首页地址:http://yourdomain.app/ 98 | * 管理后台:http://yourdomain.app/admin 99 | 100 | 管理员账号密码如下: 101 | 102 | ``` 103 | username: admin@admin.com 104 | password: 123456 105 | ``` 106 | 107 | 至此安装已完成~ 108 | 109 | 110 | ## 扩展包使用情况 111 | 112 | | 扩展包 | 描述 | 应用场景 | 113 | | --- | --- | --- | 114 | | [predis/predis](https://github.com/nrk/predis.git) | Redis 官方首推的 PHP 客户端开发包 | 缓存驱动 Redis 基础扩展包 | 115 | | [spatie/laravel-permission](https://github.com/spatie/laravel-permission) | 角色权限管理 | 角色和权限控制 | 116 | | [jenssegers/agent](https://github.com/jenssegers/agent) | 用户代理解析器 | 获取用户的IP和系统信息 | 117 | | [spatie/laravel-backup](https://github.com/spatie/laravel-backup) | 数据库以及文件备份 | 备份数据库 | 118 | | [spatie/laravel-pjax](https://github.com/spatie/laravel-pjax) | Pjax 的服务端支持 | Pjax 的服务端支持 | 119 | 120 | ## 自定义 Artisan 命令 121 | 122 | | 命令行名字 | 说明 | Cron | 代码调用 | 123 | | --- | --- | --- | --- | 124 | | `conserve-target` | 将用户的跳转记录从缓存中储存至数据库 | 一小时运行一次 | 无 | 125 | 126 | ## 定时任务 127 | 128 | | 名称 | 说明 | 调用时间 | 129 | | --- | --- | --- | 130 | | backup:clean | 清理过期备份 | 每天 01:00 | 131 | | backup:run | 执行数据库以及文件备份 | 每天 02:00 | 132 | | conserve-target | 将用户的跳转记录从缓存中储存至数据库 | 一小时运行一次 | 133 | 134 | ## 作者 135 | 136 | [Seaony](https://github.com/Seaony) 137 | 138 | ## License 139 | 140 | MIT 141 | -------------------------------------------------------------------------------- /resources/assets/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/resources/assets/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /resources/assets/fonts/ODelI1aHBYDBqgeIAH2zlJbPFduIYtoLzwST68uhz_Y.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/resources/assets/fonts/ODelI1aHBYDBqgeIAH2zlJbPFduIYtoLzwST68uhz_Y.woff2 -------------------------------------------------------------------------------- /resources/assets/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/resources/assets/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /resources/assets/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/resources/assets/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /resources/assets/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/resources/assets/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /resources/assets/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/resources/assets/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /resources/assets/fonts/toadOcfmlt9b38dHJxOBGCP2LEk6lMzYsRqr3dHFImA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/resources/assets/fonts/toadOcfmlt9b38dHJxOBGCP2LEk6lMzYsRqr3dHFImA.woff2 -------------------------------------------------------------------------------- /resources/assets/fonts/toadOcfmlt9b38dHJxOBGJkF8H8ye47wsfpWywda8og.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/resources/assets/fonts/toadOcfmlt9b38dHJxOBGJkF8H8ye47wsfpWywda8og.woff2 -------------------------------------------------------------------------------- /resources/assets/fonts/toadOcfmlt9b38dHJxOBGMzFoXZ-Kj537nB_-9jJhlA.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/resources/assets/fonts/toadOcfmlt9b38dHJxOBGMzFoXZ-Kj537nB_-9jJhlA.woff2 -------------------------------------------------------------------------------- /resources/assets/images/slider.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seaony/Hunt/ec0967ea51cfc2ca7fce26baa9235b5da65d32cf/resources/assets/images/slider.jpg -------------------------------------------------------------------------------- /resources/assets/js/app.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * First, we will load all of this project's Javascript utilities and other 4 | * dependencies. Then, we will be ready to develop a robust and powerful 5 | * application frontend using useful Laravel and JavaScript libraries. 6 | */ 7 | 8 | require('./bootstrap'); 9 | -------------------------------------------------------------------------------- /resources/assets/js/bootstrap.js: -------------------------------------------------------------------------------- 1 | 2 | window._ = require('lodash'); 3 | 4 | /** 5 | * We'll load jQuery and the Bootstrap jQuery plugin which provides support 6 | * for JavaScript based Bootstrap features such as modals and tabs. This 7 | * code may be modified to fit the specific needs of your application. 8 | */ 9 | 10 | try { 11 | window.$ = window.jQuery = require('jquery'); 12 | 13 | require('bootstrap-sass'); 14 | } catch (e) {} 15 | 16 | /** 17 | * We'll load the axios HTTP library which allows us to easily issue requests 18 | * to our Laravel back-end. This library automatically handles sending the 19 | * CSRF token as a header based on the value of the "XSRF" token cookie. 20 | */ 21 | 22 | window.axios = require('axios'); 23 | 24 | window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest'; 25 | 26 | /** 27 | * Next we will register the CSRF Token as a common header with Axios so that 28 | * all outgoing HTTP requests automatically have it attached. This is just 29 | * a simple convenience so we don't have to attach every token manually. 30 | */ 31 | 32 | let token = document.head.querySelector('meta[name="csrf-token"]'); 33 | 34 | if (token) { 35 | window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content; 36 | } else { 37 | console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token'); 38 | } 39 | 40 | /** 41 | * Echo exposes an expressive API for subscribing to channels and listening 42 | * for events that are broadcast by Laravel. Echo and event broadcasting 43 | * allows your team to easily build robust real-time web applications. 44 | */ 45 | 46 | // import Echo from 'laravel-echo' 47 | 48 | // window.Pusher = require('pusher-js'); 49 | 50 | // window.Echo = new Echo({ 51 | // broadcaster: 'pusher', 52 | // key: 'your-pusher-key' 53 | // }); 54 | -------------------------------------------------------------------------------- /resources/assets/sass/nprogress.scss: -------------------------------------------------------------------------------- 1 | /* Make clicks pass-through */ 2 | 3 | #nprogress { 4 | pointer-events: none; 5 | .bar { 6 | background: #00bcd4; 7 | position: fixed; 8 | z-index: 1031; 9 | top: 0; 10 | left: 0; 11 | width: 100%; 12 | height: 2px; 13 | } 14 | .peg { 15 | display: block; 16 | position: absolute; 17 | right: 0px; 18 | width: 100px; 19 | height: 100%; 20 | box-shadow: 0 0 10px #00bcd4, 0 0 5px #00bcd4; 21 | opacity: 1.0; 22 | -webkit-transform: rotate(3deg) translate(0px, -4px); 23 | -ms-transform: rotate(3deg) translate(0px, -4px); 24 | transform: rotate(3deg) translate(0px, -4px); 25 | } 26 | .spinner { 27 | display: block; 28 | position: fixed; 29 | z-index: 1031; 30 | top: 15px; 31 | right: 15px; 32 | } 33 | .spinner-icon { 34 | width: 18px; 35 | height: 18px; 36 | box-sizing: border-box; 37 | border: solid 2px transparent; 38 | border-top-color: #00bcd4; 39 | border-left-color: #00bcd4; 40 | border-radius: 50%; 41 | -webkit-animation: nprogress-spinner 400ms linear infinite; 42 | animation: nprogress-spinner 400ms linear infinite; 43 | } 44 | } 45 | 46 | /* Fancy blur effect */ 47 | 48 | /* Remove these to get rid of the spinner */ 49 | 50 | .nprogress-custom-parent { 51 | overflow: hidden; 52 | position: relative; 53 | #nprogress { 54 | .spinner, .bar { 55 | position: absolute; 56 | } 57 | } 58 | } 59 | 60 | @-webkit-keyframes nprogress-spinner { 61 | 0% { 62 | -webkit-transform: rotate(0deg); 63 | } 64 | 65 | 100% { 66 | -webkit-transform: rotate(360deg); 67 | } 68 | } 69 | 70 | 71 | @keyframes nprogress-spinner { 72 | 0% { 73 | transform: rotate(0deg); 74 | } 75 | 76 | 100% { 77 | transform: rotate(360deg); 78 | } 79 | } -------------------------------------------------------------------------------- /resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Passwords must be at least six characters and match the confirmation.', 17 | 'reset' => 'Your password has been reset!', 18 | 'sent' => 'We have e-mailed your password reset link!', 19 | 'token' => 'This password reset token is invalid.', 20 | 'user' => "We can't find a user with that e-mail address.", 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/lang/vendor/backup/ar/notifications.php: -------------------------------------------------------------------------------- 1 | 'رسالة استثناء: :message', 5 | 'exception_trace' => 'تتبع الإستثناء: :trace', 6 | 'exception_message_title' => 'رسالة استثناء', 7 | 'exception_trace_title' => 'تتبع الإستثناء', 8 | 9 | 'backup_failed_subject' => 'أخفق النسخ الاحتياطي لل :application_name', 10 | 'backup_failed_body' => 'مهم: حدث خطأ أثناء النسخ الاحتياطي :application_name', 11 | 12 | 'backup_successful_subject' => 'نسخ احتياطي جديد ناجح ل :application_name', 13 | 'backup_successful_subject_title' => 'نجاح النسخ الاحتياطي الجديد!', 14 | 'backup_successful_body' => 'أخبار عظيمة، نسخة احتياطية جديدة ل :application_name تم إنشاؤها بنجاح على القرص المسمى :disk_name.', 15 | 16 | 'cleanup_failed_subject' => 'فشل تنظيف النسخ الاحتياطي للتطبيق :application_name .', 17 | 'cleanup_failed_body' => 'حدث خطأ أثناء تنظيف النسخ الاحتياطية ل :application_name', 18 | 19 | 'cleanup_successful_subject' => 'تنظيف النسخ الاحتياطية ل :application_name تمت بنجاح', 20 | 'cleanup_successful_subject_title' => 'تنظيف النسخ الاحتياطية تم بنجاح!', 21 | 'cleanup_successful_body' => 'تنظيف النسخ الاحتياطية ل :application_name على القرص المسمى :disk_name تم بنجاح.', 22 | 23 | 'healthy_backup_found_subject' => 'النسخ الاحتياطية ل :application_name على القرص :disk_name صحية', 24 | 'healthy_backup_found_subject_title' => 'النسخ الاحتياطية ل :application_name صحية', 25 | 'healthy_backup_found_body' => 'تعتبر النسخ الاحتياطية ل :application_name صحية. عمل جيد!', 26 | 27 | 'unhealthy_backup_found_subject' => 'مهم: النسخ الاحتياطية ل :application_name غير صحية', 28 | 'unhealthy_backup_found_subject_title' => 'مهم: النسخ الاحتياطية ل :application_name غير صحية. :problem', 29 | 'unhealthy_backup_found_body' => 'النسخ الاحتياطية ل :application_name على القرص :disk_name غير صحية.', 30 | 'unhealthy_backup_found_not_reachable' => 'لا يمكن الوصول إلى وجهة النسخ الاحتياطي. :error', 31 | 'unhealthy_backup_found_empty' => 'لا توجد نسخ احتياطية لهذا التطبيق على الإطلاق.', 32 | 'unhealthy_backup_found_old' => 'تم إنشاء أحدث النسخ الاحتياطية في :date وتعتبر قديمة جدا.', 33 | 'unhealthy_backup_found_unknown' => 'عذرا، لا يمكن تحديد سبب دقيق.', 34 | 'unhealthy_backup_found_full' => 'النسخ الاحتياطية تستخدم الكثير من التخزين. الاستخدام الحالي هو :disk_usage وهو أعلى من الحد المسموح به من :disk_limit.', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/vendor/backup/da/notifications.php: -------------------------------------------------------------------------------- 1 | 'Fejlbesked: :message', 5 | 'exception_trace' => 'Fejl trace: :trace', 6 | 'exception_message_title' => 'Fejlbesked', 7 | 'exception_trace_title' => 'Fejl trace', 8 | 9 | 'backup_failed_subject' => 'Backup af :application_name fejlede', 10 | 'backup_failed_body' => 'Vigtigt: Der skete en fejl under backup af :application_name', 11 | 12 | 'backup_successful_subject' => 'Ny backup af :application_name oprettet', 13 | 'backup_successful_subject_title' => 'Ny backup!', 14 | 'backup_successful_body' => 'Gode nyheder - der blev oprettet en ny backup af :application_name på disken :disk_name.', 15 | 16 | 'cleanup_failed_subject' => 'Oprydning af backups for :application_name fejlede.', 17 | 'cleanup_failed_body' => 'Der skete en fejl under oprydning af backups for :application_name', 18 | 19 | 'cleanup_successful_subject' => 'Oprydning af backups for :application_name gennemført', 20 | 'cleanup_successful_subject_title' => 'Backup oprydning gennemført!', 21 | 'cleanup_successful_body' => 'Oprydningen af backups for :application_name på disken :disk_name er gennemført.', 22 | 23 | 'healthy_backup_found_subject' => 'Alle backups for :application_name på disken :disk_name er OK', 24 | 'healthy_backup_found_subject_title' => 'Alle backups for :application_name er OK', 25 | 'healthy_backup_found_body' => 'Alle backups for :application_name er ok. Godt gået!', 26 | 27 | 'unhealthy_backup_found_subject' => 'Vigtigt: Backups for :application_name fejlbehæftede', 28 | 'unhealthy_backup_found_subject_title' => 'Vigtigt: Backups for :application_name er fejlbehæftede. :problem', 29 | 'unhealthy_backup_found_body' => 'Backups for :application_name på disken :disk_name er fejlbehæftede.', 30 | 'unhealthy_backup_found_not_reachable' => 'Backup destinationen kunne ikke findes. :error', 31 | 'unhealthy_backup_found_empty' => 'Denne applikation har ingen backups overhovedet.', 32 | 'unhealthy_backup_found_old' => 'Den seneste backup fra :date er for gammel.', 33 | 'unhealthy_backup_found_unknown' => 'Beklager, en præcis årsag kunne ikke findes.', 34 | 'unhealthy_backup_found_full' => 'Backups bruger for meget plads. Nuværende disk forbrug er :disk_usage, hvilket er mere end den tilladte grænse på :disk_limit.', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/vendor/backup/de/notifications.php: -------------------------------------------------------------------------------- 1 | 'Fehlermeldung: :message', 5 | 'exception_trace' => 'Fehlerverfolgung: :trace', 6 | 'exception_message_title' => 'Fehlermeldung', 7 | 'exception_trace_title' => 'Fehlerverfolgung', 8 | 9 | 'backup_failed_subject' => 'Backup von :application_name konnte nicht erstellt werden', 10 | 'backup_failed_body' => 'Wichtig: Beim Backup von :application_name ist ein Fehler aufgetreten', 11 | 12 | 'backup_successful_subject' => 'Erfolgreiches neues Backup von :application_name', 13 | 'backup_successful_subject_title' => 'Erfolgreiches neues Backup!', 14 | 'backup_successful_body' => 'Gute Nachrichten, ein neues Backup von :application_name wurde erfolgreich erstellt und in :disk_name gepeichert.', 15 | 16 | 'cleanup_failed_subject' => 'Aufräumen der Backups von :application_name schlug fehl.', 17 | 'cleanup_failed_body' => 'Beim aufräumen der Backups von :application_name ist ein Fehler aufgetreten', 18 | 19 | 'cleanup_successful_subject' => 'Aufräumen der Backups von :application_name backups erfolgreich', 20 | 'cleanup_successful_subject_title' => 'Aufräumen der Backups erfolgreich!', 21 | 'cleanup_successful_body' => 'Aufräumen der Backups von :application_name in :disk_name war erfolgreich.', 22 | 23 | 'healthy_backup_found_subject' => 'Die Backups von :application_name in :disk_name sind gesund', 24 | 'healthy_backup_found_subject_title' => 'Die Backups von :application_name sind Gesund', 25 | 'healthy_backup_found_body' => 'Die Backups von :application_name wurden als gesund eingestuft. Gute Arbeit!', 26 | 27 | 'unhealthy_backup_found_subject' => 'Wichtig: Die Backups für :application_name sind nicht gesund', 28 | 'unhealthy_backup_found_subject_title' => 'Wichtig: Die Backups für :application_name sind ungesund. :problem', 29 | 'unhealthy_backup_found_body' => 'Die Backups für :application_name in :disk_name sind ungesund.', 30 | 'unhealthy_backup_found_not_reachable' => 'Das Backup Ziel konnte nicht erreicht werden. :error', 31 | 'unhealthy_backup_found_empty' => 'Es gibt für die Anwendung noch gar keine Backups.', 32 | 'unhealthy_backup_found_old' => 'Das letzte Backup am :date ist zu lange her.', 33 | 'unhealthy_backup_found_unknown' => 'Sorry, ein genauer Grund konnte nicht gefunden werden.', 34 | 'unhealthy_backup_found_full' => 'Die Backups verbrauchen zu viel Platz. Aktuell wird :disk_usage belegt, dass ist höher als das erlaubte Limit von :disk_limit.', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/vendor/backup/en/notifications.php: -------------------------------------------------------------------------------- 1 | 'Exception message: :message', 5 | 'exception_trace' => 'Exception trace: :trace', 6 | 'exception_message_title' => 'Exception message', 7 | 'exception_trace_title' => 'Exception trace', 8 | 9 | 'backup_failed_subject' => 'Failed back up of :application_name', 10 | 'backup_failed_body' => 'Important: An error occurred while backing up :application_name', 11 | 12 | 'backup_successful_subject' => 'Successful new backup of :application_name', 13 | 'backup_successful_subject_title' => 'Successful new backup!', 14 | 'backup_successful_body' => 'Great news, a new backup of :application_name was successfully created on the disk named :disk_name.', 15 | 16 | 'cleanup_failed_subject' => 'Cleaning up the backups of :application_name failed.', 17 | 'cleanup_failed_body' => 'An error occurred while cleaning up the backups of :application_name', 18 | 19 | 'cleanup_successful_subject' => 'Clean up of :application_name backups successful', 20 | 'cleanup_successful_subject_title' => 'Clean up of backups successful!', 21 | 'cleanup_successful_body' => 'The clean up of the :application_name backups on the disk named :disk_name was successful.', 22 | 23 | 'healthy_backup_found_subject' => 'The backups for :application_name on disk :disk_name are healthy', 24 | 'healthy_backup_found_subject_title' => 'The backups for :application_name are healthy', 25 | 'healthy_backup_found_body' => 'The backups for :application_name are considered healthy. Good job!', 26 | 27 | 'unhealthy_backup_found_subject' => 'Important: The backups for :application_name are unhealthy', 28 | 'unhealthy_backup_found_subject_title' => 'Important: The backups for :application_name are unhealthy. :problem', 29 | 'unhealthy_backup_found_body' => 'The backups for :application_name on disk :disk_name are unhealthy.', 30 | 'unhealthy_backup_found_not_reachable' => 'The backup destination cannot be reached. :error', 31 | 'unhealthy_backup_found_empty' => 'There are no backups of this application at all.', 32 | 'unhealthy_backup_found_old' => 'The latest backup made on :date is considered too old.', 33 | 'unhealthy_backup_found_unknown' => 'Sorry, an exact reason cannot be determined.', 34 | 'unhealthy_backup_found_full' => 'The backups are using too much storage. Current usage is :disk_usage which is higher than the allowed limit of :disk_limit.', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/vendor/backup/es/notifications.php: -------------------------------------------------------------------------------- 1 | 'Mensaje de la excepción: :message', 5 | 'exception_trace' => 'Traza de la excepción: :trace', 6 | 'exception_message_title' => 'Mensaje de la excepción', 7 | 'exception_trace_title' => 'Traza de la excepción', 8 | 9 | 'backup_failed_subject' => 'Copia de seguridad de :application_name fallida', 10 | 'backup_failed_body' => 'Importante: Ocurrió un error al realizar la copia de seguridad de :application_name', 11 | 12 | 'backup_successful_subject' => 'Se completó con éxito la copia de seguridad de :application_name', 13 | 'backup_successful_subject_title' => '¡Nueva copia de seguridad creada con éxito!', 14 | 'backup_successful_body' => 'Buenas noticias, una nueva copia de seguridad de :application_name fue creada con éxito en el disco llamado :disk_name.', 15 | 16 | 'cleanup_failed_subject' => 'La limpieza de copias de seguridad de :application_name falló.', 17 | 'cleanup_failed_body' => 'Ocurrió un error mientras se realizaba la limpieza de copias de seguridad de :application_name', 18 | 19 | 'cleanup_successful_subject' => 'La limpieza de copias de seguridad de :application_name se completó con éxito', 20 | 'cleanup_successful_subject_title' => '!Limpieza de copias de seguridad completada con éxito!', 21 | 'cleanup_successful_body' => 'La limpieza de copias de seguridad de :application_name en el disco llamado :disk_name se completo con éxito.', 22 | 23 | 'healthy_backup_found_subject' => 'Las copias de seguridad de :application_name en el disco :disk_name están en buen estado', 24 | 'healthy_backup_found_subject_title' => 'Las copias de seguridad de :application_name están en buen estado', 25 | 'healthy_backup_found_body' => 'Las copias de seguridad de :application_name se consideran en buen estado. ¡Buen trabajo!', 26 | 27 | 'unhealthy_backup_found_subject' => 'Importante: Las copias de seguridad de :application_name están en mal estado', 28 | 'unhealthy_backup_found_subject_title' => 'Importante: Las copias de seguridad de :application_name están en mal estado. :problem', 29 | 'unhealthy_backup_found_body' => 'Las copias de seguridad de :application_name en el disco :disk_name están en mal estado.', 30 | 'unhealthy_backup_found_not_reachable' => 'No se puede acceder al destino de la copia de seguridad. :error', 31 | 'unhealthy_backup_found_empty' => 'No existe ninguna copia de seguridad de esta aplicación.', 32 | 'unhealthy_backup_found_old' => 'La última copia de seguriad hecha en :date es demasiado antigua.', 33 | 'unhealthy_backup_found_unknown' => 'Lo siento, no es posible determinar la razón exacta.', 34 | 'unhealthy_backup_found_full' => 'Las copias de seguridad están ocupando demasiado espacio. El espacio utilizado actualmente es :disk_usage el cual es mayor que el límite permitido de :disk_limit.', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/vendor/backup/fr/notifications.php: -------------------------------------------------------------------------------- 1 | 'Message de l\'exception: :message', 5 | 'exception_trace' => 'Trace de l\'exception: :trace', 6 | 'exception_message_title' => 'Message de l\'exception', 7 | 'exception_trace_title' => 'Trace de l\'exception', 8 | 9 | 'backup_failed_subject' => 'Échec de la sauvegarde de :application_name', 10 | 'backup_failed_body' => 'Important : Une erreur est survenue lors de la sauvegarde de :application_name', 11 | 12 | 'backup_successful_subject' => 'Succès de la sauvegarde de :application_name', 13 | 'backup_successful_subject_title' => 'Sauvegarde créée avec succès !', 14 | 'backup_successful_body' => 'Bonne nouvelle, une nouvelle sauvegarde de :application_name a été créé avec succès sur le disque nommé :disk_name.', 15 | 16 | 'cleanup_failed_subject' => 'Le nettoyage des sauvegardes de :application_name a echoué.', 17 | 'cleanup_failed_body' => 'Une erreur est survenue lors du nettoyage des sauvegardes de :application_name', 18 | 19 | 'cleanup_successful_subject' => 'Succès du nettoyage des sauvegardes de :application_name', 20 | 'cleanup_successful_subject_title' => 'Sauvegardes nettoyées avec succès !', 21 | 'cleanup_successful_body' => 'Le nettoyage des sauvegardes de :application_name sur le disque nommé :disk_name a été effectué avec succès.', 22 | 23 | 'healthy_backup_found_subject' => 'Les sauvegardes pour :application_name sur le disque :disk_name sont saines.', 24 | 'healthy_backup_found_subject_title' => 'Les sauvegardes pour :application_name sont saines', 25 | 'healthy_backup_found_body' => 'Les sauvegardes pour :application_name sont considérées saines. Bon travail !', 26 | 27 | 'unhealthy_backup_found_subject' => 'Important : Les sauvegardes pour :application_name sont corrompues', 28 | 'unhealthy_backup_found_subject_title' => 'Important : Les sauvegardes pour :application_name sont corrompues. :problem', 29 | 'unhealthy_backup_found_body' => 'Les sauvegardes pour :application_name sur le disque :disk_name sont corrompues.', 30 | 'unhealthy_backup_found_not_reachable' => 'La destination de la sauvegarde n\'est pas accessible. :error', 31 | 'unhealthy_backup_found_empty' => 'Il n\'y a aucune sauvegarde pour cette application.', 32 | 'unhealthy_backup_found_old' => 'La dernière sauvegarde du :date est considérée trop vieille', 33 | 'unhealthy_backup_found_unknown' => 'Désolé, une raison exacte ne peut être déterminée', 34 | 'unhealthy_backup_found_full' => 'Les sauvegardes utilisent trop de place. L\'utilisation actuelle est de :disk_usage alors que la limite allouée est de :disk_limit.', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/vendor/backup/it/notifications.php: -------------------------------------------------------------------------------- 1 | 'Messaggio dell\'eccezione: :message', 5 | 'exception_trace' => 'Traccia dell\'eccezione: :trace', 6 | 'exception_message_title' => 'Messaggio dell\'eccezione', 7 | 'exception_trace_title' => 'Traccia dell\'eccezione', 8 | 9 | 'backup_failed_subject' => 'Fallito il backup di :application_name', 10 | 'backup_failed_body' => 'Importante: Si è verificato un errore durante il backup di :application_name', 11 | 12 | 'backup_successful_subject' => 'Creato nuovo backup di :application_name', 13 | 'backup_successful_subject_title' => 'Nuovo backup creato!', 14 | 'backup_successful_body' => 'Grande notizia, un nuovo backup di :application_name è stato creato con successo sul disco :disk_name.', 15 | 16 | 'cleanup_failed_subject' => 'Pulizia dei backup di :application_name fallita.', 17 | 'cleanup_failed_body' => 'Si è verificato un errore durante la pulizia dei backup di :application_name', 18 | 19 | 'cleanup_successful_subject' => 'Pulizia dei backup di :application_name avvenuta con successo', 20 | 'cleanup_successful_subject_title' => 'Pulizia dei backup avvenuta con successo!', 21 | 'cleanup_successful_body' => 'La pulizia dei backup di :application_name sul disco :disk_name è avvenuta con successo.', 22 | 23 | 'healthy_backup_found_subject' => 'I backup per :application_name sul disco :disk_name sono sani', 24 | 'healthy_backup_found_subject_title' => 'I backup per :application_name sono sani', 25 | 'healthy_backup_found_body' => 'I backup per :application_name sono considerati sani. Bel Lavoro!', 26 | 27 | 'unhealthy_backup_found_subject' => 'Importante: i backup per :application_name sono corrotti', 28 | 'unhealthy_backup_found_subject_title' => 'Importante: i backup per :application_name sono corrotti. :problem', 29 | 'unhealthy_backup_found_body' => 'I backup per :application_name sul disco :disk_name sono corrotti.', 30 | 'unhealthy_backup_found_not_reachable' => 'Impossibile raggiungere la destinazione di backup. :error', 31 | 'unhealthy_backup_found_empty' => 'Non esiste alcun backup di questa applicazione.', 32 | 'unhealthy_backup_found_old' => 'L\'ultimo backup fatto il :date è considerato troppo vecchio.', 33 | 'unhealthy_backup_found_unknown' => 'Spiacenti, non è possibile determinare una ragione esatta.', 34 | 'unhealthy_backup_found_full' => 'I backup utilizzano troppa memoria. L\'utilizzo corrente è :disk_usage che è superiore al limite consentito di :disk_limit.', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/vendor/backup/pt-BR/notifications.php: -------------------------------------------------------------------------------- 1 | 'Exception message: :message', 5 | 'exception_trace' => 'Exception trace: :trace', 6 | 'exception_message_title' => 'Exception message', 7 | 'exception_trace_title' => 'Exception trace', 8 | 9 | 'backup_failed_subject' => 'Falha no backup da aplicação :application_name', 10 | 'backup_failed_body' => 'Importante: Ocorreu um erro ao fazer o backup da aplicação :application_name', 11 | 12 | 'backup_successful_subject' => 'Backup realizado com sucesso: :application_name', 13 | 'backup_successful_subject_title' => 'Backup Realizado com sucesso!', 14 | 'backup_successful_body' => 'Boas notícias, um novo backup da aplicação :application_name foi criado no disco :disk_name.', 15 | 16 | 'cleanup_failed_subject' => 'Falha na limpeza dos backups da aplicação :application_name.', 17 | 'cleanup_failed_body' => 'Um erro ocorreu ao fazer a limpeza dos backups da aplicação :application_name', 18 | 19 | 'cleanup_successful_subject' => 'Limpeza dos backups da aplicação :application_name concluída!', 20 | 'cleanup_successful_subject_title' => 'Limpeza dos backups concluída!', 21 | 'cleanup_successful_body' => 'A limpeza dos backups da aplicação :application_name no disco :disk_name foi concluída.', 22 | 23 | 'healthy_backup_found_subject' => 'Os backups da aplicação :application_name no disco :disk_name estão em dia', 24 | 'healthy_backup_found_subject_title' => 'Os backups da aplicação :application_name estão em dia', 25 | 'healthy_backup_found_body' => 'Os backups da aplicação :application_name estão em dia. Bom trabalho!', 26 | 27 | 'unhealthy_backup_found_subject' => 'Importante: Os backups da aplicação :application_name não estão em dia', 28 | 'unhealthy_backup_found_subject_title' => 'Importante: Os backups da aplicação :application_name não estão em dia. :problem', 29 | 'unhealthy_backup_found_body' => 'Os backups da aplicação :application_name no disco :disk_name não estão em dia.', 30 | 'unhealthy_backup_found_not_reachable' => 'O destino dos backups não pode ser alcançado. :error', 31 | 'unhealthy_backup_found_empty' => 'Não existem backups para essa aplicação.', 32 | 'unhealthy_backup_found_old' => 'O último backup realizado em :date é considerado muito antigo.', 33 | 'unhealthy_backup_found_unknown' => 'Desculpe, a exata razão não pode ser encontrada.', 34 | 'unhealthy_backup_found_full' => 'Os backups estão usando muito espaço de armazenamento. A utilização atual é de :disk_usage, o que é maior que o limite permitido de :disk_limit.', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/vendor/backup/ro/notifications.php: -------------------------------------------------------------------------------- 1 | 'Cu excepția mesajului: :message', 5 | 'exception_trace' => 'Urmă excepţie: :trace', 6 | 'exception_message_title' => 'Mesaj de excepție', 7 | 'exception_trace_title' => 'Urmă excepţie', 8 | 9 | 'backup_failed_subject' => 'Nu s-a putut face copie de rezervă pentru :application_name', 10 | 'backup_failed_body' => 'Important: A apărut o eroare în timpul generării copiei de rezervă pentru :application_name', 11 | 12 | 'backup_successful_subject' => 'Copie de rezervă efectuată cu succes pentru :application_name', 13 | 'backup_successful_subject_title' => 'O nouă copie de rezervă a fost efectuată cu succes!', 14 | 'backup_successful_body' => 'Vești bune, o nouă copie de rezervă pentru :application_name a fost creată cu succes pe discul cu numele :disk_name.', 15 | 16 | 'cleanup_failed_subject' => 'Curățarea copiilor de rezervă pentru :application_name nu a reușit.', 17 | 'cleanup_failed_body' => 'A apărut o eroare în timpul curățirii copiilor de rezervă pentru :application_name', 18 | 19 | 'cleanup_successful_subject' => 'Curățarea copiilor de rezervă pentru :application_name a fost făcută cu succes', 20 | 'cleanup_successful_subject_title' => 'Curățarea copiilor de rezervă a fost făcută cu succes!', 21 | 'cleanup_successful_body' => 'Curățarea copiilor de rezervă pentru :application_name de pe discul cu numele :disk_name a fost făcută cu succes.', 22 | 23 | 'healthy_backup_found_subject' => 'Copiile de rezervă pentru :application_name de pe discul :disk_name sunt în regulă', 24 | 'healthy_backup_found_subject_title' => 'Copiile de rezervă pentru :application_name sunt în regulă', 25 | 'healthy_backup_found_body' => 'Copiile de rezervă pentru :application_name sunt considerate în regulă. Bună treabă!', 26 | 27 | 'unhealthy_backup_found_subject' => 'Important: Copiile de rezervă pentru :application_name nu sunt în regulă', 28 | 'unhealthy_backup_found_subject_title' => 'Important: Copiile de rezervă pentru :application_name nu sunt în regulă. :problem', 29 | 'unhealthy_backup_found_body' => 'Copiile de rezervă pentru :application_name de pe discul :disk_name nu sunt în regulă.', 30 | 'unhealthy_backup_found_not_reachable' => 'Nu se poate ajunge la destinația copiilor de rezervă. :error', 31 | 'unhealthy_backup_found_empty' => 'Nu există copii de rezervă ale acestei aplicații.', 32 | 'unhealthy_backup_found_old' => 'Cea mai recentă copie de rezervă făcută la :date este considerată prea veche.', 33 | 'unhealthy_backup_found_unknown' => 'Ne pare rău, un motiv exact nu poate fi determinat.', 34 | 'unhealthy_backup_found_full' => 'Copiile de rezervă folosesc prea mult spațiu de stocare. Utilizarea curentă este de :disk_usage care este mai mare decât limita permisă de :disk_limit.', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/vendor/backup/ru/notifications.php: -------------------------------------------------------------------------------- 1 | 'Сообщение об ошибке: :message', 5 | 'exception_trace' => 'Сведения об ошибке: :trace', 6 | 'exception_message_title' => 'Сообщение об ошибке', 7 | 'exception_trace_title' => 'Сведения об ошибке', 8 | 9 | 'backup_failed_subject' => 'Не удалось сделать резервную копию :application_name', 10 | 'backup_failed_body' => 'Внимание: Произошла ошибка во время резервного копирования :application_name', 11 | 12 | 'backup_successful_subject' => 'Успешно создана новая резервная копия :application_name', 13 | 'backup_successful_subject_title' => 'Успешно создана новая резервная копия!', 14 | 'backup_successful_body' => 'Отличная новость, новая резервная копия :application_name успешно создана и сохранена на диск :disk_name.', 15 | 16 | 'cleanup_failed_subject' => 'Не удалось очистить резервные копии :application_name', 17 | 'cleanup_failed_body' => 'Произошла ошибка при очистке резервных копий :application_name', 18 | 19 | 'cleanup_successful_subject' => 'Очистка от резервных копий :application_name прошла успешно', 20 | 'cleanup_successful_subject_title' => 'Очистка резервных копий прошла удачно!', 21 | 'cleanup_successful_body' => 'Очистка от старых резервных копий :application_name на диске :disk_name прошла удачно.', 22 | 23 | 'healthy_backup_found_subject' => 'Резервная копия :application_name с диска :disk_name установлена', 24 | 'healthy_backup_found_subject_title' => 'Резервная копия :application_name установлена', 25 | 'healthy_backup_found_body' => 'Резервная копия :application_name успешно установлена. Хорошая работа!', 26 | 27 | 'unhealthy_backup_found_subject' => 'Внимание: резервная копия :application_name не установилась', 28 | 'unhealthy_backup_found_subject_title' => 'Внимание: резервная копия для :application_name не установилась. :problem', 29 | 'unhealthy_backup_found_body' => 'Резервная копия для :application_name на диске :disk_name не установилась.', 30 | 'unhealthy_backup_found_not_reachable' => 'Резервная копия не смогла установиться. :error', 31 | 'unhealthy_backup_found_empty' => 'Резервные копии для этого приложения отсутствуют.', 32 | 'unhealthy_backup_found_old' => 'Последнее резервное копирование создано :date является устаревшим.', 33 | 'unhealthy_backup_found_unknown' => 'Извините, точная причина не может быть определена.', 34 | 'unhealthy_backup_found_full' => 'Резервные копии используют слишком много памяти. Используется :disk_usage что выше допустимого предела: :disk_limit.', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/vendor/backup/uk/notifications.php: -------------------------------------------------------------------------------- 1 | 'Повідомлення про помилку: :message', 5 | 'exception_trace' => 'Деталі помилки: :trace', 6 | 'exception_message_title' => 'Повідомлення помилки', 7 | 'exception_trace_title' => 'Деталі помилки', 8 | 9 | 'backup_failed_subject' => 'Не вдалось зробити резервну копію :application_name', 10 | 'backup_failed_body' => 'Увага: Трапилась помилка під час резервного копіювання :application_name', 11 | 12 | 'backup_successful_subject' => 'Успішне резервне копіювання :application_name', 13 | 'backup_successful_subject_title' => 'Успішно створена резервна копія!', 14 | 'backup_successful_body' => 'Чудова новина, нова резервна копія :application_name успішно створена і збережена на диск :disk_name.', 15 | 16 | 'cleanup_failed_subject' => 'Не вдалось очистити резервні копії :application_name', 17 | 'cleanup_failed_body' => 'Сталася помилка під час очищення резервних копій :application_name', 18 | 19 | 'cleanup_successful_subject' => 'Успішне очищення від резервних копій :application_name', 20 | 'cleanup_successful_subject_title' => 'Очищення резервних копій пройшло вдало!', 21 | 'cleanup_successful_body' => 'Очищенно від старих резервних копій :application_name на диску :disk_name пойшло успішно.', 22 | 23 | 'healthy_backup_found_subject' => 'Резервна копія :application_name з диску :disk_name установлена', 24 | 'healthy_backup_found_subject_title' => 'Резервна копія :application_name установлена', 25 | 'healthy_backup_found_body' => 'Резервна копія :application_name успішно установлена. Хороша робота!', 26 | 27 | 'unhealthy_backup_found_subject' => 'Увага: резервна копія :application_name не установилась', 28 | 'unhealthy_backup_found_subject_title' => 'Увага: резервна копія для :application_name не установилась. :problem', 29 | 'unhealthy_backup_found_body' => 'Резервна копія для :application_name на диску :disk_name не установилась.', 30 | 'unhealthy_backup_found_not_reachable' => 'Резервна копія не змогла установитись. :error', 31 | 'unhealthy_backup_found_empty' => 'Резервні копії для цього додатку відсутні.', 32 | 'unhealthy_backup_found_old' => 'Останнє резервне копіювання створено :date є застарілим.', 33 | 'unhealthy_backup_found_unknown' => 'Вибачте, але ми не змогли визначити точну причину.', 34 | 'unhealthy_backup_found_full' => 'Резервні копії використовують занадто багато пам`яті. Використовується :disk_usage що вище за допустиму межу :disk_limit.', 35 | ]; 36 | -------------------------------------------------------------------------------- /resources/lang/zh-CN/auth.php: -------------------------------------------------------------------------------- 1 | '用户名或密码错误。', 17 | 'throttle' => '您的尝试登录次数过多,请 :seconds 秒后再试。', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/zh-CN/pagination.php: -------------------------------------------------------------------------------- 1 | '« 上一页', 17 | 'next' => '下一页 »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/zh-CN/passwords.php: -------------------------------------------------------------------------------- 1 | '密码至少是六位字符并且匹配。', 17 | 'reset' => '密码重置成功!', 18 | 'sent' => '密码重置邮件已发送!', 19 | 'token' => '密码重置令牌无效。', 20 | 'user' => '找不到该邮箱对应的用户。', 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/views/admin/auths/login.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.basic') 2 | 3 | @section('title','Sign') 4 | 5 | @section('body') 6 |
7 |

8 |

{{ poem() }}

9 |
10 |
11 | 12 |
13 |
14 | 15 |
16 |
17 | Forget Password? 18 |
19 |
20 | 21 |
22 |
23 |
24 | 35 | @include('admin.layouts.footer') 36 | @stop -------------------------------------------------------------------------------- /resources/views/admin/categorys/create.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
添加分类
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 | 18 |
19 | 20 |
21 | 22 | 23 | 26 | 27 |
28 |
29 |
30 | 31 | 32 |
33 |
34 | 35 | 39 | 43 |
44 |
45 | 46 | 47 |
48 |
49 | 51 |
52 |
53 |
54 |
55 | 66 | @stop -------------------------------------------------------------------------------- /resources/views/admin/categorys/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
更新分类: {{ $category->name }}
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 |
20 | 21 | 22 | 25 | 26 |
27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 | 38 | 42 |
43 |
44 | 45 | 46 |
47 |
48 | 50 |
51 |
52 |
53 |
54 | 65 | @stop -------------------------------------------------------------------------------- /resources/views/admin/errors/unauthentication.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |

401

6 |
7 |

  你无权进行此操作。

8 |
9 |
10 | 11 | 12 | 返回上一页 13 | 14 |
15 |
16 | @stop -------------------------------------------------------------------------------- /resources/views/admin/friendships/create.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
添加友情链接
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 |
20 | 21 | 22 | 25 | 26 |
27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 | 38 | 42 |
43 |
44 | 45 | 46 |
47 |
48 | 50 |
51 |
52 |
53 |
54 | 65 | @stop -------------------------------------------------------------------------------- /resources/views/admin/friendships/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
更新友情链接: {{ $friendship->name }}
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 |
20 | 21 | 22 | 25 | 26 |
27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 | 38 | 42 |
43 |
44 | 45 | 46 |
47 |
48 | 50 |
51 |
52 |
53 |
54 | 65 | @stop -------------------------------------------------------------------------------- /resources/views/admin/layouts/app.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.basic') 2 | 3 | @section('title','后台管理') 4 | 5 | @section('body') 6 |
7 | 17 |
18 |
19 | 42 | @yield('main') 43 |
44 |
45 | @include('admin.layouts.footer') 46 |
47 | @stop -------------------------------------------------------------------------------- /resources/views/admin/layouts/basic.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | @yield('title') - {{ config('app.name') }} 10 | 11 | 12 | 13 | 14 | 15 | @yield('body') 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /resources/views/admin/layouts/footer.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/views/admin/layouts/menus.blade.php: -------------------------------------------------------------------------------- 1 | @inject('menus','App\Services\MenuService') 2 | 3 | -------------------------------------------------------------------------------- /resources/views/admin/menus/create.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
添加菜单
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 | 28 |
29 |
30 | 31 | 37 |
38 |
39 | 40 | 41 |
42 |
43 | 45 |
46 |
47 |
48 |
49 | 63 | @stop -------------------------------------------------------------------------------- /resources/views/admin/menus/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
更新菜单: {{ $menu->name }}
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 | 28 |
29 |
30 | 31 | 37 |
38 |
39 | 40 | 41 |
42 |
43 | 45 |
46 |
47 |
48 |
49 | 63 | @stop -------------------------------------------------------------------------------- /resources/views/admin/permissions/create.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
添加权限
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 28 |
29 |
30 |
31 |
32 | 43 | @stop -------------------------------------------------------------------------------- /resources/views/admin/permissions/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
更新权限: {{ $permission->name }}
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 28 |
29 |
30 |
31 |
32 | 43 | @stop -------------------------------------------------------------------------------- /resources/views/admin/roles/create.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 |
8 |
9 | 10 |
11 |
添加角色
12 |
13 |
14 |
15 |
16 | 17 | 18 |
19 |
20 | 21 | 22 |
23 |
24 | 25 | 26 |
27 |
28 | 29 |
30 | @foreach($permissions as $permission) 31 | 34 | @endforeach 35 |
36 |
37 |
38 | 40 |
41 |
42 |
43 |
44 |
45 |
46 | 57 | @stop -------------------------------------------------------------------------------- /resources/views/admin/roles/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 |
8 |
9 | 10 |
11 |
更新角色: {{ $role->name }}
12 |
13 |
14 |
15 |
16 | 17 | 18 |
19 |
20 | 21 | 22 |
23 |
24 | 25 | 26 |
27 |
28 | 29 |
30 | @foreach($permissions as $permission) 31 | 34 | @endforeach 35 |
36 |
37 |
38 | 40 |
41 |
42 |
43 |
44 |
45 |
46 | 47 | 58 | @stop -------------------------------------------------------------------------------- /resources/views/admin/tags/create.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
添加标签
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 | 28 |
29 |
30 | 32 |
33 |
34 |
35 |
36 | 50 | @stop -------------------------------------------------------------------------------- /resources/views/admin/tags/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
更新权限: {{ $tag->name }}
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 | 28 |
29 |
30 | 32 |
33 |
34 |
35 |
36 | 50 | @stop -------------------------------------------------------------------------------- /resources/views/admin/users/create.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
添加用户
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 |
28 | @foreach($roles as $role) 29 | 32 | @endforeach 33 |
34 |
35 |
36 | 38 |
39 |
40 |
41 |
42 | 53 | @stop -------------------------------------------------------------------------------- /resources/views/admin/users/edit.blade.php: -------------------------------------------------------------------------------- 1 | @extends('admin.layouts.app') 2 | 3 | @section('main') 4 |
5 |
6 |
7 | 8 |
9 |
更新用户: {{ $user->name }}
10 |
11 |
12 |
13 |
14 | 15 | 16 |
17 |
18 | 19 | 20 |
21 |
22 | 23 | 24 |
25 |
26 | 27 |
28 | @foreach($roles as $role) 29 | 32 | @endforeach 33 |
34 |
35 |
36 | 38 |
39 |
40 |
41 |
42 | 53 | @stop -------------------------------------------------------------------------------- /resources/views/index/about.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('body') 4 |
5 |
6 |
7 | 8 | 21 |
22 |
23 |
24 | 25 | @stop -------------------------------------------------------------------------------- /resources/views/index/friendships.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('body') 4 |
5 |
6 | @foreach($friendships as $friendship) 7 | 25 | @endforeach 26 |
27 |
28 | @stop -------------------------------------------------------------------------------- /resources/views/index/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('body') 4 |
5 | 11 | 32 | @include('layouts.footer') 33 |
34 | @include('layouts.tools') 35 | @stop -------------------------------------------------------------------------------- /resources/views/layouts/app.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | {{ config('app.name') }} - WEB 开发者的书签导航 12 | 13 | 14 | 15 | 16 | 17 | @yield('body') 18 | 19 |
20 | {!! hunt('statistics') !!} 21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /resources/views/layouts/footer.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/views/layouts/tools.blade.php: -------------------------------------------------------------------------------- 1 |
2 | 4 | 5 | 6 |
7 | 9 | 10 | 11 | @include('proposals.proposal') 12 | @include('nominates.nominate') 13 |
-------------------------------------------------------------------------------- /resources/views/nominates/nominate.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |

好站推荐

5 |

我们会对你推荐的站点进行审核,非常感谢你的推荐。

6 |
7 | 8 | 9 |
10 |
11 | 12 | 13 |
14 |
15 | 16 | 17 |
18 | 19 |
20 |
-------------------------------------------------------------------------------- /resources/views/proposals/proposal.blade.php: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |

建议反馈

5 |

你的每一条建议都很宝贵,感谢阁下的反馈。

6 |
7 | 8 | 9 |
10 |
11 | 12 | 13 |
14 |
15 | 16 | 17 |
18 | 21 |
22 |
-------------------------------------------------------------------------------- /resources/views/tiggers/show.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('body') 4 |
5 |
6 | @forelse($triggers as $trigger) 7 | 37 | @empty 38 |

39 | 40 | 你还没有在盒子里放糖果哦。 41 |

42 | @endforelse 43 |
44 |
45 | @stop -------------------------------------------------------------------------------- /routes/admin.php: -------------------------------------------------------------------------------- 1 | group(function() { 15 | 16 | Route::prefix('auth')->group( 17 | function($router) { 18 | $router->view('login', 'admin.auths.login')->name('auth.login'); 19 | $router->post('login', 'AuthController@login')->name('auth.login'); 20 | $router->get('logout', 'AuthController@logout')->name('auth.logout'); 21 | } 22 | ); 23 | 24 | Route::middleware('authentication')->group( 25 | function($router) { 26 | $router->get('/', 'IndexController@index')->name('index'); 27 | $router->get('examples', 'IndexController@examples')->name('examples'); 28 | $router->get('clear', 'IndexController@clear')->name('clear'); 29 | $router->post('upload','IndexController@upload')->name('upload'); 30 | 31 | $router->resource('menus', 'MenusController'); 32 | 33 | $router->delete('permissions/batch', 'PermissionsController@batch')->name('permissions.batch'); 34 | $router->resource('permissions', 'PermissionsController'); 35 | 36 | $router->delete('roles/batch', 'RolesController@batch')->name('roles.batch'); 37 | $router->resource('roles', 'RolesController'); 38 | 39 | $router->delete('users/batch', 'UsersController@batch')->name('users.batch'); 40 | $router->resource('users', 'UsersController'); 41 | 42 | $router->delete('categorys/batch', 'CategorysController@batch')->name('categorys.batch'); 43 | $router->resource('categorys', 'CategorysController'); 44 | 45 | $router->delete('triggers/batch', 'TriggersController@batch')->name('triggers.batch'); 46 | $router->resource('triggers', 'TriggersController'); 47 | 48 | $router->delete('friendships/batch', 'FriendshipsController@batch')->name('friendships.batch'); 49 | $router->resource('friendships', 'FriendshipsController'); 50 | 51 | $router->delete('tags/batch', 'TagsController@batch')->name('tags.batch'); 52 | $router->resource('tags', 'TagsController'); 53 | 54 | $router->delete('targets/batch', 'TargetsController@batch')->name('targets.batch'); 55 | $router->resource('targets', 'TargetsController'); 56 | 57 | $router->resource('proposals', 'ProposalsController'); 58 | 59 | $router->resource('nominates', 'NominatesController'); 60 | } 61 | ); 62 | }); 63 | -------------------------------------------------------------------------------- /routes/api.php: -------------------------------------------------------------------------------- 1 | get('/user', function (Request $request) { 17 | // return $request->user(); 18 | //}); 19 | -------------------------------------------------------------------------------- /routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 16 | }); 17 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 18 | })->describe('Display an inspiring quote'); 19 | -------------------------------------------------------------------------------- /routes/web.php: -------------------------------------------------------------------------------- 1 | name('index'); 15 | Route::get('/friendships', 'IndexController@friendships')->name('index.friendships'); 16 | Route::get('/about', 'IndexController@about')->name('index.about'); 17 | 18 | Route::get('category/{category}', 'CategorysController@index')->name('category.index'); 19 | Route::get('triggers', 'TriggersController@show')->name('triggers.show'); 20 | Route::get('triggers/{trigger}', 'TriggersController@target')->name('triggers.target'); 21 | Route::get('triggers/{trigger}/favorite', 'TriggersController@favorite')->name('triggers.favorite'); 22 | Route::post('nominates', 'NominatesController@store')->name('nominates.store'); 23 | Route::post('proposals', 'ProposalsController@store')->name('proposals.store'); -------------------------------------------------------------------------------- /server.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 19 | 20 | return $app; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 18 | 19 | $response->assertStatus(200); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /webpack.mix.js: -------------------------------------------------------------------------------- 1 | let mix = require('laravel-mix'); 2 | 3 | /* 4 | |-------------------------------------------------------------------------- 5 | | Mix Asset Management 6 | |-------------------------------------------------------------------------- 7 | | 8 | | Mix provides a clean, fluent API for defining some Webpack build steps 9 | | for your Laravel application. By default, we are compiling the Sass 10 | | file for the application as well as bundling up all the JS files. 11 | | 12 | */ 13 | 14 | mix.scripts([ 15 | 'public/js/plugins/html5shiv.js', 16 | 'public/js/plugins/respond.js', 17 | 'public/js/jquery.js', 18 | 'public/js/bootstrap.js', 19 | 'public/js/adminlte.js', 20 | 'public/js/nprogress.js', 21 | 'public/js/url.js', 22 | 'public/js/toast.js', 23 | 'public/js/modal.js', 24 | 'public/js/iconpicker.js', 25 | 'public/js/pjax.js', 26 | 'public/js/script.js', 27 | ], 'public/js/app.js'); 28 | 29 | mix.sass('resources/assets/sass/app.scss', 'public/css'); 30 | --------------------------------------------------------------------------------