├── .gitignore ├── README.md ├── babel.config.js ├── dist ├── css │ ├── app.c74dbfe7.css │ ├── chunk-0dfd3b4a.63d20943.css │ ├── chunk-3c947d60.84e3db1e.css │ ├── chunk-410f91b3.44dc4c9b.css │ ├── chunk-455910aa.32563729.css │ ├── chunk-54a728c1.357f47c0.css │ ├── chunk-60e039a0.76588251.css │ ├── chunk-646c566a.caa588bb.css │ ├── chunk-6a27d422.bf2a7c96.css │ ├── chunk-6fe227fa.74221f5b.css │ ├── chunk-ba5f6d76.ecffab87.css │ ├── chunk-bb9cdefa.e1ed8dd0.css │ ├── chunk-cc8dae44.513d69f7.css │ └── chunk-vendors.b89365ac.css ├── favicon.ico ├── index.html └── js │ ├── app.499babf3.js │ ├── app.499babf3.js.map │ ├── chunk-0458f749.2de9ceac.js │ ├── chunk-0458f749.2de9ceac.js.map │ ├── chunk-0d6d658c.0adbd1b6.js │ ├── chunk-0d6d658c.0adbd1b6.js.map │ ├── chunk-0dfd3b4a.a3263025.js │ ├── chunk-0dfd3b4a.a3263025.js.map │ ├── chunk-1aa10266.4ce6bfc2.js │ ├── chunk-1aa10266.4ce6bfc2.js.map │ ├── chunk-1e804642.43ef2512.js │ ├── chunk-1e804642.43ef2512.js.map │ ├── chunk-2794c691.957059fd.js │ ├── chunk-2794c691.957059fd.js.map │ ├── chunk-2d0aa5f4.69d6f566.js │ ├── chunk-2d0aa5f4.69d6f566.js.map │ ├── chunk-2d0d338e.b326d192.js │ ├── chunk-2d0d338e.b326d192.js.map │ ├── chunk-2d0e5e97.092952fa.js │ ├── chunk-2d0e5e97.092952fa.js.map │ ├── chunk-2d21de4f.893a8112.js │ ├── chunk-2d21de4f.893a8112.js.map │ ├── chunk-2d9e1d6a.a476442b.js │ ├── chunk-2d9e1d6a.a476442b.js.map │ ├── chunk-36d8d44e.39aa0125.js │ ├── chunk-36d8d44e.39aa0125.js.map │ ├── chunk-3c947d60.ea117ec6.js │ ├── chunk-3c947d60.ea117ec6.js.map │ ├── chunk-410f91b3.010e0df3.js │ ├── chunk-410f91b3.010e0df3.js.map │ ├── chunk-455910aa.df4bd8be.js │ ├── chunk-455910aa.df4bd8be.js.map │ ├── chunk-52fae7e1.bf63823d.js │ ├── chunk-52fae7e1.bf63823d.js.map │ ├── chunk-54a728c1.f2765c0e.js │ ├── chunk-54a728c1.f2765c0e.js.map │ ├── chunk-60e039a0.e2f7849b.js │ ├── chunk-60e039a0.e2f7849b.js.map │ ├── chunk-63ee0d53.03fb2f4f.js │ ├── chunk-63ee0d53.03fb2f4f.js.map │ ├── chunk-646c566a.43a3f75a.js │ ├── chunk-646c566a.43a3f75a.js.map │ ├── chunk-6a27d422.78b5857d.js │ ├── chunk-6a27d422.78b5857d.js.map │ ├── chunk-6fe227fa.c7849c6b.js │ ├── chunk-6fe227fa.c7849c6b.js.map │ ├── chunk-ba5f6d76.ed2fe0cf.js │ ├── chunk-ba5f6d76.ed2fe0cf.js.map │ ├── chunk-bb9cdefa.3f69d21f.js │ ├── chunk-bb9cdefa.3f69d21f.js.map │ ├── chunk-cc8dae44.85ef0de6.js │ ├── chunk-cc8dae44.85ef0de6.js.map │ ├── chunk-eeb3e8a0.e0f31fed.js │ ├── chunk-eeb3e8a0.e0f31fed.js.map │ ├── chunk-f8335f52.5d539174.js │ ├── chunk-f8335f52.5d539174.js.map │ ├── chunk-vendors.14f90677.js │ └── chunk-vendors.14f90677.js.map ├── package-lock.json ├── package.json ├── public ├── favicon.ico └── index.html ├── src ├── App.vue ├── apis │ ├── admin │ │ ├── adminAuth.js │ │ ├── adminCategory.js │ │ ├── adminCoupon.js │ │ ├── adminDiscount.js │ │ ├── adminOrder.js │ │ ├── adminProduct.js │ │ └── adminUser.js │ ├── cart.js │ ├── coupons.js │ ├── discounts.js │ ├── order.js │ ├── payment.js │ └── products.js ├── assets │ ├── adminCategoriesPage.png │ ├── adminCouponsPage.png │ ├── adminDashboardPage.png │ ├── adminDiscountsPage.png │ ├── adminOrdersPage.png │ ├── adminProductsPage.png │ ├── adminSignInPage.png │ ├── adminSignUpPage.png │ ├── adminUersPage.png │ ├── cartPage.png │ ├── ec-front-end-vue-logo.png │ ├── homePage.png │ ├── index.css │ ├── logo.png │ ├── orderCreatePage.png │ ├── orderPagePaid.png │ ├── orderPageUnPaid.png │ └── singleProduct.png ├── components │ ├── CategoryTab.vue │ ├── Navbar.vue │ ├── Pagination.vue │ ├── ProductDetail.vue │ ├── ProductsCard.vue │ ├── Searchbar.vue │ ├── SideCartPreview.vue │ ├── Spinner.vue │ └── admin │ │ ├── AdminCouponForm.vue │ │ ├── AdminDiscountForm.vue │ │ ├── AdminNav.vue │ │ ├── AdminProductForm.vue │ │ └── AdminProductsTable.vue ├── main.js ├── router.js ├── store.js ├── utils │ ├── helpers.js │ └── mixins.js └── views │ ├── Cart.vue │ ├── NotFound.vue │ ├── OrderCreate.vue │ ├── OrderDetail.vue │ ├── Payment.vue │ ├── Product.vue │ ├── Products.vue │ ├── SignIn.vue │ ├── SignUp.vue │ └── admin │ ├── AdminCategories.vue │ ├── AdminCoupon.vue │ ├── AdminCouponEdit.vue │ ├── AdminCouponNew.vue │ ├── AdminCoupons.vue │ ├── AdminDashboard.vue │ ├── AdminDiscount.vue │ ├── AdminDiscountEdit.vue │ ├── AdminDiscountNew.vue │ ├── AdminDiscounts.vue │ ├── AdminOrder.vue │ ├── AdminOrders.vue │ ├── AdminProduct.vue │ ├── AdminProductEdit.vue │ ├── AdminProductNew.vue │ ├── AdminProducts.vue │ ├── AdminSignIn.vue │ ├── AdminSignUp.vue │ └── AdminUsers.vue └── vue.config.js /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | # /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw? 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | ec-front-end-vue-logo 3 |

4 | 5 |

6 | Standard - JavaScript Style Guide 7 |

