integrated frontend

This commit is contained in:
jack
2018-05-07 15:26:23 +08:00
parent a5534004b8
commit a1db64d1c1
210 changed files with 26173 additions and 55949 deletions
+3
View File
@@ -0,0 +1,3 @@
{
"plugins": ["syntax-dynamic-import"]
}
+15
View File
@@ -0,0 +1,15 @@
{
"root": true,
"parserOptions": {
"parser": "babel-eslint",
"ecmaVersion": 2017,
"sourceType": "module"
},
"extends": [
"plugin:vue/recommended",
"@vue/standard"
],
"rules": {
"vue/max-attributes-per-line": "off"
}
}
BIN
View File
Binary file not shown.
+59
View File
@@ -0,0 +1,59 @@
# Changelog
## 4.1.0 - 2018-03-14
- Upgrade to Laravel 5.6
- Update npm dependencies
- Enabled Mix [esModule](https://github.com/JeffreyWay/laravel-mix/pull/1526#issuecomment-373044182) by default
- Lint with eslint-plugin-vue and eslint-config-standard
## 4.0.0 - 2018-01-23
- Brought back the `layout` property in pages that was removed in 3.0. By default it's set to `default` (`~/layouts/default.vue`).
## 3.0.1 - 2018-01-22
- Removed middleware from routes, since they don't work when you press the back button. Now you have to use the `middleware` property in pages.
## 3.0.0 - 2018-01-22
- Removed `layout` property from pages in favor of explicit layout components
- Improved middleware system, you can either define it on a route or directly on a component
- Reorganized components
- Change jwt token ttl to one day
- Fixed hot module replacement
## 2.2.1 - 2018-01-19
- Upgrade to Bootstrap 4
## 2.2.0 - 2018-01-16
- Added dynamic import for pages
- Added locale with dynamic import
- Import shakable fontawesome module
## 2.1.0 - 2018-01-10
- Simplifyd password reset
- Upgrade to Bootstrap 4 beta3
- Added oauth with popup window
## 2.0.0 - 2017-12-19
- Added support for Socialite
- Added dropdown to select the locale
- Added route middleware
- Added Font Awesome 5 icons
- Added user profile photo in navbar
- Added Chinese and Spanish translations
- Upgrade to Bootstrap 4 beta2
- Fixed router scroll behaviour
- Namespaced store modules
- Published project to Packagist
## 1.0.0 - 2017-09-02
- Upgrade to Laravel 5.5.
- Upgrade to Bootstrap 4 beta1.
- Rework routing and guards.
+3 -3
View File
@@ -1,9 +1,9 @@
FROM php:7 FROM php:7
RUN apt-get update -y && apt-get install -y openssl zip unzip git RUN apt-get update -y && apt-get install -y openssl zip unzip git zlib1g-dev
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN docker-php-ext-install pdo pdo_mysql RUN docker-php-ext-install pdo pdo_mysql zip
WORKDIR /app WORKDIR /app
COPY . /app COPY . /app
RUN composer install RUN composer install
CMD php artisan serve --host=0.0.0.0 --port=8000 CMD php artisan serve --host=0.0.0.0 --port=8000
EXPOSE 8000 EXPOSE 8000
+21
View File
@@ -0,0 +1,21 @@
MIT License
Copyright (c) 2017 Cretu Eusebiu
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+19
View File
@@ -0,0 +1,19 @@
<?php
namespace App\Exceptions;
use Exception;
class EmailTakenException extends Exception
{
/**
* Render the exception as an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function render($request)
{
return response()->view('oauth.emailTaken', [], 400);
}
}
@@ -2,22 +2,12 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails; use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller class ForgotPasswordController extends Controller
{ {
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset emails and
| includes a trait which assists in sending these notifications from
| your application to your users. Feel free to explore this trait.
|
*/
use SendsPasswordResetEmails; use SendsPasswordResetEmails;
/** /**
@@ -29,4 +19,27 @@ class ForgotPasswordController extends Controller
{ {
$this->middleware('guest'); $this->middleware('guest');
} }
/**
* Get the response for a successful password reset link.
*
* @param string $response
* @return \Illuminate\Http\RedirectResponse
*/
protected function sendResetLinkResponse($response)
{
return ['status' => trans($response)];
}
/**
* Get the response for a failed password reset link.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse
*/
protected function sendResetLinkFailedResponse(Request $request, $response)
{
return response()->json(['email' => trans($response)], 400);
}
} }
+51 -18
View File
@@ -2,31 +2,14 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller class LoginController extends Controller
{ {
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers; use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/home';
/** /**
* Create a new controller instance. * Create a new controller instance.
* *
@@ -36,4 +19,54 @@ class LoginController extends Controller
{ {
$this->middleware('guest')->except('logout'); $this->middleware('guest')->except('logout');
} }
/**
* Attempt to log the user into the application.
*
* @param \Illuminate\Http\Request $request
* @return bool
*/
protected function attemptLogin(Request $request)
{
$token = $this->guard()->attempt($this->credentials($request));
if ($token) {
$this->guard()->setToken($token);
return true;
}
return false;
}
/**
* Send the response after the user was authenticated.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
protected function sendLoginResponse(Request $request)
{
$this->clearLoginAttempts($request);
$token = (string) $this->guard()->getToken();
$expiration = $this->guard()->getPayload()->get('exp');
return [
'token' => $token,
'token_type' => 'bearer',
'expires_in' => $expiration - time(),
];
}
/**
* Log the user out of the application.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function logout(Request $request)
{
$this->guard()->logout();
}
} }
@@ -0,0 +1,111 @@
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use App\OAuthProvider;
use App\Http\Controllers\Controller;
use App\Exceptions\EmailTakenException;
use Laravel\Socialite\Facades\Socialite;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class OAuthController extends Controller
{
use AuthenticatesUsers;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
config([
'services.github.redirect' => route('oauth.callback', 'github'),
]);
}
/**
* Redirect the user to the provider authentication page.
*
* @param string $provider
* @return \Illuminate\Http\RedirectResponse
*/
public function redirectToProvider($provider)
{
return [
'url' => Socialite::driver($provider)->stateless()->redirect()->getTargetUrl(),
];
}
/**
* Obtain the user information from the provider.
*
* @param string $driver
* @return \Illuminate\Http\Response
*/
public function handleProviderCallback($provider)
{
$user = Socialite::driver($provider)->stateless()->user();
$user = $this->findOrCreateUser($provider, $user);
$this->guard()->setToken(
$token = $this->guard()->login($user)
);
return view('oauth/callback', [
'token' => $token,
'token_type' => 'bearer',
'expires_in' => $this->guard()->getPayload()->get('exp') - time(),
]);
}
/**
* @param string $provider
* @param \Laravel\Socialite\Contracts\User $sUser
* @return \App\User|false
*/
protected function findOrCreateUser($provider, $user)
{
$oauthProvider = OAuthProvider::where('provider', $provider)
->where('provider_user_id', $user->getId())
->first();
if ($oauthProvider) {
$oauthProvider->update([
'access_token' => $user->token,
'refresh_token' => $user->refreshToken,
]);
return $oauthProvider->user;
}
if (User::where('email', $user->getEmail())->exists()) {
throw new EmailTakenException;
}
return $this->createUser($provider, $user);
}
/**
* @param string $provider
* @param \Laravel\Socialite\Contracts\User $sUser
* @return \App\User
*/
protected function createUser($provider, $sUser)
{
$user = User::create([
'name' => $sUser->getName(),
'email' => $sUser->getEmail(),
]);
$user->oauthProviders()->create([
'provider' => $provider,
'provider_user_id' => $sUser->getId(),
'access_token' => $sUser->token,
'refresh_token' => $sUser->refreshToken,
]);
return $user;
}
}
@@ -3,33 +3,15 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use App\User; use App\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator; use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers; use Illuminate\Foundation\Auth\RegistersUsers;
class RegisterController extends Controller class RegisterController extends Controller
{ {
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers; use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = '/home';
/** /**
* Create a new controller instance. * Create a new controller instance.
* *
@@ -40,6 +22,18 @@ class RegisterController extends Controller
$this->middleware('guest'); $this->middleware('guest');
} }
/**
* The user has been registered.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function registered(Request $request, $user)
{
return $user;
}
/** /**
* Get a validator for an incoming registration request. * Get a validator for an incoming registration request.
* *
@@ -49,9 +43,9 @@ class RegisterController extends Controller
protected function validator(array $data) protected function validator(array $data)
{ {
return Validator::make($data, [ return Validator::make($data, [
'name' => 'required|string|max:255', 'name' => 'required|max:255',
'email' => 'required|string|email|max:255|unique:users', 'email' => 'required|email|max:255|unique:users',
'password' => 'required|string|min:6|confirmed', 'password' => 'required|min:6|confirmed',
]); ]);
} }
@@ -59,14 +53,14 @@ class RegisterController extends Controller
* Create a new user instance after a valid registration. * Create a new user instance after a valid registration.
* *
* @param array $data * @param array $data
* @return \App\User * @return User
*/ */
protected function create(array $data) protected function create(array $data)
{ {
return User::create([ return User::create([
'name' => $data['name'], 'name' => $data['name'],
'email' => $data['email'], 'email' => $data['email'],
'password' => Hash::make($data['password']), 'password' => bcrypt($data['password']),
]); ]);
} }
} }
@@ -2,31 +2,14 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords; use Illuminate\Foundation\Auth\ResetsPasswords;
class ResetPasswordController extends Controller class ResetPasswordController extends Controller
{ {
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset requests
| and uses a simple trait to include this behavior. You're free to
| explore this trait and override any methods you wish to tweak.
|
*/
use ResetsPasswords; use ResetsPasswords;
/**
* Where to redirect users after resetting their password.
*
* @var string
*/
protected $redirectTo = '/home';
/** /**
* Create a new controller instance. * Create a new controller instance.
* *
@@ -36,4 +19,27 @@ class ResetPasswordController extends Controller
{ {
$this->middleware('guest'); $this->middleware('guest');
} }
/**
* Get the response for a successful password reset.
*
* @param string $response
* @return \Illuminate\Http\RedirectResponse
*/
protected function sendResetResponse($response)
{
return ['status' => trans($response)];
}
/**
* Get the response for a failed password reset.
*
* @param \Illuminate\Http\Request $request
* @param string $response
* @return \Illuminate\Http\RedirectResponse
*/
protected function sendResetFailedResponse(Request $request, $response)
{
return response()->json(['email' => trans($response)], 400);
}
} }
-154
View File
@@ -1,154 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
use JWTAuth;
use Tymon\JWTAuth\Exceptions\JWTException;
use Validator, DB, Hash, Mail, Illuminate\Support\Facades\Password;
class AuthController extends Controller
{
/**
* API Register
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function register(Request $request)
{
$credentials = $request->only('name', 'email', 'password');
$rules = [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users'
];
$validator = Validator::make($credentials, $rules);
if($validator->fails()) {
return response()->json(['success'=> false, 'error'=> $validator->messages()]);
}
$name = $request->name;
$email = $request->email;
$password = $request->password;
$user = User::create(['name' => $name, 'email' => $email, 'password' => Hash::make($password)]);
$verification_code = str_random(30); //Generate verification code
DB::table('user_verifications')->insert(['user_id'=>$user->id,'token'=>$verification_code]);
$subject = "Please verify your email address.";
/* Mail::send('email.verify', ['name' => $name, 'verification_code' => $verification_code],
function($mail) use ($email, $name, $subject){
$mail->from(getenv('FROM_EMAIL_ADDRESS'), "From User/Company Name Goes Here");
$mail->to($email, $name);
$mail->subject($subject);
});
*/
return response()->json(['success'=> true, 'message'=> 'Thanks for signing up! Please check your email to complete your registration.']);
}
/**
* API Login, on success return JWT Auth token
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function login(Request $request)
{
$credentials = $request->only('email', 'password');
$rules = [
'email' => 'required|email',
'password' => 'required',
];
$validator = Validator::make($credentials, $rules);
if($validator->fails()) {
return response()->json(['success'=> false, 'error'=> $validator->messages()]);
}
$credentials['is_verified'] = 1;
try {
// attempt to verify the credentials and create a token for the user
if (! $token = JWTAuth::attempt($credentials)) {
return response()->json(['success' => false, 'error' => 'We cant find an account with this credentials. Please make sure you entered the right information and you have verified your email address.'], 401);
}
} catch (JWTException $e) {
// something went wrong whilst attempting to encode the token
return response()->json(['success' => false, 'error' => 'Failed to login, please try again.'], 500);
}
// all good so return the token
return response()->json(['success' => true, 'data'=> [ 'token' => $token ]]);
}
/**
* Log out
* Invalidate the token, so user cannot use it anymore
* They have to relogin to get a new token
*
* @param Request $request
*/
public function logout(Request $request) {
$this->validate($request, ['token' => 'required']);
try {
JWTAuth::invalidate($request->input('token'));
return response()->json(['success' => true, 'message'=> "You have successfully logged out."]);
} catch (JWTException $e) {
// something went wrong whilst attempting to encode the token
return response()->json(['success' => false, 'error' => 'Failed to logout, please try again.'], 500);
}
}
/**
* API Recover Password
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function recover(Request $request)
{
$user = User::where('email', $request->email)->first();
if (!$user) {
$error_message = "Your email address was not found.";
return response()->json(['success' => false, 'error' => ['email'=> $error_message]], 401);
}
try {
Password::sendResetLink($request->only('email'), function (Message $message) {
$message->subject('Your Password Reset Link');
});
} catch (\Exception $e) {
//Return with error
$error_message = $e->getMessage();
return response()->json(['success' => false, 'error' => $error_message], 401);
}
return response()->json([
'success' => true, 'data'=> ['message'=> 'A reset email has been sent! Please check your email.']
]);
}
/**
* API Verify User
*
* @param Request $request
* @return \Illuminate\Http\JsonResponse
*/
public function verifyUser($verification_code)
{
$check = DB::table('user_verifications')->where('token',$verification_code)->first();
if(!is_null($check)){
$user = User::find($check->user_id);
if($user->is_verified == 1){
return response()->json([
'success'=> true,
'message'=> 'Account already verified..'
]);
}
$user->update(['is_verified' => 1]);
DB::table('user_verifications')->where('token',$verification_code)->delete();
return response()->json([
'success'=> true,
'message'=> 'You have successfully verified your email address.'
]);
}
return response()->json(['success'=> false, 'error'=> "Verification code is invalid."]);
}
}
@@ -0,0 +1,26 @@
<?php
namespace App\Http\Controllers\Settings;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class PasswordController extends Controller
{
/**
* Update the user's password.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update(Request $request)
{
$this->validate($request, [
'password' => 'required|confirmed|min:6',
]);
$request->user()->update([
'password' => bcrypt($request->password),
]);
}
}
@@ -0,0 +1,27 @@
<?php
namespace App\Http\Controllers\Settings;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class ProfileController extends Controller
{
/**
* Update the user's profile information.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function update(Request $request)
{
$user = $request->user();
$this->validate($request, [
'name' => 'required',
'email' => 'required|email|unique:users,email,'.$user->id,
]);
return tap($user)->update($request->only('name', 'email'));
}
}
+7 -10
View File
@@ -18,7 +18,8 @@ class Kernel extends HttpKernel
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class, \App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\App\Http\Middleware\TrustProxies::class \App\Http\Middleware\TrustProxies::class,
\App\Http\Middleware\SetLocale::class,
]; ];
/** /**
@@ -28,12 +29,12 @@ class Kernel extends HttpKernel
*/ */
protected $middlewareGroups = [ protected $middlewareGroups = [
'web' => [ 'web' => [
\App\Http\Middleware\EncryptCookies::class, // \App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, // \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\StartSession::class,
// \Illuminate\Session\Middleware\AuthenticateSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class, // \Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class, // \App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class, \Illuminate\Routing\Middleware\SubstituteBindings::class,
], ],
@@ -54,12 +55,8 @@ class Kernel extends HttpKernel
'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'jwt.auth' => 'Tymon\JWTAuth\Middleware\GetUserFromToken',
'jwt.refresh' => 'Tymon\JWTAuth\Middleware\RefreshToken',
]; ];
} }
@@ -18,7 +18,7 @@ class RedirectIfAuthenticated
public function handle($request, Closure $next, $guard = null) public function handle($request, Closure $next, $guard = null)
{ {
if (Auth::guard($guard)->check()) { if (Auth::guard($guard)->check()) {
return redirect('/home'); return response()->json(['error' => 'Already authenticated.'], 400);
} }
return $next($request); return $next($request);
+49
View File
@@ -0,0 +1,49 @@
<?php
namespace App\Http\Middleware;
use Closure;
class SetLocale
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($locale = $this->parseLocale($request)) {
app()->setLocale($locale);
}
return $next($request);
}
/**
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function parseLocale($request)
{
$locales = config('app.locales');
$locale = $request->server('HTTP_ACCEPT_LANGUAGE');
$locale = substr($locale, 0, strpos($locale, ',') ?: strlen($locale));
if (array_key_exists($locale, $locales)) {
return $locale;
}
if (array_key_exists($locale, $locales)) {
return $locale;
}
$locale = substr($locale, 0, 2);
if (array_key_exists($locale, $locales)) {
return $locale;
}
}
}
+2 -2
View File
@@ -15,9 +15,9 @@ class TrustProxies extends Middleware
protected $proxies; protected $proxies;
/** /**
* The headers that should be used to detect proxies. * The current proxy header mappings.
* *
* @var string * @var array
*/ */
protected $headers = Request::HEADER_X_FORWARDED_ALL; protected $headers = Request::HEADER_X_FORWARDED_ALL;
} }
+23
View File
@@ -0,0 +1,23 @@
<?php
namespace App\Notifications;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Auth\Notifications\ResetPassword as Notification;
class ResetPassword extends Notification
{
/**
* Build the mail representation of the notification.
*
* @param mixed $notifiable
* @return \Illuminate\Notifications\Messages\MailMessage
*/
public function toMail($notifiable)
{
return (new MailMessage)
->line('You are receiving this email because we received a password reset request for your account.')
->action('Reset Password', url(config('app.url').'/password/reset/'.$this->token).'?email='.urlencode($notifiable->email))
->line('If you did not request a password reset, no further action is required.');
}
}
+39
View File
@@ -0,0 +1,39 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class OAuthProvider extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'oauth_providers';
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = ['id'];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'access_token', 'refresh_token',
];
/**
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function user()
{
return $this->belongsTo(User::class);
}
}
+11 -3
View File
@@ -2,8 +2,9 @@
namespace App\Providers; namespace App\Providers;
use Illuminate\Support\ServiceProvider; use Laravel\Dusk\DuskServiceProvider;
use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Schema;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider class AppServiceProvider extends ServiceProvider
{ {
@@ -13,7 +14,12 @@ class AppServiceProvider extends ServiceProvider
* @return void * @return void
*/ */
public function boot() public function boot()
{ {
/*
if ($this->app->runningUnitTests()) {
Schema::defaultStringLength(191);
}
*/
Schema::defaultStringLength(191); Schema::defaultStringLength(191);
} }
@@ -24,6 +30,8 @@ class AppServiceProvider extends ServiceProvider
*/ */
public function register() public function register()
{ {
// if ($this->app->environment('local', 'testing')) {
$this->app->register(DuskServiceProvider::class);
}
} }
} }
-1
View File
@@ -2,7 +2,6 @@
namespace App\Providers; namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider class AuthServiceProvider extends ServiceProvider
+43 -6
View File
@@ -5,6 +5,7 @@ namespace App;
use Tymon\JWTAuth\Contracts\JWTSubject; use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use App\Notifications\ResetPassword as ResetPasswordNotification;
class User extends Authenticatable implements JWTSubject class User extends Authenticatable implements JWTSubject
{ {
@@ -16,7 +17,7 @@ class User extends Authenticatable implements JWTSubject
* @var array * @var array
*/ */
protected $fillable = [ protected $fillable = [
'name', 'email', 'password', 'name', 'email', 'password',
]; ];
/** /**
@@ -29,22 +30,58 @@ class User extends Authenticatable implements JWTSubject
]; ];
/** /**
* Get the identifier that will be stored in the subject claim of the JWT. * The accessors to append to the model's array form.
* *
* @return mixed * @var array
*/
protected $appends = [
'photo_url',
];
/**
* Get the profile photo URL attribute.
*
* @return string
*/
public function getPhotoUrlAttribute()
{
return 'https://www.gravatar.com/avatar/'.md5(strtolower($this->email)).'.jpg?s=200&d=mm';
}
/**
* Get the oauth providers.
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function oauthProviders()
{
return $this->hasMany(OAuthProvider::class);
}
/**
* Send the password reset notification.
*
* @param string $token
* @return void
*/
public function sendPasswordResetNotification($token)
{
$this->notify(new ResetPasswordNotification($token));
}
/**
* @return int
*/ */
public function getJWTIdentifier() public function getJWTIdentifier()
{ {
return $this->getKey(); return $this->getKey();
} }
/** /**
* Return a key value array, containing any custom claims to be added to the JWT.
*
* @return array * @return array
*/ */
public function getJWTCustomClaims() public function getJWTCustomClaims()
{ {
return []; return [];
} }
} }
-48
View File
@@ -1,48 +0,0 @@
'use strict'
require('./check-versions')()
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
const server = require('pushstate-server')
var spinner = ora('building for '+ process.env.env_config+ ' environment...' )
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, (err, stats) => {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false
}) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
if(process.env.npm_config_preview){
server.start({
port: 9526,
directory: './dist',
file: '/index.html'
});
console.log('> Listening at ' + 'http://localhost:9526' + '\n')
}
})
})
-54
View File
@@ -1,54 +0,0 @@
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
const versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
}
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
const warnings = []
for (let i = 0; i < versionRequirements.length; i++) {
const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (let i = 0; i < warnings.length; i++) {
const warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.7 KiB

-101
View File
@@ -1,101 +0,0 @@
'use strict'
const path = require('path')
const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')
exports.assetsPath = function (_path) {
const assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
const cssLoader = {
loader: 'css-loader',
options: {
sourceMap: options.sourceMap
}
}
const postcssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
const output = []
const loaders = exports.cssLoaders(options)
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}
exports.createNotifierCallback = () => {
const notifier = require('node-notifier')
return (severity, errors) => {
if (severity !== 'error') return
const error = errors[0]
const filename = error.file && error.file.split('!').pop()
notifier.notify({
title: packageConfig.name,
message: severity + ': ' + error.name,
subtitle: filename || '',
icon: path.join(__dirname, 'logo.png')
})
}
}
-22
View File
@@ -1,22 +0,0 @@
'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap
module.exports = {
loaders: utils.cssLoaders({
sourceMap: sourceMapEnabled,
extract: isProduction
}),
cssSourceMap: sourceMapEnabled,
cacheBusting: config.dev.cacheBusting,
transformToRequire: {
video: ['src', 'poster'],
source: 'src',
img: 'src',
image: 'xlink:href'
}
}
-101
View File
@@ -1,101 +0,0 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
const createLintingRule = () => ({
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter'),
emitWarning: !config.dev.showEslintErrorsInOverlay
}
})
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
app: './resource/assets/js/main.js'
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('./resources/assets/js/'),
}
},
module: {
rules: [
...(config.dev.useEslint ? [createLintingRule()] : []),
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader?cacheDirectory',
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
},
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons')],
options: {
symbolId: 'icon-[name]'
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [resolve('src/icons')],
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
}
}
-38
View File
@@ -1,38 +0,0 @@
/**
* As our first step, we'll pull in the user's webpack.mix.js
* file. Based on what the user requests in that file,
* a generic config object will be constructed for us.
*/
let mix = require('./src/index');
let ComponentFactory = require('./src/components/ComponentFactory');
new ComponentFactory().installAll();
require(Mix.paths.mix());
/**
* Just in case the user needs to hook into this point
* in the build process, we'll make an announcement.
*/
Mix.dispatch('init', Mix);
/**
* Now that we know which build tasks are required by the
* user, we can dynamically create a configuration object
* for Webpack. And that's all there is to it. Simple!
*/
let WebpackConfig = require('./src/builder/WebpackConfig');
mix.webpackConfig({
resolve: {
alias: {
'@': resolve('./resources/assets/js/'),
}
}
})
module.exports = new WebpackConfig().build();
-88
View File
@@ -1,88 +0,0 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
clientLogLevel: 'warning',
historyApiFallback: true,
hot: true,
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true,
favicon: resolve('favicon.ico'),
title: 'vue-element-admin',
path: config.dev.assetsPublicPath + config.dev.assetsSubDirectory
}),
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})
-175
View File
@@ -1,175 +0,0 @@
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
const env = require('../config/'+process.env.env_config+'.env')
const webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true,
usePostCSS: true
})
},
devtool: config.build.productionSourceMap ? config.build.devtool : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false
}
},
sourceMap: config.build.productionSourceMap,
parallel: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css'),
// Setting the following option to `false` will not extract CSS from codesplit chunks.
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
allChunks: false,
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: config.build.productionSourceMap
? { safe: true, map: { inline: false } }
: { safe: true }
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
favicon: resolve('favicon.ico'),
title: 'vue-element-admin',
path: config.build.assetsPublicPath + config.build.assetsSubDirectory,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// keep module.id stable when vender modules does not change
new webpack.HashedModuleIdsPlugin(),
// enable scope hoisting
new webpack.optimize.ModuleConcatenationPlugin(),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks (module) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
minChunks: Infinity
}),
// This instance extracts shared chunks from code splitted chunks and bundles them
// in a separate chunk, similar to the vendor chunk
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
async: 'vendor-async',
children: true,
minChunks: 3
}),
// split echarts into its own file
new webpack.optimize.CommonsChunkPlugin({
async: 'echarts',
minChunks(module) {
var context = module.context;
return context && (context.indexOf('echarts') >= 0 || context.indexOf('zrender') >= 0);
}
}),
// split xlsx into its own file
new webpack.optimize.CommonsChunkPlugin({
async: 'xlsx',
minChunks(module) {
var context = module.context;
return context && (context.indexOf('xlsx') >= 0);
}
}),
// split codemirror into its own file
new webpack.optimize.CommonsChunkPlugin({
async: 'codemirror',
minChunks(module) {
var context = module.context;
return context && (context.indexOf('codemirror') >= 0);
}
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
if (config.build.productionGzip) {
const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.bundleAnalyzerReport) {
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig
+13 -11
View File
@@ -1,19 +1,21 @@
{ {
"name": "laravel/laravel", "name": "cretueusebiu/laravel-vue-spa",
"description": "The Laravel Framework.", "description": "A Laravel-Vue SPA starter project template.",
"keywords": ["framework", "laravel"], "keywords": ["spa", "laravel", "vue"],
"license": "MIT", "license": "MIT",
"type": "project", "type": "project",
"require": { "require": {
"php": "^7.1.3", "php": "^7.1.3",
"fideloper/proxy": "^4.0", "fideloper/proxy": "^4.0",
"laravel/framework": "5.6.*", "laravel/framework": "5.6.*",
"laravel/tinker": "^1.0", "laravel/socialite": "^3.0",
"tymon/jwt-auth": "dev-develop" "laravel/tinker": "~1.0",
"tymon/jwt-auth": "^1.0.0-rc.2"
}, },
"require-dev": { "require-dev": {
"filp/whoops": "^2.0", "filp/whoops": "^2.0",
"fzaninotto/faker": "^1.4", "fzaninotto/faker": "^1.4",
"laravel/dusk": "^3.0",
"mockery/mockery": "^1.0", "mockery/mockery": "^1.0",
"nunomaduro/collision": "^2.0", "nunomaduro/collision": "^2.0",
"phpunit/phpunit": "^7.0" "phpunit/phpunit": "^7.0"
@@ -35,6 +37,7 @@
"extra": { "extra": {
"laravel": { "laravel": {
"dont-discover": [ "dont-discover": [
"laravel/dusk"
] ]
} }
}, },
@@ -42,19 +45,18 @@
"post-root-package-install": [ "post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
], ],
"post-create-project-cmd": [
"@php artisan key:generate"
],
"post-autoload-dump": [ "post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump", "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover" "@php artisan package:discover"
],
"post-create-project-cmd": [
"@php artisan key:generate",
"@php artisan jwt:secret --force"
] ]
}, },
"config": { "config": {
"preferred-install": "dist", "preferred-install": "dist",
"sort-packages": true, "sort-packages": true,
"optimize-autoloader": true "optimize-autoloader": true
}, }
"minimum-stability": "dev",
"prefer-stable": true
} }
Generated
+564 -92
View File
File diff suppressed because it is too large Load Diff
+7 -3
View File
@@ -80,6 +80,12 @@ return [
'locale' => 'en', 'locale' => 'en',
'locales' => [
'en' => 'EN',
'zh-CN' => '中文',
'es' => 'ES',
],
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Application Fallback Locale | Application Fallback Locale
@@ -146,10 +152,10 @@ return [
Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class, Illuminate\View\ViewServiceProvider::class,
/* /*
* Package Service Providers... * Package Service Providers...
*/ */
Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
/* /*
* Application Service Providers... * Application Service Providers...
@@ -208,8 +214,6 @@ return [
'URL' => Illuminate\Support\Facades\URL::class, 'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class, 'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class, 'View' => Illuminate\Support\Facades\View::class,
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,
], ],
+2 -2
View File
@@ -14,7 +14,7 @@ return [
*/ */
'defaults' => [ 'defaults' => [
'guard' => 'web', 'guard' => 'api',
'passwords' => 'users', 'passwords' => 'users',
], ],
@@ -42,7 +42,7 @@ return [
], ],
'api' => [ 'api' => [
'driver' => 'token', 'driver' => 'jwt',
'provider' => 'users', 'provider' => 'users',
], ],
], ],
+1 -2
View File
@@ -36,8 +36,7 @@ return [
'secret' => env('PUSHER_APP_SECRET'), 'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'), 'app_id' => env('PUSHER_APP_ID'),
'options' => [ 'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'), //
'encrypted' => true,
], ],
], ],
+1 -4
View File
@@ -86,9 +86,6 @@ return [
| |
*/ */
'prefix' => env( 'prefix' => 'laravel',
'CACHE_PREFIX',
str_slug(env('APP_NAME', 'laravel'), '_').'_cache'
),
]; ];
-5
View File
@@ -1,5 +0,0 @@
module.exports = {
NODE_ENV: '"development"',
ENV_CONFIG: '"dev"',
BASE_API: '"https://api-dev"'
}
+4 -5
View File
@@ -37,7 +37,7 @@ return [
| may even configure multiple disks of the same driver. Defaults have | may even configure multiple disks of the same driver. Defaults have
| been setup for each driver as an example of the required options. | been setup for each driver as an example of the required options.
| |
| Supported Drivers: "local", "ftp", "sftp", "s3", "rackspace" | Supported Drivers: "local", "ftp", "s3", "rackspace"
| |
*/ */
@@ -57,11 +57,10 @@ return [
's3' => [ 's3' => [
'driver' => 's3', 'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'), 'key' => env('AWS_KEY'),
'secret' => env('AWS_SECRET_ACCESS_KEY'), 'secret' => env('AWS_SECRET'),
'region' => env('AWS_DEFAULT_REGION'), 'region' => env('AWS_REGION'),
'bucket' => env('AWS_BUCKET'), 'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
], ],
], ],
-83
View File
@@ -1,83 +0,0 @@
'use strict'
// Template version: 1.2.6
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
// Various Dev Server settings
host: 'localhost', // can be overwritten by process.env.HOST
port: 9527, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: true,
errorOverlay: true,
notifyOnErrors: false,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
// Use Eslint Loader?
// If true, your code will be linted during bundling and
// linting errors and warnings will be shown in the console.
useEslint: true,
// If true, eslint errors and warnings will also be shown in the error overlay
// in the browser.
showEslintErrorsInOverlay: false,
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: '#cheap-source-map',
// If you have problems debugging vue-files in devtools,
// set this to false - it *may* help
// https://vue-loader.vuejs.org/en/options.html#cachebusting
cacheBusting: true,
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
cssSourceMap: false,
},
build: {
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
// you can set by youself according to actual condition
assetsPublicPath: './',
/**
* Source Maps
*/
productionSourceMap: false,
// https://webpack.js.org/configuration/devtool/#production
devtool: '#source-map',
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
}
}
-5
View File
@@ -1,5 +0,0 @@
module.exports = {
NODE_ENV: '"production"',
ENV_CONFIG: '"prod"',
BASE_API: '"https://api-prod"'
}
+9 -10
View File
@@ -4,12 +4,14 @@ return [
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| Default Queue Connection Name | Default Queue Driver
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
| |
| Laravel's queue API supports an assortment of back-ends via a single | Laravel's queue API supports an assortment of back-ends via a single
| API, giving you convenient access to each back-end using the same | API, giving you convenient access to each back-end using the same
| syntax for every one. Here you may define a default connection. | syntax for each one. Here you may set the default queue driver.
|
| Supported: "sync", "database", "beanstalkd", "sqs", "redis", "null"
| |
*/ */
@@ -24,8 +26,6 @@ return [
| is used by your application. A default configuration has been added | is used by your application. A default configuration has been added
| for each back-end shipped with Laravel. You are free to add more. | for each back-end shipped with Laravel. You are free to add more.
| |
| Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
|
*/ */
'connections' => [ 'connections' => [
@@ -50,11 +50,11 @@ return [
'sqs' => [ 'sqs' => [
'driver' => 'sqs', 'driver' => 'sqs',
'key' => env('SQS_KEY', 'your-public-key'), 'key' => 'your-public-key',
'secret' => env('SQS_SECRET', 'your-secret-key'), 'secret' => 'your-secret-key',
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'), 'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id',
'queue' => env('SQS_QUEUE', 'your-queue-name'), 'queue' => 'your-queue-name',
'region' => env('SQS_REGION', 'us-east-1'), 'region' => 'us-east-1',
], ],
'redis' => [ 'redis' => [
@@ -62,7 +62,6 @@ return [
'connection' => 'default', 'connection' => 'default',
'queue' => 'default', 'queue' => 'default',
'retry_after' => 90, 'retry_after' => 90,
'block_for' => null,
], ],
], ],
+5
View File
@@ -35,4 +35,9 @@ return [
'secret' => env('STRIPE_SECRET'), 'secret' => env('STRIPE_SECRET'),
], ],
'github' => [
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
],
]; ];
+1 -1
View File
@@ -29,7 +29,7 @@ return [
| |
*/ */
'lifetime' => env('SESSION_LIFETIME', 120), 'lifetime' => 120,
'expire_on_close' => false, 'expire_on_close' => false,
-5
View File
@@ -1,5 +0,0 @@
module.exports = {
NODE_ENV: '"production"',
ENV_CONFIG: '"sit"',
BASE_API: '"https://api-sit"'
}
+3 -1
View File
@@ -14,10 +14,12 @@ use Faker\Generator as Faker;
*/ */
$factory->define(App\User::class, function (Faker $faker) { $factory->define(App\User::class, function (Faker $faker) {
static $password;
return [ return [
'name' => $faker->name, 'name' => $faker->name,
'email' => $faker->unique()->safeEmail, 'email' => $faker->unique()->safeEmail,
'password' => '$2y$10$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 'password' => $password ?: $password = bcrypt('secret'),
'remember_token' => str_random(10), 'remember_token' => str_random(10),
]; ];
}); });
@@ -17,7 +17,7 @@ class CreateUsersTable extends Migration
$table->increments('id'); $table->increments('id');
$table->string('name'); $table->string('name');
$table->string('email')->unique(); $table->string('email')->unique();
$table->string('password'); $table->string('password')->nullable();
$table->rememberToken(); $table->rememberToken();
$table->timestamps(); $table->timestamps();
}); });
@@ -0,0 +1,41 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateOauthProvidersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('oauth_providers', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('provider');
$table->string('provider_user_id')->index();
$table->string('access_token')->nullable();
$table->string('refresh_token')->nullable();
$table->timestamps();
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('oauth_providers');
}
}
@@ -1,39 +0,0 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateUserVerificationsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('user_verifications', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('token');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
Schema::table('users', function (Blueprint $table) {
$table->boolean('is_verified')->default(0);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists("user_verifications");
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('is_verified');
});
}
}
+28 -14
View File
@@ -7,23 +7,37 @@
"watch-poll": "npm run watch -- --watch-poll", "watch-poll": "npm run watch -- --watch-poll",
"hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"prod": "npm run production", "prod": "npm run production",
"production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
}, "lint": "vue-cli-service lint resources/assets/js"
"devDependencies": {
"axios": "^0.16.2",
"bootstrap-sass": "^3.3.7",
"cross-env": "^5.0.1",
"jquery": "^3.1.1",
"laravel-mix": "^1.0",
"lodash": "^4.17.4",
"vue": "^2.1.10"
}, },
"dependencies": { "dependencies": {
"js-cookie": "^2.1.4", "@fortawesome/fontawesome": "^1.1.4",
"popper.js": "^1.14.3", "@fortawesome/fontawesome-free-brands": "^5.0.8",
"vue-resource": "^1.3.4", "@fortawesome/fontawesome-free-regular": "^5.0.8",
"@fortawesome/fontawesome-free-solid": "^5.0.8",
"@fortawesome/vue-fontawesome": "^0.0.22",
"axios": "^0.18.0",
"bootstrap": "^4.0.0",
"jquery": "^3.3.1",
"js-cookie": "^2.2.0",
"popper.js": "^1.14.1",
"sweetalert2": "^7.15.1",
"vform": "^1.0.0",
"vue": "^2.5.16",
"vue-i18n": "^7.6.0",
"vue-meta": "^1.4.4",
"vue-router": "^3.0.1", "vue-router": "^3.0.1",
"vuex": "^3.0.1", "vuex": "^3.0.1",
"bootstrap": "^4.0.0" "vuex-router-sync": "^5.0.0"
},
"devDependencies": {
"@vue/cli-plugin-eslint": "^3.0.0-beta.6",
"@vue/cli-service": "^3.0.0-beta.6",
"@vue/eslint-config-standard": "^3.0.0-beta.6",
"babel-plugin-syntax-dynamic-import": "^6.18.0",
"cross-env": "^5.1.4",
"laravel-mix": "^2.1.1",
"vue-template-compiler": "^2.5.16",
"webpack-bundle-analyzer": "^2.11.1"
} }
} }
+2 -1
View File
@@ -27,6 +27,7 @@
<env name="CACHE_DRIVER" value="array"/> <env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/> <env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/> <env name="QUEUE_DRIVER" value="sync"/>
<env name="MAIL_DRIVER" value="array"/> <env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
</php> </php>
</phpunit> </phpunit>
+5 -5
View File
@@ -1,14 +1,10 @@
<IfModule mod_rewrite.c> <IfModule mod_rewrite.c>
<IfModule mod_negotiation.c> <IfModule mod_negotiation.c>
Options -MultiViews -Indexes Options -MultiViews
</IfModule> </IfModule>
RewriteEngine On RewriteEngine On
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
# Redirect Trailing Slashes If Not A Folder... # Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} (.+)/$ RewriteCond %{REQUEST_URI} (.+)/$
@@ -18,4 +14,8 @@
RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L] RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule> </IfModule>
+12306 -4
View File
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M931.6 585.6v79c28.6-60.2 44.8-127.4 44.8-198.4C976.4 211 769.4 4 514.2 4S52 211 52 466.2c0 3.2.2 6.4.2 9.6l166-206h96.4L171.8 485.6h46.4v-54.8l99.2-154.6V668h-99.2v-82.4H67.6c43 161 170.6 287.4 332.4 328.6-10.4 26.2-40.6 89.4-90.8 100.6-62.2 14 168.8 3.4 333.6-104.6C769.4 873.6 873.6 784.4 930.2 668h-97.6v-82.4H666.4V476l166.2-206.2h94L786.2 485.6h46.4v-59l99.2-154v313zM366.2 608c-4.8-11.2-7.2-23.2-7.2-36V357.6c0-12.8 2.4-24.8 7.2-36 4.8-11.2 11.4-21 19.6-29.2 8.2-8.2 18-14.8 29.2-19.6 11.2-4.8 23.2-7.2 36-7.2h81.6c12.8 0 24.8 2.4 36 7.2 11 4.8 20.6 11.2 28.8 19.2l-88.6 129.4v-23c0-4.8-1.6-8.8-4.8-12-3.2-3.2-7.2-4.8-12-4.8s-8.8 1.6-12 4.8c-3.2 3.2-4.8 7.2-4.8 12v72L372.6 620c-2.4-3.8-4.6-7.8-6.4-12zm258.2-36c0 12.8-2.4 24.8-7.2 36-4.8 11.2-11.4 21-19.6 29.2-8.2 8.2-18 14.8-29.2 19.6-11.2 4.8-23.2 7.2-36 7.2h-81.6c-12.8 0-24.8-2.4-36-7.2-11.2-4.8-21-11.4-29.2-19.6-3.6-3.6-7-7.8-10-12l99.2-144.6v50.6c0 4.8 1.6 8.8 4.8 12 3.2 3.2 7.2 4.8 12 4.8s8.8-1.6 12-4.8c3.2-3.2 4.8-7.2 4.8-12v-99.6L601 296.4c6.6 7.4 12 15.8 16 25.2 4.8 11.2 7.2 23.2 7.2 36V572z"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M969.143 548.571q0 14.848-10.862 25.71t-25.71 10.862h-128q0 97.719-38.29 165.705L885.138 870.29Q896 881.152 896 896t-10.862 25.71q-10.276 10.861-25.71 10.861t-25.71-10.861l-113.15-112.567q-2.853 2.852-8.558 7.424t-23.99 16.274-37.157 20.846-46.848 16.567-55.443 7.424v-512H475.43v512q-29.148 0-58.003-7.717t-49.7-18.87-37.705-22.273-24.869-18.578l-8.558-8.01-104.557 118.273q-11.447 11.995-27.429 11.995-13.714 0-24.576-9.143-10.862-10.276-11.703-25.417t8.85-26.587L252.6 741.632q-33.134-65.134-33.134-156.562h-128q-14.848 0-25.71-10.862t-10.861-25.71 10.861-25.71 25.71-10.861h128v-168.01l-98.852-98.852q-10.862-10.862-10.862-25.71t10.862-25.71 25.71-10.861 25.709 10.862l98.853 98.852H753.19l98.852-98.852q10.862-10.862 25.71-10.862t25.71 10.862 10.861 25.71-10.861 25.71l-98.853 98.852v168.009h128q14.848 0 25.71 10.862t10.861 25.71zM694.857 219.43H329.143q0-75.996 53.43-129.427T512 36.572t129.426 53.43 53.431 129.427z"/></svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M64 448h256v512H64V448zm640-192h256v704H704V256zM384 64h256v896H384V64z"/></svg>

