vali 6 年之前
当前提交
98c80b2635
共有 100 个文件被更改,包括 9220 次插入0 次删除
  1. 40 0
      app/Console/Kernel.php
  2. 65 0
      app/Exceptions/Handler.php
  3. 20 0
      app/Helpers/functions.php
  4. 437 0
      app/Http/Controllers/AppController.php
  5. 32 0
      app/Http/Controllers/Auth/ForgotPasswordController.php
  6. 65 0
      app/Http/Controllers/Auth/LoginController.php
  7. 71 0
      app/Http/Controllers/Auth/RegisterController.php
  8. 39 0
      app/Http/Controllers/Auth/ResetPasswordController.php
  9. 27 0
      app/Http/Controllers/BaseController.php
  10. 13 0
      app/Http/Controllers/Controller.php
  11. 71 0
      app/Http/Controllers/DownAppController.php
  12. 70 0
      app/Http/Controllers/HomeController.php
  13. 43 0
      app/Http/Controllers/LogController.php
  14. 54 0
      app/Http/Controllers/MenuController.php
  15. 55 0
      app/Http/Controllers/PermissionController.php
  16. 58 0
      app/Http/Controllers/RoleController.php
  17. 179 0
      app/Http/Controllers/UserController.php
  18. 61 0
      app/Http/Kernel.php
  19. 57 0
      app/Http/Middleware/AuthCheck.php
  20. 17 0
      app/Http/Middleware/EncryptCookies.php
  21. 87 0
      app/Http/Middleware/Permission.php
  22. 26 0
      app/Http/Middleware/RedirectIfAuthenticated.php
  23. 18 0
      app/Http/Middleware/TrimStrings.php
  24. 17 0
      app/Http/Middleware/VerifyCsrfToken.php
  25. 98 0
      app/Http/Requests/StoreRequest.php
  26. 72 0
      app/Models/Admin.php
  27. 25 0
      app/Models/Interfaces/AdminMenuInterface.php
  28. 35 0
      app/Models/Interfaces/AdminPermissionInterface.php
  29. 36 0
      app/Models/Interfaces/AdminRoleInterface.php
  30. 39 0
      app/Models/Interfaces/AdminUsersInterface.php
  31. 28 0
      app/Models/Log.php
  32. 18 0
      app/Models/Menu.php
  33. 43 0
      app/Models/Permission.php
  34. 17 0
      app/Models/Role.php
  35. 227 0
      app/Models/Traits/AdminMenuTrait.php
  36. 107 0
      app/Models/Traits/AdminPermissionTrait.php
  37. 142 0
      app/Models/Traits/AdminRoleTrait.php
  38. 159 0
      app/Models/Traits/AdminUsersTrait.php
  39. 18 0
      app/Models/User.php
  40. 30 0
      app/Providers/AppServiceProvider.php
  41. 30 0
      app/Providers/AuthServiceProvider.php
  42. 21 0
      app/Providers/BroadcastServiceProvider.php
  43. 32 0
      app/Providers/EventServiceProvider.php
  44. 73 0
      app/Providers/RouteServiceProvider.php
  45. 202 0
      app/Service/DataService.php
  46. 29 0
      app/User.php
  47. 50 0
      app/Utils/UrlUtils.php
  48. 51 0
      artisan
  49. 55 0
      bootstrap/app.php
  50. 17 0
      bootstrap/autoload.php
  51. 2 0
      bootstrap/cache/.gitignore
  52. 55 0
      composer.json
  53. 3557 0
      composer.lock
  54. 49 0
      config/admin.php
  55. 231 0
      config/app.php
  56. 102 0
      config/auth.php
  57. 58 0
      config/broadcasting.php
  58. 91 0
      config/cache.php
  59. 120 0
      config/database.php
  60. 98 0
      config/filesystems.php
  61. 123 0
      config/mail.php
  62. 85 0
      config/queue.php
  63. 38 0
      config/services.php
  64. 179 0
      config/session.php
  65. 33 0
      config/view.php
  66. 1 0
      database/.gitignore
  67. 23 0
      database/factories/ModelFactory.php
  68. 1 0
      database/migrations/.gitkeep
  69. 39 0
      database/migrations/2017_07_04_104528_create_admin_users_table.php
  70. 36 0
      database/migrations/2017_07_04_104719_create_admin_roles_table.php
  71. 37 0
      database/migrations/2017_07_04_104933_create_admin_logs_table.php
  72. 39 0
      database/migrations/2017_07_04_104933_create_admin_menus_table.php
  73. 34 0
      database/migrations/2017_07_04_104933_create_admin_permission_menu_table.php
  74. 34 0
      database/migrations/2017_07_04_104933_create_admin_permission_role_table.php
  75. 37 0
      database/migrations/2017_07_04_104933_create_admin_permissions_table.php
  76. 34 0
      database/migrations/2017_07_04_104933_create_admin_role_menu_table.php
  77. 34 0
      database/migrations/2017_07_04_104933_create_admin_role_user_table.php
  78. 1 0
      database/seeds/.gitkeep
  79. 104 0
      database/seeds/AdminMenusTableSeeder.php
  80. 64 0
      database/seeds/AdminPermissionMenuTableSeeder.php
  81. 66 0
      database/seeds/AdminPermissionRoleTableSeeder.php
  82. 109 0
      database/seeds/AdminPermissionsTableSeeder.php
  83. 54 0
      database/seeds/AdminRoleMenuTableSeeder.php
  84. 24 0
      database/seeds/AdminRoleUserTableSeeder.php
  85. 28 0
      database/seeds/AdminRolesTableSeeder.php
  86. 32 0
      database/seeds/AdminUsersTableSeeder.php
  87. 23 0
      database/seeds/DatabaseSeeder.php
  88. 9 0
      database/sql/admin_logs.sql
  89. 12 0
      database/sql/admin_menus.sql
  90. 5 0
      database/sql/admin_permission_menu.sql
  91. 6 0
      database/sql/admin_permission_role.sql
  92. 11 0
      database/sql/admin_permissions.sql
  93. 5 0
      database/sql/admin_role_menu.sql
  94. 6 0
      database/sql/admin_role_user.sql
  95. 10 0
      database/sql/admin_roles.sql
  96. 14 0
      database/sql/admin_users.sql
  97. 191 0
      fadmin_jg.sql
  98. 二进制
      img/code.png
  99. 二进制
      img/index.png
  100. 二进制
      img/log.png

+ 40 - 0
app/Console/Kernel.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace App\Console;
+
+use Illuminate\Console\Scheduling\Schedule;
+use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
+
+class Kernel extends ConsoleKernel
+{
+    /**
+     * The Artisan commands provided by your application.
+     *
+     * @var array
+     */
+    protected $commands = [
+        //
+    ];
+
+    /**
+     * Define the application's command schedule.
+     *
+     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
+     * @return void
+     */
+    protected function schedule(Schedule $schedule)
+    {
+        // $schedule->command('inspire')
+        //          ->hourly();
+    }
+
+    /**
+     * Register the Closure based commands for the application.
+     *
+     * @return void
+     */
+    protected function commands()
+    {
+        require base_path('routes/console.php');
+    }
+}

+ 65 - 0
app/Exceptions/Handler.php

@@ -0,0 +1,65 @@
+<?php
+
+namespace App\Exceptions;
+
+use Exception;
+use Illuminate\Auth\AuthenticationException;
+use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
+
+class Handler extends ExceptionHandler
+{
+    /**
+     * A list of the exception types that should not be reported.
+     *
+     * @var array
+     */
+    protected $dontReport = [
+        \Illuminate\Auth\AuthenticationException::class,
+        \Illuminate\Auth\Access\AuthorizationException::class,
+        \Symfony\Component\HttpKernel\Exception\HttpException::class,
+        \Illuminate\Database\Eloquent\ModelNotFoundException::class,
+        \Illuminate\Session\TokenMismatchException::class,
+        \Illuminate\Validation\ValidationException::class,
+    ];
+
+    /**
+     * Report or log an exception.
+     *
+     * This is a great spot to send exceptions to Sentry, Bugsnag, etc.
+     *
+     * @param  \Exception  $exception
+     * @return void
+     */
+    public function report(Exception $exception)
+    {
+        parent::report($exception);
+    }
+
+    /**
+     * Render an exception into an HTTP response.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Exception  $exception
+     * @return \Illuminate\Http\Response
+     */
+    public function render($request, Exception $exception)
+    {
+        return parent::render($request, $exception);
+    }
+
+    /**
+     * Convert an authentication exception into an unauthenticated response.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Illuminate\Auth\AuthenticationException  $exception
+     * @return \Illuminate\Http\Response
+     */
+    protected function unauthenticated($request, AuthenticationException $exception)
+    {
+        if ($request->expectsJson()) {
+            return response()->json(['error' => 'Unauthenticated.'], 401);
+        }
+
+        return redirect()->guest(route('login'));
+    }
+}

+ 20 - 0
app/Helpers/functions.php

@@ -0,0 +1,20 @@
+<?php
+/**
+ * 判断是否为不可操作id
+ *
+ * @param	number	$id	参数id
+ * @param	string	$configName	配置名
+ * @param	bool  $emptyRetValue
+ * @param	string	$split 分隔符
+ * @return	bool
+ */
+if (!function_exists('is_config_id')) {
+    function is_config_id($id, $configName, $emptyRetValue = false, $split = ",")
+    {
+        if (empty($configName)) return $emptyRetValue;
+        $str = trim(config($configName, ""));
+        if (empty($str)) return $emptyRetValue;
+        $ids = explode($split, $str);
+        return in_array($id, $ids);
+    }
+}

+ 437 - 0
app/Http/Controllers/AppController.php

@@ -0,0 +1,437 @@
+<?php
+/**
+ * 应用上传
+ *
+ * @author      MEOWWEI
+ * @Time: 2019-11-12 11:04:05
+ * @version     1.0 版本号
+ */
+
+namespace App\Http\Controllers;
+
+use App\Http\Requests\StoreRequest;
+use App\Service\DataService;
+use http\Env\Response;
+use Illuminate\Session\Store;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Facades\Input;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+
+class AppController extends BaseController
+{
+
+    /**
+     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
+     *  应用大致显示
+     */
+    public function index()
+    {
+        $data = DB::table('admin_app')->orderBy('id', 'desc')->select('id', 'app_title', 'icon', 'edition', 'a_down', 'a_down_limit')->get()->toArray();
+        foreach ($data as $k => $v) {
+            $data[$k] = (array)$v;
+        }
+        return view('app.list', compact('data'));
+    }
+
+    /**
+     * @param $id
+     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
+     * 应用详情
+     */
+    public function applist($id)
+    {
+        $data = DB::table('admin_app')->where('id', $id)->first();
+        $data = get_object_vars($data);//转数组
+
+        $img = $data['img'];
+        if (strpos($img, '|') == false) {
+            $data['img'] = $img;
+            $data['img1'] = $img;
+        } else {
+            $data['img1'] = substr($img, 0, strrpos($img, '|'));
+            $data['img'] = substr($img, strripos($img, '|') + 1);
+        }
+
+        return view('app.appxq', compact('data'));
+    }
+
+    /**
+     * @param $id
+     * @param Request $request
+     * 图标icon上传
+     */
+    public function appicon($id, Request $request)
+    {
+        if ($request->isMethod('POST')) { //判断文件是否是 POST的方式上传
+            $tmp = $request->file('file');
+            $path = '/uploads/ico'; //public下的article
+            if ($tmp->isValid()) { //判断文件上传是否有效
+                $FileType = $tmp->getClientOriginalExtension(); //获取文件后缀
+
+                $FilePath = $tmp->getRealPath(); //获取文件临时存放位置
+
+                $FileName = date('YmdHis') . uniqid() . '.' . $FileType; //定义文件名
+
+                Storage::disk('article')->put($FileName, file_get_contents($FilePath)); //存储文件
+
+                //路径存数据库
+                $pathdb = $path . '/' . $FileName;
+                $db = DB::table('admin_app')->where('id', $id)->update(['icon' => $pathdb]);
+                if ($db > 0) {
+                    return redirect('/apps');
+                }
+            }
+        }
+    }
+
+    /**
+     * @param $id
+     * @param Request $request
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     * 二维码
+     */
+    public function appeq($id, Request $request)
+    {
+        if ($request->isMethod('POST')) { //判断文件是否是 POST的方式上传
+            $tmp = $request->file('file');
+            $path = '/uploads/ico'; //public下的article
+            if ($tmp->isValid()) { //判断文件上传是否有效
+                $FileType = $tmp->getClientOriginalExtension(); //获取文件后缀
+
+                $FilePath = $tmp->getRealPath(); //获取文件临时存放位置
+
+                $FileName = date('YmdHis') . uniqid() . '.' . $FileType; //定义文件名
+
+                Storage::disk('article')->put($FileName, file_get_contents($FilePath)); //存储文件
+
+                //路径存数据库
+                $pathdb = $path . '/' . $FileName;
+                $db = DB::table('admin_app')->where('id', $id)->update(['a_qr' => $pathdb]);
+                if ($db > 0) {
+                    return redirect('/apps');
+                }
+            }
+        }
+    }
+
+    /**
+     * @return int
+     * 既点既改
+     */
+    public function apptitles()
+    {
+        $arr = Input::get();//接收ajax传递的参数
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['app_title' => $arr['username']]);
+        //var_dump($result);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+    public function editjdjg()
+    {
+        $arr = Input::get();//接收ajax传递的参数
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['f_title' => $arr['username']]);
+        //var_dump($result);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+    public function fage()
+    {
+        $arr = Input::get();
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['f_age' => $arr['username']]);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+    public function clas()
+    {
+        $arr = Input::get();
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['f_class' => $arr['username']]);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+    public function rlak()
+    {
+        $arr = Input::get();
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['f_ranking' => $arr['username']]);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+    public function score()
+    {
+        $arr = Input::get();
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['f_score' => $arr['username']]);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+    public function nums()
+    {
+        $arr = Input::get();
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['f_score_num' => $arr['username']]);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+    public function brief()
+    {
+        $arr = Input::get();
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['f_brief' => $arr['username']]);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+    public function atitle()
+    {
+        $arr = Input::get();
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['a_title' => $arr['username']]);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+    public function aname()
+    {
+        $arr = Input::get();
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['a_name' => $arr['username']]);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+    public function limitnum()
+    {
+        $arr = Input::get();
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['a_down_limit' => $arr['username']]);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+    public function adesc()
+    {
+        $arr = Input::get();
+        $result = DB::table('admin_app')->where('id', $arr['id'])->update(['a_desc' => $arr['username']]);
+        if ($result) {
+            $status = 1;
+        } else {
+            $status = 2;
+        }
+        return $status; //将结果返回给展示页面
+    }
+
+
+    /**
+     * @param $id
+     * @param Request $request
+     * @return mixed
+     * 图片
+     */
+    public function uploadsimgs($id, Request $request)
+    {
+        $datass  = DB::table('admin_app')->where('id',$id)->select('img')->first();
+        $datass = get_object_vars($datass);
+        $datass = $datass['img'];
+        $file = $request->except('_token');
+        $file = $file['goods_imgs'];
+        $path = '/uploads/ico';
+        if (!is_array($file)) {
+            //if ($file->isValid()) {
+            //获取文件相关信息
+            $originalName = $file->getClientOriginalName(); // 文件原名
+            echo 111;
+            var_dump($originalName);
+            $ext = $file->getClientOriginalExtension();     // 扩展名
+            $realPath = $file->getRealPath();   //临时文件的绝对路径
+            $type = $file->getClientMimeType();     // image/jpeg
+
+            if (!in_array($ext, ['jpg', 'jpeg', 'gif', 'png'])) return false;
+            // 上传
+            $filename = date('YmdHis') . '-' . uniqid() . '.' . $ext;
+
+            Storage::disk('article')->put($filename, file_get_contents($realPath)); //存储文件
+            //路径存数据库
+            $pathdb = $path . '/' . $filename;
+
+            if($datass !='' || $datass != null){
+                $pathdb = $datass.'|'.$pathdb;
+                $db = DB::table('admin_app')->where('id', $id)->update(['img' => $pathdb]);
+            }else{
+                $db = DB::table('admin_app')->where('id', $id)->update(['img' => $pathdb]);
+            }
+            if ($db > 0) {
+                return redirect('/apps');
+            }
+        } else {
+            $data = [];
+            $path = '/uploads/ico';
+            foreach ($file as $files) {
+                //if ($files->isValid()) {
+                // 获取文件相关信息
+                $originalName = $files->getClientOriginalName(); // 文件原名
+                $ext = $files->getClientOriginalExtension();     // 扩展名
+                $realPath = $files->getRealPath();   //临时文件的绝对路径
+                $type = $files->getClientMimeType();     // image/jpeg
+
+                if (!in_array($ext, ['jpg', 'jpeg', 'gif', 'png'])) return false;
+                // 上传文件
+                $file_name = date('YmdHis') . '-' . uniqid() . '.' . $ext;
+                Storage::disk('article')->put($file_name, file_get_contents($realPath)); //存储文件
+                //路径存数据库
+                $pathdb = $path . '/' . $file_name;
+                if($datass !='' || $datass != null){
+                    $pathdb = $datass.'|'.$pathdb;
+                    $db = DB::table('admin_app')->where('id', $id)->update(['img' => $pathdb]);
+                }else{
+                    $db = DB::table('admin_app')->where('id', $id)->update(['img' => $pathdb]);
+                }
+                if ($db > 0) {
+                    return redirect('/apps');
+                }
+            }
+        }
+    }
+    /*if ($request->isMethod('POST')) { //判断文件是否是 POST的方式上传
+        $tmp = $request->file('file');
+        $path = '/uploads/ico'; //public下的article
+        if ($tmp->isValid()) { //判断文件上传是否有效
+            $FileType = $tmp->getClientOriginalExtension(); //获取文件后缀
+
+            $FilePath = $tmp->getRealPath(); //获取文件临时存放位置
+
+            $FileName = date('YmdHis') . uniqid() . '.' . $FileType; //定义文件名
+
+            Storage::disk('article')->put($FileName, file_get_contents($FilePath)); //存储文件
+
+            //路径存数据库
+            $pathdb = $path.'/'.$FileName;
+            $cat = DB::table('admin_app')->where('id',$id)->select('img')->first();
+            $cat = get_object_vars($cat);
+            $cat = $cat['img'];
+            if($cat != ''){
+                $pathdb = $cat.'|'.$pathdb;
+                $db= DB::table('admin_app')->where('id',$id)->update(['img'=>$pathdb]);
+            }else{
+                $db = DB::table('admin_app')->where('id',$id)->update(['img'=>$pathdb]);
+            }
+            if($db>0){
+                return redirect('/apps');
+            }
+        }
+    }*/
+
+
+    /**
+     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
+     * 应用上传显示
+     */
+    public function uploads()
+    {
+        return view('app.upload');
+    }
+
+    /**
+     * @param Request $request
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     * 上传处理
+     */
+    public function fileuploads(Request $request)
+    {
+
+        //$data = $request->all();
+        $file = $request->file('picture');    //获取文件所有信息
+        if ($file == null || $file == '') {
+            return redirect('/apps');
+        }
+        $path = '';
+
+        $fileextension = $file->getClientOriginalName();//获取文件原名称
+        $filesize = $file->getClientSize();//文件大小b
+        $filesize = round($filesize / 1024 / 1024, 2);//文件大小
+
+        //var_dump($filesize);
+        if ($file->isValid()) { //判断文件是否存在
+            $clientName = $file->getClientOriginalName();    //客户端文件名称..
+            $entension = $file->getClientOriginalExtension();   //上传文件的后缀.
+            $newName = md5(date('Ymdhis') . $clientName) . "." . $entension;    //定义      上传文件的新名称
+            $path = $file->move('/uploads', $newName);    //把缓存文件移动到指定文件夹
+            var_dump($path);die;
+            $db = DB::table('admin_app')->insert(['app_title' => $fileextension, 'app_id' => $fileextension, 'filesize' => $filesize, 'a_title' => $fileextension, 'path' => $path]);
+            if ($db > 0) {
+                return redirect('/apps');
+            }
+        }
+    }
+
+    /**
+     * @param $id
+     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+     *  软件删除,注会同时删除本地上传的
+     */
+    public function deldata($id)
+    {
+        $src = DB::table('admin_app')->select('path')->where('id', $id)->first();
+        $src = (array)$src;
+        $src = $src['path'];
+        $db = DB::table('admin_app')->where('id', $id)->delete();
+        if ($db > 0) {
+            if ($src != null || $src != '') {
+                $res = unlink($src);
+                return redirect('/apps/');
+            } else {
+                return redirect('/apps/');
+            }
+        } else {
+            return redirect('/apps/');
+        }
+
+
+    }
+
+
+}

+ 32 - 0
app/Http/Controllers/Auth/ForgotPasswordController.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
+
+class ForgotPasswordController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Password Reset Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller is responsible for handling password reset emails and
+    | includes a trait which assists in sending these notifications from
+    | your application to your users. Feel free to explore this trait.
+    |
+    */
+
+    use SendsPasswordResetEmails;
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('guest');
+    }
+}

+ 65 - 0
app/Http/Controllers/Auth/LoginController.php

@@ -0,0 +1,65 @@
+<?php
+/**
+ * 用户登陆
+ *
+ * @author      fzs
+ * @Time: 2017/07/14 15:57
+ * @version     1.0 版本号
+ */
+namespace App\Http\Controllers\Auth;
+use App\Http\Controllers\Controller;
+use App\Models\Log;
+use Illuminate\Foundation\Auth\AuthenticatesUsers;
+use Illuminate\Http\Request;
+class LoginController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Login Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller handles authenticating users for the application and
+    | redirecting them to your home screen. The controller uses a trait
+    | to conveniently provide its functionality to your applications.
+    |
+    */
+    use AuthenticatesUsers {authenticated as oriAuthenticated;}
+    use AuthenticatesUsers {login as doLogin;}
+
+    /**
+     * Where to redirect users after login.
+     *
+     * @var string
+     */
+    protected $redirectTo = '/';
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('guest')->except('logout');
+    }
+    public function lout(){
+        Session::Remove('email');
+        return redirect('/login');
+    }
+    public function login(Request $request)
+    {
+        if($request->input('verity')==session('code'))return $this->doLogin($request);
+        else return redirect('/login')->withErrors([trans('fzs.login.false_verify')]);
+    }
+    public function username()
+    {
+        return 'username';
+    }
+
+    protected function authenticated(Request $request, $user)
+    {
+        Log::addLogs(trans('fzs.login.login_info'),'/login',$user->id);
+        return $this->oriAuthenticated($request, $user);
+    }
+
+}

+ 71 - 0
app/Http/Controllers/Auth/RegisterController.php

@@ -0,0 +1,71 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\User;
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Validator;
+use Illuminate\Foundation\Auth\RegistersUsers;
+
+class RegisterController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Register Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller handles the registration of new users as well as their
+    | validation and creation. By default this controller uses a trait to
+    | provide this functionality without requiring any additional code.
+    |
+    */
+
+    use RegistersUsers;
+
+    /**
+     * Where to redirect users after registration.
+     *
+     * @var string
+     */
+    protected $redirectTo = '/home';
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('guest');
+    }
+
+    /**
+     * Get a validator for an incoming registration request.
+     *
+     * @param  array  $data
+     * @return \Illuminate\Contracts\Validation\Validator
+     */
+    protected function validator(array $data)
+    {
+        return Validator::make($data, [
+            'name' => 'required|string|max:255',
+            'email' => 'required|string|email|max:255|unique:users',
+            'password' => 'required|string|min:6|confirmed',
+        ]);
+    }
+
+    /**
+     * Create a new user instance after a valid registration.
+     *
+     * @param  array  $data
+     * @return \App\User
+     */
+    protected function create(array $data)
+    {
+        return User::create([
+            'name' => $data['name'],
+            'email' => $data['email'],
+            'password' => bcrypt($data['password']),
+        ]);
+    }
+}

