├── static └── .gitkeep ├── config ├── prod.env.js ├── dev.env.js └── index.js ├── src ├── assets │ ├── logo.png │ └── img │ │ ├── errorimg.png │ │ └── location.png ├── filter │ └── moneyFilter.js ├── store │ ├── actions.js │ ├── index.js │ ├── state.js │ └── mutations.js ├── App.vue ├── components │ ├── HelloWorld.vue │ ├── pages │ │ ├── city │ │ │ ├── components │ │ │ │ ├── Header.vue │ │ │ │ ├── Alphabet.vue │ │ │ │ ├── Search.vue │ │ │ │ └── List.vue │ │ │ └── City.vue │ │ ├── Main.vue │ │ ├── Register.vue │ │ ├── Member.vue │ │ ├── Login.vue │ │ ├── Cart.vue │ │ ├── Goods.vue │ │ ├── CategoryList.vue │ │ └── ShoppingMall.vue │ └── common │ │ ├── banner.vue │ │ ├── goodsInfo.vue │ │ └── floor.vue ├── config.js ├── main.js └── router │ └── index.js ├── .editorconfig ├── .gitignore ├── server ├── database │ ├── schema │ │ ├── City.js │ │ ├── comments.js │ │ ├── CategorySub.js │ │ ├── Category.js │ │ ├── Goods.js │ │ └── User.js │ └── init.js ├── controller │ ├── city.js │ ├── user.js │ └── goods.js ├── fsJson.js ├── package.json ├── server.js ├── data_json │ ├── category.json │ ├── newcomments.json │ ├── category_sub.json │ └── comments.json ├── server-koa.js ├── home.json └── package-lock.json ├── .postcssrc.js ├── README.md ├── .babelrc ├── index.html └── package.json /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tqq123/Vue-Koa2-MongoDB/HEAD/src/assets/logo.png -------------------------------------------------------------------------------- /src/filter/moneyFilter.js: -------------------------------------------------------------------------------- 1 | export function toMoney(money = 0) { 2 | return money.toFixed(2) 3 | } -------------------------------------------------------------------------------- /src/assets/img/errorimg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tqq123/Vue-Koa2-MongoDB/HEAD/src/assets/img/errorimg.png -------------------------------------------------------------------------------- /src/assets/img/location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tqq123/Vue-Koa2-MongoDB/HEAD/src/assets/img/location.png -------------------------------------------------------------------------------- /src/store/actions.js: -------------------------------------------------------------------------------- 1 | export default { 2 | addGoods (ctx, goods) { 3 | ctx.commit('addGoods', goods) 4 | } 5 | } -------------------------------------------------------------------------------- /config/dev.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const merge = require('webpack-merge') 3 | const prodEnv = require('./prod.env') 4 | 5 | module.exports = merge(prodEnv, { 6 | NODE_ENV: '"development"' 7 | }) 8 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | /dist/ 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Editor directories and files 9 | .idea 10 | .vscode 11 | *.suo 12 | *.ntvs* 13 | *.njsproj 14 | *.sln 15 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | 13 | 18 | -------------------------------------------------------------------------------- /server/database/schema/City.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const Schema = mongoose.Schema 3 | 4 | const cityScheme = new Schema({ 5 | id: {unique:true,type: String}, 6 | spell: {type: String}, 7 | name: {type: String} 8 | }) 9 | 10 | mongoose.model('City', cityScheme) -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import state from './state' 4 | import mutations from './mutations' 5 | import actions from './actions' 6 | 7 | Vue.use(Vuex) 8 | 9 | export default new Vuex.Store({ 10 | state, 11 | mutations, 12 | actions 13 | }) -------------------------------------------------------------------------------- /server/controller/city.js: -------------------------------------------------------------------------------- 1 | const Router = require('koa-router') 2 | const router = new Router() 3 | 4 | const city = require('../data_json/city.json') 5 | 6 | router.get('/city', ctx => { 7 | ctx.body = { 8 | code: 200, 9 | data: city 10 | } 11 | }) 12 | 13 | module.exports = router -------------------------------------------------------------------------------- /.postcssrc.js: -------------------------------------------------------------------------------- 1 | // https://github.com/michael-ciniawsky/postcss-load-config 2 | 3 | module.exports = { 4 | "plugins": { 5 | "postcss-import": {}, 6 | "postcss-url": {}, 7 | // to edit target browsers: use "browserslist" field in package.json 8 | "autoprefixer": {} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /server/database/schema/comments.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const Schema = mongoose.Schema 3 | 4 | const commentsScheme = new Schema({ 5 | 'username': {type:String}, 6 | 'text': {type:String}, 7 | 'avatar': {type:String} 8 | }) 9 | 10 | mongoose.model('Comments', commentsScheme) -------------------------------------------------------------------------------- /src/store/state.js: -------------------------------------------------------------------------------- 1 | let cartInfo = [] 2 | let city = '' 3 | try { 4 | if (localStorage.cartInfo) { 5 | cartInfo = JSON.parse(localStorage.cartInfo) 6 | } 7 | } catch (e) {console.log(e)} 8 | 9 | try { 10 | if (localStorage.city) { 11 | city = localStorage.city 12 | } 13 | } catch (e) {console.log(e)} 14 | 15 | export default {cartInfo, city} 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # vue-mall 2 | Vue + Koa2 + MongoDB 全栈商城WebApp 3 | 4 | 5 | 6 | 7 | ## UI组件库 8 | https://youzan.github.io/vant/ 有赞出品的移动端组件库Vant,基于Vue.js 9 | 10 | ## 说明 11 | 前端就不用说了,npm run dev起服务。主要这里服务端涉及mongoDB数据库,简单说一下,因为我是Mac,用的homebrew装的mongo,强烈推荐homebrew,安利一波 https://brew.sh/, 12 | 之后mongod启动一下,然后到server文件夹下,node server-koa.js启动服务端就ok了。 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /server/database/schema/CategorySub.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const Schema = mongoose.Schema 3 | 4 | const categorySubScheme = new Schema({ 5 | ID: {unique:true,type: String}, 6 | MALL_CATEGORY_ID: {type: String}, 7 | MALL_SUB_NAME: {type: String}, 8 | COMMENTS: {type: String}, 9 | SORT: {type: Number} 10 | }) 11 | 12 | mongoose.model('CategorySub', categorySubScheme) -------------------------------------------------------------------------------- /server/database/schema/Category.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const Schema = mongoose.Schema 3 | 4 | const categoryScheme = new Schema({ 5 | ID: {unique: true,type: String}, 6 | MALL_CATEGORY_NAME: {type: String}, 7 | IMAGE: {type: String}, 8 | TYPE: {type: Number}, 9 | SORT: {type: Number}, 10 | COMMENTS: {type: String} 11 | }) 12 | 13 | mongoose.model('Category', categoryScheme) -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": [ 12 | "transform-vue-jsx", 13 | "transform-runtime", 14 | ["import", { 15 | "libraryName": "vant", 16 | "libraryDirectory": "es", 17 | "style": true 18 | }] 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 18 | 19 | 22 | -------------------------------------------------------------------------------- /src/store/mutations.js: -------------------------------------------------------------------------------- 1 | export default { 2 | addGoods (state, goods) { 3 | state.cartInfo.push(goods) 4 | try { 5 | localStorage.cartInfo = JSON.stringify(state.cartInfo) 6 | } catch (e) {} 7 | }, 8 | clearCart (state) { 9 | state.cartInfo = [] 10 | try { 11 | localStorage.removeItem('cartInfo') 12 | } catch (e) {} 13 | }, 14 | changeCity (state, city) { 15 | state.city = city 16 | localStorage.city = city 17 | } 18 | } -------------------------------------------------------------------------------- /server/fsJson.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs') 2 | 3 | fs.readFile('./data_json/comments.json', 'utf8', (err, data) => { 4 | const newData = JSON.parse(data) 5 | const pushData = [] 6 | newData.ratings.map(item => { 7 | let obj = { 8 | username: item.username, 9 | text: item.text, 10 | avatar: item.avatar 11 | } 12 | pushData.push(obj) 13 | }) 14 | fs.writeFile('./data_json/newcomments.json', JSON.stringify(pushData), err => { 15 | if (err) throw err 16 | }) 17 | }) -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "server.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "bcrypt": "^3.0.3", 15 | "glob": "^7.1.2", 16 | "koa": "^2.5.1", 17 | "koa-bodyparser": "^4.2.1", 18 | "koa-router": "^7.4.0", 19 | "koa2-cors": "^2.0.6", 20 | "mongoose": "^5.1.2" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | vue 7 | 8 | 9 |
10 | 11 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /server/server.js: -------------------------------------------------------------------------------- 1 | var express = require('express') 2 | var axios = require('axios') 3 | 4 | var compression = require('compression') 5 | 6 | var app = express() 7 | //开启gzip 8 | app.use(compression()) 9 | 10 | const HomeData = require('./home.json') 11 | 12 | // api 代理 13 | var apiRoutes = express.Router() 14 | 15 | apiRoutes.get('/index', (req, res) => { 16 | res.json({ 17 | errno: 0, 18 | data: HomeData 19 | }) 20 | }) 21 | 22 | app.use('/api', apiRoutes) 23 | 24 | app.use(express.static('./dist')); 25 | 26 | app.listen(3000, err => { 27 | if (err) { 28 | console.log(err) 29 | return 30 | } 31 | console.log('Listening at http://localhost:3000') 32 | }) -------------------------------------------------------------------------------- /src/components/pages/city/components/Header.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 17 | 18 | 37 | -------------------------------------------------------------------------------- /src/config.js: -------------------------------------------------------------------------------- 1 | const BASEURL = 'http://localhost:8080' 2 | const LOCALURL = 'http://localhost:3000' 3 | export default { 4 | getShoppingMallInfo: LOCALURL + '/api/index', // 首页 5 | getCityInfo: LOCALURL + '/city', // 城市选择信息 6 | registerUser : LOCALURL + '/user/register', // 用户注册 7 | loginUser : LOCALURL + '/user/login', // 用户登录 8 | getAllGoodsInfo: LOCALURL + '/goods/getAllGoodsInfo', // 获取所有商品 9 | getDetailGoodsInfo: LOCALURL + '/goods/getDetailGoodsInfo', // 获取商品详情 10 | getDetailGoodsComments: LOCALURL + '/goods/getDetailGoodsComments', // 获取商品评论 11 | getCategoryList: LOCALURL + '/goods/getCategoryList', // 获取商品大类信息 12 | getCategorySubList: LOCALURL + '/goods/getCategorySubList', // 获取商品小类信息 13 | getGoodsListByCategorySubId: LOCALURL + '/goods/getGoodsListByCategorySubId' // 获取商品列表 14 | } -------------------------------------------------------------------------------- /src/components/common/banner.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 35 | 36 | -------------------------------------------------------------------------------- /server/database/schema/Goods.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const Schema = mongoose.Schema 3 | 4 | const goodsScheme = new Schema({ 5 | ID: {unique:true, type: String}, 6 | GOODS_SERIAL_NUMBER: {type:String}, 7 | SHOP_ID: {type:String}, 8 | SUB_ID: {type:String}, 9 | GOOD_TYPE: {type:Number}, 10 | STATE: {type:Number}, 11 | NAME: {type:String}, 12 | ORI_PRICE: {type:Number}, 13 | PRESENT_PRICE: {type:Number}, 14 | AMOUNT: {type:Number}, 15 | DETAIL: {type:String}, 16 | BRIEF: {type:String}, 17 | SALES_COUNT: {type:Number}, 18 | IMAGE1: {type:String}, 19 | IMAGE2: {type:String}, 20 | IMAGE3: {type:String}, 21 | IMAGE4: {type:String}, 22 | IMAGE5: {type:String}, 23 | ORIGIN_PLACE: {type:String}, 24 | GOOD_SCENT: {type:String}, 25 | CREATE_TIME: {type:String}, 26 | UPDATE_TIME: {type:String}, 27 | IS_RECOMMEND: {type:Number}, 28 | PICTURE_COMPERSS_PATH: {type:String} 29 | }) 30 | 31 | mongoose.model('Goods', goodsScheme) 32 | -------------------------------------------------------------------------------- /server/database/init.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const db = 'mongodb://localhost/vue-mall' 3 | const glob = require('glob') 4 | const {resolve} = require('path') 5 | 6 | exports.initSchemas = () => { 7 | glob.sync(resolve(__dirname, './schema', '**/*.js')).forEach(require) 8 | } 9 | 10 | 11 | exports.connect = () => { 12 | // 连接数据库 13 | mongoose.connect(db) 14 | 15 | let maxConnectTimes = 0 16 | 17 | //监听事件 18 | mongoose.connection.on('disconnected', () => { 19 | console.log('disconnected') 20 | if (maxConnectTimes <= 3) { 21 | maxConnectTimes++ 22 | mongoose.connect(db) 23 | return 24 | } 25 | throw new Error('db error') 26 | }) 27 | 28 | mongoose.connection.on('error', (err) => { 29 | if (maxConnectTimes <= 3) { 30 | maxConnectTimes++ 31 | mongoose.connect(db) 32 | return 33 | } 34 | throw new Error('db error') 35 | }) 36 | 37 | mongoose.connection.on('connected', () => { 38 | console.log('mongo connect success') 39 | }) 40 | } 41 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | // The Vue build version to load with the `import` command 2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias. 3 | import Vue from 'vue' 4 | import App from './components/pages/Main' 5 | import store from './store' 6 | import router from './router' 7 | import fastclick from 'fastclick' 8 | import {NoticeBar, Search, SubmitBar, Card, Icon, Cell, CellGroup, Dialog, Tabbar, TabbarItem, Stepper, PullRefresh, Tab, Tabs, Button, Row, Col, Swipe, SwipeItem, Lazyload, List, Field, NavBar} from 'vant' 9 | 10 | Vue.use(NoticeBar).use(Search).use(SubmitBar).use(Card).use(Icon).use(Cell).use(CellGroup).use(Dialog) 11 | .use(Tabbar).use(TabbarItem).use(Stepper).use(PullRefresh).use(Tab).use(Tabs) 12 | .use(Button).use(Row).use(Col).use(Swipe).use(SwipeItem).use(Lazyload).use(List).use(Field).use(NavBar) 13 | 14 | Vue.config.productionTip = false 15 | 16 | fastclick.attach(document.body) 17 | 18 | /* eslint-disable no-new */ 19 | new Vue({ 20 | el: '#app', 21 | router, 22 | store, 23 | components: { App }, 24 | template: '' 25 | }) 26 | -------------------------------------------------------------------------------- /server/data_json/category.json: -------------------------------------------------------------------------------- 1 | { 2 | "RECORDS":[ 3 | { 4 | "ID":"1", 5 | "MALL_CATEGORY_NAME":"新鲜水果", 6 | "IMAGE":"http:\/\/images.baixingliangfan.cn\/firstCategoryPicture\/20180408\/20180408111959_2837.png", 7 | "TYPE":2, 8 | "SORT":1, 9 | "COMMENTS":null 10 | }, 11 | { 12 | "ID":"2", 13 | "MALL_CATEGORY_NAME":"中外名酒", 14 | "IMAGE":"http:\/\/images.baixingliangfan.cn\/firstCategoryPicture\/20180408\/20180408112010_4489.png", 15 | "TYPE":2, 16 | "SORT":2, 17 | "COMMENTS":null 18 | }, 19 | { 20 | "ID":"3", 21 | "MALL_CATEGORY_NAME":"营养奶品", 22 | "IMAGE":"http:\/\/images.baixingliangfan.cn\/firstCategoryPicture\/20180408\/20180408113102_1595.png", 23 | "TYPE":2, 24 | "SORT":3, 25 | "COMMENTS":null 26 | }, 27 | { 28 | "ID":"4", 29 | "MALL_CATEGORY_NAME":"个人护理", 30 | "IMAGE":"http:\/\/images.baixingliangfan.cn\/firstCategoryPicture\/20180408\/20180408112053_8191.png", 31 | "TYPE":2, 32 | "SORT":5, 33 | "COMMENTS":null 34 | }, 35 | { 36 | "ID":"5", 37 | "MALL_CATEGORY_NAME":"食品饮料", 38 | "IMAGE":"http:\/\/images.baixingliangfan.cn\/firstCategoryPicture\/20180408\/20180408113048_1276.png", 39 | "TYPE":2, 40 | "SORT":4, 41 | "COMMENTS":null 42 | } 43 | ] 44 | } -------------------------------------------------------------------------------- /server/database/schema/User.js: -------------------------------------------------------------------------------- 1 | const mongoose = require('mongoose') 2 | const Schema = mongoose.Schema 3 | let ObjectId = Schema.Types.ObjectId 4 | 5 | const bcrypt = require('bcrypt') 6 | const SALT_WORK_FACTOR = 10 7 | 8 | // 创建UserSchema 9 | const userSchema = new Schema({ 10 | UserId: {type: ObjectId}, 11 | userName: {unique: true, type: String}, 12 | password: {type: String}, 13 | createAt: {type: Date, default: Date.now()}, 14 | lastLoginAt: {type: Date, default: Date.now()} 15 | }) 16 | // 加盐加密 17 | userSchema.pre('save', function (next) { 18 | bcrypt.genSalt(SALT_WORK_FACTOR, (err, salt) => { 19 | if (err) return next(err) 20 | bcrypt.hash(this.password,salt, (err, hash) => { 21 | if (err) return next(err) 22 | this.password = hash 23 | next() 24 | }) 25 | }) 26 | }) 27 | // 密码比对 28 | userSchema.methods = { 29 | comparePassword: (_password, password) => { 30 | return new Promise((resolve, reject) => { 31 | bcrypt.compare(_password, password, (err, isMatch) => { 32 | err ? reject(err) : resolve(isMatch) 33 | }) 34 | }) 35 | } 36 | } 37 | 38 | // 发布Schema 39 | mongoose.model('User', userSchema) -------------------------------------------------------------------------------- /src/components/common/goodsInfo.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 49 | 50 | -------------------------------------------------------------------------------- /src/components/pages/city/City.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 52 | 53 | 56 | -------------------------------------------------------------------------------- /server/controller/user.js: -------------------------------------------------------------------------------- 1 | const Router = require('koa-router') 2 | const mongoose = require('mongoose') 3 | 4 | let router = new Router() 5 | 6 | router.get('/', async (ctx) => { 7 | ctx.body = 'home' 8 | }) 9 | 10 | router.post('/register', async (ctx) => { 11 | const User = mongoose.model('User') 12 | let newUser = new User(ctx.request.body) 13 | 14 | newUser.save().then(() => { 15 | ctx.body = { 16 | code: 200, 17 | message: '注册成功' 18 | } 19 | }).catch(e => { 20 | ctx.body = { 21 | code: 500, 22 | message: e 23 | } 24 | }) 25 | }) 26 | 27 | router.post('/login', async (ctx) => { 28 | let loginUser = ctx.request.body 29 | let userName = loginUser.userName 30 | let password = loginUser.password 31 | 32 | const User = mongoose.model('User') 33 | // 比对用户名 34 | User.findOne({userName}).then(async (res) => { 35 | if (res) { 36 | let newUser = new User() 37 | await newUser.comparePassword(password, res.password).then(res => { 38 | ctx.body = { 39 | code: 200, 40 | message: res 41 | } 42 | }).catch(err => { 43 | ctx.body ={ 44 | code: 500, 45 | message: err 46 | } 47 | }) 48 | } else { 49 | ctx.body = { 50 | code: 200, 51 | message: res 52 | } 53 | } 54 | }).catch(err => { 55 | ctx.body = { 56 | code: 500, 57 | message: err 58 | } 59 | }) 60 | }) 61 | 62 | module.exports = router -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import ShoppingMall from '@/components/pages/ShoppingMall' 4 | import Register from '@/components/pages/Register' 5 | import Login from '@/components/pages/Login' 6 | import Goods from '@/components/pages/Goods' 7 | import CategoryList from '@/components/pages/CategoryList' 8 | import Cart from '@/components/pages/Cart' 9 | import Member from '@/components/pages/Member' 10 | import City from '@/components/pages/city/City' 11 | 12 | Vue.use(Router) 13 | 14 | export default new Router({ 15 | routes: [ 16 | { 17 | path: '/', 18 | redirect: '/home', 19 | }, 20 | { 21 | path: '/home', 22 | name: 'ShoppingMall', 23 | component: ShoppingMall 24 | }, 25 | { 26 | path: '/register', 27 | name: 'Register', 28 | component: Register 29 | }, 30 | { 31 | path: '/login', 32 | name: 'Login', 33 | component: Login 34 | }, 35 | { 36 | path: '/goods', 37 | name: 'Goods', 38 | component: Goods 39 | }, 40 | { 41 | path: '/categorylist', 42 | name: 'CategoryList', 43 | component: CategoryList 44 | }, 45 | { 46 | path: '/cart', 47 | name: 'Cart', 48 | component: Cart 49 | }, 50 | { 51 | path: '/member', 52 | name: 'Member', 53 | component: Member 54 | }, 55 | { 56 | path: '/city', 57 | name: 'City', 58 | component: City 59 | } 60 | ] 61 | }) 62 | -------------------------------------------------------------------------------- /server/server-koa.js: -------------------------------------------------------------------------------- 1 | const Koa = require('koa') 2 | const app = new Koa() 3 | const {connect, initSchemas} = require('./database/init') 4 | const mongoose = require('mongoose') 5 | const bodyParser = require('koa-bodyparser') 6 | const cors = require('koa2-cors') 7 | const Router = require('koa-router') 8 | 9 | app.use(bodyParser()) 10 | app.use(cors()) 11 | 12 | const user = require('./controller/user') 13 | const goods = require('./controller/goods') 14 | 15 | let router = new Router() 16 | 17 | // 城市信息 18 | const city = require('./data_json/city.json') 19 | 20 | router.get('/city', ctx => { 21 | ctx.body = { 22 | code: 200, 23 | data: city 24 | } 25 | }) 26 | // 装载子路由 27 | router.use('/user', user.routes()) 28 | router.use('/goods', goods.routes()) 29 | 30 | // 加载路由中间件 31 | app.use(router.routes()) 32 | 33 | app.use(router.allowedMethods()) 34 | 35 | connect() 36 | initSchemas() 37 | const Comments = mongoose.model('Comments') 38 | Comments.remove({}, ()=>{}) 39 | const Goods = mongoose.model('Goods') 40 | Goods.remove({}, ()=>{}) 41 | const Category = mongoose.model('Category') 42 | Category.remove({}, ()=>{}) 43 | const CategorySub = mongoose.model('CategorySub') 44 | CategorySub.remove({}, ()=>{}) 45 | // let tqq = new User({userName: 'tqq1', password: '123'}) 46 | // tqq.save().then(() => { 47 | // console.log('插入成功') 48 | // }) 49 | // User.find().then(res => console.log(res)) 50 | const HomeData = require('./home.json') 51 | app.use(async (ctx) => { 52 | ctx.body = { 53 | errno: 0, 54 | data: HomeData 55 | } 56 | }) 57 | 58 | app.listen(3000, () => { 59 | console.log('Listening at http://localhost:3000') 60 | }) -------------------------------------------------------------------------------- /src/components/pages/city/components/Alphabet.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 74 | 75 | 93 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "vue", 3 | "version": "1.0.0", 4 | "description": "A Vue.js project", 5 | "author": "tqq <2521000359@qq.com>", 6 | "private": true, 7 | "scripts": { 8 | "dev": "webpack-dev-server --host 0.0.0.0 --open --inline --progress --config build/webpack.dev.conf.js", 9 | "start": "npm run dev", 10 | "build": "node build/build.js" 11 | }, 12 | "dependencies": { 13 | "axios": "^0.18.0", 14 | "better-scroll": "^1.12.6", 15 | "cors": "^2.8.4", 16 | "fastclick": "^1.0.6", 17 | "vant": "^1.0.8", 18 | "vconsole": "^3.2.0", 19 | "vue": "^2.5.2", 20 | "vue-awesome-swiper": "^3.1.3", 21 | "vue-router": "^3.0.1", 22 | "vuex": "^3.0.1" 23 | }, 24 | "devDependencies": { 25 | "autoprefixer": "^7.1.2", 26 | "babel-core": "^6.22.1", 27 | "babel-helper-vue-jsx-merge-props": "^2.0.3", 28 | "babel-loader": "^7.1.1", 29 | "babel-plugin-import": "^1.7.0", 30 | "babel-plugin-syntax-jsx": "^6.18.0", 31 | "babel-plugin-transform-runtime": "^6.22.0", 32 | "babel-plugin-transform-vue-jsx": "^3.5.0", 33 | "babel-preset-env": "^1.3.2", 34 | "babel-preset-stage-2": "^6.22.0", 35 | "chalk": "^2.0.1", 36 | "copy-webpack-plugin": "^4.0.1", 37 | "css-loader": "^0.28.0", 38 | "extract-text-webpack-plugin": "^3.0.0", 39 | "file-loader": "^1.1.4", 40 | "friendly-errors-webpack-plugin": "^1.6.1", 41 | "html-webpack-plugin": "^2.30.1", 42 | "node-notifier": "^5.1.2", 43 | "optimize-css-assets-webpack-plugin": "^3.2.0", 44 | "ora": "^1.2.0", 45 | "portfinder": "^1.0.13", 46 | "postcss-import": "^11.0.0", 47 | "postcss-loader": "^2.0.8", 48 | "postcss-url": "^7.2.1", 49 | "rimraf": "^2.6.0", 50 | "semver": "^5.3.0", 51 | "shelljs": "^0.7.6", 52 | "uglifyjs-webpack-plugin": "^1.1.1", 53 | "url-loader": "^0.5.8", 54 | "vue-loader": "^13.3.0", 55 | "vue-style-loader": "^3.0.1", 56 | "vue-template-compiler": "^2.5.2", 57 | "webpack": "^3.6.0", 58 | "webpack-bundle-analyzer": "^2.9.0", 59 | "webpack-dev-server": "^2.9.1", 60 | "webpack-merge": "^4.1.0" 61 | }, 62 | "engines": { 63 | "node": ">= 6.0.0", 64 | "npm": ">= 3.0.0" 65 | }, 66 | "browserslist": [ 67 | "> 1%", 68 | "last 2 versions", 69 | "not ie <= 8" 70 | ] 71 | } 72 | -------------------------------------------------------------------------------- /config/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | // Template version: 1.3.1 3 | // see http://vuejs-templates.github.io/webpack for documentation. 4 | 5 | const path = require('path') 6 | 7 | module.exports = { 8 | dev: { 9 | 10 | // Paths 11 | assetsSubDirectory: 'static', 12 | assetsPublicPath: '/', 13 | proxyTable: { 14 | '/api': { 15 | target: 'http://localhost:3000' 16 | } 17 | }, 18 | 19 | // Various Dev Server settings 20 | host: 'localhost', // can be overwritten by process.env.HOST 21 | port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined 22 | autoOpenBrowser: false, 23 | errorOverlay: true, 24 | notifyOnErrors: true, 25 | poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions- 26 | 27 | 28 | /** 29 | * Source Maps 30 | */ 31 | 32 | // https://webpack.js.org/configuration/devtool/#development 33 | devtool: 'cheap-module-eval-source-map', 34 | 35 | // If you have problems debugging vue-files in devtools, 36 | // set this to false - it *may* help 37 | // https://vue-loader.vuejs.org/en/options.html#cachebusting 38 | cacheBusting: true, 39 | 40 | cssSourceMap: true 41 | }, 42 | 43 | build: { 44 | // Template for index.html 45 | index: path.resolve(__dirname, '../dist/index.html'), 46 | 47 | // Paths 48 | assetsRoot: path.resolve(__dirname, '../dist'), 49 | assetsSubDirectory: 'static', 50 | assetsPublicPath: '/', 51 | 52 | /** 53 | * Source Maps 54 | */ 55 | 56 | productionSourceMap: true, 57 | // https://webpack.js.org/configuration/devtool/#production 58 | devtool: '#source-map', 59 | 60 | // Gzip off by default as many popular static hosts such as 61 | // Surge or Netlify already gzip all static assets for you. 62 | // Before setting to `true`, make sure to: 63 | // npm install --save-dev compression-webpack-plugin 64 | productionGzip: false, 65 | productionGzipExtensions: ['js', 'css'], 66 | 67 | // Run the build command with an extra argument to 68 | // View the bundle analyzer report after build finishes: 69 | // `npm run build --report` 70 | // Set to `true` or `false` to always turn it on or off 71 | bundleAnalyzerReport: process.env.npm_config_report 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /src/components/pages/Main.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 100 | 101 | -------------------------------------------------------------------------------- /server/data_json/newcomments.json: -------------------------------------------------------------------------------- 1 | [{"username":"3******c","text":"不错,粥很好喝,我经常吃这一家,非常赞,以后也会常来吃,强烈推荐.","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"2******3","text":"服务态度不错","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"3******b","text":"","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"1******c","text":"良心店铺","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"2******d","text":"","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"9******0","text":"送货速度蜗牛一样","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"d******c","text":"很喜欢的粥店","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"2******3","text":"量给的还可以","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"3******8","text":"","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"a******a","text":"孩子喜欢吃这家","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"3******3","text":"粥挺好吃的","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"t******b","text":"","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"f******c","text":"送货速度很快","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"k******3","text":"","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"u******b","text":"下雨天给快递小哥点个赞","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"s******c","text":"好","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"z******3","text":"吃了还想再吃","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"n******b","text":"发票开的不对","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"m******c","text":"好吃","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"l******3","text":"还不错吧","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"3******o","text":"","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"3******p","text":"很喜欢的粥","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"o******k","text":"","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"},{"username":"k******b","text":"","avatar":"http://static.galileo.xiaojukeji.com/static/tms/default_header.png"}] -------------------------------------------------------------------------------- /src/components/common/floor.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 63 | 64 | -------------------------------------------------------------------------------- /src/components/pages/Register.vue: -------------------------------------------------------------------------------- 1 | 35 | 36 | 92 | 93 | -------------------------------------------------------------------------------- /src/components/pages/Member.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 80 | 81 | -------------------------------------------------------------------------------- /src/components/pages/city/components/Search.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 78 | 79 | 115 | -------------------------------------------------------------------------------- /src/components/pages/city/components/List.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 78 | 79 | 122 | -------------------------------------------------------------------------------- /src/components/pages/Login.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 102 | 103 | -------------------------------------------------------------------------------- /server/data_json/category_sub.json: -------------------------------------------------------------------------------- 1 | { 2 | "RECORDS":[ 3 | { 4 | "ID":"2c9f6c946016ea9b016016f79c8e0000", 5 | "MALL_CATEGORY_ID":"1", 6 | "MALL_SUB_NAME":"热带水果", 7 | "COMMENTS":null, 8 | "SORT":1 9 | }, 10 | { 11 | "ID":"2c9f6c946016f86f01601709335d0000", 12 | "MALL_CATEGORY_ID":"5", 13 | "MALL_SUB_NAME":"乳制饮料", 14 | "COMMENTS":null, 15 | "SORT":9 16 | }, 17 | { 18 | "ID":"2c9f6c9460337d540160337fefd60000", 19 | "MALL_CATEGORY_ID":"2", 20 | "MALL_SUB_NAME":"白酒", 21 | "COMMENTS":null, 22 | "SORT":1 23 | }, 24 | { 25 | "ID":"2c9f6c946077476a0160781eb392000d", 26 | "MALL_CATEGORY_ID":"5", 27 | "MALL_SUB_NAME":"咖啡茶饮", 28 | "COMMENTS":null, 29 | "SORT":10 30 | }, 31 | { 32 | "ID":"2c9f6c946077476a0160781f6d8c000e", 33 | "MALL_CATEGORY_ID":"5", 34 | "MALL_SUB_NAME":"功能饮料", 35 | "COMMENTS":null, 36 | "SORT":12 37 | }, 38 | { 39 | "ID":"2c9f6c94608ff843016095163b8c0177", 40 | "MALL_CATEGORY_ID":"1", 41 | "MALL_SUB_NAME":"时令水果", 42 | "COMMENTS":null, 43 | "SORT":2 44 | }, 45 | { 46 | "ID":"2c9f6c94609a62be0160a02d1dc20021", 47 | "MALL_CATEGORY_ID":"5", 48 | "MALL_SUB_NAME":"饼干糕点", 49 | "COMMENTS":null, 50 | "SORT":1 51 | }, 52 | { 53 | "ID":"2c9f6c94609a62be0160a02de70e0022", 54 | "MALL_CATEGORY_ID":"5", 55 | "MALL_SUB_NAME":"冲调饮品", 56 | "COMMENTS":null, 57 | "SORT":4 58 | }, 59 | { 60 | "ID":"2c9f6c9460a03c0c0160a041ab1d0000", 61 | "MALL_CATEGORY_ID":"3", 62 | "MALL_SUB_NAME":"奶油奶酪", 63 | "COMMENTS":null, 64 | "SORT":4 65 | }, 66 | { 67 | "ID":"2c9f6c94621970a801626a35cb4d0175", 68 | "MALL_CATEGORY_ID":"4", 69 | "MALL_SUB_NAME":"进口护理", 70 | "COMMENTS":null, 71 | "SORT":1 72 | }, 73 | { 74 | "ID":"2c9f6c94621970a801626a363e5a0176", 75 | "MALL_CATEGORY_ID":"4", 76 | "MALL_SUB_NAME":"口腔护理", 77 | "COMMENTS":null, 78 | "SORT":2 79 | }, 80 | { 81 | "ID":"2c9f6c94621970a801626a3770620177", 82 | "MALL_CATEGORY_ID":"4", 83 | "MALL_SUB_NAME":"特殊用纸", 84 | "COMMENTS":null, 85 | "SORT":3 86 | }, 87 | { 88 | "ID":"2c9f6c94621970a801626a40feac0178", 89 | "MALL_CATEGORY_ID":"2", 90 | "MALL_SUB_NAME":"洋酒", 91 | "COMMENTS":null, 92 | "SORT":4 93 | }, 94 | { 95 | "ID":"2c9f6c94621970a801626a412c240179", 96 | "MALL_CATEGORY_ID":"2", 97 | "MALL_SUB_NAME":"海外直采", 98 | "COMMENTS":null, 99 | "SORT":5 100 | }, 101 | { 102 | "ID":"2c9f6c94626a435f01626a4a7f590000", 103 | "MALL_CATEGORY_ID":"5", 104 | "MALL_SUB_NAME":"进口食品", 105 | "COMMENTS":null, 106 | "SORT":5 107 | }, 108 | { 109 | "ID":"402880e86016d1b5016016db9b290001", 110 | "MALL_CATEGORY_ID":"1", 111 | "MALL_SUB_NAME":"苹果\/梨", 112 | "COMMENTS":null, 113 | "SORT":3 114 | }, 115 | { 116 | "ID":"402880e86016d1b5016016dbff2f0002", 117 | "MALL_CATEGORY_ID":"1", 118 | "MALL_SUB_NAME":"柑橘橙柚", 119 | "COMMENTS":null, 120 | "SORT":4 121 | }, 122 | { 123 | "ID":"402880e86016d1b5016016df1f92000c", 124 | "MALL_CATEGORY_ID":"2", 125 | "MALL_SUB_NAME":"葡萄酒", 126 | "COMMENTS":null, 127 | "SORT":3 128 | }, 129 | { 130 | "ID":"402880e86016d1b5016016e083f10010", 131 | "MALL_CATEGORY_ID":"2", 132 | "MALL_SUB_NAME":"啤酒", 133 | "COMMENTS":null, 134 | "SORT":2 135 | }, 136 | { 137 | "ID":"402880e86016d1b5016016e135440011", 138 | "MALL_CATEGORY_ID":"3", 139 | "MALL_SUB_NAME":"鲜奶", 140 | "COMMENTS":null, 141 | "SORT":1 142 | }, 143 | { 144 | "ID":"402880e86016d1b5016016e171cc0012", 145 | "MALL_CATEGORY_ID":"3", 146 | "MALL_SUB_NAME":"酸奶", 147 | "COMMENTS":null, 148 | "SORT":2 149 | }, 150 | { 151 | "ID":"402880e86016d1b5016016e240e60013", 152 | "MALL_CATEGORY_ID":"3", 153 | "MALL_SUB_NAME":"乳酸菌", 154 | "COMMENTS":null, 155 | "SORT":3 156 | }, 157 | { 158 | "ID":"402880e86016d1b5016016e4ac16001d", 159 | "MALL_CATEGORY_ID":"5", 160 | "MALL_SUB_NAME":"坚果炒货", 161 | "COMMENTS":null, 162 | "SORT":6 163 | }, 164 | { 165 | "ID":"402880e86016d1b5016016e4dca2001e", 166 | "MALL_CATEGORY_ID":"5", 167 | "MALL_SUB_NAME":"休闲小食", 168 | "COMMENTS":null, 169 | "SORT":2 170 | }, 171 | { 172 | "ID":"402880e86016d1b5016016e51380001f", 173 | "MALL_CATEGORY_ID":"5", 174 | "MALL_SUB_NAME":"糖果巧克力", 175 | "COMMENTS":null, 176 | "SORT":3 177 | }, 178 | { 179 | "ID":"402880e86016d1b5016016e549710020", 180 | "MALL_CATEGORY_ID":"5", 181 | "MALL_SUB_NAME":"饮用水", 182 | "COMMENTS":null, 183 | "SORT":7 184 | }, 185 | { 186 | "ID":"402880e86016d1b5016016e62bbd0021", 187 | "MALL_CATEGORY_ID":"5", 188 | "MALL_SUB_NAME":"碳酸饮料", 189 | "COMMENTS":null, 190 | "SORT":11 191 | }, 192 | { 193 | "ID":"402880e86016d1b5016016e656c50022", 194 | "MALL_CATEGORY_ID":"5", 195 | "MALL_SUB_NAME":"果蔬汁", 196 | "COMMENTS":null, 197 | "SORT":8 198 | } 199 | ] 200 | } -------------------------------------------------------------------------------- /server/controller/goods.js: -------------------------------------------------------------------------------- 1 | const Router = require('koa-router') 2 | const mongoose = require('mongoose') 3 | const fs = require('fs') 4 | let router = new Router() 5 | 6 | // 存入数据库 7 | 8 | router.get('/insertGoodsComments', ctx => { 9 | let data = require('../data_json/newcomments.json') 10 | let saveCount = 0 11 | const Comments = mongoose.model('Comments') 12 | data.map(item => { 13 | let newComments = new Comments(item) 14 | newComments.save().then(() => { 15 | saveCount ++ 16 | console.log(saveCount) 17 | }).catch(err => { 18 | throw err 19 | }) 20 | }) 21 | console.log("导入评论成功") 22 | ctx.body = {code:200} 23 | }) 24 | 25 | router.get('/insertAllGoodsInfo', async (ctx) => { 26 | fs.readFile('./data_json/newGoods.json', 'utf8', (err, data) => { 27 | if (err) throw err 28 | data = JSON.parse(data) 29 | let saveCount = 0 30 | const Goods = mongoose.model('Goods') 31 | data.map(item => { 32 | let newGoods = new Goods(item) 33 | newGoods.save().then(() => { 34 | saveCount ++ 35 | console.log(saveCount) 36 | }).catch(err => { 37 | throw err 38 | }) 39 | }) 40 | }) 41 | console.log("导入商品成功") 42 | ctx.body = {code:200} 43 | }) 44 | 45 | router.get('/insertAllCategory', async (ctx) => { 46 | fs.readFile('./data_json/category.json', 'utf8', (err, data) => { 47 | if (err) throw err 48 | data = JSON.parse(data) 49 | let saveCount = 0 50 | const Category = mongoose.model('Category') 51 | data.RECORDS.map(item => { 52 | let newCategory = new Category(item) 53 | newCategory.save().then(() => { 54 | saveCount ++ 55 | console.log(saveCount) 56 | }).catch(err => { 57 | throw err 58 | }) 59 | }) 60 | }) 61 | console.log("导入分类成功") 62 | ctx.body = {code:200} 63 | }) 64 | 65 | router.get('/insertAllCategorySub', async (ctx) => { 66 | fs.readFile('./data_json/category_sub.json', 'utf8', (err, data) => { 67 | if (err) throw err 68 | data = JSON.parse(data) 69 | let saveCount = 0 70 | const CategorySub = mongoose.model('CategorySub') 71 | data.RECORDS.map(item => { 72 | let newCategory = new CategorySub(item) 73 | newCategory.save().then(() => { 74 | saveCount ++ 75 | console.log(saveCount) 76 | }).catch(err => { 77 | throw err 78 | }) 79 | }) 80 | }) 81 | console.log("导入子分类成功") 82 | ctx.body = {code:200} 83 | }) 84 | 85 | // 商品详情 86 | router.post('/getDetailGoodsInfo', async (ctx) => { 87 | let goodsId = ctx.request.body.goodsId 88 | const Goods = mongoose.model('Goods') 89 | let res = await Goods.findOne({ID: goodsId}) 90 | ctx.body = { 91 | code: 200, 92 | message: res 93 | } 94 | }) 95 | 96 | // 商品详情评论 97 | router.post('/getDetailGoodsComments', async (ctx) => { 98 | let goodsId = ctx.request.body.goodsId 99 | const Comments = mongoose.model('Comments') 100 | let res = await Comments.find() 101 | ctx.body = { 102 | code: 200, 103 | message: res 104 | } 105 | }) 106 | 107 | // 所有商品列表 108 | router.get('/getAllGoodsInfo', async (ctx) => { 109 | let goodsId = ctx.request.body.goodsId 110 | const Goods = mongoose.model('Goods') 111 | let res = await Goods.find() 112 | ctx.body = { 113 | code: 200, 114 | message: res 115 | } 116 | }) 117 | 118 | // 商品大类 119 | router.get('/getCategoryList', async (ctx) => { 120 | const Category = mongoose.model('Category') 121 | let res = await Category.find() 122 | ctx.body = { 123 | code: 200, 124 | message: res 125 | } 126 | }) 127 | 128 | // 商品子类 129 | router.post('/getCategorySubList', async (ctx) => { 130 | const categoryId = ctx.request.body.categoryId 131 | const CategorySub = mongoose.model('CategorySub') 132 | let res = await CategorySub.find({MALL_CATEGORY_ID: categoryId}) 133 | ctx.body = { 134 | code: 200, 135 | message: res 136 | } 137 | }) 138 | 139 | // 商品列表 140 | router.post('/getGoodsListByCategorySubId', async (ctx) => { 141 | const categorySubId = ctx.request.body.categorySubId 142 | let page = ctx.request.body.page // 当前页数 143 | let num = 10 // 每页数量 144 | let startIndex = (page - 1) * num 145 | const Goods = mongoose.model('Goods') 146 | let res = await Goods.find({SUB_ID: categorySubId}).skip(startIndex).limit(num) // 查询限制条件 147 | ctx.body = { 148 | code: 200, 149 | message: res 150 | } 151 | }) 152 | 153 | module.exports = router -------------------------------------------------------------------------------- /src/components/pages/Cart.vue: -------------------------------------------------------------------------------- 1 | 58 | 59 | 138 | 139 | -------------------------------------------------------------------------------- /src/components/pages/Goods.vue: -------------------------------------------------------------------------------- 1 | 49 | 50 | 141 | 146 | -------------------------------------------------------------------------------- /src/components/pages/CategoryList.vue: -------------------------------------------------------------------------------- 1 | 44 | 45 | 184 | 185 | -------------------------------------------------------------------------------- /server/data_json/comments.json: -------------------------------------------------------------------------------- 1 | { 2 | "ratings": [ 3 | { 4 | "username": "3******c", 5 | "rateTime": 1469281964000, 6 | "deliveryTime": 30, 7 | "score": 5, 8 | "rateType": 0, 9 | "text": "不错,粥很好喝,我经常吃这一家,非常赞,以后也会常来吃,强烈推荐.", 10 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 11 | "recommend": [ 12 | "南瓜粥", 13 | "皮蛋瘦肉粥", 14 | "扁豆焖面", 15 | "娃娃菜炖豆腐", 16 | "牛肉馅饼" 17 | ] 18 | }, 19 | { 20 | "username": "2******3", 21 | "rateTime": 1469271264000, 22 | "deliveryTime": "", 23 | "score": 4, 24 | "rateType": 0, 25 | "deliveryTime": "", 26 | "text": "服务态度不错", 27 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 28 | "recommend": [ 29 | "扁豆焖面" 30 | ] 31 | }, 32 | { 33 | "username": "3******b", 34 | "rateTime": 1469261964000, 35 | "score": 3, 36 | "rateType": 1, 37 | "text": "", 38 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 39 | "recommend": [] 40 | }, 41 | { 42 | "username": "1******c", 43 | "rateTime": 1469261864000, 44 | "deliveryTime": 20, 45 | "score": 5, 46 | "rateType": 0, 47 | "text": "良心店铺", 48 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 49 | "recommend": [] 50 | }, 51 | { 52 | "username": "2******d", 53 | "rateTime": 1469251264000, 54 | "deliveryTime": 10, 55 | "score": 4, 56 | "rateType": 0, 57 | "text": "", 58 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 59 | "recommend": [] 60 | }, 61 | { 62 | "username": "9******0", 63 | "rateTime": 1469241964000, 64 | "deliveryTime": 70, 65 | "score": 1, 66 | "rateType": 1, 67 | "text": "送货速度蜗牛一样", 68 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 69 | "recommend": [] 70 | }, 71 | { 72 | "username": "d******c", 73 | "rateTime": 1469231964000, 74 | "deliveryTime": 30, 75 | "score": 5, 76 | "rateType": 0, 77 | "text": "很喜欢的粥店", 78 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 79 | "recommend": [] 80 | }, 81 | { 82 | "username": "2******3", 83 | "rateTime": 1469221264000, 84 | "deliveryTime": "", 85 | "score": 4, 86 | "rateType": 0, 87 | "text": "量给的还可以", 88 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 89 | "recommend": [] 90 | }, 91 | { 92 | "username": "3******8", 93 | "rateTime": 1469211964000, 94 | "deliveryTime": "", 95 | "score": 3, 96 | "rateType": 1, 97 | "text": "", 98 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 99 | "recommend": [] 100 | }, 101 | { 102 | "username": "a******a", 103 | "rateTime": 1469201964000, 104 | "deliveryTime": "", 105 | "score": 4, 106 | "rateType": 0, 107 | "text": "孩子喜欢吃这家", 108 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 109 | "recommend": [ 110 | "南瓜粥" 111 | ] 112 | }, 113 | { 114 | "username": "3******3", 115 | "rateTime": 1469191264000, 116 | "deliveryTime": "", 117 | "score": 4, 118 | "rateType": 0, 119 | "text": "粥挺好吃的", 120 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 121 | "recommend": [] 122 | }, 123 | { 124 | "username": "t******b", 125 | "rateTime": 1469181964000, 126 | "deliveryTime": "", 127 | "score": 3, 128 | "rateType": 1, 129 | "text": "", 130 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 131 | "recommend": [] 132 | }, 133 | { 134 | "username": "f******c", 135 | "rateTime": 1469171964000, 136 | "deliveryTime": 15, 137 | "score": 5, 138 | "rateType": 0, 139 | "text": "送货速度很快", 140 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 141 | "recommend": [] 142 | }, 143 | { 144 | "username": "k******3", 145 | "rateTime": 1469161264000, 146 | "deliveryTime": "", 147 | "score": 4, 148 | "rateType": 0, 149 | "text": "", 150 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 151 | "recommend": [] 152 | }, 153 | { 154 | "username": "u******b", 155 | "rateTime": 1469151964000, 156 | "deliveryTime": "", 157 | "score": 4, 158 | "rateType": 0, 159 | "text": "下雨天给快递小哥点个赞", 160 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 161 | "recommend": [] 162 | }, 163 | { 164 | "username": "s******c", 165 | "rateTime": 1469141964000, 166 | "deliveryTime": "", 167 | "score": 4, 168 | "rateType": 0, 169 | "text": "好", 170 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 171 | "recommend": [] 172 | }, 173 | { 174 | "username": "z******3", 175 | "rateTime": 1469131264000, 176 | "deliveryTime": "", 177 | "score": 5, 178 | "rateType": 0, 179 | "text": "吃了还想再吃", 180 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 181 | "recommend": [] 182 | }, 183 | { 184 | "username": "n******b", 185 | "rateTime": 1469121964000, 186 | "deliveryTime": "", 187 | "score": 3, 188 | "rateType": 1, 189 | "text": "发票开的不对", 190 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 191 | "recommend": [] 192 | }, 193 | { 194 | "username": "m******c", 195 | "rateTime": 1469111964000, 196 | "deliveryTime": 30, 197 | "score": 5, 198 | "rateType": 0, 199 | "text": "好吃", 200 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 201 | "recommend": [] 202 | }, 203 | { 204 | "username": "l******3", 205 | "rateTime": 1469101264000, 206 | "deliveryTime": 40, 207 | "score": 5, 208 | "rateType": 0, 209 | "text": "还不错吧", 210 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 211 | "recommend": [] 212 | }, 213 | { 214 | "username": "3******o", 215 | "rateTime": 1469091964000, 216 | "deliveryTime": "", 217 | "score": 2, 218 | "rateType": 1, 219 | "text": "", 220 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 221 | "recommend": [] 222 | }, 223 | { 224 | "username": "3******p", 225 | "rateTime": 1469081964000, 226 | "deliveryTime": "", 227 | "score": 4, 228 | "rateType": 0, 229 | "text": "很喜欢的粥", 230 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 231 | "recommend": [] 232 | }, 233 | { 234 | "username": "o******k", 235 | "rateTime": 1469071264000, 236 | "deliveryTime": "", 237 | "score": 5, 238 | "rateType": 0, 239 | "text": "", 240 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 241 | "recommend": [] 242 | }, 243 | { 244 | "username": "k******b", 245 | "rateTime": 1469061964000, 246 | "deliveryTime": "", 247 | "score": 4, 248 | "rateType": 0, 249 | "text": "", 250 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 251 | "recommend": [] 252 | } 253 | ] 254 | } -------------------------------------------------------------------------------- /src/components/pages/ShoppingMall.vue: -------------------------------------------------------------------------------- 1 | 75 | 76 | 227 | 232 | -------------------------------------------------------------------------------- /server/home.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": { 3 | "advertesPicture": { 4 | "PICTURE_ADDRESS": "http://images.baixingliangfan.cn/advertesPicture/20180404/20180404085441_850.gif" 5 | }, 6 | "floor3": [ 7 | { 8 | "goodsId": "ae4e71807a91460792670b657fa3ed3a", 9 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407181423_15.jpg" 10 | }, 11 | { 12 | "goodsId": "2a398a5048074fc3b36bc8026bf9dc65", 13 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407181216_8263.jpg" 14 | }, 15 | { 16 | "goodsId": "b37577ce45ee4cc6ba162959933dbac8", 17 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407181247_7554.jpg" 18 | }, 19 | { 20 | "goodsId": "43912e1f7b7842cab40fcdee9dbe8758", 21 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407181316_6196.jpg" 22 | }, 23 | { 24 | "goodsId": "98922617593e44c9a5880329a4cf0fd0", 25 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407181348_4054.jpg" 26 | } 27 | ], 28 | "floor2": [ 29 | { 30 | "goodsId": "d0fabe0c966043cb8313fa55de9c555b", 31 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407180547_3253.jpg" 32 | }, 33 | { 34 | "goodsId": "36360da2ec084316a100c2df1c714e37", 35 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407180631_4071.jpg" 36 | }, 37 | { 38 | "goodsId": "eb47b495b65d42b8a1fc5823dcd5589c", 39 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407180705_7181.jpg" 40 | }, 41 | { 42 | "goodsId": "7f6e857e83b240508836717c8764a0b0", 43 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407180736_2822.jpg" 44 | }, 45 | { 46 | "goodsId": "c7cb656294ea48d3b224ddee5fdd9647", 47 | "image": "http://images.baixingliangfan.cn/homeFloor/20180408/20180408081756_7181.jpg" 48 | } 49 | ], 50 | "floorName": { 51 | "floor3": "营养奶品", 52 | "floor2": "新鲜水果", 53 | "floor1": "休闲食品" 54 | }, 55 | "floor1": [ 56 | { 57 | "goodsId": "e53c046465204d4fb8f22431cc2807e7", 58 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407180109_6316.jpg" 59 | }, 60 | { 61 | "goodsId": "f36f6dd8f62247d5846eaa9b3f269cbc", 62 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407180151_6180.jpg" 63 | }, 64 | { 65 | "goodsId": "72a3ec63956347a2a9f113589fe79c03", 66 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407180217_3970.jpg" 67 | }, 68 | { 69 | "goodsId": "a632bfb3818541da8e6843d6d0dbd917", 70 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407180257_2378.jpg" 71 | }, 72 | { 73 | "goodsId": "6694401a30a940f6ae437d541b7fd26d", 74 | "image": "http://images.baixingliangfan.cn/homeFloor/20180407/20180407180427_8557.jpg" 75 | } 76 | ], 77 | "category": [ 78 | { 79 | "mallCategoryId": "1", 80 | "mallCategoryName": "新鲜水果", 81 | "bxMallSubDto": [ 82 | { 83 | "mallSubId": "2c9f6c946016ea9b016016f79c8e0000", 84 | "mallCategoryId": "1", 85 | "mallSubName": "热带水果", 86 | "comments": null 87 | }, 88 | { 89 | "mallSubId": "2c9f6c94608ff843016095163b8c0177", 90 | "mallCategoryId": "1", 91 | "mallSubName": "时令水果", 92 | "comments": null 93 | }, 94 | { 95 | "mallSubId": "402880e86016d1b5016016db9b290001", 96 | "mallCategoryId": "1", 97 | "mallSubName": "苹果/梨", 98 | "comments": null 99 | }, 100 | { 101 | "mallSubId": "402880e86016d1b5016016dbff2f0002", 102 | "mallCategoryId": "1", 103 | "mallSubName": "柑橘橙柚", 104 | "comments": null 105 | } 106 | ], 107 | "comments": null, 108 | "image": "http://images.baixingliangfan.cn/firstCategoryPicture/20180408/20180408111959_2837.png" 109 | }, 110 | { 111 | "mallCategoryId": "2", 112 | "mallCategoryName": "中外名酒", 113 | "bxMallSubDto": [ 114 | { 115 | "mallSubId": "2c9f6c9460337d540160337fefd60000", 116 | "mallCategoryId": "2", 117 | "mallSubName": "白酒", 118 | "comments": "" 119 | }, 120 | { 121 | "mallSubId": "402880e86016d1b5016016e083f10010", 122 | "mallCategoryId": "2", 123 | "mallSubName": "啤酒", 124 | "comments": "" 125 | }, 126 | { 127 | "mallSubId": "402880e86016d1b5016016df1f92000c", 128 | "mallCategoryId": "2", 129 | "mallSubName": "葡萄酒", 130 | "comments": "" 131 | }, 132 | { 133 | "mallSubId": "2c9f6c94621970a801626a40feac0178", 134 | "mallCategoryId": "2", 135 | "mallSubName": "洋酒", 136 | "comments": null 137 | }, 138 | { 139 | "mallSubId": "2c9f6c94621970a801626a412c240179", 140 | "mallCategoryId": "2", 141 | "mallSubName": "海外直采", 142 | "comments": null 143 | } 144 | ], 145 | "comments": null, 146 | "image": "http://images.baixingliangfan.cn/firstCategoryPicture/20180408/20180408112010_4489.png" 147 | }, 148 | { 149 | "mallCategoryId": "3", 150 | "mallCategoryName": "营养奶品", 151 | "bxMallSubDto": [ 152 | { 153 | "mallSubId": "402880e86016d1b5016016e135440011", 154 | "mallCategoryId": "3", 155 | "mallSubName": "鲜奶", 156 | "comments": "" 157 | }, 158 | { 159 | "mallSubId": "402880e86016d1b5016016e171cc0012", 160 | "mallCategoryId": "3", 161 | "mallSubName": "酸奶", 162 | "comments": "" 163 | }, 164 | { 165 | "mallSubId": "402880e86016d1b5016016e240e60013", 166 | "mallCategoryId": "3", 167 | "mallSubName": "乳酸菌", 168 | "comments": "" 169 | }, 170 | { 171 | "mallSubId": "2c9f6c9460a03c0c0160a041ab1d0000", 172 | "mallCategoryId": "3", 173 | "mallSubName": "奶油奶酪", 174 | "comments": null 175 | } 176 | ], 177 | "comments": null, 178 | "image": "http://images.baixingliangfan.cn/firstCategoryPicture/20180408/20180408113102_1595.png" 179 | }, 180 | { 181 | "mallCategoryId": "5", 182 | "mallCategoryName": "食品饮料", 183 | "bxMallSubDto": [ 184 | { 185 | "mallSubId": "2c9f6c94609a62be0160a02d1dc20021", 186 | "mallCategoryId": "5", 187 | "mallSubName": "饼干糕点", 188 | "comments": "" 189 | }, 190 | { 191 | "mallSubId": "402880e86016d1b5016016e4dca2001e", 192 | "mallCategoryId": "5", 193 | "mallSubName": "休闲小食", 194 | "comments": "" 195 | }, 196 | { 197 | "mallSubId": "402880e86016d1b5016016e51380001f", 198 | "mallCategoryId": "5", 199 | "mallSubName": "糖果巧克力", 200 | "comments": "" 201 | }, 202 | { 203 | "mallSubId": "2c9f6c94609a62be0160a02de70e0022", 204 | "mallCategoryId": "5", 205 | "mallSubName": "冲调饮品", 206 | "comments": "" 207 | }, 208 | { 209 | "mallSubId": "2c9f6c94626a435f01626a4a7f590000", 210 | "mallCategoryId": "5", 211 | "mallSubName": "进口食品", 212 | "comments": "" 213 | }, 214 | { 215 | "mallSubId": "402880e86016d1b5016016e4ac16001d", 216 | "mallCategoryId": "5", 217 | "mallSubName": "坚果炒货", 218 | "comments": null 219 | }, 220 | { 221 | "mallSubId": "402880e86016d1b5016016e549710020", 222 | "mallCategoryId": "5", 223 | "mallSubName": "饮用水", 224 | "comments": "" 225 | }, 226 | { 227 | "mallSubId": "402880e86016d1b5016016e656c50022", 228 | "mallCategoryId": "5", 229 | "mallSubName": "果蔬汁", 230 | "comments": null 231 | }, 232 | { 233 | "mallSubId": "2c9f6c946016f86f01601709335d0000", 234 | "mallCategoryId": "5", 235 | "mallSubName": "乳制饮料", 236 | "comments": null 237 | }, 238 | { 239 | "mallSubId": "2c9f6c946077476a0160781eb392000d", 240 | "mallCategoryId": "5", 241 | "mallSubName": "咖啡茶饮", 242 | "comments": null 243 | }, 244 | { 245 | "mallSubId": "402880e86016d1b5016016e62bbd0021", 246 | "mallCategoryId": "5", 247 | "mallSubName": "碳酸饮料", 248 | "comments": null 249 | }, 250 | { 251 | "mallSubId": "2c9f6c946077476a0160781f6d8c000e", 252 | "mallCategoryId": "5", 253 | "mallSubName": "功能饮料", 254 | "comments": null 255 | } 256 | ], 257 | "comments": null, 258 | "image": "http://images.baixingliangfan.cn/firstCategoryPicture/20180408/20180408113048_1276.png" 259 | }, 260 | { 261 | "mallCategoryId": "4", 262 | "mallCategoryName": "个人护理", 263 | "bxMallSubDto": [ 264 | { 265 | "mallSubId": "2c9f6c94621970a801626a35cb4d0175", 266 | "mallCategoryId": "4", 267 | "mallSubName": "进口护理", 268 | "comments": null 269 | }, 270 | { 271 | "mallSubId": "2c9f6c94621970a801626a363e5a0176", 272 | "mallCategoryId": "4", 273 | "mallSubName": "口腔护理", 274 | "comments": null 275 | }, 276 | { 277 | "mallSubId": "2c9f6c94621970a801626a3770620177", 278 | "mallCategoryId": "4", 279 | "mallSubName": "特殊用纸", 280 | "comments": null 281 | } 282 | ], 283 | "comments": null, 284 | "image": "http://images.baixingliangfan.cn/firstCategoryPicture/20180408/20180408112053_8191.png" 285 | } 286 | ], 287 | "slides": [ 288 | { 289 | "image": "http://images.baixingliangfan.cn/advertesPicture/20180407/20180407175040_1780.jpg", 290 | "goodsId": "b1195296679f482aa7d54d95ac2b4a94" 291 | }, 292 | { 293 | "image": "http://images.baixingliangfan.cn/advertesPicture/20180407/20180407175111_9509.jpg", 294 | "goodsId": "da34d6f381464a219b37a9ac0ad579e8" 295 | }, 296 | { 297 | "image": "http://images.baixingliangfan.cn/advertesPicture/20180407/20180407175142_6947.jpg", 298 | "goodsId": "ad176e397858448a854dc50371334faf" 299 | } 300 | ], 301 | "buyTime": "08:00:00-20:30:00", 302 | "hotGoods": [ 303 | { 304 | "mallPrice": 3.9, 305 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415120500_6504.jpg", 306 | "goodsId": "fb0f913950944b66a97ae262ad14609a", 307 | "price": 3.9, 308 | "name": "美汁源果粒奶优水果饮料蜜桃450ml/瓶" 309 | }, 310 | { 311 | "mallPrice": 4.5, 312 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415115202_8432.jpg", 313 | "goodsId": "775e575ce28a4f89b1dfe2c99eb08ae7", 314 | "price": 4.5, 315 | "name": "阿华田麦芽乳饮品牛奶味250mL/盒" 316 | }, 317 | { 318 | "mallPrice": 3.7, 319 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415121351_6470.jpg", 320 | "goodsId": "e68d5293c0a04e99a3480aaaad101362", 321 | "price": 3.7, 322 | "name": "养元香浓六个核桃240ml/瓶" 323 | }, 324 | { 325 | "mallPrice": 6.5, 326 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415120956_8491.jpg", 327 | "goodsId": "7c377350cc9342edba600f3f6a548bd0", 328 | "price": 6.5, 329 | "name": "名屋木瓜牛乳340ml/瓶" 330 | }, 331 | { 332 | "mallPrice": 3.9, 333 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415120411_5740.jpg", 334 | "goodsId": "f8c3f62810aa4ce781d14a885333a2b8", 335 | "price": 3.9, 336 | "name": "美汁源果粒奶优草莓味450ml/瓶" 337 | }, 338 | { 339 | "mallPrice": 7.5, 340 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415120720_7233.jpg", 341 | "goodsId": "85d4fece907a4170b4b27a22c035321d", 342 | "price": 7.5, 343 | "name": "名屋醇豆浆饮料485ml/瓶" 344 | }, 345 | { 346 | "mallPrice": 5, 347 | "image": "http://images.baixingliangfan.cn/compressedPic/20180103161335_9324.jpg", 348 | "goodsId": "9abd33f0d2e4496f9c023a1dcfbfe2ad", 349 | "price": 6.3, 350 | "name": "李子园甜牛奶乳饮料450ml/瓶" 351 | }, 352 | { 353 | "mallPrice": 5, 354 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415120239_7917.jpg", 355 | "goodsId": "1258c2fd52844f679fad1ebf24764082", 356 | "price": 5, 357 | "name": "李子园草莓风味乳饮料450ml/瓶" 358 | }, 359 | { 360 | "mallPrice": 6.3, 361 | "image": "http://images.baixingliangfan.cn/compressedPic/20171224082006_6602.jpg", 362 | "goodsId": "bd25fd5d128e41fd9a737e99f75f92f8", 363 | "price": 8.5, 364 | "name": "娃哈哈AD钙奶220ml*4/条" 365 | }, 366 | { 367 | "mallPrice": 6, 368 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415121537_4372.jpg", 369 | "goodsId": "cfbe6ec3101a414f9563a8c6624aec08", 370 | "price": 6, 371 | "name": "一榨鲜绿豆汁300ml/瓶" 372 | }, 373 | { 374 | "mallPrice": 5, 375 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415120109_275.jpg", 376 | "goodsId": "e9808eb0d3574c11971e38f75076f1a4", 377 | "price": 5, 378 | "name": "李子园朱古力风味乳饮料450ml/瓶" 379 | }, 380 | { 381 | "mallPrice": 7.5, 382 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415120857_4885.jpg", 383 | "goodsId": "a5d1130de39f434facc6d35514cea053", 384 | "price": 7.5, 385 | "name": "名屋黑豆浆饮料485ml/瓶" 386 | }, 387 | { 388 | "mallPrice": 4.5, 389 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415114959_7217.jpg", 390 | "goodsId": "06130c91497b4806bf2b3e538814bb66", 391 | "price": 4.5, 392 | "name": "阿华田麦芽乳饮品高钙味250mL/盒" 393 | }, 394 | { 395 | "mallPrice": 6.5, 396 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415121108_2001.jpg", 397 | "goodsId": "b75e437adc0540c6b30516537d759122", 398 | "price": 6.5, 399 | "name": "名屋香蕉牛乳340ml/瓶" 400 | }, 401 | { 402 | "mallPrice": 3.9, 403 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415120608_2319.jpg", 404 | "goodsId": "0d51d2863bdc485688c2fee2a165bb51", 405 | "price": 3.9, 406 | "name": "美汁源果粒奶优原味450ml/瓶" 407 | }, 408 | { 409 | "mallPrice": 7.4, 410 | "image": "http://images.baixingliangfan.cn/compressedPic/20171224082144_8430.jpg", 411 | "goodsId": "85173b3ce7a24a44ac2ed960a3e431fc", 412 | "price": 9, 413 | "name": "旺仔牛奶125ml*4/条" 414 | }, 415 | { 416 | "mallPrice": 68, 417 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415122117_1031.jpg", 418 | "goodsId": "99e37959ae22433da7bb378a2d24c19c", 419 | "price": 68, 420 | "name": "同福阿胶粥300g/箱" 421 | }, 422 | { 423 | "mallPrice": 3.5, 424 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415122256_2373.jpg", 425 | "goodsId": "068fe09cf2a849b4b8c7ce3fea734072", 426 | "price": 3.5, 427 | "name": "银鹭桂圆莲子八宝粥360g/瓶" 428 | }, 429 | { 430 | "mallPrice": 14.5, 431 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415121432_880.jpg", 432 | "goodsId": "8172961149434b51865612820c7b8891", 433 | "price": 14.5, 434 | "name": "椰树牌椰汁饮料1L/瓶" 435 | }, 436 | { 437 | "mallPrice": 4.5, 438 | "image": "http://images.baixingliangfan.cn/compressedPic/20180415115515_7254.jpg", 439 | "goodsId": "a870459dfbba4df8af52e52aa6d0c426", 440 | "price": 4.5, 441 | "name": "豆本豆原味豆奶250ml/盒" 442 | } 443 | ], 444 | "recommend": [ 445 | { 446 | "image": "http://images.baixingliangfan.cn/compressedPic/20180411083404_6619.jpg", 447 | "mallPrice": 16.8, 448 | "goodsId": "238bc2e023844769a6b67d9a4c04b2ea", 449 | "price": 16.8, 450 | "goodsName": "纳美小苏打源生护龈牙膏3010/支" 451 | }, 452 | { 453 | "image": "http://images.baixingliangfan.cn/compressedPic/20180411085355_2725.jpg", 454 | "mallPrice": 9.5, 455 | "goodsId": "245fc7d457e5454481db9620f0f9881f", 456 | "price": 9.5, 457 | "goodsName": "ABCK25超吸棉柔护垫22片/包" 458 | }, 459 | { 460 | "image": "http://images.baixingliangfan.cn/compressedPic/20180413093730_3138.jpg", 461 | "mallPrice": 6, 462 | "goodsId": "24afea564e5248b5a2bc59da95f09911", 463 | "price": 6, 464 | "goodsName": "果倍爽橙汁饮料330ml/瓶" 465 | }, 466 | { 467 | "image": "http://images.baixingliangfan.cn/compressedPic/20180409155457_3302.jpg", 468 | "mallPrice": 109, 469 | "goodsId": "418fc60784d04e71beffe1ce5174c947", 470 | "price": 109, 471 | "goodsName": "睿嫣白檀香护发素500ml/瓶" 472 | }, 473 | { 474 | "image": "http://images.baixingliangfan.cn/compressedPic/20180412173646_7050.jpg", 475 | "mallPrice": 4, 476 | "goodsId": "4ae4e2e2c1df45308be5011a97aae537", 477 | "price": 4, 478 | "goodsName": "乐百氏脉动芒果味600ml/瓶" 479 | }, 480 | { 481 | "image": "http://images.baixingliangfan.cn/compressedPic/20180413142444_1480.jpg", 482 | "mallPrice": 6.9, 483 | "goodsId": "4cf7744443f94557b7c6ad37dca9c4db", 484 | "price": 6.9, 485 | "goodsName": "农夫山泉NFC橙汁100%300ml/瓶" 486 | }, 487 | { 488 | "image": "http://images.baixingliangfan.cn/compressedPic/20180411084437_6209.jpg", 489 | "mallPrice": 8.6, 490 | "goodsId": "66074cd2d8464dcc9b2d7fbef5b417d9", 491 | "price": 8.6, 492 | "goodsName": "七度空间少女棉超薄超长夜用卫生巾8片/包" 493 | }, 494 | { 495 | "image": "http://images.baixingliangfan.cn/compressedPic/20180407172335_1082.jpg", 496 | "mallPrice": 15, 497 | "goodsId": "6694401a30a940f6ae437d541b7fd26d", 498 | "price": 15, 499 | "goodsName": "爱莲巧牛奶巧克力100g/块" 500 | }, 501 | { 502 | "image": "http://images.baixingliangfan.cn/compressedPic/20180407172544_4503.jpg", 503 | "mallPrice": 9.9, 504 | "goodsId": "a632bfb3818541da8e6843d6d0dbd917", 505 | "price": 9.9, 506 | "goodsName": "Gemez小鸡干脆面(烧烤鸡肉味)90g/袋" 507 | }, 508 | { 509 | "image": "http://images.baixingliangfan.cn/compressedPic/20180407173221_2015.jpg", 510 | "mallPrice": 8, 511 | "goodsId": "ad176e397858448a854dc50371334faf", 512 | "price": 8, 513 | "goodsName": "单身狗粮地中海盐味薯片 71g/袋" 514 | }, 515 | { 516 | "image": "http://images.baixingliangfan.cn/compressedPic/20180413091557_6636.jpg", 517 | "mallPrice": 6.5, 518 | "goodsId": "af117ed90b624318914fd4b42001216c", 519 | "price": 6.5, 520 | "goodsName": "可口可乐2L/瓶" 521 | }, 522 | { 523 | "image": "http://images.baixingliangfan.cn/compressedPic/20180413142955_5219.jpg", 524 | "mallPrice": 6.9, 525 | "goodsId": "bdd9bd7f131843c59c7f9aabdb36f069", 526 | "price": 6.9, 527 | "goodsName": "农夫山泉NFC苹果香蕉汁100%300ml/瓶" 528 | }, 529 | { 530 | "image": "http://images.baixingliangfan.cn/compressedPic/20180410091738_4529.jpg", 531 | "mallPrice": 138, 532 | "goodsId": "d6e15b84c1cd45138d9493c72333f7ce", 533 | "price": 138, 534 | "goodsName": "可米小子象牙松子罐装262g/罐" 535 | }, 536 | { 537 | "image": "http://images.baixingliangfan.cn/compressedPic/20180407171943_7260.jpg", 538 | "mallPrice": 29.8, 539 | "goodsId": "e53c046465204d4fb8f22431cc2807e7", 540 | "price": 29.8, 541 | "goodsName": "费罗伦珍珠水果糖(狮子座)240g/盒" 542 | }, 543 | { 544 | "image": "http://images.baixingliangfan.cn/compressedPic/20180412174207_1023.jpg", 545 | "mallPrice": 4, 546 | "goodsId": "e7ebc6153924459287468104768bee00", 547 | "price": 4, 548 | "goodsName": "农夫山泉水葡萄果味饮料530ml/瓶" 549 | }, 550 | { 551 | "image": "http://images.baixingliangfan.cn/compressedPic/20180407171519_1489.jpg", 552 | "mallPrice": 9.9, 553 | "goodsId": "f36f6dd8f62247d5846eaa9b3f269cbc", 554 | "price": 11.5, 555 | "goodsName": "捷客每日红提味曲奇120g/盒" 556 | }, 557 | { 558 | "image": "http://images.baixingliangfan.cn/compressedPic/20171225110825_6758.jpg", 559 | "mallPrice": 26, 560 | "goodsId": "fa750a815cfd46c3ba468db800f0e370", 561 | "price": 28, 562 | "goodsName": "青芒1.6kg/盒" 563 | } 564 | ], 565 | "sendFee": { 566 | "chargeStartFee": "59.00", 567 | "deliveryFee": "3.00" 568 | } 569 | }, 570 | "page": null, 571 | "limit": null 572 | } -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "server", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/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 | "any-promise": { 17 | "version": "1.3.0", 18 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 19 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 20 | }, 21 | "async": { 22 | "version": "2.1.4", 23 | "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", 24 | "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", 25 | "requires": { 26 | "lodash": "^4.14.0" 27 | } 28 | }, 29 | "balanced-match": { 30 | "version": "1.0.0", 31 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 32 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 33 | }, 34 | "bcrypt": { 35 | "version": "3.0.4", 36 | "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-3.0.4.tgz", 37 | "integrity": "sha512-XqmCym97kT6l+jFEKeFvGuNE9aVEFDGsLMv+tIBTXkJI1sHS0g8s7VQEPJagSMPwWiB5Vpr2kVzVKc/YfwWthA==", 38 | "requires": { 39 | "nan": "2.12.1", 40 | "node-pre-gyp": "0.12.0" 41 | }, 42 | "dependencies": { 43 | "abbrev": { 44 | "version": "1.1.1", 45 | "bundled": true 46 | }, 47 | "ansi-regex": { 48 | "version": "2.1.1", 49 | "bundled": true 50 | }, 51 | "aproba": { 52 | "version": "1.2.0", 53 | "bundled": true 54 | }, 55 | "are-we-there-yet": { 56 | "version": "1.1.5", 57 | "bundled": true, 58 | "requires": { 59 | "delegates": "^1.0.0", 60 | "readable-stream": "^2.0.6" 61 | } 62 | }, 63 | "balanced-match": { 64 | "version": "1.0.0", 65 | "bundled": true 66 | }, 67 | "brace-expansion": { 68 | "version": "1.1.11", 69 | "bundled": true, 70 | "requires": { 71 | "balanced-match": "^1.0.0", 72 | "concat-map": "0.0.1" 73 | } 74 | }, 75 | "chownr": { 76 | "version": "1.1.1", 77 | "bundled": true 78 | }, 79 | "code-point-at": { 80 | "version": "1.1.0", 81 | "bundled": true 82 | }, 83 | "concat-map": { 84 | "version": "0.0.1", 85 | "bundled": true 86 | }, 87 | "console-control-strings": { 88 | "version": "1.1.0", 89 | "bundled": true 90 | }, 91 | "core-util-is": { 92 | "version": "1.0.2", 93 | "bundled": true 94 | }, 95 | "debug": { 96 | "version": "2.6.9", 97 | "bundled": true, 98 | "requires": { 99 | "ms": "2.0.0" 100 | } 101 | }, 102 | "deep-extend": { 103 | "version": "0.6.0", 104 | "bundled": true 105 | }, 106 | "delegates": { 107 | "version": "1.0.0", 108 | "bundled": true 109 | }, 110 | "detect-libc": { 111 | "version": "1.0.3", 112 | "bundled": true 113 | }, 114 | "fs-minipass": { 115 | "version": "1.2.5", 116 | "bundled": true, 117 | "requires": { 118 | "minipass": "^2.2.1" 119 | } 120 | }, 121 | "fs.realpath": { 122 | "version": "1.0.0", 123 | "bundled": true 124 | }, 125 | "gauge": { 126 | "version": "2.7.4", 127 | "bundled": true, 128 | "requires": { 129 | "aproba": "^1.0.3", 130 | "console-control-strings": "^1.0.0", 131 | "has-unicode": "^2.0.0", 132 | "object-assign": "^4.1.0", 133 | "signal-exit": "^3.0.0", 134 | "string-width": "^1.0.1", 135 | "strip-ansi": "^3.0.1", 136 | "wide-align": "^1.1.0" 137 | } 138 | }, 139 | "glob": { 140 | "version": "7.1.2", 141 | "bundled": true, 142 | "requires": { 143 | "fs.realpath": "^1.0.0", 144 | "inflight": "^1.0.4", 145 | "inherits": "2", 146 | "minimatch": "^3.0.4", 147 | "once": "^1.3.0", 148 | "path-is-absolute": "^1.0.0" 149 | } 150 | }, 151 | "has-unicode": { 152 | "version": "2.0.1", 153 | "bundled": true 154 | }, 155 | "iconv-lite": { 156 | "version": "0.4.24", 157 | "bundled": true, 158 | "requires": { 159 | "safer-buffer": ">= 2.1.2 < 3" 160 | } 161 | }, 162 | "ignore-walk": { 163 | "version": "3.0.1", 164 | "bundled": true, 165 | "requires": { 166 | "minimatch": "^3.0.4" 167 | } 168 | }, 169 | "inflight": { 170 | "version": "1.0.6", 171 | "bundled": true, 172 | "requires": { 173 | "once": "^1.3.0", 174 | "wrappy": "1" 175 | } 176 | }, 177 | "inherits": { 178 | "version": "2.0.3", 179 | "bundled": true 180 | }, 181 | "ini": { 182 | "version": "1.3.5", 183 | "bundled": true 184 | }, 185 | "is-fullwidth-code-point": { 186 | "version": "1.0.0", 187 | "bundled": true, 188 | "requires": { 189 | "number-is-nan": "^1.0.0" 190 | } 191 | }, 192 | "isarray": { 193 | "version": "1.0.0", 194 | "bundled": true 195 | }, 196 | "minimatch": { 197 | "version": "3.0.4", 198 | "bundled": true, 199 | "requires": { 200 | "brace-expansion": "^1.1.7" 201 | } 202 | }, 203 | "minimist": { 204 | "version": "0.0.8", 205 | "bundled": true 206 | }, 207 | "minipass": { 208 | "version": "2.3.4", 209 | "bundled": true, 210 | "requires": { 211 | "safe-buffer": "^5.1.2", 212 | "yallist": "^3.0.0" 213 | }, 214 | "dependencies": { 215 | "safe-buffer": { 216 | "version": "5.1.2", 217 | "bundled": true 218 | }, 219 | "yallist": { 220 | "version": "3.0.2", 221 | "bundled": true 222 | } 223 | } 224 | }, 225 | "minizlib": { 226 | "version": "1.1.1", 227 | "bundled": true, 228 | "requires": { 229 | "minipass": "^2.2.1" 230 | } 231 | }, 232 | "mkdirp": { 233 | "version": "0.5.1", 234 | "bundled": true, 235 | "requires": { 236 | "minimist": "0.0.8" 237 | } 238 | }, 239 | "ms": { 240 | "version": "2.0.0", 241 | "bundled": true 242 | }, 243 | "needle": { 244 | "version": "2.2.4", 245 | "bundled": true, 246 | "requires": { 247 | "debug": "^2.1.2", 248 | "iconv-lite": "^0.4.4", 249 | "sax": "^1.2.4" 250 | } 251 | }, 252 | "node-pre-gyp": { 253 | "version": "0.12.0", 254 | "bundled": true, 255 | "requires": { 256 | "detect-libc": "^1.0.2", 257 | "mkdirp": "^0.5.1", 258 | "needle": "^2.2.1", 259 | "nopt": "^4.0.1", 260 | "npm-packlist": "^1.1.6", 261 | "npmlog": "^4.0.2", 262 | "rc": "^1.2.7", 263 | "rimraf": "^2.6.1", 264 | "semver": "^5.3.0", 265 | "tar": "^4" 266 | } 267 | }, 268 | "nopt": { 269 | "version": "4.0.1", 270 | "bundled": true, 271 | "requires": { 272 | "abbrev": "1", 273 | "osenv": "^0.1.4" 274 | } 275 | }, 276 | "npm-bundled": { 277 | "version": "1.0.5", 278 | "bundled": true 279 | }, 280 | "npm-packlist": { 281 | "version": "1.1.12", 282 | "bundled": true, 283 | "requires": { 284 | "ignore-walk": "^3.0.1", 285 | "npm-bundled": "^1.0.1" 286 | } 287 | }, 288 | "npmlog": { 289 | "version": "4.1.2", 290 | "bundled": true, 291 | "requires": { 292 | "are-we-there-yet": "~1.1.2", 293 | "console-control-strings": "~1.1.0", 294 | "gauge": "~2.7.3", 295 | "set-blocking": "~2.0.0" 296 | } 297 | }, 298 | "number-is-nan": { 299 | "version": "1.0.1", 300 | "bundled": true 301 | }, 302 | "object-assign": { 303 | "version": "4.1.1", 304 | "bundled": true 305 | }, 306 | "once": { 307 | "version": "1.4.0", 308 | "bundled": true, 309 | "requires": { 310 | "wrappy": "1" 311 | } 312 | }, 313 | "os-homedir": { 314 | "version": "1.0.2", 315 | "bundled": true 316 | }, 317 | "os-tmpdir": { 318 | "version": "1.0.2", 319 | "bundled": true 320 | }, 321 | "osenv": { 322 | "version": "0.1.5", 323 | "bundled": true, 324 | "requires": { 325 | "os-homedir": "^1.0.0", 326 | "os-tmpdir": "^1.0.0" 327 | } 328 | }, 329 | "path-is-absolute": { 330 | "version": "1.0.1", 331 | "bundled": true 332 | }, 333 | "process-nextick-args": { 334 | "version": "2.0.0", 335 | "bundled": true 336 | }, 337 | "rc": { 338 | "version": "1.2.8", 339 | "bundled": true, 340 | "requires": { 341 | "deep-extend": "^0.6.0", 342 | "ini": "~1.3.0", 343 | "minimist": "^1.2.0", 344 | "strip-json-comments": "~2.0.1" 345 | }, 346 | "dependencies": { 347 | "minimist": { 348 | "version": "1.2.0", 349 | "bundled": true 350 | } 351 | } 352 | }, 353 | "readable-stream": { 354 | "version": "2.3.5", 355 | "bundled": true, 356 | "requires": { 357 | "core-util-is": "~1.0.0", 358 | "inherits": "~2.0.3", 359 | "isarray": "~1.0.0", 360 | "process-nextick-args": "~2.0.0", 361 | "safe-buffer": "~5.1.1", 362 | "string_decoder": "~1.0.3", 363 | "util-deprecate": "~1.0.1" 364 | } 365 | }, 366 | "rimraf": { 367 | "version": "2.6.2", 368 | "bundled": true, 369 | "requires": { 370 | "glob": "^7.0.5" 371 | } 372 | }, 373 | "safe-buffer": { 374 | "version": "5.1.1", 375 | "bundled": true 376 | }, 377 | "safer-buffer": { 378 | "version": "2.1.2", 379 | "bundled": true 380 | }, 381 | "sax": { 382 | "version": "1.2.4", 383 | "bundled": true 384 | }, 385 | "semver": { 386 | "version": "5.6.0", 387 | "bundled": true 388 | }, 389 | "set-blocking": { 390 | "version": "2.0.0", 391 | "bundled": true 392 | }, 393 | "signal-exit": { 394 | "version": "3.0.2", 395 | "bundled": true 396 | }, 397 | "string-width": { 398 | "version": "1.0.2", 399 | "bundled": true, 400 | "requires": { 401 | "code-point-at": "^1.0.0", 402 | "is-fullwidth-code-point": "^1.0.0", 403 | "strip-ansi": "^3.0.0" 404 | } 405 | }, 406 | "string_decoder": { 407 | "version": "1.0.3", 408 | "bundled": true, 409 | "requires": { 410 | "safe-buffer": "~5.1.0" 411 | } 412 | }, 413 | "strip-ansi": { 414 | "version": "3.0.1", 415 | "bundled": true, 416 | "requires": { 417 | "ansi-regex": "^2.0.0" 418 | } 419 | }, 420 | "strip-json-comments": { 421 | "version": "2.0.1", 422 | "bundled": true 423 | }, 424 | "tar": { 425 | "version": "4.4.8", 426 | "bundled": true, 427 | "requires": { 428 | "chownr": "^1.1.1", 429 | "fs-minipass": "^1.2.5", 430 | "minipass": "^2.3.4", 431 | "minizlib": "^1.1.1", 432 | "mkdirp": "^0.5.0", 433 | "safe-buffer": "^5.1.2", 434 | "yallist": "^3.0.2" 435 | }, 436 | "dependencies": { 437 | "safe-buffer": { 438 | "version": "5.1.2", 439 | "bundled": true 440 | }, 441 | "yallist": { 442 | "version": "3.0.2", 443 | "bundled": true 444 | } 445 | } 446 | }, 447 | "util-deprecate": { 448 | "version": "1.0.2", 449 | "bundled": true 450 | }, 451 | "wide-align": { 452 | "version": "1.1.3", 453 | "bundled": true, 454 | "requires": { 455 | "string-width": "^1.0.2 || 2" 456 | } 457 | }, 458 | "wrappy": { 459 | "version": "1.0.2", 460 | "bundled": true 461 | } 462 | } 463 | }, 464 | "bluebird": { 465 | "version": "3.5.0", 466 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", 467 | "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" 468 | }, 469 | "brace-expansion": { 470 | "version": "1.1.11", 471 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 472 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 473 | "requires": { 474 | "balanced-match": "^1.0.0", 475 | "concat-map": "0.0.1" 476 | } 477 | }, 478 | "bson": { 479 | "version": "1.0.6", 480 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz", 481 | "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ==" 482 | }, 483 | "bytes": { 484 | "version": "3.0.0", 485 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 486 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 487 | }, 488 | "co": { 489 | "version": "4.6.0", 490 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 491 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 492 | }, 493 | "co-body": { 494 | "version": "6.0.0", 495 | "resolved": "https://registry.npmjs.org/co-body/-/co-body-6.0.0.tgz", 496 | "integrity": "sha512-9ZIcixguuuKIptnY8yemEOuhb71L/lLf+Rl5JfJEUiDNJk0e02MBt7BPxR2GEh5mw8dPthQYR4jPI/BnS1MQgw==", 497 | "requires": { 498 | "inflation": "^2.0.0", 499 | "qs": "^6.5.2", 500 | "raw-body": "^2.3.3", 501 | "type-is": "^1.6.16" 502 | } 503 | }, 504 | "concat-map": { 505 | "version": "0.0.1", 506 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 507 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 508 | }, 509 | "content-disposition": { 510 | "version": "0.5.2", 511 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 512 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 513 | }, 514 | "content-type": { 515 | "version": "1.0.4", 516 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 517 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 518 | }, 519 | "cookies": { 520 | "version": "0.7.1", 521 | "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.7.1.tgz", 522 | "integrity": "sha1-fIphX1SBxhq58WyDNzG8uPZjuZs=", 523 | "requires": { 524 | "depd": "~1.1.1", 525 | "keygrip": "~1.0.2" 526 | } 527 | }, 528 | "copy-to": { 529 | "version": "2.0.1", 530 | "resolved": "https://registry.npmjs.org/copy-to/-/copy-to-2.0.1.tgz", 531 | "integrity": "sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=" 532 | }, 533 | "debug": { 534 | "version": "3.1.0", 535 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 536 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 537 | "requires": { 538 | "ms": "2.0.0" 539 | } 540 | }, 541 | "deep-equal": { 542 | "version": "1.0.1", 543 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", 544 | "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" 545 | }, 546 | "delegates": { 547 | "version": "1.0.0", 548 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 549 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 550 | }, 551 | "depd": { 552 | "version": "1.1.2", 553 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 554 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 555 | }, 556 | "destroy": { 557 | "version": "1.0.4", 558 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 559 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 560 | }, 561 | "ee-first": { 562 | "version": "1.1.1", 563 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 564 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 565 | }, 566 | "error-inject": { 567 | "version": "1.0.0", 568 | "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz", 569 | "integrity": "sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=" 570 | }, 571 | "escape-html": { 572 | "version": "1.0.3", 573 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 574 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 575 | }, 576 | "fresh": { 577 | "version": "0.5.2", 578 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 579 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 580 | }, 581 | "fs.realpath": { 582 | "version": "1.0.0", 583 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 584 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 585 | }, 586 | "glob": { 587 | "version": "7.1.2", 588 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 589 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 590 | "requires": { 591 | "fs.realpath": "^1.0.0", 592 | "inflight": "^1.0.4", 593 | "inherits": "2", 594 | "minimatch": "^3.0.4", 595 | "once": "^1.3.0", 596 | "path-is-absolute": "^1.0.0" 597 | } 598 | }, 599 | "http-assert": { 600 | "version": "1.3.0", 601 | "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.3.0.tgz", 602 | "integrity": "sha1-oxpc+IyHPsu1eWkH1NbxMujAHko=", 603 | "requires": { 604 | "deep-equal": "~1.0.1", 605 | "http-errors": "~1.6.1" 606 | } 607 | }, 608 | "http-errors": { 609 | "version": "1.6.3", 610 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 611 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 612 | "requires": { 613 | "depd": "~1.1.2", 614 | "inherits": "2.0.3", 615 | "setprototypeof": "1.1.0", 616 | "statuses": ">= 1.4.0 < 2" 617 | } 618 | }, 619 | "iconv-lite": { 620 | "version": "0.4.23", 621 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 622 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 623 | "requires": { 624 | "safer-buffer": ">= 2.1.2 < 3" 625 | } 626 | }, 627 | "inflation": { 628 | "version": "2.0.0", 629 | "resolved": "https://registry.npmjs.org/inflation/-/inflation-2.0.0.tgz", 630 | "integrity": "sha1-i0F+R8KPklpFEz2RTKH9OJEH8w8=" 631 | }, 632 | "inflight": { 633 | "version": "1.0.6", 634 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 635 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 636 | "requires": { 637 | "once": "^1.3.0", 638 | "wrappy": "1" 639 | } 640 | }, 641 | "inherits": { 642 | "version": "2.0.3", 643 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 644 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 645 | }, 646 | "is-generator-function": { 647 | "version": "1.0.7", 648 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", 649 | "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==" 650 | }, 651 | "isarray": { 652 | "version": "0.0.1", 653 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 654 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 655 | }, 656 | "kareem": { 657 | "version": "2.1.0", 658 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.1.0.tgz", 659 | "integrity": "sha512-ycoMY1tVkcH1/NaxGn2erZaUC3CodmX7Fl6DUVXjN73+uecWYTaaldRkxNY3HeSKQnQTWnoxRKnZfVHcB8tIWg==" 660 | }, 661 | "keygrip": { 662 | "version": "1.0.2", 663 | "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.2.tgz", 664 | "integrity": "sha1-rTKXxVcGneqLz+ek+kkbdcXd65E=" 665 | }, 666 | "koa": { 667 | "version": "2.5.1", 668 | "resolved": "https://registry.npmjs.org/koa/-/koa-2.5.1.tgz", 669 | "integrity": "sha512-cchwbMeG2dv3E2xTAmheDAuvR53tPgJZN/Hf1h7bTzJLSPcFZp8/t5+bNKJ6GaQZoydhZQ+1GNruhKdj3lIrug==", 670 | "requires": { 671 | "accepts": "^1.2.2", 672 | "content-disposition": "~0.5.0", 673 | "content-type": "^1.0.0", 674 | "cookies": "~0.7.0", 675 | "debug": "*", 676 | "delegates": "^1.0.0", 677 | "depd": "^1.1.0", 678 | "destroy": "^1.0.3", 679 | "error-inject": "~1.0.0", 680 | "escape-html": "~1.0.1", 681 | "fresh": "^0.5.2", 682 | "http-assert": "^1.1.0", 683 | "http-errors": "^1.2.8", 684 | "is-generator-function": "^1.0.3", 685 | "koa-compose": "^4.0.0", 686 | "koa-convert": "^1.2.0", 687 | "koa-is-json": "^1.0.0", 688 | "mime-types": "^2.0.7", 689 | "on-finished": "^2.1.0", 690 | "only": "0.0.2", 691 | "parseurl": "^1.3.0", 692 | "statuses": "^1.2.0", 693 | "type-is": "^1.5.5", 694 | "vary": "^1.0.0" 695 | } 696 | }, 697 | "koa-bodyparser": { 698 | "version": "4.2.1", 699 | "resolved": "https://registry.npmjs.org/koa-bodyparser/-/koa-bodyparser-4.2.1.tgz", 700 | "integrity": "sha512-UIjPAlMZfNYDDe+4zBaOAUKYqkwAGcIU6r2ARf1UOXPAlfennQys5IiShaVeNf7KkVBlf88f2LeLvBFvKylttw==", 701 | "requires": { 702 | "co-body": "^6.0.0", 703 | "copy-to": "^2.0.1" 704 | } 705 | }, 706 | "koa-compose": { 707 | "version": "4.1.0", 708 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", 709 | "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" 710 | }, 711 | "koa-convert": { 712 | "version": "1.2.0", 713 | "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", 714 | "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", 715 | "requires": { 716 | "co": "^4.6.0", 717 | "koa-compose": "^3.0.0" 718 | }, 719 | "dependencies": { 720 | "koa-compose": { 721 | "version": "3.2.1", 722 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", 723 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", 724 | "requires": { 725 | "any-promise": "^1.1.0" 726 | } 727 | } 728 | } 729 | }, 730 | "koa-is-json": { 731 | "version": "1.0.0", 732 | "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", 733 | "integrity": "sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=" 734 | }, 735 | "koa-router": { 736 | "version": "7.4.0", 737 | "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-7.4.0.tgz", 738 | "integrity": "sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==", 739 | "requires": { 740 | "debug": "^3.1.0", 741 | "http-errors": "^1.3.1", 742 | "koa-compose": "^3.0.0", 743 | "methods": "^1.0.1", 744 | "path-to-regexp": "^1.1.1", 745 | "urijs": "^1.19.0" 746 | }, 747 | "dependencies": { 748 | "koa-compose": { 749 | "version": "3.2.1", 750 | "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", 751 | "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", 752 | "requires": { 753 | "any-promise": "^1.1.0" 754 | } 755 | } 756 | } 757 | }, 758 | "koa2-cors": { 759 | "version": "2.0.6", 760 | "resolved": "https://registry.npmjs.org/koa2-cors/-/koa2-cors-2.0.6.tgz", 761 | "integrity": "sha512-JRCcSM4lamM+8kvKGDKlesYk2ASrmSTczDtGUnIadqMgnHU4Ct5Gw7Bxt3w3m6d6dy3WN0PU4oMP43HbddDEWg==" 762 | }, 763 | "lodash": { 764 | "version": "4.17.10", 765 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", 766 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" 767 | }, 768 | "lodash.get": { 769 | "version": "4.4.2", 770 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 771 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" 772 | }, 773 | "media-typer": { 774 | "version": "0.3.0", 775 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 776 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 777 | }, 778 | "methods": { 779 | "version": "1.1.2", 780 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 781 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 782 | }, 783 | "mime-db": { 784 | "version": "1.33.0", 785 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 786 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" 787 | }, 788 | "mime-types": { 789 | "version": "2.1.18", 790 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 791 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 792 | "requires": { 793 | "mime-db": "~1.33.0" 794 | } 795 | }, 796 | "minimatch": { 797 | "version": "3.0.4", 798 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 799 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 800 | "requires": { 801 | "brace-expansion": "^1.1.7" 802 | } 803 | }, 804 | "mongodb": { 805 | "version": "3.0.8", 806 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.8.tgz", 807 | "integrity": "sha512-mj7yIUyAr9xnO2ev8pcVJ9uX7gSum5LLs1qIFoWLxA5Il50+jcojKtaO1/TbexsScZ9Poz00Pc3b86GiSqJ7WA==", 808 | "requires": { 809 | "mongodb-core": "3.0.8" 810 | } 811 | }, 812 | "mongodb-core": { 813 | "version": "3.0.8", 814 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.8.tgz", 815 | "integrity": "sha512-dFxfhH9N7ohuQnINyIl6dqEF8sYOE0WKuymrFf3L3cipJNrx+S8rAbNOTwa00/fuJCjBMJNFsaA+R2N16//UIw==", 816 | "requires": { 817 | "bson": "~1.0.4", 818 | "require_optional": "^1.0.1" 819 | } 820 | }, 821 | "mongoose": { 822 | "version": "5.1.2", 823 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.1.2.tgz", 824 | "integrity": "sha512-k9hssPMgBnUYG5e9NoUbx/2ERDyelDY0Vf6BwjtmoETUhVT7pQUe1o+oelLLuHF3ZVY2qgienK8pnrI5pdvlxA==", 825 | "requires": { 826 | "async": "2.1.4", 827 | "bson": "~1.0.5", 828 | "kareem": "2.1.0", 829 | "lodash.get": "4.4.2", 830 | "mongodb": "3.0.8", 831 | "mongoose-legacy-pluralize": "1.0.2", 832 | "mpath": "0.4.1", 833 | "mquery": "3.0.0", 834 | "ms": "2.0.0", 835 | "regexp-clone": "0.0.1", 836 | "sliced": "1.0.1" 837 | } 838 | }, 839 | "mongoose-legacy-pluralize": { 840 | "version": "1.0.2", 841 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 842 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 843 | }, 844 | "mpath": { 845 | "version": "0.4.1", 846 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.4.1.tgz", 847 | "integrity": "sha512-NNY/MpBkALb9jJmjpBlIi6GRoLveLUM0pJzgbp9vY9F7IQEb/HREC/nxrixechcQwd1NevOhJnWWV8QQQRE+OA==" 848 | }, 849 | "mquery": { 850 | "version": "3.0.0", 851 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.0.0.tgz", 852 | "integrity": "sha512-WL1Lk8v4l8VFSSwN3yCzY9TXw+fKVYKn6f+w86TRzOLSE8k1yTgGaLBPUByJQi8VcLbOdnUneFV/y3Kv874pnQ==", 853 | "requires": { 854 | "bluebird": "3.5.0", 855 | "debug": "2.6.9", 856 | "regexp-clone": "0.0.1", 857 | "sliced": "0.0.5" 858 | }, 859 | "dependencies": { 860 | "debug": { 861 | "version": "2.6.9", 862 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 863 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 864 | "requires": { 865 | "ms": "2.0.0" 866 | } 867 | }, 868 | "sliced": { 869 | "version": "0.0.5", 870 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", 871 | "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" 872 | } 873 | } 874 | }, 875 | "ms": { 876 | "version": "2.0.0", 877 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 878 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 879 | }, 880 | "nan": { 881 | "version": "2.12.1", 882 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", 883 | "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" 884 | }, 885 | "negotiator": { 886 | "version": "0.6.1", 887 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 888 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 889 | }, 890 | "on-finished": { 891 | "version": "2.3.0", 892 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 893 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 894 | "requires": { 895 | "ee-first": "1.1.1" 896 | } 897 | }, 898 | "once": { 899 | "version": "1.4.0", 900 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 901 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 902 | "requires": { 903 | "wrappy": "1" 904 | } 905 | }, 906 | "only": { 907 | "version": "0.0.2", 908 | "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", 909 | "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" 910 | }, 911 | "parseurl": { 912 | "version": "1.3.2", 913 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 914 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 915 | }, 916 | "path-is-absolute": { 917 | "version": "1.0.1", 918 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 919 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 920 | }, 921 | "path-to-regexp": { 922 | "version": "1.7.0", 923 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", 924 | "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", 925 | "requires": { 926 | "isarray": "0.0.1" 927 | } 928 | }, 929 | "qs": { 930 | "version": "6.5.2", 931 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 932 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 933 | }, 934 | "raw-body": { 935 | "version": "2.3.3", 936 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 937 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 938 | "requires": { 939 | "bytes": "3.0.0", 940 | "http-errors": "1.6.3", 941 | "iconv-lite": "0.4.23", 942 | "unpipe": "1.0.0" 943 | } 944 | }, 945 | "regexp-clone": { 946 | "version": "0.0.1", 947 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", 948 | "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" 949 | }, 950 | "require_optional": { 951 | "version": "1.0.1", 952 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 953 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 954 | "requires": { 955 | "resolve-from": "^2.0.0", 956 | "semver": "^5.1.0" 957 | } 958 | }, 959 | "resolve-from": { 960 | "version": "2.0.0", 961 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 962 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 963 | }, 964 | "safer-buffer": { 965 | "version": "2.1.2", 966 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 967 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 968 | }, 969 | "semver": { 970 | "version": "5.5.0", 971 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 972 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" 973 | }, 974 | "setprototypeof": { 975 | "version": "1.1.0", 976 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 977 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 978 | }, 979 | "sliced": { 980 | "version": "1.0.1", 981 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 982 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 983 | }, 984 | "statuses": { 985 | "version": "1.5.0", 986 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 987 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 988 | }, 989 | "type-is": { 990 | "version": "1.6.16", 991 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 992 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 993 | "requires": { 994 | "media-typer": "0.3.0", 995 | "mime-types": "~2.1.18" 996 | } 997 | }, 998 | "unpipe": { 999 | "version": "1.0.0", 1000 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1001 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1002 | }, 1003 | "urijs": { 1004 | "version": "1.19.1", 1005 | "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.1.tgz", 1006 | "integrity": "sha512-xVrGVi94ueCJNrBSTjWqjvtgvl3cyOTThp2zaMaFNGp3F542TR6sM3f2o8RqZl+AwteClSVmoCyt0ka4RjQOQg==" 1007 | }, 1008 | "vary": { 1009 | "version": "1.1.2", 1010 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1011 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1012 | }, 1013 | "wrappy": { 1014 | "version": "1.0.2", 1015 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1016 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1017 | } 1018 | } 1019 | } 1020 | --------------------------------------------------------------------------------