Before

Width:  |  Height:  |  Size: 210 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M438.857 950.857h512V585.143H713.143q-22.82 0-38.839-16.018t-16.018-38.84V292.572H438.857v658.286zM585.143 128V91.429q0-7.461-5.413-12.874t-12.873-5.412H164.571q-7.46 0-12.873 5.412t-5.412 12.874V128q0 7.46 5.412 12.873t12.873 5.413h402.286q7.46 0 12.873-5.413T585.143 128zm146.286 384H902.29L731.43 341.138V512zM1024 585.143v384q0 22.82-16.018 38.839T969.142 1024h-548.57q-22.821 0-38.84-16.018t-16.018-38.84v-91.428H54.857q-22.82 0-38.839-16.018T0 822.857v-768q0-22.82 16.018-38.839T54.858 0H676.57q22.821 0 38.84 16.018t16.018 38.84v187.464q11.995 7.46 20.553 16.019l233.18 233.179q16.017 16.018 27.428 43.447t11.41 50.322z"/></svg>

Before

Width:  |  Height:  |  Size: 765 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M64 64h384v384H64V64zm0 512h384v384H64V576zm512 0h384v384H576V576zm192-128c106.039 0 192-85.961 192-192S874.039 64 768 64s-192 85.961-192 192 85.961 192 192 192z"/></svg>