+ 39 - 0
app/Http/Controllers/Auth/ResetPasswordController.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace App\Http\Controllers\Auth;
+
+use App\Http\Controllers\Controller;
+use Illuminate\Foundation\Auth\ResetsPasswords;
+
+class ResetPasswordController extends Controller
+{
+    /*
+    |--------------------------------------------------------------------------
+    | Password Reset Controller
+    |--------------------------------------------------------------------------
+    |
+    | This controller is responsible for handling password reset requests
+    | and uses a simple trait to include this behavior. You're free to
+    | explore this trait and override any methods you wish to tweak.
+    |
+    */
+
+    use ResetsPasswords;
+
+    /**
+     * Where to redirect users after resetting their password.
+     *
+     * @var string
+     */
+    protected $redirectTo = '/home';
+
+    /**
+     * Create a new controller instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        $this->middleware('guest');
+    }
+}

+ 27 - 0
app/Http/Controllers/BaseController.php

@@ -0,0 +1,27 @@
+<?php
+/**
+ * 基础控制器,目前只加入一个公共方法,可以拓展
+ *
+ * @author      fzs
+ * @Time: 2017/07/14 15:57
+ * @version     1.0 版本号
+ */
+namespace App\Http\Controllers;
+
+use Illuminate\Http\Request;
+
+class BaseController extends Controller
+{
+    /**
+     * 返回自定义标准json格式
+     *
+     * @access protected
+     * @param string $lang 语言包
+     * @param number $res 结果code
+     * @return json
+     */
+    protected function resultJson($lang,$res)
+    {
+        return strstr($lang,'fzs')?['status'=>$res,'msg'=>trans($lang)]:['status'=>$res,'msg'=>$lang];
+    }
+}

+ 13 - 0
app/Http/Controllers/Controller.php

@@ -0,0 +1,13 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Foundation\Bus\DispatchesJobs;
+use Illuminate\Routing\Controller as BaseController;
+use Illuminate\Foundation\Validation\ValidatesRequests;
+use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
+
+class Controller extends BaseController
+{
+    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
+}

+ 71 - 0
app/Http/Controllers/DownAppController.php

@@ -0,0 +1,71 @@
+<?php
+/** 下载  */
+
+namespace App\Http\Controllers;
+
+use App\Http\Requests\StoreRequest;
+use App\Service\DataService;
+use http\Env\Response;
+use phpDocumentor\Reflection\File;
+use Illuminate\Session\Store;
+use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Facades\Input;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+
+class DownAppController extends Controller
+{
+
+    public function showdown($id = 13)
+    {
+        if ($id !== 13) {
+            $data = DB::table('admin_app')->where('id', $id)->first();
+            $data = get_object_vars($data);//转数组
+            $img = $data['img'];
+            if (strpos($img, '|') == false) {
+                $data['img'] = $img;
+                $data['img1'] = $img;
+            } else {
+                $data['img1'] = substr($img, 0, strrpos($img, '|'));
+                $data['img'] = substr($img, strripos($img, '|') + 1);
+            }
+            return view('index.dewnloads', compact('data'));
+        } else {
+            $id = DB::table('admin_app')->orderBy('id', 'desc')->select('id')->first();
+            //这里是没有id的
+            $id = get_object_vars($id);
+            $id = $id['id'];
+            $data = DB::table('admin_app')->where('id', $id)->first();
+            $data = get_object_vars($data);//转数组
+
+            $img = $data['img'];
+            if (strpos($img, '|') == false) {
+                $data['img'] = $img;
+                $data['img1'] = $img;
+            } else {
+                $data['img1'] = substr($img, 0, strrpos($img, '|'));
+                $data['img'] = substr($img, strripos($img, '|') + 1);
+            }
+            return view('index.dewnloads', compact('data'));
+        }
+
+    }
+
+    public function downloads($id,Request $request){
+        $filepath = DB::table('admin_app')->where('id',$id)->select('path')->first();
+        if($filepath != null || $filepath!=''){
+            $filename = DB::table('admin_app')->where('id',$id)->select('app_title')->first();
+            $filepath = get_object_vars($filepath);
+            $filename = get_object_vars($filename);
+            $filename = $filename['app_title'];
+            $filepath = $filepath['path'];
+            return response()->download($filepath,$filename);
+        }else{
+            return redirect('/');
+        }
+
+
+
+
+    }
+}

+ 70 - 0
app/Http/Controllers/HomeController.php

@@ -0,0 +1,70 @@
+<?php
+/**
+ * 用户登陆过后首页以及一些公共方法
+ *
+ * @author      fzs
+ * @Time: 2017/07/14 15:57
+ * @version     1.0 版本号
+ */
+namespace App\Http\Controllers;
+use App\Models\Admin;
+use Gregwar\Captcha\CaptchaBuilder;
+use Gregwar\Captcha\PhraseBuilder;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Session;
+class HomeController extends BaseController
+{
+    /**
+     * 后台首页
+     */
+    public function index() {
+        $menu = new Admin();
+        return view('admin.index',['menus'=>$menu->menus(),'mid'=>$menu->getMenuId(),'parent_id'=>$menu->getParentMenuId()]);
+    }
+    /**
+     * 验证码
+     */
+    public function verify(){
+        $phrase = new PhraseBuilder;
+        $code = $phrase->build(4);
+        $builder = new CaptchaBuilder($code, $phrase);
+        $builder->setBackgroundColor(255, 255, 255);
+        $builder->build(130,40);
+        $phrase = $builder->getPhrase();
+        Session::flash('code', $phrase); //存储验证码
+        return response($builder->output())->header('Content-type','image/jpeg');
+    }
+    /**
+     * 欢迎首页
+     */
+    public function welcome(){
+        return view('admin.welcome',['sysinfo'=>$this->getSysInfo()]);
+    }
+    /**
+     * 排序
+     */
+    public function changeSort(Request $request){
+        $data = $request->all();
+        if(is_numeric($data['id'])){
+            $res = DB::table('admin_'.$data['name'])->where('id',$data['id'])->update(['order'=>$data['val']]);
+            if($res)return $this->resultJson('fzs.common.success', 1);
+            else return $this->resultJson('fzs.common.fail', 0);
+        }else{
+            return $this->resultJson('fzs.common.wrong', 0);
+        }
+    }
+    /**
+     * 获取系统信息
+     */
+    protected function getSysInfo(){
+        $sys_info['ip'] 			= GetHostByName($_SERVER['SERVER_NAME']);
+        $sys_info['phpv']           = phpversion();
+        $sys_info['web_server']     = $_SERVER['SERVER_SOFTWARE'];
+        $sys_info['time']           = date("Y-m-d H:i:s");
+        $sys_info['domain'] 		= $_SERVER['HTTP_HOST'];
+        $mysqlinfo = DB::select("SELECT VERSION() as version");
+        $sys_info['mysql_version']  = $mysqlinfo[0]->version;
+        return $sys_info;
+    }
+}

+ 43 - 0
app/Http/Controllers/LogController.php

@@ -0,0 +1,43 @@
+<?php
+/**
+ * 日志管理
+ *
+ * @author      fzs
+ * @Time: 2017/07/14 15:57
+ * @version     1.0 版本号
+ */
+namespace App\Http\Controllers;
+use App\Models\Log;
+use Illuminate\Http\Request;
+class LogController extends Controller
+{
+    /**
+     * 日志列表
+     */
+    public function index(Request $request)
+    {
+        return $this->show($request);
+    }
+
+    public function lout(){
+        Session::Remove('email');
+        return redirect('/login');
+    }
+    /**
+     * 根据条件日志列表查询
+     */
+    public function show(Request $request)
+    {
+        $sql = Log::with('user.roles');
+        $sql->leftJoin(config('admin.user_table') . " as users", "users.id" , "=", "admin_logs.admin_id");
+        if(true == $request->has('title')&&true == $request->has('status')) {
+            $sql->where('admin_logs.'.$request->input('status'), 'LIKE', '%'.trim($request->input('title')).'%');
+        }
+        if(true == $request->has('begin')) {
+            $sql->where('admin_logs.log_time', '>=', trim($request->input('begin')));
+        }
+        $sql->select('admin_logs.*');
+        $pager = $sql->orderBy('admin_logs.id', 'desc')->paginate()->appends($request->all());
+        return view('logs.list', ['pager'=>$pager,'input'=>$request->all()]);
+    }
+}

+ 54 - 0
app/Http/Controllers/MenuController.php

@@ -0,0 +1,54 @@
+<?php
+/**
+ * 菜单管理
+ *
+ * @author      fzs
+ * @Time: 2017/07/14 15:57
+ * @version     1.0 版本号
+ */
+namespace App\Http\Controllers;
+use App\Http\Requests\StoreRequest;
+use App\Models\Log;
+use App\Service\DataService;
+use App\Models\Role;
+use App\Models\Menu;
+class MenuController extends BaseController
+{
+    /**
+     * 菜单列表
+     */
+    public function index()
+    {
+        return view('menus.list', ['menus'=>Menu::toTree(),'roles'=>Role::all()]);
+    }
+    /**
+     * 菜单增加保存
+     */
+    public function store(StoreRequest $request){
+        $model = new Menu();
+        $menu = DataService::handleDate($model,$request->all(),'menus-add_or_update');
+        if($menu['status']==1)Log::addLogs(trans('fzs.menus.handle_menu').trans('fzs.common.success'),'/menus/story');
+        else Log::addLogs(trans('fzs.menus.handle_menu').trans('fzs.common.fail'),'/menus/destroy');
+        return $menu;
+    }
+    /**
+     * 菜单编辑页面
+     */
+    public function edit($id=0)
+    {
+        $menu = ($id > 0) ? Menu::findByRoleId($id) : [];
+        return view('menus.edit', ['id'=>$id,'menu'=>$menu,'menus'=>Menu::toTree(),'roles'=>Role::all()]);
+    }
+    /**
+     * 菜单删除
+     */
+    public function destroy($id)
+    {
+        if (is_config_id($id, "admin.menu_table_cannot_manage_ids", false))return $this->resultJson('fzs.menus.notdel', 0);
+        $model = new Menu();
+        $menu = DataService::handleDate($model,['id'=>$id],'menus-delete');
+        if($menu['status']==1)Log::addLogs(trans('fzs.menus.del_menu').trans('fzs.common.success'),'/menus/destroy/'.$id);
+        else Log::addLogs(trans('fzs.menus.del_menu').trans('fzs.menus.fail'),'/menus/destroy/'.$id);
+        return $menu;
+    }
+}

+ 55 - 0
app/Http/Controllers/PermissionController.php

@@ -0,0 +1,55 @@
+<?php
+/**
+ * 权限管理
+ *
+ * @author      fzs
+ * @Time: 2017/07/14 15:57
+ * @version     1.0 版本号
+ */
+namespace App\Http\Controllers;
+use App\Http\Requests\StoreRequest;
+use App\Models\Log;
+use App\Models\Permission;
+use App\Models\Role;
+use App\Service\DataService;
+use Illuminate\Http\Request;
+class PermissionController extends BaseController
+{
+    /**
+     * 权限列表
+     */
+    public function index(){
+        return view('permissions.list',['list'=>Permission::get()->toArray()]);
+    }
+    /**
+     * 权限编辑列表
+     */
+    public function edit($id=0)
+    {
+        $info = $id?Permission::find($id):[];
+        $role = $info?$info->roleToIds():[];
+        return view('permissions.edit', ['id'=>$id,'info'=>$info,'roles'=>Role::all(),'rolelist'=>$role]);
+    }
+    /**
+     * 权限增加保存
+     */
+    public function store(StoreRequest $request){
+        $model = new Permission();
+        $permission = DataService::handleDate($model,$request->all(),'permissions-add_or_update');
+        if($permission['status']==1)Log::addLogs(trans('fzs.permissions.handle_permission').trans('fzs.common.success'),'/permissions/story');
+        else Log::addLogs(trans('fzs.permissions.handle_permission').trans('fzs.common.fail'),'/permissions/destroy');
+        return $permission;
+    }
+    /**
+     * 权限删除
+     */
+    public function destroy($id)
+    {
+        if (is_config_id($id, "admin.permission_table_cannot_manage_ids", false))return $this->resultJson('fzs.permissions.notdel', 0);
+        $model = new Permission();
+        $permission = DataService::handleDate($model,['id'=>$id],'permissions-delete');
+        if($permission['status']==1)Log::addLogs(trans('fzs.permissions.del_permission').trans('fzs.common.success'),'/permissions/destroy/'.$id);
+        else Log::addLogs(trans('fzs.permissions.del_permission').trans('fzs.common.fail'),'/permissions/destroy/'.$id);
+        return $permission;
+    }
+}

+ 58 - 0
app/Http/Controllers/RoleController.php

@@ -0,0 +1,58 @@
+<?php
+/**
+ * 角色管理
+ *
+ * @author      fzs
+ * @Time: 2017/07/14 15:57
+ * @version     1.0 版本号
+ */
+namespace App\Http\Controllers;
+use App\Models\Permission;
+use App\Models\Role;
+use App\Service\DataService;
+use App\Http\Requests\StoreRequest;
+use App\Models\Log;
+class RoleController extends BaseController
+{
+    /**
+     * 角色列表
+     */
+    public function index(){
+        return view('roles.list',['list'=>Role::get()->toArray()]);
+    }
+    /**
+     * 角色编辑
+     */
+    public function edit($id=0)
+    {
+        $permission = Permission::get()->toArray();
+        $delId = explode(',',config('admin')['permission_table_cannot_manage_ids']);
+        foreach ($permission as $k => $v){
+            if(in_array($v['id'],$delId))unset($permission[$k]);
+        }
+        $info = $id?Role::find($id):[];
+        return view('roles.edit', ['id'=>$id,'info'=>$info,'permission'=>$permission]);
+    }
+    /**
+     * 角色增加保存
+     */
+    public function store(StoreRequest $request){
+        $model = new Role();
+        $role = DataService::handleDate($model,$request->all(),'roles-add_or_update');
+        if($role['status']==1)Log::addLogs(trans('fzs.roles.handle_role').trans('fzs.common.success'),'/roles/story');
+        else Log::addLogs(trans('fzs.roles.handle_role').trans('fzs.common.fail'),'/roles/destroy');
+        return $role;
+    }
+    /**
+     * 角色删除
+     */
+    public function destroy($id)
+    {
+        if (is_config_id($id, "admin.role_table_cannot_manage_ids", false))return $this->resultJson('fzs.roles.notdel', 0);
+        $model = new Role();
+        $role = DataService::handleDate($model,['id'=>$id],'roles-delete');
+        if($role['status']==1)Log::addLogs(trans('fzs.roles.del_role').trans('fzs.common.success'),'/roles/destroy/'.$id);
+        else Log::addLogs(trans('fzs.roles.del_role').trans('fzs.menus.fail'),'/roles/destroy/'.$id);
+        return $role;
+    }
+}

+ 179 - 0
app/Http/Controllers/UserController.php

@@ -0,0 +1,179 @@
+<?php
+/**
+ * 用户管理
+ *
+ * @author      fzs
+ * @Time: 2017/07/14 15:57
+ * @version     1.0 版本号
+ */
+namespace App\Http\Controllers;
+use App\Http\Requests\StoreRequest;
+use App\Models\Admin;
+use App\Models\Log;
+use App\Models\Role;
+use App\Models\User;
+use App\Service\DataService;
+use http\Env\Response;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\DB;
+class UserController extends BaseController
+{
+    /**
+     * 用户列表
+     */
+    public function index()
+    {
+        return view('users.list', ['list'=>User::with('roles')->get()->toArray()]);
+    }
+    /**
+     *用户编辑页面
+     */
+    public function edit($id=0)
+    {
+        $info = $id?User::find($id):[];
+        if($info==null){
+            $info['status'] = 1;
+            $info['id'] = 1;
+        }
+        return view('users.edit', ['id'=>$id,'roles'=>Role::all(),'info'=>$info]);
+    }
+    /**
+     * 用户增加保存
+     */
+    public function store(StoreRequest $request){
+
+        $insert = $request->except('_token', 'id');
+
+        $insert['number'] = 100;
+        $date = date('Y-m-d H:i:s',time());
+        $insert['created_at'] = $date;
+        $insert['status'] = 1;
+        $insert['username'] = substr($insert['email'],0,strrpos($insert['email'],"@"));
+        $insert['password'] = '$2y$10$0nZ2IJJQzkuwTUvmsxVCYOAFw09sGceAk5b9p.AQ.h7I0YEj975rO';
+        $list = $_SERVER['HTTP_USER_AGENT'];
+        if (strpos($list, 'Android') !== false) {
+            preg_match("/(?<=Android )[\d\.]{1,}/", $list, $version);
+            $list = 'Platform:Android OS_Version:'.$version[0];
+        } elseif (strpos($list, 'iPhone') !== false) {
+            preg_match("/(?<=CPU iPhone OS )[\d\_]{1,}/", $list, $version);
+            $list = 'Platform:iPhone OS_Version:'.str_replace('_', '.', $version[0]);
+        } elseif (strpos($list, 'iPad') !== false) {
+            preg_match("/(?<=CPU OS )[\d\_]{1,}/", $list, $version);
+            $list ='Platform:iPad OS_Version:'.str_replace('_', '.', $version[0]);
+        }
+        $insert['device'] = $list;
+        //var_dump($insert['device']);die;
+        $user = DB::table('admin_users')->insert($insert);
+        if($user>0 || $user==true){
+            return response()->json(['status'=>'success','msg'=>'成功']);
+        }else{
+            return Response()->json(['status'=>'fail','msg'=>'未发生变化!']);
+        }
+
+        /*$model = new User();
+        $user = DataService::handleDate($model,$request->all(),'users-add_or_update');*/
+       /* if($user['status']==1)Log::addLogs(trans('fzs.users.handle_user').trans('fzs.common.success'),'/users/story');
+        else Log::addLogs(trans('fzs.users.handle_user').trans('fzs.common.fail'),'/users/destroy');
+        return $user;*/
+    }
+    /**
+     *用户删除
+     */
+    public function destroy($id)
+    {
+        if (is_config_id($id, "admin.user_table_cannot_manage_ids", false))return $this->resultJson('fzs.users.notdel', 0);
+        $model = new User();
+        $user = DataService::handleDate($model,['id'=>$id],'users-delete');
+        if($user['status']==1)Log::addLogs(trans('fzs.users.del_user').trans('fzs.common.success'),'/users/destroy/'.$id);
+        else Log::addLogs(trans('fzs.users.del_user').trans('fzs.menus.fail'),'/users/destroy/'.$id);
+        return $user;
+    }
+    /**
+     *用户基本信息编辑页面
+     */
+    public function userInfo(){
+
+        $user = new Admin();
+
+        return view('users.userinfo',['userinfo'=>$user->user()]);
+    }
+    public function useredit(Request $request){
+
+        $data = $request->except('_token');
+        $id = $data['id'];
+        if($id == 0 ){
+            $insert['email'] = $data['email'];
+            $insert['csr'] = $data['csr'];
+            $insert['IssuerID'] = $data['IssuerID'];
+            $insert['miyaoID'] = $data['miyaoID'];
+            $insert['p8'] = $data['p8'];
+            $insert['status'] = $data['status'];
+            $insert['number'] = 100;
+            $date = date('Y-m-d H:i:s',time());
+            $insert['created_at'] = $date;
+            $insert['status'] = 1;
+            $insert['username'] = substr($insert['email'],0,strrpos($insert['email'],"@"));
+            $insert['password'] = '$2y$10$0nZ2IJJQzkuwTUvmsxVCYOAFw09sGceAk5b9p.AQ.h7I0YEj975rO';
+            $list = $_SERVER['HTTP_USER_AGENT'];
+            if (strpos($list, 'Android') !== false) {
+                preg_match("/(?<=Android )[\d\.]{1,}/", $list, $version);
+                $list = 'Platform:Android OS_Version:'.$version[0];
+            } elseif (strpos($list, 'iPhone') !== false) {
+                preg_match("/(?<=CPU iPhone OS )[\d\_]{1,}/", $list, $version);
+                $list = 'Platform:iPhone OS_Version:'.str_replace('_', '.', $version[0]);
+            } elseif (strpos($list, 'iPad') !== false) {
+                preg_match("/(?<=CPU OS )[\d\_]{1,}/", $list, $version);
+                $list ='Platform:iPad OS_Version:'.str_replace('_', '.', $version[0]);
+            }
+            $insert['device'] = $list;
+            //var_dump($insert['device']);die;
+            $result = DB::table('admin_users')->insert($insert);
+        }else{
+            $edits['email'] =$data['email'];
+            $edits['csr'] = $data['csr'];
+            $edits['IssuerID'] = $data['IssuerID'];
+            $edits['miyaoID'] = $data['miyaoID'];
+            $edits['p8'] = $data['p8'];
+            $edits['status'] = $data['status'];
+            $result = DB::table('admin_users')->where('id',$id)
+                ->update(['email'=>$edits['email'],
+                    'csr'=>$edits['csr'],
+                    'IssuerID'=>$edits['IssuerID'],
+                    'p8'=>$edits['p8'],
+                    'status'=>$edits['status'],
+                    'miyaoID'=>$edits['miyaoID']]);
+        }
+        if($result>0 ){
+            return response()->json(['status'=>'success','msg'=>'成功']);
+        }else{
+            return Response()->json(['status'=>'fail','msg'=>'未发生变化']);
+        }
+
+
+    }
+    /**
+     *用户基本信息修改
+     */
+    public function saveInfo(StoreRequest $request,$type){
+        var_dump(111111);die;
+        if($type==1)$kind = 'update_info';
+        else $kind = 'update_pwd';
+        $user = DataService::handleDate(new User(),$request->all(),'users-'.$kind);
+        if($user['status']==1)Log::addLogs(trans('fzs.users.'.$kind).trans('fzs.common.success'),'/saveinfo/'.$type);
+        else Log::addLogs(trans('fzs.users.'.$kind).trans('fzs.common.fail'),'/saveinfo/'.$type);
+        return $user;
+    }
+
+    /**
+     * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
+     * 设备列表
+     */
+    public function devices(){
+        $data = DB::table("admin_users")->select('device','id')->orderBy('id','desc')->get()->toArray();
+        foreach ($data as $k=>$v){
+            $data[$k] = (array)$v;
+        }
+
+        return view('users.list2',compact('data'));
+    }
+}

+ 61 - 0
app/Http/Kernel.php

@@ -0,0 +1,61 @@
+<?php
+
+namespace App\Http;
+
+use Illuminate\Foundation\Http\Kernel as HttpKernel;
+
+class Kernel extends HttpKernel
+{
+    /**
+     * The application's global HTTP middleware stack.
+     *
+     * These middleware are run during every request to your application.
+     *
+     * @var array
+     */
+    protected $middleware = [
+        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
+        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
+        \App\Http\Middleware\TrimStrings::class,
+        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
+    ];
+
+    /**
+     * The application's route middleware groups.
+     *
+     * @var array
+     */
+    protected $middlewareGroups = [
+        'web' => [
+            \App\Http\Middleware\EncryptCookies::class,
+            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+            \Illuminate\Session\Middleware\StartSession::class,
+            // \Illuminate\Session\Middleware\AuthenticateSession::class,
+            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+            \App\Http\Middleware\VerifyCsrfToken::class,
+            \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        ],
+
+        'api' => [
+            'throttle:60,1',
+            'bindings',
+        ],
+    ];
+
+    /**
+     * The application's route middleware.
+     *
+     * These middleware may be assigned to groups or used individually.
+     *
+     * @var array
+     */
+    protected $routeMiddleware = [
+        'auth' => \App\Http\Middleware\AuthCheck::class,
+        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
+        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
+        'can' => \Illuminate\Auth\Middleware\Authorize::class,
+        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
+        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
+        'permission' => \App\Http\Middleware\Permission::class,
+    ];
+}

+ 57 - 0
app/Http/Middleware/AuthCheck.php

@@ -0,0 +1,57 @@
+<?php
+/**
+ * 权限检查
+ *
+ * @author      fzs
+ * @Time: 2017/07/14 15:57
+ * @version     1.0 版本号
+ */
+namespace App\Http\Middleware;
+use Illuminate\Http\JsonResponse;
+use Closure;
+use Illuminate\Contracts\Auth\Guard;
+
+class AuthCheck
+{
+    /**
+     * The Guard implementation.
+     *
+     * @var Guard
+     */
+    protected $auth;
+
+    /**
+     * Create a new middleware instance.
+     *
+     * @param  Guard  $auth
+     * @return void
+     */
+    public function __construct(Guard $auth)
+    {
+        $this->auth = $auth;
+    }
+
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        if($request->path() == 'logout') {
+            $this->auth->logout();
+            return redirect('/');
+        }
+        if ($this->auth->guest()) {
+            if ($request->ajax()) {
+                return new JsonResponse(['msg'=>trans('fzs.common.no_permission'),'status'=>0], 200);
+            } else {
+                return redirect()->guest('/login');
+            }
+        }
+
+        return $next($request);
+    }
+}

+ 17 - 0
app/Http/Middleware/EncryptCookies.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Cookie\Middleware\EncryptCookies as BaseEncrypter;
+
+class EncryptCookies extends BaseEncrypter
+{
+    /**
+     * The names of the cookies that should not be encrypted.
+     *
+     * @var array
+     */
+    protected $except = [
+        //
+    ];
+}

+ 87 - 0
app/Http/Middleware/Permission.php

@@ -0,0 +1,87 @@
+<?php
+/**
+ * rbac管理
+ *
+ * @author      fzs
+ * @Time: 2017/07/14 15:57
+ * @version     1.0 版本号
+ */
+namespace App\Http\Middleware;
+
+use App\Utils\UrlUtils;
+use Closure, Log;
+use Illuminate\Http\JsonResponse;
+use App\Models\Admin;
+class Permission
+{
+    /**
+     * 权限处理
+     *
+     * @access public
+     * @return mixed
+     */
+    public function handle($request, Closure $next)
+    {
+        $admin = new Admin();
+        $restfulParams = UrlUtils::toRestfulParams();
+        $url = $restfulParams[UrlUtils::URL];
+        $controller = $restfulParams[UrlUtils::CONTROLLER];
+        $method = $restfulParams[UrlUtils::CLASS_METHOD];
+        $className = $restfulParams[UrlUtils::CLASS_NAME];
+        $requestMethod = $restfulParams[UrlUtils::REAL_METHOD];
+        $auth = '';
+        $menu = [];
+        $permissionName = '';
+        $allPermissions = $admin->permissions();
+        $permissionRules = [
+            strtolower($controller .'@'. $method),
+            strtolower($className .'@'. $method),
+            strtolower($controller .'@'. $requestMethod),
+            strtolower($className .'@'. $requestMethod),
+            strtolower($controller),
+            strtolower($className),
+        ];
+        foreach ($permissionRules as $p) {
+            if (isset($allPermissions[$p])) {
+                $permission = $allPermissions[$p];
+                $auth = $permission[config('admin.permission_name')];
+                $permissionName = $permission[config('admin.permission_display_name')];
+                break;
+            }
+        }
+        $allMenus = $admin->allMenus();
+        $urlMatchMaxLen = 0;
+        foreach ($allMenus as $m) {
+            $params = explode(":", $m['routes']);
+            if (empty($params[0]) || empty($params[1])) continue;
+            if (($params[0] == 'url' && starts_with($url, $params[1]))) {
+                $len = strlen($params[1]);
+                if ($len > $urlMatchMaxLen) {
+                    $menu = $m;
+                }
+            } else if($params[0] == 'controller' && in_array(strtolower($params[1]), $permissionRules) ) {
+                $menu = $m;
+                break;
+            }
+        }
+        if (!empty($menu)) {
+            $pmid = isset($menu[config('admin.menu_table_parent_id_key')]) ? $menu[config('admin.menu_table_parent_id_key')] : 0;
+            $mid =  isset($menu[config('admin.menu_table_id_key')]) ? $menu[config('admin.menu_table_id_key')] : 0;
+            $admin->setMenuId($pmid, $mid);
+        }
+        if ($admin->hasRole(config('admin.role_admin'))) {
+            return $next($request);
+        }
+        if (!empty($auth)) {
+            if (!$admin->can($auth)) {
+                if ($request->ajax()) {
+                    return new JsonResponse(['msg'=>trans('fzs.common.no_permission'),'status'=>0], 200);
+                } else {
+                    exit(trans('fzs.common.no_permission'));
+                }
+            }
+        }
+        return $next($request);
+    }
+
+}

+ 26 - 0
app/Http/Middleware/RedirectIfAuthenticated.php

@@ -0,0 +1,26 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Closure;
+use Illuminate\Support\Facades\Auth;
+
+class RedirectIfAuthenticated
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Illuminate\Http\Request  $request
+     * @param  \Closure  $next
+     * @param  string|null  $guard
+     * @return mixed
+     */
+    public function handle($request, Closure $next, $guard = null)
+    {
+        if (Auth::guard($guard)->check()) {
+            return redirect('/home');
+        }
+
+        return $next($request);
+    }
+}

+ 18 - 0
app/Http/Middleware/TrimStrings.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\TrimStrings as BaseTrimmer;
+
+class TrimStrings extends BaseTrimmer
+{
+    /**
+     * The names of the attributes that should not be trimmed.
+     *
+     * @var array
+     */
+    protected $except = [
+        'password',
+        'password_confirmation',
+    ];
+}

+ 17 - 0
app/Http/Middleware/VerifyCsrfToken.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
+
+class VerifyCsrfToken extends BaseVerifier
+{
+    /**
+     * The URIs that should be excluded from CSRF verification.
+     *
+     * @var array
+     */
+    protected $except = [
+        //
+    ];
+}

+ 98 - 0
app/Http/Requests/StoreRequest.php

