From 7c30cd04f8848c5050527fcac3bb20262a07fc46 Mon Sep 17 00:00:00 2001
From: wmhello <871228582@qq.com>
Date: Sun, 18 Feb 2018 10:09:07 +0800
Subject: [PATCH 01/57] Initial commit
---
LICENSE | 20 ++++++++++++++++++++
README.md | 1 +
2 files changed, 21 insertions(+)
create mode 100644 LICENSE
create mode 100644 README.md
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..182a9d33
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,20 @@
+The MIT License (MIT)
+
+Copyright (c) 2018 wmhello
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..092c8000
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+#laravel_template_with_vue
From 421aef4cfa262b62b7a04edd3ffb2c02c15a8b69 Mon Sep 17 00:00:00 2001
From: wmhello <871228582@qq.com>
Date: Sun, 18 Feb 2018 10:12:31 +0800
Subject: [PATCH 02/57] Initial commit
---
LICENSE | 21 +++++++++++++++++++++
README.md | 2 ++
2 files changed, 23 insertions(+)
create mode 100644 LICENSE
create mode 100644 README.md
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..2c52be6a
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018 wmhello
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..5a3600ae
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+# laravel_template_with_vue
+laravel5.5和vue.js结合的前后端分离项目模板。作为程序的起点,可以直接以此为基础来进行业务扩展。模板内容包括基础的用户管理和权限管理。权限管理包括后端Token认证和前端vue.js的动态权限,解决了前后端完整分离的情况下,vue.js的认证与权限相关的痛点,已在本人的多个项目中集成使用。项目例子(http://front.ynxpyz.cn)
From 2a409d18878a532e835753907166c4723e842a96 Mon Sep 17 00:00:00 2001
From: wmhello <871228582@qq.com>
Date: Sun, 18 Feb 2018 10:18:04 +0800
Subject: [PATCH 03/57] =?UTF-8?q?'=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9B=AE?=
=?UTF-8?q?=E5=BD=95=E5=92=8C=E5=86=85=E5=AE=B9'?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.gitignore | 5 +
backend/.env.example | 39 +
backend/.gitattributes | 5 +
backend/.gitignore | 12 +
backend/3.txt | 118 +
backend/apidoc.json | 7 +
backend/app/ClassTeacher.php | 44 +
backend/app/Console/Kernel.php | 42 +
backend/app/Department.php | 56 +
backend/app/Exceptions/Handler.php | 53 +
.../Auth/ForgotPasswordController.php | 32 +
.../Http/Controllers/Auth/LoginController.php | 115 +
.../Controllers/Auth/RegisterController.php | 71 +
.../Auth/ResetPasswordController.php | 39 +
.../Controllers/ClassTeacherController.php | 435 +
backend/app/Http/Controllers/Controller.php | 14 +
.../Http/Controllers/DepartmentController.php | 471 +
.../app/Http/Controllers/DiskController.php | 53 +
.../app/Http/Controllers/FileController.php | 64 +
.../Controllers/Import/ClassTeacherImport.php | 23 +
.../Import/ClassTeacherImportHandler.php | 94 +
.../Controllers/Import/DepartmentImport.php | 23 +
.../Import/DepartmentImportHandler.php | 93 +
.../Http/Controllers/Import/LeaderImport.php | 23 +
.../Import/LeaderImportHandler.php | 90 +
.../Http/Controllers/Import/SessionImport.php | 26 +
.../Import/SessionImportHandler.php | 40 +
.../Controllers/Import/TeachingImport.php | 28 +
.../Import/TeachingImportHandler.php | 38 +
.../Http/Controllers/Import/UserImport.php | 22 +
.../Controllers/Import/UserImportHandler.php | 40 +
.../app/Http/Controllers/LeaderController.php | 410 +
.../app/Http/Controllers/MenuController.php | 65 +
.../Http/Controllers/PermissionController.php | 216 +
backend/app/Http/Controllers/Result.php | 103 +
.../app/Http/Controllers/RoleController.php | 261 +
.../Http/Controllers/SessionController.php | 392 +
.../app/Http/Controllers/TeachController.php | 109 +
.../Http/Controllers/TeacherController.php | 117 +
.../Http/Controllers/TeachingController.php | 359 +
backend/app/Http/Controllers/Tools.php | 62 +
.../app/Http/Controllers/UserController.php | 548 +
.../app/Http/Controllers/WechatController.php | 72 +
backend/app/Http/Kernel.php | 67 +
.../app/Http/Middleware/EncryptCookies.php | 17 +
.../Middleware/RedirectIfAuthenticated.php | 26 +
backend/app/Http/Middleware/Role.php | 56 +
backend/app/Http/Middleware/TrimStrings.php | 18 +
backend/app/Http/Middleware/TrustProxies.php | 29 +
.../app/Http/Middleware/VerifyCsrfToken.php | 17 +
backend/app/Http/Proxy/TokenProxy.php | 80 +
.../app/Http/Requests/ClassTeacherRequest.php | 33 +
.../Requests/ClassTeacherUploadRequest.php | 29 +
.../app/Http/Requests/DepartmentRequest.php | 35 +
.../Requests/DepartmentsUploadRequest.php | 29 +
backend/app/Http/Requests/LeaderRequest.php | 34 +
.../app/Http/Requests/LeaderUploadRequest.php | 31 +
.../app/Http/Requests/PermissionRequest.php | 41 +
backend/app/Http/Requests/Request.php | 18 +
backend/app/Http/Requests/RoleRequest.php | 34 +
backend/app/Http/Requests/TeachingRequest.php | 33 +
.../Http/Requests/TeachingUploadRequest.php | 33 +
backend/app/Http/Resources/ClassTeacher.php | 34 +
.../Http/Resources/ClassTeacherCollection.php | 23 +
backend/app/Http/Resources/Department.php | 35 +
.../Http/Resources/DepartmentCollection.php | 23 +
backend/app/Http/Resources/Leader.php | 34 +
.../app/Http/Resources/LeaderCollection.php | 23 +
backend/app/Http/Resources/Permission.php | 36 +
.../Http/Resources/PermissionCollection.php | 23 +
backend/app/Http/Resources/Role.php | 33 +
backend/app/Http/Resources/RoleCollection.php | 23 +
backend/app/Http/Resources/Session.php | 38 +
.../app/Http/Resources/SessionCollection.php | 24 +
backend/app/Http/Resources/Teaching.php | 38 +
.../app/Http/Resources/TeachingCollection.php | 23 +
backend/app/Leader.php | 44 +
backend/app/Models/Model.php | 20 +
backend/app/Models/Permission.php | 39 +
backend/app/Policies/Policy.php | 28 +
backend/app/Providers/AppServiceProvider.php | 28 +
backend/app/Providers/AuthServiceProvider.php | 37 +
.../Providers/BroadcastServiceProvider.php | 21 +
.../app/Providers/EventServiceProvider.php | 32 +
.../app/Providers/RouteServiceProvider.php | 73 +
backend/app/Resources/User.php | 33 +
backend/app/Resources/UserCollection.php | 23 +
backend/app/Role.php | 11 +
backend/app/Rules/Telphone.php | 42 +
backend/app/Session.php | 11 +
backend/app/Teach.php | 12 +
backend/app/Teacher.php | 11 +
backend/app/Teaching.php | 77 +
backend/app/User.php | 50 +
backend/app/check.php | 11 +
backend/artisan | 53 +
backend/bootstrap/app.php | 55 +
backend/bootstrap/cache/.gitignore | 2 +
backend/composer.json | 64 +
backend/composer.lock | 5940 ++++++++
backend/config/app.php | 237 +
backend/config/auth.php | 102 +
backend/config/broadcasting.php | 58 +
backend/config/cache.php | 91 +
backend/config/cors.php | 22 +
backend/config/database.php | 120 +
backend/config/excel.php | 705 +
backend/config/filesystems.php | 74 +
backend/config/mail.php | 123 +
backend/config/queue.php | 85 +
backend/config/services.php | 38 +
backend/config/session.php | 197 +
backend/config/view.php | 33 +
backend/config/wechat.php | 137 +
backend/database/.gitignore | 1 +
.../factories/ClassTeacherFactory.php | 9 +
.../database/factories/DepartmentFactory.php | 9 +
backend/database/factories/LeaderFactory.php | 9 +
.../factories/ModelsPermissionFactory.php | 17 +
backend/database/factories/RoleFactory.php | 9 +
backend/database/factories/SessionFactory.php | 9 +
backend/database/factories/TeacherFactory.php | 9 +
.../database/factories/TeachingFactory.php | 9 +
backend/database/factories/UserFactory.php | 25 +
.../2014_10_12_000000_create_users_table.php | 38 +
...12_100000_create_password_resets_table.php | 32 +
.../2017_12_04_184516_create_checks_table.php | 34 +
...17_12_21_013247_create_teachings_table.php | 40 +
...017_12_21_013300_create_sessions_table.php | 36 +
..._12_21_013340_create_departments_table.php | 39 +
...2017_12_21_013631_create_leaders_table.php | 38 +
..._21_025101_create_class_teachers_table.php | 38 +
.../2017_12_25_102529_create_roles_table.php | 36 +
...7_12_25_131341_add_clumn_into_sessions.php | 35 +
..._02_13_112400_create_permissions_table.php | 39 +
backend/database/seeds/DatabaseSeeder.php | 16 +
backend/database/seeds/RolesTableSeeder.php | 30 +
backend/database/seeds/UsersTableSeeder.php | 33 +
backend/package.json | 21 +
backend/phpunit.xml | 31 +
backend/public/.htaccess | 21 +
backend/public/apidoc/api_data.js | 2159 +++
backend/public/apidoc/api_data.json | 2159 +++
backend/public/apidoc/api_project.js | 16 +
backend/public/apidoc/api_project.json | 16 +
backend/public/apidoc/css/style.css | 569 +
.../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes
.../fonts/glyphicons-halflings-regular.svg | 288 +
.../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes
.../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes
.../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes
backend/public/apidoc/img/favicon.ico | Bin 0 -> 894 bytes
backend/public/apidoc/index.html | 669 +
backend/public/apidoc/locales/ca.js | 25 +
backend/public/apidoc/locales/de.js | 25 +
backend/public/apidoc/locales/es.js | 25 +
backend/public/apidoc/locales/fr.js | 25 +
backend/public/apidoc/locales/it.js | 25 +
backend/public/apidoc/locales/locale.js | 50 +
backend/public/apidoc/locales/nl.js | 25 +
backend/public/apidoc/locales/pl.js | 25 +
backend/public/apidoc/locales/pt_br.js | 25 +
backend/public/apidoc/locales/ro.js | 25 +
backend/public/apidoc/locales/ru.js | 25 +
backend/public/apidoc/locales/tr.js | 25 +
backend/public/apidoc/locales/vi.js | 25 +
backend/public/apidoc/locales/zh.js | 25 +
backend/public/apidoc/locales/zh_cn.js | 25 +
backend/public/apidoc/main.js | 827 ++
.../public/apidoc/utils/handlebars_helper.js | 357 +
.../apidoc/utils/send_sample_request.js | 184 +
.../public/apidoc/vendor/bootstrap.min.css | 6 +
backend/public/apidoc/vendor/bootstrap.min.js | 7 +
.../apidoc/vendor/diff_match_patch.min.js | 49 +
.../public/apidoc/vendor/handlebars.min.js | 29 +
backend/public/apidoc/vendor/jquery.min.js | 4 +
backend/public/apidoc/vendor/list.min.js | 2 +
.../public/apidoc/vendor/lodash.custom.min.js | 41 +
.../apidoc/vendor/path-to-regexp/LICENSE | 21 +
.../apidoc/vendor/path-to-regexp/index.js | 204 +
backend/public/apidoc/vendor/polyfill.js | 96 +
backend/public/apidoc/vendor/prettify.css | 51 +
.../apidoc/vendor/prettify/lang-Splus.js | 18 +
.../public/apidoc/vendor/prettify/lang-aea.js | 18 +
.../public/apidoc/vendor/prettify/lang-agc.js | 18 +
.../apidoc/vendor/prettify/lang-apollo.js | 18 +
.../apidoc/vendor/prettify/lang-basic.js | 18 +
.../public/apidoc/vendor/prettify/lang-cbm.js | 18 +
.../public/apidoc/vendor/prettify/lang-cl.js | 18 +
.../public/apidoc/vendor/prettify/lang-clj.js | 17 +
.../public/apidoc/vendor/prettify/lang-css.js | 18 +
.../apidoc/vendor/prettify/lang-dart.js | 19 +
.../public/apidoc/vendor/prettify/lang-el.js | 18 +
.../public/apidoc/vendor/prettify/lang-erl.js | 18 +
.../apidoc/vendor/prettify/lang-erlang.js | 18 +
.../public/apidoc/vendor/prettify/lang-fs.js | 18 +
.../public/apidoc/vendor/prettify/lang-go.js | 17 +
.../public/apidoc/vendor/prettify/lang-hs.js | 18 +
.../apidoc/vendor/prettify/lang-lasso.js | 19 +
.../vendor/prettify/lang-lassoscript.js | 19 +
.../apidoc/vendor/prettify/lang-latex.js | 17 +
.../public/apidoc/vendor/prettify/lang-lgt.js | 18 +
.../apidoc/vendor/prettify/lang-lisp.js | 18 +
.../public/apidoc/vendor/prettify/lang-ll.js | 17 +
.../apidoc/vendor/prettify/lang-llvm.js | 17 +
.../apidoc/vendor/prettify/lang-logtalk.js | 18 +
.../public/apidoc/vendor/prettify/lang-ls.js | 19 +
.../public/apidoc/vendor/prettify/lang-lsp.js | 18 +
.../public/apidoc/vendor/prettify/lang-lua.js | 18 +
.../apidoc/vendor/prettify/lang-matlab.js | 29 +
.../public/apidoc/vendor/prettify/lang-ml.js | 18 +
.../apidoc/vendor/prettify/lang-mumps.js | 18 +
.../public/apidoc/vendor/prettify/lang-n.js | 19 +
.../apidoc/vendor/prettify/lang-nemerle.js | 19 +
.../apidoc/vendor/prettify/lang-pascal.js | 18 +
.../apidoc/vendor/prettify/lang-proto.js | 17 +
.../public/apidoc/vendor/prettify/lang-r.js | 18 +
.../public/apidoc/vendor/prettify/lang-rd.js | 17 +
.../public/apidoc/vendor/prettify/lang-rkt.js | 18 +
.../apidoc/vendor/prettify/lang-rust.js | 20 +
.../public/apidoc/vendor/prettify/lang-s.js | 18 +
.../apidoc/vendor/prettify/lang-scala.js | 18 +
.../public/apidoc/vendor/prettify/lang-scm.js | 18 +
.../public/apidoc/vendor/prettify/lang-sql.js | 18 +
.../public/apidoc/vendor/prettify/lang-ss.js | 18 +
.../apidoc/vendor/prettify/lang-swift.js | 16 +
.../public/apidoc/vendor/prettify/lang-tcl.js | 18 +
.../public/apidoc/vendor/prettify/lang-tex.js | 17 +
.../public/apidoc/vendor/prettify/lang-vb.js | 19 +
.../public/apidoc/vendor/prettify/lang-vbs.js | 19 +
.../public/apidoc/vendor/prettify/lang-vhd.js | 19 +
.../apidoc/vendor/prettify/lang-vhdl.js | 19 +
.../apidoc/vendor/prettify/lang-wiki.js | 18 +
.../public/apidoc/vendor/prettify/lang-xq.js | 19 +
.../apidoc/vendor/prettify/lang-xquery.js | 19 +
.../apidoc/vendor/prettify/lang-yaml.js | 18 +
.../public/apidoc/vendor/prettify/lang-yml.js | 18 +
.../apidoc/vendor/prettify/prettify.css | 1 +
.../public/apidoc/vendor/prettify/prettify.js | 46 +
.../apidoc/vendor/prettify/run_prettify.js | 63 +
backend/public/apidoc/vendor/require.min.js | 37 +
backend/public/apidoc/vendor/semver.min.js | 1 +
backend/public/apidoc/vendor/webfontloader.js | 17 +
backend/public/audio/2.mp3 | Bin 0 -> 3345055 bytes
backend/public/css/app.css | 5 +
backend/public/favicon.ico | 0
backend/public/image/1.png | Bin 0 -> 629 bytes
backend/public/index.php | 60 +
backend/public/js/app.js | 34 +
backend/public/js/iSlider.js | 567 +
backend/public/robots.txt | 2 +
.../uploads/201711251441th5a19812148058.jpg | Bin 0 -> 41955 bytes
.../uploads/201711251509th5a19879c71868.jpg | Bin 0 -> 12395 bytes
.../uploads/201802041420th5a76a612a9a32.jpg | Bin 0 -> 9377 bytes
.../uploads/201802041420th5a76a6299ca62.jpg | Bin 0 -> 5435 bytes
.../uploads/201802041421th5a76a67de447b.jpg | Bin 0 -> 151568 bytes
.../uploads/201802061727th5a79751e93407.jpg | Bin 0 -> 5435 bytes
backend/public/web.config | 23 +
backend/public/xls/class_teacher.xls | Bin 0 -> 22016 bytes
backend/public/xls/departments.xls | Bin 0 -> 24064 bytes
backend/public/xls/leader.xls | Bin 0 -> 21504 bytes
backend/public/xls/session.xls | Bin 0 -> 22016 bytes
backend/public/xls/teaching.xls | Bin 0 -> 23040 bytes
backend/public/xls/user.xls | Bin 0 -> 19968 bytes
backend/readme.md | 53 +
backend/resources/assets/js/app.js | 22 +
backend/resources/assets/js/bootstrap.js | 53 +
.../assets/js/components/Example.vue | 23 +
backend/resources/assets/sass/_variables.scss | 38 +
backend/resources/assets/sass/app.scss | 9 +
backend/resources/lang/en/auth.php | 19 +
backend/resources/lang/en/pagination.php | 19 +
backend/resources/lang/en/passwords.php | 22 +
backend/resources/lang/en/validation.php | 121 +
backend/resources/lang/zh-CN/auth.php | 19 +
backend/resources/lang/zh-CN/pagination.php | 19 +
backend/resources/lang/zh-CN/passwords.php | 22 +
backend/resources/lang/zh-CN/validation.php | 126 +
backend/resources/views/file/update.blade.php | 19 +
.../resources/views/file/update_xls.blade.php | 17 +
backend/resources/views/view.blade.php | 212 +
backend/resources/views/view1.blade.php | 66 +
backend/resources/views/welcome.blade.php | 95 +
backend/route.txt | 76 +
backend/routes/api.php | 85 +
backend/routes/channels.php | 16 +
backend/routes/console.php | 18 +
backend/routes/web.php | 32 +
backend/server.php | 21 +
backend/storage/app/.gitignore | 3 +
backend/storage/framework/.gitignore | 8 +
backend/storage/framework/cache/.gitignore | 2 +
backend/storage/framework/sessions/.gitignore | 2 +
backend/storage/framework/testing/.gitignore | 2 +
backend/storage/framework/views/.gitignore | 2 +
backend/storage/logs/.gitignore | 2 +
backend/tests/CreatesApplication.php | 22 +
backend/tests/Feature/ExampleTest.php | 21 +
backend/tests/TestCase.php | 10 +
backend/tests/Unit/ExampleTest.php | 19 +
backend/webpack.mix.js | 15 +
...6\346\210\220\344\275\277\347\224\250.txt" | 75 +
...16\345\217\260\345\256\211\350\243\205.md" | 24 +
frontend/.babelrc | 7 +
frontend/.editorconfig | 14 +
frontend/.eslintignore | 4 +
frontend/.eslintrc.js | 144 +
frontend/.gitignore | 5 +
frontend/.postcssrc.js | 8 +
frontend/LICENSE | 21 +
frontend/README-zh.md | 49 +
frontend/README.md | 39 +
frontend/build/build.js | 41 +
frontend/build/check-versions.js | 54 +
frontend/build/dev-client.js | 9 +
frontend/build/dev-server.js | 89 +
frontend/build/logo.png | Bin 0 -> 6849 bytes
frontend/build/utils.js | 101 +
frontend/build/vue-loader.conf.js | 22 +
frontend/build/webpack.base.conf.js | 101 +
frontend/build/webpack.dev.conf.js | 87 +
frontend/build/webpack.prod.conf.js | 150 +
frontend/config/dev.env.js | 8 +
frontend/config/index.js | 84 +
frontend/config/prod.env.js | 5 +
frontend/dist/.htaccess | 8 +
frontend/dist/favicon.ico | Bin 0 -> 67646 bytes
frontend/dist/index.html | 1 +
frontend/dist/static/config.js | 3 +
.../app.66ca77085a8cf6265e69f94019e88a0c.css | 1 +
.../static/fonts/element-icons.6f0a763.ttf | Bin 0 -> 11040 bytes
frontend/dist/static/img/404.a57b6f3.png | Bin 0 -> 98071 bytes
.../dist/static/js/0.4ec1cf623150494506af.js | 1 +
.../dist/static/js/1.91e1eb85f703cbfb3e32.js | 1 +
.../dist/static/js/10.f8f5c94a9178225a07f1.js | 1 +
.../dist/static/js/11.11d848892bf427c3d713.js | 1 +
.../dist/static/js/12.e07aae8e7c7f4c392731.js | 1 +
.../dist/static/js/13.b191e4641bfe70b311fd.js | 1 +
.../dist/static/js/14.5afb41adfb1eeb67b28c.js | 1 +
.../dist/static/js/15.e093022bead06700e4b4.js | 1 +
.../dist/static/js/16.80b2f01064ba3e32b8b2.js | 1 +
.../dist/static/js/17.0e0d4fcd87cfdc2ecef9.js | 1 +
.../dist/static/js/18.41bebf2fa87299d88337.js | 1 +
.../dist/static/js/19.0143f3b77deb27ab4a55.js | 1 +
.../dist/static/js/2.4679b6a028da768fb3bf.js | 1 +
.../dist/static/js/20.6e7b3ca1f0c0d4853a82.js | 1 +
.../dist/static/js/21.7906ca82fd284141d204.js | 1 +
.../dist/static/js/22.846dc01be7c16dfb12d8.js | 1 +
.../dist/static/js/23.be292b0980dd8e0c32d5.js | 1 +
.../dist/static/js/3.62be4c74eb6cc854ca34.js | 1 +
.../dist/static/js/4.00bab46b77247dea82e0.js | 1 +
.../dist/static/js/5.49aee0de97841a1dd56f.js | 1 +
.../dist/static/js/6.118e13cd0b17527d57d5.js | 1 +
.../dist/static/js/7.2ab80d20f3bf967c66e4.js | 1 +
.../dist/static/js/8.053f86f43d6a01a78793.js | 1 +
.../dist/static/js/9.cd0cb31bc11d631af700.js | 1 +
.../static/js/app.daab7bc25b4290b655d8.js | 1 +
.../js/manifest.84d550dbae7df66a62d1.js | 1 +
.../static/js/vendor.9f3b16f0c179b1fcc9a1.js | 1 +
frontend/favicon.ico | Bin 0 -> 67646 bytes
frontend/index.html | 11 +
frontend/package-lock.json | 12392 ++++++++++++++++
frontend/package.json | 79 +
frontend/src/App.vue | 12 +
frontend/src/api/admin.js | 143 +
frontend/src/api/classTeacher.js | 117 +
frontend/src/api/department.js | 123 +
frontend/src/api/leader.js | 115 +
frontend/src/api/login.js | 32 +
frontend/src/api/other.js | 69 +
frontend/src/api/permission.js | 90 +
frontend/src/api/role.js | 52 +
frontend/src/api/session.js | 49 +
frontend/src/api/table.js | 9 +
frontend/src/api/teaching.js | 123 +
frontend/src/assets/404_images/404.png | Bin 0 -> 98071 bytes
frontend/src/assets/404_images/404_cloud.png | Bin 0 -> 4766 bytes
frontend/src/assets/images/fuck.png | Bin 0 -> 106676 bytes
frontend/src/components/Breadcrumb/index.vue | 51 +
frontend/src/components/Hamburger/index.vue | 45 +
frontend/src/components/Icon-svg/index.vue | 22 +
frontend/src/components/ScrollBar/index.vue | 57 +
frontend/src/components/SvgIcon/index.vue | 42 +
frontend/src/components/avatar/index.vue | 71 +
frontend/src/config/_import_development.js | 3 +
frontend/src/config/_import_production.js | 3 +
frontend/src/config/index.js | 8 +
frontend/src/icons/index.js | 9 +
frontend/src/icons/svg/404.svg | 1 +
frontend/src/icons/svg/EXCEL.svg | 1 +
frontend/src/icons/svg/QQ.svg | 1 +
frontend/src/icons/svg/a.svg | 1 +
frontend/src/icons/svg/b.svg | 1 +
frontend/src/icons/svg/bug.svg | 1 +
frontend/src/icons/svg/c.svg | 1 +
frontend/src/icons/svg/email.svg | 1 +
frontend/src/icons/svg/example.svg | 1 +
frontend/src/icons/svg/eye.svg | 1 +
frontend/src/icons/svg/form.svg | 1 +
frontend/src/icons/svg/from.svg | 1 +
frontend/src/icons/svg/icons.svg | 1 +
frontend/src/icons/svg/mima.svg | 1 +
frontend/src/icons/svg/password.svg | 1 +
frontend/src/icons/svg/quanxian.svg | 1 +
frontend/src/icons/svg/shouce.svg | 1 +
frontend/src/icons/svg/tab.svg | 1 +
frontend/src/icons/svg/table.svg | 1 +
frontend/src/icons/svg/theme.svg | 1 +
frontend/src/icons/svg/tree.svg | 1 +
frontend/src/icons/svg/tubiao.svg | 1 +
frontend/src/icons/svg/tuozhuai.svg | 1 +
frontend/src/icons/svg/user.svg | 1 +
frontend/src/icons/svg/weixin.svg | 1 +
frontend/src/icons/svg/wujiaoxing.svg | 1 +
frontend/src/icons/svg/xinrenzhinan.svg | 1 +
frontend/src/icons/svg/yanjing.svg | 1 +
frontend/src/icons/svg/yonghuming.svg | 1 +
frontend/src/icons/svg/zonghe.svg | 1 +
frontend/src/icons/svg/zujian.svg | 1 +
frontend/src/main.js | 79 +
frontend/src/permission.js | 38 +
frontend/src/router/_import_development.js | 1 +
frontend/src/router/_import_production.js | 2 +
frontend/src/router/index.js | 189 +
frontend/src/store/getters.js | 11 +
frontend/src/store/index.js | 19 +
frontend/src/store/modules/app.js | 26 +
frontend/src/store/modules/permission.js | 62 +
frontend/src/store/modules/user.js | 113 +
frontend/src/styles/app-main.scss | 40 +
frontend/src/styles/element-ui.scss | 29 +
frontend/src/styles/index.scss | 59 +
frontend/src/styles/mixin.scss | 27 +
frontend/src/styles/sidebar.scss | 100 +
frontend/src/styles/transition.scss | 32 +
frontend/src/styles/variables.scss | 4 +
frontend/src/utils/auth.js | 15 +
frontend/src/utils/fetch.js | 142 +
frontend/src/utils/index.js | 58 +
frontend/src/utils/validate.js | 33 +
frontend/src/views/404.vue | 229 +
frontend/src/views/admin/Index.vue | 508 +
frontend/src/views/admin/New.vue | 164 +
frontend/src/views/components/DownloadXls.vue | 76 +
frontend/src/views/components/UploadXls.vue | 96 +
frontend/src/views/dashboard/index.vue | 64 +
frontend/src/views/layout/Layout.vue | 37 +
.../src/views/layout/components/AppMain.vue | 26 +
.../src/views/layout/components/Navbar.vue | 93 +
.../layout/components/Sidebar/SidebarItem.vue | 43 +
.../views/layout/components/Sidebar/index.vue | 31 +
.../views/layout/components/Sidebar/item1.vue | 40 +
frontend/src/views/layout/components/index.js | 3 +
frontend/src/views/login/index.vue | 155 +
frontend/src/views/permission/Index.vue | 440 +
frontend/src/views/role/Index.vue | 302 +
.../src/views/teachmanage/Classteacher.vue | 409 +
frontend/src/views/teachmanage/Department.vue | 505 +
frontend/src/views/teachmanage/Leader.vue | 412 +
frontend/src/views/teachmanage/Session.vue | 246 +
frontend/src/views/teachmanage/Teaching.vue | 605 +
frontend/src/views/utils/Tools.js | 45 +
frontend/static/.gitkeep | 0
frontend/static/config.js | 3 +
464 files changed, 47296 insertions(+)
create mode 100644 .gitignore
create mode 100644 backend/.env.example
create mode 100644 backend/.gitattributes
create mode 100644 backend/.gitignore
create mode 100644 backend/3.txt
create mode 100644 backend/apidoc.json
create mode 100644 backend/app/ClassTeacher.php
create mode 100644 backend/app/Console/Kernel.php
create mode 100644 backend/app/Department.php
create mode 100644 backend/app/Exceptions/Handler.php
create mode 100644 backend/app/Http/Controllers/Auth/ForgotPasswordController.php
create mode 100644 backend/app/Http/Controllers/Auth/LoginController.php
create mode 100644 backend/app/Http/Controllers/Auth/RegisterController.php
create mode 100644 backend/app/Http/Controllers/Auth/ResetPasswordController.php
create mode 100644 backend/app/Http/Controllers/ClassTeacherController.php
create mode 100644 backend/app/Http/Controllers/Controller.php
create mode 100644 backend/app/Http/Controllers/DepartmentController.php
create mode 100644 backend/app/Http/Controllers/DiskController.php
create mode 100644 backend/app/Http/Controllers/FileController.php
create mode 100644 backend/app/Http/Controllers/Import/ClassTeacherImport.php
create mode 100644 backend/app/Http/Controllers/Import/ClassTeacherImportHandler.php
create mode 100644 backend/app/Http/Controllers/Import/DepartmentImport.php
create mode 100644 backend/app/Http/Controllers/Import/DepartmentImportHandler.php
create mode 100644 backend/app/Http/Controllers/Import/LeaderImport.php
create mode 100644 backend/app/Http/Controllers/Import/LeaderImportHandler.php
create mode 100644 backend/app/Http/Controllers/Import/SessionImport.php
create mode 100644 backend/app/Http/Controllers/Import/SessionImportHandler.php
create mode 100644 backend/app/Http/Controllers/Import/TeachingImport.php
create mode 100644 backend/app/Http/Controllers/Import/TeachingImportHandler.php
create mode 100644 backend/app/Http/Controllers/Import/UserImport.php
create mode 100644 backend/app/Http/Controllers/Import/UserImportHandler.php
create mode 100644 backend/app/Http/Controllers/LeaderController.php
create mode 100644 backend/app/Http/Controllers/MenuController.php
create mode 100644 backend/app/Http/Controllers/PermissionController.php
create mode 100644 backend/app/Http/Controllers/Result.php
create mode 100644 backend/app/Http/Controllers/RoleController.php
create mode 100644 backend/app/Http/Controllers/SessionController.php
create mode 100644 backend/app/Http/Controllers/TeachController.php
create mode 100644 backend/app/Http/Controllers/TeacherController.php
create mode 100644 backend/app/Http/Controllers/TeachingController.php
create mode 100644 backend/app/Http/Controllers/Tools.php
create mode 100644 backend/app/Http/Controllers/UserController.php
create mode 100644 backend/app/Http/Controllers/WechatController.php
create mode 100644 backend/app/Http/Kernel.php
create mode 100644 backend/app/Http/Middleware/EncryptCookies.php
create mode 100644 backend/app/Http/Middleware/RedirectIfAuthenticated.php
create mode 100644 backend/app/Http/Middleware/Role.php
create mode 100644 backend/app/Http/Middleware/TrimStrings.php
create mode 100644 backend/app/Http/Middleware/TrustProxies.php
create mode 100644 backend/app/Http/Middleware/VerifyCsrfToken.php
create mode 100644 backend/app/Http/Proxy/TokenProxy.php
create mode 100644 backend/app/Http/Requests/ClassTeacherRequest.php
create mode 100644 backend/app/Http/Requests/ClassTeacherUploadRequest.php
create mode 100644 backend/app/Http/Requests/DepartmentRequest.php
create mode 100644 backend/app/Http/Requests/DepartmentsUploadRequest.php
create mode 100644 backend/app/Http/Requests/LeaderRequest.php
create mode 100644 backend/app/Http/Requests/LeaderUploadRequest.php
create mode 100644 backend/app/Http/Requests/PermissionRequest.php
create mode 100644 backend/app/Http/Requests/Request.php
create mode 100644 backend/app/Http/Requests/RoleRequest.php
create mode 100644 backend/app/Http/Requests/TeachingRequest.php
create mode 100644 backend/app/Http/Requests/TeachingUploadRequest.php
create mode 100644 backend/app/Http/Resources/ClassTeacher.php
create mode 100644 backend/app/Http/Resources/ClassTeacherCollection.php
create mode 100644 backend/app/Http/Resources/Department.php
create mode 100644 backend/app/Http/Resources/DepartmentCollection.php
create mode 100644 backend/app/Http/Resources/Leader.php
create mode 100644 backend/app/Http/Resources/LeaderCollection.php
create mode 100644 backend/app/Http/Resources/Permission.php
create mode 100644 backend/app/Http/Resources/PermissionCollection.php
create mode 100644 backend/app/Http/Resources/Role.php
create mode 100644 backend/app/Http/Resources/RoleCollection.php
create mode 100644 backend/app/Http/Resources/Session.php
create mode 100644 backend/app/Http/Resources/SessionCollection.php
create mode 100644 backend/app/Http/Resources/Teaching.php
create mode 100644 backend/app/Http/Resources/TeachingCollection.php
create mode 100644 backend/app/Leader.php
create mode 100644 backend/app/Models/Model.php
create mode 100644 backend/app/Models/Permission.php
create mode 100644 backend/app/Policies/Policy.php
create mode 100644 backend/app/Providers/AppServiceProvider.php
create mode 100644 backend/app/Providers/AuthServiceProvider.php
create mode 100644 backend/app/Providers/BroadcastServiceProvider.php
create mode 100644 backend/app/Providers/EventServiceProvider.php
create mode 100644 backend/app/Providers/RouteServiceProvider.php
create mode 100644 backend/app/Resources/User.php
create mode 100644 backend/app/Resources/UserCollection.php
create mode 100644 backend/app/Role.php
create mode 100644 backend/app/Rules/Telphone.php
create mode 100644 backend/app/Session.php
create mode 100644 backend/app/Teach.php
create mode 100644 backend/app/Teacher.php
create mode 100644 backend/app/Teaching.php
create mode 100644 backend/app/User.php
create mode 100644 backend/app/check.php
create mode 100644 backend/artisan
create mode 100644 backend/bootstrap/app.php
create mode 100644 backend/bootstrap/cache/.gitignore
create mode 100644 backend/composer.json
create mode 100644 backend/composer.lock
create mode 100644 backend/config/app.php
create mode 100644 backend/config/auth.php
create mode 100644 backend/config/broadcasting.php
create mode 100644 backend/config/cache.php
create mode 100644 backend/config/cors.php
create mode 100644 backend/config/database.php
create mode 100644 backend/config/excel.php
create mode 100644 backend/config/filesystems.php
create mode 100644 backend/config/mail.php
create mode 100644 backend/config/queue.php
create mode 100644 backend/config/services.php
create mode 100644 backend/config/session.php
create mode 100644 backend/config/view.php
create mode 100644 backend/config/wechat.php
create mode 100644 backend/database/.gitignore
create mode 100644 backend/database/factories/ClassTeacherFactory.php
create mode 100644 backend/database/factories/DepartmentFactory.php
create mode 100644 backend/database/factories/LeaderFactory.php
create mode 100644 backend/database/factories/ModelsPermissionFactory.php
create mode 100644 backend/database/factories/RoleFactory.php
create mode 100644 backend/database/factories/SessionFactory.php
create mode 100644 backend/database/factories/TeacherFactory.php
create mode 100644 backend/database/factories/TeachingFactory.php
create mode 100644 backend/database/factories/UserFactory.php
create mode 100644 backend/database/migrations/2014_10_12_000000_create_users_table.php
create mode 100644 backend/database/migrations/2014_10_12_100000_create_password_resets_table.php
create mode 100644 backend/database/migrations/2017_12_04_184516_create_checks_table.php
create mode 100644 backend/database/migrations/2017_12_21_013247_create_teachings_table.php
create mode 100644 backend/database/migrations/2017_12_21_013300_create_sessions_table.php
create mode 100644 backend/database/migrations/2017_12_21_013340_create_departments_table.php
create mode 100644 backend/database/migrations/2017_12_21_013631_create_leaders_table.php
create mode 100644 backend/database/migrations/2017_12_21_025101_create_class_teachers_table.php
create mode 100644 backend/database/migrations/2017_12_25_102529_create_roles_table.php
create mode 100644 backend/database/migrations/2017_12_25_131341_add_clumn_into_sessions.php
create mode 100644 backend/database/migrations/2018_02_13_112400_create_permissions_table.php
create mode 100644 backend/database/seeds/DatabaseSeeder.php
create mode 100644 backend/database/seeds/RolesTableSeeder.php
create mode 100644 backend/database/seeds/UsersTableSeeder.php
create mode 100644 backend/package.json
create mode 100644 backend/phpunit.xml
create mode 100644 backend/public/.htaccess
create mode 100644 backend/public/apidoc/api_data.js
create mode 100644 backend/public/apidoc/api_data.json
create mode 100644 backend/public/apidoc/api_project.js
create mode 100644 backend/public/apidoc/api_project.json
create mode 100644 backend/public/apidoc/css/style.css
create mode 100644 backend/public/apidoc/fonts/glyphicons-halflings-regular.eot
create mode 100644 backend/public/apidoc/fonts/glyphicons-halflings-regular.svg
create mode 100644 backend/public/apidoc/fonts/glyphicons-halflings-regular.ttf
create mode 100644 backend/public/apidoc/fonts/glyphicons-halflings-regular.woff
create mode 100644 backend/public/apidoc/fonts/glyphicons-halflings-regular.woff2
create mode 100644 backend/public/apidoc/img/favicon.ico
create mode 100644 backend/public/apidoc/index.html
create mode 100644 backend/public/apidoc/locales/ca.js
create mode 100644 backend/public/apidoc/locales/de.js
create mode 100644 backend/public/apidoc/locales/es.js
create mode 100644 backend/public/apidoc/locales/fr.js
create mode 100644 backend/public/apidoc/locales/it.js
create mode 100644 backend/public/apidoc/locales/locale.js
create mode 100644 backend/public/apidoc/locales/nl.js
create mode 100644 backend/public/apidoc/locales/pl.js
create mode 100644 backend/public/apidoc/locales/pt_br.js
create mode 100644 backend/public/apidoc/locales/ro.js
create mode 100644 backend/public/apidoc/locales/ru.js
create mode 100644 backend/public/apidoc/locales/tr.js
create mode 100644 backend/public/apidoc/locales/vi.js
create mode 100644 backend/public/apidoc/locales/zh.js
create mode 100644 backend/public/apidoc/locales/zh_cn.js
create mode 100644 backend/public/apidoc/main.js
create mode 100644 backend/public/apidoc/utils/handlebars_helper.js
create mode 100644 backend/public/apidoc/utils/send_sample_request.js
create mode 100644 backend/public/apidoc/vendor/bootstrap.min.css
create mode 100644 backend/public/apidoc/vendor/bootstrap.min.js
create mode 100644 backend/public/apidoc/vendor/diff_match_patch.min.js
create mode 100644 backend/public/apidoc/vendor/handlebars.min.js
create mode 100644 backend/public/apidoc/vendor/jquery.min.js
create mode 100644 backend/public/apidoc/vendor/list.min.js
create mode 100644 backend/public/apidoc/vendor/lodash.custom.min.js
create mode 100644 backend/public/apidoc/vendor/path-to-regexp/LICENSE
create mode 100644 backend/public/apidoc/vendor/path-to-regexp/index.js
create mode 100644 backend/public/apidoc/vendor/polyfill.js
create mode 100644 backend/public/apidoc/vendor/prettify.css
create mode 100644 backend/public/apidoc/vendor/prettify/lang-Splus.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-aea.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-agc.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-apollo.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-basic.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-cbm.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-cl.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-clj.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-css.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-dart.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-el.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-erl.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-erlang.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-fs.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-go.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-hs.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-lasso.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-lassoscript.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-latex.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-lgt.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-lisp.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-ll.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-llvm.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-logtalk.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-ls.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-lsp.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-lua.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-matlab.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-ml.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-mumps.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-n.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-nemerle.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-pascal.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-proto.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-r.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-rd.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-rkt.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-rust.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-s.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-scala.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-scm.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-sql.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-ss.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-swift.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-tcl.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-tex.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-vb.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-vbs.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-vhd.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-vhdl.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-wiki.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-xq.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-xquery.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-yaml.js
create mode 100644 backend/public/apidoc/vendor/prettify/lang-yml.js
create mode 100644 backend/public/apidoc/vendor/prettify/prettify.css
create mode 100644 backend/public/apidoc/vendor/prettify/prettify.js
create mode 100644 backend/public/apidoc/vendor/prettify/run_prettify.js
create mode 100644 backend/public/apidoc/vendor/require.min.js
create mode 100644 backend/public/apidoc/vendor/semver.min.js
create mode 100644 backend/public/apidoc/vendor/webfontloader.js
create mode 100644 backend/public/audio/2.mp3
create mode 100644 backend/public/css/app.css
create mode 100644 backend/public/favicon.ico
create mode 100644 backend/public/image/1.png
create mode 100644 backend/public/index.php
create mode 100644 backend/public/js/app.js
create mode 100644 backend/public/js/iSlider.js
create mode 100644 backend/public/robots.txt
create mode 100644 backend/public/uploads/201711251441th5a19812148058.jpg
create mode 100644 backend/public/uploads/201711251509th5a19879c71868.jpg
create mode 100644 backend/public/uploads/201802041420th5a76a612a9a32.jpg
create mode 100644 backend/public/uploads/201802041420th5a76a6299ca62.jpg
create mode 100644 backend/public/uploads/201802041421th5a76a67de447b.jpg
create mode 100644 backend/public/uploads/201802061727th5a79751e93407.jpg
create mode 100644 backend/public/web.config
create mode 100644 backend/public/xls/class_teacher.xls
create mode 100644 backend/public/xls/departments.xls
create mode 100644 backend/public/xls/leader.xls
create mode 100644 backend/public/xls/session.xls
create mode 100644 backend/public/xls/teaching.xls
create mode 100644 backend/public/xls/user.xls
create mode 100644 backend/readme.md
create mode 100644 backend/resources/assets/js/app.js
create mode 100644 backend/resources/assets/js/bootstrap.js
create mode 100644 backend/resources/assets/js/components/Example.vue
create mode 100644 backend/resources/assets/sass/_variables.scss
create mode 100644 backend/resources/assets/sass/app.scss
create mode 100644 backend/resources/lang/en/auth.php
create mode 100644 backend/resources/lang/en/pagination.php
create mode 100644 backend/resources/lang/en/passwords.php
create mode 100644 backend/resources/lang/en/validation.php
create mode 100644 backend/resources/lang/zh-CN/auth.php
create mode 100644 backend/resources/lang/zh-CN/pagination.php
create mode 100644 backend/resources/lang/zh-CN/passwords.php
create mode 100644 backend/resources/lang/zh-CN/validation.php
create mode 100644 backend/resources/views/file/update.blade.php
create mode 100644 backend/resources/views/file/update_xls.blade.php
create mode 100644 backend/resources/views/view.blade.php
create mode 100644 backend/resources/views/view1.blade.php
create mode 100644 backend/resources/views/welcome.blade.php
create mode 100644 backend/route.txt
create mode 100644 backend/routes/api.php
create mode 100644 backend/routes/channels.php
create mode 100644 backend/routes/console.php
create mode 100644 backend/routes/web.php
create mode 100644 backend/server.php
create mode 100644 backend/storage/app/.gitignore
create mode 100644 backend/storage/framework/.gitignore
create mode 100644 backend/storage/framework/cache/.gitignore
create mode 100644 backend/storage/framework/sessions/.gitignore
create mode 100644 backend/storage/framework/testing/.gitignore
create mode 100644 backend/storage/framework/views/.gitignore
create mode 100644 backend/storage/logs/.gitignore
create mode 100644 backend/tests/CreatesApplication.php
create mode 100644 backend/tests/Feature/ExampleTest.php
create mode 100644 backend/tests/TestCase.php
create mode 100644 backend/tests/Unit/ExampleTest.php
create mode 100644 backend/webpack.mix.js
create mode 100644 "backend/\346\217\222\344\273\266\351\233\206\346\210\220\344\275\277\347\224\250.txt"
create mode 100644 "backend/\351\241\271\347\233\256\345\220\216\345\217\260\345\256\211\350\243\205.md"
create mode 100644 frontend/.babelrc
create mode 100644 frontend/.editorconfig
create mode 100644 frontend/.eslintignore
create mode 100644 frontend/.eslintrc.js
create mode 100644 frontend/.gitignore
create mode 100644 frontend/.postcssrc.js
create mode 100644 frontend/LICENSE
create mode 100644 frontend/README-zh.md
create mode 100644 frontend/README.md
create mode 100644 frontend/build/build.js
create mode 100644 frontend/build/check-versions.js
create mode 100644 frontend/build/dev-client.js
create mode 100644 frontend/build/dev-server.js
create mode 100644 frontend/build/logo.png
create mode 100644 frontend/build/utils.js
create mode 100644 frontend/build/vue-loader.conf.js
create mode 100644 frontend/build/webpack.base.conf.js
create mode 100644 frontend/build/webpack.dev.conf.js
create mode 100644 frontend/build/webpack.prod.conf.js
create mode 100644 frontend/config/dev.env.js
create mode 100644 frontend/config/index.js
create mode 100644 frontend/config/prod.env.js
create mode 100644 frontend/dist/.htaccess
create mode 100644 frontend/dist/favicon.ico
create mode 100644 frontend/dist/index.html
create mode 100644 frontend/dist/static/config.js
create mode 100644 frontend/dist/static/css/app.66ca77085a8cf6265e69f94019e88a0c.css
create mode 100644 frontend/dist/static/fonts/element-icons.6f0a763.ttf
create mode 100644 frontend/dist/static/img/404.a57b6f3.png
create mode 100644 frontend/dist/static/js/0.4ec1cf623150494506af.js
create mode 100644 frontend/dist/static/js/1.91e1eb85f703cbfb3e32.js
create mode 100644 frontend/dist/static/js/10.f8f5c94a9178225a07f1.js
create mode 100644 frontend/dist/static/js/11.11d848892bf427c3d713.js
create mode 100644 frontend/dist/static/js/12.e07aae8e7c7f4c392731.js
create mode 100644 frontend/dist/static/js/13.b191e4641bfe70b311fd.js
create mode 100644 frontend/dist/static/js/14.5afb41adfb1eeb67b28c.js
create mode 100644 frontend/dist/static/js/15.e093022bead06700e4b4.js
create mode 100644 frontend/dist/static/js/16.80b2f01064ba3e32b8b2.js
create mode 100644 frontend/dist/static/js/17.0e0d4fcd87cfdc2ecef9.js
create mode 100644 frontend/dist/static/js/18.41bebf2fa87299d88337.js
create mode 100644 frontend/dist/static/js/19.0143f3b77deb27ab4a55.js
create mode 100644 frontend/dist/static/js/2.4679b6a028da768fb3bf.js
create mode 100644 frontend/dist/static/js/20.6e7b3ca1f0c0d4853a82.js
create mode 100644 frontend/dist/static/js/21.7906ca82fd284141d204.js
create mode 100644 frontend/dist/static/js/22.846dc01be7c16dfb12d8.js
create mode 100644 frontend/dist/static/js/23.be292b0980dd8e0c32d5.js
create mode 100644 frontend/dist/static/js/3.62be4c74eb6cc854ca34.js
create mode 100644 frontend/dist/static/js/4.00bab46b77247dea82e0.js
create mode 100644 frontend/dist/static/js/5.49aee0de97841a1dd56f.js
create mode 100644 frontend/dist/static/js/6.118e13cd0b17527d57d5.js
create mode 100644 frontend/dist/static/js/7.2ab80d20f3bf967c66e4.js
create mode 100644 frontend/dist/static/js/8.053f86f43d6a01a78793.js
create mode 100644 frontend/dist/static/js/9.cd0cb31bc11d631af700.js
create mode 100644 frontend/dist/static/js/app.daab7bc25b4290b655d8.js
create mode 100644 frontend/dist/static/js/manifest.84d550dbae7df66a62d1.js
create mode 100644 frontend/dist/static/js/vendor.9f3b16f0c179b1fcc9a1.js
create mode 100644 frontend/favicon.ico
create mode 100644 frontend/index.html
create mode 100644 frontend/package-lock.json
create mode 100644 frontend/package.json
create mode 100644 frontend/src/App.vue
create mode 100644 frontend/src/api/admin.js
create mode 100644 frontend/src/api/classTeacher.js
create mode 100644 frontend/src/api/department.js
create mode 100644 frontend/src/api/leader.js
create mode 100644 frontend/src/api/login.js
create mode 100644 frontend/src/api/other.js
create mode 100644 frontend/src/api/permission.js
create mode 100644 frontend/src/api/role.js
create mode 100644 frontend/src/api/session.js
create mode 100644 frontend/src/api/table.js
create mode 100644 frontend/src/api/teaching.js
create mode 100644 frontend/src/assets/404_images/404.png
create mode 100644 frontend/src/assets/404_images/404_cloud.png
create mode 100644 frontend/src/assets/images/fuck.png
create mode 100644 frontend/src/components/Breadcrumb/index.vue
create mode 100644 frontend/src/components/Hamburger/index.vue
create mode 100644 frontend/src/components/Icon-svg/index.vue
create mode 100644 frontend/src/components/ScrollBar/index.vue
create mode 100644 frontend/src/components/SvgIcon/index.vue
create mode 100644 frontend/src/components/avatar/index.vue
create mode 100644 frontend/src/config/_import_development.js
create mode 100644 frontend/src/config/_import_production.js
create mode 100644 frontend/src/config/index.js
create mode 100644 frontend/src/icons/index.js
create mode 100644 frontend/src/icons/svg/404.svg
create mode 100644 frontend/src/icons/svg/EXCEL.svg
create mode 100644 frontend/src/icons/svg/QQ.svg
create mode 100644 frontend/src/icons/svg/a.svg
create mode 100644 frontend/src/icons/svg/b.svg
create mode 100644 frontend/src/icons/svg/bug.svg
create mode 100644 frontend/src/icons/svg/c.svg
create mode 100644 frontend/src/icons/svg/email.svg
create mode 100644 frontend/src/icons/svg/example.svg
create mode 100644 frontend/src/icons/svg/eye.svg
create mode 100644 frontend/src/icons/svg/form.svg
create mode 100644 frontend/src/icons/svg/from.svg
create mode 100644 frontend/src/icons/svg/icons.svg
create mode 100644 frontend/src/icons/svg/mima.svg
create mode 100644 frontend/src/icons/svg/password.svg
create mode 100644 frontend/src/icons/svg/quanxian.svg
create mode 100644 frontend/src/icons/svg/shouce.svg
create mode 100644 frontend/src/icons/svg/tab.svg
create mode 100644 frontend/src/icons/svg/table.svg
create mode 100644 frontend/src/icons/svg/theme.svg
create mode 100644 frontend/src/icons/svg/tree.svg
create mode 100644 frontend/src/icons/svg/tubiao.svg
create mode 100644 frontend/src/icons/svg/tuozhuai.svg
create mode 100644 frontend/src/icons/svg/user.svg
create mode 100644 frontend/src/icons/svg/weixin.svg
create mode 100644 frontend/src/icons/svg/wujiaoxing.svg
create mode 100644 frontend/src/icons/svg/xinrenzhinan.svg
create mode 100644 frontend/src/icons/svg/yanjing.svg
create mode 100644 frontend/src/icons/svg/yonghuming.svg
create mode 100644 frontend/src/icons/svg/zonghe.svg
create mode 100644 frontend/src/icons/svg/zujian.svg
create mode 100644 frontend/src/main.js
create mode 100644 frontend/src/permission.js
create mode 100644 frontend/src/router/_import_development.js
create mode 100644 frontend/src/router/_import_production.js
create mode 100644 frontend/src/router/index.js
create mode 100644 frontend/src/store/getters.js
create mode 100644 frontend/src/store/index.js
create mode 100644 frontend/src/store/modules/app.js
create mode 100644 frontend/src/store/modules/permission.js
create mode 100644 frontend/src/store/modules/user.js
create mode 100644 frontend/src/styles/app-main.scss
create mode 100644 frontend/src/styles/element-ui.scss
create mode 100644 frontend/src/styles/index.scss
create mode 100644 frontend/src/styles/mixin.scss
create mode 100644 frontend/src/styles/sidebar.scss
create mode 100644 frontend/src/styles/transition.scss
create mode 100644 frontend/src/styles/variables.scss
create mode 100644 frontend/src/utils/auth.js
create mode 100644 frontend/src/utils/fetch.js
create mode 100644 frontend/src/utils/index.js
create mode 100644 frontend/src/utils/validate.js
create mode 100644 frontend/src/views/404.vue
create mode 100644 frontend/src/views/admin/Index.vue
create mode 100644 frontend/src/views/admin/New.vue
create mode 100644 frontend/src/views/components/DownloadXls.vue
create mode 100644 frontend/src/views/components/UploadXls.vue
create mode 100644 frontend/src/views/dashboard/index.vue
create mode 100644 frontend/src/views/layout/Layout.vue
create mode 100644 frontend/src/views/layout/components/AppMain.vue
create mode 100644 frontend/src/views/layout/components/Navbar.vue
create mode 100644 frontend/src/views/layout/components/Sidebar/SidebarItem.vue
create mode 100644 frontend/src/views/layout/components/Sidebar/index.vue
create mode 100644 frontend/src/views/layout/components/Sidebar/item1.vue
create mode 100644 frontend/src/views/layout/components/index.js
create mode 100644 frontend/src/views/login/index.vue
create mode 100644 frontend/src/views/permission/Index.vue
create mode 100644 frontend/src/views/role/Index.vue
create mode 100644 frontend/src/views/teachmanage/Classteacher.vue
create mode 100644 frontend/src/views/teachmanage/Department.vue
create mode 100644 frontend/src/views/teachmanage/Leader.vue
create mode 100644 frontend/src/views/teachmanage/Session.vue
create mode 100644 frontend/src/views/teachmanage/Teaching.vue
create mode 100644 frontend/src/views/utils/Tools.js
create mode 100644 frontend/static/.gitkeep
create mode 100644 frontend/static/config.js
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..e483d9d6
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+
+.DS_Store
+.idea
+.vscode
+
diff --git a/backend/.env.example b/backend/.env.example
new file mode 100644
index 00000000..9b82a8b4
--- /dev/null
+++ b/backend/.env.example
@@ -0,0 +1,39 @@
+APP_NAME=Laravel
+APP_ENV=local
+APP_KEY=base64:evzA0zJuKuVxjmXcrNbxslFMUoE5m+M7IAhIVw2X0Z8=
+APP_DEBUG=true
+APP_LOG_LEVEL=debug
+APP_URL=http://localhost
+
+DB_CONNECTION=mysql
+DB_HOST=10.192.65.131
+DB_PORT=3306
+DB_DATABASE=xpyz
+DB_USERNAME=wmhello
+DB_PASSWORD=514728
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+SESSION_DRIVER=file
+QUEUE_DRIVER=sync
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_DRIVER=smtp
+MAIL_HOST=smtp.mailtrap.io
+MAIL_PORT=2525
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+
+PERSONAL_Client_ID=3
+PERSONAL_Client_Secret=i1rb3e9rqmg8xNtM8H30wnl24QteogNrqZauPaoW
+
+PASSPORT_Client_ID=4
+PASSPORT_Client_Secret=k4mCTWjHpAzBmXwyfgA12IROrZaKAD3YrnJJwJyZ
\ No newline at end of file
diff --git a/backend/.gitattributes b/backend/.gitattributes
new file mode 100644
index 00000000..967315dd
--- /dev/null
+++ b/backend/.gitattributes
@@ -0,0 +1,5 @@
+* text=auto
+*.css linguist-vendored
+*.scss linguist-vendored
+*.js linguist-vendored
+CHANGELOG.md export-ignore
diff --git a/backend/.gitignore b/backend/.gitignore
new file mode 100644
index 00000000..b6a4b86d
--- /dev/null
+++ b/backend/.gitignore
@@ -0,0 +1,12 @@
+/node_modules
+/public/hot
+/public/storage
+/storage/*.key
+/vendor
+/.idea
+/.vagrant
+Homestead.json
+Homestead.yaml
+npm-debug.log
+yarn-error.log
+.env
diff --git a/backend/3.txt b/backend/3.txt
new file mode 100644
index 00000000..934d01df
--- /dev/null
+++ b/backend/3.txt
@@ -0,0 +1,118 @@
++--------+----------------------------------------+-----------------------------------------+------------------------+----------------------------------------------------------------------------+--------------+
+|[32m Domain [39m|[32m Method [39m|[32m URI [39m|[32m Name [39m|[32m Action [39m|[32m Middleware [39m|
++--------+----------------------------------------+-----------------------------------------+------------------------+----------------------------------------------------------------------------+--------------+
+| | GET|HEAD | / | | Closure | web |
+| | POST | api/admin | admin.store | App\Http\Controllers\UserController@store | api,auth:api |
+| | GET|HEAD | api/admin | admin.index | App\Http\Controllers\UserController@index | api,auth:api |
+| | GET|HEAD | api/admin/create | admin.create | App\Http\Controllers\UserController@create | api,auth:api |
+| | POST | api/admin/deleteAll | admin.deleteAll | App\Http\Controllers\UserController@deleteAll | api,auth:api |
+| | POST | api/admin/export | admin.export | App\Http\Controllers\UserController@export | api,auth:api |
+| | POST | api/admin/exportAll | admin.exportAll | App\Http\Controllers\UserController@exportAll | api,auth:api |
+| | POST | api/admin/modify | admin.modify | App\Http\Controllers\UserController@modify | api,auth:api |
+| | POST | api/admin/upload | admin.upload | App\Http\Controllers\UserController@upload | api,auth:api |
+| | POST | api/admin/uploadAvatar | admin.uploadAvatar | App\Http\Controllers\UserController@uploadAvatar | api,auth:api |
+| | DELETE | api/admin/{admin} | admin.destroy | App\Http\Controllers\UserController@destroy | api,auth:api |
+| | GET|HEAD | api/admin/{admin} | admin.show | App\Http\Controllers\UserController@show | api,auth:api |
+| | PUT|PATCH | api/admin/{admin} | admin.update | App\Http\Controllers\UserController@update | api,auth:api |
+| | GET|HEAD | api/admin/{admin}/edit | admin.edit | App\Http\Controllers\UserController@edit | api,auth:api |
+| | POST | api/admin/{id}/reset | admin.reset | App\Http\Controllers\UserController@reset | api,auth:api |
+| | GET|HEAD | api/classTeacher | classTeacher.index | App\Http\Controllers\ClassTeacherController@index | api,auth:api |
+| | POST | api/classTeacher | classTeacher.store | App\Http\Controllers\ClassTeacherController@store | api,auth:api |
+| | GET|HEAD | api/classTeacher/create | classTeacher.create | App\Http\Controllers\ClassTeacherController@create | api,auth:api |
+| | POST | api/classTeacher/deleteAll | classTeacher.deleteAll | App\Http\Controllers\ClassTeacherController@deleteAll | api,auth:api |
+| | POST | api/classTeacher/export | classTeacher.export | App\Http\Controllers\ClassTeacherController@export | api,auth:api |
+| | POST | api/classTeacher/exportAll | classTeacher.exportAll | App\Http\Controllers\ClassTeacherController@exportAll | api,auth:api |
+| | POST | api/classTeacher/upload | classTeacher.upload | App\Http\Controllers\ClassTeacherController@upload | api,auth:api |
+| | GET|HEAD | api/classTeacher/{classTeacher} | classTeacher.show | App\Http\Controllers\ClassTeacherController@show | api,auth:api |
+| | PUT|PATCH | api/classTeacher/{classTeacher} | classTeacher.update | App\Http\Controllers\ClassTeacherController@update | api,auth:api |
+| | DELETE | api/classTeacher/{classTeacher} | classTeacher.destroy | App\Http\Controllers\ClassTeacherController@destroy | api,auth:api |
+| | GET|HEAD | api/classTeacher/{classTeacher}/edit | classTeacher.edit | App\Http\Controllers\ClassTeacherController@edit | api,auth:api |
+| | GET|HEAD | api/department | department.index | App\Http\Controllers\DepartmentController@index | api,auth:api |
+| | POST | api/department | department.store | App\Http\Controllers\DepartmentController@store | api,auth:api |
+| | GET|HEAD | api/department/create | department.create | App\Http\Controllers\DepartmentController@create | api,auth:api |
+| | POST | api/department/deleteAll | department.deleteAll | App\Http\Controllers\DepartmentController@deleteAll | api,auth:api |
+| | POST | api/department/export | department.export | App\Http\Controllers\DepartmentController@export | api,auth:api |
+| | POST | api/department/exportAll | department.exportAll | App\Http\Controllers\DepartmentController@exportAll | api,auth:api |
+| | POST | api/department/upload | department.upload | App\Http\Controllers\DepartmentController@upload | api,auth:api |
+| | GET|HEAD | api/department/{department} | department.show | App\Http\Controllers\DepartmentController@show | api,auth:api |
+| | PUT|PATCH | api/department/{department} | department.update | App\Http\Controllers\DepartmentController@update | api,auth:api |
+| | DELETE | api/department/{department} | department.destroy | App\Http\Controllers\DepartmentController@destroy | api,auth:api |
+| | GET|HEAD | api/department/{department}/edit | department.edit | App\Http\Controllers\DepartmentController@edit | api,auth:api |
+| | GET|HEAD | api/getClassByTeachingId/{id} | teaching.getClass | App\Http\Controllers\TeachingController@getClassByTeachingId | api,auth:api |
+| | GET|HEAD | api/getClassNumByGrade | session.getClassNum | App\Http\Controllers\SessionController@getClassNumByGrade | api,auth:api |
+| | GET|HEAD | api/getDefaultSession | session.getDefault | App\Http\Controllers\SessionController@getDefaultSession | api,auth:api |
+| | GET|HEAD | api/getRoles | role.get | App\Http\Controllers\RoleController@getRoles | api,auth:api |
+| | GET|HEAD | api/getSelectClass/{id}/grade/{grade} | teaching.getTeacher | App\Http\Controllers\TeachingController@getSelectClassByGrade | api,auth:api |
+| | GET|HEAD | api/getSession | session.get | App\Http\Controllers\SessionController@getSession | api,auth:api |
+| | GET|HEAD | api/getTeach | teach.get | App\Http\Controllers\TeachController@getTeach | api,auth:api |
+| | GET|HEAD | api/getTeacher | teacher.get | App\Http\Controllers\TeacherController@getTeacher | api,auth:api |
+| | GET|HEAD | api/getTeacherByTeachingId | teacher.getTeacher | App\Http\Controllers\TeacherController@getTeacherByTeachingId | api,auth:api |
+| | GET|HEAD | api/leader | leader.index | App\Http\Controllers\LeaderController@index | api,auth:api |
+| | POST | api/leader | leader.store | App\Http\Controllers\LeaderController@store | api,auth:api |
+| | GET|HEAD | api/leader/create | leader.create | App\Http\Controllers\LeaderController@create | api,auth:api |
+| | POST | api/leader/deleteAll | leader.deleteAll | App\Http\Controllers\LeaderController@deleteAll | api,auth:api |
+| | POST | api/leader/export | leader.export | App\Http\Controllers\LeaderController@export | api,auth:api |
+| | POST | api/leader/exportAll | leader.exportAll | App\Http\Controllers\LeaderController@exportAll | api,auth:api |
+| | POST | api/leader/upload | leader.upload | App\Http\Controllers\LeaderController@upload | api,auth:api |
+| | DELETE | api/leader/{leader} | leader.destroy | App\Http\Controllers\LeaderController@destroy | api,auth:api |
+| | PUT|PATCH | api/leader/{leader} | leader.update | App\Http\Controllers\LeaderController@update | api,auth:api |
+| | GET|HEAD | api/leader/{leader} | leader.show | App\Http\Controllers\LeaderController@show | api,auth:api |
+| | GET|HEAD | api/leader/{leader}/edit | leader.edit | App\Http\Controllers\LeaderController@edit | api,auth:api |
+| | POST | api/login | login.login | App\Http\Controllers\Auth\LoginController@login | api,guest |
+| | POST | api/logout | login.logout | App\Http\Controllers\Auth\LoginController@logout | api |
+| | GET|HEAD | api/role | role.index | App\Http\Controllers\RoleController@index | api,auth:api |
+| | POST | api/role | role.store | App\Http\Controllers\RoleController@store | api,auth:api |
+| | GET|HEAD | api/role/create | role.create | App\Http\Controllers\RoleController@create | api,auth:api |
+| | GET|HEAD | api/role/{role} | role.show | App\Http\Controllers\RoleController@show | api,auth:api |
+| | PUT|PATCH | api/role/{role} | role.update | App\Http\Controllers\RoleController@update | api,auth:api |
+| | DELETE | api/role/{role} | role.destroy | App\Http\Controllers\RoleController@destroy | api,auth:api |
+| | GET|HEAD | api/role/{role}/edit | role.edit | App\Http\Controllers\RoleController@edit | api,auth:api |
+| | POST | api/session | session.store | App\Http\Controllers\SessionController@store | api,auth:api |
+| | GET|HEAD | api/session | session.index | App\Http\Controllers\SessionController@index | api,auth:api |
+| | GET|HEAD | api/session/create | session.create | App\Http\Controllers\SessionController@create | api,auth:api |
+| | POST | api/session/upload | session.upload | App\Http\Controllers\SessionController@upload | api,auth:api |
+| | DELETE | api/session/{session} | session.destroy | App\Http\Controllers\SessionController@destroy | api,auth:api |
+| | PUT|PATCH | api/session/{session} | session.update | App\Http\Controllers\SessionController@update | api,auth:api |
+| | GET|HEAD | api/session/{session} | session.show | App\Http\Controllers\SessionController@show | api,auth:api |
+| | GET|HEAD | api/session/{session}/edit | session.edit | App\Http\Controllers\SessionController@edit | api,auth:api |
+| | POST | api/teaching | teaching.store | App\Http\Controllers\TeachingController@store | api,auth:api |
+| | GET|HEAD | api/teaching | teaching.index | App\Http\Controllers\TeachingController@index | api,auth:api |
+| | GET|HEAD | api/teaching/create | teaching.create | App\Http\Controllers\TeachingController@create | api,auth:api |
+| | POST | api/teaching/deleteAll | teaching.deleteAll | App\Http\Controllers\TeachingController@deleteAll | api,auth:api |
+| | POST | api/teaching/export | teaching.export | App\Http\Controllers\TeachingController@export | api,auth:api |
+| | POST | api/teaching/exportAll | teaching.exportAll | App\Http\Controllers\TeachingController@exportAll | api,auth:api |
+| | POST | api/teaching/upload | teaching.upload | App\Http\Controllers\TeachingController@upload | api,auth:api |
+| | GET|HEAD | api/teaching/{teaching} | teaching.show | App\Http\Controllers\TeachingController@show | api,auth:api |
+| | PUT|PATCH | api/teaching/{teaching} | teaching.update | App\Http\Controllers\TeachingController@update | api,auth:api |
+| | DELETE | api/teaching/{teaching} | teaching.destroy | App\Http\Controllers\TeachingController@destroy | api,auth:api |
+| | GET|HEAD | api/teaching/{teaching}/edit | teaching.edit | App\Http\Controllers\TeachingController@edit | api,auth:api |
+| | POST | api/test | soft.test | App\Http\Controllers\TeachingController@test | api |
+| | POST | api/token/refresh | login.refresh | App\Http\Controllers\Auth\LoginController@refresh | api,guest |
+| | GET|HEAD | api/user | admin.userInfo | App\Http\Controllers\UserController@getUserInfo | api,auth:api |
+| | GET|HEAD | disk/copy | | App\Http\Controllers\DiskController@copy | web |
+| | GET|HEAD | disk/move | | App\Http\Controllers\DiskController@move | web |
+| | GET|HEAD | disk1 | | App\Http\Controllers\DiskController@disk1 | web |
+| | GET|HEAD | file/files | | App\Http\Controllers\FileController@files | web |
+| | POST | file/store | | App\Http\Controllers\FileController@store | web |
+| | POST | file/storeXls | | App\Http\Controllers\FileController@storeXls | web |
+| | GET|HEAD | file/update | | App\Http\Controllers\FileController@update | web |
+| | GET|HEAD | file/updateXls | | App\Http\Controllers\FileController@updateXls | web |
+| | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | menu | | App\Http\Controllers\MenuController@menu | web |
+| | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | menu/all | | App\Http\Controllers\MenuController@all | web |
+| | DELETE | oauth/authorize | | \Laravel\Passport\Http\Controllers\DenyAuthorizationController@deny | web,auth |
+| | POST | oauth/authorize | | \Laravel\Passport\Http\Controllers\ApproveAuthorizationController@approve | web,auth |
+| | GET|HEAD | oauth/authorize | | \Laravel\Passport\Http\Controllers\AuthorizationController@authorize | web,auth |
+| | POST | oauth/clients | | \Laravel\Passport\Http\Controllers\ClientController@store | web,auth |
+| | GET|HEAD | oauth/clients | | \Laravel\Passport\Http\Controllers\ClientController@forUser | web,auth |
+| | DELETE | oauth/clients/{client_id} | | \Laravel\Passport\Http\Controllers\ClientController@destroy | web,auth |
+| | PUT | oauth/clients/{client_id} | | \Laravel\Passport\Http\Controllers\ClientController@update | web,auth |
+| | POST | oauth/personal-access-tokens | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@store | web,auth |
+| | GET|HEAD | oauth/personal-access-tokens | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@forUser | web,auth |
+| | DELETE | oauth/personal-access-tokens/{token_id} | | \Laravel\Passport\Http\Controllers\PersonalAccessTokenController@destroy | web,auth |
+| | GET|HEAD | oauth/scopes | | \Laravel\Passport\Http\Controllers\ScopeController@all | web,auth |
+| | POST | oauth/token | | \Laravel\Passport\Http\Controllers\AccessTokenController@issueToken | throttle |
+| | POST | oauth/token/refresh | | \Laravel\Passport\Http\Controllers\TransientTokenController@refresh | web,auth |
+| | GET|HEAD | oauth/tokens | | \Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@forUser | web,auth |
+| | DELETE | oauth/tokens/{token_id} | | \Laravel\Passport\Http\Controllers\AuthorizedAccessTokenController@destroy | web,auth |
+| | GET|HEAD|POST|PUT|PATCH|DELETE|OPTIONS | wechat | | App\Http\Controllers\WechatController@serve | web |
++--------+----------------------------------------+-----------------------------------------+------------------------+----------------------------------------------------------------------------+--------------+
diff --git a/backend/apidoc.json b/backend/apidoc.json
new file mode 100644
index 00000000..454c45c9
--- /dev/null
+++ b/backend/apidoc.json
@@ -0,0 +1,7 @@
+{
+ "name": "学校工作网",
+ "version": "0.1.0",
+ "description": "学校工作网后台管理系统项目",
+ "title": "学校工作网项目文档",
+ "url" : ""
+}
\ No newline at end of file
diff --git a/backend/app/ClassTeacher.php b/backend/app/ClassTeacher.php
new file mode 100644
index 00000000..838db11f
--- /dev/null
+++ b/backend/app/ClassTeacher.php
@@ -0,0 +1,44 @@
+input('grade');
+ if (isset($val)) {
+ return $query = $query->where('grade', $val);
+ }else {
+ return $query;
+ }
+ }
+
+ public function scopeTeacherId($query)
+ {
+ $val= request()->input('teacher_id');
+ if (isset($val)) {
+ return $query = $query->where('teacher_id', $val);
+ }else {
+ return $query;
+ }
+ }
+
+ public function scopeSessionId($query)
+ {
+ $val= request()->input('session_id');
+ if (isset($val)) {
+ return $query = $query->where('session_id', $val);
+ }else {
+ $sessionId = $this->getCurrentSessionId();
+ return $query = $query->where('session_id', $sessionId);
+ }
+ }
+}
diff --git a/backend/app/Console/Kernel.php b/backend/app/Console/Kernel.php
new file mode 100644
index 00000000..a8c51585
--- /dev/null
+++ b/backend/app/Console/Kernel.php
@@ -0,0 +1,42 @@
+command('inspire')
+ // ->hourly();
+ }
+
+ /**
+ * Register the commands for the application.
+ *
+ * @return void
+ */
+ protected function commands()
+ {
+ $this->load(__DIR__.'/Commands');
+
+ require base_path('routes/console.php');
+ }
+}
diff --git a/backend/app/Department.php b/backend/app/Department.php
new file mode 100644
index 00000000..feee8080
--- /dev/null
+++ b/backend/app/Department.php
@@ -0,0 +1,56 @@
+input('grade');
+ if (isset($val)) {
+ return $query = $query->where('grade', $val);
+ }else {
+ return $query;
+ }
+ }
+
+ public function scopeLeader($query)
+ {
+ $val= request()->input('leader');
+ if (isset($val)) {
+ return $query = $query->where('leader', $val);
+ }else {
+ return $query;
+ }
+ }
+
+ public function scopeTeacherId($query)
+ {
+ $val= request()->input('teacher_id');
+ if (isset($val)) {
+ return $query = $query->where('teacher_id', $val);
+ }else {
+ return $query;
+ }
+ }
+
+ public function scopeSessionId($query)
+ {
+ $val= request()->input('session_id');
+ if (isset($val)) {
+ return $query = $query->where('session_id', $val);
+ }else {
+ $sessionId = $this->getCurrentSessionId();
+ return $query = $query->where('session_id', $sessionId);
+ }
+ }
+
+
+}
diff --git a/backend/app/Exceptions/Handler.php b/backend/app/Exceptions/Handler.php
new file mode 100644
index 00000000..7e2563a8
--- /dev/null
+++ b/backend/app/Exceptions/Handler.php
@@ -0,0 +1,53 @@
+middleware('guest');
+ }
+}
diff --git a/backend/app/Http/Controllers/Auth/LoginController.php b/backend/app/Http/Controllers/Auth/LoginController.php
new file mode 100644
index 00000000..8c9acf20
--- /dev/null
+++ b/backend/app/Http/Controllers/Auth/LoginController.php
@@ -0,0 +1,115 @@
+middleware('guest')->except('logout');
+ $this->proxy = $proxy;
+ }
+
+ /**
+ * @api {post} /api/login 用户登陆
+ * @apiGroup login
+ *
+ * @apiParam {string} email 用户email
+ * @apiParam {string} password 用户密码
+ *
+ * @apiSuccessExample 登陆成功
+ * HTTP/1.1 200 OK
+ * {
+ * "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJS",
+ * "expires_in": 900 // 过期时间
+ * }
+ *
+ * @apiErrorExample 用户身份验证失败
+ * HTTP/1.1 421 用户名或者密码输入错误
+ * {
+ * "status": "login error",
+ * "status_code": 421,
+ * "message": "Credentials not match"
+ * }
+ */
+
+ public function login()
+ {
+ //$this->validateLogin(request());
+ return $this->proxy->login(request('email'),request('password'));
+ }
+
+ /**
+ * @api {post} /api/logout 注销用户登陆
+ * @apiGroup login
+ *
+ *
+ * @apiSuccessExample 注销成功
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200,
+ * "message": "logout success"
+ * }
+ *
+ */
+ public function logout()
+ {
+ return $this->proxy->logout();
+ }
+ /**
+ * @api {post} /api/token/refresh Token刷新
+ * @apiGroup login
+ *
+ *
+ * @apiSuccessExample 刷新成功
+ * HTTP/1.1 200 OK
+ * {
+ * "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJS",
+ * "expires_in": 900 // 过期时间
+ * }
+ *
+ * @apiErrorExample 刷新失败
+ * HTTP/1.1 401 未认证
+ * {
+ * "status": "login error",
+ * "status_code": 401,
+ * "message": "Credentials not match"
+ * }
+ */
+ public function refresh()
+ {
+ return $this->proxy->refresh();
+ }
+}
\ No newline at end of file
diff --git a/backend/app/Http/Controllers/Auth/RegisterController.php b/backend/app/Http/Controllers/Auth/RegisterController.php
new file mode 100644
index 00000000..f77265ab
--- /dev/null
+++ b/backend/app/Http/Controllers/Auth/RegisterController.php
@@ -0,0 +1,71 @@
+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']),
+ ]);
+ }
+}
diff --git a/backend/app/Http/Controllers/Auth/ResetPasswordController.php b/backend/app/Http/Controllers/Auth/ResetPasswordController.php
new file mode 100644
index 00000000..cf726eec
--- /dev/null
+++ b/backend/app/Http/Controllers/Auth/ResetPasswordController.php
@@ -0,0 +1,39 @@
+middleware('guest');
+ }
+}
diff --git a/backend/app/Http/Controllers/ClassTeacherController.php b/backend/app/Http/Controllers/ClassTeacherController.php
new file mode 100644
index 00000000..6f8df611
--- /dev/null
+++ b/backend/app/Http/Controllers/ClassTeacherController.php
@@ -0,0 +1,435 @@
+input('pageSize');
+ $pageSize = isset($pageSize) && $pageSize ?$pageSize:10;
+ $lists = ClassTeacher::SessionId()->TeacherId()->Grade()->paginate($pageSize);
+ return new ClassTeacherCollection($lists);
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function create()
+ {
+ //
+
+ }
+
+ /**
+ * @api {post} /api/classTeacher 创建新的班主任信息
+ * @apiGroup classTeacher
+ *
+ * @apiParam {number} session_id 学期ID
+ * @apiParam {number} teacher_id 教师ID
+ * @apiParam {number} class 班级
+ * @apiParam {number=1,2,3} grade 年级
+ * @apiParam {string} [remark] 备注 可选
+ * @apiParamExample {object} 请求事例 创建新的班主任信息:
+ * {
+ * session_id: 3,
+ * teacher_id: 168,
+ * class: 10,
+ * grade: 1,
+ * remark: '高一10班'
+ * }
+ *
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 数据验证出错:
+ * HTTP/1.1 422 Not Found
+ * {
+ * "status": 422,
+ * }
+ * @apiErrorExample {json} 指定的班级不存在:
+ * HTTP/1.1 416 Satisfiable
+ * {
+ * "status": 'error',
+ * "status_code": 416,
+ * "message": '数据校验出错,指定的班级不存在'
+ * }
+ * @apiErrorExample {json} 操作失败:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+ public function store(ClassTeacherRequest $request)
+ {
+ //
+ $data = $request->only(['teacher_id', 'grade', 'class_id', 'remark']);
+ $data['session_id'] = $this->getCurrentSessionId();
+ if (! $this->checkClass($data)) {
+ return $this->errorWithCodeAndInfo(422, '数据校验出错,指定的班级不存在');
+ };
+ if (ClassTeacher::create($data)) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ /**
+ * @api {get} /api/classTeacher/:id 获取指定的班主任信息
+ * @apiGroup classTeacher
+ *
+ * @apiParam {number} id 班主任标识ID
+ * @apiSuccessExample 获取班主任列表,分页显示,每页15条记录,
+ * HTTP/1.1 200 OK
+ * {
+ * "data": [
+ * {
+ * "id": 1,
+ * "session_id": 3,
+ * "teacher_id": 140,
+ * "grade": 1,
+ * "class": 1,
+ * "remark": null
+ * }
+ * ],
+ * "status": "success",
+ * "status_code": 200
+ * }
+ */
+ public function show(ClassTeacher $classTeacher)
+ {
+ //
+ return new \App\Http\Resources\ClassTeacher($classTeacher);
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ *
+ * @param \App\ClassTeacher $classTeacher
+ * @return \Illuminate\Http\Response
+ */
+ public function edit(ClassTeacher $classTeacher)
+ {
+ //
+ }
+
+ /**
+ * @api {patch} /api/classTeacher/:id 更新指定的班主任信息
+ * @apiGroup classTeacher
+ *
+ * @apiParam {number} id 班主任标识
+ * @apiParam {number} session_id 学期ID
+ * @apiParam {number} teacher_id 教师ID
+ * @apiParam {number} class 班级
+ * @apiParam {number=1,2,3} grade 年级
+ * @apiParam {string} [remark] 备注 可选
+ * @apiParamExample {object} 请求事例 创建新的班主任信息
+ * {
+ * id: 15,
+ * session_id: 3,
+ * teacher_id: 168,
+ * class: 10,
+ * grade: 1,
+ * remark: '高一10班'
+ * }
+ *
+ * @apiSuccessExample {json} 操作成功
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 数据验证出错
+ * HTTP/1.1 422 Not Found
+ * {
+ * "status": 422,
+ * }
+ * @apiErrorExample {json} 指定的班级不存在
+ * HTTP/1.1 416 Satisfiable
+ * {
+ * "status": 'error',
+ * "status_code": 416,
+ * "message": '数据校验出错,指定的班级不存在'
+ * }
+ * @apiErrorExample {json} 操作失败
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+
+ public function update(ClassTeacherRequest $request, ClassTeacher $classTeacher)
+ {
+ //
+ $data = $request->only(['teacher_id', 'grade', 'class_id', 'remark']);
+ $data['session_id'] = $this->getCurrentSessionId();
+ if (! $this->checkClass($data)) {
+ return $this->errorWithCodeAndInfo(416, '数据校验出错,指定的班级不存在');
+ };
+ $classTeacher->session_id = $data['session_id'];
+ $classTeacher->teacher_id = $data['teacher_id'];
+ $classTeacher->grade = $data['grade'];
+ $classTeacher->class_id = $data['class_id'];
+ $classTeacher->remark = $data['remark'];
+ if ($classTeacher->save()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ /**
+ * @api {delete} /api/classTeacher/:id 删除指定的班主任信息
+ * @apiGroup classTeacher
+ *
+ * @apiParam {number} id 班主任标识
+
+ * @apiSuccessExample {json} 操作成功
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 操作失败 指定的信息不存在
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+
+ public function destroy(ClassTeacher $classTeacher)
+ {
+ //
+ if ($classTeacher->delete()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ public function deleteAll(Request $request)
+ {
+ $data = $this->deleteByIds($request);
+ if ($data) {
+ if (ClassTeacher::destroy($data['ids'])) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+ }
+
+ /**
+ * @api {post} /api/classTeacher/upload 导入班主任信息
+ * @apiGroup classTeacher
+ *
+ * @apiParam {number} session_id 学期ID
+ * @apiParam {string} file 要导入的文件
+
+ * @apiHeaderExample {json} http头部例子
+ * {
+ * "content-type": "multipart/form-data"
+ * }
+ *
+ * @apiParamExample {object} 请求事例 导入指定学期的班主任数据
+ * {
+ * session_id: 3,
+ * file: 'd:/3.xls'
+ * }
+ *
+ * @apiSuccessExample {json} 操作成功
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 操作失败
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+
+ public function upload( ClassTeacherImport $import, ClassTeacherUploadRequest $request)
+ {
+ $bool = $import->handleImport($import);
+ if ($bool) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ /**
+ * 验证是否存在指定的班级 如果该学期的指定年级 没有指定的班级,则显示数据校验出错
+ * @param $data
+ * @return bool|\Illuminate\Http\JsonResponse
+ */
+
+ protected function checkClass($data)
+ {
+ list($session_id, $class, $grade) = [(int)$data['session_id'], (int)$data['class_id'], (int)$data['grade']];
+ $session = Session::where('id', $session_id)->first()->toArray();
+ $arrGrade = ['zero', 'one', 'two', 'three'];
+ $maxClass = $session[$arrGrade[$grade]];
+ if ($class > $maxClass || $class <=0) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ public function exportAll(Request $request) {
+ $sessionId =$request->input('session_id');
+ $sessionId = isset($sessionId)?$sessionId:$this->getCurrentSessionId();
+ $rec = ClassTeacher::where('session_id', $sessionId)->count(); // 获得总记录数,因为是所有的数据
+ $this->generator($rec, 1);
+ }
+
+ public function export(Request $request)
+ {
+ $pageSize = (int)$request->input('pageSize');
+ $pageSize = isset($pageSize) && $pageSize? $pageSize: 10;
+ $page = (int)$request->input('page');
+ $page = isset($page) && $page ? $page: 1;
+ $this->generator($pageSize, $page);
+ }
+
+ public function generator($pageSize, $page)
+ {
+
+ $sessionId = (int)request()->input('session_id');
+ $teacherId = (int)request()->input('teacher_id');
+ $grade = (int)request()->input('grade');
+
+ $sessionId = (isset($sessionId)&&$sessionId)?$sessionId: $this->getCurrentSessionId();
+ $teacherId = (isset($teacherId)&&$teacherId)?$teacherId: null;
+ $grade = (isset($grade)&&$grade)?$grade: [1,2,3];
+ if (is_numeric($grade)) {
+ $arr = [];
+ array_push($arr,$grade);
+ $grade = $arr;
+ }
+ $lists = $this->queryData($pageSize, $page,$sessionId, $grade,$teacherId);
+ $data = $lists->toArray(); // 分页内容
+ $items = $this->generatorData($data);
+ $this->generatorXls($items);
+ }
+
+ protected function queryData($pageSize = 10, $page = 1, $sessionId, $grade,$teacherId){
+ // 查询条件 根据姓名或者电话号码进行查询
+ $offset = $pageSize * ($page - 1) == 0? 0: $pageSize * ($page - 1);
+ $lists = DB::table('class_teachers')->join('yz_teacher', 'class_teachers.teacher_id','=', 'yz_teacher.id')
+ ->join('sessions', 'class_teachers.session_id', '=', 'sessions.id' )
+ ->select(['yz_teacher.name', 'sessions.year', 'sessions.team','class_teachers.grade', 'class_teachers.class_id', 'class_teachers.remark'])
+ ->where('session_id', $sessionId)
+ ->whereIn('grade', $grade)
+ ->when($teacherId,function ($query) use ($teacherId) {
+ return $query->where('teacher_id', $teacherId);
+ })
+ ->when($pageSize,function($query) use($offset, $pageSize) {
+ return $query->offset($offset)->limit($pageSize);
+ })
+ ->get();
+
+ return $lists;
+ }
+
+ /**
+ * 根据传入的数据生成内容
+ * @param $data
+ * @return array
+ */
+ protected function generatorData($data): array
+ {
+ $items = [];
+ // $data = $data['data']; // 数据库中的数据
+ foreach ($data as $item) {
+ $arr = [];
+ $arr['name'] = $item->name;
+ $nextYear = $item->year + 1;
+ $arr['year'] = $item->year.'--'.$nextYear.'学年';
+ $arr['team'] = $item->team ==1 ? '上学期':'下学期';
+ $arr['grade'] = $this->getGradeById($item->grade);
+ $arr['class_id'] = $item->class_id.'班';
+ $arr['remark'] = $item->remark;
+ array_push($items, $arr);
+ }
+ array_unshift($items, ['姓名', '学年', '学期', '年级', '班级', '班主任备注']);
+ return $items;
+ }
+
+ /**
+ * 生成xls文件 名称叫做班主任管理
+ */
+ protected function generatorXls($items): void
+ {
+ $file = time();
+ Excel::create('班主任管理', function ($excel) use ($items) {
+ $excel->sheet('score', function ($sheet) use ($items) {
+ $sheet->rows($items);
+ });
+ })->store('xls', public_path('xls'));
+ }
+}
diff --git a/backend/app/Http/Controllers/Controller.php b/backend/app/Http/Controllers/Controller.php
new file mode 100644
index 00000000..bbd0ab56
--- /dev/null
+++ b/backend/app/Http/Controllers/Controller.php
@@ -0,0 +1,14 @@
+备课组长 1=>学科组长 默认包含所有
+ * @apiSuccessExample 获取学科组长列表,分页显示,每页15条记录,
+ * HTTP/1.1 200 OK
+ * {
+ * "data": [
+ * {
+ * "id": 1,
+ * "session_id": 3,
+ * "teacher_id": 129,
+ * "teach_id": 17,
+ * "leader": 0,
+ * "grade": 1,
+ * "remark": "高一语文"
+ * }
+ * ],
+ * "status": "success",
+ * "status_code": 200,
+ * "links": {
+ * "first": "http://manger.test/api/department?page=1",
+ * "last": "http://manger.test/api/department?page=1",
+ * "prev": null,
+ * "next": null
+ * },
+ * "meta": {
+ * "current_page": 1,
+ * "from": 1,
+ * "last_page": 1,
+ * "path": "http://manger.test/api/department",
+ * "per_page": 15,
+ * "to": 9,
+ * "total": 9
+ * }
+ * }
+ */
+ public function index(Request $request)
+ {
+ //
+// $data = $request->only(['session_id', 'page', 'pageSize', 'teacher_id', 'leader']);
+// $pageSize = array_key_exists('pageSize', $data)?$data['pageSize']:15;
+// $teacher_id = array_key_exists('teacher_id', $data)?$data['teacher_id']:null;
+// $session_id = array_key_exists('session_id', $data)?$data['session_id']:$this->getCurrentSessionId();
+// $leader = array_key_exists('leader', $data)?$data['leader']:[1,0];
+// if ($teacher_id && $session_id) {
+// $lists = Department::where('teacher_id', $teacher_id)->where('session_id',$session_id)->whereIn('leader', $leader)->paginate($pageSize);
+// }
+// if (! $teacher_id && $session_id) {
+// $lists = Department::where('session_id',$session_id)->whereIn('leader', $leader)->paginate($pageSize);
+// }
+// if ($teacher_id && !$session_id) {
+// $lists = Department::where('teacher_id', $teacher_id)->whereIn('leader', $leader)->paginate($pageSize);
+// }
+
+ $pageSize = $request->input('pageSize');
+ $pageSize = isset($pageSize) && $pageSize ?$pageSize:10;
+ $lists = Department::SessionId()->TeacherId()->Grade()->Leader()->paginate($pageSize);
+ return new DepartmentCollection($lists);
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function create()
+ {
+ //
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+
+ /**
+ * @api {post} /api/department 创建新的学科组长信息
+ * @apiGroup department
+ *
+ * @apiParam {number} session_id 学期ID
+ * @apiParam {number} teacher_id 教师ID
+ * @apiParam {number=0,1} leader 学科组长类型(0=>备课组长 1=>学科组长)
+ * @apiParam {number=1,2,3} grade 年级
+ * @apiParam {number} teach_id 科目 结合科目表
+ * @apiParam {string} [remark] 备注 可选
+ * @apiParamExample {object} 请求事例 建立学期 2017-2018上学期:
+ * {
+ * session_id: 3,
+ * teacher_id: 168,
+ * leader: 0,
+ * grade: 1,
+ * teach_id: 7
+ * remark: '高一信息技术'
+ * }
+ *
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 数据验证出错:
+ * HTTP/1.1 422 Not Found
+ * {
+ * "status": 422,
+ * }
+ * @apiErrorExample {json} 操作失败:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+
+ public function store(DepartmentRequest $request)
+ {
+ //
+ $data = $request->only(['teacher_id', 'teach_id', 'leader', 'grade', 'remark']);
+ $data['session_id'] = $this->getCurrentSessionId();
+ if (Department::create($data)) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ /**
+ * Display the specified resource.
+ *
+ * @param \App\Department $department
+ * @return \Illuminate\Http\Response
+ */
+
+ /**
+ * @api {get} /api/department/:id 获取指定的学科组长信息
+ * @apiGroup department
+ *
+ * @apiParam {number} id 学科组长标识ID
+ * @apiSuccessExample 获取指定的学科组长信息
+ * HTTP/1.1 200 OK
+ * {
+ * "data": [
+ * {
+ * "id": 1,
+ * "session_id": 3,
+ * "teacher_id": 129,
+ * "teach_id": 17,
+ * "leader": 0,
+ * "grade": 1,
+ * "remark": "高一语文"
+ * }
+ * ],
+ * "status": "success",
+ * "status_code": 200
+ * }
+ */
+
+ public function show(Department $department)
+ {
+ //
+ return new \App\Http\Resources\Department($department);
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ *
+ * @param \App\Department $department
+ * @return \Illuminate\Http\Response
+ */
+ public function edit(Department $department)
+ {
+ //
+
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \App\Department $department
+ * @return \Illuminate\Http\Response
+ */
+ /**
+ * @api {patch} /api/department/:id 更新指定的学科组长信息
+ * @apiGroup department
+ *
+ * @apiParam {number} id 学科组长标识ID
+ * @apiParam {number} session_id 学期ID
+ * @apiParam {number} teacher_id 教师ID
+ * @apiParam {number=0,1} leader 学科组长类型(0=>备课组长 1=>学科组长)
+ * @apiParam {number=1,2,3} grade 年级
+ * @apiParam {number} teach_id 科目 结合科目表
+ * @apiParam {string} [remark] 备注 可选
+ * @apiParamExample {object} 请求事例 建立学期 2017-2018上学期:
+ * {
+ * id:10,
+ * session_id: 3,
+ * teacher_id: 168,
+ * leader: 0,
+ * grade: 1,
+ * teach_id: 7
+ * remark: '信息技术'
+ * }
+ *
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 数据验证出错:
+ * HTTP/1.1 422 Not Found
+ * {
+ * "status": 422,
+ * }
+ * @apiErrorExample {json} 操作失败:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+ public function update(DepartmentRequest $request, Department $department)
+ {
+ //
+ $data = $request->only(['teacher_id', 'teach_id', 'leader', 'grade', 'remark']);
+ $department->session_id = $this->getCurrentSessionId();
+ $department->teacher_id = $data['teacher_id'];
+ $department->teach_id = $data['teach_id'];
+ $department->leader = $data['leader'];
+ $department->grade = $data['grade'];
+ $department->remark = $data['remark'];
+ if ($department -> save() ) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ *
+ * @param \App\Department $department
+ * @return \Illuminate\Http\Response
+ */
+ /**
+ * @api {delete} /api/department/:id 删除指定的学科组长信息
+ * @apiGroup department
+ *
+ * @apiParam {number} id 学科组长标识ID
+ *
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+
+ * @apiErrorExample {json} 操作失败,指定的内容已经删除:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+
+ public function destroy(Department $department)
+ {
+ //
+ if ($department->delete()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ public function deleteAll(Request $request)
+ {
+ $data = $this->deleteByIds($request);
+ if ($data) {
+ if (Department::destroy($data['ids'])) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+ }
+
+ /**
+ * @api {post} /api/department/upload 导入学科组长信息
+ * @apiGroup department
+ *
+ * @apiParam {number} session_id 学期ID
+ * @apiParam {string} file 要导入的文件
+
+ * @apiHeaderExample {json} http头部例子
+ * {
+ * "content-type": "multipart/form-data"
+ * }
+ *
+ * @apiParamExample {object} 请求事例 导入指定学期的学科组长数据:
+ * {
+ * session_id: 3,
+ * file: 'd:/3.xls'
+ * }
+ *
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 操作失败:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+
+ public function upload(DepartmentImport $import, DepartmentsUploadRequest $request)
+ {
+ $bool = $import->handleImport($import);
+ if ($bool) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ public function exportAll(Request $request) {
+ $sessionId =$request->input('session_id');
+ $sessionId = isset($sessionId)?$sessionId:$this->getCurrentSessionId();
+ $rec = Department::where('session_id', $sessionId)->count(); // 获得总记录数,因为是所有的数据
+ $this->generator($rec, 1);
+ }
+
+ public function export(Request $request)
+ {
+ $pageSize = (int)$request->input('pageSize');
+ $pageSize = isset($pageSize) && $pageSize? $pageSize: 10;
+ $page = (int)$request->input('page');
+ $page = isset($page) && $page ? $page: 1;
+ $this->generator($pageSize, $page);
+ }
+
+ public function generator($pageSize, $page)
+ {
+
+ $sessionId = (int)request()->input('session_id');
+ $teacherId = (int)request()->input('teacher_id');
+ $grade = (int)request()->input('grade');
+
+
+ $sessionId = (isset($sessionId)&&$sessionId)?$sessionId: $this->getCurrentSessionId();
+ $teacherId = (isset($teacherId)&&$teacherId)?$teacherId: null;
+ $grade = (isset($grade)&&$grade)?$grade: [1,2,3];
+ $tmp = [];
+ $leader = request()->input('leader');
+ if ($leader === null) {
+ $tmp = [0,1];
+ } else {
+ switch ($leader){
+ case 0:
+ array_push($tmp,$leader);
+ break;
+ case 1:
+ array_push($tmp,$leader);
+ break;
+ }
+ }
+ $leader = $tmp;
+ if (is_numeric($grade)) {
+ $arr = [];
+ array_push($arr,$grade);
+ $grade = $arr;
+ }
+ var_dump($leader);
+ $lists = $this->queryData($pageSize, $page,$sessionId, $grade,$teacherId,$leader);
+ $data = $lists->toArray(); // 分页内容
+ $items = $this->generatorData($data);
+ $this->generatorXls($items);
+ }
+
+ protected function queryData($pageSize = 10, $page = 1, $sessionId, $grade,$teacherId, $leader){
+ // 查询条件 根据姓名或者电话号码进行查询
+ $offset = $pageSize * ($page - 1) == 0? 0: $pageSize * ($page - 1);
+ $lists = DB::table('departments')->join('yz_teacher', 'departments.teacher_id','=', 'yz_teacher.id')
+ ->join('sessions', 'departments.session_id', '=', 'sessions.id' )
+ ->join('yz_teaching', 'departments.teach_id', '=', 'yz_teaching.id' )
+ ->select(['yz_teacher.name', 'sessions.year', 'sessions.team','departments.grade', 'yz_teaching.teaching_name as teach', 'departments.leader', 'departments.remark'])
+ ->where('session_id', $sessionId)
+ ->whereIn('grade', $grade)
+ ->whereIn('leader', $leader)
+ ->when($teacherId,function ($query) use ($teacherId) {
+ return $query->where('teacher_id', $teacherId);
+ })
+ ->when($pageSize,function($query) use($offset, $pageSize) {
+ return $query->offset($offset)->limit($pageSize);
+ })
+ ->get();
+ return $lists;
+ }
+
+ /**
+ * 根据传入的数据生成内容
+ * @param $data
+ * @return array
+ */
+ protected function generatorData($data): array
+ {
+ $items = [];
+ // $data = $data['data']; // 数据库中的数据
+ foreach ($data as $item) {
+ $arr = [];
+ $arr['name'] = $item->name;
+ $nextYear = $item->year + 1;
+ $arr['year'] = $item->year.'--'.$nextYear.'学年';
+ $arr['team'] = $item->team ==1 ? '上学期':'下学期';
+ $arr['grade'] = $this->getGradeById($item->grade);
+ $arr['teach'] = $item->teach;
+ $arr['leader'] = $item->leader === 1?'教研组长':'备课组长';
+ $arr['remark'] = $item->remark;
+ array_push($items, $arr);
+ }
+ array_unshift($items, ['姓名', '学年', '学期', '年级', '科目', '组长类型', '备注']);
+ return $items;
+ }
+
+ /**
+ * 生成xls文件 名称叫做教研组长管理
+ */
+ protected function generatorXls($items): void
+ {
+ $file = time();
+ Excel::create('教研组长管理', function ($excel) use ($items) {
+ $excel->sheet('score', function ($sheet) use ($items) {
+ $sheet->rows($items);
+ });
+ })->store('xls', public_path('xls'));
+ }
+
+}
diff --git a/backend/app/Http/Controllers/DiskController.php b/backend/app/Http/Controllers/DiskController.php
new file mode 100644
index 00000000..9f37efdc
--- /dev/null
+++ b/backend/app/Http/Controllers/DiskController.php
@@ -0,0 +1,53 @@
+exists($file);
+ if ($bools) {
+ echo $file . '在指定的目录下存在该文件';
+ Storage::prepend($file, '追加内容到之前');
+
+ } else {
+ echo $file . '在指定的目录下不存在
将新建文件';
+ Storage::put($file, '文件内容');
+
+ }
+ }
+
+ public function copy()
+ {
+ $file ='abc.txt';
+ $bools = Storage::disk('local')->exists($file);
+ if ($bools) {
+ Storage::copy($file, 'new/'.$file);
+ echo '文件拷贝成功';
+ } else {
+ echo $file . '在指定的目录下不存在';
+ }
+ }
+
+ public function move()
+ {
+ $file ='abc.txt';
+ $bools = Storage::disk('local')->exists($file);
+ if ($bools) {
+ if (Storage::exists('new/'.$file)){
+ echo '文件已经存在,将删除后在覆盖';
+ Storage::delete('new/'.$file);
+ }
+ Storage::move($file, 'new/'.$file);
+ echo '文件成功';
+ } else {
+ echo $file . '在指定的目录下不存在';
+ }
+ }
+}
diff --git a/backend/app/Http/Controllers/FileController.php b/backend/app/Http/Controllers/FileController.php
new file mode 100644
index 00000000..525e3cfa
--- /dev/null
+++ b/backend/app/Http/Controllers/FileController.php
@@ -0,0 +1,64 @@
+file('file1')->store('images');
+ $fullFileName = storage_path('app').'\\'.$file;
+ echo $fullFileName;
+ if (Storage::exists($file)) {
+ echo '文件存在';
+ echo '
文件拷贝';
+ if (Storage::copy($file,'images/test.jpg')) {
+ echo '
拷贝成功';
+ }
+ } else {
+ echo '文件不存在';
+ }
+ }
+
+ public function storeXls(Request $request)
+ {
+ $file = $request->file('file1');
+ $type=['application/vnd.ms-excel'];
+ $fileType = $file->getClientMimeType();
+ if (in_array($fileType, $type)) {
+ echo '格式正确,保存文件
';
+ $clientExt = $file->getClientOriginalExtension();
+ $fileName = date('ymdhis').'.'.$clientExt;
+ return $file->storeAs('xls',$fileName);
+ } else {
+ return '上传的文件格式不正确,无法保存';
+ }
+
+ }
+
+ public function files()
+ {
+ $files = Storage::disk('test')->files('abc');
+ var_dump($files);
+ echo '
';
+ foreach ($files as $file) {
+ $fileName = preg_replace('/abc\//','',$file);
+ echo $fileName.'
';
+ }
+ }
+}
diff --git a/backend/app/Http/Controllers/Import/ClassTeacherImport.php b/backend/app/Http/Controllers/Import/ClassTeacherImport.php
new file mode 100644
index 00000000..79de8e48
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/ClassTeacherImport.php
@@ -0,0 +1,23 @@
+fileUpdate();
+ }
+
+ public function getFilters()
+ {
+ return [
+ 'chunk'
+ ];
+ }
+
+}
diff --git a/backend/app/Http/Controllers/Import/ClassTeacherImportHandler.php b/backend/app/Http/Controllers/Import/ClassTeacherImportHandler.php
new file mode 100644
index 00000000..1e9f1fc9
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/ClassTeacherImportHandler.php
@@ -0,0 +1,94 @@
+first()->toArray();
+ $lists = [];
+ $session_id = $this->getCurrentSessionId();
+ foreach($data as $val) {
+ // 获取每条记录 为验证做准备
+ $item = [
+ 'name' => $val['name'],
+ 'grade' => (int)$val['grade'],
+ 'class_id' => (int)$val['class_id'],
+ 'remark' => $val['remark'],
+ 'phone' => $val['phone'],
+ 'session_id' => $session_id,
+ 'created_at' => Carbon::now(),
+ 'updated_at' => Carbon::now()
+ ];
+ // 根据规则进行验证,保证输入的内容符合要求 电话号码如果填写要验证 类型只能为1和2
+ $rules = [
+ 'name' => 'required|exists:yz_teacher,name',
+ 'phone' => ['nullable', new Telphone],
+ 'grade' => 'required|in:1,2,3',
+ 'class_id' => 'required|integer'
+ ];
+ $validator = Validator::make($item, $rules);
+
+ if (!$validator->fails()) { // 成功
+ // 验证成功后要 进行姓名处理 根据姓名 从Teacher中取出id
+ if (!isset($item['phone'])) {
+ // 名字处理 ,看看是否有同名同姓的 ,没有手机号码而且又姓名相同,则无法处理 未知是那个用户
+ $count = Teacher::where('name', $item['name'])->count();
+ if ($count>1) {
+ continue;
+ }
+ // 姓名唯一,取出该教师的ID号,用于在领导表中保存
+ $teacher_id = Teacher::where('name', $item['name'])->value('id');
+ if ($teacher_id) {
+ $item['teacher_id'] = $teacher_id;
+ unset($item['name']);
+ unset($item['phone']);
+ array_push($lists, $item);
+ } else { // 没有找到指定姓名的教师,则跳过处理该记录
+ continue;
+ }
+ } else {
+ // 有手机号,则用手机号和用户姓名同时来取教师ID
+ $teacher_id = Teacher::where('name', $item['name'])->where('phone', $item['phone'])->value('id');
+ if ($teacher_id) {
+ $item['teacher_id'] = $teacher_id;
+ unset($item['name']);
+ unset($item['phone']);
+ array_push($lists, $item);
+ } else { // 教师表里面没有该教师信息,则处理下一条记录
+ continue;
+ }
+ }
+ } else {
+ $errors = $validator->errors($validator);
+ return $this->errorWithCodeAndInfo(422,$errors);
+ }
+ }
+ // 删除原来存在的该学期的数据
+ if (App\ClassTeacher::where('session_id',$session_id)->count()){
+ App\ClassTeacher::where('session_id',$session_id)->delete();
+ }
+ // 插入数据到领导表
+// array_walk($lists, function($v){
+// App\App\ClassTeacher::Create($v);
+// });
+ return App\ClassTeacher::insert($lists);
+ }
+
+}
\ No newline at end of file
diff --git a/backend/app/Http/Controllers/Import/DepartmentImport.php b/backend/app/Http/Controllers/Import/DepartmentImport.php
new file mode 100644
index 00000000..73c4b8d5
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/DepartmentImport.php
@@ -0,0 +1,23 @@
+fileUpdate();
+ }
+
+ public function getFilters()
+ {
+ return [
+ 'chunk'
+ ];
+ }
+
+}
diff --git a/backend/app/Http/Controllers/Import/DepartmentImportHandler.php b/backend/app/Http/Controllers/Import/DepartmentImportHandler.php
new file mode 100644
index 00000000..dd0232da
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/DepartmentImportHandler.php
@@ -0,0 +1,93 @@
+first()->toArray();
+ $lists = [];
+ $session_id = $this->getCurrentSessionId();
+ foreach($data as $val) {
+ // 获取每条记录 为验证做准备
+ $item = [
+ 'name' => $val['name'],
+ 'grade' => (int)$val['grade'],
+ 'teach_id' => (int)$val['teach_id'],
+ 'leader' => (int)$val['leader'],
+ 'remark' => $val['remark'],
+ 'phone' => $val['phone'],
+ 'session_id' => $session_id,
+ 'created_at' => Carbon::now(),
+ 'updated_at' => Carbon::now()
+ ];
+ // 根据规则进行验证,保证输入的内容符合要求 电话号码如果填写要验证 类型只能为1和2
+ $rules = [
+ 'name' => 'required|exists:yz_teacher,name',
+ 'phone' => ['nullable', new Telphone],
+ 'grade' => 'required|in:1,2,3',
+ 'leader' => 'required|int:0,1',
+ 'teach_id' => 'required|exists:yz_teaching,id',
+
+ ];
+ $validator = Validator::make($item, $rules);
+
+ if (!$validator->fails()) { // 成功
+ // 验证成功后要 进行姓名处理 根据姓名 从Teacher中取出id
+ if (!isset($item['phone'])) {
+ // 名字处理 ,看看是否有同名同姓的 ,没有手机号码而且又姓名相同,则无法处理 未知是那个用户
+ $count = Teacher::where('name', $item['name'])->count();
+ if ($count>1) {
+ continue;
+ }
+ // 姓名唯一,取出该教师的ID号,用于在领导表中保存
+ $teacher_id = Teacher::where('name', $item['name'])->value('id');
+ if ($teacher_id) {
+ $item['teacher_id'] = $teacher_id;
+ unset($item['name']);
+ unset($item['phone']);
+ array_push($lists, $item);
+ } else { // 没有找到指定姓名的教师,则跳过处理该记录
+ continue;
+ }
+ } else {
+ // 有手机号,则用手机号和用户姓名同时来取教师ID
+ $teacher_id = Teacher::where('name', $item['name'])->where('phone', $item['phone'])->value('id');
+ if ($teacher_id) {
+ $item['teacher_id'] = $teacher_id;
+ unset($item['name']);
+ unset($item['phone']);
+ array_push($lists, $item);
+ } else { // 教师表里面没有该教师信息,则处理下一条记录
+ continue;
+ }
+ }
+ }
+ }
+ // 删除原来存在的该学期的数据
+ if (App\Department::where('session_id',$session_id)->count()){
+ App\Department::where('session_id',$session_id)->delete();
+ }
+ // 插入数据到领导表
+// array_walk($lists, function($v){
+// App\App\Department::Create($v);
+// });
+ return App\Department::insert($lists);
+ }
+
+}
\ No newline at end of file
diff --git a/backend/app/Http/Controllers/Import/LeaderImport.php b/backend/app/Http/Controllers/Import/LeaderImport.php
new file mode 100644
index 00000000..7978b4d7
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/LeaderImport.php
@@ -0,0 +1,23 @@
+fileUpdate();
+ }
+
+ public function getFilters()
+ {
+ return [
+ 'chunk'
+ ];
+ }
+
+}
diff --git a/backend/app/Http/Controllers/Import/LeaderImportHandler.php b/backend/app/Http/Controllers/Import/LeaderImportHandler.php
new file mode 100644
index 00000000..e76cbe29
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/LeaderImportHandler.php
@@ -0,0 +1,90 @@
+first()->toArray();
+ $lists = [];
+ $session_id = $this->getCurrentSessionId();
+ foreach($data as $val) {
+ // 获取每条记录 为验证做准备
+ $item = [
+ 'name' => $val['name'],
+ 'leader_type' => (int)$val['leader_type'],
+ 'job' => $val['job'],
+ 'remark' => $val['remark'],
+ 'phone' => $val['phone'],
+ 'session_id' => $session_id,
+ 'created_at' => Carbon::now(),
+ 'updated_at' => Carbon::now()
+ ];
+ // 根据规则进行验证,保证输入的内容符合要求 电话号码如果填写要验证 类型只能为1和2
+ $rules = [
+ 'name' => 'required|exists:yz_teacher,name',
+ 'phone' => ['nullable', new Telphone],
+ 'leader_type' => 'required|in:1,2',
+ 'job' => 'required'
+ ];
+ $validator = Validator::make($item, $rules);
+
+ if (!$validator->fails()) { // 成功
+ // 验证成功后要 进行姓名处理 根据姓名 从Teacher中取出id
+ if (!isset($item['phone'])) {
+ // 名字处理 ,看看是否有同名同姓的 ,没有手机号码而且又姓名相同,则无法处理 未知是那个用户
+ $count = Teacher::where('name', $item['name'])->count();
+ if ($count>1) {
+ continue;
+ }
+ // 姓名唯一,取出该教师的ID号,用于在领导表中保存
+ $teacher_id = Teacher::where('name', $item['name'])->value('id');
+ if ($teacher_id) {
+ $item['teacher_id'] = $teacher_id;
+ unset($item['name']);
+ unset($item['phone']);
+ array_push($lists, $item);
+ } else { // 没有找到指定姓名的教师,则跳过处理该记录
+ continue;
+ }
+ } else {
+ // 有手机号,则用手机号和用户姓名同时来取教师ID
+ $teacher_id = Teacher::where('name', $item['name'])->where('phone', $item['phone'])->value('id');
+ if ($teacher_id) {
+ $item['teacher_id'] = $teacher_id;
+ unset($item['name']);
+ unset($item['phone']);
+ array_push($lists, $item);
+ } else { // 教师表里面没有该教师信息,则处理下一条记录
+ continue;
+ }
+ }
+ }
+ }
+ // 删除原来存在的该学期的数据
+ if (App\Leader::where('session_id',$session_id)->count()){
+ App\Leader::where('session_id',$session_id)->delete();
+ }
+ // 插入数据到领导表
+// array_walk($lists, function($v){
+// App\Leader::Create($v);
+// });
+ return App\Leader::insert($lists);
+ }
+
+}
\ No newline at end of file
diff --git a/backend/app/Http/Controllers/Import/SessionImport.php b/backend/app/Http/Controllers/Import/SessionImport.php
new file mode 100644
index 00000000..95f1dd37
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/SessionImport.php
@@ -0,0 +1,26 @@
+fileUpdate();
+ }
+
+ public function getFilters()
+ {
+ return [
+ 'chunk'
+ ];
+ }
+
+}
diff --git a/backend/app/Http/Controllers/Import/SessionImportHandler.php b/backend/app/Http/Controllers/Import/SessionImportHandler.php
new file mode 100644
index 00000000..b0f56f4d
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/SessionImportHandler.php
@@ -0,0 +1,40 @@
+first()->toArray();
+ $lists = [];
+ foreach ($result as $v){
+ $data = [
+ 'year' => (int)$v['year'],
+ 'team' =>(int)$v['team'],
+ 'remark' =>$v['remark'],
+ 'created_at' => Carbon::now(),
+ 'updated_at' => Carbon::now()
+
+ ];
+ if (Session::where('year', $data['year'])->where('team', $data['team'])->first()){ // 存在重复记录
+ continue;
+ } else { // 记录先暂时保存到数组,稍后一次新建
+ array_push($lists,$data);
+ }
+ }
+ return Session::insert($lists);
+ }
+
+}
\ No newline at end of file
diff --git a/backend/app/Http/Controllers/Import/TeachingImport.php b/backend/app/Http/Controllers/Import/TeachingImport.php
new file mode 100644
index 00000000..b87e3fcc
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/TeachingImport.php
@@ -0,0 +1,28 @@
+fileUpdate();
+ }
+
+ public function getFilters()
+ {
+ return [
+ 'chunk'
+ ];
+ }
+}
\ No newline at end of file
diff --git a/backend/app/Http/Controllers/Import/TeachingImportHandler.php b/backend/app/Http/Controllers/Import/TeachingImportHandler.php
new file mode 100644
index 00000000..a4b6a879
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/TeachingImportHandler.php
@@ -0,0 +1,38 @@
+first()->toArray();
+ $lists = [];
+ foreach ($result as $v){
+ $data = [
+ 'name' => $v['name'],
+ 'email' =>$v['email'],
+ 'role' =>'user',
+ 'created_at' => Carbon::now(),
+ 'updated_at' => Carbon::now(),
+ ];
+ if (User::where('email', $data['email'])->first()){ // 存在重复记录
+ continue;
+ } else { // 记录先暂时保存到数组,稍后一次新建
+ array_push($lists,$data);
+ }
+ }
+ return Teaching::insert($lists);
+ }
+}
\ No newline at end of file
diff --git a/backend/app/Http/Controllers/Import/UserImport.php b/backend/app/Http/Controllers/Import/UserImport.php
new file mode 100644
index 00000000..9ac871c4
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/UserImport.php
@@ -0,0 +1,22 @@
+fileUpdate();
+ }
+
+ public function getFilters()
+ {
+ return [
+ 'chunk'
+ ];
+ }
+}
diff --git a/backend/app/Http/Controllers/Import/UserImportHandler.php b/backend/app/Http/Controllers/Import/UserImportHandler.php
new file mode 100644
index 00000000..17c9f6ee
--- /dev/null
+++ b/backend/app/Http/Controllers/Import/UserImportHandler.php
@@ -0,0 +1,40 @@
+first()->toArray();
+ $lists = [];
+ foreach ($result as $v){
+ $data = [
+ 'name' => $v['name'],
+ 'email' =>$v['email'],
+ 'role' =>'user',
+ 'created_at' => Carbon::now(),
+ 'updated_at' => Carbon::now(),
+ 'password' => bcrypt('123456')
+ ];
+ if (User::where('email', $data['email'])->first()){ // 存在重复记录
+ continue;
+ } else { // 记录先暂时保存到数组,稍后一次新建
+ array_push($lists,$data);
+ }
+ }
+ return User::insert($lists);
+ }
+
+}
\ No newline at end of file
diff --git a/backend/app/Http/Controllers/LeaderController.php b/backend/app/Http/Controllers/LeaderController.php
new file mode 100644
index 00000000..681a4f92
--- /dev/null
+++ b/backend/app/Http/Controllers/LeaderController.php
@@ -0,0 +1,410 @@
+input('pageSize');
+ $pageSize = isset($pageSize) && $pageSize ?$pageSize:10;
+ $lists = Leader::LeaderType()->SessionId()->TeacherId()->paginate($pageSize);
+ return new LeaderCollection($lists);
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function create()
+ {
+ //
+
+ }
+
+
+ /**
+ * @api {post}/api/leader 新增学校行政信息
+ * @apiGroup leader
+ *
+ * @apiParam {number} session_id 学期ID
+ * @apiParam {number} teacher_id 教师ID
+ * @apiParam {number=1,2} leader_type 行政类型(1=>中层 2=>学校)
+ * @apiParam {string} [job] 职务描述 可选
+ * @apiParam {string} [remark] 备注 可选
+ * @apiParamExample {object} 请求事例 建立学期 2017-2018上学期:
+ * {
+ * session_id: 3,
+ * teacher_id: 168,
+ * leader_type: 1,
+ * job: '教务副主任',
+ * remark: ''
+ * }
+ *
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 数据验证出错:
+ * HTTP/1.1 422 Not Found
+ * {
+ * "status": 422,
+ * }
+ * @apiErrorExample {json} 操作失败:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+ public function store(LeaderRequest $request)
+ {
+ //
+ $data = $request->only(['teacher_id', 'leader_type', 'job', 'remark']);
+ $data['session_id'] = $this->getCurrentSessionId();
+ if (Leader::create($data)) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ /**
+ * @api {get} /api/leader/:id 获取指定的学校行政信息
+ * @apiGroup leader
+ *
+ * @apiParam {number} id 指定的ID
+ *
+ * @apiSuccessExample 获取指定的学校行政信息
+ * HTTP/1.1 200 OK
+ * {
+ * "data": [
+ * {
+ * "id": 13,
+ * "session_id": 3,
+ * "teacher_id": 45,
+ * "leader_type": 2,
+ * "job": "校长",
+ * "remark": null
+ * }
+ * ],
+ * "status": "success",
+ * "status_code": 200,
+ * }
+ *
+ */
+ public function show(Leader $leader)
+ {
+ //
+ return new \App\Http\Resources\Leader($leader);
+ }
+
+
+ public function edit(Leader $leader)
+ {
+ //
+ }
+
+
+ /**
+ * @api {post}/api/leader/id 更新指定的学校行政信息
+ * @apiGroup leader
+ *
+ * @apiParam {number} id 指定的ID
+ * @apiParam {number} session_id 学期ID
+ * @apiParam {number} teacher_id 教师ID
+ * @apiParam {number=1,2} leader_type 行政类型(1=>中层 2=>学校)
+ * @apiParam {string} [job] 职务描述 可选
+ * @apiParam {string} [remark] 备注 可选
+ *
+ * @apiParamExample {object} 请求事例 建立学期 2017-2018上学期:
+ * {
+ * session_id: 3,
+ * teacher_id: 168,
+ * leader_type: 1,
+ * job: '教务副主任',
+ * remark: '主管学校教学考试与教育信息化'
+ * }
+ *
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 数据验证出错:
+ * HTTP/1.1 422 Not Found
+ * {
+ * "status": 422,
+ * }
+ * @apiErrorExample {json} 操作失败:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+ public function update(LeaderRequest $request, Leader $leader)
+ {
+ //
+ $data = $request->only( ['teacher_id', 'leader_type', 'job', 'remark']);
+ $leader->teacher_id = $data['teacher_id'];
+ $leader->leader_type = $data['leader_type'];
+ $leader->job = $data['job'];
+ $leader->remark = $data['remark'];
+ if ($leader->save()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+
+ }
+
+ /**
+ * @api {delete} /api/leader/:id 删除指定的学校行政信息
+ * @apiGroup leader
+ * @apiParam {number} id 标识
+ * @apiSuccessExample {json} 删除成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 删除失败
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ * @apiErrorExample {json} 指定的ID不存在,无法处理
+ * HTTP/1.1 500 Internal Server Error
+ * {
+ * "status": "error",
+ * "status_code": 500
+ * }
+ */
+ public function destroy(Leader $leader)
+ {
+ //
+ if ($leader->delete()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ /**
+ * @api {post} /api/leader/upload 导入行政领导信息
+ * @apiGroup leader
+ *
+ * @apiParam {number} session_id 学期ID
+ * @apiParam {string} file 要导入的文件
+
+ * @apiHeaderExample {json} http头部例子
+ * {
+ * "content-type": "multipart/form-data"
+ * }
+ *
+ * @apiParamExample {object} 请求事例 导入指定学期的行政领导数据:
+ * {
+ * session_id: 3,
+ * file: 'd:/3.xls'
+ * }
+ *
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 操作失败:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+ public function upload( LeaderImport $import,LeaderUploadRequest $request)
+ {
+ $bool = $import->handleImport($import);
+ if ($bool) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+
+ public function exportAll(Request $request) {
+ $sessionId =$request->input('session_id');
+ $sessionId = isset($sessionId)?$sessionId:$this->getCurrentSessionId();
+ $rec = Leader::where('session_id', $sessionId)->count(); // 获得总记录数,因为是所有的数据
+ $this->generator($rec, 1);
+ }
+
+ public function export(Request $request)
+ {
+ $pageSize = (int)$request->input('pageSize');
+ $pageSize = isset($pageSize) && $pageSize? $pageSize: 10;
+ $page = (int)$request->input('page');
+ $page = isset($page) && $page ? $page: 1;
+ $this->generator($pageSize, $page);
+ }
+
+ public function generator($pageSize, $page)
+
+ {
+
+ $sessionId = (int)request()->input('session_id');
+ $teacherId = (int)request()->input('teacher_id');
+ $leaderType = (int)request()->input('leader_type');
+
+ $sessionId = (isset($sessionId)&&$sessionId)?$sessionId: $this->getCurrentSessionId();
+ $teacherId = (isset($teacherId)&&$teacherId)?$teacherId: null;
+ $leaderType = (isset($leaderType)&&$leaderType)?$leaderType: [1,2];
+ if (is_numeric($leaderType)) {
+ $arr = [];
+ array_push($arr,$leaderType);
+ $leaderType = $arr;
+ }
+ $lists = $this->queryData($pageSize, $page,$sessionId, $leaderType,$teacherId);
+ $data = $lists->toArray(); // 分页内容
+ $items = $this->generatorData($data);
+ $this->generatorXls($items);
+ }
+
+ protected function queryData($pageSize = 10, $page = 1, $sessionId, $leaderType,$teacherId){
+ // 查询条件 根据姓名或者电话号码进行查询
+ $offset = $pageSize * ($page - 1) == 0? 0: $pageSize * ($page - 1);
+ $lists = DB::table('leaders')->join('yz_teacher', 'leaders.teacher_id','=', 'yz_teacher.id')
+ ->join('sessions', 'leaders.session_id', '=', 'sessions.id' )
+ ->select(['yz_teacher.name', 'sessions.year', 'sessions.team','leaders.leader_type', 'leaders.job', 'leaders.remark'])
+ ->where('session_id', $sessionId)
+ ->whereIn('leader_type', $leaderType)
+ ->when($teacherId,function ($query) use ($teacherId) {
+ return $query->where('teacher_id', $teacherId);
+ })
+ ->when($pageSize,function($query) use($offset, $pageSize) {
+ return $query->offset($offset)->limit($pageSize);
+ })
+ ->get();
+
+ return $lists;
+ }
+
+ /**
+ * 根据传入的数据生成内容
+ * @param $data
+ * @return array
+ */
+ protected function generatorData($data): array
+ {
+ $items = [];
+ // $data = $data['data']; // 数据库中的数据
+ foreach ($data as $item) {
+ $arr = [];
+ $arr['name'] = $item->name;
+ $nextYear = $item->year + 1;
+ $arr['year'] = $item->year.'--'.$nextYear.'学年';
+ $arr['team'] = $item->team ==1 ? '上学期':'下学期';
+ $arr['leader_type'] = $item->leader_type == 1? '中层':'学校';
+ $arr['job'] = $item->job;
+ $arr['remark'] = $item->remark;
+ array_push($items, $arr);
+ }
+ array_unshift($items, ['姓名', '学年', '学期', '行政类型', '任职岗位', '岗位备注']);
+ return $items;
+ }
+
+ /**
+ * 生成xls文件 名称叫做员工信息
+ */
+ protected function generatorXls($items): void
+ {
+ $file = time();
+ Excel::create('行政管理', function ($excel) use ($items) {
+ $excel->sheet('score', function ($sheet) use ($items) {
+ $sheet->rows($items);
+ });
+ })->store('xls', public_path('xls'));
+ }
+
+ public function test()
+ {
+
+ }
+
+ public function deleteAll(Request $request)
+ {
+ $data = $this->deleteByIds($request);
+ if ($data) {
+ if (Leader::destroy($data['ids'])) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+ }
+
+}
diff --git a/backend/app/Http/Controllers/MenuController.php b/backend/app/Http/Controllers/MenuController.php
new file mode 100644
index 00000000..e413fd2c
--- /dev/null
+++ b/backend/app/Http/Controllers/MenuController.php
@@ -0,0 +1,65 @@
+menu = $app->menu;
+ }
+
+ public function menu()
+ {
+ $buttons = [
+ [
+ "type" => "click",
+ "name" => "点我试试",
+ "key" => "YOU_CLICK_ME"
+ ],
+ [
+ "name" => "二级菜单",
+ "sub_button" => [
+ [
+ "type" => "view",
+ "name" => "百度",
+ "url" => "http://www.baidu.com/"
+ ],
+ [
+ "type" => "view",
+ "name" => "授权页面",
+ "url" => "http://wmhello.tunnel.qydev.com/view"
+ ],
+ [
+ "type" => "click",
+ "name" => "赞一下我们",
+ "key" => "YOU_VOTE_ME"
+ ],
+ ],
+ ],
+ [
+ "type" => "view",
+ "name" => "修改名片",
+ "url" => "http://wmhello.tunnel.qydev.com/view1"
+ ],
+ ];
+ $this->menu->create($buttons);
+ }
+
+ public function all()
+ {
+ $result = $this->menu->list();
+ return $result;
+ }
+}
diff --git a/backend/app/Http/Controllers/PermissionController.php b/backend/app/Http/Controllers/PermissionController.php
new file mode 100644
index 00000000..a5b27f75
--- /dev/null
+++ b/backend/app/Http/Controllers/PermissionController.php
@@ -0,0 +1,216 @@
+input('pageSize', 10);
+ $page = $request->input('page', 1);
+ // $lists = Permission::Name()->Pid()->Type()->paginate($pageSize);
+ $lists = Permission::Name()->Pid()->Type()->get();
+ $count = Permission::Name()->Pid()->Type()->count();
+ $items = $lists->toArray();
+ $list_data = $items;
+ $end = $list_data;
+ if ( !$request->has('type')) {
+ // 转换为无极限分类格式,分类下的所有API都在一起
+ $data = $this->make_tree($list_data);
+ $end = [];
+ foreach($data as $item) {
+ if (is_array($item['children'])) {
+ $values = $item['children'];
+ unset($item['children']);
+ array_push($end, $item);
+ $end = array_merge($end, $values);
+ }
+ }
+ }
+ return response()->json([
+ 'data' => $end,
+ 'meta' => [
+ 'total' => $count
+ ],
+ 'status' => 'success',
+ 'status_code' => 200
+ ], 200);
+ //return new PermissionCollection($lists);
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function create()
+ {
+ //
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+ public function store(PermissionRequest $request)
+ {
+ //
+ $data = $request->only(['name', 'pid', 'type', 'method', 'route_name', 'route_match', 'remark']);
+
+ if (Permission::create($data)){
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ /**
+ * Display the specified resource.
+ *
+ * @param \App\Models\Permission $permission
+ * @return \Illuminate\Http\Response
+ */
+ public function show(Permission $permission)
+ {
+ //
+ return new \App\Http\Resources\Permission($permission);
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ *
+ * @param \App\Models\Permission $permission
+ * @return \Illuminate\Http\Response
+ */
+ public function edit(Permission $permission)
+ {
+ //
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \App\Models\Permission $permission
+ * @return \Illuminate\Http\Response
+ */
+ public function update(PermissionRequest $request, Permission $permission)
+ {
+ //
+ $data = $request->only(['name', 'pid', 'type', 'method', 'route_name', 'route_match', 'remark']);
+ $permission->name = $data['name'];
+ $permission->pid= $data['pid'];
+ $permission->type = $data['type'];
+ $permission->method = $data['method'];
+ $permission->route_name = $data['route_name'];
+ $permission->route_match = isset($data['route_match'])?$data['route_match']:$permission->route_match;
+ $permission->remark = isset($data['remark'])?$data['remark']:$permission->remark;
+ if ($permission->save()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ *
+ * @param \App\Models\Permission $permission
+ * @return \Illuminate\Http\Response
+ */
+ public function destroy(Permission $permission)
+ {
+ //
+ if ($permission->delete()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ public function addGroup(Request $request)
+ {
+ $data = $request->only(['name', 'remark']);
+ $rules = [
+ 'name' => 'required|unique|string'
+ ];
+ $messages = [
+ 'name.requried' => '功能组名称必须填写',
+ 'name.unique' => '功能组名称已经存在,无法建立'
+ ];
+ Validator::make($data, $rules, $messages);
+
+ $data['pid'] = 0;
+ $data['type'] = 1;
+ if (Permission::create($data)) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ public function getGroup()
+ {
+ $lists = Permission::where('pid', 0)
+ ->where('type', 1)
+ ->get();
+ return $this->successWithData($lists);
+ }
+
+ public function deleteAll(Request $request)
+ {
+ $data = $this->deleteByIds($request);
+ if ($data) {
+ if (Permission::destroy($data['ids'])) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+ }
+
+ public function getPermissionByTree()
+ {
+ // 获取权限数据 用于在树形控件中显示
+ $lists = Permission::select(DB::raw('id, name as label, pid'))->get();
+ $arr = $lists->toArray();
+ $arr1 = $this->make_tree($arr);
+ return $this->successWithData($arr1);
+ }
+
+ public function make_tree($arr){
+ $refer = array();
+ $tree = array();
+ foreach($arr as $k => $v){
+ $refer[$v['id']] = & $arr[$k]; //创建主键的数组引用
+ }
+ foreach($arr as $k => $v){
+ $pid = $v['pid']; //获取当前分类的父级id
+ if($pid == 0){
+ $tree[] = & $arr[$k]; //顶级栏目
+ }else{
+ if(isset($refer[$pid])){
+ $refer[$pid]['children'][] = & $arr[$k]; //如果存在父级栏目,则添加进父级栏目的子栏目数组中
+ }
+ }
+ }
+ return $tree;
+ }
+
+}
diff --git a/backend/app/Http/Controllers/Result.php b/backend/app/Http/Controllers/Result.php
new file mode 100644
index 00000000..0af39eb2
--- /dev/null
+++ b/backend/app/Http/Controllers/Result.php
@@ -0,0 +1,103 @@
+json([
+ 'status' => 'success',
+ 'status_code' => 200
+ ], 200);
+ }
+
+ public function successWithData($data)
+ {
+ return response()->json([
+ 'data' => $data,
+ 'status' => 'success',
+ 'status_code' => 200
+ ], 200);
+ }
+
+ public function error()
+ {
+ return response()->json([
+ 'status' => 'error',
+ 'status_code' => 404
+ ], 404);
+ }
+
+ public function validateError($errors)
+ {
+ return response()->json(
+ [
+ 'status' => 'validate error',
+ 'status_code' => 422,
+ 'errors' => $errors
+ ], 422);
+ }
+
+ public function errorWithInfo( $info)
+ {
+ return response()->json([
+ 'status' => 'error',
+ 'status_code' => 404,
+ 'message' => $info
+ ], 404);
+
+ }
+
+ public function errorWithCodeAndInfo($code, $info)
+ {
+ return response()->json([
+ 'status' => 'error',
+ 'status_code' => $code,
+ 'message' => $info
+ ], $code);
+ }
+
+ public function fileUpdate()
+ {
+ $file = Input::file('file');
+ $type=['application/vnd.ms-excel'];
+ $fileType = $file->getClientMimeType();
+ if (in_array($fileType, $type)) {
+ $clientExt = $file->getClientOriginalExtension();
+ $fileName = date('ymdhis').'.'.$clientExt;
+ return $file->storeAs('xls',$fileName);
+ } else {
+ return $this->errorWithCodeAndInfo(406,'上传的文件格式不正确');
+ }
+ }
+
+ public function deleteByIds($request)
+ {
+ $data = $request->only('ids');
+ $rules = [
+ 'ids' => 'required | Array'
+ ];
+ $messages = [
+ 'ids.required' => '必须选择相应的记录',
+ 'ids.Array' => 'ids字段必须是数组'
+ ];
+
+ $validator = Validator::make($data, $rules, $messages);
+ if ($validator->fails()) {
+ $errors = $validator->error($validator);
+ return $this->errorWithCodeAndInfo(422, $errors);
+ } else {
+ return $data;
+ }
+ }
+}
\ No newline at end of file
diff --git a/backend/app/Http/Controllers/RoleController.php b/backend/app/Http/Controllers/RoleController.php
new file mode 100644
index 00000000..df028cd6
--- /dev/null
+++ b/backend/app/Http/Controllers/RoleController.php
@@ -0,0 +1,261 @@
+get();
+ return $this->successWithData($data);
+
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function create()
+ {
+ //
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+ /**
+ * @api {post}/api/role 新建一条角色信息
+ * @apiGroup role
+ * @apiParam {string} name 角色名称
+ * @apiParam {string} explain 角色说明
+ * @apiParam {string} [remark] 角色备注 可选
+ * @apiParamExample {object} 请求事例 建
+ * {
+ * name: 'app',
+ * explain: '应用管理者'
+ * }
+ *@apiHeaderExample {json} 请求头:
+ *{ "Content-Type": "application/x-www-form-urlencoded" }
+ *
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 数据验证出错:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404,
+ * }
+ */
+ public function store(RoleRequest $request)
+ {
+ //
+ $data = $request->only(['name', 'explain', 'remark']);
+ if (Role::updateOrCreate($data)) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ /**
+ * Display the specified resource.
+ *
+ * @param \App\Role $role
+ * @return \Illuminate\Http\Response
+ */
+ /**
+ * @api {get} /api/role/:id 获取一条角色
+ * @apiGroup role
+ * @apiParam {number} id 角色标识
+ * @apiSuccessExample {json} 信息获取成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "data": [
+ * {
+ * "id": 2,
+ * "name": "admin",
+ * "explain": "管理员",
+ * "remark": null
+ * }
+ * ],
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 指定的角色不存在:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+ public function show(Role $role)
+ {
+ //
+ return new \App\Http\Resources\Role($role);
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ *
+ * @param \App\Role $role
+ * @return \Illuminate\Http\Response
+ */
+ public function edit(Role $role)
+ {
+ //
+
+
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \App\Role $role
+ * @return \Illuminate\Http\Response
+ */
+
+ /**
+ * @api {patch}/api/role/:id 更新角色信息
+ * @apiGroup role
+ * @apiParam {number} id 角色标识 路由上使用
+ * @apiParam {string} name 角色名称
+ * @apiParam {string} explain 角色描述
+ * @apiParam {string} [remark] 备注 可选
+ * @apiParamExample {object} 请求事例 建立学期 2017-2018上学期:
+ * {
+ * name: 'admin',
+ * explain: '管理员',
+ * remark: '管理员'
+ * }
+ *@apiHeaderExample {json} 请求头:
+ *{ "Content-Type": "application/x-www-form-urlencoded" }
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 数据验证出错:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+ public function update(RoleRequest $request, Role $role)
+ {
+ //
+ $data = $request->only(['name', 'explain', 'remark', 'permission']);
+ $role->name = $data['name'];
+ $role->explain = $data['explain'];
+ $role->permission = implode(',', $data['permission']);
+ $role->remark = $data['remark']??null;
+ if ($role->save()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ *
+ * @param \App\Role $role
+ * @return \Illuminate\Http\Response
+ */
+ /**
+ * @api {delete} /api/role/:id 删除指定的角色信息
+ * @apiGroup role
+ * @apiParam {number} id 角色标识
+ * @apiSuccessExample {json} 信息获取成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 删除失败,没有指定的角色:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404,
+ * "message": "删除失败"
+ * }
+ */
+ public function destroy(Role $role)
+ {
+ //
+ if ($role->delete()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ public function addPermission(Request $request)
+ {
+ $data = $request->only(['id', 'name', 'permission', 'explain', 'remark']);
+
+ }
+}
diff --git a/backend/app/Http/Controllers/SessionController.php b/backend/app/Http/Controllers/SessionController.php
new file mode 100644
index 00000000..873d6372
--- /dev/null
+++ b/backend/app/Http/Controllers/SessionController.php
@@ -0,0 +1,392 @@
+上学期 2=>下学期)
+ * @apiParam {number} one 高一班级数
+ * @apiParam {number} two 高二班级数
+ * @apiParam {number} three 高三班级数
+ * @apiParam {string} [remark] 备注 可选
+ * @apiParamExample {object} 请求事例 建立学期 2017-2018上学期:
+ * {
+ * year: 2017,
+ * team: 1,
+ * one: 20,
+ * two: 20,
+ * three: 20
+ * }
+ *@apiHeaderExample {json} 请求头:
+ *{ "Content-Type": "application/x-www-form-urlencoded" }
+ *
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 数据验证出错:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404,
+ * "message": "验证出错,请按要求填写"
+ * }
+ * @apiErrorExample {json} 重复提交:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 400,
+ * "message": "你提交的学期信息已经存在,无法新建"
+ * }
+ */
+ public function store(Request $request)
+ {
+ //
+ //
+ $data = $request->only('year', 'team', 'one', 'two', 'three');
+ $validator = Validator::make($data, [
+ 'year' => 'required|integer',
+ 'team' => 'required| in:1,2',
+ 'one' => 'required|integer',
+ 'two' => 'required|integer',
+ 'three' => 'required|integer',
+ ]);
+ if ($validator->fails()) {
+ $errors = $validator->errors($validator);
+ return $this->errorWithCodeAndInfo(422, $errors);
+ } else {
+ if (! Session::where('year',$data['year'])->where('team', $data['team'])->count()) {
+ Session::create($data);
+ return $this->success();
+ } else {
+ return $this->errorWithCodeAndInfo(400, '你提交的学期信息已经存在,无法新建');
+ }
+
+ }
+
+ }
+
+ /**
+ * Display the specified resource.
+ *
+ * @param \App\Session $session
+ * @return \Illuminate\Http\Response
+ */
+ /**
+ * @api {get} /api/session/:id 获取指定学期信息
+ * @apiGroup session
+ * @apiParam {number} id 学期标识
+ * @apiSuccessExample {json} 信息获取成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "data": [
+ * {
+ * "id": 2 // 整数型 学期标识
+ * "year": 2016 //数字型 学年
+ * "team": 2 // 数字型 学期
+ * "remark": "2016-2017下学期" // 备注说明
+ * "one": 20, // 高一年级班级数
+ * "two": 20, // 高二年级班级数
+ * "three": 20 // 高三年级班级数
+ * }
+ * ],
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 指定的学期不能存在:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+ public function show(Session $session)
+ {
+ //
+ if ($session) {
+ return new \App\Http\Resources\Session($session);
+ } else {
+ return $this->error();
+ }
+
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ *
+ * @param \App\Session $session
+ * @return \Illuminate\Http\Response
+ */
+ public function edit(Session $session)
+ {
+ //
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \App\Session $session
+ * @return \Illuminate\Http\Response
+ */
+ /**
+ * @api {patch}/api/session/:id 更新学期信息
+ * @apiGroup session
+ * @apiParam {number} id 学期标识 路由上使用
+ * @apiParam {number} year 学年
+ * @apiParam {number=1,2} team 学期(1=>上学期 2=>下学期)
+ * @apiParam {number} one 高一班级数
+ * @apiParam {number} two 高二班级数
+ * @apiParam {number} three 高三班级数
+ * @apiParam {string} [remark] 备注 可选
+ * @apiParamExample {object} 请求事例 建立学期 2017-2018上学期:
+ * {
+ * year: 2017,
+ * team: 1,
+ * remark: '2017-2018上学期',
+ * one: 20,
+ * two: 20,
+ * three: 20
+ *
+ * }
+ *@apiHeaderExample {json} 请求头:
+ *{ "Content-Type": "application/x-www-form-urlencoded" }
+ *
+ * @apiSuccessExample {json} 操作成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 数据验证出错:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404,
+ * "message": "验证出错,请按要求填写"
+ * }
+ */
+ public function update(Request $request, Session $session)
+ {
+ //
+ $data = $request->only('year', 'team', 'one', 'two', 'three');
+ $validator = Validator::make($data, [
+ 'year' => 'required|integer',
+ 'team' => 'required| in:1,2',
+ 'one' => 'required|integer',
+ 'two' => 'required|integer',
+ 'three' => 'required|integer',
+ ]);
+ if ($validator->fails()) {
+ $errors = $validator->errors($validator);
+ return $this->errorWithCodeAndInfo(422, $errors);
+ } else {
+ $session->year = $data['year'];
+ $session->team = $data['team'];
+ $session->one = $data['one'];
+ $session->two = $data['two'];
+ $session->three = $data['three'];
+ $session->save();
+ return $this->success();
+ }
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ *
+ * @param \App\Session $session
+ * @return \Illuminate\Http\Response
+ */
+ /**
+ * @api {delete} /api/session/:id 删除指定的学期信息
+ * @apiGroup session
+ * @apiParam {number} id 学期标识
+ * @apiSuccessExample {json} 信息获取成功:
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample {json} 删除失败,没有指定的学期:
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404,
+ * "message": "删除失败"
+ * }
+ */
+
+ public function destroy(Session $session)
+ {
+ //
+ if ($session->delete()) {
+ return $this->success();
+ } else {
+ return $this->errorWithInfo('删除失败');
+ }
+ }
+
+ public function upload(SessionImport $import)
+ {
+ $bool = $import->handleImport($import);
+ if ($bool) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+
+
+ }
+
+ /**
+ * @api {get} /api/getSession 获取学期信息
+ * @apiGroup other
+ *
+ * @apiSuccessExample 返回学期信息列表,
+ * HTTP/1.1 200 OK
+ * {
+ * "data": [
+ * {
+ * "id": 2 // 整数型 学期标识
+ * "year": 2016 //数字型 学年
+ * "team": 2 // 数字型 学期
+ * }
+ * ],
+ * "status": "success",
+ * "status_code": 200
+ * }
+ *
+ */
+ public function getSession()
+ {
+ $data = Session::select('id','year','team')->get()->toArray();
+ return $this->successWithData($data);
+ }
+
+ public function getDefaultSession()
+ {
+
+ $id = $this->getCurrentSessionId();
+ return response()->json([
+ 'data' => [
+ 'id' => $id
+ ],
+ 'status' => 'success',
+ 'status_code' => 200
+ ], 200);
+ }
+
+ public function getClassNumByGrade(Request $request)
+ {
+ $arrClass = ['zero', 'one', 'two', 'three'];
+ $grade = (int)$request->input('grade');
+ $teach_id = (int)$request->input('teach_id', 7);
+ if (isset($grade) && $grade && $grade>=0 && $grade<=3) {
+ $session_id = $this->getCurrentSessionId();
+ $filed =$arrClass[$grade];
+ $maxClass = Session::where('id', $session_id)->value($arrClass[$grade]);
+ $arr = [];
+ for ($i = 1; $i<=$maxClass;$i++){
+ $key = 'class'.$i;
+ $arr[$key] = [
+ 'disable' => false,
+ 'label' => $i
+ ];
+ }
+ $arr1 = [];
+ $tmpArr = Teaching::where('teach_id', $teach_id)
+ ->where('session_id', $session_id)
+ ->where('grade', $grade)
+ ->pluck('class_id');
+ foreach ($tmpArr as $item){
+ $key = 'class'.$item;
+ $arr1[$key] = [
+ 'disable' => true,
+ 'label' => $item
+ ];
+ }
+ $result=array_values(array_merge($arr,$arr1));
+ return $this->successWithData($result);
+ } else {
+ return $this->errorWithCodeAndInfo(422, '请选择年级');
+ }
+ }
+}
diff --git a/backend/app/Http/Controllers/TeachController.php b/backend/app/Http/Controllers/TeachController.php
new file mode 100644
index 00000000..83ef8a5e
--- /dev/null
+++ b/backend/app/Http/Controllers/TeachController.php
@@ -0,0 +1,109 @@
+get();
+ return $this->successWithData($data);
+ }
+}
diff --git a/backend/app/Http/Controllers/TeacherController.php b/backend/app/Http/Controllers/TeacherController.php
new file mode 100644
index 00000000..0844d777
--- /dev/null
+++ b/backend/app/Http/Controllers/TeacherController.php
@@ -0,0 +1,117 @@
+get()->toArray();
+ return $this->successWithData($data);
+ }
+
+ public function getTeacherByTeachingId(Request $request)
+ {
+ $teaching_id = $request->input('teaching_id');
+ $teachers = Teacher::select('id', 'name')->where('teaching_id', $teaching_id)->get();
+ return $this->successWithData($teachers);
+ }
+}
diff --git a/backend/app/Http/Controllers/TeachingController.php b/backend/app/Http/Controllers/TeachingController.php
new file mode 100644
index 00000000..cb228dd1
--- /dev/null
+++ b/backend/app/Http/Controllers/TeachingController.php
@@ -0,0 +1,359 @@
+input('pageSize');
+ $pageSize = isset($pageSize) && $pageSize ?$pageSize:10;
+ $lists = Teaching::SessionId()->TeacherId()->Grade()->TeachId()->ClassId()->paginate($pageSize);
+ return new TeachingCollection($lists);
+
+ }
+
+ /**
+ * Show the form for creating a new resource.
+ *
+ * @return \Illuminate\Http\Response
+ */
+ public function create()
+ {
+ //
+ }
+
+ /**
+ * Store a newly created resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @return \Illuminate\Http\Response
+ */
+ public function store(TeachingRequest $request)
+ {
+ //
+ $data = $request->only(['teacher_id', 'teach_id', 'class_id', 'classAll', 'grade', 'hour', 'remark']);
+ $data['session_id'] = $this->getCurrentSessionId();
+ $classAll = $data['classAll'];
+ array_except($data, 'classAll');
+ // 循环添加记录
+ foreach ($classAll as $item) {
+ $data['class_id'] = (int)$item;
+ Teaching::create($data);
+ }
+ return $this->success();
+
+ }
+
+ /**
+ * Display the specified resource.
+ *
+ * @param \App\Teaching $teaching
+ * @return \Illuminate\Http\Response
+ */
+ public function show(Teaching $teaching)
+ {
+ //
+ return new \App\Http\Resources\Teaching($teaching);
+ }
+
+ /**
+ * Show the form for editing the specified resource.
+ *
+ * @param \App\Teaching $teaching
+ * @return \Illuminate\Http\Response
+ */
+ public function edit(Teaching $teaching)
+ {
+ //
+ }
+
+ /**
+ * Update the specified resource in storage.
+ *
+ * @param \Illuminate\Http\Request $request
+ * @param \App\Teaching $teaching
+ * @return \Illuminate\Http\Response
+ */
+ public function update(TeachingUploadRequest $request, Teaching $teaching)
+ {
+ //
+ $data = $request->only(['teacher_id', 'teach_id', 'class_id', 'classAll', 'oldClassAll', 'grade', 'hour', 'remark']);
+ $teaching->session_id = $this->getCurrentSessionId();
+ $teaching->teacher_id = $data['teacher_id'];
+ $teaching->teach_id = $data['teach_id'];
+ $teaching->grade = $data['grade'];
+ $teaching->remark = $data['remark'];
+ $classAll = $data['classAll'];
+ $oldClassAll = $data['oldClassAll'];
+ $arrTmp = array_diff($oldClassAll,$classAll);
+// foreach ($classAll as $item){
+// $oldItem = [
+// 'teacher_id' => $data['teacher_id'],
+// 'teach_id' => $data['teach_id'],
+// 'grade' => $data['grade'],
+// 'session_id' => $teaching->session_id,
+// 'class_id' => (int)$item,
+// ];
+// $newItem = [
+// 'class_id' => (int)$item,
+// 'hour' => $data['hour'],
+// 'remark' => $data['remark']
+// ];
+// $bool = Teaching::updateOrCreate($oldItem, $newItem);
+// }
+
+ foreach ($arrTmp as $item) {
+
+ Teaching::where('session_id', $teaching->session_id)
+ ->where('teacher_id', $data['teacher_id'])
+ ->where('grade', $data['grade'])
+ ->where('class_id', (int)$item)
+ ->where('teach_id', $data['teach_id'])
+ ->delete();
+ }
+ return $this->success();
+
+ }
+
+ /**
+ * Remove the specified resource from storage.
+ *
+ * @param \App\Teaching $teaching
+ * @return \Illuminate\Http\Response
+ */
+ public function destroy(Teaching $teaching)
+ {
+ //
+ if ($teaching->delete()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ public function deleteAll(Request $request)
+ {
+ $data = $this->deleteByIds($request);
+ if ($data) {
+ if (Teaching::destroy($data['ids'])) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+ }
+
+ public function upload( TeachingImport $import)
+ {
+ $bool = $import->handleImport($import);
+ if ($bool) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+
+ public function exportAll(Request $request) {
+ $sessionId =$request->input('session_id');
+ $sessionId = isset($sessionId)?$sessionId:$this->getCurrentSessionId();
+ $rec = Teaching::where('session_id', $sessionId)->count(); // 获得总记录数,因为是所有的数据
+ $this->generator($rec, 1);
+ }
+
+ public function export(Request $request)
+ {
+ $pageSize = (int)$request->input('pageSize');
+ $pageSize = isset($pageSize) && $pageSize? $pageSize: 10;
+ $page = (int)$request->input('page');
+ $page = isset($page) && $page ? $page: 1;
+ $this->generator($pageSize, $page);
+ }
+
+ public function generator($pageSize, $page)
+
+ {
+
+ $sessionId = (int)request()->input('session_id');
+ $teacherId = (int)request()->input('teacher_id');
+ $leaderType = (int)request()->input('leader_type');
+
+ $sessionId = (isset($sessionId)&&$sessionId)?$sessionId: $this->getCurrentSessionId();
+ $teacherId = (isset($teacherId)&&$teacherId)?$teacherId: null;
+ $leaderType = (isset($leaderType)&&$leaderType)?$leaderType: [1,2];
+ if (is_numeric($leaderType)) {
+ $arr = [];
+ array_push($arr,$leaderType);
+ $leaderType = $arr;
+ }
+ $lists = $this->queryData($pageSize, $page,$sessionId, $leaderType,$teacherId);
+ $data = $lists->toArray(); // 分页内容
+ $items = $this->generatorData($data);
+ $this->generatorXls($items);
+ }
+
+ protected function queryData($pageSize = 10, $page = 1, $sessionId, $leaderType,$teacherId){
+ // 查询条件 根据姓名或者电话号码进行查询
+ $offset = $pageSize * ($page - 1) == 0? 0: $pageSize * ($page - 1);
+ $lists = DB::table('leaders')->join('yz_teacher', 'leaders.teacher_id','=', 'yz_teacher.id')
+ ->join('sessions', 'leaders.session_id', '=', 'sessions.id' )
+ ->select(['yz_teacher.name', 'sessions.year', 'sessions.team','leaders.leader_type', 'leaders.job', 'leaders.remark'])
+ ->where('session_id', $sessionId)
+ ->whereIn('leader_type', $leaderType)
+ ->when($teacherId,function ($query) use ($teacherId) {
+ return $query->where('teacher_id', $teacherId);
+ })
+ ->when($pageSize,function($query) use($offset, $pageSize) {
+ return $query->offset($offset)->limit($pageSize);
+ })
+ ->get();
+
+ return $lists;
+ }
+
+ /**
+ * 根据传入的数据生成内容
+ * @param $data
+ * @return array
+ */
+ protected function generatorData($data): array
+ {
+ $items = [];
+ // $data = $data['data']; // 数据库中的数据
+ foreach ($data as $item) {
+ $arr = [];
+ $arr['name'] = $item->name;
+ $nextYear = $item->year + 1;
+ $arr['year'] = $item->year.'--'.$nextYear.'学年';
+ $arr['team'] = $item->team ==1 ? '上学期':'下学期';
+ $arr['leader_type'] = $item->leader_type == 1? '中层':'学校';
+ $arr['job'] = $item->job;
+ $arr['remark'] = $item->remark;
+ array_push($items, $arr);
+ }
+ array_unshift($items, ['姓名', '学年', '学期', '行政类型', '任职岗位', '岗位备注']);
+ return $items;
+ }
+
+ /**
+ * 生成xls文件 名称叫做员工信息
+ */
+ protected function generatorXls($items): void
+ {
+ $file = time();
+ Excel::create('教学过程管理', function ($excel) use ($items) {
+ $excel->sheet('score', function ($sheet) use ($items) {
+ $sheet->rows($items);
+ });
+ })->store('xls', public_path('xls'));
+ }
+
+ public function getSelectClassByGrade($id, $grade)
+ {
+
+ $item = Teaching::find($id);
+ $arr = Teaching::where('teacher_id', $item->teacher_id)
+ ->where('session_id', $item->session_id)
+ ->where('grade', $grade)
+ ->pluck('class_id');
+ return $this->successWithData($arr);
+ }
+
+ public function test(Request $request)
+ {
+ $teacher_id = $request->input('teacher_id', 168);
+// if (empty($teacher_id) && $teacher_id !=='0') {
+// echo '内容为空,没有传递参数';
+// dd($teacher_id);
+// } else {
+// echo '内容不为空,传递了参数';
+// dd($teacher_id);
+// }
+
+ $session_id = $request->input('teacher_id',$this->getCurrentSessionId());
+ $teach_id = $request->input('teach_id', 7);
+ $grade = $request->input('grade', 1);
+ $arrGrade = ['zero', 'one', 'two', 'three'];
+ $session = \App\Session::find($session_id);
+ $totalClass = $session[$arrGrade[$grade]]; // 获取当前学期指定年级的班级数
+ $arr = [];
+ for ($i = 1; $i<=$totalClass;$i++){
+ $key = 'class'.$i;
+ $arr[$key] = [
+ 'disable' => false,
+ 'label' => $i
+ ];
+ }
+ $tmpArr = [];
+ $arr1 = [];
+ $grade = 1;
+ $tmpArr = Teaching::where('teach_id', $teach_id)
+ ->where('session_id', $session_id)
+ ->where('grade', $grade)
+ ->pluck('class_id');
+ foreach ($tmpArr as $item){
+ $key = 'class'.$item;
+ $arr1[$key] = [
+ 'disable' => true,
+ 'label' => $item
+ ];
+ }
+ $result=array_merge($arr,$arr1);
+ var_dump($result);
+ }
+
+ public function getClassByTeachingId(Request $request, $id)
+ {
+ $data = Teaching::find($id);
+ $teacher_id = $request->input('teacher_id', $data->teacher_id);
+ $session_id = $request->input('session_id',$data->session_id);
+ $teach_id = $request->input('teach_id', $data->teach_id);
+ $grade = $request->input('grade', $data->grade);
+ $arrGrade = ['zero', 'one', 'two', 'three'];
+ $session = \App\Session::find($session_id);
+ $totalClass = $session[$arrGrade[$grade]]; // 获取当前学期指定年级的班级数
+ $arr = [];
+ for ($i = 1; $i<=$totalClass;$i++){
+ $key = 'class'.$i;
+ $arr[$key] = [
+ 'disable' => true,
+ 'label' => $i
+ ];
+ }
+ $tmpArr = [];
+ $arr1 = [];
+ $tmpArr = Teaching::where('teach_id', $teach_id)
+ ->where('session_id', $session_id)
+ ->where('grade', $grade)
+ ->where('teacher_id', $teacher_id)
+ ->pluck('class_id');
+ foreach ($tmpArr as $item){
+ $key = 'class'.$item;
+ $arr1[$key] = [
+ 'disable' => false,
+ 'label' => $item
+ ];
+ }
+ $result=array_values(array_merge($arr,$arr1));
+ return $this->successWithData($result);
+ }
+}
diff --git a/backend/app/Http/Controllers/Tools.php b/backend/app/Http/Controllers/Tools.php
new file mode 100644
index 00000000..01e9e7eb
--- /dev/null
+++ b/backend/app/Http/Controllers/Tools.php
@@ -0,0 +1,62 @@
+year;
+ $team =1;
+ $day = $date->day;
+ $month = $date->month;
+ switch ($month){
+ case 2:
+ if ($day>=25) {
+ $team = 2;
+ } else {
+ $team = 1;
+ }
+ break ;
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ $team = 2;
+ break;
+ case 8:
+ if ($day>=25) {
+ $team = 1;
+ } else {
+ $team = 2;
+ }
+ break ;
+ default: // 默认为1
+ $team =1;
+ break;
+ }
+ if ($team == 2 || $month <=7) { // 核算年份 1-7月份、8月份(8月25日以下为上一年)
+ $year--;
+ }
+ $session_id = Session::where('year', $year) ->where('team', $team)->value('id');
+ return $session_id;
+ }
+
+ public function getGradeById($id)
+ {
+ $grades = ['', '高一', '高二', '高三'];
+ return $grades[$id];
+ }
+
+}
\ No newline at end of file
diff --git a/backend/app/Http/Controllers/UserController.php b/backend/app/Http/Controllers/UserController.php
new file mode 100644
index 00000000..ed06b56d
--- /dev/null
+++ b/backend/app/Http/Controllers/UserController.php
@@ -0,0 +1,548 @@
+input('pageSize');
+ $pageSize = isset($pageSize) && $pageSize?$pageSize:10;
+ $users = User::name()->email()->paginate($pageSize);
+ return new UserCollection($users);
+ }
+
+
+ public function create(Request $request)
+ {
+
+ }
+
+ /**
+ * @api {post} /api/admin 建立新的管理员
+ * @apiGroup admin
+ * @apiParam {string} name 用户昵称
+ * @apiParam {string} email 用户登陆名 email格式 必须唯一
+ * @apiParam {string} password 用户登陆密码
+ * @apiParam {string="admin","editor"} [role="editor"] 角色 内容为空或者其他的都设置为editor
+ * @apiParam {string} [avatar] 用户头像地址
+ * @apiParamExample {json} 请求的参数例子:
+ * {
+ * name: 'test',
+ * email: '1111@qq.com',
+ * password: '123456',
+ * role: 'editor',
+ * avatar: 'uploads/20178989.png'
+ * }
+ *
+ * @apiSuccessExample 新建用户成功
+ * HTTP/1.1 201 OK
+ * {
+ * "status": "success",
+ * "status_code": 201
+ * }
+ * @apiErrorExample 数据验证出错
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404,
+ * "message": "信息提交不完全或者不规范,校验不通过,请重新提交"
+ * }
+ */
+ public function store(Request $request)
+ {
+ // 新建管理员信息
+ $data = $request->only(['name', 'role', 'password','password_confirmation', 'email', 'avatar']);
+ $rules = [
+ 'name'=>'required',
+ 'role' =>'nullable|array',
+ 'password' => 'required|confirmed',
+ 'email' => 'required|unique:users',
+ 'avatar' => 'nullable|string'
+ ];
+ $message = [
+ 'name.required' => '用户名是必填项',
+ 'password.required' => '用户密码是必填项',
+ 'password.confirmed' => '两次输入的密码不匹配',
+ 'email.required' => '登录名是必填项',
+ 'email.unique' => '登录名已经存在,请重新填写',
+ ];
+ $validator = Validator::make($data, $rules, $message);
+ if ($validator->fails()) {
+ $errors = $validator->errors($validator);
+ return $this->errorWithCodeAndInfo(422, $errors);
+ }
+ $data['password'] = bcrypt($data['password']);
+ $data['role'] = implode(',', $data['role']);
+ if (User::create($data)) {
+ return $this->success();
+ }
+ }
+
+
+ /**
+ * @api {get} /api/admin/:id 显示指定的管理员
+ * @apiGroup admin
+ *
+ *
+ * @apiSuccessExample 返回管理员信息
+ * HTTP/1.1 200 OK
+ * {
+ * "data": {
+ * "id": 1,
+ * "name": "wmhello",
+ * "email": "871228582@qq.com",
+ * "role": "admin",
+ * "avatar": ""
+ * },
+ * "status": "success",
+ * "status_code": 200
+ * }
+ *
+ */
+ public function show($id)
+ {
+ //
+ $user = User::find($id);
+ return new \App\Http\Resources\User($user);
+ }
+
+ public function edit($id)
+ {
+ //
+ }
+
+
+ /**
+ * @api {put} /api/admin/:id 更新指定的管理员
+ * @apiGroup admin
+ * @apiHeaderExample {json} http头部请求:
+ * {
+ * "content-type": "application/x-www-form-urlencoded"
+ * }
+ * @apiParam {string} name 用户昵称
+ * @apiParam {string="admin","editor"} [role=editor] 角色 内容为空或者其他的都设置为editor
+ * @apiParam {string} [avatar] 用户头像地址
+ * @apiParamExample {json} 请求参数例子
+ *{
+ * name: 'test',
+ * role: 'editor',
+ * avatar: 'uploads/20174356.png'
+ * }
+ * @apiSuccessExample 返回密码设置成功的结果
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ * @apiErrorExample 数据验证出错
+ * HTTP/1.1 404 Not Found
+ * {
+ * "status": "error",
+ * "status_code": 404,
+ * "message": "信息提交不完全或者不规范,校验不通过,请重新提交"
+ * }
+ */
+
+ public function update(Request $request, $id)
+ {
+
+ $all = $request->validate([
+ 'name' => 'required|string',
+ 'role' => 'required|array',
+ 'avatar' =>'nullable|string'
+ ]);
+ $roles = $all['role'];
+ $all['role'] = implode(',', $roles); // 把前台传回的数组型角色字段转化为字符型存入数据表
+ if (! (isset($all['role']) && $all['role'])) { // 没有填写内容 则删除,默认为user角色
+ //array_except($all, 'role');
+ $all['role'] = 'user';
+ }
+ $bool = User::where('id', $id)->update($all);
+ if ($bool) {
+ return $this->success();
+ }
+ }
+
+ /**
+ * @api {delete} /api/admin/:id 删除指定的管理员
+ * @apiGroup admin
+ *
+ * @apiSuccessExample 用户删除成功
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ *
+ * @apiErrorExample 用户删除失败
+ * HTTP/1.1 404 ERROR
+ * {
+ * "status": "error",
+ * "status_code": 404
+ * }
+ */
+
+ public function destroy($id)
+ {
+ //
+ $user = User::find($id);
+ if ($user->delete()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+
+ }
+
+ /**
+ * @api {post} /api/admin/:id/reset 重置指定管理员的密码
+ * @apiGroup admin
+ *
+ * @apiParam {string} password 用户密码
+ *
+ * @apiSuccessExample 返回密码设置成功的结果
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200
+ * }
+ *
+ */
+ public function reset(Request $request, $id)
+ {
+ $password = $request->input('password');
+ $user = User::find($id);
+ $user->password = bcrypt($password);
+ $user->save();
+ return $this->success();
+ }
+
+ /**
+ * @api {post} /api/admin/upload 头像图片上传
+ * @apiGroup admin
+ * @apiHeaderExample {json} http头部请求:
+ * {
+ * "content-type": "application/form-data"
+ * }
+ *
+ * @apiSuccessExample 上传成功
+ * HTTP/1.1 200 OK
+ * {
+ * "status": "success",
+ * "status_code": 200,
+ * "data": {
+ * "url" : 'uploads/3201278123689.png'
+ * }
+ * }
+ *
+ * @apiErrorExample 上传失败
+ * HTTP/1.1 400 ERROR
+ * {
+ * "status": "error",
+ * "status_code": 400
+ * }
+ */
+
+ public function uploadAvatar(Request $request)
+ {
+ if ($request->isMethod('POST')) {
+// var_dump($_FILES);
+ $file = $request->file('photo');
+ //判断文件是否上传成功
+ if ($file->isValid()) {
+ //获取原文件名
+ $originalName = $file->getClientOriginalName();
+ //扩展名
+ $ext = $file->getClientOriginalExtension();
+ //文件类型
+ $type = $file->getClientMimeType();
+ //临时绝对路径
+ $realPath = $file->getRealPath();
+
+ $filename = date('YmdHiS') . uniqid() . '.' . $ext;
+
+ $bool = Storage::disk('uploads')->put($filename, file_get_contents($realPath));
+ if ($bool) {
+ $filename = 'uploads/' . $filename;
+ return response()->json([
+ 'status' => 'success',
+ 'status_code' => 200,
+ 'data' => [
+ 'url' => $filename,
+ ]
+ ], 200);
+ } else {
+ return $this->error();
+ }
+ }
+ }
+ }
+
+ /**
+ * 修改个人密码
+ * 获取三个字段,oldPassword => 原来密码 password=>新密码 password_confirmation
+ * 原密码相同才能修改密码为新密码
+ */
+ public function modify(Request $request)
+ {
+
+ $oldPassword = $request->input('oldPassword');
+ $password = $request->input('password');
+ $data = $request->all();
+ $rules = [
+ 'oldPassword'=>'required|between:6,20',
+ 'password'=>'required|between:6,20|confirmed',
+ ];
+ $messages = [
+ 'required' => '密码不能为空',
+ 'between' => '密码必须是6~20位之间',
+ 'confirmed' => '新密码和确认密码不匹配'
+ ];
+ $validator = Validator::make($data, $rules, $messages);
+ $user = Auth::user();
+ $validator->after(function($validator) use ($oldPassword, $user) {
+ if (!\Hash::check($oldPassword, $user->password)) {
+ $validator->errors()->add('oldPassword', '原密码错误');
+ }
+ });
+ if ($validator->fails()) {
+ $errors = $validator->errors($validator); //返回一次性错误
+ return $this->errorWithCodeAndInfo(422,$errors);
+ }
+ $user->password = bcrypt($password);
+ if ($user->save()) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+
+ }
+
+ /**
+ * @api {get} /api/user 获取当前登陆的用户信息
+ * @apiGroup login
+ *
+ *
+ * @apiSuccessExample 信息获取成功
+ * HTTP/1.1 200 OK
+ *{
+ * "data": {
+ * "id": 1,
+ * "name": "xxx",
+ * "email": "xxx@qq.com",
+ * "roles": "xxx", //角色: admin或者editor
+ * "avatar": ""
+ * },
+ * "status": "success",
+ * "status_code": 200
+ *}
+ */
+ public function getUserInfo(Request $request)
+ {
+ // 获取用户信息和用户组对应的用户权限
+ // 用户权限
+ $user = $request->user();
+ $roles = explode(',',$user['role']);
+ $data = [
+ 'id' => $user['id'],
+ 'name' => $user['name'],
+ 'email' => $user['email'],
+ 'role' => $roles,
+ 'avatar' => $user['avatar']
+ ];
+ // 用户权限
+ $feature = \App\Role::whereIn('name',$roles)->pluck('permission');
+ $feature = $feature->toArray();
+ $strPermission = implode(',', $feature);
+ $permissions = explode(',', $strPermission);
+ $feature = Permission::select(['route_name', 'method', 'route_match', 'id'])->whereIn('id',$permissions)->get();
+ $feature = $feature->toArray();
+ $data['permission'] = $feature;
+ return response()->json([
+ 'data' => $data,
+ 'status' => 'success',
+ 'status_code' => 200,
+ ],200);
+ }
+
+ public function upload(UserImport $import)
+ {
+ $bool = $import->handleImport($import);
+ if ($bool) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+ }
+
+ public function exportAll(Request $request) {
+
+ // $rec = User::count(); // 获得总记录数,因为是所有的数据
+ $this->generator(null, 1);
+ }
+
+ public function export(Request $request)
+ {
+ $pageSize = (int)$request->input('pageSize');
+ $pageSize = isset($pageSize) && $pageSize? $pageSize: 10;
+ $page = (int)$request->input('page');
+ $page = isset($page) && $page ? $page: 1;
+ $this->generator($pageSize, $page);
+ }
+
+ public function generator($pageSize, $page)
+
+ {
+
+ $name = (int)request()->input('name');
+ $email= (int)request()->input('email');
+
+ $name = (isset($name)&&$name)?$name: null;
+ $email = (isset($email)&&$email)?$email: null;
+
+ $lists = $this->queryData($pageSize, $page,$name, $email);
+
+ $data = $lists->toArray(); // 分页内容
+
+ $items = $this->generatorData($data);
+ $this->generatorXls($items);
+ }
+
+ protected function queryData($pageSize = null, $page = 1, $name, $email){
+ // 查询条件 根据姓名或者电话号码进行查询
+ $offset = $pageSize * ($page - 1) == 0? 0: $pageSize * ($page - 1);
+ $lists = User::select('name', 'email', 'role')
+ ->name()
+ ->email()
+ ->when($pageSize,function($query) use($offset, $pageSize) {
+ return $query->offset($offset)->limit($pageSize);
+ })
+ ->get();
+
+ return $lists;
+ }
+
+ /**
+ * 根据传入的数据生成内容
+ * @param $data
+ * @return array
+ */
+ protected function generatorData($data): array
+ {
+ $items = [];
+ // $data = $data['data']; // 数据库中的数据
+ $arrRoles = Role::pluck('explain', 'name')->all();
+ foreach ($data as $item) {
+ $arr = [];
+ $arr['name'] = $item['name'];
+ $arr['email'] = $item['email'];
+ $tmpRoles = explode(',', $item['role']);
+ $strRoles = '';
+ foreach ($tmpRoles as $tmp) {
+ $strRoles .= $arrRoles[$tmp].',';
+ }
+ $arr['role'] = substr($strRoles,0, -1);
+ array_push($items, $arr);
+ }
+ array_unshift($items, ['姓名', '登录名', '角色']);
+ return $items;
+ }
+
+ /**
+ * 生成xls文件 名称叫做员工信息
+ */
+ protected function generatorXls($items): void
+ {
+ $file = time();
+ Excel::create('用户管理', function ($excel) use ($items) {
+ $excel->sheet('score', function ($sheet) use ($items) {
+ $sheet->rows($items);
+ });
+ })->store('xls', public_path('xls'));
+ }
+
+ public function test()
+ {
+ $str = 'abacde,';
+ dump(substr($str,0,-1));
+ }
+
+ public function deleteAll(Request $request)
+ {
+ $data = $request->only('ids');
+ $rules = [
+ 'ids' => 'required | Array'
+ ];
+ $messages = [
+ 'ids.required' => '必须选择相应的记录',
+ 'ids.Array' => 'ids字段必须是数组'
+ ];
+
+ $validator = Validator::make($data, $rules, $messages);
+ if ($validator->fails()) {
+ $errors = $validator->error($validator);
+ return $this->errorWithCodeAndInfo(422, $errors);
+ }
+
+ if (User::destroy($data['ids'])) {
+ return $this->success();
+ } else {
+ return $this->error();
+ }
+
+ }
+}
diff --git a/backend/app/Http/Controllers/WechatController.php b/backend/app/Http/Controllers/WechatController.php
new file mode 100644
index 00000000..54a8a409
--- /dev/null
+++ b/backend/app/Http/Controllers/WechatController.php
@@ -0,0 +1,72 @@
+server->push(function($message){
+ return "欢迎关注 overtrue!";
+ });
+
+ return $app->server->serve();
+ // 3.0版本使用
+/* $wechat = app('wechat');
+ $userApi = $wechat->user;
+ $wechat->server->setMessageHandler(function($message) use ($userApi) {
+ switch ($message->MsgType) {
+ case 'event':
+ switch ($message->Event){
+ case 'subscrible':
+ return '你好,欢迎关注!!';
+ break;
+ case 'CLICK':
+ if ($message->EventKey == 'YOU_CLICK_ME'){
+ return '你点击了我';
+ }
+ if ($message->EventKey == 'YOU_VOTE_ME'){
+ return '谢谢你的点赞';
+ }
+ break;
+ }
+ break;
+ case 'text':
+ return '你好' . $userApi->get($message->FromUserName)->nickname;
+ break;
+ case 'image':
+ return '收到图片消息';
+ break;
+ case 'voice':
+ return '收到语音消息';
+ break;
+ case 'video':
+ return '收到视频消息';
+ break;
+ case 'location':
+ return '收到坐标消息';
+ break;
+ case 'link':
+ return '收到链接消息';
+ break;
+ // ... 其它消息
+ default:
+ return '收到其它消息';
+ break;
+ }
+ });
+ return $wechat->server->serve();*/
+ }
+}
diff --git a/backend/app/Http/Kernel.php b/backend/app/Http/Kernel.php
new file mode 100644
index 00000000..7d9f320e
--- /dev/null
+++ b/backend/app/Http/Kernel.php
@@ -0,0 +1,67 @@
+ [
+ \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',
+ 'role'
+ ],
+ ];
+
+ /**
+ * The application's route middleware.
+ *
+ * These middleware may be assigned to groups or used individually.
+ *
+ * @var array
+ */
+ protected $routeMiddleware = [
+ 'auth' => \Illuminate\Auth\Middleware\Authenticate::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,
+ 'wechat.oauth' => \Overtrue\LaravelWeChat\Middleware\OAuthAuthenticate::class,
+ 'role' => Role::class,
+ ];
+}
diff --git a/backend/app/Http/Middleware/EncryptCookies.php b/backend/app/Http/Middleware/EncryptCookies.php
new file mode 100644
index 00000000..033136ad
--- /dev/null
+++ b/backend/app/Http/Middleware/EncryptCookies.php
@@ -0,0 +1,17 @@
+check()) {
+ return redirect('/home');
+ }
+
+ return $next($request);
+ }
+}
diff --git a/backend/app/Http/Middleware/Role.php b/backend/app/Http/Middleware/Role.php
new file mode 100644
index 00000000..c153cd58
--- /dev/null
+++ b/backend/app/Http/Middleware/Role.php
@@ -0,0 +1,56 @@
+user();
+
+ // 2、 因为角色有可能是过个组合,分解角色到数组
+ $arrRole = explode(',', $user->role);
+ if (in_array('admin', $arrRole)) {
+ return $next($request);
+ } else {
+ $route = Route::currentRouteName();
+ $permissions = [];
+ // 3、 角色数组中取出每一个角色,得到对应的功能id
+ $feature = \App\Role::whereIn('name',$arrRole)->pluck('permission');
+ $feature = $feature->toArray();
+ $strPermission = implode(',', $feature);
+ $permissions = explode(',', $strPermission);
+ $feature = Permission::whereIn('id',$permissions)->pluck('route_name');
+ $feature = $feature->toArray();
+ if (in_array($route, $feature)) {
+ return $next($request);
+ } else {
+ return response()->json([
+ 'status' => 'error',
+ 'status_code' => 403,
+ 'message' => '当前用户无权限访问该功能'
+ ], 403);
+ }
+
+ }
+
+ } else {
+ return $next($request);
+ }
+
+ }
+}
diff --git a/backend/app/Http/Middleware/TrimStrings.php b/backend/app/Http/Middleware/TrimStrings.php
new file mode 100644
index 00000000..5a50e7b5
--- /dev/null
+++ b/backend/app/Http/Middleware/TrimStrings.php
@@ -0,0 +1,18 @@
+ 'FORWARDED',
+ Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR',
+ Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST',
+ Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT',
+ Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO',
+ ];
+}
diff --git a/backend/app/Http/Middleware/VerifyCsrfToken.php b/backend/app/Http/Middleware/VerifyCsrfToken.php
new file mode 100644
index 00000000..8665e657
--- /dev/null
+++ b/backend/app/Http/Middleware/VerifyCsrfToken.php
@@ -0,0 +1,17 @@
+http = $http;
+ }
+
+ public function login($email, $password)
+ {
+ if (auth()->attempt(['email'=> $email, 'password'=> $password])){
+ return $this->proxy('password', [
+ 'username' => $email,
+ 'password' => $password,
+ 'scope' => '',
+ ]);
+ }
+ return response()->json([
+ 'status' => 'login error',
+ 'status_code' => 421,
+ 'message' => 'Credentials not match'
+ ],421);
+ }
+
+ public function proxy($grantType, array $data = [])
+ {
+ $data = array_merge($data, ['client_id' => env('PASSPORT_CLIENT_ID'),
+ 'client_secret' => env('PASSPORT_CLIENT_SECRET'),
+ 'grant_type' => $grantType
+ ]);
+ $website = $_SERVER['HTTP_HOST'];
+ $response = $this->http->post('http://' . $website . '/oauth/token', ['form_params' => $data
+ ]);
+ $token = json_decode((string)$response->getBody(), true);
+ return response()->json(['token' => $token['access_token'],
+ 'expires_in' => $token['expires_in']
+ ])->cookie('refreshToken', $token['refresh_token'], 14400, null, null, false, true);
+ }
+
+ public function logout()
+ {
+ $user = auth()->guard('api')->user();
+ $accessToken = $user->token();
+ app('db')->table('oauth_refresh_tokens')
+ ->where('access_token_id', $accessToken->id)
+ ->update([
+ 'revoked' => true
+ ]);
+ app('cookie')->forget('refreshToken');
+ $accessToken->revoke();
+ return response()->json([
+ 'status' => 'success',
+ 'status_code' => 200,
+ 'message' => 'logout success'
+ ]
+ ,200);
+ }
+
+ public function refresh()
+ {
+ $refreshToken = request()->cookie('refreshToken');
+ return $this->proxy('refresh_token',
+ ['refresh_token' => $refreshToken]);
+ }
+}
\ No newline at end of file
diff --git a/backend/app/Http/Requests/ClassTeacherRequest.php b/backend/app/Http/Requests/ClassTeacherRequest.php
new file mode 100644
index 00000000..3df5230e
--- /dev/null
+++ b/backend/app/Http/Requests/ClassTeacherRequest.php
@@ -0,0 +1,33 @@
+ 'required|exists:yz_teacher,id',
+ 'class_id' => 'required|numeric',
+ 'grade' => 'required|in:1,2,3',
+ 'remark' => 'nullable|string|max:50',
+ ];
+ }
+}
diff --git a/backend/app/Http/Requests/ClassTeacherUploadRequest.php b/backend/app/Http/Requests/ClassTeacherUploadRequest.php
new file mode 100644
index 00000000..a0dc1d3f
--- /dev/null
+++ b/backend/app/Http/Requests/ClassTeacherUploadRequest.php
@@ -0,0 +1,29 @@
+ 'required|exists:yz_teacher,id',
+ 'teach_id' => 'required|exists:yz_teaching,id',
+ 'leader' => 'required|in:0,1',
+ 'grade' => 'required|in:1,2,3',
+ 'remark' => 'nullable|string|max:50',
+ ];
+ }
+}
diff --git a/backend/app/Http/Requests/DepartmentsUploadRequest.php b/backend/app/Http/Requests/DepartmentsUploadRequest.php
new file mode 100644
index 00000000..ca717dd1
--- /dev/null
+++ b/backend/app/Http/Requests/DepartmentsUploadRequest.php
@@ -0,0 +1,29 @@
+ "required|exists:yz_teacher,id",
+ 'leader_type' => "required|in:1,2",
+ 'job' => "nullable|string|max:20",
+ 'remark' => "nullable|string|max:50",
+ ];
+ }
+
+}
diff --git a/backend/app/Http/Requests/LeaderUploadRequest.php b/backend/app/Http/Requests/LeaderUploadRequest.php
new file mode 100644
index 00000000..1ba65d9a
--- /dev/null
+++ b/backend/app/Http/Requests/LeaderUploadRequest.php
@@ -0,0 +1,31 @@
+ 'required|string',
+ 'pid' => 'required|integer',
+ 'type' => 'required|in:1,2',
+ 'method' => 'required_unless:type,1',
+ 'route_name' => 'required_unless:type,1',
+ ];
+ }
+
+ public function messages()
+ {
+ return [
+ 'name.required' => '功能名称必须填写',
+ 'pid.required' => '所属组称必须填写',
+ 'type.required' => '功能类型必须填写',
+ 'route_name.required_unless' => '路由名称必须填写',
+ 'route_name.unique' => '路由名称已经存在,不能重复出现',
+ 'method.required_unless' => '访问方法必须填写',
+ ];
+ }
+}
diff --git a/backend/app/Http/Requests/Request.php b/backend/app/Http/Requests/Request.php
new file mode 100644
index 00000000..5086a45b
--- /dev/null
+++ b/backend/app/Http/Requests/Request.php
@@ -0,0 +1,18 @@
+ 'required|string|max:20',
+ 'explain' => 'required|string|max:20',
+ 'resource' => 'nullable|string|max:50',
+ 'remark' => 'nullable|string|max:50',
+ ];
+ }
+}
diff --git a/backend/app/Http/Requests/TeachingRequest.php b/backend/app/Http/Requests/TeachingRequest.php
new file mode 100644
index 00000000..3e8828a3
--- /dev/null
+++ b/backend/app/Http/Requests/TeachingRequest.php
@@ -0,0 +1,33 @@
+ 'required|exists:yz_teacher,id',
+ 'teach_id' => 'required|exists:yz_teaching,id',
+ 'grade' => 'required|in:1,2,3'
+ ];
+ }
+}
diff --git a/backend/app/Http/Requests/TeachingUploadRequest.php b/backend/app/Http/Requests/TeachingUploadRequest.php
new file mode 100644
index 00000000..74d78243
--- /dev/null
+++ b/backend/app/Http/Requests/TeachingUploadRequest.php
@@ -0,0 +1,33 @@
+ 'required|exists:yz_teacher,id',
+ 'teach_id' => 'required|exists:yz_teaching,id',
+ 'grade' => 'required|in:1,2,3',
+ 'class_id' => 'required|numeric'
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/ClassTeacher.php b/backend/app/Http/Resources/ClassTeacher.php
new file mode 100644
index 00000000..f2bf0f8b
--- /dev/null
+++ b/backend/app/Http/Resources/ClassTeacher.php
@@ -0,0 +1,34 @@
+ $this->id,
+ 'session_id' => $this->session_id,
+ 'teacher_id' => $this->teacher_id,
+ 'grade' => $this->grade,
+ 'class_id' => $this->class_id,
+ 'remark' => $this->remark
+ ];
+ }
+
+ public function with($request)
+ {
+ return [
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/ClassTeacherCollection.php b/backend/app/Http/Resources/ClassTeacherCollection.php
new file mode 100644
index 00000000..d4c96aff
--- /dev/null
+++ b/backend/app/Http/Resources/ClassTeacherCollection.php
@@ -0,0 +1,23 @@
+ $this->collection,
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/Department.php b/backend/app/Http/Resources/Department.php
new file mode 100644
index 00000000..3f3eecea
--- /dev/null
+++ b/backend/app/Http/Resources/Department.php
@@ -0,0 +1,35 @@
+ $this->id,
+ 'session_id' => $this->session_id,
+ 'teacher_id' => $this->teacher_id,
+ 'teach_id' => $this->teach_id,
+ 'leader' => $this->leader,
+ 'grade' => $this->grade,
+ 'remark' => $this->remark,
+ ];
+ }
+
+ public function with($request)
+ {
+ return [
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/DepartmentCollection.php b/backend/app/Http/Resources/DepartmentCollection.php
new file mode 100644
index 00000000..61f4921f
--- /dev/null
+++ b/backend/app/Http/Resources/DepartmentCollection.php
@@ -0,0 +1,23 @@
+ $this->collection,
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/Leader.php b/backend/app/Http/Resources/Leader.php
new file mode 100644
index 00000000..54ff128b
--- /dev/null
+++ b/backend/app/Http/Resources/Leader.php
@@ -0,0 +1,34 @@
+ $this->id,
+ 'session_id' => $this->session_id,
+ 'teacher_id' => $this->teacher_id,
+ 'leader_type' => $this->leader_type,
+ 'job' => $this->job,
+ 'remark' => $this->remark
+ ];
+ }
+
+ public function with($request)
+ {
+ return [
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/LeaderCollection.php b/backend/app/Http/Resources/LeaderCollection.php
new file mode 100644
index 00000000..08af26ef
--- /dev/null
+++ b/backend/app/Http/Resources/LeaderCollection.php
@@ -0,0 +1,23 @@
+ $this->collection,
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/Permission.php b/backend/app/Http/Resources/Permission.php
new file mode 100644
index 00000000..80d1d006
--- /dev/null
+++ b/backend/app/Http/Resources/Permission.php
@@ -0,0 +1,36 @@
+ $this->id,
+ 'name'=> $this->name,
+ 'pid'=> $this->pid,
+ 'type'=> $this->type,
+ 'method'=> $this->method,
+ 'route_name'=> $this->route_name,
+ 'route_match'=> $this->route_match,
+ 'remark'=> $this->remark
+ ];
+ }
+
+ public function with($request)
+ {
+ return [
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/PermissionCollection.php b/backend/app/Http/Resources/PermissionCollection.php
new file mode 100644
index 00000000..4013598d
--- /dev/null
+++ b/backend/app/Http/Resources/PermissionCollection.php
@@ -0,0 +1,23 @@
+ $this->collection,
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/Role.php b/backend/app/Http/Resources/Role.php
new file mode 100644
index 00000000..3dbd9f58
--- /dev/null
+++ b/backend/app/Http/Resources/Role.php
@@ -0,0 +1,33 @@
+ $this->id,
+ 'name' => $this->name,
+ 'explain' => $this->explain,
+ 'permission' => explode(',', $this->permission),
+ 'remark' => $this->remark
+ ];
+ }
+
+ public function with($request)
+ {
+ return [
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/RoleCollection.php b/backend/app/Http/Resources/RoleCollection.php
new file mode 100644
index 00000000..fb63f473
--- /dev/null
+++ b/backend/app/Http/Resources/RoleCollection.php
@@ -0,0 +1,23 @@
+ $this->collection,
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/Session.php b/backend/app/Http/Resources/Session.php
new file mode 100644
index 00000000..1708cd0b
--- /dev/null
+++ b/backend/app/Http/Resources/Session.php
@@ -0,0 +1,38 @@
+ $this->id,
+ 'year' => $this->year,
+ 'team' => $this->team,
+ 'remark' => $this->remark,
+ 'one' => $this->one,
+ 'two' => $this->two,
+ 'three' => $this->three
+ ];
+ }
+
+ public function with($request)
+ {
+ return [
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+
+
+
+}
diff --git a/backend/app/Http/Resources/SessionCollection.php b/backend/app/Http/Resources/SessionCollection.php
new file mode 100644
index 00000000..93e12fbc
--- /dev/null
+++ b/backend/app/Http/Resources/SessionCollection.php
@@ -0,0 +1,24 @@
+ $this->collection,
+ 'status' => 'success',
+ 'status_code' => '200'
+ ];
+ }
+
+}
diff --git a/backend/app/Http/Resources/Teaching.php b/backend/app/Http/Resources/Teaching.php
new file mode 100644
index 00000000..72f428dd
--- /dev/null
+++ b/backend/app/Http/Resources/Teaching.php
@@ -0,0 +1,38 @@
+ $this->id,
+ 'session_id' => $this->session_id,
+ 'teacher_id' => $this->teacher_id,
+ 'teach_id' => $this->teach_id,
+ 'class_id' => $this->class_id,
+ 'grade' => $this->grade,
+ 'hour' => $this->hour,
+ 'remark' => $this->remark,
+ 'classAll' => $this->getAllClass($this->id),
+ 'oldClassAll' => $this->getAllClass($this->id)
+ ];
+ }
+
+ public function with($request)
+ {
+ return [
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Http/Resources/TeachingCollection.php b/backend/app/Http/Resources/TeachingCollection.php
new file mode 100644
index 00000000..4dec756c
--- /dev/null
+++ b/backend/app/Http/Resources/TeachingCollection.php
@@ -0,0 +1,23 @@
+ $this->collection,
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Leader.php b/backend/app/Leader.php
new file mode 100644
index 00000000..394d24e4
--- /dev/null
+++ b/backend/app/Leader.php
@@ -0,0 +1,44 @@
+input('leader_type');
+ if (isset($val)) {
+ return $query = $query->where('leader_type', $val);
+ }else {
+ return $query;
+ }
+ }
+
+ public function scopeTeacherId($query)
+ {
+ $val= request()->input('teacher_id');
+ if (isset($val)) {
+ return $query = $query->where('teacher_id', $val);
+ }else {
+ return $query;
+ }
+ }
+
+ public function scopeSessionId($query)
+ {
+ $val= request()->input('session_id');
+ if (isset($val)) {
+ return $query = $query->where('session_id', $val);
+ }else {
+ $sessionId = $this->getCurrentSessionId();
+ return $query = $query->where('session_id', $sessionId);
+ }
+ }
+}
diff --git a/backend/app/Models/Model.php b/backend/app/Models/Model.php
new file mode 100644
index 00000000..b3737e2c
--- /dev/null
+++ b/backend/app/Models/Model.php
@@ -0,0 +1,20 @@
+orderBy('create_at', 'desc');
+ }
+
+
+}
\ No newline at end of file
diff --git a/backend/app/Models/Permission.php b/backend/app/Models/Permission.php
new file mode 100644
index 00000000..ef16ed83
--- /dev/null
+++ b/backend/app/Models/Permission.php
@@ -0,0 +1,39 @@
+input('name');
+ if (isset($name)) {
+ return $query->where('name', 'like', '%'.$name.'%');
+ } else {
+ return $query;
+ }
+ }
+
+ public function scopePid($query)
+ {
+ $val = request()->input('pid');
+ if (isset($val)) {
+ return $query->where('id', (int)$val)->orWhere('pid', (int)$val);
+ } else {
+ return $query;
+ }
+ }
+
+ public function scopeType($query)
+ {
+ $val = request()->input('type');
+ if (isset($val)) {
+ return $query->where('type', (int)$val);
+ } else {
+ return $query;
+ }
+ }
+}
diff --git a/backend/app/Policies/Policy.php b/backend/app/Policies/Policy.php
new file mode 100644
index 00000000..c6dbffd2
--- /dev/null
+++ b/backend/app/Policies/Policy.php
@@ -0,0 +1,28 @@
+isAdmin()) {
+ return true;
+ }
+ }
+}
\ No newline at end of file
diff --git a/backend/app/Providers/AppServiceProvider.php b/backend/app/Providers/AppServiceProvider.php
new file mode 100644
index 00000000..35471f6f
--- /dev/null
+++ b/backend/app/Providers/AppServiceProvider.php
@@ -0,0 +1,28 @@
+ 'App\Policies\ModelPolicy',
+ ];
+
+ /**
+ * Register any authentication / authorization services.
+ *
+ * @return void
+ */
+ public function boot()
+ {
+ $this->registerPolicies();
+
+ Passport::routes();
+ Passport::tokensExpireIn(Carbon::now()->addMinute(100));
+
+ Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
+
+ //
+ }
+}
diff --git a/backend/app/Providers/BroadcastServiceProvider.php b/backend/app/Providers/BroadcastServiceProvider.php
new file mode 100644
index 00000000..352cce44
--- /dev/null
+++ b/backend/app/Providers/BroadcastServiceProvider.php
@@ -0,0 +1,21 @@
+ [
+ 'App\Listeners\EventListener',
+ ],
+ ];
+
+ /**
+ * Register any events for your application.
+ *
+ * @return void
+ */
+ public function boot()
+ {
+ parent::boot();
+
+ //
+ }
+}
diff --git a/backend/app/Providers/RouteServiceProvider.php b/backend/app/Providers/RouteServiceProvider.php
new file mode 100644
index 00000000..5ea48d39
--- /dev/null
+++ b/backend/app/Providers/RouteServiceProvider.php
@@ -0,0 +1,73 @@
+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'));
+ }
+}
diff --git a/backend/app/Resources/User.php b/backend/app/Resources/User.php
new file mode 100644
index 00000000..1e8eac47
--- /dev/null
+++ b/backend/app/Resources/User.php
@@ -0,0 +1,33 @@
+ $this->id,
+ 'name' => $this->name,
+ 'email' => $this->email,
+ 'role' => explode(',',$this->role),
+ 'avatar' => $this->avatar
+ ];
+ }
+
+ public function with($request)
+ {
+ return [
+ 'status' => 'success',
+ 'status_code' => 200,
+ ];
+ }
+}
diff --git a/backend/app/Resources/UserCollection.php b/backend/app/Resources/UserCollection.php
new file mode 100644
index 00000000..3a9c12c1
--- /dev/null
+++ b/backend/app/Resources/UserCollection.php
@@ -0,0 +1,23 @@
+ $this->collection,
+ 'status' => 'success',
+ 'status_code' => 200
+ ];
+ }
+}
diff --git a/backend/app/Role.php b/backend/app/Role.php
new file mode 100644
index 00000000..47189099
--- /dev/null
+++ b/backend/app/Role.php
@@ -0,0 +1,11 @@
+input('grade');
+ if (isset($val)) {
+ return $query = $query->where('grade', $val);
+ }else {
+ return $query;
+ }
+ }
+
+ public function scopeTeachId($query)
+ {
+ $val= request()->input('teach_id');
+ if (isset($val)) {
+ return $query = $query->where('teach_id', $val);
+ }else {
+ return $query;
+ }
+ }
+
+ public function scopeTeacherId($query)
+ {
+ $val= request()->input('teacher_id');
+ if (isset($val)) {
+ return $query = $query->where('teacher_id', $val);
+ }else {
+ return $query;
+ }
+ }
+
+ public function scopeClassId($query)
+ {
+ $val= request()->input('class_id');
+ if (isset($val)) {
+ return $query = $query->where('class_id', $val);
+ }else {
+ return $query;
+ }
+ }
+
+
+ public function scopeSessionId($query)
+ {
+ $val= request()->input('session_id');
+ if (isset($val)) {
+ return $query = $query->where('session_id', $val);
+ }else {
+ $sessionId = $this->getCurrentSessionId();
+ return $query = $query->where('session_id', $sessionId);
+ }
+ }
+
+ public function getAllClass($id)
+ {
+
+ $item = Teaching::find($id);
+ $arr = Teaching::where('teacher_id', $item->teacher_id)
+ ->where('session_id', $item->session_id)
+ ->where('grade', $item->grade)
+ ->pluck('class_id');
+ return $arr;
+ }
+
+}
diff --git a/backend/app/User.php b/backend/app/User.php
new file mode 100644
index 00000000..789d3106
--- /dev/null
+++ b/backend/app/User.php
@@ -0,0 +1,50 @@
+input('name');
+ if (isset($name)) {
+ return $query = $query->where('name', 'like', '%'.$name.'%');
+ } else {
+ return $query;
+ }
+ }
+
+ public function scopeEmail($query)
+ {
+ $email = request()->input('email');
+ if (isset($email)) {
+ return $query = $query->where('email', 'like', '%'.$email.'%');
+ } else {
+ return $query;
+ }
+ }
+}
diff --git a/backend/app/check.php b/backend/app/check.php
new file mode 100644
index 00000000..eeef22ff
--- /dev/null
+++ b/backend/app/check.php
@@ -0,0 +1,11 @@
+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);
diff --git a/backend/bootstrap/app.php b/backend/bootstrap/app.php
new file mode 100644
index 00000000..f2801adf
--- /dev/null
+++ b/backend/bootstrap/app.php
@@ -0,0 +1,55 @@
+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;
diff --git a/backend/bootstrap/cache/.gitignore b/backend/bootstrap/cache/.gitignore
new file mode 100644
index 00000000..d6b7ef32
--- /dev/null
+++ b/backend/bootstrap/cache/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/backend/composer.json b/backend/composer.json
new file mode 100644
index 00000000..016071cf
--- /dev/null
+++ b/backend/composer.json
@@ -0,0 +1,64 @@
+{
+ "name": "laravel/laravel",
+ "description": "The Laravel Framework.",
+ "keywords": ["framework", "laravel"],
+ "license": "MIT",
+ "type": "project",
+ "require": {
+ "php": ">=7.0.0",
+ "barryvdh/laravel-cors": "^0.10.0",
+ "doctrine/dbal": "^2.5",
+ "fideloper/proxy": "~3.3",
+ "guzzlehttp/guzzle": "^6.3",
+ "laravel/framework": "5.5.*",
+ "laravel/passport": "^4.0",
+ "laravel/tinker": "~1.0",
+ "maatwebsite/excel": "~2.1.0",
+ "overtrue/easy-sms": "^0.0.10",
+ "overtrue/laravel-pinyin": "~3.0",
+ "overtrue/laravel-wechat": "~4.0"
+ },
+ "require-dev": {
+ "filp/whoops": "~2.0",
+ "fzaninotto/faker": "~1.4",
+ "mockery/mockery": "0.9.*",
+ "phpunit/phpunit": "~6.0"
+ },
+ "autoload": {
+ "classmap": [
+ "database/seeds",
+ "database/factories"
+ ],
+ "psr-4": {
+ "App\\": "app/"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Tests\\": "tests/"
+ }
+ },
+ "extra": {
+ "laravel": {
+ "dont-discover": [
+ ]
+ }
+ },
+ "scripts": {
+ "post-root-package-install": [
+ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
+ ],
+ "post-create-project-cmd": [
+ "@php artisan key:generate"
+ ],
+ "post-autoload-dump": [
+ "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
+ "@php artisan package:discover"
+ ]
+ },
+ "config": {
+ "preferred-install": "dist",
+ "sort-packages": true,
+ "optimize-autoloader": true
+ }
+}
diff --git a/backend/composer.lock b/backend/composer.lock
new file mode 100644
index 00000000..b6f23c0f
--- /dev/null
+++ b/backend/composer.lock
@@ -0,0 +1,5940 @@
+{
+ "_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#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "b764e64f2e662c15484582131f71f67d",
+ "packages": [
+ {
+ "name": "barryvdh/laravel-cors",
+ "version": "v0.10.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/barryvdh/laravel-cors.git",
+ "reference": "1326460c591e5299d43e266de52a4141c5c66561"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/barryvdh/laravel-cors/1326460c591e5299d43e266de52a4141c5c66561.zip",
+ "reference": "1326460c591e5299d43e266de52a4141c5c66561",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/support": "5.3.x|5.4.x|5.5.x",
+ "php": ">=5.5.9",
+ "symfony/http-foundation": "~3.1",
+ "symfony/http-kernel": "~3.1"
+ },
+ "require-dev": {
+ "orchestra/testbench": "3.x",
+ "phpunit/phpunit": "^4.8|^5.2",
+ "squizlabs/php_codesniffer": "^2.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.10-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Barryvdh\\Cors\\ServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Barryvdh\\Cors\\": "src/"
+ },
+ "classmap": [
+ "tests"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Barry vd. Heuvel",
+ "email": "barryvdh@gmail.com"
+ }
+ ],
+ "description": "Adds CORS (Cross-Origin Resource Sharing) headers support in your Laravel application",
+ "keywords": [
+ "api",
+ "cors",
+ "crossdomain",
+ "laravel"
+ ],
+ "time": "2017-08-28T12:10:56+00:00"
+ },
+ {
+ "name": "defuse/php-encryption",
+ "version": "v2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/defuse/php-encryption.git",
+ "reference": "5176f5abb38d3ea8a6e3ac6cd3bbb54d8185a689"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/defuse/php-encryption/5176f5abb38d3ea8a6e3ac6cd3bbb54d8185a689.zip",
+ "reference": "5176f5abb38d3ea8a6e3ac6cd3bbb54d8185a689",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "paragonie/random_compat": "~2.0",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "nikic/php-parser": "^2.0|^3.0",
+ "phpunit/phpunit": "^4|^5"
+ },
+ "bin": [
+ "bin/generate-defuse-key"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Defuse\\Crypto\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Hornby",
+ "email": "taylor@defuse.ca",
+ "homepage": "https://defuse.ca/"
+ },
+ {
+ "name": "Scott Arciszewski",
+ "email": "info@paragonie.com",
+ "homepage": "https://paragonie.com"
+ }
+ ],
+ "description": "Secure PHP Encryption Library",
+ "keywords": [
+ "aes",
+ "authenticated encryption",
+ "cipher",
+ "crypto",
+ "cryptography",
+ "encrypt",
+ "encryption",
+ "openssl",
+ "security",
+ "symmetric key cryptography"
+ ],
+ "time": "2017-05-18T21:28:48+00:00"
+ },
+ {
+ "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://files.phpcomposer.com/files/dnoegel/php-xdg-base-dir/265b8593498b997dc2d31e75b89f053b5cc9621a.zip",
+ "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/annotations",
+ "version": "v1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/annotations.git",
+ "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/doctrine/annotations/c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5.zip",
+ "reference": "c7f2050c68a9ab0bdb0f98567ec08d80ea7d24d5",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "1.*",
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "doctrine/cache": "1.*",
+ "phpunit/phpunit": "^6.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations"
+ }
+ },
+ "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": "Docblock Annotations Parser",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "parser"
+ ],
+ "time": "2017-12-06T07:11:42+00:00"
+ },
+ {
+ "name": "doctrine/cache",
+ "version": "v1.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/cache.git",
+ "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/doctrine/cache/b3217d58609e9c8e661cd41357a54d926c4a2a1a.zip",
+ "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "~7.1"
+ },
+ "conflict": {
+ "doctrine/common": ">2.2,<2.4"
+ },
+ "require-dev": {
+ "alcaeus/mongo-php-adapter": "^1.1",
+ "mongodb/mongodb": "^1.1",
+ "phpunit/phpunit": "^5.7",
+ "predis/predis": "~1.0"
+ },
+ "suggest": {
+ "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
+ }
+ },
+ "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": "Caching library offering an object-oriented API for many cache backends",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "cache",
+ "caching"
+ ],
+ "time": "2017-08-25T07:02:50+00:00"
+ },
+ {
+ "name": "doctrine/collections",
+ "version": "v1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/collections.git",
+ "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/doctrine/collections/a01ee38fcd999f34d9bfbcee59dbda5105449cbf.zip",
+ "reference": "a01ee38fcd999f34d9bfbcee59dbda5105449cbf",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "~0.1@dev",
+ "phpunit/phpunit": "^5.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Collections\\": "lib/"
+ }
+ },
+ "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": "Collections Abstraction library",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "array",
+ "collections",
+ "iterator"
+ ],
+ "time": "2017-07-22T10:37:32+00:00"
+ },
+ {
+ "name": "doctrine/common",
+ "version": "v2.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/common.git",
+ "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/doctrine/common/f68c297ce6455e8fd794aa8ffaf9fa458f6ade66.zip",
+ "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/annotations": "1.*",
+ "doctrine/cache": "1.*",
+ "doctrine/collections": "1.*",
+ "doctrine/inflector": "1.*",
+ "doctrine/lexer": "1.*",
+ "php": "~7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.8.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\": "lib/Doctrine/Common"
+ }
+ },
+ "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 Library for Doctrine projects",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "annotations",
+ "collections",
+ "eventmanager",
+ "persistence",
+ "spl"
+ ],
+ "time": "2017-08-31T08:43:38+00:00"
+ },
+ {
+ "name": "doctrine/dbal",
+ "version": "v2.6.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/dbal.git",
+ "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/doctrine/dbal/e3eed9b1facbb0ced3a0995244843a189e7d1b13.zip",
+ "reference": "e3eed9b1facbb0ced3a0995244843a189e7d1b13",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/common": "^2.7.1",
+ "ext-pdo": "*",
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.4.6",
+ "phpunit/phpunit-mock-objects": "!=3.2.4,!=3.2.5",
+ "symfony/console": "2.*||^3.0"
+ },
+ "suggest": {
+ "symfony/console": "For helpful console commands such as SQL execution and import of files."
+ },
+ "bin": [
+ "bin/doctrine-dbal"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\DBAL\\": "lib/"
+ }
+ },
+ "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"
+ }
+ ],
+ "description": "Database Abstraction Layer",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "database",
+ "dbal",
+ "persistence",
+ "queryobject"
+ ],
+ "time": "2017-11-19T13:38:54+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://files.phpcomposer.com/files/doctrine/inflector/e11d84c6e018beedd929cff5220969a3c6d1d462.zip",
+ "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": "doctrine/lexer",
+ "version": "v1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/doctrine/lexer/83893c552fd2045dd78aef794c31e694c37c0b8c.zip",
+ "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Lexer\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "lexer",
+ "parser"
+ ],
+ "time": "2014-09-09T13:34:57+00:00"
+ },
+ {
+ "name": "easywechat-composer/easywechat-composer",
+ "version": "0.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mingyoung/easywechat-composer.git",
+ "reference": "1ead4ea961efbcdb8e8e58c5a7b66503af32b641"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/mingyoung/easywechat-composer/1ead4ea961efbcdb8e8e58c5a7b66503af32b641.zip",
+ "reference": "1ead4ea961efbcdb8e8e58c5a7b66503af32b641",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0",
+ "php": ">=7.0"
+ },
+ "require-dev": {
+ "composer/composer": "^1.0"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "EasyWeChatComposer\\Plugin"
+ },
+ "autoload": {
+ "psr-4": {
+ "EasyWeChatComposer\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "MINGYOUNG",
+ "email": "mingyoungcheung@gmail.com"
+ }
+ ],
+ "description": "The composer plugin for EasyWeChat",
+ "time": "2017-12-12T12:19:39+00:00"
+ },
+ {
+ "name": "egulias/email-validator",
+ "version": "2.1.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/egulias/EmailValidator.git",
+ "reference": "1bec00a10039b823cc94eef4eddd47dcd3b2ca04"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/egulias/EmailValidator/1bec00a10039b823cc94eef4eddd47dcd3b2ca04.zip",
+ "reference": "1bec00a10039b823cc94eef4eddd47dcd3b2ca04",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "^1.0.1",
+ "php": ">= 5.5"
+ },
+ "require-dev": {
+ "dominicsayers/isemail": "dev-master",
+ "phpunit/phpunit": "^4.8.35",
+ "satooshi/php-coveralls": "^1.0.1"
+ },
+ "suggest": {
+ "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Egulias\\EmailValidator\\": "EmailValidator"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eduardo Gulias Davis"
+ }
+ ],
+ "description": "A library for validating emails against several RFCs",
+ "homepage": "https://github.com/egulias/EmailValidator",
+ "keywords": [
+ "email",
+ "emailvalidation",
+ "emailvalidator",
+ "validation",
+ "validator"
+ ],
+ "time": "2017-11-15T23:40:40+00:00"
+ },
+ {
+ "name": "erusev/parsedown",
+ "version": "1.6.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/erusev/parsedown.git",
+ "reference": "fbe3fe878f4fe69048bb8a52783a09802004f548"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/erusev/parsedown/fbe3fe878f4fe69048bb8a52783a09802004f548.zip",
+ "reference": "fbe3fe878f4fe69048bb8a52783a09802004f548",
+ "shasum": ""
+ },
+ "require": {
+ "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": "2017-11-14T20:44:03+00:00"
+ },
+ {
+ "name": "fideloper/proxy",
+ "version": "3.3.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fideloper/TrustedProxy.git",
+ "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/fideloper/TrustedProxy/9cdf6f118af58d89764249bbcc7bb260c132924f.zip",
+ "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/contracts": "~5.0",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "illuminate/http": "~5.0",
+ "mockery/mockery": "~0.9.3",
+ "phpunit/phpunit": "^5.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Fideloper\\Proxy\\TrustedProxyServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Fideloper\\Proxy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Chris Fidao",
+ "email": "fideloper@gmail.com"
+ }
+ ],
+ "description": "Set trusted proxies for Laravel",
+ "keywords": [
+ "load balancing",
+ "proxy",
+ "trusted proxy"
+ ],
+ "time": "2017-06-15T17:19:42+00:00"
+ },
+ {
+ "name": "firebase/php-jwt",
+ "version": "v5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/firebase/php-jwt.git",
+ "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/firebase/php-jwt/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e.zip",
+ "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": " 4.8.35"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Firebase\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Neuman Vong",
+ "email": "neuman+pear@twilio.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Anant Narayanan",
+ "email": "anant@php.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+ "homepage": "https://github.com/firebase/php-jwt",
+ "time": "2017-06-27T22:17:23+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "6.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/guzzle/guzzle/f4db5a78a5ea468d4831de7f0bf9d9415e348699.zip",
+ "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/promises": "^1.0",
+ "guzzlehttp/psr7": "^1.4",
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "^4.0 || ^5.0",
+ "psr/log": "^1.0"
+ },
+ "suggest": {
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.2-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ],
+ "time": "2017-06-22T18:50:49+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "v1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/guzzle/promises/a59da6cf61d80060647ff4d3eb2c03a2bc694646.zip",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "time": "2016-12-20T10:07:11+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/guzzle/psr7/f5b8a8512e2b58b0071a7280e39f14f72e05d87c.zip",
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "time": "2017-03-20T17:10:46+00:00"
+ },
+ {
+ "name": "jakub-onderka/php-console-color",
+ "version": "0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JakubOnderka/PHP-Console-Color.git",
+ "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/JakubOnderka/PHP-Console-Color/e0b393dacf7703fc36a4efc3df1435485197e6c1.zip",
+ "reference": "e0b393dacf7703fc36a4efc3df1435485197e6c1",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "jakub-onderka/php-code-style": "1.0",
+ "jakub-onderka/php-parallel-lint": "0.*",
+ "jakub-onderka/php-var-dump-check": "0.*",
+ "phpunit/phpunit": "3.7.*",
+ "squizlabs/php_codesniffer": "1.*"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "JakubOnderka\\PhpConsoleColor": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jakub Onderka",
+ "email": "jakub.onderka@gmail.com",
+ "homepage": "http://www.acci.cz"
+ }
+ ],
+ "time": "2014-04-08T15:00:19+00:00"
+ },
+ {
+ "name": "jakub-onderka/php-console-highlighter",
+ "version": "v0.3.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/JakubOnderka/PHP-Console-Highlighter.git",
+ "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/JakubOnderka/PHP-Console-Highlighter/7daa75df45242c8d5b75a22c00a201e7954e4fb5.zip",
+ "reference": "7daa75df45242c8d5b75a22c00a201e7954e4fb5",
+ "shasum": ""
+ },
+ "require": {
+ "jakub-onderka/php-console-color": "~0.1",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "jakub-onderka/php-code-style": "~1.0",
+ "jakub-onderka/php-parallel-lint": "~0.5",
+ "jakub-onderka/php-var-dump-check": "~0.1",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~1.5"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "JakubOnderka\\PhpConsoleHighlighter": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jakub Onderka",
+ "email": "acci@acci.cz",
+ "homepage": "http://www.acci.cz/"
+ }
+ ],
+ "time": "2015-04-20T18:58:01+00:00"
+ },
+ {
+ "name": "jeremeamia/SuperClosure",
+ "version": "2.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jeremeamia/super_closure.git",
+ "reference": "443c3df3207f176a1b41576ee2a66968a507b3db"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/jeremeamia/super_closure/443c3df3207f176a1b41576ee2a66968a507b3db.zip",
+ "reference": "443c3df3207f176a1b41576ee2a66968a507b3db",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^1.2|^2.0|^3.0",
+ "php": ">=5.4",
+ "symfony/polyfill-php56": "^1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.0|^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "SuperClosure\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jeremy Lindblom",
+ "email": "jeremeamia@gmail.com",
+ "homepage": "https://github.com/jeremeamia",
+ "role": "Developer"
+ }
+ ],
+ "description": "Serialize Closure objects, including their context and binding",
+ "homepage": "https://github.com/jeremeamia/super_closure",
+ "keywords": [
+ "closure",
+ "function",
+ "lambda",
+ "parser",
+ "serializable",
+ "serialize",
+ "tokenizer"
+ ],
+ "time": "2016-12-07T09:37:55+00:00"
+ },
+ {
+ "name": "laravel/framework",
+ "version": "v5.5.26",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/framework.git",
+ "reference": "d7e6a7aab600c5cfae595ea22074ac3c536cbc28"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/laravel/framework/d7e6a7aab600c5cfae595ea22074ac3c536cbc28.zip",
+ "reference": "d7e6a7aab600c5cfae595ea22074ac3c536cbc28",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/inflector": "~1.1",
+ "erusev/parsedown": "~1.6",
+ "ext-mbstring": "*",
+ "ext-openssl": "*",
+ "league/flysystem": "~1.0",
+ "monolog/monolog": "~1.12",
+ "mtdowling/cron-expression": "~1.0",
+ "nesbot/carbon": "~1.20",
+ "php": ">=7.0",
+ "psr/container": "~1.0",
+ "psr/simple-cache": "^1.0",
+ "ramsey/uuid": "~3.0",
+ "swiftmailer/swiftmailer": "~6.0",
+ "symfony/console": "~3.3",
+ "symfony/debug": "~3.3",
+ "symfony/finder": "~3.3",
+ "symfony/http-foundation": "~3.3",
+ "symfony/http-kernel": "~3.3",
+ "symfony/process": "~3.3",
+ "symfony/routing": "~3.3",
+ "symfony/var-dumper": "~3.3",
+ "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/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",
+ "filp/whoops": "^2.1.4",
+ "mockery/mockery": "~1.0",
+ "orchestra/testbench-core": "3.5.*",
+ "pda/pheanstalk": "~3.0",
+ "phpunit/phpunit": "~6.0",
+ "predis/predis": "^1.1.1",
+ "symfony/css-selector": "~3.3",
+ "symfony/dom-crawler": "~3.3"
+ },
+ "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).",
+ "ext-pcntl": "Required to use all features of the queue worker.",
+ "ext-posix": "Required to use all features of the queue worker.",
+ "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-cached-adapter": "Required to use Flysystem caching (~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 (~3.0).",
+ "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).",
+ "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).",
+ "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.5-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-12-18T14:15:59+00:00"
+ },
+ {
+ "name": "laravel/passport",
+ "version": "v4.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/passport.git",
+ "reference": "0542f1f82edfbf857d0197c34a3d41f549aff30a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/laravel/passport/0542f1f82edfbf857d0197c34a3d41f549aff30a.zip",
+ "reference": "0542f1f82edfbf857d0197c34a3d41f549aff30a",
+ "shasum": ""
+ },
+ "require": {
+ "firebase/php-jwt": "~3.0|~4.0|~5.0",
+ "guzzlehttp/guzzle": "~6.0",
+ "illuminate/auth": "~5.4",
+ "illuminate/console": "~5.4",
+ "illuminate/container": "~5.4",
+ "illuminate/contracts": "~5.4",
+ "illuminate/database": "~5.4",
+ "illuminate/encryption": "~5.4",
+ "illuminate/http": "~5.4",
+ "illuminate/support": "~5.4",
+ "league/oauth2-server": "^6.0",
+ "php": ">=5.6.4",
+ "phpseclib/phpseclib": "^2.0",
+ "symfony/psr-http-message-bridge": "~1.0",
+ "zendframework/zend-diactoros": "~1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9",
+ "phpunit/phpunit": "~5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ },
+ "laravel": {
+ "providers": [
+ "Laravel\\Passport\\PassportServiceProvider"
+ ]
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Laravel\\Passport\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "Laravel Passport provides OAuth2 server support to Laravel.",
+ "keywords": [
+ "laravel",
+ "oauth",
+ "passport"
+ ],
+ "time": "2017-09-24T14:21:39+00:00"
+ },
+ {
+ "name": "laravel/tinker",
+ "version": "v1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/laravel/tinker.git",
+ "reference": "852c2abe0b0991555a403f1c0583e64de6acb4a6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/laravel/tinker/852c2abe0b0991555a403f1c0583e64de6acb4a6.zip",
+ "reference": "852c2abe0b0991555a403f1c0583e64de6acb4a6",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/console": "~5.1",
+ "illuminate/contracts": "~5.1",
+ "illuminate/support": "~5.1",
+ "php": ">=5.5.9",
+ "psy/psysh": "0.7.*|0.8.*",
+ "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": "2017-12-18T16:25:11+00:00"
+ },
+ {
+ "name": "lcobucci/jwt",
+ "version": "3.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/lcobucci/jwt.git",
+ "reference": "0b5930be73582369e10c4d4bb7a12bac927a203c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/lcobucci/jwt/0b5930be73582369e10c4d4bb7a12bac927a203c.zip",
+ "reference": "0b5930be73582369e10c4d4bb7a12bac927a203c",
+ "shasum": ""
+ },
+ "require": {
+ "ext-openssl": "*",
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "mdanter/ecc": "~0.3.1",
+ "mikey179/vfsstream": "~1.5",
+ "phpmd/phpmd": "~2.2",
+ "phpunit/php-invoker": "~1.1",
+ "phpunit/phpunit": "~4.5",
+ "squizlabs/php_codesniffer": "~2.3"
+ },
+ "suggest": {
+ "mdanter/ecc": "Required to use Elliptic Curves based algorithms."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Lcobucci\\JWT\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Luís Otávio Cobucci Oblonczyk",
+ "email": "lcobucci@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to work with JSON Web Token and JSON Web Signature",
+ "keywords": [
+ "JWS",
+ "jwt"
+ ],
+ "time": "2017-09-01T08:23:26+00:00"
+ },
+ {
+ "name": "league/event",
+ "version": "2.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/event.git",
+ "reference": "e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/thephpleague/event/e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd.zip",
+ "reference": "e4bfc88dbcb60c8d8a2939a71f9813e141bbe4cd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "henrikbjorn/phpspec-code-coverage": "~1.0.1",
+ "phpspec/phpspec": "~2.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "League\\Event\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Frank de Jonge",
+ "email": "info@frenky.net"
+ }
+ ],
+ "description": "Event package",
+ "keywords": [
+ "emitter",
+ "event",
+ "listener"
+ ],
+ "time": "2015-05-21T12:24:47+00:00"
+ },
+ {
+ "name": "league/flysystem",
+ "version": "1.0.41",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/flysystem.git",
+ "reference": "f400aa98912c561ba625ea4065031b7a41e5a155"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/thephpleague/flysystem/f400aa98912c561ba625ea4065031b7a41e5a155.zip",
+ "reference": "f400aa98912c561ba625ea4065031b7a41e5a155",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "conflict": {
+ "league/flysystem-sftp": "<1.0.6"
+ },
+ "require-dev": {
+ "ext-fileinfo": "*",
+ "mockery/mockery": "~0.9",
+ "phpspec/phpspec": "^2.2",
+ "phpunit/phpunit": "~4.8"
+ },
+ "suggest": {
+ "ext-fileinfo": "Required for MimeType",
+ "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": "2017-08-06T17:41:04+00:00"
+ },
+ {
+ "name": "league/oauth2-server",
+ "version": "6.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/thephpleague/oauth2-server.git",
+ "reference": "925776958fc3f5278e74363663c20147af32b668"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/thephpleague/oauth2-server/925776958fc3f5278e74363663c20147af32b668.zip",
+ "reference": "925776958fc3f5278e74363663c20147af32b668",
+ "shasum": ""
+ },
+ "require": {
+ "defuse/php-encryption": "^2.1",
+ "ext-openssl": "*",
+ "lcobucci/jwt": "^3.1",
+ "league/event": "^2.1",
+ "paragonie/random_compat": "^2.0",
+ "php": ">=5.6.0",
+ "psr/http-message": "^1.0"
+ },
+ "replace": {
+ "league/oauth2server": "*",
+ "lncd/oauth2": "*"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8 || ^5.0",
+ "zendframework/zend-diactoros": "^1.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "League\\OAuth2\\Server\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Alex Bilbie",
+ "email": "hello@alexbilbie.com",
+ "homepage": "http://www.alexbilbie.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "A lightweight and powerful OAuth 2.0 authorization and resource server library with support for all the core specification grants. This library will allow you to secure your API with OAuth and allow your applications users to approve apps that want to access their data from your API.",
+ "homepage": "https://oauth2.thephpleague.com/",
+ "keywords": [
+ "Authentication",
+ "api",
+ "auth",
+ "authorisation",
+ "authorization",
+ "oauth",
+ "oauth 2",
+ "oauth 2.0",
+ "oauth2",
+ "protect",
+ "resource",
+ "secure",
+ "server"
+ ],
+ "time": "2017-08-03T15:09:23+00:00"
+ },
+ {
+ "name": "maatwebsite/excel",
+ "version": "2.1.23",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Maatwebsite/Laravel-Excel.git",
+ "reference": "8682c955601b6de15a8c7d6e373b927cc8380627"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/Maatwebsite/Laravel-Excel/8682c955601b6de15a8c7d6e373b927cc8380627.zip",
+ "reference": "8682c955601b6de15a8c7d6e373b927cc8380627",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/cache": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*",
+ "illuminate/config": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*",
+ "illuminate/filesystem": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*",
+ "illuminate/support": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*",
+ "jeremeamia/superclosure": "^2.3",
+ "nesbot/carbon": "~1.0",
+ "php": ">=5.5",
+ "phpoffice/phpexcel": "1.8.*",
+ "tijsverkoyen/css-to-inline-styles": "~2.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9",
+ "orchestra/testbench": "3.1.*|3.2.*|3.3.*|3.4.*|3.5.*",
+ "phpseclib/phpseclib": "~1.0",
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "illuminate/http": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*",
+ "illuminate/queue": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*",
+ "illuminate/routing": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*",
+ "illuminate/view": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Maatwebsite\\Excel\\ExcelServiceProvider"
+ ],
+ "aliases": {
+ "Excel": "Maatwebsite\\Excel\\Facades\\Excel"
+ }
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/Maatwebsite/Excel"
+ ],
+ "psr-0": {
+ "Maatwebsite\\Excel\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Maatwebsite.nl",
+ "email": "patrick@maatwebsite.nl"
+ }
+ ],
+ "description": "An eloquent way of importing and exporting Excel and CSV in Laravel 4 with the power of PHPExcel",
+ "keywords": [
+ "PHPExcel",
+ "batch",
+ "csv",
+ "excel",
+ "export",
+ "import",
+ "laravel"
+ ],
+ "time": "2017-09-19T19:36:48+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "1.23.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/Seldaek/monolog/fd8c787753b3a2ad11bc60c063cff1358a32a3b4.zip",
+ "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
+ "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": "2017-06-19T01:22:40+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://files.phpcomposer.com/files/mtdowling/cron-expression/9504fa9ea681b586028adaaa0877db4aecf32bad.zip",
+ "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.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/briannesbitt/Carbon.git",
+ "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/briannesbitt/Carbon/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc.zip",
+ "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "symfony/translation": "~2.6 || ~3.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "~2",
+ "phpunit/phpunit": "~4.0 || ~5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.23-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Carbon\\": "src/Carbon/"
+ }
+ },
+ "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": "2017-01-16T07:55:07+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v3.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "08131e7ff29de6bb9f12275c7d35df71f25f4d89"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/nikic/PHP-Parser/08131e7ff29de6bb9f12275c7d35df71f25f4d89.zip",
+ "reference": "08131e7ff29de6bb9f12275c7d35df71f25f4d89",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0|~5.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-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": "2017-11-04T11:48:34+00:00"
+ },
+ {
+ "name": "overtrue/easy-sms",
+ "version": "0.0.10",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/overtrue/easy-sms.git",
+ "reference": "7bea586e6db90f611f2df2e8b68aebcecf509b26"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/overtrue/easy-sms/7bea586e6db90f611f2df2e8b68aebcecf509b26.zip",
+ "reference": "7bea586e6db90f611f2df2e8b68aebcecf509b26",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "^6.2",
+ "php": ">=5.6"
+ },
+ "require-dev": {
+ "mockery/mockery": "1.0.x-dev",
+ "phpunit/phpunit": "^5.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Overtrue\\EasySms\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "overtrue",
+ "email": "i@overtrue.me"
+ }
+ ],
+ "description": "The easiest way to send short message.",
+ "time": "2017-11-14T03:45:11+00:00"
+ },
+ {
+ "name": "overtrue/laravel-pinyin",
+ "version": "3.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/overtrue/laravel-pinyin.git",
+ "reference": "4ca98a67cc2cd53ce98ee43dddbc5f5093cdbacc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/overtrue/laravel-pinyin/4ca98a67cc2cd53ce98ee43dddbc5f5093cdbacc.zip",
+ "reference": "4ca98a67cc2cd53ce98ee43dddbc5f5093cdbacc",
+ "shasum": ""
+ },
+ "require": {
+ "overtrue/pinyin": "~3.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Overtrue\\LaravelPinyin\\ServiceProvider"
+ ],
+ "aliases": {
+ "Pinyin": "Overtrue\\LaravelPinyin\\Facades\\Pinyin"
+ }
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Overtrue\\LaravelPinyin\\": "src/"
+ },
+ "files": [
+ "src/helpers.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "overtrue",
+ "email": "anzhengchao@gmail.com"
+ }
+ ],
+ "description": "Chinese to Pinyin translator.",
+ "keywords": [
+ "Chinese",
+ "Pinyin",
+ "laravel",
+ "overtrue"
+ ],
+ "time": "2017-07-02T22:06:52+00:00"
+ },
+ {
+ "name": "overtrue/laravel-wechat",
+ "version": "4.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/overtrue/laravel-wechat.git",
+ "reference": "f62800270e6e2d52cbf162e24c37fa09420651d2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/overtrue/laravel-wechat/f62800270e6e2d52cbf162e24c37fa09420651d2.zip",
+ "reference": "f62800270e6e2d52cbf162e24c37fa09420651d2",
+ "shasum": ""
+ },
+ "require": {
+ "illuminate/container": "^5.1",
+ "overtrue/wechat": "^4.0"
+ },
+ "type": "library",
+ "extra": {
+ "laravel": {
+ "providers": [
+ "Overtrue\\LaravelWeChat\\ServiceProvider"
+ ],
+ "aliases": {
+ "EasyWeChat": "Overtrue\\LaravelWeChat\\Facade"
+ }
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Overtrue\\LaravelWeChat\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "overtrue",
+ "email": "anzhengchao@gmail.com"
+ }
+ ],
+ "description": "微信 SDK for Laravel",
+ "keywords": [
+ "laravel",
+ "sdk",
+ "wechat",
+ "weixin"
+ ],
+ "time": "2017-12-12T04:13:25+00:00"
+ },
+ {
+ "name": "overtrue/pinyin",
+ "version": "3.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/overtrue/pinyin.git",
+ "reference": "3b781d267197b74752daa32814d3a2cf5d140779"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/overtrue/pinyin/3b781d267197b74752daa32814d3a2cf5d140779.zip",
+ "reference": "3b781d267197b74752daa32814d3a2cf5d140779",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Overtrue\\Pinyin\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Carlos",
+ "homepage": "http://github.com/overtrue"
+ }
+ ],
+ "description": "Chinese to pinyin translator.",
+ "homepage": "https://github.com/overtrue/pinyin",
+ "keywords": [
+ "Chinese",
+ "Pinyin",
+ "cn2pinyin"
+ ],
+ "time": "2017-07-10T07:20:01+00:00"
+ },
+ {
+ "name": "overtrue/socialite",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/overtrue/socialite.git",
+ "reference": "5e4bb8676a8ebd696d2a8c94c0483d44c2ade0ac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/overtrue/socialite/5e4bb8676a8ebd696d2a8c94c0483d44c2ade0ac.zip",
+ "reference": "5e4bb8676a8ebd696d2a8c94c0483d44c2ade0ac",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "~5.0|~6.0",
+ "php": ">=7.0",
+ "symfony/http-foundation": "^2.7|^3.0|^4.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9",
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Overtrue\\Socialite\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "overtrue",
+ "email": "anzhengchao@gmail.com"
+ }
+ ],
+ "description": "A collection of OAuth 2 packages that extracts from laravel/socialite.",
+ "keywords": [
+ "login",
+ "oauth",
+ "qq",
+ "social",
+ "wechat",
+ "weibo"
+ ],
+ "time": "2017-12-17T11:50:08+00:00"
+ },
+ {
+ "name": "overtrue/wechat",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/overtrue/wechat.git",
+ "reference": "14df5b4b8077c6480b73039ff17af459b9bd3251"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/overtrue/wechat/14df5b4b8077c6480b73039ff17af459b9bd3251.zip",
+ "reference": "14df5b4b8077c6480b73039ff17af459b9bd3251",
+ "shasum": ""
+ },
+ "require": {
+ "easywechat-composer/easywechat-composer": "^0.1",
+ "ext-openssl": "*",
+ "ext-simplexml": "*",
+ "guzzlehttp/guzzle": "^6.2",
+ "monolog/monolog": "^1.22",
+ "overtrue/socialite": "^2.0",
+ "php": ">=7.0",
+ "pimple/pimple": "^3.0",
+ "psr/simple-cache": "^1.0",
+ "symfony/cache": "^3.0|^4.0",
+ "symfony/http-foundation": "^3.0|^4.0",
+ "symfony/psr-http-message-bridge": "^0.3|^1.0"
+ },
+ "require-dev": {
+ "mikey179/vfsstream": "^1.6",
+ "mockery/mockery": "^1.0",
+ "overtrue/phplint": "dev-master",
+ "phpunit/phpunit": "~6.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "EasyWeChat\\": "src/"
+ },
+ "files": [
+ "src/Kernel/Support/Helpers.php",
+ "src/Kernel/Helpers.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "overtrue",
+ "email": "anzhengchao@gmail.com"
+ }
+ ],
+ "description": "微信SDK",
+ "keywords": [
+ "sdk",
+ "wechat",
+ "weixin",
+ "weixin-sdk"
+ ],
+ "time": "2017-12-14T15:58:55+00:00"
+ },
+ {
+ "name": "paragonie/random_compat",
+ "version": "v2.0.11",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/random_compat.git",
+ "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/paragonie/random_compat/5da4d3c796c275c55f057af5a643ae297d96b4d8.zip",
+ "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8",
+ "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",
+ "pseudorandom",
+ "random"
+ ],
+ "time": "2017-09-27T21:40:39+00:00"
+ },
+ {
+ "name": "phpoffice/phpexcel",
+ "version": "1.8.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPOffice/PHPExcel.git",
+ "reference": "372c7cbb695a6f6f1e62649381aeaa37e7e70b32"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/PHPOffice/PHPExcel/372c7cbb695a6f6f1e62649381aeaa37e7e70b32.zip",
+ "reference": "372c7cbb695a6f6f1e62649381aeaa37e7e70b32",
+ "shasum": ""
+ },
+ "require": {
+ "ext-xml": "*",
+ "ext-xmlwriter": "*",
+ "php": ">=5.2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "PHPExcel": "Classes/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL"
+ ],
+ "authors": [
+ {
+ "name": "Maarten Balliauw",
+ "homepage": "http://blog.maartenballiauw.be"
+ },
+ {
+ "name": "Mark Baker"
+ },
+ {
+ "name": "Franck Lefevre",
+ "homepage": "http://blog.rootslabs.net"
+ },
+ {
+ "name": "Erik Tilt"
+ }
+ ],
+ "description": "PHPExcel - OpenXML - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine",
+ "homepage": "http://phpexcel.codeplex.com",
+ "keywords": [
+ "OpenXML",
+ "excel",
+ "php",
+ "spreadsheet",
+ "xls",
+ "xlsx"
+ ],
+ "time": "2015-05-01T07:00:55+00:00"
+ },
+ {
+ "name": "phpseclib/phpseclib",
+ "version": "2.0.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpseclib/phpseclib.git",
+ "reference": "c9a3fe35e20eb6eeaca716d6a23cde03f52d1558"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/phpseclib/phpseclib/c9a3fe35e20eb6eeaca716d6a23cde03f52d1558.zip",
+ "reference": "c9a3fe35e20eb6eeaca716d6a23cde03f52d1558",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phing/phing": "~2.7",
+ "phpunit/phpunit": "~4.0",
+ "sami/sami": "~2.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "suggest": {
+ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.",
+ "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.",
+ "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.",
+ "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations."
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "phpseclib/bootstrap.php"
+ ],
+ "psr-4": {
+ "phpseclib\\": "phpseclib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jim Wigginton",
+ "email": "terrafrost@php.net",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Patrick Monnerat",
+ "email": "pm@datasphere.ch",
+ "role": "Developer"
+ },
+ {
+ "name": "Andreas Fischer",
+ "email": "bantu@phpbb.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Hans-Jürgen Petrich",
+ "email": "petrich@tronic-media.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Graham Campbell",
+ "email": "graham@alt-three.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.",
+ "homepage": "http://phpseclib.sourceforge.net",
+ "keywords": [
+ "BigInteger",
+ "aes",
+ "asn.1",
+ "asn1",
+ "blowfish",
+ "crypto",
+ "cryptography",
+ "encryption",
+ "rsa",
+ "security",
+ "sftp",
+ "signature",
+ "signing",
+ "ssh",
+ "twofish",
+ "x.509",
+ "x509"
+ ],
+ "time": "2017-11-29T06:38:08+00:00"
+ },
+ {
+ "name": "pimple/pimple",
+ "version": "v3.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/silexphp/Pimple.git",
+ "reference": "4d45fb62d96418396ec58ba76e6f065bca16e10a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/silexphp/Pimple/4d45fb62d96418396ec58ba76e6f065bca16e10a.zip",
+ "reference": "4d45fb62d96418396ec58ba76e6f065bca16e10a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "psr/container": "^1.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "^3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Pimple": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "Pimple, a simple Dependency Injection Container",
+ "homepage": "http://pimple.sensiolabs.org",
+ "keywords": [
+ "container",
+ "dependency injection"
+ ],
+ "time": "2017-07-23T07:32:15+00:00"
+ },
+ {
+ "name": "psr/cache",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/cache.git",
+ "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/php-fig/cache/d11b50ad223250cf17b86e38383413f5a6764bf8.zip",
+ "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Cache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for caching libraries",
+ "keywords": [
+ "cache",
+ "psr",
+ "psr-6"
+ ],
+ "time": "2016-08-06T20:24:11+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/php-fig/container/b7ce3b176482dbbc1245ebf52b181af44c2cf55f.zip",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/php-fig/http-message/f6561bf28d520154e4b0ec72be95418abe6d9363.zip",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "time": "2016-08-06T14:39:51+00:00"
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/php-fig/log/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d.zip",
+ "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.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": "2016-10-10T12:19:37+00:00"
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/php-fig/simple-cache/753fa598e8f3b9966c886fe13f370baa45ef0e24.zip",
+ "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ],
+ "time": "2017-01-02T13:31:39+00:00"
+ },
+ {
+ "name": "psy/psysh",
+ "version": "v0.8.16",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/bobthecow/psysh.git",
+ "reference": "d4c8eab0683dc056f2ca54ca67f5388527c068b1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/bobthecow/psysh/d4c8eab0683dc056f2ca54ca67f5388527c068b1.zip",
+ "reference": "d4c8eab0683dc056f2ca54ca67f5388527c068b1",
+ "shasum": ""
+ },
+ "require": {
+ "dnoegel/php-xdg-base-dir": "0.1",
+ "jakub-onderka/php-console-highlighter": "0.3.*",
+ "nikic/php-parser": "~1.3|~2.0|~3.0",
+ "php": ">=5.3.9",
+ "symfony/console": "~2.3.10|^2.4.2|~3.0|~4.0",
+ "symfony/var-dumper": "~2.7|~3.0|~4.0"
+ },
+ "require-dev": {
+ "hoa/console": "~3.16|~1.14",
+ "phpunit/phpunit": "^4.8.35|^5.4.3",
+ "symfony/finder": "~2.1|~3.0|~4.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.8.x-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Psy/functions.php"
+ ],
+ "psr-4": {
+ "Psy\\": "src/Psy/"
+ }
+ },
+ "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": "2017-12-10T21:49:27+00:00"
+ },
+ {
+ "name": "ramsey/uuid",
+ "version": "3.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/ramsey/uuid.git",
+ "reference": "45cffe822057a09e05f7bd09ec5fb88eeecd2334"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/ramsey/uuid/45cffe822057a09e05f7bd09ec5fb88eeecd2334.zip",
+ "reference": "45cffe822057a09e05f7bd09ec5fb88eeecd2334",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/random_compat": "^1.0|^2.0",
+ "php": "^5.4 || ^7.0"
+ },
+ "replace": {
+ "rhumsaa/uuid": "self.version"
+ },
+ "require-dev": {
+ "apigen/apigen": "^4.1",
+ "codeception/aspect-mock": "^1.0 | ^2.0",
+ "doctrine/annotations": "~1.2.0",
+ "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1",
+ "ircmaxell/random-lib": "^1.1",
+ "jakub-onderka/php-parallel-lint": "^0.9.0",
+ "mockery/mockery": "^0.9.4",
+ "moontoast/math": "^1.1",
+ "php-mock/php-mock-phpunit": "^0.3|^1.1",
+ "phpunit/phpunit": "^4.7|>=5.0 <5.4",
+ "satooshi/php-coveralls": "^0.6.1",
+ "squizlabs/php_codesniffer": "^2.3"
+ },
+ "suggest": {
+ "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": "2017-09-22T20:46:04+00:00"
+ },
+ {
+ "name": "swiftmailer/swiftmailer",
+ "version": "v6.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/swiftmailer/swiftmailer.git",
+ "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/swiftmailer/swiftmailer/412333372fb6c8ffb65496a2bbd7321af75733fc.zip",
+ "reference": "412333372fb6c8ffb65496a2bbd7321af75733fc",
+ "shasum": ""
+ },
+ "require": {
+ "egulias/email-validator": "~2.0",
+ "php": ">=7.0.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "~0.9.1",
+ "symfony/phpunit-bridge": "~3.3@dev"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.0-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": "http://swiftmailer.symfony.com",
+ "keywords": [
+ "email",
+ "mail",
+ "mailer"
+ ],
+ "time": "2017-09-30T22:39:41+00:00"
+ },
+ {
+ "name": "symfony/cache",
+ "version": "v4.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/cache.git",
+ "reference": "d00351f230ca037ca13f6fec3411e002043f7421"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/cache/d00351f230ca037ca13f6fec3411e002043f7421.zip",
+ "reference": "d00351f230ca037ca13f6fec3411e002043f7421",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3",
+ "psr/cache": "~1.0",
+ "psr/log": "~1.0",
+ "psr/simple-cache": "^1.0"
+ },
+ "conflict": {
+ "symfony/var-dumper": "<3.4"
+ },
+ "provide": {
+ "psr/cache-implementation": "1.0",
+ "psr/simple-cache-implementation": "1.0"
+ },
+ "require-dev": {
+ "cache/integration-tests": "dev-master",
+ "doctrine/cache": "~1.6",
+ "doctrine/dbal": "~2.4",
+ "predis/predis": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Cache\\": ""
+ },
+ "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 Cache component with PSR-6, PSR-16, and tags",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "caching",
+ "psr6"
+ ],
+ "time": "2017-12-08T16:11:45+00:00"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v3.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "9f21adfb92a9315b73ae2ed43138988ee4913d4e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/console/9f21adfb92a9315b73ae2ed43138988ee4913d4e.zip",
+ "reference": "9f21adfb92a9315b73ae2ed43138988ee4913d4e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8",
+ "symfony/debug": "~2.8|~3.0|~4.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.4",
+ "symfony/process": "<3.3"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~3.3|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
+ "symfony/lock": "~3.4|~4.0",
+ "symfony/process": "~3.3|~4.0"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/lock": "",
+ "symfony/process": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-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-12-14T19:40:10+00:00"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v3.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "eac760b414cf1f64362c3dd047b989e4db121332"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/css-selector/eac760b414cf1f64362c3dd047b989e4db121332.zip",
+ "reference": "eac760b414cf1f64362c3dd047b989e4db121332",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-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-12-14T19:40:10+00:00"
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v3.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "543deab3ffff94402440b326fc94153bae2dfa7a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/debug/543deab3ffff94402440b326fc94153bae2dfa7a.zip",
+ "reference": "543deab3ffff94402440b326fc94153bae2dfa7a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8",
+ "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|~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-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-12-12T08:27:14+00:00"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v4.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/event-dispatcher/d4face19ed8002eec8280bc1c5ec18130472bf43.zip",
+ "reference": "d4face19ed8002eec8280bc1c5ec18130472bf43",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1.3"
+ },
+ "conflict": {
+ "symfony/dependency-injection": "<3.4"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~3.4|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/expression-language": "~3.4|~4.0",
+ "symfony/stopwatch": "~3.4|~4.0"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0-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-12-14T19:48:22+00:00"
+ },
+ {
+ "name": "symfony/finder",
+ "version": "v3.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/finder.git",
+ "reference": "dac8d7db537bac7ad8143eb11360a8c2231f251a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/finder/dac8d7db537bac7ad8143eb11360a8c2231f251a.zip",
+ "reference": "dac8d7db537bac7ad8143eb11360a8c2231f251a",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-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-11-05T16:10:10+00:00"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v3.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "59bf131b5460227a2f583a7dbe6b179f98f9e0a5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/http-foundation/59bf131b5460227a2f583a7dbe6b179f98f9e0a5.zip",
+ "reference": "59bf131b5460227a2f583a7dbe6b179f98f9e0a5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8",
+ "symfony/polyfill-mbstring": "~1.1",
+ "symfony/polyfill-php70": "~1.6"
+ },
+ "require-dev": {
+ "symfony/expression-language": "~2.8|~3.0|~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-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-12-14T19:40:10+00:00"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v3.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "48325096bbda77b983e642d21a4dd9bdde3ab73e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/http-kernel/48325096bbda77b983e642d21a4dd9bdde3ab73e.zip",
+ "reference": "48325096bbda77b983e642d21a4dd9bdde3ab73e",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8",
+ "psr/log": "~1.0",
+ "symfony/debug": "~2.8|~3.0|~4.0",
+ "symfony/event-dispatcher": "~2.8|~3.0|~4.0",
+ "symfony/http-foundation": "^3.3.11|~4.0"
+ },
+ "conflict": {
+ "symfony/config": "<2.8",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/var-dumper": "<3.3",
+ "twig/twig": "<1.34|<2.4,>=2"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0"
+ },
+ "require-dev": {
+ "psr/cache": "~1.0",
+ "symfony/browser-kit": "~2.8|~3.0|~4.0",
+ "symfony/class-loader": "~2.8|~3.0",
+ "symfony/config": "~2.8|~3.0|~4.0",
+ "symfony/console": "~2.8|~3.0|~4.0",
+ "symfony/css-selector": "~2.8|~3.0|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/dom-crawler": "~2.8|~3.0|~4.0",
+ "symfony/expression-language": "~2.8|~3.0|~4.0",
+ "symfony/finder": "~2.8|~3.0|~4.0",
+ "symfony/process": "~2.8|~3.0|~4.0",
+ "symfony/routing": "~3.4|~4.0",
+ "symfony/stopwatch": "~2.8|~3.0|~4.0",
+ "symfony/templating": "~2.8|~3.0|~4.0",
+ "symfony/translation": "~2.8|~3.0|~4.0",
+ "symfony/var-dumper": "~3.3|~4.0"
+ },
+ "suggest": {
+ "symfony/browser-kit": "",
+ "symfony/config": "",
+ "symfony/console": "",
+ "symfony/dependency-injection": "",
+ "symfony/finder": "",
+ "symfony/var-dumper": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-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-12-15T02:05:18+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/polyfill-mbstring/2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296.zip",
+ "reference": "2ec8b39c38cb16674bbf3fea2b6ce5bf117e1296",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6-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": "2017-10-11T12:05:26+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php56",
+ "version": "v1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php56.git",
+ "reference": "265fc96795492430762c29be291a371494ba3a5b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/polyfill-php56/265fc96795492430762c29be291a371494ba3a5b.zip",
+ "reference": "265fc96795492430762c29be291a371494ba3a5b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "symfony/polyfill-util": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php56\\": ""
+ },
+ "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 backporting some PHP 5.6+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2017-10-11T12:05:26+00:00"
+ },
+ {
+ "name": "symfony/polyfill-php70",
+ "version": "v1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-php70.git",
+ "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/polyfill-php70/0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff.zip",
+ "reference": "0442b9c0596610bd24ae7b5f0a6cdbbc16d9fcff",
+ "shasum": ""
+ },
+ "require": {
+ "paragonie/random_compat": "~1.0|~2.0",
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Php70\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ],
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "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 backporting some PHP 7.0+ features to lower PHP versions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2017-10-11T12:05:26+00:00"
+ },
+ {
+ "name": "symfony/polyfill-util",
+ "version": "v1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-util.git",
+ "reference": "6e719200c8e540e0c0effeb31f96bdb344b94176"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/polyfill-util/6e719200c8e540e0c0effeb31f96bdb344b94176.zip",
+ "reference": "6e719200c8e540e0c0effeb31f96bdb344b94176",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Util\\": ""
+ }
+ },
+ "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 utilities for portability of PHP codes",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compat",
+ "compatibility",
+ "polyfill",
+ "shim"
+ ],
+ "time": "2017-10-11T12:05:26+00:00"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v3.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "bb3ef65d493a6d57297cad6c560ee04e2a8f5098"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/process/bb3ef65d493a6d57297cad6c560ee04e2a8f5098.zip",
+ "reference": "bb3ef65d493a6d57297cad6c560ee04e2a8f5098",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-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-12-14T19:40:10+00:00"
+ },
+ {
+ "name": "symfony/psr-http-message-bridge",
+ "version": "v1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/psr-http-message-bridge.git",
+ "reference": "c2b757934f2d9681a287e662efbc27c41fe8ef86"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/psr-http-message-bridge/c2b757934f2d9681a287e662efbc27c41fe8ef86.zip",
+ "reference": "c2b757934f2d9681a287e662efbc27c41fe8ef86",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "psr/http-message": "~1.0",
+ "symfony/http-foundation": "~2.3|~3.0|~4.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~3.2|4.0"
+ },
+ "suggest": {
+ "psr/http-message-implementation": "To use the HttpFoundation factory",
+ "zendframework/zend-diactoros": "To use the Zend Diactoros factory"
+ },
+ "type": "symfony-bridge",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\PsrHttpMessage\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "PSR HTTP message bridge",
+ "homepage": "http://symfony.com",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr-7"
+ ],
+ "time": "2017-12-19T00:31:44+00:00"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v3.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "5f248dfac5e4660c74982eb3dadc71cf58595570"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/routing/5f248dfac5e4660c74982eb3dadc71cf58595570.zip",
+ "reference": "5f248dfac5e4660c74982eb3dadc71cf58595570",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8"
+ },
+ "conflict": {
+ "symfony/config": "<2.8",
+ "symfony/dependency-injection": "<3.3",
+ "symfony/yaml": "<3.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "doctrine/common": "~2.2",
+ "psr/log": "~1.0",
+ "symfony/config": "~2.8|~3.0|~4.0",
+ "symfony/dependency-injection": "~3.3|~4.0",
+ "symfony/expression-language": "~2.8|~3.0|~4.0",
+ "symfony/http-foundation": "~2.8|~3.0|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
+ },
+ "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.4-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-12-14T22:37:31+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v3.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "4c5d5582baf2829751a5207659329c1f52eedeb6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/translation/4c5d5582baf2829751a5207659329c1f52eedeb6.zip",
+ "reference": "4c5d5582baf2829751a5207659329c1f52eedeb6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/config": "<2.8",
+ "symfony/dependency-injection": "<3.4",
+ "symfony/yaml": "<3.4"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.8|~3.0|~4.0",
+ "symfony/dependency-injection": "~3.4|~4.0",
+ "symfony/finder": "~2.8|~3.0|~4.0",
+ "symfony/intl": "^2.8.18|^3.2.5|~4.0",
+ "symfony/yaml": "~3.4|~4.0"
+ },
+ "suggest": {
+ "psr/log": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-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-12-12T08:27:14+00:00"
+ },
+ {
+ "name": "symfony/var-dumper",
+ "version": "v3.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/var-dumper.git",
+ "reference": "757074cf71b952ce9e75b557538948811c2bf006"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/symfony/var-dumper/757074cf71b952ce9e75b557538948811c2bf006.zip",
+ "reference": "757074cf71b952ce9e75b557538948811c2bf006",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9|>=7.0.8",
+ "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-intl": "To show region name in time zone dump",
+ "ext-symfony_debug": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.4-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-12-11T22:06:16+00:00"
+ },
+ {
+ "name": "tijsverkoyen/css-to-inline-styles",
+ "version": "2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git",
+ "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/tijsverkoyen/CssToInlineStyles/ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b.zip",
+ "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5 || ^7",
+ "symfony/css-selector": "^2.7|~3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8|5.1.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.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": "2016-09-20T12:50:39+00:00"
+ },
+ {
+ "name": "vlucas/phpdotenv",
+ "version": "v2.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/vlucas/phpdotenv.git",
+ "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/vlucas/phpdotenv/3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c.zip",
+ "reference": "3cc116adbe4b11be5ec557bf1d24dc5e3a21d18c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8 || ^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Dotenv\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause-Attribution"
+ ],
+ "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": "2016-09-01T10:05:43+00:00"
+ },
+ {
+ "name": "zendframework/zend-diactoros",
+ "version": "1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-diactoros.git",
+ "reference": "c8664b92a6d5bc229e48b0923486c097e45a7877"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/zendframework/zend-diactoros/c8664b92a6d5bc229e48b0923486c097e45a7877.zip",
+ "reference": "c8664b92a6d5bc229e48b0923486c097e45a7877",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0",
+ "psr/http-message": "^1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "phpunit/phpunit": "^5.7.16 || ^6.0.8",
+ "zendframework/zend-coding-standard": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6-dev",
+ "dev-develop": "1.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Zend\\Diactoros\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "description": "PSR HTTP Message implementations",
+ "homepage": "https://github.com/zendframework/zend-diactoros",
+ "keywords": [
+ "http",
+ "psr",
+ "psr-7"
+ ],
+ "time": "2017-10-12T15:24:51+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/doctrine/instantiator/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda.zip",
+ "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "^6.2.3",
+ "squizlabs/php_codesniffer": "^3.0.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.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": "2017-07-22T11:58:36+00:00"
+ },
+ {
+ "name": "filp/whoops",
+ "version": "2.1.14",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/filp/whoops.git",
+ "reference": "c6081b8838686aa04f1e83ba7e91f78b7b2a23e6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/filp/whoops/c6081b8838686aa04f1e83ba7e91f78b7b2a23e6.zip",
+ "reference": "c6081b8838686aa04f1e83ba7e91f78b7b2a23e6",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5.9 || ^7.0",
+ "psr/log": "^1.0.1"
+ },
+ "require-dev": {
+ "mockery/mockery": "0.9.*",
+ "phpunit/phpunit": "^4.8.35 || ^5.7",
+ "symfony/var-dumper": "^2.6 || ^3.0"
+ },
+ "suggest": {
+ "symfony/var-dumper": "Pretty print complex values better with var-dumper available",
+ "whoops/soap": "Formats errors as SOAP responses"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Whoops\\": "src/Whoops/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Filipe Dobreira",
+ "homepage": "https://github.com/filp",
+ "role": "Developer"
+ }
+ ],
+ "description": "php error handling for cool kids",
+ "homepage": "https://filp.github.io/whoops/",
+ "keywords": [
+ "error",
+ "exception",
+ "handling",
+ "library",
+ "throwable",
+ "whoops"
+ ],
+ "time": "2017-11-23T18:22:44+00:00"
+ },
+ {
+ "name": "fzaninotto/faker",
+ "version": "v1.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fzaninotto/Faker.git",
+ "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/fzaninotto/Faker/d3ed4cc37051c1ca52d22d76b437d14809fc7e0d.zip",
+ "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "ext-intl": "*",
+ "phpunit/phpunit": "^4.0 || ^5.0",
+ "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": "2017-08-15T16:48:10+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://files.phpcomposer.com/files/hamcrest/hamcrest-php/b37020aa976fa52d3de9aa904aa2522dc518f79c.zip",
+ "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.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mockery/mockery.git",
+ "reference": "6fdb61243844dc924071d3404bb23994ea0b6856"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/mockery/mockery/6fdb61243844dc924071d3404bb23994ea0b6856.zip",
+ "reference": "6fdb61243844dc924071d3404bb23994ea0b6856",
+ "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": "2017-02-28T12:52:32+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://files.phpcomposer.com/files/myclabs/DeepCopy/3b8a3a99ba1f6a3952ac2747d989303cbd6b7a3e.zip",
+ "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": "phar-io/manifest",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/phar-io/manifest/2df402786ab5368a0169091f61a7c1e0eb6852d0.zip",
+ "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-phar": "*",
+ "phar-io/version": "^1.0.1",
+ "php": "^5.6 || ^7.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": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "time": "2017-03-05T18:14:27+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/phar-io/version/a70c0ced4be299a63d32fa96d9281d03e94041df.zip",
+ "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.6 || ^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "time": "2017-03-05T17:38:23+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://files.phpcomposer.com/files/phpDocumentor/ReflectionCommon/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6.zip",
+ "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.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "66465776cfc249844bde6d117abff1d22e06c2da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/phpDocumentor/ReflectionDocBlock/66465776cfc249844bde6d117abff1d22e06c2da.zip",
+ "reference": "66465776cfc249844bde6d117abff1d22e06c2da",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "phpdocumentor/reflection-common": "^1.0.0",
+ "phpdocumentor/type-resolver": "^0.4.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": "2017-11-27T17:38:31+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/phpDocumentor/TypeResolver/9c977708995954784726e25d0cd1dddf4e65b0f7.zip",
+ "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5 || ^7.0",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "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-07-14T14:27:02+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "1.7.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/phpspec/prophecy/e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf.zip",
+ "reference": "e4ed002c67da8eceb0eb8ddb8b3847bb53c5c2bf",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
+ "sebastian/comparator": "^1.1|^2.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"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "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": "2017-11-24T13:59:53+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "5.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/sebastianbergmann/php-code-coverage/661f34d0bd3f1a7225ef491a70a020ad23a057a1.zip",
+ "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0",
+ "phpunit/php-file-iterator": "^1.4.2",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-token-stream": "^2.0.1",
+ "sebastian/code-unit-reverse-lookup": "^1.0.1",
+ "sebastian/environment": "^3.0",
+ "sebastian/version": "^2.0.1",
+ "theseer/tokenizer": "^1.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-xdebug": "^2.5.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.3.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 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-12-06T09:29:45+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://files.phpcomposer.com/files/sebastianbergmann/php-file-iterator/730b01bc3e867237eaac355e06a36b85dd93a8b4.zip",
+ "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://files.phpcomposer.com/files/sebastianbergmann/php-text-template/31f8b717e51d9a2afca6c9f046f5d69fc27c8686.zip",
+ "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://files.phpcomposer.com/files/sebastianbergmann/php-timer/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f.zip",
+ "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://files.phpcomposer.com/files/sebastianbergmann/php-token-stream/791198a2c6254db10131eecfe8c06670700904db.zip",
+ "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": "6.5.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "83d27937a310f2984fd575686138597147bdc7df"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/sebastianbergmann/phpunit/83d27937a310f2984fd575686138597147bdc7df.zip",
+ "reference": "83d27937a310f2984fd575686138597147bdc7df",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "^1.6.1",
+ "phar-io/manifest": "^1.0.1",
+ "phar-io/version": "^1.0",
+ "php": "^7.0",
+ "phpspec/prophecy": "^1.7",
+ "phpunit/php-code-coverage": "^5.3",
+ "phpunit/php-file-iterator": "^1.4.3",
+ "phpunit/php-text-template": "^1.2.1",
+ "phpunit/php-timer": "^1.0.9",
+ "phpunit/phpunit-mock-objects": "^5.0.5",
+ "sebastian/comparator": "^2.1",
+ "sebastian/diff": "^2.0",
+ "sebastian/environment": "^3.1",
+ "sebastian/exporter": "^3.1",
+ "sebastian/global-state": "^2.0",
+ "sebastian/object-enumerator": "^3.0.3",
+ "sebastian/resource-operations": "^1.0",
+ "sebastian/version": "^2.0.1"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "3.0.2",
+ "phpunit/dbunit": "<3.0"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "^1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.5.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": "2017-12-17T06:31:19+00:00"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "5.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "283b9f4f670e3a6fd6c4ff95c51a952eb5c75933"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/sebastianbergmann/phpunit-mock-objects/283b9f4f670e3a6fd6c4ff95c51a952eb5c75933.zip",
+ "reference": "283b9f4f670e3a6fd6c4ff95c51a952eb5c75933",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.5",
+ "php": "^7.0",
+ "phpunit/php-text-template": "^1.2.1",
+ "sebastian/exporter": "^3.1"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<6.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.5"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.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": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "time": "2017-12-10T08:01:53+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://files.phpcomposer.com/files/sebastianbergmann/code-unit-reverse-lookup/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18.zip",
+ "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": "2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "1174d9018191e93cb9d719edec01257fc05f8158"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/sebastianbergmann/comparator/1174d9018191e93cb9d719edec01257fc05f8158.zip",
+ "reference": "1174d9018191e93cb9d719edec01257fc05f8158",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/diff": "^2.0",
+ "sebastian/exporter": "^3.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.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": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2017-11-03T07:16:52+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/sebastianbergmann/diff/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd.zip",
+ "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.2"
+ },
+ "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": "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-08-03T08:09:46+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/sebastianbergmann/environment/cd0871b3975fb7fc44d11314fd1ee20925fce4f5.zip",
+ "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.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": "2017-07-01T08:51:00+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "234199f4528de6d12aaa58b612e98f7d36adb937"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/sebastianbergmann/exporter/234199f4528de6d12aaa58b612e98f7d36adb937.zip",
+ "reference": "234199f4528de6d12aaa58b612e98f7d36adb937",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1.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": "2017-04-03T13:19:02+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/sebastianbergmann/global-state/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4.zip",
+ "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "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": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2017-04-27T15:39:26+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "3.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/sebastianbergmann/object-enumerator/7cfd9e65d11ffb5af41198476395774d4c8a84c5.zip",
+ "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0",
+ "sebastian/object-reflector": "^1.1.1",
+ "sebastian/recursion-context": "^3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.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-08-03T12:35:26+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "773f97c67f28de00d397be301821b06708fca0be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/sebastianbergmann/object-reflector/773f97c67f28de00d397be301821b06708fca0be.zip",
+ "reference": "773f97c67f28de00d397be301821b06708fca0be",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "time": "2017-03-29T09:07:27+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/sebastianbergmann/recursion-context/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8.zip",
+ "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.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": "2017-03-03T06:23:57+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://files.phpcomposer.com/files/sebastianbergmann/resource-operations/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52.zip",
+ "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://files.phpcomposer.com/files/sebastianbergmann/version/99732be0ddb3361e16ad77b68ba41efc8e979019.zip",
+ "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": "theseer/tokenizer",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/theseer/tokenizer/cb2f008f3f05af2893a87208fe6a6c4985483f8b.zip",
+ "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "time": "2017-04-07T12:08:54+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://files.phpcomposer.com/files/webmozart/assert/2db61e59ff05fe5126d152bd0655c9ea113e550f.zip",
+ "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.3.3 || ^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "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": "2016-11-23T20:04:58+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=7.0.0"
+ },
+ "platform-dev": []
+}
diff --git a/backend/config/app.php b/backend/config/app.php
new file mode 100644
index 00000000..62e0042e
--- /dev/null
+++ b/backend/config/app.php
@@ -0,0 +1,237 @@
+ 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', false),
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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' => 'PRC',
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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-CN',
+
+ /*
+ |--------------------------------------------------------------------------
+ | 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,
+ Laravel\Passport\PassportServiceProvider::class,
+
+ /*
+ * Package Service Providers...
+ */
+ Barryvdh\Cors\ServiceProvider::class,
+ Maatwebsite\Excel\ExcelServiceProvider::class,
+ Overtrue\LaravelPinyin\ServiceProvider::class,
+ Overtrue\LaravelWeChat\ServiceProvider::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,
+ 'Excel' => Maatwebsite\Excel\Facades\Excel::class,
+ 'Pinyin' => Overtrue\LaravelPinyin\Facades\Pinyin::class,
+ 'EasyWeChat' => Overtrue\LaravelWeChat\Facade::class,
+ ],
+
+];
diff --git a/backend/config/auth.php b/backend/config/auth.php
new file mode 100644
index 00000000..f8a1194b
--- /dev/null
+++ b/backend/config/auth.php
@@ -0,0 +1,102 @@
+ [
+ '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' => 'passport',
+ '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\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,
+ ],
+ ],
+
+];
diff --git a/backend/config/broadcasting.php b/backend/config/broadcasting.php
new file mode 100644
index 00000000..5eecd2b2
--- /dev/null
+++ b/backend/config/broadcasting.php
@@ -0,0 +1,58 @@
+ 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',
+ ],
+
+ ],
+
+];
diff --git a/backend/config/cache.php b/backend/config/cache.php
new file mode 100644
index 00000000..e87f0320
--- /dev/null
+++ b/backend/config/cache.php
@@ -0,0 +1,91 @@
+ 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',
+
+];
diff --git a/backend/config/cors.php b/backend/config/cors.php
new file mode 100644
index 00000000..46290ffd
--- /dev/null
+++ b/backend/config/cors.php
@@ -0,0 +1,22 @@
+ true,
+ 'allowedOrigins' => ['*'],
+ 'allowedHeaders' => ['*'],
+ 'allowedMethods' => ['*'],
+ 'exposedHeaders' => [],
+ 'maxAge' => 0,
+
+];
diff --git a/backend/config/database.php b/backend/config/database.php
new file mode 100644
index 00000000..cab5d068
--- /dev/null
+++ b/backend/config/database.php
@@ -0,0 +1,120 @@
+ 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,
+ ],
+
+ ],
+
+];
diff --git a/backend/config/excel.php b/backend/config/excel.php
new file mode 100644
index 00000000..ad0b61f9
--- /dev/null
+++ b/backend/config/excel.php
@@ -0,0 +1,705 @@
+ [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Enable/Disable cell caching
+ |--------------------------------------------------------------------------
+ */
+ 'enable' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Caching driver
+ |--------------------------------------------------------------------------
+ |
+ | Set the caching driver
+ |
+ | Available methods:
+ | memory|gzip|serialized|igbinary|discISAM|apc|memcache|temp|wincache|sqlite|sqlite3
+ |
+ */
+ 'driver' => 'memory',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Cache settings
+ |--------------------------------------------------------------------------
+ */
+ 'settings' => [
+
+ 'memoryCacheSize' => '32MB',
+ 'cacheTime' => 600
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Memcache settings
+ |--------------------------------------------------------------------------
+ */
+ 'memcache' => [
+
+ 'host' => 'localhost',
+ 'port' => 11211,
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Cache dir (for discISAM)
+ |--------------------------------------------------------------------------
+ */
+
+ 'dir' => storage_path('cache')
+ ],
+
+ 'properties' => [
+ 'creator' => 'Maatwebsite',
+ 'lastModifiedBy' => 'Maatwebsite',
+ 'title' => 'Spreadsheet',
+ 'description' => 'Default spreadsheet export',
+ 'subject' => 'Spreadsheet export',
+ 'keywords' => 'maatwebsite, excel, export',
+ 'category' => 'Excel',
+ 'manager' => 'Maatwebsite',
+ 'company' => 'Maatwebsite',
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Sheets settings
+ |--------------------------------------------------------------------------
+ */
+ 'sheets' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Default page setup
+ |--------------------------------------------------------------------------
+ */
+ 'pageSetup' => [
+ 'orientation' => 'portrait',
+ 'paperSize' => '9',
+ 'scale' => '100',
+ 'fitToPage' => false,
+ 'fitToHeight' => true,
+ 'fitToWidth' => true,
+ 'columnsToRepeatAtLeft' => ['', ''],
+ 'rowsToRepeatAtTop' => [0, 0],
+ 'horizontalCentered' => false,
+ 'verticalCentered' => false,
+ 'printArea' => null,
+ 'firstPageNumber' => null,
+ ],
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Creator
+ |--------------------------------------------------------------------------
+ |
+ | The default creator of a new Excel file
+ |
+ */
+
+ 'creator' => 'Maatwebsite',
+
+ 'csv' => [
+ /*
+ |--------------------------------------------------------------------------
+ | Delimiter
+ |--------------------------------------------------------------------------
+ |
+ | The default delimiter which will be used to read out a CSV file
+ |
+ */
+
+ 'delimiter' => ',',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Enclosure
+ |--------------------------------------------------------------------------
+ */
+
+ 'enclosure' => '"',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Line endings
+ |--------------------------------------------------------------------------
+ */
+
+ 'line_ending' => "\r\n",
+
+ /*
+ |--------------------------------------------------------------------------
+ | setUseBom
+ |--------------------------------------------------------------------------
+ */
+
+ 'use_bom' => false
+ ],
+
+ 'export' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Autosize columns
+ |--------------------------------------------------------------------------
+ |
+ | Disable/enable column autosize or set the autosizing for
+ | an array of columns ( array('A', 'B') )
+ |
+ */
+ 'autosize' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Autosize method
+ |--------------------------------------------------------------------------
+ |
+ | --> PHPExcel_Shared_Font::AUTOSIZE_METHOD_APPROX
+ | The default is based on an estimate, which does its calculation based
+ | on the number of characters in the cell value (applying any calculation
+ | and format mask, and allowing for wordwrap and rotation) and with an
+ | "arbitrary" adjustment based on the font (Arial, Calibri or Verdana,
+ | defaulting to Calibri if any other font is used) and a proportional
+ | adjustment for the font size.
+ |
+ | --> PHPExcel_Shared_Font::AUTOSIZE_METHOD_EXACT
+ | The second method is more accurate, based on actual style formatting as
+ | well (bold, italic, etc), and is calculated by generating a gd2 imagettf
+ | bounding box and using its dimensions to determine the size; but this
+ | method is significantly slower, and its accuracy is still dependent on
+ | having the appropriate fonts installed.
+ |
+ */
+ 'autosize-method' => PHPExcel_Shared_Font::AUTOSIZE_METHOD_APPROX,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Auto generate table heading
+ |--------------------------------------------------------------------------
+ |
+ | If set to true, the array indices (or model attribute names)
+ | will automatically be used as first row (table heading)
+ |
+ */
+ 'generate_heading_by_indices' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Auto set alignment on merged cells
+ |--------------------------------------------------------------------------
+ */
+ 'merged_cell_alignment' => 'left',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Pre-calculate formulas during export
+ |--------------------------------------------------------------------------
+ */
+ 'calculate' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Include Charts during export
+ |--------------------------------------------------------------------------
+ */
+ 'includeCharts' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Default sheet settings
+ |--------------------------------------------------------------------------
+ */
+ 'sheets' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Default page margin
+ |--------------------------------------------------------------------------
+ |
+ | 1) When set to false, default margins will be used
+ | 2) It's possible to enter a single margin which will
+ | be used for all margins.
+ | 3) Alternatively you can pass an array with 4 margins
+ | Default order: array(top, right, bottom, left)
+ |
+ */
+ 'page_margin' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Value in source array that stands for blank cell
+ |--------------------------------------------------------------------------
+ */
+ 'nullValue' => null,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Insert array starting from this cell address as the top left coordinate
+ |--------------------------------------------------------------------------
+ */
+ 'startCell' => 'A1',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Apply strict comparison when testing for null values in the array
+ |--------------------------------------------------------------------------
+ */
+ 'strictNullComparison' => false
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Store settings
+ |--------------------------------------------------------------------------
+ */
+
+ 'store' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Path
+ |--------------------------------------------------------------------------
+ |
+ | The path we want to save excel file to
+ |
+ */
+ 'path' => storage_path('exports'),
+
+ /*
+ |--------------------------------------------------------------------------
+ | Return info
+ |--------------------------------------------------------------------------
+ |
+ | Whether we want to return information about the stored file or not
+ |
+ */
+ 'returnInfo' => false
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | PDF Settings
+ |--------------------------------------------------------------------------
+ */
+ 'pdf' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | PDF Drivers
+ |--------------------------------------------------------------------------
+ | Supported: DomPDF, tcPDF, mPDF
+ */
+ 'driver' => 'DomPDF',
+
+ /*
+ |--------------------------------------------------------------------------
+ | PDF Driver settings
+ |--------------------------------------------------------------------------
+ */
+ 'drivers' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | DomPDF settings
+ |--------------------------------------------------------------------------
+ */
+ 'DomPDF' => [
+ 'path' => base_path('vendor/dompdf/dompdf/')
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | tcPDF settings
+ |--------------------------------------------------------------------------
+ */
+ 'tcPDF' => [
+ 'path' => base_path('vendor/tecnick.com/tcpdf/')
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | mPDF settings
+ |--------------------------------------------------------------------------
+ */
+ 'mPDF' => [
+ 'path' => base_path('vendor/mpdf/mpdf/')
+ ],
+ ]
+ ]
+ ],
+
+ 'filters' => [
+ /*
+ |--------------------------------------------------------------------------
+ | Register read filters
+ |--------------------------------------------------------------------------
+ */
+
+ 'registered' => [
+ 'chunk' => 'Maatwebsite\Excel\Filters\ChunkReadFilter'
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Enable certain filters for every file read
+ |--------------------------------------------------------------------------
+ */
+
+ 'enabled' => []
+ ],
+
+ 'import' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Has heading
+ |--------------------------------------------------------------------------
+ |
+ | The sheet has a heading (first) row which we can use as attribute names
+ |
+ | Options: true|false|slugged|slugged_with_count|ascii|numeric|hashed|trans|original
+ |
+ */
+
+ 'heading' => 'slugged',
+ //'heading' => 'false',
+
+ /*
+ |--------------------------------------------------------------------------
+ | First Row with data or heading of data
+ |--------------------------------------------------------------------------
+ |
+ | If the heading row is not the first row, or the data doesn't start
+ | on the first row, here you can change the start row.
+ |
+ */
+
+ 'startRow' => 1,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Cell name word separator
+ |--------------------------------------------------------------------------
+ |
+ | The default separator which is used for the cell names
+ | Note: only applies to 'heading' settings 'true' && 'slugged'
+ |
+ */
+
+ 'separator' => '_',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Slug whitelisting
+ |--------------------------------------------------------------------------
+ |
+ | Here you can whitelist certain characters in the slug.
+ | E.g. user.last_name will not remove . and _
+ | Note: only applies to 'heading' settings 'true' && 'slugged'
+ |
+ */
+
+ 'slug_whitelist' => '._',
+
+ /*
+ |--------------------------------------------------------------------------
+ | Include Charts during import
+ |--------------------------------------------------------------------------
+ */
+
+ 'includeCharts' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Sheet heading conversion
+ |--------------------------------------------------------------------------
+ |
+ | Convert headings to ASCII
+ | Note: only applies to 'heading' settings 'true' && 'slugged'
+ |
+ */
+
+ 'to_ascii' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Import encoding
+ |--------------------------------------------------------------------------
+ */
+
+ 'encoding' => [
+
+ 'input' => 'UTF-8',
+ 'output' => 'UTF-8'
+
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Calculate
+ |--------------------------------------------------------------------------
+ |
+ | By default cells with formulas will be calculated.
+ |
+ */
+
+ 'calculate' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Ignore empty cells
+ |--------------------------------------------------------------------------
+ |
+ | By default empty cells are not ignored
+ |
+ */
+
+ 'ignoreEmpty' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Force sheet collection
+ |--------------------------------------------------------------------------
+ |
+ | For a sheet collection even when there is only 1 sheets.
+ | When set to false and only 1 sheet found, the parsed file will return
+ | a row collection instead of a sheet collection.
+ | When set to true, it will return a sheet collection instead.
+ |
+ */
+ 'force_sheets_collection' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Date format
+ |--------------------------------------------------------------------------
+ |
+ | The format dates will be parsed to
+ |
+ */
+
+ 'dates' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Enable/disable date formatting
+ |--------------------------------------------------------------------------
+ */
+ 'enabled' => true,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Default date format
+ |--------------------------------------------------------------------------
+ |
+ | If set to false, a carbon object will return
+ |
+ */
+ 'format' => false,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Date columns
+ |--------------------------------------------------------------------------
+ */
+ 'columns' => []
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Import sheets by config
+ |--------------------------------------------------------------------------
+ */
+ 'sheets' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Example sheet
+ |--------------------------------------------------------------------------
+ |
+ | Example sheet "test" will grab the firstname at cell A2
+ |
+ */
+
+ 'test' => [
+
+ 'firstname' => 'A2'
+
+ ]
+
+ ]
+ ],
+
+ 'views' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Styles
+ |--------------------------------------------------------------------------
+ |
+ | The default styles which will be used when parsing a view
+ |
+ */
+
+ 'styles' => [
+
+ /*
+ |--------------------------------------------------------------------------
+ | Table headings
+ |--------------------------------------------------------------------------
+ */
+ 'th' => [
+ 'font' => [
+ 'bold' => true,
+ 'size' => 12,
+ ]
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Strong tags
+ |--------------------------------------------------------------------------
+ */
+ 'strong' => [
+ 'font' => [
+ 'bold' => true,
+ 'size' => 12,
+ ]
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Bold tags
+ |--------------------------------------------------------------------------
+ */
+ 'b' => [
+ 'font' => [
+ 'bold' => true,
+ 'size' => 12,
+ ]
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Italic tags
+ |--------------------------------------------------------------------------
+ */
+ 'i' => [
+ 'font' => [
+ 'italic' => true,
+ 'size' => 12,
+ ]
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Heading 1
+ |--------------------------------------------------------------------------
+ */
+ 'h1' => [
+ 'font' => [
+ 'bold' => true,
+ 'size' => 24,
+ ]
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Heading 2
+ |--------------------------------------------------------------------------
+ */
+ 'h2' => [
+ 'font' => [
+ 'bold' => true,
+ 'size' => 18,
+ ]
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Heading 3
+ |--------------------------------------------------------------------------
+ */
+ 'h3' => [
+ 'font' => [
+ 'bold' => true,
+ 'size' => 13.5,
+ ]
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Heading 4
+ |--------------------------------------------------------------------------
+ */
+ 'h4' => [
+ 'font' => [
+ 'bold' => true,
+ 'size' => 12,
+ ]
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Heading 5
+ |--------------------------------------------------------------------------
+ */
+ 'h5' => [
+ 'font' => [
+ 'bold' => true,
+ 'size' => 10,
+ ]
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Heading 6
+ |--------------------------------------------------------------------------
+ */
+ 'h6' => [
+ 'font' => [
+ 'bold' => true,
+ 'size' => 7.5,
+ ]
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Hyperlinks
+ |--------------------------------------------------------------------------
+ */
+ 'a' => [
+ 'font' => [
+ 'underline' => true,
+ 'color' => ['argb' => 'FF0000FF'],
+ ]
+ ],
+
+ /*
+ |--------------------------------------------------------------------------
+ | Horizontal rules
+ |--------------------------------------------------------------------------
+ */
+ 'hr' => [
+ 'borders' => [
+ 'bottom' => [
+ 'style' => 'thin',
+ 'color' => ['FF000000']
+ ],
+ ]
+ ]
+ ]
+
+ ]
+
+);
diff --git a/backend/config/filesystems.php b/backend/config/filesystems.php
new file mode 100644
index 00000000..36a61abd
--- /dev/null
+++ b/backend/config/filesystems.php
@@ -0,0 +1,74 @@
+ 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'),
+ ],
+ 'test' => [
+ 'driver' => 'local',
+ 'root' => 'e:/test'
+ ],
+ 'public' => [
+ 'driver' => 'local',
+ 'root' => storage_path('app/public'),
+ 'url' => env('APP_URL').'/storage',
+ 'visibility' => 'public',
+ ],
+ 'uploads' => [
+ 'driver' => 'local',
+ 'root' => public_path('uploads'),
+ ],
+ 's3' => [
+ 'driver' => 's3',
+ 'key' => env('AWS_KEY'),
+ 'secret' => env('AWS_SECRET'),
+ 'region' => env('AWS_REGION'),
+ 'bucket' => env('AWS_BUCKET'),
+ ],
+
+ ],
+
+];
diff --git a/backend/config/mail.php b/backend/config/mail.php
new file mode 100644
index 00000000..bb92224c
--- /dev/null
+++ b/backend/config/mail.php
@@ -0,0 +1,123 @@
+ 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'),
+ ],
+ ],
+
+];
diff --git a/backend/config/queue.php b/backend/config/queue.php
new file mode 100644
index 00000000..4d83ebd0
--- /dev/null
+++ b/backend/config/queue.php
@@ -0,0 +1,85 @@
+ 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',
+ ],
+
+];
diff --git a/backend/config/services.php b/backend/config/services.php
new file mode 100644
index 00000000..4460f0ec
--- /dev/null
+++ b/backend/config/services.php
@@ -0,0 +1,38 @@
+ [
+ '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'),
+ ],
+
+];
diff --git a/backend/config/session.php b/backend/config/session.php
new file mode 100644
index 00000000..71ad0ed1
--- /dev/null
+++ b/backend/config/session.php
@@ -0,0 +1,197 @@
+ 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' => env(
+ 'SESSION_COOKIE',
+ str_slug(env('APP_NAME', '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,
+
+ /*
+ |--------------------------------------------------------------------------
+ | Same-Site Cookies
+ |--------------------------------------------------------------------------
+ |
+ | This option determines how your cookies behave when cross-site requests
+ | take place, and can be used to mitigate CSRF attacks. By default, we
+ | do not enable this as other CSRF protection services are in place.
+ |
+ | Supported: "lax", "strict"
+ |
+ */
+
+ 'same_site' => null,
+
+];
diff --git a/backend/config/view.php b/backend/config/view.php
new file mode 100644
index 00000000..2acfd9cc
--- /dev/null
+++ b/backend/config/view.php
@@ -0,0 +1,33 @@
+ [
+ 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')),
+
+];
diff --git a/backend/config/wechat.php b/backend/config/wechat.php
new file mode 100644
index 00000000..7b31e782
--- /dev/null
+++ b/backend/config/wechat.php
@@ -0,0 +1,137 @@
+
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+return [
+ /*
+ * 默认配置,将会合并到各模块中
+ */
+ 'defaults' => [
+ /*
+ * Debug 模式,bool 值:true/false
+ *
+ * 当值为 false 时,所有的日志都不会记录
+ */
+ 'debug' => true,
+
+ /*
+ * 指定 API 调用返回结果的类型:array(default)/collection/object/raw/自定义类名
+ */
+ 'response_type' => 'array',
+
+ /*
+ * 使用 Laravel 的缓存系统
+ */
+ 'use_laravel_cache' => true,
+
+ /*
+ * 日志配置
+ *
+ * level: 日志级别,可选为:
+ * debug/info/notice/warning/error/critical/alert/emergency
+ * file:日志文件位置(绝对路径!!!),要求可写权限
+ */
+ 'log' => [
+ 'level' => env('WECHAT_LOG_LEVEL', 'debug'),
+ 'file' => env('WECHAT_LOG_FILE', storage_path('logs/wechat.log')),
+ ],
+ ],
+
+ /*
+ * 路由配置
+ */
+ 'route' => [
+ /*
+ * 开放平台第三方平台路由配置
+ */
+ // 'open_platform' => [
+ // 'uri' => 'serve',
+ // 'action' => Overtrue\LaravelWeChat\Controllers\OpenPlatformController::class,
+ // 'attributes' => [
+ // 'prefix' => 'open-platform',
+ // 'middleware' => null,
+ // ],
+ // ],
+ ],
+
+ /*
+ * 公众号
+ */
+ 'official_account' => [
+ 'app_id' => env('WECHAT_OFFICIAL_ACCOUNT_APPID', 'your-app-id'), // AppID
+ 'secret' => env('WECHAT_OFFICIAL_ACCOUNT_SECRET', 'your-app-secret'), // AppSecret
+ 'token' => env('WECHAT_OFFICIAL_ACCOUNT_TOKEN', 'your-token'), // Token
+ 'aes_key' => env('WECHAT_OFFICIAL_ACCOUNT_AES_KEY', ''), // EncodingAESKey
+
+ /*
+ * OAuth 配置
+ *
+ * only_wechat_browser: 只在微信浏览器跳转
+ * scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login
+ * callback:OAuth授权完成后的回调页地址(如果使用中间件,则随便填写。。。)
+ */
+ // 'oauth' => [
+ // 'only_wechat_browser' => false,
+ // 'scopes' => array_map('trim', explode(',', env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_SCOPES', 'snsapi_userinfo'))),
+ // 'callback' => env('WECHAT_OFFICIAL_ACCOUNT_OAUTH_CALLBACK', '/examples/oauth_callback.php'),
+ // ],
+ ],
+
+ /*
+ * 开放平台第三方平台
+ */
+ // 'open_platform' => [
+ // 'app_id' => env('WECHAT_OPEN_PLATFORM_APPID', ''),
+ // 'secret' => env('WECHAT_OPEN_PLATFORM_SECRET', ''),
+ // 'token' => env('WECHAT_OPEN_PLATFORM_TOKEN', ''),
+ // 'aes_key' => env('WECHAT_OPEN_PLATFORM_AES_KEY', ''),
+ // ],
+
+ /*
+ * 小程序
+ */
+ // 'mini_program' => [
+ // 'app_id' => env('WECHAT_MINI_PROGRAM_APPID', ''),
+ // 'secret' => env('WECHAT_MINI_PROGRAM_SECRET', ''),
+ // 'token' => env('WECHAT_MINI_PROGRAM_TOKEN', ''),
+ // 'aes_key' => env('WECHAT_MINI_PROGRAM_AES_KEY', ''),
+ // ],
+
+ /*
+ * 微信支付
+ */
+ // 'payment' => [
+ // 'sandbox' => env('WECHAT_PAYMENT_SANDBOX', false),
+ // 'app_id' => env('WECHAT_PAYMENT_APPID', ''),
+ // 'mch_id' => env('WECHAT_PAYMENT_MCH_ID', 'your-mch-id'),
+ // 'key' => env('WECHAT_PAYMENT_KEY', 'key-for-signature'),
+ // 'cert_path' => env('WECHAT_PAYMENT_CERT_PATH', 'path/to/cert/apiclient_cert.pem'), // XXX: 绝对路径!!!!
+ // 'key_path' => env('WECHAT_PAYMENT_KEY_PATH', 'path/to/cert/apiclient_key.pem'), // XXX: 绝对路径!!!!
+ // 'notify_url' => 'http://example.com/payments/wechat-notify', // 默认支付结果通知地址
+ // // ...
+ // ],
+
+ /*
+ * 企业微信
+ */
+ // 'work' => [
+ // // 企业 ID
+ // 'corp_id' => 'xxxxxxxxxxxxxxxxx',
+
+ // // 应用列表
+ // 'agents' => [
+ // 'contacts' => [
+ // 'agent_id' => 100020,
+ // 'secret' => env('WECHAT_WORK_AGENT_CONTACTS_SECRET', ''),
+ // ],
+ // //...
+ // ],
+ // ],
+];
diff --git a/backend/database/.gitignore b/backend/database/.gitignore
new file mode 100644
index 00000000..9b1dffd9
--- /dev/null
+++ b/backend/database/.gitignore
@@ -0,0 +1 @@
+*.sqlite
diff --git a/backend/database/factories/ClassTeacherFactory.php b/backend/database/factories/ClassTeacherFactory.php
new file mode 100644
index 00000000..f4801fe7
--- /dev/null
+++ b/backend/database/factories/ClassTeacherFactory.php
@@ -0,0 +1,9 @@
+define(App\ClassTeacher::class, function (Faker $faker) {
+ return [
+ //
+ ];
+});
diff --git a/backend/database/factories/DepartmentFactory.php b/backend/database/factories/DepartmentFactory.php
new file mode 100644
index 00000000..71cbcfb1
--- /dev/null
+++ b/backend/database/factories/DepartmentFactory.php
@@ -0,0 +1,9 @@
+define(App\Department::class, function (Faker $faker) {
+ return [
+ //
+ ];
+});
diff --git a/backend/database/factories/LeaderFactory.php b/backend/database/factories/LeaderFactory.php
new file mode 100644
index 00000000..faa61964
--- /dev/null
+++ b/backend/database/factories/LeaderFactory.php
@@ -0,0 +1,9 @@
+define(App\Leader::class, function (Faker $faker) {
+ return [
+ //
+ ];
+});
diff --git a/backend/database/factories/ModelsPermissionFactory.php b/backend/database/factories/ModelsPermissionFactory.php
new file mode 100644
index 00000000..6d332072
--- /dev/null
+++ b/backend/database/factories/ModelsPermissionFactory.php
@@ -0,0 +1,17 @@
+define(App\Models\Permission::class, function (Faker $faker) {
+ $methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'] ;
+ $pid = random_int(0,8);
+ $type = random_int(1,2);
+ return [
+ //
+ 'name' => $faker->title,
+ 'pid' => $pid,
+ 'type' => $type,
+ 'method' => $type == 2 ? $faker->randomElement($methods): '',
+ 'route_name' => $type == 2 ? $faker->title: '',
+ ];
+});
diff --git a/backend/database/factories/RoleFactory.php b/backend/database/factories/RoleFactory.php
new file mode 100644
index 00000000..43a24b0e
--- /dev/null
+++ b/backend/database/factories/RoleFactory.php
@@ -0,0 +1,9 @@
+define(App\Role::class, function (Faker $faker) {
+ return [
+ //
+ ];
+});
diff --git a/backend/database/factories/SessionFactory.php b/backend/database/factories/SessionFactory.php
new file mode 100644
index 00000000..e90c625b
--- /dev/null
+++ b/backend/database/factories/SessionFactory.php
@@ -0,0 +1,9 @@
+define(App\Session::class, function (Faker $faker) {
+ return [
+ //
+ ];
+});
diff --git a/backend/database/factories/TeacherFactory.php b/backend/database/factories/TeacherFactory.php
new file mode 100644
index 00000000..ba2f016c
--- /dev/null
+++ b/backend/database/factories/TeacherFactory.php
@@ -0,0 +1,9 @@
+define(App\Teacher::class, function (Faker $faker) {
+ return [
+ //
+ ];
+});
diff --git a/backend/database/factories/TeachingFactory.php b/backend/database/factories/TeachingFactory.php
new file mode 100644
index 00000000..82f94043
--- /dev/null
+++ b/backend/database/factories/TeachingFactory.php
@@ -0,0 +1,9 @@
+define(App\Teaching::class, function (Faker $faker) {
+ return [
+ //
+ ];
+});
diff --git a/backend/database/factories/UserFactory.php b/backend/database/factories/UserFactory.php
new file mode 100644
index 00000000..052d2e87
--- /dev/null
+++ b/backend/database/factories/UserFactory.php
@@ -0,0 +1,25 @@
+define(App\User::class, function (Faker $faker) {
+ static $password;
+
+ return [
+ 'name' => $faker->name,
+ 'email' => $faker->unique()->safeEmail,
+ 'password' => $password ?: $password = bcrypt('111111'),
+ 'remember_token' => str_random(10),
+ ];
+});
\ No newline at end of file
diff --git a/backend/database/migrations/2014_10_12_000000_create_users_table.php b/backend/database/migrations/2014_10_12_000000_create_users_table.php
new file mode 100644
index 00000000..f82241b4
--- /dev/null
+++ b/backend/database/migrations/2014_10_12_000000_create_users_table.php
@@ -0,0 +1,38 @@
+increments('id');
+ $table->string('name');
+ $table->string('email')->unique();
+ $table->string('password');
+ $table->string('role', 50)->default('editor')->comment('权限组');
+ $table->string('avatar', 100)->nullable()->comment('头像');
+ $table->rememberToken();
+ $table->softDeletes();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('users');
+ }
+}
diff --git a/backend/database/migrations/2014_10_12_100000_create_password_resets_table.php b/backend/database/migrations/2014_10_12_100000_create_password_resets_table.php
new file mode 100644
index 00000000..0d5cb845
--- /dev/null
+++ b/backend/database/migrations/2014_10_12_100000_create_password_resets_table.php
@@ -0,0 +1,32 @@
+string('email')->index();
+ $table->string('token');
+ $table->timestamp('created_at')->nullable();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('password_resets');
+ }
+}
diff --git a/backend/database/migrations/2017_12_04_184516_create_checks_table.php b/backend/database/migrations/2017_12_04_184516_create_checks_table.php
new file mode 100644
index 00000000..bab47c39
--- /dev/null
+++ b/backend/database/migrations/2017_12_04_184516_create_checks_table.php
@@ -0,0 +1,34 @@
+increments('id');
+ $table->string('phone', 11);
+ $table->unsignedInteger('verify')->unsigned();
+ $table->timestamps();
+ $table->unique('phone');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('checks');
+ }
+}
diff --git a/backend/database/migrations/2017_12_21_013247_create_teachings_table.php b/backend/database/migrations/2017_12_21_013247_create_teachings_table.php
new file mode 100644
index 00000000..3a412c33
--- /dev/null
+++ b/backend/database/migrations/2017_12_21_013247_create_teachings_table.php
@@ -0,0 +1,40 @@
+increments('id');
+ $table->unsignedSmallInteger('teacher_id')->comment('教师ID');
+ $table->unsignedSmallInteger('session_id')->comment('学期ID');
+ $table->unsignedTinyInteger('grade')->comment('年级 1、2、3');
+ $table->unsignedTinyInteger('class_id')->comment('教学班级');
+ $table->unsignedTinyInteger('teach_id')->comment('教学科目');
+ $table->unsignedTinyInteger('hour')->nullable()->comment('教学课时');
+ $table->string('remark',50)->nullable()->comment('备注');
+ $table->softDeletes();
+ $table->timestamps();
+ $table->comment = '分学期的教学信息表';
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('teachings');
+ }
+}
diff --git a/backend/database/migrations/2017_12_21_013300_create_sessions_table.php b/backend/database/migrations/2017_12_21_013300_create_sessions_table.php
new file mode 100644
index 00000000..83ba89e4
--- /dev/null
+++ b/backend/database/migrations/2017_12_21_013300_create_sessions_table.php
@@ -0,0 +1,36 @@
+increments('id');
+ $table->unsignedSmallInteger('year')->comment('学年'); // 2016代表2016-2017 2017代表2017-2018
+ $table->unsignedTinyInteger('team')->default('1')->comment('学期 1 上学期 2 下学期'); // 1->上学期 2->下学期
+ $table->string('remark', 50)->nullable()->comment('备注');
+ $table->softDeletes();
+ $table->timestamps();
+ $table->comment ='学期表';
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('sessions');
+ }
+}
diff --git a/backend/database/migrations/2017_12_21_013340_create_departments_table.php b/backend/database/migrations/2017_12_21_013340_create_departments_table.php
new file mode 100644
index 00000000..4c288722
--- /dev/null
+++ b/backend/database/migrations/2017_12_21_013340_create_departments_table.php
@@ -0,0 +1,39 @@
+increments('id');
+ $table->unsignedSmallInteger('session_id')->comment('学期ID');
+ $table->unsignedSmallInteger('teacher_id')->comment('教师ID');
+ $table->unsignedtinyInteger('grade')->comment('年级 1、2、3');
+ $table->unsignedtinyInteger('teach_id')->comment('科目ID');
+ $table->unsignedtinyInteger('leader')->comment('学科组长 0->否 1->是')->default(0);
+ $table->string('remark', 50)->nullable()->comment('备注');
+ $table->softDeletes();
+ $table->timestamps();
+ $table->comment = '分学期教研组长信息表';
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('departments');
+ }
+}
diff --git a/backend/database/migrations/2017_12_21_013631_create_leaders_table.php b/backend/database/migrations/2017_12_21_013631_create_leaders_table.php
new file mode 100644
index 00000000..a9ef8d72
--- /dev/null
+++ b/backend/database/migrations/2017_12_21_013631_create_leaders_table.php
@@ -0,0 +1,38 @@
+increments('id');
+ $table->unsignedSmallInteger('session_id')->comment('学期ID');
+ $table->unsignedSmallInteger('teacher_id')->comment('教师ID');
+ $table->unsignedTinyInteger('leader_type')->comment('职务类型 1->中层 2->校级')->default(1);
+ $table->string('job', 20)->comment('工作岗位说明')->nullable();
+ $table->string('remark',50)->nullable()->comment('备注');
+ $table->softDeletes();
+ $table->timestamps();
+ $table->comment = '分学期领导信息表';
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('leaders');
+ }
+}
diff --git a/backend/database/migrations/2017_12_21_025101_create_class_teachers_table.php b/backend/database/migrations/2017_12_21_025101_create_class_teachers_table.php
new file mode 100644
index 00000000..112c2456
--- /dev/null
+++ b/backend/database/migrations/2017_12_21_025101_create_class_teachers_table.php
@@ -0,0 +1,38 @@
+increments('id');
+ $table->unsignedSmallInteger('session_id')->comment('学期ID');
+ $table->unsignedSmallInteger('teacher_id')->comment('教师ID');
+ $table->unsignedtinyInteger('grade')->comment('年级 1、2、3');
+ $table->unsignedtinyInteger('class_id')->comment('班级');
+ $table->string('remark', 50)->nullable()->comment('备注');
+ $table->softDeletes();
+ $table->timestamps();
+ $table->comment = '分学期班主任信息表';
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('class_teachers');
+ }
+}
diff --git a/backend/database/migrations/2017_12_25_102529_create_roles_table.php b/backend/database/migrations/2017_12_25_102529_create_roles_table.php
new file mode 100644
index 00000000..ff0e7ee4
--- /dev/null
+++ b/backend/database/migrations/2017_12_25_102529_create_roles_table.php
@@ -0,0 +1,36 @@
+increments('id');
+ $table->string('name', '20')->comment('名称');
+ $table->string('explain', '20')->comment('说明');
+ $table->string('permission', '50')->comment('资源列表')->nullable();
+ $table->string('remark', '50')->comment('备注')->nullable();
+ $table->softDeletes();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('roles');
+ }
+}
diff --git a/backend/database/migrations/2017_12_25_131341_add_clumn_into_sessions.php b/backend/database/migrations/2017_12_25_131341_add_clumn_into_sessions.php
new file mode 100644
index 00000000..adf5030d
--- /dev/null
+++ b/backend/database/migrations/2017_12_25_131341_add_clumn_into_sessions.php
@@ -0,0 +1,35 @@
+unsignedTinyInteger('one')->comment('高一班级数');
+ $table->unsignedTinyInteger('two')->comment('高二班级数');
+ $table->unsignedTinyInteger('three')->comment('高三班级数');
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::table('sessions', function (Blueprint $table) {
+ //
+ });
+ }
+}
diff --git a/backend/database/migrations/2018_02_13_112400_create_permissions_table.php b/backend/database/migrations/2018_02_13_112400_create_permissions_table.php
new file mode 100644
index 00000000..d24de32a
--- /dev/null
+++ b/backend/database/migrations/2018_02_13_112400_create_permissions_table.php
@@ -0,0 +1,39 @@
+increments('id');
+ $table->string('name')->comment('功能名称');
+ $table->unsignedInteger('pid')->comment('父节点');
+ $table->unsignedTinyInteger('type')->comment('节点类型(1->分组 2->节点)');
+ $table->string('method')->comment('方法');
+ $table->string('route_name')->comment('路由名称');
+ $table->string('route_match')->nullable()->comment('路由模式');
+ $table->string('remark')->nullable()->comment('功能备注');
+ $table->softDeletes();
+ $table->timestamps();
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ Schema::dropIfExists('permissions');
+ }
+}
diff --git a/backend/database/seeds/DatabaseSeeder.php b/backend/database/seeds/DatabaseSeeder.php
new file mode 100644
index 00000000..2399bf11
--- /dev/null
+++ b/backend/database/seeds/DatabaseSeeder.php
@@ -0,0 +1,16 @@
+call(UsersTableSeeder::class);
+ }
+}
diff --git a/backend/database/seeds/RolesTableSeeder.php b/backend/database/seeds/RolesTableSeeder.php
new file mode 100644
index 00000000..33b5f12a
--- /dev/null
+++ b/backend/database/seeds/RolesTableSeeder.php
@@ -0,0 +1,30 @@
+insert([
+ 'name' => 'admin',
+ 'explain' => '管理员',
+ 'created_at' => Carbon::now(),
+ 'updated_at' => Carbon::now()
+
+ ]);
+ DB::table('roles')->insert([
+ 'name' => 'user',
+ 'explain' => '用户',
+ 'created_at' => Carbon::now(),
+ 'updated_at' => Carbon::now()
+ ]);
+ }
+}
diff --git a/backend/database/seeds/UsersTableSeeder.php b/backend/database/seeds/UsersTableSeeder.php
new file mode 100644
index 00000000..46980e2d
--- /dev/null
+++ b/backend/database/seeds/UsersTableSeeder.php
@@ -0,0 +1,33 @@
+insert([
+ 'name' => 'wmhello',
+ 'email' => '871228582@qq.com',
+ 'password' => bcrypt('123456'),
+ 'role' => 'admin',
+ 'avatar' => 'uploads/201711251441th5a19812148058.jpg',
+ 'remember_token' => str_random(10),
+ ]);
+
+ DB::table('users')->insert([
+ 'name' => 'dongdong',
+ 'email' => '786270744@qq.com',
+ 'password' => bcrypt('123456'),
+ 'role' => 'editor',
+ 'avatar' => 'uploads/201711251509th5a19879c71868.jpg',
+ 'remember_token' => str_random(10),
+ ]);
+ }
+}
diff --git a/backend/package.json b/backend/package.json
new file mode 100644
index 00000000..dedcbef7
--- /dev/null
+++ b/backend/package.json
@@ -0,0 +1,21 @@
+{
+ "private": true,
+ "scripts": {
+ "dev": "npm run development",
+ "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "watch-poll": "npm run watch -- --watch-poll",
+ "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
+ "prod": "npm run production",
+ "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
+ },
+ "devDependencies": {
+ "axios": "^0.16.2",
+ "bootstrap-sass": "^3.3.7",
+ "cross-env": "^5.0.1",
+ "jquery": "^3.1.1",
+ "laravel-mix": "^1.0",
+ "lodash": "^4.17.4",
+ "vue": "^2.1.10"
+ }
+}
diff --git a/backend/phpunit.xml b/backend/phpunit.xml
new file mode 100644
index 00000000..bb9c4a7e
--- /dev/null
+++ b/backend/phpunit.xml
@@ -0,0 +1,31 @@
+
+
用户昵称
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "email", + "description": "用户登陆名 email格式 必须唯一
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "用户登陆密码
" + }, + { + "group": "Parameter", + "type": "string", + "allowedValues": [ + "\"admin\"", + "\"editor\"" + ], + "optional": true, + "field": "role", + "defaultValue": "editor", + "description": "角色 内容为空或者其他的都设置为editor
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "avatar", + "description": "用户头像地址
" + } + ] + }, + "examples": [ + { + "title": "请求的参数例子:", + "content": "{\n name: 'test',\n email: '1111@qq.com',\n password: '123456',\n role: 'editor',\n avatar: 'uploads/20178989.png'\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "新建用户成功", + "content": "HTTP/1.1 201 OK\n{\n\"status\": \"success\",\n\"status_code\": 201\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"信息提交不完全或者不规范,校验不通过,请重新提交\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdmin" + }, + { + "type": "post", + "url": "/api/admin/:id/reset", + "title": "重置指定管理员的密码", + "group": "admin", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "用户密码
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "返回密码设置成功的结果", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdminIdReset" + }, + { + "type": "post", + "url": "/api/admin/upload", + "title": "头像图片上传", + "group": "admin", + "header": { + "examples": [ + { + "title": "http头部请求:", + "content": "{\n \"content-type\": \"application/form-data\"\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "上传成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200,\n\"data\": {\n \"url\" : 'uploads/3201278123689.png'\n }\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "上传失败", + "content": "HTTP/1.1 400 ERROR\n{\n\"status\": \"error\",\n\"status_code\": 400\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdminUpload" + }, + { + "type": "put", + "url": "/api/admin/:id", + "title": "更新指定的管理员", + "group": "admin", + "header": { + "examples": [ + { + "title": "http头部请求:", + "content": "{\n \"content-type\": \"application/x-www-form-urlencoded\"\n}", + "type": "json" + } + ] + }, + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "用户昵称
" + }, + { + "group": "Parameter", + "type": "string", + "allowedValues": [ + "\"admin\"", + "\"editor\"" + ], + "optional": true, + "field": "role", + "defaultValue": "editor", + "description": "角色 内容为空或者其他的都设置为editor
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "avatar", + "description": "用户头像地址
" + } + ] + }, + "examples": [ + { + "title": "请求参数例子", + "content": "{\n name: 'test',\n role: 'editor',\n avatar: 'uploads/20174356.png'\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "返回密码设置成功的结果", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"信息提交不完全或者不规范,校验不通过,请重新提交\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PutApiAdminId" + }, + { + "type": "delete", + "url": "/api/classTeacher/:id", + "title": "删除指定的班主任信息", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "班主任标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "操作成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "操作失败 指定的信息不存在", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "DeleteApiClassteacherId" + }, + { + "type": "get", + "url": "/api/classTeacher", + "title": "获取班主任列表", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "session_id", + "description": "学期ID 默认为当前学期
" + }, + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "teacher_id", + "description": "教师ID 默认为空
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取班主任列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n{\n\"id\": 1,\n\"session_id\": 3,\n\"teacher_id\": 140,\n\"grade\": 1,\n\"class\": 1,\n\"remark\": null\n}\n],\n\"status\": \"success\",\n\"status_code\": 200,\n\"links\": {\n\"first\": \"http://manger.test/api/classTeacher?page=1\",\n\"last\": \"http://manger.test/api/classTeacher?page=1\",\n\"prev\": null,\n\"next\": null\n},\n\"meta\": {\n\"current_page\": 1,\n\"from\": 1,\n\"last_page\": 1,\n\"path\": \"http://manger.test/api/classTeacher\",\n\"per_page\": 15,\n\"to\": 13,\n\"total\": 13\n}\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "GetApiClassteacher" + }, + { + "type": "get", + "url": "/api/classTeacher/:id", + "title": "获取指定的班主任信息", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "班主任标识ID
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取班主任列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n{\n\"id\": 1,\n\"session_id\": 3,\n\"teacher_id\": 140,\n\"grade\": 1,\n\"class\": 1,\n\"remark\": null\n}\n],\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "GetApiClassteacherId" + }, + { + "type": "patch", + "url": "/api/classTeacher/:id", + "title": "更新指定的班主任信息", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "班主任标识
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "class", + "description": "班级
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2", + "3" + ], + "optional": false, + "field": "grade", + "description": "年级
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 创建新的班主任信息", + "content": "{\nid: 15,\nsession_id: 3,\nteacher_id: 168,\nclass: 10,\ngrade: 1,\nremark: '高一10班'\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "指定的班级不存在", + "content": "HTTP/1.1 416 Satisfiable\n{\n\"status\": 'error',\n\"status_code\": 416,\n\"message\": '数据校验出错,指定的班级不存在'\n}", + "type": "json" + }, + { + "title": "操作失败", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "PatchApiClassteacherId" + }, + { + "type": "post", + "url": "/api/classTeacher", + "title": "创建新的班主任信息", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "class", + "description": "班级
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2", + "3" + ], + "optional": false, + "field": "grade", + "description": "年级
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 创建新的班主任信息:", + "content": "{\nsession_id: 3,\nteacher_id: 168,\nclass: 10,\ngrade: 1,\nremark: '高一10班'\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "指定的班级不存在:", + "content": "HTTP/1.1 416 Satisfiable\n{\n\"status\": 'error',\n\"status_code\": 416,\n\"message\": '数据校验出错,指定的班级不存在'\n}", + "type": "json" + }, + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "PostApiClassteacher" + }, + { + "type": "post", + "url": "/api/classTeacher/upload", + "title": "导入班主任信息", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "file", + "description": "要导入的文件
" + } + ] + }, + "examples": [ + { + "title": "请求事例 导入指定学期的班主任数据", + "content": "{\nsession_id: 3,\nfile: 'd:/3.xls'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "http头部例子", + "content": "{\n \"content-type\": \"multipart/form-data\"\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "操作失败", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "PostApiClassteacherUpload" + }, + { + "type": "delete", + "url": "/api/department/:id", + "title": "删除指定的学科组长信息", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学科组长标识ID
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "操作失败,指定的内容已经删除:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "DeleteApiDepartmentId" + }, + { + "type": "get", + "url": "/api/department", + "title": "获取学科组长列表", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "session_id", + "description": "学期ID 默认为当前学期
" + }, + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "0", + "1" + ], + "optional": true, + "field": "leader", + "description": "学科组长 0=>备课组长 1=>学科组长 默认包含所有
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取学科组长列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n{\n\"id\": 1,\n\"session_id\": 3,\n\"teacher_id\": 129,\n\"teach_id\": 17,\n\"leader\": 0,\n\"grade\": 1,\n\"remark\": \"高一语文\"\n}\n],\n\"status\": \"success\",\n\"status_code\": 200,\n\"links\": {\n\"first\": \"http://manger.test/api/department?page=1\",\n\"last\": \"http://manger.test/api/department?page=1\",\n\"prev\": null,\n\"next\": null\n},\n\"meta\": {\n\"current_page\": 1,\n\"from\": 1,\n\"last_page\": 1,\n\"path\": \"http://manger.test/api/department\",\n\"per_page\": 15,\n\"to\": 9,\n\"total\": 9\n}\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "GetApiDepartment" + }, + { + "type": "get", + "url": "/api/department/:id", + "title": "获取指定的学科组长信息", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学科组长标识ID
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取指定的学科组长信息", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n{\n\"id\": 1,\n\"session_id\": 3,\n\"teacher_id\": 129,\n\"teach_id\": 17,\n\"leader\": 0,\n\"grade\": 1,\n\"remark\": \"高一语文\"\n}\n],\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "GetApiDepartmentId" + }, + { + "type": "patch", + "url": "/api/department/:id", + "title": "更新指定的学科组长信息", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学科组长标识ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "0", + "1" + ], + "optional": false, + "field": "leader", + "description": "学科组长类型(0=>备课组长 1=>学科组长)
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2", + "3" + ], + "optional": false, + "field": "grade", + "description": "年级
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teach_id", + "description": "科目 结合科目表
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nid:10,\nsession_id: 3,\nteacher_id: 168,\nleader: 0,\ngrade: 1,\nteach_id: 7\nremark: '信息技术'\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "PatchApiDepartmentId" + }, + { + "type": "post", + "url": "/api/department", + "title": "创建新的学科组长信息", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "0", + "1" + ], + "optional": false, + "field": "leader", + "description": "学科组长类型(0=>备课组长 1=>学科组长)
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2", + "3" + ], + "optional": false, + "field": "grade", + "description": "年级
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teach_id", + "description": "科目 结合科目表
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nsession_id: 3,\nteacher_id: 168,\nleader: 0,\ngrade: 1,\nteach_id: 7\nremark: '高一信息技术'\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "PostApiDepartment" + }, + { + "type": "post", + "url": "/api/department/upload", + "title": "导入学科组长信息", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "file", + "description": "要导入的文件
" + } + ] + }, + "examples": [ + { + "title": "请求事例 导入指定学期的学科组长数据:", + "content": "{\nsession_id: 3,\nfile: 'd:/3.xls'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "http头部例子", + "content": "{\n \"content-type\": \"multipart/form-data\"\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "PostApiDepartmentUpload" + }, + { + "success": { + "fields": { + "Success 200": [ + { + "group": "Success 200", + "optional": false, + "field": "varname1", + "description": "No type.
" + }, + { + "group": "Success 200", + "type": "String", + "optional": false, + "field": "varname2", + "description": "With type.
" + } + ] + } + }, + "type": "", + "url": "", + "version": "0.0.0", + "filename": "./public/apidoc/main.js", + "group": "e__manger_backend_public_apidoc_main_js", + "groupTitle": "e__manger_backend_public_apidoc_main_js", + "name": "" + }, + { + "type": "delete", + "url": "/api/leader/:id", + "title": "删除指定的学校行政信息", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "删除成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "删除失败", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + }, + { + "title": "指定的ID不存在,无法处理", + "content": "HTTP/1.1 500 Internal Server Error\n{\n\"status\": \"error\",\n\"status_code\": 500\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "DeleteApiLeaderId" + }, + { + "type": "get", + "url": "/api/leader", + "title": "获取学校行政列表", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "teacher_id", + "description": "教师ID
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取学校行政列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 13,\n \"session_id\": 3,\n \"teacher_id\": 45,\n \"leader_type\": 2,\n \"job\": \"校长\",\n \"remark\": null\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n \"links\": {\n \"first\": \"http://manger.test/api/leader?page=1\",\n \"last\": \"http://manger.test/api/leader?page=1\",\n \"prev\": null,\n \"next\": null\n },\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 1,\n \"path\": \"http://manger.test/api/leader\",\n \"per_page\": 15,\n \"to\": 3,\n \"total\": 3\n }\n }", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "GetApiLeader" + }, + { + "type": "get", + "url": "/api/leader/:id", + "title": "获取指定的学校行政信息", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "指定的ID
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取指定的学校行政信息", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 13,\n \"session_id\": 3,\n \"teacher_id\": 45,\n \"leader_type\": 2,\n \"job\": \"校长\",\n \"remark\": null\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n }", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "GetApiLeaderId" + }, + { + "type": "post", + "url": "/api/leader", + "title": "新增学校行政信息", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "leader_type", + "description": "行政类型(1=>中层 2=>学校)
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "job", + "description": "职务描述 可选
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nsession_id: 3,\nteacher_id: 168,\nleader_type: 1,\njob: '教务副主任',\nremark: ''\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "PostApiLeader" + }, + { + "type": "post", + "url": "/api/leader/id", + "title": "更新指定的学校行政信息", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "指定的ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "leader_type", + "description": "行政类型(1=>中层 2=>学校)
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "job", + "description": "职务描述 可选
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nsession_id: 3,\nteacher_id: 168,\nleader_type: 1,\njob: '教务副主任',\nremark: '主管学校教学考试与教育信息化'\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "PostApiLeaderId" + }, + { + "type": "post", + "url": "/api/leader/upload", + "title": "导入行政领导信息", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "file", + "description": "要导入的文件
" + } + ] + }, + "examples": [ + { + "title": "请求事例 导入指定学期的行政领导数据:", + "content": "{\nsession_id: 3,\nfile: 'd:/3.xls'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "http头部例子", + "content": "{\n \"content-type\": \"multipart/form-data\"\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "PostApiLeaderUpload" + }, + { + "type": "get", + "url": "/api/user", + "title": "获取当前登陆的用户信息", + "group": "login", + "success": { + "examples": [ + { + "title": "信息获取成功", + "content": "HTTP/1.1 200 OK\n{\n\"data\": {\n \"id\": 1,\n \"name\": \"xxx\",\n \"email\": \"xxx@qq.com\",\n \"roles\": \"xxx\", //角色: admin或者editor\n \"avatar\": \"\"\n },\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./routes/api.php", + "groupTitle": "login", + "name": "GetApiUser" + }, + { + "type": "post", + "url": "/api/login", + "title": "用户登陆", + "group": "login", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "email", + "description": "用户email
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "用户密码
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "登陆成功", + "content": "HTTP/1.1 200 OK\n{\n\"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJS\",\n\"expires_in\": 900 // 过期时间\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "用户身份验证失败", + "content": "HTTP/1.1 421 用户名或者密码输入错误\n{\n\"status\": \"login error\",\n\"status_code\": 421,\n\"message\": \"Credentials not match\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiLogin" + }, + { + "type": "post", + "url": "/api/logout", + "title": "注销用户登陆", + "group": "login", + "success": { + "examples": [ + { + "title": "注销成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200,\n\"message\": \"logout success\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiLogout" + }, + { + "type": "post", + "url": "/api/token/refresh", + "title": "Token刷新", + "group": "login", + "success": { + "examples": [ + { + "title": "刷新成功", + "content": "HTTP/1.1 200 OK\n{\n\"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJS\",\n\"expires_in\": 900 // 过期时间\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "刷新失败", + "content": "HTTP/1.1 401 未认证\n{\n\"status\": \"login error\",\n\"status_code\": 401,\n\"message\": \"Credentials not match\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiTokenRefresh" + }, + { + "type": "get", + "url": "/api/getSession", + "title": "获取学期信息", + "group": "other", + "success": { + "examples": [ + { + "title": "返回学期信息列表,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "other", + "name": "GetApiGetsession" + }, + { + "type": "get", + "url": "/api/getTeach", + "title": "获取学科名称和id", + "group": "other", + "success": { + "examples": [ + { + "title": "返回学科和id列表,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学科标识\n \"name\": '体育' //字符型 教学科目\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/TeachController.php", + "groupTitle": "other", + "name": "GetApiGetteach" + }, + { + "type": "get", + "url": "/api/getTeacher", + "title": "获取教师姓名和id", + "group": "other", + "success": { + "examples": [ + { + "title": "返回教师姓名和id列表,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 教师标识\n \"name\": '测试' //字符型 教师姓名\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/TeacherController.php", + "groupTitle": "other", + "name": "GetApiGetteacher" + }, + { + "type": "delete", + "url": "/api/role/:id", + "title": "删除指定的角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "角色标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "删除失败,没有指定的角色:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"删除失败\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "DeleteApiRoleId" + }, + { + "type": "get", + "url": "/api/role", + "title": "显示学期列表", + "group": "role", + "success": { + "examples": [ + { + "title": "返回所有的角色", + "content": "HTTP/1.1 200 OK\n {\n \"data\": [\n {\n \"id\": 2,\n \"name\": \"admin\",\n \"explain\": \"管理员\",\n \"remark\": null\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n \"links\": {\n \"first\": \"http://manger.test/api/role?page=1\",\n \"last\": \"http://manger.test/api/role?page=1\",\n \"prev\": null,\n \"next\": null\n },\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 1,\n \"path\": \"http://manger.test/api/role\",\n \"per_page\": 15,\n \"to\": 30,\n \"total\": 5\n }\n }", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "GetApiRole" + }, + { + "type": "get", + "url": "/api/role/:id", + "title": "获取一条角色", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "角色标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n {\n \"id\": 2,\n \"name\": \"admin\",\n \"explain\": \"管理员\",\n \"remark\": null\n }\n],\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "指定的角色不存在:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "GetApiRoleId" + }, + { + "type": "patch", + "url": "/api/role/:id", + "title": "更新角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "角色标识 路由上使用
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "角色名称
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "explain", + "description": "角色描述
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nname: 'admin',\nexplain: '管理员',\nremark: '管理员'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "PatchApiRoleId" + }, + { + "type": "post", + "url": "/api/role", + "title": "新建一条角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "角色名称
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "explain", + "description": "角色说明
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "角色备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建", + "content": "{\nname: 'app',\nexplain: '应用管理者'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "PostApiRole" + }, + { + "type": "delete", + "url": "/api/session/:id", + "title": "删除指定的学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学期标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "删除失败,没有指定的学期:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"删除失败\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "DeleteApiSessionId" + }, + { + "type": "get", + "url": "/api/session", + "title": "显示学期列表", + "group": "session", + "success": { + "examples": [ + { + "title": "返回学期信息列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n \"remark\": \"2016-2017下学期\" // 备注说明\n \"one\": 20, // 高一年级班级数\n \"two\": 20, // 高二年级班级数\n \"three\": 20 // 高三年级班级数\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n \"links\": {\n \"first\": \"http://manger.test/api/session?page=1\",\n \"last\": \"http://manger.test/api/session?page=1\",\n \"prev\": null,\n \"next\": null\n },\n \"meta\": {\n \"current_page\": 1, //当前页\n \"from\": 1, // 当前记录\n \"last_page\": 1, //最后一页\n \"path\": \"http://manger.test/api/session\",\n \"per_page\": 15, //\n \"to\": 4, //当前页最后一条记录\n \"total\": 4 // 总记录\n }\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "GetApiSession" + }, + { + "type": "get", + "url": "/api/session/:id", + "title": "获取指定学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学期标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n \"remark\": \"2016-2017下学期\" // 备注说明\n \"one\": 20, // 高一年级班级数\n \"two\": 20, // 高二年级班级数\n \"three\": 20 // 高三年级班级数\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "指定的学期不能存在:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "GetApiSessionId" + }, + { + "type": "patch", + "url": "/api/session/:id", + "title": "更新学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学期标识 路由上使用
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "year", + "description": "学年
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "team", + "description": "学期(1=>上学期 2=>下学期)
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "one", + "description": "高一班级数
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "two", + "description": "高二班级数
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "three", + "description": "高三班级数
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": " {\n year: 2017,\n team: 1,\n remark: '2017-2018上学期',\n one: 20,\n two: 20,\n three: 20\n\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"验证出错,请按要求填写\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "PatchApiSessionId" + }, + { + "type": "post", + "url": "/api/session", + "title": "新建一个学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "year", + "description": "学年
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "team", + "description": "学期(1=>上学期 2=>下学期)
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "one", + "description": "高一班级数
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "two", + "description": "高二班级数
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "three", + "description": "高三班级数
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": " {\n year: 2017,\n team: 1,\n one: 20,\n two: 20,\n three: 20\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"验证出错,请按要求填写\"\n}", + "type": "json" + }, + { + "title": "重复提交:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 400,\n \"message\": \"你提交的学期信息已经存在,无法新建\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "PostApiSession" + } +] }); diff --git a/backend/public/apidoc/api_data.json b/backend/public/apidoc/api_data.json new file mode 100644 index 00000000..2cd967e0 --- /dev/null +++ b/backend/public/apidoc/api_data.json @@ -0,0 +1,2159 @@ +[ + { + "type": "delete", + "url": "/api/admin/:id", + "title": "删除指定的管理员", + "group": "admin", + "success": { + "examples": [ + { + "title": "用户删除成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "用户删除失败", + "content": "HTTP/1.1 404 ERROR\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "DeleteApiAdminId" + }, + { + "type": "get", + "url": "/api/admin", + "title": "显示管理员列表", + "group": "admin", + "success": { + "examples": [ + { + "title": "返回管理员信息列表", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 用户标识\n \"name\": \"test\" //字符型 用户昵称\n \"email\": \"test@qq.com\" // 字符型 用户email,管理员登录时的email\n \"role\": \"admin\" // 字符型 角色 可以取得值为admin或editor\n \"avatar\": \"\" // 字符型 用户的头像图片\n }\n ],\n\"status\": \"success\",\n\"status_code\": 200,\n\"links\": {\n\"first\": \"http://manger.test/api/admin?page=1\",\n\"last\": \"http://manger.test/api/admin?page=19\",\n\"prev\": null,\n\"next\": \"http://manger.test/api/admin?page=2\"\n},\n\"meta\": {\n\"current_page\": 1, // 当前页\n\"from\": 1, //当前页开始的记录\n\"last_page\": 19, //总页数\n\"path\": \"http://manger.test/api/admin\",\n\"per_page\": 15,\n\"to\": 15, //当前页结束的记录\n\"total\": 271 // 总条数\n}\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "GetApiAdmin" + }, + { + "type": "get", + "url": "/api/admin/:id", + "title": "显示指定的管理员", + "group": "admin", + "success": { + "examples": [ + { + "title": "返回管理员信息", + "content": "HTTP/1.1 200 OK\n{\n\"data\": {\n \"id\": 1,\n \"name\": \"wmhello\",\n \"email\": \"871228582@qq.com\",\n \"role\": \"admin\",\n \"avatar\": \"\"\n},\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "GetApiAdminId" + }, + { + "type": "post", + "url": "/api/admin", + "title": "建立新的管理员", + "group": "admin", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "用户昵称
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "email", + "description": "用户登陆名 email格式 必须唯一
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "用户登陆密码
" + }, + { + "group": "Parameter", + "type": "string", + "allowedValues": [ + "\"admin\"", + "\"editor\"" + ], + "optional": true, + "field": "role", + "defaultValue": "editor", + "description": "角色 内容为空或者其他的都设置为editor
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "avatar", + "description": "用户头像地址
" + } + ] + }, + "examples": [ + { + "title": "请求的参数例子:", + "content": "{\n name: 'test',\n email: '1111@qq.com',\n password: '123456',\n role: 'editor',\n avatar: 'uploads/20178989.png'\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "新建用户成功", + "content": "HTTP/1.1 201 OK\n{\n\"status\": \"success\",\n\"status_code\": 201\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"信息提交不完全或者不规范,校验不通过,请重新提交\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdmin" + }, + { + "type": "post", + "url": "/api/admin/:id/reset", + "title": "重置指定管理员的密码", + "group": "admin", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "用户密码
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "返回密码设置成功的结果", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdminIdReset" + }, + { + "type": "post", + "url": "/api/admin/upload", + "title": "头像图片上传", + "group": "admin", + "header": { + "examples": [ + { + "title": "http头部请求:", + "content": "{\n \"content-type\": \"application/form-data\"\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "上传成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200,\n\"data\": {\n \"url\" : 'uploads/3201278123689.png'\n }\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "上传失败", + "content": "HTTP/1.1 400 ERROR\n{\n\"status\": \"error\",\n\"status_code\": 400\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PostApiAdminUpload" + }, + { + "type": "put", + "url": "/api/admin/:id", + "title": "更新指定的管理员", + "group": "admin", + "header": { + "examples": [ + { + "title": "http头部请求:", + "content": "{\n \"content-type\": \"application/x-www-form-urlencoded\"\n}", + "type": "json" + } + ] + }, + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "用户昵称
" + }, + { + "group": "Parameter", + "type": "string", + "allowedValues": [ + "\"admin\"", + "\"editor\"" + ], + "optional": true, + "field": "role", + "defaultValue": "editor", + "description": "角色 内容为空或者其他的都设置为editor
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "avatar", + "description": "用户头像地址
" + } + ] + }, + "examples": [ + { + "title": "请求参数例子", + "content": "{\n name: 'test',\n role: 'editor',\n avatar: 'uploads/20174356.png'\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "返回密码设置成功的结果", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"信息提交不完全或者不规范,校验不通过,请重新提交\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/UserController.php", + "groupTitle": "admin", + "name": "PutApiAdminId" + }, + { + "type": "delete", + "url": "/api/classTeacher/:id", + "title": "删除指定的班主任信息", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "班主任标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "操作成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "操作失败 指定的信息不存在", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "DeleteApiClassteacherId" + }, + { + "type": "get", + "url": "/api/classTeacher", + "title": "获取班主任列表", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "session_id", + "description": "学期ID 默认为当前学期
" + }, + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "teacher_id", + "description": "教师ID 默认为空
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取班主任列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n{\n\"id\": 1,\n\"session_id\": 3,\n\"teacher_id\": 140,\n\"grade\": 1,\n\"class\": 1,\n\"remark\": null\n}\n],\n\"status\": \"success\",\n\"status_code\": 200,\n\"links\": {\n\"first\": \"http://manger.test/api/classTeacher?page=1\",\n\"last\": \"http://manger.test/api/classTeacher?page=1\",\n\"prev\": null,\n\"next\": null\n},\n\"meta\": {\n\"current_page\": 1,\n\"from\": 1,\n\"last_page\": 1,\n\"path\": \"http://manger.test/api/classTeacher\",\n\"per_page\": 15,\n\"to\": 13,\n\"total\": 13\n}\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "GetApiClassteacher" + }, + { + "type": "get", + "url": "/api/classTeacher/:id", + "title": "获取指定的班主任信息", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "班主任标识ID
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取班主任列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n{\n\"id\": 1,\n\"session_id\": 3,\n\"teacher_id\": 140,\n\"grade\": 1,\n\"class\": 1,\n\"remark\": null\n}\n],\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "GetApiClassteacherId" + }, + { + "type": "patch", + "url": "/api/classTeacher/:id", + "title": "更新指定的班主任信息", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "班主任标识
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "class", + "description": "班级
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2", + "3" + ], + "optional": false, + "field": "grade", + "description": "年级
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 创建新的班主任信息", + "content": "{\nid: 15,\nsession_id: 3,\nteacher_id: 168,\nclass: 10,\ngrade: 1,\nremark: '高一10班'\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "指定的班级不存在", + "content": "HTTP/1.1 416 Satisfiable\n{\n\"status\": 'error',\n\"status_code\": 416,\n\"message\": '数据校验出错,指定的班级不存在'\n}", + "type": "json" + }, + { + "title": "操作失败", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "PatchApiClassteacherId" + }, + { + "type": "post", + "url": "/api/classTeacher", + "title": "创建新的班主任信息", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "class", + "description": "班级
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2", + "3" + ], + "optional": false, + "field": "grade", + "description": "年级
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 创建新的班主任信息:", + "content": "{\nsession_id: 3,\nteacher_id: 168,\nclass: 10,\ngrade: 1,\nremark: '高一10班'\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "指定的班级不存在:", + "content": "HTTP/1.1 416 Satisfiable\n{\n\"status\": 'error',\n\"status_code\": 416,\n\"message\": '数据校验出错,指定的班级不存在'\n}", + "type": "json" + }, + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "PostApiClassteacher" + }, + { + "type": "post", + "url": "/api/classTeacher/upload", + "title": "导入班主任信息", + "group": "classTeacher", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "file", + "description": "要导入的文件
" + } + ] + }, + "examples": [ + { + "title": "请求事例 导入指定学期的班主任数据", + "content": "{\nsession_id: 3,\nfile: 'd:/3.xls'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "http头部例子", + "content": "{\n \"content-type\": \"multipart/form-data\"\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "操作失败", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/ClassTeacherController.php", + "groupTitle": "classTeacher", + "name": "PostApiClassteacherUpload" + }, + { + "type": "delete", + "url": "/api/department/:id", + "title": "删除指定的学科组长信息", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学科组长标识ID
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "操作失败,指定的内容已经删除:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "DeleteApiDepartmentId" + }, + { + "type": "get", + "url": "/api/department", + "title": "获取学科组长列表", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "session_id", + "description": "学期ID 默认为当前学期
" + }, + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "0", + "1" + ], + "optional": true, + "field": "leader", + "description": "学科组长 0=>备课组长 1=>学科组长 默认包含所有
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取学科组长列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n{\n\"id\": 1,\n\"session_id\": 3,\n\"teacher_id\": 129,\n\"teach_id\": 17,\n\"leader\": 0,\n\"grade\": 1,\n\"remark\": \"高一语文\"\n}\n],\n\"status\": \"success\",\n\"status_code\": 200,\n\"links\": {\n\"first\": \"http://manger.test/api/department?page=1\",\n\"last\": \"http://manger.test/api/department?page=1\",\n\"prev\": null,\n\"next\": null\n},\n\"meta\": {\n\"current_page\": 1,\n\"from\": 1,\n\"last_page\": 1,\n\"path\": \"http://manger.test/api/department\",\n\"per_page\": 15,\n\"to\": 9,\n\"total\": 9\n}\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "GetApiDepartment" + }, + { + "type": "get", + "url": "/api/department/:id", + "title": "获取指定的学科组长信息", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学科组长标识ID
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取指定的学科组长信息", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n{\n\"id\": 1,\n\"session_id\": 3,\n\"teacher_id\": 129,\n\"teach_id\": 17,\n\"leader\": 0,\n\"grade\": 1,\n\"remark\": \"高一语文\"\n}\n],\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "GetApiDepartmentId" + }, + { + "type": "patch", + "url": "/api/department/:id", + "title": "更新指定的学科组长信息", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学科组长标识ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "0", + "1" + ], + "optional": false, + "field": "leader", + "description": "学科组长类型(0=>备课组长 1=>学科组长)
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2", + "3" + ], + "optional": false, + "field": "grade", + "description": "年级
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teach_id", + "description": "科目 结合科目表
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nid:10,\nsession_id: 3,\nteacher_id: 168,\nleader: 0,\ngrade: 1,\nteach_id: 7\nremark: '信息技术'\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "PatchApiDepartmentId" + }, + { + "type": "post", + "url": "/api/department", + "title": "创建新的学科组长信息", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "0", + "1" + ], + "optional": false, + "field": "leader", + "description": "学科组长类型(0=>备课组长 1=>学科组长)
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2", + "3" + ], + "optional": false, + "field": "grade", + "description": "年级
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teach_id", + "description": "科目 结合科目表
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nsession_id: 3,\nteacher_id: 168,\nleader: 0,\ngrade: 1,\nteach_id: 7\nremark: '高一信息技术'\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "PostApiDepartment" + }, + { + "type": "post", + "url": "/api/department/upload", + "title": "导入学科组长信息", + "group": "department", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "file", + "description": "要导入的文件
" + } + ] + }, + "examples": [ + { + "title": "请求事例 导入指定学期的学科组长数据:", + "content": "{\nsession_id: 3,\nfile: 'd:/3.xls'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "http头部例子", + "content": "{\n \"content-type\": \"multipart/form-data\"\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/DepartmentController.php", + "groupTitle": "department", + "name": "PostApiDepartmentUpload" + }, + { + "success": { + "fields": { + "Success 200": [ + { + "group": "Success 200", + "optional": false, + "field": "varname1", + "description": "No type.
" + }, + { + "group": "Success 200", + "type": "String", + "optional": false, + "field": "varname2", + "description": "With type.
" + } + ] + } + }, + "type": "", + "url": "", + "version": "0.0.0", + "filename": "./public/apidoc/main.js", + "group": "e__manger_backend_public_apidoc_main_js", + "groupTitle": "e__manger_backend_public_apidoc_main_js", + "name": "" + }, + { + "type": "delete", + "url": "/api/leader/:id", + "title": "删除指定的学校行政信息", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "删除成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "删除失败", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + }, + { + "title": "指定的ID不存在,无法处理", + "content": "HTTP/1.1 500 Internal Server Error\n{\n\"status\": \"error\",\n\"status_code\": 500\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "DeleteApiLeaderId" + }, + { + "type": "get", + "url": "/api/leader", + "title": "获取学校行政列表", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": true, + "field": "teacher_id", + "description": "教师ID
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取学校行政列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 13,\n \"session_id\": 3,\n \"teacher_id\": 45,\n \"leader_type\": 2,\n \"job\": \"校长\",\n \"remark\": null\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n \"links\": {\n \"first\": \"http://manger.test/api/leader?page=1\",\n \"last\": \"http://manger.test/api/leader?page=1\",\n \"prev\": null,\n \"next\": null\n },\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 1,\n \"path\": \"http://manger.test/api/leader\",\n \"per_page\": 15,\n \"to\": 3,\n \"total\": 3\n }\n }", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "GetApiLeader" + }, + { + "type": "get", + "url": "/api/leader/:id", + "title": "获取指定的学校行政信息", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "指定的ID
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "获取指定的学校行政信息", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 13,\n \"session_id\": 3,\n \"teacher_id\": 45,\n \"leader_type\": 2,\n \"job\": \"校长\",\n \"remark\": null\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n }", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "GetApiLeaderId" + }, + { + "type": "post", + "url": "/api/leader", + "title": "新增学校行政信息", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "leader_type", + "description": "行政类型(1=>中层 2=>学校)
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "job", + "description": "职务描述 可选
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nsession_id: 3,\nteacher_id: 168,\nleader_type: 1,\njob: '教务副主任',\nremark: ''\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "PostApiLeader" + }, + { + "type": "post", + "url": "/api/leader/id", + "title": "更新指定的学校行政信息", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "指定的ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "teacher_id", + "description": "教师ID
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "leader_type", + "description": "行政类型(1=>中层 2=>学校)
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "job", + "description": "职务描述 可选
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nsession_id: 3,\nteacher_id: 168,\nleader_type: 1,\njob: '教务副主任',\nremark: '主管学校教学考试与教育信息化'\n}", + "type": "object" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 422 Not Found\n{\n\"status\": 422,\n}", + "type": "json" + }, + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "PostApiLeaderId" + }, + { + "type": "post", + "url": "/api/leader/upload", + "title": "导入行政领导信息", + "group": "leader", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "session_id", + "description": "学期ID
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "file", + "description": "要导入的文件
" + } + ] + }, + "examples": [ + { + "title": "请求事例 导入指定学期的行政领导数据:", + "content": "{\nsession_id: 3,\nfile: 'd:/3.xls'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "http头部例子", + "content": "{\n \"content-type\": \"multipart/form-data\"\n}", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "操作失败:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/LeaderController.php", + "groupTitle": "leader", + "name": "PostApiLeaderUpload" + }, + { + "type": "get", + "url": "/api/user", + "title": "获取当前登陆的用户信息", + "group": "login", + "success": { + "examples": [ + { + "title": "信息获取成功", + "content": "HTTP/1.1 200 OK\n{\n\"data\": {\n \"id\": 1,\n \"name\": \"xxx\",\n \"email\": \"xxx@qq.com\",\n \"roles\": \"xxx\", //角色: admin或者editor\n \"avatar\": \"\"\n },\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./routes/api.php", + "groupTitle": "login", + "name": "GetApiUser" + }, + { + "type": "post", + "url": "/api/login", + "title": "用户登陆", + "group": "login", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "email", + "description": "用户email
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "password", + "description": "用户密码
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "登陆成功", + "content": "HTTP/1.1 200 OK\n{\n\"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJS\",\n\"expires_in\": 900 // 过期时间\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "用户身份验证失败", + "content": "HTTP/1.1 421 用户名或者密码输入错误\n{\n\"status\": \"login error\",\n\"status_code\": 421,\n\"message\": \"Credentials not match\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiLogin" + }, + { + "type": "post", + "url": "/api/logout", + "title": "注销用户登陆", + "group": "login", + "success": { + "examples": [ + { + "title": "注销成功", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200,\n\"message\": \"logout success\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiLogout" + }, + { + "type": "post", + "url": "/api/token/refresh", + "title": "Token刷新", + "group": "login", + "success": { + "examples": [ + { + "title": "刷新成功", + "content": "HTTP/1.1 200 OK\n{\n\"token\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJS\",\n\"expires_in\": 900 // 过期时间\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "刷新失败", + "content": "HTTP/1.1 401 未认证\n{\n\"status\": \"login error\",\n\"status_code\": 401,\n\"message\": \"Credentials not match\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/Auth/LoginController.php", + "groupTitle": "login", + "name": "PostApiTokenRefresh" + }, + { + "type": "get", + "url": "/api/getSession", + "title": "获取学期信息", + "group": "other", + "success": { + "examples": [ + { + "title": "返回学期信息列表,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "other", + "name": "GetApiGetsession" + }, + { + "type": "get", + "url": "/api/getTeach", + "title": "获取学科名称和id", + "group": "other", + "success": { + "examples": [ + { + "title": "返回学科和id列表,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学科标识\n \"name\": '体育' //字符型 教学科目\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/TeachController.php", + "groupTitle": "other", + "name": "GetApiGetteach" + }, + { + "type": "get", + "url": "/api/getTeacher", + "title": "获取教师姓名和id", + "group": "other", + "success": { + "examples": [ + { + "title": "返回教师姓名和id列表,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 教师标识\n \"name\": '测试' //字符型 教师姓名\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/TeacherController.php", + "groupTitle": "other", + "name": "GetApiGetteacher" + }, + { + "type": "delete", + "url": "/api/role/:id", + "title": "删除指定的角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "角色标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "删除失败,没有指定的角色:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n\"message\": \"删除失败\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "DeleteApiRoleId" + }, + { + "type": "get", + "url": "/api/role", + "title": "显示学期列表", + "group": "role", + "success": { + "examples": [ + { + "title": "返回所有的角色", + "content": "HTTP/1.1 200 OK\n {\n \"data\": [\n {\n \"id\": 2,\n \"name\": \"admin\",\n \"explain\": \"管理员\",\n \"remark\": null\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n \"links\": {\n \"first\": \"http://manger.test/api/role?page=1\",\n \"last\": \"http://manger.test/api/role?page=1\",\n \"prev\": null,\n \"next\": null\n },\n \"meta\": {\n \"current_page\": 1,\n \"from\": 1,\n \"last_page\": 1,\n \"path\": \"http://manger.test/api/role\",\n \"per_page\": 15,\n \"to\": 30,\n \"total\": 5\n }\n }", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "GetApiRole" + }, + { + "type": "get", + "url": "/api/role/:id", + "title": "获取一条角色", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "角色标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n\"data\": [\n {\n \"id\": 2,\n \"name\": \"admin\",\n \"explain\": \"管理员\",\n \"remark\": null\n }\n],\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "指定的角色不存在:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "GetApiRoleId" + }, + { + "type": "patch", + "url": "/api/role/:id", + "title": "更新角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "角色标识 路由上使用
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "角色名称
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "explain", + "description": "角色描述
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": "{\nname: 'admin',\nexplain: '管理员',\nremark: '管理员'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "PatchApiRoleId" + }, + { + "type": "post", + "url": "/api/role", + "title": "新建一条角色信息", + "group": "role", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "name", + "description": "角色名称
" + }, + { + "group": "Parameter", + "type": "string", + "optional": false, + "field": "explain", + "description": "角色说明
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "角色备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建", + "content": "{\nname: 'app',\nexplain: '应用管理者'\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n\"status\": \"success\",\n\"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n\"status\": \"error\",\n\"status_code\": 404,\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/RoleController.php", + "groupTitle": "role", + "name": "PostApiRole" + }, + { + "type": "delete", + "url": "/api/session/:id", + "title": "删除指定的学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学期标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "删除失败,没有指定的学期:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"删除失败\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "DeleteApiSessionId" + }, + { + "type": "get", + "url": "/api/session", + "title": "显示学期列表", + "group": "session", + "success": { + "examples": [ + { + "title": "返回学期信息列表,分页显示,每页15条记录,", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n \"remark\": \"2016-2017下学期\" // 备注说明\n \"one\": 20, // 高一年级班级数\n \"two\": 20, // 高二年级班级数\n \"three\": 20 // 高三年级班级数\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200,\n \"links\": {\n \"first\": \"http://manger.test/api/session?page=1\",\n \"last\": \"http://manger.test/api/session?page=1\",\n \"prev\": null,\n \"next\": null\n },\n \"meta\": {\n \"current_page\": 1, //当前页\n \"from\": 1, // 当前记录\n \"last_page\": 1, //最后一页\n \"path\": \"http://manger.test/api/session\",\n \"per_page\": 15, //\n \"to\": 4, //当前页最后一条记录\n \"total\": 4 // 总记录\n }\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "GetApiSession" + }, + { + "type": "get", + "url": "/api/session/:id", + "title": "获取指定学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学期标识
" + } + ] + } + }, + "success": { + "examples": [ + { + "title": "信息获取成功:", + "content": "HTTP/1.1 200 OK\n{\n \"data\": [\n {\n \"id\": 2 // 整数型 学期标识\n \"year\": 2016 //数字型 学年\n \"team\": 2 // 数字型 学期\n \"remark\": \"2016-2017下学期\" // 备注说明\n \"one\": 20, // 高一年级班级数\n \"two\": 20, // 高二年级班级数\n \"three\": 20 // 高三年级班级数\n }\n ],\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "指定的学期不能存在:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "GetApiSessionId" + }, + { + "type": "patch", + "url": "/api/session/:id", + "title": "更新学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "id", + "description": "学期标识 路由上使用
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "year", + "description": "学年
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "team", + "description": "学期(1=>上学期 2=>下学期)
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "one", + "description": "高一班级数
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "two", + "description": "高二班级数
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "three", + "description": "高三班级数
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": " {\n year: 2017,\n team: 1,\n remark: '2017-2018上学期',\n one: 20,\n two: 20,\n three: 20\n\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"验证出错,请按要求填写\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "PatchApiSessionId" + }, + { + "type": "post", + "url": "/api/session", + "title": "新建一个学期信息", + "group": "session", + "parameter": { + "fields": { + "Parameter": [ + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "year", + "description": "学年
" + }, + { + "group": "Parameter", + "type": "number", + "allowedValues": [ + "1", + "2" + ], + "optional": false, + "field": "team", + "description": "学期(1=>上学期 2=>下学期)
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "one", + "description": "高一班级数
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "two", + "description": "高二班级数
" + }, + { + "group": "Parameter", + "type": "number", + "optional": false, + "field": "three", + "description": "高三班级数
" + }, + { + "group": "Parameter", + "type": "string", + "optional": true, + "field": "remark", + "description": "备注 可选
" + } + ] + }, + "examples": [ + { + "title": "请求事例 建立学期 2017-2018上学期:", + "content": " {\n year: 2017,\n team: 1,\n one: 20,\n two: 20,\n three: 20\n}", + "type": "object" + } + ] + }, + "header": { + "examples": [ + { + "title": "请求头:", + "content": "{ \"Content-Type\": \"application/x-www-form-urlencoded\" }", + "type": "json" + } + ] + }, + "success": { + "examples": [ + { + "title": "操作成功:", + "content": "HTTP/1.1 200 OK\n{\n \"status\": \"success\",\n \"status_code\": 200\n}", + "type": "json" + } + ] + }, + "error": { + "examples": [ + { + "title": "数据验证出错:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 404,\n \"message\": \"验证出错,请按要求填写\"\n}", + "type": "json" + }, + { + "title": "重复提交:", + "content": "HTTP/1.1 404 Not Found\n{\n \"status\": \"error\",\n \"status_code\": 400,\n \"message\": \"你提交的学期信息已经存在,无法新建\"\n}", + "type": "json" + } + ] + }, + "version": "0.0.0", + "filename": "./app/Http/Controllers/SessionController.php", + "groupTitle": "session", + "name": "PostApiSession" + } +] diff --git a/backend/public/apidoc/api_project.js b/backend/public/apidoc/api_project.js new file mode 100644 index 00000000..a8074808 --- /dev/null +++ b/backend/public/apidoc/api_project.js @@ -0,0 +1,16 @@ +define({ + "name": "学校工作网", + "version": "0.1.0", + "description": "学校工作网后台管理系统项目", + "title": "学校工作网项目文档", + "url": "", + "sampleUrl": false, + "defaultVersion": "0.0.0", + "apidoc": "0.3.0", + "generator": { + "name": "apidoc", + "time": "2018-01-10T08:07:06.174Z", + "url": "http://apidocjs.com", + "version": "0.17.6" + } +}); diff --git a/backend/public/apidoc/api_project.json b/backend/public/apidoc/api_project.json new file mode 100644 index 00000000..757ba8b1 --- /dev/null +++ b/backend/public/apidoc/api_project.json @@ -0,0 +1,16 @@ +{ + "name": "学校工作网", + "version": "0.1.0", + "description": "学校工作网后台管理系统项目", + "title": "学校工作网项目文档", + "url": "", + "sampleUrl": false, + "defaultVersion": "0.0.0", + "apidoc": "0.3.0", + "generator": { + "name": "apidoc", + "time": "2018-01-10T08:07:06.174Z", + "url": "http://apidocjs.com", + "version": "0.17.6" + } +} diff --git a/backend/public/apidoc/css/style.css b/backend/public/apidoc/css/style.css new file mode 100644 index 00000000..6468b2b2 --- /dev/null +++ b/backend/public/apidoc/css/style.css @@ -0,0 +1,569 @@ +/* ------------------------------------------------------------------------------------------ + * Content + * ------------------------------------------------------------------------------------------ */ +body { + min-width: 980px; + max-width: 1280px; +} + +body, p, a, div, th, td { + font-family: "Source Sans Pro", sans-serif; + font-weight: 400; + font-size: 16px; +} + +td.code { + font-size: 14px; + font-family: "Source Code Pro", monospace; + font-style: normal; + font-weight: 400; +} + +#content { + padding-top: 16px; + z-Index: -1; + margin-left: 270px; +} + +p { + color: #808080; +} + +h1 { + font-family: "Source Sans Pro Semibold", sans-serif; + font-weight: normal; + font-size: 44px; + line-height: 50px; + margin: 0 0 10px 0; + padding: 0; +} + +h2 { + font-family: "Source Sans Pro", sans-serif; + font-weight: normal; + font-size: 24px; + line-height: 40px; + margin: 0 0 20px 0; + padding: 0; +} + +section { + border-top: 1px solid #ebebeb; + padding: 30px 0; +} + +section h1 { + font-family: "Source Sans Pro", sans-serif; + font-weight: 700; + font-size: 32px; + line-height: 40px; + padding-bottom: 14px; + margin: 0 0 20px 0; + padding: 0; +} + +article { + padding: 14px 0 30px 0; +} + +article h1 { + font-family: "Source Sans Pro Bold", sans-serif; + font-weight: 600; + font-size: 24px; + line-height: 26px; +} + +article h2 { + font-family: "Source Sans Pro", sans-serif; + font-weight: 600; + font-size: 18px; + line-height: 24px; + margin: 0 0 10px 0; +} + +article h3 { + font-family: "Source Sans Pro", sans-serif; + font-weight: 600; + font-size: 16px; + line-height: 18px; + margin: 0 0 10px 0; +} + +article h4 { + font-family: "Source Sans Pro", sans-serif; + font-weight: 600; + font-size: 14px; + line-height: 16px; + margin: 0 0 8px 0; +} + +table { + border-collapse: collapse; + width: 100%; + margin: 0 0 20px 0; +} + +th { + background-color: #f5f5f5; + text-align: left; + font-family: "Source Sans Pro", sans-serif; + font-weight: 700; + padding: 4px 8px; + border: #e0e0e0 1px solid; +} + +td { + vertical-align: top; + padding: 10px 8px 0 8px; + border: #e0e0e0 1px solid; +} + +#generator .content { + color: #b0b0b0; + border-top: 1px solid #ebebeb; + padding: 10px 0; +} + +.label-optional { + float: right; + background-color: grey; + margin-top: 4px; +} + +.open-left { + right: 0; + left: auto; +} + +/* ------------------------------------------------------------------------------------------ + * apidoc - intro + * ------------------------------------------------------------------------------------------ */ + +#apidoc .apidoc { + border-top: 1px solid #ebebeb; + padding: 30px 0; +} + +#apidoc h1 { + font-family: "Source Sans Pro", sans-serif; + font-weight: 700; + font-size: 32px; + line-height: 40px; + padding-bottom: 14px; + margin: 0 0 20px 0; + padding: 0; +} + +#apidoc h2 { + font-family: "Source Sans Pro Bold", sans-serif; + font-weight: 600; + font-size: 22px; + line-height: 26px; + padding-top: 14px; +} + +/* ------------------------------------------------------------------------------------------ + * pre / code + * ------------------------------------------------------------------------------------------ */ +pre { + background-color: #292b36; + color: #ffffff; + padding: 10px; + border-radius: 6px; + position: relative; + margin: 10px 0 20px 0; + overflow-x: auto; +} + +pre.prettyprint { + width: 100%; +} + +code.language-text { + word-wrap: break-word; +} + +pre.language-json { + overflow: auto; +} + +pre.language-html { + margin: 0 0 20px 0; +} + +.type { + font-family: "Source Sans Pro", sans-serif; + font-weight: 600; + font-size: 15px; + display: inline-block; + margin: 0 0 5px 0; + padding: 4px 5px; + border-radius: 6px; + text-transform: uppercase; + background-color: #3387CC; + color: #ffffff; +} + +.type__get { + background-color: green; +} + +.type__put { + background-color: #e5c500; +} + +.type__post { + background-color: #4070ec; +} + +.type__delete { + background-color: #ed0039; +} + +pre.language-api .str { + color: #ffffff; +} + +pre.language-api .pln, +pre.language-api .pun { + color: #65B042; +} + +pre code { + display: block; + font-size: 14px; + font-family: "Source Code Pro", monospace; + font-style: normal; + font-weight: 400; + word-wrap: normal; + white-space: pre; +} + +pre code.sample-request-response-json { + white-space: pre-wrap; + max-height: 500px; + overflow: auto; +} + +/* ------------------------------------------------------------------------------------------ + * Sidenav + * ------------------------------------------------------------------------------------------ */ +.sidenav { + width: 228px; + margin: 0; + padding: 0 20px 20px 20px; + position: fixed; + top: 50px; + left: 0; + bottom: 0; + overflow-x: hidden; + overflow-y: auto; + background-color: #f5f5f5; + z-index: 10; +} + +.sidenav > li > a { + display: block; + width: 192px; + margin: 0; + padding: 2px 11px; + border: 0; + border-left: transparent 4px solid; + border-right: transparent 4px solid; + font-family: "Source Sans Pro", sans-serif; + font-weight: 400; + font-size: 14px; +} + +.sidenav > li.nav-header { + margin-top: 8px; + margin-bottom: 8px; +} + +.sidenav > li.nav-header > a { + padding: 5px 15px; + border: 1px solid #e5e5e5; + width: 190px; + font-family: "Source Sans Pro", sans-serif; + font-weight: 700; + font-size: 16px; + background-color: #ffffff; +} + +.sidenav > li.active > a { + position: relative; + z-index: 2; + background-color: #0088cc; + color: #ffffff; +} + +.sidenav > li.has-modifications a { + border-right: #60d060 4px solid; +} + +.sidenav > li.is-new a { + border-left: #e5e5e5 4px solid; +} + +/* ------------------------------------------------------------------------------------------ + * Side nav search + * ------------------------------------------------------------------------------------------ */ +.sidenav-search { + width: 228px; + left: 0px; + position: fixed; + padding: 16px 20px 10px 20px; + background-color: #F5F5F5; + z-index: 11; +} + +.sidenav-search .search { + height: 26px; +} + +.search-reset { + position: absolute; + display: block; + cursor: pointer; + width: 20px; + height: 20px; + text-align: center; + right: 28px; + top: 17px; + background-color: #fff; +} + +/* ------------------------------------------------------------------------------------------ + * Compare + * ------------------------------------------------------------------------------------------ */ + +ins { + background: #60d060; + text-decoration: none; + color: #000000; +} + +del { + background: #f05050; + color: #000000; +} + +.label-ins { + background-color: #60d060; +} + +.label-del { + background-color: #f05050; + text-decoration: line-through; +} + +pre.ins { + background-color: #60d060; +} + +pre.del { + background-color: #f05050; + text-decoration: line-through; +} + +table.ins th, +table.ins td { + background-color: #60d060; +} + +table.del th, +table.del td { + background-color: #f05050; + text-decoration: line-through; +} + +tr.ins td { + background-color: #60d060; +} + +tr.del td { + background-color: #f05050; + text-decoration: line-through; +} + +/* ------------------------------------------------------------------------------------------ + * Spinner + * ------------------------------------------------------------------------------------------ */ + +#loader { + position: absolute; + width: 100%; +} + +#loader p { + padding-top: 80px; + margin-left: -4px; +} + +.spinner { + margin: 200px auto; + width: 60px; + height: 60px; + position: relative; +} + +.container1 > div, .container2 > div, .container3 > div { + width: 14px; + height: 14px; + background-color: #0088cc; + + border-radius: 100%; + position: absolute; + -webkit-animation: bouncedelay 1.2s infinite ease-in-out; + animation: bouncedelay 1.2s infinite ease-in-out; + /* Prevent first frame from flickering when animation starts */ + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.spinner .spinner-container { + position: absolute; + width: 100%; + height: 100%; +} + +.container2 { + -webkit-transform: rotateZ(45deg); + transform: rotateZ(45deg); +} + +.container3 { + -webkit-transform: rotateZ(90deg); + transform: rotateZ(90deg); +} + +.circle1 { top: 0; left: 0; } +.circle2 { top: 0; right: 0; } +.circle3 { right: 0; bottom: 0; } +.circle4 { left: 0; bottom: 0; } + +.container2 .circle1 { + -webkit-animation-delay: -1.1s; + animation-delay: -1.1s; +} + +.container3 .circle1 { + -webkit-animation-delay: -1.0s; + animation-delay: -1.0s; +} + +.container1 .circle2 { + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} + +.container2 .circle2 { + -webkit-animation-delay: -0.8s; + animation-delay: -0.8s; +} + +.container3 .circle2 { + -webkit-animation-delay: -0.7s; + animation-delay: -0.7s; +} + +.container1 .circle3 { + -webkit-animation-delay: -0.6s; + animation-delay: -0.6s; +} + +.container2 .circle3 { + -webkit-animation-delay: -0.5s; + animation-delay: -0.5s; +} + +.container3 .circle3 { + -webkit-animation-delay: -0.4s; + animation-delay: -0.4s; +} + +.container1 .circle4 { + -webkit-animation-delay: -0.3s; + animation-delay: -0.3s; +} + +.container2 .circle4 { + -webkit-animation-delay: -0.2s; + animation-delay: -0.2s; +} + +.container3 .circle4 { + -webkit-animation-delay: -0.1s; + animation-delay: -0.1s; +} + +@-webkit-keyframes bouncedelay { + 0%, 80%, 100% { -webkit-transform: scale(0.0) } + 40% { -webkit-transform: scale(1.0) } +} + +@keyframes bouncedelay { + 0%, 80%, 100% { + transform: scale(0.0); + -webkit-transform: scale(0.0); + } 40% { + transform: scale(1.0); + -webkit-transform: scale(1.0); + } +} + +/* ------------------------------------------------------------------------------------------ + * Tabs + * ------------------------------------------------------------------------------------------ */ +ul.nav-tabs { + margin: 0; +} + +p.deprecated span{ + color: #ff0000; + font-weight: bold; + text-decoration: underline; +} + +/* ------------------------------------------------------------------------------------------ + * Print + * ------------------------------------------------------------------------------------------ */ + +@media print { + + #sidenav, + #version, + #versions, + section .version, + section .versions { + display: none; + } + + #content { + margin-left: 0; + } + + a { + text-decoration: none; + color: inherit; + } + + a:after { + content: " [" attr(href) "] "; + } + + p { + color: #000000 + } + + pre { + background-color: #ffffff; + color: #000000; + padding: 10px; + border: #808080 1px solid; + border-radius: 6px; + position: relative; + margin: 10px 0 20px 0; + } + +} /* /@media print */ diff --git a/backend/public/apidoc/fonts/glyphicons-halflings-regular.eot b/backend/public/apidoc/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000000000000000000000000000000000000..b93a4953fff68df523aa7656497ee339d6026d64 GIT binary patch literal 20127 zcma%hV{j!vx9y2-`@~L8?1^pLwlPU2wr$&<*tR|KBoo`2;LUg6eW-eW-tKDb)vH%` z^`A!Vd<6hNSRMcX|Cb;E|1qflDggj6Kmr)xA10^t-vIc3*Z+F{r%|K(GyE^?|I{=9 zNq`(c8=wS`0!RZy0g3xIb0NUL}$)W)Ck`6oter6KcQG9Zcy>lXip)%e&!lQgtQ*N`#abOlytt!&i3fo)cKV zP0BWmLxS1gQv(r_r|?9>rR0ZeEJPx;Vi|h1!Eo*dohr &^lJgqJZns>&vexP@fs zkPv93Nyw$-kM5Mw^{@wPU47Y1dSkiHyl3dtHLwV&6Tm1iv{ve;sYA}Z&kmH802s9Z zyJEn+cfl7yFu#1^#DbtP7k&aR06|n{LnYFYEphKd@dJEq@)s#S)UA&8VJY@S2+{~> z(4?M();zvayyd^j`@4>xCqH|Au>Sfzb$mEOcD7e4z8pPVRTiMUWiw;|gXHw7LS#U< zsT(}Z5SJ)CRMXloh$qPnK77w_)ctHmgh}QAe<2S{DU^`!uwptCoq!Owz$u6bF)vnb zL`bM$%>baN7l#)vtS3y6h*2?xC k z>w+s)@`O4(4_ I{L-!+b%)NZcQ&ND=2lyP+xI#9OzsiY8$c)ys-MI?TG6 zEP6f=vuLo!G>J7F4v|s#lJ+7A`^nEQScH3e?B_jC&{ sj>m zYD?!1z4nDG_Afi$!J(<{>z{~Q)$SaXWjj~%ZvF152Hd^VoG14rFykR=_TO)mCn&K$ z-TfZ!vMBvnToyBoKRkD{3=&=qD|L!vb#jf1f}2338z)e)g>7#NPe!FoaY*jY{f)Bf>ohk-K z4{>fVS}ZCicCqgLuYR_fYx2;*-4k>kffuywghn?15s1dIOOYfl+XLf5w?wtU2Og*f z%X5x`H55F6g1>m~%F`655-W1wFJtY>>qNSdVT`M`1Mlh!5Q6#3j={n5#za;!X&^OJ zgq;d4UJV-F>gg?c3Y?d=kvn3e V)Jb^ zO5vg0G0yN0%}xy#(6oTDSVw8l=_*2k;zTP?+N=*18H5wp`s90K-C67q{W3d8vQGmr zhpW^>1HEQV2TG#8_P_0q91h8QgHT~8=-Ij5snJ3cj?Jn5_66uV=*pq(j}yHn f$ Ft;5VVC?bz%9X31asJeQF2jEa47H#j` zk &uxf3t?g!tltVP|B#G_UfDD}`<#B#iY^i>oDd-LGF}A@Fno~dR72c&hs6bR z2F}9(i8+PR%R|~FV$;Ke^Q_E_B c;$)xN4Ti>Lgg4vaip!%M z06oxAF_*)LH57w|gCW3SwoEHwjO{}}U=pKhjKSZ{u!K ?1zm1q? zXyA6y@)}_sONiJopF}_}(~}d4FDyp|(@w}Vb;Fl5bZL%{1`}gdw#i{KMjp2@Fb9pg ziO|u7qP{$kxH$qh8%L+)AvwZNgUT6^zsZq-MRyZid{D?t`f|KzSAD~C?WT3d0rO`0 z=qQ6{)&UXXuHY{9g|P7l_nd-%eh}4%VVaK#Nik*tOu9lBM$<%FS@`NwGEbP0&;Xbo zObCq=y%a`jSJmx_uTLa{@2@}^&F
4c%z6oe-TN&idjv+8E|$FHOvBqg5hT zMB=7SHq`_-E?5g=()*!V>rIa&LcX(RU}aLm*38U_V$C_g4)7GrW5$GnvTwJZdBmy6 z*X)wi3=R8L=esOhY0a&eH`^fSpUHV8h$J1|o^3fKO |9QzaiKu>yZ9wmRkW?HTkc<*v7i*ylJ#u#j zD1-n&{B`04oG>0Jn{5PKP*4Qsz{~`VVA3578gA+JUkiPc$Iq!^K|}*p_z3(-c&5z@ zKxmdNpp2&wg&%xL 3xZNzG-5Xt7jnI@{?c z25=M>-VF|;an2Os$Nn%HgQz7m(ujC}Ii0Oesa(y#8>D+P*_m^X##E|h$M6tJr%#=P zWP*)Px>7z`E~U^2LNCNiy%Z7!!6RI%6fF@#ZY3z`CK91}^J $F!EB0YF1je9 hJKU7!S5MnXV{+#K;y zF~s*H%p@vj&-ru7#(F2L+_;IH46X(z{~HTfcThqD%b{>~u@lSc<+f5#xgt9L7$gSK ziDJ6D*R%4&YeUB@yu@4+&70MBNTnjRyqMRd+@&lU#rV%0t3OmouhC`mkN}pL>tXin zY*p)mt=}$EGT2E<4Q>E2`6)gZ`QJhGDNpI}bZL9}m+R>q?l`OzFjW?)Y)P`fUH(_4 zCb?sm1=DD0+Q5v}BW#0n5;Nm(@RTEa3(Y17H2H67La+>ptQHJ@WMy2xRQT$|7l`8c zYHCxYw2o-rI?(fR2-%}pbs$I%w_&LPYE{4bo}vRoAW>3!SY_zH3`ofx3F1PsQ?&iq z*BRG>?<6%z=x#`NhlEq{K~&rU7Kc7Y-90aRnoj~rVoKae)L$3^z*Utppk?I`)CX&& zZ^@Go 9fm&fN`b`XY zt0xE5aw4t@qTg_k=!-5LXU+_~DlW?53!afv6W(k@FPPX-`nA!FBMp7b!ODbL1zh58 z*69I}P_-?qSLKj}JW7gP!la}K@M}L>v?rDD!DY-tu+onu9kLoJz20M4urX_xf2dfZ zORd9Zp&28_ff=wdMpXi%IiTTNegC}~RLkdYjA39kWqlA?jO~o1`*B&85Hd%VPkYZT z48MPe62;TOq#c%H(`wX5(Bu>nlh4Fbd*Npasdhh?oRy8a;NB2(eb}6DgwXtx=n}fE zx67rYw=(s0r?EsPjaya}^Qc-_UT5|*@|$Q}*|>V3O~USkIe6a0_>vd~6kHuP8=m}_ zo2IGKbv;yA+TBtlCpnw)8hDn&eq?26gN$Bh;SdxaS04Fsaih_Cfb98s39xbv)=mS0 z6M<@pM2#pe32w*lYSWG>DYqB95XhgAA)*9dOxHr{t)er0Xugoy)!Vz#2C3FaUMzYl zCxy{igFB901* R2*F4>grPF}+G`;Yh zGi@nRjWyG3mR(BVOeBPOF=_&}2IWT%)pqdNAcL{eP`L*^FDv#Rzq l5U&Suq_X%JfR_lC!S|y|xd5mQ0{0!G#9hV46S~A` z0B!{yI-4FZEtol5)mNWXcX(`x&Pc*&gh4k{w%0S#EI>rqqlH2xv7mR=9XNCI$V#NG z4wb-@u{PfQP;tTbzK>(DF(~bKp3;L1-A*HS!VB)Ae>Acnvde15Anb`h;I&0)aZBS6 z55ZS7mL5Wp!LCt45^{2_70 YiI_Py=X{I3>$Px5Ez0ahLQ+ z9EWUWSyzA|+g-Axp*Lx-M{!ReQO07EG7r4^)K(xbj@%ZU=0tBC5shl)1a!ifM5OkF z0 w2xQ-<+r-h1fi7B6waX15|*GGqfva)S)dVcgea`lQ~SQ$KXPR+(3Tn2I2R<0 z9tK`L*pa^+*n%>tZPiqt{_`%v?Bb7CR-!GhMON_Fbs0$#|H}G?rW|{q5fQhvw!FxI zs-5ZK>hAbnCS#ZQVi5K0X3PjL1JRdQO+&)*!oRCqB{wen60P6!7bGiWn@vD|+E@Xq zb!!_WiU^I|@1M}Hz6fN-m04x=> Exm{b@>UCW|c8 vC`aNbtA@KCHujh^2RWZC}iYhL^<*Z93chIBJYU&w>$CGZDR cHuIgF&oyesDZ#&mA;?wxx4Cm#c0V$xYG?9OL(Smh}#fFuX(K;otJmvRP{h ze^f-qv;)HKC7geB92_@3a9@MGijS(hNNVd%-rZ;%@F_f7?Fjinbe1( zn#jQ*jKZTqE+AUTEd3y6t>*=;AO##cmdwU4gc2&rT8l`rtKW2JF<`_M#p>cj+)yCG zgKF)y8jrfxTjGO&ccm8RU>qn|HxQ7Z#sUo$q)P5H%8iBF$({0Ya51-rA@!I t#NHN8MxqK zrYyl_&=}WVfQ?+ykV4*@F6)=u_~3BebR2G2>>mKaEBPm SW3(qYGGXj??m3L zHec{@jWCsSD8`xUy0pqT?Sw0oD?AUK*WxZn#D>-$`eI+IT)6ki>ic}W)t$V32^ITD zR497@LO}S|re%A+#vdv-?fXsQGVnP?QB_d0cGE+U84Q=aM=XrOwGFN3`Lpl@P0fL$ zKN1PqOwojH*($uaQFh8_)H#>Acl&UBSZ>!2W1Dinei`R4dJGX$;~60X=|SG6#jci} z&t4*dVDR*;+6Y(G{KGj1B2!qjvDYOyPC}%hnPbJ@g(4yBJrViG1#$$X75y+Ul1{%x zBAuD}Q@w?MFNqF-m39FGpq7RGI?%Bvyyig&oGv)lR>d<`Bqh=p>urib5DE;u$c|$J zwim~nPb19t?LJZsm{<(Iyyt@~H!a4yywmHKW&=1r5+oj*Fx6c89heW@(2R`i!Uiy* zp)=`Vr8sR!)KChE-6SEIy
i(dvG3<1KoVt>kGV=zZiG 7LGonH1+~yOK-`g0)r#+O|Q>)a`I2FVW%wr3lhO(P{ksNQuR!G_d zeTx(M!%brW_vS9?IF>bzZ2A3mWX-MEaOk^V|4d38{1D|KOlZSjBKrj7Fgf^>JyL0k zLoI$adZJ0T+8i_Idsuj}C;6jgx9LY#Ukh;!8eJ^B1N}q=Gn4onF*a2vY7~`x$r@rJ z`*hi&Z2lazgu{&nz>gjd>#eq*IFlXed(%$s5!HRXKNm zDZld+DwDI`O6hyn2uJ)F^{^;ESf9sjJ)wMSKD~R=DqPBHyP!?cGAvL<1|7K-(=?VO zGcKcF1spUa+ki <`6K#@QxOTsd847N8WSWztG~?~ z!gUJn>z0O=_)VCE|56hkT~n5xXTp}Ucx$Ii%bQ{5;-a4~I2e|{l9ur#*ghd*hSqO= z)GD@ev^w&5%k}YYB~!A%3*XbPPU-N6&3Lp1LxyP@|C<{qcn&?l54+zyMk&I3YDT|E z{lXH-e?C{huu<@~li+73lMOk&k)3s7Asn$t6!PtXJV!RkA`qdo4|OC_a?vR!kE_}k zK5R9KB%V@R7gt@9=TGL{=#r2gl!@3G;k-6sXp&E4u20DgvbY$iE**Xqj3TyxK>3AU z!b9}NXuINqt>Htt6fXIy5mj7oZ{A&$XJ&thR5ySE{mkxq_YooME#VCHm2+3D!f`{) zvR^WSjy_h4v^|!RJV-RaIT2Ctv=)UMMn@fAgjQV$2G+4?&dGA8vK35c-8r )z9Qqa=%k(FU)?iec14<^olkOU3p zF-6`zHiDKPafKK ^USUU+D01>C&Wh{{q?>5m zGQp|z*+#>IIo=|ae8CtrN@@t~uLFOeT{}vX(IY*;>wAU=u1Qo4c+a&R);$^VCr>;! zv4L{`lHgc9$BeM)pQ#XA_(Q#=_i SZL4>L~8Hx}NmOC$&*Q*bq|9Aq}rWgFnMDl~d*;7c44GipcpH9PWaBy-G$*MI^F0 z?Tdxir1D<2ui+Q#^c4?uKvq=p>)lq56 =Eb|N^qz~w7rsZu)@E4$;~snz+wIxi+980O6M#RmtgLYh@|2}9BiHSpTs zacjGKvwkUwR3lwTSsCHlwb&*(onU;)$yvdhikonn|B44JMgs*&Lo!jn`6AE>XvBiO z*LKNX3FVz9yLcsnmL!cRVO_qv=yIM#X|u&}#f%_?Tj0>8)8P_0r0!AjWNw;S44tst zv+NXY1{zRLf9OYMr6H-z?4CF$Y%MdbpFIN@a-LEnmkcOF>h16cH_;A|e)pJTuCJ4O zY7!4FxT4>4aFT8a92}84>q0&?46h>&0Vv0p>u~k&qd5$C1A6Q$I4V(5X~6{15;PD@ ze6!s9xh#^QI`J+%8*=^(-!P!@9%~buBmN2VSAp@TOo6}C?az+ALP8~&a0FWZk*F5N z^8P8IREnN`N0i@>O0?{i-FoFShYbUB`D7O4HB`Im2{yzXmyrg$k>cY6A@>bf7i3n0 z5y&cf2#`zctT>dz+hNF&+d3g;2)U!#vsb-%LC+pqKRTiiSn#FH#e!bVwR1nAf*TG^ z!RKcCy$P>?Sfq6n<%M{T0I8?p@HlgwC! HoWO>~mT+X<{Ylm+$Vtj9};H3$EB}P2wR$3y!TO#$iY8eO-!}+F&jMu4%E6S>m zB(N4w9O@2=<`WNJay5PwP8javDp~o~xkSbd4t4t8) 9jqu@bHmJHq=MV~Pt|(TghCA}fhMS?s-{klV>~=VrT$nsp7mf{?cze~KKOD4 z_1Y!F)*7^W+BBTt1R2h4f1X4Oy2%?=IMhZU8c{qk3xI1=!na*Sg<=A$?K=Y=GUR9@ zQ(ylIm4Lgm>pt#%p`zHxok%vx_=8Fap1|?OM02|N%X-g5_#S~sT@A!x&8k#wVI2lo z1Uyj{tDQRpb*>c}mjU^gYA9{7mNhFAlM=wZkXcA#MHXWMEs^3>p9X)Oa?dx7b%N*y zLz@K^%1JaArjgri;8ptNHwz1<0y8tcURSbHsm=26^@CYJ3hwMaE vC7 z3Wi-@AaXIQ)%F6#i@%M>?Mw7$6(kW@?et@wbk-APcvMCC{>iew#vkZej8%9h0JSc? zCb~K|!9cBU+))^q*co(E^9jRl7gR4Jihyqa(Z(P&ID#TPyysVNL7(^;?Gan!OU>au zN}miBc&XX-M$mSv%3xs)bh>Jq9#aD_l|zO?I+p4_5qI0Ms*OZyyxA`sXcyiy>-{YN zA70%HmibZYcHW&YOHk6S&PQ+$rJ3(utuUra3V0~@=_~QZy&nc~)AS>v&<6$gErZC3 zcbC=eVkV4Vu0#}E*r=&{X) Kgq|8MGCh(wsH4geLj@#8EGYa})K2;n z{1~=ghoz=9TSCxgzr5x3@sQZZ0FZ+t{?klSI_IZa16pSx6*;=O%n!uXVZ@1IL;JEV zfOS&yyfE9dtS*^jmgt6>jQDOIJM5Gx#Y2eAcC3l^lmoJ{o0T>IHpEC TbfYgPI4#LZq0 PKqnPC D}_ zyKxz;(`fE0z~nA1s?d{X2!#ZP8wUHzFSOoTWQrk%;wCnBV_3D%3@EC|u$Ao)tO|AO z$4&aa!wbf}rbNc P{6=ajgg(`p5kTeu$ji20`zw)X1SH*x zN?T36{d9TY*S896Ijc^!35LLUByY4QO=ARCQ#MMCjudFc7s!z%P$6DESz%zZ#>H|i zw3Mc@v4~{Eke;FWs`5i@ifeYPh-Sb#vCa#qJPL|&quSKF%sp8*n#t?vIE7kFWjNFh zJC@u^bRQ^?ra|%39Ux^Dn4I}QICyDKF0mpe+Bk}!lFlqS^WpYm&xwIYxUoS-rJ)N9 z1Tz*6Rl9;x`4lwS1cgW^H_M*)Dt*DX*W?ArBf?-t|1~ge&S}xM0K;U9Ibf{okZHf~ z#4v4qc6s6Zgm8iKch5VMbQc~_V-ZviirnKCi*ouN^c_2lo&-M;YSA>W>>^5tlXObg zacX$k0=9Tf$Eg+#9k6yV(R5-&F{=DHP8!yvSQ`Y~XRnUx@{O$-bGCksk~3&qH^dqX zkf+ZZ?Nv5u>LBM@2?k%k&_aUb5Xjqf#!&7%zN#VZwmv65ezo^Y4S#(ed0yUn4tFOB zh1f1SJ6_s?a{)u6VdwUC!Hv=8`%T9(^c`2hc9nt$(q{Dm2X)dK49ba+KEheQ;7^0) ziFKw$%EHy_B1)M>=yK^=Z$U-LT36yX >EKT zvD8IAom2&2?bTmX@_PBR4W|p?6?LQ+&UMzXxqHC5VHzf@Eb1u)kwyfy+NOM8Wa2y@ zNNDL0PE$F;yFyf^jy&RGwDXQwYw6yz>OMWvJt98X@;yr !*RQDBE- zE*l*u=($Zi1}0-Y4lGaK?J$yQjgb +*ljUvNQ!;QYAoCq@>70=sJ{o{^21^?zT@r~hhf&O;Qiq+ ziGQQLG*D@5;LZ%09mwMiE4Q{IPUx-emo*;a6#DrmWr(zY27d@ezre)Z1BGZdo&pXn z+);gOFelKDmnjq#8dL7CTiVH)dHOqWi~uE|NM^QI3EqxE6+_n>IW67~UB#J==QOGF zp_S)c8TJ}uiaEiaER}MyB(grNn=2m&0yztA=!%3xUREyuG_jmadN*D&1nxvjZ6^+2 zORi7iX1iPi$tKasppaR9$a3IUmrrX)m*)fg1>H+$KpqeB*G>AQV((-G{}h=qItj|d zz~{5@{?&Dab6;0c7!!%Se>w($RmlG7Jlv_zV3Ru8b2rugY0MVPOOYGlokI7%nhIy& z-B&wE=lh2dtD!F?noD{z^O1~Tq4MhxvchzuT_oF3-t4YyA*MJ*n&+1X3 ~6quEN z@m~aEp=b2~mP+}TUP^FmkRS_PDMA{B zaSy(P=$T~R!yc^Ye0*pl5xcpm_JWI;@-di+nruhqZ4gy7cq-)I&s&Bt3BkgT(Zdjf zTvvv0)8xzntEtp4iXm}~cT+pi5k{w{(Z@l2XU9lHr4Vy~3ycA_T?V(QS{qwt?v|}k z_ST!s;C4!jyV5)^6xC#v!o *uS%a-jQ6< z)>o?z7=+zNNtIz1*F_HJ(w@=`E+T|9TqhC(g7kKDc8z~?RbKQ)LRMn7A1p*PcX2YR zUAr{);~c7I#3Ssv<0i-Woj0&Z4a!u|@Xt2J1>N-|ED<3$o2V?OwL4oQ%$@!zLamVz zB)K&Ik^~GOmDAa143{I4?XUk1<3-k{<%?&OID&>Ud%z*Rkt*)mko0RwC2=qFf-^OV z=d@47?tY=A;=2VAh0mF(3x;!#X!%{|vn;U2XW{(nu5b&8kOr)Kop3-5_xnK5oO_3y z!EaIb{r%D{7zwtGgFVri4_!yUIGwR(xEV3YWSI_+E}Gdl>TINWsIrfj+7DE?xp+5^ zlr3pM-Cbse*WGKOd3+*Qen^*uHk)+EpH-{u@i%y}Z!YSid<}~kA*IRSk|nf+I1N=2 zIKi+&ej%Al-M5`cP^XU>9A(m7G>58>o|}j0ZWbMg&x`*$B9j#Rnyo0#=BMLdo%=ks zLa3(2EinQLXQ(3zDe7Bce%Oszu%?8PO648TNst4SMFvj=+{b%)ELyB!0`B?9R6 aO{i-63|s@|raSQGL~s)9R#J#duFaTSZ2M{X z1?YuM*a!!|jP^QJ(hAisJuPOM`8Y-Hzl~%d@latwj}t&0{DNNC+zJARnuQfiN`HQ# z?boY_2?*q;Qk)LUB)s8(Lz5elaW56p&fDH*AWAq7Zrbeq1!?FBGYHCnFgRu5y1jwD zc|yBz+UW|X`zDsc{W~8m $sh@VVnZD$lLnKlq@Hg^;ky!}ZuPdKNi2BI70;hrpvaA4+Q_+K)I@|)q1N-H zrycZU`*YUW``Qi^`bDX-j7j^&bO+-Xg$cz2#i##($uyW{Nl&{DK{=lLWV 3|=<&si||2)l=8^8_z+Vho-#5LB0EqQ3v5U#*DF7 zxT)1j^`m+lW}p$>WSIG1eZ>L|YR-@Feu!YNWiw*IZYh03mq+2QVtQ}1ezRJM?0PA< z;mK(J5@N8>u@<6Y$QAHWNE};rR|)U_&bv8dsnsza7{=zD1VBcxrALqnOf-qW(zzTn zTAp|pEo#FsQ$~*$j|~Q;$Zy&Liu9OM;VF@#_&*nL!N2hH!Q6l*OeTxq!l>dEc{;Hw zCQni{iN%jHU*C;?M-VUaXxf0FEJ_G=C8)C-wD!DvhY+qQ#FT3}Th8;GgV&AV94F`D ztT6=w_Xm8)*)dBnDkZd~UWL|W=Gl u!$hc|1w7_7l!3MAt95oIp4Xp{M%clu&TXehO z+L-1#{mjkpTF@?|w1P98OCky~S%@OR&o75P &ZHvC}Y=(2_{ib(-Al_7aZ^U?s34#H}= zGfFi5%KnFVCKtdO^>Htpb07#BeCXMDO8U}crpe1Gm`>Q=6qB4i=nLoLZ%p$TY=OcP z)r}Et-Ed??u~f09d3Nx3bS@ja!fV(Dfa5lXxRs#;8?Y8G+Qvz+iv7fiRkL3liip}) z&G0u8RdEC9c$$rdU53= MH`p!Jn|DHjhOxHK$tW_pw9wCTf0Eo<){HoN=zG!!Gq4z4 z7PwGh)V NPXW-cE#MtofE`-$9~nmmj}m zlzZscQ2+Jq%gaB9rMgVJkbhup0Ggpb)&L01T=%>n7-?v@I8!Q(p&+!fd+Y^Pu9l+u zek(_$^HYFVRRIFt@0Fp52g5Q#I`tC3li`;UtDLP*rA{-#Yoa5qp{cD)QYhldihWe+ zG~zuaqLY~$-1sjh2lkbXCX;lq+p~!2Z=76cvuQe*Fl>IFwpUBP+d^ &E4BGc {m#l%Kuo6#{XGoRyFc%Hqhf|%nYd<;yiC>tyEyk z4I+a `(%%Ie=-*n z-{mg=j&t12)LH3R?@-B1tEb7FLMePI1HK0`Ae@#)KcS%!Qt9p4_fmBl5zhO10n401 zBSfnfJ;?_r{%R)hh}BBNSl=$BiAKbuWrNGQUZ)+0=Mt&5!X*D@yGCSaMNY&@`;^a4 z;v=%D_!K!WXV1!3%4P-M*s%V2b#2jF2bk!)#2GLVuGKd#vNpRMyg`kstw0GQ8@^k^ zuqK5uR<>FeRZ#3{%!|4X!hh7hgirQ@Mwg%%ez8pF!N$xhMNQN((yS(F2-OfduxxKE zxY#7O(VGfNuLv-ImAw5+h@gwn%!ER;*Q+001;W7W^waWT%@(T+5k!c3A-j)a8y11t zx4~rSN0s$M8HEOzkcWW4YbKK9GQez2XJ|Nq?TFy;jmGbg;`m&%U4hIiarKmdTHt#l zL=H;ZHE?fYxKQQXKnC+K!TAU}r086{4m}r()-QaFmU(qWhJlc$eas&y ?=H9EYQy8N$8^bni9TpD p zkA^WRs?KgYgjxX4T6?`SMs$`s3vlut(YU~f2F+id(Rf_)$BIMibk9lACI~LA+i7xn z%-+=DHV*0TCTJp~-|$VZ@g2vmd*|2QXV;HeTzt530KyK>v&253N1l}bP_J#UjLy4) zBJili9#-ey8Kj(dxmW^ctorxd;te|xo)%46l%5qE-YhAjP`Cc03vT)vV&GAV%#Cgb zX~2}uWNvh`2<*AuxuJpq>SyNtZwzuU)r@@dqC@v=Ocd(HnnzytN+M&|Qi#f4Q8D=h ziE<3ziFW%+!yy(q{il8H44g^5{_+pH60Mx5Z*FgC_3hKxmeJ+wVuX?T#ZfOOD3E4C zRJsj#wA@3uvwZwHKKGN{{Ag+8^cs?S4N@6(Wkd$CkoCst(Z&hp+l=ffZ?2m%%ffI3 zdV7coR`R+*dPbNx=*ivWeNJK=Iy_vKd`-_Hng{l?hmp=|T3U&epbmgXXWs9ySE|=G zeQ|^ioL}tve N{s72_&h+F+W;G}?;?_s@h5>DX(rp#eaZ!E=NivgLI zWykLKev+}sHH41NCRm7W>K+_qdoJ8x9o5Cf!)|qLtF7Izxk*p|fX8UqEY)_sI_45O zL2u>x=r5xLE%s|d%MO>zU%KV6QKFiEeo12g#bhei4!Hm+`~Fo~4h|BJ)%ENxy9)Up zOxupSf1QZWun=)gF{L0YWJ<(r0?$bPFANrmphJ>kG`&7E+RgrWQi}ZS#-CQJ*i#8j zM_A0?w@4Mq@xvk^>QSvEU|VYQoVI=TaOrsLTa`RZfe8{9F~mM{L+C`9YP9?Okn Lw| zmkvz>cS6`pF0FYeLdY%>u&XpPj5$*iYkj=m7wMzHqzZ5SG~$i_^f@QEPEC+<2nf-{ zE7W+n%)q$!5@2pBuXMxhUSi*%F>e_g!$T-_`ovjBh(3jK9Q^~OR{)}!0}vdTE^M+m z9QWsA?xG>EW;U~5gEuKR)Ubfi&YWnXV;3H6Zt^NE725*`;lpSK4HS1sN?{~9a4JkD z%}23oAovytUKfRN87XTH2c=kq1)O 5(fH_M3M-o{{@&~KD`~TRot-gqg7Q2U2o-iiF}K>m?CokhmO DaLB z1p6(6JYGntNOg(s!(>ZU&lzDf+Ur)^Lirm%*}Z>T)9)fAZ9>k(kvnM;ab$ptA=hoh zVgsVaveXbMpm{|4*d<0>?l_JUFOO8A3xNLQOh%nVXjYI6X8h?a@6kDe5-m&;M0xqx z+1U$s>(P9P)f0!{z%M@E7|9nn#IWgEx6A6JNJ(7dk`%6$3@!C!l;JK-p2?gg+W|d- ziEzgk$w7k48NMqg$CM*4O~Abj3+_yUKTyK1p6GDsGEs;}=E_q>^LI-~pym$qhXPJf z2`!PJDp4l(TTm#|n@bN!j;-FFOM__eLl!6{*}z=)UAcGYloj?bv!-XY1TA6Xz;82J zLRaF{8ayzGa|}c--}|^xh)xgX>6R(sZD|Z|qX50gu=d`gEwHqC@WYU7{%<5VOnf9+ zB @FX?|UL%`8EIAe!*UdYl|6wRz6Y>(#8x92$#y}wMeE|ZM2X*c}dKJ^4NIf;Fm zNwzq%QcO?$NR-7`su!*$dlIKo2y(N;qgH@1|8QNo$0wbyyJ2^}$iZ>M{BhBjTdMjK z>gPEzgX4;g3$rU?jvDeOq`X=>)zdt|jk1Lv3u~bjHI=EGLfIR&+K3ldcc4D&Um&04 z3^F*}WaxR(ZyaB>DlmF_UP@+Q*h$&nsOB#gwLt{1#F4i-{A5J@`>B9@{^i?g_Ce&O z<<}_We-RUFU&&MHa1#t56u _oM(Ljn7djja!T|gcxSoR=)@?owC*NkDarpBj=W4}=i1@)@L|C) zQKA+o<(pMVp*Su(`zBC0l1yTa$MRfQ#uby|$mlOM s=G`4J|?apMzKei%jZql#gP@IkOaOjB7MJM=@1j(&!jNnyVkn5;4lvro1!vq ztXiV8HYj5%)r1PPpIOj)f!> pc^3#LvfZ(hz}C@-3R(Cx7R427*Fwd!XO z4~j&IkPHcBm0h_|iG;ZNrYdJ4HI!$rSyo&sibmwIgm1|J#g6%>=ML1r!kcEhm(XY& zD@mIJt;!O%WP7CE&wwE3?1-dt;RTHdm~LvP7K`ccWXkZ0kfFa2S;wGtx_a}S2lslw z$<4^Jg-n#Ypc(3t2N67Juasu=h)j&UNTPNDil4MQMTlnI81kY46uMH5B^U{~nmc6+ z9>(lGhhvRK9ITfpAD!XQ&BPphL3p8B4PVBN0NF6U49;ZA0Tr75AgGw7(S=Yio+xg_ zepZ*?V#KD;sHH+15ix&yCs0eSB-Z%D%uujlXvT#V$Rz@$+w!u#3GIo*AwMI#Bm^oO zLr1e}k5W~G0xaO!C%Mb{sarxWZ4%Dn9vG`KHmPC9GWZwOOm11XJp#o0-P-${3m4g( z6~)X9FXw%Xm~&99tj>a-ri})ZcnsfJtc10F@t9xF5vq6E)X!iUXHq-ohlO`gQdS&k zZl})3k||u)!_=nNlvMbz%AuIr89l#I$;rG}qvDGiK?xTd5HzMQkw*p$YvFLGyQM!J zNC^gD!kP{A84nGosi~@MLKqWQNacfs7O$dkZtm4-BZ~iA8xWZPkTK!Hp A5zr!9Z&+icfAJ1)NWkTd!-9`NWU>9uXXUr;`Js#NbKFgrNhTcY4GNv*71}}T zFJh?>=EcbUd2<|fiL+H=wMw8hbX6?+_cl4XnCB#ddwdG> bki* zt*&6Dy&EIPluL@A3_;R%)shA-tDQA1!Tw4ffBRyy;2n)vm_JV06(4O r&QAOKNZB5f(MVC}&_!B>098R{Simr!UG}?CW1Ah+X+0#~0`X)od zLYablwmFxN21L))!_zc`IfzWi `5>MxPe(Dm jjO1}HHt7TJtAW+VXHt!aKZk>y6PoMsbDXRJnov;D~Ur~2R_7(Xr)aa%wJwZhS3gr7IGgt%@;`jpL@gyc6bGCVx!9CE7NgIbUNZ!Ur1RHror0~ zr(j$^yM4j`#c2KxSP61;(Tk^pe7b~}LWj~SZC=MEpdKf;B@on9=?_n|R|0q;Y*1_@ z>nGq>)&q!;u-8H)WCwtL &7F4vbnnfSAlK1mwnRq2&gZrEr!b1MA z(3%vAbh3aU-IX`d7b@q`-WiT6eitu}ZH9x#d&qx}?CtDuAXak%5<-P!{a`V=$|XmJ zUn@4lX6#ulB@a=&-9HG)a>KkH=jE7>&S&N~0X0zD=Q=t|7w;kuh#cU=NN7gBGbQTT z;? bdSt8V&IIi} sDTzA0dkU}Z-Qvg;RDe8v>468p3*&hbGT1I3hi9hh~Z(!H}{+>eUyF)H&gdrX=k$aB%J6I ;6+^^kn1mL+E+?A!A}@xV(Qa@M%HD5C@+-4Mb4lI=Xp=@9+^x+jhtOc zYgF2aVa(uSR*n(O)e6tf3JEg2xs#dJfhEmi1iOmDYWk|wXNHU?g23^IGKB&yHnsm7 zm_+;p?YpA#N*7vXCkeN2LTNG`{QDa#U3fcFz7SB)83=<8rF)|udrEbrZL$o6W?oDR zQx!178Ih9B#D9Ko$H(jD{4MME&<|6%MPu|TfOc#E0B}!j^MMpV69D#h2`vsEQ{(?c zJ3Lh!3&=yS5fWL~;1wCZ?)%nmK`Eqgcu)O6rD^3%ijcxL50^z?OI(LaVDvfL0#zjZ z2?cPvC$QCzpxpt5jMFp05OxhK0F!Q `rPhDi5)y=-0C} zIM~ku&S@pl1&0=jl+rlS<4`riV~LC-#pqNde@44MB(j%)On$0Ko(@q?4`1?4149Z_ zZi!5aU@2vM$dHR6WSZpj+VboK+>u-CbNi7*lw4K^ZxxM#24_Yc` jvb9NPVi75L+MlM^U~`;a7`4H0L|TYK>%hfEfXLsu1JGM zbh|8{wuc7ucV+`Ys1kqxsj`dajwyM;^X^`)#<+a~$WFy8b2t_RS{8yNYKKlnv+>vB zX(QTf$kqrJ;%I@EwEs{cIcH@Z3|#^S@M+5jsP<^`@8^I4_8MlBb`~cE^n+{{;qW2q z=p1=&+fUo%T{GhVX@;56kH8K_%?X=;$OTYqW1L*)hzelm^$*?_K;9JyIWhsn4SK(| zSmXLTUE8VQX{se#8#Rj*lz`xHtT<61V~fb;WZUpu(M)f# ;I+2_zR+)y5Jv?l`CxAinx|EY!`IJ*x9_gf_k&Gx2alL!hK zUWj1T_pk|?iv}4EP#PZvYD_-LpzU!NfcL L%fK&r$W8O1KH9c2&GV~N#T$kaXGvAOl)|T zuF9%6(i=Y3q?X%VK-D2YIY FPH3f|g$TrXW->&^Ab`WT z7>Oo!u1u40?jAJ8H y`bv}qb gs8)cF0&qeVjD?e+3Ggn1Im>K77ZSpbU*08 zfZkIFcv?y)!*B{|>nx@cE{KoutP+seQU?bCGE`tS0GKUO3PN~t=2u7q_6$l;uw^4c zVu^f{uaqsZ{*a-N?2B8ngrLS8 E&s6}Xtv9rR9C^b`@q8*iH)pFzf1|kCfiLw6u{Z%aC z!X^5CzF6qofFJgkl JV3oc|Qc2XdFl+y5M9*P8}A>Kh{ zWRgRwMSZ(?Jw;m%0etU5BsWT-Dj-5F;Q$OQJrQd+lv`i6>MhVo^p*^w6{~=fhe|bN z*37oV0kji)4an^%3ABbg5RC;CS50@PV5_hKfXjYx+(DqQdKC^JIEMo6X66$qDdLRc z!YJPSKnbY`#Ht6`g@xGzJmKzz n|abYbP+_Q(v?~~ z96%cd{E0BCsH^0HaWt{y(Cuto4VE7jhB1Z??#UaU(*R&Eo+J`UN+8mcb51F|I|n*J zJCZ3R*OdyeS9hWkc_mA7-br>3Tw=CX2bl(=TpVt#WP8Bg^vE_9bP&6ccAf3lFMgr` z{3=h@?Ftb$RTe&@IQtiJf V;O&4fzh)e1>7seG; z=%mA4@c7{aXeJnhEg2J@Bm;=)j=O=cl#^NNkQ<{r;Bm|8Hg}bJ-S^g4`|itx)~!LN zXtL}?f1Hs6UQ+f0-X6&TBCW=A4>bU0{rv8C4T!(wD-h>VCK4YJk`6C9$by!fxOYw- zV#n+0{E(0ttq _#16B} ze8$E#X9o{B!0vbq#WUwmv5Xz6{(!^~+}sBW{xctdNHL4^vDk!0E}(g|W_q;jR|ZK< z8w>H-8G{%R#%f!E7cO_^B?yFRKLOH)RT9GJsb+kAKq~}WIF)NRLwKZ^Q;>!2MNa|} z-mh?=B;*&D{Nd-mQRcfVnHkChI=DRHU4ga%xJ%+QkBd|-d9uRI76@BT(bjsjwS+r) zvx=lGNLv1?SzZ;P)Gnn>04fO7Culg*?LmbEF0fATG8S@)oJ>NT3pYAXa*vX!eUTDF ziBrp(QyDqr0ZMTr?4uG_Nqs6f%S0g?h`1vO5fo=5S&u#wI2d4+3hWiolEU!=3_oFo zfie ?+4W#`;1dd#X@g9Yj<53S<6OB!TM8w8})7k-$&q5(smc%;r z(BlXkTp`C47+%4JA{2X}MIaPbVF!35P#p;u7+fR*46{T+LR8+ j25oduCfDzDv6R-hU{TVVo9fz?^N3ShMt!t0NsH)pB zRK8-S{Dn*y3b|k^*?_B70<2gHt==l7c&cT>r`C#{S}J2;s#d{M)ncW(#Y$C*lByLQ z&?+{dR7*gpdT~(1; M(FfF==3z`^eW)=5a9RqvF-)2?S-(G zhS;p(u~_qBum*q}On@$#08}ynd0+spzyVco0%G6;<-i5&016cV5UKzhQ~)fX03|>L z8ej+HzzgVr6_5ZUpa4HW0Ca!=r1%*}Oo;2no&Zz8DfR)L!@r< 5 z2viSZpmvo5XqXyAz{Ms7`7kX>fnr1gi4X~7KpznRT0{Xc5Cfz@43PjBMBoH@z_{~( z(Wd}IPJ9hH+%)Fc)0!hrV+(A;76rhtI|YHbEDeERV~Ya>SQg^IvlazFkSK(KG9&{q zkPIR~EeQaaBmwA<20}m BO?)N$(z1@p)5?%}rM| zGF()~Z&Kx@OIDRI$d0T8;JX@vj3^2%pd_+@l9~a4lntZ;AvUIjqIZbuNTR6@hNJoV zk4F;ut)LN4ARuyn2M6F~eg-e#UH%2P;8uPGFW^vq1vj8mdIayFOZo(tphk8C7hpT~ z1Fv8?b_LNR3QD9J+!v=p%}# + + \ No newline at end of file diff --git a/backend/public/apidoc/fonts/glyphicons-halflings-regular.ttf b/backend/public/apidoc/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..1413fc609ab6f21774de0cb7e01360095584f65b GIT binary patch literal 45404 zcmd?Sd0-pWwLh*qi$?oCk~i6sWlOeWJC3|4juU5JNSu9hSVACzERcmjLV&P^utNzg zIE4Kr1=5g!SxTX#Ern9_%4&01rlrW` Z!56xXTGQR4C z3vR~wXq>NDx$c~e?;ia3YjJ*$!C>69a?2$lLyhpI!C FfJsP=|`8@K0|bbMpWwVU Eygg0=0x_)HeHpGSJagJNLA3c!$EuOV>j$wi! zbo{vZ(s8tl>@!?}dmNHXo)ABy7ohD7_1G-P@SdJWT8*oeyB VYVW9*vn}&VI4q++W;Z+uz=QTK}^C75!`aFYCX# zf7fC2;o`%!huaTNJAB&VWrx=szU=VLhwnbT`vc<#<`4WI6n_x@AofA~2d90o?1L3w z9!I|#P*NQ)$#9aASijuw>JRld^-t)Zhmy|i-`Iam|IWkgu aMR%lhi4p~cX-9& zjfbx}yz}s`4-6>D^+6FzihR)Y!GsUy=_MWi_v7y#KmYi-{iZ+s@ekkq! @Wxz!~BQwiI&ti z>hC&iBe2m(dpNVvSbZe3DVgl(dxHt-k@{xv;&`^c8GJY%&^LpM;}7)B;5Qg5J^E${ z7z~k8eWOucjX6)7q1a%EVtmnND8cclz8R1=X4W@D8IDeUGXxEWe&p>Z*voO0u_2!! zj3dT(Ki+4E;uykKi*yr?w6!BW2FD55PD6SMj`OfBLwXL5EA-9KjpMo4*5Eqs^>4&> z8PezAcn!9jk-h-Oo!E9EjX8W6@EkTHeI<@AY{f|5fMW<-Ez-z)xCvW3()Z#x0oydB zzm4MzY^NdpIF9qMp-jU;99LjlgY@@s+=z`}_%V*xV7nRV*Kwrx-i`FzI0BZ#yOI8# z!SDeNA5b6u9!Imj89v0(g$;dT_y|Yz!3V`i{{_dez8U@##|X9A};s^7vEd!3AcdyVlhVk$v?$O442KIM1-wX^R{U7`JW&lPr3N(%kXfXT_`7w^? z=#ntx`tTF|N$UT?pELvw7T*2;=Q-x@KmDUIbLyXZ>f5=y7z1DT<7>Bp0k;eItHF?1 zErzhlD2B$Tm|^7DrxnTYm-tgg`Mt4Eivp5{r$o9e)8(fXBO4g|G^6Xy?y$SM*&V52 z6SR*%`%DZC^w(gOWQL?6DRoI*hBNT)xW9sxvmi@!vI^!mI$3kvAMmR_q#SGn3zRb_ zGe$=;Tv3dXN~9XuIHow*NEU4y&u}FcZEZoSlXb9IBOA}!@J3uov p}yerhPMaiI8|SDhvWVr z^BE&yx6e3&RYqIg;mYVZ*3#A-cDJ;#ms4txEmwm @g^s`BB}KmSr7K+ruIoKs=s|gOXP|2 zb1!)87h9?(+1^QRWb(Vo8+@G=o24gyuzF3ytfsKjTHZJ}o{YznGcTDm!s)DRnmOX} z3pPL4wExoN$kyc2>#J`k+<67sy-VsfbQ-1u+HkyFR?9G`9r6g4*8!(!c65Be-5hUg zZHY$M0k(Yd+DT1*8)G(q)1 &tDl=g9H7!bZTOvEEFnBOk_K=DXF(d4JOaH zI}*A3jGmy{gR>s}EQzyJa_q_?TYPNXR U1O;fcV_&TQZhd{@*8Tgpraf~nT0BYktu*n{a~ub^UUqQPyr~yBY{k2O zgV)honv{B_CqY|*S~3up%Wn%7i*_>Lu|%5~j)}rQLT1ZN?5%QN`LTJ}vA!EE=1`So z!$$Mv?6T)xk)H8JTrZ~m)oNXxS}pwPd#);<*>zWsYoL6iK!gRSBB{JCgB28C#E{T? z5VOCMW^;h~eMke(w6vLlKvm!!TyIf;k*RtK)|Q>_@nY#J%=h%aVb)?Ni_By)X NxY)E3`|}_u}fn+Kp^3p4RbhFUBRtGsDyx9Eolg77iWN z2iH-}CiM!pfYDIn7;i#Ui1KG01{3D<{e}uWTdlX4Vr*nsb^>l0%{O?0L9tP|KGw8w z+T5F}md>3qDZQ_IVkQ|BzuN08uN?SsVt$~wcHO4pB9~ykFTJO3g<4X({-Tm1w{Ufo zI03<6KK`ZjqVyQ(>{_aMxu7Zm^ck&~)Q84MOsQ-XS~{6j>0lTl@lMtfWjj;PT{nlZ zIn0YL?kK7CYJa)(8?unZ)j8L(O}%$5S#lTcq{rr5_gqqtZ@*0Yw4}OdjL*kBv+>+@ z&*24U=y{Nl 58qJyW1vTwqsvs=VRAzojm&V zEn6=WzdL1y+^}%Vg!ap>x%%nFi=V#wn# zUuheBR@* KS)5Mn0`f=3fMwR|#-rPMQJg(fW*5e`7xO&^UUH {L(U8D$JtI!ac!g(Ze89<`UiO@L+)^D zjPk2_Ie0p~4|LiI?-+pHXuRaZKG$%zVT0jn!yTvvM^jlcp`|VSHRt-G@_&~<4&qW@ z?b#zIN)G(}L|60jer*P7#KCu*Af;{mpWWvYK$@Squ|n-Vtfgr@ ZOmR5Xpl;0q~VILmjk$$mgp+`<2jP z@+nW5Oap%fF4nFwnVwR7rpFaOdmnfB$-rkO6T3#w^|*rft~acgCP|ZkgA6PHD#Of| zY%E!3tXtsWS`udLsE7cSE8g@p$ceu*tI71V31uA7jwmXUCT7+Cu3uv|W>ZwD {&O4Nfjjvl43N#A$|FWxId! z%=X!HSiQ-#4nS&smww~iXRn<-`&zc)nR~js?|Ei-cei$^$KsqtxNDZvl1oavXK#Pz zT&%Wln^Y5M95w=vJxj0a-ko_iQt(LTX_5x#*QfQLtPil;kkR|kz}`*xHiLWr35ajx zHRL-QQv$|PK-$ges|NHw8k6v?&d;{A$*q15hz9{}-`e6ys1EQ1oNNKDFGQ0xA!x^( zkG*-ueZT(GukSnK&Bs=4+w|(kuWs5V_2#3`!;f}q?>xU5IgoMl^DNf+Xd<=sl2 XvkqviJ>d?+G@Z5nxxd5Sqd$*ENUB_mb8Z+7CyyU zA6mDQ&e+S~w49csl*UePzY;^K)Fbs^%?7;+hFc(xz#mWoek4_&QvmT7Fe)*{h-9R4 zqyXuN5{)HdQ6yVi#tRUO#M%;pL>rQxN~6yoZ)*{{!?jU)RD*oOxDoTjVh6iNmhWNC zB5_{R=o{qvxEvi(k hbRS`FOXmOO|&Dj$&~>*oo)bZz%lPhEA@ zQ;;w5eu5^%i;)w?T&*=UaK?*|U3~{0tC`rvfEsRPgR~16;~{_S2&=E{fE2=c>{+y} zx1*NTv-*zO^px5TA|B```#NetKg`19O!BK*-#~wDM@KEllk^nfQ2quy25G%)l72<> zzL$^{DDM#jKt?<>m;!?E2p0l12`j+QJjr{Lx*47Nq(v6i3M&*P{jkZB{xR?NOSPN% zU>I+~d_ny=pX??qjF*E78>}Mgts@_yn`)C`wN-He_!OyE+gRI?-a>Om>Vh~3OX5+& z6MX*d1`SkdXwvb7KH&=31RCC|&H!aA1g_=ZY0hP)-Wm6?A7SG0*|$mC7N^SSBh@MG z9?V0tv_sE>X==yV{)^LsygK2=$Mo_0N!JCOU?r}rmWdHD%$h~~G3;bt`lH& zAuOOZ=G1Mih**0>lB5x+r)X^8mz!0K{SScj4|a=s^VhUEp#2M=^#WRqe?T&H9GnWa zYOq{+gBn9Q0e0*Zu>C(BAX=I-Af9wIFhCW6_>TsIH$d>|{fIrs&BX?2G>GvFc=<8` zVJ`#^knMU~65dWGgXcht`Kb>{V2oo%<{NK|iH+ R^|Gx%q+env#Js*(EBT3V0=w4F@W+oLFsA)l7Qy8mx_;6Vrk;F2RjKFvmeq} zro&>@b^(?f))OoQ#^#s)tRL>b0gzhRYRG}EU%wr9GjQ#~Rpo|RSkeik^p9x2+=rUr}vfnQoeFAlv=oX%YqbLpvyvcZ3l$B z5bo;hDd(fjT;9o7g9xUg3|#?wU2#BJ0G&W1#wn?mfNR{O7bq74
7tc~mM%m%t+7YN}^tMa24O4@w<|$lk@pGx!;%pKiq&mZB z?3h<&w>un8r?Xua6(@Txu~Za9tI@|C4#!dmHMzDF_-_~Jolztm=e)@vG11b ZQAs!tFvd9{C;oxC7VfWq377Y(LR^X_TyX9bn$)I765l=rJ%9uXcjggX*r?u zk|0!db_*1$&i8>d&G3C}A`{Fun_1J;Vx0gk7P_}8KBZDowr*8$@X?W 6v^LYmNWI)lN92yQ;tDpN zOUdS-W4JZUjwF-X#w0r;97;i(l}ZZT$DRd4u#?pf^e2 yaFo zbm>I@5}#8FjsmigM8w_f#m4fEP ~r~_?OWB%SGWcn$ThnJ@Y`ZI-O&Qs#Y14To( zWAl>9Gw7#}eT(!c%D0m>5D8**a@h;sLW=6_AsT5v1Sd_T-C4pgu_kvc?7+X&n_fct znkHy(_LExh=N%o3I-q#f$F4 QJpy>jZBW zRF7?EhqTGk)w&Koi}QQY3sVh?@e-Z3C9)P!(hMhxmXLC zF_+ZSTQU`Gqx@o (~ B$dbr zHlEUKoK&`2gl>zKXlEi8w6}`X3kh3as1~sX5@^`X_nYl}hlbpeeVlj#2sv)CIMe%b zBs7f|37f8qq}gA~Is9gj&=te^wN8ma?;vF)7gce;&sZ64!7LqpR!fy)?4cEZposQ8 zf;rZF7Q>YM F1~eQ|Z*!5j0DuA=`~VG$Gg6B?Om1 z6fM@`Ck-K*k(eJ)Kvysb8sccsFf@7~3vfnC=<$q+VNv)FyVh6ZsWw}*vs>%k3$)9| zR9ek-@pA23qswe1io)(Vz!vS1o*XEN*LhVYOq#T`;rDkgt86T@O`23xW~;W_#ZS|x zvwx-XMb7_!hIte-#JNpFxskMMpo2OYhHRr0Yn8d^(jh3-+!CNs0K2B!1dL$9UuAD= zQ%7Ae(Y@}%Cd~!`h|wAdm$2WoZ(iA1(a_-1?znZ%8h72o&Mm*4x8Ta<4++;Yr6|}u zW 8$p&izhdqF=m8$)HyS2J6cKyo;Yvb>DTfx4`4R{ zPSODe9E|uflE<`xTO=r>u~u=NuyB&H!(2a8vwh!jP!yfE3N>IiO1 jI>7e&3rR#RO3_}G23W?gwDHgSg ekzQ^PU&G5z&}V5GO? zfg#*72*$DP1T8i`S7=P;bQ8lYF9_@8^C(|;9v8ZaK2GnWz4$Th2a0$)XTiaxNWfdq z;yNi9veH !j)ba$9pke8`y2^63BP zIyYKj^7;2don3se!P&%I2jzFf|LA&tQ=NDs{r9fIi-F{-yiG-}@2`VR^-LIFN8BC4 z&?*IvLiGHH5>NY(Z^CL_A;yISNdq58}=u~9!Ia7 zm7MkDiK~lsfLpvmPMo!0$keA$`%Tm`>Fx9JpG^EfEb(;}%5}B4Dw!O3BCkf$$W-dF z$BupUPgLpHvr<<+QcNX*w@+Rz&VQz)Uh!j4|DYeKm5IC05T$KqVV3Y|MSXom+Jn8c zgUEaFW1McGi^44xoG*b0JWE4T`vka7qTo#dcS4RauUpE{O!ZQ?r=-MlY#;VBzhHGU zS@kCaZ*H73XX6~HtHd*4qr2h}Pf0Re@!WOyvres_9l2!AhPiV$@O2sX>$21)-3i+_ z*sHO4Ika^!&2utZ@5%VbpH(m2wE3qOPn-I5Tbnt&yn9{k*eMr3^u6zG-~PSr(w$p> zw)x^a*8Ru$PE+{&)%VQUvAKKiWiwvc{`|GqK2K|ZMy^Tv3g|zENL86z7i< c zW`W>zV1u}X%P;Ajn+>A)2iXZbJ5YB_r>K-h5g^N=LkN^h0Y6dPFfSBh(L`G$D%7c` z&0RXDv$}c7#w*7!x^LUes_|V*=bd&aP+KFi((tG *gakSR+FA26%{QJdB5G1F=UuU&koU*^zQA=cEN9}Vd?OEh| zgzbFf1?@LlPkcXH$;YZe`WEJ3si6&R2MRb}LYK&zK9WRD=kY-JMPUurX-t4(Wy{%` zZ@0WM2+IqPa9D(^*+MXw2NWwSX-_WdF0nMWpEhAyotIgqu5Y$wA= zfuXJ0Y2lL3#ji26-P3Z?-&0^KBc*`T$+8+cqp`%g0WB zTH9L)FZ&t073H4?t=(U6{8B+uRW_J_n*vW|p`DugT^3xe8Tomh^d}0k^G7$3wLgP& zn)vTWiMA&=bR8lX9H=uh4G04R6>C&Zjnx_f@MMY!6HK5v$T%vaFm;E8q=`w2Y}ucJ zkz~dKGqv9$E80NTtnx|Rf_)|3wxpnY6nh3U9<)fv2-vhQ6v=WhKO@~@X57N-`7Ppc zF;I7)eL?RN23FmGh0s ;Z#+p)}-TgTJE%&>{W+}C`^-sy{gTm<$>rR z-X7F%MB9Sf%6o7A%ZHReD4R;imU6<9h81{%avv}hqugeaf=~^3A=x(Om6Lku-Pn9i zC;LP%Q7Xw*0`Kg1)X~nAsUfdV%HWrpr8dZRpd-#%)c#Fu^mqo|^b{9Mam`^Zw_@j@ zR&ZdBr3?@<@%4Z-%LT&RLgDUFs4a(CTah_5x4X`xDRugi#vI-cw*^{ncwMtA4N KjByYBza)Y$hozZCpuxL{IP&=tw6ZO52WY3|iwGf&IJCn+u(>icK zZB1~bWXCmwAUz|^<&ysd#*!DSp8}DLNbl5lRFat4NkvItxy;9tpp9~ |@ z;JctShv^Iq4(z+y7^j&I?GCdKMVg&jCwtCkc4*@O7HY*veGDBtAIn*JgD$QftP}8= zxFAdF=(S>Ra6(4slk#h%b?EOU-96TIX$Jbfl* _7IY-|R%H zF8u|~hYS-YwWt5+^!uGcnKL~jM;)ObZ#q68ZkA?}CzV-%6_vPIdzh_wHT_$mM% vws9lxUj;E@#1UX?WO2R^41(X!nk$+2oJGr!sgcbn1f^yl1 z#pbPB&Bf;1&2+?};Jg5qgD1{4_|%X#s48rOLE!vx3@ktstyBsDQWwDz4GYlcgu$UJ zp|z_32yN72T*oT$SF8<}>e;FN^X&vWNCz>b2W0rwK#<1#kbV)Cf`vN-F$&knLo5T& z8!sO-*^x4=kJ$L&*h%rQ@49l?7_9IG99~xJDDil00<${~D&;kiqRQqeW5*22A`8I2 z(^@`qZoF7_`CO_e;8#qF!&g>UY;wD5MxWU>az oo=E{kW(GU#pbOi%XAn%?W{b>-bTt&2?G=E&BnK9m0zs{qr$*&g8afR_x`B~o zd#dxPpaap;I=>1j8=9Oj)i}s@V}oXhP*{R|@DAQXzQJekJnmuQ;vL90_)H_nD1g6e zS1H#dzg)U&6$fz0g%|jxDdz|FQN{KJ&Yx0vfuzAFewJjv`pdMRpY-wU`-Y6WQnJ(@ zGVb!-8DRJZvHnRFiR3PG3Tu^nCn(CcZHh7hQvyd7i6Q3&ot86XI{jo%WZqCPcTR0< zMRg$ZE=PQx66ovJDvI_JChN~k@L^Pyxv#?X^<)-TS5gk`M~d<~j%!UOWG;ZMi1af< z+86U0=sm!qAVJAIqqU`Qs1uJhQJA&n@9F1PUrYuW!-~IT>l$I!#5dB aiAK}RUufjg{$#GdQBkxF1=KU2E@N=i^;xgG2Y4|{H>s` z$ t`k8c-8`fS7Yfb1FM#)vPKVE4Uf(Pk&%HLe z%^4L>@Z^9Z{ZOX<^e)~adVRkKJDanJ6VBC_m@6qUq_WF @Epw>AYqf%r6qDzQ~AEJ !jtUvLp^CcqZ^G-;Kz3T;O4WG45Z zFhrluCxlY`M+OKr2SeI697btH7Kj`O>A!+2DTEQ=48cR>Gg2^5uqp(+y5Sl09MRl* zp|28!v*wvMd_~e2DdKDMMQ|({HMn3D%%ATEecGG8V9>`JeL)T0KG}=}6K8NiSN5W< z79-ZdYWRUb`T}(b{RjN8>?M~opnSRl$$^gT`B27kMym5LNHu-k;A;VF8R(HtDYJHS zU7;L{a@`>jd0svOYKbwzq+pWSC(C~SPgG~nWR3pBA8@OICK$Cy#U`kS$I;?|^-SBC zBFkoO8Z^%8Fc-@X!KebF2Ob3%`8zlVHj6H;^(m7J35(_bS;cZPd}TY~qixY{MhykQ zV&7u7s%E=?i`}Ax-7dB0ih47w*7!@GBt<*7ImM|_mYS|9_K7CH+i}?*#o~a&tF-?C zlynEu1DmiAbGurEX2Flfy$wEVk7AU;`k#=IQE*6DMWafTL|9-vT0qs{A3mmZGzOyN zcM9#Rgo7WgB_ujU+?Q@Ql?V-!E =jbypS+*ch I&zA+C_3_@aJal}!Q54?qsL0In({Ly zjH;e+_SK8yi0NQB%TO+Dl77jp#2pMGtwsgaC>K!)NimXG3;m7y`W+&<(ZaV>N*K$j zLL~I+6ouPk6_(iO>61cIsinx`5}DcKSaHjYkkMuDoVl>mKO<4$F <>YJ5J9A2Vl}#BP7+u~L8C6~D zsk`pZ$9Bz3teQS1Wb|8&c2SZ;qo<#F&gS;j`!~!ADr(jJXMtcDJ9cVi>&p3~{bqaP zgo%s8i+8V{UrYTc9)HiUR_c?cfx{Yan2#%PqJ{%?Wux4J;T$#cumM0{Es3@$>}DJg zqe*c8##t;X( 4$?A`ve)e@YU3d2Balcivot{1(ahlE5qg@S-h(mPNH&`pBX$_~HdG48~)$x5p z{>ghzqqn_t8~pY<5?-To>cy^6o~mifr;KWvx_oMtXOw$$d6jddXG)V@a#lL4o%N@A zNJlQAz6R8{7jax-kQsH6JU_u*En%k^NHlvBB!$JAK!cYmS)HkLAkm0*9G3!vwMIWv zo#)+EamIJHEUV|$d|<)2iJ`lqBQLx;HgD}c3mRu{iK23C>G{0Mp1K)bt6OU?xC4!_ zZLqpFzeu&+>O1F>%g-%U^~yRg(-wSp@vmD-PT#bCWy!%&H;qT7rfuRCEgw67V!Qob z&tvPU@*4*$YF#2_>M0(75QxqrJr3Tvh~iDeFhxl=MzV@(psx%G8|I{~9;tv#BBE`l z3)_98eZqFNwEF1h)uqhBmT~mSmT8k$7vSHdR97K~kM)P9PuZdS;|Op4A?O<*%!?h` zn`}r_j%xvffs46x2hCWuo0BfIQWCw9aKkH==#B(TJ%p}p-RuIVzsRlaPL_Co{&R0h zQrqn=g1PGjQg3&sc2IlKG0Io#v%@p>tFwF)RG0ahYs@Zng6}M*d}Xua)+h&?$`%rb z;>M=iMh5eIHuJ5c$aC`y@CYjbFsJnSPH&}LQz4}za9YjDuao>Z^EdL@%s aRm&LGQWXs*;FzwN#p>H&j~SLhDZ+QzhplV_ij(NyMl z;v|}a mvxRddO81LJFa~2QFUs z+ Lk zZck)}9uK^buJNMo4G(rSdX{57(7&n=Q6$QZ@lIO9#<3pA2ceD pO_340B*pHlh_y{>i&c1?vdpN1j>3UN-;;Yq?P+V5oY`4Z(|P8SwWq<) n`W@AwcQ?E9 zd5j8>FT^m=MHEWfN9jS}UHHsU`&SScib$qd0i=ky0>4dz5ADy70AeIuSzw#gHhQ_c zOp1!v6qU )@8MY+ zMNIID?(CysRc2uZQ$l*QZVY)$X?@4$VT^>djbugLQJdm^P>?51#lXBkdXglYm|4{L zL%Sr?2f`J+xrcN@=0tiJt(<-=+v>tHy{XaGj7^cA6felUn_KPa?V4ebfq7~4i~GKE zpm)e@1=E;PP%?`vK6KVPKXjUXyLS1^NbnQ&?z>epHCd+J$ktT1G&L~T)nQeExe;0Z zlei}< _ni ztFo}j7nBl$)s_ 3odmdafVieFxc)m!wM+U`2u%yhJ90giFcU1`dR6BBTKc2cQ*d zm-{?M&%(={ xYHy?VCx!ogr|4g5;V{2q(L?QzJGsirn~kWHU`l`rHiIrc-Nan!hR7zaLsPr4uR zG{En&gaRK&B@lyWV@yfFpD_^&z>84~_0Rd!v(Nr%PJhFF_ci3D#ixf|(r@$igZiWw za*qbXIJ_Hm4)TaQ=zW^g)FC6uvyO~Hg-#Z5Vsr ybz6uOTF>Rq1($JS`imyNB7myWWpxYL(t7`H8*voI3Qz6mvm z$JxtArLJ(1wlCO_te?L{>8YPzQ})xJlvc5wv8p7Z=HviPYB#^#_vGO#*`<0r%MR#u zN_mV4vaBb2RwtoOYCw)X^>r{2a0kK|WyEYoBjGxcObFl&P*??)WEWKU*V~zG5o=s@ z;rc~uuQQf9wf)MYWsWgPR!wKGt6q;^8!cD_vxrG8GMoFGOVV=(J3w6Xk;}i)9(7*U zwR4VkP_5Zx7wqn8%M8uDj4f1aP+vh1Wue&ry@h|wuN(D2W ;v6b1^ z`)7XBZ385zg;}&Pt@?dunQ=RduGRJn^9HLU&HaeUE_cA1{+oSIjmj3z+1YiOGiu-H zf8u-oVnG%KfhB8H?cg%@#V5n+L$MO2F4>XoBjBeX>css^h}Omu#)ExTfUE^07KOQS znMfQY2wz?!7!{*C^)aZ^UhMZf=TJNDv8VrrW;JJ9`=|L0`w9DE8MS>+o{f#{7}B4P z{I34>342vLsP}o=ny1eZkEabr@niT5J2AhByUz&i3Ck0H*H`LRHz;>3C_ru!X+EhJ z6(+(lI#4c`2{`q0o9aZhI|jRjBZOV~IA_km7ItNtUa(Wsr*Hmb;b4=; R(gF@GmsRI`pF+0tmq0 zy~wnoJD( LSEwHjT Ot4xb0XB-+ z&4RO{Snw4G%gS9w#uSUK$Zbb#=jxEl;}6&!b-rSY$0M4pftat-$Q)*y!bpx)R%P>8 zrB&`YEX2%+s#lFCIV;cUFUTIR$Gn2%F(3yLeiG8eG8&)+cpBlzx4)sK?>uIlH+$?2 z9q9wk5zY-xr_fzFSGxYp^KSY0s%1BhsI>ai2VAc8&JiwQ>3RRk?ITx!t~r45qsMnj zkX4bl06ojFCMq<9l*4NHMAtIxDJOX)H=K*$NkkNG<^nl46 zHWH1GXb?Og1f0S+8-((5yaeegCT62&4N*pNQY;%asz9r9Lfr;@Bl${1@a4QA vMLbV6JDp>8SO^q1)#(o%k!QiRSd0eTmzC< zNIFWY5?)+JTl1Roi=nS4%@5iF+%XztpR^BSuM~DX9q`;Mv=+$M+GgE$_>o+~$#?*y zAcD4nd~L~EsAjXV-+li6Lua4;(EFdi|M2qV53`^4|7gR8AJI;0Xb6QGLaYl1zr&eu zH_vFUt+-wHx^jA;=HXzQKp_j)#`&591BSP(wIOS;Ce(17%gs%~hdM@>Ouf4SXA~ z&Hh8K@ms^`(hJfdicecj>J^Aqd00^ccqN!-f-!=N7C1?`4J+`_f^nV!B3Q^|fuU)7 z1NDNT04hd4QqE+qBP+>ZE7{v;n3OGN`->|lHjNL5w40pe PJ?^Y6bFk@^k%^5CXZ<+4qbOplxpe)l7c6m%o-l1oWmCx%c6@rx85hi(F=v(2 zJ$jN>?yPgU#DnbDXPkHLeQwED5)W5sH# -eS z%#^4dxiVs{+q(Yd^ShMN3GH)!h!@W&N`$L!SbElXCuvnqh{U7lcCvHI#{ZjwnKvu~ zAeo7Pqot+Ohm{8|RJsTr3J4GjCy5UTo_u_~p)MS&Z5UrUc|+;Mc(YS+ju|m3Y_Dvt zonVtpBWlM718YwaN3a3wUNqX;7TqvAFnVUoD5v5WTh~}r)KoLUDw%8Rrqso~bJqd> z_T!&Rmr6ebpV^4|knJZ%qmzL;OvG3~A*loGY7?YS%hS{2R0%NQ@fRoEK52Aiu%gj( z_7~a}eQUh8PnyI^J!>pxB(x7FeINHHC4zLDT`&C*XUpp@s0_B^!k5Uu)^j_uuu^T> z8WW!QK0SgwFHTA%M!L`bl3h HjPp)|wL5Var_*A1-H8LV?uY5&ou{hRjj>#X@rxV>5 %-9hbP+v?$4}3EfoRH;l_wSiz{&1<+`Y5%o%q~4 rdpRF0jOsCoLnWY5x?V)0ga>CDo`NpqS) z@x`mh1QGkx;f)p-n^*g5M^zRTHz%b2IkLBY{F+HsjrFC9_H(=9Z5W&Eymh~A_FUJ} znhTc9KG((OnjFO=+q>JQZJbeOoUM77M{)$)qQMcxK9f;=L;IOv_J>*~w^YOW744QZ zoG;!b9VD3ww}OX<8sZ0F##8hvfDP{hpa3HjaLsKbLJ8 z0WpY2E!w?&cWi7&N%bOMZD~o7QT*$xCRJ@{t31~qx~+0yYrLXubXh2{_L699Nl_pn z6)9eu+uUTUdjHXYs#pX^L)AIb!FjjNsTp7C399w&B{Q4q%yKfmy}T2uQdU|1EpNcY zDk~(h#AdxybjfzB+mg6rdU9mDZ^V>|U13Dl$Gj+pAL}lR2a1u!SJXU_YqP9N{ose4 zk+$v}BIHX60WSGVWv;S%zvHOWdDP(-ceo(<8`y@Goy%4wDu>57QZNJc)f>Ls+}9h7 z^N=#3q3|l?aG8K#HwiW2^PJu{v|x5;awYfahC?>_af3$LmMc4%N~JwVlRZa4c+eW2 zE!zosAjOv&UeCeu;Bn5OQUC=jtZjF;NDk9$fGbxf3d29SUBekX1 !a$Vmq_VK*MHQ4)eB!dQrHH)LVYNF%-t8!d`@!cb z2CsKs3|!}T^7fSZm?0dJ^JE`ZGxA&a!jC<>6_y67On0M)hd$m*RAzo_qM?aeqkm`* zXpDYcc_>TFZYaC3JV>{>mp(5H^efu!Waa7hGTAts29jjuVd1vI*fEeB?A&uG<8dLZ z(j6 ;-%vJ7R0U9}XkH)1g>&uptXPHBEA*7PSO2TZ+dbhVxspNW~ZQT3fApz}2 z_@0-lZODcd>dLrYp!mHn4k>>7kibI!Em+Vh*;z}l?0qro=aJt68joCr5Jo(Vk<@i) z5BCKb4p6Gdr9=JSf(2Mgr=_6}%4?SwhV+JZj3Ox^_^OrQk$B^v?e Nz}d^xRaz&~ zKVnlLnK #8^y=If2f1zmb~^5lPLe?%l}>?~wN4IN((2~U{e9fKhLMtYFj)I$(y zgnKv?R+ZpxA$f)Q2l=aqE6EPTK=i0sY&MDFJp!vQayyvzh4wee<}kybNthRlX>SHh z7S}9he^EBOqzBCww^duHu!u+dnf9veG{HjW!}aT7aJqzze9K6-Z~8pZAgdm1n~aDs z8_s7?WXMPJ3EPJHi}NL&d;lZP8hDhAXf5Hd!x|^kEHu`6QukXrVdLnq5zbI~oPo?7 z2Cbu8U?$K!Z4_yNM1a(bL!GRe!@{Qom+DxjrJ!B99qu5b*Ma%^&-=6UEbC+S2zX&= zQ!%bgJTvmv^2}hhvNQg!l=kbapAgM^hruE3k@jTxsG(B6d=4thBC*4tzVpCYXFc$a zeqgVB^zua)y-YjpiibCCdU%txXYeNFnXcbNj*D?~)5AGjL+!!ij_4{5EWKG av0^={~M^q}baAFOPzxfUM>`KPf|G z&hsaR*7(M6KzTj8Z?;45zX@L#xU{4n$9Q_<-ac(y4g~S|Hyp^-<*d8+P4NHe?~vfm z@y309=`lGdvN8*jw-CL<;o#DKc-%lb0i9a3%{v&2X($|Qxv(_*()&=xD=5oBg=$B0 zU?41h9)JKvP0yR{KsHoC>&`(Uz>?_`tlLjw1&5tPH3FoB%}j;yffm$$s$C= RHi`I3*m@%CPqWnP@B~%DEe;7ZT{9!IMTo1hT3Q347HJ&!)BM2 z3~aClf>aFh0_9||4G}(Npu`9xYY1*SD|M~9!CCFn{-J$u2&Dg*=5$_nozpoD2nxqq zB!--eA8UWZlcEDp4r#vhZ6|vq^9sFvRnA9HpHch5Mq4*T)oGbruj!U8Lx_G%Lby}o zTQ-_4A7b)5A42vA0U}hUJq6&wQ0J%$`w#ph!EGmW96)@{AUx>q6E>-r^Emk!iCR+X zdIaNH`$}7%57D1FyTccs3}Aq0<0Ei{`=S7*>pyg=Kv3nrqblqZcpsCWSQl^uMSsdj zYzh73?6th$c~CI0>%5@!Ej`o)Xm38u0fp9=HE@Sa6l2 oX9^^4|Aq%GA z3(AbFR9gA_2T2i%Ck5V 2Q2WW-(a&(j#@l6wE4Z`xg#S za#-UWUpU2U!TmIo`CN0JwG^>{+V#9;z vx;ztc$}@NlcyJr?q(Y`UdW6qhq!aWyB5xV1#Jb{I-ghFNO0 z FU~+QgPs{FY1AbiU&S$QSix>*rqYVma<-~s%ALhFyVhAYepId1 zs!gOB&weC18yhE-v6ltKZMV|>JwTX+X)Y_EI(Ff^3$WTD|Ea-1HlP;6L~&40Q&5{0 z$e$2KhUgH8ucMJxJV#M%cs!d~#hR^nRwk|uuCSf6irJCkSyI<%CR==tftx6d%;?ef zYIcjZrP@APzbtOeUe>m-TW}c-ugh+U*RbL1eIY{?>@8aW9bb1NGRy@MTse@>= za%;5=U}X%K2tKTYe9gjMcBvX%qrC&uZ`d(t)g)X8snf?vBe3H%d G=b l^rv8Z@YN$gd9yveHY0@Wt0$s zh^7jCp(q+6XDoekb;=%y=Wr8%6;z0ANH5dDR_VudDG|&_lYykJaiR+(y{zpR=qL3|2e${8 z2V;?jgHj7}Kl(d8C9xWRjhpf_)KOXl+@c4wrHy zL3#9U(`=N59og2KqVh>nK~g9>fX*PI0`>i;;b6K F|8zg+k2hViCt}4dfMdvb1NJ-Rfa7vL2;lPK{Lq*u`JT>S zoM_bZ_?UY6oV6Ja14X^;LqJPl+w?vf*C!nGK;uU^0GRN|UeFF@;H(Hgp8x^|;ygh? zIZx3DuO(lD01ksanR@Mn#lti=p28RTNYY6yK={RMFiVd~k8!@a&^jicZ&rxD3CCI! zVb=fI?;c#f{K4Pp2lnb8iF2mig)|6JEmU86Y%l}m>(VnI*Bj`a6qk8QL&~PFDxI8b z2mcsQBe9$q`Q$LfG2wdvK`M1}7?SwLAV&)nO;kAk`SAz%x9CDVHVbUd$O(*aI@D|s zLxJW7W(QeGpQY<$dSD6U$ja(;Hb3{Zx@)*fIQaW{8<$KJ&fS0caI2Py^clOq9@Irt z7th7F?7W`j{&UmM==Lo~T&^R7A?G=K_e-zfTX|)i`pLitlNE(~tq*}sS1x2}Jlul6 z5+r#4SpQu8h{ntIv#qCVH`uG~+I8l+7ZG&d`Dm!+(rZQDV*1LS^WfH%-!5aTAxry~ z4xl&rot5ct{xQ$w$MtVTUi6tBFSJWq2Rj@?HAX1H$eL*fk{Hq;E`x|hghRkipYNyt zKCO=*KSziiVk|+)qQCGrTYH9X!Z0$k{Nde~0Wl`P{}ca%nv<6fnYw^ ~9dYxTnTZB&&962jX0DM&wy&8fdxX8xeHSe=UU&Mq zRTaUKnQO|A>E#|PUo+F=Q@dMdt`P*6e92za(TH{5C*2I2S~p?~O@hYiT>1(n^Lqqn zqewq3ctAA%0E)r53*P-a8Ak32mGtUG`L^WVcm`QovX`ecB4E9X60wrA(6NZ7z~*_DV_e z8$I*eZ8m=WtChE{#QzeyHpZ%7GwFHlwo2*tAuloI-j2exx3#x7EL^&D;Re|Kj-XT- zt9 08^soV2`7s+Hha!d^#J+B)0-`{qIF_x=B811SZlbUe%kvPce^xu7?LY|C z@f1gRPha1j q|=f}Se)}v-7MWH9)YAs*FJ&v3ZT9TSi?e#jarin0tjPNmxZNU_JFJG z+tZi!q)JP|4pQ)?l8$hRaPeoKf!3>MM-bp06RodLa*wD=g3)@pYJ^*YrwSIO!SaZo zDTb!G9d!hb%Y0QdYxqNSCT5o0I!GDD$Z@N!8J3eI@@0AiJmD7brkvF!pJGg_AiJ1I zO^^cKe`w$DsO|1#^_|`6XTfw6E3SJ(agG*G9qj?JiqFSL|6tSD6vUwK?Cwr~gg)Do zp@$D~7~66-=p4`!!UzJDKAymb!!R(}%O?Uel|rMH>OpRGINALtg%gpg`=}M^Q#V5( zMgJY&gF)+;`e38QHI*c%B}m94o&tOfae; og&!J2;6ENW}QeL7 3jatbI1*9X~y=$Dm%6FwDcnCyMRL }zo`0=y7=}*Uw zo3!qZncAL{HCgY!+}eKr{P8o27ye+;qJP;kOB%RpSesGoHLT6tcYp*6v~Z9NCyb6m zP#qds0jyqXX46qMNhXDn3pyIxw2f_z;L_X9EIB} AhyC`FYI}G3$WnW>#NMy{0aw}nB%1=Z4&*(FaCn5QG(zvdG^pQRU25;{wwG4h z@kuLO0F->{@g2!;NNd! PfqM-;@F0;&wK}0fT9UrH}(8A5I zt33( +&U;CLN|8+71@g z(s!f-kZZZILUG$QXm9iYiE*>2w;gpM>lgM{R9vT3q>qI{ELO2hJHVi`)*jzOk$r)9 zq}$VrE0$GUCm6A3H5J-=Z9i*biw8 ng zi<1nM0lo^KqRY@Asucc#DMmWsnCS;5uPR)GL3pL=-IqSd>4&D&NKSGHH?pG;=Xo`w zw~VV9ddkwbp~m>9G0*b?j7-0fOwR?*U#BE#n7A=_fDS>`fwatxQ+`FzhBGQUAyIRZ??eJt46vHBlR>9m!vfb6I)8!v6TmtZ%G6&E|1e zOtx5xy%yOSu+<9Ul5w5N=&~4Oph?I=ZKLX5DXO(*&Po>5KjbY7s@tp$8(fO|`Xy}Y z;NmMypLoG7r#Xz4aHz7n)MYZ7Z1v;DFHLNV{)to;(;TJ=bbMgud96xRMME#0d$z-S z-r1ROBbW^&YdQWA>U|Y>{whex#~K!ZgEEk=LYG8Wqo28NFv)!t!~}quaAt}I^y-m| z8~E{9H2VnyVxb_wCZ7v%y(B@VrM6lzk~|ywCi3HeiSV`TF>j+I jd|p*kyn;=mqtf8&DK^|*f+y$ 38+9!sis9N=S)nINm9=CJ<;Y z!t&C>MIeyou4XLM*ywT_JuOXR>VkpFwuT9j5>66 7A=CU*{TBrMTgb4HuW&!%Yt`;#md7-`R`ouOi$rEd!ErI zo#>qggAcx?C7`rQ2;)~PYCw%CkS(@EJHZ|!!lhi@Dp$*n^mgrrImsS~(ioGak>3)w zvop0lq@IISuA0Ou*#1JkG{U>xSQV1e}c)!d$L1plFX5XDXX5N 7Ns{kT{y5|6MfhBD+esT)e7&CgSW8FxsXTAY=}?0A!j_V9 zJ;IJ~d%av<@=fNPJ9)T3qE78kaz64E>dJaYab5u aU`n~Zdp2h{8DV%SKE5G^$LfuOTRRjB;TnT(Jk$r{Pfe4CO!SM_7d)I zquW~FVCpSycJ~c*B*V8?Qqo=GwU8CkmmLFugfHQ7;A{yCy1OL-+X=twLYg9|H=~8H znnN@|tCs^ZLlCBl5wHvYF}2vo>a6%mUWpTds_mt*@wMN4-r`%NTA%+$(`m6{MNpi@ zMx)8f>U#KGhQOH9sd_@m#$xV)2XXy+)7rj 4hd!row@gM&PVo&Hx+lV@$j9yWTjTue zG9n0DP<*HUmJ7ZZWwI2x+{t3QEfr6?T}2iXl=6e0b~)J>X3`!fXd9+2wc1%cj&F@Z zgYR|r5Xd5jy9;YW&=4{-0rJ*L5CgDPj9^3%bp-`HkyBs`j1iTUGD4?WilZ6RO8mIE z+~Joc?GID6K96dyuv(dWREK9Os~%?$$FxswxQsoOi8M?RnL%B~Lyk&(-09D0M?^Jy zWjP)n(b)TF<-|C G%!Vz?8Fu&6iU<>oG#kGcrcrrBlfZMVl0wOJvsq%RL9To%iCW@)#& zZAJWhgzYAq)#NTNb~3GBcD%ZZOc43!YWSyA7TD6xkk )n^FaRAz73b}%9d&YisBic(?mv=Iq^r%Ug zzHq-rRrhfOOF+yR=AN!a9*Rd#sM9ONt5h~w)yMP7Dl9lfpi$H0%GPW^lS4~~?vI8Z z%^ToK#NOe0ExmUsb`lLO$W*}yXNOxPe@zD*90uTDULnH6C?InP3J=jYEO2d)&e|mP z1DSd0QOZeuLW o*NqZzopA+LXy9)fJC00NSX=_4Mi1Z)YyZVC>C!g}cY(Amaj%QN+bev|Xxd2OPD zk!dfkY6k!(sDBvsFC2r^?}hb81(WG5Lt9|riT`2?P;B%jaf5UX<~OJ;uAL$=Ien+V zC!V8u0v?CUa)4*Q+Q_u zkx{q;NjLcvyMuU*{+uDsCQ4U{JLowYby-tn@{mQ!v2u1l{5e{t5@ZjF*S!>hatL zy}X>9y08#}oytdn^qfFesF)Tt(2!XGw#r%?7&zzFFh2U;#U9XBO8W--#gOpfbJ`Ey z|M8FCKlWQrOJwE;@Sm02l9OBr7N}go4V8ur)}M@m2uWjggb)DC4s`I4d7_8O&E(j; z?3$9~R$QDxNM^rNh9Y;6P7w+bo2q}NEd6f&_raor-v`UCaTM3TT8HK2-$|n{N@U>_ zL-`P7EXoEU5JRMa)?tNUEe8XFis+w8g9k(QQ)%?&Oac}S`2V$b?%`DwXBgja&&fR@ zH_XidF$p1wA)J|Wk1;?lCl?fgc)=TB3>Y8;BoMqHwJqhL)Tgydv9(?(TBX)fq%=~C zmLj!iX-kn7QA(9snzk0LRf<%SzO&~IhLor6A3f*U^UcoAygRe!H#@UCv$JUP&vPxs zeDj$1%#<2T1!e|!7xI+~_VXLl5|jHqvOhU7ZDUGee;HnkcPP=_k_FFxPjXg*9KyI+ zIh0@+s)1JDSuKMeaDZ3|<_*J8{TUFDLl|mXmY8B>Wj_?4mC#=XjsCKPEO=p0c&t&Z zd1%kHxR#o9S*C?du*}tEHfAC7WetnvS}`<%j=o7YVna)6pw(xzkUi7f#$|^y4WQ{7 zu@@lu=j6xr*11VEIY+`B{tgd( c3zO8%nGk0U^%ec6h)G_`ki|XQXr!?NsQkxzV6Bn1ea9L+@ z(Zr7CU_oXaW>VOdfzENm+FlFQ7Se0ROrNdw(QLvb6{f}HRQ{$Je>(c&rws#{dFI^r zZ4^(`J*G0~Pu_+p5AAh>RRpkcbaS2a?Fe&JqxDTp`dIW9; DL%0wxX5;`KxyA4F{(~_`93>NF@bj4LF!NC&D6Zm+Di$Q-tb2*Q z&csGmXyqA%Z9s(AxNO3@Ij=WGt=UG6J7F;r*uqdQa z?7j!nV{8eQE-cwY7L(3AEXF3&V*9{DpSYdyCjRhv#&2johwf{r+k`QB81%!aRVN<& z@b*N^xiw_lU>H~@4MWzgHxSOGVfnD|iC7=hf0%CPm_@@4^t-nj#GHMug&S|FJtr?i z^JVrobltd(-?Ll>)6>jwgX=dUy+^n_ifzM>3)an3iOzpG9Tu;+96TP<0Jm_PIqof3 zMn=~M!#Ky{CTN_2f7Y-i#|gW~32RCWKA4-J9sS&>kYpTOx#xVNLCo)A$LUme^fVNH z@^S7VU^UJ0YR8? Oy$^IYuG*bm|g;@aX~i60%`7XLy*AYpYvZ^F^U(!|RW z*C!rJ@+7TGdL=nNd1gv^%B+;Fcr$y)i0!GRsZXRHPs>QVGVR{9r_#&Qd(wL|5;H;> zD>HUw=4CF++&{7$<8G@j*nGjhEO%BQYfjeItp4mPvY*JYb1HKd !{HJ9*)(3%BR%{Pp?AM&*yHAJsW({ivOzj*qS!-7|XEn6@zo z3L*tBT%<4RxoAh>q{0n_JBmgW6&8hx?kL(_^k%VL>?xjAyrKBmSl`$=V|SK}ELl}@ zd|d0eo#RfG`bw9SK3%r4Y+rdvc}w}~ixV%tqawbdqvE-WcgE+BUpxMT%F@btm76MG zn=oQRWWuTm+a{dy)Oc2V4yX(@M{QAkx>(QB59*`dLT`!`ti2@y+pV_8st7_#g52 z1!@8-14n{+!KuOff(Jusq1w=z(B5!jxFx(cyss+1s Pz3Lsj9iB=HSHAiCq()ns|Cr)1 *c605Cx}3V&x}Lg?b+6Q?)z7Kl zQh&1Hx`y6JY-Cwvd*ozeps}a1xAA0CR+Da;+O(i)P1C;SjOI}Dtmf6tPqo-Bl`U78 zv$kYgPntPp@G)n1an9tEoL*Vumu9`>_@I(;+5+fBa-*?fEx=mTEjZ7wq}#@Gd5_cW z!mP{N=yqEntDo)|>oy6{9cu+-3*GTnmb^`O0^FzRPO^&aG`f@F_R*aQ_e{F+_9%NW z4KG_B`@X3EVV9L>?_RNDMddA>w=e0KfAiw5?#i1NFT%Zz#nuv(&!yIU>lVxmzYKQ` zzJ*0w9<&L4aJ6A;0j|_ ~i>+y(q-=;2Xxhx2v%CYY^{} z^J@LO()eLo|7!{ghQ+(u$wxO*xY#)cL(|mi H2_ck2yN{mu4O9=hBW*pM_()-_YdH#Ru{JtwJ^R2}3?!>>m1pohh zrn(!xCjE5dV)b*C5Aj$gepjhO+1}F~03sn})p^Uz6_w9HjtSwO;4fgQNBdkCC(S zXIQs_lKEg{DKt7!64@q0U7<~Z9sWW2MiWn5C=n^v2(+j+NQ}hd(YScLR6bFX1e5GJ z{f}vqE*X+(y(=SeU6&= 0Q&EH1 QK?zA%sxVh&H99cObJUY$veZhQ)MLu-h%`!*G)s$2k;~+A z)Kk->Ri?`oGDEJEtI*wijm(s5 f$W78FH{+qBxiU{~kq((J3uK{m z$|C8K#j-?hm8H@x%VfFqpnvu@xn1s%J7uNZC9C99a<_b1J|mx%)$%!6gPU|~<@2&m zz99GDp`|a%m*iggvfL;4%X;~WY>)@!tMWB@P`)k?$;0x9JSrRI8?s3rlgH(o@`OAo zn{f*gZ#t2u 6K??hx|aElOM`Xd0t+SAIUEHvFw%?Wsm$s zUXq{6UU?a>Nc@@Xlb_2k 9M1Ctr<#+O?yd}rv z_wu& =_t$!Yngd@N_AUj}T; z#*Ce|%XZr_sQcsWcsl{pCnnj+c8ZNIMmx<;w=-g$Q>BU;9k;w|zQ;4!W32Xg2Cd?{ zvmO3kuKQ^Hv;o>6ZHP8ZJ2`4~Bx?N;cf<0fi=!*G^^WzbTF3e$b&d^qqB{>nqLG81 zs94bBh%|Vj+hLu=!8(b9brJ>ZBns9^6s(gdSVyP9qnu2_I{Sg8j-rloG6{d`De5We zDe5WeY3ga}Y3ga}Y3ga}Y3ga}Y3ga}d8y~6o|k%F>UpW>rJk31Ug~+N=cS&HdOqs; zsOO`ek9t1p`Kafko{xGy>iMbXr=FjBxZMYc8a#gL`Kjlpo}YSt>iMY`pk9DF0qO*( z6QE9jIsxhgs1u-0kUBx8D@eT{^@7w3QZGooAoYUO3sNscy%6<6)C*BBM7 L`dk$Xk%6}eZQXgo#!75P`>Uy*-B{uTLG Uy*-B{uTLG Uy*-B{uTLG ))v8{5gt_uj9!t5)^yb-JtjRGrhi zYInOUNJxNyf_yKX01)K=WP|Si>HqEj|B{eUl?MR<)%<1&{(~)D+NPwKxWqT-@~snp zg9KCz1VTZDiS?UH`PRk1VPM{29cgT9= D?!Wc_@}qzggFv;gb@2cJQAYWWtpEZ7?y@jSVqjx${B5UV@SO|wH<<0; z{><1KdVI%Ki}>~<`46C0AggwUwx-|QcU;iiZ{NZu`ur>hd*| Hb(|6veERq xu=b@5Bab=rqptGxd{QJg!4*-i_$sES~)AB46}Fjg|ea#e@?J}z%CUJ zOsLWRQR1# ng^sD)A4FDuY!iUhzlgfJh(J@BRqd&P#v2B`+saBx>m+M&q7vk-75$NH%T5pi%m z5FX?`2-5l53=a&GkC9^NZCLpN5(DMKMwwab$FDIs?q>4!!xBS}75gX_5;(luk;3Vl zLCLd5a_8`Iyz}K}+#RMwu6DVk3O_-}n>aE!4NaD*sQn`GxY?cHe!Bl9n?u&g6?aKm z-P8z&;Q3gr;h`YIxX%z^o&GZZg1=>_+hP2$$-DnL_?7?3^!WAsY4I7|@K;aL<>OTK zByfjl2PA$T83*LM9(;espx-qB%wv7H2i6CFsfAg<9V>Pj*OpwX)l?^mQfr$*OPPS$ z=`mzTYs{*(UW^ij1U8UfXjNoY7GK*+YHht(2oKE&tfZuvAyoN(;_OF>-J6AMmS5fB z ^sY6wea&&${+!}@R1f$5oC-2J>J-A${@r(dRzc`wnK>a7~8{Y-scc|ETOI8 zjtNY%Y2!PI;8-@a=O}+{ap1Ewk0@T`C`q!|=KceX9gK8wtOtIC96}-^7)v23Mu;MH zhKyLGOQMujfRG$p(s`(2*nP4EH7*J57^=|%t(#PwCcW7U%e=8Jb>p6~ >RAlY4a*t s=pl}_J{->@kKzxH|8XQ5{t=E zV&o`$D#ZHdv&iZWFa)(~o Bh-Osl{~CS0hfM7?PyWUWsr5oYlsyC1cwULoQ4|Y5RHA2*rN+EnFPnu z`Y_&Yz*#550YJwDy@brZU>0pWV^RxRjL221@2ABq)AtA%Cz?+FG(}Yh?^v)1Lnh%D zeM{{3&-4#F9rZhS@DT0E(WRkrG!jC#5?OFjZv*xQjUP~XsaxL2rqRKvPW$zHqHr8Urp2Z)L z+)EvQeoeJ8c6A#Iy9>3lxiH3=@86uiTbnnJJJoypZ7gco_*Hv KOH97B? zWiwp>+r}*Zf9b3ImxwvjL~h~j<<3shN8$k-$V1p|96I!=N6VBqmb==Bec|*;HUg?) z4!5#R*(#Fe)w%+RH#y{8&%%!| fQ5JcFzUE;-yVYR^&Ek55AXb{^w|@j|&G z|6C-+*On%j;W|f8mj?;679?!qY86c{(s1-PI2Wahoclf%1*8%JAvRh1(0)5Vu37Iz z`JY?RW@qKr+FMmBC{TC7k@}fv-k8t6iO}4K-i3WkF!Lc=D` nuD)v#Na zA|R*no51fkUN3^rmI;tty#IK284*2Zu!kG13 !$OlxJAt@zLU`kvsazO25TpJLbK&;M8kw*0)*14kpf*)3 ;GiDh;C(F}$- z1;!=OBkW#ctacN=je*Pr)lnGzX=OwgNZjTpVbFxqb;8kTc@X&L2XR0A7oc!Mf2?u9 zcctQLCCr+tYip a_k=;1ETIpHt!Jeo;iy^xqBES^Ct6-+wHi%2g&)?7N^Yy zUrMIu){Jk)luDa@7We5U!$$3XFNbyRT!YPIbMKj5$IEpTX1IOtVP~(UPO2-+9ZFi6 z-$3<|{Xb#@tABt0M0s1TVCWKwveDy^S!!@4$s|DAqhsEv--Z}Dl)t%0G>U#ycJ7cy z^8%;|pg32=7~MJmqlC-x07Sd!2YX^|2D`?y;-$a!rZ3R5ia{v1QI_^>gi(HSS_e%2 zUbdg^zjMBBiLr8eSI^BqXM6HKKg#@-w`a**w(}RMe%XWl3MipvBODo*hi?+ykYq)z ziqy4goZw0@VIUY65+L7DaM5q=KWFd$;W3S!Zi>sOzpEF#(*3V-27N;^pDRoMh~(ZD zJLZXIam0lM7U#)119Hm947W)p3$%V`0Tv+*n=&ybF&}h~FA}7hEpA&1Y!BiYIb~~D z$TSo9#3ee02e^%*@4|*+=Nq6&JG5>zX4k5f?)z*#pI-G(+j|jye%13CUdcSP;rNlY z#Q!X%zHf|V)GWIcEz-=fW6AahfxI~y7w7i|PK6H@@twdgH>D_R@>&OtKl}%MuAQ7I zcpFmV^~w~8$4@zzh~P~+?B~%L@EM3x(^KXJSg c6I=;)B6 zpRco2LKIlURPE*XUmZ^|1vb?w*ZfF}EXvY13I4af+()bAI5V?BRbFp`Sb{8GRJHd* z4S2s%4A) 6Uc=PK%4@PbJ<{1R6+2THMk0c+kif**#ZGE)w6WsqH z`r^DL&r8|OEAumm^qyrryd(HQ9olv$ltnVGB{aY?_76Uk%6p;e)2DTvF(;t=Q+|8b zqfT(u5@BP);6;jmRAEV057E*2d^wx@*aL1GqWU|$6h5%O@cQtVtC^isd%gD7PZ_Io z_BDP5w(2*)Mu&JxS@X%%ByH_@+l>y07jIc~!@;Raw)q_;9oy@*U#mCnc7%t85qa4? z%_Vr5tkN^}(^>`EFhag;!MpRh!&bKnveQZAJ4)gEJo1@wHtT$Gs6IpznN$Lk-$NcM z3ReVC&qcXvfGX$I0nfkS$a|Pm%x+lq{WweNc;K>a1M@EAVWs2IBcQPi EJNt}+Ea8~WiapASoMvo(&PdUO}AfC~>ZGzq Wjd)4no( ziLi#e3lOU~sI*XPH&n&J0cWfoh*}eWEEZW%vX?YK!$?w}htY|GALx3;YZoo=JCF4@ zdiaA-uq!*L5;Yg)z-_`MciiIwDAAR3-snC4V+ KA>&V%Ak;p{1u>{Lw$NFj)Yn0Ms2*kxUZ)OTddbiJM}PK!DM}Ot zczn?EZXhx3wyu6i{QMz_Ht%b?K&-@5r;8b076YDir`KXF0&2i9NQ~#JYaq*}Ylb}^ z<{{6xy&;dQ;|@k_(31PDr!}}W$zF7Jv@f%um0M$#=8ygpu%j(VU-d5JtQwT714#f0z+Cm$F9J