├── .browserslistrc ├── .eslintignore ├── .eslintrc.js ├── .firebase ├── hosting.ZGlzdA.cache └── hosting.eQ.cache ├── .firebaserc ├── .gitignore ├── README.md ├── babel.config.js ├── firebase.json ├── firestore.indexes.json ├── firestore.rules ├── functions ├── .gitignore ├── index.js ├── package-lock.json └── package.json ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── favicon.ico ├── img │ ├── products │ │ ├── product1.jpg │ │ ├── product2.jpg │ │ └── product3.jpg │ ├── svg │ │ ├── graphic.svg │ │ ├── login-modal.svg │ │ ├── orders.svg │ │ ├── overview.svg │ │ ├── product.svg │ │ ├── products.svg │ │ └── profile.svg │ └── user.png └── index.html ├── src ├── App.vue ├── assets │ ├── admin.scss │ ├── app.scss │ └── logo.png ├── components │ ├── AddToCart.vue │ ├── HelloWorld.vue │ ├── Hero.vue │ ├── Login.vue │ ├── MiniCart.vue │ └── Navbar.vue ├── firebase-example.js ├── main.js ├── router.js ├── sections │ ├── ProductList.vue │ └── Products.vue ├── store.js └── views │ ├── About.vue │ ├── Admin.vue │ ├── Checkout.vue │ ├── Home.vue │ ├── Orders.vue │ ├── Overview.vue │ ├── Products.vue │ └── Profile.vue ├── storage.rules └── y └── index.html /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /config/ 3 | /dist/ 4 | /*.js 5 | /test/unit/coverage/ 6 | * -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | extends: ["plugin:vue/essential", "@vue/prettier"], 7 | rules: { 8 | "no-console": process.env.NODE_ENV === "production" ? "error" : "off", 9 | "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off" 10 | }, 11 | parserOptions: { 12 | parser: "babel-eslint" 13 | } 14 | }; 15 | -------------------------------------------------------------------------------- /.firebase/hosting.ZGlzdA.cache: -------------------------------------------------------------------------------- 1 | favicon.ico,1562594090700,e7c479d8b62b3bb468ae5bd1ca94f23c0d61463524e8d171fc129d590d1d02b4 2 | index.html,1562594090700,89abaa51c4ac49bd60d4b9f17334e112301e8059731769f8bf4608655b779b69 3 | css/about.0ba2f7e1.css,1562594090708,a09671ca61d3795a09a2a8ea20e1d26a342931833971995ae2f8ff2f9e2f022b 4 | img/user.png,1562594090710,09103279e9408af9c1712cb6ddd788ed4dae5bdbf1889507807ba434a7199616 5 | img/svg/login-modal.svg,1562594090718,da37f23e84035279e8c91d3a772010cdd50a85c72e77528dd4e2671ba1abb92a 6 | img/svg/product.svg,1562594090720,4c2cf928055656039d4b4e9e11b91339c0a122bb6867b4cb486bd4c606e2c80f 7 | js/about.4a8bcb39.js,1562594090713,76705d0c41a4ae7a83887f0259a8e3e081d06bfc42c3365425ab8561c02807a9 8 | img/svg/graphic.svg,1562594090713,aa84fcc82aefe64013510b8cf1b1cef11e064615ce644817f6af7215c5f9c761 9 | js/app.3fa05840.js,1562594090715,1d98604f4a3c849647065652220592c8ff9921a8915768ec381855bd01fa9b03 10 | js/about.4a8bcb39.js.map,1562594090716,d183866c76c98c9856d5ede80b00f4fa563720a0025f2fd082178acb9c78c0d0 11 | img/svg/products.svg,1562594090722,518c3961ff78d1b32d7ca7caad78a283f1fdcac72595a7a5b0390b3dae1f1918 12 | img/products/product2.jpg,1562594090723,107cdd91f088f433256ece85969aedc22b8b1b629153581d19ebb300bcb7b0fd 13 | img/svg/profile.svg,1562594090723,44fa247c2249116c7bd1703c285cd807c42366e5cf5e67e09da0e158ddc78279 14 | img/svg/overview.svg,1562594090719,47b07ff576dd7a7d1894c4af2d4e5c3f935489e39dce3565a13682a2027f3339 15 | img/svg/orders.svg,1562594090719,cb009a9d96c188f365c18cbed0389045f2d16e63c777d9db1318f5c55bac5218 16 | css/app.ccc8ee10.css,1562594090714,688f9c7154707743826ed9d6f44b72e6d518fa14d84b367a2ed0f5c2f3eefad5 17 | img/products/product1.jpg,1562594090714,272df6561fbd59df5b917ac55734e9db6822c40fb2dea19a0ea1711d8e1caf50 18 | js/app.3fa05840.js.map,1562594090717,be72ba81fce228cc8f4106831783aec2021a5e8bb962fceca0219a3a3e193e86 19 | img/products/product3.jpg,1562594090721,6b0d5c786d14fe99b66ccfdac87b5db9e48c17a72bd1ccd96321ab44651fd458 20 | js/chunk-vendors.f18e3c31.js,1562594090718,1196808a6c2d9c92f9d58e606f550ca0150e12f2c2ec96616b2bd96e0e06c6b5 21 | js/chunk-vendors.f18e3c31.js.map,1562594090720,ac26184fd3a2026d52afad78121f8ca73cfa0b81653ec05e0511a31411999157 22 | -------------------------------------------------------------------------------- /.firebase/hosting.eQ.cache: -------------------------------------------------------------------------------- 1 | index.html,1562593806565,aadf7e2a5a33f0c8aa47b9a2479d3d64256c3a81082080075fc5ce73f93f1a12 2 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "vue-shop-5a95e" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | src/firebase.js 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | 15 | # Editor directories and files 16 | .idea 17 | .vscode 18 | *.suo 19 | *.ntvs* 20 | *.njsproj 21 | *.sln 22 | *.sw* 23 | src/firebase.js 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vue-shop 2 | 3 | A Youtube video series where web build a practical e-commerce web app with vuejs and firebase. (Don't just watch the video, do it practically) 4 | 5 | [Vuejs Full-Stack Course (AWS / Firebase) Build E-Commerce Website 6 | ](https://www.youtube.com/watch?v=UrUuvNyK-Os&list=PLB4AdipoHpxYPjGo0n2m6tmCLud_iSEbv) 7 | 8 | ## Project setup 9 | ``` 10 | npm install 11 | ``` 12 | 13 | ### Compiles and hot-reloads for development 14 | ``` 15 | npm run serve 16 | ``` 17 | 18 | ### Compiles and minifies for production 19 | ``` 20 | npm run build 21 | ``` 22 | 23 | ### Run your tests 24 | ``` 25 | npm run test 26 | ``` 27 | 28 | ### Lints and fixes files 29 | ``` 30 | npm run lint 31 | ``` 32 | 33 | ### Customize configuration 34 | See [Configuration Reference](https://cli.vuejs.org/config/). 35 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ["@vue/app"] 3 | }; 4 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "firestore": { 3 | "rules": "firestore.rules", 4 | "indexes": "firestore.indexes.json" 5 | }, 6 | "hosting": { 7 | "public": "dist", 8 | "ignore": [ 9 | "firebase.json", 10 | "**/.*", 11 | "**/node_modules/**" 12 | ], 13 | "rewrites": [ 14 | { 15 | "source": "**", 16 | "destination": "/index.html" 17 | } 18 | ] 19 | }, 20 | "storage": { 21 | "rules": "storage.rules" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /firestore.indexes.json: -------------------------------------------------------------------------------- 1 | { 2 | "indexes": [], 3 | "fieldOverrides": [] 4 | } 5 | -------------------------------------------------------------------------------- /firestore.rules: -------------------------------------------------------------------------------- 1 | service cloud.firestore { 2 | match /databases/{database}/documents { 3 | match /{document=**} { 4 | allow read, write; 5 | } 6 | } 7 | } -------------------------------------------------------------------------------- /functions/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ -------------------------------------------------------------------------------- /functions/index.js: -------------------------------------------------------------------------------- 1 | const functions = require('firebase-functions'); 2 | 3 | // // Create and Deploy Your First Cloud Functions 4 | // // https://firebase.google.com/docs/functions/write-firebase-functions 5 | // 6 | // exports.helloWorld = functions.https.onRequest((request, response) => { 7 | // response.send("Hello from Firebase!"); 8 | // }); 9 | -------------------------------------------------------------------------------- /functions/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "functions", 3 | "description": "Cloud Functions for Firebase", 4 | "scripts": { 5 | "serve": "firebase serve --only functions", 6 | "shell": "firebase functions:shell", 7 | "start": "npm run shell", 8 | "deploy": "firebase deploy --only functions", 9 | "logs": "firebase functions:log" 10 | }, 11 | "dependencies": { 12 | "firebase-admin": "~7.0.0", 13 | "firebase-functions": "^2.2.0" 14 | }, 15 | "private": true 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue-shop", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "bootstrap": "^4.2.1", 12 | "firebase": "^5.8.0", 13 | "jquery": "^3.3.1", 14 | "popper.js": "^1.14.6", 15 | "vue": "^2.5.17", 16 | "vue-carousel": "^0.18.0", 17 | "vue-firestore": "^0.3.18", 18 | "vue-router": "^3.0.1", 19 | "vue-stripe-elements-plus": "^0.2.10", 20 | "vue2-editor": "^2.6.6", 21 | "vue2-filters": "^0.6.0", 22 | "vuex": "^3.1.1" 23 | }, 24 | "devDependencies": { 25 | "@vue/cli-plugin-babel": "^3.2.0", 26 | "@vue/cli-plugin-eslint": "^3.2.1", 27 | "@vue/cli-service": "^3.2.0", 28 | "@vue/eslint-config-prettier": "^4.0.0", 29 | "babel-eslint": "^10.0.1", 30 | "eslint": "^5.8.0", 31 | "eslint-plugin-vue": "^5.0.0-0", 32 | "node-sass": "^4.9.0", 33 | "sass-loader": "^7.0.1", 34 | "sweetalert2": "^8.2.6", 35 | "vue-template-compiler": "^2.5.17" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | }; 6 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hujjat/vue-shop/3282a394fa4c70a2eb8c7b57d6a1629fa5990f51/public/favicon.ico -------------------------------------------------------------------------------- /public/img/products/product1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hujjat/vue-shop/3282a394fa4c70a2eb8c7b57d6a1629fa5990f51/public/img/products/product1.jpg -------------------------------------------------------------------------------- /public/img/products/product2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hujjat/vue-shop/3282a394fa4c70a2eb8c7b57d6a1629fa5990f51/public/img/products/product2.jpg -------------------------------------------------------------------------------- /public/img/products/product3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hujjat/vue-shop/3282a394fa4c70a2eb8c7b57d6a1629fa5990f51/public/img/products/product3.jpg -------------------------------------------------------------------------------- /public/img/svg/graphic.svg: -------------------------------------------------------------------------------- 1 | bg -------------------------------------------------------------------------------- /public/img/svg/login-modal.svg: -------------------------------------------------------------------------------- 1 | authentication -------------------------------------------------------------------------------- /public/img/svg/overview.svg: -------------------------------------------------------------------------------- 1 | setup wizard -------------------------------------------------------------------------------- /public/img/svg/product.svg: -------------------------------------------------------------------------------- 1 | product -------------------------------------------------------------------------------- /public/img/svg/profile.svg: -------------------------------------------------------------------------------- 1 | wall post -------------------------------------------------------------------------------- /public/img/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hujjat/vue-shop/3282a394fa4c70a2eb8c7b57d6a1629fa5990f51/public/img/user.png -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | Vue Shop - Free E-Commerce Course with Vuejs and Firebase 13 | 14 | 15 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 26 | -------------------------------------------------------------------------------- /src/assets/app.scss: -------------------------------------------------------------------------------- 1 | @import '~bootstrap/scss/bootstrap'; 2 | @import './admin.scss'; 3 | 4 | body{ 5 | font-family: 'Nunito', sans-serif !important; 6 | } 7 | .custom-btn{ 8 | // border-radius: 10rem; 9 | padding: 0.5rem 2.5rem; 10 | } 11 | // hide scroll bar 12 | .sidebar-content { 13 | -ms-overflow-style: none; // IE 10+ 14 | overflow: -moz-scrollbars-none; // Firefox 15 | } 16 | .sidebar-content::-webkit-scrollbar { 17 | display: none; // Safari and Chrome 18 | } 19 | 20 | .intro{ 21 | margin-top: 3rem; 22 | } 23 | 24 | @media (min-width: 992px){ 25 | 26 | .modal-lg, .modal-xl { 27 | max-width: 1200px; 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Hujjat/vue-shop/3282a394fa4c70a2eb8c7b57d6a1629fa5990f51/src/assets/logo.png -------------------------------------------------------------------------------- /src/components/AddToCart.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 41 | 42 | 43 | 44 | 45 | 48 | -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 16 | 17 | 18 | 21 | -------------------------------------------------------------------------------- /src/components/Hero.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 37 | 38 | 39 | 48 | -------------------------------------------------------------------------------- /src/components/Login.vue: -------------------------------------------------------------------------------- 1 | 73 | 74 | 145 | 146 | 147 | 150 | -------------------------------------------------------------------------------- /src/components/MiniCart.vue: -------------------------------------------------------------------------------- 1 | 41 | 42 | 58 | 59 | 60 | 63 | -------------------------------------------------------------------------------- /src/components/Navbar.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 49 | 50 | 51 | 63 | -------------------------------------------------------------------------------- /src/firebase-example.js: -------------------------------------------------------------------------------- 1 | 2 | import firebase from '@firebase/app' 3 | import 'firebase/firestore' 4 | import 'firebase/firebase-auth' 5 | import 'firebase/storage' 6 | // Initialize Firebase 7 | var config = { 8 | apiKey: "yourKey", 9 | authDomain: "yourDomein.firebaseapp.com", 10 | databaseURL: "https://yourDomein.firebaseio.com", 11 | projectId: "yourDomein", 12 | storageBucket: "yourDomein.appspot.com", 13 | messagingSenderId: "34543545" 14 | }; 15 | 16 | const fb = firebase.initializeApp(config); 17 | 18 | const db = firebase.firestore(); 19 | 20 | export {fb,db} -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import App from "./App.vue"; 3 | import router from "./router"; 4 | import jQuery from 'jquery'; 5 | import {fb} from './firebase' 6 | import VueFirestore from 'vue-firestore' 7 | require('firebase/firestore') 8 | 9 | 10 | Vue.use(VueFirestore, { 11 | key: 'id', // the name of the property. Default is '.key'. 12 | enumerable: true // whether it is enumerable or not. Default is true. 13 | }) 14 | 15 | 16 | Vue.use(VueFirestore) 17 | 18 | import Vue2Filters from 'vue2-filters' 19 | Vue.use(Vue2Filters) 20 | 21 | window.$ = window.jQuery = jQuery; 22 | 23 | import 'popper.js'; 24 | import 'bootstrap'; 25 | import './assets/app.scss'; 26 | 27 | 28 | import Swal from 'sweetalert2'; 29 | 30 | window.Swal = Swal; 31 | 32 | const Toast = Swal.mixin({ 33 | toast: true, 34 | position: 'top-end', 35 | showConfirmButton: false, 36 | timer: 3000 37 | }); 38 | 39 | window.Toast = Toast; 40 | 41 | 42 | 43 | import store from './store.js'; 44 | 45 | 46 | Vue.component('Navbar', require('./components/Navbar.vue').default); 47 | Vue.component('add-to-cart', require('./components/AddToCart.vue').default); 48 | Vue.component('mini-cart', require('./components/MiniCart.vue').default); 49 | Vue.component('products-list', require('./sections/ProductList.vue').default); 50 | 51 | import VueCarousel from 'vue-carousel'; 52 | Vue.use(VueCarousel); 53 | 54 | Vue.config.productionTip = false; 55 | 56 | let app = ''; 57 | 58 | fb.auth().onAuthStateChanged(function(user) { 59 | 60 | if(!app){ 61 | new Vue({ 62 | router, 63 | store, 64 | render: h => h(App) 65 | }).$mount("#app"); 66 | 67 | } 68 | 69 | }); 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /src/router.js: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | import Router from "vue-router"; 3 | import Home from "./views/Home.vue"; 4 | import Admin from "./views/Admin.vue"; 5 | import Overview from "./views/Overview.vue"; 6 | import Products from "./views/Products.vue"; 7 | import Orders from "./views/Orders.vue"; 8 | import Profile from "./views/Profile.vue"; 9 | import {fb} from './firebase' 10 | 11 | Vue.use(Router); 12 | 13 | const router = new Router({ 14 | mode: "history", 15 | base: process.env.BASE_URL, 16 | routes: [ 17 | { 18 | path: "/", 19 | name: "home", 20 | component: Home 21 | }, 22 | { 23 | path: "/admin", 24 | name: "admin", 25 | component: Admin, 26 | meta: { requiresAuth: true }, 27 | children:[ 28 | { 29 | path: "overview", 30 | name: "overview", 31 | component: Overview 32 | }, 33 | { 34 | path: "products", 35 | name: "products", 36 | component: Products 37 | }, 38 | { 39 | path: "profile", 40 | name: "profile", 41 | component: Profile 42 | }, 43 | { 44 | path: "orders", 45 | name: "orders", 46 | component: Orders 47 | } 48 | ] 49 | }, 50 | { 51 | path: "/checkout", 52 | name: "checkout", 53 | // route level code-splitting 54 | // this generates a separate chunk (about.[hash].js) for this route 55 | // which is lazy-loaded when the route is visited. 56 | component: () => 57 | import(/* webpackChunkName: "about" */ "./views/Checkout.vue") 58 | }, 59 | { 60 | path: "/about", 61 | name: "about", 62 | // route level code-splitting 63 | // this generates a separate chunk (about.[hash].js) for this route 64 | // which is lazy-loaded when the route is visited. 65 | component: () => 66 | import(/* webpackChunkName: "about" */ "./views/About.vue") 67 | } 68 | ] 69 | }); 70 | 71 | router.beforeEach((to, from, next) => { 72 | 73 | const requiresAuth = to.matched.some(x => x.meta.requiresAuth) 74 | const currentUser = fb.auth().currentUser 75 | 76 | if (requiresAuth && !currentUser) { 77 | next('/') 78 | } else if (requiresAuth && currentUser) { 79 | next() 80 | } else { 81 | next() 82 | } 83 | }) 84 | 85 | export default router; -------------------------------------------------------------------------------- /src/sections/ProductList.vue: -------------------------------------------------------------------------------- 1 | 38 | 39 | 71 | 72 | 73 | 80 | -------------------------------------------------------------------------------- /src/sections/Products.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 60 | 61 | 62 | 69 | -------------------------------------------------------------------------------- /src/store.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | Vue.use(Vuex) 4 | 5 | let cart = window.localStorage.getItem('cart'); 6 | 7 | 8 | 9 | export default new Vuex.Store({ 10 | state: { 11 | cart: cart ? JSON.parse(cart) : [], 12 | }, 13 | 14 | getters: { 15 | totalPrice: state => { 16 | let total = 0; 17 | state.cart.filter((item) => { 18 | total += (item.productPrice * item.productQuantity); 19 | }); 20 | 21 | return total; 22 | } 23 | }, 24 | 25 | mutations:{ 26 | 27 | addToCart(state, item){ 28 | 29 | let found = state.cart.find(product => product.productId == item.productId ); 30 | 31 | if(found){ 32 | found.productQuantity++; 33 | }else{ 34 | state.cart.push(item); 35 | 36 | } 37 | 38 | this.commit('saveData'); 39 | 40 | }, 41 | 42 | saveData(state){ 43 | window.localStorage.setItem('cart', JSON.stringify(state.cart)); 44 | }, 45 | 46 | removeFromCart(state, item){ 47 | 48 | let index = state.cart.indexOf(item); 49 | state.cart.splice(index,1); 50 | 51 | this.commit('saveData'); 52 | 53 | }, 54 | 55 | 56 | 57 | 58 | 59 | } 60 | 61 | }) -------------------------------------------------------------------------------- /src/views/About.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /src/views/Admin.vue: -------------------------------------------------------------------------------- 1 | 102 | 103 | 141 | 142 | 145 | 146 | -------------------------------------------------------------------------------- /src/views/Checkout.vue: -------------------------------------------------------------------------------- 1 | 50 | 51 | 80 | 81 | 82 | 83 | 116 | 117 | -------------------------------------------------------------------------------- /src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 41 | 42 | 45 | 46 | -------------------------------------------------------------------------------- /src/views/Orders.vue: -------------------------------------------------------------------------------- 1 | 143 | 144 | 313 | 314 | 315 | 330 | -------------------------------------------------------------------------------- /src/views/Overview.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 31 | 32 | 33 | 36 | -------------------------------------------------------------------------------- /src/views/Products.vue: -------------------------------------------------------------------------------- 1 | 143 | 144 | 315 | 316 | 317 | 332 | -------------------------------------------------------------------------------- /src/views/Profile.vue: -------------------------------------------------------------------------------- 1 | 138 | 139 | 203 | 204 | 205 | 208 | -------------------------------------------------------------------------------- /storage.rules: -------------------------------------------------------------------------------- 1 | service firebase.storage { 2 | match /b/{bucket}/o { 3 | match /{allPaths=**} { 4 | allow read, write: if request.auth!=null; 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /y/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Welcome to Firebase Hosting 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 32 | 33 | 34 |
35 |

Welcome

36 |

Firebase Hosting Setup Complete

37 |

You're seeing this because you've successfully setup Firebase Hosting. Now it's time to go build something extraordinary!

38 | Open Hosting Documentation 39 |
40 |

Firebase SDK Loading…

41 | 42 | 64 | 65 | 66 | --------------------------------------------------------------------------------