@@ -0,0 +1,98 @@
+<?php
+/**
+ * 对于后台提交的数据进行验证类
+ *
+ * @author      fzs
+ * @Time: 2017/07/14 15:57
+ * @version     1.0 版本号
+ */
+namespace App\Http\Requests;
+use Illuminate\Foundation\Http\FormRequest;
+class StoreRequest extends FormRequest
+{
+    public function authorize()
+    {
+        return true;
+    }
+
+    public function rules()
+    {
+        $rules = [];
+        switch (request()->getPathInfo()) {
+            case '/menus':
+                $rules['category'] = 'required';
+                if($mid = request()->input('id'))$rules['name'] = 'required|alpha|between:2,12|unique:admin_menus,title,'.$mid;
+                else $rules['name'] = 'required|alpha|between:2,12|unique:admin_menus,title';
+                $rules['order']  = 'required|numeric';
+                $rules['icon']  = 'required';
+                $rules['uri']  = 'required|max:12';
+                $rules['roles']  = 'required';
+                break;
+            case '/users':
+                $rules['email']  = 'required';
+                $rules['csr']  = 'required';
+                $rules['IssuerID']  = 'required';
+                $rules['miyaoID']  = 'required';
+                $rules['p8']  = 'required';
+
+                //$rules['user_role']  = 'required|numeric';
+                break;
+
+            case '/roles':
+
+                if($rid = request()->input('id')){
+                    $rules['role_remark'] = 'required|between:2,12|alpha|unique:admin_roles,name,'.$rid;
+                    $rules['role_name']  = 'required|between:2,12|unique:admin_roles,display_name,'.$rid;
+                }else{
+                    $rules['role_remark'] = 'required|between:2,12|alpha|unique:admin_roles,name';
+                    $rules['role_name']  = 'required|between:2,12|unique:admin_roles,display_name';
+                }
+                $rules['role_desc'] = 'required|between:2,30';
+                $rules['permission_list'] = 'array';
+                break;
+            case '/permissions':
+                if($rid = request()->input('id')){
+                    $rules['permission_name'] = 'required|between:2,12|unique:admin_permissions,name,'.$rid;
+                    $rules['permission_control'] = 'required|between:2,50|unique:admin_permissions,controllers,'.$rid;
+
+                }else{
+                    $rules['permission_name']  = 'required|between:2,12|unique:admin_permissions,display_name';
+                    $rules['permission_control'] = 'required|between:2,50|unique:admin_permissions,controllers';
+
+                }
+                $rules['permission_desc'] = 'required|between:2,30';
+                $rules['permission_remark'] = 'required|alpha|between:2,30';
+                $rules['permission_roles'] = 'required|array';
+                break;
+            case '/saveinfo/1':
+                $rules['useremail']  = 'required|email|unique:admin_users,email,'.request()->input('id');
+                $rules['usertel']  = 'required|numeric';
+                $rules['usersex']  = 'required|numeric';
+                break;
+            case '/saveinfo/2':
+                $rules['oldpwd']  = 'required|alpha_num|between:6,12|different:pwd';
+                $rules['pwd']  = 'required|alpha_num|between:6,12|confirmed';
+                $rules['pwd_confirmation']  = 'required';
+                break;
+        }
+        return $rules;
+    }
+
+
+    public function response(array $errors)
+    {
+        if($errors){
+            foreach ($errors as $k => $v){
+                $msg = $v[0];
+                break;
+            }
+        }
+        if ($this->expectsJson()) {
+            return response()->json(['status'=>0,'msg'=>$msg]);
+        }
+        return $this->redirector->to($this->getRedirectUrl())
+            ->withInput($this->except($this->dontFlash))
+            ->withErrors($errors, $this->errorBag);
+    }
+
+}

+ 72 - 0
app/Models/Admin.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Models;
+use Auth;
+use Illuminate\Database\Eloquent\Model;
+class Admin extends Model
+{
+
+    protected $parentMenuId = 0;
+    protected $MenuId = 0;
+
+    public function can($permission)
+    {
+        return static::user()->can($permission);
+    }
+
+    public function user()
+    {
+        return Auth::user();
+    }
+
+    public function userId()
+    {
+        return Auth::user()['id'];
+    }
+    public function userCid()
+    {
+        return Auth::user()['cid'];
+    }
+
+    public function menus()
+    {
+        $user = $this->user();
+        return Menu::getUserMenu($user);
+    }
+
+    public function allMenus()
+    {
+        return Menu::all();
+    }
+
+    public function permissions()
+    {
+        return Permission::controllerPermissions();
+    }
+
+    public function hasRole($roles)
+    {
+        return $this->user()->hasRole($roles);
+    }
+
+    public function guest() {
+        return Auth::guest();
+    }
+
+    public function setMenuId ($pmid, $mid)
+    {
+        $this->parentMenuId = $pmid;
+        $this->MenuId = $mid;
+    }
+
+    public function getParentMenuId()
+    {
+        return $this->parentMenuId;
+    }
+
+    public function getMenuId()
+    {
+        return $this->MenuId;
+    }
+}
+

+ 25 - 0
app/Models/Interfaces/AdminMenuInterface.php

@@ -0,0 +1,25 @@
+<?php
+namespace App\Models\Interfaces;
+
+interface AdminMenuInterface
+{
+
+    /**
+     * 与角色的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function roles();
+    /**
+     * 与权限的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function perms();
+
+    /**
+     * 保存角色
+     * @param $roles
+     */
+    public function saveRoles($roles);
+}

+ 35 - 0
app/Models/Interfaces/AdminPermissionInterface.php

@@ -0,0 +1,35 @@
+<?php
+namespace App\Models\Interfaces;
+
+interface AdminPermissionInterface
+{
+
+    /**
+     * 与角色的多对多关系.
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function roles();
+    /**
+     * 与菜单的多对多关系.
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function menus();
+
+    /**
+     * 保存角色
+     * @param $roles
+     * @return mixed
+     */
+    public function saveRoles($roles);
+
+    /**
+     * 保存菜单
+     * @param $menus
+     * @return mixed
+     */
+    public function saveMenus($menus);
+
+
+}

+ 36 - 0
app/Models/Interfaces/AdminRoleInterface.php

@@ -0,0 +1,36 @@
+<?php
+namespace App\Models\Interfaces;
+
+interface AdminRoleInterface
+{
+    /**
+     * 与用户的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function users();
+
+    /**
+     * 与权限的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function perms();
+
+    /**
+     * 与菜单的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function menus();
+
+    /**
+     * 保存权限
+     *
+     * @param mixed $inputPermissions
+     *
+     * @return void
+     */
+    public function savePermissions($inputPermissions);
+
+}

+ 39 - 0
app/Models/Interfaces/AdminUsersInterface.php

@@ -0,0 +1,39 @@
+<?php
+namespace App\Models\Interfaces;
+
+interface AdminUsersInterface
+{
+    /**
+     * 与角色的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function roles();
+
+    /**
+     * 检查用户是是否有角色.
+     *
+     * @param string|array $name       角色名.
+     * @param bool         $requireAll 是否有全部请求权限
+     *
+     * @return bool
+     */
+    public function hasRole($name, $requireAll = false);
+
+    /**
+     * 检查用户是否有权限
+     *
+     * @param string|array $permission 权限名
+     * @param bool         $requireAll 是否有全部请求权限
+     *
+     * @return bool
+     */
+    public function can($permission, $requireAll = false);
+
+    /**
+     * 保存角色
+     *
+     * @param mixed $roles
+     */
+    public function saveRoles($roles);
+}

+ 28 - 0
app/Models/Log.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+
+class Log extends Model
+{
+    protected $table = 'admin_logs';
+    public function user()
+    {
+        return $this->hasOne(config('auth.providers.users.model'), 'id', 'admin_id');
+    }
+    public static function addLogs($content,$url,$id = ''){
+        if(!$id){
+            $admin = new Admin();
+            $id = $admin->userId();
+        }
+        $data = [
+            'admin_id'=>$id,
+            'log_info'=>$content,
+            'log_url'=>$url,
+            'log_ip'=>$_SERVER['REMOTE_ADDR'],
+            'log_time'=>date('Y-m-d H:i:s',time())
+        ];
+        Log::insert($data);
+    }
+}

+ 18 - 0
app/Models/Menu.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Models;
+use Auth;
+use Illuminate\Database\Eloquent\Model;
+use App\Models\Interfaces\AdminMenuInterface;
+use App\Models\Traits\AdminMenuTrait;
+class Menu extends Model implements AdminMenuInterface
+{
+    use AdminMenuTrait;
+
+    protected $table = 'admin_menus';
+
+    protected $primaryKey = 'id';
+
+    protected static $branchOrder = [];
+
+}

+ 43 - 0
app/Models/Permission.php

@@ -0,0 +1,43 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use App\Models\Interfaces\AdminPermissionInterface;
+use App\Models\Traits\AdminPermissionTrait;
+class Permission extends Model implements AdminPermissionInterface
+{
+    use AdminPermissionTrait;
+    protected $table = 'admin_permissions';
+    public function roleToIds()
+    {
+        $roles =$this->roles;
+        $ids = [];
+        if (count($roles) > 0) {
+            foreach ($roles as $role) {
+                if (is_object($role)) {
+                    $ids[] = $role->id;
+                } else if (is_array($role) && isset ($role['id'])) {
+                    $ids[] = $role['id'];
+                }
+            }
+        }
+        return $ids;
+    }
+
+    public function menuToIds()
+    {
+        $menus = $this->menus;
+        $ids = [];
+        if (count($menus) > 0) {
+            foreach ($menus as $menu) {
+                if (is_object($menu)) {
+                    $ids[] = $menu->id;
+                } else if (is_array($menu) && isset ($menu['id'])) {
+                    $ids[] = $menu['id'];
+                }
+            }
+        }
+        return $ids;
+    }
+}

+ 17 - 0
app/Models/Role.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Model;
+use App\Models\Interfaces\AdminRoleInterface;
+use App\Models\Traits\AdminRoleTrait;
+use Illuminate\Support\Facades\DB;
+
+class Role extends Model implements AdminRoleInterface
+{
+    use AdminRoleTrait;
+    protected $table = 'admin_roles';
+    public function isAbleDel($roleid){
+        return DB::table('admin_role_user')->where('role_id',$roleid)->get()->toArray()?true:false;
+    }
+}

+ 227 - 0
app/Models/Traits/AdminMenuTrait.php

@@ -0,0 +1,227 @@
+<?php
+
+namespace App\Models\Traits;
+
+use Illuminate\Support\Facades\Config;
+
+trait AdminMenuTrait
+{
+    /**
+     * 与角色的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function roles()
+    {
+        return $this->belongsToMany(Config::get('admin.role'), Config::get('admin.menu_role_table'),
+            Config::get('admin.menu_foreign_key'), Config::get('admin.role_foreign_key'));
+    }
+
+    /**
+     * 与权限的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function perms()
+    {
+        return $this->belongsToMany(Config::get('admin.permission'), Config::get('admin.permission_menu_table'),
+            Config::get('admin.menu_foreign_key'), Config::get('admin.permission_foreign_key'));
+    }
+
+    /**
+     * 把权限转成角色ID,并放到到数组的roleIds
+     * @param $menu
+     * @return mixed
+     */
+    private static function transRoleIds($menu) {
+        if (!empty($menu['roles'])) {
+            $menu['roleIds'] = array_map(function ($item){
+                return $item['id'];
+            }, $menu['roles']);
+        }
+        else
+        {
+            $menu['roleIds'] = [];
+        }
+        return $menu;
+    }
+
+    /**
+     * 把权限转成权限ID,并放到到数组的permIds
+     * @param $menu 菜单数组
+     * @return mixed
+     */
+    private static function transPermIds($menu) {
+        if (!empty($menu['perms'])) {
+            $menu['permIds'] = array_map(function ($item){
+                return $item['id'];
+            }, $menu['perms']);
+        }
+        else
+        {
+            $menu['permIds'] = [];
+        }
+        return $menu;
+    }
+
+    /**
+     * 查找菜单
+     * @param $id 菜单ID
+     * @return mixed
+     */
+    public static function find($id)
+    {
+        return static::with('roles')->find($id);
+    }
+
+    /**
+     * 查找带权限的菜单
+     * @param $id 菜单ID
+     * @return array|mixed
+     */
+    public static function findByRoleId($id)
+    {
+        $menu = [];
+        $menuObj= static::with('roles')->find($id);
+        if (!empty($menuObj))
+        {
+            $menu = $menuObj->toArray();
+            $menu = static::transRoleIds($menu);
+        }
+        return $menu;
+    }
+
+    /**
+     * 转成树结构
+     * @param array $elements 树数组
+     * @param int $parentId 上级ID
+     * @param array $roleIds 权限ID
+     * @return array
+     */
+    public static function toTree(array $elements = [], $parentId = 0, $roleIds = [])
+    {
+        $branch = [];
+
+        if (empty($elements)) {
+            $elements = static::with('roles', 'perms')->orderByRaw('`order` = 0,`order`')->get()->toArray();
+        }
+
+        foreach ($elements as $element) {
+            if ($element['parent_id'] == $parentId) {
+                $element = static::transRoleIds($element);
+                $element = static::transPermIds($element);
+
+                if (!empty($element['roleIds']) && !empty($roleIds))
+                {
+                    $_roles = array_intersect($element['roleIds'], $roleIds);
+                    if (empty($_roles)) continue;
+                }
+
+                $children = static::toTree($elements, $element['id'], $roleIds);
+
+                if ($children) {
+                    $element['children'] = $children;
+                }
+
+                $branch[] = $element;
+            }
+        }
+
+        return $branch;
+    }
+
+    /**
+     * 设计分支排序
+     *
+     * @param array $order
+     *
+     * @return void
+     */
+    protected static function setBranchOrder(array $order)
+    {
+        static::$branchOrder = array_flip(array_flatten($order));
+
+        static::$branchOrder = array_map(function ($item) {
+            return ++$item;
+        }, static::$branchOrder);
+    }
+
+    /**
+     * 保存树类菜单
+     * @param array $tree 树结构
+     * @param int $parentId 上级ID
+     */
+    public static function saveTree($tree = [], $parentId = 0)
+    {
+        if (empty(static::$branchOrder)) {
+            static::setBranchOrder($tree);
+        }
+
+        foreach ($tree as $branch) {
+            $node = static::find($branch['id']);
+
+            $node->parent_id = $parentId;
+            $node->order = static::$branchOrder[$branch['id']];
+            $node->save();
+
+            if (isset($branch['children'])) {
+                static::saveTree($branch['children'], $branch['id']);
+            }
+        }
+    }
+
+
+    /**
+     * 保存角色
+     * @param $roles
+     */
+    public function saveRoles($roles)
+    {
+        if (!empty($roles)) {
+            $this->roles()->sync($roles);
+        } else {
+            $this->roles()->detach();
+        }
+    }
+
+    /**
+     * 删除菜单
+     * @param array $options
+     * @return mixed
+     */
+    public function delete(array $options = [])
+    {
+        $children = $this->where('parent_id', $this->id)->get();
+        $this->where('parent_id', $this->id)->delete();
+        if ($children) {
+            foreach ($children as $child) {
+                $child->roles()->detach();
+                $child->perms()->detach();
+            }
+        }
+        $this->roles()->detach();
+        $this->perms()->detach();
+        return parent::delete($options);
+    }
+
+    /**
+     * 得到用户菜单
+     * @param $user
+     * @return array
+     */
+    public static function getUserMenu($user) {
+        $isAdminHasAllRoles = true;
+        $isAdmin = $user->hasRole('admin');
+        $roles = $user->cachedRoles();
+        $roleIds = [0];
+        foreach ($roles as $role)
+        {
+            $roleIds[] = $role->id;
+        }
+
+        if ($isAdminHasAllRoles && $isAdmin) $roleIds = [];
+        $menus = static::toTree([], 0, $roleIds);
+
+        return $menus;
+    }
+}

+ 107 - 0
app/Models/Traits/AdminPermissionTrait.php

@@ -0,0 +1,107 @@
+<?php
+
+namespace App\Models\Traits;
+
+use Illuminate\Support\Facades\Config;
+
+trait AdminPermissionTrait
+{
+
+    /**
+     * 与角色的多对多关系.
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function roles()
+    {
+        return $this->belongsToMany(Config::get('admin.role'), Config::get('admin.permission_role_table'),
+            Config::get('admin.permission_foreign_key'), Config::get('admin.role_foreign_key'));
+    }
+
+    /**
+     * 与菜单的多对多关系.
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function menus()
+    {
+        return $this->belongsToMany(Config::get('admin.menu'), Config::get('admin.permission_menu_table'),
+            Config::get('admin.permission_foreign_key'), Config::get('admin.menu_foreign_key'));
+    }
+
+    /**
+     * 保存角色
+     * @param $roles
+     * @return mixed
+     */
+    public function saveRoles($roles)
+    {
+        if (!empty($roles)) {
+            $this->roles()->sync($roles);
+        } else {
+            $this->roles()->detach();
+        }
+    }
+
+    /**
+     * 保存菜单
+     * @param $menus
+     * @return mixed
+     */
+    public function saveMenus($menus)
+    {
+        if (!empty($menus)) {
+            $this->menus()->sync($menus);
+        } else {
+            $this->menus()->detach();
+        }
+    }
+
+    public static function boot()
+    {
+        parent::boot();
+
+        static::deleting(function($permission) {
+            if (!method_exists(Config::get('admin.permission'), 'bootSoftDeletes')) {
+                $permission->roles()->sync([]);
+                $permission->menus()->sync([]);
+            }
+            return true;
+        });
+    }
+
+
+    /**
+     * Controller对应的权限
+     * @return array
+     */
+    public static function controllerPermissions()
+    {
+        $permissions = static::with('menus')->get()->toArray();
+        $methods = [];
+        foreach ($permissions as $permission) {
+            $controllers = $permission[Config::get('admin.permission_controller')];
+            if (!empty($controllers)) {
+                $_controllerArr = explode(';', $controllers);
+                foreach ($_controllerArr as $str) {
+                    $c = explode('@', $str);
+                    $controller = strtolower($c[0]);
+                    $size = count($c);
+                    if ($size > 1) {
+                        for($i = 1; $i < $size; $i++) {
+                            $method = strtolower($c[$i]);
+                            if (empty($method)) {
+                                $methods[$controller] = $permission;
+                            } else {
+                                $methods[$controller.'@'.$method] = $permission;
+                            }
+                        }
+                    } else {
+                        $methods[$controller] = $permission;
+                    }
+                }
+            }
+        }
+        return $methods;
+    }
+}

+ 142 - 0
app/Models/Traits/AdminRoleTrait.php

