first commit

main
Wayne Hsu 3 years ago
commit a3de37b928

@ -0,0 +1 @@
APP_DEBUG = true [APP] DEFAULT_TIMEZONE = Asia/Shanghai [DATABASE] TYPE = mysql HOSTNAME = 127.0.0.1 DATABASE = test USERNAME = username PASSWORD = password HOSTPORT = 3306 CHARSET = utf8 DEBUG = true [LANG] default_lang = zh-cn

8
.gitignore vendored

@ -0,0 +1,8 @@
/.idea
/.vscode
/vendor
/public/.user.ini
/public/storage
*.log
.env
.user.ini

@ -0,0 +1,42 @@
sudo: false
language: php
branches:
only:
- stable
cache:
directories:
- $HOME/.composer/cache
before_install:
- composer self-update
install:
- composer install --no-dev --no-interaction --ignore-platform-reqs
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Core.zip .
- composer require --update-no-dev --no-interaction "topthink/think-image:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-migration:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-captcha:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-mongo:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-worker:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-helper:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-queue:^1.0"
- composer require --update-no-dev --no-interaction "topthink/think-angular:^1.0"
- composer require --dev --update-no-dev --no-interaction "topthink/think-testing:^1.0"
- zip -r --exclude='*.git*' --exclude='*.zip' --exclude='*.travis.yml' ThinkPHP_Full.zip .
script:
- php think unit
deploy:
provider: releases
api_key:
secure: TSF6bnl2JYN72UQOORAJYL+CqIryP2gHVKt6grfveQ7d9rleAEoxlq6PWxbvTI4jZ5nrPpUcBUpWIJHNgVcs+bzLFtyh5THaLqm39uCgBbrW7M8rI26L8sBh/6nsdtGgdeQrO/cLu31QoTzbwuz1WfAVoCdCkOSZeXyT/CclH99qV6RYyQYqaD2wpRjrhA5O4fSsEkiPVuk0GaOogFlrQHx+C+lHnf6pa1KxEoN1A0UxxVfGX6K4y5g4WQDO5zT4bLeubkWOXK0G51XSvACDOZVIyLdjApaOFTwamPcD3S1tfvuxRWWvsCD5ljFvb2kSmx5BIBNwN80MzuBmrGIC27XLGOxyMerwKxB6DskNUO9PflKHDPI61DRq0FTy1fv70SFMSiAtUv9aJRT41NQh9iJJ0vC8dl+xcxrWIjU1GG6+l/ZcRqVx9V1VuGQsLKndGhja7SQ+X1slHl76fRq223sMOql7MFCd0vvvxVQ2V39CcFKao/LB1aPH3VhODDEyxwx6aXoTznvC/QPepgWsHOWQzKj9ftsgDbsNiyFlXL4cu8DWUty6rQy8zT2b4O8b1xjcwSUCsy+auEjBamzQkMJFNlZAIUrukL/NbUhQU37TAbwsFyz7X0E/u/VMle/nBCNAzgkMwAUjiHM6FqrKKBRWFbPrSIixjfjkCnrMEPw=
file:
- ThinkPHP_Core.zip
- ThinkPHP_Full.zip
skip_cleanup: true
on:
tags: true