Before

Width:  |  Height:  |  Size: 300 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="32" height="32"><defs><style/></defs><path d="M219.429 658.286q0-30.286-21.429-51.715t-51.714-21.428T94.57 606.57t-21.428 51.715T94.57 710t51.715 21.429T198 710t21.429-51.714zm109.714-256q0-30.286-21.429-51.715T256 329.143t-51.714 21.428-21.429 51.715T204.286 454 256 475.429 307.714 454t21.429-51.714zm244.571 274.857l57.715-218.286q3.428-14.857-4.286-27.714t-22-16.857T577.714 418t-17.143 22.571l-57.714 218.286q-34.286 2.857-61.143 24.857t-36 56.286q-11.428 44 11.429 83.429T484 874.286t83.429-11.429T618.286 796q9.143-34.286-3.429-66.857t-41.143-52zm377.143-18.857q0-30.286-21.428-51.715t-51.715-21.428T826 606.57t-21.429 51.715T826 710t51.714 21.429T929.43 710t21.428-51.714zM585.143 292.57q0-30.285-21.429-51.714T512 219.43t-51.714 21.428-21.429 51.714 21.429 51.715T512 365.714t51.714-21.428 21.429-51.715zm256 109.715q0-30.286-21.429-51.715T768 329.143t-51.714 21.428-21.429 51.715T716.286 454 768 475.429 819.714 454t21.429-51.714zm182.857 256q0 149.143-80.571 276-10.858 16.571-30.858 16.571H111.43q-20 0-30.858-16.571Q0 808 0 658.286q0-104 40.571-198.857T149.714 296t163.429-109.143T512 146.286t198.857 40.571T874.286 296t109.143 163.429T1024 658.286z"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M554.667 384h234.666L554.667 149.333V384M256 85.333h341.333l256 256v512A85.333 85.333 0 0 1 768 938.667H256a85.333 85.333 0 0 1-85.333-85.334V170.667A85.038 85.038 0 0 1 256 85.333M640 768v-85.333H256V768h384m128-170.667V512H256v85.333h512z"/></svg>