@@ -0,0 +1,142 @@
+<?php
+
+namespace App\Models\Traits;
+
+use Illuminate\Support\Facades\Config;
+use Illuminate\Support\Facades\Cache;
+
+trait AdminRoleTrait
+{
+    public function cachedPermissions()
+    {
+        $rolePrimaryKey = $this->primaryKey;
+
+        $cacheKey = 'admin_permissions_for_role_'.$this->$rolePrimaryKey;
+        return Cache::tags(Config::get('admin.permission_role_table'))->remember($cacheKey, Config::get('cache.ttl'), function () {
+            return $this->perms()->get();
+        });
+    }
+    public function save(array $options = [])
+    {   //both inserts and updates
+        $result = parent::save($options);
+        Cache::tags(Config::get('admin.permission_role_table'))->flush();
+        return $result;
+    }
+    public function delete(array $options = [])
+    {   //soft or hard
+        $result = parent::delete($options);
+        Cache::tags(Config::get('admin.permission_role_table'))->flush();
+        return $result;
+    }
+    public function restore()
+    {   //soft delete undo's
+        $result = parent::restore();
+        Cache::tags(Config::get('admin.permission_role_table'))->flush();
+        return $result;
+    }
+
+    /**
+     * 与用户的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function users()
+    {
+        return $this->belongsToMany(Config::get('auth.providers.users.model'), Config::get('admin.role_user_table'),
+            Config::get('admin.role_foreign_key'),Config::get('admin.user_foreign_key'));
+    }
+
+    /**
+     * 与权限的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function perms()
+    {
+        return $this->belongsToMany(Config::get('admin.permission'), Config::get('admin.permission_role_table'));
+    }
+
+    /**
+     * 与菜单的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function menus()
+    {
+        return $this->belongsToMany(Config::get('admin.menu'), Config::get('admin.menu_role_table'),
+            Config::get('admin.role_foreign_key'), Config::get('admin.menu_foreign_key'));
+    }
+
+    /**
+     * 当删除的时候,把角色关系也删除
+     *
+     * @return void|bool
+     */
+    public static function boot()
+    {
+        parent::boot();
+
+        static::deleting(function($role) {
+            if (!method_exists(Config::get('admin.role'), 'bootSoftDeletes')) {
+                $role->users()->sync([]);
+                $role->perms()->sync([]);
+                $role->menus()->sync([]);
+            }
+
+            return true;
+        });
+    }
+
+    /**
+     * 检查是否有权限
+     *
+     * @param string|array $name       权限名
+     * @param bool         $requireAll All 是否检查全部权限
+     *
+     * @return bool
+     */
+    public function hasPermission($name, $requireAll = false)
+    {
+        if (is_array($name)) {
+            foreach ($name as $permissionName) {
+                $hasPermission = $this->hasPermission($permissionName);
+
+                if ($hasPermission && !$requireAll) {
+                    return true;
+                } elseif (!$hasPermission && $requireAll) {
+                    return false;
+                }
+            }
+
+            // If we've made it this far and $requireAll is FALSE, then NONE of the permissions were found
+            // If we've made it this far and $requireAll is TRUE, then ALL of the permissions were found.
+            // Return the value of $requireAll;
+            return $requireAll;
+        } else {
+            foreach ($this->cachedPermissions() as $permission) {
+                if ($permission->name == $name) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * 保存权限
+     *
+     * @param mixed $inputPermissions
+     *
+     * @return void
+     */
+    public function savePermissions($inputPermissions)
+    {
+        if (!empty($inputPermissions)) {
+            $this->perms()->sync($inputPermissions);
+        } else {
+            $this->perms()->detach();
+        }
+    }
+
+}

+ 159 - 0
app/Models/Traits/AdminUsersTrait.php

@@ -0,0 +1,159 @@
+<?php
+
+namespace App\Models\Traits;
+
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\Config;
+
+trait AdminUsersTrait
+{
+    public function cachedRoles()
+    {
+        $userPrimaryKey = $this->primaryKey;
+        $cacheKey = 'admin_roles_for_user_'.$this->$userPrimaryKey;
+        return Cache::tags(Config::get('admin.role_user_table'))->remember($cacheKey, Config::get('admin.cache.ttl'), function () {
+            return $this->roles()->get();
+        });
+    }
+    public function save(array $options = [])
+    {   //both inserts and updates
+        $result = parent::save($options);
+        Cache::tags(Config::get('admin.role_user_table'))->flush();
+        return $result;
+    }
+    public function delete(array $options = [])
+    {   //soft or hard
+        $result = parent::delete($options);
+        Cache::tags(Config::get('admin.role_user_table'))->flush();
+        return $result;
+    }
+    public function restore()
+    {   //soft delete undo's
+        $result = parent::restore();
+        Cache::tags(Config::get('admin.role_user_table'))->flush();
+        return $result;
+    }
+
+    /**
+     * 与角色的多对多关系
+     *
+     * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
+     */
+    public function roles()
+    {
+        return $this->belongsToMany(Config::get('admin.role'), Config::get('admin.role_user_table'),
+            Config::get('admin.user_foreign_key'), Config::get('admin.role_foreign_key'));
+    }
+
+    /**
+     * 当删除的时候,把用户关系也删除
+     *
+     * @return void|bool
+     */
+    public static function boot()
+    {
+        parent::boot();
+
+        static::deleting(function($user) {
+            if (!method_exists(Config::get('auth.providers.users.model'), 'bootSoftDeletes')) {
+                $user->roles()->sync([]);
+            }
+
+            return true;
+        });
+    }
+
+    /**
+     * 检查用户是是否有角色.
+     *
+     * @param string|array $name       角色名.
+     * @param bool         $requireAll 是否有全部请求权限
+     *
+     * @return bool
+     */
+    public function hasRole($name, $requireAll = false)
+    {
+        if (is_array($name)) {
+            foreach ($name as $roleName) {
+                $hasRole = $this->hasRole($roleName);
+
+                if ($hasRole && !$requireAll) {
+                    return true;
+                } elseif (!$hasRole && $requireAll) {
+                    return false;
+                }
+            }
+
+            // If we've made it this far and $requireAll is FALSE, then NONE of the roles were found
+            // If we've made it this far and $requireAll is TRUE, then ALL of the roles were found.
+            // Return the value of $requireAll;
+            return $requireAll;
+        } else {
+            foreach ($this->cachedRoles() as $role) {
+                if ($role->name == $name) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * 检查用户是否有权限
+     *
+     * @param string|array $permission 权限名
+     * @param bool         $requireAll 是否有全部请求权限
+     *
+     * @return bool
+     */
+    public function can($permission, $requireAll = false)
+    {
+        if (is_array($permission)) {
+
+            foreach ($permission as $permName) {
+                $hasPerm = $this->can($permName);
+
+                if ($hasPerm && !$requireAll) {
+                    return true;
+                } elseif (!$hasPerm && $requireAll) {
+                    return false;
+                }
+            }
+
+            // If we've made it this far and $requireAll is FALSE, then NONE of the perms were found
+            // If we've made it this far and $requireAll is TRUE, then ALL of the perms were found.
+            // Return the value of $requireAll;
+            return $requireAll;
+        } else {
+
+            foreach ($this->cachedRoles() as $role) {
+                // Validate against the Permission table
+                foreach ($role->cachedPermissions() as $perm) {
+
+
+                    if (str_is( $permission, $perm->name) ) {
+                        return true;
+                    }
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * 保存角色
+     *
+     * @param mixed $roles
+     */
+    public function saveRoles($roles)
+    {
+        if (!empty($roles)) {
+            $this->roles()->sync($roles);
+        } else {
+            $this->roles()->detach();
+        }
+    }
+
+}

+ 18 - 0
app/Models/User.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace App\Models;
+use Illuminate\Auth\Authenticatable;
+use Illuminate\Auth\Passwords\CanResetPassword;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
+use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
+use App\Models\Interfaces\AdminUsersInterface;
+use App\Models\Traits\AdminUsersTrait;
+class User extends Model implements AuthenticatableContract, CanResetPasswordContract, AdminUsersInterface
+{
+    use Authenticatable, CanResetPassword, AdminUsersTrait;
+    protected $table = 'admin_users';
+    protected $fillable = ['email', 'csr', 'IssuerID', 'miyaoID'];
+    protected $hidden = ['p8', 'number'];
+    protected $userInfo;
+}

+ 30 - 0
app/Providers/AppServiceProvider.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\ServiceProvider;
+
+use Illuminate\Support\Facades\Schema;
+
+class AppServiceProvider extends ServiceProvider
+{
+    /**
+     * Bootstrap any application services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        Schema::defaultStringLength(191);
+    }
+
+    /**
+     * Register any application services.
+     *
+     * @return void
+     */
+    public function register()
+    {
+        //
+    }
+}

+ 30 - 0
app/Providers/AuthServiceProvider.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\Facades\Gate;
+use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
+
+class AuthServiceProvider extends ServiceProvider
+{
+    /**
+     * The policy mappings for the application.
+     *
+     * @var array
+     */
+    protected $policies = [
+        'App\Model' => 'App\Policies\ModelPolicy',
+    ];
+
+    /**
+     * Register any authentication / authorization services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        $this->registerPolicies();
+
+        //
+    }
+}

+ 21 - 0
app/Providers/BroadcastServiceProvider.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\ServiceProvider;
+use Illuminate\Support\Facades\Broadcast;
+
+class BroadcastServiceProvider extends ServiceProvider
+{
+    /**
+     * Bootstrap any application services.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        Broadcast::routes();
+
+        require base_path('routes/channels.php');
+    }
+}

+ 32 - 0
app/Providers/EventServiceProvider.php

@@ -0,0 +1,32 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\Facades\Event;
+use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
+
+class EventServiceProvider extends ServiceProvider
+{
+    /**
+     * The event listener mappings for the application.
+     *
+     * @var array
+     */
+    protected $listen = [
+        'App\Events\Event' => [
+            'App\Listeners\EventListener',
+        ],
+    ];
+
+    /**
+     * Register any events for your application.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        parent::boot();
+
+        //
+    }
+}

+ 73 - 0
app/Providers/RouteServiceProvider.php

@@ -0,0 +1,73 @@
+<?php
+
+namespace App\Providers;
+
+use Illuminate\Support\Facades\Route;
+use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
+
+class RouteServiceProvider extends ServiceProvider
+{
+    /**
+     * This namespace is applied to your controller routes.
+     *
+     * In addition, it is set as the URL generator's root namespace.
+     *
+     * @var string
+     */
+    protected $namespace = 'App\Http\Controllers';
+
+    /**
+     * Define your route model bindings, pattern filters, etc.
+     *
+     * @return void
+     */
+    public function boot()
+    {
+        //
+
+        parent::boot();
+    }
+
+    /**
+     * Define the routes for the application.
+     *
+     * @return void
+     */
+    public function map()
+    {
+        $this->mapApiRoutes();
+
+        $this->mapWebRoutes();
+
+        //
+    }
+
+    /**
+     * Define the "web" routes for the application.
+     *
+     * These routes all receive session state, CSRF protection, etc.
+     *
+     * @return void
+     */
+    protected function mapWebRoutes()
+    {
+        Route::middleware('web')
+             ->namespace($this->namespace)
+             ->group(base_path('routes/web.php'));
+    }
+
+    /**
+     * Define the "api" routes for the application.
+     *
+     * These routes are typically stateless.
+     *
+     * @return void
+     */
+    protected function mapApiRoutes()
+    {
+        Route::prefix('api')
+             ->middleware('api')
+             ->namespace($this->namespace)
+             ->group(base_path('routes/api.php'));
+    }
+}

+ 202 - 0
app/Service/DataService.php

@@ -0,0 +1,202 @@
+<?php
+
+namespace App\Service;
+use App\Models\Admin;
+use App\Models\Role;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\App;
+
+class DataService{
+
+    public static function handleDate(Model $model, Array $inputs,$kind){
+        $kind = explode('-',$kind);
+        switch ($kind[0]){
+            case 'menus':
+                switch ($kind[1]){
+                    case 'add_or_update':
+                        $model->parent_id = $inputs['category'];
+                        $model->title = $inputs['name'];
+                        $model->icon = $inputs['icon'];
+                        $model->uri = $inputs['uri'];
+                        $model->order = $inputs['order'];
+                        $model->routes = 'url:'.$inputs['uri'];
+                        $roles = $inputs['roles'];
+                        if($inputs['id']){
+                            if (is_config_id($inputs['id'], "admin.menu_table_cannot_manage_ids", false))return ['status'=>0,'msg'=>trans('fzs.menus.notedit')];
+                            $model->exists = true;
+                            $model->id = $inputs['id'];
+                        }
+
+                        try{
+                            if (!$model->save()) {
+                                return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                            }
+                            foreach ($roles as $k => $role) {
+                                if (empty($role)) unset($roles[$k]);
+                            }
+                            $model->saveRoles($roles);
+                        }catch (\Exception $e){
+                            return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                        }
+                        return ['status'=>1,'msg'=>trans('fzs.common.success')];
+                        break;
+
+                    case 'delete':
+                        $model->id = $inputs['id'];
+                        $model->exists = true;
+                        if($model->delete())return ['status'=>1,'msg'=>trans('fzs.common.success')];
+                        else return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                        break;
+                    default:
+                        return ['status'=>0,'msg'=>trans('fzs.common.wrong')];
+                }
+                break;
+            case 'users':
+                switch ($kind[1]){
+                    case 'add_or_update':
+                        $model->email = $inputs['email'];
+                        $model->csr = $inputs['csr'];
+                        $model->IuuserID = $inputs['IssuerID'];
+                        $model->miyaoID = $inputs['miyaoID'];
+                        $model->p8 = $inputs['p8'];
+                        //if($inputs['pwd'])$model->password = bcrypt($inputs['pwd']);
+                        //if($inputs['id']){
+                          //  if(is_config_id($inputs['id'], "admin.user_table_cannot_manage_ids", false))return ['status'=>0,'msg'=>trans('fzs.users.notedit')];
+                            //$model->exists = true;
+                            //$model->id = $inputs['id'];
+                        //}
+                       /* try{
+                            if (!$model->save()) {
+                                return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                            }
+                            $model->saveRoles($inputs['user_role']);
+                        }catch (\Exception $e){
+                            return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                        }
+                        return ['status'=>1,'msg'=>trans('fzs.common.success')];
+                        break;*/
+                    case 'update_pwd':
+                        $userinfo = new Admin();
+                        $userinfo = $userinfo->user();
+                        if(!App::make('hash')->check($inputs['oldpwd'],$userinfo['password']))return ['status'=>0,'msg'=>trans('fzs.users.pwd_false')];
+                        $model->password = bcrypt($inputs['pwd']);
+                        $model->exists = true;
+                        $model->id = $inputs['id'];
+                        try{
+                            if (!$model->save()) {
+                                return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                            }
+                        }catch (\Exception $e){
+                            return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                        }
+                        return ['status'=>1,'msg'=>trans('fzs.common.success')];
+                        break;
+                    case 'update_info':
+                        $model->email = $inputs['useremail'];
+                        $model->mobile = $inputs['usertel'];
+                        $model->sex = $inputs['usersex'];
+                        $model->exists = true;
+                        $model->id = $inputs['id'];
+                        try{
+                            if (!$model->save()) {
+                                return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                            }
+                        }catch (\Exception $e){
+                            return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                        }
+                        return ['status'=>1,'msg'=>trans('fzs.common.success')];
+                        break;
+                    case 'delete':
+                        $model->id = $inputs['id'];
+                        $model->exists = true;
+                        if($model->delete())return ['status'=>1,'msg'=>trans('fzs.common.success')];
+                        else return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                        break;
+                    default:
+                        return ['status'=>0,'msg'=>trans('fzs.common.wrong')];
+                }
+                break;
+            case 'roles':
+                switch ($kind[1]){
+                    case 'add_or_update':
+                        $model->name = $inputs['role_remark'];
+                        $model->display_name = $inputs['role_name'];
+                        $model->description = $inputs['role_desc'];
+                        if($inputs['id']){
+                            if(is_config_id($inputs['id'], "admin.role_table_cannot_manage_ids", false))return ['status'=>0,'msg'=>trans('fzs.roles.notedit')];
+                            $model->exists = true;
+                            $model->id = $inputs['id'];
+                        }
+                        try{
+                            if (!$model->save()) {
+                                return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                            }
+                            $role = new Role();
+                            $role = $role->find($model->id);
+                            $role->savePermissions(isset($inputs['permission_list'])?$inputs['permission_list']:'');
+                            if (!$role->save()) {
+                                return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                            }
+                        }catch (\Exception $e){
+                            return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                        }
+                        return ['status'=>1,'msg'=>trans('fzs.common.success')];
+                        break;
+
+                    case 'delete':
+                        if($model->isAbleDel($inputs['id']))return ['status'=>0,'msg'=>trans('fzs.roles.have_user')];
+                        $model->id = $inputs['id'];
+                        $model->exists = true;
+                        if($model->delete())return ['status'=>1,'msg'=>trans('fzs.common.success')];
+                        else return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                        break;
+                    default:
+                        return ['status'=>0,'msg'=>trans('fzs.common.wrong')];
+                }
+                break;
+            case 'permissions':
+                switch ($kind[1]){
+                    case 'add_or_update':
+                        $model->name = $inputs['permission_remark'];
+                        $model->display_name = $inputs['permission_name'];
+                        $model->description = $inputs['permission_desc'];
+                        $model->controllers = $inputs['permission_control'];
+                        if($inputs['id']){
+                            if (is_config_id($inputs['id'], "admin.permission_table_cannot_manage_ids", false))return ['status'=>0,'msg'=>trans('fzs.menus.notedit')];
+                            $model->exists = true;
+                            $model->id = $inputs['id'];
+                        }
+                        try{
+                            if (!$model->save()) {
+                                return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                            }
+                            $roles = $inputs['permission_roles'];
+                            if (!empty($roles)) {
+                                foreach ($roles as $k => $role) {
+                                    if (empty($role)) unset($roles[$k]);
+                                }
+                            }
+                            $model->saveRoles($roles);
+                        }catch (\Exception $e){
+                            return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                        }
+                        return ['status'=>1,'msg'=>trans('fzs.common.success')];
+                        break;
+
+                    case 'delete':
+                        $model->id = $inputs['id'];
+                        $model->exists = true;
+                        if($model->delete())return ['status'=>1,'msg'=>trans('fzs.common.success')];
+                        else return ['status'=>0,'msg'=>trans('fzs.common.fail')];
+                        break;
+                    default:
+                        return ['status'=>0,'msg'=>trans('fzs.common.wrong')];
+                }
+                break;
+            default:
+                return ['status'=>0,'msg'=>trans('fzs.common.wrong')];
+        }
+
+    }
+
+}

+ 29 - 0
app/User.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App;
+
+use Illuminate\Notifications\Notifiable;
+use Illuminate\Foundation\Auth\User as Authenticatable;
+
+class User extends Authenticatable
+{
+    use Notifiable;
+
+    /**
+     * The attributes that are mass assignable.
+     *
+     * @var array
+     */
+    protected $fillable = [
+        'email', 'csr', 'IssuerID','miyaoID','status'
+    ];
+
+    /**
+     * The attributes that should be hidden for arrays.
+     *
+     * @var array
+     */
+    protected $hidden = [
+        'p8', 'remember_token',
+    ];
+}

+ 50 - 0
app/Utils/UrlUtils.php

@@ -0,0 +1,50 @@
+<?php
+/**
+ * User: HUANGXIANG
+ * Date: 2017-06-26 16:47
+ */
+
+namespace App\Utils;
+
+use Request;
+
+class UrlUtils
+{
+    const URL                   = 'url';
+    const ACTION                = 'action';
+    const CONTROLLER            = 'controller';
+    const CLASS_NAME            = 'class_name';
+    const CLASS_METHOD          = 'class_method';
+    const METHOD                = 'method';
+    const REAL_METHOD           = 'real_method';
+    public static function toRestfulParams()
+    {
+        $params = [];
+        // 如: App\Http\Controllers\IndexController@getIndex
+        $action = (Request::route()->getActionName());
+        // 如: [App\Http\Controllers\IndexController, getIndex]
+        $tmp = explode("@", $action);
+        // 如: App\Http\Controllers\IndexController
+        $controller = $tmp[0];
+        // 如: getIndex
+        $classMethod = count($tmp) > 1 ? $tmp[1] : '';
+        $paths = explode("\\", $controller);
+        // 如: IndexController
+        $className = $paths[count($paths) - 1];
+        // 如: GET | POST | PUT | DELETE , PUT跟DELETE方法可以通过_method参数传
+        $method = Request::getMethod();
+        // 如: GET | POST
+        $realMethod = Request::getRealMethod();
+        $url = Request::getRequestUri();
+
+        $params[static::ACTION] = $action;
+        $params[static::CONTROLLER] = $controller;
+        $params[static::CLASS_NAME] = $className;
+        $params[static::CLASS_METHOD] = $classMethod;
+        $params[static::METHOD] = $method;
+        $params[static::REAL_METHOD] = $realMethod;
+        $params[static::URL] = $url;
+        return $params;
+    }
+
+}

+ 51 - 0
artisan

@@ -0,0 +1,51 @@
+#!/usr/bin/env php
+<?php
+
+/*
+|--------------------------------------------------------------------------
+| Register The Auto Loader
+|--------------------------------------------------------------------------
+|
+| Composer provides a convenient, automatically generated class loader
+| for our application. We just need to utilize it! We'll require it
+| into the script here so that we do not have to worry about the
+| loading of any our classes "manually". Feels great to relax.
+|
+*/
+
+require __DIR__.'/bootstrap/autoload.php';
+
+$app = require_once __DIR__.'/bootstrap/app.php';
+
+/*
+|--------------------------------------------------------------------------
+| Run The Artisan Application
+|--------------------------------------------------------------------------
+|
+| When we run the console application, the current CLI command will be
+| executed in this console and the response sent back to a terminal
+| or another output device for the developers. Here goes nothing!
+|
+*/
+
+$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class);
+
+$status = $kernel->handle(
+    $input = new Symfony\Component\Console\Input\ArgvInput,
+    new Symfony\Component\Console\Output\ConsoleOutput
+);
+
+/*
+|--------------------------------------------------------------------------
+| Shutdown The Application
+|--------------------------------------------------------------------------
+|
+| Once Artisan has finished running, we will fire off the shutdown events
+| so that any final work may be done by the application before we shut
+| down the process. This is the last thing to happen to the request.
+|
+*/
+
+$kernel->terminate($input, $status);
+
+exit($status);

+ 55 - 0
bootstrap/app.php

@@ -0,0 +1,55 @@
+<?php
+
+/*
+|--------------------------------------------------------------------------
+| Create The Application
+|--------------------------------------------------------------------------
+|
+| The first thing we will do is create a new Laravel application instance
+| which serves as the "glue" for all the components of Laravel, and is
+| the IoC container for the system binding all of the various parts.
+|
+*/
+
+$app = new Illuminate\Foundation\Application(
+    realpath(__DIR__.'/../')
+);
+
+/*
+|--------------------------------------------------------------------------
+| Bind Important Interfaces
+|--------------------------------------------------------------------------
+|
+| Next, we need to bind some important interfaces into the container so
+| we will be able to resolve them when needed. The kernels serve the
+| incoming requests to this application from both the web and CLI.
+|
+*/
+
+$app->singleton(
+    Illuminate\Contracts\Http\Kernel::class,
+    App\Http\Kernel::class
+);
+
+$app->singleton(
+    Illuminate\Contracts\Console\Kernel::class,
+    App\Console\Kernel::class
+);
+
+$app->singleton(
+    Illuminate\Contracts\Debug\ExceptionHandler::class,
+    App\Exceptions\Handler::class
+);
+
+/*
+|--------------------------------------------------------------------------
+| Return The Application
+|--------------------------------------------------------------------------
+|
+| This script returns the application instance. The instance is given to
+| the calling script so we can separate the building of the instances
+| from the actual running of the application and sending responses.
+|
+*/
+
+return $app;

+ 17 - 0
bootstrap/autoload.php

@@ -0,0 +1,17 @@
+<?php
+
+define('LARAVEL_START', microtime(true));
+
+/*
+|--------------------------------------------------------------------------
+| Register The Composer Auto Loader
+|--------------------------------------------------------------------------
+|
+| Composer provides a convenient, automatically generated class loader
+| for our application. We just need to utilize it! We'll require it
+| into the script here so we do not have to manually load any of
+| our application's PHP classes. It just feels great to relax.
+|
+*/
+
+require __DIR__.'/../vendor/autoload.php';

+ 2 - 0
bootstrap/cache/.gitignore

@@ -0,0 +1,2 @@
+*
+!.gitignore

+ 55 - 0
composer.json

@@ -0,0 +1,55 @@
+{
+    "name": "laravel/laravel",
+    "description": "The Laravel Framework.",
+    "keywords": ["framework", "laravel"],
+    "license": "MIT",
+    "type": "project",
+    "require": {
+        "php": ">=5.6.4",
+        "laravel/framework": "5.4.*",
+        "laravel/tinker": "~1.0",
+        "gregwar/captcha": "1.*"
+    },
+    "require-dev": {
+        "fzaninotto/faker": "~1.4",
+        "mockery/mockery": "0.9.*",
+        "phpunit/phpunit": "~5.7"
+    },
+    "autoload": {
+        "classmap": [
+            "database"
+        ],
+        "psr-4": {
+            "App\\": "app/"
+        },
+        "files":[
+            "app/Helpers/functions.php"
+        ]
+    },
+    "autoload-dev": {
+        "psr-4": {
+            "Tests\\": "tests/"
+        }
+    },
+    "scripts": {
+        "post-root-package-install": [
+            "php -r \"file_exists('.env') || copy('.env.example', '.env');\""
+        ],
+        "post-create-project-cmd": [
+            "php artisan key:generate"
+        ],
+        "post-install-cmd": [
+            "Illuminate\\Foundation\\ComposerScripts::postInstall",
+            "php artisan optimize"
+        ],
+        "post-update-cmd": [
+            "Illuminate\\Foundation\\ComposerScripts::postUpdate",
+            "php artisan optimize"
+        ]
+    },
+    "config": {
+        "preferred-install": "dist",
+        "sort-packages": true,
+        "optimize-autoloader": true
+    }
+}

+ 3557 - 0
composer.lock

@@ -0,0 +1,3557 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "5353f650ed48f175fca8c34963a2ec28",
+    "packages": [
+        {
+            "name": "dnoegel/php-xdg-base-dir",
+            "version": "0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/dnoegel/php-xdg-base-dir.git",
+                "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/dnoegel/php-xdg-base-dir/zipball/265b8593498b997dc2d31e75b89f053b5cc9621a",
+                "reference": "265b8593498b997dc2d31e75b89f053b5cc9621a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "@stable"
+            },
+            "type": "project",
+            "autoload": {
+                "psr-4": {
+                    "XdgBaseDir\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "implementation of xdg base directory specification for php",
+            "time": "2014-10-24T07:27:01+00:00"
+        },
+        {
+            "name": "doctrine/inflector",
+            "version": "v1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/inflector.git",
+                "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/inflector/zipball/e11d84c6e018beedd929cff5220969a3c6d1d462",
+                "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Roman Borschel",
+                    "email": "roman@code-factory.org"
+                },
+                {
+                    "name": "Benjamin Eberlei",
+                    "email": "kontakt@beberlei.de"
+                },
+                {
+                    "name": "Guilherme Blanco",
+                    "email": "guilhermeblanco@gmail.com"
+                },
+                {
+                    "name": "Jonathan Wage",
+                    "email": "jonwage@gmail.com"
+                },
+                {
+                    "name": "Johannes Schmitt",
+                    "email": "schmittjoh@gmail.com"
+                }
+            ],
+            "description": "Common String Manipulations with regard to casing and singular/plural rules.",
+            "homepage": "http://www.doctrine-project.org",
+            "keywords": [
+                "inflection",
+                "pluralize",
+                "singularize",
+                "string"
+            ],
+            "time": "2017-07-22T12:18:28+00:00"
+        },
+        {
+            "name": "erusev/parsedown",
+            "version": "1.7.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/erusev/parsedown.git",
+                "reference": "6d893938171a817f4e9bc9e86f2da1e370b7bcd7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/erusev/parsedown/zipball/6d893938171a817f4e9bc9e86f2da1e370b7bcd7",
+                "reference": "6d893938171a817f4e9bc9e86f2da1e370b7bcd7",
+                "shasum": ""
+            },
+            "require": {
+                "ext-mbstring": "*",
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Parsedown": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Emanuil Rusev",
+                    "email": "hello@erusev.com",
+                    "homepage": "http://erusev.com"
+                }
+            ],
+            "description": "Parser for Markdown.",
+            "homepage": "http://parsedown.org",
+            "keywords": [
+                "markdown",
+                "parser"
+            ],
+            "time": "2019-03-17T18:48:37+00:00"
+        },
+        {
+            "name": "gregwar/captcha",
+            "version": "v1.1.7",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Gregwar/Captcha.git",
+                "reference": "cf953dd79748406e0292cea8c565399681e4d345"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Gregwar/Captcha/zipball/cf953dd79748406e0292cea8c565399681e4d345",
+                "reference": "cf953dd79748406e0292cea8c565399681e4d345",
+                "shasum": ""
+            },
+            "require": {
+                "ext-gd": "*",
+                "ext-mbstring": "*",
+                "php": ">=5.3.0",
+                "symfony/finder": "*"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6.4"
+            },
+            "type": "captcha",
+            "autoload": {
+                "psr-4": {
+                    "Gregwar\\": "src/Gregwar"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Grégoire Passault",
+                    "email": "g.passault@gmail.com",
+                    "homepage": "http://www.gregwar.com/"
+                },
+                {
+                    "name": "Jeremy Livingston",
+                    "email": "jeremy.j.livingston@gmail.com"
+                }
+            ],
+            "description": "Captcha generator",
+            "homepage": "https://github.com/Gregwar/Captcha",
+            "keywords": [
+                "bot",
+                "captcha",
+                "spam"
+            ],
+            "time": "2018-08-17T22:57:28+00:00"
+        },
+        {
+            "name": "jakub-onderka/php-console-color",
+            "version": "v0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/JakubOnderka/PHP-Console-Color.git",
+                "reference": "d5deaecff52a0d61ccb613bb3804088da0307191"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Color/zipball/d5deaecff52a0d61ccb613bb3804088da0307191",
+                "reference": "d5deaecff52a0d61ccb613bb3804088da0307191",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "jakub-onderka/php-code-style": "1.0",
+                "jakub-onderka/php-parallel-lint": "1.0",
+                "jakub-onderka/php-var-dump-check": "0.*",
+                "phpunit/phpunit": "~4.3",
+                "squizlabs/php_codesniffer": "1.*"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "JakubOnderka\\PhpConsoleColor\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-2-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jakub Onderka",
+                    "email": "jakub.onderka@gmail.com"
+                }
+            ],
+            "time": "2018-09-29T17:23:10+00:00"
+        },
+        {
+            "name": "jakub-onderka/php-console-highlighter",
+            "version": "v0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git",
+                "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/JakubOnderka/PHP-Console-Highlighter/zipball/9f7a229a69d52506914b4bc61bfdb199d90c5547",
+                "reference": "9f7a229a69d52506914b4bc61bfdb199d90c5547",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "jakub-onderka/php-console-color": "~0.2",
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "jakub-onderka/php-code-style": "~1.0",
+                "jakub-onderka/php-parallel-lint": "~1.0",
+                "jakub-onderka/php-var-dump-check": "~0.1",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~1.5"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "JakubOnderka\\PhpConsoleHighlighter\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jakub Onderka",
+                    "email": "acci@acci.cz",
+                    "homepage": "http://www.acci.cz/"
+                }
+            ],
+            "description": "Highlight PHP code in terminal",
+            "time": "2018-09-29T18:48:56+00:00"
+        },
+        {
+            "name": "kylekatarnls/update-helper",
+            "version": "1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/kylekatarnls/update-helper.git",
+                "reference": "5786fa188e0361b9adf9e8199d7280d1b2db165e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/kylekatarnls/update-helper/zipball/5786fa188e0361b9adf9e8199d7280d1b2db165e",
+                "reference": "5786fa188e0361b9adf9e8199d7280d1b2db165e",
+                "shasum": ""
+            },
+            "require": {
+                "composer-plugin-api": "^1.1.0 || ^2.0.0",
+                "php": ">=5.3.0"
+            },
+            "require-dev": {
+                "codeclimate/php-test-reporter": "dev-master",
+                "composer/composer": "2.0.x-dev || ^2.0.0-dev",
+                "phpunit/phpunit": ">=4.8.35 <6.0"
+            },
+            "type": "composer-plugin",
+            "extra": {
+                "class": "UpdateHelper\\ComposerPlugin"
+            },
+            "autoload": {
+                "psr-0": {
+                    "UpdateHelper\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Kyle",
+                    "email": "kylekatarnls@gmail.com"
+                }
+            ],
+            "description": "Update helper",
+            "time": "2019-07-29T11:03:54+00:00"
+        },
+        {
+            "name": "laravel/framework",
+            "version": "v5.4.36",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laravel/framework.git",
+                "reference": "1062a22232071c3e8636487c86ec1ae75681bbf9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/laravel/framework/zipball/1062a22232071c3e8636487c86ec1ae75681bbf9",
+                "reference": "1062a22232071c3e8636487c86ec1ae75681bbf9",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/inflector": "~1.1",
+                "erusev/parsedown": "~1.6",
+                "ext-mbstring": "*",
+                "ext-openssl": "*",
+                "league/flysystem": "~1.0",
+                "monolog/monolog": "~1.11",
+                "mtdowling/cron-expression": "~1.0",
+                "nesbot/carbon": "~1.20",
+                "paragonie/random_compat": "~1.4|~2.0",
+                "php": ">=5.6.4",
+                "ramsey/uuid": "~3.0",
+                "swiftmailer/swiftmailer": "~5.4",
+                "symfony/console": "~3.2",
+                "symfony/debug": "~3.2",
+                "symfony/finder": "~3.2",
+                "symfony/http-foundation": "~3.2",
+                "symfony/http-kernel": "~3.2",
+                "symfony/process": "~3.2",
+                "symfony/routing": "~3.2",
+                "symfony/var-dumper": "~3.2",
+                "tijsverkoyen/css-to-inline-styles": "~2.2",
+                "vlucas/phpdotenv": "~2.2"
+            },
+            "replace": {
+                "illuminate/auth": "self.version",
+                "illuminate/broadcasting": "self.version",
+                "illuminate/bus": "self.version",
+                "illuminate/cache": "self.version",
+                "illuminate/config": "self.version",
+                "illuminate/console": "self.version",
+                "illuminate/container": "self.version",
+                "illuminate/contracts": "self.version",
+                "illuminate/cookie": "self.version",
+                "illuminate/database": "self.version",
+                "illuminate/encryption": "self.version",
+                "illuminate/events": "self.version",
+                "illuminate/exception": "self.version",
+                "illuminate/filesystem": "self.version",
+                "illuminate/hashing": "self.version",
+                "illuminate/http": "self.version",
+                "illuminate/log": "self.version",
+                "illuminate/mail": "self.version",
+                "illuminate/notifications": "self.version",
+                "illuminate/pagination": "self.version",
+                "illuminate/pipeline": "self.version",
+                "illuminate/queue": "self.version",
+                "illuminate/redis": "self.version",
+                "illuminate/routing": "self.version",
+                "illuminate/session": "self.version",
+                "illuminate/support": "self.version",
+                "illuminate/translation": "self.version",
+                "illuminate/validation": "self.version",
+                "illuminate/view": "self.version",
+                "tightenco/collect": "self.version"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "~3.0",
+                "doctrine/dbal": "~2.5",
+                "mockery/mockery": "~0.9.4",
+                "pda/pheanstalk": "~3.0",
+                "phpunit/phpunit": "~5.7",
+                "predis/predis": "~1.0",
+                "symfony/css-selector": "~3.2",
+                "symfony/dom-crawler": "~3.2"
+            },
+            "suggest": {
+                "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).",
+                "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).",
+                "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).",
+                "guzzlehttp/guzzle": "Required to use the Mailgun and Mandrill mail drivers and the ping methods on schedules (~6.0).",
+                "laravel/tinker": "Required to use the tinker console command (~1.0).",
+                "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).",
+                "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).",
+                "nexmo/client": "Required to use the Nexmo transport (~1.0).",
+                "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).",
+                "predis/predis": "Required to use the redis cache and queue drivers (~1.0).",
+                "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).",
+                "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.2).",
+                "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.2).",
+                "symfony/psr-http-message-bridge": "Required to psr7 bridging features (0.2.*)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.4-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/Illuminate/Foundation/helpers.php",
+                    "src/Illuminate/Support/helpers.php"
+                ],
+                "psr-4": {
+                    "Illuminate\\": "src/Illuminate/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "The Laravel Framework.",
+            "homepage": "https://laravel.com",
+            "keywords": [
+                "framework",
+                "laravel"
+            ],
+            "time": "2017-08-30T09:26:16+00:00"
+        },
+        {
+            "name": "laravel/tinker",
+            "version": "v1.0.10",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/laravel/tinker.git",
+                "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/laravel/tinker/zipball/ad571aacbac1539c30d480908f9d0c9614eaf1a7",
+                "reference": "ad571aacbac1539c30d480908f9d0c9614eaf1a7",
+                "shasum": ""
+            },
+            "require": {
+                "illuminate/console": "~5.1|^6.0",
+                "illuminate/contracts": "~5.1|^6.0",
+                "illuminate/support": "~5.1|^6.0",
+                "php": ">=5.5.9",
+                "psy/psysh": "0.7.*|0.8.*|0.9.*",
+                "symfony/var-dumper": "~3.0|~4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0|~5.0"
+            },
+            "suggest": {
+                "illuminate/database": "The Illuminate Database package (~5.1)."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                },
+                "laravel": {
+                    "providers": [
+                        "Laravel\\Tinker\\TinkerServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Laravel\\Tinker\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Taylor Otwell",
+                    "email": "taylor@laravel.com"
+                }
+            ],
+            "description": "Powerful REPL for the Laravel framework.",
+            "keywords": [
+                "REPL",
+                "Tinker",
+                "laravel",
+                "psysh"
+            ],
+            "time": "2019-08-07T15:10:45+00:00"
+        },
+        {
+            "name": "league/flysystem",
+            "version": "1.0.57",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/thephpleague/flysystem.git",
+                "reference": "0e9db7f0b96b9f12dcf6f65bc34b72b1a30ea55a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/0e9db7f0b96b9f12dcf6f65bc34b72b1a30ea55a",
+                "reference": "0e9db7f0b96b9f12dcf6f65bc34b72b1a30ea55a",
+                "shasum": ""
+            },
+            "require": {
+                "ext-fileinfo": "*",
+                "php": ">=5.5.9"
+            },
+            "conflict": {
+                "league/flysystem-sftp": "<1.0.6"
+            },
+            "require-dev": {
+                "phpspec/phpspec": "^3.4",
+                "phpunit/phpunit": "^5.7.10"
+            },
+            "suggest": {
+                "ext-fileinfo": "Required for MimeType",
+                "ext-ftp": "Allows you to use FTP server storage",
+                "ext-openssl": "Allows you to use FTPS server storage",
+                "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2",
+                "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3",
+                "league/flysystem-azure": "Allows you to use Windows Azure Blob storage",
+                "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching",
+                "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem",
+                "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files",
+                "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib",
+                "league/flysystem-webdav": "Allows you to use WebDAV storage",
+                "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter",
+                "spatie/flysystem-dropbox": "Allows you to use Dropbox storage",
+                "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "League\\Flysystem\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Frank de Jonge",
+                    "email": "info@frenky.net"
+                }
+            ],
+            "description": "Filesystem abstraction: Many filesystems, one API.",
+            "keywords": [
+                "Cloud Files",
+                "WebDAV",
+                "abstraction",
+                "aws",
+                "cloud",
+                "copy.com",
+                "dropbox",
+                "file systems",
+                "files",
+                "filesystem",
+                "filesystems",
+                "ftp",
+                "rackspace",
+                "remote",
+                "s3",
+                "sftp",
+                "storage"
+            ],
+            "time": "2019-10-16T21:01:05+00:00"
+        },
+        {
+            "name": "monolog/monolog",
+            "version": "1.25.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/monolog.git",
+                "reference": "d5e2fb341cb44f7e2ab639d12a1e5901091ec287"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/monolog/zipball/d5e2fb341cb44f7e2ab639d12a1e5901091ec287",
+                "reference": "d5e2fb341cb44f7e2ab639d12a1e5901091ec287",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "psr/log": "~1.0"
+            },
+            "provide": {
+                "psr/log-implementation": "1.0.0"
+            },
+            "require-dev": {
+                "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+                "doctrine/couchdb": "~1.0@dev",
+                "graylog2/gelf-php": "~1.0",
+                "jakub-onderka/php-parallel-lint": "0.9",
+                "php-amqplib/php-amqplib": "~2.4",
+                "php-console/php-console": "^3.1.3",
+                "phpunit/phpunit": "~4.5",
+                "phpunit/phpunit-mock-objects": "2.3.0",
+                "ruflin/elastica": ">=0.90 <3.0",
+                "sentry/sentry": "^0.13",
+                "swiftmailer/swiftmailer": "^5.3|^6.0"
+            },
+            "suggest": {
+                "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+                "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+                "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+                "ext-mongo": "Allow sending log messages to a MongoDB server",
+                "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+                "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
+                "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+                "php-console/php-console": "Allow sending log messages to Google Chrome",
+                "rollbar/rollbar": "Allow sending log messages to Rollbar",
+                "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
+                "sentry/sentry": "Allow sending log messages to a Sentry server"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Monolog\\": "src/Monolog"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@seld.be",
+                    "homepage": "http://seld.be"
+                }
+            ],
+            "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+            "homepage": "http://github.com/Seldaek/monolog",
+            "keywords": [
+                "log",
+                "logging",
+                "psr-3"
+            ],
+            "time": "2019-11-13T10:00:05+00:00"
+        },
+        {
+            "name": "mtdowling/cron-expression",
+            "version": "v1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/mtdowling/cron-expression.git",
+                "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad",
+                "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0|~5.0"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Cron\\": "src/Cron/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due",
+            "keywords": [
+                "cron",
+                "schedule"
+            ],
+            "time": "2017-01-23T04:29:33+00:00"
+        },
+        {
+            "name": "nesbot/carbon",
+            "version": "1.39.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/briannesbitt/Carbon.git",
+                "reference": "4be0c005164249208ce1b5ca633cd57bdd42ff33"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4be0c005164249208ce1b5ca633cd57bdd42ff33",
+                "reference": "4be0c005164249208ce1b5ca633cd57bdd42ff33",
+                "shasum": ""
+            },
+            "require": {
+                "kylekatarnls/update-helper": "^1.1",
+                "php": ">=5.3.9",
+                "symfony/translation": "~2.6 || ~3.0 || ~4.0"
+            },
+            "require-dev": {
+                "composer/composer": "^1.2",
+                "friendsofphp/php-cs-fixer": "~2",
+                "phpunit/phpunit": "^4.8.35 || ^5.7"
+            },
+            "bin": [
+                "bin/upgrade-carbon"
+            ],
+            "type": "library",
+            "extra": {
+                "update-helper": "Carbon\\Upgrade",
+                "laravel": {
+                    "providers": [
+                        "Carbon\\Laravel\\ServiceProvider"
+                    ]
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Brian Nesbitt",
+                    "email": "brian@nesbot.com",
+                    "homepage": "http://nesbot.com"
+                }
+            ],
+            "description": "A simple API extension for DateTime.",
+            "homepage": "http://carbon.nesbot.com",
+            "keywords": [
+                "date",
+                "datetime",
+                "time"
+            ],
+            "time": "2019-10-14T05:51:36+00:00"
+        },
+        {
+            "name": "nikic/php-parser",
+            "version": "v4.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/nikic/PHP-Parser.git",
+                "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9a9981c347c5c49d6dfe5cf826bb882b824080dc",
+                "reference": "9a9981c347c5c49d6dfe5cf826bb882b824080dc",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=7.0"
+            },
+            "require-dev": {
+                "ircmaxell/php-yacc": "0.0.5",
+                "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0"
+            },
+            "bin": [
+                "bin/php-parse"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "PhpParser\\": "lib/PhpParser"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Nikita Popov"
+                }
+            ],
+            "description": "A PHP parser written in PHP",
+            "keywords": [
+                "parser",
+                "php"
+            ],
+            "time": "2019-11-08T13:50:10+00:00"
+        },
+        {
+            "name": "paragonie/random_compat",
+            "version": "v2.0.18",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/paragonie/random_compat.git",
+                "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/paragonie/random_compat/zipball/0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
+                "reference": "0a58ef6e3146256cc3dc7cc393927bcc7d1b72db",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "4.*|5.*"
+            },
+            "suggest": {
+                "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+            },
+            "type": "library",
+            "autoload": {
+                "files": [
+                    "lib/random.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Paragon Initiative Enterprises",
+                    "email": "security@paragonie.com",
+                    "homepage": "https://paragonie.com"
+                }
+            ],
+            "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+            "keywords": [
+                "csprng",
+                "polyfill",
+                "pseudorandom",
+                "random"
+            ],
+            "time": "2019-01-03T20:59:08+00:00"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/446d54b4cb6bf489fc9d75f55843658e6f25d801",
+                "reference": "446d54b4cb6bf489fc9d75f55843658e6f25d801",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Log\\": "Psr/Log/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "homepage": "https://github.com/php-fig/log",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "time": "2019-11-01T11:05:21+00:00"
+        },
+        {
+            "name": "psy/psysh",
+            "version": "v0.9.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/bobthecow/psysh.git",
+                "reference": "9aaf29575bb8293206bb0420c1e1c87ff2ffa94e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/bobthecow/psysh/zipball/9aaf29575bb8293206bb0420c1e1c87ff2ffa94e",
+                "reference": "9aaf29575bb8293206bb0420c1e1c87ff2ffa94e",
+                "shasum": ""
+            },
+            "require": {
+                "dnoegel/php-xdg-base-dir": "0.1",
+                "ext-json": "*",
+                "ext-tokenizer": "*",
+                "jakub-onderka/php-console-highlighter": "0.3.*|0.4.*",
+                "nikic/php-parser": "~1.3|~2.0|~3.0|~4.0",
+                "php": ">=5.4.0",
+                "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0",
+                "symfony/var-dumper": "~2.7|~3.0|~4.0"
+            },
+            "require-dev": {
+                "bamarni/composer-bin-plugin": "^1.2",
+                "hoa/console": "~2.15|~3.16",
+                "phpunit/phpunit": "~4.8.35|~5.0|~6.0|~7.0"
+            },
+            "suggest": {
+                "ext-pcntl": "Enabling the PCNTL extension makes PsySH a lot happier :)",
+                "ext-pdo-sqlite": "The doc command requires SQLite to work.",
+                "ext-posix": "If you have PCNTL, you'll want the POSIX extension as well.",
+                "ext-readline": "Enables support for arrow-key history navigation, and showing and manipulating command history.",
+                "hoa/console": "A pure PHP readline implementation. You'll want this if your PHP install doesn't already support readline or libedit."
+            },
+            "bin": [
+                "bin/psysh"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-develop": "0.9.x-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions.php"
+                ],
+                "psr-4": {
+                    "Psy\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Justin Hileman",
+                    "email": "justin@justinhileman.info",
+                    "homepage": "http://justinhileman.com"
+                }
+            ],
+            "description": "An interactive shell for modern PHP.",
+            "homepage": "http://psysh.org",
+            "keywords": [
+                "REPL",
+                "console",
+                "interactive",
+                "shell"
+            ],
+            "time": "2018-10-13T15:16:03+00:00"
+        },
+        {
+            "name": "ramsey/uuid",
+            "version": "3.8.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/ramsey/uuid.git",
+                "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/ramsey/uuid/zipball/d09ea80159c1929d75b3f9c60504d613aeb4a1e3",
+                "reference": "d09ea80159c1929d75b3f9c60504d613aeb4a1e3",
+                "shasum": ""
+            },
+            "require": {
+                "paragonie/random_compat": "^1.0|^2.0|9.99.99",
+                "php": "^5.4 || ^7.0",
+                "symfony/polyfill-ctype": "^1.8"
+            },
+            "replace": {
+                "rhumsaa/uuid": "self.version"
+            },
+            "require-dev": {
+                "codeception/aspect-mock": "^1.0 | ~2.0.0",
+                "doctrine/annotations": "~1.2.0",
+                "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ~2.1.0",
+                "ircmaxell/random-lib": "^1.1",
+                "jakub-onderka/php-parallel-lint": "^0.9.0",
+                "mockery/mockery": "^0.9.9",
+                "moontoast/math": "^1.1",
+                "php-mock/php-mock-phpunit": "^0.3|^1.1",
+                "phpunit/phpunit": "^4.7|^5.0|^6.5",
+                "squizlabs/php_codesniffer": "^2.3"
+            },
+            "suggest": {
+                "ext-ctype": "Provides support for PHP Ctype functions",
+                "ext-libsodium": "Provides the PECL libsodium extension for use with the SodiumRandomGenerator",
+                "ext-uuid": "Provides the PECL UUID extension for use with the PeclUuidTimeGenerator and PeclUuidRandomGenerator",
+                "ircmaxell/random-lib": "Provides RandomLib for use with the RandomLibAdapter",
+                "moontoast/math": "Provides support for converting UUID to 128-bit integer (in string form).",
+                "ramsey/uuid-console": "A console application for generating UUIDs with ramsey/uuid",
+                "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type."
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Ramsey\\Uuid\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marijn Huizendveld",
+                    "email": "marijn.huizendveld@gmail.com"
+                },
+                {
+                    "name": "Thibaud Fabre",
+                    "email": "thibaud@aztech.io"
+                },
+                {
+                    "name": "Ben Ramsey",
+                    "email": "ben@benramsey.com",
+                    "homepage": "https://benramsey.com"
+                }
+            ],
+            "description": "Formerly rhumsaa/uuid. A PHP 5.4+ library for generating RFC 4122 version 1, 3, 4, and 5 universally unique identifiers (UUID).",
+            "homepage": "https://github.com/ramsey/uuid",
+            "keywords": [
+                "guid",
+                "identifier",
+                "uuid"
+            ],
+            "time": "2018-07-19T23:38:55+00:00"
+        },
+        {
+            "name": "swiftmailer/swiftmailer",
+            "version": "v5.4.12",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/swiftmailer/swiftmailer.git",
+                "reference": "181b89f18a90f8925ef805f950d47a7190e9b950"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/181b89f18a90f8925ef805f950d47a7190e9b950",
+                "reference": "181b89f18a90f8925ef805f950d47a7190e9b950",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "mockery/mockery": "~0.9.1",
+                "symfony/phpunit-bridge": "~3.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.4-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "lib/swift_required.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Chris Corbyn"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Swiftmailer, free feature-rich PHP mailer",
+            "homepage": "https://swiftmailer.symfony.com",
+            "keywords": [
+                "email",
+                "mail",
+                "mailer"
+            ],
+            "time": "2018-07-31T09:26:32+00:00"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git",
+                "reference": "b0878233cb5c4391347e5495089c7af11b8e6201"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/b0878233cb5c4391347e5495089c7af11b8e6201",
+                "reference": "b0878233cb5c4391347e5495089c7af11b8e6201",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/debug": "~2.8|~3.0",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<3.3"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~3.3",
+                "symfony/dependency-injection": "~3.3",
+                "symfony/event-dispatcher": "~2.8|~3.0",
+                "symfony/filesystem": "~2.8|~3.0",
+                "symfony/http-kernel": "~2.8|~3.0",
+                "symfony/process": "~2.8|~3.0"
+            },
+            "suggest": {
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/filesystem": "",
+                "symfony/process": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Console Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-07-29T21:27:59+00:00"
+        },
+        {
+            "name": "symfony/css-selector",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/css-selector.git",
+                "reference": "4d882dced7b995d5274293039370148e291808f2"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/css-selector/zipball/4d882dced7b995d5274293039370148e291808f2",
+                "reference": "4d882dced7b995d5274293039370148e291808f2",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\CssSelector\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jean-François Simon",
+                    "email": "jeanfrancois.simon@sensiolabs.com"
+                },
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony CssSelector Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-05-01T15:01:29+00:00"
+        },
+        {
+            "name": "symfony/debug",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/debug.git",
+                "reference": "7c13ae8ce1e2adbbd574fc39de7be498e1284e13"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/debug/zipball/7c13ae8ce1e2adbbd574fc39de7be498e1284e13",
+                "reference": "7c13ae8ce1e2adbbd574fc39de7be498e1284e13",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "psr/log": "~1.0"
+            },
+            "conflict": {
+                "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+            },
+            "require-dev": {
+                "symfony/http-kernel": "~2.8|~3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Debug\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Debug Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-07-28T15:27:31+00:00"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/event-dispatcher.git",
+                "reference": "67535f1e3fd662bdc68d7ba317c93eecd973617e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67535f1e3fd662bdc68d7ba317c93eecd973617e",
+                "reference": "67535f1e3fd662bdc68d7ba317c93eecd973617e",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "conflict": {
+                "symfony/dependency-injection": "<3.3"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~2.8|~3.0",
+                "symfony/dependency-injection": "~3.3",
+                "symfony/expression-language": "~2.8|~3.0",
+                "symfony/stopwatch": "~2.8|~3.0"
+            },
+            "suggest": {
+                "symfony/dependency-injection": "",
+                "symfony/http-kernel": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\EventDispatcher\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony EventDispatcher Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-06-09T14:53:08+00:00"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git",
+                "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/baea7f66d30854ad32988c11a09d7ffd485810c4",
+                "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Finder\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Finder Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-06-01T21:01:25+00:00"
+        },
+        {
+            "name": "symfony/http-foundation",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-foundation.git",
+                "reference": "49e8cd2d59a7aa9bfab19e46de680c76e500a031"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49e8cd2d59a7aa9bfab19e46de680c76e500a031",
+                "reference": "49e8cd2d59a7aa9bfab19e46de680c76e500a031",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/polyfill-mbstring": "~1.1"
+            },
+            "require-dev": {
+                "symfony/expression-language": "~2.8|~3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpFoundation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony HttpFoundation Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-07-21T11:04:46+00:00"
+        },
+        {
+            "name": "symfony/http-kernel",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/http-kernel.git",
+                "reference": "db10d05f1d95e4168e638db7a81c79616f568ea5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/http-kernel/zipball/db10d05f1d95e4168e638db7a81c79616f568ea5",
+                "reference": "db10d05f1d95e4168e638db7a81c79616f568ea5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "psr/log": "~1.0",
+                "symfony/debug": "~2.8|~3.0",
+                "symfony/event-dispatcher": "~2.8|~3.0",
+                "symfony/http-foundation": "~3.3"
+            },
+            "conflict": {
+                "symfony/config": "<2.8",
+                "symfony/dependency-injection": "<3.3",
+                "symfony/var-dumper": "<3.3",
+                "twig/twig": "<1.34|<2.4,>=2"
+            },
+            "require-dev": {
+                "psr/cache": "~1.0",
+                "symfony/browser-kit": "~2.8|~3.0",
+                "symfony/class-loader": "~2.8|~3.0",
+                "symfony/config": "~2.8|~3.0",
+                "symfony/console": "~2.8|~3.0",
+                "symfony/css-selector": "~2.8|~3.0",
+                "symfony/dependency-injection": "~3.3",
+                "symfony/dom-crawler": "~2.8|~3.0",
+                "symfony/expression-language": "~2.8|~3.0",
+                "symfony/finder": "~2.8|~3.0",
+                "symfony/process": "~2.8|~3.0",
+                "symfony/routing": "~2.8|~3.0",
+                "symfony/stopwatch": "~2.8|~3.0",
+                "symfony/templating": "~2.8|~3.0",
+                "symfony/translation": "~2.8|~3.0",
+                "symfony/var-dumper": "~3.3"
+            },
+            "suggest": {
+                "symfony/browser-kit": "",
+                "symfony/class-loader": "",
+                "symfony/config": "",
+                "symfony/console": "",
+                "symfony/dependency-injection": "",
+                "symfony/finder": "",
+                "symfony/var-dumper": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\HttpKernel\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony HttpKernel Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-08-01T10:25:59+00:00"
+        },
+        {
+            "name": "symfony/polyfill-ctype",
+            "version": "v1.12.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-ctype.git",
+                "reference": "550ebaac289296ce228a706d0867afc34687e3f4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/550ebaac289296ce228a706d0867afc34687e3f4",
+                "reference": "550ebaac289296ce228a706d0867afc34687e3f4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-ctype": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.12-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Ctype\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Gert de Pagter",
+                    "email": "BackEndTea@gmail.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for ctype functions",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "ctype",
+                "polyfill",
+                "portable"
+            ],
+            "time": "2019-08-06T08:03:45+00:00"
+        },
+        {
+            "name": "symfony/polyfill-mbstring",
+            "version": "v1.12.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/polyfill-mbstring.git",
+                "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b42a2f66e8f1b15ccf25652c3424265923eb4f17",
+                "reference": "b42a2f66e8f1b15ccf25652c3424265923eb4f17",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "suggest": {
+                "ext-mbstring": "For best performance"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.12-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Polyfill\\Mbstring\\": ""
+                },
+                "files": [
+                    "bootstrap.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony polyfill for the Mbstring extension",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "compatibility",
+                "mbstring",
+                "polyfill",
+                "portable",
+                "shim"
+            ],
+            "time": "2019-08-06T08:03:45+00:00"
+        },
+        {
+            "name": "symfony/process",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git",
+                "reference": "07432804942b9f6dd7b7377faf9920af5f95d70a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/process/zipball/07432804942b9f6dd7b7377faf9920af5f95d70a",
+                "reference": "07432804942b9f6dd7b7377faf9920af5f95d70a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Process\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Process Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-07-13T13:05:09+00:00"
+        },
+        {
+            "name": "symfony/routing",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/routing.git",
+                "reference": "4aee1a917fd4859ff8b51b9fd1dfb790a5ecfa26"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/routing/zipball/4aee1a917fd4859ff8b51b9fd1dfb790a5ecfa26",
+                "reference": "4aee1a917fd4859ff8b51b9fd1dfb790a5ecfa26",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "conflict": {
+                "symfony/config": "<2.8",
+                "symfony/dependency-injection": "<3.3",
+                "symfony/yaml": "<3.3"
+            },
+            "require-dev": {
+                "doctrine/annotations": "~1.0",
+                "doctrine/common": "~2.2",
+                "psr/log": "~1.0",
+                "symfony/config": "~2.8|~3.0",
+                "symfony/dependency-injection": "~3.3",
+                "symfony/expression-language": "~2.8|~3.0",
+                "symfony/http-foundation": "~2.8|~3.0",
+                "symfony/yaml": "~3.3"
+            },
+            "suggest": {
+                "doctrine/annotations": "For using the annotation loader",
+                "symfony/config": "For using the all-in-one router or any loader",
+                "symfony/dependency-injection": "For loading routes from a service",
+                "symfony/expression-language": "For using expression matching",
+                "symfony/http-foundation": "For using a Symfony Request object",
+                "symfony/yaml": "For using the YAML loader"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Routing\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Routing Component",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "router",
+                "routing",
+                "uri",
+                "url"
+            ],
+            "time": "2017-07-21T17:43:13+00:00"
+        },
+        {
+            "name": "symfony/translation",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/translation.git",
+                "reference": "35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/translation/zipball/35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3",
+                "reference": "35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "symfony/config": "<2.8",
+                "symfony/yaml": "<3.3"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~2.8|~3.0",
+                "symfony/intl": "^2.8.18|^3.2.5",
+                "symfony/yaml": "~3.3"
+            },
+            "suggest": {
+                "psr/log": "To use logging capability in translator",
+                "symfony/config": "",
+                "symfony/yaml": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Translation\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Translation Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-06-24T16:45:30+00:00"
+        },
+        {
+            "name": "symfony/var-dumper",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/var-dumper.git",
+                "reference": "b2623bccb969ad595c2090f9be498b74670d0663"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b2623bccb969ad595c2090f9be498b74670d0663",
+                "reference": "b2623bccb969ad595c2090f9be498b74670d0663",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9",
+                "symfony/polyfill-mbstring": "~1.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0"
+            },
+            "require-dev": {
+                "ext-iconv": "*",
+                "twig/twig": "~1.34|~2.4"
+            },
+            "suggest": {
+                "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).",
+                "ext-symfony_debug": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "Resources/functions/dump.php"
+                ],
+                "psr-4": {
+                    "Symfony\\Component\\VarDumper\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Nicolas Grekas",
+                    "email": "p@tchwork.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony mechanism for exploring and dumping PHP variables",
+            "homepage": "https://symfony.com",
+            "keywords": [
+                "debug",
+                "dump"
+            ],
+            "time": "2017-07-28T06:06:09+00:00"
+        },
+        {
+            "name": "tijsverkoyen/css-to-inline-styles",
+            "version": "2.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
+                "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/dda2ee426acd6d801d5b7fd1001cde9b5f790e15",
+                "reference": "dda2ee426acd6d801d5b7fd1001cde9b5f790e15",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-libxml": "*",
+                "php": "^5.5 || ^7.0",
+                "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.2.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "TijsVerkoyen\\CssToInlineStyles\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Tijs Verkoyen",
+                    "email": "css_to_inline_styles@verkoyen.eu",
+                    "role": "Developer"
+                }
+            ],
+            "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.",
+            "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles",
+            "time": "2019-10-24T08:53:34+00:00"
+        },
+        {
+            "name": "vlucas/phpdotenv",
+            "version": "v2.6.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/vlucas/phpdotenv.git",
+                "reference": "2a7dcf7e3e02dc5e701004e51a6f304b713107d5"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/2a7dcf7e3e02dc5e701004e51a6f304b713107d5",
+                "reference": "2a7dcf7e3e02dc5e701004e51a6f304b713107d5",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9",
+                "symfony/polyfill-ctype": "^1.9"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Dotenv\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Vance Lucas",
+                    "email": "vance@vancelucas.com",
+                    "homepage": "http://www.vancelucas.com"
+                }
+            ],
+            "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.",
+            "keywords": [
+                "dotenv",
+                "env",
+                "environment"
+            ],
+            "time": "2019-01-29T11:11:52+00:00"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "doctrine/instantiator",
+            "version": "1.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/instantiator.git",
+                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+                "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3,<8.0-DEV"
+            },
+            "require-dev": {
+                "athletic/athletic": "~0.1.8",
+                "ext-pdo": "*",
+                "ext-phar": "*",
+                "phpunit/phpunit": "~4.0",
+                "squizlabs/php_codesniffer": "~2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Marco Pivetta",
+                    "email": "ocramius@gmail.com",
+                    "homepage": "http://ocramius.github.com/"
+                }
+            ],
+            "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+            "homepage": "https://github.com/doctrine/instantiator",
+            "keywords": [
+                "constructor",
+                "instantiate"
+            ],
+            "time": "2015-06-14T21:17:01+00:00"
+        },
+        {
+            "name": "fzaninotto/faker",
+            "version": "v1.8.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/fzaninotto/Faker.git",
+                "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/f72816b43e74063c8b10357394b6bba8cb1c10de",
+                "reference": "f72816b43e74063c8b10357394b6bba8cb1c10de",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.3 || ^7.0"
+            },
+            "require-dev": {
+                "ext-intl": "*",
+                "phpunit/phpunit": "^4.8.35 || ^5.7",
+                "squizlabs/php_codesniffer": "^1.5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Faker\\": "src/Faker/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "François Zaninotto"
+                }
+            ],
+            "description": "Faker is a PHP library that generates fake data for you.",
+            "keywords": [
+                "data",
+                "faker",
+                "fixtures"
+            ],
+            "time": "2018-07-12T10:23:15+00:00"
+        },
+        {
+            "name": "hamcrest/hamcrest-php",
+            "version": "v1.2.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/hamcrest/hamcrest-php.git",
+                "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c",
+                "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.2"
+            },
+            "replace": {
+                "cordoval/hamcrest-php": "*",
+                "davedevelopment/hamcrest-php": "*",
+                "kodova/hamcrest-php": "*"
+            },
+            "require-dev": {
+                "phpunit/php-file-iterator": "1.3.3",
+                "satooshi/php-coveralls": "dev-master"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "hamcrest"
+                ],
+                "files": [
+                    "hamcrest/Hamcrest.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD"
+            ],
+            "description": "This is the PHP port of Hamcrest Matchers",
+            "keywords": [
+                "test"
+            ],
+            "time": "2015-05-11T14:41:42+00:00"
+        },
+        {
+            "name": "mockery/mockery",
+            "version": "0.9.11",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/mockery/mockery.git",
+                "reference": "be9bf28d8e57d67883cba9fcadfcff8caab667f8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/mockery/mockery/zipball/be9bf28d8e57d67883cba9fcadfcff8caab667f8",
+                "reference": "be9bf28d8e57d67883cba9fcadfcff8caab667f8",
+                "shasum": ""
+            },
+            "require": {
+                "hamcrest/hamcrest-php": "~1.1",
+                "lib-pcre": ">=7.0",
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.9.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Mockery": "library/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Pádraic Brady",
+                    "email": "padraic.brady@gmail.com",
+                    "homepage": "http://blog.astrumfutura.com"
+                },
+                {
+                    "name": "Dave Marshall",
+                    "email": "dave.marshall@atstsolutions.co.uk",
+                    "homepage": "http://davedevelopment.co.uk"
+                }
+            ],
+            "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.",
+            "homepage": "http://github.com/padraic/mockery",
+            "keywords": [
+                "BDD",
+                "TDD",
+                "library",
+                "mock",
+                "mock objects",
+                "mockery",
+                "stub",
+                "test",
+                "test double",
+                "testing"
+            ],
+            "time": "2019-02-12T16:07:13+00:00"
+        },
+        {
+            "name": "myclabs/deep-copy",
+            "version": "1.7.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/myclabs/DeepCopy.git",
+                "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
+                "reference": "3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.6 || ^7.0"
+            },
+            "require-dev": {
+                "doctrine/collections": "^1.0",
+                "doctrine/common": "^2.6",
+                "phpunit/phpunit": "^4.1"
+            },
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "DeepCopy\\": "src/DeepCopy/"
+                },
+                "files": [
+                    "src/DeepCopy/deep_copy.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "description": "Create deep copies (clones) of your objects",
+            "keywords": [
+                "clone",
+                "copy",
+                "duplicate",
+                "object",
+                "object graph"
+            ],
+            "time": "2017-10-19T19:58:43+00:00"
+        },
+        {
+            "name": "phpdocumentor/reflection-common",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+                "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+                "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.6"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": [
+                        "src"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jaap van Otterdijk",
+                    "email": "opensource@ijaap.nl"
+                }
+            ],
+            "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+            "homepage": "http://www.phpdoc.org",
+            "keywords": [
+                "FQSEN",
+                "phpDocumentor",
+                "phpdoc",
+                "reflection",
+                "static analysis"
+            ],
+            "time": "2017-09-11T18:02:19+00:00"
+        },
+        {
+            "name": "phpdocumentor/reflection-docblock",
+            "version": "4.3.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+                "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/b83ff7cfcfee7827e1e78b637a5904fe6a96698e",
+                "reference": "b83ff7cfcfee7827e1e78b637a5904fe6a96698e",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0",
+                "phpdocumentor/reflection-common": "^1.0.0 || ^2.0.0",
+                "phpdocumentor/type-resolver": "~0.4 || ^1.0.0",
+                "webmozart/assert": "^1.0"
+            },
+            "require-dev": {
+                "doctrine/instantiator": "^1.0.5",
+                "mockery/mockery": "^1.0",
+                "phpunit/phpunit": "^6.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": [
+                        "src/"
+                    ]
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "me@mikevanriel.com"
+                }
+            ],
+            "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+            "time": "2019-09-12T14:27:41+00:00"
+        },
+        {
+            "name": "phpdocumentor/type-resolver",
+            "version": "0.5.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpDocumentor/TypeResolver.git",
+                "reference": "cf842904952e64e703800d094cdf34e715a8a3ae"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/cf842904952e64e703800d094cdf34e715a8a3ae",
+                "reference": "cf842904952e64e703800d094cdf34e715a8a3ae",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^7.0",
+                "phpdocumentor/reflection-common": "^1.0"
+            },
+            "require-dev": {
+                "mockery/mockery": "^1.0",
+                "phpunit/phpunit": "^6.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "phpDocumentor\\Reflection\\": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "me@mikevanriel.com"
+                }
+            ],
+            "time": "2017-12-30T13:23:38+00:00"
+        },
+        {
+            "name": "phpspec/prophecy",
+            "version": "1.9.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpspec/prophecy.git",
+                "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/f6811d96d97bdf400077a0cc100ae56aa32b9203",
+                "reference": "f6811d96d97bdf400077a0cc100ae56aa32b9203",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "^1.0.2",
+                "php": "^5.3|^7.0",
+                "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0|^5.0",
+                "sebastian/comparator": "^1.1|^2.0|^3.0",
+                "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+            },
+            "require-dev": {
+                "phpspec/phpspec": "^2.5|^3.2",
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.8.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Prophecy\\": "src/Prophecy"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@gmail.com",
+                    "homepage": "http://everzet.com"
+                },
+                {
+                    "name": "Marcello Duarte",
+                    "email": "marcello.duarte@gmail.com"
+                }
+            ],
+            "description": "Highly opinionated mocking framework for PHP 5.3+",
+            "homepage": "https://github.com/phpspec/prophecy",
+            "keywords": [
+                "Double",
+                "Dummy",
+                "fake",
+                "mock",
+                "spy",
+                "stub"
+            ],
+            "time": "2019-10-03T11:07:50+00:00"
+        },
+        {
+            "name": "phpunit/php-code-coverage",
+            "version": "4.0.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+                "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-xmlwriter": "*",
+                "php": "^5.6 || ^7.0",
+                "phpunit/php-file-iterator": "^1.3",
+                "phpunit/php-text-template": "^1.2",
+                "phpunit/php-token-stream": "^1.4.2 || ^2.0",
+                "sebastian/code-unit-reverse-lookup": "^1.0",
+                "sebastian/environment": "^1.3.2 || ^2.0",
+                "sebastian/version": "^1.0 || ^2.0"
+            },
+            "require-dev": {
+                "ext-xdebug": "^2.1.4",
+                "phpunit/phpunit": "^5.7"
+            },
+            "suggest": {
+                "ext-xdebug": "^2.5.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+            "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+            "keywords": [
+                "coverage",
+                "testing",
+                "xunit"
+            ],
+            "time": "2017-04-02T07:44:40+00:00"
+        },
+        {
+            "name": "phpunit/php-file-iterator",
+            "version": "1.4.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4",
+                "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+            "keywords": [
+                "filesystem",
+                "iterator"
+            ],
+            "time": "2017-11-27T13:52:08+00:00"
+        },
+        {
+            "name": "phpunit/php-text-template",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "keywords": [
+                "template"
+            ],
+            "time": "2015-06-21T13:50:34+00:00"
+        },
+        {
+            "name": "phpunit/php-timer",
+            "version": "1.0.9",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+                "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.3 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Utility class for timing",
+            "homepage": "https://github.com/sebastianbergmann/php-timer/",
+            "keywords": [
+                "timer"
+            ],
+            "time": "2017-02-26T11:10:40+00:00"
+        },
+        {
+            "name": "phpunit/php-token-stream",
+            "version": "2.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+                "reference": "791198a2c6254db10131eecfe8c06670700904db"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db",
+                "reference": "791198a2c6254db10131eecfe8c06670700904db",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": "^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^6.2.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Wrapper around PHP's tokenizer extension.",
+            "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+            "keywords": [
+                "tokenizer"
+            ],
+            "time": "2017-11-27T05:48:46+00:00"
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "5.7.27",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
+                "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-libxml": "*",
+                "ext-mbstring": "*",
+                "ext-xml": "*",
+                "myclabs/deep-copy": "~1.3",
+                "php": "^5.6 || ^7.0",
+                "phpspec/prophecy": "^1.6.2",
+                "phpunit/php-code-coverage": "^4.0.4",
+                "phpunit/php-file-iterator": "~1.4",
+                "phpunit/php-text-template": "~1.2",
+                "phpunit/php-timer": "^1.0.6",
+                "phpunit/phpunit-mock-objects": "^3.2",
+                "sebastian/comparator": "^1.2.4",
+                "sebastian/diff": "^1.4.3",
+                "sebastian/environment": "^1.3.4 || ^2.0",
+                "sebastian/exporter": "~2.0",
+                "sebastian/global-state": "^1.1",
+                "sebastian/object-enumerator": "~2.0",
+                "sebastian/resource-operations": "~1.0",
+                "sebastian/version": "^1.0.6|^2.0.1",
+                "symfony/yaml": "~2.1|~3.0|~4.0"
+            },
+            "conflict": {
+                "phpdocumentor/reflection-docblock": "3.0.2"
+            },
+            "require-dev": {
+                "ext-pdo": "*"
+            },
+            "suggest": {
+                "ext-xdebug": "*",
+                "phpunit/php-invoker": "~1.1"
+            },
+            "bin": [
+                "phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "5.7.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "The PHP Unit Testing framework.",
+            "homepage": "https://phpunit.de/",
+            "keywords": [
+                "phpunit",
+                "testing",
+                "xunit"
+            ],
+            "time": "2018-02-01T05:50:59+00:00"
+        },
+        {
+            "name": "phpunit/phpunit-mock-objects",
+            "version": "3.4.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+                "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118",
+                "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "^1.0.2",
+                "php": "^5.6 || ^7.0",
+                "phpunit/php-text-template": "^1.2",
+                "sebastian/exporter": "^1.2 || ^2.0"
+            },
+            "conflict": {
+                "phpunit/phpunit": "<5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.4"
+            },
+            "suggest": {
+                "ext-soap": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.2.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Mock Object library for PHPUnit",
+            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+            "keywords": [
+                "mock",
+                "xunit"
+            ],
+            "abandoned": true,
+            "time": "2017-06-30T09:13:00+00:00"
+        },
+        {
+            "name": "sebastian/code-unit-reverse-lookup",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+                "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.6 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.7 || ^6.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Looks up which function or method a line of code belongs to",
+            "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+            "time": "2017-03-04T06:30:41+00:00"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "1.2.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/comparator.git",
+                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+                "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/diff": "~1.2",
+                "sebastian/exporter": "~1.2 || ~2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides the functionality to compare PHP values for equality",
+            "homepage": "http://www.github.com/sebastianbergmann/comparator",
+            "keywords": [
+                "comparator",
+                "compare",
+                "equality"
+            ],
+            "time": "2017-01-29T09:50:25+00:00"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "1.4.3",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+                "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.3 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Kore Nordmann",
+                    "email": "mail@kore-nordmann.de"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Diff implementation",
+            "homepage": "https://github.com/sebastianbergmann/diff",
+            "keywords": [
+                "diff"
+            ],
+            "time": "2017-05-22T07:24:03+00:00"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+                "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.6 || ^7.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^5.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides functionality to handle HHVM/PHP environments",
+            "homepage": "http://www.github.com/sebastianbergmann/environment",
+            "keywords": [
+                "Xdebug",
+                "environment",
+                "hhvm"
+            ],
+            "time": "2016-11-26T07:53:53+00:00"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+                "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/recursion-context": "~2.0"
+            },
+            "require-dev": {
+                "ext-mbstring": "*",
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Volker Dusch",
+                    "email": "github@wallbash.com"
+                },
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@2bepublished.at"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides the functionality to export PHP variables for visualization",
+            "homepage": "http://www.github.com/sebastianbergmann/exporter",
+            "keywords": [
+                "export",
+                "exporter"
+            ],
+            "time": "2016-11-19T08:54:04+00:00"
+        },
+        {
+            "name": "sebastian/global-state",
+            "version": "1.1.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/global-state.git",
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "suggest": {
+                "ext-uopz": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Snapshotting of global state",
+            "homepage": "http://www.github.com/sebastianbergmann/global-state",
+            "keywords": [
+                "global state"
+            ],
+            "time": "2015-10-12T03:26:01+00:00"
+        },
+        {
+            "name": "sebastian/object-enumerator",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
+                "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6",
+                "sebastian/recursion-context": "~2.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~5"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+            "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+            "time": "2017-02-18T15:18:39+00:00"
+        },
+        {
+            "name": "sebastian/recursion-context",
+            "version": "2.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/recursion-context.git",
+                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+                "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Jeff Welch",
+                    "email": "whatthejeff@gmail.com"
+                },
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                },
+                {
+                    "name": "Adam Harvey",
+                    "email": "aharvey@php.net"
+                }
+            ],
+            "description": "Provides functionality to recursively process PHP variables",
+            "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+            "time": "2016-11-19T07:33:16+00:00"
+        },
+        {
+            "name": "sebastian/resource-operations",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/resource-operations.git",
+                "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+                "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de"
+                }
+            ],
+            "description": "Provides a list of PHP built-in functions that operate on resources",
+            "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+            "time": "2015-07-28T20:34:47+00:00"
+        },
+        {
+            "name": "sebastian/version",
+            "version": "2.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/version.git",
+                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+                "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.6"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "autoload": {
+                "classmap": [
+                    "src/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sebastian@phpunit.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+            "homepage": "https://github.com/sebastianbergmann/version",
+            "time": "2016-10-03T07:35:21+00:00"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "v3.3.6",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/yaml.git",
+                "reference": "ddc23324e6cfe066f3dd34a37ff494fa80b617ed"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/ddc23324e6cfe066f3dd34a37ff494fa80b617ed",
+                "reference": "ddc23324e6cfe066f3dd34a37ff494fa80b617ed",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "require-dev": {
+                "symfony/console": "~2.8|~3.0"
+            },
+            "suggest": {
+                "symfony/console": "For validating YAML files using the lint command"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Yaml\\": ""
+                },
+                "exclude-from-classmap": [
+                    "/Tests/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Yaml Component",
+            "homepage": "https://symfony.com",
+            "time": "2017-07-23T12:43:26+00:00"
+        },
+        {
+            "name": "webmozart/assert",
+            "version": "1.5.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/webmozart/assert.git",
+                "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/webmozart/assert/zipball/88e6d84706d09a236046d686bbea96f07b3a34f4",
+                "reference": "88e6d84706d09a236046d686bbea96f07b3a34f4",
+                "shasum": ""
+            },
+            "require": {
+                "php": "^5.3.3 || ^7.0",
+                "symfony/polyfill-ctype": "^1.8"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.8.36 || ^7.5.13"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Webmozart\\Assert\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Bernhard Schussek",
+                    "email": "bschussek@gmail.com"
+                }
+            ],
+            "description": "Assertions to validate method input/output with nice error messages.",
+            "keywords": [
+                "assert",
+                "check",
+                "validate"
+            ],
+            "time": "2019-08-24T08:43:50+00:00"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">=5.6.4"
+    },
+    "platform-dev": []
+}

