├── 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 |
2 |
3 |
4 |
5 |
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 |
2 |
3 | 主要按钮
4 |
5 |
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 |
2 |
6 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
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 |
2 |
3 |
4 |
![]()
5 |
6 |
{{goodsName}}
7 |
{{goodPrice | moneyFilter}}
8 |
9 |
10 |
11 |
49 |
50 |
--------------------------------------------------------------------------------
/src/components/pages/city/City.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
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 |
2 |
14 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | 首页
11 |
12 |
13 | 商品列表
14 |
15 |
16 | 购物车
17 |
18 |
19 | 个人中心
20 |
21 |
22 |
23 |
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 |
2 |
3 |
{{floorTitle}}
4 |
5 |
6 |
![]()
7 |
8 |
9 |
10 |
![]()
11 |
12 |
13 |
![]()
14 |
15 |
16 |
17 |
18 |
19 |
![]()
20 |
21 |
22 |
23 |
24 |
25 |
63 |
64 |
--------------------------------------------------------------------------------
/src/components/pages/Register.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
19 |
27 |
28 |
29 |
30 | 马上注册
32 |
33 |
34 |
35 |
36 |
92 |
93 |
--------------------------------------------------------------------------------
/src/components/pages/Member.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
![]()
8 |
{{userName}}
9 |
10 |
14 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
80 |
81 |
--------------------------------------------------------------------------------
/src/components/pages/city/components/Search.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | - {{item.name}}
10 | - 没有找到匹配数据
11 |
12 |
13 |
14 |
15 |
16 |
78 |
79 |
115 |
--------------------------------------------------------------------------------
/src/components/pages/city/components/List.vue:
--------------------------------------------------------------------------------
1 |
2 |
31 |
32 |
33 |
78 |
79 |
122 |
--------------------------------------------------------------------------------
/src/components/pages/Login.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
9 |
10 |
19 |
27 |
28 |
29 | 登录
31 |
32 |
33 |
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 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | 清空购物车
10 |
11 |
12 |
13 |
15 |
20 |
21 |
22 |
23 |
24 | 删除
25 |
26 |
27 |
44 |
45 |
46 |
51 |
54 |
55 |
购物车空空如也,快去添加商品吧~
56 |
57 |
58 |
59 |
138 |
139 |
--------------------------------------------------------------------------------
/src/components/pages/Goods.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 |
12 |
13 |
![]()
14 |
15 |
{{goodsInfo.NAME}}
16 |
价格: ¥{{goodsInfo.PRESENT_PRICE | moneyFilter}}元
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 | -
26 |
27 |
![]()
28 |
29 |
30 |
{{rating.username}}
31 |
{{rating.text}}
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | 加入购物车
42 |
43 |
44 | 直接购买
45 |
46 |
47 |
48 |
49 |
50 |
141 |
146 |
--------------------------------------------------------------------------------
/src/components/pages/CategoryList.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | -
12 | {{item.MALL_CATEGORY_NAME}}
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
![]()
30 |
31 |
32 |
{{item.NAME}}
33 |
¥{{item.ORI_PRICE | moneyFilter}}元
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
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 |
2 |
3 |
4 |
5 |
6 |
7 | {{city}}
8 |
9 |
10 |
17 |
18 |
19 |
20 |
21 | - {{item.Name}}
23 | - 没有找到匹配商品
24 |
25 |
26 |
27 |
31 |
32 |
33 |
34 |
![]()
35 |
{{item.mallCategoryName}}
36 |
37 |
38 |
39 |
![]()
40 |
41 |
42 |
43 | 商品推荐
44 |
45 |
46 |
47 |
48 |
49 |
![]()
50 |
{{item.goodsName}}
51 |
¥{{item.price | moneyFilter}}(¥{{item.mallPrice | moneyFilter}})
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
热卖商品
62 |
63 |
64 |
65 |
66 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
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 |
--------------------------------------------------------------------------------