8 | 9 | # EC-Front-End-Vue 10 | 11 | EC-Front-End-Vue 是一個使用 Vue 建立的電子商務前端專案,平台使用者主要是下列兩種身份,分別為一般消費者(Visitor)、商家管理員(Admin),搭配 [EC-Back-End-Node](https://github.com/ac-ec-website/ec-back-end-node) 後端專案,打造一個全方位的電商網站。 12 | 13 | ![首頁截圖頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/homePage.png) 14 | 15 | ## Menu - 目錄 16 | 17 | - [Demo - 專案展示](#Demo---專案展示) 18 | - [Initial - 專案緣起](#Initial---專案緣起) 19 | - [Features - 專案功能](#Features---專案功能) 20 | - [Technical Skills - 使用哪些技術實作專案](#Technical-Skills---使用哪些技術實作專案) 21 | - [Content - 專案內容](#Content---專案內容) 22 | - [Resource - 資料引用來源](#Resource---資料引用來源) 23 | - [Declaration - 聲明](#Declaration---聲明) 24 | - [Environment SetUp - 環境建置](#Environment-SetUp---環境建置) 25 | - [Installing - 專案安裝流程](#Installing---專案安裝流程) 26 | - [Contributor and Responsibility - 開發人員與職責分工](#Contributor-and-Responsibility---開發人員與職責分工) 27 | 28 | ## Demo - 專案展示 29 | 30 | [Demo Website - 前台消費者(無須登入)](https://ac-ec-website.github.io/ec-front-end-vue/dist/#/products) 31 | 32 | [Demo Website - 後台管理員(需登入)](https://ac-ec-website.github.io/ec-front-end-vue/dist/#/admin/signin) 33 | 34 | 歡迎使用管理員測試帳號登入使用,帳密如下: 35 | 36 | ``` 37 | 管理員 38 | 帳號:root@example.com 39 | 密碼:123 40 | ``` 41 | 42 | PS:請不要隨意刪除資料呦,避免影響他人的使用體驗 3Q :D 43 | 44 | ## Initial - 專案緣起 45 | 46 | 專案緣起於 Alpha Camp 畢業專題發想,由團隊共同決議要選擇「電商平台」為主題,打造一個前後端分離的作品,期望透過技術解決傳統店家要拓展線上通路進入門檻過高的問題,包含網站開發、金流串接...等等。 47 | 48 | 因此,我們建立一個可以讓店家輕鬆開店、提供消費者各種優惠,也可以管理庫存的電商網站,如同常見的前台購物功能、後台上架管理功能等等。 49 | 50 | 專案核心價值: 51 | 52 | 1. 對消費者的價值:提供一個產品資訊清楚,購物/付費流程簡單,體驗良好的網路購物平台。 53 | 54 | 2. 對店家的價值:大幅減低網路開店的成本,輕鬆轉型電商,省去自行開發、另找金流物流服務、行銷等事情,讓商家專注在本業商品的研發與生產。 55 | 56 | ## Features - 專案功能 57 | 58 | - 前台: 59 | 60 | 1. 商品展示( 搜尋、分類、單一商品詳細介紹 ) 61 | 2. 購物車功能( 快速下單、選擇數量 ) 62 | 3. 三步驟結帳( 加入購物車、訂單創建、瀏覽訂單資訊) 63 | 4. 整合第三方金流服務,實踐付款功能 64 | 65 | - 後台: 66 | 67 | 1. 管理者註冊與登入 68 | 2. 商品管理 (CRUD) 69 | 3. 分類管理 (CRUD) 70 | 4. 優惠卷管理 (CRUD) 71 | 5. 特價活動管理 (CRUD) 72 | 6. 訂單管理 73 | 7. 用戶權限設定 74 | 75 | - 延伸閱讀:[專案使用者故事](https://docs.google.com/spreadsheets/d/1nHfa21Cn-y_5VNikL2dbra9c-sItiD9ej7YfaObTWOU/edit#gid=987765644) 76 | 77 | ## Technical Skills - 使用哪些技術實作專案 78 | 79 | - Vue CLI 3 - 快速建立專案項目環境 80 | - Vue Components - 使用 props / emit 實踐組件間資料傳遞 81 | - Vuex - 統一管理應用程式所有狀態 82 | - Vue Router - 統一管理應用程式路由 83 | - Bootstrap4 - 實作響應式網站 84 | - jQuery - DOM 元素操作 85 | - ES7(async/await) - 實作資料庫非同步操作 86 | - LocalStorage - 儲存身份認證的 JWT 87 | - Vue-Axios - 對接伺服器 API 操作資料 88 | - Sweetalert2 - 優化前端使用者體驗 89 | - Moment - 資料時間格式轉換 90 | - Curler - 實踐網站自動化警示提醒,提升團隊回應速度 91 | 92 | ## Content - 專案內容 93 | 94 | # 前台 95 | 96 | ![所有商品頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/homePage.png) 97 | 98 | ![個別商品頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/singleProduct.png) 99 | 100 | ![購物車頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/cartPage.png) 101 | 102 | ![訂單創建頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/orderCreatePage.png) 103 | 104 | ![訂單確認頁面-付款前](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/orderPageUnPaid.png) 105 | 106 | ![訂單確認頁面-付款後](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/orderPagePaid.png) 107 | 108 | # 後台 109 | 110 | ![管理員-業績面板頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/adminDashboardPage.png) 111 | 112 | ![管理員-訂單管理頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/adminOrdersPage.png) 113 | 114 | ![管理員-商品管理頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/adminProductsPage.png) 115 | 116 | ![管理員-商品分類管理頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/adminCategoriesPage.png) 117 | 118 | ![管理員-優惠券管理頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/adminCouponsPage.png) 119 | 120 | ![管理員-特價活動管理頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/adminDiscountsPage.png) 121 | 122 | ![管理員-帳號權限管理頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/adminUersPage.png) 123 | 124 | ![管理員-帳號註冊頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/adminSignUpPage.png) 125 | 126 | ![管理員-帳號登入頁面](https://github.com/ac-ec-website/ec-front-end-vue/blob/master/src/assets/adminSignInPage.png) 127 | 128 | ## Resource - 資料引用來源 129 | 130 | - [毛起來](https://shop.maoup.com.tw) 131 | 132 | ## Declaration - 聲明 133 | 134 | - 本作品內圖片、內容等,純粹為個人練習前端使用,不做任何商業用途。 135 | 136 | ## Environment SetUp - 環境建置 137 | 138 | - [Vue CLI 3](https://cli.vuejs.org/zh/guide/) 139 | 140 | ## Installing - 專案安裝流程 141 | 142 | 1. 打開你的 terminal,Clone 此專案至本機電腦 143 | 144 | ``` 145 | git clone https://github.com/ac-ec-website/ec-front-end-vue 146 | ``` 147 | 148 | 2. 開啟終端機(Terminal),進入存放此專案的資料夾 149 | 150 | ``` 151 | cd ec-front-end-vue 152 | ``` 153 | 154 | 3. 安裝 npm 套件 155 | 156 | ``` 157 | 在 Terminal 輸入 npm install 指令 158 | ``` 159 | 160 | 4. 啟動應用程式,本機運行 161 | 162 | ``` 163 | 在 Terminal 輸入 npm run serve 指令 164 | ``` 165 | 166 | 現在,你可開啟任一瀏覽器瀏覽器輸入 [http://localhost:8080](http://localhost:8080) ,你開始逛逛 GPW 電商網囉! 167 | 168 | 若想要體驗管理員功能,歡迎輸入 [http://localhost:8080/admin/signin](http://localhost:8080/admin/signin) ,歡迎使用管理員測試帳號登入使用。 169 | 170 | PS:請不要隨意刪除資料呦,避免影響他人的使用體驗 3Q :D 171 | 172 | 帳密如下: 173 | 174 | ``` 175 | 管理員 176 | 帳號:root@example.com 177 | 密碼:123 178 | ``` 179 | 180 | ## Contributor and Responsibility - 開發人員與職責分工 181 | 182 | [Pierce Shih](https://github.com/pierceshih15) 183 | 184 | 1. 負責團隊資源協調與協作機制建立,實踐各階段的產品開發目標 185 | 2. 負責前後端購物車、訂單創建、瀏覽訂單、優惠券、Email 通知功能開發 186 | 3. 負責專案核心分支管理,協助團隊 PR 審核 187 | 4. 協同團隊確立專案規格(User Story, Wireframe, ERD Model) 188 | 5. 協同團隊建立資料庫架構、種子資料與 Heroku 部署 189 | 6. 協同團隊串接第三方藍新金流 190 | 191 | [Zhen Yi](https://github.com/asd8116) 192 | 193 | 1. 負責前後端後台功能開發,包含管理員 CRUD - 商品管理、商品分類管理、訂單管理、優惠券管理、特價活動管理、用戶權限管理 194 | 2. 負責專案分支管理,協助團隊 PR 審核 195 | 3. 協同團隊確立專案規格(User Story, Wireframe, ERD Model) 196 | 4. 協同團隊建立資料庫架構、種子資料與 Heroku 部署 197 | 5. 協同團隊串接第三方藍新金流 198 | 199 | [Ginger 敬杰](https://github.com/Lianginger) 200 | 201 | 1. 負責前後端前台使用者商品頁面開發、後台管理員身份驗證、自動化測試等功能開發 202 | 2. 負責專案分支管理,協助團隊 PR 審核 203 | 3. 協同團隊確立專案規格(User Story, Wireframe, ERD Model) 204 | 4. 協同團隊建立資料庫架構、種子資料與 Heroku 部署 205 | 5. 協同團隊串接第三方藍新金流 206 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /dist/css/app.c74dbfe7.css: -------------------------------------------------------------------------------- 1 | @import url(https://fonts.googleapis.com/css?family=Noto+Sans+TC:300,400,700|Roboto+Slab:300,400,700&display=swap&subset=chinese-traditional);*{font-family:Roboto Slab,Noto Sans TC,sans-serif}.sidebar{position:fixed;top:0;left:0;bottom:0;width:140px;padding:60px 0 0;margin-left:8px;z-index:10;-webkit-box-shadow:inset -1px 0 0 rgba(0,0,0,.1);box-shadow:inset -1px 0 0 rgba(0,0,0,.1)}.navbar[data-v-57c9d4ae]{background-color:#000}.logo[data-v-57c9d4ae]{font-size:1.7em;color:#f5f5f5}.cart-content[data-v-57c9d4ae]{margin-right:3em;list-style-type:none}.badge[data-v-57c9d4ae]{font-size:110%;margin-right:10px;display:inline-block;display:none}.cart-text[data-v-57c9d4ae]{cursor:pointer}.fa-shopping-cart[data-v-57c9d4ae]{font-size:25px;display:inline-block}.navbar-collapse[data-v-57c9d4ae]{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.main-content[data-v-77d24798]{margin-top:3em}.footer-content[data-v-77d24798]{height:50px}.state[data-v-77d24798]{font-size:1.4em;color:#0c0c0c;text-align:right;line-height:45px}#sideCart[data-v-18fd6817]{position:fixed;top:0;left:0;height:100vh;width:30vw;min-width:350px;border-right:1px solid grey;background-color:#f7f7f7;z-index:100;overflow:auto}.items[data-v-18fd6817]{color:#9e1ef3}ul>label>input:checked+div[data-v-08a92e0a],ul>li>a[data-v-08a92e0a]:focus{background-color:#343a40;color:#fff}.loader1[data-v-1f8bd84e]{width:3em;height:3em;color:#212529;-webkit-animation:example-data-v-1f8bd84e 2s -.4s infinite;animation:example-data-v-1f8bd84e 2s -.4s infinite}.loader2[data-v-1f8bd84e]{width:3em;height:3em;color:#212529;-webkit-animation:example-data-v-1f8bd84e 2s -.2s infinite;animation:example-data-v-1f8bd84e 2s -.2s infinite}.loader3[data-v-1f8bd84e]{width:3em;height:3em;color:#212529;-webkit-animation:example-data-v-1f8bd84e 2s infinite;animation:example-data-v-1f8bd84e 2s infinite}@-webkit-keyframes example-data-v-1f8bd84e{0%{font-size:1em}50%{font-size:2em}to{font-size:1em}}@keyframes example-data-v-1f8bd84e{0%{font-size:1em}50%{font-size:2em}to{font-size:1em}} -------------------------------------------------------------------------------- /dist/css/chunk-0dfd3b4a.63d20943.css: -------------------------------------------------------------------------------- 1 | .dashboard h5[data-v-31b4f612]{margin:10px;color:#04a796}.nav-pills .nav-link[data-v-31b4f612]{width:120px;margin-right:7px;margin-bottom:7px;padding:5px 10px 3px;color:#f38328;border:1px solid #a1a1a1;-webkit-transition:none;transition:none}.nav-pills .nav-link.active[data-v-31b4f612],.nav-pills .nav-link[data-v-31b4f612]:focus,.nav-pills .nav-link[data-v-31b4f612]:hover,.nav-pills .show>.nav-link[data-v-31b4f612]{border-width:2px;border-color:#8302a3;background-color:transparent}.btn-link[data-v-723ea366]{color:rgba(12,61,167,.815)}.container[data-v-8be39f3e]{margin:50px} -------------------------------------------------------------------------------- /dist/css/chunk-3c947d60.84e3db1e.css: -------------------------------------------------------------------------------- 1 | template{min-width:375px;width:100%}.step{z-index:3}.step,.step .step-point-line{position:relative}.step .step-point-line:after{content:"";display:block;position:absolute;z-index:-1;height:2px;border-bottom:2px solid #343a40}.step .step-point{position:relative}@media screen and (min-width:768px){.step .step-point-line:after{right:-100px;top:24px;width:200px}.step .step-point:before{content:"";display:block;position:absolute;z-index:0;right:80px;top:20px;width:10px;height:10px;background-color:#343a40;border-radius:500px;-webkit-animation-name:point;animation-name:point;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.step-by-step{padding:12px 18px;margin-bottom:18px}.item-data{margin-top:20px;margin-bottom:20px}.item-quantity,.item-total{margin:auto}.item-quantity .item-quantity-text{display:none}}@media screen and (min-width:768px){.step .step-point-line:after{right:-100px;top:24px;width:200px}.step .step-point:before{content:"";display:block;position:absolute;z-index:0;right:80px;top:20px;width:10px;height:10px;background-color:#343a40;border-radius:500px;-webkit-animation-name:point;animation-name:point;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.step-by-step{padding:12px 18px;margin-bottom:18px}.item-data{margin-top:20px;margin-bottom:20px}.item-quantity,.item-total{margin:auto}.item-quantity .item-quantity-text{display:none}.hidden-Except-Mobile{content:"";display:none}}@media screen and (max-width:767.98px){.step .step-point-line:after{right:-60px;top:24px;width:120px}.step .step-text{font-size:14px;font-weight:400}.step-by-step{padding:12px;margin-bottom:12px;font-size:14px}.hidden-In-Mobile{content:"";display:none}.cart-promotions{font-size:14px}.item-data{position:relative;padding-top:30px;margin-top:20px;margin-bottom:20px}.item-name,.item-price .sell_price{font-size:14px}.item-price .original-price{font-size:12px}.item-quantity{margin-top:14px;text-align:left!important}.item-quantity .item-quantity-text{display:inline-block}.item-total{margin-top:16px;text-align:right!important;font-weight:bolder}.order-summary{font-size:16px}}.fa-shopping-cart{font-size:120px;color:#ccc;display:block;text-align:center;padding:10px 0}.original-price{text-decoration:line-through}section{border-radius:0;border:1px solid #ededed;margin-bottom:30px;padding:0 15px;background-color:#fff}.section-header{padding:10px 15px;margin:0 -15px;font-weight:500;background-color:#f6f6f6;line-height:26px}.section-body{padding:15px 0}.fa-check{color:green;text-align:center;font-size:38px;border:5px solid green;line-height:50px;border-radius:50%;width:60px;height:60px} -------------------------------------------------------------------------------- /dist/css/chunk-410f91b3.44dc4c9b.css: -------------------------------------------------------------------------------- 1 | .card[data-v-59df3089]{-webkit-box-shadow:10px 10px 5px rgba(0,0,0,.5);box-shadow:10px 10px 5px rgba(0,0,0,.5)}.card-img[data-v-59df3089]{width:10em;height:10em} -------------------------------------------------------------------------------- /dist/css/chunk-455910aa.32563729.css: -------------------------------------------------------------------------------- 1 | .img-responsive[data-v-2c9a9962]{width:250px;margin-bottom:25px} -------------------------------------------------------------------------------- /dist/css/chunk-54a728c1.357f47c0.css: -------------------------------------------------------------------------------- 1 | .dashboard h5[data-v-31b4f612]{margin:10px;color:#04a796}.nav-pills .nav-link[data-v-31b4f612]{width:120px;margin-right:7px;margin-bottom:7px;padding:5px 10px 3px;color:#f38328;border:1px solid #a1a1a1;-webkit-transition:none;transition:none}.nav-pills .nav-link.active[data-v-31b4f612],.nav-pills .nav-link[data-v-31b4f612]:focus,.nav-pills .nav-link[data-v-31b4f612]:hover,.nav-pills .show>.nav-link[data-v-31b4f612]{border-width:2px;border-color:#8302a3;background-color:transparent}.container[data-v-5d7b1f7f]{margin:50px}.btn-link[data-v-5d7b1f7f]{color:rgba(12,61,167,.815)} -------------------------------------------------------------------------------- /dist/css/chunk-60e039a0.76588251.css: -------------------------------------------------------------------------------- 1 | template{min-width:375px;width:100%}.step{z-index:3}.step,.step .step-point-line{position:relative}.step .step-point-line:after{content:"";display:block;position:absolute;z-index:-1;height:2px;border-bottom:2px solid #343a40}.step .step-point{position:relative}.hover-effect:hover{cursor:pointer}@media screen and (min-width:768px){.step .step-point-line:after{right:-100px;top:24px;width:200px}.step .step-point:before{content:"";display:block;position:absolute;z-index:0;right:80px;top:20px;width:10px;height:10px;background-color:#343a40;border-radius:500px;-webkit-animation-name:point;animation-name:point;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.step-by-step{padding:12px 18px;margin-bottom:18px}.item-data{margin-top:20px;margin-bottom:20px}.item-quantity,.item-total{margin:auto}}@media screen and (max-width:767.98px){.step .step-point-line:after{right:-60px;top:24px;width:120px}.step .step-text{font-size:14px;font-weight:400}.step-by-step{padding:12px;margin-bottom:12px;font-size:14px}.hidden-In-Mobile{content:"";display:none}.cart-promotions{font-size:14px}.item-data{position:relative;padding-top:30px;margin-top:20px;margin-bottom:20px}.item-name{font-size:14px}.item-price .original-price{font-size:12px}.item-quantity,.item-total{margin-top:16px}.item-total{line-height:38px}.item-action{position:absolute;top:-10px;right:20px}.item-action .fa-times{font-size:20px}}@-webkit-keyframes point{0%{-webkit-transform:translateX(0);transform:translateX(0);opacity:0}1%{opacity:0}10%{opacity:1}50%{opacity:1}to{-webkit-transform:translateX(12rem);transform:translateX(12rem);opacity:1}}@keyframes point{0%{-webkit-transform:translateX(0);transform:translateX(0);opacity:0}1%{opacity:0}10%{opacity:1}50%{opacity:1}to{-webkit-transform:translateX(12rem);transform:translateX(12rem);opacity:1}}.fa-shopping-cart{font-size:120px;color:#ccc;display:block;text-align:center;padding:10px 0}.original-price{text-decoration:line-through} -------------------------------------------------------------------------------- /dist/css/chunk-646c566a.caa588bb.css: -------------------------------------------------------------------------------- 1 | .dashboard h5[data-v-31b4f612]{margin:10px;color:#04a796}.nav-pills .nav-link[data-v-31b4f612]{width:120px;margin-right:7px;margin-bottom:7px;padding:5px 10px 3px;color:#f38328;border:1px solid #a1a1a1;-webkit-transition:none;transition:none}.nav-pills .nav-link.active[data-v-31b4f612],.nav-pills .nav-link[data-v-31b4f612]:focus,.nav-pills .nav-link[data-v-31b4f612]:hover,.nav-pills .show>.nav-link[data-v-31b4f612]{border-width:2px;border-color:#8302a3;background-color:transparent}.container[data-v-56718d89]{margin:50px}.btn-link[data-v-56718d89]{color:rgba(12,61,167,.815)} -------------------------------------------------------------------------------- /dist/css/chunk-6a27d422.bf2a7c96.css: -------------------------------------------------------------------------------- 1 | template{min-width:375px;width:100%}.step{z-index:3}.step,.step .step-point-line{position:relative}.step .step-point-line:after{content:"";display:block;position:absolute;z-index:-1;height:2px;border-bottom:2px solid #343a40}.step .step-point{position:relative}@media screen and (min-width:768px){.step .step-point-line:after{right:-100px;top:24px;width:200px}.step .step-point:before{content:"";display:block;position:absolute;z-index:0;right:80px;top:20px;width:10px;height:10px;background-color:#343a40;border-radius:500px;-webkit-animation-name:point;animation-name:point;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.step-by-step{padding:12px 18px;margin-bottom:18px}.item-data{margin-top:20px;margin-bottom:20px}.item-quantity,.item-total{margin:auto}.item-quantity .item-quantity-text{display:none}}@media screen and (max-width:767.98px){.step .step-point-line:after{right:-60px;top:24px;width:120px}.step .step-text{font-size:14px;font-weight:400}.step-by-step{padding:12px;margin-bottom:12px;font-size:14px}.hidden-In-Mobile{content:"";display:none}.cart-promotions{font-size:14px}.item-data{position:relative;padding-top:30px;margin-top:20px;margin-bottom:20px}.item-name,.item-price .sell_price{font-size:14px}.item-price .original-price{font-size:12px}.item-quantity{margin-top:14px;text-align:left!important}.item-quantity .item-quantity-text{display:inline-block}.item-total{margin-top:16px;text-align:right!important;font-weight:bolder}.order-summary{font-size:16px}}@-webkit-keyframes point{0%{-webkit-transform:translateX(0);transform:translateX(0);opacity:0}1%{opacity:0}10%{opacity:1}50%{opacity:1}to{-webkit-transform:translateX(12rem);transform:translateX(12rem);opacity:1}}@keyframes point{0%{-webkit-transform:translateX(0);transform:translateX(0);opacity:0}1%{opacity:0}10%{opacity:1}50%{opacity:1}to{-webkit-transform:translateX(12rem);transform:translateX(12rem);opacity:1}}.fa-shopping-cart{font-size:120px;color:#ccc;display:block;text-align:center;padding:10px 0}.original-price{text-decoration:line-through}section{border-radius:0;border:1px solid #ededed;margin-bottom:30px;padding:0 15px;background-color:#fff}.section-header{padding:10px 15px;margin:0 -15px;background-color:#f6f6f6}.section-body{padding:15px 0} -------------------------------------------------------------------------------- /dist/css/chunk-6fe227fa.74221f5b.css: -------------------------------------------------------------------------------- 1 | .dashboard h5[data-v-31b4f612]{margin:10px;color:#04a796}.nav-pills .nav-link[data-v-31b4f612]{width:120px;margin-right:7px;margin-bottom:7px;padding:5px 10px 3px;color:#f38328;border:1px solid #a1a1a1;-webkit-transition:none;transition:none}.nav-pills .nav-link.active[data-v-31b4f612],.nav-pills .nav-link[data-v-31b4f612]:focus,.nav-pills .nav-link[data-v-31b4f612]:hover,.nav-pills .show>.nav-link[data-v-31b4f612]{border-width:2px;border-color:#8302a3;background-color:transparent}.container[data-v-6f4226a6]{margin:50px}.category-name[data-v-6f4226a6]{padding:.375rem .75rem;border:1px solid transparent;outline:0;cursor:auto}.btn-link[data-v-6f4226a6]{width:100px;color:rgba(12,61,167,.815)}.cancel[data-v-6f4226a6]{position:absolute;right:20px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;width:25px;height:25px;border:1px solid #aaa;border-radius:50%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;cursor:pointer;font-size:12px} -------------------------------------------------------------------------------- /dist/css/chunk-ba5f6d76.ecffab87.css: -------------------------------------------------------------------------------- 1 | .dashboard h5[data-v-31b4f612]{margin:10px;color:#04a796}.nav-pills .nav-link[data-v-31b4f612]{width:120px;margin-right:7px;margin-bottom:7px;padding:5px 10px 3px;color:#f38328;border:1px solid #a1a1a1;-webkit-transition:none;transition:none}.nav-pills .nav-link.active[data-v-31b4f612],.nav-pills .nav-link[data-v-31b4f612]:focus,.nav-pills .nav-link[data-v-31b4f612]:hover,.nav-pills .show>.nav-link[data-v-31b4f612]{border-width:2px;border-color:#8302a3;background-color:transparent}.container[data-v-e74db164]{margin:50px}.card-body[data-v-e74db164]{background-color:#343a40;color:#f8f9fa;margin:.5em 0;border-radius:10px} -------------------------------------------------------------------------------- /dist/css/chunk-bb9cdefa.e1ed8dd0.css: -------------------------------------------------------------------------------- 1 | .dashboard h5[data-v-31b4f612]{margin:10px;color:#04a796}.nav-pills .nav-link[data-v-31b4f612]{width:120px;margin-right:7px;margin-bottom:7px;padding:5px 10px 3px;color:#f38328;border:1px solid #a1a1a1;-webkit-transition:none;transition:none}.nav-pills .nav-link.active[data-v-31b4f612],.nav-pills .nav-link[data-v-31b4f612]:focus,.nav-pills .nav-link[data-v-31b4f612]:hover,.nav-pills .show>.nav-link[data-v-31b4f612]{border-width:2px;border-color:#8302a3;background-color:transparent}.container[data-v-6a3142ad]{margin:50px} -------------------------------------------------------------------------------- /dist/css/chunk-cc8dae44.513d69f7.css: -------------------------------------------------------------------------------- 1 | .dashboard h5[data-v-31b4f612]{margin:10px;color:#04a796}.nav-pills .nav-link[data-v-31b4f612]{width:120px;margin-right:7px;margin-bottom:7px;padding:5px 10px 3px;color:#f38328;border:1px solid #a1a1a1;-webkit-transition:none;transition:none}.nav-pills .nav-link.active[data-v-31b4f612],.nav-pills .nav-link[data-v-31b4f612]:focus,.nav-pills .nav-link[data-v-31b4f612]:hover,.nav-pills .show>.nav-link[data-v-31b4f612]{border-width:2px;border-color:#8302a3;background-color:transparent}.container[data-v-7221dc2f]{margin:50px}.btn-link[data-v-7221dc2f]{color:rgba(12,61,167,.815)} -------------------------------------------------------------------------------- /dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/dist/favicon.ico -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | ec-front-end-vue
-------------------------------------------------------------------------------- /dist/js/chunk-0458f749.2de9ceac.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-0458f749"],{"6bde":function(e,n,o){"use strict";o.r(n);var t=function(){var e=this,n=e.$createElement,o=e._self._c||n;return o("div",{staticClass:"container py-5"},[e.isLoading?o("Spinner"):o("div",{staticClass:"row"},[o("div",{staticClass:"col-md-6"},[o("h3",[e._v(e._s(e.coupon.name))]),o("p",[e._v(e._s(e.coupon.description))]),o("p",{directives:[{name:"show",rawName:"v-show",value:0===e.coupon.type,expression:"coupon.type === 0"}]},[e._v("優惠方案:免運費")]),o("p",{directives:[{name:"show",rawName:"v-show",value:1===e.coupon.type,expression:"coupon.type === 1"}]},[e._v("優惠方案:扣款")]),o("p",{directives:[{name:"show",rawName:"v-show",value:2===e.coupon.type,expression:"coupon.type === 2"}]},[e._v("優惠方案:打折")]),o("p",[e._v("優惠碼:"+e._s(e.coupon.coupon_code))]),o("p",[e._v("使用次數:"+e._s(e.coupon.limited_num))]),o("p",[e._v("結束日期:"+e._s(e._f("dateTime")(e.coupon.end_date)))]),o("hr"),o("p",{directives:[{name:"show",rawName:"v-show",value:1===e.coupon.type,expression:"coupon.type === 1"}]},[e._v("折抵費用:"+e._s(e._f("currency")(e.coupon.product_reduce)))]),o("p",{directives:[{name:"show",rawName:"v-show",value:2===e.coupon.type,expression:"coupon.type === 2"}]},[e._v("折抵:"+e._s(e.coupon.percent)+" %")]),o("div",{staticClass:"mb-3"},[1===e.coupon.shipping_free?o("strong",{staticClass:"text-success"},[e._v("免運費")]):o("span",{staticClass:"text-muted"},[e._v("需運費")])]),o("a",{attrs:{href:"#"},on:{click:function(n){return e.$router.back()}}},[e._v("回上一頁")])])])],1)},p=[],s=(o("96cf"),o("3b8d")),a=o("7e32"),c=o("2375"),r=o("2708"),u=o("2fa3"),i={components:{Spinner:c["a"]},mixins:[r["b"],r["a"]],data:function(){return{coupon:{},isLoading:!1}},created:function(){var e=this.$route.params.couponId;this.fetchCoupon(e)},beforeRouteUpdate:function(e,n,o){var t=e.params.couponId;this.fetchCoupon(t),o()},methods:{fetchCoupon:function(){var e=Object(s["a"])(regeneratorRuntime.mark(function e(n){var o,t,p,s;return regeneratorRuntime.wrap(function(e){while(1)switch(e.prev=e.next){case 0:return o=this,e.prev=1,o.isLoading=!0,e.next=5,a["a"].getCoupon(n);case 5:if(t=e.sent,p=t.data,s=t.statusText,"OK"===s){e.next=10;break}throw new Error(s);case 10:o.coupon=p.coupon,o.isLoading=!1,e.next=17;break;case 14:e.prev=14,e.t0=e["catch"](1),u["Toast"].fire({type:"error",title:"無法取得 coupon 資料,請稍後再試"});case 17:case"end":return e.stop()}},e,this,[[1,14]])}));function n(n){return e.apply(this,arguments)}return n}()}},d=i,v=o("2877"),l=Object(v["a"])(d,t,p,!1,null,null,null);n["default"]=l.exports},"7e32":function(e,n,o){"use strict";var t=o("2fa3");n["a"]={getCoupons:function(){return t["apiHelper"].get("/admin/coupons")},getCoupon:function(e){return t["apiHelper"].get("/admin/coupons/".concat(e))},postCoupon:function(e){return t["apiHelper"].post("/admin/coupons",e)},putCoupon:function(e,n){return t["apiHelper"].put("/admin/coupons/".concat(e),n)},deleteCoupon:function(e){return t["apiHelper"].delete("/admin/coupons/".concat(e))}}}}]); 2 | //# sourceMappingURL=chunk-0458f749.2de9ceac.js.map -------------------------------------------------------------------------------- /dist/js/chunk-0dfd3b4a.a3263025.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-0dfd3b4a"],{"5f0b":function(t,a,s){"use strict";var n=function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"dashboard"},[s("div",{staticClass:"nav nav-pills"},[s("h5",[t._v("管理員")]),s("div",{staticClass:"nav-item"},[s("router-link",{staticClass:"nav-link",attrs:{to:"/admin/products"}},[s("i",{staticClass:"fas fa-box-open"}),t._v("\n 產品列表\n ")])],1),s("div",{staticClass:"nav-item"},[s("router-link",{staticClass:"nav-link",attrs:{to:"/admin/categories"}},[s("i",{staticClass:"fas fa-align-justify"}),t._v("\n 產品類別\n ")])],1),s("div",{staticClass:"nav-item"},[s("router-link",{staticClass:"nav-link",attrs:{to:"/admin/coupons"}},[s("i",{staticClass:"fas fa-ticket-alt"}),t._v("\n 優惠券\n ")])],1),s("div",{staticClass:"nav-item"},[s("router-link",{staticClass:"nav-link",attrs:{to:"/admin/discounts"}},[s("i",{staticClass:"fas fa-tags"}),t._v("\n 特價活動\n ")])],1),s("div",{staticClass:"nav-item"},[s("router-link",{staticClass:"nav-link",attrs:{to:"/admin/orders"}},[s("i",{staticClass:"far fa-list-alt"}),t._v("\n 訂單列表\n ")])],1),s("div",{staticClass:"nav-item"},[s("router-link",{staticClass:"nav-link",attrs:{to:"/admin/dashboard"}},[s("i",{staticClass:"fas fa-chart-line"}),t._v("\n 銷售報表\n ")])],1),s("div",{staticClass:"nav-item"},[s("router-link",{staticClass:"nav-link",attrs:{to:"/admin/users"}},[s("i",{staticClass:"fas fa-users-cog"}),t._v("\n 權限管理\n ")])],1)])])},e=[],r=(s("e31c"),s("2877")),i={},c=Object(r["a"])(i,n,e,!1,null,"31b4f612",null);a["a"]=c.exports},"724a":function(t,a,s){"use strict";s.r(a);var n=function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("div",{staticClass:"row"},[s("AdminNav",{staticClass:"sidebar col-md-2 d-none d-md-block bg-light"}),s("div",{staticClass:"container col-md-9 ml-sm-auto col-lg-10"},[s("router-link",{staticClass:"btn btn-primary btn-block mb-4",attrs:{to:"/admin/products/new"}},[t._v("\n New Products\n "),s("i",{staticClass:"fas fa-plus-square"})]),s("AdminProductsTable")],1)],1)},e=[],r=s("5f0b"),i=function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("table",{staticClass:"table"},[t._m(0),t.isLoading?s("Spinner"):s("tbody",t._l(t.products,function(a){return s("tr",{key:a.id},[s("th",{attrs:{scope:"row"}},[t._v(t._s(a.id))]),s("td",[t._v(t._s(a.name))]),s("td",{staticClass:"d-flex justify-content-between"},[s("router-link",{staticClass:"btn btn-link",attrs:{to:{name:"admin-product",params:{productId:a.id}}}},[t._v("\n Show\n "),s("i",{staticClass:"fas fa-external-link-square-alt"})]),s("router-link",{staticClass:"btn btn-link",attrs:{to:{name:"admin-product-edit",params:{productId:a.id}}}},[t._v("\n Edit\n "),s("i",{staticClass:"fas fa-edit"})]),s("button",{staticClass:"btn btn-link",attrs:{type:"button"},on:{click:function(s){return s.stopPropagation(),s.preventDefault(),t.deleteProduct(a.id)}}},[t._v("\n Delete\n "),s("i",{staticClass:"fas fa-trash-alt"})])],1)])}),0)],1)},c=[function(){var t=this,a=t.$createElement,s=t._self._c||a;return s("thead",{staticClass:"thead-dark"},[s("tr",[s("th",{attrs:{scope:"col"}},[t._v("#")]),s("th",{attrs:{scope:"col"}},[t._v("Name")]),s("th",{attrs:{scope:"col",width:"300"}},[t._v("操作")])])])}],o=(s("96cf"),s("3b8d")),u=s("b339"),l=s("2375"),d=s("2fa3"),f={components:{Spinner:l["a"]},data:function(){return{products:[],isLoading:!1}},created:function(){this.fetchProducts()},methods:{fetchProducts:function(){var t=Object(o["a"])(regeneratorRuntime.mark(function t(){var a,s,n,e;return regeneratorRuntime.wrap(function(t){while(1)switch(t.prev=t.next){case 0:return a=this,t.prev=1,a.isLoading=!0,t.next=5,u["a"].getProducts();case 5:if(s=t.sent,n=s.data,e=s.statusText,"OK"===e){t.next=10;break}throw new Error(e);case 10:a.products=n.products,a.isLoading=!1,t.next=17;break;case 14:t.prev=14,t.t0=t["catch"](1),d["Toast"].fire({type:"error",title:"無法取得產品,請稍後再試"});case 17:case"end":return t.stop()}},t,this,[[1,14]])}));function a(){return t.apply(this,arguments)}return a}(),deleteProduct:function(){var t=Object(o["a"])(regeneratorRuntime.mark(function t(a){var s,n,e,r;return regeneratorRuntime.wrap(function(t){while(1)switch(t.prev=t.next){case 0:return s=this,t.prev=1,t.next=4,u["a"].deleteProduct(a);case 4:if(n=t.sent,e=n.data,r=n.statusText,"OK"===r&&"success"===e.status){t.next=9;break}throw new Error(r);case 9:s.products=s.products.filter(function(t){return t.id!==a}),d["Toast"].fire({type:"success",title:"刪除產品成功"}),t.next=16;break;case 13:t.prev=13,t.t0=t["catch"](1),d["Toast"].fire({type:"error",title:"無法取得刪除產品,請稍後再試"});case 16:case"end":return t.stop()}},t,this,[[1,13]])}));function a(a){return t.apply(this,arguments)}return a}()}},p=f,v=(s("8893"),s("2877")),b=Object(v["a"])(p,i,c,!1,null,"723ea366",null),m=b.exports,h={components:{AdminNav:r["a"],AdminProductsTable:m}},C=h,k=(s("eab5"),Object(v["a"])(C,n,e,!1,null,"8be39f3e",null));a["default"]=k.exports},"742b":function(t,a,s){},8893:function(t,a,s){"use strict";var n=s("bb5a"),e=s.n(n);e.a},"8fb4":function(t,a,s){},b339:function(t,a,s){"use strict";var n=s("2fa3");a["a"]={getProducts:function(){return n["apiHelper"].get("/admin/products")},getProduct:function(t){return n["apiHelper"].get("/admin/products/".concat(t))},postProduct:function(t){return n["apiHelper"].post("/admin/products",t)},putProduct:function(t,a){return n["apiHelper"].put("/admin/products/".concat(t),a)},deleteProduct:function(t){return n["apiHelper"].delete("/admin/products/".concat(t))}}},bb5a:function(t,a,s){},e31c:function(t,a,s){"use strict";var n=s("8fb4"),e=s.n(n);e.a},eab5:function(t,a,s){"use strict";var n=s("742b"),e=s.n(n);e.a}}]); 2 | //# sourceMappingURL=chunk-0dfd3b4a.a3263025.js.map -------------------------------------------------------------------------------- /dist/js/chunk-1aa10266.4ce6bfc2.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-1aa10266"],{d122:function(t,e,s){"use strict";s.r(e);var a=function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"container py-5"},[s("form",{staticClass:"w-100",on:{submit:function(e){return e.preventDefault(),e.stopPropagation(),t.handleSubmit(e)}}},[t._m(0),s("div",{staticClass:"form-label-group mb-2"},[s("label",{attrs:{for:"email"}},[t._v("email")]),s("input",{directives:[{name:"model",rawName:"v-model",value:t.email,expression:"email"}],staticClass:"form-control",attrs:{id:"email",name:"email",type:"email",placeholder:"email",required:"",autofocus:""},domProps:{value:t.email},on:{input:function(e){e.target.composing||(t.email=e.target.value)}}})]),s("div",{staticClass:"form-label-group mb-3"},[s("label",{attrs:{for:"password"}},[t._v("Password")]),s("input",{directives:[{name:"model",rawName:"v-model",value:t.password,expression:"password"}],staticClass:"form-control",attrs:{id:"password",name:"password",type:"password",placeholder:"Password",required:""},domProps:{value:t.password},on:{input:function(e){e.target.composing||(t.password=e.target.value)}}})]),s("button",{staticClass:"btn btn-lg btn-primary btn-block mb-3",attrs:{disabled:t.isProcessing,type:"submit"}},[t._v("Submit")]),s("div",{staticClass:"text-center mb-3"},[s("p",[s("router-link",{attrs:{to:"/admin/signup"}},[t._v("Sign Up")])],1)]),s("p",{staticClass:"mt-5 mb-3 text-muted text-center"},[t._v("© 2019")])])])},r=[function(){var t=this,e=t.$createElement,s=t._self._c||e;return s("div",{staticClass:"text-center mb-4"},[s("h1",{staticClass:"h3 mb-3 font-weight-normal"},[t._v("Sign In")])])}],n=(s("96cf"),s("3b8d")),i=s("db6b"),o=s("2fa3"),l=o.Toast,u={data:function(){return{email:"",password:"",isProcessing:!1}},methods:{handleSubmit:function(){var t=Object(n["a"])(regeneratorRuntime.mark(function t(e){var s,a,r;return regeneratorRuntime.wrap(function(t){while(1)switch(t.prev=t.next){case 0:if(s=this,t.prev=1,s.email&&s.password){t.next=5;break}return l.fire({type:"warning",title:"所有欄位都要填寫"}),t.abrupt("return");case 5:return s.isProcessing=!0,t.next=8,i["a"].signIn({email:s.email,password:s.password});case 8:if(a=t.sent,r=a.data,"success"===r.status){t.next=15;break}return l.fire({type:"warning",title:r.message}),s.password="",s.isProcessing=!1,t.abrupt("return");case 15:l.fire({type:"success",title:"登入成功!"}),localStorage.setItem("token",r.token),s.$store.commit("setCurrentUser",r.user),s.$router.push("/admin"),t.next=25;break;case 21:t.prev=21,t.t0=t["catch"](1),s.isProcessing=!1,s.password="";case 25:case"end":return t.stop()}},t,this,[[1,21]])}));function e(e){return t.apply(this,arguments)}return e}()}},c=u,p=s("2877"),m=Object(p["a"])(c,a,r,!1,null,null,null);e["default"]=m.exports},db6b:function(t,e,s){"use strict";var a=s("2fa3");e["a"]={signIn:function(t){return a["apiHelper"].post("/admin/signin",t)},signUp:function(t){return a["apiHelper"].post("/admin/signup",t)}}}}]); 2 | //# sourceMappingURL=chunk-1aa10266.4ce6bfc2.js.map -------------------------------------------------------------------------------- /dist/js/chunk-2d0aa5f4.69d6f566.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0aa5f4"],{1175:function(t,e,n){"use strict";n.r(e);var a=function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"container text-center"},[n("h1",{staticClass:"py-5"},[t._v("頁面跳轉中,請稍等~")]),n("div",{staticClass:"d-none"},[n("h3",[t._v("準備為訂單編號: "+t._s(t.order.id)+" 付款")]),n("h4",[t._v("總價 "+t._s(t.order.amount))]),n("form",{attrs:{name:"Spgateway",action:t.tradeInfo.PayGateWay,method:"POST"}},[t._v("\n MerchantID:\n "),n("input",{attrs:{type:"text",name:"MerchantID"},domProps:{value:t.tradeInfo.MerchantID}}),n("br"),t._v("TradeInfo:\n "),n("input",{attrs:{type:"text",name:"TradeInfo"},domProps:{value:t.tradeInfo.TradeInfo}}),n("br"),t._v("TradeSha:\n "),n("input",{attrs:{type:"text",name:"TradeSha"},domProps:{value:t.tradeInfo.TradeSha}}),n("br"),t._v("Version:\n "),n("input",{attrs:{type:"text",name:"Version"},domProps:{value:t.tradeInfo.Version}}),n("br"),n("button",{staticClass:"btn btn-primary",attrs:{type:"submit",id:"postPayment"}},[t._v("Payment")])])])])},r=[],o=(n("96cf"),n("3b8d")),s=n("2fa3"),i={getPayment:function(){return s["apiHelper"].get("/payment")}},c={data:function(){return{order:{},tradeInfo:{}}},created:function(){this.fetchPayment()},updated:function(){this.handlePaymentSubmit()},methods:{fetchPayment:function(){var t=Object(o["a"])(regeneratorRuntime.mark(function t(){var e,n,a,r;return regeneratorRuntime.wrap(function(t){while(1)switch(t.prev=t.next){case 0:return t.prev=0,e=this,t.next=4,i.getPayment();case 4:if(n=t.sent,a=n.data,r=n.statusText,"OK"===r){t.next=9;break}throw new Error(r);case 9:e.order=a.order,e.tradeInfo=a.tradeInfo,t.next=16;break;case 13:t.prev=13,t.t0=t["catch"](0),s["Toast"].fire({type:"error",title:"無法取得付款資料,請稍後再試"});case 16:case"end":return t.stop()}},t,this,[[0,13]])}));function e(){return t.apply(this,arguments)}return e}(),handlePaymentSubmit:function(){document.getElementById("postPayment").click()}}},d=c,u=n("2877"),p=Object(u["a"])(d,a,r,!1,null,null,null);e["default"]=p.exports}}]); 2 | //# sourceMappingURL=chunk-2d0aa5f4.69d6f566.js.map -------------------------------------------------------------------------------- /dist/js/chunk-2d0aa5f4.69d6f566.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/views/Payment.vue?a495","webpack:///./src/apis/payment.js","webpack:///src/views/Payment.vue","webpack:///./src/views/Payment.vue?3d33","webpack:///./src/views/Payment.vue"],"names":["render","_vm","this","_h","$createElement","_c","_self","staticClass","_v","_s","order","id","amount","attrs","name","action","tradeInfo","PayGateWay","method","type","domProps","value","MerchantID","TradeInfo","TradeSha","Version","staticRenderFns","payment","getPayment","apiHelper","get","Paymentvue_type_script_lang_js_","data","created","fetchPayment","updated","handlePaymentSubmit","methods","_fetchPayment","Object","asyncToGenerator","regeneratorRuntime","mark","_callee","vm","_ref","statusText","wrap","_context","prev","next","sent","Error","t0","helpers","fire","title","stop","apply","arguments","document","getElementById","click","views_Paymentvue_type_script_lang_js_","component","componentNormalizer","__webpack_exports__"],"mappings":"uHAAA,IAAIA,EAAS,WAAa,IAAIC,EAAIC,KAASC,EAAGF,EAAIG,eAAmBC,EAAGJ,EAAIK,MAAMD,IAAIF,EAAG,OAAOE,EAAG,MAAM,CAACE,YAAY,yBAAyB,CAACF,EAAG,KAAK,CAACE,YAAY,QAAQ,CAACN,EAAIO,GAAG,gBAAgBH,EAAG,MAAM,CAACE,YAAY,UAAU,CAACF,EAAG,KAAK,CAACJ,EAAIO,GAAG,YAAYP,EAAIQ,GAAGR,EAAIS,MAAMC,IAAI,SAASN,EAAG,KAAK,CAACJ,EAAIO,GAAG,MAAMP,EAAIQ,GAAGR,EAAIS,MAAME,WAAWP,EAAG,OAAO,CAACQ,MAAM,CAACC,KAAO,YAAYC,OAASd,EAAIe,UAAUC,WAAWC,OAAS,SAAS,CAACjB,EAAIO,GAAG,+BAA+BH,EAAG,QAAQ,CAACQ,MAAM,CAACM,KAAO,OAAOL,KAAO,cAAcM,SAAS,CAACC,MAAQpB,EAAIe,UAAUM,cAAcjB,EAAG,MAAMJ,EAAIO,GAAG,sBAAsBH,EAAG,QAAQ,CAACQ,MAAM,CAACM,KAAO,OAAOL,KAAO,aAAaM,SAAS,CAACC,MAAQpB,EAAIe,UAAUO,aAAalB,EAAG,MAAMJ,EAAIO,GAAG,qBAAqBH,EAAG,QAAQ,CAACQ,MAAM,CAACM,KAAO,OAAOL,KAAO,YAAYM,SAAS,CAACC,MAAQpB,EAAIe,UAAUQ,YAAYnB,EAAG,MAAMJ,EAAIO,GAAG,oBAAoBH,EAAG,QAAQ,CAACQ,MAAM,CAACM,KAAO,OAAOL,KAAO,WAAWM,SAAS,CAACC,MAAQpB,EAAIe,UAAUS,WAAWpB,EAAG,MAAMA,EAAG,SAAS,CAACE,YAAY,kBAAkBM,MAAM,CAACM,KAAO,SAASR,GAAK,gBAAgB,CAACV,EAAIO,GAAG,oBACziCkB,EAAkB,G,oCCCPC,EAAA,CACbC,WADa,WAEX,OAAOC,eAAUC,IAAV,cCuBXC,EAAA,CACEC,KADF,WAEI,MAAO,CACLtB,MAAO,GACPM,UAAW,KAGfiB,QAPF,WAQI/B,KAAKgC,gBAEPC,QAVF,WAWIjC,KAAKkC,uBAEPC,QAAS,CACPH,aADJ,eAAAI,EAAAC,OAAAC,EAAA,KAAAD,CAAAE,mBAAAC,KAAA,SAAAC,IAAA,IAAAC,EAAAC,EAAAb,EAAAc,EAAA,OAAAL,mBAAAM,KAAA,SAAAC,GAAA,eAAAA,EAAAC,KAAAD,EAAAE,MAAA,cAAAF,EAAAC,KAAA,EAGAL,EAAA1C,KAHA8C,EAAAE,KAAA,EAIAvB,EAAAC,aAJA,UAAAiB,EAAAG,EAAAG,KAIAnB,EAJAa,EAIAb,KAAAc,EAJAD,EAIAC,WAEA,OAAAA,EANA,CAAAE,EAAAE,KAAA,cAOA,IAAAE,MAAAN,GAPA,OAUAF,EAAAlC,MAAAsB,EAAAtB,MACAkC,EAAA5B,UAAAgB,EAAAhB,UAXAgC,EAAAE,KAAA,iBAAAF,EAAAC,KAAA,GAAAD,EAAAK,GAAAL,EAAA,YAaAM,EAAA,SAAAC,KAAA,CACApC,KAAA,QACAqC,MAAA,mBAfA,yBAAAR,EAAAS,SAAAd,EAAAzC,KAAA,sBAAAgC,IAAA,OAAAI,EAAAoB,MAAAxD,KAAAyD,WAAA,OAAAzB,EAAA,GAmBIE,oBAnBJ,WAoBMwB,SAASC,eAAe,eAAeC,WC5DoSC,EAAA,E,YCO7UC,EAAYzB,OAAA0B,EAAA,KAAA1B,CACdwB,EACA/D,EACA0B,GACA,EACA,KACA,KACA,MAIawC,EAAA,WAAAF,E","file":"js/chunk-2d0aa5f4.69d6f566.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"container text-center\"},[_c('h1',{staticClass:\"py-5\"},[_vm._v(\"頁面跳轉中,請稍等~\")]),_c('div',{staticClass:\"d-none\"},[_c('h3',[_vm._v(\"準備為訂單編號: \"+_vm._s(_vm.order.id)+\" 付款\")]),_c('h4',[_vm._v(\"總價 \"+_vm._s(_vm.order.amount))]),_c('form',{attrs:{\"name\":\"Spgateway\",\"action\":_vm.tradeInfo.PayGateWay,\"method\":\"POST\"}},[_vm._v(\"\\n MerchantID:\\n \"),_c('input',{attrs:{\"type\":\"text\",\"name\":\"MerchantID\"},domProps:{\"value\":_vm.tradeInfo.MerchantID}}),_c('br'),_vm._v(\"TradeInfo:\\n \"),_c('input',{attrs:{\"type\":\"text\",\"name\":\"TradeInfo\"},domProps:{\"value\":_vm.tradeInfo.TradeInfo}}),_c('br'),_vm._v(\"TradeSha:\\n \"),_c('input',{attrs:{\"type\":\"text\",\"name\":\"TradeSha\"},domProps:{\"value\":_vm.tradeInfo.TradeSha}}),_c('br'),_vm._v(\"Version:\\n \"),_c('input',{attrs:{\"type\":\"text\",\"name\":\"Version\"},domProps:{\"value\":_vm.tradeInfo.Version}}),_c('br'),_c('button',{staticClass:\"btn btn-primary\",attrs:{\"type\":\"submit\",\"id\":\"postPayment\"}},[_vm._v(\"Payment\")])])])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { apiHelper } from './../utils/helpers'\n\nexport default {\n getPayment () {\n return apiHelper.get(`/payment`)\n }\n}\n","\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Payment.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Payment.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Payment.vue?vue&type=template&id=4b9546dc&\"\nimport script from \"./Payment.vue?vue&type=script&lang=js&\"\nexport * from \"./Payment.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports"],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/js/chunk-2d0d338e.b326d192.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0d338e"],{"5c9c":function(e,a,t){"use strict";t.r(a);var s=function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("div",{staticClass:"container py-5"},[t("form",{staticClass:"w-100",on:{submit:function(a){return a.stopPropagation(),a.preventDefault(),e.handleSubmit(a)}}},[e._m(0),t("div",{staticClass:"form-label-group mb-2"},[t("label",{attrs:{for:"name"}},[e._v("Name")]),t("input",{directives:[{name:"model",rawName:"v-model",value:e.name,expression:"name"}],staticClass:"form-control",attrs:{id:"name",name:"name",type:"text",placeholder:"name",required:"",autofocus:""},domProps:{value:e.name},on:{input:function(a){a.target.composing||(e.name=a.target.value)}}})]),t("div",{staticClass:"form-label-group mb-2"},[t("label",{attrs:{for:"email"}},[e._v("Email")]),t("input",{directives:[{name:"model",rawName:"v-model",value:e.email,expression:"email"}],staticClass:"form-control",attrs:{id:"email",name:"email",type:"email",placeholder:"email",required:""},domProps:{value:e.email},on:{input:function(a){a.target.composing||(e.email=a.target.value)}}})]),t("div",{staticClass:"form-label-group mb-3"},[t("label",{attrs:{for:"password"}},[e._v("Password")]),t("input",{directives:[{name:"model",rawName:"v-model",value:e.password,expression:"password"}],staticClass:"form-control",attrs:{id:"password",name:"password",type:"password",placeholder:"Password",required:""},domProps:{value:e.password},on:{input:function(a){a.target.composing||(e.password=a.target.value)}}})]),t("div",{staticClass:"form-label-group mb-3"},[t("label",{attrs:{for:"password-check"}},[e._v("Password Check")]),t("input",{directives:[{name:"model",rawName:"v-model",value:e.passwordCheck,expression:"passwordCheck"}],staticClass:"form-control",attrs:{id:"password-check",name:"passwordCheck",type:"password",placeholder:"Password",required:""},domProps:{value:e.passwordCheck},on:{input:function(a){a.target.composing||(e.passwordCheck=a.target.value)}}})]),t("button",{staticClass:"btn btn-lg btn-primary btn-block mb-3",attrs:{type:"submit"}},[e._v("Submit")]),t("div",{staticClass:"text-center mb-3"},[t("p",[t("router-link",{attrs:{to:"/signin"}},[e._v("Sign In")])],1)]),t("p",{staticClass:"mt-5 mb-3 text-muted text-center"},[e._v("© 2019-2020")])])])},r=[function(){var e=this,a=e.$createElement,t=e._self._c||a;return t("div",{staticClass:"text-center mb-4"},[t("h1",{staticClass:"h3 mb-3 font-weight-normal"},[e._v("Sign Up")])])}],o=(t("7f7f"),{name:"SignUp",data:function(){return{name:"",email:"",password:"",passwordCheck:""}},methods:{handleSubmit:function(e){var a=JSON.stringify({name:this.name,email:this.email,password:this.password,passwordCheck:this.passwordCheck});console.log("data",a)}}}),n=o,i=t("2877"),l=Object(i["a"])(n,s,r,!1,null,null,null);a["default"]=l.exports}}]); 2 | //# sourceMappingURL=chunk-2d0d338e.b326d192.js.map -------------------------------------------------------------------------------- /dist/js/chunk-2d0e5e97.092952fa.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d0e5e97"],{9703:function(e,n,t){"use strict";t.r(n);var u=function(){var e=this,n=e.$createElement,t=e._self._c||n;return t("h1",[e._v("404 Page Not Found")])},c=[],l=t("2877"),o={},a=Object(l["a"])(o,u,c,!1,null,null,null);n["default"]=a.exports}}]); 2 | //# sourceMappingURL=chunk-2d0e5e97.092952fa.js.map -------------------------------------------------------------------------------- /dist/js/chunk-2d0e5e97.092952fa.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"sources":["webpack:///./src/views/NotFound.vue?b24d","webpack:///./src/views/NotFound.vue"],"names":["render","_vm","this","_h","$createElement","_c","_self","_v","staticRenderFns","script","component","Object","componentNormalizer","__webpack_exports__"],"mappings":"uHAAA,IAAIA,EAAS,WAAa,IAAIC,EAAIC,KAASC,EAAGF,EAAIG,eAAmBC,EAAGJ,EAAIK,MAAMD,IAAIF,EAAG,OAAOE,EAAG,KAAK,CAACJ,EAAIM,GAAG,yBAC5GC,EAAkB,G,YCAlBC,EAAS,GAKTC,EAAYC,OAAAC,EAAA,KAAAD,CACdF,EACAT,EACAQ,GACA,EACA,KACA,KACA,MAIaK,EAAA,WAAAH,E","file":"js/chunk-2d0e5e97.092952fa.js","sourcesContent":["var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('h1',[_vm._v(\"404 Page Not Found\")])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","import { render, staticRenderFns } from \"./NotFound.vue?vue&type=template&id=91b53e32&\"\nvar script = {}\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports"],"sourceRoot":""} -------------------------------------------------------------------------------- /dist/js/chunk-2d21de4f.893a8112.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-2d21de4f"],{d2f1:function(t,e,r){"use strict";r.r(e);var a=function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"container py-5"},[r("SideCartPreview",{directives:[{name:"show",rawName:"v-show",value:t.showSideCart,expression:"showSideCart"}],attrs:{"initial-cart":t.cart},on:{clickDeleteItem:t.handleDeleteItem}}),r("ProductDetail",{attrs:{"initial-product":t.product},on:{clickAddToCart:t.handleAddToCart}})],1)},n=[],i=(r("96cf"),r("3b8d")),c=r("2fa3"),o=r("ee21"),s=r("cc17"),u=function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",[r("h1",{staticClass:"py-3 font-weight-bold"},[t._v(t._s(t.product.name))]),r("div",{staticClass:"row"},[r("div",{staticClass:"col-md-4 mb-5"},[r("div",{staticClass:"w-100"},[r("div",{staticStyle:{width:"100%","padding-bottom":"100%","background-position":"center","background-repeat":"no-repeat","background-size":"cover"},style:{"background-image":"url("+t.product.image+")"}})])]),r("div",{staticClass:"col-md-8"},[r("p",[t._v(t._s(t.product.description))]),r("hr"),r("span",{staticClass:"float-right text-secondary card-text text-truncate"},[t._v("原價$ "+t._s(t.product.origin_price)+" 元")]),r("h5",{staticClass:"card-text text-truncate font-weight-bold text-success"},[t._v("NT$ "+t._s(t.product.sell_price)+" 元")]),r("div",{staticClass:"addToCart text-right py-5"},[r("form",{on:{submit:function(e){return e.stopPropagation(),e.preventDefault(),t.handleAddToCart(e)}}},[0===t.product.stock_quantity?r("div",{staticClass:"input-group"},[r("button",{staticClass:"btn btn-secondary btn-block",attrs:{type:"button",disabled:""}},[t._v("商品已無庫存")])]):r("div",{staticClass:"input-group"},[r("input",{directives:[{name:"model",rawName:"v-model",value:t.productQuantity,expression:"productQuantity"}],staticClass:"form-control",attrs:{type:"number",name:"quantity",min:"1"},domProps:{value:t.productQuantity},on:{input:function(e){e.target.composing||(t.productQuantity=e.target.value)}}}),t._m(0)])])]),r("a",{staticClass:"text-primary",staticStyle:{cursor:"pointer"},on:{click:function(e){return t.$router.go(-1)}}},[t._v("回前一頁")])])])])},d=[function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("div",{staticClass:"input-group-append"},[r("button",{staticClass:"btn btn-danger px-5",attrs:{type:"submit"}},[t._v("加入購物車")])])}],p={props:{initialProduct:{type:Object,required:!0}},data:function(){return{productQuantity:1,product:this.initialProduct}},watch:{initialProduct:function(){this.product=this.initialProduct}},methods:{handleAddToCart:function(){console.log("加入商品數量",this.productQuantity),this.$emit("clickAddToCart",this.product.id,parseInt(this.productQuantity))}}},l=p,h=r("2877"),f=Object(h["a"])(l,u,d,!1,null,null,null),m=f.exports,v=r("bf4e"),b={components:{ProductDetail:m,SideCartPreview:v["a"]},data:function(){return{product:{},cart:{},showSideCart:!1}},watch:{"$route.params.productId":function(t){this.fetchProduct(t)}},created:function(){var t=this.$route.params.productId;this.fetchProduct(t)},mounted:function(){var t=this;this.$root.$on("toggleSideCart",function(){t.showSideCart=!t.showSideCart})},methods:{fetchProduct:function(){var t=Object(i["a"])(regeneratorRuntime.mark(function t(e){var r,a;return regeneratorRuntime.wrap(function(t){while(1)switch(t.prev=t.next){case 0:return t.prev=0,r=this,t.next=4,o["a"].getProduct(e);case 4:if(a=t.sent,"OK"===a.statusText){t.next=7;break}throw new Error(a.statusText);case 7:r.product=a.data.product,r.cart=a.data.cart,r.$store.commit("setNavbarCartItemNumber",a.data.cart.items.length),t.next=15;break;case 12:t.prev=12,t.t0=t["catch"](0),c["Toast"].fire({type:"error",title:"無法取得單一商品資料,請稍後再試"});case 15:case"end":return t.stop()}},t,this,[[0,12]])}));function e(e){return t.apply(this,arguments)}return e}(),handleAddToCart:function(){var t=Object(i["a"])(regeneratorRuntime.mark(function t(e,r){var a,n,i,o,u;return regeneratorRuntime.wrap(function(t){while(1)switch(t.prev=t.next){case 0:if(t.prev=0,a=this,n=a.product.stock_quantity,!(n 1%", 60 | "last 2 versions" 61 | ] 62 | } 63 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ec-front-end-vue 10 | 11 | 12 | 13 | 14 | 15 | 19 |
20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 38 | 39 | 56 | -------------------------------------------------------------------------------- /src/apis/admin/adminAuth.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from '@/utils/helpers' 2 | 3 | export default { 4 | signIn (profile) { 5 | return apiHelper.post(`/admin/signin`, profile) 6 | }, 7 | signUp (profile) { 8 | return apiHelper.post(`/admin/signup`, profile) 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/apis/admin/adminCategory.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from '@/utils/helpers' 2 | 3 | export default { 4 | getCategories () { 5 | return apiHelper.get(`/admin/categories`) 6 | }, 7 | postCategory (name) { 8 | return apiHelper.post(`/admin/categories`, name) 9 | }, 10 | putCategory (categoryId, name) { 11 | return apiHelper.put(`/admin/categories/${categoryId}`, name) 12 | }, 13 | deleteCategory (categoryId) { 14 | return apiHelper.delete(`/admin/categories/${categoryId}`) 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/apis/admin/adminCoupon.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from '@/utils/helpers' 2 | 3 | export default { 4 | getCoupons () { 5 | return apiHelper.get(`/admin/coupons`) 6 | }, 7 | getCoupon (couponId) { 8 | return apiHelper.get(`/admin/coupons/${couponId}`) 9 | }, 10 | postCoupon (formData) { 11 | return apiHelper.post(`/admin/coupons`, formData) 12 | }, 13 | putCoupon (couponId, formData) { 14 | return apiHelper.put(`/admin/coupons/${couponId}`, formData) 15 | }, 16 | deleteCoupon (couponId) { 17 | return apiHelper.delete(`/admin/coupons/${couponId}`) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/apis/admin/adminDiscount.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from '@/utils/helpers' 2 | 3 | export default { 4 | getDiscounts () { 5 | return apiHelper.get(`/admin/discounts`) 6 | }, 7 | getDiscount (discountId) { 8 | return apiHelper.get(`/admin/discounts/${discountId}`) 9 | }, 10 | postDiscount (formData) { 11 | return apiHelper.post(`/admin/discounts`, formData) 12 | }, 13 | putDiscount (discountId, formData) { 14 | return apiHelper.put(`/admin/discounts/${discountId}`, formData) 15 | }, 16 | deleteDiscount (discountId) { 17 | return apiHelper.delete(`/admin/discounts/${discountId}`) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/apis/admin/adminOrder.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from '@/utils/helpers' 2 | 3 | export default { 4 | getOrders () { 5 | return apiHelper.get(`/admin/orders`) 6 | }, 7 | getOrder (orderId) { 8 | return apiHelper.get(`/admin/orders/${orderId}`) 9 | }, 10 | putOrder (orderId, value) { 11 | return apiHelper.put(`/admin/orders/${orderId}`, value) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/apis/admin/adminProduct.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from '@/utils/helpers' 2 | 3 | export default { 4 | getProducts () { 5 | return apiHelper.get(`/admin/products`) 6 | }, 7 | getProduct (productId) { 8 | return apiHelper.get(`/admin/products/${productId}`) 9 | }, 10 | postProduct (formData) { 11 | return apiHelper.post(`/admin/products`, formData) 12 | }, 13 | putProduct (productId, formData) { 14 | return apiHelper.put(`/admin/products/${productId}`, formData) 15 | }, 16 | deleteProduct (productId) { 17 | return apiHelper.delete(`/admin/products/${productId}`) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/apis/admin/adminUser.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from '@/utils/helpers' 2 | 3 | export default { 4 | getUsers () { 5 | return apiHelper.get(`/admin/users`) 6 | }, 7 | putUser (profile) { 8 | return apiHelper.put(`/admin/user`, profile) 9 | }, 10 | getCurrentUser () { 11 | return apiHelper.get(`/get_current_user`) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/apis/cart.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from './../utils/helpers' 2 | 3 | export default { 4 | getCart () { 5 | return apiHelper.get('/cart') 6 | }, 7 | addToCart (productId, quantity) { 8 | return apiHelper.post('/cart', { 9 | productId, 10 | quantity 11 | }) 12 | }, 13 | addItemToCart (cartId, cartItemId) { 14 | return apiHelper.post(`/cart/${cartId}/cartItem/${cartItemId}/add`, { 15 | cartId, 16 | cartItemId 17 | }) 18 | }, 19 | subItemFromCart (cartId, cartItemId) { 20 | return apiHelper.post(`/cart/${cartId}/cartItem/${cartItemId}/sub`, { 21 | cartId, 22 | cartItemId 23 | }) 24 | }, 25 | deleteItemFromCart (cartId, cartItemId) { 26 | return apiHelper.delete(`/cart/${cartId}/cartItem/${cartItemId}`, { 27 | cartId, 28 | cartItemId 29 | }) 30 | }, 31 | putCart (shippingData) { 32 | return apiHelper.put('/cart', shippingData) 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/apis/coupons.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from './../utils/helpers' 2 | 3 | export default { 4 | postCoupon (couponCode) { 5 | return apiHelper.post('/coupon', couponCode) 6 | }, 7 | getCoupon () { 8 | return apiHelper.get('/coupon') 9 | }, 10 | deleteCoupon (couponCode) { 11 | return apiHelper.delete('/coupon', couponCode) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/apis/discounts.js: -------------------------------------------------------------------------------- 1 | import { 2 | apiHelper 3 | } from './../utils/helpers' 4 | 5 | export default { 6 | getDiscount () { 7 | return apiHelper.get('/discount') 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/apis/order.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from './../utils/helpers' 2 | 3 | export default { 4 | postOrder (formData) { 5 | return apiHelper.post('/order', formData) 6 | }, 7 | getOrder () { 8 | return apiHelper.get('/order') 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/apis/payment.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from './../utils/helpers' 2 | 3 | export default { 4 | getPayment () { 5 | return apiHelper.get(`/payment`) 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/apis/products.js: -------------------------------------------------------------------------------- 1 | import { apiHelper } from './../utils/helpers' 2 | 3 | export default { 4 | getProducts () { 5 | return apiHelper.get(`/products`) 6 | }, 7 | getProduct (productId) { 8 | return apiHelper.get(`/products/${productId}`) 9 | }, 10 | deleteItem (cartId, cartItemId) { 11 | return apiHelper.delete(`/cart/${cartId}/cartItem/${cartItemId}`) 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/assets/adminCategoriesPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/adminCategoriesPage.png -------------------------------------------------------------------------------- /src/assets/adminCouponsPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/adminCouponsPage.png -------------------------------------------------------------------------------- /src/assets/adminDashboardPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/adminDashboardPage.png -------------------------------------------------------------------------------- /src/assets/adminDiscountsPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/adminDiscountsPage.png -------------------------------------------------------------------------------- /src/assets/adminOrdersPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/adminOrdersPage.png -------------------------------------------------------------------------------- /src/assets/adminProductsPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/adminProductsPage.png -------------------------------------------------------------------------------- /src/assets/adminSignInPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/adminSignInPage.png -------------------------------------------------------------------------------- /src/assets/adminSignUpPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/adminSignUpPage.png -------------------------------------------------------------------------------- /src/assets/adminUersPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/adminUersPage.png -------------------------------------------------------------------------------- /src/assets/cartPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/cartPage.png -------------------------------------------------------------------------------- /src/assets/ec-front-end-vue-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/ec-front-end-vue-logo.png -------------------------------------------------------------------------------- /src/assets/homePage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/homePage.png -------------------------------------------------------------------------------- /src/assets/index.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css?family=Noto+Sans+TC:300,400,700|Roboto+Slab:300,400,700&display=swap&subset=chinese-traditional'); 2 | 3 | /*Sidebar*/ 4 | * { 5 | font-family: 'Roboto Slab', 'Noto Sans TC', sans-serif; 6 | } 7 | 8 | .sidebar { 9 | position: fixed; 10 | top: 0; 11 | left: 0; 12 | bottom: 0; 13 | width: 140px; 14 | padding: 60px 0 0; 15 | margin-left: 8px; 16 | z-index: 10; 17 | box-shadow: inset -1px 0 0 rgba(0, 0, 0, 0.1); 18 | } -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/logo.png -------------------------------------------------------------------------------- /src/assets/orderCreatePage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/orderCreatePage.png -------------------------------------------------------------------------------- /src/assets/orderPagePaid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/orderPagePaid.png -------------------------------------------------------------------------------- /src/assets/orderPageUnPaid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/orderPageUnPaid.png -------------------------------------------------------------------------------- /src/assets/singleProduct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/assets/singleProduct.png -------------------------------------------------------------------------------- /src/components/CategoryTab.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 41 | 42 | 52 | -------------------------------------------------------------------------------- /src/components/Navbar.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | 97 | 98 | 133 | -------------------------------------------------------------------------------- /src/components/Pagination.vue: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ac-ec-website/ec-front-end-vue/8326b5d6b07b9865f2e63d3b7e21eb7f10b92177/src/components/Pagination.vue -------------------------------------------------------------------------------- /src/components/ProductDetail.vue: -------------------------------------------------------------------------------- 1 | 48 | 49 | 76 | -------------------------------------------------------------------------------- /src/components/ProductsCard.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | 79 | -------------------------------------------------------------------------------- /src/components/Searchbar.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 26 | -------------------------------------------------------------------------------- /src/components/SideCartPreview.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 44 | 45 | 63 | -------------------------------------------------------------------------------- /src/components/Spinner.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 63 | -------------------------------------------------------------------------------- /src/components/admin/AdminCouponForm.vue: -------------------------------------------------------------------------------- 1 |