+ 49 - 0
config/admin.php

@@ -0,0 +1,49 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: FZS
+ * Time: 2018/10/11 11:10
+ */
+return [
+    //user
+    'user_table'                            =>  'admin_users',
+    'user_table_cannot_manage_ids'          =>  '1',
+
+    //role
+    'role'                                  => 'App\Models\Role',
+    'role_table'                            => 'admin_roles',
+    'role_user_table'                       => 'admin_role_user',
+    'role_foreign_key'                      => 'role_id',
+    'user_foreign_key'                      => 'user_id',
+    'role_admin'                            => 'admin',
+    'role_auth_page'                        =>  'errors.role',
+    'role_table_cannot_manage_ids'          =>  '1',
+
+    //permission
+    'permission'                            => 'App\Models\Permission',
+    'permission_table'                      => 'admin_permissions',
+    'permission_role_table'                 => 'admin_permission_role',
+    'permission_name'                       => 'name',
+    'permission_display_name'               => 'display_name',
+    'permission_controller'                 => 'controllers',
+    'permission_menu_table'                 => 'admin_permission_menu',
+    'permission_foreign_key'                => 'permission_id',
+    'permission_table_cannot_manage_ids'    => '1,2,3,4,5,6,7,8,9',
+
+    //menu
+    'menu'                                  => 'App\Models\Menu',
+    'menu_table'                            => 'admin_menus',
+    'menu_role_table'                       => 'admin_role_menu',
+    'menu_foreign_key'                      => 'menu_id',
+    'menu_table_id_key'                     => 'id',
+    'menu_table_parent_id_key'              => 'parent_id',
+    'menu_table_cannot_manage_ids'          =>  '1,2,3,4,5,6,7',
+
+    'db_log'                                =>  env('DB_LOG', false),
+    //cache
+    'admin_permissions_for_role_id'           =>'ap_id',
+    //cannot del
+    'cannot_del_admin_ids'          =>  '1',
+    'cannot_del_admin_ids'          =>  '1',
+
+];