Before

Width:  |  Height:  |  Size: 379 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M574.958 267.016h-63.454 204.649L511.213 63.655 307.85 267.016h141.191V456.68H258.688v125.917H449.04V772.95h125.917V582.596h188.875V456.679H574.958V267.016zm-63.704 693.33l189.62-187.396H323.126l188.129 187.395zM71.292 518.891l187.395 189.62v-377.75L71.292 518.892zm692.54-188.13v377.75L952.708 518.89 763.833 330.762z"/></svg>

Before

Width:  |  Height:  |  Size: 457 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M513 583.8l448.5-448.5c-11.6-4.7-24.3-7.3-37.5-7.3H100c-12.7 0-24.9 2.4-36.1 6.7L513 583.8z"/><path d="M513 674.3L14.6 175.9C5.3 191.1 0 208.9 0 228v568c0 55.2 44.8 100 100 100h824c55.2 0 100-44.8 100-100V228c0-18.5-5.1-35.9-13.9-50.8L513 674.3z"/></svg>

Before

Width:  |  Height:  |  Size: 384 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M770.56 460.8h250.88C998.4 220.16 803.84 25.6 563.2 2.56v250.88c104.96 20.48 186.88 102.4 207.36 207.36zM460.8 253.44V2.56C220.16 25.6 25.6 220.16 2.56 460.8h250.88c20.48-104.96 102.4-186.88 207.36-207.36zm102.4 517.12v250.88c243.2-23.04 435.2-217.6 460.8-460.8H773.12C750.08 668.16 668.16 750.08 563.2 770.56zM253.44 563.2H2.56c23.04 243.2 217.6 435.2 460.8 460.8V773.12C355.84 750.08 273.92 668.16 253.44 563.2zm0 0"/></svg>

