├── .browserslistrc ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .prettierrc.json ├── README.md ├── babel.config.js ├── img ├── bgc │ └── bgc.jpg ├── good │ ├── pic-1.jpg │ ├── pic-2.jpg │ ├── pic-3.jpg │ ├── pic-4.jpg │ ├── pic-5.jpg │ ├── pic-6.jpg │ └── pic-7.jpg └── swipe │ ├── swipe-1.jpg │ ├── swipe-2.jpg │ ├── swipe-3.jpg │ ├── swipe-4.jpg │ ├── swipe1-1.jpg │ ├── swipe1-2.jpg │ └── swipe1-3.jpg ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── bars.svg ├── favicon.ico ├── index.html └── method-draw-image.svg ├── screenshots ├── address.png ├── cart.png ├── good.png ├── index.png ├── login.png ├── order.png ├── orderlist.png ├── qrcode.png ├── reg.png └── user.png ├── server ├── app.js ├── bin │ └── www ├── db │ └── connect.js ├── package-lock.json ├── package.json ├── public │ └── stylesheets │ │ └── style.css ├── routes │ ├── index.js │ └── users.js └── views │ ├── error.jade │ ├── index.jade │ └── layout.jade ├── sql └── vantstore.sql ├── src ├── App.vue ├── api │ └── api.js ├── components │ ├── backgroundImg │ │ └── backgroundImg.vue │ ├── github │ │ └── github.vue │ ├── goodItem │ │ └── goodItem.vue │ ├── scroll │ │ ├── scrollX.vue │ │ └── scrollY.vue │ └── tabItem │ │ └── tabItem.vue ├── images │ ├── bgc │ │ └── bgc.jpg │ ├── detail │ │ ├── detail-1.jpg │ │ ├── detail-2.jpg │ │ ├── detail-3.jpg │ │ ├── detail-4.jpg │ │ ├── detail-5.jpg │ │ └── detail-6.jpg │ ├── good │ │ ├── pic-1.jpg │ │ ├── pic-2.jpg │ │ ├── pic-3.jpg │ │ ├── pic-4.jpg │ │ ├── pic-5.jpg │ │ ├── pic-6.jpg │ │ └── pic-7.jpg │ └── swipe │ │ ├── swipe-1.jpg │ │ ├── swipe-2.jpg │ │ ├── swipe-3.jpg │ │ ├── swipe-4.jpg │ │ ├── swipe1-1.jpg │ │ ├── swipe1-2.jpg │ │ └── swipe1-3.jpg ├── main.js ├── router │ └── index.js ├── store │ ├── getters.js │ ├── index.js │ ├── mutations-types.js │ ├── mutations.js │ └── state.js ├── util │ ├── http.js │ └── util.js └── views │ ├── AddressList │ └── AddressList.vue │ ├── Cart │ └── Cart.vue │ ├── EditAddress │ └── EditAddress.vue │ ├── Good │ └── Good.vue │ ├── Home │ └── Home.vue │ ├── Login │ └── Login.vue │ ├── NotFound │ └── NotFound.vue │ ├── Order │ └── Order.vue │ ├── OrderList │ └── OrderList.vue │ ├── Reg │ └── Reg.vue │ ├── Tab │ └── Tab.vue │ └── User │ └── User.vue └── vue.config.js /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 8 4 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | -------------------------------------------------------------------------------- /.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 | "no-undef": 0, 11 | "no-unused-vars": 0 12 | }, 13 | parserOptions: { 14 | parser: "babel-eslint" 15 | } 16 | }; -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "printWidth": 120 4 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vant-store 2 | 一个商城Demo, 前端使用vant有赞UI,vue实现, 后端使用mysql,express实现。 3 | 4 | # 实现的功能 5 | 6 | 1. 登录/注册 7 | 2. 商品列表 8 | 3. 商品详情 9 | 4. 购物车 10 | 5. 收货地址 11 | 6. 订单 12 | 13 | # 项目预览 14 | 查看Demo [点这里](http://182.254.192.62/vue-vant-store) 15 | 16 | 17 | 在手机上效果更好,扫一扫体验 18 | 19 | ![二维码](https://github.com/pwx123/vue-vant-store/raw/master/screenshots/qrcode.png) 20 | 21 | # 前端 22 | 23 | ## 项目依赖 24 | 25 |

26 | 27 | Build 28 | 29 | 30 | Vue 31 | 32 | 33 | Vuex 34 | 35 | 36 | Vue-Router 37 | 38 | 39 | Axios 40 | 41 | 42 | Vant 43 | 44 | 45 | Better-Scroll 46 | 47 | 48 | Crypto-Js 49 | 50 |

51 | 52 | ## 项目运行 53 | 54 | * 将 `img`文件夹复制到 `http://127.0.0.1:80` 服务器下即可查看图片 55 | * 数据库数据及文件在 `sql` 目录下 56 | 57 | ``` bash 58 | # 安装依赖 59 | npm install 60 | 61 | # 开发预览 62 | npm run serve 63 | 64 | # 打包发布 65 | npm run build 66 | ``` 67 | 68 | # 后端 69 | 70 | ## 项目依赖 71 | 72 |

73 | 74 | Build 75 | 76 | 77 | Express 78 | 79 | 80 | Mysql 81 | 82 |

