├── .editorconfig ├── .env.example ├── .gitattributes ├── .gitignore ├── .storage ├── flags │ ├── bn.png │ └── en.png └── site │ ├── default-user.png │ └── logo.png ├── .styleci.yml ├── LICENSE ├── README.md ├── app ├── Console │ └── Kernel.php ├── Contracts │ ├── BaseContract.php │ ├── BrandContract.php │ └── ProductContract.php ├── Events │ └── AdminLoginAlert.php ├── Exceptions │ └── Handler.php ├── Http │ ├── Controllers │ │ ├── Admin │ │ │ ├── AttributeController.php │ │ │ ├── BrandController.php │ │ │ ├── CategoryController.php │ │ │ ├── ImageController.php │ │ │ ├── LoginController.php │ │ │ └── ProductController.php │ │ ├── AdminController.php │ │ ├── Auth │ │ │ ├── ConfirmPasswordController.php │ │ │ ├── ForgotPasswordController.php │ │ │ ├── LoginController.php │ │ │ ├── RegisterController.php │ │ │ ├── ResetPasswordController.php │ │ │ └── VerificationController.php │ │ ├── Controller.php │ │ ├── HomeController.php │ │ └── Site │ │ │ ├── CartController.php │ │ │ ├── CompareController.php │ │ │ ├── ProductController.php │ │ │ └── WishlistController.php │ ├── Kernel.php │ ├── Middleware │ │ ├── Authenticate.php │ │ ├── EncryptCookies.php │ │ ├── IsAdmin.php │ │ ├── PreventRequestsDuringMaintenance.php │ │ ├── RedirectIfAuthenticated.php │ │ ├── TrimStrings.php │ │ ├── TrustHosts.php │ │ ├── TrustProxies.php │ │ └── VerifyCsrfToken.php │ ├── Requests │ │ └── ProductRequest.php │ └── Resources │ │ ├── AttributeResource.php │ │ ├── BrandResource.php │ │ ├── CategoryResource.php │ │ ├── ImageResource.php │ │ ├── ProductAttributeResource.php │ │ └── ProductResource.php ├── Jobs │ ├── BrandImageUploading.php │ └── SendEmailJobs.php ├── Listeners │ └── AdminLoginAlertListener.php ├── Mail │ └── AdminAlertMail.php ├── Models │ ├── Admin.php │ ├── Attribute.php │ ├── Brand.php │ ├── Category.php │ ├── Categoryable.php │ ├── Image.php │ ├── Order.php │ ├── OrderItem.php │ ├── Product.php │ ├── ProductAttribute.php │ ├── ShoppingCart.php │ ├── Tag.php │ └── User.php ├── Notifications │ └── AdminLoginResponser.php ├── Observers │ ├── BrandObserver.php │ └── ProductObserver.php ├── Policies │ ├── AttributePolicy.php │ ├── BrandPolicy.php │ ├── CategoryPolicy.php │ └── ProductPolicy.php ├── Providers │ ├── AppServiceProvider.php │ ├── AuthServiceProvider.php │ ├── BroadcastServiceProvider.php │ ├── EventServiceProvider.php │ ├── RepositoryServiceProvider.php │ └── RouteServiceProvider.php ├── Repositories │ ├── BaseRepository.php │ ├── BrandRepository.php │ └── ProductRepository.php └── Traits │ └── UploadAble.php ├── artisan ├── bootstrap ├── app.php └── cache │ └── .gitignore ├── composer.json ├── composer.lock ├── config ├── app.php ├── auth.php ├── broadcasting.php ├── cache.php ├── cart.php ├── cors.php ├── database.php ├── filesystems.php ├── hashing.php ├── laravelpwa.php ├── logging.php ├── mail.php ├── queue.php ├── services.php ├── session.php └── view.php ├── database ├── .gitignore ├── factories │ ├── AttributeFactory.php │ ├── BrandFactory.php │ ├── CategoryFactory.php │ ├── ProductFactory.php │ └── UserFactory.php ├── migrations │ ├── 2014_10_12_000000_create_users_table.php │ ├── 2014_10_12_100000_create_password_resets_table.php │ ├── 2018_12_23_120000_create_shoppingcart_table.php │ ├── 2019_08_19_000000_create_failed_jobs_table.php │ ├── 2020_10_10_021117_create_brands_table.php │ ├── 2020_10_10_023054_create_categories_table.php │ ├── 2020_10_10_023113_create_products_table.php │ ├── 2020_10_10_035144_create_orders_table.php │ ├── 2020_10_10_040402_create_order_items_table.php │ ├── 2020_10_10_040639_create_admins_table.php │ ├── 2020_10_26_085920_create_jobs_table.php │ ├── 2020_11_09_054329_add_image_to_products_table.php │ ├── 2020_11_12_063747_create_attributes_table.php │ ├── 2020_11_13_054258_create_categoryables_table.php │ ├── 2020_11_13_154946_create_images_table.php │ └── 2020_11_14_085006_create_product_attributes_table.php └── seeders │ ├── CreateUsersSeeder.php │ ├── CreateVariantSeeder.php │ └── DatabaseSeeder.php ├── docs ├── ShopppingCart.md ├── VuePerformance.md ├── image_upload_iview.md ├── images │ ├── AuthorizationAdmin.png │ ├── AuthorizationSuperAdmin.png │ ├── FilterData.vue.png │ ├── add-category-image.png │ ├── admin-dashboard-dark.png │ ├── admin-dashboard-light.png │ ├── admin-dashboard.png │ ├── categories.vue.png │ ├── filter_result.png │ ├── home.png │ ├── localization.png │ ├── localization_folder_structure.png │ ├── logo.png │ ├── pagination.png │ └── view-added-category-image.png ├── offline-capability-pwa.md └── pagination-localization-filtering-searching-sorting.md ├── package-lock.json ├── package.json ├── packages └── penguin │ └── bread │ ├── composer.json │ └── src │ ├── BreadServiceProvider.php │ ├── Commands │ ├── PenguinArtisanCommand.php │ └── PenguinInstallCommand.php │ └── stubs │ ├── Observer.stub │ ├── Request.stub │ ├── console.stub │ ├── controller copy.stub │ ├── controller.api.stub │ ├── controller.invokable.stub │ ├── controller.model.api.stub │ ├── controller.model.stub │ ├── controller.nested.api.stub │ ├── controller.nested.stub │ ├── controller.plain.stub │ ├── controller.stub │ ├── factory.stub │ ├── job.queued.stub │ ├── job.stub │ ├── middleware.stub │ ├── migration.create.stub │ ├── migration.stub │ ├── migration.update.stub │ ├── model.pivot.stub │ ├── model.stub │ ├── policy.plain.stub │ ├── policy.stub │ ├── request.stub │ ├── resource-collection.stub │ ├── resource.stub │ ├── rule.stub │ ├── seeder.stub │ ├── test.stub │ └── test.unit.stub ├── phpunit.xml ├── public ├── .htaccess ├── assets │ ├── css │ │ ├── bootstrap.min.css │ │ ├── demos │ │ │ └── demo-13.css │ │ ├── plugins │ │ │ ├── jquery.countdown.css │ │ │ ├── magnific-popup │ │ │ │ └── magnific-popup.css │ │ │ ├── nouislider │ │ │ │ └── nouislider.css │ │ │ └── owl-carousel │ │ │ │ └── owl.carousel.css │ │ ├── skins │ │ │ └── skin-demo-13.css │ │ ├── style.css │ │ └── typo.css │ ├── fonts │ │ ├── molla0ab2.eot │ │ ├── molla0ab2.svg │ │ ├── molla0ab2.ttf │ │ ├── molla0ab2.woff │ │ └── molla0ab2.woff2 │ ├── js │ │ ├── bootstrap-input-spinner.js │ │ ├── bootstrap.bundle.min.js │ │ ├── demos │ │ │ └── demo-13.js │ │ ├── imagesloaded.pkgd.min.js │ │ ├── isotope.pkgd.min.js │ │ ├── jquery.countTo.js │ │ ├── jquery.countdown.min.js │ │ ├── jquery.elevateZoom.min.js │ │ ├── jquery.hoverIntent.min.js │ │ ├── jquery.magnific-popup.min.js │ │ ├── jquery.min.js │ │ ├── jquery.plugin.min.js │ │ ├── jquery.sticky-kit.min.js │ │ ├── jquery.waypoints.min.js │ │ ├── main.js │ │ ├── nouislider.min.js │ │ ├── owl.carousel.min.js │ │ ├── superfish.min.js │ │ └── wNumb.js │ ├── main.js │ ├── popup │ │ └── quickView.html │ ├── skins │ │ └── skin-demo-13.css │ └── vendor │ │ └── line-awesome │ │ ├── css │ │ └── line-awesome.min.css │ │ └── fonts │ │ ├── line-awesome0176.eot │ │ ├── line-awesomeeb4f.eot │ │ ├── line-awesomeeb4f.svg │ │ ├── line-awesomeeb4f.ttf │ │ ├── line-awesomeeb4f.woff │ │ └── line-awesomeeb4f.woff2 ├── css │ ├── app.css │ ├── blue.css │ ├── green.css │ ├── main-app.min.css │ └── yellow.css ├── favicon.ico ├── fonts │ ├── FontAwesome.otf │ ├── flaming │ │ ├── flaming-webfont.woff │ │ └── flaming-webfont.woff2 │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ ├── fontawesome-webfont.woff2 │ ├── icon51c1.eot │ ├── icon51c1.svg │ ├── icon51c1.ttf │ ├── icon51c1.woff │ ├── icon51c1.woff2 │ ├── ionicons.svg │ ├── ionicons.ttf │ ├── ionicons.woff │ ├── ionicons.woff2 │ ├── molla0ab2.eot │ ├── molla0ab2.svg │ ├── molla0ab2.ttf │ ├── molla0ab2.woff │ ├── molla0ab2.woff2 │ └── vendor │ │ └── view-design │ │ └── dist │ │ └── styles │ │ ├── ionicons.svg │ │ ├── ionicons.ttf │ │ ├── ionicons.woff │ │ └── ionicons.woff2 ├── 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 │ └── vendor │ │ └── owl.carousel │ │ └── dist │ │ └── owl.video.play.png ├── index.php ├── js │ ├── admin.js │ ├── app.js │ └── template-cachable.js ├── manifest.json ├── robots.txt ├── serviceworker.js ├── sw.js └── web.config ├── resources ├── css │ └── app.css ├── lang │ └── en │ │ ├── auth.php │ │ ├── pagination.php │ │ ├── passwords.php │ │ └── validation.php ├── microfrontends │ ├── @admin-mf │ │ ├── bootstrap.js │ │ ├── common.js │ │ ├── gate.js │ │ ├── i18n.js │ │ ├── index.js │ │ ├── layout │ │ │ ├── components │ │ │ │ ├── AdminApp.vue │ │ │ │ ├── AdminFooter.vue │ │ │ │ ├── AdminNavbar.vue │ │ │ │ ├── AdminSidebar.vue │ │ │ │ ├── FilterData.vue │ │ │ │ ├── LanguegeSwitcher.vue │ │ │ │ ├── Loading.vue │ │ │ │ └── Pagination.vue │ │ │ ├── pages │ │ │ │ ├── AdminHomeDashboard.vue │ │ │ │ ├── AdminHomePage.vue │ │ │ │ ├── AdminLogin.vue │ │ │ │ └── NotFound.vue │ │ │ └── policies │ │ │ │ ├── AttributePolicy.js │ │ │ │ ├── BrandPolicy.js │ │ │ │ ├── CategoryPolicy.js │ │ │ │ └── ProductPolicy.js │ │ ├── locales │ │ │ ├── bn.json │ │ │ └── en.json │ │ ├── modules │ │ │ ├── attributes │ │ │ │ ├── component │ │ │ │ │ ├── ShowAllData.vue │ │ │ │ │ ├── addModalComponent.vue │ │ │ │ │ ├── delete_confimation.vue │ │ │ │ │ ├── editModalComponent.vue │ │ │ │ │ └── values │ │ │ │ │ │ ├── createSubAttribute.vue │ │ │ │ │ │ ├── editSubAttribute.vue │ │ │ │ │ │ └── showSubAttributes.vue │ │ │ │ ├── pages │ │ │ │ │ └── attributes.vue │ │ │ │ ├── router │ │ │ │ │ └── index.js │ │ │ │ └── store │ │ │ │ │ ├── actions.js │ │ │ │ │ ├── getters.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── mutations.js │ │ │ │ │ └── state.js │ │ │ ├── brands │ │ │ │ ├── components │ │ │ │ │ ├── addModalComponent.vue │ │ │ │ │ ├── delete_confimation.vue │ │ │ │ │ ├── editModalComponent.vue │ │ │ │ │ └── showAllData.vue │ │ │ │ ├── pages │ │ │ │ │ └── brands.vue │ │ │ │ ├── router │ │ │ │ │ └── index.js │ │ │ │ └── store │ │ │ │ │ ├── actions.js │ │ │ │ │ ├── getters.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── mutations.js │ │ │ │ │ └── state.js │ │ │ ├── categories │ │ │ │ ├── component │ │ │ │ │ ├── UploadResuableComponent.vue │ │ │ │ │ ├── addModalComponent.vue │ │ │ │ │ ├── delete_confimation.vue │ │ │ │ │ ├── editModalComponent.vue │ │ │ │ │ ├── sub-category │ │ │ │ │ │ ├── createSubCategory.vue │ │ │ │ │ │ ├── editSubCategory.vue │ │ │ │ │ │ └── showSubCategories.vue │ │ │ │ │ └── viewCategoriesComponent.vue │ │ │ │ ├── pages │ │ │ │ │ └── categories.vue │ │ │ │ ├── router │ │ │ │ │ └── index.js │ │ │ │ └── store │ │ │ │ │ ├── actions.js │ │ │ │ │ ├── getters.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── mutations.js │ │ │ │ │ └── state.js │ │ │ ├── index.js │ │ │ ├── products │ │ │ │ ├── components │ │ │ │ │ ├── createProduct.vue │ │ │ │ │ ├── editForm.vue │ │ │ │ │ ├── productAttributes.vue │ │ │ │ │ ├── productImages.vue │ │ │ │ │ ├── showAllData.vue │ │ │ │ │ └── updateProduct.vue │ │ │ │ ├── pages │ │ │ │ │ ├── create.vue │ │ │ │ │ ├── edit.vue │ │ │ │ │ ├── products.vue │ │ │ │ │ └── view.vue │ │ │ │ ├── router │ │ │ │ │ └── index.js │ │ │ │ └── store │ │ │ │ │ ├── actions.js │ │ │ │ │ ├── getters.js │ │ │ │ │ ├── index.js │ │ │ │ │ ├── mutations.js │ │ │ │ │ └── state.js │ │ │ └── settings │ │ │ │ ├── pages │ │ │ │ └── settings.vue │ │ │ │ ├── router │ │ │ │ └── index.js │ │ │ │ └── store │ │ │ │ └── index.js │ │ ├── router.js │ │ ├── store.js │ │ └── vue.config.js │ └── @site-mf │ │ ├── bootstrap.js │ │ ├── common.js │ │ ├── i18n.js │ │ ├── index.js │ │ ├── layout │ │ ├── components │ │ │ ├── Brand │ │ │ │ └── ShopByBrands.vue │ │ │ ├── Category │ │ │ │ ├── CardProduct.vue │ │ │ │ ├── CategoriesProducts.vue │ │ │ │ ├── HotDealProducts.vue │ │ │ │ └── PopularCategories.vue │ │ │ ├── Filter │ │ │ │ ├── MultipleFilter.vue │ │ │ │ └── SortingToolBox.vue │ │ │ ├── Footer.vue │ │ │ ├── Header.vue │ │ │ ├── LanguegeSwitcher.vue │ │ │ ├── Login.vue │ │ │ ├── MainApp.vue │ │ │ ├── MobileFooter.vue │ │ │ ├── MobileMenu.vue │ │ │ ├── Product │ │ │ │ ├── Product.vue │ │ │ │ ├── Products.vue │ │ │ │ └── QuickView.vue │ │ │ └── StickyHeader.vue │ │ └── pages │ │ │ ├── Dashboard.vue │ │ │ ├── HomePage.vue │ │ │ ├── Loading.vue │ │ │ ├── NotFound.vue │ │ │ ├── banner2column.vue │ │ │ ├── banner3column.vue │ │ │ └── slider.vue │ │ ├── locales │ │ ├── bn.json │ │ └── en.json │ │ ├── modules │ │ ├── attributes │ │ │ └── store │ │ │ │ ├── actions.js │ │ │ │ ├── getters.js │ │ │ │ ├── index.js │ │ │ │ ├── mutations.js │ │ │ │ └── state.js │ │ ├── auth │ │ │ ├── components │ │ │ │ └── main.vue │ │ │ ├── pages │ │ │ │ └── main.vue │ │ │ └── store │ │ │ │ ├── actions.js │ │ │ │ ├── getters.js │ │ │ │ ├── index.js │ │ │ │ ├── mutations.js │ │ │ │ └── state.js │ │ ├── brands │ │ │ ├── components │ │ │ │ └── Product.vue │ │ │ ├── pages │ │ │ │ └── ProductsByBrand.vue │ │ │ ├── router │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ ├── actions.js │ │ │ │ ├── getters.js │ │ │ │ ├── index.js │ │ │ │ ├── mutations.js │ │ │ │ └── state.js │ │ ├── cart │ │ │ ├── pages │ │ │ │ └── cart.vue │ │ │ ├── router │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ ├── actions.js │ │ │ │ ├── getters.js │ │ │ │ ├── index.js │ │ │ │ ├── mutations.js │ │ │ │ └── state.js │ │ ├── categories │ │ │ ├── components │ │ │ │ └── Product.vue │ │ │ ├── pages │ │ │ │ └── ProductByCategory.vue │ │ │ ├── router │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ └── index.js │ │ ├── compare │ │ │ ├── pages │ │ │ │ └── compare.vue │ │ │ ├── router │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ ├── actions.js │ │ │ │ ├── getters.js │ │ │ │ ├── index.js │ │ │ │ ├── mutations.js │ │ │ │ └── state.js │ │ ├── index.js │ │ ├── multipleFiltering │ │ │ └── store │ │ │ │ ├── actions.js │ │ │ │ ├── getters.js │ │ │ │ ├── index.js │ │ │ │ ├── mutations.js │ │ │ │ └── state.js │ │ ├── products │ │ │ ├── components │ │ │ │ ├── Product.vue │ │ │ │ └── main.vue │ │ │ ├── pages │ │ │ │ ├── products.vue │ │ │ │ └── single.vue │ │ │ ├── router │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ ├── actions.js │ │ │ │ ├── getters.js │ │ │ │ ├── index.js │ │ │ │ ├── mutations.js │ │ │ │ └── state.js │ │ ├── settings │ │ │ ├── pages │ │ │ │ └── settings.vue │ │ │ ├── router │ │ │ │ └── index.js │ │ │ └── store │ │ │ │ └── index.js │ │ ├── test │ │ │ ├── components │ │ │ │ └── main.vue │ │ │ ├── pages │ │ │ │ └── main.vue │ │ │ ├── router │ │ │ │ └── index..js │ │ │ └── store │ │ │ │ ├── actions.js │ │ │ │ ├── getters.js │ │ │ │ ├── index.js │ │ │ │ ├── mutations.js │ │ │ │ └── state.js │ │ └── wishlists │ │ │ ├── pages │ │ │ └── wishlists.vue │ │ │ ├── router │ │ │ └── index.js │ │ │ └── store │ │ │ ├── actions.js │ │ │ ├── getters.js │ │ │ ├── index.js │ │ │ ├── mutations.js │ │ │ └── state.js │ │ ├── router.js │ │ ├── store.js │ │ └── vue.config.js ├── sass │ ├── _variables.scss │ └── app.scss └── views │ ├── admin_layout.blade.php │ ├── auth │ ├── login.blade.php │ ├── passwords │ │ ├── confirm.blade.php │ │ ├── email.blade.php │ │ └── reset.blade.php │ ├── register.blade.php │ └── verify.blade.php │ ├── emails │ └── admin_log_mail.blade.php │ ├── home.blade.php │ ├── offline.blade.php │ ├── product.blade.php │ ├── site.blade.php │ ├── test.blade.php │ ├── user_login.blade.php │ └── vendor │ └── laravelpwa │ ├── meta.blade.php │ └── offline.blade.php ├── routes ├── admin.php ├── api.php ├── channels.php ├── console.php ├── site.php └── web.php ├── server.php ├── storage ├── app │ └── .gitignore ├── debugbar │ └── .gitignore ├── framework │ ├── .gitignore │ ├── cache │ │ └── .gitignore │ ├── sessions │ │ └── .gitignore │ ├── testing │ │ └── .gitignore │ └── views │ │ └── .gitignore └── logs │ └── .gitignore ├── stubs ├── console.stub ├── controller.api.stub ├── controller.invokable.stub ├── controller.model.api.stub ├── controller.model.stub ├── controller.nested.api.stub ├── controller.nested.stub ├── controller.plain.stub ├── controller.stub ├── factory.stub ├── job.queued.stub ├── job.stub ├── middleware.stub ├── migration.create.stub ├── migration.stub ├── migration.update.stub ├── model.pivot.stub ├── model.stub ├── policy.plain.stub ├── policy.stub ├── request.stub ├── resource-collection.stub ├── resource.stub ├── rule.stub ├── seeder.stub ├── test.stub └── test.unit.stub ├── tests ├── CreatesApplication.php ├── Feature │ └── ExampleTest.php ├── TestCase.php └── Unit │ └── ExampleTest.php ├── webpack.config.js └── webpack.mix.js /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | end_of_line = lf 6 | insert_final_newline = true 7 | indent_style = space 8 | indent_size = 4 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{yml,yaml}] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | APP_NAME=Laravel 2 | APP_ENV=local 3 | APP_KEY= 4 | APP_DEBUG=true 5 | APP_URL=http://localhost 6 | 7 | LOG_CHANNEL=stack 8 | 9 | DB_CONNECTION=mysql 10 | DB_HOST=127.0.0.1 11 | DB_PORT=3306 12 | DB_DATABASE=laravel 13 | DB_USERNAME=root 14 | DB_PASSWORD= 15 | 16 | BROADCAST_DRIVER=log 17 | CACHE_DRIVER=file 18 | QUEUE_CONNECTION=sync 19 | SESSION_DRIVER=file 20 | SESSION_LIFETIME=120 21 | 22 | REDIS_HOST=127.0.0.1 23 | REDIS_PASSWORD=null 24 | REDIS_PORT=6379 25 | 26 | MAIL_MAILER=smtp 27 | MAIL_HOST=smtp.mailtrap.io 28 | MAIL_PORT=2525 29 | MAIL_USERNAME=null 30 | MAIL_PASSWORD=null 31 | MAIL_ENCRYPTION=null 32 | MAIL_FROM_ADDRESS=null 33 | MAIL_FROM_NAME="${APP_NAME}" 34 | 35 | AWS_ACCESS_KEY_ID= 36 | AWS_SECRET_ACCESS_KEY= 37 | AWS_DEFAULT_REGION=us-east-1 38 | AWS_BUCKET= 39 | 40 | PUSHER_APP_ID= 41 | PUSHER_APP_KEY= 42 | PUSHER_APP_SECRET= 43 | PUSHER_APP_CLUSTER=mt1 44 | 45 | MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" 46 | MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" 47 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.css linguist-vendored 3 | *.scss linguist-vendored 4 | *.js linguist-vendored 5 | CHANGELOG.md export-ignore 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /public/hot 3 | /storage/*.key 4 | /vendor 5 | .env 6 | .env.backup 7 | .phpunit.result.cache 8 | Homestead.json 9 | Homestead.yaml 10 | npm-debug.log 11 | yarn-error.log 12 | 13 | /public/js/admin 14 | /public/js/app 15 | /public/Chunks 16 | /public/mix-manifest.json 17 | /public/storage/** 18 | !public/storage/flags -------------------------------------------------------------------------------- /.storage/flags/bn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/.storage/flags/bn.png -------------------------------------------------------------------------------- /.storage/flags/en.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/.storage/flags/en.png -------------------------------------------------------------------------------- /.storage/site/default-user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/.storage/site/default-user.png -------------------------------------------------------------------------------- /.storage/site/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/.storage/site/logo.png -------------------------------------------------------------------------------- /.styleci.yml: -------------------------------------------------------------------------------- 1 | php: 2 | preset: laravel 3 | disabled: 4 | - no_unused_imports 5 | finder: 6 | not-name: 7 | - index.php 8 | - server.php 9 | js: 10 | finder: 11 | not-name: 12 | - webpack.mix.js 13 | css: true 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Samayun Chowdhury 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /app/Console/Kernel.php: -------------------------------------------------------------------------------- 1 | command('inspire')->hourly(); 28 | } 29 | 30 | /** 31 | * Register the commands for the application. 32 | * 33 | * @return void 34 | */ 35 | protected function commands() 36 | { 37 | $this->load(__DIR__.'/Commands'); 38 | 39 | require base_path('routes/console.php'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/Contracts/BrandContract.php: -------------------------------------------------------------------------------- 1 | loggedInAdmin = $loggedInAdmin; 26 | } 27 | 28 | /** 29 | * Get the channels the event should broadcast on. 30 | * 31 | * @return \Illuminate\Broadcasting\Channel|array 32 | */ 33 | public function broadcastOn() 34 | { 35 | return new PrivateChannel('channel-name'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/Exceptions/Handler.php: -------------------------------------------------------------------------------- 1 | expectsJson()) { 41 | // return response()->json(['error' => 'Unauthenticated.'], 401); 42 | // } 43 | // // if ($request->is('admin') || $request->is('admin/*')) { 44 | // // return redirect()->guest('/login/admin'); 45 | // // } 46 | 47 | // return redirect()->guest(route('login')); 48 | // } 49 | } 50 | -------------------------------------------------------------------------------- /app/Http/Controllers/Admin/LoginController.php: -------------------------------------------------------------------------------- 1 | middleware('isAdmin'); 15 | } 16 | 17 | 18 | public function logout() 19 | { 20 | try { 21 | $user = Auth::user(); 22 | Cart::instance('default')->store($user); 23 | Auth::guard('admin')->logout(); 24 | session()->flush(); 25 | return response()->json([ 26 | 'success' => true , 27 | 'message' => 'Admin Logouted Successfully' 28 | ], 200); 29 | 30 | } catch (\Throwable $th) { 31 | return response()->json([ 32 | 'success' => false , 33 | 'message' => 'Admin Logout Failed' 34 | ], 401); 35 | } 36 | } 37 | protected function guard(){ 38 | return Auth::guard('admin'); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ConfirmPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/Http/Controllers/Auth/ForgotPasswordController.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 39 | $this->middleware('signed')->only('verify'); 40 | $this->middleware('throttle:6,1')->only('verify', 'resend'); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/Http/Controllers/Controller.php: -------------------------------------------------------------------------------- 1 | middleware('auth'); 17 | } 18 | 19 | /** 20 | * Show the application dashboard. 21 | * 22 | * @return \Illuminate\Contracts\Support\Renderable 23 | */ 24 | public function index() 25 | { 26 | return view('home'); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Middleware/Authenticate.php: -------------------------------------------------------------------------------- 1 | expectsJson()) { 18 | return route('login'); 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/Http/Middleware/EncryptCookies.php: -------------------------------------------------------------------------------- 1 | check()) { 24 | if ($request->ajax()) { 25 | return response()->json([ 26 | 'message' => 'Authenticate Failed' 27 | ],401); 28 | } else { 29 | return redirect('login/admin'); 30 | } 31 | 32 | } 33 | // return response()->json(['st' => Auth::guard('admin')->check()], 200);; 34 | return $next($request); 35 | 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/Http/Middleware/PreventRequestsDuringMaintenance.php: -------------------------------------------------------------------------------- 1 | check()) { 26 | // return redirect(RouteServiceProvider::HOME); 27 | // } 28 | // } 29 | 30 | // return $next($request); 31 | // } 32 | 33 | public function handle($request, Closure $next, $guard = null) 34 | { 35 | if ($guard == "admin" && Auth::guard($guard)->check()) { 36 | return redirect('/admin'); 37 | } 38 | 39 | if (Auth::guard($guard)->check()) { 40 | return redirect('/home'); 41 | } 42 | 43 | return $next($request); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrimStrings.php: -------------------------------------------------------------------------------- 1 | allSubdomainsOfApplicationUrl(), 18 | ]; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/Http/Middleware/TrustProxies.php: -------------------------------------------------------------------------------- 1 | 'required', 29 | 'image' => 'required', 30 | 'sku' => 'required', 31 | 'price' => 'required', 32 | 'description' => 'required', 33 | 'slug' => !$this->slug ? 'nullable|unique:products,slug' : 'nullable|unique:products,slug,'.$this->id, 34 | 'categories' => 'required', 35 | 'brand_id' => 'required|exists:brands,id', 36 | 'quantity' => 'required' 37 | ]; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Http/Resources/AttributeResource.php: -------------------------------------------------------------------------------- 1 | $this->id, 21 | "name" =>$this->name, 22 | "slug" => $this->slug ? $this->slug: "none", 23 | "type" => $this->value?['id'=>$this->value->id,'name'=>$this->value->name,'slug'=>$this->value->slug]: "", 24 | "values" => $this->values 25 | ]; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/Http/Resources/BrandResource.php: -------------------------------------------------------------------------------- 1 | $this->id, 20 | 'name' => $this->name, 21 | 'slug' => $this->slug, 22 | 'logo' => $this->logo ? url($this->logo) : Storage::url('brands/default.png'), 23 | 'products' => ProductResource::collection($this->products), 24 | 'products_count' => count($this->products) 25 | 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Http/Resources/CategoryResource.php: -------------------------------------------------------------------------------- 1 | $this->id, 20 | 'name' => $this->name, 21 | 'slug' => $this->slug, 22 | 'icon' => $this->icon ? url($this->icon) : Storage::url('categories/default.png'), 23 | 'subcategories' => count($this->subcategories) > 0 ? $this->subcategories : [], 24 | 'products' => $this->products, 25 | 'products_count' => count($this->products) 26 | 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/Http/Resources/ImageResource.php: -------------------------------------------------------------------------------- 1 | $this->id, 21 | 'url' => Storage::url('images/'.$this->image), 22 | 'imageable_id' => $this->imageable_id, 23 | 'imageable_type' => $this->imageable_type, 24 | ]; 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/Http/Resources/ProductAttributeResource.php: -------------------------------------------------------------------------------- 1 | $this->id, 20 | "attribute_id" => $this->attribute_id, 21 | "price" => $this->price, 22 | "quantity" => $this->quantity, 23 | 'type' => $this->attribute->value, 24 | 'name' => $this->attribute->name, 25 | 'slug' => $this->attribute->slug 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Jobs/BrandImageUploading.php: -------------------------------------------------------------------------------- 1 | logo = $request_logo; 25 | } 26 | 27 | /** 28 | * Execute the job. 29 | * 30 | * @return void 31 | */ 32 | public function handle() 33 | { 34 | info("UPLOADING JOB"); 35 | return $this->uploadBase64File($this->logo , 'uploads/brands/','public'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/Jobs/SendEmailJobs.php: -------------------------------------------------------------------------------- 1 | loggedInAdmin = $loggedInAdmin; 27 | } 28 | 29 | /** 30 | * Execute the job. 31 | * 32 | * @return void 33 | */ 34 | public function handle() 35 | { 36 | if($this->loggedInAdmin->is_super != 1){ 37 | $superAdmins = Admin::where('is_super',1)->get(); 38 | foreach ($superAdmins as $to) { 39 | Mail::to($to->email)->send(new AdminAlertMail($this->loggedInAdmin)); 40 | Storage::disk('public')->put('log.json',`Logged In Admin: `.$to->email); 41 | } 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /app/Listeners/AdminLoginAlertListener.php: -------------------------------------------------------------------------------- 1 | loggedInAdmin->is_super != 1){ 34 | $superAdmins = Admin::where('is_super',1)->get(); 35 | foreach ($superAdmins as $to) { 36 | Mail::to($to->email)->send(new AdminAlertMail($event->loggedInAdmin)); 37 | Storage::disk('public')->put('log.json',`Logged In Admin: `.$to->email); 38 | } 39 | } 40 | 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /app/Mail/AdminAlertMail.php: -------------------------------------------------------------------------------- 1 | loggedUser = $loggedUser; 25 | } 26 | 27 | /** 28 | * Build the message. 29 | * 30 | * @return $this 31 | */ 32 | public function build() 33 | { 34 | return $this->markdown('emails.admin_log_mail')->with([ 35 | 'email' => $this->loggedUser->email, 36 | 'name' => $this->loggedUser->name 37 | ]); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /app/Models/Admin.php: -------------------------------------------------------------------------------- 1 | where('is_super' , 1); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /app/Models/Attribute.php: -------------------------------------------------------------------------------- 1 | hasMany('App\Models\Attribute', 'parent_id'); 16 | } 17 | public function value() 18 | { 19 | return $this->belongsTo('App\Models\Attribute', 'parent_id'); 20 | } 21 | public function products() 22 | { 23 | return $this->hasMany('App\Models\ProductAttribute'); 24 | } 25 | 26 | public function setNameAttribute($value){ 27 | $this->attributes['name'] = $value; 28 | $this->attributes['slug'] = \Str::slug($value); 29 | } 30 | // public function getRouteKeyName() 31 | // { 32 | // return 'slug'; 33 | // } 34 | } 35 | -------------------------------------------------------------------------------- /app/Models/Brand.php: -------------------------------------------------------------------------------- 1 | where('name','LIKE', "%$q%") 18 | ->orWhere('id','LIKE', "%$q%") 19 | ->orWhere('created_at','LIKE', "%$q%"); 20 | // ->orWhere('logo','LIKE', "%$q%"); 21 | } 22 | public function setNameAttribute($v){ 23 | $this->attributes['name'] = $v; 24 | $this->attributes['slug'] = \Str::slug($v); 25 | } 26 | public function scopeFilter( $query,$request) 27 | { 28 | $perPage = $request->has('perPage') ? (int)$request->query('perPage') : 10; 29 | $orderBy = $request->has('orderBy') ? $request->query('orderBy') : 'created_at'; 30 | $sortBy = $request->has('sortBy') ? $request->query('sortBy') : 'desc'; 31 | $q = $request->has('q') ? $request->query('q') : '' ; 32 | 33 | return $query->search($q)->orderBy($orderBy , $sortBy)->paginate($perPage); 34 | } 35 | 36 | public function products() 37 | { 38 | return $this->hasMany(Product::class); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /app/Models/Categoryable.php: -------------------------------------------------------------------------------- 1 | morphToMany(); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /app/Models/Image.php: -------------------------------------------------------------------------------- 1 | morphTo(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/Models/Order.php: -------------------------------------------------------------------------------- 1 | belongsTo(Product::class); 17 | } 18 | 19 | public function attribute() 20 | { 21 | return $this->belongsTo(Attribute::class); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /app/Models/ShoppingCart.php: -------------------------------------------------------------------------------- 1 | 'datetime', 43 | ]; 44 | /** 45 | * Get the unique identifier to load the Cart from 46 | * 47 | * @return int|string 48 | */ 49 | public function getInstanceIdentifier($options = null) 50 | { 51 | return $this->email; 52 | } 53 | 54 | /** 55 | * Get the unique identifier to load the Cart from 56 | * 57 | * @return int|string 58 | */ 59 | public function getInstanceGlobalDiscount($options = null) 60 | { 61 | // return $this->taxRate ?: 0; 62 | return $this->discountRate ?: 0; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /app/Observers/BrandObserver.php: -------------------------------------------------------------------------------- 1 | CACHE_KEY); 21 | $this->flush($this->CACHE_KEY); 22 | } 23 | private function flush($key) 24 | { 25 | if(cache()->has($key)){ 26 | return cache()->forget($key); 27 | } 28 | } 29 | 30 | /** 31 | * Handle the brand "updated" event. 32 | * 33 | * @param \App\Models\Brand $brand 34 | * @return void 35 | */ 36 | public function updated(Brand $brand) 37 | { 38 | $this->flush($this->CACHE_KEY); 39 | } 40 | 41 | /** 42 | * Handle the brand "deleted" event. 43 | * 44 | * @param \App\Models\Brand $brand 45 | * @return void 46 | */ 47 | public function deleted(Brand $brand) 48 | { 49 | $this->flush($this->CACHE_KEY); 50 | } 51 | 52 | } 53 | -------------------------------------------------------------------------------- /app/Observers/ProductObserver.php: -------------------------------------------------------------------------------- 1 | has($key)){ 13 | return cache()->forget($key); 14 | } 15 | } 16 | /** 17 | * Handle the product "created" event. 18 | * 19 | * @param \App\Models\Product $product 20 | * @return void 21 | */ 22 | public function created(Product $product) 23 | { 24 | $this->flush($this->CACHE_KEY); 25 | } 26 | 27 | /** 28 | * Handle the product "updated" event. 29 | * 30 | * @param \App\Models\Product $product 31 | * @return void 32 | */ 33 | public function updated(Product $product) 34 | { 35 | $this->CACHE_KEY = 'product.'.$product->id; 36 | $this->flush($this->CACHE_KEY); 37 | } 38 | 39 | /** 40 | * Handle the product "deleted" event. 41 | * 42 | * @param \App\Models\Product $product 43 | * @return void 44 | */ 45 | public function deleted(Product $product) 46 | { 47 | $this->flush($this->CACHE_KEY); 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /app/Policies/ProductPolicy.php: -------------------------------------------------------------------------------- 1 | is_super == 1) { 15 | return true; 16 | } 17 | } 18 | 19 | public function viewAny(Admin $admin) 20 | { 21 | return true; 22 | } 23 | 24 | /** 25 | * Determine whether the user can view the model. 26 | * 27 | * @param \App\Models\Admin $admin 28 | * @param \App\Models\Brand $brand 29 | * @return mixed 30 | */ 31 | public function view(Admin $admin, Product $product) 32 | { 33 | return true; 34 | } 35 | 36 | public function create(Admin $admin) 37 | { 38 | return $admin->is_super == 1; 39 | } 40 | 41 | /** 42 | * Determine whether the admin can update the model. 43 | * 44 | * @param \App\Models\Admin $admin 45 | * @param \App\Models\Product $product 46 | * @return mixed 47 | */ 48 | public function update(Admin $admin, Product $product) 49 | { 50 | return $admin->is_super == 1 || $admin->is_super == 0; 51 | } 52 | 53 | /** 54 | * Determine whether the admin can delete the model. 55 | * 56 | * @param \App\Models\Admin $admin 57 | * @param \App\Models\Product $product 58 | * @return mixed 59 | */ 60 | public function delete(Admin $admin, Product $product) 61 | { 62 | return $admin->is_super == 1; 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /app/Providers/AppServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 21 | CategoryPolicy::class, 22 | BrandPolicy::class, 23 | Attribute::class, 24 | ] 25 | ]; 26 | 27 | /** 28 | * Register any authentication / authorization services. 29 | * 30 | * @return void 31 | */ 32 | public function boot() 33 | { 34 | 35 | Gate::define('super' , function(Admin $admin){ 36 | return $admin->is_super == 1; 37 | }); 38 | Gate::define('multi_delete' , function(Admin $admin){ 39 | return $admin->is_super == 1; 40 | }); 41 | $this->registerPolicies(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/Providers/BroadcastServiceProvider.php: -------------------------------------------------------------------------------- 1 | [ 19 | // SendEmailVerificationNotification::class, 20 | // ], 21 | 'App\Events\AdminLoginAlert' => [ 22 | 'App\Listeners\AdminLoginAlertListener' 23 | ] 24 | ]; 25 | 26 | /** 27 | * Register any events for your application. 28 | * 29 | * @return void 30 | */ 31 | public function boot() 32 | { 33 | // 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/Providers/RepositoryServiceProvider.php: -------------------------------------------------------------------------------- 1 | BrandRepository::class, 15 | ProductContract::class => ProductRepository::class 16 | ]; 17 | /** 18 | * Register services. 19 | * 20 | * @return void 21 | */ 22 | public function register() 23 | { 24 | foreach ($this->toBeBind as $interface => $implementation) { 25 | $this->app->bind($interface,$implementation); 26 | } 27 | } 28 | 29 | /** 30 | * Bootstrap services. 31 | * 32 | * @return void 33 | */ 34 | public function boot() 35 | { 36 | 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /app/Repositories/BrandRepository.php: -------------------------------------------------------------------------------- 1 | model = $model; 22 | } 23 | 24 | public function lists() 25 | { 26 | $KEY = 'brands'; 27 | return Cache::remember($KEY, now()->addMinutes(120), function () { 28 | return $this->model::all(); 29 | }); 30 | } 31 | public function create($attributes) 32 | { 33 | return $this->model::create($attributes); 34 | } 35 | public function update(array $params,int $id){ 36 | $data = $this->model::findOrFail($id); 37 | if($data) { $data->update($params); } 38 | } 39 | public function delete(int $id){ 40 | $data = $this->model::findOrFail($id); 41 | if($data) { $data->delete(); } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /bootstrap/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /config/cors.php: -------------------------------------------------------------------------------- 1 | ['api/*'], 19 | 20 | 'allowed_methods' => ['*'], 21 | 22 | 'allowed_origins' => ['*'], 23 | 24 | 'allowed_origins_patterns' => [], 25 | 26 | 'allowed_headers' => ['*'], 27 | 28 | 'exposed_headers' => [], 29 | 30 | 'max_age' => 0, 31 | 32 | 'supports_credentials' => false, 33 | 34 | ]; 35 | -------------------------------------------------------------------------------- /config/services.php: -------------------------------------------------------------------------------- 1 | [ 18 | 'domain' => env('MAILGUN_DOMAIN'), 19 | 'secret' => env('MAILGUN_SECRET'), 20 | 'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'), 21 | ], 22 | 23 | 'postmark' => [ 24 | 'token' => env('POSTMARK_TOKEN'), 25 | ], 26 | 27 | 'ses' => [ 28 | 'key' => env('AWS_ACCESS_KEY_ID'), 29 | 'secret' => env('AWS_SECRET_ACCESS_KEY'), 30 | 'region' => env('AWS_DEFAULT_REGION', 'us-east-1'), 31 | ], 32 | 33 | ]; 34 | -------------------------------------------------------------------------------- /config/view.php: -------------------------------------------------------------------------------- 1 | [ 17 | resource_path('views'), 18 | ], 19 | 20 | /* 21 | |-------------------------------------------------------------------------- 22 | | Compiled View Path 23 | |-------------------------------------------------------------------------- 24 | | 25 | | This option determines where all the compiled Blade templates will be 26 | | stored for your application. Typically, this is within the storage 27 | | directory. However, as usual, you are free to change this value. 28 | | 29 | */ 30 | 31 | 'compiled' => env( 32 | 'VIEW_COMPILED_PATH', 33 | realpath(storage_path('framework/views')) 34 | ), 35 | 36 | ]; 37 | -------------------------------------------------------------------------------- /database/.gitignore: -------------------------------------------------------------------------------- 1 | *.sqlite 2 | *.sqlite-journal 3 | -------------------------------------------------------------------------------- /database/factories/AttributeFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->name, 26 | ]; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /database/factories/CategoryFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->name, 26 | 'icon' => $this->faker->imageUrl($width = 640,$height = 400), 27 | ]; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /database/factories/UserFactory.php: -------------------------------------------------------------------------------- 1 | $this->faker->name, 27 | 'email' => $this->faker->unique()->safeEmail, 28 | 'email_verified_at' => now(), 29 | 'password' => \Hash::make('123456') , //'$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 30 | 'remember_token' => Str::random(10), 31 | ]; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_000000_create_users_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->index(); 19 | $table->string('email')->unique(); 20 | $table->string('phone')->nullable(); 21 | $table->string('address')->nullable(); // Nabigonj Habigonj (v2: Post Code , Regional Code ,District, Thana All information added in profile tables) 22 | $table->string('status',10)->default('created'); // verified , created , golden(who ordered at least one product) 23 | $table->timestamp('email_verified_at')->nullable(); 24 | $table->string('password')->nullable(); 25 | $table->string('provider_id')->nullable(); 26 | $table->string('socialType')->nullable(); 27 | $table->rememberToken(); 28 | $table->timestamps(); 29 | }); 30 | } 31 | 32 | /** 33 | * Reverse the migrations. 34 | * 35 | * @return void 36 | */ 37 | public function down() 38 | { 39 | Schema::dropIfExists('users'); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /database/migrations/2014_10_12_100000_create_password_resets_table.php: -------------------------------------------------------------------------------- 1 | string('email')->index(); 18 | $table->string('token'); 19 | $table->timestamp('created_at')->nullable(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('password_resets'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /database/migrations/2018_12_23_120000_create_shoppingcart_table.php: -------------------------------------------------------------------------------- 1 | string('identifier'); 16 | $table->string('instance'); 17 | $table->longText('content'); 18 | $table->nullableTimestamps(); 19 | 20 | $table->primary(['identifier', 'instance']); 21 | }); 22 | } 23 | 24 | /** 25 | * Reverse the migrations. 26 | */ 27 | public function down() 28 | { 29 | Schema::drop(config('cart.database.table')); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/migrations/2019_08_19_000000_create_failed_jobs_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('uuid')->unique(); 19 | $table->text('connection'); 20 | $table->text('queue'); 21 | $table->longText('payload'); 22 | $table->longText('exception'); 23 | $table->timestamp('failed_at')->useCurrent(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('failed_jobs'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2020_10_10_021117_create_brands_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->unique()->index(); 19 | $table->string('slug'); 20 | $table->string('logo')->nullable(); 21 | $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | * 28 | * @return void 29 | */ 30 | public function down() 31 | { 32 | Schema::dropIfExists('brands'); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /database/migrations/2020_10_10_023054_create_categories_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->index(); 19 | $table->string('slug')->unique(); 20 | $table->unsignedBigInteger('parent_id')->default(1); 21 | $table->string('icon')->nullable(); 22 | $table->text('description')->nullable(); 23 | $table->foreign('parent_id')->on('categories')->references('id')->onDelete('cascade'); 24 | $table->timestamps(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('categories'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /database/migrations/2020_10_10_023113_create_products_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->index(); 19 | $table->string('slug')->unique(); 20 | $table->unsignedBigInteger('brand_id'); 21 | $table->foreign('brand_id')->references('id')->on('brands')->onDelete('cascade'); 22 | $table->integer('sku'); 23 | $table->float('price' , 8,2); 24 | // $table->float('discount_price' , 8,2)->nullable(); 25 | $table->text('description')->nullable(); 26 | // $table->enum('status', ['pending','approved'])->nullable(); 27 | // $table->string('color')->nullable(); 28 | // $table->string('size')->nullable(); 29 | // $table->unsignedInteger('quantity')->nullable(); 30 | $table->timestamps(); 31 | }); 32 | } 33 | 34 | /** 35 | * Reverse the migrations. 36 | * 37 | * @return void 38 | */ 39 | public function down() 40 | { 41 | Schema::dropIfExists('products'); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /database/migrations/2020_10_10_035144_create_orders_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->unsignedBigInteger('user_id'); 19 | $table->string('comment')->nullable(); 20 | $table->string('shipping_address')->nullable(); 21 | $table->float('discount' , 8,2); 22 | $table->string('status' ,20)->nullable()->default('pending'); 23 | $table->string('payment_type' ,20)->nullable()->default('cash'); 24 | $table->float('total' ,8,2); 25 | $table->float('charges' ,8,2)->nullable()->default(0); 26 | $table->float('sub_total' ,8,2); 27 | $table->foreign('user_id') 28 | ->references('id')->on('users') 29 | ->onDelete('cascade'); 30 | $table->timestamps(); 31 | }); 32 | 33 | } 34 | 35 | /** 36 | * Reverse the migrations. 37 | * 38 | * @return void 39 | */ 40 | public function down() 41 | { 42 | Schema::dropIfExists('orders'); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /database/migrations/2020_10_10_040402_create_order_items_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->unsignedBigInteger('order_id'); 19 | $table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade'); 20 | $table->string('item_name'); 21 | $table->float('item_price' , 8,2); 22 | $table->integer('item_quantity'); 23 | $table->timestamps(); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('order_items'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2020_10_10_040639_create_admins_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name'); 19 | $table->string('email')->unique(); 20 | $table->string('phone')->nullable(); 21 | $table->boolean('is_super')->default(false); 22 | $table->timestamp('email_verified_at')->nullable(); 23 | $table->string('password'); 24 | $table->rememberToken(); 25 | 26 | $table->timestamps(); 27 | }); 28 | } 29 | 30 | /** 31 | * Reverse the migrations. 32 | * 33 | * @return void 34 | */ 35 | public function down() 36 | { 37 | Schema::dropIfExists('admins'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /database/migrations/2020_10_26_085920_create_jobs_table.php: -------------------------------------------------------------------------------- 1 | bigIncrements('id'); 18 | $table->string('queue')->index(); 19 | $table->longText('payload'); 20 | $table->unsignedTinyInteger('attempts'); 21 | $table->unsignedInteger('reserved_at')->nullable(); 22 | $table->unsignedInteger('available_at'); 23 | $table->unsignedInteger('created_at'); 24 | }); 25 | } 26 | 27 | /** 28 | * Reverse the migrations. 29 | * 30 | * @return void 31 | */ 32 | public function down() 33 | { 34 | Schema::dropIfExists('jobs'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /database/migrations/2020_11_09_054329_add_image_to_products_table.php: -------------------------------------------------------------------------------- 1 | boolean('status')->default(1)->nullable(); 18 | // $table->float('discount_price' , 8,2)->nullable(); 19 | $table->boolean('featured')->default(0); 20 | $table->string('image')->nullable(); 21 | // $table->decimal('weight', 8, 2)->nullable(); 22 | // $table->string('color')->nullable(); 23 | // $table->string('size')->nullable(); 24 | $table->unsignedInteger('quantity')->nullable(); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::table('products', function (Blueprint $table) { 36 | // 37 | }); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /database/migrations/2020_11_12_063747_create_attributes_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('name')->index(); 19 | $table->string('slug')->unique(); 20 | $table->unsignedBigInteger('parent_id')->nullable(); 21 | $table->foreign('parent_id')->on('attributes')->references('id')->onDelete('cascade'); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('attributes'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/migrations/2020_11_13_054258_create_categoryables_table.php: -------------------------------------------------------------------------------- 1 | unsignedBigInteger('category_id'); 18 | // $table->unsignedBigInteger('categoryable_id')->index(); 19 | // $table->string('categoryable_type'); 20 | $table->morphs('categoryable'); 21 | // $table->timestamps(); 22 | }); 23 | } 24 | 25 | /** 26 | * Reverse the migrations. 27 | * 28 | * @return void 29 | */ 30 | public function down() 31 | { 32 | Schema::dropIfExists('categoryables'); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /database/migrations/2020_11_13_154946_create_images_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('image'); 19 | $table->morphs('imageable'); 20 | // $table->unsignedBigInteger('imageable_id')->index(); 21 | // $table->string('imageable_type'); 22 | $table->timestamps(); 23 | }); 24 | } 25 | 26 | /** 27 | * Reverse the migrations. 28 | * 29 | * @return void 30 | */ 31 | public function down() 32 | { 33 | Schema::dropIfExists('images'); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /database/migrations/2020_11_14_085006_create_product_attributes_table.php: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->unsignedBigInteger('product_id'); 19 | $table->unsignedBigInteger('attribute_id'); 20 | $table->integer('quantity')->nullable()->default(1); 21 | $table->float('price',8,2)->nullable()->default(0); 22 | 23 | $table->foreign('product_id')->on('products')->references('id')->onDelete('cascade'); 24 | $table->foreign('attribute_id')->on('attributes')->references('id')->onDelete('cascade'); 25 | }); 26 | } 27 | 28 | /** 29 | * Reverse the migrations. 30 | * 31 | * @return void 32 | */ 33 | public function down() 34 | { 35 | Schema::dropIfExists('product_attributes'); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /database/seeders/CreateUsersSeeder.php: -------------------------------------------------------------------------------- 1 | 'Admin BoSs', 21 | 'email'=>'samayunmc99@gmail.com', 22 | 'is_super' => 0, 23 | 'password'=> \Hash::make('123456'), 24 | ]); 25 | 26 | Admin::create([ 27 | 'name'=> 'Heath Ledger', 28 | 'email'=>'admin@admin.com', 29 | 'is_super' => 1, 30 | 'password'=> \Hash::make('123456'), 31 | ]); 32 | Admin::create([ 33 | 'name'=>'Samayun Chowdhury ', 34 | 'email'=>'samayun.m.chowdhury@gmail.com', 35 | 'is_super' => 1, 36 | 'password'=> \Hash::make('123456'), 37 | ]); 38 | 39 | User::create([ 40 | 'name'=>'Christian Bale', 41 | 'email'=>'user@user.com', 42 | 'status' => 'created', 43 | 'password'=> \Hash::make('123456') 44 | ]); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /database/seeders/CreateVariantSeeder.php: -------------------------------------------------------------------------------- 1 | 'Color','slug' => 'color']); 20 | Attribute::create(['name' => 'Size','slug' => 'size']); 21 | 22 | Category::create([ 23 | 'id' => 1, 24 | 'name' => 'Root', 25 | 'slug' => 'root', 26 | 'description' => 'This is root category . don\'t change this', 27 | 'parent_id' => 1 28 | ]); 29 | 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /database/seeders/DatabaseSeeder.php: -------------------------------------------------------------------------------- 1 | create(); 20 | $this->call(CreateVariantSeeder::class); 21 | $this->call(CreateUsersSeeder::class); 22 | // Category::factory(20)->create(); 23 | // Brand::factory(10)->create(); 24 | // Product::factory(20)->create(); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /docs/VuePerformance.md: -------------------------------------------------------------------------------- 1 | # Performance 2 | 3 | Vue.config.performance = process.env.NODE_ENV !== "production"; 4 | 5 | # Disabling reactivity Object.freeze(): 6 | 7 | data: function () { 8 | return { 9 | items: Object.freeze(messagesService.getMessages()) 10 | } 11 | }, 12 | # Lazy Loading 13 | `item : () => import(/* webpackChunkName: "Chunks/Items" */ './Items.vue)`; 14 | 15 | 16 | # Async & Dynamic Component Loading 17 | `const items = { 18 | components: () => import(/* webpackChunkName: "Chunks/Items" */ './Items.vue), 19 | loading, 20 | error 21 | } 22 | 23 | ` 24 | 25 | https://github.com/sitepoint-editors/shopping-cart-async 26 | -------------------------------------------------------------------------------- /docs/images/AuthorizationAdmin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/AuthorizationAdmin.png -------------------------------------------------------------------------------- /docs/images/AuthorizationSuperAdmin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/AuthorizationSuperAdmin.png -------------------------------------------------------------------------------- /docs/images/FilterData.vue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/FilterData.vue.png -------------------------------------------------------------------------------- /docs/images/add-category-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/add-category-image.png -------------------------------------------------------------------------------- /docs/images/admin-dashboard-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/admin-dashboard-dark.png -------------------------------------------------------------------------------- /docs/images/admin-dashboard-light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/admin-dashboard-light.png -------------------------------------------------------------------------------- /docs/images/admin-dashboard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/admin-dashboard.png -------------------------------------------------------------------------------- /docs/images/categories.vue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/categories.vue.png -------------------------------------------------------------------------------- /docs/images/filter_result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/filter_result.png -------------------------------------------------------------------------------- /docs/images/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/home.png -------------------------------------------------------------------------------- /docs/images/localization.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/localization.png -------------------------------------------------------------------------------- /docs/images/localization_folder_structure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/localization_folder_structure.png -------------------------------------------------------------------------------- /docs/images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/logo.png -------------------------------------------------------------------------------- /docs/images/pagination.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/pagination.png -------------------------------------------------------------------------------- /docs/images/view-added-category-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/docs/images/view-added-category-image.png -------------------------------------------------------------------------------- /packages/penguin/bread/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "penguin/bread", 3 | "description": "CRUD Generator for artisan command", 4 | "type": "meta-package", 5 | "authors": [ 6 | { 7 | "name": "Samayun Chowdhury", 8 | "email": "samayunmc99@gmail.com" 9 | } 10 | ], 11 | "minimum-stability": "dev", 12 | "replace": { 13 | "illuminate/support": "self.version" 14 | }, 15 | "extra": { 16 | "laravel": { 17 | "providers": [ 18 | "Penguin\\Bread\\BreadServiceProvider" 19 | ] 20 | } 21 | }, 22 | "autoload": { 23 | "psr-4": { 24 | "Penguin\\Bread\\": "src/" 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /packages/penguin/bread/src/BreadServiceProvider.php: -------------------------------------------------------------------------------- 1 | load(__DIR__.'/Commands'); 18 | if ($this->app->runningInConsole()) { 19 | $this->commands([ 20 | PenguinInstallCommand::class, 21 | ]); 22 | } 23 | } 24 | 25 | /** 26 | * Bootstrap services. 27 | * 28 | * @return void 29 | */ 30 | public function boot() 31 | { 32 | info("BOOT FROM BreadServiceProvider"); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /packages/penguin/bread/src/stubs/Observer.stub: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->timestamps(); 19 | }); 20 | } 21 | 22 | /** 23 | * Reverse the migrations. 24 | * 25 | * @return void 26 | */ 27 | public function down() 28 | { 29 | Schema::dropIfExists('{{ table }}'); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /packages/penguin/bread/src/stubs/migration.stub: -------------------------------------------------------------------------------- 1 | get('/'); 19 | 20 | $response->assertStatus(200); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /packages/penguin/bread/src/stubs/test.unit.stub: -------------------------------------------------------------------------------- 1 | assertTrue(true); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 9 | ./tests/Unit 10 | 11 | 12 | ./tests/Feature 13 | 14 | 15 | 16 | 17 | ./app 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | 3 | Options -MultiViews -Indexes 4 | 5 | 6 | RewriteEngine On 7 | 8 | # Handle Authorization Header 9 | RewriteCond %{HTTP:Authorization} . 10 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 11 | 12 | # Redirect Trailing Slashes If Not A Folder... 13 | RewriteCond %{REQUEST_FILENAME} !-d 14 | RewriteCond %{REQUEST_URI} (.+)/$ 15 | RewriteRule ^ %1 [L,R=301] 16 | 17 | # Send Requests To Front Controller... 18 | RewriteCond %{REQUEST_FILENAME} !-d 19 | RewriteCond %{REQUEST_FILENAME} !-f 20 | RewriteRule ^ index.php [L] 21 | 22 | -------------------------------------------------------------------------------- /public/assets/css/plugins/jquery.countdown.css: -------------------------------------------------------------------------------- 1 | .countdown-rtl{direction:rtl}.countdown-holding span{color:#888}.countdown-row{width:100%;text-align:center}.countdown-row:after{content:'';display:table;clear:both}.countdown-show1 .countdown-section{width:calc(100% - 20px)}.countdown-show2 .countdown-section{width:calc(50% - 20px)}.countdown-show3 .countdown-section{width:calc(33.3% - 20px)}.countdown-show4 .countdown-section{width:calc(25% - 20px)}.countdown-show5 .countdown-section{width:calc(20% - 20px)}.countdown-show6 .countdown-section{width:calc(16.66% - 20px)}.countdown-show7 .countdown-section{width:calc(14.285% - 20px)}.countdown-section{position:relative;display:block;float:left;font-size:75%;text-align:center;margin-left:10px;margin-right:10px}.countdown-amount{font-size:200%}.countdown-period{display:block}.countdown-descr{display:block;width:100%}.countdown-separator .countdown-section:not(:last-child):after{content:':';display:inline-block;font-size:30px;line-height:1;position:absolute;left:100%;margin-left:8px;top:50%;transform:translateY(-50%);-ms-transform:translateY(-50%)} 2 | /*# sourceMappingURL=jquery.countdown.css.map */ 3 | -------------------------------------------------------------------------------- /public/assets/fonts/molla0ab2.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/assets/fonts/molla0ab2.eot -------------------------------------------------------------------------------- /public/assets/fonts/molla0ab2.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/assets/fonts/molla0ab2.ttf -------------------------------------------------------------------------------- /public/assets/fonts/molla0ab2.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/assets/fonts/molla0ab2.woff -------------------------------------------------------------------------------- /public/assets/fonts/molla0ab2.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/assets/fonts/molla0ab2.woff2 -------------------------------------------------------------------------------- /public/assets/js/demos/demo-13.js: -------------------------------------------------------------------------------- 1 | // Demo 13 Js file 2 | $(document).ready(function() { 3 | 'use strict'; 4 | }); -------------------------------------------------------------------------------- /public/assets/vendor/line-awesome/fonts/line-awesome0176.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/assets/vendor/line-awesome/fonts/line-awesome0176.eot -------------------------------------------------------------------------------- /public/assets/vendor/line-awesome/fonts/line-awesomeeb4f.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/assets/vendor/line-awesome/fonts/line-awesomeeb4f.eot -------------------------------------------------------------------------------- /public/assets/vendor/line-awesome/fonts/line-awesomeeb4f.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/assets/vendor/line-awesome/fonts/line-awesomeeb4f.ttf -------------------------------------------------------------------------------- /public/assets/vendor/line-awesome/fonts/line-awesomeeb4f.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/assets/vendor/line-awesome/fonts/line-awesomeeb4f.woff -------------------------------------------------------------------------------- /public/assets/vendor/line-awesome/fonts/line-awesomeeb4f.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/assets/vendor/line-awesome/fonts/line-awesomeeb4f.woff2 -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/favicon.ico -------------------------------------------------------------------------------- /public/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /public/fonts/flaming/flaming-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/flaming/flaming-webfont.woff -------------------------------------------------------------------------------- /public/fonts/flaming/flaming-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/flaming/flaming-webfont.woff2 -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /public/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /public/fonts/icon51c1.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/icon51c1.eot -------------------------------------------------------------------------------- /public/fonts/icon51c1.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/icon51c1.ttf -------------------------------------------------------------------------------- /public/fonts/icon51c1.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/icon51c1.woff -------------------------------------------------------------------------------- /public/fonts/icon51c1.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/icon51c1.woff2 -------------------------------------------------------------------------------- /public/fonts/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/ionicons.ttf -------------------------------------------------------------------------------- /public/fonts/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/ionicons.woff -------------------------------------------------------------------------------- /public/fonts/ionicons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/ionicons.woff2 -------------------------------------------------------------------------------- /public/fonts/molla0ab2.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/molla0ab2.eot -------------------------------------------------------------------------------- /public/fonts/molla0ab2.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/molla0ab2.ttf -------------------------------------------------------------------------------- /public/fonts/molla0ab2.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/molla0ab2.woff -------------------------------------------------------------------------------- /public/fonts/molla0ab2.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/molla0ab2.woff2 -------------------------------------------------------------------------------- /public/fonts/vendor/view-design/dist/styles/ionicons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/vendor/view-design/dist/styles/ionicons.ttf -------------------------------------------------------------------------------- /public/fonts/vendor/view-design/dist/styles/ionicons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/vendor/view-design/dist/styles/ionicons.woff -------------------------------------------------------------------------------- /public/fonts/vendor/view-design/dist/styles/ionicons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/fonts/vendor/view-design/dist/styles/ionicons.woff2 -------------------------------------------------------------------------------- /public/images/icons/icon-128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/icon-128x128.png -------------------------------------------------------------------------------- /public/images/icons/icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/icon-144x144.png -------------------------------------------------------------------------------- /public/images/icons/icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/icon-152x152.png -------------------------------------------------------------------------------- /public/images/icons/icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/icon-192x192.png -------------------------------------------------------------------------------- /public/images/icons/icon-384x384.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/icon-384x384.png -------------------------------------------------------------------------------- /public/images/icons/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/icon-512x512.png -------------------------------------------------------------------------------- /public/images/icons/icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/icon-72x72.png -------------------------------------------------------------------------------- /public/images/icons/icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/icon-96x96.png -------------------------------------------------------------------------------- /public/images/icons/splash-1125x2436.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/splash-1125x2436.png -------------------------------------------------------------------------------- /public/images/icons/splash-1242x2208.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/splash-1242x2208.png -------------------------------------------------------------------------------- /public/images/icons/splash-1242x2688.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/splash-1242x2688.png -------------------------------------------------------------------------------- /public/images/icons/splash-1536x2048.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/splash-1536x2048.png -------------------------------------------------------------------------------- /public/images/icons/splash-1668x2224.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/splash-1668x2224.png -------------------------------------------------------------------------------- /public/images/icons/splash-1668x2388.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/splash-1668x2388.png -------------------------------------------------------------------------------- /public/images/icons/splash-2048x2732.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/splash-2048x2732.png -------------------------------------------------------------------------------- /public/images/icons/splash-640x1136.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/splash-640x1136.png -------------------------------------------------------------------------------- /public/images/icons/splash-750x1334.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/splash-750x1334.png -------------------------------------------------------------------------------- /public/images/icons/splash-828x1792.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/icons/splash-828x1792.png -------------------------------------------------------------------------------- /public/images/vendor/owl.carousel/dist/owl.video.play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/public/images/vendor/owl.carousel/dist/owl.video.play.png -------------------------------------------------------------------------------- /public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "E Penguin Shop", 3 | "name": "Penguin Online Shop ", 4 | "icons": [ 5 | { 6 | "src": "/storage/site/logo.png", 7 | "type": "image/png", 8 | "sizes": "192x192" 9 | } 10 | ], 11 | "start_url": "/", 12 | "background_color": "#009688", 13 | "display": "standalone", 14 | "scope": "/", 15 | "theme_color": "#f96545" 16 | } 17 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /public/sw.js: -------------------------------------------------------------------------------- 1 | var staticCacheName = "pwa-v" + new Date().getTime(); 2 | var filesToCache = [ 3 | // 'https://fonts.googleapis.com/css?family=Poppins:200,200i,300,300i,400,400i,500,500i,600,600i,700,700i,800', 4 | '/css/main-app.min.css', 5 | '/css/blue.css', 6 | '/css/green.css', 7 | '/css/yellow.css', 8 | // '/js/template-cachable.js', 9 | '/js/app.js', 10 | '/storage/site/logo.png', 11 | '/offline' 12 | ]; 13 | 14 | // Cache on install 15 | self.addEventListener("install", event => { 16 | this.skipWaiting(); 17 | event.waitUntil( 18 | caches.open(staticCacheName) 19 | .then(cache => { 20 | return cache.addAll(filesToCache); 21 | }) 22 | ) 23 | }); 24 | 25 | // Clear cache on activate 26 | self.addEventListener('activate', event => { 27 | event.waitUntil( 28 | caches.keys().then(cacheNames => { 29 | return Promise.all( 30 | cacheNames 31 | .filter(cacheName => (cacheName.startsWith("pwa-"))) 32 | .filter(cacheName => (cacheName !== staticCacheName)) 33 | .map(cacheName => caches.delete(cacheName)) 34 | ); 35 | }) 36 | ); 37 | }); 38 | 39 | // Serve from Cache 40 | self.addEventListener("fetch", event => { 41 | event.respondWith( 42 | caches.match(event.request) 43 | .then(response => { 44 | return response || fetch(event.request); 45 | }) 46 | .catch(() => { 47 | return caches.match('offline'); 48 | }) 49 | ) 50 | }); 51 | -------------------------------------------------------------------------------- /public/web.config: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /resources/css/app.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/samayun/ecommerce-laravel-vue/878fd578eab8e2987b190bb2b59c9f96b2713bdd/resources/css/app.css -------------------------------------------------------------------------------- /resources/lang/en/auth.php: -------------------------------------------------------------------------------- 1 | 'These credentials do not match our records.', 17 | 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/pagination.php: -------------------------------------------------------------------------------- 1 | '« Previous', 17 | 'next' => 'Next »', 18 | 19 | ]; 20 | -------------------------------------------------------------------------------- /resources/lang/en/passwords.php: -------------------------------------------------------------------------------- 1 | 'Your password has been reset!', 17 | 'sent' => 'We have emailed your password reset link!', 18 | 'throttled' => 'Please wait before retrying.', 19 | 'token' => 'This password reset token is invalid.', 20 | 'user' => "We can't find a user with that email address.", 21 | 22 | ]; 23 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/common.js: -------------------------------------------------------------------------------- 1 | // import axios from "axios"; 2 | 3 | export default { 4 | methods: { 5 | isPermitted(action,type){ 6 | return $gate.allows(action,type); 7 | }, 8 | async callApi(method, url, dataObj ){ 9 | try { 10 | return await axios({ 11 | method: method, 12 | url: url, 13 | data: dataObj 14 | }); 15 | } catch (e) { 16 | return e.response 17 | } 18 | }, 19 | 20 | i(desc, title="Hey") { 21 | this.$Notice.info({ 22 | title: title, 23 | desc: desc 24 | }); 25 | }, 26 | s(desc, title="Great!") { 27 | this.$Notice.success({ 28 | title: title, 29 | desc: desc 30 | }); 31 | }, 32 | w(desc, title="Oops!") { 33 | this.$Notice.warning({ 34 | title: title, 35 | desc: desc 36 | }); 37 | }, 38 | e(desc, title="Oops!") { 39 | this.$Notice.error({ 40 | title: title, 41 | desc: desc 42 | }); 43 | }, 44 | swr(desc='Somethingn went wrong! Please try again.', title="Oops") { 45 | this.$Notice.error({ 46 | title: title, 47 | desc: desc 48 | }); 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/gate.js: -------------------------------------------------------------------------------- 1 | import BrandPolicy from "./layout/policies/BrandPolicy"; 2 | import AttributePolicy from "./layout/policies/AttributePolicy"; 3 | import CategoryPolicy from "./layout/policies/CategoryPolicy"; 4 | import ProductPolicy from "./layout/policies/ProductPolicy"; 5 | 6 | class Gate { 7 | constructor(user) { 8 | this.user = user; 9 | 10 | this.policies = { 11 | category: CategoryPolicy, 12 | brand: BrandPolicy, 13 | product: ProductPolicy, 14 | attribute: AttributePolicy 15 | }; 16 | } 17 | 18 | before() { 19 | return this.user && this.user.is_super == 1; 20 | } 21 | 22 | allows(action, type, model = null) { 23 | if (this.before()) { 24 | return true; 25 | } 26 | 27 | return this.policies[type][action](this.user, model); 28 | } 29 | 30 | denies(action, type, model = null) { 31 | return !this.allows(action, type, model); 32 | } 33 | } 34 | 35 | export default Gate; 36 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/i18n.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import VueI18n from "vue-i18n"; 3 | 4 | Vue.use(VueI18n); 5 | 6 | function checkDefaultLanguage() { 7 | let matched = null; 8 | let languages = Object.getOwnPropertyNames(loadLocaleMessages()); 9 | languages.forEach(lang => { 10 | if (lang === navigator.language) { 11 | matched = lang; 12 | } 13 | }); 14 | if (!matched) { 15 | languages.forEach(lang => { 16 | let languagePartials = navigator.language.split("-")[0]; 17 | if (lang === languagePartials) { 18 | matched = lang; 19 | } 20 | }); 21 | } 22 | return matched; 23 | } 24 | function loadLocaleMessages() { 25 | const locales = require.context( 26 | "./locales", 27 | true, 28 | /[A-Za-z0-9-_,\s]+\.json$/i 29 | ); 30 | const messages = {}; 31 | locales.keys().forEach(key => { 32 | const matched = key.match(/([A-Za-z0-9-_]+)\./i); 33 | if (matched && matched.length > 1) { 34 | const locale = matched[1]; 35 | messages[locale] = locales(key); 36 | } 37 | }); 38 | return messages; 39 | } 40 | export const selectedLocale = 41 | localStorage.getItem("locale") || 42 | checkDefaultLanguage() || 43 | process.env.VUE_APP_I18N_LOCALE || 44 | "en"; 45 | export const languages = Object.getOwnPropertyNames(loadLocaleMessages()); 46 | 47 | export default new VueI18n({ 48 | locale: selectedLocale, 49 | fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || "en", 50 | messages: loadLocaleMessages() 51 | }); 52 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/layout/components/AdminFooter.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/layout/components/LanguegeSwitcher.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 40 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/layout/components/Loading.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 25 | 26 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/layout/components/Pagination.vue: -------------------------------------------------------------------------------- 1 | 15 | 31 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/layout/pages/AdminHomePage.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/layout/policies/AttributePolicy.js: -------------------------------------------------------------------------------- 1 | // admin/AttributePolicy.js 2 | 3 | export default class AttributePolicy 4 | { 5 | static create(user) 6 | { 7 | return user && user.is_super == 1; 8 | } 9 | 10 | static view(user, attribute) 11 | { 12 | return true; // It means every one with Guest is authorized 13 | } 14 | 15 | static delete(user, attribute) 16 | { 17 | return user && user.is_super == 1; 18 | } 19 | 20 | static update(user, attribute) 21 | { 22 | return user && user.is_super == 1 || user.is_super == 0; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/layout/policies/BrandPolicy.js: -------------------------------------------------------------------------------- 1 | // admin/CategoryPolicy.js 2 | 3 | export default class BrandPolicy 4 | { 5 | static create(user) 6 | { 7 | return user && user.is_super == 1; 8 | } 9 | 10 | static view(user, brand) 11 | { 12 | return true; // It means every one with Guest is authorized 13 | } 14 | 15 | static delete(user, brand) 16 | { 17 | return user && user.is_super == 1; 18 | } 19 | 20 | static update(user, brand) 21 | { 22 | return user && user.is_super == 1 || user.is_super == 0; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/layout/policies/CategoryPolicy.js: -------------------------------------------------------------------------------- 1 | // admin/CategoryPolicy.js 2 | 3 | export default class CategoryPolicy 4 | { 5 | static create(user) 6 | { 7 | return user && user.is_super == 1; 8 | } 9 | 10 | static view(user, category) 11 | { 12 | return true; // It means every one with Guest is authorized 13 | } 14 | 15 | static delete(user, category) 16 | { 17 | return user && user.is_super == 1; 18 | } 19 | 20 | static update(user, category) 21 | { 22 | return user && user.is_super == 1 || user.is_super == 0; 23 | } 24 | } -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/layout/policies/ProductPolicy.js: -------------------------------------------------------------------------------- 1 | // admin/CategoryPolicy.js 2 | 3 | export default class ProductPolicy 4 | { 5 | static create(user) 6 | { 7 | return user && user.is_super == 1; 8 | } 9 | 10 | static view(user, Product) 11 | { 12 | return true; // It means every one with Guest is authorized 13 | } 14 | 15 | static delete(user, Product) 16 | { 17 | return user && user.is_super == 1; 18 | } 19 | 20 | static update(user, Product) 21 | { 22 | return user && user.is_super == 1 || user.is_super == 0; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/attributes/router/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TEST MODULE ROUTES. THIS IS A CUSTOM ROUTES. 3 | * A TEST SET UP... 4 | * ALL TEAM MEMBERS SHOULD JUST COPY AND PASTE TO EXTENDS THE APP 5 | */ 6 | 7 | const routes = [ 8 | { 9 | path: 'attributes', 10 | name: 'Attributes', 11 | component: () => import(/* webpackChunkName: "Chunks/Admin-Attributes" */'../pages/attributes.vue'), 12 | title: 'This is a test page', 13 | meta: { 14 | guest : false, 15 | allowedUserType: ['Admin'] 16 | } 17 | 18 | } 19 | ] 20 | 21 | export default routes 22 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/attributes/store/getters.js: -------------------------------------------------------------------------------- 1 | import {Form} from 'vform' 2 | export default { 3 | getAllAttribute : state => state.attributes, 4 | getAllValue : state => state.values 5 | } 6 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/attributes/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/attributes/store/state.js: -------------------------------------------------------------------------------- 1 | import {Form} from 'vform' 2 | 3 | export default { 4 | attributes : [], 5 | values : [], 6 | addMeta: { 7 | showModal: false, 8 | isImageVisible: false 9 | }, 10 | addData: new Form({ 11 | name: "" 12 | }), 13 | 14 | editMeta: { 15 | isImageVisible: false, 16 | showModal: false, 17 | isEditing: false 18 | }, 19 | editData: new Form({ 20 | id: '', 21 | name: "", 22 | slug:"" 23 | }), 24 | errors: {}, 25 | multiSelected: [], 26 | 27 | isEditingItem: false, 28 | 29 | filterString:{ 30 | page: 1, 31 | perPage : 10, 32 | orderBy: 'created_at', 33 | sortBy: 'desc', 34 | q: "", 35 | total: 0 36 | }, 37 | subMeta:{ 38 | multiSelected: [] 39 | }, 40 | addSubMeta:{ 41 | showModal: false, 42 | }, 43 | addSubData:new Form({ 44 | name:"", 45 | slug:"", 46 | parent_id : "" 47 | }), 48 | editSubMeta:{ 49 | showModal: false, 50 | }, 51 | editSubData:new Form({ 52 | id:"", 53 | name:"", 54 | slug:"", 55 | parent_id : "" 56 | }) 57 | } 58 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/brands/router/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TEST MODULE ROUTES. THIS IS A CUSTOM ROUTES. 3 | * A TEST SET UP... 4 | * ALL TEAM MEMBERS SHOULD JUST COPY AND PASTE TO EXTENDS THE APP 5 | */ 6 | 7 | const routes = [ 8 | { 9 | path: 'brands', 10 | name: 'Brands', 11 | component: () => import(/* webpackChunkName: "Chunks/Admin-Brands" */'../pages/brands.vue'), 12 | title: 'This is brand page', 13 | meta: { 14 | guest : false, 15 | allowedUserType: ['Admin'] 16 | } 17 | 18 | } 19 | ] 20 | 21 | export default routes 22 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/brands/store/getters.js: -------------------------------------------------------------------------------- 1 | export default { 2 | getAllBrand : state => state.brands , 3 | filterString : state => state.filterString, 4 | getFilteredURLString : state => { 5 | let {page , perPage, orderBy, sortBy, q} = state.filterString; 6 | let queryString = ""; 7 | if (q != "") { 8 | queryString = `page=1&q=${q}` 9 | } else { 10 | queryString = `page=${page}` 11 | } 12 | perPage !="" || perPage == undefined ? queryString += `&perPage=${perPage}` : 10; 13 | orderBy !="" ? queryString += `&orderBy=${orderBy}` : null; 14 | sortBy !="" ? queryString += `&sortBy=${sortBy}` : null; 15 | 16 | return queryString; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/brands/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/brands/store/state.js: -------------------------------------------------------------------------------- 1 | import { Form } from "vform"; 2 | 3 | export default { 4 | brands: [], 5 | addBrandData : new Form({ 6 | name: "", 7 | logo:"" 8 | }), 9 | addMeta: { 10 | showModal: false, 11 | isImageVisible: false 12 | }, 13 | editBrandData: new Form({ 14 | id: "", 15 | name:"", 16 | slug:"", 17 | logo:"" 18 | }), 19 | editMeta: { 20 | isImageVisible: false, 21 | showModal: false 22 | }, 23 | isLoading: false, 24 | filterString:{ 25 | page: 1, 26 | perPage : 10, 27 | orderBy: 'created_at', 28 | sortBy: 'desc', 29 | q: "", 30 | total: 0 31 | }, 32 | multiSelected: [] 33 | } 34 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/categories/router/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TEST MODULE ROUTES. THIS IS A CUSTOM ROUTES. 3 | * A TEST SET UP... 4 | * ALL TEAM MEMBERS SHOULD JUST COPY AND PASTE TO EXTENDS THE APP 5 | */ 6 | 7 | const routes = [ 8 | { 9 | path: 'categories', 10 | name: 'Categories', 11 | component: () => import(/* webpackChunkName: "Chunks/Admin-Categories" */'../pages/categories.vue'), 12 | title: 'This is a test page', 13 | meta: { 14 | guest : false, 15 | allowedUserType: ['Admin'] 16 | } 17 | 18 | } 19 | ] 20 | 21 | export default routes 22 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/categories/store/getters.js: -------------------------------------------------------------------------------- 1 | import {Form} from 'vform' 2 | export default { 3 | getAllCategory : state => state.categories, 4 | getAllSubCategory : state => state.subcategories, 5 | paginatedMetaData : state => state.paginationData, 6 | isImageVisible : state => state.addMeta.isImageVisible, 7 | isEditImageVisible : state => state.editMeta.isImageVisible, 8 | filterString : state => state.filterString, 9 | getFilteredURLString : state => { 10 | let {page,perPage,orderBy,sortBy,q} = state.filterString; 11 | let queryString = ""; 12 | if (q != "") { 13 | queryString = `page=1&q=${q}` 14 | } else { 15 | queryString = `page=${page}` 16 | } 17 | (perPage !="") ? queryString += `&perPage=${perPage}` : null; 18 | (orderBy !="") ? queryString += `&orderBy=${orderBy}` : null; 19 | (sortBy !="") ? queryString += `&sortBy=${sortBy}` : null; 20 | 21 | return queryString; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/categories/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/categories/store/state.js: -------------------------------------------------------------------------------- 1 | import {Form} from 'vform' 2 | 3 | export default { 4 | categories : [], 5 | allcategories:[], 6 | subcategories : [], 7 | addMeta: { 8 | showModal: false, 9 | isImageVisible: false 10 | }, 11 | addData: new Form({ 12 | name: "", 13 | icon:"" 14 | }), 15 | 16 | editMeta: { 17 | isImageVisible: false, 18 | showModal: false, 19 | isEditing: false 20 | }, 21 | editData: new Form({ 22 | id: '', 23 | name: "", 24 | icon:"" 25 | }), 26 | errors: {}, 27 | multiSelected: [], 28 | 29 | isEditingItem: false, 30 | 31 | filterString:{ 32 | page: 1, 33 | perPage : 10, 34 | orderBy: 'created_at', 35 | sortBy: 'desc', 36 | q: "", 37 | total: 0 38 | }, 39 | subMeta:{ 40 | multiSelected: [] 41 | }, 42 | addSubMeta:{ 43 | showModal: false, 44 | }, 45 | addSubData:new Form({ 46 | name:"", 47 | slug:"", 48 | description:"", 49 | parent_id : "" 50 | }), 51 | editSubMeta:{ 52 | showModal: false, 53 | }, 54 | editSubData:new Form({ 55 | id:"", 56 | name:"", 57 | slug:"", 58 | description:"", 59 | parent_id : "" 60 | }) 61 | } 62 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/index.js: -------------------------------------------------------------------------------- 1 | import camelCase from "lodash/camelCase"; 2 | const requireModule = require.context("./", true, /\.js$/); 3 | const modules = {}; 4 | 5 | requireModule.keys().forEach(fileName => { 6 | let str = fileName.split("/"); 7 | str = str[1]; 8 | 9 | if (fileName === `./${str}/store/index.js`) { 10 | // filter fullstops and extension 11 | // and return a camel-case name for the file 12 | const moduleName = camelCase(fileName.replace(/(\.\/|\.js)/g, "")); 13 | 14 | // create a dynamic object with all modules 15 | modules[moduleName] = { 16 | // add namespace here 17 | namespaced: true, 18 | ...requireModule(fileName).default 19 | // if you have exported the object with name in the module `js` file 20 | // e.g., export const name = {}; 21 | // uncomment this line and comment the above 22 | // ...requireModule(fileName)[moduleName] 23 | }; 24 | } 25 | }); 26 | export default modules; 27 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/products/router/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TEST MODULE ROUTES. THIS IS A CUSTOM ROUTES. 3 | * A TEST SET UP... 4 | * ALL TEAM MEMBERS SHOULD JUST COPY AND PASTE TO EXTENDS THE APP 5 | */ 6 | 7 | const routes = [ 8 | { 9 | path: 'products', 10 | name: 'Products', 11 | component: () => import(/* webpackChunkName: "Chunks/Admin-Products" */'../pages/products.vue'), 12 | title: 'This is admijn product page', 13 | meta: { 14 | guest : false, 15 | allowedUserType: ['Admin'] 16 | } 17 | }, 18 | { 19 | path: 'products/create', 20 | name: 'CreateProducts', 21 | component: () => import(/* webpackChunkName: "Chunks/Admin-Products-Create" */'../pages/create.vue'), 22 | title: 'This is create product page' 23 | }, 24 | { 25 | path: 'products/edit/:id', 26 | name: 'EditProducts', 27 | component: () => import(/* webpackChunkName: "Chunks/Admin-Products-Edit-:id" */ '../pages/edit.vue'), 28 | title: 'This is Edit product page' 29 | }, 30 | { 31 | path: 'products/view/:id', 32 | name: 'EditProducts', 33 | component: () => import(/* webpackChunkName: "Chunks/Admin-Products-View-:id" */ '../pages/view.vue'), 34 | title: 'This is View product page' 35 | } 36 | ] 37 | 38 | export default routes 39 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/products/store/getters.js: -------------------------------------------------------------------------------- 1 | export default { 2 | getAllProduct : state => state.products , 3 | filterString : state => state.filterString, 4 | getFilteredURLString : state => { 5 | let {page , perPage, orderBy, sortBy, q} = state.filterString; 6 | let queryString = ""; 7 | if (q != "") { 8 | queryString = `page=1&q=${q}` 9 | } else { 10 | queryString = `page=${page}` 11 | } 12 | perPage !="" || perPage == undefined ? queryString += `&perPage=${perPage}` : 10; 13 | orderBy !="" ? queryString += `&orderBy=${orderBy}` : null; 14 | sortBy !="" ? queryString += `&sortBy=${sortBy}` : null; 15 | 16 | return queryString; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/products/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/modules/settings/router/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TEST MODULE ROUTES. THIS IS A CUSTOM ROUTES. 3 | * A TEST SET UP... 4 | * ALL TEAM MEMBERS SHOULD JUST COPY AND PASTE TO EXTENDS THE APP 5 | */ 6 | 7 | const routes = [ 8 | { 9 | path: 'settings', 10 | name: 'Settings', 11 | component: () => import(/* webpackChunkName: "Chunks/Admin-Settings" */ '../pages/settings.vue'), 12 | title: 'This is settings page', 13 | meta: { 14 | guest : false, 15 | allowedUserType: ['Admin'] 16 | } 17 | 18 | } 19 | ] 20 | 21 | export default routes 22 | -------------------------------------------------------------------------------- /resources/microfrontends/@admin-mf/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | pluginOptions: { 3 | i18n: { 4 | locale: "en", 5 | fallbackLocale: "en", 6 | localeDir: "locales", 7 | enableInSFC: false 8 | } 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/common.js: -------------------------------------------------------------------------------- 1 | // import axios from "axios"; 2 | 3 | export default { 4 | methods: { 5 | isPermitted(action,type){ 6 | return $gate.allows(action,type); 7 | }, 8 | async callApi(method, url, dataObj ){ 9 | try { 10 | return await axios({ 11 | method: method, 12 | url: url, 13 | data: dataObj 14 | }); 15 | } catch (e) { 16 | return e.response 17 | } 18 | }, 19 | 20 | i(desc, title="Hey") { 21 | this.$Notice.info({ 22 | title: title, 23 | desc: desc 24 | }); 25 | }, 26 | s(desc, title="Great!") { 27 | this.$Notice.success({ 28 | title: title, 29 | desc: desc 30 | }); 31 | }, 32 | w(desc, title="Oops!") { 33 | this.$Notice.warning({ 34 | title: title, 35 | desc: desc 36 | }); 37 | }, 38 | e(desc, title="Oops!") { 39 | this.$Notice.error({ 40 | title: title, 41 | desc: desc 42 | }); 43 | }, 44 | swr(desc='Somethingn went wrong! Please try again.', title="Oops") { 45 | this.$Notice.error({ 46 | title: title, 47 | desc: desc 48 | }); 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/i18n.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import VueI18n from "vue-i18n"; 3 | 4 | Vue.use(VueI18n); 5 | 6 | function checkDefaultLanguage() { 7 | let matched = null; 8 | let languages = Object.getOwnPropertyNames(loadLocaleMessages()); 9 | languages.forEach(lang => { 10 | if (lang === navigator.language) { 11 | matched = lang; 12 | } 13 | }); 14 | if (!matched) { 15 | languages.forEach(lang => { 16 | let languagePartials = navigator.language.split("-")[0]; 17 | if (lang === languagePartials) { 18 | matched = lang; 19 | } 20 | }); 21 | } 22 | return matched; 23 | } 24 | function loadLocaleMessages() { 25 | const locales = require.context( 26 | "./locales", 27 | true, 28 | /[A-Za-z0-9-_,\s]+\.json$/i 29 | ); 30 | const messages = {}; 31 | locales.keys().forEach(key => { 32 | const matched = key.match(/([A-Za-z0-9-_]+)\./i); 33 | if (matched && matched.length > 1) { 34 | const locale = matched[1]; 35 | messages[locale] = locales(key); 36 | } 37 | }); 38 | return messages; 39 | } 40 | export const selectedLocale = 41 | localStorage.getItem("locale_site") || 42 | checkDefaultLanguage() || 43 | process.env.VUE_APP_I18N_LOCALE || 44 | "en"; 45 | export const languages = Object.getOwnPropertyNames(loadLocaleMessages()); 46 | 47 | export default new VueI18n({ 48 | locale: selectedLocale, 49 | fallbackLocale: process.env.VUE_APP_I18N_FALLBACK_LOCALE || "en", 50 | messages: loadLocaleMessages() 51 | }); 52 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/layout/components/LanguegeSwitcher.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 25 | 50 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/layout/components/MainApp.vue: -------------------------------------------------------------------------------- 1 | 12 | 31 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/layout/pages/Dashboard.vue: -------------------------------------------------------------------------------- 1 | 19 | 46 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/layout/pages/HomePage.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/layout/pages/Loading.vue: -------------------------------------------------------------------------------- 1 | 6 | 11 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/attributes/store/actions.js: -------------------------------------------------------------------------------- 1 | export default { 2 | async getAttributes({commit}){ 3 | try { 4 | let { data } = await axios.get(`/api/attributes`); 5 | commit('changeState', { attributes: data}) 6 | 7 | } catch (error) { 8 | 9 | } 10 | 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/attributes/store/getters.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/attributes/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/attributes/store/mutations.js: -------------------------------------------------------------------------------- 1 | export default { 2 | FETCH_ATTRIBUTES(state,payload){ 3 | state.attributes = payload 4 | // Vue.set(state.attributes , payload) 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/attributes/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | attributes: {} 3 | } 4 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/auth/components/main.vue: -------------------------------------------------------------------------------- 1 | 4 | 9 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/auth/pages/main.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/auth/store/actions.js: -------------------------------------------------------------------------------- 1 | export default { 2 | async doLogout({commit}){ 3 | try { 4 | let res = await axios.post('/logout',{},{ 5 | headers : { 6 | Authorization : window.Laravel.csrfToken 7 | } 8 | }); 9 | if (res.status == 200 || res.status == 204) { 10 | window.Laravel.csrfToken = res.data.csrfToken; 11 | window.axios.defaults.headers.common['X-CSRF-TOKEN'] = res.data.csrfToken 12 | commit('changeState',{ user : false }); 13 | // window.location.reload(); 14 | $awn.info(res.data.message) 15 | } 16 | } catch (error) { 17 | console.log(error.response.data); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/auth/store/getters.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/auth/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/auth/store/mutations.js: -------------------------------------------------------------------------------- 1 | export default {} 2 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/auth/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | user : null 3 | } 4 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/brands/router/index.js: -------------------------------------------------------------------------------- 1 | const routes = [ 2 | { 3 | path: 'brand/:slug', 4 | name: 'Brand', 5 | component: () => import(/* webpackChunkName: "Chunks/Site/Router/ProductsByBrand-slug"*/ '../pages/ProductsByBrand.vue'), 6 | title: 'This is single Brand page', 7 | meta: { 8 | guest : true, 9 | allowedUserType: ['User'] 10 | } 11 | 12 | } 13 | ] 14 | export default routes 15 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/brands/store/actions.js: -------------------------------------------------------------------------------- 1 | export default { 2 | async getBrands({commit}){ 3 | try { 4 | let res = await axios.get('/api/brands'); 5 | // commit("FETCH_BRANDS", res.data); 6 | commit('changeState', { 7 | brands : res.data 8 | }) 9 | } catch (error) { 10 | console.log(error); 11 | 12 | } 13 | }, 14 | async getBrand({state,commit},slug){ 15 | try { 16 | let res = await axios.get(`/api/brands/${slug}`, { 17 | params: { filter : state.filter.brand } 18 | }); 19 | // commit("FETCH_BRAND", res.data); 20 | commit('changeState', { 21 | brand : res.data.data 22 | }) 23 | } catch (error) { 24 | console.log(error); 25 | 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/brands/store/getters.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/brands/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/brands/store/mutations.js: -------------------------------------------------------------------------------- 1 | export default { 2 | FETCH_BRANDS(state,payload) { 3 | state.brands = payload; 4 | }, 5 | FETCH_BRAND(state,payload) { 6 | state.brand = payload; 7 | }, 8 | } 9 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/brands/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | brands: [], 3 | brand:{}, 4 | filter:{ brand : "" } 5 | } 6 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/cart/router/index.js: -------------------------------------------------------------------------------- 1 | const routes = [ 2 | { 3 | path: '/cart', 4 | name: 'Cart', 5 | component: () => import(/* webpackChunkName: "Chunks/Site/Router/Carts"*/ '../pages/cart.vue'), 6 | title: 'This is cart page', 7 | meta: { 8 | guest : true, 9 | allowedUserType: ['User'] 10 | } 11 | 12 | } 13 | ] 14 | 15 | export default routes 16 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/cart/store/getters.js: -------------------------------------------------------------------------------- 1 | export default { 2 | cartsArray : state => { 3 | // Object to Array Conversion 4 | let cartsArray = []; 5 | let carts = state.cartData.carts; 6 | 7 | for (const key in carts) { 8 | if (carts.hasOwnProperty(key)) { 9 | cartsArray.push(carts[key]); 10 | } 11 | } 12 | return cartsArray 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/cart/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/cart/store/mutations.js: -------------------------------------------------------------------------------- 1 | export default { 2 | removeCartItem(state,rowId){ 3 | // delete state.cartData.carts[rowId]; 4 | // state.cartData.carts = state.cartData.carts 5 | state.cartData.carts[rowId] = undefined 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/cart/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | cartData : { 3 | carts:{} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/categories/router/index.js: -------------------------------------------------------------------------------- 1 | const routes = [ 2 | { 3 | path: 'category/:slug', 4 | name: 'Product By Category', 5 | component: () => import(/* webpackChunkName: "Chunks/Site/Router/Category-slug"*/ '../pages/ProductByCategory.vue'), 6 | title: 'This is settings page', 7 | meta: { 8 | guest : true, 9 | allowedUserType: ['User'] 10 | } 11 | 12 | } 13 | ] 14 | 15 | export default routes 16 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/categories/store/index.js: -------------------------------------------------------------------------------- 1 | // import axios from 'axios'; 2 | 3 | export default { 4 | state: { 5 | categories: [], 6 | nested_categories: [], 7 | category: {}, 8 | filter:{ category : "" } 9 | }, 10 | actions: { 11 | async getCategories({ commit }) { 12 | try { 13 | let res = await axios.get('/api/categories'); 14 | commit('changeState', { categories : res.data.data }); 15 | // commit('FETCH_CATEGORIES', res.data.data); 16 | } catch (error) { 17 | 18 | } 19 | }, 20 | async getCategoryBySlug({state, commit }, slug) { 21 | try { 22 | 23 | let res = await axios.get(`/api/category/${slug}`, { 24 | params: { filter : state.filter.category } 25 | }); 26 | // commit('FETCH_CATEGORY', res.data); 27 | commit('changeState', { category : res.data }); 28 | } catch (error) { 29 | if (error.response.status == 404) { 30 | $Bus.$emit('404') 31 | } 32 | } 33 | }, 34 | async getCategoriesSubcategories({ commit }) { 35 | try { 36 | let res = await axios.get(`/api/categoriesSubcategories`); 37 | // commit('FETCH_CATEGORIES_SUBCATEGORIES', res.data.data); 38 | commit('changeState', { nested_categories : res.data.data }); 39 | } catch (error) { 40 | 41 | } 42 | }, 43 | } 44 | 45 | }; 46 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/compare/router/index.js: -------------------------------------------------------------------------------- 1 | const routes = [ 2 | { 3 | path: '/compare', 4 | name: 'Compare', 5 | component: () => import(/* webpackChunkName: "Chunks/Site/Router/Compare"*/ '../pages/compare.vue'), 6 | title: 'This is compare page', 7 | meta: { 8 | guest : true, 9 | allowedUserType: ['User'] 10 | } 11 | 12 | } 13 | ] 14 | 15 | export default routes 16 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/compare/store/getters.js: -------------------------------------------------------------------------------- 1 | export default { 2 | comparesArray : state => { 3 | // Object to Array Conversion 4 | let comparesArray = []; 5 | let compares = state.compareData.compares; 6 | 7 | for (const key in compares) { 8 | if (compares.hasOwnProperty(key)) { 9 | comparesArray.push(compares[key]); 10 | } 11 | } 12 | return comparesArray 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/compare/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/compare/store/mutations.js: -------------------------------------------------------------------------------- 1 | export default {} 2 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/compare/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | compareData : { 3 | compares:{} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/index.js: -------------------------------------------------------------------------------- 1 | import camelCase from "lodash/camelCase"; 2 | const requireModule = require.context("./", true, /\.js$/); 3 | const modules = {}; 4 | 5 | requireModule.keys().forEach(fileName => { 6 | let str = fileName.split("/"); 7 | str = str[1]; 8 | 9 | if (fileName === `./${str}/store/index.js`) { 10 | // filter fullstops and extension 11 | // and return a camel-case name for the file 12 | const moduleName = camelCase(fileName.replace(/(\.\/|\.js)/g, "")); 13 | console.log(moduleName); 14 | 15 | // create a dynamic object with all modules 16 | modules[moduleName] = { 17 | // add namespace here 18 | namespaced: true, 19 | ...requireModule(fileName).default 20 | // if you have exported the object with name in the module `js` file 21 | // e.g., export const name = {}; 22 | // uncomment this line and comment the above 23 | // ...requireModule(fileName)[moduleName] 24 | }; 25 | } 26 | }); 27 | export default modules; 28 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/multipleFiltering/store/actions.js: -------------------------------------------------------------------------------- 1 | export default { 2 | async getFilteredData({ state, commit }) { 3 | try { 4 | 5 | let categories = state.selected.categories.length > 0 ? state.selected.categories : null; 6 | let brands = state.selected.brands.length != 0 ? state.selected.brands : null; 7 | let sizes = state.selected.sizes.length != 0 ? state.selected.sizes : null; 8 | let prices = state.selected.prices && state.selected.prices.length != 0 ? `0-${state.selected.prices}` : null; 9 | 10 | let res = await Object.freeze(axios.get(`/api/products`, {params: { 11 | categories: state.selected.categories, 12 | brands , sizes,prices 13 | } })); 14 | $Bus.$emit('fetchProducts',{ 15 | products: res.data.data, meta: res.data.meta 16 | }) 17 | // commit('changeState', { products: res.data.data, meta: res.data.meta }); 18 | } catch (error) { 19 | console.log('error', error); 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/multipleFiltering/store/getters.js: -------------------------------------------------------------------------------- 1 | export default { 2 | filter: state => state.filter 3 | } 4 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/multipleFiltering/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/multipleFiltering/store/mutations.js: -------------------------------------------------------------------------------- 1 | export default { 2 | select(state, option) { 3 | if (state.brand && state.brand != "") { 4 | state.filter['brand'] = option 5 | }else{ 6 | state.filter['category'] = option 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/multipleFiltering/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | selected: { 3 | categories: [], 4 | brands: [], 5 | sizes: [], 6 | }, 7 | filter: { 8 | brand: "", 9 | category: "" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/products/router/index.js: -------------------------------------------------------------------------------- 1 | const routes = [ 2 | { 3 | path: '/products', 4 | name: 'Products', 5 | component: () => import(/* webpackChunkName: "Chunks/Site/Router/Products"*/ '../pages/products.vue'), 6 | title: 'This is products page', 7 | meta: { 8 | guest : true, 9 | allowedUserType: ['User'] 10 | } 11 | 12 | }, 13 | { 14 | path: '/product/:slug', 15 | name: 'Single Product', 16 | component: () => import(/* webpackChunkName: "Chunks/Site/Router/Product-slug"*/ '../pages/single.vue'), 17 | title: 'This is single product page', 18 | meta: { 19 | guest : true, 20 | allowedUserType: ['User'] 21 | } 22 | 23 | } 24 | ] 25 | export default routes 26 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/products/store/actions.js: -------------------------------------------------------------------------------- 1 | export default { 2 | async getProduct({ commit }, slug) { 3 | try { 4 | let res = await axios.get(`/api/product/${slug}`); 5 | commit('changeState', { 6 | product: res.data.data 7 | }) 8 | } catch (error) { 9 | console.log('error', error); 10 | } 11 | }, 12 | async getProducts({ state, commit }) { 13 | try { 14 | let params = state.filter.product ? { 15 | filter: state.filter.product 16 | }: null; 17 | let res = await axios.get(`/api/products`, {params}); 18 | commit('changeState', { products: res.data.data, meta: res.data.meta }); 19 | } catch (error) { 20 | console.log('error', error); 21 | } 22 | }, 23 | QuickView({commit} , product){ 24 | commit('changeState', {quickView: product}); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/products/store/getters.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/products/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/products/store/mutations.js: -------------------------------------------------------------------------------- 1 | export default { 2 | } 3 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/products/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | products: [] , 3 | product : {}, 4 | meta : {}, 5 | filter : { product : "" }, 6 | quickView: {} 7 | } 8 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/settings/router/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * TEST MODULE ROUTES. THIS IS A CUSTOM ROUTES. 3 | * A TEST SET UP... 4 | * ALL TEAM MEMBERS SHOULD JUST COPY AND PASTE TO EXTENDS THE APP 5 | */ 6 | 7 | const routes = [ 8 | { 9 | path: 'settings', 10 | name: 'Settings', 11 | component: () => import(/* webpackChunkName: "Chunks/Site-Settings" */ '../pages/settings.vue'), 12 | title: 'This is settings page', 13 | meta: { 14 | guest : false, 15 | allowedUserType: ['User'] 16 | } 17 | 18 | } 19 | ] 20 | 21 | export default routes 22 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/test/components/main.vue: -------------------------------------------------------------------------------- 1 | 4 | 9 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/test/pages/main.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/test/router/index..js: -------------------------------------------------------------------------------- 1 | const routes = [ 2 | { 3 | path: 'product/:slug', 4 | name: 'Product', 5 | component: () => import(/* webpackChunkName: "Chunks/Site-Product-slug"*/ '../pages/main.vue'), 6 | title: 'This is single product page', 7 | meta: { 8 | guest : true, 9 | allowedUserType: ['User'] 10 | } 11 | 12 | } 13 | ] 14 | export default routes 15 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/test/store/actions.js: -------------------------------------------------------------------------------- 1 | export default {} 2 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/test/store/getters.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/test/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/test/store/mutations.js: -------------------------------------------------------------------------------- 1 | export default {} 2 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/test/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/wishlists/router/index.js: -------------------------------------------------------------------------------- 1 | const routes = [ 2 | { 3 | path: '/wishlists', 4 | name: 'Wishlist', 5 | component: () => import(/* webpackChunkName: "Chunks/Site/Router/Wishlist"*/ '../pages/wishlists.vue'), 6 | title: 'This is wishlist page', 7 | meta: { 8 | guest : true, 9 | allowedUserType: ['User'] 10 | } 11 | 12 | } 13 | ] 14 | 15 | export default routes 16 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/wishlists/store/getters.js: -------------------------------------------------------------------------------- 1 | export default { 2 | wishlistsArray : state => { 3 | // Object to Array Conversion 4 | let wishlistsArray = []; 5 | let wishlists = state.wishlistData.wishlists; 6 | 7 | for (const key in wishlists) { 8 | if (wishlists.hasOwnProperty(key)) { 9 | wishlistsArray.push(wishlists[key]); 10 | } 11 | } 12 | return wishlistsArray 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/wishlists/store/index.js: -------------------------------------------------------------------------------- 1 | import state from './state'; 2 | import getters from './getters'; 3 | import actions from './actions'; 4 | import mutations from './mutations'; 5 | 6 | export default { 7 | state, 8 | getters, 9 | actions, 10 | mutations 11 | } 12 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/wishlists/store/mutations.js: -------------------------------------------------------------------------------- 1 | export default { 2 | } 3 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/modules/wishlists/store/state.js: -------------------------------------------------------------------------------- 1 | export default { 2 | wishlistData : { 3 | wishlists : {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/store.js: -------------------------------------------------------------------------------- 1 | /** 2 | * THIS IS THE DEFAULT STORE... 3 | */ 4 | import Vue from "vue"; 5 | import Vuex from "vuex"; 6 | // import axios from "axios"; 7 | import { createStore } from "vuex-extensions"; 8 | // import createPersistedState from 'vuex-persistedstate'; 9 | 10 | Vue.use(Vuex); 11 | // load modules 12 | import modules from "./modules"; 13 | 14 | export default createStore(Vuex.Store, { 15 | modules, 16 | // plugins: [createPersistedState()], 17 | mixins: { 18 | actions: { 19 | async ajax({ state, commit }, url, cbObj, method = "get") { 20 | try { 21 | let res = await axios[method](url); 22 | commit("changeState", { 23 | cbObj: res.data 24 | }); 25 | } catch (error) { 26 | console.log(error); 27 | } 28 | } 29 | }, 30 | mutations: { 31 | changeState: function(state, changed) { 32 | Object.entries(changed).forEach(([name, value]) => { 33 | state[name] = value; 34 | }); 35 | } 36 | } 37 | } 38 | }); 39 | -------------------------------------------------------------------------------- /resources/microfrontends/@site-mf/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | pluginOptions: { 3 | i18n: { 4 | locale: "en", 5 | fallbackLocale: "en", 6 | localeDir: "locales", 7 | enableInSFC: false 8 | } 9 | } 10 | }; 11 | -------------------------------------------------------------------------------- /resources/sass/_variables.scss: -------------------------------------------------------------------------------- 1 | // Body 2 | $body-bg: #eee; 3 | 4 | // Typography 5 | $font-family-sans-serif: 'Nunito', sans-serif; 6 | $font-size-base: 0.9rem; 7 | $line-height-base: 1.6; 8 | 9 | // Colors 10 | // $blue: #3ccc54; 11 | // $indigo: #6574cd; 12 | // $purple: #9561e2; 13 | // $pink: #f66d9b; 14 | // $red: #e3342f; 15 | // $orange: #f6993f; 16 | // $yellow: #ffed4a; 17 | // $green: #38c172; 18 | // $teal: #4dc0b5; 19 | // $cyan: #6cb2eb; 20 | 21 | 22 | $blue: #314ec2 !default; 23 | $indigo: #6610f2 !default; 24 | $purple: #6f42c1 !default; 25 | $pink: #e83e8c !default; 26 | $red: #dc3545 !default; 27 | $yellow: #ffc107 !default; 28 | $green: #43c762 !default; 29 | $teal: #20c997 !default; 30 | $cyan: #17a2b8 !default; 31 | 32 | 33 | // $danger: $chocholate !default; 34 | 35 | $modal-content-border-radius: .1rem !default; 36 | 37 | $btn-border-radius: .0rem !default; 38 | 39 | 40 | $border-radius: 0; 41 | $green: #009688 !default; 42 | $primary: $green !default; 43 | 44 | .navbar-custom , .bg-custom { 45 | background-color: #009688; 46 | } 47 | .btn-primary , .btn-primary:hover { 48 | color: #FFF; 49 | background-color: #007065; 50 | border-color: #00635a; 51 | } 52 | -------------------------------------------------------------------------------- /resources/sass/app.scss: -------------------------------------------------------------------------------- 1 | // Fonts 2 | @import url('https://fonts.googleapis.com/css?family=Nunito'); 3 | 4 | 5 | 6 | // Bootstrap 7 | // @import '~bootstrap/scss/bootstrap'; 8 | 9 | // AdminLTE 10 | @import '~admin-lte/build/scss/AdminLTE.scss'; 11 | // Variables 12 | @import 'variables'; 13 | 14 | // Font Awesome 15 | // @import '~@fortawesome/fontawesome-free/scss/fontawesome.scss'; 16 | 17 | // @import '~view-design/dist/styles/iview.css'; 18 | // @import '~vue-awesome-notifications/dist/styles/style.css'; 19 | -------------------------------------------------------------------------------- /resources/views/auth/verify.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |
8 |
{{ __('Verify Your Email Address') }}
9 | 10 |
11 | @if (session('resent')) 12 | 15 | @endif 16 | 17 | {{ __('Before proceeding, please check your email for a verification link.') }} 18 | {{ __('If you did not receive the email') }}, 19 |
20 | @csrf 21 | . 22 |
23 |
24 |
25 |
26 |
27 |
28 | @endsection 29 | -------------------------------------------------------------------------------- /resources/views/emails/admin_log_mail.blade.php: -------------------------------------------------------------------------------- 1 | @component('mail::message') 2 | # An Admin Logged In 3 | 4 | An admin named {{ $name }}. just now logged in : his email is {{ $email }} . 5 | Now authorize if it can be SPAM :smile: 6 | 7 | @component('mail::button', ['url' => $url ?? '/admin' ]) 8 | Authorize 9 | @endcomponent 10 | 11 | Thanks, 12 | {{ config('app.name') }} 13 | @endcomponent 14 | -------------------------------------------------------------------------------- /resources/views/home.blade.php: -------------------------------------------------------------------------------- 1 | @extends('layouts.app') 2 | 3 | @section('content') 4 |
5 |
6 |
7 |
8 |
{{ __('Dashboard') }}
9 | 10 |
11 | @if (session('status')) 12 | 15 | @endif 16 | 17 | {{ __('You are logged in!') }} 18 |
19 |
20 |
21 |
22 |
23 | @endsection 24 | -------------------------------------------------------------------------------- /resources/views/product.blade.php: -------------------------------------------------------------------------------- 1 | @extends('site') 2 | @section('content') 3 | @include('site.partials.singleProduct') 4 | @endsection 5 | -------------------------------------------------------------------------------- /resources/views/vendor/laravelpwa/offline.blade.php: -------------------------------------------------------------------------------- 1 |