Before

Width:  |  Height:  |  Size: 556 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M625.664 132.608v67.072h309.76v43.008h-309.76v69.632h309.76v43.008h-309.76v68.608h309.76v43.008h-309.76v68.608h309.76v43.008h-309.76v68.608h309.76v43.008h-309.76v68.096h309.76v43.008h-309.76v89.088H1024v-757.76H625.664zM0 914.944L577.024 1024V0L0 109.056"/><path d="M229.376 660.48h-89.6l118.272-187.904-112.64-180.736h92.16l65.536 119.808 67.584-119.808h89.088l-112.64 177.664L466.944 660.48h-93.696l-70.144-125.44-73.728 125.44z"/></svg>

Before

Width:  |  Height:  |  Size: 569 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M941.677 391.71c9.338-14.006 6.225-32.681-6.225-43.575-14.006-10.894-32.681-7.781-43.575 6.225-1.557 1.556-174.3 205.426-379.728 205.426-199.2 0-379.727-205.426-381.283-206.982-10.895-12.45-31.125-14.006-43.576-3.113-12.45 10.894-14.006 31.125-3.113 43.576 3.113 4.668 40.463 46.687 99.6 93.375l-79.37 82.482c-12.45 12.45-10.893 32.681 1.557 43.575 3.113 6.225 10.894 9.338 18.676 9.338 7.78 0 15.562-3.113 21.787-9.338l85.594-88.706c40.463 28.013 88.707 54.47 141.62 73.144l-32.682 110.495c-4.668 17.118 4.67 34.237 21.788 38.906h9.337c14.006 0 26.457-9.338 29.569-23.344l32.681-110.495c24.9 4.669 51.357 7.782 77.813 7.782s52.913-3.113 77.814-7.782l32.68 108.939c3.114 14.006 17.12 23.343 29.57 23.343 3.113 0 6.225 0 7.782-1.556 17.118-4.67 26.456-21.787 21.788-38.906L649.099 595.58c52.914-18.676 101.157-45.132 141.62-73.144l84.038 87.15c6.225 6.225 14.006 9.338 21.787 9.338 7.781 0 15.563-3.113 21.787-9.337 12.45-12.451 12.45-31.125 1.557-43.576l-79.37-82.481c63.808-46.689 101.16-91.82 101.16-91.82z"/></svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1069 1024" xmlns="http://www.w3.org/2000/svg" width="66.813" height="64"><defs><style/></defs><path d="M746.028 190.084q-11.242 0-18.906-7.665t-12.775-17.884-7.664-20.95-2.555-17.884V0h2.044q9.197 0 17.373 2.044t19.928 9.708 28.615 21.462 42.411 36.279q27.593 24.527 43.944 41.39t25.038 28.614 10.73 19.928 2.044 14.308v16.35H746.028zm317.828 481.341q3.066 8.176 4.088 20.44t-10.22 23.504q-5.11 5.11-9.197 9.709t-7.154 7.665q-4.088 4.087-7.153 6.131l-86.867-85.844q6.132-5.11 13.797-12.264t12.774-11.241q12.264-11.242 26.571-9.709T1024 626.46q10.22 5.11 21.972 17.884t17.884 27.082zm-360.75 95.042q22.483 0 37.812-12.263l-198.26 206.435h-282.06q-19.416 0-42.41-11.242t-42.923-29.637-33.213-42.41-13.286-49.566V131.832q0-21.46 9.709-44.966t26.57-42.41 38.324-31.682T248.335 0h391.41v127.745q0 19.417 6.131 41.9t18.906 41.389 33.214 31.68 49.054 12.775h149.205v338.267L756.248 738.874q11.241-16.351 11.241-35.768 0-26.571-18.906-45.477t-45.477-18.906H319.872q-26.57 0-44.966 18.906t-18.395 45.477 18.395 44.966 44.966 18.395h383.234zM319.872 383.234q-26.57 0-44.966 18.906t-18.395 45.477 18.395 44.966 44.966 18.395h383.234q26.57 0 45.477-18.395t18.906-44.966-18.906-45.477-45.477-18.906H319.872zm385.278 512l13.285-13.286 25.549-25.549q15.33-15.33 33.725-34.235t36.79-37.302q43.944-43.944 99.13-98.108l85.844 85.845-99.13 99.13-36.79 36.79-33.725 33.725q-14.307 14.307-24.016 24.526t-10.73 11.242q-5.11 4.088-11.242 8.687t-12.263 7.664-18.906 7.665-26.06 8.687-25.55 7.153-18.394 4.088q-12.264 2.044-16.352-3.066t-2.044-17.373q1.022-6.132 4.088-18.395t7.154-25.038 7.665-24.016 5.62-15.33q6.132-13.285 16.352-23.504z"/></svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M871.424 61.44q18.432 0 34.816 6.656t28.672 18.944 19.456 28.672 7.168 35.84v720.896q0 38.912-25.088 64.512t-62.976 25.6h-721.92q-40.96 0-66.048-26.624t-25.088-66.56V150.528q0-35.84 24.576-62.464t65.536-26.624h720.896zm-237.568 768q18.432 0 26.624-8.704t8.192-23.04q0-13.312-8.192-22.528t-26.624-9.216h-62.464q1.024-2.048 1.024-6.144V251.904h63.488q18.432 0 25.6-9.216t7.168-22.528-7.168-22.528-25.6-9.216H386.048q-18.432 0-25.6 9.216t-7.168 22.528 7.168 22.528 25.6 9.216h57.344v507.904q0 2.048.512 3.072t.512 3.072h-56.32q-18.432 0-26.624 9.216t-8.192 22.528q0 14.336 8.192 23.04t26.624 8.704h245.76z"/></svg>

