├── .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 | Loading.....
23 | {{ locale | showable | capitalize }}
5 |
20 |
Loading....
4 |