@ -0,0 +1,32 @@
ThinkPHP遵循Apache2开源协议发布并提供免费使用。
版权所有Copyright © 2006-2016 by ThinkPHP (http://thinkphp.cn)
All rights reserved。
ThinkPHP® 商标和著作权所有者为上海顶想信息科技有限公司。
Apache Licence是著名的非盈利开源组织Apache采用的协议。
该协议和BSD类似鼓励代码共享和尊重原作者的著作权
允许代码修改,再作为开源或商业软件发布。需要满足
的条件:
1 需要给代码的用户一份Apache Licence
2 如果你修改了代码,需要在被修改的文件中说明;
3 在延伸的代码中(修改和有源代码衍生的代码中)需要
带有原来代码中的协议,商标,专利声明和其他原来作者规
定需要包含的说明;
4 如果再发布的产品中包含一个Notice文件则在Notice文
件中需要带有本协议内容。你可以在Notice中增加自己的
许可但不可以表现为对Apache Licence构成更改。
具体的协议参考http://www.apache.org/licenses/LICENSE-2.0
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.

@ -0,0 +1 @@
# UTel 電子名片系統

@ -0,0 +1 @@
deny from all

@ -0,0 +1,22 @@
<?php
declare (strict_types = 1);
namespace app;
use think\Service;
/**
* 应用服务类
*/
class AppService extends Service
{
public function register()
{
// 服务注册
}
public function boot()
{
// 服务启动
}
}

@ -0,0 +1,94 @@
<?php
declare (strict_types = 1);
namespace app;
use think\App;
use think\exception\ValidateException;
use think\Validate;
/**
* 控制器基础类
*/
abstract class BaseController
{
/**
* Request实例
* @var \think\Request
*/
protected $request;
/**
* 应用实例
* @var \think\App
*/
protected $app;
/**
* 是否批量验证
* @var bool
*/
protected $batchValidate = false;
/**
* 控制器中间件
* @var array
*/
protected $middleware = [];
/**
* 构造方法
* @access public
* @param App $app 应用对象
*/
public function __construct(App $app)
{
$this->app = $app;
$this->request = $this->app->request;
// 控制器初始化
$this->initialize();
}
// 初始化
protected function initialize()
{}
/**
* 验证数据
* @access protected
* @param array $data 数据
* @param string|array $validate 验证器名或者验证规则数组
* @param array $message 提示信息
* @param bool $batch 是否批量验证
* @return array|string|true
* @throws ValidateException
*/
protected function validate(array $data, $validate, array $message = [], bool $batch = false)
{
if (is_array($validate)) {
$v = new Validate();
$v->rule($validate);
} else {
if (strpos($validate, '.')) {
// 支持场景
[$validate, $scene] = explode('.', $validate);
}
$class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
$v = new $class();
if (!empty($scene)) {
$v->scene($scene);
}
}
$v->message($message);
// 是否批量验证
if ($batch || $this->batchValidate) {
$v->batch(true);
}
return $v->failException(true)->check($data);
}
}

@ -0,0 +1,58 @@
<?php
namespace app;
use think\db\exception\DataNotFoundException;
use think\db\exception\ModelNotFoundException;
use think\exception\Handle;
use think\exception\HttpException;
use think\exception\HttpResponseException;
use think\exception\ValidateException;
use think\Response;
use Throwable;
/**
* 应用异常处理类
*/
class ExceptionHandle extends Handle
{
/**
* 不需要记录信息(日志)的异常类列表
* @var array
*/
protected $ignoreReport = [
HttpException::class,
HttpResponseException::class,
ModelNotFoundException::class,
DataNotFoundException::class,
ValidateException::class,
];
/**
* 记录异常信息(包括日志或者其它方式记录)
*
* @access public
* @param Throwable $exception
* @return void
*/
public function report(Throwable $exception): void
{
// 使用内置的方式记录异常日志
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
*
* @access public
* @param \think\Request $request
* @param Throwable $e
* @return Response
*/
public function render($request, Throwable $e): Response
{
// 添加自定义异常处理机制
// 其他错误交给系统处理
return parent::render($request, $e);
}
}

@ -0,0 +1,8 @@
<?php
namespace app;
// 应用请求对象类
class Request extends \think\Request
{
}

@ -0,0 +1,128 @@
<?php
declare (strict_types = 1);
namespace app\adminapi;
use think\App;
use think\Response;
// use think\exception\ValidateException;
// use think\Validate;
/**
* 控制器基礎類
*/
abstract class ApiController
{
/**
* Request實例
* @var \think\Request
*/
protected $request;
/**
* 應用實例
* @var \think\App
*/
protected $app;
/**
* 是否批量驗證
* @var bool
*/
protected $batchValidate = false;
/**
* 控制器中間件
* @var array
*/
protected $middleware = [];
/**
* 構造方法
* @access public
* @param App $app 應用對象
*/
public function __construct(App $app)
{
$this->app = $app;
$this->request = $this->app->request;
// 控制器初始化
$this->initialize();
}
// 初始化
protected function initialize()
{
header('Access-Control-Allow-Origin: *');
//允許的請求頭信息
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
//允許的請求類型
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, PATCH');
//允許攜帶證書式訪問攜帶cookie
header('Access-Control-Allow-Credentials:true');
}
/**
* 驗證數據
* @access protected
* @param array $data 數據
* @param string|array $validate 驗證器名或者驗證規則數組
* @param array $message 提示信息
* @param bool $batch 是否批量驗證
* @return array|string|true
* @throws ValidateException
*/
protected function validate(array $data, $validate, array $message = [], bool $batch = false)
{
if (is_array($validate)) {
$v = new Validate();
$v->rule($validate);
} else {
if (strpos($validate, '.')) {
// 支持場景
[$validate, $scene] = explode('.', $validate);
}
$class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
$v = new $class();
if (!empty($scene)) {
$v->scene($scene);
}
}
$v->message($message);
// 是否批量驗證
if ($batch || $this->batchValidate) {
$v->batch(true);
}
return $v->failException(true)->check($data);
}
public function Success($data,$message='請求成功',$code=200,$type='json',$header=[]){
$result = [
'code' => $code,
'message' => $message,
'time'=>time(),
'data'=>$data
];
return Response::create($result,$type)->header($header);
}
public function Error($data,$message='請求失敗',$code=500,$type='json',$header=[]){
$result = [
'code' => $code,
'message' => $message,
'time'=>time(),
'data'=>$data
];
return Response::create($result,$type)->header($header);
}
}

@ -0,0 +1,167 @@
<?php
namespace app\adminapi\controller\v1;
use app\adminapi\ApiController;
use think\facade\Db;
class Admin extends ApiController
{
public function getAdminUsers()
{
if(!input('search')){
$result=Db::name('admin')
->page(input('current'),input('size'))
->select();
$total=Db::name('admin')
->count();
}else{
$result=Db::name('admin')
->where('username','like','%'.input('search').'%')
->page(input('current'),input('size'))
->select();
$total=Db::name('admin')
->where('username','like','%'.input('search').'%')
->count();
}
if(!$result){
$result=[];
}
$rtn=[
'total' => $total,
'data' => $result
];
return $this->Success($rtn);
}
public function getUser(){
$id=input('id');
$result=Db::name('admin')
->field('id,username,email,status,role_id as role')
->where('id',$id)
->find();
if(!$result){
$result=[];
}
return $this->success($result);
}
public function addUser(){
$req=input();
$password_hash = password_hash($req['password'], PASSWORD_DEFAULT);
$data=[
'username' => $req['username'],
'password' => $password_hash,
'email' => $req['email'],
'action_list' => '',
'status' => $req['status'],
];
$result=Db::name('admin')
->insert($data);
if(!$result){
$result=[];
}
return $this->success($result);
}
public function updateUser(){
$req=input();
$data=[
'username' => $req['username'],
'email' => $req['email'],
'role_id' => $req['role'],
'action_list' => '',
'status' => $req['status'],
];
if(strlen($req['password'])>0){
$data['password']=$req['password'];
}
$result=Db::name('admin')
->where('id',$req['id'])
->update($data);
if(!$result){
$result=[];
}
return $this->success($result);
}
public function deleteUser(){
$id=input('id');
$result=Db::name('admin')
->where('id',$id)
->delete();
return $this->success($result);
}
public function updateStatus(){
$id=input('id');
$status=input('status');
$result=Db::name('admin')
->where('id',$id)
->update(['status'=>$status]);
if(!$result){
$result=[];
}
return $this->success($result);
}
public function getAdminLogs()
{
if(!input('search')){
$result=Db::name('admin_log')
->page(input('current'),input('size'))
->order('id','desc')
->select();
$total=Db::name('admin_log')
->count();
}else{
$result=Db::name('admin_log')
->where('admin_name','like','%'.input('search').'%')
->page(input('current'),input('size'))
->order('id','desc')
->select();
$total=Db::name('admin_log')
->where('admin_name','like','%'.input('search').'%')
->count();
}
if(!$result){
$result=[];
}
$rtn=[
'total' => $total,
'data' => $result
];
return $this->Success($rtn);
}
}

@ -0,0 +1,153 @@
<?php
namespace app\adminapi\controller\v1;
use app\adminapi\ApiController;
use think\facade\Db;
use think\facade\Session;
use thans\jwt\facade\JWTAuth;
use think\facade\Log;
class Auth extends ApiController
{
public function Login()
{
$username=input('username');
$password=input('password');
// $captcha=input('captcha');
// Log::write(json_encode(Session::all()));
// if(!captcha_check($captcha)){
// return $this->Error('驗證碼錯誤','請求失敗',301);
// }
$result=Db::name('admin')
->where('username',$username)
->find();
if(!$result){
return $this->Error('帳號或密碼錯誤','請求失敗',302);
}
if(!password_verify($password , $result['password'])){
return $this->Error('帳號或密碼錯誤','請求失敗',303);
}
$token = JWTAuth::builder(['uid' => $result['id']]);
$result=[
'user'=>[
'uid'=>$result['id'],
"name" => $result['username'],
"avatar" => "https://gw.alipayobjects.com/zos/rmsportal/ubnKSIfAJTxIgXOKlciN.png",
"address" => "固原市",
"position" => [
"CN" => "產品分析師 | 螞蟻金服-計算服務事業群-IOS平臺部",
"TW" => "產品分析師 | 螞蟻金服-計算服務事業群-IOS平臺部",
"US" => "Product analyst | Ant Financial - Computing services business group - IOS platform division"
]
],
'permissions'=>[
[
'id'=>'queryForm',
'operation'=>['add','edit','delete']
]
],
'roles'=>[
[
'id'=>'admin',
'operation'=>['add','edit','delete']
]
],
'token'=>$token,
'expireAt'=>time()+30*60*1000
];
return $this->Success($result);
}
public function check(){
print_r(JWTAuth::auth());
}
public function captcha($id=''){
return captcha($id);
}
public function checkC($value){
print_r(Session::all());
if(!captcha_check($value)){
//驗證失敗
echo 'failure';
};
echo 'Success';
}
public function getRoute(){
$routes=[
[
"router" => "root",
"children" => [
"DashBoard",
[
"router" => "system",
"children" => [
[
"router" => "systemConfig",
"name" => "站台設置",
"authority" => [
"permission" => "demo",
"role" => "admin"
]
]
]
],
[
"router" => "admin",
"children" => [
"adminUser",
"adminLog",
"adminRole",
]
],
[
"router" => "goods",
"children" => [
"goodsList",
"goodsCategory",
"goodsType",
]
],
[
"router" => "order",
"children" => [
"orderList",
]
],
[
"router" => "room",
"children" => [
"roomList",
]
],
[
"router" => "user",
"children" => [
"userList"
]
],
[
"router" => "setting",
"children" => [
"settingBase",
"settingConfig"
]
]
]
]
];
return $this->Success($routes);
}
}

@ -0,0 +1,187 @@
<?php
namespace app\adminapi\controller\v1;
use app\adminapi\ApiController;
use think\facade\Db;
use app\common\lib\Vcard;
use app\common\lib\Aes;
class Card extends ApiController
{
public function addPrecard(){
$req=input();
//取得prefix
$agent = Db::name('agent')
->where('id',$req['agent_id'])
->find();
$aes = new Aes([]);
for($i=0;$i<input('number');$i++){
// $user_id=genUniqid($agent['prefix']);
// $verify_code = genSerialNo();
// $params = urlencode($aes->encrypt('user_id='.$user_id.'&verify_code='.$verify_code));
// $nfcUrl = genQrCode(getUrl().'/card/?params='.$params,$user_id,'nfc');
$data[]=[
// 'user_id'=>$user_id,
'agent_id'=>$req['agent_id'],
'try_days'=>7,
'verify_code'=>'',
'expire_time'=>$req['expire_time'],
'status'=>0,
];
}
try{
Db::name('precard')
->insertAll($data);
}catch(\Exception $e){
print_r($e);
return $this->error('新增失敗');
}
return $this->success('新增成功');
}
// 取得預開卡資料
public function getPrecard(){
$do=Db::name('precard');
if(!input('search')){
$result=$do
->page(input('current'),input('size'))
->order('id','desc')
->select()->toArray();
$total=$do
->count();
}else{
$result=$do
->where('user_id','like','%'.input('search').'%')
->page(input('current'),input('size'))
->order('id','desc')
->select()->toArray();
$total=$do
->where('user_id','like','%'.input('search').'%')
->count();
}
if(!$result){
$result=[];
}
foreach($result as $key => $val){
// $aes = new Aes([]);
// $nfc_url = 'user_id='.$val['user_id'].'&verify_code='.$val['verify_code'];
// $result[$key]['params'] = getUrl().'/card/'.urlencode($aes->encrypt($nfc_url));
$result[$key]['agent_name'] = Db::name('agent')->where('id',$val['agent_id'])->value('name');
$result[$key]['expire'] = date('Y-m-d',$val['expire_time']);
switch($val['status']){
case 0:
$result[$key]['status_name']='未制卡';
break;
case 1:
$result[$key]['status_name']='已制卡';
break;
case 2:
$result[$key]['status_name']='已開通';
break;
case 3:
$result[$key]['status_name']='已作癈';
break;
}
$aes = new Aes([]);
$params = urlencode($aes->encrypt('verify_code='.$val['verify_code']));
$result[$key]['nfcurl']= getUrl().'/card/?params='.$params;
// $nfcUrl = genQrCode('https://'.$_SERVER['HTTP_HOST'].'/card/?params='.$params,$data['user_id'],'nfc');
}
$rtn=[
'total' => $total,
'data' => $result
];
return $this->Success($rtn);
}
public function deleteCard(){
$id=input('id');
$result=Db::name('precard')
->where('id',$id)
->delete();
return $this->success($result);
}
public function updateStatus(){
$id=input('id');
$status=input('status');
$result=Db::name('precard')
->where('id',$id)
->update(['status'=>$status]);
if(!$result){
$result=[];
}
return $this->success($result);
}
public function updateVerifyCode(){
$id=input('id');
$verify_code=strtoupper(input('code'));
$is_user = Db::name('user')
->where('uniqid',$verify_code)
->count();
if($is_user){
return $this->error('卡片已綁定會員');
}
$is_precard = Db::name('precard')
->where('verify_code',$verify_code)
->count();
if($is_precard){
return $this->error('已存在預製卡');
}
try{
$result=Db::name('precard')
->where('id',$id)
->update(['verify_code'=>$verify_code,'status'=>1]);
return $this->success('設定成功');
}catch(\Exception $e){
return $this->error('系統錯誤');
}
}
public function downloadQr(){
$id=input('id');
$pc=Db::name('precard')
->where('id',$id)
->find();
if(strlen($pc['nfc_qrcode'])>0){
$nfc_qrcode = $pc['nfc_qrcode'];
}else{
}
return $this->success($result);
}
}

@ -0,0 +1,18 @@
<?php
namespace app\adminapi\controller\v1;
use app\BaseController;
use app\common\lib\Vcard;
class Index extends BaseController
{
public function index()
{
return 'Admin Index';
}
public function test(){
Vcard::genVcf('mc638ac4d74c7e6');
}
}

@ -0,0 +1,87 @@
<?php
namespace app\admin\controller\v1;
use app\api\ApiController;
use think\facade\Db;
class Right extends ApiController
{
public function getTree()
{
$data=[
'title'=>'所有權限',
'key'=>'all',
'level'=>0,
'index'=>0
];
$data=$this->buildTree($data);
if(!$data){
$result=[];
}
// $result['children']=$children;
$rtn=[
// 'total' => $total,
$data
];
return $this->Success($rtn);
}
private static function buildTree($data,$level=0){
$level=$level+1;
$menu = Db::name('menu')
->where('pid',$data['index'])
->select();
if(!$menu){
return $data;
}
$children=[];
foreach($menu as $key => $val){
$children[$key]['title']=$val['title'];
$children[$key]['index']=$val['id'];
$children[$key]['level']=$level;
$children[$key]['key']=$val['node'];
if($level < 2){
$children[$key]=self::buildTree($children[$key],$level);
}else{
$children[$key]=self::appendPermission($children[$key]);
}
}
if($children){
$data['children'] = $children;
}
return $data;
}
private static function appendPermission($data){
$perm = Db::name('permission')
->where('menu_id',$data['index'])
->select();
if(!$perm){
return $data;
}
$children=[];
foreach($perm as $key => $val){
$children[$key]['title']=lang($val['code']);
$children[$key]['index']=$val['id'];
$children[$key]['key']=$val['code'];
}
if($children){
$data['children'] = $children;
}
return $data;
}
}

@ -0,0 +1,86 @@
<?php
namespace app\adminapi\controller\v1;
use app\adminapi\ApiController;
use think\facade\Db;
class Role extends ApiController
{
public function getRoles()
{
$result=Db::name('role')
->select();
if(!$result){
$result=[];
}
// foreach($result as $key=>$val){
// // $rtn=Db::name('goods')->where('gc_id',$val['id'])->select()->toArray();
// // if($rtn){
// // $result[$key]['goods']=[];
// // }
// $result[$key]['goods']=Db::name('goods')->where('gc_id',$val['id'])->select()->toArray();
// }
return $this->Success($result);
}
public function getRoleById(){
$id=input('id');
$result=Db::name('role')
->where('id',$id)
->find();
$rtn=[
'id' => $result['id'],
'name' => $result['name'],
'desc' => $result['desc'],
'permission'=>json_decode($result['limits'])
];
return $this->Success($rtn);
}
public function addRole(){
$req=input();
$data = [
'name'=>$req['name'],
'desc'=>$req['desc'],
'limits'=>json_encode($req['permission'])
];
$result=Db::name('role')
->insert($data);
return $this->Success($result);
}
public function updateRole(){
$req=input();
$data = [
'name' =>$req['name'],
'desc' =>$req['desc'],
'limits' =>json_encode($req['permission'])
];
$result=Db::name('role')
->where('id',$req['id'])
->update($data);
return $this->Success($result);
}
public function deleteRole(){
$id=input('id');
$result=Db::name('role')
->where('id',$id)
->delete();
return $this->Success($result);
}
}

@ -0,0 +1,45 @@
<?php
namespace app\adminapi\controller\v1;
use app\adminapi\ApiController;
use think\facade\Db;
class Site extends ApiController
{
public function getSiteConfig(){
$result = Db::name('site_config')
->where('parent_id','<>',0)
->select();
foreach($result as $key => $val){
$rtn[$val['code']]=$val['value'];
}
return $this->success($rtn);
}
public function setSiteConfig(){
$data = input();
unset($data['version']);
unset($data['controller']);
unset($data['action']);
try{
foreach($data as $key => $val){
Db::name('site_config')
->where('code',$key)
->update(['value'=>$val]);
}
}catch(\Exception $e){
return $this->error('更新失敗');
}
return $this->success('更新成功');
}
public function getAgents(){
$result = Db::name('agent')
->select();
return $this->success($result);
}
}

@ -0,0 +1,305 @@
<?php
namespace app\adminapi\controller\v1;
use app\adminapi\ApiController;
use think\facade\Db;
use app\common\lib\Vcard;
use app\common\lib\Aes;
class User extends ApiController
{
public function getInfo()
{
$id=$this->request->uid;
$result=Db::name('user')
->where('id',$id)
->find();
if(!$result){
$result=[];
}
// foreach($result as $key=>$val){
// // $rtn=Db::name('goods')->where('gc_id',$val['id'])->select()->toArray();
// // if($rtn){
// // $result[$key]['goods']=[];
// // }
// $result[$key]['goods']=Db::name('goods')->where('gc_id',$val['id'])->select()->toArray();
// }
return $this->Success($result);
}
// 取得會員資料
public function getUsers(){
$do=Db::name('user');
if(!input('search')){
$result=$do
->page(input('current'),input('size'))
->order('id','desc')
->select()->toArray();
$total=$do
->count();
}else{
$result=$do
->where('user_id','like','%'.input('search').'%')
->page(input('current'),input('size'))
->order('id','desc')
->select()->toArray();
$total=$do
->where('user_id','like','%'.input('search').'%')
->count();
}
if(!$result){
$result=[];
}
$aes = new Aes([]);
foreach($result as $key => $val){
$result[$key]['level_name']= Db::name('user_level')->where('level_id',$val['level'])->where('agent_id',$val['agent_id'])->value('name');
if($val['parent_id']>0){
$result[$key]['parent_name']=Db::name('user')->where('id',$val['parent_id'])->value('real_name');
}
if($val['overdue_time']>0){
$result[$key]['overdue'] = date('Y-m-d',$val['overdue_time']);
}else{
$result[$key]['overdue'] = '無限期';
}
if(strlen($val['uniqid'])>0){
$uniqid = $val['uniqid'];
}else{
$uniqid = '00000000';
}
$params = urlencode($aes->encrypt('user_id='.$val['user_id'].'&verify_code='.$uniqid));
$result[$key]['nfcurl']= getUrl().'/card/?params='.$params;
}
$rtn=[
'total' => $total,
'data' => $result
];
return $this->Success($rtn);
}
public function getUser(){
$id=input('id');
$result=Db::name('user')
->where('id',$id)
->find();
if(!$result){
$result=[];
}
$levels=Db::name('user_level')
->where('agent_id',$result['agent_id'])
->select();
$result['levels']=$levels;
return $this->success($result);
}
public function addUser(){
$req=input();
unset($req['version']);
unset($req['controller']);
unset($req['action']);
$req['user_id'] = 'mc'.uniqid();
$req['line_id'] = $req['user_id'];
$req['create_time']=date('Y-m-d H:i:s');
$req['update_time']=date('Y-m-d H:i:s');
$result=Db::name('user')
->insert($req);
if(!$result){
$result=[];
}
return $this->success($result);
}
public function updateUser(){
$req=input();
unset($req['version']);
unset($req['controller']);
unset($req['action']);
unset($req['levels']);
unset($req['status']);
$level_option = Db::name('user_level')
->where('agent_id',$req['agent_id'])
->where('level_id',$req['level'])
->find();
$req['nc_type']=$level_option['nc_type'];
$req['nc_func']=$level_option['nc_func'];
$req['update_time']=date('Y-m-d H:i:s');
$result=Db::name('user')
->where('id',$req['id'])
->update($req);
Vcard::genVcf(input('user_id'));
if(!$result){
$result=[];
}
return $this->success($result);
}
public function deleteUser(){
$id=input('id');
$result=Db::name('user')
->where('id',$id)
->delete();
return $this->success($result);
}
public function updateStatus(){
$id=input('id');
$status=input('status');
$result=Db::name('user')
->where('id',$id)
->update(['status'=>$status]);
if(!$result){
$result=[];
}
return $this->success($result);
}
public function getUserCard(){
$id=input('id');
$result=Db::name('user_card')
->field('id,type,title,content,nfc_show,sort_id')
->where('user_id',$id)
->order('sort_id')
->select();
if(!$result){
$result=[];
}
return $this->success($result);
}
public function uploadAvatar(){
$files = request()->file('avatar');
$savename = \think\facade\Filesystem::disk('public')->putFile( input('id'), $files);
$avatar = getUrl().'/storage/'.$savename;
return $this->Success($avatar);
}
public function updateUserCard(){
$user_id=input('id');
$cards=input('cards');
Db::name('user_card')
->where('user_id',$user_id)
->delete();
foreach($cards as $key => $val){
$nfc_show = $val['nfc_show']?1:0;
Db::name('user_card')
->insert([
'user_id' => $user_id,
'type' => $val['type'],
'title' => $val['title'],
'content' => $val['content'],
'nfc_show' => $nfc_show,
'sort_id' => $key,
'create_time' => time()
]);
}
// if(!$result){
// $result=[];
// }
return $this->success(['code'=>200]);
}
public function updateVerifyCode(){
$id=input('id');
$uniqid=strtoupper(input('code'));
$result=Db::name('user')
->where('id',$id)
->update(['uniqid'=>$uniqid]);
return $this->success('設定成功');
}
// 取得預開卡資料
public function getPrecard(){
$do=Db::name('precard');
if(!input('search')){
$result=$do
->page(input('current'),input('size'))
->order('id','desc')
->select()->toArray();
$total=$do
->count();
}else{
$result=$do
->where('user_id','like','%'.input('search').'%')
->page(input('current'),input('size'))
->order('id','desc')
->select()->toArray();
$total=$do
->where('user_id','like','%'.input('search').'%')
->count();
}
if(!$result){
$result=[];
}
foreach($result as $key => $val){
$aes = new Aes([]);
$nfc_url = 'user_id='.$val['user_id'].'&verify_code='.$val['verify_code'];
$result[$key]['params'] = getUrl().'/card/'.urlencode($aes->encrypt($nfc_url));
}
$rtn=[
'total' => $total,
'data' => $result
];
return $this->Success($rtn);
}
}

@ -0,0 +1,6 @@
<?php
return [
\think\middleware\SessionInit::class,
\think\middleware\AllowCrossDomain::class,
// app\api\middleware\CheckSiteCode::class
];

@ -0,0 +1,9 @@
<?php
use think\facade\Route;
// Route::group(function () {
// Route::rule(':version/user/:action', 'api/:version.user/:action');
// })->middleware(\app\api\middleware\JWT::class);
Route::rule(':version/:controller/:action','adminapi/:version.:controller/:action');

@ -0,0 +1,134 @@
<?php
declare (strict_types = 1);
namespace app\api;
use think\App;
use think\Response;
// use think\exception\ValidateException;
// use think\Validate;
/**
* 控制器基础类
*/
abstract class ApiController
{
/**
* Request实例
* @var \think\Request
*/
protected $request;
/**
* 应用实例
* @var \think\App
*/
protected $app;
/**
* 是否批量验证
* @var bool
*/
protected $batchValidate = false;
/**
* 控制器中间件
* @var array
*/
protected $middleware = [];
/**
* user id
* @var array
*/
protected $uid = '';
/**
* 构造方法
* @access public
* @param App $app 应用对象
*/
public function __construct(App $app)
{
$this->app = $app;
$this->request = $this->app->request;
// 控制器初始化
$this->initialize();
}
// 初始化
protected function initialize()
{
header('Access-Control-Allow-Origin: *');
// //允許的請求頭信息
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
// //允許的請求類型
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, PATCH');
header('Access-Control-Expose-Headers: authorization');
// //允許攜帶證書式訪問攜帶cookie
header('Access-Control-Allow-Credentials:true');
$this->uid = input('uid');
}
/**
* 验证数据
* @access protected
* @param array $data 数据
* @param string|array $validate 验证器名或者验证规则数组
* @param array $message 提示信息
* @param bool $batch 是否批量验证
* @return array|string|true
* @throws ValidateException
*/
protected function validate(array $data, $validate, array $message = [], bool $batch = false)
{
if (is_array($validate)) {
$v = new Validate();
$v->rule($validate);
} else {
if (strpos($validate, '.')) {
// 支持场景
[$validate, $scene] = explode('.', $validate);
}
$class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
$v = new $class();
if (!empty($scene)) {
$v->scene($scene);
}
}
$v->message($message);
// 是否批量验证
if ($batch || $this->batchValidate) {
$v->batch(true);
}
return $v->failException(true)->check($data);
}
public function Success($data,$code=200,$message='請求成功',$type='json',$header=[]){
$result = [
'code' => $code,
'message' => $message,
'time'=>time(),
'data'=>$data
];
return Response::create($result,$type)->header($header);
}
public function Error($data,$code=500,$message='請求失敗',$type='json',$header=[]){
$result = [
'code' => $code,
'message' => $message,
'time'=>time(),
'data'=>$data
];
return Response::create($result,$type)->header($header);
}
}

@ -0,0 +1,12 @@
<?php
// api公用函數
use think\facade\Db;
function getPrefixByAppId($appid){
return 'tg';
}
function checkParams(){
print_r('aaaaa');
}

@ -0,0 +1,26 @@
<?php
namespace app\api\controller\v1;
use app\api\ApiController;
use app\common\lib\Aes;
class Auth extends ApiController
{
function test(){
echo genSerialNo();
}
function testAes(){
$aes = new Aes([]);
echo urlencode($aes->encrypt('user_id=tg123467890&verify_code=1111'));
}
function testDec(){
$params = input('params');
echo $params;
$aes = new Aes([]);
echo $aes->descrypt($params);
}
}

@ -0,0 +1,96 @@
<?php
namespace app\api\controller\v1;
use app\api\ApiController;
use think\facade\Db;
use app\api\validate\User as UserValidate;
use think\exception\ValidateException;
class User extends ApiController
{
public function list(){
}
public function add(){
//參數檢查
try {
validate(UserValidate::class)->check(input());
} catch (ValidateException $e) {
// 驗證失敗 輸出錯誤信息
// dump($e->getError());
return $this->Error($e->getError(),501,'參數錯誤');
}
$prefix = getPrefixByAppId(input('appid'));
$data['user_id']=$prefix.input('user_id');
$data['real_name']=input('name');
$data['level']=input('level')?input('level'):0;
$data['overdue_time']=input('overdue_time')?input('overdue_time'):(time()+(60*60*24*7));
$data['cus_card'] = '';
$data['create_time'] = date('Y-m-d H:i:s');
//檢查 User ID
$is_exist = Db::name('user')
->where('user_id',$data['user_id'])
->count();
if($is_exist){
return $this->Error('使用者帳號己存在',502,'請求失敗');
}
try{
//產生暫時編號
$data['uniqid']='tg'.genUniqid();
$id = Db::name('user')
->insertGetId($data);
$refer_code = encodeRefer($id);
$result = Db::name('user')
->where('id',$id)
->update(['code'=>$refer_code]);
$qrcodeUrl = genQrCode('https://'.$_SERVER['HTTP_HOST'].'/home/?aid='.$agent['prefix'],$data['user_id'],'refer');
$nfcUrl = genQrCode('https://'.$_SERVER['HTTP_HOST'].'/card?userid='.$data['user_id'],$data['user_id'],'nfc');
return $this->Success($data['uniqid']);
}catch(\Exception $e){
return $this->Error('系統錯誤',500,'新增失敗');
}
}
public function setLevel(){
//參數檢查
try {
validate(\app\api\validate\UserLevel::class)->check(input());
} catch (ValidateException $e) {
return $this->Error($e->getError(),501,'參數錯誤');
}
$prefix = getPrefixByAppId(input('appid'));
$user_id=$prefix.input('user_id');
$level=input('level')?input('level'):0;
$overdue_time=input('overdue_time')?input('overdue_time'):(time()+(60*60*24*365));
try{
$result=Db::name('user')
->where('user_id',$user_id)
->update(['level'=>$level,'overdue_time'=>$overdue_time]);
}catch(\Exception $e){
return $this->Error('系統錯誤',500,'新增失敗');
}
return $this->Success('更新成功');
}
}

@ -0,0 +1,125 @@
<?php
declare (strict_types = 1);
namespace app\api\exception;
use think\App;
// use think\Response;
/**
* 控制器基础类
*/
abstract class BaseException
{
/**
* Request实例
* @var \think\Request
*/
protected $request;
/**
* 应用实例
* @var \think\App
*/
protected $app;
/**
* 是否批量验证
* @var bool
*/
protected $batchValidate = false;
/**
* 控制器中间件
* @var array
*/
protected $middleware = [];
/**
* 构造方法
* @access public
* @param App $app 应用对象
*/
public function __construct(App $app)
{
$this->app = $app;
$this->request = $this->app->request;
// 控制器初始化
$this->initialize();
}
// 初始化
protected function initialize()
{
header('Access-Control-Allow-Origin: *');
// //允許的請求頭信息
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
// //允許的請求類型
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, PATCH');
header('Access-Control-Expose-Headers: authorization');
// //允許攜帶證書式訪問攜帶cookie
header('Access-Control-Allow-Credentials:true');
}
/**
* 验证数据
* @access protected
* @param array $data 数据
* @param string|array $validate 验证器名或者验证规则数组
* @param array $message 提示信息
* @param bool $batch 是否批量验证
* @return array|string|true
* @throws ValidateException
*/
protected function validate(array $data, $validate, array $message = [], bool $batch = false)
{
if (is_array($validate)) {
$v = new Validate();
$v->rule($validate);
} else {
if (strpos($validate, '.')) {
// 支持场景
[$validate, $scene] = explode('.', $validate);
}
$class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
$v = new $class();
if (!empty($scene)) {
$v->scene($scene);
}
}
$v->message($message);
// 是否批量验证
if ($batch || $this->batchValidate) {
$v->batch(true);
}
return $v->failException(true)->check($data);
}
public function Success($data,$code=200,$message='請求成功',$type='json',$header=[]){
$result = [
'code' => $code,
'message' => $message,
'time'=>time(),
'data'=>$data
];
return Response::create($result,$type)->header($header);
}
public function Error($data,$code=500,$message='請求失敗',$type='json',$header=[]){
$result = [
'code' => $code,
'message' => $message,
'time'=>time(),
'data'=>$data
];
return Response::create($result,$type)->header($header);
}
}

@ -0,0 +1,7 @@
<?php
return [
\think\middleware\SessionInit::class,
\think\middleware\AllowCrossDomain::class,
// app\api\middleware\CheckParams::class
// app\api\middleware\CheckSiteCode::class
];

@ -0,0 +1,34 @@
<?php
declare (strict_types=1);
namespace app\api\middleware;
use think\exception\HttpException;
class CheckParams
{
public function handle($request, \Closure $next): object
{
$params = $request->param();
if(!isset($params['sign'])){
return json(['code'=>401,'message'=>'API驗證失敗','data'=>'No Sign','time'=>time()]);
}
$sign = $params['sign'];
unset($params['sign']);
ksort($params);
$string = md5(md5(strtolower(http_build_query($params))).'seckey');
if($string !== $sign){
// throw new HttpException(401, 'Sign Error!!!');
return json(['code'=>401,'message'=>'API驗證失敗','data'=>'Sign Error','time'=>time()]);
}
$response = $next($request);
return $response;
}
}

@ -0,0 +1,62 @@
<?php
declare (strict_types=1);
namespace app\api\middleware;
use thans\jwt\exception\JWTException;
use thans\jwt\exception\TokenBlacklistException;
use thans\jwt\exception\TokenBlacklistGracePeriodException;
use thans\jwt\exception\TokenExpiredException;
use thans\jwt\middleware\JWTAuth;
use think\exception\HttpException;
/**
* JWT驗證刷新token機制
* Class JWTToken
* @package app\api\middleware
*/
class JWT extends JWTAuth
{
/**
* 刷新token
* @param $request
* @param \Closure $next
* @return mixed
* @throws JWTException
* @throws TokenBlacklistException
* @throws TokenBlacklistGracePeriodException
*/
public function handle($request, \Closure $next): object
{
try {
$payload = $this->auth->auth();
} catch (TokenExpiredException $e) { // token過期
// 嘗試刷新token會將舊token加入黑名單
try {
$this->auth->setRefresh();
$token = $this->auth->refresh();
$payload = $this->auth->auth(false);
} catch (TokenBlacklistGracePeriodException $e) {
$payload = $this->auth->auth(false);
} catch (JWTException $exception) {
// 如果捕獲到此異常,即代表 refresh 也過期了,用户無法刷新令牌,需要重新登錄。
throw new HttpException(401, $exception->getMessage());
}
} catch (TokenBlacklistGracePeriodException $e) { // 捕獲黑名單寬限期
$payload = $this->auth->auth(false);
} catch (TokenBlacklistException $e) { // 捕獲黑名單退出登錄或者已經自動刷新當前token就會被拉黑
throw new HttpException(401, 'not login...');
}
$request->uid = $payload['user_id']->getValue();
$response = $next($request);
if (isset($token)) {
$this->setAuthentication($response, $token);
}
return $response;
}
}

@ -0,0 +1,10 @@
<?php
use think\facade\Route;
Route::group(function () {
// Route::rule(':version/:controller/:action','zlapi/:version.:controller/:action');
// Route::rule(':version/user/:action', 'api/:version.user/:action');
})->middleware(\app\zlapi\middleware\JWT::class);
// Route::resource(':version/:controller','api/:version.:controller');
Route::rule(':version/:controller/:action','api/:version.:controller/:action');

@ -0,0 +1,25 @@
<?php
namespace app\api\validate;
use think\Validate;
class User extends Validate
{
protected $rule = [
'appid' => 'require',
'user_id' => 'require|max:255',
'name' => 'require|max:25',
'level' => 'number|between:0,3',
'overdue_time' => 'number'
];
protected $message = [
'appid.require' => 'appid 不可為空',
'user_id.require' => 'User Id不可為空',
'name.require' => 'Name不得為空',
'name.max' => 'Name不得超過25個字',
'level.number' => 'Level必需是數字',
'level.between' => 'Level只能在0-3之間',
'overdue_time.require' => 'overdue_time必需是數字',
];
}

@ -0,0 +1,24 @@
<?php
namespace app\api\validate;
use think\Validate;
class UserLevel extends Validate
{
protected $rule = [
'appid' => 'require',
'user_id' => 'require|max:255',
'level' => 'require|number|between:0,3',
'overdue_time' => 'require|number'
];
protected $message = [
'appid.require' => 'appid 不可為空',
'user_id.require' => 'User Id不可為空',
'level.require' => 'Level不可為空',
'level.number' => 'Level必需是數字',
'level.between' => 'Level只能在0-3之間',
'overdue_time.require' => 'overdue_time不可為空',
'overdue_time.number' => 'overdue_time必需是數字',
];
}

@ -0,0 +1,130 @@
<?php
declare (strict_types = 1);
namespace app\appapi;
use think\App;
use think\Response;
// use think\exception\ValidateException;
// use think\Validate;
/**
* 控制器基础类
*/
abstract class ApiController
{
/**
* Request实例
* @var \think\Request
*/
protected $request;
/**
* 应用实例
* @var \think\App
*/
protected $app;
/**
* 是否批量验证
* @var bool
*/
protected $batchValidate = false;
/**
* 控制器中间件
* @var array
*/
protected $middleware = [];
protected $uid = '';
/**
* 构造方法
* @access public
* @param App $app 应用对象
*/
public function __construct(App $app)
{
$this->app = $app;
$this->request = $this->app->request;
// 控制器初始化
$this->initialize();
}
// 初始化
protected function initialize()
{
header('Access-Control-Allow-Origin: *');
// //允許的請求頭信息
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");
// //允許的請求類型
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS, PATCH');
header('Access-Control-Expose-Headers: authorization');
// //允許攜帶證書式訪問攜帶cookie
header('Access-Control-Allow-Credentials:true');
$this->uid = input('uid');
}
/**
* 验证数据
* @access protected
* @param array $data 数据
* @param string|array $validate 验证器名或者验证规则数组
* @param array $message 提示信息
* @param bool $batch 是否批量验证
* @return array|string|true
* @throws ValidateException
*/
protected function validate(array $data, $validate, array $message = [], bool $batch = false)
{
if (is_array($validate)) {
$v = new Validate();
$v->rule($validate);
} else {
if (strpos($validate, '.')) {
// 支持场景
[$validate, $scene] = explode('.', $validate);
}
$class = false !== strpos($validate, '\\') ? $validate : $this->app->parseClass('validate', $validate);
$v = new $class();
if (!empty($scene)) {
$v->scene($scene);
}
}
$v->message($message);
// 是否批量验证
if ($batch || $this->batchValidate) {
$v->batch(true);
}
return $v->failException(true)->check($data);
}
public function Success($data,$code=200,$message='請求成功',$type='json',$header=[]){
$result = [
'code' => $code,
'message' => $message,
'time'=>time(),
'data'=>$data
];
return Response::create($result,$type)->header($header);
}
public function Error($data,$code=500,$message='請求失敗',$type='json',$header=[]){
$result = [
'code' => $code,
'message' => $message,
'time'=>time(),
'data'=>$data
];
return Response::create($result,$type)->header($header);
}
}

@ -0,0 +1,342 @@
<?php
namespace app\appapi\controller\v1;
use app\appapi\ApiController;
use think\facade\Db;
use think\facade\Session;
use think\facade\Log;
use Lcobucci\JWT\Parser;
use thans\jwt\facade\JWTAuth;
use GuzzleHttp\Client;
use app\common\lib\Vcard;
use app\common\lib\Aes;
use app\common\lib\Sign;
class Auth extends ApiController
{
/**
* return 200 成功
* 201 不是會員
*/
public function lineLogin(){
$id_token = input('token');
$line_id = input('line_id');
// $profile = (new Parser())->parse($id_token);
// print_r($token->getClaim('name'));
//驗證id_token
$user=Db::name('user')
->where('line_id',$line_id)
->find();
if(!$user){
return $this->success('非會員',201);
}
$token = JWTAuth::builder(
[
'id' => $user['id'],
'user_id' => $user['user_id'],
'level' => $user['level']
]);
if(empty($user['uniqid'])){
return $this->success(['uid'=>$user['user_id'],'token'=>'Bearer '.$token],202);
}
return $this->success(['uid'=>$user['user_id'],'token'=>'Bearer '.$token]);
}
public function bindCard(){
$uid = input('uid');
$verify = input('verify');
try{
Db::name('user')
->where('user_id',$uid)
->update(['uniqid'=>$verify]);
Db::name('precard')
->where('verify_code',$verify)
->update(['status'=>2]);
return $this->success('綁定成功');
}catch(\Exception $e){
return $this->error('綁定失敗');
}
}
public function checkLineId(){
$line_id=input('lineid');
$user = Db::name('user')
->where('line_id',$line_id)
->find();
if($user){
return $this->error('會員已存在');
}
return $this->success('檢查成功');
}
public function register(){
$data = input();
unset($data['version']);
unset($data['controller']);
unset($data['action']);
unset($data['uid']);
unset($data['userid']);
unset($data['verify']);
unset($data['token']);
$data=array_map('asc_trim',$data);
// //檢查line id是否己經是會員
// //TODO
// $user=Db::name('user')
// ->where('line_id',input('line_id'))
// ->find();
// if($user){
// return $this->error('已是會員',501);
// }
//驗證id_token
$verify_line = $this->verifyIdToken(input('token'));
if(!$verify_line){
return $this->error('id token expire',500);
}
$data['line_name'] = $verify_line['name'];
$data['line_picture'] = $verify_line['picture'];
$data['real_name'] = $verify_line['name'];
//新增User至Oss Server
$user_data = [
'appid' => 'sc',
'line_id' => $verify_line['sub'],
'line_name' => $data['line_name'],
'line_picture' => $data['line_picture'],
'phone' => $data['phone'],
'real_name' => $data['line_name'],
'timestamp' => time()
];
$sign = Sign::genSign($user_data);
$user_data['sign'] = $sign;
$client = new Client([
'base_uri' => 'https://sso.h888.fun/api/v1/'
]);
$response = $client->post('user/add',[
'form_params' => $user_data
]);
if($response->getStatusCode()!=200){
return $this->error('上傳SSO SERVER 失敗');
}
$sso_data = json_decode($response->getBody()->getContents(),true)['data'];
//推薦人
// if(strlen($data['refer'])>0){
// $pid = decodeRefer($data['refer']);
// $data['parent_id'] = $pid;
// }else{
// $data['parent_id'] = 0;
// }
// unset($data['refer']);
//預製卡
if(input('verify')){
$action = 'openright';
$user_id=genUniqid();
$data['user_id'] = $user_id;
$data['uniqid'] = input('verify');
$precard = Db::name('precard')
->where('verify_code',input('verify'))
->find();
if(!$precard){
return $this->error('查無預開卡',401);
}
$data['agent_id'] = $precard['agent_id'];
//TODO
}else{
$action = 'register';
if(!isset($data['aid'])){
$data['agent_id'] = 1;
}else{
$data['agent_id'] = Db::name('agent')->where('prefix',$data['aid'])->value('id');
unset($data['aid']);
}
$data['user_id'] = $sso_data['uid'];
}
$agent = Db::name('agent')->where('id',$data['agent_id'])->find();
if($agent['try_days']==0){
$data['status'] = 1;
$data['level'] = $agent['base_level'];
$data['overdue_time'] = strtotime(date('Y-m-d',time() + (60 * 60 * 24 * $agent['base_days'])));
}else{
$data['status'] = 2;
$data['level'] = $agent['try_level'];
$data['overdue_time'] = strtotime(date('Y-m-d',time() + (60 * 60 * 24 * $agent['try_days'])));
}
if($agent['parent_id']==0){
$data['agent_id'] = $agent['id'];
}else{
$data['agent_id'] = $agent['parent_id'];
}
$level_option = Db::name('user_level')
->where('agent_id',$data['agent_id'])
->where('level_id',$data['level'])
->find();
$data['nc_type']=$level_option['nc_type'];
$data['nc_func']=$level_option['nc_func'];
$data['cus_card'] = '';
$data['create_time'] = date('Y-m-d H:i:s');
try{
$id = Db::name('user')
->insertGetId($data);
// $refer_code = encodeRefer($id);
// $result = Db::name('user')
// ->where('id',$id)
// ->update(['code'=>$refer_code]);
$qrcodeUrl = genQrCode('https://'.$_SERVER['HTTP_HOST'].'/home/?aid='.$agent['prefix'],$data['user_id'],'refer');
$aes = new Aes([]);
$params = urlencode($aes->encrypt('user_id='.$data['user_id'].'&verify_code='.input('verify')));
$nfcUrl = genQrCode('https://'.$_SERVER['HTTP_HOST'].'/card/?params='.$params,$data['user_id'],'nfc');
Vcard::genVcf($data['user_id']);
if($action == 'openright'){
Db::name('precard')
->where('verify_code',input('verify'))
->update(['status'=>2]);
}
return $this->success(['uid'=>$data['user_id'],'token'=>'Bearer'.$sso_data['token']]);
}catch(\Exception $e){
print_r($e);
return $this->error('註冊失敗');
}
}
private function verifyIdToken($token){
try{
$client = new Client();
$response = $client->request('POST', 'https://api.line.me/oauth2/v2.1/verify', [
'form_params' => [
'id_token' => $token,
'client_id'=> env('utel.line_channel_id')
]
]);
$body = $response->getBody()->getContents();
return json_decode($body, true);
} catch (\Exception $e) {
return false;
}
// print_r($response);
// $body = $response->getBody()->getContents();
// print_r($body);
}
private function saveLineImage($pictureUrl,$uid)
{
if($pictureUrl){
$curl = curl_init($pictureUrl);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
$imageData=curl_exec($curl);
curl_close($curl);
$filename=$uid."_line.jpg";
$filedir=$_SERVER['DOCUMENT_ROOT'].'/storage/'.$uid;
if (!file_exists($filedir)) {
mkdir($filedir , 0777 , true);
}
$fp=fopen($filedir.'/'.$filename,'a');
fwrite($fp,$imageData);
fclose($fp);
return $filename;
}else{
return false;
}
}
public function getSiteConfig(){
$result = Db::name('site_config')
->where('parent_id','<>',0)
->select();
foreach($result as $key => $val){
$rtn[$val['code']]=$val['value'];
}
return $this->success($rtn);
}
public function uploadAvatar(){
$files = request()->file('file');
$savename = \think\facade\Filesystem::disk('public')->putFile( 'temp' , $files);
$avatar = getUrl().'/storage/'.$savename;
// Db::name('user')
// ->where('user_id',input('user_id'))
// ->update(['avatar'=>$avatar]);
return $this->Success($avatar);
}
public function test(){
Vcard::genVcf('mc63de2a162b218');
}
}

@ -0,0 +1,246 @@
<?php
namespace app\appapi\controller\v1;
use app\appapi\ApiController;
use think\facade\Db;
use app\common\lib\Aes;
use app\common\lib\Vcard;
class Card extends ApiController
{
/**
* 檢查nfc用户
*
* @author wayne <wwayne.hsu@gmail.com>
*
* @param string token 加密參數
*
* @return json
*/
public function checkUser(){
$token = input('token');
if(!$token){
return $this->error('參數錯誤');
}
$aes = new Aes([]);
parse_str($aes->descrypt($token),$params);
if(!isset($params['verify_code'])){
if(!isset($params['user_id'])){
return $this->error('參數錯誤');
}
$user_id = $params['user_id'];
}else{
if(strlen($params['verify_code'])>0){
$user_id = getUseridByCuid(strtoupper($params['verify_code']));
}else{
return $this->error('參數錯誤');
}
}
if($user_id){
Db::name('user')
->where('user_id',$user_id)
->inc('nfc_count')
->update();
return $this->success($user_id);
}
//檢查是否為預開卡會員
$is_precard=Db::name('precard')
->where('verify_code',strtoupper($params['verify_code']))
->count();
if($is_precard){
return $this->success(['verify'=>strtoupper($params['verify_code'])],201);
}
return $this->error('請求錯誤');
}
public function getCard(){
$do=Db::name('user');
if(input('userid')){
$do->where('user_id',input('userid'));
}elseif(input('line_id')){
$do->where('line_id',input('line_id'));
}else{
return $this->error('查無會員資料');
}
$user = $do->find();
if(!$user){
return $this->error('查無會員資料');
}
$aes = new Aes([]);
if(strlen($user['uniqid'])>0){
$params = urlencode($aes->encrypt('verify_code='.$user['uniqid']));
}else{
$params = urlencode($aes->encrypt('user_id='.$user['user_id']));
}
$user['nfcurl'] = getUrl().'/card/?params='.$params;
$result = [
"address" => $user['address']?$user['address']:' ',
"company" => $user['company']?$user['company']:' ',
"email" => $user['email']?$user['email']:' ',
"logo" => "https://i.imgur.com/GclvYFK.png",
"maps" => "https://www.google.com/maps/search/?api=1&query_place_id=ChIJAaZEqCYWaTQRMv6fuIsJEuo&query=%E5%BE%AE%E7%A8%8B%E5%BC%8F%E8%B3%87%E8%A8%8A&openExternalBrowser=1",
"name" => $user['real_name']?$user['real_name']:' ',
"phone" => $user['phone']?$user['phone']:' ',
"tel" => $user['tel']?$user['tel']:' ',
"title" => $user['title']?$user['title']:' ',
"url" => $user['url']?$user['url']:' ',
"line" => $user['line']?$user['line']:'',
"facebook" => $user['facebook']?$user['facebook']:'',
"youtube" => $user['youtube']?$user['youtube']:'',
"ig" => $user['ig']?$user['ig']:'',
"level" => $user['level']?$user['level']:0,
"user_id" => $user['user_id']?$user['user_id']:'',
"line_picture" => $user['line_picture']?$user['line_picture']:'',
"avatar" => $user['avatar']?$user['avatar']:'',
"card_title" => $user['card_title']?$user['card_title']:'',
"has_cuscard" => strlen($user['cus_card'])?1:0,
"nc_type" => $user['nc_type']?$user['nc_type']:0,
"nc_func" => explode(',',$user['nc_func']),
"nc_template" => $user['nc_template'],
"mark" => nl2br($user['mark']),
"nfcurl" => $user['nfcurl'],
"show_cus" => $user['show_cus'],
"nfc_addon" => json_decode($user['nfc_addon'])
];
return $this->Success($result);
}
public function getCusCard(){
$data=input();
unset($data['version']);
unset($data['controller']);
unset($data['action']);
try{
$do=Db::name('user');
if(input('userid')){
$do->where('user_id',input('userid'));
}elseif(input('line_id')){
$do->where('line_id',input('line_id'));
}else{
return $this->error('查無會員資料');
}
$card = $do->field('cus_card,card_title')
->find();
}catch(Exception $e){
return $this->error('操作失敗');
}
return $this->success($card);
}
public function getVipCard(){
$data=input();
unset($data['version']);
unset($data['controller']);
unset($data['action']);
try{
$do=Db::name('user_card');
if(input('userid')){
$id = getIdByUid(input('userid'));
}elseif(input('line_id')){
$id = getIdByUid(input('lineid'));
}else{
return $this->error('查無會員資料');
}
$do->where('user_id',$id);
$card = $do->field('*')
->select();
}catch(Exception $e){
return $this->error('操作失敗');
}
return $this->success($card);
}
public function updateCard(){
$data=input();
unset($data['uid']);
unset($data['version']);
unset($data['controller']);
unset($data['action']);
unset($data['nfcurl']);
unset($data['agent_prefix']);
unset($data['level_name']);
unset($data['addon']);
unset($data['delete_time']);
if(!empty(input('addon'))){
$data['nfc_addon']=json_encode(input('addon'));
}else{
$data['nfc_addon']='';
}
try{
Db::name('user')
->where('user_id',$data['user_id'])
->update($data);
Vcard::genVcf($data['user_id']);
}catch(Exception $e){
return $this->error('操作失敗');
}
return $this->success(['code'=>200]);
}
public function updateCusCard(){
$data=input();
unset($data['version']);
unset($data['controller']);
unset($data['action']);
$data['show_cus'] = input('show_cus')?1:0;
try{
Db::name('user')
->where('user_id',$data['user_id'])
->update(['card_title'=>$data['card_title'],'show_cus'=>$data['show_cus'],'cus_card'=>$data['cus_card']]);
}catch(Exception $e){
return $this->error('操作失敗');
}
return $this->success(['code'=>200]);
}
public function uploadFile(){
// print_r(input());
$files = request()->file('file');
$savename = \think\facade\Filesystem::disk('public')->putFile( 'card', $files);;
$image_url = getUrl().'/storage/'.$savename;
return $this->success($image_url);
}
}

@ -0,0 +1,250 @@
<?php
namespace app\appapi\controller\v1;
use app\appapi\ApiController;
use think\facade\Db;
use GuzzleHttp\Client;
use app\common\lib\Aes;
use app\common\lib\Sign;
class User extends ApiController
{
public function getUserInfo(){
$user=Db::name('user')
->where('user_id',$this->uid)
->find();
//使用者不存在,至SSO Server取得
if(!$user){
$user_data = [
'appid' => 'sc',
'user_id' => $this->uid,
'timestamp' => time()
];
$sign = Sign::genSign($user_data);
$user_data['sign'] = $sign;
$client = new Client([
'base_uri' => 'https://sso.h888.fun/api/v1/'
]);
$response = $client->get('user/getInfo?'.http_build_query($user_data));
if($response->getStatusCode()!=200){
return $this->error('get sso user info error!!!');
}
$sso_data = json_decode($response->getBody()->getContents(),true)['data'];
try{
$sso_data['cus_card']='';
Db::name('user')
->insert($sso_data);
$user=Db::name('user')
->where('user_id',$this->uid)
->find();
}catch(\Exception $e){
return $this->error('sync sso user info error!!!');
}
}
$aes = new Aes([]);
if(strlen(trim($user['uniqid']))>0){
$params = urlencode($aes->encrypt('verify_code='.$user['uniqid']));
}else{
$params = urlencode($aes->encrypt('user_id='.$user['user_id']));
}
// $user['level_name'] = Db::name('user_level')->where('agent_id',$user['agent_id'])->where('level_id',$user['level'])->value('name');
switch($user['level']){
case 0:
$user['level_name']='未付費用戶';
break;
case 1:
$user['level_name']='付費用戶';
break;
default:
break;
}
$user['nfcurl'] = getUrl().'/card/?params='.$params;
$user['nc_func'] = explode(',',$user['nc_func']);
$user['agent_prefix'] = Db::name('agent')->where('id',$user['agent_id'])->value('prefix');
return $this->Success($user);
}
public function getUserCompany(){
if(!$this->uid){
$this->error('用戶ID錯誤');
}
$result = Db::name('user_company')
->where('user_id',$this->uid)
->select();
return $this->success($result);
}
public function addUserCompany(){
if(!$this->uid){
$this->error('用戶ID錯誤');
}
$ucData = input('post.');
$ucData['user_id'] = $this->uid;
unset($ucData['uid']);
try{
if(isset($ucData['is_default']) && $ucData['is_default']){
Db::name('user_company')
->where('user_id',$this->uid)
->update(['is_default'=>0]);
Db::name('user')
->where('user_id',$this->uid)
->update([
'company' => $ucData['uc_name'],
'title' => $ucData['uc_title'],
'tel' => $ucData['uc_tel'],
'address' => $ucData['uc_address'],
'url' => $ucData['uc_url'],
]);
}
Db::name('user_company')
->insert($ucData);
$result = Db::name('user_company')
->where('user_id',$this->uid)
->select();
return $this->success($result);
}catch(\Exception $e){
print_r($e);
return $this->error('操作錯誤');
}
}
public function updateUserCompany(){
if(!$this->uid){
$this->error('用戶ID錯誤');
}
try{
Db::name('user_company')
->where('user_id',$this->uid)
->update(['is_default'=>0]);
Db::name('user_company')
->where('id',input('id'))
->update(['is_default'=>1]);
$res = Db::name('user_company')
->where('id',input('id'))
->find();
Db::name('user')
->where('user_id',$this->uid)
->update([
'company' => $res['uc_name'],
'title' => $res['uc_title'],
'tel' => $res['uc_tel'],
'address' => $res['uc_address'],
'url' => $res['uc_url'],
]);
//更新用戶資料
$result = Db::name('user_company')
->where('user_id',$this->uid)
->select();
return $this->success($result);
}catch(\Exception $e){
print_r($e);
return $this->error('操作錯誤');
}
}
public function deleteUserCompany(){
if(!$this->uid){
$this->error('用戶ID錯誤');
}
try{
Db::name('user_company')
->where('id',input('id'))
->delete();
//更新用戶資料
$result = Db::name('user_company')
->where('user_id',$this->uid)
->select();
return $this->success($result);
}catch(\Exception $e){
return $this->error('操作錯誤');
}
}
public function setUserLevel(){
$result=Db::name('user')
->where('user_id',$this->uid)
->update(['level'=>input('level')]);
return $this->Success($result);
}
public function setUserTpl(){
try{
$result=Db::name('user')
->where('user_id',$this->uid)
->update(['nc_template'=>input('tpl')]);
}catch(\Excenption $e){
return $this->Error('更新失敗');
}
return $this->Success($result);
}
public function uploadAvatar(){
$files = request()->file('file');
$savename = \think\facade\Filesystem::disk('public')->putFile( input('user_id'), $files);
$avatar = getUrl().'/storage/'.$savename;
// Db::name('user')
// ->where('user_id',input('user_id'))
// ->update(['avatar'=>$avatar]);
return $this->Success($avatar);
}
public function updateSendCount(){
$user_id = input('userid');
Db::name('user')
->where('user_id',input('userid'))
->exp('send_count', 'send_count+1')
->update();
// ->inc('send_count',1);
return $this->Success('更新成功');
}
}

@ -0,0 +1,6 @@
<?php
return [
\think\middleware\SessionInit::class,
\think\middleware\AllowCrossDomain::class,
// app\api\middleware\CheckSiteCode::class
];

@ -0,0 +1,62 @@
<?php
declare (strict_types=1);
namespace app\appapi\middleware;
use thans\jwt\exception\JWTException;
use thans\jwt\exception\TokenBlacklistException;
use thans\jwt\exception\TokenBlacklistGracePeriodException;
use thans\jwt\exception\TokenExpiredException;
use thans\jwt\middleware\JWTAuth;
use think\exception\HttpException;
/**
* JWT驗證刷新token機制
* Class JWTToken
* @package app\api\middleware
*/
class JWT extends JWTAuth
{
/**
* 刷新token
* @param $request
* @param \Closure $next
* @return mixed
* @throws JWTException
* @throws TokenBlacklistException
* @throws TokenBlacklistGracePeriodException
*/
public function handle($request, \Closure $next): object
{
try {
$payload = $this->auth->auth();
} catch (TokenExpiredException $e) { // token過期
// 嘗試刷新token會將舊token加入黑名單
try {
$this->auth->setRefresh();
$token = $this->auth->refresh();
$payload = $this->auth->auth(false);
} catch (TokenBlacklistGracePeriodException $e) {
$payload = $this->auth->auth(false);
} catch (JWTException $exception) {
// 如果捕獲到此異常,即代表 refresh 也過期了,用户無法刷新令牌,需要重新登錄。
throw new HttpException(401, $exception->getMessage());
}
} catch (TokenBlacklistGracePeriodException $e) { // 捕獲黑名單寬限期
$payload = $this->auth->auth(false);
} catch (TokenBlacklistException $e) { // 捕獲黑名單退出登錄或者已經自動刷新當前token就會被拉黑
throw new HttpException(401, 'not login...');
}
$request->uid = $payload['user_id']->getValue();
$response = $next($request);
if (isset($token)) {
$this->setAuthentication($response, $token);
}
return $response;
}
}

@ -0,0 +1,10 @@
<?php
use think\facade\Route;
Route::group(function () {
// Route::rule(':version/user/:action', 'appapi/:version.user/:action');
// Route::rule(':version/user/:action', 'api/:version.user/:action');
})->middleware(\app\api\middleware\JWT::class);
Route::rule(':version/:controller/:action','appapi/:version.:controller/:action');

@ -0,0 +1,60 @@
<?php
declare (strict_types = 1);
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\facade\Db;
class CheckExpire extends Command
{
protected function configure()
{
// 指令配置
$this->setName('checkexpire')
->setDescription('the checkexpire command');
}
protected function execute(Input $input, Output $output)
{
// 取得代理資料
$t_agents = Db::name('agent')->select();
foreach($t_agents as $val){
$agents[$val['id']] = $val;
}
// 取得過期用戶
$e_users = Db::name('user')
->where('status',1)
->where('overdue_time','<',time())
->select();
// 更新過期用戶
foreach($e_users as $val){
$data['level']=0;
$data['status']=1;
$level_option = Db::name('user_level')
->where('agent_id',$val['agent_id'])
->where('level_id',$data['level'])
->find();
$data['nc_type']=$level_option['nc_type'];
$data['nc_func']=$level_option['nc_func'];
Db::name('user')
->where('id',$val['id'])
->update($data);
}
// 指令输出
$output->writeln('checkexpire');
}
}

@ -0,0 +1,62 @@
<?php
declare (strict_types = 1);
namespace app\command;
use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;
use think\facade\Db;
class CheckTrial extends Command
{
protected function configure()
{
// 指令配置
$this->setName('checktrial')
->setDescription('the checktrial command');
}
protected function execute(Input $input, Output $output)
{
// 取得代理資料
$t_agents = Db::name('agent')
->select();
foreach($t_agents as $val){
$agents[$val['id']] = $val;
}
// 取得試用過期用戶
$e_users = Db::name('user')
->where('status',2)
->where('overdue_time','<',time())
->select();
// 更新試用過期用戶
foreach($e_users as $val){
$data['overdue_time']=strtotime("+".$agents[$val['agent_id']]['base_days']." days");
$data['level']=$agents[$val['agent_id']]['base_level'];
$level_option = Db::name('user_level')
->where('agent_id',$val['agent_id'])
->where('level_id',$data['level'])
->find();
$data['nc_type']=$level_option['nc_type'];
$data['nc_func']=$level_option['nc_func'];
$data['status']=1;
print_r($data);
Db::name('user')
->where('id',$val['id'])
->update($data);
}
// 指令输出
$output->writeln('檢查試用會員完成');
}
}

@ -0,0 +1,202 @@
<?php
// 應用公共文件
use think\facade\Db;
function getUrl(){
// $protocol = ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
$protocol = 'https://';
$http = $_SERVER['HTTP_HOST'];
return $protocol.$http;
}
function getIdByUid($uid){
$id =Db::name('user')
->where('user_id',$uid)
->value('id');
if(!$id){
return false;
}
return $id;
}
function getIdByLid($lid){
$id =Db::name('user')
->where('line_id',$lid)
->value('id');
if(!$id){
return false;
}
return $id;
}
function getUseridByCuid($cuid){
$id =Db::name('user')
->where('uniqid',$cuid)
->value('user_id');
if(!$id){
return false;
}
return $id;
}
function genUniqid($prefix='mc'){
$is_get = false;
while(!$is_get){
$uniqid = $prefix.uniqid();
$result1 = Db::name('user')
->where('user_id',$uniqid)
->count();
$result2 = Db::name('precard')
->where('user_id',$uniqid)
->count();
if(!$result1 && !$result2){
$is_get=true;
}
}
return $uniqid;
}
/**
* 取得開通序號
*
* @author ayne <wwayne.hsu@gmail.com>
*
* @param integer $num 數量
*
* @return array
*/
function genSerialNo(){
$code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$rand = $code[rand(0,25)]
.strtoupper(dechex(date('m')))
.date('d').substr(time(),-5)
.substr(microtime(),2,5)
.sprintf('%02d',rand(0,99));
for(
$a = md5( $rand, true ),
$s = '0123456789ABCDEFGHIJKLMNOPQRSTUV',
$d = '',
$f = 0;
$f < 8;
$g = ord( $a[ $f ] ),
$d .= $s[ ( $g ^ ord( $a[ $f + 8 ] ) ) - $g & 0x1F ],
$f++
);
return $d;
}
function encodeRefer($userId)
{
$sourceString = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
$code = '';
while ($userId > 0) {
$mod = $userId % 35;
$userId = ($userId - $mod) / 35;
$code = $sourceString[$mod] . $code;
}
if (strlen($code) < 8)
$code = str_pad($code, 8, '0', STR_PAD_LEFT);
return $code;
}
function decodeRefer($code)
{
$sourceString = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
//移除左側的 0
if (strrpos($code, '0') !== false)
$code = substr($code, strrpos($code, '0') + 1);
$len = strlen($code);
$code = strrev($code);
$num = 0;
for ($i = 0; $i < $len; $i++) {
$num += strpos($sourceString, $code[$i]) * pow(35, $i);
}
return $num;
}
/**
* 功能:生成二維碼
* @param string $qrData 手機掃描後要跳轉的網址
* @param string $qrLevel 預設糾錯比例 分為L、M、Q、H四個等級H代表最高糾錯能力
* @param string $qrSize 二維碼圖大小110可選數字越大圖片尺寸越大
* @param string $savePath 圖片儲存路徑
* @param string $savePrefix 圖片名稱字首
*/
function createQRcode($savePath, $qrData = 'QR Code :)', $qrLevel = 'L', $qrSize = 4, $savePrefix = 'qrcode')
{
if (!isset($savePath)) return '';
//設定生成png圖片的路徑
$PNG_TEMP_DIR = $savePath;
//檢測並建立生成資料夾
if (!file_exists($PNG_TEMP_DIR)) {
mkdir($PNG_TEMP_DIR);
}
$filename = $PNG_TEMP_DIR . '/qrcode_temp.png';
$errorCorrectionLevel = 'L';
if (isset($qrLevel) && in_array($qrLevel, ['L', 'M', 'Q', 'H'])) {
$errorCorrectionLevel = $qrLevel;
}
$matrixPointSize = 4;
if (isset($qrSize)) {
$matrixPointSize = min(max((int)$qrSize, 1), 10);
}
if (isset($qrData)) {
if (trim($qrData) == '') {
die('data cannot be empty!');
}
//生成檔名 檔案路徑+圖片名字字首+md5(名稱)+.png
$filename = $PNG_TEMP_DIR . $savePrefix . '_qrcode.png';
//開始生成
\PHPQRCode\QRcode::png($qrData, $filename, $errorCorrectionLevel, $matrixPointSize, 2);
} else {
//預設生成
\PHPQRCode\QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, $matrixPointSize, 2);
}
if (file_exists($PNG_TEMP_DIR . basename($filename)))
return basename($filename);
else
return FALSE;
}
function genQrCode($url,$user_id,$prefix)
{
//$savePath 圖片儲存路徑
$savePath = $_SERVER['DOCUMENT_ROOT'].'/storage/'.$user_id.'/';
//路徑
$webPath = str_replace($_SERVER['DOCUMENT_ROOT'], '', $savePath);
//$qrData 手機掃描後要跳轉的網址
$qrData = $url;
// $qrLevel 預設糾錯比例 分為L、M、Q、H四個等級H代表最高糾錯能力
$qrLevel = 'H';
//$qrSize 二維碼圖大小110可選數字越大圖片尺寸越大
$qrSize = '4';
// $savePrefix 圖片名稱字首
$savePrefix = $user_id.'_'.$prefix;
$pic = '';
$filename = createQRcode($savePath, $qrData, $qrLevel, $qrSize, $savePrefix);
if($filename = createQRcode($savePath, $qrData, $qrLevel, $qrSize, $savePrefix)){
$pic = $webPath . $filename;
return $pic;
}
return false;
}
function asc_trim($val){
if(!is_array($val)){
return trim($val);
}else{
return $val;
}
}

@ -0,0 +1,29 @@
<?php
namespace app\common\lib;
class Aes{
private $key = 'iloveutel';
private $iv = '1234567890123456';
private $method = 'AES-128-CBC';
/**
* 構造方法
*/
public function __construct($config){
foreach($config as $k=>$v){
$this->$k = $v;
}
}
// 加密
public function encrypt($data){
return base64_encode(openssl_encrypt($data, $this->method,$this->key, OPENSSL_RAW_DATA , $this->iv));
}
//解密
public function descrypt($data){
return openssl_decrypt(base64_decode($data), $this->method, $this->key, OPENSSL_RAW_DATA, $this->iv);
}
}

@ -0,0 +1,17 @@
<?php
namespace app\common\lib;
class Sign{
public static function genSign($data = []) {
ksort($data);
$string = md5(md5(strtolower(http_build_query($data))).'seckey');
return $string;
}
}
?>

@ -0,0 +1,51 @@
<?php
namespace app\common\lib;
use think\facade\Db;
use JeroenDesloovere\VCard\VCard as VCardApi;
class Vcard{
public static function genVcf($userid){
$userInfo = Db::name('user')->where('user_id',$userid)->find();
if(!$userInfo){
return false;
}
$vcard = new VCardApi();
$lastname = $userInfo['real_name'];
$firstname = '';
$additional = '';
$prefix = '';
$suffix = '';
$vcard->addName($lastname, $firstname, $additional, $prefix, $suffix);
// add work data
$vcard->addCompany($userInfo['company']);
$vcard->addJobtitle($userInfo['title']);
// $vcard->addRole('Data Protection Officer');
$vcard->addEmail($userInfo['email']);
$vcard->addPhoneNumber($userInfo['phone'], 'PREF;CELL');
$vcard->addPhoneNumber($userInfo['tel'], 'WORK');
// $vcard->addAddress(null, null, 'street', 'worktown', null, 'workpostcode', 'Belgium');
// $vcard->addLabel('street, worktown, workpostcode Belgium');
if($userInfo['url']){
// $vcard->addURL(getUrl().'/card/?userid='.$userInfo['user_id']);
$vcard->addURL($userInfo['url']);
}
// $vcard->addPhoto(__DIR__.'/../../../public/storage/'.$userInfo['user_id'].'/'.$userInfo['user_id'].'_line.jpg');
// return vcard as a string
//return $vcard->getOutput();
// return vcard as a download
// return $vcard->download();
$vcard->setSavePath(__DIR__.'/../../../public/storage/'.$userInfo['user_id'].'/');
$vcard->setFilename($userInfo['user_id']);
$vcard->save();
return true;
}
}

@ -0,0 +1,12 @@
<?php
namespace app\controller;
use app\BaseController;
class Index extends BaseController
{
public function index()
{
return redirect('/home');
}
}

@ -0,0 +1,19 @@
<?php
namespace app\controller;
use app\BaseController;
use think\facade\Db;
use app\common\lib\Vcard;
class Vcf extends BaseController
{
public function index(){
$userid=input('userid');
$userid='mc622b0cda299c6';
Vcard::genVcf($userid);
}
}

@ -0,0 +1,17 @@
<?php
// 事件定义文件
return [
'bind' => [
],
'listen' => [
'AppInit' => [],
'HttpRun' => [],
'HttpEnd' => [],
'LogLevel' => [],
'LogWrite' => [],
],
'subscribe' => [
],
];

@ -0,0 +1,10 @@
<?php
// 全局中间件定义文件
return [
// 全局请求缓存
// \think\middleware\CheckRequestCache::class,
// 多语言加载
// \think\middleware\LoadLangPack::class,
// Session初始化
// \think\middleware\SessionInit::class
];

@ -0,0 +1,9 @@
<?php
use app\ExceptionHandle;
use app\Request;
// 容器Provider定义文件
return [
'think\Request' => Request::class,
'think\exception\Handle' => ExceptionHandle::class,
];

@ -0,0 +1,9 @@
<?php
use app\AppService;
// 系统服务定义文件
// 服务在完成全局初始化之后执行
return [
AppService::class,
];

@ -0,0 +1,54 @@
{
"name": "topthink/think",
"description": "the new thinkphp framework",
"type": "project",
"keywords": [
"framework",
"thinkphp",
"ORM"
],
"homepage": "http://thinkphp.cn/",
"license": "Apache-2.0",
"authors": [
{
"name": "liu21st",
"email": "liu21st@gmail.com"
},
{
"name": "yunwuxin",
"email": "448901948@qq.com"
}
],
"require": {
"php": ">=7.2.5",
"topthink/framework": "^6.0.0",
"topthink/think-orm": "^2.0",
"topthink/think-multi-app": "^1.0",
"thans/tp-jwt-auth": "^1.2",
"guzzlehttp/guzzle": "~6.0",
"aferrandini/phpqrcode": "^1.0",
"jeroendesloovere/vcard": "^1.7",
"topthink/think-filesystem": "^2.0"
},
"require-dev": {
"symfony/var-dumper": "^4.2",
"topthink/think-trace":"^1.0"
},
"autoload": {
"psr-4": {
"app\\": "app"
},
"psr-0": {
"": "extend/"
}
},
"config": {
"preferred-install": "dist"
},
"scripts": {
"post-autoload-dump": [
"@php think service:discover",
"@php think vendor:publish"
]
}
}

1796
composer.lock generated

File diff suppressed because it is too large Load Diff

@ -0,0 +1,32 @@
<?php
// +----------------------------------------------------------------------
// | 应用设置
// +----------------------------------------------------------------------
return [
// 应用地址
'app_host' => env('app.host', ''),
// 应用的命名空间
'app_namespace' => '',
// 是否启用路由
'with_route' => true,
// 默认应用
'default_app' => 'index',
// 默认时区
'default_timezone' => 'Asia/Shanghai',
// 应用映射(自动多应用模式有效)
'app_map' => [],
// 域名绑定(自动多应用模式有效)
'domain_bind' => [],
// 禁止URL访问的应用列表自动多应用模式有效
'deny_app_list' => [],
// 异常页面的模板文件
'exception_tmpl' => app()->getThinkPath() . 'tpl/think_exception.tpl',
// 错误显示信息,非调试模式有效
'error_message' => '页面错误!请稍后再试~',
// 显示错误信息
'show_error_msg' => false,
];

@ -0,0 +1,29 @@
<?php
// +----------------------------------------------------------------------
// | 缓存设置
// +----------------------------------------------------------------------
return [
// 默认缓存驱动
'default' => env('cache.driver', 'file'),
// 缓存连接方式配置
'stores' => [
'file' => [
// 驱动方式
'type' => 'File',
// 缓存保存目录
'path' => '',
// 缓存前缀
'prefix' => '',
// 缓存有效期 0表示永久缓存
'expire' => 0,
// 缓存标签前缀
'tag_prefix' => 'tag:',
// 序列化机制 例如 ['serialize', 'unserialize']
'serialize' => [],
],
// 更多的缓存连接
],
];

@ -0,0 +1,11 @@
<?php
// +----------------------------------------------------------------------
// | 控制台配置
// +----------------------------------------------------------------------
return [
// 指令定义
'commands' => [
'checktrial' => app\command\CheckTrial::class,
'checkexpire' => app\command\CheckExpire::class,
],
];

@ -0,0 +1,20 @@
<?php
// +----------------------------------------------------------------------
// | Cookie设置
// +----------------------------------------------------------------------
return [
// cookie 保存时间
'expire' => 0,
// cookie 保存路径
'path' => '/',
// cookie 有效域名
'domain' => '',
// cookie 启用安全传输
'secure' => false,
// httponly设置
'httponly' => false,
// 是否使用 setcookie
'setcookie' => true,
// samesite 设置,支持 'strict' 'lax'
'samesite' => '',
];

@ -0,0 +1,63 @@
<?php
return [
// 默认使用的数据库连接配置
'default' => env('database.driver', 'mysql'),
// 自定义时间查询规则
'time_query_rule' => [],
// 自动写入时间戳字段
// true为自动识别类型 false关闭
// 字符串则明确指定时间字段类型 支持 int timestamp datetime date
'auto_timestamp' => true,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 时间字段配置 配置格式create_time,update_time
'datetime_field' => '',
// 数据库连接配置信息
'connections' => [
'mysql' => [
// 数据库类型
'type' => env('database.type', 'mysql'),
// 服务器地址
'hostname' => env('database.hostname', '127.0.0.1'),
// 数据库名
'database' => env('database.database', ''),
// 用户名
'username' => env('database.username', 'root'),
// 密码
'password' => env('database.password', ''),
// 端口
'hostport' => env('database.hostport', '3306'),
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => env('database.charset', 'utf8'),
// 数据库表前缀
'prefix' => env('database.prefix', ''),
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 是否需要断线重连
'break_reconnect' => false,
// 监听SQL
'trigger_sql' => env('app_debug', true),
// 开启字段缓存
'fields_cache' => false,
],
// 更多的数据库配置信息
],
];

@ -0,0 +1,24 @@
<?php
return [
// 默认磁盘
'default' => env('filesystem.driver', 'local'),
// 磁盘列表
'disks' => [
'local' => [
'type' => 'local',
'root' => app()->getRuntimePath() . 'storage',
],
'public' => [
// 磁盘类型
'type' => 'local',
// 磁盘路径
'root' => app()->getRootPath() . 'public/storage',
// 磁盘路径对应的外部URL路径
'url' => '/storage',
// 可见性
'visibility' => 'public',
],
// 更多的磁盘配置信息
],
];

@ -0,0 +1,21 @@
<?php
return [
'secret' => env('JWT_SECRET'),
//Asymmetric key
'public_key' => env('JWT_PUBLIC_KEY'),
'private_key' => env('JWT_PRIVATE_KEY'),
'password' => env('JWT_PASSWORD'),
//JWT time to live
'ttl' => env('JWT_TTL', 60),
//Refresh time to live
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160),
//JWT hashing algorithm
'algo' => env('JWT_ALGO', 'HS256'),
//token获取方式数组靠前值优先
'token_mode' => ['header', 'cookie', 'param'],
//黑名单后有效期
'blacklist_grace_period' => env('BLACKLIST_GRACE_PERIOD', 10),
'blacklist_storage' => thans\jwt\provider\storage\Tp5::class,
];