Before

Width:  |  Height:  |  Size: 741 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="32" height="32"><defs><style/></defs><path d="M666.298 824.087c-12.567-30.72-54.225-83.316-123.578-156.392-18.618-19.55-17.455-34.444-10.705-78.895v-5.12c4.421-30.487 12.101-48.407 114.501-64.698 52.131-8.146 65.63 12.567 84.713 41.425l6.284 9.542a101.004 101.004 0 0 0 51.432 41.658c9.077 4.19 20.248 9.31 35.375 17.92 36.77 20.248 36.77 43.288 36.77 94.022v5.818a215.273 215.273 0 0 1-41.425 139.637 472.436 472.436 0 0 1-152.203 88.203c27.927-52.363 6.516-114.502 0-132.422zM512 40.96a468.015 468.015 0 0 1 203.87 46.545 434.502 434.502 0 0 0-102.866 82.619c-7.448 10.24-13.731 19.781-19.782 28.625-19.55 29.556-29.091 42.822-46.546 44.916a200.844 200.844 0 0 1-33.745 0c-34.211-2.327-80.756-5.12-95.651 35.375-9.542 25.833-11.17 95.65 19.55 131.956a32.35 32.35 0 0 1 2.56 28.626 56.087 56.087 0 0 1-16.525 25.833 151.505 151.505 0 0 1-23.272-23.273 151.273 151.273 0 0 0-66.56-52.83c-10.008-2.792-21.178-5.12-31.884-7.447-30.254-6.283-64.233-13.498-72.145-30.487a119.156 119.156 0 0 1-5.819-46.545 175.476 175.476 0 0 0-11.17-74.008 70.982 70.982 0 0 0-44.451-39.563A469.644 469.644 0 0 1 512 40.96zM0 512A512 512 0 1 0 512 0 512 512 0 0 0 0 512z"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1088 1024" xmlns="http://www.w3.org/2000/svg" width="34" height="32"><defs><style/></defs><path d="M729.6 294.4c19.2 57.6 44.8 102.4 89.6 147.2 38.4-38.4 64-89.6 83.2-147.2H729.6zm-422.4 320h166.4l-83.2-224z"/><path d="M947.2 0h-768c-70.4 0-128 57.6-128 128v768c0 70.4 57.6 128 128 128h768c70.4 0 128-57.6 128-128V128c0-70.4-51.2-128-128-128zM633.6 825.6c-12.8 12.8-25.6 12.8-38.4 12.8-6.4 0-19.2 0-25.6-6.4s-12.8 0-12.8-6.4-6.4-12.8-12.8-25.6-6.4-19.2-12.8-32l-25.6-70.4h-224L256 768c-12.8 25.6-19.2 44.8-25.6 57.6-6.4 12.8-19.2 12.8-38.4 12.8-12.8 0-25.6-6.4-38.4-12.8-12.8-12.8-19.2-19.2-19.2-32 0-6.4 0-12.8 6.4-25.6s6.4-19.2 12.8-32l140.8-358.4c6.4-12.8 6.4-25.6 12.8-38.4s12.8-25.6 19.2-32 12.8-19.2 25.6-25.6c12.8-6.4 25.6-6.4 38.4-6.4 12.8 0 25.6 0 38.4 6.4 12.8 6.4 19.2 12.8 25.6 25.6 6.4 6.4 12.8 19.2 19.2 32 6.4 12.8 12.8 25.6 19.2 44.8l140.8 352c12.8 25.6 19.2 44.8 19.2 57.6-6.4 6.4-12.8 19.2-19.2 32zm352-249.6c-70.4-25.6-121.6-57.6-166.4-96-44.8 44.8-102.4 76.8-172.8 96l-19.2-32c70.4-19.2 128-44.8 172.8-89.6-44.8-44.8-83.2-102.4-96-166.4h-64v-25.6h172.8c-12.8-19.2-25.6-44.8-38.4-64l19.2-6.4c12.8 19.2 32 44.8 44.8 70.4h160v32h-64c-19.2 64-51.2 121.6-89.6 160 44.8 38.4 96 70.4 166.4 89.6l-25.6 32z"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M818.247 412.327h-45.989v-70.992c0-152.308-123.463-275.779-275.778-275.779S220.698 189.027 220.698 341.335v70.992h-45.987c-25.379 0-45.988 20.566-45.988 45.987v455.407c0 25.428 20.56 45.989 45.988 45.989h643.536c25.377 0 45.988-20.56 45.988-45.989V458.314c-.045-25.42-20.611-45.987-45.988-45.987zm-137.915 0H312.625v-70.992c0-101.554 82.345-183.853 183.855-183.853 101.51 0 183.853 82.343 183.853 183.853v70.992h-.001zm0 0"/></svg>

Before

Width:  |  Height:  |  Size: 561 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="32" height="32"><defs><style/></defs><path d="M0 202.7V631c0 83.3 68.3 150.7 152.6 150.7h228.9l8 190.3 224.9-190.3h257c84.3 0 152.6-67.4 152.6-150.7V202.7C1024 119.4 955.7 52 871.4 52H152.6C68.3 52 0 119.4 0 202.7zm658.6 237.9c0-39.7 32.1-71.4 72.3-71.4 40.2 0 72.3 31.7 72.3 71.4S771 512 730.9 512c-40.2 0-72.3-31.7-72.3-71.4zm-220.9 0c0-39.7 32.1-71.4 72.3-71.4 40.2 0 72.3 31.7 72.3 71.4S550.1 512 510 512c-40.2 0-72.3-31.7-72.3-71.4zm-216.8 0c0-39.7 32.1-71.4 72.3-71.4 40.2 0 72.3 31.7 72.3 71.4S333.3 512 293.1 512c-40.1 0-72.2-31.7-72.2-71.4z"/></svg>

Before

Width:  |  Height:  |  Size: 642 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="32" height="32"><defs><style/></defs><path d="M463.3 958.3V772.1H228.8v-77.5h234.5v-80.5H228.8v-83.5H420L191.5 128h113.7L469 420.6c18.2 33.4 32.4 62.4 42.7 86.9 9-19.8 24.6-50.5 46.8-92.1L713.9 128h120.8L605.5 530.6h192.9v83.5H564.9v80.5h233.5v77.5H564.9v186.2H463.3z"/></svg>

Before

Width:  |  Height:  |  Size: 360 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M780.8 354.58H665.6v-42.89c0-72.31-19.85-193.3-153.6-193.3-138.87 0-153.6 135.05-153.6 193.3v42.89H243.2v-42.89C243.2 122.25 348.79 0 512 0s268.8 122.25 268.8 311.69v42.89zm-192 314.84c0-43.52-34.58-78.65-76.8-78.65s-76.8 35.13-76.8 78.65c0 29.46 15.4 54.47 38.44 67.82v89.64c0 21.74 17.25 39.7 38.4 39.7s38.4-17.96 38.4-39.7v-89.64c23-13.35 38.36-38.36 38.36-67.82zM896 512v393.61c0 65.26-51.87 118.39-115.2 118.39H243.2c-63.291 0-115.2-53.13-115.2-118.39V512c0-65.22 51.87-118.39 115.2-118.39h537.6c63.33 0 115.2 53.17 115.2 118.39z"/></svg>

Before

