This project costs me $22/month to be hosted on Vultr.
Please consider supporting my work if you use & find it useful. ❤️
A Laravel + Socialite + Vite + Vue 3 + TailwindCSS SPA Boilerplate. Laravel with user authentication, registration with email verification, social media authentication, password recovery, user management, and roles/permissions management. Uses official TailwindCSS. While the front end is part of this repository it is a completely separated Vue 3 front end compiled using ViteJS.
- Laravel
- Sanctum
- Socialite
- Vite
- Vue 3
- TailwindCSS (w/
@tailwindcss/formsand@tailwindcss/aspect-ratio) - Vue Router
- Vuex
- Axios
- Headless UI
- Heroicons
- Font Awesome 6
- ESLint with Prettier
- Users Area
- Admin Area
- About Page
- Terms Page
- Users Managemenet
- User Impersonation
- User Data Download
- User Account Self Deletion.
- Manage Social Media Logins through GUI
- Roles Management
- Permissions Management
- Google Analytics (optional)
- Social Authentication with Facebook, Twitter, Instagram, GitHub, TikTok, Google, YouTube, Microsoft, Twitch, and Apple
- Optional Sentry.io Laravel Monitoring
- Optional Sentry.io VueJs Monitoring
- Run
git clone https://github.com/jeremykenedy/laravel-spa.git laravel-spa - Create a MySQL database for the project
mysql -u root -p, if using Vagrant:mysql -u homestead -psecretcreate database laravelSpa;\q
- From the projects root run
cp .env.example .env - Configure your
.envfile (VERY IMPORTANT) - Run
composer installfrom the projects root folder - From the projects root folder run
sudo chmod -R 755 ../laravel-spa - From the projects root folder run
php artisan key:generate - From the projects root folder run
php artisan migrate - From the projects root folder run
composer dump-autoload - From the projects root folder run
php artisan db:seed - Compile the front end assets with npm steps or yarn steps.
- From the projects root folder run
npm install - From the projects root folder run
npm run devornpm run build
- You can lint assets with
npm run lint - You can clean the syntax with
npm run clean
- From the projects root folder run
yarn install - From the projects root folder run
yarn run devoryarn run build
- You can lint assets with
yarn run lint - You can clean the syntax with
yarn run clean
- From the projects root folder run
php artisan config:cache
| Password | |
|---|---|
| superadmin@superadmin.com | password |
| admin@admin.com | password |
| user@user.com | password |
- Facebook API (Will work with local dev callback)
- Twitter API
- Instagram API
- GitHub API (Will work with local dev callback)
- YouTube API
- Google API
- LinkedIn API (Will work with local dev callback)
- Twitch API (Will work with local dev callback)
- Microsoft API
- TikTok API
- Apple API
- ZoHo API (Will work with local dev callback)
- StackExchange API (Will work with local dev callback)
- GitLab API (Will work with local dev callback)
- Reddit API Register (Will work with local dev callback)
- Snapchat API
- Meetup API
- Atlassian
- See full list of providers: https://socialiteproviders.github.io
LaravelSpa ├── .browserslistrc ├── .editorconfig ├── .env.example ├── .env.travis ├── .eslintrc.js ├── .gitattributes ├── .github │ ├── FUNDING.yml │ ├── dependabot.yml │ ├── labeler.yml │ └── workflows │ ├── changelog.yml │ ├── codeql.yml │ ├── create-release.yml │ ├── dependency-review.yml │ ├── deploy.yml │ ├── gitguardian.yml │ ├── greetings.yml │ ├── labeler.yml │ ├── laravel.yml │ ├── manual.yml │ ├── node.js.yml │ ├── php.yml │ ├── release.yml │ ├── sentry.yml │ └── stale.yml ├── .gitignore ├── .npmrc ├── .prettierignore ├── .scripts │ └── deploy.sh ├── .styleci.yml ├── .travis.yml ├── LICENSE ├── README.md ├── SECURITY.md ├── app │ ├── Console │ │ └── Kernel.php │ ├── Exceptions │ │ ├── Handler.php │ │ └── SocialProviderDeniedException.php │ ├── Http │ │ ├── Controllers │ │ │ ├── AppSettingsController.php │ │ │ ├── AppleSocialController.php │ │ │ ├── Auth │ │ │ │ ├── AuthController.php │ │ │ │ ├── ForgotPasswordController.php │ │ │ │ ├── PasswordController.php │ │ │ │ ├── RegisterController.php │ │ │ │ ├── ResetPasswordController.php │ │ │ │ ├── SocialiteController.php │ │ │ │ └── VerificationController.php │ │ │ ├── Controller.php │ │ │ ├── DashboardController.php │ │ │ ├── ImpersonateController.php │ │ │ ├── PermissionsController.php │ │ │ ├── ProfileController.php │ │ │ ├── RolesController.php │ │ │ ├── ServerInfoController.php │ │ │ ├── UserController.php │ │ │ └── UsersController.php │ │ ├── Kernel.php │ │ ├── Middleware │ │ │ ├── AddContentSecurityPolicyHeaders.php │ │ │ ├── Authenticate.php │ │ │ ├── EncryptCookies.php │ │ │ ├── PreventRequestsDuringMaintenance.php │ │ │ ├── RedirectIfAuthenticated.php │ │ │ ├── TrimStrings.php │ │ │ ├── TrustHosts.php │ │ │ ├── TrustProxies.php │ │ │ └── VerifyCsrfToken.php │ │ ├── Requests │ │ │ ├── AppSettings │ │ │ ├── Permissions │ │ │ │ ├── CreatePermissionRequest.php │ │ │ │ ├── GetPermissionsRequest.php │ │ │ │ └── UpdatePermissionRequest.php │ │ │ ├── Roles │ │ │ │ ├── CreateRoleRequest.php │ │ │ │ └── UpdateRoleRequest.php │ │ │ └── Users │ │ │ ├── CreateUserRequest.php │ │ │ ├── GetUserRolesRequest.php │ │ │ ├── ImpersonateUserRequest.php │ │ │ └── UpdateUserRequest.php │ │ └── Resources │ │ ├── Permissions │ │ │ ├── PermissionResource.php │ │ │ └── PermissionsCollection.php │ │ └── Users │ │ ├── RoleResource.php │ │ └── RolesCollection.php │ ├── Jobs │ │ └── PersonalDataExportJob.php │ ├── Mail │ │ └── ExceptionOccured.php │ ├── Models │ │ ├── Impersonation.php │ │ ├── Permission.php │ │ ├── Role.php │ │ ├── Setting.php │ │ ├── SocialiteProvider.php │ │ └── User.php │ ├── Notifications │ │ ├── PersonalDataExportedNotification.php │ │ ├── ResetPasswordNotification.php │ │ └── VerifyEmailNotification.php │ ├── Providers │ │ ├── AppServiceProvider.php │ │ ├── AuthServiceProvider.php │ │ ├── BroadcastServiceProvider.php │ │ ├── EventServiceProvider.php │ │ ├── RouteServiceProvider.php │ │ └── ViewComposerServiceProvider.php │ ├── Services │ │ └── AppleToken.php │ ├── Traits │ │ ├── AppSettingsTrait.php │ │ └── SocialiteProvidersTrait.php │ └── View │ └── Composers │ ├── GaComposer.php │ └── GaEnabledComposer.php ├── artisan ├── bootstrap │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── app.php │ ├── apple-touch-icon.png │ ├── cache │ │ ├── .gitignore │ │ ├── packages.php │ │ ├── routes-v7.php │ │ └── services.php │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ └── ssr │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── app2.mjs │ ├── apple-touch-icon.png │ ├── assets │ │ ├── About-8055ba51.mjs │ │ ├── Account-db07883a.mjs │ │ ├── Admin-1aef526f.mjs │ │ ├── AdminLayout-b06d3e9f.mjs │ │ ├── AppSettings-493dc486.mjs │ │ ├── Dashboard-00d0a96f.mjs │ │ ├── Errors-cfd7b346.mjs │ │ ├── ForgotPassword-ca93934f.mjs │ │ ├── Home-092f52e0.mjs │ │ ├── Login-3d895534.mjs │ │ ├── NotFound-52f67599.mjs │ │ ├── Password-0f549b05.mjs │ │ ├── Permissions-d779932d.mjs │ │ ├── PhpInfo-c54b8303.mjs │ │ ├── Profile-8dc4ce3e.mjs │ │ ├── Register-c8d7fa41.mjs │ │ ├── ResetPassword-4e7ca3b7.mjs │ │ ├── Roles-53fcb449.mjs │ │ ├── RolesBadges-5ee6b7bc.mjs │ │ ├── Settings-a3568c63.mjs │ │ ├── SocialiteLogins-6af0e372.mjs │ │ ├── Success-4b3d058c.mjs │ │ ├── Terms-3b1605fc.mjs │ │ ├── Users-fcead5b0.mjs │ │ ├── VerifyEmail-3b245fb1.mjs │ │ ├── default.css_vue_type_style_index_0_src_true_lang-6d22712f.mjs │ │ ├── workbox-window.prod.es5-77e1b1e1.mjs │ │ └── zoho-monocrome-black-b48ed5c0.mjs │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── js-bundle-stats.html │ ├── manifest.webmanifest │ └── pluginWebUpdateNotice │ ├── webUpdateNoticeInjectScript.global.js │ ├── webUpdateNoticeInjectStyle.css │ └── web_version_by_plugin.json ├── composer.json ├── composer.lock ├── config │ ├── app.php │ ├── auth.php │ ├── broadcasting.php │ ├── cache.php │ ├── cors.php │ ├── database.php │ ├── debugbar.php │ ├── exceptions.php │ ├── filesystems.php │ ├── hashing.php │ ├── laravel-https.php │ ├── laravel-logger.php │ ├── laravel-page-speed.php │ ├── laravelpwa.php │ ├── logging.php │ ├── mail.php │ ├── personal-data-export.php │ ├── queue.php │ ├── roles.php │ ├── sanctum.php │ ├── sentry.php │ ├── services.php │ ├── session.php │ ├── settings.php │ ├── users.php │ └── view.php ├── database │ ├── .gitignore │ ├── factories │ │ └── UserFactory.php │ ├── migrations │ │ ├── 2014_10_00_000000_create_settings_table.php │ │ ├── 2014_10_00_000001_add_group_column_on_settings_table.php │ │ ├── 2014_10_12_000000_create_users_table.php │ │ ├── 2014_10_12_100000_create_password_resets_table.php │ │ ├── 2016_01_15_105324_create_roles_table.php │ │ ├── 2016_01_15_114412_create_role_user_table.php │ │ ├── 2016_01_26_115212_create_permissions_table.php │ │ ├── 2016_01_26_115523_create_permission_role_table.php │ │ ├── 2016_02_09_132439_create_permission_user_table.php │ │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ │ ├── 2019_12_14_000001_create_personal_access_tokens_table.php │ │ ├── 2021_04_26_093603_create_jobs_table.php │ │ ├── 2022_09_05_192055_update_users_table.php │ │ ├── 2022_11_02_051027_update_settings_table.php │ │ ├── 2022_11_28_073632_create_socialite_providers_table.php │ │ └── 2022_12_06_061947_create_impersonations_table.php │ └── seeders │ ├── AppSettingsSeeder.php │ ├── ConnectRelationshipsSeeder.php │ ├── DatabaseSeeder.php │ ├── PermissionsTableSeeder.php │ ├── RolesTableSeeder.php │ └── UsersTableSeeder.php ├── env.d.ts ├── package-lock.json ├── package.json ├── phpunit.xml ├── postcss.config.js ├── prettier.config.js ├── prettierrc.json ├── public │ ├── .htaccess │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── css │ │ └── app.css │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── images │ │ └── icons │ │ ├── icon-128x128.png │ │ ├── icon-144x144.png │ │ ├── icon-152x152.png │ │ ├── icon-192x192.png │ │ ├── icon-384x384.png │ │ ├── icon-512x512.png │ │ ├── icon-72x72.png │ │ ├── icon-96x96.png │ │ ├── splash-1125x2436.png │ │ ├── splash-1242x2208.png │ │ ├── splash-1242x2688.png │ │ ├── splash-1536x2048.png │ │ ├── splash-1668x2224.png │ │ ├── splash-1668x2388.png │ │ ├── splash-2048x2732.png │ │ ├── splash-640x1136.png │ │ ├── splash-750x1334.png │ │ └── splash-828x1792.png │ ├── index.php │ ├── js │ │ ├── app.js │ │ ├── resources_js_Views_ForgotPassword_vue.js │ │ ├── resources_js_Views_Home_vue.js │ │ ├── resources_js_Views_Login_vue.js │ │ ├── resources_js_Views_Password_vue.js │ │ ├── resources_js_Views_Profile_vue.js │ │ ├── resources_js_Views_Register_vue.js │ │ ├── resources_js_Views_ResetPassword_vue.js │ │ ├── resources_js_Views_Settings_vue.js │ │ ├── resources_js_Views_VerifyEmail_vue.js │ │ ├── resources_js_Views_Welcome_vue.js │ │ └── s-code.min.js │ ├── mix-manifest.json │ ├── robots.txt │ ├── serviceworker.js │ ├── sw.ts │ └── web.config ├── resources │ ├── css │ │ ├── app.css │ │ └── normalize.css │ ├── img │ │ ├── 404.png │ │ ├── favicon │ │ │ ├── android-chrome-192x192.png │ │ │ ├── android-chrome-512x512.png │ │ │ ├── apple-touch-icon.png │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-32x32.png │ │ │ └── favicon.ico │ │ ├── plugs.png │ │ └── vendor-logos │ │ ├── vultr-1.webp │ │ ├── vultr-2.png │ │ ├── zoho-monocrome-black.png │ │ └── zoho-monocrome-white.png │ ├── js │ │ ├── app.js │ │ ├── bootstrap.js │ │ ├── components │ │ │ ├── AppFooter.vue │ │ │ ├── AppNav.vue │ │ │ ├── BmcButtons.vue │ │ │ ├── CircleSvg.vue │ │ │ ├── Errors.vue │ │ │ ├── GHButton.vue │ │ │ ├── GHButtons.vue │ │ │ ├── OctoCat.vue │ │ │ ├── Pagination.vue │ │ │ ├── PatreonButton.vue │ │ │ ├── PerPage.vue │ │ │ ├── ReloadPrompt.vue │ │ │ ├── Success.vue │ │ │ ├── VerifyNotice.vue │ │ │ ├── VultrReferral.vue │ │ │ ├── account │ │ │ │ ├── AccountAdministration.vue │ │ │ │ ├── AccountAuthentication.vue │ │ │ │ ├── AccountData.vue │ │ │ │ └── AccountPrivacy.vue │ │ │ ├── admin │ │ │ │ ├── AdminNavBar.vue │ │ │ │ ├── AdminSidebar.vue │ │ │ │ ├── RolesTable.vue │ │ │ │ ├── RolesTableRow.vue │ │ │ │ ├── UsersTable.vue │ │ │ │ └── UsersTableRow.vue │ │ │ ├── auth │ │ │ │ └── SocialiteLogins.vue │ │ │ ├── common │ │ │ │ ├── AppButton.vue │ │ │ │ ├── AppDeleteModal.vue │ │ │ │ ├── AppModal.vue │ │ │ │ ├── AppSwitch.vue │ │ │ │ ├── AppTable.vue │ │ │ │ └── AppToast.vue │ │ │ ├── form │ │ │ │ ├── AppSettingTextInput.vue │ │ │ │ ├── AppSettingTextarea.vue │ │ │ │ └── AppSettingToggle.vue │ │ │ ├── loaders │ │ │ │ └── AnimatedTableLoader.vue │ │ │ ├── roles │ │ │ │ ├── PermissionFormModal.vue │ │ │ │ ├── RoleFormModal.vue │ │ │ │ └── RolesBadges.vue │ │ │ └── users │ │ │ ├── UserDownloadData.vue │ │ │ ├── UserForm.vue │ │ │ └── UserFormModal.vue │ │ ├── layouts │ │ │ └── AdminLayout.vue │ │ ├── middleware │ │ │ ├── auth.js │ │ │ ├── guest.js │ │ │ ├── middlewarePipeline.js │ │ │ ├── roleAdmin.js │ │ │ ├── roleSuperAdmin.js │ │ │ └── roleUser.js │ │ ├── router │ │ │ ├── index.js │ │ │ └── routes.js │ │ ├── services │ │ │ ├── analytics.js │ │ │ ├── asteroids.js │ │ │ ├── common.js │ │ │ ├── excanvas.js │ │ │ ├── s-code.js │ │ │ ├── s-code.min.js │ │ │ └── users.js │ │ ├── store │ │ │ ├── index.js │ │ │ ├── modules │ │ │ │ ├── auth.js │ │ │ │ ├── sidebar.js │ │ │ │ └── toast.js │ │ │ └── mutation-types.js │ │ └── views │ │ ├── App.vue │ │ ├── Blank.vue │ │ ├── admin │ │ │ ├── Admin.vue │ │ │ ├── AppSettings.vue │ │ │ ├── Permissions.vue │ │ │ ├── PhpInfo.vue │ │ │ ├── Roles.vue │ │ │ └── Users.vue │ │ └── pages │ │ ├── About.vue │ │ ├── Dashboard.vue │ │ ├── ForgotPassword.vue │ │ ├── Home.vue │ │ ├── Login.vue │ │ ├── NotFound.vue │ │ ├── Register.vue │ │ ├── ResetPassword.vue │ │ ├── Terms.vue │ │ ├── VerifyEmail.vue │ │ ├── auth │ │ └── settings │ │ ├── Account.vue │ │ ├── Password.vue │ │ ├── Profile.vue │ │ └── Settings.vue │ ├── lang │ │ └── en │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ ├── personal-data-exports.php │ │ └── validation.php │ └── views │ ├── app.blade.php │ ├── emails │ │ └── exception.blade.php │ ├── errors │ │ ├── 401.blade.php │ │ ├── 403.blade.php │ │ ├── 500.blade.php │ │ ├── 503.blade.php │ │ └── layout.blade.php │ ├── socialite │ │ ├── callback.blade.php │ │ └── denied.blade.php │ └── welcome.blade.php ├── routes │ ├── api.php │ ├── channels.php │ ├── console.php │ └── web.php ├── server.php ├── tailwind.config.js ├── tailwindcss-perspective.js ├── tsconfig.json ├── tsconfig.vite-config.json └── vite.config.ts 76 directories, 380 files - Tree command can be installed using brew:
brew install tree - File tree generated using command
tree -a -I '.git|node_modules|vendor|build|storage|tests|.DS_Store|.env'
Laravel-Spa is licensed under the MIT license. Enjoy!



