@ -0,0 +1,27 @@
<?php
// +----------------------------------------------------------------------
// | 多语言设置
// +----------------------------------------------------------------------
return [
// 默认语言
'default_lang' => env('lang.default_lang', 'zh-cn'),
// 允许的语言列表
'allow_lang_list' => [],
// 多语言自动侦测变量名
'detect_var' => 'lang',
// 是否使用Cookie记录
'use_cookie' => true,
// 多语言cookie变量
'cookie_var' => 'think_lang',
// 多语言header变量
'header_var' => 'think-lang',
// 扩展语言包
'extend_list' => [],
// Accept-Language转义为对应语言包名称
'accept_language' => [
'zh-hans-cn' => 'zh-cn',
],
// 是否支持语言分组
'allow_group' => false,
];

@ -0,0 +1,45 @@
<?php
// +----------------------------------------------------------------------
// | 日志设置
// +----------------------------------------------------------------------
return [
// 默认日志记录通道
'default' => env('log.channel', 'file'),
// 日志记录级别
'level' => [],
// 日志类型记录的通道 ['error'=>'email',...]
'type_channel' => [],
// 关闭全局日志写入
'close' => false,
// 全局日志处理 支持闭包
'processor' => null,
// 日志通道列表
'channels' => [
'file' => [
// 日志记录方式
'type' => 'File',
// 日志保存目录
'path' => '',
// 单文件日志写入
'single' => false,
// 独立日志级别
'apart_level' => [],
// 最大日志文件数量
'max_files' => 0,
// 使用JSON格式记录
'json' => false,
// 日志处理
'processor' => null,
// 关闭通道日志写入
'close' => false,
// 日志输出格式化
'format' => '[%s][%s] %s',
// 是否实时写入
'realtime_write' => false,
],
// 其它日志通道配置
],
];