Width:  |  Height:  |  Size: 673 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M780.108 761.059c54.451 60.351 87.706 138.983 87.706 225.358 0 12.015-.659 23.882-1.902 35.581h-71.955c1.589-11.675 2.695-23.493 2.695-35.581 0-71.578-29.094-136.386-76.189-185.002C658.778 836.02 587.76 855.95 512 855.95c-75.689 0-146.65-19.888-208.294-54.432-47.129 48.604-76.358 113.305-76.358 184.9 0 12.088 1.105 23.906 2.695 35.581h-71.955a336.63 336.63 0 0 1-1.902-35.581c0-86.366 33.19-165.055 87.587-225.446-96.765-78.277-158.75-197.84-158.75-331.998C85.023 193.163 276.188 2.001 512 2.001s426.977 191.162 426.977 426.972c0 134.211-62.037 253.812-158.869 332.086zM512 295.787c-196.511 0-355.814-80.302-355.814 122.251 0 202.551 159.303 366.749 355.814 366.749s355.814-164.199 355.814-366.749c0-202.553-159.303-122.251-355.814-122.251zm166.047 204.349c-26.2 0-47.442-21.24-47.442-47.442 0-26.197 21.242-47.442 47.442-47.442 26.202 0 47.442 21.244 47.442 47.442-.001 26.202-21.24 47.442-47.442 47.442zm-23.721 130.465c0 32.754-63.722 59.302-142.326 59.302s-142.326-26.549-142.326-59.302c0-8.445 4.376-16.446 12.017-23.719 21.98 20.927 71.979 35.579 130.309 35.579s108.329-14.652 130.309-35.579c7.64 7.273 12.017 15.274 12.017 23.719zM345.953 500.136c-26.202 0-47.442-21.24-47.442-47.442 0-26.197 21.24-47.442 47.442-47.442 26.2 0 47.442 21.244 47.442 47.442 0 26.202-21.242 47.442-47.442 47.442z"/></svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="32" height="32"><defs><style/></defs><path d="M765.184 873.941c0 33.28-28.501 60.288-63.83 60.288H63.83C28.501 934.23 0 907.221 0 873.941c0-120.576 123.264-233.258 249.216-277.674-72.79-42.496-121.728-118.059-121.728-204.8v-60.331c0-133.248 114.347-241.365 255.147-241.365S637.78 197.888 637.78 331.136v60.288c0 86.827-48.981 162.304-121.728 204.843 125.91 44.458 249.131 157.098 249.131 277.674z"/><path d="M848.256 870.57h126.933c27.008 0 48.811-20.65 48.811-46.08 0-92.245-94.293-178.346-190.55-212.309 55.638-32.512 93.1-90.282 93.1-156.672v-46.165c0-101.888-87.425-184.576-195.115-184.576a207.25 207.25 0 0 0-39.126 3.712c15.488 31.147 24.15 65.92 24.15 102.613v60.288c0 86.827-24.448 152.747-88.534 204.843 118.742 29.141 218.496 154.795 220.331 274.347z"/></svg>

Before

Width:  |  Height:  |  Size: 853 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M273.51 480.174l-1.198-3.727-.972-4.844-.646-2.652v-10.926l1.158-4.3 1.177-4.547 1.557-4.772 2.099-5.315 2.754-5.52 3.892-5.529v-3.87l.378-3.625.605-4.926 1.669-5.54 1.536-5.98 1.229-2.744 1.413-2.56 1.822-2.847 1.987-2.12v-13.67l1.147-7.045 1.157-8.182 2.058-9.79 2.837-10.188 2.11-5.601 2.088-6.093 2.294-5.683 2.744-6.093 2.796-6.666 3.215-6.247 3.615-6.666 4.557-6.656 2.109-3.82 2.243-3.123 4.884-7.045 5.028-7.025 5.704-7.229 6.113-7.035 6.635-6.932 6.923-7.127 8.376-7.69 5.314-4.68 6.482-5.049 6.574-4.454 7.107-4.28 6.83-3.81 7.7-3.154 8.182-3.88 8.13-2.663 8.111-2.765 8.765-2.744 8.756-2.089 9.205-1.74 9.34-1.506 9.215-1.229 9.206-1.26 9.82-.532h29.01l9.667 1.219 9.717 1.157 9.902 1.034 9.196 2.212 9.708 2.068 9.113 2.376 9.984 2.652 9.134 3.236 8.745 3.697 9.339 3.911 8.52 4.27 8.284 4.752 8.12 5.232 6.994 4.864 3.246 2.745 3.4 2.007 6.492 5.509 5.468 5.325 5.458 5.509 5.315 6.082 4.382 5.899 5.223 6.092 3.635 6.544 3.686 5.816 3.912 6.769 3.246 5.888 5.458 12.462 2.683 6.44 2.1 5.97 2.098 6.483 1.885 6.092 1.31 5.243 1.7 6.165 2.98 11.008 1.905 9.636 1.239 9.318 1.065 7.496 1.679 11.417.379 1.813 1.341 2.058 3.615 5.909 2.324 4.003 2.059 4.168 2.621 4.465 2.314 5.355 1.506 5.479 1.638 6.01 1.24 6.165.562 3.031.523 3.738v3.246l-.523 3.215v4.004l-.942 3.88-1.72 7.517-1.976 3.799-1.465 4.27v1.065l.697 1.321 1.966 3.123 8.56 12.667 6.759 9.513 3.236 6.349 4.362 6.953 3.799 7.618 4.383 8.141 4.382 9.155 4.936 10.363 2.785 6.348 2.54 6.206 2.191 6.543 2.16 5.888 1.65 6.185 1.679 5.806 2.12 11.326 1.679 11.57 1.157 10.261v14.48l-.778 5.13-1.106 8.858-1.516 7.956-2.355 7.22-.88 2.938-1.65 3.543-1.371 2.468-1.844 3.041-1.618 1.915-2.058 2.478-1.843 1.997-1.966 1.71-2.355 1.034-2.12 1.035-1.74.573h-2.664l-1.7-.573-3.236-1.598-1.485-1.065-1.556-1.116-1.7-1.526-1.72-1.71-2.837-3.154-3.358-4.454-2.642-4.598-2.642-3.676-2.58-4.28-3.636-7.598-4.086-7.906-.481-.276h-.676l-1.659 1.239-.962 2.079-1.598 2.58-2.785 7.68-4.198 10.926-5.376 13.148-4.045 6.554-4.24 6.84-5.038 7.69-5.345 7.527-2.734 3.41-3.318 3.717-7.629 7.496.666.675 1.034 1.076 3.81 2.232 15.872 7.629 6.922 3.901 6.605 3.789 6.533 4.772 5.826 4.915 2.816 2.222 2.12 2.56 2.181 2.97 1.802 3.215.973 2.673 1.188 3.205.512 2.775.563 3.236-.563 2.17v2.202l-.512 2.273-1.188 2.08-.45 1.627-1.086 1.977-2.877 3.922-2.663 3.143-2.058 2.355-1.72 1.741-4.383 3.195-4.956 2.785-5.284 2.663-5.663 2.56-6.318 2.478-3.4 1.034-2.98.84-7.341 1.71-7.578 1.628-7.619 1.618-8.284 1.352-8.54.358-8.755 1.055h-27.177l-9.8-.574-9.124-.84-9.84-1.351-9.759-1.044-10.28-1.434-9.964-2.478-9.718-1.874-9.657-2.765-9.902-3.543-9.717-2.929-5.12-1.71-4.547-1.618-2.877-1.116-2.857-.604h-8.08l-9.339-.655-4.72-.482-6.083-.675-3.901 3.532-5.325 3.328-7.22 3.513-7.986 4.382-4.854 2.376-5.069 1.884-11.192 4.578-6.083 1.525-6.38 1.72-8.847 1.721-5.54.43-5.857.502-6.113.676-7.117.266H375.84l-16.415-.266-15.944-1.608-8.069-1.147-7.792-1.157-7.588-1.137-7.588-1.525-7.076-2.284-7.035-1.628-6.349-2.55-6-2.376-5.602-2.672-4.864-2.919-4.823-3.553-1.648-1.72-2.16-2.079-1.64-1.812-1.474-2.09-1.362-2.078-1.054-2.1-1.526-4.454-.533-2.304-.676-2.56v-2.365l.676-2.673v-2.652l.533-2.652v-5.356l.256-2.826 1.27-3.236 1.054-3.235 1.915-3.902 1.403-1.505 1.157-1.741 3.02-3.697 2.407-1.904 2.274-1.331 2.099-1.69 3.318-1.055 2.662-1.618 3.318-1.71 3.778-1.136 3.8-1.158 4.403-.962 4.167-.553 4.946-.645 5.366-.41 1.393-.46h.307l.676-.574v-.655l-.983-1.332-2.847-1.351-7.117-6.165-4.782-3.809-5.53-4.844-5.57-5.417-5.796-6.922-6.677-7.803-2.488-4.219-3.297-4.362-2.847-5.038-2.56-5.509-3.45-5.243-2.254-5.98-2.682-5.97-2.683-6.656-1.946-6.38-1.853-7.884-.553-.287h-.564l-.286-.563h-.686l-1.127.563-.563.287-.778 1.32-.277 1.608-.583 1.434-1.014 2.386-3.256 5.796-1.69 3.512-2.683 3.062-2.847 3.686-3.143 4.086-3.318 3.625-3.901 3.512-3.605 3.298-3.994 2.621-4.362 2.734-4.198 1.628-4.946 1.24-4.854.47h-1.147l-1.116-.47-.88-1.926-1.424-.942-1.864-4.567-1.167-2.468-1.25-3.543-1.033-3.676-.553-3.625-1.536-8.253-.584-4.864V635.72l.584-11.91.962-6.082 1.127-6.267 1.034-6.748 1.833-6.277 2.058-7.23 2.12-7.045 2.836-7.25 2.673-6.912 3.696-7.014 3.43-7.608 4.2-7.138 4.935-7.7 5.017-6.922 5.243-7.7 4.373-5.367 5.601-6.144 5.898-6.195 2.745-2.949 3.328-3.318 4.833-4.188 4.966-4.27 8.08-7.24 6.093-4.454z"/></svg>

Before