83 | 84 | ## 项目运行 85 | 86 | ``` bash 87 | # 进入目录 88 | cd server 89 | 90 | # 安装依赖 91 | npm install 92 | 93 | # 启动服务器 94 | npm start 95 | 96 | ``` 97 | # 截图 98 | 99 | 100 | ### 首页 101 | ![首页](https://github.com/pwx123/vue-vant-store/raw/master/screenshots/index.png) 102 | ### 商品详情 103 | ![商品详情](https://github.com/pwx123/vue-vant-store/raw/master/screenshots/good.png) 104 | ### 购物车 105 | ![购物车](https://github.com/pwx123/vue-vant-store/raw/master/screenshots/cart.png) 106 | 107 | ### 订单 108 | ![订单](https://github.com/pwx123/vue-vant-store/raw/master/screenshots/order.png) 109 | ![订单列表](https://github.com/pwx123/vue-vant-store/raw/master/screenshots/orderlist.png) 110 | ### 地址 111 | ![地址](https://github.com/pwx123/vue-vant-store/raw/master/screenshots/address.png) 112 | ### 登录/注册 113 | ![登录](https://github.com/pwx123/vue-vant-store/raw/master/screenshots/login.png) 114 | ![注册](https://github.com/pwx123/vue-vant-store/raw/master/screenshots/reg.png) 115 | ### 用户 116 | ![用户](https://github.com/pwx123/vue-vant-store/raw/master/screenshots/user.png) 117 | 118 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ["@vue/app"] 3 | }; 4 | -------------------------------------------------------------------------------- /img/bgc/bgc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/bgc/bgc.jpg -------------------------------------------------------------------------------- /img/good/pic-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/good/pic-1.jpg -------------------------------------------------------------------------------- /img/good/pic-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/good/pic-2.jpg -------------------------------------------------------------------------------- /img/good/pic-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/good/pic-3.jpg -------------------------------------------------------------------------------- /img/good/pic-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/good/pic-4.jpg -------------------------------------------------------------------------------- /img/good/pic-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/good/pic-5.jpg -------------------------------------------------------------------------------- /img/good/pic-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/good/pic-6.jpg -------------------------------------------------------------------------------- /img/good/pic-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/good/pic-7.jpg -------------------------------------------------------------------------------- /img/swipe/swipe-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/swipe/swipe-1.jpg -------------------------------------------------------------------------------- /img/swipe/swipe-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/swipe/swipe-2.jpg -------------------------------------------------------------------------------- /img/swipe/swipe-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/swipe/swipe-3.jpg -------------------------------------------------------------------------------- /img/swipe/swipe-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/swipe/swipe-4.jpg -------------------------------------------------------------------------------- /img/swipe/swipe1-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/swipe/swipe1-1.jpg -------------------------------------------------------------------------------- /img/swipe/swipe1-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/swipe/swipe1-2.jpg -------------------------------------------------------------------------------- /img/swipe/swipe1-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/img/swipe/swipe1-3.jpg -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vant-store", 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 | "axios": "^0.18.0", 12 | "better-scroll": "^1.12.6", 13 | "crypto-js": "^3.1.9-1", 14 | "stylus": "^0.54.5", 15 | "stylus-loader": "^3.0.2", 16 | "vant": "^1.2.1", 17 | "vue": "^2.5.17", 18 | "vue-router": "^3.0.1", 19 | "vuex": "^3.0.1" 20 | }, 21 | "devDependencies": { 22 | "@vue/cli-plugin-babel": "^3.0.1", 23 | "@vue/cli-plugin-eslint": "^3.0.1", 24 | "@vue/cli-service": "^3.0.1", 25 | "@vue/eslint-config-prettier": "^3.0.1", 26 | "prettier": "^1.14.2", 27 | "vue-template-compiler": "^2.5.17" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | }; 6 | -------------------------------------------------------------------------------- /public/bars.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 11 | 12 | 13 | 17 | 21 | 22 | 23 | 27 | 31 | 32 | 33 | 37 | 41 | 42 | 43 | 47 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | vant-store 10 | 18 | 19 | 20 | 21 | 24 |
25 |
26 | 27 |
28 |
29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /public/method-draw-image.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | background 5 | 6 | 7 | 8 | 9 | 10 | 11 | Layer 1 12 | 13 | -------------------------------------------------------------------------------- /screenshots/address.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/screenshots/address.png -------------------------------------------------------------------------------- /screenshots/cart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/screenshots/cart.png -------------------------------------------------------------------------------- /screenshots/good.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/screenshots/good.png -------------------------------------------------------------------------------- /screenshots/index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/screenshots/index.png -------------------------------------------------------------------------------- /screenshots/login.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/screenshots/login.png -------------------------------------------------------------------------------- /screenshots/order.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/screenshots/order.png -------------------------------------------------------------------------------- /screenshots/orderlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/screenshots/orderlist.png -------------------------------------------------------------------------------- /screenshots/qrcode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/screenshots/qrcode.png -------------------------------------------------------------------------------- /screenshots/reg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/screenshots/reg.png -------------------------------------------------------------------------------- /screenshots/user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/screenshots/user.png -------------------------------------------------------------------------------- /server/app.js: -------------------------------------------------------------------------------- 1 | var createError = require('http-errors'); 2 | var express = require('express'); 3 | var path = require('path'); 4 | var cookieParser = require('cookie-parser'); 5 | var logger = require('morgan'); 6 | 7 | var indexRouter = require('./routes/index'); 8 | var usersRouter = require('./routes/users'); 9 | 10 | var app = express(); 11 | 12 | // view engine setup 13 | app.set('views', path.join(__dirname, 'views')); 14 | app.set('view engine', 'jade'); 15 | 16 | app.use(logger('dev')); 17 | app.use(express.json()); 18 | app.use( 19 | express.urlencoded({ 20 | extended: false 21 | }) 22 | ); 23 | app.use(cookieParser()); 24 | app.use(express.static(path.join(__dirname, 'public'))); 25 | app.all('*', function(req, res, next) { 26 | res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:8080'); 27 | res.header('Access-Control-Allow-Headers', 'X-Requested-With,Content-Type'); 28 | res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS'); 29 | res.header('Content-Type', 'application/json;charset=utf-8'); 30 | res.header('Access-Control-Allow-Credentials', true); 31 | if (req.method == 'OPTIONS') { 32 | res.send(200); 33 | } else { 34 | next(); 35 | } 36 | }); 37 | app.use(function(req, res, next) { 38 | if (req.cookies.username) { 39 | next(); 40 | } else { 41 | var url = req.originalUrl; 42 | if ( 43 | url === '/login' || 44 | url === '/reg' || 45 | url === '/hotsale' || 46 | url === '/salegroup' || 47 | url === '/discover' || 48 | url === '/hotsale' 49 | ) { 50 | next(); 51 | } else { 52 | res.status(401).json({ 53 | value: '401' 54 | }); 55 | } 56 | } 57 | }); 58 | app.use('/', indexRouter); 59 | app.use('/users', usersRouter); 60 | 61 | // catch 404 and forward to error handler 62 | app.use(function(req, res, next) { 63 | next(createError(404)); 64 | }); 65 | 66 | // error handler 67 | app.use(function(err, req, res, next) { 68 | // set locals, only providing error in development 69 | console.log(err.message) 70 | res.locals.message = err.message; 71 | res.locals.error = req.app.get('env') === 'development' ? err : {}; 72 | 73 | // render the error page 74 | res.status(err.status || 500); 75 | res.render('error'); 76 | }); 77 | 78 | module.exports = app; 79 | -------------------------------------------------------------------------------- /server/bin/www: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | /** 4 | * Module dependencies. 5 | */ 6 | 7 | var app = require('../app'); 8 | var debug = require('debug')('server:server'); 9 | var http = require('http'); 10 | 11 | /** 12 | * Get port from environment and store in Express. 13 | */ 14 | 15 | var port = normalizePort(process.env.PORT || '3000'); 16 | app.set('port', port); 17 | 18 | /** 19 | * Create HTTP server. 20 | */ 21 | 22 | var server = http.createServer(app); 23 | 24 | /** 25 | * Listen on provided port, on all network interfaces. 26 | */ 27 | 28 | server.listen(port); 29 | server.on('error', onError); 30 | server.on('listening', onListening); 31 | 32 | /** 33 | * Normalize a port into a number, string, or false. 34 | */ 35 | 36 | function normalizePort(val) { 37 | var port = parseInt(val, 10); 38 | 39 | if (isNaN(port)) { 40 | // named pipe 41 | return val; 42 | } 43 | 44 | if (port >= 0) { 45 | // port number 46 | return port; 47 | } 48 | 49 | return false; 50 | } 51 | 52 | /** 53 | * Event listener for HTTP server "error" event. 54 | */ 55 | 56 | function onError(error) { 57 | if (error.syscall !== 'listen') { 58 | throw error; 59 | } 60 | 61 | var bind = typeof port === 'string' 62 | ? 'Pipe ' + port 63 | : 'Port ' + port; 64 | 65 | // handle specific listen errors with friendly messages 66 | switch (error.code) { 67 | case 'EACCES': 68 | console.error(bind + ' requires elevated privileges'); 69 | process.exit(1); 70 | break; 71 | case 'EADDRINUSE': 72 | console.error(bind + ' is already in use'); 73 | process.exit(1); 74 | break; 75 | default: 76 | throw error; 77 | } 78 | } 79 | 80 | /** 81 | * Event listener for HTTP server "listening" event. 82 | */ 83 | 84 | function onListening() { 85 | var addr = server.address(); 86 | var bind = typeof addr === 'string' 87 | ? 'pipe ' + addr 88 | : 'port ' + addr.port; 89 | debug('Listening on ' + bind); 90 | } 91 | -------------------------------------------------------------------------------- /server/db/connect.js: -------------------------------------------------------------------------------- 1 | var mysql = require('mysql'); 2 | var connection = mysql.createConnection({ 3 | host: 'localhost', 4 | user: 'root', 5 | password: '', 6 | database: 'vantstore' 7 | }); 8 | 9 | connection.connect(); 10 | 11 | module.exports = connection; 12 | -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "0.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "http://registry.npm.taobao.org/accepts/download/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "~2.1.18", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "acorn": { 17 | "version": "2.7.0", 18 | "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-2.7.0.tgz", 19 | "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" 20 | }, 21 | "acorn-globals": { 22 | "version": "1.0.9", 23 | "resolved": "http://registry.npm.taobao.org/acorn-globals/download/acorn-globals-1.0.9.tgz", 24 | "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", 25 | "requires": { 26 | "acorn": "^2.1.0" 27 | } 28 | }, 29 | "align-text": { 30 | "version": "0.1.4", 31 | "resolved": "http://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", 32 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 33 | "requires": { 34 | "kind-of": "^3.0.2", 35 | "longest": "^1.0.1", 36 | "repeat-string": "^1.5.2" 37 | } 38 | }, 39 | "amdefine": { 40 | "version": "1.0.1", 41 | "resolved": "http://registry.npm.taobao.org/amdefine/download/amdefine-1.0.1.tgz", 42 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" 43 | }, 44 | "array-flatten": { 45 | "version": "1.1.1", 46 | "resolved": "http://registry.npm.taobao.org/array-flatten/download/array-flatten-1.1.1.tgz", 47 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 48 | }, 49 | "asap": { 50 | "version": "1.0.0", 51 | "resolved": "http://registry.npm.taobao.org/asap/download/asap-1.0.0.tgz", 52 | "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" 53 | }, 54 | "basic-auth": { 55 | "version": "2.0.0", 56 | "resolved": "http://registry.npm.taobao.org/basic-auth/download/basic-auth-2.0.0.tgz", 57 | "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", 58 | "requires": { 59 | "safe-buffer": "5.1.1" 60 | } 61 | }, 62 | "bignumber.js": { 63 | "version": "4.1.0", 64 | "resolved": "http://registry.npm.taobao.org/bignumber.js/download/bignumber.js-4.1.0.tgz", 65 | "integrity": "sha1-228UBnwUC9RmJIFaeRbJLZtsJLE=" 66 | }, 67 | "body-parser": { 68 | "version": "1.18.2", 69 | "resolved": "http://registry.npm.taobao.org/body-parser/download/body-parser-1.18.2.tgz", 70 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 71 | "requires": { 72 | "bytes": "3.0.0", 73 | "content-type": "~1.0.4", 74 | "debug": "2.6.9", 75 | "depd": "~1.1.1", 76 | "http-errors": "~1.6.2", 77 | "iconv-lite": "0.4.19", 78 | "on-finished": "~2.3.0", 79 | "qs": "6.5.1", 80 | "raw-body": "2.3.2", 81 | "type-is": "~1.6.15" 82 | } 83 | }, 84 | "bytes": { 85 | "version": "3.0.0", 86 | "resolved": "http://registry.npm.taobao.org/bytes/download/bytes-3.0.0.tgz", 87 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 88 | }, 89 | "camelcase": { 90 | "version": "1.2.1", 91 | "resolved": "http://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz", 92 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" 93 | }, 94 | "center-align": { 95 | "version": "0.1.3", 96 | "resolved": "http://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", 97 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 98 | "requires": { 99 | "align-text": "^0.1.3", 100 | "lazy-cache": "^1.0.3" 101 | } 102 | }, 103 | "character-parser": { 104 | "version": "1.2.1", 105 | "resolved": "http://registry.npm.taobao.org/character-parser/download/character-parser-1.2.1.tgz", 106 | "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" 107 | }, 108 | "clean-css": { 109 | "version": "3.4.28", 110 | "resolved": "http://registry.npm.taobao.org/clean-css/download/clean-css-3.4.28.tgz", 111 | "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=", 112 | "requires": { 113 | "commander": "2.8.x", 114 | "source-map": "0.4.x" 115 | }, 116 | "dependencies": { 117 | "commander": { 118 | "version": "2.8.1", 119 | "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.8.1.tgz", 120 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", 121 | "requires": { 122 | "graceful-readlink": ">= 1.0.0" 123 | } 124 | } 125 | } 126 | }, 127 | "cliui": { 128 | "version": "2.1.0", 129 | "resolved": "http://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz", 130 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 131 | "requires": { 132 | "center-align": "^0.1.1", 133 | "right-align": "^0.1.1", 134 | "wordwrap": "0.0.2" 135 | }, 136 | "dependencies": { 137 | "wordwrap": { 138 | "version": "0.0.2", 139 | "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", 140 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" 141 | } 142 | } 143 | }, 144 | "commander": { 145 | "version": "2.6.0", 146 | "resolved": "http://registry.npm.taobao.org/commander/download/commander-2.6.0.tgz", 147 | "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" 148 | }, 149 | "constantinople": { 150 | "version": "3.0.2", 151 | "resolved": "http://registry.npm.taobao.org/constantinople/download/constantinople-3.0.2.tgz", 152 | "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", 153 | "requires": { 154 | "acorn": "^2.1.0" 155 | } 156 | }, 157 | "content-disposition": { 158 | "version": "0.5.2", 159 | "resolved": "http://registry.npm.taobao.org/content-disposition/download/content-disposition-0.5.2.tgz", 160 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 161 | }, 162 | "content-type": { 163 | "version": "1.0.4", 164 | "resolved": "http://registry.npm.taobao.org/content-type/download/content-type-1.0.4.tgz", 165 | "integrity": "sha1-4TjMdeBAxyexlm/l5fjJruJW/js=" 166 | }, 167 | "cookie": { 168 | "version": "0.3.1", 169 | "resolved": "http://registry.npm.taobao.org/cookie/download/cookie-0.3.1.tgz", 170 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 171 | }, 172 | "cookie-parser": { 173 | "version": "1.4.3", 174 | "resolved": "http://registry.npm.taobao.org/cookie-parser/download/cookie-parser-1.4.3.tgz", 175 | "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", 176 | "requires": { 177 | "cookie": "0.3.1", 178 | "cookie-signature": "1.0.6" 179 | } 180 | }, 181 | "cookie-signature": { 182 | "version": "1.0.6", 183 | "resolved": "http://registry.npm.taobao.org/cookie-signature/download/cookie-signature-1.0.6.tgz", 184 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 185 | }, 186 | "core-util-is": { 187 | "version": "1.0.2", 188 | "resolved": "http://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", 189 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 190 | }, 191 | "css": { 192 | "version": "1.0.8", 193 | "resolved": "http://registry.npm.taobao.org/css/download/css-1.0.8.tgz", 194 | "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", 195 | "requires": { 196 | "css-parse": "1.0.4", 197 | "css-stringify": "1.0.5" 198 | } 199 | }, 200 | "css-parse": { 201 | "version": "1.0.4", 202 | "resolved": "http://registry.npm.taobao.org/css-parse/download/css-parse-1.0.4.tgz", 203 | "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" 204 | }, 205 | "css-stringify": { 206 | "version": "1.0.5", 207 | "resolved": "http://registry.npm.taobao.org/css-stringify/download/css-stringify-1.0.5.tgz", 208 | "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" 209 | }, 210 | "debug": { 211 | "version": "2.6.9", 212 | "resolved": "http://registry.npm.taobao.org/debug/download/debug-2.6.9.tgz", 213 | "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", 214 | "requires": { 215 | "ms": "2.0.0" 216 | } 217 | }, 218 | "decamelize": { 219 | "version": "1.2.0", 220 | "resolved": "http://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", 221 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 222 | }, 223 | "depd": { 224 | "version": "1.1.2", 225 | "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.2.tgz", 226 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 227 | }, 228 | "destroy": { 229 | "version": "1.0.4", 230 | "resolved": "http://registry.npm.taobao.org/destroy/download/destroy-1.0.4.tgz", 231 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 232 | }, 233 | "ee-first": { 234 | "version": "1.1.1", 235 | "resolved": "http://registry.npm.taobao.org/ee-first/download/ee-first-1.1.1.tgz", 236 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 237 | }, 238 | "encodeurl": { 239 | "version": "1.0.2", 240 | "resolved": "http://registry.npm.taobao.org/encodeurl/download/encodeurl-1.0.2.tgz", 241 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 242 | }, 243 | "escape-html": { 244 | "version": "1.0.3", 245 | "resolved": "http://registry.npm.taobao.org/escape-html/download/escape-html-1.0.3.tgz", 246 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 247 | }, 248 | "etag": { 249 | "version": "1.8.1", 250 | "resolved": "http://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", 251 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 252 | }, 253 | "express": { 254 | "version": "4.16.3", 255 | "resolved": "http://registry.npm.taobao.org/express/download/express-4.16.3.tgz", 256 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", 257 | "requires": { 258 | "accepts": "~1.3.5", 259 | "array-flatten": "1.1.1", 260 | "body-parser": "1.18.2", 261 | "content-disposition": "0.5.2", 262 | "content-type": "~1.0.4", 263 | "cookie": "0.3.1", 264 | "cookie-signature": "1.0.6", 265 | "debug": "2.6.9", 266 | "depd": "~1.1.2", 267 | "encodeurl": "~1.0.2", 268 | "escape-html": "~1.0.3", 269 | "etag": "~1.8.1", 270 | "finalhandler": "1.1.1", 271 | "fresh": "0.5.2", 272 | "merge-descriptors": "1.0.1", 273 | "methods": "~1.1.2", 274 | "on-finished": "~2.3.0", 275 | "parseurl": "~1.3.2", 276 | "path-to-regexp": "0.1.7", 277 | "proxy-addr": "~2.0.3", 278 | "qs": "6.5.1", 279 | "range-parser": "~1.2.0", 280 | "safe-buffer": "5.1.1", 281 | "send": "0.16.2", 282 | "serve-static": "1.13.2", 283 | "setprototypeof": "1.1.0", 284 | "statuses": "~1.4.0", 285 | "type-is": "~1.6.16", 286 | "utils-merge": "1.0.1", 287 | "vary": "~1.1.2" 288 | } 289 | }, 290 | "finalhandler": { 291 | "version": "1.1.1", 292 | "resolved": "http://registry.npm.taobao.org/finalhandler/download/finalhandler-1.1.1.tgz", 293 | "integrity": "sha1-7r9O2EAHnIP0JJA4ydcDAIMBsQU=", 294 | "requires": { 295 | "debug": "2.6.9", 296 | "encodeurl": "~1.0.2", 297 | "escape-html": "~1.0.3", 298 | "on-finished": "~2.3.0", 299 | "parseurl": "~1.3.2", 300 | "statuses": "~1.4.0", 301 | "unpipe": "~1.0.0" 302 | } 303 | }, 304 | "forwarded": { 305 | "version": "0.1.2", 306 | "resolved": "http://registry.npm.taobao.org/forwarded/download/forwarded-0.1.2.tgz", 307 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 308 | }, 309 | "fresh": { 310 | "version": "0.5.2", 311 | "resolved": "http://registry.npm.taobao.org/fresh/download/fresh-0.5.2.tgz", 312 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 313 | }, 314 | "graceful-readlink": { 315 | "version": "1.0.1", 316 | "resolved": "http://registry.npm.taobao.org/graceful-readlink/download/graceful-readlink-1.0.1.tgz", 317 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" 318 | }, 319 | "http-errors": { 320 | "version": "1.6.3", 321 | "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.3.tgz", 322 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 323 | "requires": { 324 | "depd": "~1.1.2", 325 | "inherits": "2.0.3", 326 | "setprototypeof": "1.1.0", 327 | "statuses": ">= 1.4.0 < 2" 328 | } 329 | }, 330 | "iconv-lite": { 331 | "version": "0.4.19", 332 | "resolved": "http://registry.npm.taobao.org/iconv-lite/download/iconv-lite-0.4.19.tgz", 333 | "integrity": "sha1-90aPYBNfXl2tM5nAqBvpoWA6CCs=" 334 | }, 335 | "inherits": { 336 | "version": "2.0.3", 337 | "resolved": "http://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", 338 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 339 | }, 340 | "ipaddr.js": { 341 | "version": "1.8.0", 342 | "resolved": "http://registry.npm.taobao.org/ipaddr.js/download/ipaddr.js-1.8.0.tgz", 343 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" 344 | }, 345 | "is-buffer": { 346 | "version": "1.1.6", 347 | "resolved": "http://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", 348 | "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" 349 | }, 350 | "is-promise": { 351 | "version": "2.1.0", 352 | "resolved": "http://registry.npm.taobao.org/is-promise/download/is-promise-2.1.0.tgz", 353 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 354 | }, 355 | "isarray": { 356 | "version": "1.0.0", 357 | "resolved": "http://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", 358 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 359 | }, 360 | "jade": { 361 | "version": "1.11.0", 362 | "resolved": "http://registry.npm.taobao.org/jade/download/jade-1.11.0.tgz", 363 | "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", 364 | "requires": { 365 | "character-parser": "1.2.1", 366 | "clean-css": "^3.1.9", 367 | "commander": "~2.6.0", 368 | "constantinople": "~3.0.1", 369 | "jstransformer": "0.0.2", 370 | "mkdirp": "~0.5.0", 371 | "transformers": "2.1.0", 372 | "uglify-js": "^2.4.19", 373 | "void-elements": "~2.0.1", 374 | "with": "~4.0.0" 375 | } 376 | }, 377 | "jstransformer": { 378 | "version": "0.0.2", 379 | "resolved": "http://registry.npm.taobao.org/jstransformer/download/jstransformer-0.0.2.tgz", 380 | "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", 381 | "requires": { 382 | "is-promise": "^2.0.0", 383 | "promise": "^6.0.1" 384 | } 385 | }, 386 | "kind-of": { 387 | "version": "3.2.2", 388 | "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", 389 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 390 | "requires": { 391 | "is-buffer": "^1.1.5" 392 | } 393 | }, 394 | "lazy-cache": { 395 | "version": "1.0.4", 396 | "resolved": "http://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz", 397 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" 398 | }, 399 | "longest": { 400 | "version": "1.0.1", 401 | "resolved": "http://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz", 402 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" 403 | }, 404 | "media-typer": { 405 | "version": "0.3.0", 406 | "resolved": "http://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", 407 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 408 | }, 409 | "merge-descriptors": { 410 | "version": "1.0.1", 411 | "resolved": "http://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", 412 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 413 | }, 414 | "methods": { 415 | "version": "1.1.2", 416 | "resolved": "http://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", 417 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 418 | }, 419 | "mime": { 420 | "version": "1.4.1", 421 | "resolved": "http://registry.npm.taobao.org/mime/download/mime-1.4.1.tgz", 422 | "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=" 423 | }, 424 | "mime-db": { 425 | "version": "1.36.0", 426 | "resolved": "http://registry.npm.taobao.org/mime-db/download/mime-db-1.36.0.tgz", 427 | "integrity": "sha1-UCBHjbPH/pOq17vMTc+GnEM2M5c=" 428 | }, 429 | "mime-types": { 430 | "version": "2.1.20", 431 | "resolved": "http://registry.npm.taobao.org/mime-types/download/mime-types-2.1.20.tgz", 432 | "integrity": "sha1-kwy3GdVx6QNzhSD4RwkRVIyizBk=", 433 | "requires": { 434 | "mime-db": "~1.36.0" 435 | } 436 | }, 437 | "minimist": { 438 | "version": "0.0.8", 439 | "resolved": "http://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", 440 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 441 | }, 442 | "mkdirp": { 443 | "version": "0.5.1", 444 | "resolved": "http://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", 445 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 446 | "requires": { 447 | "minimist": "0.0.8" 448 | } 449 | }, 450 | "morgan": { 451 | "version": "1.9.0", 452 | "resolved": "http://registry.npm.taobao.org/morgan/download/morgan-1.9.0.tgz", 453 | "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", 454 | "requires": { 455 | "basic-auth": "~2.0.0", 456 | "debug": "2.6.9", 457 | "depd": "~1.1.1", 458 | "on-finished": "~2.3.0", 459 | "on-headers": "~1.0.1" 460 | } 461 | }, 462 | "ms": { 463 | "version": "2.0.0", 464 | "resolved": "http://registry.npm.taobao.org/ms/download/ms-2.0.0.tgz", 465 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 466 | }, 467 | "mysql": { 468 | "version": "2.16.0", 469 | "resolved": "http://registry.npm.taobao.org/mysql/download/mysql-2.16.0.tgz", 470 | "integrity": "sha1-sjsiq13kT8LV0yvU9a9mU/xF4ro=", 471 | "requires": { 472 | "bignumber.js": "4.1.0", 473 | "readable-stream": "2.3.6", 474 | "safe-buffer": "5.1.2", 475 | "sqlstring": "2.3.1" 476 | }, 477 | "dependencies": { 478 | "safe-buffer": { 479 | "version": "5.1.2", 480 | "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.2.tgz", 481 | "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=" 482 | } 483 | } 484 | }, 485 | "negotiator": { 486 | "version": "0.6.1", 487 | "resolved": "http://registry.npm.taobao.org/negotiator/download/negotiator-0.6.1.tgz", 488 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 489 | }, 490 | "on-finished": { 491 | "version": "2.3.0", 492 | "resolved": "http://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", 493 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 494 | "requires": { 495 | "ee-first": "1.1.1" 496 | } 497 | }, 498 | "on-headers": { 499 | "version": "1.0.1", 500 | "resolved": "http://registry.npm.taobao.org/on-headers/download/on-headers-1.0.1.tgz", 501 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" 502 | }, 503 | "optimist": { 504 | "version": "0.3.7", 505 | "resolved": "http://registry.npm.taobao.org/optimist/download/optimist-0.3.7.tgz", 506 | "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", 507 | "requires": { 508 | "wordwrap": "~0.0.2" 509 | } 510 | }, 511 | "parseurl": { 512 | "version": "1.3.2", 513 | "resolved": "http://registry.npm.taobao.org/parseurl/download/parseurl-1.3.2.tgz", 514 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 515 | }, 516 | "path-to-regexp": { 517 | "version": "0.1.7", 518 | "resolved": "http://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz", 519 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 520 | }, 521 | "process-nextick-args": { 522 | "version": "2.0.0", 523 | "resolved": "http://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-2.0.0.tgz", 524 | "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=" 525 | }, 526 | "promise": { 527 | "version": "6.1.0", 528 | "resolved": "http://registry.npm.taobao.org/promise/download/promise-6.1.0.tgz", 529 | "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", 530 | "requires": { 531 | "asap": "~1.0.0" 532 | } 533 | }, 534 | "proxy-addr": { 535 | "version": "2.0.4", 536 | "resolved": "http://registry.npm.taobao.org/proxy-addr/download/proxy-addr-2.0.4.tgz", 537 | "integrity": "sha1-7PxzO/Iv+Mb0B/onUye5q2fki5M=", 538 | "requires": { 539 | "forwarded": "~0.1.2", 540 | "ipaddr.js": "1.8.0" 541 | } 542 | }, 543 | "qs": { 544 | "version": "6.5.1", 545 | "resolved": "http://registry.npm.taobao.org/qs/download/qs-6.5.1.tgz", 546 | "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=" 547 | }, 548 | "range-parser": { 549 | "version": "1.2.0", 550 | "resolved": "http://registry.npm.taobao.org/range-parser/download/range-parser-1.2.0.tgz", 551 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 552 | }, 553 | "raw-body": { 554 | "version": "2.3.2", 555 | "resolved": "http://registry.npm.taobao.org/raw-body/download/raw-body-2.3.2.tgz", 556 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 557 | "requires": { 558 | "bytes": "3.0.0", 559 | "http-errors": "1.6.2", 560 | "iconv-lite": "0.4.19", 561 | "unpipe": "1.0.0" 562 | }, 563 | "dependencies": { 564 | "depd": { 565 | "version": "1.1.1", 566 | "resolved": "http://registry.npm.taobao.org/depd/download/depd-1.1.1.tgz", 567 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 568 | }, 569 | "http-errors": { 570 | "version": "1.6.2", 571 | "resolved": "http://registry.npm.taobao.org/http-errors/download/http-errors-1.6.2.tgz", 572 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 573 | "requires": { 574 | "depd": "1.1.1", 575 | "inherits": "2.0.3", 576 | "setprototypeof": "1.0.3", 577 | "statuses": ">= 1.3.1 < 2" 578 | } 579 | }, 580 | "setprototypeof": { 581 | "version": "1.0.3", 582 | "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.0.3.tgz", 583 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 584 | } 585 | } 586 | }, 587 | "readable-stream": { 588 | "version": "2.3.6", 589 | "resolved": "http://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.6.tgz", 590 | "integrity": "sha1-sRwn2IuP8fvgcGQ8+UsMea4bCq8=", 591 | "requires": { 592 | "core-util-is": "~1.0.0", 593 | "inherits": "~2.0.3", 594 | "isarray": "~1.0.0", 595 | "process-nextick-args": "~2.0.0", 596 | "safe-buffer": "~5.1.1", 597 | "string_decoder": "~1.1.1", 598 | "util-deprecate": "~1.0.1" 599 | } 600 | }, 601 | "repeat-string": { 602 | "version": "1.6.1", 603 | "resolved": "http://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", 604 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 605 | }, 606 | "right-align": { 607 | "version": "0.1.3", 608 | "resolved": "http://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz", 609 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 610 | "requires": { 611 | "align-text": "^0.1.1" 612 | } 613 | }, 614 | "safe-buffer": { 615 | "version": "5.1.1", 616 | "resolved": "http://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz", 617 | "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" 618 | }, 619 | "send": { 620 | "version": "0.16.2", 621 | "resolved": "http://registry.npm.taobao.org/send/download/send-0.16.2.tgz", 622 | "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", 623 | "requires": { 624 | "debug": "2.6.9", 625 | "depd": "~1.1.2", 626 | "destroy": "~1.0.4", 627 | "encodeurl": "~1.0.2", 628 | "escape-html": "~1.0.3", 629 | "etag": "~1.8.1", 630 | "fresh": "0.5.2", 631 | "http-errors": "~1.6.2", 632 | "mime": "1.4.1", 633 | "ms": "2.0.0", 634 | "on-finished": "~2.3.0", 635 | "range-parser": "~1.2.0", 636 | "statuses": "~1.4.0" 637 | } 638 | }, 639 | "serve-static": { 640 | "version": "1.13.2", 641 | "resolved": "http://registry.npm.taobao.org/serve-static/download/serve-static-1.13.2.tgz", 642 | "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", 643 | "requires": { 644 | "encodeurl": "~1.0.2", 645 | "escape-html": "~1.0.3", 646 | "parseurl": "~1.3.2", 647 | "send": "0.16.2" 648 | } 649 | }, 650 | "setprototypeof": { 651 | "version": "1.1.0", 652 | "resolved": "http://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.0.tgz", 653 | "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=" 654 | }, 655 | "source-map": { 656 | "version": "0.4.4", 657 | "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.4.4.tgz", 658 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", 659 | "requires": { 660 | "amdefine": ">=0.0.4" 661 | } 662 | }, 663 | "sqlstring": { 664 | "version": "2.3.1", 665 | "resolved": "http://registry.npm.taobao.org/sqlstring/download/sqlstring-2.3.1.tgz", 666 | "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=" 667 | }, 668 | "statuses": { 669 | "version": "1.4.0", 670 | "resolved": "http://registry.npm.taobao.org/statuses/download/statuses-1.4.0.tgz", 671 | "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=" 672 | }, 673 | "string_decoder": { 674 | "version": "1.1.1", 675 | "resolved": "http://registry.npm.taobao.org/string_decoder/download/string_decoder-1.1.1.tgz", 676 | "integrity": "sha1-nPFhG6YmhdcDCunkujQUnDrwP8g=", 677 | "requires": { 678 | "safe-buffer": "~5.1.0" 679 | } 680 | }, 681 | "transformers": { 682 | "version": "2.1.0", 683 | "resolved": "http://registry.npm.taobao.org/transformers/download/transformers-2.1.0.tgz", 684 | "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", 685 | "requires": { 686 | "css": "~1.0.8", 687 | "promise": "~2.0", 688 | "uglify-js": "~2.2.5" 689 | }, 690 | "dependencies": { 691 | "is-promise": { 692 | "version": "1.0.1", 693 | "resolved": "http://registry.npm.taobao.org/is-promise/download/is-promise-1.0.1.tgz", 694 | "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" 695 | }, 696 | "promise": { 697 | "version": "2.0.0", 698 | "resolved": "http://registry.npm.taobao.org/promise/download/promise-2.0.0.tgz", 699 | "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", 700 | "requires": { 701 | "is-promise": "~1" 702 | } 703 | }, 704 | "source-map": { 705 | "version": "0.1.43", 706 | "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.1.43.tgz", 707 | "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", 708 | "requires": { 709 | "amdefine": ">=0.0.4" 710 | } 711 | }, 712 | "uglify-js": { 713 | "version": "2.2.5", 714 | "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.2.5.tgz", 715 | "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", 716 | "requires": { 717 | "optimist": "~0.3.5", 718 | "source-map": "~0.1.7" 719 | } 720 | } 721 | } 722 | }, 723 | "type-is": { 724 | "version": "1.6.16", 725 | "resolved": "http://registry.npm.taobao.org/type-is/download/type-is-1.6.16.tgz", 726 | "integrity": "sha1-+JzjQVQcZysl7nrjxz3uOyvlAZQ=", 727 | "requires": { 728 | "media-typer": "0.3.0", 729 | "mime-types": "~2.1.18" 730 | } 731 | }, 732 | "uglify-js": { 733 | "version": "2.8.29", 734 | "resolved": "http://registry.npm.taobao.org/uglify-js/download/uglify-js-2.8.29.tgz", 735 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", 736 | "requires": { 737 | "source-map": "~0.5.1", 738 | "uglify-to-browserify": "~1.0.0", 739 | "yargs": "~3.10.0" 740 | }, 741 | "dependencies": { 742 | "source-map": { 743 | "version": "0.5.7", 744 | "resolved": "http://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", 745 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 746 | } 747 | } 748 | }, 749 | "uglify-to-browserify": { 750 | "version": "1.0.2", 751 | "resolved": "http://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", 752 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 753 | "optional": true 754 | }, 755 | "unpipe": { 756 | "version": "1.0.0", 757 | "resolved": "http://registry.npm.taobao.org/unpipe/download/unpipe-1.0.0.tgz", 758 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 759 | }, 760 | "util-deprecate": { 761 | "version": "1.0.2", 762 | "resolved": "http://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", 763 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 764 | }, 765 | "utils-merge": { 766 | "version": "1.0.1", 767 | "resolved": "http://registry.npm.taobao.org/utils-merge/download/utils-merge-1.0.1.tgz", 768 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 769 | }, 770 | "vary": { 771 | "version": "1.1.2", 772 | "resolved": "http://registry.npm.taobao.org/vary/download/vary-1.1.2.tgz", 773 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 774 | }, 775 | "void-elements": { 776 | "version": "2.0.1", 777 | "resolved": "http://registry.npm.taobao.org/void-elements/download/void-elements-2.0.1.tgz", 778 | "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" 779 | }, 780 | "window-size": { 781 | "version": "0.1.0", 782 | "resolved": "http://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz", 783 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" 784 | }, 785 | "with": { 786 | "version": "4.0.3", 787 | "resolved": "http://registry.npm.taobao.org/with/download/with-4.0.3.tgz", 788 | "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", 789 | "requires": { 790 | "acorn": "^1.0.1", 791 | "acorn-globals": "^1.0.3" 792 | }, 793 | "dependencies": { 794 | "acorn": { 795 | "version": "1.2.2", 796 | "resolved": "http://registry.npm.taobao.org/acorn/download/acorn-1.2.2.tgz", 797 | "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" 798 | } 799 | } 800 | }, 801 | "wordwrap": { 802 | "version": "0.0.3", 803 | "resolved": "http://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz", 804 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" 805 | }, 806 | "yargs": { 807 | "version": "3.10.0", 808 | "resolved": "http://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz", 809 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 810 | "requires": { 811 | "camelcase": "^1.0.2", 812 | "cliui": "^2.1.0", 813 | "decamelize": "^1.0.0", 814 | "window-size": "0.1.0" 815 | } 816 | } 817 | } 818 | } 819 | -------------------------------------------------------------------------------- /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 | "cookie-parser": "~1.4.3", 10 | "debug": "~2.6.9", 11 | "express": "~4.16.0", 12 | "http-errors": "~1.6.2", 13 | "jade": "~1.11.0", 14 | "morgan": "~1.9.0", 15 | "mysql": "^2.16.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /server/public/stylesheets/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding: 50px; 3 | font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; 4 | } 5 | 6 | a { 7 | color: #00B7FF; 8 | } 9 | -------------------------------------------------------------------------------- /server/routes/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | var connection = require('../db/connect'); 4 | 5 | //登陆 6 | router.post('/login', function(req, res, next) { 7 | var userName = req.body.userName; 8 | var password = req.body.password; 9 | var sql = 'SELECT * FROM user WHERE Username=?'; 10 | var sqlParams = [userName]; 11 | connection.query(sql, sqlParams, function(err, result) { 12 | if (err) { 13 | res.json({ 14 | status: 500, 15 | msg: err, 16 | data: '' 17 | }); 18 | return; 19 | } 20 | if (result.length === 0) { 21 | res.json({ 22 | status: 0, 23 | msg: '用户名不存在', 24 | data: '' 25 | }); 26 | return; 27 | } 28 | if (password === result[0].Password) { 29 | res.cookie('username', result[0].Username, { 30 | path: '/', 31 | maxAge: 1000 * 60 * 60 * 365 32 | }); 33 | res.json({ 34 | status: 200, 35 | msg: 'success', 36 | data: '' 37 | }); 38 | } else { 39 | res.json({ 40 | status: 0, 41 | msg: '密码错误', 42 | data: '' 43 | }); 44 | } 45 | }); 46 | }); 47 | 48 | //注册 49 | router.post('/reg', function(req, res, next) { 50 | var userName = req.body.userName; 51 | var password = req.body.password; 52 | var sql = 'SELECT * FROM user WHERE Username=?'; 53 | var sqlParams = [userName]; 54 | connection.query(sql, sqlParams, function(err, result) { 55 | if (err) { 56 | res.json({ 57 | status: 500, 58 | msg: err, 59 | data: '' 60 | }); 61 | return; 62 | } 63 | if (result.length !== 0) { 64 | res.json({ 65 | status: 0, 66 | msg: '用户已存在!', 67 | data: '' 68 | }); 69 | return; 70 | } 71 | sql = 'INSERT INTO user(Username,Password) VALUES(?,?)'; 72 | sqlParams = [userName, password]; 73 | connection.query(sql, sqlParams, function(err, result) { 74 | if (err) { 75 | res.json({ 76 | status: 500, 77 | msg: err, 78 | data: '' 79 | }); 80 | return; 81 | } 82 | res.json({ 83 | status: 200, 84 | msg: 'success', 85 | data: '' 86 | }); 87 | }); 88 | }); 89 | }); 90 | // 热销商品 91 | router.post('/hotsale', function(req, res, next) { 92 | var sql = `SELECT * FROM good WHERE find_in_set('1',GoodItem)`; 93 | connection.query(sql, function(err, result) { 94 | if (err) { 95 | res.json({ 96 | status: 500, 97 | msg: err, 98 | data: '' 99 | }); 100 | return; 101 | } 102 | res.json({ 103 | status: 200, 104 | msg: 'success', 105 | data: result 106 | }); 107 | }); 108 | }); 109 | // 团购商品 110 | router.post('/salegroup', function(req, res, next) { 111 | var sql = `SELECT * FROM good WHERE find_in_set('2',GoodItem)`; 112 | connection.query(sql, function(err, result) { 113 | if (err) { 114 | res.json({ 115 | status: 500, 116 | msg: err, 117 | data: '' 118 | }); 119 | return; 120 | } 121 | res.json({ 122 | status: 200, 123 | msg: 'success', 124 | data: result 125 | }); 126 | }); 127 | }); 128 | // 发现 129 | router.post('/discover', function(req, res, next) { 130 | var sql = `SELECT * FROM good WHERE find_in_set('3',GoodItem)`; 131 | connection.query(sql, function(err, result) { 132 | if (err) { 133 | res.json({ 134 | status: 500, 135 | msg: err, 136 | data: '' 137 | }); 138 | return; 139 | } 140 | res.json({ 141 | status: 200, 142 | msg: 'success', 143 | data: result 144 | }); 145 | }); 146 | }); 147 | // 获取购物车里商品数量 148 | router.post('/getCartCount', function(req, res, next) { 149 | var username = req.cookies.username; 150 | var sql = `SELECT COUNT(*) as count FROM cart WHERE Username=?`; 151 | var sqlParams = username; 152 | connection.query(sql, sqlParams, function(err, result) { 153 | if (err) { 154 | res.json({ 155 | status: 500, 156 | msg: err, 157 | data: '' 158 | }); 159 | return; 160 | } 161 | res.json({ 162 | status: 200, 163 | msg: 'success', 164 | data: result 165 | }); 166 | }); 167 | }); 168 | // 获取购物车所有信息 169 | router.post('/getCart', function(req, res, next) { 170 | var username = req.cookies.username; 171 | var sql = `SELECT cart.Cartcount,good.* FROM cart,good WHERE cart.Goodid=good.Goodid AND Username=?`; 172 | var sqlParams = username; 173 | connection.query(sql, sqlParams, function(err, result) { 174 | if (err) { 175 | res.json({ 176 | status: 500, 177 | msg: err, 178 | data: '' 179 | }); 180 | return; 181 | } 182 | res.json({ 183 | status: 200, 184 | msg: 'success', 185 | data: result 186 | }); 187 | }); 188 | }); 189 | // 更新购物车商品数目 190 | router.post('/updateCartCount', function(req, res, next) { 191 | var username = req.cookies.username; 192 | var id = req.body.id; 193 | var num = req.body.num; 194 | var sql = `UPDATE cart SET Cartcount=? WHERE Username=? AND Goodid=?`; 195 | var sqlParams = [num, username, id]; 196 | connection.query(sql, sqlParams, function(err, result) { 197 | if (err) { 198 | res.json({ 199 | status: 500, 200 | msg: err, 201 | data: '' 202 | }); 203 | return; 204 | } 205 | res.json({ 206 | status: 200, 207 | msg: 'success', 208 | data: '' 209 | }); 210 | }); 211 | }); 212 | // 添加到购物车 213 | router.post('/addToCart', function(req, res, next) { 214 | var username = req.cookies.username; 215 | var id = req.body.id; 216 | var num = req.body.num; 217 | var sql = `SELECT Cartcount FROM cart WHERE Goodid=? AND Username=?`; 218 | var sqlParams = [id, username]; 219 | connection.query(sql, sqlParams, function(err, result) { 220 | if (err) { 221 | res.json({ 222 | status: 500, 223 | msg: err, 224 | data: '' 225 | }); 226 | return; 227 | } 228 | if (result.length === 0) { 229 | sql = `INSERT INTO cart VALUES (?, ?, ?);`; 230 | sqlParams = [username, id, num]; 231 | connection.query(sql, sqlParams, function(err, res1) { 232 | if (err) { 233 | res.json({ 234 | status: 500, 235 | msg: err, 236 | data: '' 237 | }); 238 | return; 239 | } 240 | res.json({ 241 | status: 200, 242 | msg: 'success', 243 | data: '' 244 | }); 245 | }); 246 | } else { 247 | num += result[0].Cartcount; 248 | sql = `UPDATE cart SET Cartcount=? WHERE Username=? AND Goodid=?`; 249 | sqlParams = [num, username, id]; 250 | connection.query(sql, sqlParams, function(err, res2) { 251 | if (err) { 252 | res.json({ 253 | status: 500, 254 | msg: err, 255 | data: '' 256 | }); 257 | return; 258 | } 259 | res.json({ 260 | status: 200, 261 | msg: 'success', 262 | data: '' 263 | }); 264 | }); 265 | } 266 | }); 267 | }); 268 | // 删除购物车商品 269 | router.post('/delFromCart', function(req, res, next) { 270 | var username = req.cookies.username; 271 | var delId = req.body.delId; 272 | var delIdStr = '(' + delId.toString() + ')'; 273 | var sql = `DELETE FROM cart WHERE Username=? AND Goodid in ${delIdStr}`; 274 | var sqlParams = [username]; 275 | connection.query(sql, sqlParams, function(err, result) { 276 | if (err) { 277 | res.json({ 278 | status: 500, 279 | msg: err, 280 | data: '' 281 | }); 282 | return; 283 | } 284 | res.json({ 285 | status: 200, 286 | msg: 'success', 287 | data: '' 288 | }); 289 | }); 290 | }); 291 | // 根据id获取商品 292 | router.post('/getGoodById', function(req, res, next) { 293 | var username = req.cookies.username; 294 | var goodId = req.body.goodId; 295 | var goodIdStr = '(' + goodId.toString() + ')'; 296 | var sql = `SELECT * FROM good WHERE Goodid in ${goodIdStr}`; 297 | var sqlParams = [username]; 298 | connection.query(sql, sqlParams, function(err, result) { 299 | if (err) { 300 | res.json({ 301 | status: 500, 302 | msg: err, 303 | data: '' 304 | }); 305 | return; 306 | } 307 | res.json({ 308 | status: 200, 309 | msg: 'success', 310 | data: result 311 | }); 312 | }); 313 | }); 314 | // 获取收货地址 315 | router.post('/getAddress', function(req, res, next) { 316 | var username = req.cookies.username; 317 | var sql = `SELECT * FROM address WHERE Username=?`; 318 | var sqlParams = [username]; 319 | connection.query(sql, sqlParams, function(err, result) { 320 | if (err) { 321 | res.json({ 322 | status: 500, 323 | msg: err, 324 | data: '' 325 | }); 326 | return; 327 | } 328 | res.json({ 329 | status: 200, 330 | msg: 'success', 331 | data: result 332 | }); 333 | }); 334 | }); 335 | // 获取订单 336 | router.post('/getOrder', function(req, res, next) { 337 | var username = req.cookies.username; 338 | var sql = `SELECT * FROM userorder,usersuborder,good WHERE userorder.Username=? AND userorder.Orderid=usersuborder.MainOrderId AND usersuborder.GoodId = good.Goodid;`; 339 | var sqlParams = [username]; 340 | connection.query(sql, sqlParams, function(err, result) { 341 | if (err) { 342 | res.json({ 343 | status: 500, 344 | msg: err, 345 | data: '' 346 | }); 347 | return; 348 | } 349 | let resultArr = []; 350 | let obj = {}; 351 | for (let i = 0; i < result.length; i++) { 352 | const item = result[i]; 353 | if (obj[item.Orderid]) { 354 | obj[item.Orderid].goods.push(item); 355 | } else { 356 | const { Orderid, Addressid, totalMoney, Status } = item; 357 | obj[item.Orderid] = { 358 | Orderid, 359 | Addressid, 360 | totalMoney, 361 | Status, 362 | goods: [item] 363 | }; 364 | } 365 | } 366 | Object.keys(obj).forEach(function(key) { 367 | resultArr.push(obj[key]); 368 | }); 369 | res.json({ 370 | status: 200, 371 | msg: 'success', 372 | data: resultArr 373 | }); 374 | }); 375 | }); 376 | // 生成订单 377 | router.post('/createOrder', function(req, res, next) { 378 | var username = req.cookies.username; 379 | var addressId = req.body.addressId; 380 | var goods = req.body.goods; 381 | var totalMoney = req.body.totalMoney; 382 | sql = 'INSERT INTO userorder(Username,Addressid,Status,totalMoney) VALUES(?,?,1,?)'; 383 | var sqlParams = [username, addressId, totalMoney]; 384 | connection.query(sql, sqlParams, function(err, result) { 385 | if (err) { 386 | res.json({ 387 | status: 500, 388 | msg: err, 389 | data: '' 390 | }); 391 | return; 392 | } 393 | var arr = []; 394 | for (var i = 0; i < goods.length; i++) { 395 | arr.push([result.insertId, goods[i].Goodid, goods[i].Cartcount]); 396 | } 397 | sql = 'INSERT INTO usersuborder(MainOrderId,GoodId,Count) VALUES ?'; 398 | sqlParams = arr; 399 | connection.query(sql, [sqlParams], function(err, result) { 400 | if (err) { 401 | res.json({ 402 | status: 500, 403 | msg: err, 404 | data: '' 405 | }); 406 | return; 407 | } 408 | res.json({ 409 | status: 200, 410 | msg: 'success', 411 | data: result 412 | }); 413 | }); 414 | }); 415 | }); 416 | module.exports = router; 417 | -------------------------------------------------------------------------------- /server/routes/users.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var router = express.Router(); 3 | 4 | /* GET users listing. */ 5 | router.get('/', function(req, res, next) { 6 | res.send('respond with a resource'); 7 | }); 8 | 9 | module.exports = router; 10 | -------------------------------------------------------------------------------- /server/views/error.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= message 5 | h2= error.status 6 | pre #{error.stack} 7 | -------------------------------------------------------------------------------- /server/views/index.jade: -------------------------------------------------------------------------------- 1 | extends layout 2 | 3 | block content 4 | h1= title 5 | p Welcome to #{title} 6 | -------------------------------------------------------------------------------- /server/views/layout.jade: -------------------------------------------------------------------------------- 1 | doctype html 2 | html 3 | head 4 | title= title 5 | link(rel='stylesheet', href='/stylesheets/style.css') 6 | body 7 | block content 8 | -------------------------------------------------------------------------------- /sql/vantstore.sql: -------------------------------------------------------------------------------- 1 | /* 2 | Navicat Premium Data Transfer 3 | 4 | Source Server : 本地 5 | Source Server Type : MySQL 6 | Source Server Version : 50724 7 | Source Host : localhost:3306 8 | Source Schema : vantstore 9 | 10 | Target Server Type : MySQL 11 | Target Server Version : 50724 12 | File Encoding : 65001 13 | 14 | Date: 26/11/2019 11:50:19 15 | */ 16 | 17 | SET NAMES utf8mb4; 18 | SET FOREIGN_KEY_CHECKS = 0; 19 | 20 | -- ---------------------------- 21 | -- Table structure for address 22 | -- ---------------------------- 23 | DROP TABLE IF EXISTS `address`; 24 | CREATE TABLE `address` ( 25 | `Username` char(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 26 | `Addressid` int(11) NOT NULL AUTO_INCREMENT, 27 | `Name` char(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 28 | `Phonenum` char(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 29 | `Address` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 30 | `AddressDetail` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 31 | `PostalCode` char(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 32 | `Isdefault` int(11) NOT NULL DEFAULT 0, 33 | PRIMARY KEY (`Addressid`) USING BTREE 34 | ) ENGINE = MyISAM AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 35 | 36 | -- ---------------------------- 37 | -- Records of address 38 | -- ---------------------------- 39 | INSERT INTO `address` VALUES ('test@qq.com', 1, '张三', '15555578945', '山东省烟台市芝罘区', '鲁东大学', '271934', 1); 40 | INSERT INTO `address` VALUES ('test@qq.com', 2, '小明', '15535578564', '山东省济南市历下区', '暨南大学', '271934', 0); 41 | INSERT INTO `address` VALUES ('test@qq.com', 3, '李四', '15555578945', '山东省烟台市芝罘区', '烟台大学', '271934', 0); 42 | INSERT INTO `address` VALUES ('test@qq.com', 4, '王五', '15555578945', '山东省青岛市即墨市', '烟台路', '271934', 0); 43 | 44 | -- ---------------------------- 45 | -- Table structure for cart 46 | -- ---------------------------- 47 | DROP TABLE IF EXISTS `cart`; 48 | CREATE TABLE `cart` ( 49 | `Username` char(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 50 | `Goodid` int(11) NOT NULL, 51 | `Cartcount` int(11) NOT NULL 52 | ) ENGINE = MyISAM CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Fixed; 53 | 54 | -- ---------------------------- 55 | -- Records of cart 56 | -- ---------------------------- 57 | INSERT INTO `cart` VALUES ('123@qq.com', 7, 2); 58 | INSERT INTO `cart` VALUES ('123@qq.com', 1, 2); 59 | INSERT INTO `cart` VALUES ('test@qq.com', 8, 1); 60 | 61 | -- ---------------------------- 62 | -- Table structure for good 63 | -- ---------------------------- 64 | DROP TABLE IF EXISTS `good`; 65 | CREATE TABLE `good` ( 66 | `Goodid` int(11) NOT NULL AUTO_INCREMENT, 67 | `Goodname` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 68 | `GoodPrice` double NOT NULL, 69 | `GoodPriceaftersale` double NOT NULL, 70 | `Goodcount` int(11) NOT NULL, 71 | `Gooddescribe` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 72 | `Gooddealprice` int(11) NOT NULL, 73 | `GoodItem` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 74 | `GoodImg` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, 75 | PRIMARY KEY (`Goodid`) USING BTREE 76 | ) ENGINE = MyISAM AUTO_INCREMENT = 58 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 77 | 78 | -- ---------------------------- 79 | -- Records of good 80 | -- ---------------------------- 81 | INSERT INTO `good` VALUES (1, '小米6X', 1499, 1299, 966, '小米6X,立减200', 0, '1', '/img/good/pic-1.jpg'); 82 | INSERT INTO `good` VALUES (2, '小米8', 2399, 2199, 966, '【全版本买就赠手环2】Xiaomi/小米 小米8年度旗舰全面屏骁龙845双频GPS智能拍照游戏手机刘海屏AI', 5, '3,4', '/img/good/pic-2.jpg'); 83 | INSERT INTO `good` VALUES (3, '迪士尼商城', 1499, 1399, 966, '当天可定亲子特惠上海迪士尼乐园门票上海迪士尼门票上海迪斯尼票', 6, '2', '/img/good/pic-3.jpg'); 84 | INSERT INTO `good` VALUES (4, '飞科剃须刀', 99, 66, 56, '飞科剃须刀电动男士刮胡刀全身水洗智能充电式胡须刀正品刮胡子刀', 0, '1,5,6', '/img/good/pic-4.jpg'); 85 | INSERT INTO `good` VALUES (5, '华为honor/荣耀 荣耀10', 1266, 1199, 98, '【低至2299】华为honor/荣耀 荣耀10GT游戏加速AIS手持夜景AI摄影全面屏双卡双待全网通8GB手机官方旗舰店', 5, '1,6', '/img/good/pic-5.jpg'); 86 | INSERT INTO `good` VALUES (6, '荣耀V10', 2199, 2099, 78, '【28日低至1799 6期免息】华为honor/荣耀 荣耀V10全面屏智能AI变焦双摄拍照商务手机全新官方正品旗舰店', 0, '3,5', '/img/good/pic-6.jpg'); 87 | INSERT INTO `good` VALUES (7, '洗衣机', 999, 889, 36, 'Haier/海尔 EB80M39TH 8kg/公斤全自动家用波轮洗衣机 大容量', 5, '2,5', '/img/good/pic-7.jpg'); 88 | INSERT INTO `good` VALUES (8, '小米8', 2399, 2199, 966, '【全版本买就赠手环2】Xiaomi/小米 小米8年度旗舰全面屏骁龙845双频GPS智能拍照游戏手机刘海屏AI', 0, '1,2,3', '/img/good/pic-2.jpg'); 89 | INSERT INTO `good` VALUES (9, '迪士尼商城', 1499, 1399, 966, '当天可定亲子特惠上海迪士尼乐园门票上海迪士尼门票上海迪斯尼票', 5, '1,5,6', '/img/good/pic-3.jpg'); 90 | INSERT INTO `good` VALUES (10, '飞科剃须刀', 99, 66, 56, '飞科剃须刀电动男士刮胡刀全身水洗智能充电式胡须刀正品刮胡子刀', 6, '1,6', '/img/good/pic-4.jpg'); 91 | INSERT INTO `good` VALUES (11, '华为honor/荣耀 荣耀10', 1266, 1199, 98, '【低至2299】华为honor/荣耀 荣耀10GT游戏加速AIS手持夜景AI摄影全面屏双卡双待全网通8GB手机官方旗舰店', 5, '2,6', '/img/good/pic-5.jpg'); 92 | INSERT INTO `good` VALUES (12, '荣耀V10', 2199, 2099, 78, '【28日低至1799 6期免息】华为honor/荣耀 荣耀V10全面屏智能AI变焦双摄拍照商务手机全新官方正品旗舰店', 5, '4,6', '/img/good/pic-6.jpg'); 93 | INSERT INTO `good` VALUES (13, '洗衣机', 999, 889, 36, 'Haier/海尔 EB80M39TH 8kg/公斤全自动家用波轮洗衣机 大容量', 5, '1,5', '/img/good/pic-7.jpg'); 94 | INSERT INTO `good` VALUES (14, '小米8', 2399, 2199, 966, '【全版本买就赠手环2】Xiaomi/小米 小米8年度旗舰全面屏骁龙845双频GPS智能拍照游戏手机刘海屏AI', 0, '2,5,6', '/img/good/pic-2.jpg'); 95 | INSERT INTO `good` VALUES (15, '迪士尼商城', 1499, 1399, 966, '当天可定亲子特惠上海迪士尼乐园门票上海迪士尼门票上海迪斯尼票', 5, '1,5', '/img/good/pic-3.jpg'); 96 | INSERT INTO `good` VALUES (16, '飞科剃须刀', 99, 66, 56, '飞科剃须刀电动男士刮胡刀全身水洗智能充电式胡须刀正品刮胡子刀', 5, '3,4,5', '/img/good/pic-4.jpg'); 97 | INSERT INTO `good` VALUES (17, '华为honor/荣耀 荣耀10', 1266, 1199, 98, '【低至2299】华为honor/荣耀 荣耀10GT游戏加速AIS手持夜景AI摄影全面屏双卡双待全网通8GB手机官方旗舰店', 0, '2,5', '/img/good/pic-5.jpg'); 98 | INSERT INTO `good` VALUES (18, '荣耀V10', 2199, 2099, 78, '【28日低至1799 6期免息】华为honor/荣耀 荣耀V10全面屏智能AI变焦双摄拍照商务手机全新官方正品旗舰店', 5, '1,2,5', '/img/good/pic-6.jpg'); 99 | INSERT INTO `good` VALUES (19, '洗衣机', 999, 889, 36, 'Haier/海尔 EB80M39TH 8kg/公斤全自动家用波轮洗衣机 大容量', 5, '1,5', '/img/good/pic-7.jpg'); 100 | INSERT INTO `good` VALUES (20, '小米8', 2399, 2199, 966, '【全版本买就赠手环2】Xiaomi/小米 小米8年度旗舰全面屏骁龙845双频GPS智能拍照游戏手机刘海屏AI', 5, '2,3,5', '/img/good/pic-2.jpg'); 101 | INSERT INTO `good` VALUES (21, '迪士尼商城', 1499, 1399, 966, '当天可定亲子特惠上海迪士尼乐园门票上海迪士尼门票上海迪斯尼票', 0, '1,5', '/img/good/pic-3.jpg'); 102 | INSERT INTO `good` VALUES (22, '飞科剃须刀', 99, 66, 56, '飞科剃须刀电动男士刮胡刀全身水洗智能充电式胡须刀正品刮胡子刀', 5, '2,3,5', '/img/good/pic-4.jpg'); 103 | INSERT INTO `good` VALUES (23, '华为honor/荣耀 荣耀10', 1266, 1199, 98, '【低至2299】华为honor/荣耀 荣耀10GT游戏加速AIS手持夜景AI摄影全面屏双卡双待全网通8GB手机官方旗舰店', 5, '1,5', '/img/good/pic-5.jpg'); 104 | INSERT INTO `good` VALUES (24, '荣耀V10', 2199, 2099, 78, '【28日低至1799 6期免息】华为honor/荣耀 荣耀V10全面屏智能AI变焦双摄拍照商务手机全新官方正品旗舰店', 5, '2,3,5', '/img/good/pic-6.jpg'); 105 | INSERT INTO `good` VALUES (25, '洗衣机', 999, 889, 36, 'Haier/海尔 EB80M39TH 8kg/公斤全自动家用波轮洗衣机 大容量', 0, '1,5', '/img/good/pic-7.jpg'); 106 | INSERT INTO `good` VALUES (26, '小米8', 2399, 2199, 966, '【全版本买就赠手环2】Xiaomi/小米 小米8年度旗舰全面屏骁龙845双频GPS智能拍照游戏手机刘海屏AI', 5, '1,5', '/img/good/pic-2.jpg'); 107 | INSERT INTO `good` VALUES (27, '迪士尼商城', 1499, 1399, 966, '当天可定亲子特惠上海迪士尼乐园门票上海迪士尼门票上海迪斯尼票', 5, '1,5,6', '/img/good/pic-3.jpg'); 108 | INSERT INTO `good` VALUES (28, '飞科剃须刀', 99, 66, 56, '飞科剃须刀电动男士刮胡刀全身水洗智能充电式胡须刀正品刮胡子刀', 5, '1,25', '/img/good/pic-4.jpg'); 109 | INSERT INTO `good` VALUES (29, '华为honor/荣耀 荣耀10', 1266, 1199, 98, '【低至2299】华为honor/荣耀 荣耀10GT游戏加速AIS手持夜景AI摄影全面屏双卡双待全网通8GB手机官方旗舰店', 5, '1,5', '/img/good/pic-5.jpg'); 110 | INSERT INTO `good` VALUES (30, '荣耀V10', 2199, 2099, 78, '【28日低至1799 6期免息】华为honor/荣耀 荣耀V10全面屏智能AI变焦双摄拍照商务手机全新官方正品旗舰店', 5, '2,3,4', '/img/good/pic-6.jpg'); 111 | INSERT INTO `good` VALUES (31, '洗衣机', 999, 889, 36, 'Haier/海尔 EB80M39TH 8kg/公斤全自动家用波轮洗衣机 大容量', 5, '1,5', '/img/good/pic-7.jpg'); 112 | INSERT INTO `good` VALUES (32, '小米8', 2399, 2199, 966, '【全版本买就赠手环2】Xiaomi/小米 小米8年度旗舰全面屏骁龙845双频GPS智能拍照游戏手机刘海屏AI', 5, '1,2,4', '/img/good/pic-2.jpg'); 113 | INSERT INTO `good` VALUES (33, '迪士尼商城', 1499, 1399, 966, '当天可定亲子特惠上海迪士尼乐园门票上海迪士尼门票上海迪斯尼票', 5, '1,5', '/img/good/pic-3.jpg'); 114 | INSERT INTO `good` VALUES (34, '飞科剃须刀', 99, 66, 56, '飞科剃须刀电动男士刮胡刀全身水洗智能充电式胡须刀正品刮胡子刀', 5, '2,6', '/img/good/pic-4.jpg'); 115 | INSERT INTO `good` VALUES (35, '华为honor/荣耀 荣耀10', 1266, 1199, 98, '【低至2299】华为honor/荣耀 荣耀10GT游戏加速AIS手持夜景AI摄影全面屏双卡双待全网通8GB手机官方旗舰店', 5, '1,5', '/img/good/pic-5.jpg'); 116 | INSERT INTO `good` VALUES (36, '荣耀V10', 2199, 2099, 78, '【28日低至1799 6期免息】华为honor/荣耀 荣耀V10全面屏智能AI变焦双摄拍照商务手机全新官方正品旗舰店', 5, '2,6', '/img/good/pic-6.jpg'); 117 | INSERT INTO `good` VALUES (37, '洗衣机', 999, 889, 36, 'Haier/海尔 EB80M39TH 8kg/公斤全自动家用波轮洗衣机 大容量', 5, '1,5', '/img/good/pic-7.jpg'); 118 | INSERT INTO `good` VALUES (38, '小米8', 2399, 2199, 966, '【全版本买就赠手环2】Xiaomi/小米 小米8年度旗舰全面屏骁龙845双频GPS智能拍照游戏手机刘海屏AI', 5, '1,4,5', '/img/good/pic-2.jpg'); 119 | INSERT INTO `good` VALUES (39, '迪士尼商城', 1499, 1399, 966, '当天可定亲子特惠上海迪士尼乐园门票上海迪士尼门票上海迪斯尼票', 5, '1,5', '/img/good/pic-3.jpg'); 120 | INSERT INTO `good` VALUES (40, '飞科剃须刀', 99, 66, 56, '飞科剃须刀电动男士刮胡刀全身水洗智能充电式胡须刀正品刮胡子刀', 5, '3,4,5', '/img/good/pic-4.jpg'); 121 | INSERT INTO `good` VALUES (41, '华为honor/荣耀 荣耀10', 1266, 1199, 98, '【低至2299】华为honor/荣耀 荣耀10GT游戏加速AIS手持夜景AI摄影全面屏双卡双待全网通8GB手机官方旗舰店', 5, '1,5', '/img/good/pic-5.jpg'); 122 | INSERT INTO `good` VALUES (42, '荣耀V10', 2199, 2099, 78, '【28日低至1799 6期免息】华为honor/荣耀 荣耀V10全面屏智能AI变焦双摄拍照商务手机全新官方正品旗舰店', 5, '2,5', '/img/good/pic-6.jpg'); 123 | INSERT INTO `good` VALUES (43, '洗衣机', 999, 889, 36, 'Haier/海尔 EB80M39TH 8kg/公斤全自动家用波轮洗衣机 大容量', 5, '2', '/img/good/pic-7.jpg'); 124 | INSERT INTO `good` VALUES (44, '小米8', 2399, 2199, 966, '【全版本买就赠手环2】Xiaomi/小米 小米8年度旗舰全面屏骁龙845双频GPS智能拍照游戏手机刘海屏AI', 5, '2,3', '/img/good/pic-2.jpg'); 125 | INSERT INTO `good` VALUES (45, '迪士尼商城', 1499, 1399, 966, '当天可定亲子特惠上海迪士尼乐园门票上海迪士尼门票上海迪斯尼票', 5, '2,3,6', '/img/good/pic-3.jpg'); 126 | INSERT INTO `good` VALUES (46, '飞科剃须刀', 99, 66, 56, '飞科剃须刀电动男士刮胡刀全身水洗智能充电式胡须刀正品刮胡子刀', 5, '4,5', '/img/good/pic-4.jpg'); 127 | INSERT INTO `good` VALUES (47, '华为honor/荣耀 荣耀10', 1266, 1199, 98, '【低至2299】华为honor/荣耀 荣耀10GT游戏加速AIS手持夜景AI摄影全面屏双卡双待全网通8GB手机官方旗舰店', 5, '1,2,3', '/img/good/pic-5.jpg'); 128 | INSERT INTO `good` VALUES (48, '荣耀V10', 2199, 2099, 78, '【28日低至1799 6期免息】华为honor/荣耀 荣耀V10全面屏智能AI变焦双摄拍照商务手机全新官方正品旗舰店', 5, '1,3,4', '/img/good/pic-6.jpg'); 129 | INSERT INTO `good` VALUES (49, '洗衣机', 999, 889, 36, 'Haier/海尔 EB80M39TH 8kg/公斤全自动家用波轮洗衣机 大容量', 5, '2,3,4', '/img/good/pic-7.jpg'); 130 | INSERT INTO `good` VALUES (50, '小米8', 2399, 2199, 966, '【全版本买就赠手环2】Xiaomi/小米 小米8年度旗舰全面屏骁龙845双频GPS智能拍照游戏手机刘海屏AI', 5, '1,5', '/img/good/pic-2.jpg'); 131 | INSERT INTO `good` VALUES (51, '迪士尼商城', 1499, 1399, 966, '当天可定亲子特惠上海迪士尼乐园门票上海迪士尼门票上海迪斯尼票', 5, '2,4', '/img/good/pic-3.jpg'); 132 | INSERT INTO `good` VALUES (52, '飞科剃须刀', 99, 66, 56, '飞科剃须刀电动男士刮胡刀全身水洗智能充电式胡须刀正品刮胡子刀', 5, '1,2,6', '/img/good/pic-4.jpg'); 133 | INSERT INTO `good` VALUES (53, '华为honor/荣耀 荣耀10', 1266, 1199, 98, '【低至2299】华为honor/荣耀 荣耀10GT游戏加速AIS手持夜景AI摄影全面屏双卡双待全网通8GB手机官方旗舰店', 5, '1,4', '/img/good/pic-5.jpg'); 134 | INSERT INTO `good` VALUES (54, '荣耀V10', 2199, 2099, 78, '【28日低至1799 6期免息】华为honor/荣耀 荣耀V10全面屏智能AI变焦双摄拍照商务手机全新官方正品旗舰店', 5, '1,5', '/img/good/pic-6.jpg'); 135 | INSERT INTO `good` VALUES (55, '洗衣机', 999, 889, 36, 'Haier/海尔 EB80M39TH 8kg/公斤全自动家用波轮洗衣机 大容量', 5, '2,3', '/img/good/pic-7.jpg'); 136 | INSERT INTO `good` VALUES (56, '洗衣机', 999, 889, 36, 'Haier/海尔 EB80M39TH 8kg/公斤全自动家用波轮洗衣机 大容量', 5, '1,5,6', '/img/good/pic-7.jpg'); 137 | 138 | -- ---------------------------- 139 | -- Table structure for item 140 | -- ---------------------------- 141 | DROP TABLE IF EXISTS `item`; 142 | CREATE TABLE `item` ( 143 | `ItemId` int(11) NOT NULL AUTO_INCREMENT, 144 | `Itemname` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 145 | PRIMARY KEY (`ItemId`) USING BTREE 146 | ) ENGINE = MyISAM AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 147 | 148 | -- ---------------------------- 149 | -- Records of item 150 | -- ---------------------------- 151 | INSERT INTO `item` VALUES (1, '热销商品'); 152 | INSERT INTO `item` VALUES (2, '拼团商品'); 153 | INSERT INTO `item` VALUES (3, '发现'); 154 | INSERT INTO `item` VALUES (4, '限时折扣'); 155 | INSERT INTO `item` VALUES (5, '主题精选'); 156 | INSERT INTO `item` VALUES (6, '生活用品'); 157 | 158 | -- ---------------------------- 159 | -- Table structure for user 160 | -- ---------------------------- 161 | DROP TABLE IF EXISTS `user`; 162 | CREATE TABLE `user` ( 163 | `Username` char(40) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL, 164 | `Password` char(120) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL 165 | ) ENGINE = MyISAM CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Fixed; 166 | 167 | -- ---------------------------- 168 | -- Records of user 169 | -- ---------------------------- 170 | INSERT INTO `user` VALUES ('test@qq.com', '9c67e149bf846087c5b0043bb40eb35f'); 171 | INSERT INTO `user` VALUES ('123@qq.com', '9c67e149bf846087c5b0043bb40eb35f'); 172 | INSERT INTO `user` VALUES ('1234@qq.com', 'dee63eca4b76ca4d7a83ead699063302'); 173 | INSERT INTO `user` VALUES ('12345@qq.com', '9c67e149bf846087c5b0043bb40eb35f'); 174 | INSERT INTO `user` VALUES ('123456@qq.com', 'dee63eca4b76ca4d7a83ead699063302'); 175 | 176 | -- ---------------------------- 177 | -- Table structure for userorder 178 | -- ---------------------------- 179 | DROP TABLE IF EXISTS `userorder`; 180 | CREATE TABLE `userorder` ( 181 | `Orderid` int(11) NOT NULL AUTO_INCREMENT, 182 | `Username` char(40) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, 183 | `Addressid` int(11) NOT NULL, 184 | `totalMoney` int(11) NOT NULL, 185 | `Status` int(11) NOT NULL DEFAULT 0, 186 | PRIMARY KEY (`Orderid`) USING BTREE 187 | ) ENGINE = MyISAM AUTO_INCREMENT = 12 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Fixed; 188 | 189 | -- ---------------------------- 190 | -- Records of userorder 191 | -- ---------------------------- 192 | INSERT INTO `userorder` VALUES (11, 'test@qq.com', 1, 198, 1); 193 | INSERT INTO `userorder` VALUES (10, 'test@qq.com', 1, 66, 1); 194 | INSERT INTO `userorder` VALUES (9, 'test@qq.com', 1, 2397, 1); 195 | INSERT INTO `userorder` VALUES (8, 'test@qq.com', 1, 132, 1); 196 | 197 | -- ---------------------------- 198 | -- Table structure for usersuborder 199 | -- ---------------------------- 200 | DROP TABLE IF EXISTS `usersuborder`; 201 | CREATE TABLE `usersuborder` ( 202 | `id` int(11) NOT NULL AUTO_INCREMENT, 203 | `MainOrderId` int(11) NOT NULL, 204 | `GoodId` int(11) NOT NULL, 205 | `Count` int(11) NOT NULL, 206 | PRIMARY KEY (`id`) USING BTREE 207 | ) ENGINE = MyISAM AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Fixed; 208 | 209 | -- ---------------------------- 210 | -- Records of usersuborder 211 | -- ---------------------------- 212 | INSERT INTO `usersuborder` VALUES (8, 11, 4, 3); 213 | INSERT INTO `usersuborder` VALUES (7, 10, 4, 1); 214 | INSERT INTO `usersuborder` VALUES (6, 9, 8, 1); 215 | INSERT INTO `usersuborder` VALUES (5, 9, 4, 3); 216 | 217 | SET FOREIGN_KEY_CHECKS = 1; 218 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 21 | 31 | -------------------------------------------------------------------------------- /src/api/api.js: -------------------------------------------------------------------------------- 1 | import { get, post } from '@/util/http'; 2 | export const test = () => get('/'); 3 | export const login = params => post('login', params); 4 | export const reg = params => post('reg', params); 5 | export const hotSale = () => post('hotsale'); 6 | export const saleGroup = () => post('salegroup'); 7 | export const discover = () => post('discover'); 8 | export const getCartCount = () => post('getCartCount'); 9 | export const getCart = () => post('getCart'); 10 | export const updateCartCount = params => post('updateCartCount', params); 11 | export const addToCart = params => post('addToCart', params); 12 | export const delFromCart = params => post('delFromCart', params); 13 | export const getAddress = () => post('getAddress'); 14 | export const getOrder = () => post('getOrder'); 15 | export const createOrder = params => post('createOrder', params); 16 | export const getGoodById = params => post('getGoodById', params); 17 | -------------------------------------------------------------------------------- /src/components/backgroundImg/backgroundImg.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 37 | 38 | 67 | -------------------------------------------------------------------------------- /src/components/github/github.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 15 | 16 | 77 | -------------------------------------------------------------------------------- /src/components/goodItem/goodItem.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 27 | 28 | 57 | -------------------------------------------------------------------------------- /src/components/scroll/scrollX.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 122 | 123 | 149 | -------------------------------------------------------------------------------- /src/components/scroll/scrollY.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 79 | -------------------------------------------------------------------------------- /src/components/tabItem/tabItem.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 38 | 39 | 79 | -------------------------------------------------------------------------------- /src/images/bgc/bgc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/bgc/bgc.jpg -------------------------------------------------------------------------------- /src/images/detail/detail-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/detail/detail-1.jpg -------------------------------------------------------------------------------- /src/images/detail/detail-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/detail/detail-2.jpg -------------------------------------------------------------------------------- /src/images/detail/detail-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/detail/detail-3.jpg -------------------------------------------------------------------------------- /src/images/detail/detail-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/detail/detail-4.jpg -------------------------------------------------------------------------------- /src/images/detail/detail-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/detail/detail-5.jpg -------------------------------------------------------------------------------- /src/images/detail/detail-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/detail/detail-6.jpg -------------------------------------------------------------------------------- /src/images/good/pic-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/good/pic-1.jpg -------------------------------------------------------------------------------- /src/images/good/pic-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/good/pic-2.jpg -------------------------------------------------------------------------------- /src/images/good/pic-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/good/pic-3.jpg -------------------------------------------------------------------------------- /src/images/good/pic-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/good/pic-4.jpg -------------------------------------------------------------------------------- /src/images/good/pic-5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/good/pic-5.jpg -------------------------------------------------------------------------------- /src/images/good/pic-6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/good/pic-6.jpg -------------------------------------------------------------------------------- /src/images/good/pic-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/good/pic-7.jpg -------------------------------------------------------------------------------- /src/images/swipe/swipe-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/swipe/swipe-1.jpg -------------------------------------------------------------------------------- /src/images/swipe/swipe-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/swipe/swipe-2.jpg -------------------------------------------------------------------------------- /src/images/swipe/swipe-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/swipe/swipe-3.jpg -------------------------------------------------------------------------------- /src/images/swipe/swipe-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/swipe/swipe-4.jpg -------------------------------------------------------------------------------- /src/images/swipe/swipe1-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/swipe/swipe1-1.jpg -------------------------------------------------------------------------------- /src/images/swipe/swipe1-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/swipe/swipe1-2.jpg -------------------------------------------------------------------------------- /src/images/swipe/swipe1-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pwx123/vue-vant-store/d9a179a04978cb424f084afc1a3ec6d71624446e/src/images/swipe/swipe1-3.jpg -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import App from './App.vue'; 3 | import Vant from 'vant'; 4 | import { Lazyload } from 'vant'; 5 | import 'vant/lib/vant-css/index.css'; 6 | import router from './router'; 7 | import store from './store'; 8 | Vue.use(Vant); 9 | Vue.use(Lazyload); 10 | Vue.config.productionTip = false; 11 | 12 | new Vue({ 13 | router, 14 | store, 15 | render: h => h(App) 16 | }).$mount('#app'); 17 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Router from 'vue-router'; 3 | const Home = () => import(/* webpackChunkName: "Home" */ '@/views/Home/Home'); 4 | const Cart = () => import(/* webpackChunkName: "Cart" */ '@/views/Cart/Cart'); 5 | const User = () => import(/* webpackChunkName: "User" */ '@/views/User/User'); 6 | const Login = () => import(/* webpackChunkName: "Login" */ '@/views/Login/Login'); 7 | const Reg = () => import(/* webpackChunkName: "Reg" */ '@/views/Reg/Reg'); 8 | const Good = () => import(/* webpackChunkName: "Good" */ '@/views/Good/Good'); 9 | const NotFound = () => import(/* webpackChunkName: "NotFound" */ '@/views/NotFound/NotFound'); 10 | const Order = () => import(/* webpackChunkName: "Order" */ '@/views/Order/Order'); 11 | const AddressList = () => import(/* webpackChunkName: "AddressList" */ '@/views/AddressList/AddressList'); 12 | const EditAddress = () => import(/* webpackChunkName: "EditAddress" */ '@/views/EditAddress/EditAddress'); 13 | const OrderList = () => import(/* webpackChunkName: "OrderList" */ '@/views/OrderList/OrderList'); 14 | 15 | Vue.use(Router); 16 | 17 | export default new Router({ 18 | routes: [ 19 | { 20 | path: '/', 21 | name: 'Home', 22 | component: Home 23 | }, 24 | { 25 | path: '/Cart', 26 | name: 'Cart', 27 | component: Cart 28 | }, 29 | { 30 | path: '/User', 31 | name: 'User', 32 | component: User 33 | }, 34 | { 35 | path: '/Login', 36 | name: 'Login', 37 | component: Login, 38 | meta: { 39 | fullScreen: true 40 | } 41 | }, 42 | { 43 | path: '/Reg', 44 | name: 'Reg', 45 | component: Reg, 46 | meta: { 47 | fullScreen: true 48 | } 49 | }, 50 | { 51 | path: '/Good', 52 | name: 'Good', 53 | component: Good, 54 | meta: { 55 | fullScreen: true 56 | } 57 | }, 58 | { 59 | path: '/Order', 60 | name: 'Order', 61 | component: Order, 62 | meta: { 63 | fullScreen: true 64 | } 65 | }, 66 | { 67 | path: '/AddressList', 68 | name: 'AddressList', 69 | component: AddressList, 70 | meta: { 71 | fullScreen: true 72 | } 73 | }, 74 | { 75 | path: '/EditAddress', 76 | name: 'EditAddress', 77 | component: EditAddress, 78 | meta: { 79 | fullScreen: true 80 | } 81 | }, 82 | { 83 | path: '/OrderList', 84 | name: 'OrderList', 85 | component: OrderList, 86 | meta: { 87 | fullScreen: true 88 | } 89 | }, 90 | { 91 | path: '*', 92 | name: 'Notfound', 93 | component: NotFound, 94 | meta: { 95 | fullScreen: true 96 | } 97 | } 98 | ], 99 | scrollBehavior(to, from, savedPosition) { 100 | return { 101 | x: 0, 102 | y: 0 103 | }; 104 | } 105 | }); 106 | -------------------------------------------------------------------------------- /src/store/getters.js: -------------------------------------------------------------------------------- 1 | const getters = { 2 | good: state => { 3 | return state.good; 4 | }, 5 | orderGood: state => { 6 | return state.orderGood; 7 | }, 8 | addressList: state => { 9 | return state.addressList; 10 | }, 11 | editAddress: state => { 12 | return state.editAddress; 13 | }, 14 | addressId: state => { 15 | return state.addressId; 16 | } 17 | }; 18 | export default getters; 19 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import state from './state'; 4 | import getters from './getters'; 5 | import mutations from './mutations'; 6 | 7 | Vue.use(Vuex); 8 | 9 | export default new Vuex.Store({ 10 | state, 11 | getters, 12 | mutations 13 | }); 14 | -------------------------------------------------------------------------------- /src/store/mutations-types.js: -------------------------------------------------------------------------------- 1 | export const SET_GOOD_MUTATION = 'SET_GOOD_MUTATION'; 2 | export const SET_ORDERGOOD_MUTATION = 'SET_ORDERGOOD_MUTATION'; 3 | export const SET_ADDRESSLIST_MUTATION = 'SET_ADDRESSLIST_MUTATION'; 4 | export const SET_EDITADDRESS_MUTATION = 'SET_EDITADDRESS_MUTATION'; 5 | export const SET_ADDRESSID_MUTATION = 'SET_ADDRESSID_MUTATION'; 6 | -------------------------------------------------------------------------------- /src/store/mutations.js: -------------------------------------------------------------------------------- 1 | import * as types from './mutations-types'; 2 | 3 | const mutations = { 4 | [types.SET_GOOD_MUTATION](state, payload) { 5 | state.good = payload; 6 | }, 7 | [types.SET_ORDERGOOD_MUTATION](state, payload) { 8 | state.orderGood = payload; 9 | }, 10 | [types.SET_ADDRESSLIST_MUTATION](state, payload) { 11 | state.addressList = payload; 12 | }, 13 | [types.SET_EDITADDRESS_MUTATION](state, payload) { 14 | state.editAddress = payload; 15 | }, 16 | [types.SET_ADDRESSID_MUTATION](state, payload) { 17 | state.addressId = payload; 18 | } 19 | }; 20 | 21 | export default mutations; 22 | -------------------------------------------------------------------------------- /src/store/state.js: -------------------------------------------------------------------------------- 1 | const state = { 2 | good: {}, 3 | orderGood: {}, 4 | addressList: [], 5 | editAddress: { 6 | Username: '', 7 | Addressid: '', 8 | Name: '', 9 | Phonenum: '', 10 | Address: '', 11 | AddressDetail: '', 12 | PostalCode: '', 13 | Isdefault: 0 14 | }, 15 | addressId: '' 16 | }; 17 | export default state; 18 | -------------------------------------------------------------------------------- /src/util/http.js: -------------------------------------------------------------------------------- 1 | // 引入 axios 2 | import axios from 'axios'; 3 | import { Toast } from 'vant'; 4 | import router from '@/router'; 5 | 6 | // 环境的切换 7 | if (process.env.NODE_ENV == 'development') { 8 | axios.defaults.baseURL = '/api'; 9 | } else { 10 | axios.defaults.baseURL = '/api'; 11 | } 12 | 13 | // 超时时间 14 | axios.defaults.timeout = 10000; 15 | axios.defaults.withCredentials = true; 16 | // 响应拦截 17 | axios.interceptors.response.use( 18 | response => { 19 | if (response.status === 200) { 20 | return Promise.resolve(response); 21 | } else { 22 | return Promise.reject(response); 23 | } 24 | }, 25 | // 服务器状态码不是200的情况 26 | error => { 27 | if (error.response.status) { 28 | switch (error.response.status) { 29 | case 401: 30 | router.replace({ 31 | path: '/login', 32 | query: { 33 | redirect: router.currentRoute.fullPath 34 | } 35 | }); 36 | break; 37 | case 404: 38 | Toast({ 39 | message: '网络请求不存在', 40 | duration: 1500, 41 | forbidClick: true 42 | }); 43 | break; 44 | default: 45 | Toast({ 46 | message: error.response.data.message, 47 | duration: 1500, 48 | forbidClick: true 49 | }); 50 | } 51 | return Promise.reject(error.response); 52 | } 53 | } 54 | ); 55 | 56 | export function get(url, params) { 57 | return new Promise((resolve, reject) => { 58 | axios 59 | .get(url, { 60 | params: params 61 | }) 62 | .then(res => { 63 | resolve(res.data); 64 | }) 65 | .catch(err => { 66 | reject(err.data); 67 | }); 68 | }); 69 | } 70 | 71 | export function post(url, params) { 72 | return new Promise((resolve, reject) => { 73 | axios 74 | .post(url, params) 75 | .then(res => { 76 | resolve(res.data); 77 | }) 78 | .catch(err => { 79 | reject(err.data); 80 | }); 81 | }); 82 | } 83 | -------------------------------------------------------------------------------- /src/util/util.js: -------------------------------------------------------------------------------- 1 | export function emailCheck(email) { 2 | var emailreg = /^([a-zA-Z0-9]+[_|.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/; 3 | if (!emailreg.test(email)) { 4 | return false; 5 | } 6 | return true; 7 | } 8 | export function pwdCheck(pwd) { 9 | var pwdreg = /^[a-zA-Z]\w{5,17}$/; 10 | if (!pwdreg.test(pwd)) { 11 | return false; 12 | } 13 | return true; 14 | } 15 | export function phoneNumCheck(phoneNUm) { 16 | var phoneNumreg = /^[1][3,4,5,7,8][0-9]{9}$/; 17 | if (!phoneNumreg.test(phoneNUm)) { 18 | return false; 19 | } 20 | return true; 21 | } 22 | export function stringCheck(string) { 23 | var result = removeSpace(string); 24 | if (result.length === 0) { 25 | return false; 26 | } 27 | return true; 28 | } 29 | 30 | function removeSpace(string) { 31 | var result; 32 | result = string.trim(); 33 | result = result.replace(/\s/g, ''); 34 | return result; 35 | } 36 | 37 | export function timeFormat(time) { 38 | let date = new Date(time); 39 | let month = date.getMonth() + 1; 40 | let day = date.getDay(); 41 | let hour = date.getHours(); 42 | let minutes = date.getMinutes(); 43 | let str = `${month}-${day} ${hour}:${minutes}`; 44 | return str; 45 | } 46 | -------------------------------------------------------------------------------- /src/views/AddressList/AddressList.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 83 | 84 | 95 | -------------------------------------------------------------------------------- /src/views/Cart/Cart.vue: -------------------------------------------------------------------------------- 1 | 80 | 81 | 334 | 335 | 411 | -------------------------------------------------------------------------------- /src/views/EditAddress/EditAddress.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 33 | 34 | 42 | -------------------------------------------------------------------------------- /src/views/Good/Good.vue: -------------------------------------------------------------------------------- 1 | 89 | 90 | 276 | 332 | -------------------------------------------------------------------------------- /src/views/Home/Home.vue: -------------------------------------------------------------------------------- 1 | 58 | 59 | 134 | 135 | 225 | -------------------------------------------------------------------------------- /src/views/Login/Login.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 84 | 85 | 116 | -------------------------------------------------------------------------------- /src/views/NotFound/NotFound.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | 11 | 13 | -------------------------------------------------------------------------------- /src/views/Order/Order.vue: -------------------------------------------------------------------------------- 1 | 68 | 69 | 176 | 177 | 259 | -------------------------------------------------------------------------------- /src/views/OrderList/OrderList.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 76 | 109 | -------------------------------------------------------------------------------- /src/views/Reg/Reg.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 81 | 82 | 113 | -------------------------------------------------------------------------------- /src/views/Tab/Tab.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 37 | 38 | 40 | -------------------------------------------------------------------------------- /src/views/User/User.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 49 | 50 | 70 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | baseUrl: './', 3 | devServer: { 4 | proxy: { 5 | '/api': { 6 | target: 'http://127.0.0.1:3000', 7 | ws: true, 8 | changeOrigin: true, 9 | pathRewrite: { 10 | '^/api': '/' 11 | } 12 | }, 13 | '/img': { 14 | target: 'http://127.0.0.1:80', 15 | changeOrigin: true 16 | } 17 | } 18 | } 19 | }; 20 | --------------------------------------------------------------------------------