@ -0,0 +1,8 @@
<?php
// 中间件配置
return [
// 别名或分组
'alias' => [],
// 优先级设置,此数组中的中间件会按照数组中的顺序优先执行
'priority' => [],
];

@ -0,0 +1,45 @@
<?php
// +----------------------------------------------------------------------
// | 路由设置
// +----------------------------------------------------------------------
return [
// pathinfo分隔符
'pathinfo_depr' => '/',
// URL伪静态后缀
'url_html_suffix' => 'html',
// URL普通方式参数 用于自动生成
'url_common_param' => true,
// 是否开启路由延迟解析
'url_lazy_route' => false,
// 是否强制使用路由
'url_route_must' => false,
// 合并路由规则
'route_rule_merge' => false,
// 路由是否完全匹配
'route_complete_match' => false,
// 访问控制器层名称
'controller_layer' => 'controller',
// 空控制器名
'empty_controller' => 'Error',
// 是否使用控制器后缀
'controller_suffix' => false,
// 默认的路由变量规则
'default_route_pattern' => '[\w\.]+',
// 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
'request_cache_key' => false,
// 请求缓存有效期
'request_cache_expire' => null,
// 全局请求缓存排除规则
'request_cache_except' => [],
// 默认控制器名
'default_controller' => 'Index',
// 默认操作名
'default_action' => 'index',
// 操作方法后缀
'action_suffix' => '',
// 默认JSONP格式返回的处理方法
'default_jsonp_handler' => 'jsonpReturn',
// 默认JSONP处理方法
'var_jsonp_handler' => 'callback',
];