Width:  |  Height:  |  Size: 4.3 KiB

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="32" height="32"><defs><style/></defs><path d="M347.136 783.36q19.456 0 36.864 7.168t30.72 19.968 20.48 30.208 7.168 36.864-7.168 36.864-20.48 30.208T384 965.12t-36.864 7.68q-20.48 0-37.376-7.68t-30.208-20.48-20.48-30.208-7.168-36.864 7.168-36.864 20.48-30.208 30.208-19.968 37.376-7.168zm425.984 2.048q19.456 0 37.376 7.168t30.72 19.968 20.48 30.208 7.68 36.864-7.68 36.864-20.48 30.208-30.72 20.48-37.376 7.68-36.864-7.68-30.208-20.48-20.48-30.208-7.68-36.864 7.68-36.864 20.48-30.208 30.208-19.968 36.864-7.168zm172.032-581.632q28.672 0 44.544 7.68t22.528 18.944 6.144 24.064-3.584 22.016-12.8 37.888-22.016 62.976-24.064 68.096-17.92 53.248q-13.312 40.96-33.792 56.832t-50.176 15.872h-537.6l15.36 92.16h516.096q49.152 0 49.152 41.984 0 20.48-9.728 35.328t-38.4 14.848H312.32q-20.48 0-34.304-9.216t-23.04-24.064-14.848-32.256-8.704-32.768q-1.024-6.144-5.632-29.696t-11.264-58.88-14.848-78.848-16.384-87.552q-19.456-103.424-44.032-230.4h-76.8q-15.36 0-25.6-7.68T19.968 145.92t-9.216-23.04-2.56-22.528q0-20.48 13.824-33.792t37.376-13.312h103.424q20.48 0 32.768 6.144t19.456 15.36 10.24 19.456 5.12 17.408q2.048 8.192 4.096 23.04t4.096 30.208q3.072 18.432 6.144 38.912h700.416z"/></svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M565.273 34.627L677.369 272.17c8.706 18.32 25.411 31.051 44.823 33.996l250.776 38.081c48.698 7.411 68.225 70.046 32.934 105.98L824.407 635.164c-13.998 14.23-20.352 34.815-17.059 54.935l42.82 261.127c8.346 50.696-42.643 89.452-86.226 65.519L539.634 893.474c-17.286-9.526-37.992-9.526-55.278 0l-224.314 123.27c-43.583 23.934-94.572-14.822-86.22-65.518L216.638 690.1c3.32-20.12-3.089-40.705-17.087-54.935L18.11 450.227c-35.285-35.934-15.818-98.574 32.934-105.98l250.75-38.081c19.35-2.94 36.082-15.675 44.756-33.996L458.673 34.627c21.825-46.168 84.836-46.168 106.6 0z"/></svg>

Before

Width:  |  Height:  |  Size: 702 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M622.277 39.385H401.723c-13.785 0-23.63 11.815-23.63 25.6v49.23c0 13.785 11.815 25.6 23.63 25.6h220.554c13.785 0 23.63-11.815 23.63-25.6v-49.23c1.97-13.785-9.845-25.6-23.63-25.6zm336.738 0H738.462c-13.785 0-25.6 11.815-25.6 25.6v49.23c0 13.785 11.815 25.6 25.6 25.6h220.553c13.785-1.969 25.6-11.815 25.6-25.6v-49.23c0-13.785-11.815-25.6-25.6-25.6zm0 165.415H334.77c-13.784 0-25.6-11.815-25.6-25.6V64.985c0-13.785-11.815-25.6-25.6-25.6H64.985c-13.785 0-25.6 11.815-25.6 25.6v896c0 11.815 11.815 23.63 25.6 23.63h894.03c13.785 0 25.6-11.815 25.6-25.6V230.4c0-13.785-11.815-25.6-25.6-25.6z"/></svg>

Before

Width:  |  Height:  |  Size: 725 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M67.04 100.41h889.919v200.232H67.039V100.411zm0 244.729h266.976v266.975H67.039V345.14zm0 311.471h266.976v266.977H67.039V656.611zm311.471-311.471h266.977v266.975H378.51V345.14zm0 311.471h266.977v266.977H378.51V656.611zm311.472-311.471H956.96v266.975H689.983V345.14zm0 311.471H956.96v266.977H689.983V656.611z"/><path d="M67.04 100.41h889.919v200.232H67.039V100.411zm0 244.729h266.976v266.975H67.039V345.14zm0 311.471h266.976v266.977H67.039V656.611zm311.471-311.471h266.977v266.975H378.51V345.14zm0 311.471h266.977v266.977H378.51V656.611zm311.472-311.471H956.96v266.975H689.983V345.14zm0 311.471H956.96v266.977H689.983V656.611z"/></svg>

Before

Width:  |  Height:  |  Size: 763 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M1004.094 321.092L762.737 79.735a68.267 68.267 0 0 0-96.546 0l-30.293 30.294a68.284 68.284 0 0 1-48.265 20.002H436.44a68.181 68.181 0 0 1-48.265-20.002l-30.293-30.294a68.267 68.267 0 0 0-96.546 0L19.962 321.092a68.267 68.267 0 0 0 0 96.546l96.546 96.547a67.84 67.84 0 0 0 66.645 17.271c10.804-3.072 21.675 4.181 21.675 15.411V896c0 37.547 30.72 68.267 68.267 68.267H750.96c37.547 0 68.267-30.72 68.267-68.267V546.867c0-11.23 10.872-18.483 21.675-15.411a67.84 67.84 0 0 0 66.645-17.271l96.546-96.547a68.267 68.267 0 0 0 0-96.546z"/></svg>

Before

Width:  |  Height:  |  Size: 667 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M504.951 511.98c93.49 0 169.28-74.002 169.28-165.26 0-91.276-75.79-165.248-169.28-165.248-93.486 0-169.287 73.972-169.279 165.248-.001 91.258 75.793 165.26 169.28 165.26zm77.6 55.098H441.466c-120.767 0-218.678 95.564-218.678 213.45V794.3c0 48.183 97.911 48.229 218.678 48.229H582.55c120.754 0 218.66-1.78 218.66-48.229v-13.77c0-117.887-97.898-213.45-218.66-213.45z"/></svg>

Before

Width:  |  Height:  |  Size: 503 B

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"><defs><style/></defs><path d="M669.03 317.396c10.18 0 20.235.748 30.237 1.865C672.1 192.728 536.831 98.731 382.415 98.731 209.797 98.73 68.38 216.39 68.38 365.797c0 86.242 47.044 157.061 125.674 211.988l-31.406 94.468L272.403 617.2c39.303 7.781 70.81 15.765 110.01 15.765 9.85 0 19.626-.482 29.324-1.243-6.144-20.996-9.698-42.983-9.698-65.793.002-137.196 117.806-248.533 266.99-248.533zm-168.862-85.14c23.639 0 39.302 15.55 39.302 39.186 0 23.536-15.664 39.3-39.302 39.3-23.536 0-47.147-15.765-47.147-39.3 0-23.635 23.612-39.185 47.147-39.185zm-219.765 78.487c-23.538 0-47.3-15.765-47.3-39.3 0-23.635 23.764-39.185 47.3-39.185 23.534 0 39.2 15.55 39.2 39.185 0 23.535-15.666 39.3-39.2 39.3z"/><path d="M955.618 562.147c0-125.543-125.622-227.882-266.734-227.882-149.413 0-267.09 102.339-267.09 227.882 0 125.77 117.677 227.88 267.09 227.88 31.279 0 62.838-7.898 94.243-15.766l86.12 47.17-23.612-78.473c63.04-47.286 109.983-109.993 109.983-180.81zm-353.311-39.289c-15.639 0-31.431-15.549-31.431-31.416 0-15.652 15.792-31.405 31.43-31.405 23.74 0 39.304 15.754 39.304 31.405 0 15.867-15.563 31.416-39.303 31.416zm172.72 0c-15.538 0-31.201-15.549-31.201-31.416 0-15.652 15.664-31.405 31.202-31.405 23.536 0 39.3 15.754 39.3 31.405.001 15.867-15.764 31.416-39.3 31.416z"/></svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

-1
View File
@@ -1 +0,0 @@
<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="200" height="200"><defs><style/></defs><path d="M619.364 933.396c1.373.064 2.682.192 4.055.192H932.71a65.67 65.67 0 0 0 65.606-65.606V150.974a65.67 65.67 0 0 0-65.606-65.606H623.419c-1.373 0-2.714.128-4.055.191V-.03L15.691 80.546V938.95l603.673 82.655v-88.21zm0-810.101c1.341-.192 2.682-.415 4.055-.415H932.71c15.516 0 28.126 12.61 28.126 28.126v717.008a28.158 28.158 0 0 1-28.126 28.126H623.419c-1.373 0-2.714-.224-4.055-.415V123.327zM248.33 605.429l-143.919-3.671v-23.402l86.869-133.255v-1.181l-78.92 1.308v-36.043l134.565-3.512v26.083l-87.507 133.735v1.149l88.912 1.405v37.352zm72.406 1.852l-44.759-1.15V404.94l44.76-1.15v203.492zm171.087-92.966c-16.665 15.356-41.151 22.06-69.341 21.868a113.813 113.813 0 0 1-16.122-1.053v74.354l-46.1-1.182V405.514c14.238-2.81 34.383-5.172 63.18-5.939 29.498-.766 50.793 4.31 65.19 15.293 13.888 10.44 23.306 27.966 23.306 48.845s-7.12 38.63-20.08 50.602zm-65.925-79.175a80.132 80.132 0 0 0-19.538 2.203v61.392c4.022.926 8.97 1.213 15.834 1.213 25.381-.032 41.216-12.898 41.216-34.479 0-19.379-13.632-30.712-37.48-30.297zM732.22 138.906h73.524v30.33H732.22v-30.33zm-73.556 45.398h73.524v30.36h-73.524v-30.36zm73.556 49.676h73.524v30.36H732.22v-30.36zm0 95.903h73.524v30.329H732.22v-30.33zm-73.556-48.718h73.524v30.329h-73.524v-30.329zm72.822 376.142a72.79 72.79 0 0 0 72.789-72.82L790.835 462.5c0-40.226-19.156-72.821-59.381-72.821s-59.35 32.595-59.35 72.821l-13.472 121.986a72.79 72.79 0 0 0 72.822 72.821zm-24.104-133.862h48.207v101.841h-48.207v-101.84z"/></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

+1 -3
View File
@@ -1,12 +1,10 @@
<?php <?php
/** /**
* Laravel - A PHP Framework For Web Artisans * Laravel - A PHP Framework For Web Artisans.
* *
* @package Laravel
* @author Taylor Otwell <taylor@laravel.com> * @author Taylor Otwell <taylor@laravel.com>
*/ */
define('LARAVEL_START', microtime(true)); define('LARAVEL_START', microtime(true));
/* /*
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 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
+564 -53675
View File
File diff suppressed because one or more lines are too long

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