You are currently not connected to any networks.

2 | -------------------------------------------------------------------------------- /routes/api.php: -------------------------------------------------------------------------------- 1 | get('/user', function (Request $request) { 18 | return $request->user(); 19 | }); 20 | -------------------------------------------------------------------------------- /routes/channels.php: -------------------------------------------------------------------------------- 1 | id === (int) $id; 18 | }); 19 | -------------------------------------------------------------------------------- /routes/console.php: -------------------------------------------------------------------------------- 1 | comment(Inspiring::quote()); 19 | })->purpose('Display an inspiring quote'); 20 | -------------------------------------------------------------------------------- /server.php: -------------------------------------------------------------------------------- 1 | 8 | */ 9 | 10 | $uri = urldecode( 11 | parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH) 12 | ); 13 | 14 | // This file allows us to emulate Apache's "mod_rewrite" functionality from the 15 | // built-in PHP web server. This provides a convenient way to test a Laravel 16 | // application without having installed a "real" web server software here. 17 | if ($uri !== '/' && file_exists(__DIR__.'/public'.$uri)) { 18 | return false; 19 | } 20 | 21 | require_once __DIR__.'/public/index.php'; 22 | -------------------------------------------------------------------------------- /storage/app/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !public/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/debugbar/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/.gitignore: -------------------------------------------------------------------------------- 1 | config.php 2 | routes.php 3 | schedule-* 4 | compiled.php 5 | services.json 6 | events.scanned.php 7 | routes.scanned.php 8 | down 9 | -------------------------------------------------------------------------------- /storage/framework/cache/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !data/ 3 | !.gitignore 4 | -------------------------------------------------------------------------------- /storage/framework/sessions/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/testing/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/framework/views/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /storage/logs/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /stubs/console.stub: -------------------------------------------------------------------------------- 1 | id(); 18 | $table->string('slug'); 19 | $table->timestamps(); 20 | }); 21 | } 22 | 23 | /** 24 | * Reverse the migrations. 25 | * 26 | * @return void 27 | */ 28 | public function down() 29 | { 30 | Schema::dropIfExists('{{ table }}'); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /stubs/migration.stub: -------------------------------------------------------------------------------- 1 | get('/'); 19 | 20 | $response->assertStatus(200); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /stubs/test.unit.stub: -------------------------------------------------------------------------------- 1 | assertTrue(true); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /tests/CreatesApplication.php: -------------------------------------------------------------------------------- 1 | make(Kernel::class)->bootstrap(); 19 | 20 | return $app; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /tests/Feature/ExampleTest.php: -------------------------------------------------------------------------------- 1 | get('/'); 18 | 19 | $response->assertStatus(200); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tests/TestCase.php: -------------------------------------------------------------------------------- 1 | assertTrue(true); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin') 2 | 3 | const path = require('path') 4 | 5 | 6 | module.exports = (env, argv) => ({ 7 | plugins: [ 8 | new SWPrecacheWebpackPlugin({ cacheId: 'my-pwa-vue-app', 9 | filename: 'js/template-cachable-sw.js', 10 | staticFileGlobs: ['public/**/*.{js,css}', '/'], 11 | minify: true, 12 | stripPrefix: '/', 13 | dontCacheBustUrlsMatching: /\.\w{6}\./}) 14 | 15 | ] 16 | }); 17 | --------------------------------------------------------------------------------