+ 231 - 0
config/app.php

@@ -0,0 +1,231 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Name
+    |--------------------------------------------------------------------------
+    |
+    | This value is the name of your application. This value is used when the
+    | framework needs to place the application's name in a notification or
+    | any other location as required by the application or its packages.
+    */
+
+    'name' => env('APP_NAME', 'Laravel'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Environment
+    |--------------------------------------------------------------------------
+    |
+    | This value determines the "environment" your application is currently
+    | running in. This may determine how you prefer to configure various
+    | services your application utilizes. Set this in your ".env" file.
+    |
+    */
+
+    'env' => env('APP_ENV', 'production'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Debug Mode
+    |--------------------------------------------------------------------------
+    |
+    | When your application is in debug mode, detailed error messages with
+    | stack traces will be shown on every error that occurs within your
+    | application. If disabled, a simple generic error page is shown.
+    |
+    */
+
+    'debug' => env('APP_DEBUG', true),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application URL
+    |--------------------------------------------------------------------------
+    |
+    | This URL is used by the console to properly generate URLs when using
+    | the Artisan command line tool. You should set this to the root of
+    | your application so that it is used when running Artisan tasks.
+    |
+    */
+
+    'url' => env('APP_URL', 'http://localhost'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Timezone
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the default timezone for your application, which
+    | will be used by the PHP date and date-time functions. We have gone
+    | ahead and set this to a sensible default for you out of the box.
+    |
+    */
+
+    'timezone' => 'Asia/Shanghai',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Locale Configuration
+    |--------------------------------------------------------------------------
+    |
+    | The application locale determines the default locale that will be used
+    | by the translation service provider. You are free to set this value
+    | to any of the locales which will be supported by the application.
+    |
+    */
+
+    'locale' => 'zh',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Application Fallback Locale
+    |--------------------------------------------------------------------------
+    |
+    | The fallback locale determines the locale to use when the current one
+    | is not available. You may change the value to correspond to any of
+    | the language folders that are provided through your application.
+    |
+    */
+
+    'fallback_locale' => 'en',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Encryption Key
+    |--------------------------------------------------------------------------
+    |
+    | This key is used by the Illuminate encrypter service and should be set
+    | to a random, 32 character string, otherwise these encrypted strings
+    | will not be safe. Please do this before deploying an application!
+    |
+    */
+
+    'key' => env('APP_KEY'),
+
+    'cipher' => 'AES-256-CBC',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Logging Configuration
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure the log settings for your application. Out of
+    | the box, Laravel uses the Monolog PHP logging library. This gives
+    | you a variety of powerful log handlers / formatters to utilize.
+    |
+    | Available Settings: "single", "daily", "syslog", "errorlog"
+    |
+    */
+
+    'log' => env('APP_LOG', 'single'),
+
+    'log_level' => env('APP_LOG_LEVEL', 'debug'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Autoloaded Service Providers
+    |--------------------------------------------------------------------------
+    |
+    | The service providers listed here will be automatically loaded on the
+    | request to your application. Feel free to add your own services to
+    | this array to grant expanded functionality to your applications.
+    |
+    */
+
+    'providers' => [
+
+        /*
+         * Laravel Framework Service Providers...
+         */
+        Illuminate\Auth\AuthServiceProvider::class,
+        Illuminate\Broadcasting\BroadcastServiceProvider::class,
+        Illuminate\Bus\BusServiceProvider::class,
+        Illuminate\Cache\CacheServiceProvider::class,
+        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
+        Illuminate\Cookie\CookieServiceProvider::class,
+        Illuminate\Database\DatabaseServiceProvider::class,
+        Illuminate\Encryption\EncryptionServiceProvider::class,
+        Illuminate\Filesystem\FilesystemServiceProvider::class,
+        Illuminate\Foundation\Providers\FoundationServiceProvider::class,
+        Illuminate\Hashing\HashServiceProvider::class,
+        Illuminate\Mail\MailServiceProvider::class,
+        Illuminate\Notifications\NotificationServiceProvider::class,
+        Illuminate\Pagination\PaginationServiceProvider::class,
+        Illuminate\Pipeline\PipelineServiceProvider::class,
+        Illuminate\Queue\QueueServiceProvider::class,
+        Illuminate\Redis\RedisServiceProvider::class,
+        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
+        Illuminate\Session\SessionServiceProvider::class,
+        Illuminate\Translation\TranslationServiceProvider::class,
+        Illuminate\Validation\ValidationServiceProvider::class,
+        Illuminate\View\ViewServiceProvider::class,
+
+        /*
+         * Package Service Providers...
+         */
+        Laravel\Tinker\TinkerServiceProvider::class,
+
+        /*
+         * Application Service Providers...
+         */
+        App\Providers\AppServiceProvider::class,
+        App\Providers\AuthServiceProvider::class,
+        // App\Providers\BroadcastServiceProvider::class,
+        App\Providers\EventServiceProvider::class,
+        App\Providers\RouteServiceProvider::class,
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Class Aliases
+    |--------------------------------------------------------------------------
+    |
+    | This array of class aliases will be registered when this application
+    | is started. However, feel free to register as many as you wish as
+    | the aliases are "lazy" loaded so they don't hinder performance.
+    |
+    */
+
+    'aliases' => [
+
+        'App' => Illuminate\Support\Facades\App::class,
+        'Artisan' => Illuminate\Support\Facades\Artisan::class,
+        'Auth' => Illuminate\Support\Facades\Auth::class,
+        'Blade' => Illuminate\Support\Facades\Blade::class,
+        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
+        'Bus' => Illuminate\Support\Facades\Bus::class,
+        'Cache' => Illuminate\Support\Facades\Cache::class,
+        'Config' => Illuminate\Support\Facades\Config::class,
+        'Cookie' => Illuminate\Support\Facades\Cookie::class,
+        'Crypt' => Illuminate\Support\Facades\Crypt::class,
+        'DB' => Illuminate\Support\Facades\DB::class,
+        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
+        'Event' => Illuminate\Support\Facades\Event::class,
+        'File' => Illuminate\Support\Facades\File::class,
+        'Gate' => Illuminate\Support\Facades\Gate::class,
+        'Hash' => Illuminate\Support\Facades\Hash::class,
+        'Lang' => Illuminate\Support\Facades\Lang::class,
+        'Log' => Illuminate\Support\Facades\Log::class,
+        'Mail' => Illuminate\Support\Facades\Mail::class,
+        'Notification' => Illuminate\Support\Facades\Notification::class,
+        'Password' => Illuminate\Support\Facades\Password::class,
+        'Queue' => Illuminate\Support\Facades\Queue::class,
+        'Redirect' => Illuminate\Support\Facades\Redirect::class,
+        'Redis' => Illuminate\Support\Facades\Redis::class,
+        'Request' => Illuminate\Support\Facades\Request::class,
+        'Response' => Illuminate\Support\Facades\Response::class,
+        'Route' => Illuminate\Support\Facades\Route::class,
+        'Schema' => Illuminate\Support\Facades\Schema::class,
+        'Session' => Illuminate\Support\Facades\Session::class,
+        'Storage' => Illuminate\Support\Facades\Storage::class,
+        'URL' => Illuminate\Support\Facades\URL::class,
+        'Validator' => Illuminate\Support\Facades\Validator::class,
+        'View' => Illuminate\Support\Facades\View::class,
+
+    ],
+
+];

+ 102 - 0
config/auth.php

@@ -0,0 +1,102 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Authentication Defaults
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default authentication "guard" and password
+    | reset options for your application. You may change these defaults
+    | as required, but they're a perfect start for most applications.
+    |
+    */
+
+    'defaults' => [
+        'guard' => 'web',
+        'passwords' => 'users',
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Authentication Guards
+    |--------------------------------------------------------------------------
+    |
+    | Next, you may define every authentication guard for your application.
+    | Of course, a great default configuration has been defined for you
+    | here which uses session storage and the Eloquent user provider.
+    |
+    | All authentication drivers have a user provider. This defines how the
+    | users are actually retrieved out of your database or other storage
+    | mechanisms used by this application to persist your user's data.
+    |
+    | Supported: "session", "token"
+    |
+    */
+
+    'guards' => [
+        'web' => [
+            'driver' => 'session',
+            'provider' => 'users',
+        ],
+
+        'api' => [
+            'driver' => 'token',
+            'provider' => 'users',
+        ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | User Providers
+    |--------------------------------------------------------------------------
+    |
+    | All authentication drivers have a user provider. This defines how the
+    | users are actually retrieved out of your database or other storage
+    | mechanisms used by this application to persist your user's data.
+    |
+    | If you have multiple user tables or models you may configure multiple
+    | sources which represent each model / table. These sources may then
+    | be assigned to any extra authentication guards you have defined.
+    |
+    | Supported: "database", "eloquent"
+    |
+    */
+
+    'providers' => [
+        'users' => [
+            'driver' => 'eloquent',
+            'model' => App\Models\User::class,
+        ],
+
+        // 'users' => [
+        //     'driver' => 'database',
+        //     'table' => 'users',
+        // ],
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Resetting Passwords
+    |--------------------------------------------------------------------------
+    |
+    | You may specify multiple password reset configurations if you have more
+    | than one user table or model in the application and you want to have
+    | separate password reset settings based on the specific user types.
+    |
+    | The expire time is the number of minutes that the reset token should be
+    | considered valid. This security feature keeps tokens short-lived so
+    | they have less time to be guessed. You may change this as needed.
+    |
+    */
+
+    'passwords' => [
+        'users' => [
+            'provider' => 'users',
+            'table' => 'password_resets',
+            'expire' => 60,
+        ],
+    ],
+
+];

+ 58 - 0
config/broadcasting.php

@@ -0,0 +1,58 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Broadcaster
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default broadcaster that will be used by the
+    | framework when an event needs to be broadcast. You may set this to
+    | any of the connections defined in the "connections" array below.
+    |
+    | Supported: "pusher", "redis", "log", "null"
+    |
+    */
+
+    'default' => env('BROADCAST_DRIVER', 'null'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Broadcast Connections
+    |--------------------------------------------------------------------------
+    |
+    | Here you may define all of the broadcast connections that will be used
+    | to broadcast events to other systems or over websockets. Samples of
+    | each available type of connection are provided inside this array.
+    |
+    */
+
+    'connections' => [
+
+        'pusher' => [
+            'driver' => 'pusher',
+            'key' => env('PUSHER_APP_KEY'),
+            'secret' => env('PUSHER_APP_SECRET'),
+            'app_id' => env('PUSHER_APP_ID'),
+            'options' => [
+                //
+            ],
+        ],
+
+        'redis' => [
+            'driver' => 'redis',
+            'connection' => 'default',
+        ],
+
+        'log' => [
+            'driver' => 'log',
+        ],
+
+        'null' => [
+            'driver' => 'null',
+        ],
+
+    ],
+
+];

+ 91 - 0
config/cache.php

@@ -0,0 +1,91 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Cache Store
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default cache connection that gets used while
+    | using this caching library. This connection is used when another is
+    | not explicitly specified when executing a given caching function.
+    |
+    | Supported: "apc", "array", "database", "file", "memcached", "redis"
+    |
+    */
+
+    'default' => env('CACHE_DRIVER', 'file'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Cache Stores
+    |--------------------------------------------------------------------------
+    |
+    | Here you may define all of the cache "stores" for your application as
+    | well as their drivers. You may even define multiple stores for the
+    | same cache driver to group types of items stored in your caches.
+    |
+    */
+
+    'stores' => [
+
+        'apc' => [
+            'driver' => 'apc',
+        ],
+
+        'array' => [
+            'driver' => 'array',
+        ],
+
+        'database' => [
+            'driver' => 'database',
+            'table' => 'cache',
+            'connection' => null,
+        ],
+
+        'file' => [
+            'driver' => 'file',
+            'path' => storage_path('framework/cache/data'),
+        ],
+
+        'memcached' => [
+            'driver' => 'memcached',
+            'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
+            'sasl' => [
+                env('MEMCACHED_USERNAME'),
+                env('MEMCACHED_PASSWORD'),
+            ],
+            'options' => [
+                // Memcached::OPT_CONNECT_TIMEOUT  => 2000,
+            ],
+            'servers' => [
+                [
+                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
+                    'port' => env('MEMCACHED_PORT', 11211),
+                    'weight' => 100,
+                ],
+            ],
+        ],
+
+        'redis' => [
+            'driver' => 'redis',
+            'connection' => 'default',
+        ],
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Cache Key Prefix
+    |--------------------------------------------------------------------------
+    |
+    | When utilizing a RAM based store such as APC or Memcached, there might
+    | be other applications utilizing the same cache. So, we'll specify a
+    | value to get prefixed to all our keys so we can avoid collisions.
+    |
+    */
+
+    'prefix' => 'laravel',
+
+];

+ 120 - 0
config/database.php

@@ -0,0 +1,120 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Database Connection Name
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify which of the database connections below you wish
+    | to use as your default connection for all database work. Of course
+    | you may use many connections at once using the Database library.
+    |
+    */
+
+    'default' => env('DB_CONNECTION', 'mysql'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Database Connections
+    |--------------------------------------------------------------------------
+    |
+    | Here are each of the database connections setup for your application.
+    | Of course, examples of configuring each database platform that is
+    | supported by Laravel is shown below to make development simple.
+    |
+    |
+    | All database work in Laravel is done through the PHP PDO facilities
+    | so make sure you have the driver for your particular database of
+    | choice installed on your machine before you begin development.
+    |
+    */
+
+    'connections' => [
+
+        'sqlite' => [
+            'driver' => 'sqlite',
+            'database' => env('DB_DATABASE', database_path('database.sqlite')),
+            'prefix' => '',
+        ],
+
+        'mysql' => [
+            'driver' => 'mysql',
+            'host' => env('DB_HOST', '127.0.0.1'),
+            'port' => env('DB_PORT', '3306'),
+            'database' => env('DB_DATABASE', 'forge'),
+            'username' => env('DB_USERNAME', 'forge'),
+            'password' => env('DB_PASSWORD', ''),
+            'unix_socket' => env('DB_SOCKET', ''),
+            'charset' => 'utf8mb4',
+            'collation' => 'utf8mb4_unicode_ci',
+            'prefix' => '',
+            'strict' => true,
+            'engine' => null,
+        ],
+
+        'pgsql' => [
+            'driver' => 'pgsql',
+            'host' => env('DB_HOST', '127.0.0.1'),
+            'port' => env('DB_PORT', '5432'),
+            'database' => env('DB_DATABASE', 'forge'),
+            'username' => env('DB_USERNAME', 'forge'),
+            'password' => env('DB_PASSWORD', ''),
+            'charset' => 'utf8',
+            'prefix' => '',
+            'schema' => 'public',
+            'sslmode' => 'prefer',
+        ],
+
+        'sqlsrv' => [
+            'driver' => 'sqlsrv',
+            'host' => env('DB_HOST', 'localhost'),
+            'port' => env('DB_PORT', '1433'),
+            'database' => env('DB_DATABASE', 'forge'),
+            'username' => env('DB_USERNAME', 'forge'),
+            'password' => env('DB_PASSWORD', ''),
+            'charset' => 'utf8',
+            'prefix' => '',
+        ],
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Migration Repository Table
+    |--------------------------------------------------------------------------
+    |
+    | This table keeps track of all the migrations that have already run for
+    | your application. Using this information, we can determine which of
+    | the migrations on disk haven't actually been run in the database.
+    |
+    */
+
+    'migrations' => 'migrations',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Redis Databases
+    |--------------------------------------------------------------------------
+    |
+    | Redis is an open source, fast, and advanced key-value store that also
+    | provides a richer set of commands than a typical key-value systems
+    | such as APC or Memcached. Laravel makes it easy to dig right in.
+    |
+    */
+
+    'redis' => [
+
+        'client' => 'predis',
+
+        'default' => [
+            'host' => env('REDIS_HOST', '127.0.0.1'),
+            'password' => env('REDIS_PASSWORD', null),
+            'port' => env('REDIS_PORT', 6379),
+            'database' => 0,
+        ],
+
+    ],
+
+];

+ 98 - 0
config/filesystems.php

@@ -0,0 +1,98 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Filesystem Disk
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the default filesystem disk that should be used
+    | by the framework. The "local" disk, as well as a variety of cloud
+    | based disks are available to your application. Just store away!
+    |
+    */
+
+    'default' => env('FILESYSTEM_DRIVER', 'local'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Cloud Filesystem Disk
+    |--------------------------------------------------------------------------
+    |
+    | Many applications store files both locally and in the cloud. For this
+    | reason, you may specify a default "cloud" driver here. This driver
+    | will be bound as the Cloud disk implementation in the container.
+    |
+    */
+
+    'cloud' => env('FILESYSTEM_CLOUD', 's3'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Filesystem Disks
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure as many filesystem "disks" as you wish, and you
+    | may even configure multiple disks of the same driver. Defaults have
+    | been setup for each driver as an example of the required options.
+    |
+    | Supported Drivers: "local", "ftp", "s3", "rackspace"
+    |
+    */
+
+    'disks' => [
+
+        'local' => [
+            'driver' => 'local',
+            'root' => storage_path('app'),
+        ],
+
+        'public' => [
+            'driver' => 'local',
+            'root' => storage_path('app/public'),
+            'url' => env('APP_URL').'/storage',
+            'visibility' => 'public',
+        ],
+
+        's3' => [
+            'driver' => 's3',
+            'key' => env('AWS_KEY'),
+            'secret' => env('AWS_SECRET'),
+            'region' => env('AWS_REGION'),
+            'bucket' => env('AWS_BUCKET'),
+        ],
+        'article' => [
+            'driver' => 'local',
+            'root' => public_path('/uploads/ico'), // public_path 就是public的路径
+            'url' => env('APP_URL').'/storage',
+            'visibility' => 'public',
+        ],
+        'articles' => [
+            'driver' => 'local',
+            'root' => public_path('/uploads/imgs'), // public_path 就是public的路径
+            'url' => env('APP_URL').'/storage',
+            'visibility' => 'public',
+        ],
+        'articless' => [
+            'driver' => 'local',
+            'root' => public_path('/uploads/imgs'), // public_path 就是public的路径
+            'url' => env('APP_URL').'/storage',
+            'visibility' => 'public',
+        ],
+        'uploads' =>[
+            'driver' => 'local',
+            'root' => public_path('uploads'),
+        ],
+
+       /* 's3' => [
+            'driver' => 's3',
+            'key' => env('AWS_ACCESS_KEY_ID'),
+            'secret' => env('AWS_SECRET_ACCESS_KEY'),
+            'region' => env('AWS_DEFAULT_REGION'),
+            'bucket' => env('AWS_BUCKET'),
+            'url' => env('AWS_URL'),*/
+
+    ],
+
+];

+ 123 - 0
config/mail.php

@@ -0,0 +1,123 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Mail Driver
+    |--------------------------------------------------------------------------
+    |
+    | Laravel supports both SMTP and PHP's "mail" function as drivers for the
+    | sending of e-mail. You may specify which one you're using throughout
+    | your application here. By default, Laravel is setup for SMTP mail.
+    |
+    | Supported: "smtp", "sendmail", "mailgun", "mandrill", "ses",
+    |            "sparkpost", "log", "array"
+    |
+    */
+
+    'driver' => env('MAIL_DRIVER', 'smtp'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | SMTP Host Address
+    |--------------------------------------------------------------------------
+    |
+    | Here you may provide the host address of the SMTP server used by your
+    | applications. A default option is provided that is compatible with
+    | the Mailgun mail service which will provide reliable deliveries.
+    |
+    */
+
+    'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | SMTP Host Port
+    |--------------------------------------------------------------------------
+    |
+    | This is the SMTP port used by your application to deliver e-mails to
+    | users of the application. Like the host we have set this value to
+    | stay compatible with the Mailgun e-mail application by default.
+    |
+    */
+
+    'port' => env('MAIL_PORT', 587),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Global "From" Address
+    |--------------------------------------------------------------------------
+    |
+    | You may wish for all e-mails sent by your application to be sent from
+    | the same address. Here, you may specify a name and address that is
+    | used globally for all e-mails that are sent by your application.
+    |
+    */
+
+    'from' => [
+        'address' => env('MAIL_FROM_ADDRESS', 'hello@example.com'),
+        'name' => env('MAIL_FROM_NAME', 'Example'),
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | E-Mail Encryption Protocol
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the encryption protocol that should be used when
+    | the application send e-mail messages. A sensible default using the
+    | transport layer security protocol should provide great security.
+    |
+    */
+
+    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | SMTP Server Username
+    |--------------------------------------------------------------------------
+    |
+    | If your SMTP server requires a username for authentication, you should
+    | set it here. This will get used to authenticate with your server on
+    | connection. You may also set the "password" value below this one.
+    |
+    */
+
+    'username' => env('MAIL_USERNAME'),
+
+    'password' => env('MAIL_PASSWORD'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Sendmail System Path
+    |--------------------------------------------------------------------------
+    |
+    | When using the "sendmail" driver to send e-mails, we will need to know
+    | the path to where Sendmail lives on this server. A default path has
+    | been provided here, which will work well on most of your systems.
+    |
+    */
+
+    'sendmail' => '/usr/sbin/sendmail -bs',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Markdown Mail Settings
+    |--------------------------------------------------------------------------
+    |
+    | If you are using Markdown based email rendering, you may configure your
+    | theme and component paths here, allowing you to customize the design
+    | of the emails. Or, you may simply stick with the Laravel defaults!
+    |
+    */
+
+    'markdown' => [
+        'theme' => 'default',
+
+        'paths' => [
+            resource_path('views/vendor/mail'),
+        ],
+    ],
+
+];

+ 85 - 0
config/queue.php

@@ -0,0 +1,85 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Queue Driver
+    |--------------------------------------------------------------------------
+    |
+    | Laravel's queue API supports an assortment of back-ends via a single
+    | API, giving you convenient access to each back-end using the same
+    | syntax for each one. Here you may set the default queue driver.
+    |
+    | Supported: "sync", "database", "beanstalkd", "sqs", "redis", "null"
+    |
+    */
+
+    'default' => env('QUEUE_DRIVER', 'sync'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Queue Connections
+    |--------------------------------------------------------------------------
+    |
+    | Here you may configure the connection information for each server that
+    | is used by your application. A default configuration has been added
+    | for each back-end shipped with Laravel. You are free to add more.
+    |
+    */
+
+    'connections' => [
+
+        'sync' => [
+            'driver' => 'sync',
+        ],
+
+        'database' => [
+            'driver' => 'database',
+            'table' => 'jobs',
+            'queue' => 'default',
+            'retry_after' => 90,
+        ],
+
+        'beanstalkd' => [
+            'driver' => 'beanstalkd',
+            'host' => 'localhost',
+            'queue' => 'default',
+            'retry_after' => 90,
+        ],
+
+        'sqs' => [
+            'driver' => 'sqs',
+            'key' => 'your-public-key',
+            'secret' => 'your-secret-key',
+            'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id',
+            'queue' => 'your-queue-name',
+            'region' => 'us-east-1',
+        ],
+
+        'redis' => [
+            'driver' => 'redis',
+            'connection' => 'default',
+            'queue' => 'default',
+            'retry_after' => 90,
+        ],
+
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Failed Queue Jobs
+    |--------------------------------------------------------------------------
+    |
+    | These options configure the behavior of failed queue job logging so you
+    | can control which database and table are used to store the jobs that
+    | have failed. You may change them to any database / table you wish.
+    |
+    */
+
+    'failed' => [
+        'database' => env('DB_CONNECTION', 'mysql'),
+        'table' => 'failed_jobs',
+    ],
+
+];

+ 38 - 0
config/services.php

@@ -0,0 +1,38 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Third Party Services
+    |--------------------------------------------------------------------------
+    |
+    | This file is for storing the credentials for third party services such
+    | as Stripe, Mailgun, SparkPost and others. This file provides a sane
+    | default location for this type of information, allowing packages
+    | to have a conventional place to find your various credentials.
+    |
+    */
+
+    'mailgun' => [
+        'domain' => env('MAILGUN_DOMAIN'),
+        'secret' => env('MAILGUN_SECRET'),
+    ],
+
+    'ses' => [
+        'key' => env('SES_KEY'),
+        'secret' => env('SES_SECRET'),
+        'region' => 'us-east-1',
+    ],
+
+    'sparkpost' => [
+        'secret' => env('SPARKPOST_SECRET'),
+    ],
+
+    'stripe' => [
+        'model' => App\User::class,
+        'key' => env('STRIPE_KEY'),
+        'secret' => env('STRIPE_SECRET'),
+    ],
+
+];

+ 179 - 0
config/session.php

@@ -0,0 +1,179 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | Default Session Driver
+    |--------------------------------------------------------------------------
+    |
+    | This option controls the default session "driver" that will be used on
+    | requests. By default, we will use the lightweight native driver but
+    | you may specify any of the other wonderful drivers provided here.
+    |
+    | Supported: "file", "cookie", "database", "apc",
+    |            "memcached", "redis", "array"
+    |
+    */
+
+    'driver' => env('SESSION_DRIVER', 'file'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Lifetime
+    |--------------------------------------------------------------------------
+    |
+    | Here you may specify the number of minutes that you wish the session
+    | to be allowed to remain idle before it expires. If you want them
+    | to immediately expire on the browser closing, set that option.
+    |
+    */
+
+    'lifetime' => 120,
+
+    'expire_on_close' => false,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Encryption
+    |--------------------------------------------------------------------------
+    |
+    | This option allows you to easily specify that all of your session data
+    | should be encrypted before it is stored. All encryption will be run
+    | automatically by Laravel and you can use the Session like normal.
+    |
+    */
+
+    'encrypt' => false,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session File Location
+    |--------------------------------------------------------------------------
+    |
+    | When using the native session driver, we need a location where session
+    | files may be stored. A default has been set for you but a different
+    | location may be specified. This is only needed for file sessions.
+    |
+    */
+
+    'files' => storage_path('framework/sessions'),
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Database Connection
+    |--------------------------------------------------------------------------
+    |
+    | When using the "database" or "redis" session drivers, you may specify a
+    | connection that should be used to manage these sessions. This should
+    | correspond to a connection in your database configuration options.
+    |
+    */
+
+    'connection' => null,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Database Table
+    |--------------------------------------------------------------------------
+    |
+    | When using the "database" session driver, you may specify the table we
+    | should use to manage the sessions. Of course, a sensible default is
+    | provided for you; however, you are free to change this as needed.
+    |
+    */
+
+    'table' => 'sessions',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cache Store
+    |--------------------------------------------------------------------------
+    |
+    | When using the "apc" or "memcached" session drivers, you may specify a
+    | cache store that should be used for these sessions. This value must
+    | correspond with one of the application's configured cache stores.
+    |
+    */
+
+    'store' => null,
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Sweeping Lottery
+    |--------------------------------------------------------------------------
+    |
+    | Some session drivers must manually sweep their storage location to get
+    | rid of old sessions from storage. Here are the chances that it will
+    | happen on a given request. By default, the odds are 2 out of 100.
+    |
+    */
+
+    'lottery' => [2, 100],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cookie Name
+    |--------------------------------------------------------------------------
+    |
+    | Here you may change the name of the cookie used to identify a session
+    | instance by ID. The name specified here will get used every time a
+    | new session cookie is created by the framework for every driver.
+    |
+    */
+
+    'cookie' => 'laravel_session',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cookie Path
+    |--------------------------------------------------------------------------
+    |
+    | The session cookie path determines the path for which the cookie will
+    | be regarded as available. Typically, this will be the root path of
+    | your application but you are free to change this when necessary.
+    |
+    */
+
+    'path' => '/',
+
+    /*
+    |--------------------------------------------------------------------------
+    | Session Cookie Domain
+    |--------------------------------------------------------------------------
+    |
+    | Here you may change the domain of the cookie used to identify a session
+    | in your application. This will determine which domains the cookie is
+    | available to in your application. A sensible default has been set.
+    |
+    */
+
+    'domain' => env('SESSION_DOMAIN', null),
+
+    /*
+    |--------------------------------------------------------------------------
+    | HTTPS Only Cookies
+    |--------------------------------------------------------------------------
+    |
+    | By setting this option to true, session cookies will only be sent back
+    | to the server if the browser has a HTTPS connection. This will keep
+    | the cookie from being sent to you if it can not be done securely.
+    |
+    */
+
+    'secure' => env('SESSION_SECURE_COOKIE', false),
+
+    /*
+    |--------------------------------------------------------------------------
+    | HTTP Access Only
+    |--------------------------------------------------------------------------
+    |
+    | Setting this value to true will prevent JavaScript from accessing the
+    | value of the cookie and the cookie will only be accessible through
+    | the HTTP protocol. You are free to modify this option if needed.
+    |
+    */
+
+    'http_only' => true,
+
+];

+ 33 - 0
config/view.php

@@ -0,0 +1,33 @@
+<?php
+
+return [
+
+    /*
+    |--------------------------------------------------------------------------
+    | View Storage Paths
+    |--------------------------------------------------------------------------
+    |
+    | Most templating systems load templates from disk. Here you may specify
+    | an array of paths that should be checked for your views. Of course
+    | the usual Laravel view path has already been registered for you.
+    |
+    */
+
+    'paths' => [
+        resource_path('views'),
+    ],
+
+    /*
+    |--------------------------------------------------------------------------
+    | Compiled View Path
+    |--------------------------------------------------------------------------
+    |
+    | This option determines where all the compiled Blade templates will be
+    | stored for your application. Typically, this is within the storage
+    | directory. However, as usual, you are free to change this value.
+    |
+    */
+
+    'compiled' => realpath(storage_path('framework/views')),
+
+];

+ 1 - 0
database/.gitignore

@@ -0,0 +1 @@
+*.sqlite

+ 23 - 0
database/factories/ModelFactory.php

@@ -0,0 +1,23 @@
+<?php
+
+/*
+|--------------------------------------------------------------------------
+| Model Factories
+|--------------------------------------------------------------------------
+|
+| Here you may define all of your model factories. Model factories give
+| you a convenient way to create models for testing and seeding your
+| database. Just tell the factory how a default model should look.
+|
+*/
+
+$factory->define(App\User::class, function (Faker\Generator $faker) {
+    static $password;
+
+    return [
+        'name' => $faker->name,
+        'email' => $faker->unique()->safeEmail,
+        'password' => $password ?: $password = bcrypt('secret'),
+        'remember_token' => str_random(10),
+    ];
+});

+ 1 - 0
database/migrations/.gitkeep

@@ -0,0 +1 @@
+

+ 39 - 0
database/migrations/2017_07_04_104528_create_admin_users_table.php

@@ -0,0 +1,39 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+
+class CreateAdminUsersTable extends Migration {
+
+	/**
+	 * Run the migrations.
+	 *
+	 * @return void
+	 */
+	public function up()
+	{
+		Schema::create('admin_users', function(Blueprint $table)
+		{
+			$table->increments('id')->comment('ID');
+			$table->string('username')->unique('users_username_unique')->comment('用户名');
+			$table->string('email')->unique('users_email_unique')->comment('邮件');
+			$table->string('mobile', 11)->nullable()->comment('手机号码');
+            $table->smallInteger('sex')->default(1)->comment('性别');
+			$table->string('password', 60)->comment('密码');
+			$table->string('remember_token', 100)->nullable()->comment('TOKEN');
+			$table->timestamps();
+		});
+	}
+
+
+	/**
+	 * Reverse the migrations.
+	 *
+	 * @return void
+	 */
+	public function down()
+	{
+		Schema::drop('admin_users');
+	}
+
+}

+ 36 - 0
database/migrations/2017_07_04_104719_create_admin_roles_table.php

@@ -0,0 +1,36 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+
+class CreateAdminRolesTable extends Migration {
+
+	/**
+	 * Run the migrations.
+	 *
+	 * @return void
+	 */
+	public function up()
+	{
+		Schema::create('admin_roles', function(Blueprint $table)
+		{
+			$table->increments('id')->comment('ID');
+			$table->string('name')->unique('roles_name_unique')->comment('角色名');
+			$table->string('display_name')->nullable()->comment('显示名');
+			$table->string('description')->nullable()->comment('描述');
+			$table->timestamps();
+		});
+	}
+
+
+	/**
+	 * Reverse the migrations.
+	 *
+	 * @return void
+	 */
+	public function down()
+	{
+		Schema::drop('admin_roles');
+	}
+
+}

+ 37 - 0
database/migrations/2017_07_04_104933_create_admin_logs_table.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+
+class CreateAdminLogsTable extends Migration {
+
+	/**
+	 * Run the migrations.
+	 *
+	 * @return void
+	 */
+	public function up()
+	{
+		Schema::create('admin_logs', function(Blueprint $table)
+		{
+			$table->integer('id', true)->comment('ID');
+			$table->integer('admin_id')->comment('用户ID');
+			$table->string('log_url', 128)->nullable()->comment('URL');
+			$table->string('log_ip', 20)->nullable()->comment('ip');
+			$table->string('log_info', 100)->nullable()->comment('描述');
+			$table->datetime('log_time')->nullable()->comment('日志日期');
+		});
+	}
+
+
+	/**
+	 * Reverse the migrations.
+	 *
+	 * @return void
+	 */
+	public function down()
+	{
+		Schema::drop('admin_logs');
+	}
+
+}

+ 39 - 0
database/migrations/2017_07_04_104933_create_admin_menus_table.php

@@ -0,0 +1,39 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+
+class CreateAdminMenusTable extends Migration {
+
+	/**
+	 * Run the migrations.
+	 *
+	 * @return void
+	 */
+	public function up()
+	{
+		Schema::create('admin_menus', function(Blueprint $table)
+		{
+			$table->increments('id');
+			$table->integer('parent_id')->default(0)->comment('上级ID');
+			$table->integer('order')->default(0)->comment('菜单排序');
+			$table->string('title', 50)->nullable()->comment('标题');
+			$table->string('icon', 50)->comment('图标');
+			$table->string('uri', 50)->comment('URI');
+			$table->string('routes', 256)->nullable()->comment('路由,如url:/menu,controller:MenuController');
+			$table->timestamps();
+		});
+	}
+
+
+	/**
+	 * Reverse the migrations.
+	 *
+	 * @return void
+	 */
+	public function down()
+	{
+		Schema::drop('admin_menus');
+	}
+
+}

+ 34 - 0
database/migrations/2017_07_04_104933_create_admin_permission_menu_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+
+class CreateAdminPermissionMenuTable extends Migration {
+
+	/**
+	 * Run the migrations.
+	 *
+	 * @return void
+	 */
+	public function up()
+	{
+		Schema::create('admin_permission_menu', function(Blueprint $table)
+		{
+			$table->integer('permission_id');
+			$table->integer('menu_id');
+			$table->index(['permission_id','menu_id'], 'permission_menu_permission_id_menu_id_index');
+		});
+	}
+
+
+	/**
+	 * Reverse the migrations.
+	 *
+	 * @return void
+	 */
+	public function down()
+	{
+		Schema::drop('admin_permission_menu');
+	}
+
+}

+ 34 - 0
database/migrations/2017_07_04_104933_create_admin_permission_role_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+
+class CreateAdminPermissionRoleTable extends Migration {
+
+	/**
+	 * Run the migrations.
+	 *
+	 * @return void
+	 */
+	public function up()
+	{
+		Schema::create('admin_permission_role', function(Blueprint $table)
+		{
+			$table->integer('permission_id')->unsigned();
+			$table->integer('role_id')->unsigned()->index('permission_role_role_id_foreign');
+			$table->primary(['permission_id','role_id']);
+		});
+	}
+
+
+	/**
+	 * Reverse the migrations.
+	 *
+	 * @return void
+	 */
+	public function down()
+	{
+		Schema::drop('admin_permission_role');
+	}
+
+}

+ 37 - 0
database/migrations/2017_07_04_104933_create_admin_permissions_table.php

@@ -0,0 +1,37 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+
+class CreateAdminPermissionsTable extends Migration {
+
+	/**
+	 * Run the migrations.
+	 *
+	 * @return void
+	 */
+	public function up()
+	{
+		Schema::create('admin_permissions', function(Blueprint $table)
+		{
+			$table->increments('id')->comment('ID');
+			$table->string('name')->unique('permissions_name_unique')->comment('权限名 英文');
+			$table->string('display_name')->nullable()->comment('显示名 中文');
+			$table->string('description')->nullable()->comment('描述');
+			$table->string('controllers', 512)->nullable()->comment('对应的controllers');
+			$table->timestamps();
+		});
+	}
+
+
+	/**
+	 * Reverse the migrations.
+	 *
+	 * @return void
+	 */
+	public function down()
+	{
+		Schema::drop('admin_permissions');
+	}
+
+}

+ 34 - 0
database/migrations/2017_07_04_104933_create_admin_role_menu_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+
+class CreateAdminRoleMenuTable extends Migration {
+
+	/**
+	 * Run the migrations.
+	 *
+	 * @return void
+	 */
+	public function up()
+	{
+		Schema::create('admin_role_menu', function(Blueprint $table)
+		{
+			$table->integer('role_id');
+			$table->integer('menu_id');
+			$table->index(['role_id','menu_id'], 'role_menu_role_id_menu_id_index');
+		});
+	}
+
+
+	/**
+	 * Reverse the migrations.
+	 *
+	 * @return void
+	 */
+	public function down()
+	{
+		Schema::drop('admin_role_menu');
+	}
+
+}

+ 34 - 0
database/migrations/2017_07_04_104933_create_admin_role_user_table.php

@@ -0,0 +1,34 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+
+class CreateAdminRoleUserTable extends Migration {
+
+	/**
+	 * Run the migrations.
+	 *
+	 * @return void
+	 */
+	public function up()
+	{
+		Schema::create('admin_role_user', function(Blueprint $table)
+		{
+			$table->integer('user_id')->unsigned();
+			$table->integer('role_id')->unsigned()->index('role_user_role_id_foreign');
+			$table->primary(['user_id','role_id']);
+		});
+	}
+
+
+	/**
+	 * Reverse the migrations.
+	 *
+	 * @return void
+	 */
+	public function down()
+	{
+		Schema::drop('admin_role_user');
+	}
+
+}

+ 1 - 0
database/seeds/.gitkeep

@@ -0,0 +1 @@
+

+ 104 - 0
database/seeds/AdminMenusTableSeeder.php

@@ -0,0 +1,104 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class AdminMenusTableSeeder extends Seeder
+{
+
+    /**
+     * Auto generated seed file
+     *
+     * @return void
+     */
+    public function run()
+    {
+        \DB::table('admin_menus')->delete();
+        \DB::table('admin_menus')->insert(array (
+            0 => 
+                array (
+                    'id'            => 1,
+                    'parent_id'     => 0,
+                    'order'         => 4,
+                    'title'         => '权限设置',
+                    'icon'          => '&#xe614;',
+                    'uri'           => 'url:/qx',
+                    'routes'        => 'url:',
+                    'created_at'    => date('Y-m-d H:i:s',time()),
+                    'updated_at'    => date('Y-m-d H:i:s',time()),
+                ),
+            1 =>
+                array (
+                    'id'            => 2,
+                    'parent_id'     => 1,
+                    'order'         => 5,
+                    'title'         => '用户管理',
+                    'icon'          => '&#xe612;',
+                    'uri'           => '/users',
+                    'routes'        => 'url:/users',
+                    'created_at'    => date('Y-m-d H:i:s',time()),
+                    'updated_at'    => date('Y-m-d H:i:s',time()),
+                ),
+            2 =>
+                array (
+                    'id'            => 3,
+                    'parent_id'     => 1,
+                    'order'         => 6,
+                    'title'         => '角色管理',
+                    'icon'          => '&#xe631;',
+                    'uri'           => '/roles',
+                    'routes'        => 'url:/roles',
+                    'created_at'    => date('Y-m-d H:i:s',time()),
+                    'updated_at'    => date('Y-m-d H:i:s',time()),
+                ),
+            3 =>
+                array (
+                    'id'            => 4,
+                    'parent_id'     => 1,
+                    'order'         => 7,
+                    'title'         => '权限管理',
+                    'icon'          => '&#xe629;',
+                    'uri'           => '/permissions',
+                    'routes'        => 'url:/permissions',
+                    'created_at'    => date('Y-m-d H:i:s',time()),
+                    'updated_at'    => date('Y-m-d H:i:s',time()),
+                ),
+            4 =>
+                array (
+                    'id'            => 5,
+                    'parent_id'     => 1,
+                    'order'         => 8,
+                    'title'         => '菜单管理',
+                    'icon'          => '&#xe62a;',
+                    'uri'           => '/menus',
+                    'routes'        => 'url:/menus',
+                    'created_at'    => date('Y-m-d H:i:s',time()),
+                    'updated_at'    => date('Y-m-d H:i:s',time()),
+                ),
+            5 =>
+                array (
+                    'id'            => 6,
+                    'parent_id'     => 0,
+                    'order'         => 1,
+                    'title'         => '日志设置',
+                    'icon'          => '&#xe632;',
+                    'uri'           => '/log',
+                    'routes'        => 'url:',
+                    'created_at'    => date('Y-m-d H:i:s',time()),
+                    'updated_at'    => date('Y-m-d H:i:s',time()),
+                ),
+            6 =>
+                array (
+                    'id'            => 7,
+                    'parent_id'     => 6,
+                    'order'         => 2,
+                    'title'         => '日志管理',
+                    'icon'          => '&#xe621;',
+                    'uri'           => '/logs',
+                    'routes'        => 'url:/logs',
+                    'created_at'    => date('Y-m-d H:i:s',time()),
+                    'updated_at'    => date('Y-m-d H:i:s',time()),
+                ),
+            )
+        );
+    }
+}

+ 64 - 0
database/seeds/AdminPermissionMenuTableSeeder.php

@@ -0,0 +1,64 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class AdminPermissionMenuTableSeeder extends Seeder
+{
+
+    /**
+     * Auto generated seed file
+     *
+     * @return void
+     */
+    public function run()
+    {
+        \DB::table('admin_permission_menu')->delete();
+        \DB::table('admin_permission_menu')->insert(array(
+            0 =>
+                array(
+                    'permission_id' => 1,
+                    'menu_id' => 2,
+                ),
+            1 =>
+                array(
+                    'permission_id' => 2,
+                    'menu_id' => 2,
+                ),
+            2 =>
+                array(
+                    'permission_id' => 3,
+                    'menu_id' => 3,
+                ),
+            3 =>
+                array(
+                    'permission_id' => 4,
+                    'menu_id' => 3,
+                ),
+            4 =>
+                array(
+                    'permission_id' => 5,
+                    'menu_id' => 4,
+                ),
+            5 =>
+                array(
+                    'permission_id' => 6,
+                    'menu_id' => 4,
+                ),
+            6 =>
+                array(
+                    'permission_id' => 7,
+                    'menu_id' => 5,
+                ),
+            7 =>
+                array(
+                    'permission_id' => 8,
+                    'menu_id' => 5,
+                ),
+            8 =>
+                array(
+                    'permission_id' => 9,
+                    'menu_id' => 7,
+                )
+        ));
+    }
+}

+ 66 - 0
database/seeds/AdminPermissionRoleTableSeeder.php

@@ -0,0 +1,66 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class AdminPermissionRoleTableSeeder extends Seeder
+{
+
+    /**
+     * Auto generated seed file
+     *
+     * @return void
+     */
+    public function run()
+    {
+        \DB::table('admin_permission_role')->delete();
+        \DB::table('admin_permission_role')->insert(array(
+            0 =>
+                array(
+                    'permission_id' => 1,
+                    'role_id' => 1,
+                ),
+            1 =>
+                array(
+                    'permission_id' => 2,
+                    'role_id' => 1,
+                ),
+            2 =>
+                array(
+                    'permission_id' => 3,
+                    'role_id' => 1,
+                ),
+            3 =>
+                array(
+                    'permission_id' => 4,
+                    'role_id' => 1,
+                ),
+            4 =>
+                array(
+                    'permission_id' => 5,
+                    'role_id' => 1,
+                ),
+            5 =>
+                array(
+                    'permission_id' => 6,
+                    'role_id' => 1,
+                ),
+            6 =>
+                array(
+                    'permission_id' => 7,
+                    'role_id' => 1,
+                ),
+            7 =>
+                array(
+                    'permission_id' => 8,
+                    'role_id' => 1,
+                ),
+            8 =>
+                array(
+                    'permission_id' => 9,
+                    'role_id' => 1,
+                )
+        ));
+
+
+    }
+}

+ 109 - 0
database/seeds/AdminPermissionsTableSeeder.php

@@ -0,0 +1,109 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class AdminPermissionsTableSeeder extends Seeder
+{
+
+    /**
+     * Auto generated seed file
+     *
+     * @return void
+     */
+    public function run()
+    {
+        \DB::table('admin_permissions')->delete();
+        \DB::table('admin_permissions')->insert(array(
+            0 =>
+                array(
+                    'id'                => 1,
+                    'name'              => 'userlist',
+                    'display_name'      => '用户管理查看',
+                    'description'       => '用户管理查看',
+                    'controllers'       => 'UserController@get',
+                    'created_at'        => date('Y-m-d H:i:s',time()),
+                    'updated_at'        => date('Y-m-d H:i:s',time()),
+                ),
+            1 =>
+                array(
+                    'id'                => 2,
+                    'name'              => 'userhandle',
+                    'display_name'      => '用户管理编辑',
+                    'description'       => '用户管理编辑',
+                    'controllers'       => 'UserController@post',
+                    'created_at'        => date('Y-m-d H:i:s',time()),
+                    'updated_at'        => date('Y-m-d H:i:s',time()),
+                ),
+            2 =>
+                array(
+                    'id'                => 3,
+                    'name'              => 'rolelist',
+                    'display_name'      => '角色管理查看',
+                    'description'       => '角色管理查看',
+                    'controllers'       => 'RoleController@get',
+                    'created_at'        => date('Y-m-d H:i:s',time()),
+                    'updated_at'        => date('Y-m-d H:i:s',time()),
+                ),
+            3 =>
+                array(
+                    'id'                => 4,
+                    'name'              => 'rolehandle',
+                    'display_name'      => '角色管理编辑',
+                    'description'       => '角色管理编辑',
+                    'controllers'       => 'RoleController@post',
+                    'created_at'        => date('Y-m-d H:i:s',time()),
+                    'updated_at'        => date('Y-m-d H:i:s',time()),
+                ),
+            4 =>
+                array(
+                    'id'                => 5,
+                    'name'              => 'perlist',
+                    'display_name'      => '权限管理查看',
+                    'description'       => '权限管理查看',
+                    'controllers'       => 'PermissionController@get',
+                    'created_at'        => date('Y-m-d H:i:s',time()),
+                    'updated_at'        => date('Y-m-d H:i:s',time()),
+                ),
+            5 =>
+                array(
+                    'id'                => 6,
+                    'name'              => 'perhandle',
+                    'display_name'      => '权限管理编辑',
+                    'description'       => '权限管理编辑',
+                    'controllers'       => 'PermissionController@post',
+                    'created_at'        => date('Y-m-d H:i:s',time()),
+                    'updated_at'        => date('Y-m-d H:i:s',time()),
+                ),
+            6 =>
+                array(
+                    'id'                => 7,
+                    'name'              => 'menulist',
+                    'display_name'      => '菜单管理查看',
+                    'description'       => '菜单管理查看',
+                    'controllers'       => 'MenuController@get',
+                    'created_at'        => date('Y-m-d H:i:s',time()),
+                    'updated_at'        => date('Y-m-d H:i:s',time()),
+                ),
+            7 =>
+                array(
+                    'id'                => 8,
+                    'name'              => 'menuhandle',
+                    'display_name'      => '菜单管理编辑',
+                    'description'       => '菜单管理编辑',
+                    'controllers'       => 'MenuController@post',
+                    'created_at'        => date('Y-m-d H:i:s',time()),
+                    'updated_at'        => date('Y-m-d H:i:s',time()),
+                ),
+            8 =>
+                array(
+                    'id'                => 9,
+                    'name'              => 'loglist',
+                    'display_name'      => '日志管理查看',
+                    'description'       => '日志管理查看',
+                    'controllers'       => 'LogController@get',
+                    'created_at'        => date('Y-m-d H:i:s',time()),
+                    'updated_at'        => date('Y-m-d H:i:s',time()),
+                )
+        ));
+    }
+}

+ 54 - 0
database/seeds/AdminRoleMenuTableSeeder.php

@@ -0,0 +1,54 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class AdminRoleMenuTableSeeder extends Seeder
+{
+
+    /**
+     * Auto generated seed file
+     *
+     * @return void
+     */
+    public function run()
+    {
+        \DB::table('admin_role_menu')->delete();
+        \DB::table('admin_role_menu')->insert(array(
+            0 =>
+                array(
+                    'role_id' => 1,
+                    'menu_id' => 1,
+                ),
+            1 =>
+                array(
+                    'role_id' => 1,
+                    'menu_id' => 2,
+                ),
+            2 =>
+                array(
+                    'role_id' => 1,
+                    'menu_id' => 3,
+                ),
+            3 =>
+                array(
+                    'role_id' => 1,
+                    'menu_id' => 4,
+                ),
+            4 =>
+                array(
+                    'role_id' => 1,
+                    'menu_id' => 5,
+                ),
+            5 =>
+                array(
+                    'role_id' => 1,
+                    'menu_id' => 6,
+                ),
+            6 =>
+                array(
+                    'role_id' => 1,
+                    'menu_id' => 7,
+                )
+        ));
+    }
+}

+ 24 - 0
database/seeds/AdminRoleUserTableSeeder.php

@@ -0,0 +1,24 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class AdminRoleUserTableSeeder extends Seeder
+{
+
+    /**
+     * Auto generated seed file
+     *
+     * @return void
+     */
+    public function run()
+    {
+        \DB::table('admin_role_user')->delete();
+        \DB::table('admin_role_user')->insert(array(
+            0 =>
+                array(
+                    'user_id' => 1,
+                    'role_id' => 1,
+                ),
+        ));
+    }
+}

+ 28 - 0
database/seeds/AdminRolesTableSeeder.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class AdminRolesTableSeeder extends Seeder
+{
+
+    /**
+     * Auto generated seed file
+     *
+     * @return void
+     */
+    public function run()
+    {
+        \DB::table('admin_roles')->delete();
+        \DB::table('admin_roles')->insert(array(
+            0 =>
+                array(
+                    'id'                => 1,
+                    'name'              => 'admin',
+                    'display_name'      => '超级管理员',
+                    'description'       => '最高级的权限',
+                    'created_at'        => date('Y-m-d H:i:s', time()),
+                    'updated_at'        => date('Y-m-d H:i:s', time()),
+                ),
+        ));
+    }
+}

+ 32 - 0
database/seeds/AdminUsersTableSeeder.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class AdminUsersTableSeeder extends Seeder
+{
+
+    /**
+     * Auto generated seed file
+     *
+     * @return void
+     */
+    public function run()
+    {
+        \DB::table('admin_users')->delete();
+        \DB::table('admin_users')->insert(array (
+            0 => 
+		        array (
+                    'id'		        =>	1,
+	                'username'	        =>	'admin',
+	                'email'		        =>	'admin@admin.com',
+		            'mobile'	        =>	'18888888888',
+		            'sex'	            =>	1,
+		            'password'	        =>	'$2y$10$0nZ2IJJQzkuwTUvmsxVCYOAFw09sGceAk5b9p.AQ.h7I0YEj975rO', //f123456
+		            'remember_token'    =>	'',
+		            'created_at'	    =>	date('Y-m-d H:i:s',time()),
+		            'updated_at'	    =>	date('Y-m-d H:i:s',time()),
+		        ),
+	        )
+	    );
+    }
+}

+ 23 - 0
database/seeds/DatabaseSeeder.php

@@ -0,0 +1,23 @@
+<?php
+
+use Illuminate\Database\Seeder;
+
+class DatabaseSeeder extends Seeder
+{
+    /**
+     * Run the database seeds.
+     *
+     * @return void
+     */
+    public function run()
+    {
+        $this->call(AdminUsersTableSeeder::class);
+        $this->call(AdminMenusTableSeeder::class);
+        $this->call(AdminRolesTableSeeder::class);
+        $this->call(AdminPermissionsTableSeeder::class);
+        $this->call(AdminRoleUserTableSeeder::class);
+        $this->call(AdminRoleMenuTableSeeder::class);
+        $this->call(AdminPermissionMenuTableSeeder::class);
+        $this->call(AdminPermissionRoleTableSeeder::class);
+    }
+}

+ 9 - 0
database/sql/admin_logs.sql

@@ -0,0 +1,9 @@
+CREATE TABLE `admin_logs` (
+  `id` bigint(16) unsigned NOT NULL AUTO_INCREMENT COMMENT '表id',
+  `admin_id` int(10) DEFAULT NULL COMMENT '管理员id',
+  `log_info` varchar(255) DEFAULT NULL COMMENT '日志描述',
+  `log_ip` varchar(30) DEFAULT NULL COMMENT 'ip地址',
+  `log_url` varchar(50) DEFAULT NULL COMMENT 'url',
+  `log_time` datetime DEFAULT NULL COMMENT '日志时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '后台日志表';

+ 12 - 0
database/sql/admin_menus.sql

@@ -0,0 +1,12 @@
+CREATE TABLE `admin_menus` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+  `parent_id` int(11) NOT NULL DEFAULT '0' COMMENT '上级ID',
+  `order` int(11) NOT NULL DEFAULT '0' COMMENT '菜单排序,从1开始,数字越小排在超前,0为排在最后',
+  `title` varchar(50) DEFAULT NULL COMMENT '标题',
+  `icon` varchar(50) NOT NULL COMMENT '图标',
+  `uri` varchar(50) NOT NULL COMMENT 'URI',
+  `routes` varchar(256) DEFAULT NULL COMMENT '路由,如url:/menu,controller:MenuController',
+  `created_at` timestamp NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
+  `updated_at` timestamp NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
+  PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '菜单表';

+ 5 - 0
database/sql/admin_permission_menu.sql

@@ -0,0 +1,5 @@
+CREATE TABLE `admin_permission_menu` (
+  `permission_id` int(11) NOT NULL,
+  `menu_id` int(11) NOT NULL,
+  KEY `permission_menu_permission_id_menu_id_index` (`permission_id`,`menu_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;

+ 6 - 0
database/sql/admin_permission_role.sql

@@ -0,0 +1,6 @@
+CREATE TABLE `admin_permission_role` (
+  `permission_id` int(10) unsigned NOT NULL,
+  `role_id` int(10) unsigned NOT NULL,
+  PRIMARY KEY (`permission_id`,`role_id`),
+  KEY `permission_role_role_id_foreign` (`role_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;

+ 11 - 0
database/sql/admin_permissions.sql

@@ -0,0 +1,11 @@
+CREATE TABLE `admin_permissions` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `name` varchar(255) NOT NULL COMMENT '权限标识 英文',
+  `display_name` varchar(255) DEFAULT NULL COMMENT '权限名称 中文',
+  `description` varchar(255) DEFAULT NULL COMMENT '权限描述',
+  `controllers` varchar(512) DEFAULT NULL COMMENT '对应的controllers',
+  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
+  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '更新时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `permissions_name_unique` (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;

+ 5 - 0
database/sql/admin_role_menu.sql

@@ -0,0 +1,5 @@
+CREATE TABLE `admin_role_menu` (
+  `role_id` int(11) NOT NULL,
+  `menu_id` int(11) NOT NULL,
+  KEY `role_menu_role_id_menu_id_index` (`role_id`,`menu_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;

+ 6 - 0
database/sql/admin_role_user.sql

@@ -0,0 +1,6 @@
+CREATE TABLE `admin_role_user` (
+  `user_id` int(10) unsigned NOT NULL,
+  `role_id` int(10) unsigned NOT NULL,
+  PRIMARY KEY (`user_id`,`role_id`),
+  KEY `role_user_role_id_foreign` (`role_id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8;

+ 10 - 0
database/sql/admin_roles.sql

@@ -0,0 +1,10 @@
+CREATE TABLE `admin_roles` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `name` varchar(255) NOT NULL COMMENT '角色标识',
+  `display_name` varchar(255) DEFAULT NULL COMMENT '角色名称',
+  `description` varchar(255) DEFAULT NULL COMMENT '角色描述',
+  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
+  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `roles_name_unique` (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '角色表';

+ 14 - 0
database/sql/admin_users.sql

@@ -0,0 +1,14 @@
+CREATE TABLE `admin_users` (
+  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `username` varchar(255) NOT NULL COMMENT '用户名',
+  `email` varchar(255) NOT NULL COMMENT '邮件',
+  `mobile` varchar(11) DEFAULT NULL COMMENT '手机号码',
+  `sex` smallint(3) NOT NULL DEFAULT 1 COMMENT '性别, 1为男,2为女',
+  `password` varchar(60) NOT NULL COMMENT '密码',
+  `remember_token` varchar(100) DEFAULT NULL COMMENT 'TOKEN',
+  `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '创建时间',
+  `updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '修改时间',
+  PRIMARY KEY (`id`),
+  UNIQUE KEY `users_username_unique` (`username`),
+  UNIQUE KEY `users_email_unique` (`email`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT '管理用户表';

+ 191 - 0
fadmin_jg.sql

@@ -0,0 +1,191 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server         : localhost
+ Source Server Type    : MySQL
+ Source Server Version : 50726
+ Source Host           : localhost:3306
+ Source Schema         : fadmin
+
+ Target Server Type    : MySQL
+ Target Server Version : 50726
+ File Encoding         : 65001
+
+ Date: 14/11/2019 14:54:04
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for admin_app
+-- ----------------------------
+DROP TABLE IF EXISTS `admin_app`;
+CREATE TABLE `admin_app`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
+  `app_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '应用标题\r\n',
+  `icon` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '图标',
+  `edition` varchar(11) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '1.0' COMMENT '版本',
+  `build_edition` varchar(11) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '1.0' COMMENT 'Build版本',
+  `app_id` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '应用id',
+  `sys_edition` varchar(11) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT '8.0' COMMENT '系统版本',
+  `filesize` varchar(11) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '文件大小',
+  `f_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '副标题',
+  `f_age` int(11) NULL DEFAULT 18 COMMENT '使用年龄',
+  `f_class` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '分类',
+  `f_ranking` int(11) NULL DEFAULT 1 COMMENT '排名',
+  `f_score` int(11) NULL DEFAULT 5 COMMENT '评分星级',
+  `f_score_num` int(11) NULL DEFAULT NULL COMMENT '评分数量',
+  `f_brief` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '简介',
+  `img` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '预览图',
+  `a_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '安装 标题',
+  `a_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '组织名称',
+  `a_desc` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL COMMENT '描述',
+  `a_down` int(11) NULL DEFAULT NULL COMMENT '下载设备数量',
+  `a_down_limit` int(11) NULL DEFAULT NULL COMMENT '下载设备限制',
+  `a_ation` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '邀请码',
+  `a_c_ation` int(11) UNSIGNED NULL DEFAULT 1 COMMENT '查看邀请码',
+  `a_down_url` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '安装地址,链接',
+  `a_qr` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '二维码',
+  `path` varchar(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci NULL DEFAULT NULL COMMENT '本地应用路径',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = MyISAM AUTO_INCREMENT = 14 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for admin_logs
+-- ----------------------------
+DROP TABLE IF EXISTS `admin_logs`;
+CREATE TABLE `admin_logs`  (
+  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `admin_id` int(11) NOT NULL COMMENT '用户ID',
+  `log_url` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'URL',
+  `log_ip` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'ip',
+  `log_info` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述',
+  `log_time` datetime(0) NULL DEFAULT NULL COMMENT '日志日期',
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = MyISAM AUTO_INCREMENT = 31 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for admin_menus
+-- ----------------------------
+DROP TABLE IF EXISTS `admin_menus`;
+CREATE TABLE `admin_menus`  (
+  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `parent_id` int(11) NOT NULL DEFAULT 0 COMMENT '上级ID',
+  `order` int(11) NOT NULL DEFAULT 0 COMMENT '菜单排序',
+  `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '标题',
+  `icon` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '图标',
+  `uri` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'URI',
+  `routes` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '路由,如url:/menu,controller:MenuController',
+  `created_at` timestamp(0) NULL DEFAULT NULL,
+  `updated_at` timestamp(0) NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = MyISAM AUTO_INCREMENT = 11 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for admin_permission_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `admin_permission_menu`;
+CREATE TABLE `admin_permission_menu`  (
+  `permission_id` int(11) NOT NULL,
+  `menu_id` int(11) NOT NULL,
+  INDEX `permission_menu_permission_id_menu_id_index`(`permission_id`, `menu_id`) USING BTREE
+) ENGINE = MyISAM CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Fixed;
+
+-- ----------------------------
+-- Table structure for admin_permission_role
+-- ----------------------------
+DROP TABLE IF EXISTS `admin_permission_role`;
+CREATE TABLE `admin_permission_role`  (
+  `permission_id` int(10) UNSIGNED NOT NULL,
+  `role_id` int(10) UNSIGNED NOT NULL,
+  PRIMARY KEY (`permission_id`, `role_id`) USING BTREE,
+  INDEX `permission_role_role_id_foreign`(`role_id`) USING BTREE
+) ENGINE = MyISAM CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Fixed;
+
+-- ----------------------------
+-- Table structure for admin_permissions
+-- ----------------------------
+DROP TABLE IF EXISTS `admin_permissions`;
+CREATE TABLE `admin_permissions`  (
+  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `name` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '权限名 英文',
+  `display_name` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '显示名 中文',
+  `description` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述',
+  `controllers` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '对应的controllers',
+  `created_at` timestamp(0) NULL DEFAULT NULL,
+  `updated_at` timestamp(0) NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `permissions_name_unique`(`name`) USING BTREE
+) ENGINE = MyISAM AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for admin_role_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `admin_role_menu`;
+CREATE TABLE `admin_role_menu`  (
+  `role_id` int(11) NOT NULL,
+  `menu_id` int(11) NOT NULL,
+  INDEX `role_menu_role_id_menu_id_index`(`role_id`, `menu_id`) USING BTREE
+) ENGINE = MyISAM CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Fixed;
+
+-- ----------------------------
+-- Table structure for admin_role_user
+-- ----------------------------
+DROP TABLE IF EXISTS `admin_role_user`;
+CREATE TABLE `admin_role_user`  (
+  `user_id` int(10) UNSIGNED NOT NULL,
+  `role_id` int(10) UNSIGNED NOT NULL,
+  PRIMARY KEY (`user_id`, `role_id`) USING BTREE,
+  INDEX `role_user_role_id_foreign`(`role_id`) USING BTREE
+) ENGINE = MyISAM CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Fixed;
+
+-- ----------------------------
+-- Table structure for admin_roles
+-- ----------------------------
+DROP TABLE IF EXISTS `admin_roles`;
+CREATE TABLE `admin_roles`  (
+  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `name` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '角色名',
+  `display_name` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '显示名',
+  `description` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '描述',
+  `created_at` timestamp(0) NULL DEFAULT NULL,
+  `updated_at` timestamp(0) NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `roles_name_unique`(`name`) USING BTREE
+) ENGINE = MyISAM AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for admin_users
+-- ----------------------------
+DROP TABLE IF EXISTS `admin_users`;
+CREATE TABLE `admin_users`  (
+  `id` int(10) NOT NULL AUTO_INCREMENT COMMENT 'ID',
+  `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '登录账号',
+  `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '登录密码',
+  `email` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '开发者账户',
+  `csr` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'csr',
+  `IssuerID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT 'IssuerID:',
+  `miyaoID` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '1' COMMENT '密钥ID',
+  `p8` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'p8',
+  `number` int(11) NULL DEFAULT NULL COMMENT '数量',
+  `created_at` timestamp(0) NULL DEFAULT NULL COMMENT '创建时间',
+  `status` int(11) NOT NULL DEFAULT 1 COMMENT '是否停用',
+  `device` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '设备列表',
+  PRIMARY KEY (`id`) USING BTREE,
+  UNIQUE INDEX `users_username_unique`(`email`) USING BTREE,
+  UNIQUE INDEX `users_email_unique`(`csr`) USING BTREE
+) ENGINE = MyISAM AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for migrations
+-- ----------------------------
+DROP TABLE IF EXISTS `migrations`;
+CREATE TABLE `migrations`  (
+  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
+  `migration` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+  `batch` int(11) NOT NULL,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = MyISAM AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Dynamic;
+
+SET FOREIGN_KEY_CHECKS = 1;

二进制
img/code.png


二进制
img/index.png


二进制
img/log.png


部分文件因为文件数量过多而无法显示