@ -0,0 +1,19 @@
<?php
// +----------------------------------------------------------------------
// | 会话设置
// +----------------------------------------------------------------------
return [
// session name
'name' => 'PHPSESSID',
// SESSION_ID的提交变量,解决flash上传跨域
'var_session_id' => '',
// 驱动方式 支持file cache
'type' => 'file',
// 存储连接标识 当type使用cache的时候有效
'store' => null,
// 过期时间
'expire' => 1440,
// 前缀
'prefix' => '',
];

@ -0,0 +1,10 @@
<?php
// +----------------------------------------------------------------------
// | Trace设置 开启调试模式后有效
// +----------------------------------------------------------------------
return [
// 内置Html和Console两种方式 支持扩展
'type' => 'Html',
// 读取的日志通道名
'channel' => '',
];

@ -0,0 +1,25 @@
<?php
// +----------------------------------------------------------------------
// | 模板设置
// +----------------------------------------------------------------------
return [
// 模板引擎类型使用Think
'type' => 'Think',
// 默认模板渲染规则 1 解析为小写+下划线 2 全部转换小写 3 保持操作方法
'auto_rule' => 1,
// 模板目录名
'view_dir_name' => 'view',
// 模板后缀
'view_suffix' => 'html',
// 模板文件名分隔符
'view_depr' => DIRECTORY_SEPARATOR,
// 模板引擎普通标签开始标记
'tpl_begin' => '{',
// 模板引擎普通标签结束标记
'tpl_end' => '}',
// 标签库标签开始标记
'taglib_begin' => '{',
// 标签库标签结束标记
'taglib_end' => '}',
];

