From a37870c93b1caeee38d041814719e2bcb364846c Mon Sep 17 00:00:00 2001 From: molong Date: Thu, 12 May 2022 21:23:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E7=9B=AE=E5=BD=95=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controller/Base.php | 16 + app/controller/Index.php | 17 - app/controller/auth/Index.php | 26 + app/middleware.php | 1 + app/middleware/AllowCrossDomain.php | 48 ++ app/middleware/Api.php | 3 + app/model/BaseModel.php | 15 + app/model/user/Users.php | 20 + app/services/auth/LoginService.php | 36 + composer.json | 3 +- composer.lock | 272 +++++++- config/cross.php | 15 + config/jwt.php | 45 ++ route/auth.php | 14 + ui/README.md | 72 +- ui/package.json | 2 +- ui/public/config.js | 4 +- ui/public/img/logo-r.png | Bin 8373 -> 6608 bytes ui/public/img/logo.png | Bin 9112 -> 6608 bytes ui/src/App.vue | 34 +- ui/src/api/model/auth.js | 11 +- ui/src/api/model/demo.js | 37 -- ui/src/api/model/system.js | 116 +++- ui/src/api/model/user.js | 65 ++ ui/src/components/HelloWorld.vue | 32 - ui/src/config/index.js | 11 +- ui/src/config/select.js | 6 +- ui/src/config/table.js | 6 +- ui/src/config/upload.js | 2 +- ui/src/config/workflow.js | 4 +- ui/src/layout/components/userbar.vue | 32 +- ui/src/main.js | 4 +- ui/src/pages/home/index.vue | 48 ++ .../home/widgets/components/about.vue | 0 .../home/widgets/components/echarts.vue | 0 .../home/widgets/components/index.js | 0 .../home/widgets/components/progress.vue | 0 ui/src/pages/home/widgets/components/time.vue | 41 ++ .../pages/home/widgets/components/version.vue | 37 ++ .../home/widgets/components/welcome.vue | 5 +- .../{views => pages}/home/widgets/index.vue | 0 .../home/work/components/myapp.vue | 0 ui/src/pages/home/work/index.vue | 48 ++ .../setting => pages/system}/client/index.vue | 0 .../setting => pages/system}/client/save.vue | 0 ui/src/pages/system/department/index.vue | 146 +++++ ui/src/pages/system/department/save.vue | 118 ++++ .../setting => pages/system}/dic/dic.vue | 30 +- ui/src/pages/system/dic/index.vue | 317 +++++++++ ui/src/pages/system/dic/list.vue | 117 ++++ ui/src/pages/system/log/index.vue | 103 +++ ui/src/pages/system/log/info.vue | 47 ++ ui/src/pages/system/menu/index.vue | 162 +++++ .../setting => pages/system}/menu/save.vue | 65 +- ui/src/pages/system/role/index.vue | 160 +++++ ui/src/pages/system/role/permission.vue | 144 ++++ .../setting => pages/system}/role/save.vue | 39 +- .../system => pages/system/setting}/index.vue | 0 .../setting => pages/system}/table/index.vue | 0 .../setting => pages/system}/table/save.vue | 0 .../setting => pages/system}/task/index.vue | 0 .../setting => pages/system}/task/logs.vue | 0 .../setting => pages/system}/task/save.vue | 0 ui/src/pages/system/user/index.vue | 200 ++++++ ui/src/pages/system/user/role.vue | 81 +++ .../setting => pages/system}/user/save.vue | 67 +- ui/src/pages/ucenter/index.vue | 169 +++++ ui/src/pages/ucenter/login.vue | 247 +++++++ ui/src/router/index.js | 2 +- ui/src/router/systemRouter.js | 2 +- ui/src/{scui.js => sent.js} | 2 +- ui/src/{assets => static}/icons/BugFill.vue | 0 ui/src/{assets => static}/icons/BugLine.vue | 0 ui/src/{assets => static}/icons/Code.vue | 0 ui/src/{assets => static}/icons/FileExcel.vue | 0 ui/src/{assets => static}/icons/FilePpt.vue | 0 ui/src/{assets => static}/icons/FileWord.vue | 0 ui/src/{assets => static}/icons/Vue.vue | 0 ui/src/{assets => static}/icons/Wechat.vue | 0 ui/src/{assets => static}/icons/index.js | 0 ui/src/{ => static}/style/app.scss | 0 ui/src/{ => static}/style/fix.scss | 0 ui/src/{ => static}/style/media.scss | 0 ui/src/{ => static}/style/pages.scss | 0 ui/src/{ => static}/style/style.scss | 0 ui/src/{ => static}/style/theme/dark.scss | 0 ui/src/store/modules/account.js | 33 + ui/src/utils/request.js | 13 +- ui/src/views/home/index.vue | 48 -- ui/src/views/home/widgets/components/time.vue | 40 -- ui/src/views/home/widgets/components/ver.vue | 41 -- ui/src/views/home/work/index.vue | 37 -- ui/src/views/other/about.vue | 52 -- ui/src/views/other/directive.vue | 54 -- ui/src/views/other/fullpage.vue | 32 - ui/src/views/other/viewTags.vue | 82 --- ui/src/views/setting/dic/index.vue | 330 ---------- ui/src/views/setting/dic/list.vue | 111 ---- ui/src/views/setting/log/index.vue | 142 ---- ui/src/views/setting/log/info.vue | 54 -- ui/src/views/setting/menu/index.vue | 164 ----- ui/src/views/setting/role/index.vue | 160 ----- ui/src/views/setting/role/permission.vue | 131 ---- ui/src/views/setting/user/index.vue | 191 ------ ui/src/views/template/blank.vue | 17 - ui/src/views/template/calendar.vue | 154 ----- ui/src/views/template/chartlist.vue | 222 ------- ui/src/views/template/list/index.vue | 249 ------- ui/src/views/template/list/info.vue | 153 ----- ui/src/views/template/list/save.vue | 73 --- ui/src/views/template/server.vue | 615 ------------------ ui/src/views/template/stepform.vue | 150 ----- ui/src/views/template/svgmap/index.vue | 148 ----- ui/src/views/template/tabinfo.vue | 214 ------ ui/src/views/test/autocode/index.vue | 67 -- ui/src/views/test/autocode/list.vue | 220 ------- ui/src/views/test/codebug/index.vue | 64 -- ui/src/views/userCenter/index.vue | 212 ------ ui/src/views/userCenter/login.vue | 249 ------- ui/src/views/vab/chart.vue | 232 ------- ui/src/views/vab/contextmenu.vue | 120 ---- ui/src/views/vab/cron.vue | 46 -- ui/src/views/vab/cropper.vue | 98 --- ui/src/views/vab/dialog/dialog1.vue | 28 - ui/src/views/vab/dialog/dialog2.vue | 28 - ui/src/views/vab/dialog/index.vue | 101 --- ui/src/views/vab/drag.vue | 117 ---- ui/src/views/vab/editor.vue | 27 - ui/src/views/vab/fileselect.vue | 62 -- ui/src/views/vab/filterBar.vue | 174 ----- ui/src/views/vab/form.vue | 410 ------------ ui/src/views/vab/formtable.vue | 114 ---- ui/src/views/vab/iconfont.vue | 39 -- ui/src/views/vab/iconselect.vue | 71 -- ui/src/views/vab/mini.vue | 67 -- ui/src/views/vab/print.vue | 49 -- ui/src/views/vab/qrcode.vue | 47 -- ui/src/views/vab/select.vue | 65 -- ui/src/views/vab/statistic.vue | 64 -- ui/src/views/vab/tableselect.vue | 95 --- ui/src/views/vab/upload.vue | 109 ---- ui/src/views/vab/video.vue | 100 --- ui/src/views/vab/watermark.vue | 63 -- ui/src/views/vab/workflow.vue | 114 ---- ui/vue.config.js | 6 +- 145 files changed, 3090 insertions(+), 7244 deletions(-) create mode 100644 app/controller/Base.php delete mode 100644 app/controller/Index.php create mode 100644 app/controller/auth/Index.php create mode 100644 app/middleware/AllowCrossDomain.php create mode 100644 app/model/BaseModel.php create mode 100644 app/model/user/Users.php create mode 100644 app/services/auth/LoginService.php create mode 100644 config/cross.php create mode 100644 config/jwt.php create mode 100644 route/auth.php delete mode 100644 ui/src/api/model/demo.js create mode 100644 ui/src/api/model/user.js delete mode 100644 ui/src/components/HelloWorld.vue create mode 100644 ui/src/pages/home/index.vue rename ui/src/{views => pages}/home/widgets/components/about.vue (100%) rename ui/src/{views => pages}/home/widgets/components/echarts.vue (100%) rename ui/src/{views => pages}/home/widgets/components/index.js (100%) rename ui/src/{views => pages}/home/widgets/components/progress.vue (100%) create mode 100644 ui/src/pages/home/widgets/components/time.vue create mode 100644 ui/src/pages/home/widgets/components/version.vue rename ui/src/{views => pages}/home/widgets/components/welcome.vue (92%) rename ui/src/{views => pages}/home/widgets/index.vue (100%) rename ui/src/{views => pages}/home/work/components/myapp.vue (100%) create mode 100644 ui/src/pages/home/work/index.vue rename ui/src/{views/setting => pages/system}/client/index.vue (100%) rename ui/src/{views/setting => pages/system}/client/save.vue (100%) create mode 100644 ui/src/pages/system/department/index.vue create mode 100644 ui/src/pages/system/department/save.vue rename ui/src/{views/setting => pages/system}/dic/dic.vue (73%) create mode 100644 ui/src/pages/system/dic/index.vue create mode 100644 ui/src/pages/system/dic/list.vue create mode 100644 ui/src/pages/system/log/index.vue create mode 100644 ui/src/pages/system/log/info.vue create mode 100644 ui/src/pages/system/menu/index.vue rename ui/src/{views/setting => pages/system}/menu/save.vue (74%) create mode 100644 ui/src/pages/system/role/index.vue create mode 100644 ui/src/pages/system/role/permission.vue rename ui/src/{views/setting => pages/system}/role/save.vue (69%) rename ui/src/{views/setting/system => pages/system/setting}/index.vue (100%) rename ui/src/{views/setting => pages/system}/table/index.vue (100%) rename ui/src/{views/setting => pages/system}/table/save.vue (100%) rename ui/src/{views/setting => pages/system}/task/index.vue (100%) rename ui/src/{views/setting => pages/system}/task/logs.vue (100%) rename ui/src/{views/setting => pages/system}/task/save.vue (100%) create mode 100644 ui/src/pages/system/user/index.vue create mode 100644 ui/src/pages/system/user/role.vue rename ui/src/{views/setting => pages/system}/user/save.vue (64%) create mode 100644 ui/src/pages/ucenter/index.vue create mode 100644 ui/src/pages/ucenter/login.vue rename ui/src/{scui.js => sent.js} (98%) rename ui/src/{assets => static}/icons/BugFill.vue (100%) rename ui/src/{assets => static}/icons/BugLine.vue (100%) rename ui/src/{assets => static}/icons/Code.vue (100%) rename ui/src/{assets => static}/icons/FileExcel.vue (100%) rename ui/src/{assets => static}/icons/FilePpt.vue (100%) rename ui/src/{assets => static}/icons/FileWord.vue (100%) rename ui/src/{assets => static}/icons/Vue.vue (100%) rename ui/src/{assets => static}/icons/Wechat.vue (100%) rename ui/src/{assets => static}/icons/index.js (100%) rename ui/src/{ => static}/style/app.scss (100%) rename ui/src/{ => static}/style/fix.scss (100%) rename ui/src/{ => static}/style/media.scss (100%) rename ui/src/{ => static}/style/pages.scss (100%) rename ui/src/{ => static}/style/style.scss (100%) rename ui/src/{ => static}/style/theme/dark.scss (100%) create mode 100644 ui/src/store/modules/account.js delete mode 100644 ui/src/views/home/index.vue delete mode 100644 ui/src/views/home/widgets/components/time.vue delete mode 100644 ui/src/views/home/widgets/components/ver.vue delete mode 100644 ui/src/views/home/work/index.vue delete mode 100644 ui/src/views/other/about.vue delete mode 100644 ui/src/views/other/directive.vue delete mode 100644 ui/src/views/other/fullpage.vue delete mode 100644 ui/src/views/other/viewTags.vue delete mode 100644 ui/src/views/setting/dic/index.vue delete mode 100644 ui/src/views/setting/dic/list.vue delete mode 100644 ui/src/views/setting/log/index.vue delete mode 100644 ui/src/views/setting/log/info.vue delete mode 100644 ui/src/views/setting/menu/index.vue delete mode 100644 ui/src/views/setting/role/index.vue delete mode 100644 ui/src/views/setting/role/permission.vue delete mode 100644 ui/src/views/setting/user/index.vue delete mode 100644 ui/src/views/template/blank.vue delete mode 100644 ui/src/views/template/calendar.vue delete mode 100644 ui/src/views/template/chartlist.vue delete mode 100644 ui/src/views/template/list/index.vue delete mode 100644 ui/src/views/template/list/info.vue delete mode 100644 ui/src/views/template/list/save.vue delete mode 100644 ui/src/views/template/server.vue delete mode 100644 ui/src/views/template/stepform.vue delete mode 100644 ui/src/views/template/svgmap/index.vue delete mode 100644 ui/src/views/template/tabinfo.vue delete mode 100644 ui/src/views/test/autocode/index.vue delete mode 100644 ui/src/views/test/autocode/list.vue delete mode 100644 ui/src/views/test/codebug/index.vue delete mode 100644 ui/src/views/userCenter/index.vue delete mode 100644 ui/src/views/userCenter/login.vue delete mode 100644 ui/src/views/vab/chart.vue delete mode 100644 ui/src/views/vab/contextmenu.vue delete mode 100644 ui/src/views/vab/cron.vue delete mode 100644 ui/src/views/vab/cropper.vue delete mode 100644 ui/src/views/vab/dialog/dialog1.vue delete mode 100644 ui/src/views/vab/dialog/dialog2.vue delete mode 100644 ui/src/views/vab/dialog/index.vue delete mode 100644 ui/src/views/vab/drag.vue delete mode 100644 ui/src/views/vab/editor.vue delete mode 100644 ui/src/views/vab/fileselect.vue delete mode 100644 ui/src/views/vab/filterBar.vue delete mode 100644 ui/src/views/vab/form.vue delete mode 100644 ui/src/views/vab/formtable.vue delete mode 100644 ui/src/views/vab/iconfont.vue delete mode 100644 ui/src/views/vab/iconselect.vue delete mode 100644 ui/src/views/vab/mini.vue delete mode 100644 ui/src/views/vab/print.vue delete mode 100644 ui/src/views/vab/qrcode.vue delete mode 100644 ui/src/views/vab/select.vue delete mode 100644 ui/src/views/vab/statistic.vue delete mode 100644 ui/src/views/vab/tableselect.vue delete mode 100644 ui/src/views/vab/upload.vue delete mode 100644 ui/src/views/vab/video.vue delete mode 100644 ui/src/views/vab/watermark.vue delete mode 100644 ui/src/views/vab/workflow.vue diff --git a/app/controller/Base.php b/app/controller/Base.php new file mode 100644 index 0000000..3dfdc69 --- /dev/null +++ b/app/controller/Base.php @@ -0,0 +1,16 @@ + +// +---------------------------------------------------------------------- +namespace app\controller; + +use app\BaseController; + +class Base extends BaseController{ + + public $data = ['code' => 1, 'data' => '', 'message' => '']; +} \ No newline at end of file diff --git a/app/controller/Index.php b/app/controller/Index.php deleted file mode 100644 index 81203ad..0000000 --- a/app/controller/Index.php +++ /dev/null @@ -1,17 +0,0 @@ -*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }

:)

ThinkPHP V' . \think\facade\App::version() . '
14载初心不改 - 你值得信赖的PHP框架

[ V6.0 版本由 亿速云 独家赞助发布 ]
'; - } - - public function hello($name = 'ThinkPHP6') - { - return 'hello,' . $name; - } -} diff --git a/app/controller/auth/Index.php b/app/controller/auth/Index.php new file mode 100644 index 0000000..449bdde --- /dev/null +++ b/app/controller/auth/Index.php @@ -0,0 +1,26 @@ + +// +---------------------------------------------------------------------- +namespace app\controller\auth; + +use app\controller\Base; +use app\services\auth\LoginService; + +class Index extends Base{ + + public function login(LoginService $service){ + try { + $data = $service->authLogin($this->request); + $this->data['data'] = $data; + } catch (\think\Exception $e) { + $this->data['code'] = 0; + $this->data['message'] = $e->getMessage(); + } + return $this->data; + } +} diff --git a/app/middleware.php b/app/middleware.php index d2989de..7f18944 100644 --- a/app/middleware.php +++ b/app/middleware.php @@ -1,6 +1,7 @@ +// +---------------------------------------------------------------------- +declare (strict_types = 1); + +namespace app\middleware; + +use think\Config; +use think\Request; +use think\Response; + +class AllowCrossDomain{ + + protected $header = [ + 'Access-Control-Allow-Credentials' => 'true', + 'Access-Control-Max-Age' => 1800, + 'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers' => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With', + ]; + + public function __construct(Config $config){ + $this->header = array_merge($this->header, $config->get('cross', '')); + } + + /** + * 允许跨域请求 + * @access public + * @param Request $request + * @param Closure $next + * @param array $header + * @return Response + */ + public function handle($request, \Closure $next, ? array $header = []){ + $header = !empty($header) ? array_merge($this->header, $header) : $this->header; + + if (!isset($header['Access-Control-Allow-Origin'])) { + $origin = $request->header('origin'); + $header['Access-Control-Allow-Origin'] = $origin ? $origin : "*"; + } + + return $next($request)->header($header); + } +} diff --git a/app/middleware/Api.php b/app/middleware/Api.php index 9a3cbc6..ff054f5 100644 --- a/app/middleware/Api.php +++ b/app/middleware/Api.php @@ -11,6 +11,9 @@ declare (strict_types = 1); namespace app\middleware; class Api{ + + public $data = ['code' => 1, 'data' => '', 'message' => '']; + /** * 处理请求 * diff --git a/app/model/BaseModel.php b/app/model/BaseModel.php new file mode 100644 index 0000000..f02ad81 --- /dev/null +++ b/app/model/BaseModel.php @@ -0,0 +1,15 @@ + +// +---------------------------------------------------------------------- +namespace app\model; + +use think\Model; + +class BaseModel extends Model{ + +} \ No newline at end of file diff --git a/app/model/user/Users.php b/app/model/user/Users.php new file mode 100644 index 0000000..9ea0ae5 --- /dev/null +++ b/app/model/user/Users.php @@ -0,0 +1,20 @@ + +// +---------------------------------------------------------------------- +namespace app\model\user; + +use app\model\BaseModel; +use xiaodi\JWTAuth\Facade\Jwt; + +class Users extends BaseModel{ + + public function getTokenAttr($value, $data){ + $token = Jwt::store('api')->token($data)->__toString(); + return $token; + } +} \ No newline at end of file diff --git a/app/services/auth/LoginService.php b/app/services/auth/LoginService.php new file mode 100644 index 0000000..1b7ccaf --- /dev/null +++ b/app/services/auth/LoginService.php @@ -0,0 +1,36 @@ + +// +---------------------------------------------------------------------- +namespace app\services\auth; + +use app\model\user\Users; + +class LoginService{ + + public function authLogin($request){ + $params = $request->post(); + $map = []; + foreach($params as $field => $value){ + if(in_array($field, ['username', 'email', 'mobile']) && $field != 'password'){ + $map[$field] = $value; + } + } + $user = Users::where($map)->field(['uid','username', 'password', 'email', 'avatar', 'department_id', 'status'])->findOrEmpty(); + if (!$user->isEmpty()) { + if(password_verify(base64_decode($params['password']), $user->password)){ + throw new \think\Exception('密码不正确!', 100002); + }elseif($user->status != 1){ + throw new \think\Exception('当前用户不可用', 100003); + }else{ + return $user->append(['token']); + } + }else{ + throw new \think\Exception('当前用户不存在', 100001); + } + } +} \ No newline at end of file diff --git a/composer.json b/composer.json index ff2a220..bc0cf27 100644 --- a/composer.json +++ b/composer.json @@ -22,7 +22,8 @@ "require": { "php": ">=7.2.5", "topthink/framework": "^6.0.0", - "topthink/think-orm": "^2.0" + "topthink/think-orm": "^2.0", + "xiaodi/think-jwt": "^2.0" }, "require-dev": { "symfony/var-dumper": "^4.2", diff --git a/composer.lock b/composer.lock index f5c84df..5fea774 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,72 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "972d5f37c97d6a688bc084d56a25d074", + "content-hash": "aed98006f10d9fbc1ef4ac60e21a2a0e", "packages": [ + { + "name": "lcobucci/jwt", + "version": "3.3.3", + "source": { + "type": "git", + "url": "https://github.com/lcobucci/jwt.git", + "reference": "c1123697f6a2ec29162b82f170dd4a491f524773" + }, + "dist": { + "type": "zip", + "url": "https://repo.huaweicloud.com/repository/php/lcobucci/jwt/3.3.3/lcobucci-jwt-3.3.3.zip", + "reference": "c1123697f6a2ec29162b82f170dd4a491f524773", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "ext-openssl": "*", + "php": "^5.6 || ^7.0" + }, + "require-dev": { + "mikey179/vfsstream": "~1.5", + "phpmd/phpmd": "~2.2", + "phpunit/php-invoker": "~1.1", + "phpunit/phpunit": "^5.7 || ^7.3", + "squizlabs/php_codesniffer": "~2.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "psr-4": { + "Lcobucci\\JWT\\": "src" + } + }, + "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" + ], + "funding": [ + { + "url": "https://github.com/lcobucci", + "type": "github" + }, + { + "url": "https://www.patreon.com/lcobucci", + "type": "patreon" + } + ], + "time": "2020-08-20T13:22:28+00:00" + }, { "name": "league/flysystem", "version": "1.1.9", @@ -192,6 +256,149 @@ ], "time": "2022-04-17T13:12:02+00:00" }, + { + "name": "nette/php-generator", + "version": "v3.6.7", + "source": { + "type": "git", + "url": "https://github.com/nette/php-generator.git", + "reference": "b9ba414c9895fd9420887f20eeb4eabde123677f" + }, + "dist": { + "type": "zip", + "url": "https://repo.huaweicloud.com/repository/php/nette/php-generator/v3.6.7/nette-php-generator-v3.6.7.zip", + "reference": "b9ba414c9895fd9420887f20eeb4eabde123677f", + "shasum": "" + }, + "require": { + "nette/utils": "^3.1.2", + "php": ">=7.2 <8.2" + }, + "require-dev": { + "nette/tester": "^2.4", + "nikic/php-parser": "^4.13", + "phpstan/phpstan": "^0.12", + "tracy/tracy": "^2.8" + }, + "suggest": { + "nikic/php-parser": "to use ClassType::withBodiesFrom() & GlobalFunction::withBodyFrom()" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.6-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🐘 Nette PHP Generator: generates neat PHP code for you. Supports new PHP 8.1 features.", + "homepage": "https://nette.org", + "keywords": [ + "code", + "nette", + "php", + "scaffolding" + ], + "time": "2022-03-10T01:51:00+00:00" + }, + { + "name": "nette/utils", + "version": "v3.2.7", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99" + }, + "dist": { + "type": "zip", + "url": "https://repo.huaweicloud.com/repository/php/nette/utils/v3.2.7/nette-utils-v3.2.7.zip", + "reference": "0af4e3de4df9f1543534beab255ccf459e7a2c99", + "shasum": "" + }, + "require": { + "php": ">=7.2 <8.2" + }, + "conflict": { + "nette/di": "<3.0.6" + }, + "require-dev": { + "nette/tester": "~2.0", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.3" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "time": "2022-01-24T11:29:14+00:00" + }, { "name": "psr/cache", "version": "1.0.1", @@ -574,6 +781,69 @@ "orm" ], "time": "2022-02-28T14:54:22+00:00" + }, + { + "name": "xiaodi/think-jwt", + "version": "v2.0.3", + "source": { + "type": "git", + "url": "https://github.com/friendsofthinkphp/think-jwt.git", + "reference": "e24e6084a25d3463f125b3844061b0b0fa1ab843" + }, + "dist": { + "type": "zip", + "url": "https://repo.huaweicloud.com/repository/php/xiaodi/think-jwt/v2.0.3/xiaodi-think-jwt-v2.0.3.zip", + "reference": "e24e6084a25d3463f125b3844061b0b0fa1ab843", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "lcobucci/jwt": "3.3.3", + "nette/php-generator": "^3.2", + "php": ">=7.1.0", + "topthink/framework": "^6.0.2" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.15", + "mockery/mockery": "^1.2", + "phpstan/phpstan": "^0.12.0", + "phpunit/phpunit": "^6.2" + }, + "type": "think-extend", + "extra": { + "think": { + "services": [ + "xiaodi\\JWTAuth\\JwtService" + ], + "config": { + "jwt": "config/config.php" + } + }, + "think-config": { + "jwt": "config/config.php" + } + }, + "autoload": { + "psr-4": { + "xiaodi\\JWTAuth\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "xiaodi", + "email": "liangjinbiao@live.com" + } + ], + "description": "ThinkPHP Jwt Component", + "keywords": [ + "php", + "thinkphp" + ], + "time": "2021-02-22T02:09:36+00:00" } ], "packages-dev": [ diff --git a/config/cross.php b/config/cross.php new file mode 100644 index 0000000..f5e3db6 --- /dev/null +++ b/config/cross.php @@ -0,0 +1,15 @@ + +// +---------------------------------------------------------------------- + +return [ + 'Access-Control-Allow-Credentials' => 'true', + 'Access-Control-Max-Age' => 1800, + 'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, DELETE, OPTIONS', + 'Access-Control-Allow-Headers' => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With', +]; \ No newline at end of file diff --git a/config/jwt.php b/config/jwt.php new file mode 100644 index 0000000..7c28498 --- /dev/null +++ b/config/jwt.php @@ -0,0 +1,45 @@ + +// +---------------------------------------------------------------------- +use app\model\user\Users; + +return [ + 'stores' => [ + 'api' => [ + 'sso' => [ + 'enable' => false, + ], + 'token' => [ + 'unique_id_key' => 'uid', + 'signer_key' => 'tensent', + 'not_before' => 0, + 'expires_at' => 3600, + 'refresh_ttL' => 7200, + 'signer' => 'Lcobucci\JWT\Signer\Hmac\Sha256', + 'type' => 'Header', + 'relogin_code' => 50001, + 'refresh_code' => 50002, + 'iss' => 'client.tensent', + 'aud' => 'server.tensent', + 'automatic_renewal' => false, + ], + 'user' => [ + 'bind' => true, + 'class' => null, + ] + ] + ], + 'manager' => [ + // 缓存前缀 + 'prefix' => 'jwt', + // 黑名单缓存名 + 'blacklist' => 'blacklist', + // 白名单缓存名 + 'whitelist' => 'whitelist' + ] +]; diff --git a/route/auth.php b/route/auth.php new file mode 100644 index 0000000..932be58 --- /dev/null +++ b/route/auth.php @@ -0,0 +1,14 @@ + +// +---------------------------------------------------------------------- +use think\facade\Route; +use app\controller\auth; + +Route::group('auth', function(){ + Route::post('login', 'auth.Index/login'); +}); \ No newline at end of file diff --git a/ui/README.md b/ui/README.md index 2d87a44..6740d80 100644 --- a/ui/README.md +++ b/ui/README.md @@ -1,65 +1,19 @@ +# thinkvue-admin -
+## Project setup +``` +npm install +``` -![logo](https://lolicode.gitee.io/scui-doc/logo.png) - -

- - vue - - - element plus - -

- -

SCUI Admin

- -
- -## 介绍 -SCUI 是一个中后台前端解决方案,基于VUE3和elementPlus实现。 -使用最新的前端技术栈,提供各类实用的组件方便在业务开发时的调用,并且持续性的提供丰富的业务模板帮助你快速搭建企业级中后台前端任务。 - -SCUI的宗旨是 让一切复杂的东西傻瓜化。 - -![logo](https://lolicode.gitee.io/scui-doc/g_1.jpg) - -## 特点 -- **组件** 多个独家组件、业务模板和代码生成器 -- **权限** 完整的鉴权体系和高精度权限控制 -- **布局** 提供多套布局模式,满足各种视觉需求 -- **API** 完善的API管理,使用真实网络MOCK -- **配置** 统一的全局配置和组件配置,支持build后配置热更新 -- **性能** 在减少带宽请求和前端算力上多次优化,并且持续着 -- **其他** 多功能视图标签、动态权限菜单、控制台组态化、统一异常处理等等 - -## 演示和文档 - -- 演示 -- 文档 - -## 部分截图 - -![logo](https://lolicode.gitee.io/scui-doc/g_2.jpg) - -## 安装教程 -``` sh -# 克隆项目 -git clone https://gitee.com/lolicode/scui.git - -# 进入项目目录 -cd scui - -# 安装依赖 -npm i - -# 启动项目(开发模式) +### Compiles and hot-reloads for development +``` npm run serve ``` -启动完成后浏览器访问 http://localhost:2800 -## 感谢 -![fastmock](https://www.fastmock.site/resource/images/logo.png) +### Compiles and minifies for production +``` +npm run build +``` -## 支持 -如果觉得本项目还不错或在工作中有所启发,请在Gitee(码云)帮开发者点亮星星,这是对开发者最大的支持和鼓励! +### Customize configuration +See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/ui/package.json b/ui/package.json index 3cfad77..b6226d9 100644 --- a/ui/package.json +++ b/ui/package.json @@ -1,5 +1,5 @@ { - "name": "scui", + "name": "thinkvue-admin", "version": "1.5.0", "private": true, "scripts": { diff --git a/ui/public/config.js b/ui/public/config.js index 6ab642a..10e148d 100644 --- a/ui/public/config.js +++ b/ui/public/config.js @@ -4,8 +4,8 @@ const APP_CONFIG = { //标题 - APP_NAME: "SCUI", + // APP_NAME: "SCUI", //接口地址,如遇跨域需使用nginx代理 - API_URL: "https://www.fastmock.site/mock/5039c4361c39a7e3252c5b55971f1bd3/api" + // API_URL: "https://www.fastmock.site/mock/5039c4361c39a7e3252c5b55971f1bd3/api" } diff --git a/ui/public/img/logo-r.png b/ui/public/img/logo-r.png index 9f8fba91bca40d7495a33e0bdf15ab332fa6bac3..54300a1b2f65014281bbf11e7f02f921479bc6eb 100644 GIT binary patch literal 6608 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 literal 8373 zcmaKSc{o(@_y5RN8j+=_lr@E6jD75evSc@7P#DbEjqH0WMhg;U-*+=ZgNz8-WmgO# z3PlZ*#E`Y`^x3|@KR&z5ia~uEwfYZoO-wFU= zlKJ~N&c=|0M<)j}PJ%%O$RKMhCMXmYfClKgVO`L|M!qO_v=tiV7Jj=QtpNZqU-q;? z1|dyvKwYuEvZ%ip*)U&!hBg48p&jOra`i?B3A>=(J^eIA*I&O874~$~6tz_{1)KWA z&>o(K5dmoH2s0bk2ya(4H&JaZVT~{-!+*E&)4bv3;hg~RR{Z}j}D*O*f zkhiAjKS?1?Erem%0JN}@tTM<|UQtO{MNL*-SwT@vO-2|3mRFSntIEkMfaH~-ieM-N zBK)sIl;JJF4Fk2(zxFR*j4Mr1kDwrbsGMAAXsB$cf-E+`T~1z2O-&9Ak%K@$3t;~qs|Ly26kiiD3 zk97_9Mf(LA>1&EIB(iRvZcsg?YfADey2^?MN(S=s1~4@hrE3N%Fqj@pAEFF~DgRs7 z$S*Jm<>!k2x31^^>MH%8x=>gE8Wn^Mu)$(|{+&Gw4{Q)N&;#o)41@j6mYVPtTTeeX zY-r%szv2BCTXcYD2-@vh0M=LdAMt^D{x=R_uo_rdSsw;bQ)KYh(^FMstW+QnRYg_C zj`T(UrR(G207hvm+DK>Fe5r&8+2xr#Qi%_i<@=CYLhlc1Um@uSpSpAnKfb^{l^%^M$_WLDzDng0Jyh zJMtfZ2%XKvqi|paujgX#-&yrO$5{Ah2}1A1o=iLSD)xAg0JmM-sS_sR?YU{8Fuozf4x{jGZX*4WZ#I7%9*tUlE4CS)D#wWrpwL_YV46Z6XOF zmb9uF&_<>&LbEvHW`hx(MAfCl{Rw+P<*J#5FX3N%dQmWvKmsIly2U2=8P$-2!o%iD zLnJkH!-kSpl_}Nu^Kg~Qn6KsR0*F+k@)ifh2+xY&#lvhk^{kEZw`6?sylw^8T zFyZ)x*els=ULf)cq4r7%q={^hpQA0I#xe>2Lrg{hAvA3loJ+N#T*bS-%};&XSz{aR z6dX@=$4eeRiG#zp{qOIcq^!dCPp6iK>(F78Mw<-6MG0{M#Pr&-;Di%?Ues>kg0mEY z^yUUVc(h%amj@^<-ba{!0llS^;jhE4QM#8*J&E@|!H$FTDR-;Gg3H~;xd0J8c2Y#|qm@C8oS7tl9VVY`qW5#Ro``l5v~&Jjs~!Dx|FSVtT<3CFUd3LG8}=eo zSN7?_!t}}!L~Dw_&clzyJ$FimM9y6%KgV}{KWQQ6XIX7=m>|_Ol2eSDhPIuIbAe8r zcj)?!qRc$g3Nl`u_2Igjv-#`f5QpezeeB@bh}p|skK)vhOx?P)(?@g?eSV=9-xz+O zSAXCf+|Jr7rXpt)#bePo$vmz?u+9jSx@7Ju7kB+V8`a6#gQj`*w6#1r=VBeFr}p1Z15a%BjqKK=*)Nsm zF?|_X5qD@q><03!IwQ$PqvZEtyfltNu*_^7C_@>AoC_qmtu(dfZnIdZD$_egAip(n z6g6_i9+%Cg$8|u*D_C9HAhu?47~b&BFK6vgp#IqLkMrP_*fm4(6uk9>~+NZki5)MihbgNa7TmWL`? z{5lfTg%Q2vg#ZW7K%8WJxR@<$lYeQo1ajc$ zFYt}OhM2sD9a`nC`yww{M#s8ya#_!_`aVr=xV1ut0%M(vfMH*l}+4O?W}|Yt(c{ zl1X?vzzBSWwSd>&jdL&r*wB+2xp{#pbph3{tZ>Dx?|m_ZcuOJ&iL+xW?Qxvn39U{; zRX_8|aRnH1t?n084yOFnr&NMJaR{S*VkTp$RH^fmKk(;m5;j`^sVistCxx^S6p;mv zAr3%p*Bq}@7HV1p7%8oqu)+cuIYW`QafJ_%h>mmv2A~|=*D8{c9pZ>*z9AvyPcKW$|FLv7-d~BQ>CK5A!F>`Z8{Kh)2WkAD;sn<`*;oo z9r9V5$gAN((|Sllr8Q|jmo8jkSExj(RB`e*zX*pkagz)BSU?}z!d?Vya(E%vQ+$TG z<9fWz2_Gvbr#{D=HQu(u$Uixi8@m4!oQa|p?D(=+IdUCqEAaoO=nei|$AH?GHXRAx1$v=^4%ix_9VZq6ZskFH$@NGGbk~$wZ z)6xQL5tsLV_=HhFBKFSOXDZ}{ZC&7E68ID-(l455V? zYq%CTy5sZsJGbXXWWU*jm---8vFltnkpnfPzWR%0cmOGBm*kB?)x}>{ZB6k^-NeNzFGX?|d7N}`)0E;{vi=;_pT74s z6&0NswhUoe>mx#4?z`JB#fe7D{K^agdjB!&%>;u8QO951wFnw=K?Qhn8QL|yWk!H zOuU_LUrV=Ug?HDUw95lK6oNZtCz!!b{%b2f`T=S-(HJ3K{wmo{H&mk(YSGX%4qUYv z!iy10@)8-~G2Z=GJ3$)aQR=m;Z;9zVY(pFY3$(mbCw6S+#B!Ac>g_;2yG^a{WC+VR zyAGQ*V3&K<#jHJT4AlN8DHE=ULH8;OPyb4f$%@W;+^Q&$LAFvb+_E}nRxpZ^E13St9an0_Qcv@d9{cKoujEcK#)Q6u80)L3bHHmg`}B6Hbuwa2m0x! zQ48mi>__}Ruftbd5f*^i@OKmE(p!yRZgz%&-{ zvyclPG!@WD=1j^DI2F9(wZ#11@)OU(@kyLa*Gr)d^=1Mg_3YnRXP>OU{SF+2 z_A$So+n~$42-OU!+}oTZ?uGNEfX(sSymI|7v&U~|QpOX*L*V6hNiK}WruqHVq?4jr z{s$j)X95JxKb`RkwY_l#K&F=?x)#?OfrG>kO@KnEOy&qFSzOk^`x-%BI@Y-M*1KrA ze)470CLDbEiv^?gVTMZA%0Bm&>k3KmePsWOap5&|nuLnqh*r(qaWrQn8fZo5V zg&A#uw+kw>paXmk=F5Fz#}w3kx*A6*@Zk1ov;J15GHg@?7}H9ay_1bSK?{1M$ph?+ z^)hW=9S%-gt2kt!&rtHyQ9`+uc1di?gk>d$vyocfw)}C!SInGjZTYmxp)JCUMmWK!7}vnfKr`;h5uNm3x3)|3bmZqleMoEKfAPYHDJ-1lSsh!5~M) zUrQy56umu_a+bXmgIwbAJCRH?XiZdROF6%vgQ8`Ov0pr;%6FkWn&}G`d6h!a%X$mJ z-2*h$7YqkAqTaW#Xc33O+R*mk<=rt}z%TSiMvLgL2|zyxVYN8^+5v~2B@CHA zj-w&+GsVHIrR!db$Tr<#cJ8M@Y4hF_x+uk!8`Wm2Y^xt%UW;#hCxAFblw@hT!vr+>T`xu$V!Ls& zYasHiUS5$(_T>hgg|oeaE~oURO8KBmjk+rPWts5V^5;I0CLJU_H?5MbvgEpVd?&wU zp21Phh`e`)5T^y7_6vU79*7YV`9A$J)nNq2`4~tr?2SJb@vdA+>IB8SpY+RHLu{+4 zLjL|EU$zMTS{bFP@t!Kw*I6U$(em_uH>N|YyWB*xDq8K5N83kP&uWm5--AZuN~7of zH;vqyVH`NhP@P`OL;KXXjkly$cd6Y`MxVc$OKp<$qBn`@VHs4#3Na*Ge^4A1CHR9I z$Is5p^g>C%ZmrzxdSR^NErjtGZwGneft?ur)1b%A%PQUKrtcl2ZmO`k9{E>IkjRYj zV+!wmdZMlhwZQ2#*Q8(PDItIut|z8=Q{M4OZlg>EiKa?-S-&nzu~zN_zjzj zmn#t1-mmY^JL`yTE2x@~%a* z*XCI9P@NS-W}~;UrnFZ<^eg3MrK#ztUY5qS7~urD`^(}p_!gs9Ls99@3Jh{GGd&}S z)&yzlm1P;euTPk`JAkR_yK~!w4L;!?S$XXC6F-Qj7mhz5Yve|*M2}gda8CAgsos?Q z@JmGc!S0l?zDbCcg3JbA(^|N}=G;rRfW4h-_WHh3u1~dB>zvkALg64nFFz%qmXFih zrf&Q$pG-)gan3n;a$>M z>)neUw{}gnK4?+>`4gOtLJi;y(&5nqQC+s;ynf9h6`J}RWboI(6YLsr92FIOHD^mz z7PV3nU;H9YWaf$>;=-q(L%q|lrC@Ekws%Ae)V_?3%@%7*sKSXE-_a<-f)E&;=;N$36pW21xin3NZ|NSGvhZ;z+{oFZt?EcVm!NA zOKMq&<6hclPj=0mArQcnqDYw#+W~R{QYX?WT|}TdvT%6}L3aJ1exd&J?EPaA>oUSD zv<`>PENl1u$)(@)?^)7mf#u(P)aX4rPO=R(t|(+CLQ=62D=5wv4?GETqc{9m2cB>* zAMHD+%9(6Q7je=aJ~j|n92r@zq}?IniqLB6f20c^(y z7QgWzrhmEq!>=^FT(+Mq)NysE1z2yKJ|p+Dj}+nh*3{XOb$$3pznMvvhv0zT49NiE zGfXB5W32&a(xc>t4f?qDG%X8`;o`s`=G0bneUa@q)(I1hoO3(GCn8RV$7|hiz?0>^ zd|mlpZ`zFc-*$X#q$zRx;zY_h5pvA;7m+DQ6M# z-Ir73LDS8bx{f_id7UkJTc|(el9EhpSUsWR?IJnYFieidE-bKgw@%vC&aL)!;{p>) ztp8;m(bsjf1ee*fv_C$LxchX;(09oIj=swe^Ur*<5Akuhqg^`ebnp5p%F-|>RbD1`ktDibcDJTMZ}H>P z?KAu4<0QW_QzpK9w9CyJV-0H`JJ3&iHyW#P!D2KH;ZULEcfs~^+`F*Pn!<&-NMLpx9qCG>N5xh|y?R~iX^~^o_^uZa za6UU;k-*QhgSw1x{dC0|B87_wv?|CfJX*tn{2kAP-zeB-Oi$-Zs+qQY5GE$CFiu}? z3+0TEYRX!fwkE3d+@Z>R7Yv2T=8@xOAa-pB%T=bLpQpx>?6PkA91k1beVF)YsBqi2 zmrTiBQ;9L1Wv*ff*saoc`OfyOZ zgv(6v6y*GDFbZZg)!1JIJ3*Fzyu*a=a~~wFaUH~Jow$|#JnV8^dxB+fZ{p$?o?$Pe zVvNKO-6xF-;)-oXZ{lQ!@%>PhYG@nf+)kvE-J+(jI4ac+ zud;bfZXlZMs--tB`s{TYcKZ6JMOw__=ntrny(?SJi0X#p`>!8MYw7#Q*4jBPa+5p} zC8_i0I}oygTwb%JMC_Qk?yns2@G5uN68`-tOtEq!)#K`&vg?6K&Q6QIe%IEset=ME zb2dBp?V?c^gj&7fz^6XX&V)Mz}HVK1Baxou+uu+-{T;ly#EcRh7>%Wen{keQ`s ztZ^d0p%&wurfS~s)Z;H?47nld(a7Etc)~*w4BX%S*0L02>0H{+$ZA(aUSKg*a_(IE zhBU?Gff$Cra7i{~X@Ibqyt`7{JhsQtd#--w%k8qdbCOBPgcS-Xu6LsE71fdkMOU>r8}81aKwsV$Xd+Qw`VuJU`Z}XcD_$2 zLj@&!t}k%tC{wzb%Og8o+3BU@mA0lhnxK{)fdR#Q>XWS zJ{YAu`MU9oAJW0*kA75%3-`EGV$;Q05xrX2(Yw|%&G%+aafi1X5!nTUdUZ@-t{ZBMCY4zwm-+Fx&1*H%IN~?1hILTl&FUP zROzVmv81%AYR*efUOFV`AO(yr;`JeSJTATO5-BH`{yQGQz2i|kq9QZYngb%#wdNpD z2%*glzae}E(0ldMbDt3E?QU%^Vod`Q-@3_U2ao=p;e587|>aiGGxj%+t3Fm9iBl|ZEWoPS(-nBf? zt^gq~p7nx<*VftA4@h@GLJ)^G!N5@oH6qORYbCJ-A~h(yAO5oGb}RKcUJ~zu#PPe| zk)6H(GQ?&g%M^~FXvfEvPffo*HgyV%ccZ___xuv(8UkC{h)NZ@d}^25D}JH^jO}VO zIcTf0=I;s*&w|f0lJr{bqwq9`k6{jKD*Mq~hUqABt+Vja*E1B$y8HJn2bE=(Sg@t) zn=S428K+fV1WVj}6F$EHxXk}dQe(O4V)xBBl;HNY&r2E#nH??HZW&Cx_6b-ymZdSC z;_EoDz-!h1tF;(7$gyr~q|AEB`8u2Ok7de1(-0&v_fx6_=x2cnmqSl3{_d~eTS$2$Mp7yo8qmr1MD2^`|O~@95Dww52$3FwEaUI(l4-pqIb6z zW@r91^-(y0B$U%)?s)6@c`q9o9b0(~mdYXUPrmiE=S9SDWc@|}WhcJpJpk=rAbD!a zmezZYpYy{XyrbB3u_xeopV0hH&5OlhC8-Oqa%}ntlkahWd*J2hALaOY=aNOHgVxuF zUtdbZ>NV*Fr|vWjysy+1rkTcro*ilUaujkCv8_G(_GO+E;)P_mOLSg-2t8 zlXt4^w+Q$)iI1mWz;6*FF4H&*y?v^N)!~2O6*)B}C_(b|gU0y#AV6~mFv)v2Fl#NpD@fAr~@HdHXX>wMYSOV#D?B6jR7s*u3q?vwKe#T?|##6Yy>L z2!0xmvwDqn>vax|r&&OPg5Rd%4lf?`(mb}>XG80@6%fO3jiU?@;Ag9n3tRO%4-gGD z!KODZ;ZHBzuVa6yLl>+A87dO?*w>k-y0;fxhDi3c3ES(PTkM9+IW<3H`X^bg8HxR3 z|8R3?_jFZ99doQ~Ejc>5kzSjr?Xf0^kY=yaDm!L za@0H0jVNA5ziFXV9L3F+vTt+eMTG1^EXVB(>Ue53(}6X$qn$)Xhf)Ob^>8`y3l^d( z1lbf~<LNR|R7%VCWpOYk7eUrK8dkUT@}k&3-gp&7q)~nGQ&rny;zpaX)a!U` zRhwkX_b!su&`2u(Drg^S5S&Pgkq=o*$`@KciXJT{hK)Q85={ zSaj|5@~VyYQ{ovVeDf2MGg7`TgZkXhnJln>g(9-8aokj*)-2#Pm92lWI9vD7rf!DM z8ENFgx}VV$o^>kCC%VKlw3C-b8u#S2U+{g%q16X-&aQi8waT8BwUtqX&=ot>o6&}h zoO#)!&0D<58ECEH;7~5|!F=3c%=$&jrJIefjpj_P3Ce%u+5s%}oE9IVDbX{2)i>23t+k}jo7+B@F+ z-TMdJAKv#_&)RF9bJp|5*=O%KO?5>A5H$!54UIrqN&Yoz9sG9zu~GL5gUTG#g6{oV zQ5LOooOT}#jVfMQUPi~??9dd~U$<`|WOteMPn5zFeK3VIAdbis*`nU*R19O*@SC5Zdo)CMy3?l zI;2H!DGlmnA?4{&O+@EPy6{iUm*@^7i&bPdiq4?Ne9gFj%B~m?h0X;|RISGse1Tmc z{bN(@;~5YI(PubN*#)9<7Yt<4ZWE&*34uw0(F;^o zM0^xTr45SOJlK_w54!QmROC7RLkdDdtG_X^WO3!H1M$)d?oAy5e~fYvyPcu+~JpbL<7 z#&O{{$jw!tW#c5h;vowjAS4v+!r@B7s)Nx`y`?Uxf{}=kk$n=gd`)_*bRwB+L$Bm* z%iZK5*ZoL;#0c<$4gFEX&j2auV+Z;6B^^Ssl|*MQ&-@+7vdq{9QZck3F+P!1 zj?A3R3uUB;*UM3oi96-{M*CUjg+k+i>=zv1&?bKg^ladlI=r3l!{FyyN&Baom)d#} z@%?8B($gLmXlU#S%##J;v>n);K0IWmTPGqZUaJonUnwX05ryhZSbpq%u?H|ROxVVx zf2uD-G|yt{G+KeP6qlKNz8cS%8Hq6tR&MDlcwIIk43)`&VUVsxlr_8 zR9wE=x2-`>W&Y}zr#`axnVAd9m%auZe{c(|q-mZ({IG#^o7K%8$QIb>Y^D|IvhT?D z)9^v#r|Z<-D?Fc^vGSrZSj)42^tWUjz@6bk_@t-*k9-)*}x zRoXM|nC;)QuRGa{^7U-yOgoX}u|~QQDsG02KDqIj*2dc^r33NaYkPx8GNlnq4y2&| z^F*jLx!CN-m`WE8@Xhi%u>vi95f4J~fbHMT@J&6ITgxu7F>bFpIh?63(chTmB@&jh zht*PTK@(oTRS`JH+Y3KbMEI^iIsWoqxIox1-FqtEG*w=OlrPi`9ZdMo(>Q!;HTES@ znyye@;dKfn+#y?jcT~~G>TS|)O;BkZDD}J-d1f#w;WF!x>kt;RuH(8W%gD1YjZmEl z;JElJGho)Awt1n)f$RCF#}z@dF;B9}ge7IF3GynV`|%k>5u2=J)y#%s+B#%V8QOdPC~@ zcHC2Tc5W5PEm%ogv-2Q(qK3|P5x`?`j;HNX=qO(zO*p;Fi1*`S1=)kaL9vz=5$BLK z^C~tGul;etpK*?hJi?uwb7nt{`FARiJeHa_WX!eCx$>7!4HKd65Wjaet81CprW7>q zD7WBlse^@UPIjh8;f70<@#TVGX%(1UglIWM`)+gQURg7i(&%sf`Y~lgLLrN<{#4u# zMIBKQenDL64_Nfr&wjmW%6ljnk#2?krLnAOZLP$%{v^eVkAOhCe0V6cd&xIB`}=?e zR+{3^#Dm@$gY15K+;00Hb&Jc7BEoMD76DC%Q}$8o=Q!-Y8~XbtnM;pB#IaH)66s;% zTN>PF{M1K>pb#|P9mM{K_cyhH+ydS z>!*^Nk{9-Vf=aC%8I{gwbp0ExwvYjYQPH)W%U5$db~AUKV6Z#Hg)%`+AFRI zBp|BvQoy(@n3G_mBq4ga`YJFCmyU-5^`hQ01KTFCR^MebZ64&p)BRGR_p8ra6R67m zGUJ<5LfQBn*=F*~dmD8ao0GeWwMwTk9h_~G?5tL1HaXydM@oWfMK;bG!@H-wnWeD) zrjm0v*^5>Kk9F)at6DwA^^GOYJ!?IH{qym*7m5~M8kVc&9(VB>@P`@mF~Sk8E8yT^ zjb?-GaUBop5#n-V_Z5E3Onzd2e0(XWDzYnPS(#}3h-GFpppNC=O59on$WL!ut5HRr zhX++yW41^e5#o>cvajA(=$yOJ73Z*UD+~T=bZ2C}<}`^cH<{9;YS_F$!${4O&f~j; zt|qrRpfQW^^oxW5npM(hcMS_M6}%aPvyc_)@KGK~byu}HG?B@iD29bHj_(}+VLv+N z-fi~9gxW>N>)&$>z^+EoJv~=GQ9PDXztgKJlJM&?Y;*P4+9W@y-6A5m>yR>_-$GE0 z-PPGWHM;hjqrvrab%uG5rvp__D#Y#5$KxnmT3nPI;*?)cr05*8u zyh#V8dFR1VZ@a~lR1X@jzQT<~aKlsa1o>01=4XN)U1Re@<~n{L*Zac9U{|i(U)KZq zhD{lLR~LUuwh-(*QN>oNWy}jkI`c%&srN|zaUnxLc2I>NJH07lsR>&#*09CLd*dFj z{3|R33i>q_U2BP zeWL9p?1maIqea>$k@hYlb=bgP4Hg#?Ij83oN+K35%YybuF+df$djGq_?>j?>TCN=} zm!z9Wr=U%GrfWBh8Ck7LXL#A^XC+U*cdwCcE6)!Po||f#iBRp*&FRK!JX@WnBHFsk z+>||8!7e3DX_PV;J8Tot51+4)b*bLQuoys8t!nHS5ees`>6(I=oSiHolue}9ne88?N>XKQrk-km^>cpmI+=7(| zCc2FeV@v)b*@HW2*&!CK6~oN!@}|xAH^+K^skEtgJZgA8(2s{nEzNoErn!6FYz(V0 zRy=(#whyXlwPGEqHv7>mb^GQZj<f+v0@-$A%bE!EO+1RFl7zjaG^!0Gu--~GcCQT*)jE)qVmpc1|9 z1-VbYnGRkFNORg`2aAU&NDaCj`)(Wk(AOhr+*pJ?@uU48jjtcsSvPs0yh^wzUPJ{fyWZ9u1z zFkXb3JFE)`y3*J8sWCR6zvn9yGac=5EOW`3DG~&UT?jqeeizzzbF(p@Soq{qw}=@a zyfI!!8cJi0Q=L#Y)<{sY^az+gPo|;K8YHrw)9Lum@|-J)%w_gJ;^9!WDX_l8$84i+*j|%bl^HnV@fQ@?Na@C@?y1=*Z zEdnX^Y1rvIQi9>ib>6=p^M0pY%OPq`h}lU0bme@SKQuhN(k)qP2Q@6UcODf5Q!Uhc zRkOI)9NZ_l^=)Nuxx1S z>J|^pzqrwmj#FIwxs+vqix#}L=z;*X6~&V+N(BMOxdg z%M1DXz=OfIig60h6y5Y}Y`#V`w!F`TLOes~f`t10h>UP==w`?J+oDAt+ut;U?<2pA zFCUF#Sw&)M%i4bwyx!dXOOoGWHbk{OxYOA0N4;Tie`qgz(t-KrES#%_wwYW!^6dm- z{|=HMCfGUPk5QIY?@r(eZ=e!PW&9kxHTzPTMj!*LZrUy6&l`5j~W zvBhPQ%Y@HzaoWq`v$LorJ<^@(l^>5M%#*KL_;y#{{r-kuO>!pAoi5c>ekD_0ua)Ae zSp0B$JLe;)&%bp1tkFZ@m6);K+GWSGJpC+CqQSHwx#DfOnC z_t+!U;Zc};n3RsFdUo8-krDJs{YCe!ULxdDo&<_dbaDWynRWH79G7YAm3PVf(Ne z)k`7ov1OS;cj*$e59?gGRB5@HqGERj&+x?_YV?fGdEMK&iGe$)!FJ|P9ryd$U5xE9 zi|8vuVlBO#+|E9)En}?B@w(ZtL23={f`ZeAKk_VWriy`Xyt(_di0CuuYeg zdhquo>Swfw`k*66@1gx1Z>K9lk_Ag#Q1c%nNf;S@>6OnzrnDx2=FYL3ei!s`-HVri ze=%U&NJ4TjW&RSnUT6Q#A`4AS2~S~_ze`<~G#xi8Anzr{dl^qh*(#HtxqDj}_su8t zCGE6K$+h)z+z&}CG+lQ_P^X2DYAS#f8s7E~5t2KDar{I3Wn!i-CZYmrSLv1FiEmHs zRUej{8&v+AnO$z~_alCZI0HyfGj}1VEbHfUUB#6N#0;-xP?>xKj^0?G9Q)2D33%ZD zXkRso$$4h!{tvM%MLUe}HvJUtFZx%wd-=w-X9Ql88C>C*ncs68&)-U|5c;+*jH@fjA9|Z^c$HFP-7K9@rX+Q0S z9e>VI5QOg>_wX^W&t>%9DWp4uaIe|`PvOq^uoxVE-P31{yQf+f*+A{C+E{jCz@TC_ z$G~5IijaIqF>7>7!7CikHQ3}|vUrxcD2o*lFLOA3a6pdsBAX^Zf?zdJ50_r_*v`@{ z!SIoC2X2rkZ@`ERHLQB}{Hm+E(a-2GhBBP?n*9vQ$!f#f~r~Yv-9rsGLzyxiv z*V$%Nd=5lZSz&pZt0w#$*VtxO&`&~!BhYZzh$8yV1lNa|=yO^P0_H5NlJcYjdvGW&22dv=q+Rt}X)`EJ& zpYP)+XSYK~p=q@rbX(?VHVkUC_p%j-LyAQ#zC4NNedUS&=?F<2>sh8t4wnHQZIOIc ze!0MJs3-S1*n46@>VV@el=fQr!z#mVOZqCqx*yK1*4640@tAomz>D4^^j1vd@-k;% z{^`GAyw?E|{^g%MVqAgl5oZca2{9P%B&pDXbXO|`aVxyQhPPpL#~;aKo6COfmjBVu z%c?BJZD~Qo6sX1BG@)lM=E?!y)N>A*q|757@pCh(#b+HPruqV+qvP;SI|PQ;n<)R&WL9v~9@+Xj+faPn;`IxFpI3r3ezFdBk!%-P*JtHx)&GbxnQ^#~ z0kKz%uUYkY2?z}cNpY+@Ju#A**Q-4$p!?FEB6^IYo}sMJOwIYDkuq}UF-J<6g{lPQ z8=DG%qL~aKZ_;vUX9Mg@wP6 z=QUW}z%kBPUV~{{3e9R}O$JxscrEqz3Ne_>z^c{5T-sKrA&Fk1DSZ=3ekxnk9_fK^ z5ew;46E<)p(Dx}n#4mdJDPpKr$(nnq_9t1EMe$UaqrB%l7^QNt^`^_|A2=~J-87f)_w?={wk+4x zLCGHlE4xVJr^l#RR?lcH0vZiokPNUE3kGRr*(9<}!`(i$>azFw=m;KlM7-s@NEa$r z<@`7b7!8u4?RjJe39JzAOIK`ldSh5_m2z7ms~q#D>V}Pxn!sTCF~cbZjua&KPq{D& zuB6CQh7yfDSo7D|#OC+0Fl|#l3PVKCvj6MG9mjCmf)P#}oHl$Iw5ADJ?cg;MS&oyt zEe7+_vi+WNK9yXQP4?kuxl><$PDlz z8^2HPB$wxqliAZmbJZ@MC1&xBObO7*J>Tdm5eJoKskV?QVaR&3L~3AOroCn-i&s(G zF;5VU_=C%KE}aRn?s`YlE3%HSgCe#&$^RyAYccm>_5 zrLDr7W>c;7W4XynahYMg=%=TWXXc2P^Q(wBe$#l?>2sXlY)%>==wA` zO7HKb9ipeVLpcCFseE!8qbN_n>Z1)25z1KDSReY7%YlMe`4wwpVo+lG>B-i}1Stwi zfwL_1^!yX|{m*Ro;!u$CX!60ja*UP!NeXYmh%G zCzwd19sdPC3W^g=c_D$y85_f49-Z_5EaxN?Ajc>(3d{ND-JmHesLNN%T15O8^Z9ji literal 9112 zcmaKScQ{;M*S27k5u*1tWArj=bYcu<^g4zFqebsMNSKT$K@crLv?RKW$Ph%CM2`@H zFoNh3okWR{PoDSrJ@5C&_k8EN&UN-)XRUj$z4qGsI{V%y+1%8C9>@(OBO{|nBH)%} zWS6A=-ZWGflBn49u!{#*s2)1hD&S^lgmbVvnT}h4i@PAw&)LJ>(%soDDrmr6gN%$q z#LF5TiZ(G;a}Ds5asI0#6X_RtVNFJ+p&c3M?CRqlD(K?w;pMLh-f8Ou3wpU}f^C&d zWK9Bf-95b!w}RcRZkbxU-tuu(bpvZ_32H>DT>$vGhdK*J`uX~Ys6}dm|Anh|QT{82 zf(8Gj66&J~{vW5%Cgy^=0m1HqN-|faUF8&&1eH}~6AjR>G^9hK{6n21rTs&M{y~7dhqwlN1%`SB_zV6;ban{{3)KW)c=|tG@C*D8tbfSA z!*mfaXryx>R8B_rZ{0c(*1w^{eJ?7SVslALoMAy0>Xk_F9zW+kKf-g{Hyu94hV6w8RvRALdb>&qR<>d5WFcrm%lCr$KilT~=o*euiTX=wL zn4i0U=s&h@|7)xFUv2-UgJ0l9%W(H#uW)xa{onvU!GCpI&FjDW0{gFc|F(7e@4o2% zS6k?XGtj?-`+p7gKcb5a`dj=@>Rwd-ll<=f7a1RXk=p%fS{JiRkOm3Yv5q8d7SZBu zCUWj^*iyQU$tJUuX=H$m8R9OHMS=G^QpeGD;IP)(=Gh$^Bf!FJ^pV|Z zr_YP_LlVL5mjx(!?J{Aq*Z#3nv-xQ{$!m3Oj@Swzyz{1>(6X9& zaj1N-Gwa=!dS>HSKr(H$e_8bbgt*LDVCwBKu2w^^P@hk-)?_dvj@Jp2r1yWTJ8>_N zs+;t-qzPf(8)@rIz}!4R?pAo+3wvckz4uy`yNY517JBcnS7JXc`R!zNoyGOC!+Xi3 zBt7pSq-Vma_t`{8#pLxm^-d|v5hfu=qX|dbXg$9xi3!*oeN)Sg(yM5{43b{zlR|2X zDQ^PD#A;2Q_37hxFruME1!p{WRd|a%3q$hfO{-|6UlU1#09Apo*1oRt0ayBr*Jld` znIhaX@OK=yyjbG-7BkH8zQI)_vvK{(qQM10z-|?ZmoQ%`y%cDUFC#a4!!x08WPbY^ zqN?P^q6LBLCM{A7Eqr(RWW-p}ChwgN_-jUT>$wruO|y!8`-Y9CjP8V^&Gpi7>7Eog z!ePl(GIfN0<;zpd%7%)z%}mK*A!R}lZtCfay>|Luj;O(SY#4dicyFa2s-QmnQX;N< z2++$hZ__q$ECzUgF!I3rpkQLoA{xHs+e(S#+#T@hH3(oDF+&_npb5sqWX?yf%)GK9 zkby1(0VS>Ix;Vp?Ohl-=(x?{4ez*4=AFAvLcCP$d)+-k0y^{~tSTp$YtaNYBy?0FWy2KwB~N9wyXI#4g(jJO$M5N$-Moy9*W*K(JmToRc-_*@ zhb4LDuD>9liLt36wxLJASf$#&4r}=?oaf(0AapRpZ*HzK0^XDV5!89u=>J0#mO>t~ zMz4@3hGxQg&vD?C#~3Xo=H)`Xcma|zfg|&O5au7EnPby3KCVu%Dl}Wly%-ZjtAxif zq&AOs(j?<%hIoyB?-8ETO+I2Cw{_4d216`m`y7=*(y=y_o=m5$q=X;Bu-dqD`}Yu{ z^jig5ewE6zmLDKk?bzT@JDduLWRFq zA!MBb_Y|09<9o8ILP?h>Rm|L!2!hmw%7sk*ivOlUxzRasZ~qZXmiN8KEt{_}X|_D? zJxr2VFf#MssxhT)3luTEIF%kq!&J+7E+(gkuqup$8(tOld-jER596%toJ%QfM+@4H zZ_&IiwaH6jtaYM`prj2ds%L&>Z%V){EcOeTFBoy5cY& zKbOKduR7qV(+;7VgcF)#P&meN0L#1I@fYjZDE>D4cUe@`MZCZ`&h$!$vL+EE6Z_lF zdCOWFP)?=aD^Rwg1seNP0f~5c3x-(i5>|+SxFaKTN&3zoY`(8YR3lD%ZT|fECJ>m4 z@Z`1jd2#4mwP0VRfoL$4aUEv*MlxPDj)nOZBq>%31^Ykg`zTPgJI|v9JU?5N$=srb zqjuOHwHGWI?LRLaP1#sX#Rn1>vs|?kA^Ig$%?#aDOW#I2`Ei%QO`+66@|Hr3JYOJZ z_Pkg?rhWb7-4T%1;P;eNZz0Qi@Wj$)D`ltM&yAA%_ z4y&LGq1u*U;fkyW+7!5Tbk;_iMBg_u2qs6fYk67WO;OR;>*)LD{1ufN3i<`vYHrex z9dtDK7PdUG;5bpgKCV{D*CdSg)Y8sb@~7ThosDhi9j$|ZFD{%LX*g2I6qgjcvCP?A zWzq;jS5y*LhL`han5u*O7SZq|^iz*AuuITK zYd=TpQGBmxN@L}UPS$n-?AnRuD3JD9J&`&QTCB{@r4qNx13hGatjsU-gWstIO3lr@ z7+o;}-`8G1AODy#$qs{T()dvJNc^t!p0;7Fky4RY41mkZbQkyezY_i-yuimhv)jc? zlf0%lVKr?JcDW%Ewv3L1&yliTV1CN$8!lI~>(r-M*!=u5Avz^4?3mHqu`G#h4ly>O zws@B+xxbV9RsC}Wo1IGB(pTCjFJmq2#H$P?k*Zs?NtMJ3zAp2QTh{@ASKU$ioOR-M zcz^Sydm)(^jtrx&#cOGkCeXmoA6ZJ|l<$Gi<*KAgQ& zFaMwlHzV5`mKZ4AB7_N$`vu%my!NP?m!qZnYE5 z!<>=b9@#T|fYu>f^<`}FF!_*aUFG(In`g8^WuXk6NiJr4YSlB}pA#xD6l9o)cHYotvac}LzE?GE(XsHf>;}3xTU7?revV53HxFOg zcW0GkzLfVFg083uTTm&YNuPm~im@(|WyYbqLDo4s^_yeU69(5=B`qNisUkMw=rcf+ zbTIFfv@W#fb=3COHQuc7OI}w=w=m*8DL6yva-&`@9u0vqRjmxP0W}X8X_Nq zlrO8U&c}lyi;D%GqccCQ+wO4?#L+f)`5L?^mbO|mnrdDIg1)bs-3{Vti*wO4e7>^> z`rPbJU)e?y?QwA0fovoKK3Dev_F=BMBI?y(h)ais4_L=xGH7x9uFFs9bs~QSy7UG} zJUI;J0&#tXl%Sh@##=xZN|)A1t)BH+%vKP``@)1R1U;)FL!_7PT<00_5kkh!X9-?` z)2Lb$NB~hD>G%7`&-WnHE#>-%oY49=kZ!x*2eATd)-U@qo6FElmeMLtW0hr?Fs2cf z?aJnq@~k2kJw#eb+>bUk!28pcugkYtC1F_|Qcp3Do?&?NioitE2Jq8B;(n8mYB*qY zX5gxr!&iSnP}HaTG7RA`jFo@W?~W~_OF~ElF5`{YMmwgIPWM6MR)8^ zuskK*(X+zEB^u*(_oJUE|10S;j4&XTQn`nFOj`ZNjFFpVd=4D-24XcI&jYj0}Bx@=x1 zrPOCMb9ZJr>LU<}N2YlH2K1+qH*BENF;?tEcb?h(>hSAfw(FdO7qSJqTxHc-A1S4e z#M$`QSD!F4OY{Y!D^B*k4D8huRNMi1SRA~|i?LQsE5`Ci+sjPf`CX<60Bv&8Eymhk zS}|kJYtvChiStiwnV6X>uHoOTE0UUXiq<8(KKHXMG7>Si2UlXT$TZoS~zFFYl z2nuLfP0eufxe{KX{|g(4DG{v|({IWSRCbIm9$p^exIvfsoIB@8^7`6RZ@P$(ynL(;IY(3Kxf1`K#NljIkc76;a+v~r_>bv=`hblCU1C!7 z#_h}rbv^dje()l`QuxyY{;)IM+uQ_a|ymZ#uB~DD~ z%;&+P(5DastIy#nYuwG%T`yVk4&Q!U`ZH(qcPT$8!`P80qq5$3R%-zAJ}+p3zZW#d zGjRZn(&xV=rz99x_A;mirTRnVD~J4*r}4S>lbUwtf*5jCW%SXRZv%RcueEKI`qj+U z8L=>ukSpLnQ!=mdxZ8R}FhiUruAykjsKkK&R+Ds_q4pAauC6&AA)!MaTc~fPJD8Po z?SVY$u~K0(&I*sHeqAGl22XdCs>>C3K0qWs2fxev$RUOX#p9sO&))HksJABl@XzU> zyv2HXL+~Y@A%MODlK?;MWv!LXjj4PTEF8~&RqRfjI@+IFLOGWf35jaZzSnjrc&cs@^(9-wVdcU{+@~T>M!(zoN;!U z4zkYME^&yFsM|4)P?^%H*pI^-Ut$}ySpd>E*uTT0j-Hor7r3wq9KS3i6=7E{2iSk7 zNtxw=+tp)7?j<*@sbv~ag)~EvU&cT9%^!FpJmB6QZxKrh;blCS=A%WyPiPJ$6}}fYW0^g$Bto0ImZXfE>c?*e3yyu(}DYdu(J{i>-F8HsDRFX_mGDyWsT~v5ARR> zPCMGM=Uuj7pCkT19<5hdysSlEcXZ^>l=9+P9 z6u8NG^$r%Bv zE{@h_@aJ;=W!oa%%)y`Tc+cyK@7rB;&Kc`4i;?>Gn_f>8jjI#MRbCZjhXgX#1Gp~@ z&7;ngLE%S(+%+miOra_(&P#6ht?Sp6mw=~bfIr^5>Ol7L+N7!7(Y;Rp(G1#y8yJ?Q zs-FYwRZo*9ae8~w_r=i+`gRcQ4EU30@7F7upEvKIdCOMDUVfap9M3E7Cue!{Cs$=!XMj;aw5Ici)T)Ty1I0u1ehkub!K=jnXSG9X#dils~2t z9UzMmXH{=1V*0@vVpB^tXz%-LuB7n`r}7H`-GDu7a8_hq%t*Vm{Jvf0WFvOaS3t(P z%cIbBZ!C-7BM{lYTNpTCOJ4cx`l*mQZ6y4~F$|&prg{#y*2LTAabs$QPJIxj)RFc< z!1nv0d}u*eP;dKCP!iC$W+{ngnBY8M(C{nQD_}ZWI@?g!u=r-cJF?^Vs2-qg{Kd}o6l zO3mZwdGD9?28iCz7e@=nZI`U~nT}R-OSw9Jk=mb08$#v`es2$Vr1mSi2rAb7vYwdsONuDMHnh-C`_Lm^)k!WAV$(h#qrT`~>b&Z235lvwFy4#r zpqu@2>C&`Oskw|s7?0gw^%oFXTMSLaIeH>VUm4uZV0AhZRix^FxcMgztCu9aEzxKd zk+A;#iIOS9LO2b3y54>y1BeL=KZX7x-LL2MMg9mw;nU>@!4Uf=oEXv3?ZD84l$Y1R5S|%EbuhRjLUVt4oCNl40$^>zflrh)+}JK#p#a2ebm<`+d_U*-^=IE z$}kJ2Q+1&VFhgqOp)=oR``nU`9{Zie9~t1j+a+a~AUgyC;Sy#m5d9*NVpzF0@HYBS zy$Kt@hkiCKW3iz{DBu0J3-n&Ni44(RKTqgsWW(d2gmymSrsc}VJV1k&OH*uK8_yB?$G zSa*DX5KGASM<70=s*3VA+}ieAqk}(FGpTm?cBjK-GL^8NgZ z&~Z=89Hv}`gONvdXV1Ux5-p&`FqS2=kLQ=a~_O_;aSr5?ed3w`G z4dQ}dK>`JQaHd-brQH72cP9UPWYvCvTk!AFlfsmzj17b2qrq}xu+IrU-z_pp?(PBu zzSnt=m)Xmod9KXgrQ5bp&-s+KEQw;%(J7Zyf*sd>qDoQpVI0|LQ_KZmV?VBXC;Ft| zcd5_&y^twPl5sw@_!vWVtG4??-2BC8Y0_dHI(f9@-35O`lrlB3OhvmB_q}HNF{(Me z!e3KBU{`4JjwZ$+unYELR=R@9Mi_kn@l@4C5M6QrA2ue>#VYL#>0YPM?M&Z<)(nAWkob~b`fjM<_cFCx^SP%t`yxw7+X*Ln4eVBK#KmK?!A40OMeM>bu`DA0UX8P^M z;!g`@{RTtcJC%mD-YNKN0fc9~x+yl+7-iqpU+Y(XxQMH@w)dC3bW39GsWuF}xkzvU z&{e7<4bp{rBn$&-*K6s)R}vya@M3<|qb8P2awqm4-?5qPaqY^g3O+V_>?@_}4L-P=^w<4POkmAFTsEz0zdi zxRrv$rQP-NE27I(us2)e4Hy!S12K5$;VT|I|&SLf5vjax(;)G77NNWb<$bMqfLL8+GO zNma2n{Z50dd$7p(KVKu;sLQaR5Ug~h(1JdCH{?)l-lc?zj|66_YYTJQH@QSc5-rU-0-wp{0=9_o0}EvXGVjRoPR^ z70X>CJAS_XD!Pickb<`{o5_Zzq=1WgOCWb&S040+=}mm}vBq!A zo~X{Nm0P9axavQjG^jbjN7)i6XFc>+h>~^bjqbI@D`I!@r=(v4`h-hcBWwhRAd0A( z1&P@g55eeb4z_a{zgzQ}`*M>boTM!0M2dC^mxBmV(TU`ZRD9 z^Hc$OPcMkrrxr!my02-$?xh^euBN|Lj!5P`Hgwx^%uHyr!)7p=%f;np7`#0vTF|nq zIAM$8^C1+c)-eoO;B9duG(5q5bj1E=Bu8&k3+K?e#Fn&wwc0IjNmj# zR;PlNvnOdB@6o?8bdYZ5SQrAFk6CSElh4)W^^Yp*^)OCiF;)m6aX;eJf;4Ha?b}^& z@2ihnd~+`7d7n9fs`efaQ-lQZOS_{>KhneHS66Wry~WJ1hZ&-J%71k`Ud2&^<$(H6 zJok<(2*QV{&+X&#baUa4``}G6aX7|7gH(+Ea3fZESUD5fbq%Abflez*p+Sli=euJz zqt=XJRFno0_2#FA9Xg1zuEO7?lt)V4rXo5Nca7|*k;VfWuzp%z#gJex%Q>2Jt8Om+kiZf~FK1C~;xpQ0>Y?^aH)TXpjA7K9CWIZMK+ngFE)R}Ae7RoK zt(=G4?eep3v)&r{dn$tO9coEK#@>B|yYiKx{P1Ai2nQdGA#~gv7S1&WQZcKu=_WYv z(LfqhFj9P!eOZjbZti(_1)f$AP_=&-C4P17wqe7lY z#WxcVOO=n%8VAUmDQt#|o%`y?_g>LUkFpt5njA9)m)Tr!ti9zox1YXr6MMKA-$&0^ zKH+b9ntgF>M2PWT9rSDnY@-L%cn8`^*7rJ^7DFJS`8*ttTe7_6(={^cM26aJw`k5D zX1Maog^-81-lr1~Tbg?JsB+TGk0mxIa#%!xL!|YG@ROijo%Z@k6F=s1=|wN=pK*^U zUbG!9$fs+)f{vd%Y%x2ZQ0yhz^sb5KtA6F>>Jz{m%C1Esi47F66v~d+ioKsoGIu_v zQeR;K?XwcXy&qJ?>i!W)-%Z=|IzDvU69i=KtuJg_^E?Z0Aj$tyL#n?2upf}U=LhYN zJT4h^s%fTdHVb$@|1i6u=Xm=F;u-pljmu2nmj$6>Tn%A<(w24*2Pr&CebJ=c5k20g z(;vA_i9T5Jod7VunwlDp(qZmR>{XuOa{Ae7EvkD*rPr2OQO>94s{R%q18wr7h*Wce zQpX8fA`WZA#S1)3vo|0(XW=E&lQ^X0IzErmOmOfr15qZJw#a(Qv*qaOvtkm6fi5{o zx3}*WcX5HFRObLv`qAy|@(cl!34iO;WXgeCFhlq9@@m3VU1M=E*!-#4Sg);{cP7z4Tv)Is-JYK zdq8>eqTZXJDpf@VDD;_dd??8AGlj&@KnHlQ$Bn=z&|lKk{w3qR#uv>GNycRTw(%>X z^soS#OG5fh{&kA&{KrAa5r5UYE^T6I7kz19*RQvUGah@UH)WQF)!Sc91uiE1@voYM zVY|=0dbv4A)u(?)@IC0G%QQO_dw&k>JW_T&ZhtTy&UISDR8 - - - + + + diff --git a/ui/src/api/model/auth.js b/ui/src/api/model/auth.js index 5639e63..9dcd4f2 100644 --- a/ui/src/api/model/auth.js +++ b/ui/src/api/model/auth.js @@ -2,11 +2,18 @@ import config from "@/config" import http from "@/utils/request" export default { - token: { - url: `${config.API_URL}/token`, + login: { + url: `${config.API_URL}auth/login`, name: "登录获取TOKEN", post: async function(data={}){ return await http.post(this.url, data); } + }, + logout:{ + url: `${config.API_URL}auth/logout`, + name: "登出", + get: async function(data={}){ + return await http.get(this.url, data); + } } } diff --git a/ui/src/api/model/demo.js b/ui/src/api/model/demo.js deleted file mode 100644 index 210a071..0000000 --- a/ui/src/api/model/demo.js +++ /dev/null @@ -1,37 +0,0 @@ -import config from "@/config" -import http from "@/utils/request" - -export default { - ver: { - url: `${config.API_URL}/demo/ver`, - name: "获取最新版本号", - get: async function(){ - return await http.get(this.url); - } - }, - post: { - url: `${config.API_URL}/demo/post`, - name: "分页列表", - post: async function(data){ - return await http.post(this.url, data, { - headers: { - //'response-status': 401 - } - }); - } - }, - page: { - url: `${config.API_URL}/demo/page`, - name: "分页列表", - get: async function(params){ - return await http.get(this.url, params); - } - }, - menu: { - url: `${config.API_URL}/demo/menu`, - name: "普通用户菜单", - get: async function(){ - return await http.get(this.url); - } - } -} diff --git a/ui/src/api/model/system.js b/ui/src/api/model/system.js index 85ce415..a4827ad 100644 --- a/ui/src/api/model/system.js +++ b/ui/src/api/model/system.js @@ -2,62 +2,130 @@ import config from "@/config" import http from "@/utils/request" export default { + version:{ + url: `${config.API_URL}system/index/version`, + name: "获取最新版本号", + get: async function(){ + return await http.get(this.url); + } + }, + setting:{ + list: { + url: `${config.API_URL}system/index/setting`, + name: "获取最新版本号", + get: function(){ + return http.get(this.url); + } + } + }, menu: { myMenus: { - url: `${config.API_URL}/system/menu/my/1.5.0`, + url: `${config.API_URL}system/menu/my/1.5.0`, name: "获取我的菜单", get: async function(){ return await http.get(this.url); } }, list: { - url: `${config.API_URL}/system/menu/list`, + url: `${config.API_URL}system/menu/index`, name: "获取菜单", get: async function(){ return await http.get(this.url); } + }, + add: { + url: `${config.API_URL}/system/menu/add`, + name: "添加菜单", + post: async function(data){ + return await http.post(this.url, data); + } + }, + edit: { + url: `${config.API_URL}/system/menu/edit`, + name: "编辑菜单", + post: async function(data){ + return await http.post(this.url, data); + } + }, + delete: { + url: `${config.API_URL}/system/menu/delete`, + name: "删除菜单", + post: async function(data){ + return await http.post(this.url, data); + } } }, - dic: { - tree: { - url: `${config.API_URL}/system/dic/tree`, + dictionary: { + category: { + url: `${config.API_URL}/system/dictionary/category`, name: "获取字典树", get: async function(){ return await http.get(this.url); } }, + editcate:{ + url: `${config.API_URL}/system/dictionary/editcate`, + name: "编辑字典树", + post: async function(data = {}){ + return await http.post(this.url, data); + } + }, + addcate:{ + url: `${config.API_URL}/system/dictionary/addcate`, + name: "添加字典树", + post: async function(data = {}){ + return await http.post(this.url, data); + } + }, + delCate:{ + url: `${config.API_URL}/system/dictionary/delcate`, + name: "删除字典树", + post: async function(data = {}){ + return await http.post(this.url, data); + } + }, list: { - url: `${config.API_URL}/system/dic/list`, + url: `${config.API_URL}/system/dictionary/lists`, name: "字典明细", get: async function(params){ return await http.get(this.url, params); } }, get: { - url: `${config.API_URL}/system/dic/get`, + url: `${config.API_URL}/system/dictionary/detail`, name: "获取字典数据", get: async function(params){ return await http.get(this.url, params); } - } - }, - role: { - list: { - url: `${config.API_URL}/system/role/list`, - name: "获取角色列表", + }, + edit:{ + url: `${config.API_URL}/system/dictionary/edit`, + name: "编辑字典明细", + post: async function(data = {}){ + return await http.post(this.url, data); + } + }, + add:{ + url: `${config.API_URL}/system/dictionary/add`, + name: "添加字典明细", + post: async function(data = {}){ + return await http.post(this.url, data); + } + }, + delete:{ + url: `${config.API_URL}/system/dictionary/delete`, + name: "删除字典明细", + post: async function(data = {}){ + return await http.post(this.url, data); + } + }, + detail: { + url: `${config.API_URL}/system/dictionary/detail`, + name: "字典明细", get: async function(params){ return await http.get(this.url, params); } - } - }, - user: { - list: { - url: `${config.API_URL}/system/user/list`, - name: "获取用户列表", - get: async function(params){ - return await http.get(this.url, params); - } - } + }, }, app: { list: { @@ -70,7 +138,7 @@ export default { }, log: { list: { - url: `${config.API_URL}/system/log/list`, + url: `${config.API_URL}/system/log/index`, name: "日志列表", get: async function(params){ return await http.get(this.url, params); diff --git a/ui/src/api/model/user.js b/ui/src/api/model/user.js new file mode 100644 index 0000000..dff984a --- /dev/null +++ b/ui/src/api/model/user.js @@ -0,0 +1,65 @@ +import config from "@/config" +import http from "@/utils/request" + +export default { + list: { + url: `${config.API_URL}/user/user/index`, + name: "获得用户列表", + get: async function(params){ + return await http.get(this.url, params); + } + }, + add: { + url: `${config.API_URL}/user/user/add`, + name: "添加用户", + post: async function(params){ + return await http.post(this.url, params); + } + }, + edit: { + url: `${config.API_URL}/user/user/edit`, + name: "编辑用户", + post: async function(params){ + return await http.post(this.url, params); + } + }, + role: { + list: { + url: `${config.API_URL}/user/role/index`, + name: "获得角色列表", + get: async function(params){ + return await http.get(this.url, params); + } + }, + edit: { + url: `${config.API_URL}/user/role/edit`, + name: "编辑角色", + post: async function(params){ + return await http.post(this.url, params); + } + } + }, + department: { + list: { + url: `${config.API_URL}/user/department/index`, + name: "获得部门列表", + get: async function(params){ + return await http.get(this.url, params); + } + }, + edit: { + url: `${config.API_URL}/user/department/edit`, + name: "编辑部门", + post: async function(params){ + return await http.post(this.url, params); + } + } + }, + userinfo:{ + url: `${config.API_URL}/user/user/info`, + name: "获得部门列表", + get: async function(params){ + return await http.get(this.url, params); + } + } +} \ No newline at end of file diff --git a/ui/src/components/HelloWorld.vue b/ui/src/components/HelloWorld.vue deleted file mode 100644 index d167419..0000000 --- a/ui/src/components/HelloWorld.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - diff --git a/ui/src/config/index.js b/ui/src/config/index.js index b41222c..bd5eea9 100644 --- a/ui/src/config/index.js +++ b/ui/src/config/index.js @@ -1,6 +1,6 @@ const DEFAULT_CONFIG = { //标题 - APP_NAME: "SCUI", + APP_NAME: "管理系统", //首页地址 DASHBOARD_URL: "/dashboard", @@ -12,7 +12,7 @@ const DEFAULT_CONFIG = { CORE_VER: "1.5.0", //接口地址 - API_URL: "/api", + API_URL: "http://localhost:8000/", //请求超时 TIMEOUT: 10000, @@ -51,12 +51,11 @@ const DEFAULT_CONFIG = { //控制台首页默认布局 DEFAULT_GRID: { //默认分栏数量和宽度 例如 [24] [18,6] [8,8,8] [6,12,6] - layout: [12, 6, 6], + layout: [12, 12], //小组件分布,com取值:views/home/components 文件名 copmsList: [ - ['welcome'], - ['about', 'ver'], - ['time', 'progress'] + ['time', 'version'], + ['welcome'] ] } } diff --git a/ui/src/config/select.js b/ui/src/config/select.js index ce71587..0375d52 100644 --- a/ui/src/config/select.js +++ b/ui/src/config/select.js @@ -3,7 +3,7 @@ import API from "@/api"; //字典选择器配置 export default { - dicApiObj: API.system.dic.get, //获取字典接口对象 + dicApiObj: API.system.dictionary.detail, //获取字典接口对象 parseData: function (res) { return { data: res.data, //分析行数据字段结构 @@ -15,7 +15,7 @@ export default { name: 'name' //规定搜索字段 }, props: { - label: 'label', //映射label显示字段 - value: 'value', //映射value值字段 + label: 'name', //映射label显示字段 + value: 'key', //映射value值字段 } } diff --git a/ui/src/config/table.js b/ui/src/config/table.js index 609af9b..778e62b 100644 --- a/ui/src/config/table.js +++ b/ui/src/config/table.js @@ -3,15 +3,15 @@ import tool from '@/utils/tool' export default { - successCode: 200, //请求完成代码 + successCode: 1, //请求完成代码 pageSize: 20, //表格每一页条数 parseData: function (res) { //数据分析 return { data: res.data, //分析无分页的数据字段结构 - rows: res.data.rows, //分析行数据字段结构 + rows: res.data.data, //分析行数据字段结构 total: res.data.total, //分析总数字段结构 summary: res.data.summary, //分析合计行字段结构 - msg: res.message, //分析描述字段结构 + msg: res.msg, //分析描述字段结构 code: res.code //分析状态字段结构 } }, diff --git a/ui/src/config/upload.js b/ui/src/config/upload.js index 0ac0c7c..3551b8a 100644 --- a/ui/src/config/upload.js +++ b/ui/src/config/upload.js @@ -4,7 +4,7 @@ import API from "@/api"; export default { apiObj: API.common.upload, //上传请求API对象 - successCode: 200, //请求完成代码 + successCode: 1, //请求完成代码 maxSize: 10, //最大文件大小 默认10MB parseData: function (res) { return { diff --git a/ui/src/config/workflow.js b/ui/src/config/workflow.js index ceb1305..ac37042 100644 --- a/ui/src/config/workflow.js +++ b/ui/src/config/workflow.js @@ -26,11 +26,11 @@ export default { }, //配置用户 user: { - apiObj: API.demo.page, + apiObj: API.system.page, pageSize: 20, parseData: function (res) { return { - rows: res.data.rows, + rows: res.data.data, total: res.data.total, msg: res.message, code: res.code diff --git a/ui/src/layout/components/userbar.vue b/ui/src/layout/components/userbar.vue index 3b2fe17..82475a1 100644 --- a/ui/src/layout/components/userbar.vue +++ b/ui/src/layout/components/userbar.vue @@ -63,40 +63,12 @@ userName: "", userNameF: "", msg: false, - msgList: [ - { - id: 1, - type: 'user', - avatar: "img/avatar.jpg", - title: "Skuya", - describe: "如果喜欢就点个星星支持一下哦", - link: "https://gitee.com/lolicode/scui", - time: "5分钟前" - }, - { - id: 2, - type: 'user', - avatar: "img/avatar2.gif", - title: "Lolowan", - describe: "点进去Gitee获取最新开源版本", - link: "https://gitee.com/lolicode/scui", - time: "14分钟前" - }, - { - id: 3, - type: 'system', - avatar: "img/logo.png", - title: "感谢登录SCUI Admin", - describe: "Vue 3.0 + Vue-Router 4.0 + ElementPlus + Axios 后台管理系统。", - link: "https://gitee.com/lolicode/scui", - time: "2020年7月24日" - } - ] + msgList: [] } }, created() { var userInfo = this.$TOOL.data.get("USER_INFO"); - this.userName = userInfo.userName; + this.userName = userInfo.username; this.userNameF = this.userName.substring(0,1); }, methods: { diff --git a/ui/src/main.js b/ui/src/main.js index 212abc7..c016ce0 100644 --- a/ui/src/main.js +++ b/ui/src/main.js @@ -1,7 +1,7 @@ import ElementPlus from 'element-plus' import 'element-plus/dist/index.css' import 'element-plus/theme-chalk/display.css' -import scui from './scui' +import sent from './sent' import i18n from './locales' import router from './router' import store from './store' @@ -14,7 +14,7 @@ app.use(store); app.use(router); app.use(ElementPlus, {size: 'default'}); app.use(i18n); -app.use(scui); +app.use(sent); //挂载app app.mount('#app'); diff --git a/ui/src/pages/home/index.vue b/ui/src/pages/home/index.vue new file mode 100644 index 0000000..a7ab9ce --- /dev/null +++ b/ui/src/pages/home/index.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/ui/src/views/home/widgets/components/about.vue b/ui/src/pages/home/widgets/components/about.vue similarity index 100% rename from ui/src/views/home/widgets/components/about.vue rename to ui/src/pages/home/widgets/components/about.vue diff --git a/ui/src/views/home/widgets/components/echarts.vue b/ui/src/pages/home/widgets/components/echarts.vue similarity index 100% rename from ui/src/views/home/widgets/components/echarts.vue rename to ui/src/pages/home/widgets/components/echarts.vue diff --git a/ui/src/views/home/widgets/components/index.js b/ui/src/pages/home/widgets/components/index.js similarity index 100% rename from ui/src/views/home/widgets/components/index.js rename to ui/src/pages/home/widgets/components/index.js diff --git a/ui/src/views/home/widgets/components/progress.vue b/ui/src/pages/home/widgets/components/progress.vue similarity index 100% rename from ui/src/views/home/widgets/components/progress.vue rename to ui/src/pages/home/widgets/components/progress.vue diff --git a/ui/src/pages/home/widgets/components/time.vue b/ui/src/pages/home/widgets/components/time.vue new file mode 100644 index 0000000..7baf81c --- /dev/null +++ b/ui/src/pages/home/widgets/components/time.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/ui/src/pages/home/widgets/components/version.vue b/ui/src/pages/home/widgets/components/version.vue new file mode 100644 index 0000000..d816d72 --- /dev/null +++ b/ui/src/pages/home/widgets/components/version.vue @@ -0,0 +1,37 @@ + + + diff --git a/ui/src/views/home/widgets/components/welcome.vue b/ui/src/pages/home/widgets/components/welcome.vue similarity index 92% rename from ui/src/views/home/widgets/components/welcome.vue rename to ui/src/pages/home/widgets/components/welcome.vue index b1bf536..bd4d280 100644 --- a/ui/src/views/home/widgets/components/welcome.vue +++ b/ui/src/pages/home/widgets/components/welcome.vue @@ -3,7 +3,7 @@
@@ -19,9 +19,6 @@
项目目的:让前端工作更快乐
-
- 文档 -
diff --git a/ui/src/views/home/widgets/index.vue b/ui/src/pages/home/widgets/index.vue similarity index 100% rename from ui/src/views/home/widgets/index.vue rename to ui/src/pages/home/widgets/index.vue diff --git a/ui/src/views/home/work/components/myapp.vue b/ui/src/pages/home/work/components/myapp.vue similarity index 100% rename from ui/src/views/home/work/components/myapp.vue rename to ui/src/pages/home/work/components/myapp.vue diff --git a/ui/src/pages/home/work/index.vue b/ui/src/pages/home/work/index.vue new file mode 100644 index 0000000..c442b83 --- /dev/null +++ b/ui/src/pages/home/work/index.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/ui/src/views/setting/client/index.vue b/ui/src/pages/system/client/index.vue similarity index 100% rename from ui/src/views/setting/client/index.vue rename to ui/src/pages/system/client/index.vue diff --git a/ui/src/views/setting/client/save.vue b/ui/src/pages/system/client/save.vue similarity index 100% rename from ui/src/views/setting/client/save.vue rename to ui/src/pages/system/client/save.vue diff --git a/ui/src/pages/system/department/index.vue b/ui/src/pages/system/department/index.vue new file mode 100644 index 0000000..61b3a36 --- /dev/null +++ b/ui/src/pages/system/department/index.vue @@ -0,0 +1,146 @@ + + + \ No newline at end of file diff --git a/ui/src/pages/system/department/save.vue b/ui/src/pages/system/department/save.vue new file mode 100644 index 0000000..08b7846 --- /dev/null +++ b/ui/src/pages/system/department/save.vue @@ -0,0 +1,118 @@ + + + \ No newline at end of file diff --git a/ui/src/views/setting/dic/dic.vue b/ui/src/pages/system/dic/dic.vue similarity index 73% rename from ui/src/views/setting/dic/dic.vue rename to ui/src/pages/system/dic/dic.vue index fb1092d..bf732b4 100644 --- a/ui/src/views/setting/dic/dic.vue +++ b/ui/src/pages/system/dic/dic.vue @@ -7,8 +7,8 @@ - - + +