├── static ├── .gitkeep ├── 1.jpg ├── icon.png ├── logo.png ├── ok-2.png ├── 九号平衡车.jpg ├── 小米体重秤.jpg ├── 小米米家对讲机.jpg ├── 小米路由器 3.jpg ├── 小米魔方控制器.jpg ├── 平衡车plus.jpg ├── 米兔儿童手表Q.jpg ├── 米兔定位电话.jpg ├── 米兔智能故事机.jpg ├── 米家IH电饭煲.jpg ├── 米家恒温电水壶.jpg ├── 米家扫地机器人.jpg ├── 米家智能摄像机.jpg ├── 小米空气净化器 2.jpg ├── 米兔儿童电话手表2.jpg ├── 米家声波电动牙刷.jpg ├── 米家小白智能摄像机.jpg ├── 米家飞利浦台灯二代.jpg ├── Yeelight床头灯.jpg ├── iHealth智能血压计.jpg ├── 米家PM2.5检测仪.jpg ├── 米家压力 IH 电饭煲.jpg ├── 米家空气净化器Pro.jpg ├── 九号平衡车!220x220.jpg ├── 小方摄像机!220x220.jpg ├── 小方智能摄像机 1080P.jpg ├── 小米AI音箱!220x220.jpg ├── 米家 iHealth 血压计.jpg ├── 米家感应夜灯!220x220.jpg ├── 小米路由器3C!220x220.jpg ├── 米家行车记录仪!220x220.jpg ├── 米家iHealth血压计!220x220.jpg └── loading-svg │ ├── loading-bars.svg │ └── loading-spinning-bubbles.svg ├── server ├── views │ ├── error.html │ └── index.html ├── public │ └── stylesheets │ │ └── style.css ├── routes │ ├── index.js │ ├── goods.js │ └── users.js ├── models │ ├── goods.js │ └── user.js ├── package.json ├── util │ └── util.js ├── bin │ └── www ├── app.js └── package-lock.json ├── config ├── prod.env.js ├── dev.env.js └── index.js ├── resource ├── img │ ├── 1.jpg │ ├── icon.png │ ├── logo.png │ └── ok-2.png ├── css │ ├── nav-bread.css │ ├── nav-footer.css │ ├── nav-header.css │ ├── login.css │ └── goods-list.css └── views │ ├── orderSuccess.html │ ├── goodsList.html │ ├── orderConfirm.html │ ├── address.html │ └── cart.html ├── src ├── assets │ ├── logo.png │ └── css │ │ ├── nav-bread.css │ │ ├── nav-footer.css │ │ ├── nav-header.css │ │ ├── login.css │ │ └── goods-list.css ├── App.vue ├── util │ └── currency.js ├── components │ ├── Modal.vue │ ├── NavBread.vue │ ├── HelloWorld.vue │ ├── NavFooter.vue │ └── NavHeader.vue ├── router │ └── index.js ├── main.js └── views │ ├── OrderSuccess.vue │ ├── OrderConfirm.vue │ ├── GoodsList.vue │ ├── Address.vue │ └── Cart.vue ├── .editorconfig ├── .gitignore ├── .postcssrc.js ├── index.html ├── .babelrc ├── README.md ├── mock └── goods.json └── package.json /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/views/error.html: -------------------------------------------------------------------------------- 1 |
Welcome to <%= title %>
10 | 11 | 12 | -------------------------------------------------------------------------------- /server/models/goods.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose') 2 | var Schema = mongoose.Schema; 3 | 4 | var produtSchema = new Schema({ 5 | "productId":{type:String}, 6 | "productName":String, 7 | "salePrice":Number, 8 | "checked":String, 9 | "productNum":Number, 10 | "productImage":String 11 | }); 12 | 13 | module.exports = mongoose.model('Good',produtSchema); 14 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-runtime"], 12 | "env": { 13 | "test": { 14 | "presets": ["env", "stage-2"], 15 | "plugins": ["istanbul"] 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "start": "node ./bin/www" 7 | }, 8 | "dependencies": { 9 | "body-parser": "~1.18.2", 10 | "cookie-parser": "~1.4.3", 11 | "debug": "~2.6.9", 12 | "ejs": "~2.5.7", 13 | "express": "~4.15.5", 14 | "mongoose": "^4.13.0", 15 | "morgan": "~1.9.0", 16 | "serve-favicon": "~2.4.5" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vue2-shop-lesson 2 | 3 | > A Vue.js project 4 | 5 | ## Build Setup 6 | 7 | ``` bash 8 | # install dependencies 9 | npm install 10 | 11 | # serve with hot reload at localhost:8080 12 | npm run dev 13 | 14 | # build for production with minification 15 | npm run build 16 | 17 | # build for production and view the bundle analyzer report 18 | npm run build --report 19 | ``` 20 | 21 | For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader). 22 | -------------------------------------------------------------------------------- /server/models/user.js: -------------------------------------------------------------------------------- 1 | var mongoose = require('mongoose'); 2 | 3 | var userSchema = new mongoose.Schema({ 4 | "userId":String, 5 | "userName":String, 6 | "userPwd":String, 7 | "orderList":Array, 8 | "cartList":[ 9 | { 10 | "productId":String, 11 | "productName":String, 12 | "salePrice":String, 13 | "productImage":String, 14 | "checked":String, 15 | "productNum":String 16 | } 17 | ], 18 | "addressList":[ 19 | { 20 | "addressId": String, 21 | "userName": String, 22 | "streetName": String, 23 | "postCode": Number, 24 | "tel": Number, 25 | "isDefault": Boolean 26 | } 27 | ] 28 | }); 29 | 30 | module.exports = mongoose.model("User",userSchema); 31 | -------------------------------------------------------------------------------- /resource/css/nav-bread.css: -------------------------------------------------------------------------------- 1 | /** the page max width **/ 2 | .container { 3 | max-width: 1280px; 4 | margin: 0 auto; 5 | padding: 0 10px; 6 | } 7 | 8 | .nav-breadcrumb-wrap { 9 | background: #f0f0f0; 10 | } 11 | 12 | 13 | /** 面包屑 **/ 14 | .nav-breadcrumb { 15 | padding: 10px 0; 16 | line-height: 25px; 17 | font-size: 14px; 18 | } 19 | 20 | .nav-breadcrumb a { 21 | position: relative; 22 | margin-right: 16px; 23 | color: #999; 24 | } 25 | 26 | .nav-breadcrumb a:after { 27 | position: absolute; 28 | top: 3px; 29 | right: -12px; 30 | content: "/"; 31 | line-height: 1.2; 32 | } 33 | 34 | .nav-breadcrumb a:hover { 35 | color: #d1434a; 36 | } 37 | 38 | .nav-breadcrumb span { 39 | color: #d1434a; 40 | } 41 | -------------------------------------------------------------------------------- /src/assets/css/nav-bread.css: -------------------------------------------------------------------------------- 1 | /** the page max width **/ 2 | .container { 3 | max-width: 1280px; 4 | margin: 0 auto; 5 | padding: 0 10px; 6 | } 7 | 8 | .nav-breadcrumb-wrap { 9 | background: #f0f0f0; 10 | } 11 | 12 | 13 | /** 面包屑 **/ 14 | .nav-breadcrumb { 15 | padding: 10px 0; 16 | line-height: 25px; 17 | font-size: 14px; 18 | } 19 | 20 | .nav-breadcrumb a { 21 | position: relative; 22 | margin-right: 16px; 23 | color: #999; 24 | } 25 | 26 | .nav-breadcrumb a:after { 27 | position: absolute; 28 | top: 3px; 29 | right: -12px; 30 | content: "/"; 31 | line-height: 1.2; 32 | } 33 | 34 | .nav-breadcrumb a:hover { 35 | color: #d1434a; 36 | } 37 | 38 | .nav-breadcrumb span { 39 | color: #d1434a; 40 | } 41 | -------------------------------------------------------------------------------- /src/util/currency.js: -------------------------------------------------------------------------------- 1 | const digitsRE = /(\d{3})(?=\d)/g 2 | 3 | export function currency (value, currency, decimals) { 4 | value = parseFloat(value) 5 | if (!isFinite(value) || (!value && value !== 0)) return '' 6 | currency = currency != null ? currency : '¥' 7 | decimals = decimals != null ? decimals : 2 8 | var stringified = Math.abs(value).toFixed(decimals) 9 | var _int = decimals 10 | ? stringified.slice(0, -1 - decimals) 11 | : stringified 12 | var i = _int.length % 3 13 | var head = i > 0 14 | ? (_int.slice(0, i) + (_int.length > 3 ? ',' : '')) 15 | : '' 16 | var _float = decimals 17 | ? stringified.slice(-1 - decimals) 18 | : '' 19 | var sign = value < 0 ? '-' : '' 20 | return sign + currency + head + 21 | _int.slice(i).replace(digitsRE, '$1,') + 22 | _float 23 | } 24 | -------------------------------------------------------------------------------- /server/util/util.js: -------------------------------------------------------------------------------- 1 | Date.prototype.Format = function (fmt) { 2 | var o = { 3 | "M+": this.getMonth() + 1, //月份 4 | "d+": this.getDate(), //日 5 | "h+": this.getHours(), //小时 6 | "m+": this.getMinutes(), //分 7 | "s+": this.getSeconds(), //秒 8 | "q+": Math.floor((this.getMonth() + 3) / 3), //季度 9 | "S": this.getMilliseconds() //毫秒 10 | }; 11 | if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); 12 | for (var k in o) 13 | if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); 14 | return fmt; 15 | } 16 | 17 | module.exports = {}; 18 | 19 | var now = new Date(); 20 | var data = now.Format("yyyyMMddhhmmss"); 21 | console.log(now); 22 | console.log(data); 23 | -------------------------------------------------------------------------------- /resource/css/nav-footer.css: -------------------------------------------------------------------------------- 1 | .footer { 2 | background-color: #f5f7fc; 3 | color: #333; 4 | position: relative; 5 | } 6 | 7 | .footer__wrap { 8 | max-width: 1280px; 9 | margin: 0 auto; 10 | } 11 | 12 | .footer__secondary { 13 | border-top: 1px solid rgba(51, 51, 51, 0.15); 14 | } 15 | 16 | .footer__secondary .footer__inner { 17 | height: 100px; 18 | } 19 | 20 | .footer__inner { 21 | max-width: 1280px; 22 | margin: 0 auto; 23 | position: relative; 24 | } 25 | 26 | .footer__secondary__nav { 27 | position: absolute; 28 | top: 50%; 29 | -webkit-transform: translateY(-50%); 30 | -ms-transform: translateY(-50%); 31 | transform: translateY(-50%); 32 | right: 36px; 33 | } 34 | 35 | .footer__secondary__nav a, 36 | .footer__secondary__nav span { 37 | color: #ada9a5; 38 | margin-left: 3.3125em; 39 | } 40 | 41 | .footer__secondary__nav a:first-child, 42 | .footer__secondary__nav span:first-child { 43 | margin-left: 0; 44 | } 45 | -------------------------------------------------------------------------------- /src/assets/css/nav-footer.css: -------------------------------------------------------------------------------- 1 | .footer { 2 | background-color: #f5f7fc; 3 | color: #333; 4 | position: relative; 5 | } 6 | 7 | .footer__wrap { 8 | max-width: 1280px; 9 | margin: 0 auto; 10 | } 11 | 12 | .footer__secondary { 13 | border-top: 1px solid rgba(51, 51, 51, 0.15); 14 | } 15 | 16 | .footer__secondary .footer__inner { 17 | height: 100px; 18 | } 19 | 20 | .footer__inner { 21 | max-width: 1280px; 22 | margin: 0 auto; 23 | position: relative; 24 | } 25 | 26 | .footer__secondary__nav { 27 | position: absolute; 28 | top: 50%; 29 | -webkit-transform: translateY(-50%); 30 | -ms-transform: translateY(-50%); 31 | transform: translateY(-50%); 32 | right: 36px; 33 | } 34 | 35 | .footer__secondary__nav a, 36 | .footer__secondary__nav span { 37 | color: #ada9a5; 38 | margin-left: 3.3125em; 39 | } 40 | 41 | .footer__secondary__nav a:first-child, 42 | .footer__secondary__nav span:first-child { 43 | margin-left: 0; 44 | } 45 | -------------------------------------------------------------------------------- /src/components/Modal.vue: -------------------------------------------------------------------------------- 1 | 2 |
27 | 订单号:{{orderId}} 28 | 应付金额:{{orderTotal|currency('¥')}} 29 |
30 |61 | 请先登录,否则无法加入到购物车中! 62 |
63 |69 | 72 | 加入购物车成! 73 |
74 |自签收后7天内退货,15天内换货,可享1次上门取件服务
116 |129 | 您是否确认要删除此地址? 130 |
131 | 135 |你确认要删除此条数据吗?
137 | 141 |
123 | 新增收货地址
145 |自签收后7天内退货,15天内换货,可享1次上门取件服务
176 |