2
extend/.gitignore vendored

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

6
package-lock.json generated

@ -0,0 +1,6 @@
{
"name": "ecard_api",
"lockfileVersion": 2,
"requires": true,
"packages": {}
}

@ -0,0 +1,349 @@
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
/* Document
========================================================================== */
/**
* 1. Correct the line height in all browsers.
* 2. Prevent adjustments of font size after orientation changes in iOS.
*/
html {
line-height: 1.15; /* 1 */
-webkit-text-size-adjust: 100%; /* 2 */
}
/* Sections
========================================================================== */
/**
* Remove the margin in all browsers.
*/
body {
margin: 0;
}
/**
* Render the `main` element consistently in IE.
*/
main {
display: block;
}
/**
* Correct the font size and margin on `h1` elements within `section` and
* `article` contexts in Chrome, Firefox, and Safari.
*/
h1 {
font-size: 2em;
margin: 0.67em 0;
}
/* Grouping content
========================================================================== */
/**
* 1. Add the correct box sizing in Firefox.
* 2. Show the overflow in Edge and IE.
*/
hr {
box-sizing: content-box; /* 1 */
height: 0; /* 1 */
overflow: visible; /* 2 */
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
pre {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/* Text-level semantics
========================================================================== */
/**
* Remove the gray background on active links in IE 10.
*/
a {
background-color: transparent;
}
/**
* 1. Remove the bottom border in Chrome 57-
* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
*/
abbr[title] {
border-bottom: none; /* 1 */
text-decoration: underline; /* 2 */
text-decoration: underline dotted; /* 2 */
}
/**
* Add the correct font weight in Chrome, Edge, and Safari.
*/
b,
strong {
font-weight: bolder;
}
/**
* 1. Correct the inheritance and scaling of font size in all browsers.
* 2. Correct the odd `em` font sizing in all browsers.
*/
code,
kbd,
samp {
font-family: monospace, monospace; /* 1 */
font-size: 1em; /* 2 */
}
/**
* Add the correct font size in all browsers.
*/
small {
font-size: 80%;
}
/**
* Prevent `sub` and `sup` elements from affecting the line height in
* all browsers.
*/
sub,
sup {
font-size: 75%;
line-height: 0;
position: relative;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
/* Embedded content
========================================================================== */
/**
* Remove the border on images inside links in IE 10.
*/
img {
border-style: none;
}
/* Forms
========================================================================== */
/**
* 1. Change the font styles in all browsers.
* 2. Remove the margin in Firefox and Safari.
*/
button,
input,
optgroup,
select,
textarea {
font-family: inherit; /* 1 */
font-size: 100%; /* 1 */
line-height: 1.15; /* 1 */
margin: 0; /* 2 */
}
/**
* Show the overflow in IE.
* 1. Show the overflow in Edge.
*/
button,
input { /* 1 */
overflow: visible;
}
/**
* Remove the inheritance of text transform in Edge, Firefox, and IE.
* 1. Remove the inheritance of text transform in Firefox.
*/
button,
select { /* 1 */
text-transform: none;
}
/**
* Correct the inability to style clickable types in iOS and Safari.
*/
button,
[type="button"],
[type="reset"],
[type="submit"] {
-webkit-appearance: button;
}
/**
* Remove the inner border and padding in Firefox.
*/
button::-moz-focus-inner,
[type="button"]::-moz-focus-inner,
[type="reset"]::-moz-focus-inner,
[type="submit"]::-moz-focus-inner {
border-style: none;
padding: 0;
}
/**
* Restore the focus styles unset by the previous rule.
*/
button:-moz-focusring,
[type="button"]:-moz-focusring,
[type="reset"]:-moz-focusring,
[type="submit"]:-moz-focusring {
outline: 1px dotted ButtonText;
}
/**
* Correct the padding in Firefox.
*/
fieldset {
padding: 0.35em 0.75em 0.625em;
}
/**
* 1. Correct the text wrapping in Edge and IE.
* 2. Correct the color inheritance from `fieldset` elements in IE.
* 3. Remove the padding so developers are not caught out when they zero out
* `fieldset` elements in all browsers.
*/
legend {
box-sizing: border-box; /* 1 */
color: inherit; /* 2 */
display: table; /* 1 */
max-width: 100%; /* 1 */
padding: 0; /* 3 */
white-space: normal; /* 1 */
}
/**
* Add the correct vertical alignment in Chrome, Firefox, and Opera.
*/
progress {
vertical-align: baseline;
}
/**
* Remove the default vertical scrollbar in IE 10+.
*/
textarea {
overflow: auto;
}
/**
* 1. Add the correct box sizing in IE 10.
* 2. Remove the padding in IE 10.
*/
[type="checkbox"],
[type="radio"] {
box-sizing: border-box; /* 1 */
padding: 0; /* 2 */
}
/**
* Correct the cursor style of increment and decrement buttons in Chrome.
*/
[type="number"]::-webkit-inner-spin-button,
[type="number"]::-webkit-outer-spin-button {
height: auto;
}
/**
* 1. Correct the odd appearance in Chrome and Safari.
* 2. Correct the outline style in Safari.
*/
[type="search"] {
-webkit-appearance: textfield; /* 1 */
outline-offset: -2px; /* 2 */
}
/**
* Remove the inner padding in Chrome and Safari on macOS.
*/
[type="search"]::-webkit-search-decoration {
-webkit-appearance: none;
}
/**
* 1. Correct the inability to style clickable types in iOS and Safari.
* 2. Change font properties to `inherit` in Safari.
*/
::-webkit-file-upload-button {
-webkit-appearance: button; /* 1 */
font: inherit; /* 2 */
}
/* Interactive
========================================================================== */
/*
* Add the correct display in Edge, IE 10+, and Firefox.
*/
details {
display: block;
}
/*
* Add the correct display in all browsers.
*/
summary {
display: list-item;
}
/* Misc
========================================================================== */
/**
* Add the correct display in IE 10+.
*/
template {
display: none;
}
/**
* Add the correct display in IE 10.
*/
[hidden] {
display: none;
}

@ -0,0 +1,222 @@
@charset "utf-8";
body,
div,
dl,
footer,
html,
img,
menu,
p,
span {
margin: 0;
padding: 0;
border: 0;
}
body {
font-size: 14px;
line-height: 1.5;
-webkit-user-select: none;
-webkit-touch-callout: none;
background-color: #fffff6 !important;
padding-bottom: 49px;
}
a,
a:hover,
a:visited {
color: #999;
text-decoration: none;
outline: 0;
}
ul {
margin: 0;
padding: 0;
list-style-type: none;
}
@-webkit-keyframes pop-hide {
0% {
-webkit-transform: scale(0.8);
opacity: 0;
}
2% {
-webkit-transform: scale(1.1);
opacity: 1;
}
6% {
-webkit-transform: scale(1);
}
90% {
-webkit-transform: scale(1);
opacity: 1;
}
100% {
-webkit-transform: scale(0.9);
opacity: 0;
}
}
@-webkit-keyframes pop {
0% {
-webkit-transform: scale(0.8);
opacity: 0;
}
40% {
-webkit-transform: scale(1.1);
opacity: 1;
}
100% {
-webkit-transform: scale(1);
}
}
@-webkit-keyframes slideup {
0% {
-webkit-transform: translateY(100%);
}
40% {
-webkit-transform: translateY(-10%);
}
100% {
-webkit-transform: translateY(0);
}
}
.left {
float: left;
}
.rel {
position: relative;
}
a,
a:visited {
text-decoration: none;
color: #333;
}
.text-icon {
font-family: base_icon;
display: inline-block;
vertical-align: middle;
font-style: normal;
}
.my-account {
color: #333;
position: relative;
display: block;
width: 100%;
position: relative;
height: 6rem;
}
.account-bg {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
z-index: -1;
}
.account-bg img {
height: 100%;
width: 100%;
}
.my-account > img {
height: 100%;
position: absolute;
right: 0;
top: 0;
z-index: 0;
}
.my-account .user-info {
z-index: 1;
position: absolute;
top: 20px;
left: 70px;
box-sizing: border-box;
padding-left: 1.9em;
font-size: 13px;
color: #666;
}
.my-account .uname {
font-size: 18px;
color: #fff;
margin-top: 0.1em;
margin-bottom: 0.2em;
text-shadow: 0.07em 0.07em #333;
}
.my-account .umoney {
color: #fff;
margin-bottom: 0.06em;
text-shadow: 0.05em 0.05em #333;
}
.my-account .avatar_box {
position: absolute;
top: 1em;
left: 1em;
width: 5em;
height: 5em;
z-index: 1;
border-radius: 100%;
border: 2px solid #ffd44a;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
overflow: hidden;
}
.my-account .avater {
width: 100%;
height: 100%;
}
.phone {
width: 105px;
float: left;
z-index: 100;
}
.set {
position: absolute;
width: 60px;
right: 10px;
top: 20px;
z-index: 100;
color: #fff;
border: none;
border-radius: 15px;
background-color: #fdaf00;
text-align: center;
margin-top: -7px;
padding: 2px 2px;
}
.set a {
color: #fff !important;
}
.dl01 {
padding: 0 10px 10px;
background-color: #fff;
margin-top: 10px;
}
.titleImg {
width: 25px;
height: 25px;
margin-right: 10px;
margin-top: 15px;
float: left;
}
.dl02 {
padding: 0 10px;
background-color: #fff;
margin-top: 10px;
margin-bottom: 10px;
}
.dl02 a .menu {
border-bottom: 1px solid #ffe9b7;
background: url(../images/right.png) no-repeat right center;
background-size: 10px;
}
.dl02 a .menu div {
padding-top: 16px;
font-size: 15px;
color: #666;
}
.dl02 a .menu div.left {
float: left;
width: 40%;
}
.dl02 a .menu div.right {
float: left;
text-align: right;
width: 45%;
padding-right: 5px;
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 B

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="zh-TW" class="beauty-scroll">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
<link rel="icon" href="/admin/favicon.ico">
<title>Admin</title>
<!-- require cdn assets css -->
<link href="/admin/static/js/0.js" rel="prefetch"><link href="/admin/static/js/1.js" rel="prefetch"><link href="/admin/static/js/10.js" rel="prefetch"><link href="/admin/static/js/11.js" rel="prefetch"><link href="/admin/static/js/12.js" rel="prefetch"><link href="/admin/static/js/13.js" rel="prefetch"><link href="/admin/static/js/14.js" rel="prefetch"><link href="/admin/static/js/15.js" rel="prefetch"><link href="/admin/static/js/16.js" rel="prefetch"><link href="/admin/static/js/17.js" rel="prefetch"><link href="/admin/static/js/2.js" rel="prefetch"><link href="/admin/static/js/3.js" rel="prefetch"><link href="/admin/static/js/4.js" rel="prefetch"><link href="/admin/static/js/5.js" rel="prefetch"><link href="/admin/static/js/6.js" rel="prefetch"><link href="/admin/static/js/7.js" rel="prefetch"><link href="/admin/static/js/8.js" rel="prefetch"><link href="/admin/static/js/9.js" rel="prefetch"><link href="/admin/static/js/app.js" rel="preload" as="script"><link href="/admin/static/js/chunk-vendors.js" rel="preload" as="script"></head>
<body>
<noscript>
<strong>We're sorry but vue-antd-admin doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
</noscript>
<div id="popContainer" class="beauty-scroll" style="height: 100vh; overflow-y: scroll">
<div id="app"></div>
</div>
<!-- require cdn assets js -->
<!-- built files will be auto injected -->
<script type="text/javascript" src="/admin/static/js/chunk-vendors.js"></script><script type="text/javascript" src="/admin/static/js/app.js"></script></body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 596 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,109 @@
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[12],{
/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/setting/config/Config.vue?vue&type=script&lang=js&":
/*!*************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/setting/config/Config.vue?vue&type=script&lang=js& ***!
\*************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var regenerator_runtime_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! regenerator-runtime/runtime */ \"./node_modules/regenerator-runtime/runtime.js\");\n/* harmony import */ var regenerator_runtime_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(regenerator_runtime_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/asyncToGenerator */ \"./node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\");\n/* harmony import */ var _services_site__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/services/site */ \"./src/services/site.js\");\n\n\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n//\n// import ClassicEditor from '@ckeditor/ckeditor5-build-classic'\n// import CKEditor from '@ckeditor/ckeditor5-vue2'\n// import '@ckeditor/ckeditor5-build-classic/build/translations/zh'\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'Setting',\n components: {// ckeditor: CKEditor.component\n },\n data: function data() {\n return {\n labelCol: {\n span: 5\n },\n wrapperCol: {\n span: 18\n },\n editorConfig: {\n width: '360px',\n height: '400px',\n toolbarCanCollapse: true,\n toolbarStartupExpanded: false,\n allowedContent: true,\n contentsCss: ['/css/normalize.css', '/css/style.css']\n },\n form: {\n shop_content: ''\n },\n rules: {}\n };\n },\n mounted: function mounted() {\n var _this = this;\n\n return Object(_home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {\n var res;\n return regeneratorRuntime.wrap(function _callee$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return Object(_services_site__WEBPACK_IMPORTED_MODULE_2__[\"getSiteConfig\"])();\n\n case 2:\n res = _context.sent;\n\n if (res.code === 200) {\n _this.form.shop_content = res.data.shop_content;\n }\n\n case 4:\n case \"end\":\n return _context.stop();\n }\n }\n }, _callee);\n }))();\n },\n methods: {\n onSubmit: function onSubmit() {\n var _this2 = this;\n\n return Object(_home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__[\"default\"])( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {\n var res;\n return regeneratorRuntime.wrap(function _callee2$(_context2) {\n while (1) {\n switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return Object(_services_site__WEBPACK_IMPORTED_MODULE_2__[\"setSiteConfig\"])(_this2.form);\n\n case 2:\n res = _context2.sent;\n\n if (!(res.code !== 200)) {\n _context2.next = 5;\n break;\n }\n\n return _context2.abrupt(\"return\", _this2.$message.error('操作失敗'));\n\n case 5:\n return _context2.abrupt(\"return\", _this2.$message.success('操作成功'));\n\n case 6:\n case \"end\":\n return _context2.stop();\n }\n }\n }, _callee2);\n }))();\n }\n },\n computed: {\n layout: function layout() {\n return this.$store.state.setting.isMobile ? 'vertical' : 'horizontal';\n },\n formItemLayout: function formItemLayout() {\n console.log('aaaaaa', this.layout);\n return this.layout === 'horizontal' ? {\n labelCol: {\n span: 4\n },\n wrapperCol: {\n span: 14\n }\n } : {};\n },\n buttonItemLayout: function buttonItemLayout() {\n return this.layout === 'horizontal' ? {\n wrapperCol: {\n span: 14,\n offset: 4\n }\n } : {};\n }\n }\n});\n\n//# sourceURL=webpack:///./src/pages/setting/config/Config.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"718a2068-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/setting/config/Config.vue?vue&type=template&id=bfe38508&":
/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"718a2068-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/setting/config/Config.vue?vue&type=template&id=bfe38508& ***!
\*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\n \"div\",\n [\n _c(\n \"a-card\",\n { attrs: { \"body-style\": { padding: \"24px 0\" }, bordered: false } },\n [\n _c(\n \"a-form-model\",\n _vm._b(\n {\n ref: \"ruleForm\",\n attrs: { layout: _vm.layout, model: _vm.form, rules: _vm.rules }\n },\n \"a-form-model\",\n _vm.formItemLayout,\n false\n ),\n [\n _c(\n \"a-form-model-item\",\n {\n ref: \"shop_content\",\n attrs: { label: \"立即購買內容\", prop: \"shop_content\" }\n },\n [\n _c(\"ckeditor\", {\n attrs: { config: _vm.editorConfig },\n model: {\n value: _vm.form.shop_content,\n callback: function($$v) {\n _vm.$set(_vm.form, \"shop_content\", $$v)\n },\n expression: \"form.shop_content\"\n }\n })\n ],\n 1\n ),\n _c(\n \"a-form-model-item\",\n { attrs: { \"wrapper-col\": _vm.buttonItemLayout.wrapperCol } },\n [\n _c(\n \"a-button\",\n { attrs: { type: \"primary\" }, on: { click: _vm.onSubmit } },\n [_vm._v(\" 修改 \")]\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n ],\n 1\n )\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/pages/setting/config/Config.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22718a2068-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@vue/cli-service/node_modules/postcss-loader/src/index.js?!./node_modules/less-loader/dist/cjs.js?!./node_modules/style-resources-loader/lib/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/setting/config/Config.vue?vue&type=style&index=0&lang=less&":
/*!***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@vue/cli-service/node_modules/postcss-loader/src??ref--10-oneOf-1-2!./node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!./node_modules/style-resources-loader/lib??ref--10-oneOf-1-4!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/setting/config/Config.vue?vue&type=style&index=0&lang=less& ***!
\***************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// Imports\nvar ___CSS_LOADER_API_IMPORT___ = __webpack_require__(/*! ../../../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\nexports = ___CSS_LOADER_API_IMPORT___(false);\n// Module\nexports.push([module.i, \"/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */\\n/* stylelint-disable no-duplicate-selectors */\\n/* stylelint-disable */\\n/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */\\n.week-mode {\\n overflow: hidden;\\n -webkit-filter: invert(80%);\\n filter: invert(80%);\\n}\\n.beauty-scroll {\\n scrollbar-color: #13c2c2 #b5f5ec;\\n scrollbar-width: thin;\\n -ms-overflow-style: none;\\n position: relative;\\n}\\n.beauty-scroll::-webkit-scrollbar {\\n width: 3px;\\n height: 1px;\\n}\\n.beauty-scroll::-webkit-scrollbar-thumb {\\n border-radius: 3px;\\n background: #13c2c2;\\n}\\n.beauty-scroll::-webkit-scrollbar-track {\\n -webkit-box-shadow: inset 0 0 1px rgba(0, 0, 0, 0);\\n border-radius: 3px;\\n background: #87e8de;\\n}\\n.split-right:not(:last-child) {\\n border-right: 1px solid rgba(98, 98, 98, 0.2);\\n}\\n.disabled {\\n cursor: not-allowed;\\n color: rgba(0, 0, 0, 0.25);\\n pointer-events: none;\\n}\\n/* Make clicks pass-through */\\n#nprogress {\\n pointer-events: none;\\n}\\n#nprogress .bar {\\n background: #13c2c2;\\n position: fixed;\\n z-index: 1031;\\n top: 0;\\n left: 0;\\n width: 100%;\\n height: 2px;\\n}\\n/* Fancy blur effect */\\n#nprogress .peg {\\n display: block;\\n position: absolute;\\n right: 0px;\\n width: 100px;\\n height: 100%;\\n -webkit-box-shadow: 0 0 10px #13c2c2, 0 0 5px #13c2c2;\\n box-shadow: 0 0 10px #13c2c2, 0 0 5px #13c2c2;\\n opacity: 1;\\n -webkit-transform: rotate(3deg) translate(0px, -4px);\\n transform: rotate(3deg) translate(0px, -4px);\\n}\\n/* Remove these to get rid of the spinner */\\n#nprogress .spinner {\\n display: block;\\n position: fixed;\\n z-index: 1031;\\n top: 15px;\\n right: 15px;\\n}\\n#nprogress .spinner-icon {\\n width: 18px;\\n height: 18px;\\n -webkit-box-sizing: border-box;\\n box-sizing: border-box;\\n border: solid 2px transparent;\\n border-top-color: #13c2c2;\\n border-left-color: #13c2c2;\\n border-radius: 50%;\\n -webkit-animation: nprogress-spinner 400ms linear infinite;\\n animation: nprogress-spinner 400ms linear infinite;\\n}\\n.nprogress-custom-parent {\\n overflow: hidden;\\n position: relative;\\n}\\n.nprogress-custom-parent #nprogress .spinner,\\n.nprogress-custom-parent #nprogress .bar {\\n position: absolute;\\n}\\n@-webkit-keyframes nprogress-spinner {\\n0% {\\n -webkit-transform: rotate(0deg);\\n}\\n100% {\\n -webkit-transform: rotate(360deg);\\n}\\n}\\n@keyframes nprogress-spinner {\\n0% {\\n -webkit-transform: rotate(0deg);\\n transform: rotate(0deg);\\n}\\n100% {\\n -webkit-transform: rotate(360deg);\\n transform: rotate(360deg);\\n}\\n}\\n.ck-editor__editable {\\n min-height: 400px;\\n}\\n.ck.ck-editor {\\n max-width: 375px;\\n}\\n\", \"\"]);\n// Exports\nmodule.exports = exports;\n\n\n//# sourceURL=webpack:///./src/pages/setting/config/Config.vue?./node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@vue/cli-service/node_modules/postcss-loader/src??ref--10-oneOf-1-2!./node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!./node_modules/style-resources-loader/lib??ref--10-oneOf-1-4!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@vue/cli-service/node_modules/postcss-loader/src/index.js?!./node_modules/less-loader/dist/cjs.js?!./node_modules/style-resources-loader/lib/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/setting/config/Config.vue?vue&type=style&index=0&lang=less&":
/*!******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/vue-style-loader??ref--10-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@vue/cli-service/node_modules/postcss-loader/src??ref--10-oneOf-1-2!./node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!./node_modules/style-resources-loader/lib??ref--10-oneOf-1-4!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/setting/config/Config.vue?vue&type=style&index=0&lang=less& ***!
\******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {
eval("// style-loader: Adds some css to the DOM by adding a <style> tag\n\n// load the styles\nvar content = __webpack_require__(/*! !../../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/src??ref--10-oneOf-1-2!../../../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../../node_modules/style-resources-loader/lib??ref--10-oneOf-1-4!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./Config.vue?vue&type=style&index=0&lang=less& */ \"./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@vue/cli-service/node_modules/postcss-loader/src/index.js?!./node_modules/less-loader/dist/cjs.js?!./node_modules/style-resources-loader/lib/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/setting/config/Config.vue?vue&type=style&index=0&lang=less&\");\nif(typeof content === 'string') content = [[module.i, content, '']];\nif(content.locals) module.exports = content.locals;\n// add the styles to the DOM\nvar add = __webpack_require__(/*! ../../../../node_modules/vue-style-loader/lib/addStylesClient.js */ \"./node_modules/vue-style-loader/lib/addStylesClient.js\").default\nvar update = add(\"5d8d3244\", content, false, {\"sourceMap\":false,\"shadowMode\":false});\n// Hot Module Replacement\nif(false) {}\n\n//# sourceURL=webpack:///./src/pages/setting/config/Config.vue?./node_modules/vue-style-loader??ref--10-oneOf-1-0!./node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@vue/cli-service/node_modules/postcss-loader/src??ref--10-oneOf-1-2!./node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!./node_modules/style-resources-loader/lib??ref--10-oneOf-1-4!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./src/pages/setting/config/Config.vue":
/*!*********************************************!*\
!*** ./src/pages/setting/config/Config.vue ***!
\*********************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Config_vue_vue_type_template_id_bfe38508___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Config.vue?vue&type=template&id=bfe38508& */ \"./src/pages/setting/config/Config.vue?vue&type=template&id=bfe38508&\");\n/* harmony import */ var _Config_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Config.vue?vue&type=script&lang=js& */ \"./src/pages/setting/config/Config.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _Config_vue_vue_type_style_index_0_lang_less___WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Config.vue?vue&type=style&index=0&lang=less& */ \"./src/pages/setting/config/Config.vue?vue&type=style&index=0&lang=less&\");\n/* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_3__[\"default\"])(\n _Config_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _Config_vue_vue_type_template_id_bfe38508___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _Config_vue_vue_type_template_id_bfe38508___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n null,\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/pages/setting/config/Config.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack:///./src/pages/setting/config/Config.vue?");
/***/ }),
/***/ "./src/pages/setting/config/Config.vue?vue&type=script&lang=js&":
/*!**********************************************************************!*\
!*** ./src/pages/setting/config/Config.vue?vue&type=script&lang=js& ***!
\**********************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Config_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../../node_modules/babel-loader/lib!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./Config.vue?vue&type=script&lang=js& */ \"./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/setting/config/Config.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Config_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); \n\n//# sourceURL=webpack:///./src/pages/setting/config/Config.vue?");
/***/ }),
/***/ "./src/pages/setting/config/Config.vue?vue&type=style&index=0&lang=less&":
/*!*******************************************************************************!*\
!*** ./src/pages/setting/config/Config.vue?vue&type=style&index=0&lang=less& ***!
\*******************************************************************************/
/*! no static exports found */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_10_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_10_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_cli_service_node_modules_postcss_loader_src_index_js_ref_10_oneOf_1_2_node_modules_less_loader_dist_cjs_js_ref_10_oneOf_1_3_node_modules_style_resources_loader_lib_index_js_ref_10_oneOf_1_4_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Config_vue_vue_type_style_index_0_lang_less___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/vue-style-loader??ref--10-oneOf-1-0!../../../../node_modules/css-loader/dist/cjs.js??ref--10-oneOf-1-1!../../../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../../../node_modules/@vue/cli-service/node_modules/postcss-loader/src??ref--10-oneOf-1-2!../../../../node_modules/less-loader/dist/cjs.js??ref--10-oneOf-1-3!../../../../node_modules/style-resources-loader/lib??ref--10-oneOf-1-4!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./Config.vue?vue&type=style&index=0&lang=less& */ \"./node_modules/vue-style-loader/index.js?!./node_modules/css-loader/dist/cjs.js?!./node_modules/vue-loader/lib/loaders/stylePostLoader.js!./node_modules/@vue/cli-service/node_modules/postcss-loader/src/index.js?!./node_modules/less-loader/dist/cjs.js?!./node_modules/style-resources-loader/lib/index.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/setting/config/Config.vue?vue&type=style&index=0&lang=less&\");\n/* harmony import */ var _node_modules_vue_style_loader_index_js_ref_10_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_10_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_cli_service_node_modules_postcss_loader_src_index_js_ref_10_oneOf_1_2_node_modules_less_loader_dist_cjs_js_ref_10_oneOf_1_3_node_modules_style_resources_loader_lib_index_js_ref_10_oneOf_1_4_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Config_vue_vue_type_style_index_0_lang_less___WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_vue_style_loader_index_js_ref_10_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_10_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_cli_service_node_modules_postcss_loader_src_index_js_ref_10_oneOf_1_2_node_modules_less_loader_dist_cjs_js_ref_10_oneOf_1_3_node_modules_style_resources_loader_lib_index_js_ref_10_oneOf_1_4_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Config_vue_vue_type_style_index_0_lang_less___WEBPACK_IMPORTED_MODULE_0__);\n/* harmony reexport (unknown) */ for(var __WEBPACK_IMPORT_KEY__ in _node_modules_vue_style_loader_index_js_ref_10_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_10_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_cli_service_node_modules_postcss_loader_src_index_js_ref_10_oneOf_1_2_node_modules_less_loader_dist_cjs_js_ref_10_oneOf_1_3_node_modules_style_resources_loader_lib_index_js_ref_10_oneOf_1_4_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Config_vue_vue_type_style_index_0_lang_less___WEBPACK_IMPORTED_MODULE_0__) if([\"default\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) (function(key) { __webpack_require__.d(__webpack_exports__, key, function() { return _node_modules_vue_style_loader_index_js_ref_10_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_10_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_cli_service_node_modules_postcss_loader_src_index_js_ref_10_oneOf_1_2_node_modules_less_loader_dist_cjs_js_ref_10_oneOf_1_3_node_modules_style_resources_loader_lib_index_js_ref_10_oneOf_1_4_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Config_vue_vue_type_style_index_0_lang_less___WEBPACK_IMPORTED_MODULE_0__[key]; }) }(__WEBPACK_IMPORT_KEY__));\n /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_vue_style_loader_index_js_ref_10_oneOf_1_0_node_modules_css_loader_dist_cjs_js_ref_10_oneOf_1_1_node_modules_vue_loader_lib_loaders_stylePostLoader_js_node_modules_vue_cli_service_node_modules_postcss_loader_src_index_js_ref_10_oneOf_1_2_node_modules_less_loader_dist_cjs_js_ref_10_oneOf_1_3_node_modules_style_resources_loader_lib_index_js_ref_10_oneOf_1_4_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Config_vue_vue_type_style_index_0_lang_less___WEBPACK_IMPORTED_MODULE_0___default.a); \n\n//# sourceURL=webpack:///./src/pages/setting/config/Config.vue?");
/***/ }),
/***/ "./src/pages/setting/config/Config.vue?vue&type=template&id=bfe38508&":
/*!****************************************************************************!*\
!*** ./src/pages/setting/config/Config.vue?vue&type=template&id=bfe38508& ***!
\****************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Config_vue_vue_type_template_id_bfe38508___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"718a2068-vue-loader-template\"}!../../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../../node_modules/vue-loader/lib??vue-loader-options!./Config.vue?vue&type=template&id=bfe38508& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"718a2068-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/setting/config/Config.vue?vue&type=template&id=bfe38508&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Config_vue_vue_type_template_id_bfe38508___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_Config_vue_vue_type_template_id_bfe38508___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/pages/setting/config/Config.vue?");
/***/ }),
/***/ "./src/services/site.js":
/*!******************************!*\
!*** ./src/services/site.js ***!
\******************************/
/*! exports provided: getSiteBase, updateSiteBase, getSiteConfig, setSiteConfig, getSiteInfo, updateSiteInfo, getSiteGallery, deleteSiteGallery, getAgents */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getSiteBase\", function() { return getSiteBase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"updateSiteBase\", function() { return updateSiteBase; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getSiteConfig\", function() { return getSiteConfig; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"setSiteConfig\", function() { return setSiteConfig; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getSiteInfo\", function() { return getSiteInfo; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"updateSiteInfo\", function() { return updateSiteInfo; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getSiteGallery\", function() { return getSiteGallery; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"deleteSiteGallery\", function() { return deleteSiteGallery; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"getAgents\", function() { return getAgents; });\n/* harmony import */ var _utils_request__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @/utils/request */ \"./src/utils/request.js\");\n\nfunction getSiteBase() {\n return Object(_utils_request__WEBPACK_IMPORTED_MODULE_0__[\"ajax\"])('/site/getSiteBase');\n}\nfunction updateSiteBase(params) {\n return Object(_utils_request__WEBPACK_IMPORTED_MODULE_0__[\"ajax\"])('/site/updateSiteBase', params, 'post');\n}\nfunction getSiteConfig() {\n return Object(_utils_request__WEBPACK_IMPORTED_MODULE_0__[\"ajax\"])('/site/getSiteConfig');\n}\nfunction setSiteConfig(params) {\n return Object(_utils_request__WEBPACK_IMPORTED_MODULE_0__[\"ajax\"])('/site/setSiteConfig', params, 'post');\n}\nfunction getSiteInfo() {\n return Object(_utils_request__WEBPACK_IMPORTED_MODULE_0__[\"ajax\"])('/site/getSiteInfo');\n}\nfunction updateSiteInfo(params) {\n return Object(_utils_request__WEBPACK_IMPORTED_MODULE_0__[\"ajax\"])('/site/updateSiteInfo', params, 'post');\n}\nfunction getSiteGallery() {\n return Object(_utils_request__WEBPACK_IMPORTED_MODULE_0__[\"ajax\"])('/site/getSiteGallery');\n}\nfunction deleteSiteGallery(params) {\n return Object(_utils_request__WEBPACK_IMPORTED_MODULE_0__[\"ajax\"])('/site/deleteGallery', params, 'get');\n}\nfunction getAgents() {\n return Object(_utils_request__WEBPACK_IMPORTED_MODULE_0__[\"ajax\"])('/site/getAgents');\n}\n\n//# sourceURL=webpack:///./src/services/site.js?");
/***/ })
}]);

@ -0,0 +1,63 @@
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[13],{
/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/500.vue?vue&type=script&lang=js&":
/*!*****************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/exception/500.vue?vue&type=script&lang=js& ***!
\*****************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/esm/objectSpread2.js\");\n/* harmony import */ var _components_exception_ExceptionPage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/components/exception/ExceptionPage */ \"./src/components/exception/ExceptionPage.vue\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'Exp500',\n components: {\n ExceptionPage: _components_exception_ExceptionPage__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n },\n computed: Object(_home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, Object(vuex__WEBPACK_IMPORTED_MODULE_2__[\"mapState\"])('setting', ['pageMinHeight'])), {}, {\n minHeight: function minHeight() {\n return this.pageMinHeight ? this.pageMinHeight + 'px' : '100vh';\n }\n })\n});\n\n//# sourceURL=webpack:///./src/pages/exception/500.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"718a2068-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/500.vue?vue&type=template&id=940de63e&scoped=true&":
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"718a2068-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/exception/500.vue?vue&type=template&id=940de63e&scoped=true& ***!
\*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"exception-page\", {\n style: \"min-height: \" + _vm.minHeight,\n attrs: { \"home-route\": \"/login\", type: \"500\" }\n })\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/pages/exception/500.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22718a2068-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./src/pages/exception/500.vue":
/*!*************************************!*\
!*** ./src/pages/exception/500.vue ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _500_vue_vue_type_template_id_940de63e_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./500.vue?vue&type=template&id=940de63e&scoped=true& */ \"./src/pages/exception/500.vue?vue&type=template&id=940de63e&scoped=true&\");\n/* harmony import */ var _500_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./500.vue?vue&type=script&lang=js& */ \"./src/pages/exception/500.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\n _500_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _500_vue_vue_type_template_id_940de63e_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _500_vue_vue_type_template_id_940de63e_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"940de63e\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/pages/exception/500.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack:///./src/pages/exception/500.vue?");
/***/ }),
/***/ "./src/pages/exception/500.vue?vue&type=script&lang=js&":
/*!**************************************************************!*\
!*** ./src/pages/exception/500.vue?vue&type=script&lang=js& ***!
\**************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_500_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/babel-loader/lib!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./500.vue?vue&type=script&lang=js& */ \"./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/500.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_500_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); \n\n//# sourceURL=webpack:///./src/pages/exception/500.vue?");
/***/ }),
/***/ "./src/pages/exception/500.vue?vue&type=template&id=940de63e&scoped=true&":
/*!********************************************************************************!*\
!*** ./src/pages/exception/500.vue?vue&type=template&id=940de63e&scoped=true& ***!
\********************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_500_vue_vue_type_template_id_940de63e_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"718a2068-vue-loader-template\"}!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./500.vue?vue&type=template&id=940de63e&scoped=true& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"718a2068-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/500.vue?vue&type=template&id=940de63e&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_500_vue_vue_type_template_id_940de63e_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_500_vue_vue_type_template_id_940de63e_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/pages/exception/500.vue?");
/***/ })
}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -0,0 +1,15 @@
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[16],{
/***/ "./src/layouts/tabs/index.js":
/*!***********************************!*\
!*** ./src/layouts/tabs/index.js ***!
\***********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _TabsView__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./TabsView */ \"./src/layouts/tabs/TabsView.vue\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_TabsView__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\n\n//# sourceURL=webpack:///./src/layouts/tabs/index.js?");
/***/ })
}]);

@ -0,0 +1,15 @@
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[17],{
/***/ "./src/pages/dashboard/index.js":
/*!**************************************!*\
!*** ./src/pages/dashboard/index.js ***!
\**************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _Dashboard_vue__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Dashboard.vue */ \"./src/pages/dashboard/Dashboard.vue\");\n\n/* harmony default export */ __webpack_exports__[\"default\"] = (_Dashboard_vue__WEBPACK_IMPORTED_MODULE_0__[\"default\"]);\n\n//# sourceURL=webpack:///./src/pages/dashboard/index.js?");
/***/ })
}]);

File diff suppressed because one or more lines are too long

@ -0,0 +1,63 @@
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[3],{
/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/403.vue?vue&type=script&lang=js&":
/*!*****************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/exception/403.vue?vue&type=script&lang=js& ***!
\*****************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/esm/objectSpread2.js\");\n/* harmony import */ var _components_exception_ExceptionPage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/components/exception/ExceptionPage */ \"./src/components/exception/ExceptionPage.vue\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'Exp403',\n components: {\n ExceptionPage: _components_exception_ExceptionPage__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n },\n computed: Object(_home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, Object(vuex__WEBPACK_IMPORTED_MODULE_2__[\"mapState\"])('setting', ['pageMinHeight'])), {}, {\n minHeight: function minHeight() {\n return this.pageMinHeight ? this.pageMinHeight + 'px' : '100vh';\n }\n })\n});\n\n//# sourceURL=webpack:///./src/pages/exception/403.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"718a2068-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/403.vue?vue&type=template&id=fd85cfba&scoped=true&":
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"718a2068-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/exception/403.vue?vue&type=template&id=fd85cfba&scoped=true& ***!
\*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"exception-page\", {\n style: \"min-height: \" + _vm.minHeight,\n attrs: { \"home-route\": \"/login\", type: \"403\" }\n })\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/pages/exception/403.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22718a2068-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./src/pages/exception/403.vue":
/*!*************************************!*\
!*** ./src/pages/exception/403.vue ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _403_vue_vue_type_template_id_fd85cfba_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./403.vue?vue&type=template&id=fd85cfba&scoped=true& */ \"./src/pages/exception/403.vue?vue&type=template&id=fd85cfba&scoped=true&\");\n/* harmony import */ var _403_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./403.vue?vue&type=script&lang=js& */ \"./src/pages/exception/403.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\n _403_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _403_vue_vue_type_template_id_fd85cfba_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _403_vue_vue_type_template_id_fd85cfba_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"fd85cfba\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/pages/exception/403.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack:///./src/pages/exception/403.vue?");
/***/ }),
/***/ "./src/pages/exception/403.vue?vue&type=script&lang=js&":
/*!**************************************************************!*\
!*** ./src/pages/exception/403.vue?vue&type=script&lang=js& ***!
\**************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_403_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/babel-loader/lib!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./403.vue?vue&type=script&lang=js& */ \"./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/403.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_403_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); \n\n//# sourceURL=webpack:///./src/pages/exception/403.vue?");
/***/ }),
/***/ "./src/pages/exception/403.vue?vue&type=template&id=fd85cfba&scoped=true&":
/*!********************************************************************************!*\
!*** ./src/pages/exception/403.vue?vue&type=template&id=fd85cfba&scoped=true& ***!
\********************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_403_vue_vue_type_template_id_fd85cfba_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"718a2068-vue-loader-template\"}!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./403.vue?vue&type=template&id=fd85cfba&scoped=true& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"718a2068-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/403.vue?vue&type=template&id=fd85cfba&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_403_vue_vue_type_template_id_fd85cfba_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_403_vue_vue_type_template_id_fd85cfba_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/pages/exception/403.vue?");
/***/ })
}]);

@ -0,0 +1,63 @@
(window["webpackJsonp"] = window["webpackJsonp"] || []).push([[4],{
/***/ "./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/404.vue?vue&type=script&lang=js&":
/*!*****************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/exception/404.vue?vue&type=script&lang=js& ***!
\*****************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectSpread2 */ \"./node_modules/@babel/runtime/helpers/esm/objectSpread2.js\");\n/* harmony import */ var _components_exception_ExceptionPage__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @/components/exception/ExceptionPage */ \"./src/components/exception/ExceptionPage.vue\");\n/* harmony import */ var vuex__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! vuex */ \"./node_modules/vuex/dist/vuex.esm.js\");\n\n//\n//\n//\n//\n\n\n/* harmony default export */ __webpack_exports__[\"default\"] = ({\n name: 'Exp404',\n components: {\n ExceptionPage: _components_exception_ExceptionPage__WEBPACK_IMPORTED_MODULE_1__[\"default\"]\n },\n computed: Object(_home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__[\"default\"])(Object(_home_wayne_project_stage_slashcard_admin_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_0__[\"default\"])({}, Object(vuex__WEBPACK_IMPORTED_MODULE_2__[\"mapState\"])('setting', ['pageMinHeight'])), {}, {\n minHeight: function minHeight() {\n return this.pageMinHeight ? this.pageMinHeight + 'px' : '100vh';\n }\n })\n});\n\n//# sourceURL=webpack:///./src/pages/exception/404.vue?./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"718a2068-vue-loader-template\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/404.vue?vue&type=template&id=fd69a0b8&scoped=true&":
/*!*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
!*** ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"718a2068-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/pages/exception/404.vue?vue&type=template&id=fd69a0b8&scoped=true& ***!
\*************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return render; });\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return staticRenderFns; });\nvar render = function() {\n var _vm = this\n var _h = _vm.$createElement\n var _c = _vm._self._c || _h\n return _c(\"exception-page\", {\n style: \"min-height: \" + _vm.minHeight,\n attrs: { \"home-route\": \"/login\", type: \"404\" }\n })\n}\nvar staticRenderFns = []\nrender._withStripped = true\n\n\n\n//# sourceURL=webpack:///./src/pages/exception/404.vue?./node_modules/cache-loader/dist/cjs.js?%7B%22cacheDirectory%22:%22node_modules/.cache/vue-loader%22,%22cacheIdentifier%22:%22718a2068-vue-loader-template%22%7D!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options");
/***/ }),
/***/ "./src/pages/exception/404.vue":
/*!*************************************!*\
!*** ./src/pages/exception/404.vue ***!
\*************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _404_vue_vue_type_template_id_fd69a0b8_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./404.vue?vue&type=template&id=fd69a0b8&scoped=true& */ \"./src/pages/exception/404.vue?vue&type=template&id=fd69a0b8&scoped=true&\");\n/* harmony import */ var _404_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./404.vue?vue&type=script&lang=js& */ \"./src/pages/exception/404.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport *//* harmony import */ var _node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js */ \"./node_modules/vue-loader/lib/runtime/componentNormalizer.js\");\n\n\n\n\n\n/* normalize component */\n\nvar component = Object(_node_modules_vue_loader_lib_runtime_componentNormalizer_js__WEBPACK_IMPORTED_MODULE_2__[\"default\"])(\n _404_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_1__[\"default\"],\n _404_vue_vue_type_template_id_fd69a0b8_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"],\n _404_vue_vue_type_template_id_fd69a0b8_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"],\n false,\n null,\n \"fd69a0b8\",\n null\n \n)\n\n/* hot reload */\nif (false) { var api; }\ncomponent.options.__file = \"src/pages/exception/404.vue\"\n/* harmony default export */ __webpack_exports__[\"default\"] = (component.exports);\n\n//# sourceURL=webpack:///./src/pages/exception/404.vue?");
/***/ }),
/***/ "./src/pages/exception/404.vue?vue&type=script&lang=js&":
/*!**************************************************************!*\
!*** ./src/pages/exception/404.vue?vue&type=script&lang=js& ***!
\**************************************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/babel-loader/lib!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./404.vue?vue&type=script&lang=js& */ \"./node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/404.vue?vue&type=script&lang=js&\");\n/* empty/unused harmony star reexport */ /* harmony default export */ __webpack_exports__[\"default\"] = (_node_modules_cache_loader_dist_cjs_js_ref_12_0_node_modules_babel_loader_lib_index_js_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_script_lang_js___WEBPACK_IMPORTED_MODULE_0__[\"default\"]); \n\n//# sourceURL=webpack:///./src/pages/exception/404.vue?");
/***/ }),
/***/ "./src/pages/exception/404.vue?vue&type=template&id=fd69a0b8&scoped=true&":
/*!********************************************************************************!*\
!*** ./src/pages/exception/404.vue?vue&type=template&id=fd69a0b8&scoped=true& ***!
\********************************************************************************/
/*! exports provided: render, staticRenderFns */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_template_id_fd69a0b8_scoped_true___WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! -!../../../node_modules/cache-loader/dist/cjs.js?{\"cacheDirectory\":\"node_modules/.cache/vue-loader\",\"cacheIdentifier\":\"718a2068-vue-loader-template\"}!../../../node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib??vue-loader-options!./404.vue?vue&type=template&id=fd69a0b8&scoped=true& */ \"./node_modules/cache-loader/dist/cjs.js?{\\\"cacheDirectory\\\":\\\"node_modules/.cache/vue-loader\\\",\\\"cacheIdentifier\\\":\\\"718a2068-vue-loader-template\\\"}!./node_modules/vue-loader/lib/loaders/templateLoader.js?!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/pages/exception/404.vue?vue&type=template&id=fd69a0b8&scoped=true&\");\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"render\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_template_id_fd69a0b8_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"render\"]; });\n\n/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, \"staticRenderFns\", function() { return _node_modules_cache_loader_dist_cjs_js_cacheDirectory_node_modules_cache_vue_loader_cacheIdentifier_718a2068_vue_loader_template_node_modules_vue_loader_lib_loaders_templateLoader_js_vue_loader_options_node_modules_cache_loader_dist_cjs_js_ref_0_0_node_modules_vue_loader_lib_index_js_vue_loader_options_404_vue_vue_type_template_id_fd69a0b8_scoped_true___WEBPACK_IMPORTED_MODULE_0__[\"staticRenderFns\"]; });\n\n\n\n//# sourceURL=webpack:///./src/pages/exception/404.vue?");
/***/ })
}]);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save