├── static ├── .gitkeep ├── reset.css └── data.json ├── src ├── components │ ├── shop │ │ ├── index │ │ │ ├── component.less │ │ │ ├── component.html │ │ │ ├── component.js │ │ │ └── ui.vue │ │ ├── order │ │ │ ├── ui.vue │ │ │ ├── component.js │ │ │ ├── component.html │ │ │ └── component.less │ │ ├── rating │ │ │ ├── ui.vue │ │ │ ├── component.js │ │ │ ├── component.less │ │ │ └── component.html │ │ └── shop │ │ │ ├── ui.vue │ │ │ ├── component.js │ │ │ ├── component.html │ │ │ └── component.less │ ├── common │ │ ├── cart │ │ │ ├── ui.vue │ │ │ ├── component.js │ │ │ ├── component.html │ │ │ └── component.less │ │ └── topBar │ │ │ ├── ui.vue │ │ │ ├── component.js │ │ │ ├── component.html │ │ │ └── component.less │ └── pages │ │ ├── account │ │ ├── ui.vue │ │ ├── component.html │ │ ├── component.js │ │ └── component.less │ │ ├── admin │ │ ├── ui.vue │ │ ├── component.js │ │ ├── component.html │ │ └── component.less │ │ ├── detail │ │ ├── ui.vue │ │ ├── component.html │ │ ├── component.js │ │ └── component.less │ │ ├── login │ │ ├── ui.vue │ │ ├── component.less │ │ ├── component.html │ │ └── component.js │ │ └── rate │ │ ├── ui.vue │ │ ├── component.less │ │ ├── component.html │ │ └── component.js ├── store │ ├── mutations.js │ ├── state.js │ ├── types.js │ ├── getters.js │ ├── index.js │ └── actions.js ├── axios │ ├── good │ │ ├── config.js │ │ └── cache.js │ ├── base │ │ ├── setting.js │ │ └── index.js │ ├── seller │ │ ├── config.js │ │ └── cache.js │ ├── index.js │ └── user │ │ ├── config.js │ │ └── cache.js ├── App.vue ├── router │ ├── index.js │ └── router.js ├── main.js └── base │ └── base.vue ├── config ├── prod.env.js ├── dev.env.js └── index.js ├── .editorconfig ├── .gitignore ├── server ├── package.json ├── middleware │ └── formatDate.js ├── routes │ ├── index.js │ ├── good.js │ ├── seller.js │ └── user.js ├── db │ └── index.js ├── index.js └── api │ └── index.js ├── .babelrc ├── .postcssrc.js ├── index.html ├── README.md ├── package.json └── elm.sql /static/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/components/shop/index/component.less: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /config/prod.env.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | module.exports = { 3 | NODE_ENV: '"production"' 4 | } 5 | -------------------------------------------------------------------------------- /src/components/shop/index/component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
-------------------------------------------------------------------------------- /src/store/mutations.js: -------------------------------------------------------------------------------- 1 | import types from './types.js' 2 | 3 | const mutations={ 4 | 5 | } 6 | 7 | export default mutations; -------------------------------------------------------------------------------- /src/store/state.js: -------------------------------------------------------------------------------- 1 | 2 | const state = { 3 | cart: [], //购物车对象 4 | total: 0, //总消费 5 | isLogin: false, //登录状态 6 | } 7 | 8 | export default state; -------------------------------------------------------------------------------- /src/store/types.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 定义类型常量 3 | */ 4 | const ADDORDER = 'addOrder' //添加一个商品 5 | const ADDCOUNT = 'addCount' //添加指定商品数量 6 | export default { 7 | ADDORDER, 8 | ADDCOUNT 9 | } -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /src/axios/good/config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'good-getGood': { 3 | url: 'good/food?foodId=', 4 | method: 'get' 5 | }, 6 | 'good-getGoods': { 7 | url: 'good/all', 8 | method: 'get' 9 | } 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 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "koa": "^2.5.0", 4 | "koa-bodyparser": "^4.2.0", 5 | "koa-router": "^7.4.0", 6 | "koa-static": "^4.0.2", 7 | "koa2-cors": "^2.0.5", 8 | "mysql": "^2.15.0" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/axios/base/setting.js: -------------------------------------------------------------------------------- 1 | export default { 2 | CODE_OK: [200, 201, 202, 203, 204, 205, 206], // 成功 3 | CODE_WARM: [100, 101], // 警告 4 | CODE_ERROR: [500, 501, 502, 503, 504, 505], // 内部错误 5 | CODE_NO_AUTH: [401], // 未登录 6 | CODE_NO_PRIVILEGE: [403] // 无权限 7 | } -------------------------------------------------------------------------------- /src/components/shop/index/component.js: -------------------------------------------------------------------------------- 1 | import topBar from '@/components/common/topBar/ui' 2 | import Base from '@/base/base.vue' 3 | 4 | export default Base.extend({ 5 | components: { 6 | topBar 7 | }, 8 | data() { 9 | return {}; 10 | }, 11 | methods: {} 12 | }) -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "modules": false, 5 | "targets": { 6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"] 7 | } 8 | }], 9 | "stage-2" 10 | ], 11 | "plugins": ["transform-vue-jsx", "transform-runtime"] 12 | } 13 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /src/store/getters.js: -------------------------------------------------------------------------------- 1 | 2 | const getters={ 3 | //获取订单商品 4 | getCart(state) { 5 | return state.cart; 6 | }, 7 | //获取总消费 8 | getTotal(state) { 9 | return state.total; 10 | }, 11 | //获取登录状态 12 | getLoginState(state) { 13 | return state.isLogin; 14 | }, 15 | } 16 | 17 | export default getters; -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | 17 | 19 | -------------------------------------------------------------------------------- /src/axios/seller/config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'seller-getSeller': { 3 | url: 'seller/top', 4 | method: 'get' 5 | }, 6 | 'seller-getSellerAll': { 7 | url: 'seller/all', 8 | method: 'get' 9 | }, 10 | 'seller-getRatings': { 11 | url: 'seller/rating?type=', 12 | method: 'get' 13 | }, 14 | } -------------------------------------------------------------------------------- /src/components/common/cart/ui.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /src/components/common/topBar/ui.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /src/components/pages/account/ui.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /src/components/pages/admin/ui.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /src/components/pages/detail/ui.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /src/components/pages/login/ui.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /src/components/pages/rate/ui.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /src/components/shop/index/ui.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /src/components/shop/order/ui.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /src/components/shop/rating/ui.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /src/components/shop/shop/ui.vue: -------------------------------------------------------------------------------- 1 | 4 | 11 | -------------------------------------------------------------------------------- /src/axios/good/cache.js: -------------------------------------------------------------------------------- 1 | import sendRequest from '../base'; 2 | const CACHE_KEY = 'good_cache_key' 3 | 4 | export default { 5 | getGood(options) { 6 | return sendRequest(CACHE_KEY, 'good-getGood',options); 7 | }, 8 | getGoods(options) { 9 | return sendRequest(CACHE_KEY, 'good-getGoods',options); 10 | } 11 | } 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/components/pages/rate/component.less: -------------------------------------------------------------------------------- 1 | #rate { 2 | padding: 100px 50px; 3 | h2 { 4 | line-height: 48px; 5 | margin-bottom: 50px; 6 | text-align: center; 7 | } 8 | .el-row { 9 | padding: 18px 0px; 10 | border-bottom: 1px solid #eee; 11 | font-size: 14px; 12 | } 13 | } -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | 4 | import state from './state.js' 5 | import getters from './getters.js' 6 | import actions from './actions.js' 7 | import mutations from './mutations.js' 8 | 9 | Vue.use(Vuex); 10 | 11 | export default new Vuex.Store({ 12 | state, 13 | getters, 14 | actions, 15 | mutations, 16 | }); -------------------------------------------------------------------------------- /server/middleware/formatDate.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports =function formatDate( ) 3 | { 4 | let now = new Date(); 5 | let year=now.getFullYear(), 6 | month=now.getMonth()+1, 7 | date=now.getDate(), 8 | hour=now.getHours(), 9 | minute=now.getMinutes(), 10 | second=now.getSeconds(); 11 | return year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second; 12 | } -------------------------------------------------------------------------------- /src/components/pages/login/component.less: -------------------------------------------------------------------------------- 1 | #login { 2 | padding: 150px 0px 250px; 3 | background-color: #00a0dc; 4 | text-align: center; 5 | color: #fff; 6 | h1 { 7 | font-size: 28px; 8 | margin-bottom: 20px; 9 | } 10 | .el-form { 11 | margin-right: 20px; 12 | margin-top: 50px; 13 | .el-button { 14 | width: 100%; 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /src/axios/seller/cache.js: -------------------------------------------------------------------------------- 1 | import sendRequest from '../base'; 2 | const CACHE_KEY = 'seller_cache_key' 3 | 4 | export default { 5 | getSeller(options) { 6 | return sendRequest(CACHE_KEY, 'seller-getSeller',options) 7 | }, 8 | getSellerAll(options) { 9 | return sendRequest(CACHE_KEY, 'seller-getSellerAll',options) 10 | }, 11 | getRatings(options) { 12 | return sendRequest(CACHE_KEY, 'seller-getRatings',options) 13 | } 14 | } -------------------------------------------------------------------------------- /src/axios/index.js: -------------------------------------------------------------------------------- 1 | // 引入状态码表 2 | import setting from './base/setting' 3 | // 引入config配置表 4 | import userConfig from './user/config'; 5 | import goodConfig from './good/config'; 6 | import sellerConfig from './seller/config'; 7 | 8 | export default { 9 | __setting: setting, 10 | __config: { 11 | 'user_cache_key': userConfig, 12 | 'good_cache_key': goodConfig, 13 | 'seller_cache_key': sellerConfig 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/components/common/topBar/component.js: -------------------------------------------------------------------------------- 1 | import Base from '@/base/base.vue' 2 | import SellerCache from '@/axios/seller/cache' 3 | 4 | export default Base.extend({ 5 | data() { 6 | return { 7 | seller: { 8 | supports:[{}] 9 | }, 10 | isShowIntro: false 11 | }; 12 | }, 13 | created: function() { 14 | SellerCache.getSeller() 15 | .then((res)=>{ 16 | this.seller = res; 17 | }) 18 | } 19 | }) -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import store from '../store' 4 | 5 | Vue.use(Router) 6 | 7 | import routes from './router' 8 | 9 | const router = new Router({ 10 | routes 11 | }) 12 | 13 | // 路由钩子 14 | router.beforeEach(({path},from,next)=>{ 15 | 16 | let isLogin = store.state.isLogin; 17 | 18 | if(!isLogin && path !== '/login'){ 19 | return next({path:'/login'}) 20 | } 21 | 22 | next(); 23 | 24 | }) 25 | 26 | export default router 27 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 帕尼尼的收银台 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/components/shop/shop/component.js: -------------------------------------------------------------------------------- 1 | import Base from '@/base/base.vue' 2 | import SellerCache from '@/axios/seller/cache' 3 | export default Base.extend({ 4 | data() { 5 | return { 6 | seller: {} 7 | } 8 | }, 9 | methods: { 10 | getSeller: function() { 11 | SellerCache.getSellerAll() 12 | .then((res)=>{ 13 | this.seller = res; 14 | }) 15 | } 16 | }, 17 | created: function() { 18 | this.getSeller(); 19 | } 20 | }) -------------------------------------------------------------------------------- /src/axios/user/config.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'user-getUser': { 3 | url: 'user/infor', 4 | method: 'get' 5 | }, 6 | 'user-getOrders': { 7 | url: 'user/order?type=', 8 | method: 'get' 9 | }, 10 | 'user-submitOrder': { 11 | url: 'user/submit?order=', 12 | method: 'get' 13 | }, 14 | 'user-confirmOrder': { 15 | url: 'user/confirm?orderId=', 16 | method: 'get' 17 | }, 18 | 'user-submitRating': { 19 | url: 'user/rating?rating=', 20 | method: 'get' 21 | }, 22 | 'user-userLogin': { 23 | url: 'user/login', 24 | method: 'post' 25 | } 26 | } -------------------------------------------------------------------------------- /src/components/pages/login/component.html: -------------------------------------------------------------------------------- 1 |
2 |

饿了么

3 |
饿了就上饿了么!
4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 登录 13 | 14 | 15 |
-------------------------------------------------------------------------------- /server/routes/index.js: -------------------------------------------------------------------------------- 1 | const Router = require('koa-router'); 2 | const router = new Router(); 3 | 4 | const good = require('./good.js'); 5 | const user = require('./user.js'); 6 | const seller = require('./seller.js'); 7 | 8 | 9 | module.exports = function (app) { 10 | //路由表 11 | app.use(router.routes()).use(router.allowedMethods()); 12 | 13 | router.use('/api/elm/good', good.routes(), good.allowedMethods()); 14 | router.use('/api/elm/user', user.routes(), user.allowedMethods()); 15 | router.use('/api/elm/seller', seller.routes(), seller.allowedMethods()); 16 | } 17 | 18 | 19 | -------------------------------------------------------------------------------- /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 './App' 5 | import router from './router' 6 | 7 | import ElementUI from 'element-ui' 8 | import 'element-ui/lib/theme-chalk/index.css' 9 | Vue.use(ElementUI) 10 | 11 | import store from '@/store' 12 | import axios from '@/axios' 13 | 14 | Vue.$axios = axios; 15 | 16 | Vue.config.productionTip = false 17 | 18 | /* eslint-disable no-new */ 19 | new Vue({ 20 | el: '#app', 21 | router, 22 | store, 23 | components: { App }, 24 | template: '' 25 | }) 26 | -------------------------------------------------------------------------------- /server/db/index.js: -------------------------------------------------------------------------------- 1 | const mysql = require('mysql'); 2 | 3 | let pool = mysql.createPool({ 4 | host:'localhost', 5 | user:'root', 6 | password:'1111', 7 | database:'elm', 8 | }); 9 | 10 | let query = function( sql, values ) { 11 | return new Promise(( resolve, reject ) => { 12 | pool.getConnection(function(err, connection) { 13 | if (err) { 14 | resolve( err ) 15 | } else { 16 | connection.query(sql, values, ( err, data) => { 17 | if ( err ) { 18 | reject( err ) 19 | } else { 20 | resolve( data ) 21 | } 22 | connection.release() 23 | }) 24 | } 25 | }) 26 | }); 27 | } 28 | 29 | module.exports = query; 30 | -------------------------------------------------------------------------------- /src/components/pages/detail/component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 |

{{food.name}}

7 |

月售{{food.sellCount}} 好评率{{food.rating}}%

8 | ¥{{food.price}} 9 |
10 | 加入购物车 11 |
12 |
13 |
14 |

商品介绍

15 |

{{food.info}}

16 |
17 |
18 |
19 |
20 | 21 |
22 | 23 |
-------------------------------------------------------------------------------- /src/components/shop/rating/component.js: -------------------------------------------------------------------------------- 1 | import Base from '@/base/base.vue' 2 | import SellerCache from '@/axios/seller/cache' 3 | 4 | export default Base.extend({ 5 | data() { 6 | return { 7 | ratings: [], 8 | seller: {}, 9 | isActive:'0', 10 | }; 11 | }, 12 | methods: { 13 | getRatings: function(type) { 14 | this.isActive = type; 15 | SellerCache.getRatings(type) 16 | .then((res)=>{ 17 | this.ratings = res; 18 | }) 19 | }, 20 | getSeller: function() { 21 | SellerCache.getSeller() 22 | .then((res)=>{ 23 | this.seller = res; 24 | }) 25 | } 26 | }, 27 | created: function() { 28 | this.getRatings('0'); 29 | this.getSeller(); 30 | } 31 | }) -------------------------------------------------------------------------------- /server/index.js: -------------------------------------------------------------------------------- 1 | const Koa = require('koa'); 2 | const Static = require('koa-static'); 3 | const BodyParser = require('koa-bodyparser'); 4 | const cors = require('koa2-cors'); 5 | const path = require('path'); 6 | 7 | const routes = require('./routes'); 8 | const app = new Koa(); 9 | 10 | //跨域 11 | app.use(cors({ 12 | origin: function (ctx) { 13 | return "*"; // 允许来自所有域名请求 14 | }, 15 | exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'], 16 | maxAge: 5, 17 | credentials: true, 18 | allowMethods: ['GET', 'POST', 'DELETE'], 19 | allowHeaders: ['Content-Type', 'Authorization', 'Accept'], 20 | })); 21 | 22 | 23 | //post解析 24 | app.use(BodyParser()); 25 | 26 | routes(app); 27 | 28 | //黑洞路由 29 | app.use(Static(path.join(__dirname,'./static/'))); 30 | 31 | //端口监听 32 | app.listen(80); -------------------------------------------------------------------------------- /server/routes/good.js: -------------------------------------------------------------------------------- 1 | const Router = require('koa-router'); 2 | const api = require('../api/'); 3 | const router = new Router(); 4 | 5 | router 6 | .get('/all',async(ctx)=>{ 7 | let goods; 8 | await api.getGoodTypes() 9 | .then(res=>{ 10 | goods = res; 11 | }).catch(err=>{ 12 | ctx.body = {'status':false}; 13 | }); 14 | for(good of goods){ 15 | await api.getGoodsByType( good.fTypeId ) 16 | .then(res=>{ 17 | good.foods = res; 18 | }).catch(err=>{ 19 | ctx.body = {'status':false}; 20 | }); 21 | } 22 | ctx.body = {'status':true,'data':goods}; 23 | }) 24 | .get('/food',async(ctx)=>{ 25 | await api.getGoodByGoodId(ctx.query.foodId) 26 | .then(res=>{ 27 | ctx.body = {'status':true,'data':res[0]}; 28 | }).catch(err=>{ 29 | ctx.body = {'status':false}; 30 | }); 31 | }); 32 | 33 | module.exports = router; -------------------------------------------------------------------------------- /src/axios/user/cache.js: -------------------------------------------------------------------------------- 1 | import sendRequest from '../base'; 2 | const CACHE_KEY = 'user_cache_key' 3 | 4 | export default { 5 | getUser(options) { 6 | return sendRequest(CACHE_KEY, 'user-getUser',options) 7 | }, 8 | 9 | getOrders(options) { 10 | return sendRequest(CACHE_KEY, 'user-getOrders',options) 11 | }, 12 | 13 | getRatings(options) { 14 | return sendRequest(CACHE_KEY, 'user-getRatings',options) 15 | }, 16 | 17 | submitOrder(options) { 18 | return sendRequest(CACHE_KEY, 'user-submitOrder',options) 19 | }, 20 | 21 | confirmOrder(options) { 22 | return sendRequest(CACHE_KEY, 'user-confirmOrder',options) 23 | }, 24 | 25 | submitRating(options) { 26 | return sendRequest(CACHE_KEY, 'user-submitRating',options) 27 | }, 28 | 29 | userLogin(options) { 30 | return sendRequest(CACHE_KEY, 'user-userLogin',options) 31 | } 32 | } -------------------------------------------------------------------------------- /src/components/pages/login/component.js: -------------------------------------------------------------------------------- 1 | import Base from '@/base/base.vue' 2 | import UserCache from '@/axios/user/cache' 3 | export default Base.extend({ 4 | data() { 5 | return { 6 | user: { 7 | username: 'admin', 8 | password: '1111', 9 | } 10 | } 11 | }, 12 | methods: { 13 | login: function() { 14 | UserCache.userLogin(this.user) 15 | .then((res)=>{ 16 | this.$store.dispatch('changeLoginState'); 17 | this.$message({ 18 | message: res, 19 | type: 'success' 20 | }); 21 | this.$router.push('/shop/order'); 22 | }).catch((err)=>{ 23 | this.$message.error(err); 24 | }); 25 | } 26 | } 27 | }) -------------------------------------------------------------------------------- /src/base/base.vue: -------------------------------------------------------------------------------- 1 | 28 | -------------------------------------------------------------------------------- /src/components/shop/order/component.js: -------------------------------------------------------------------------------- 1 | import cart from '@/components/common/cart/ui'; 2 | import Base from '@/base/base.vue' 3 | 4 | import GoodCache from '@/axios/good/cache' 5 | 6 | export default Base.extend({ 7 | components: { 8 | cart 9 | }, 10 | data() { 11 | return { 12 | goods: [] 13 | }; 14 | }, 15 | methods: { 16 | getGood: function() { 17 | GoodCache.getGoods() 18 | .then((res)=>{ 19 | this.goods = res; 20 | }); 21 | }, 22 | addFood: function(food) { 23 | this.$refs[food.foodId][0].style.display = "block"; 24 | this.$store.dispatch("addOrder", food); 25 | }, 26 | subFood: function(food) { 27 | // this.$refs[food.foodId][0].style.display = "none"; 28 | this.$store.dispatch("subOrder", food); 29 | } 30 | }, 31 | created: function() { 32 | this.getGood(); 33 | } 34 | }) -------------------------------------------------------------------------------- /src/components/pages/rate/component.html: -------------------------------------------------------------------------------- 1 |
2 |

你的五星好评是我进步的动力

3 | 4 | 5 | 星级 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 送达时间 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 提交评价 24 |
-------------------------------------------------------------------------------- /src/components/common/cart/component.js: -------------------------------------------------------------------------------- 1 | import Base from '@/base/base.vue' 2 | 3 | export default Base.extend({ 4 | data() { 5 | return { 6 | isShowCart: false, 7 | leastMoney: 40, 8 | } 9 | }, 10 | computed: { 11 | cartFoods() { 12 | return this.$store.getters.getCart; 13 | }, 14 | totalMoney() { 15 | return this.$store.getters.getTotal; 16 | }, 17 | shortMoney() { 18 | return this.leastMoney - this.$store.getters.getTotal; 19 | } 20 | }, 21 | methods: { 22 | addFood: function(food) { 23 | this.$store.dispatch("addOrder", food); 24 | }, 25 | subFood: function(food) { 26 | this.$store.dispatch("subOrder", food); 27 | }, 28 | cleanCart: function(){ 29 | this.$store.dispatch("cleanOrder"); 30 | } 31 | } 32 | }) -------------------------------------------------------------------------------- /src/components/pages/detail/component.js: -------------------------------------------------------------------------------- 1 | import Base from '@/base/base.vue' 2 | import cart from '@/components/common/cart/ui' 3 | 4 | import GoodCache from '@/axios/good/cache' 5 | export default Base.extend({ 6 | components: { 7 | cart 8 | }, 9 | data() { 10 | return { 11 | food: {}, 12 | activeRating: 'all' 13 | }; 14 | }, 15 | methods: { 16 | getGood: function () { 17 | let foodId = this.$route.query.id; 18 | GoodCache.getGood(foodId) 19 | .then((res)=>{ 20 | this.food = res; 21 | }) 22 | }, 23 | goBack: function () { 24 | this.$router.push({ 25 | path: '/shop/order' 26 | }); 27 | }, 28 | addFood: function (food) { 29 | this.$store.dispatch("addOrder", food); 30 | } 31 | }, 32 | created: function () { 33 | this.getGood(); 34 | } 35 | }) -------------------------------------------------------------------------------- /src/axios/base/index.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import Vue from 'vue' 3 | 4 | let httpURL = "http://www.xuguobin.club/api/elm/" //这是我服务器的api接口 5 | let localURL = 'http://localhost/api/elm/'; //这是本地koa2的api接口 6 | 7 | axios.defaults.baseURL = httpURL; 8 | axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'; 9 | 10 | // 判断状态码 11 | function resultJudge(code) { 12 | return code 13 | } 14 | // 处理错误公共方法 15 | function handleErrorCase(error) { 16 | if (typeof error == 'Number') { 17 | console.log(error) 18 | } else { 19 | alert(error) 20 | } 21 | } 22 | // 发送请求 23 | export default function sendRequest(settingKey, key, data) { 24 | let send = Vue.$axios.__config[settingKey][key]; 25 | let baseURL = send.url; 26 | send.method == 'get' 27 | ? data && (send.url += data) 28 | : send.data = data; 29 | return new Promise((resolve,reject) => { 30 | axios(send) 31 | .then((res)=>{ 32 | send.url = baseURL; 33 | resultJudge(res.data.status) ? resolve(res.data.data) : reject(res.data.data); 34 | }).catch((err)=>{ 35 | handleErrorCase(err) 36 | }); 37 | }); 38 | } -------------------------------------------------------------------------------- /src/store/actions.js: -------------------------------------------------------------------------------- 1 | import types from './types.js' 2 | 3 | const actions={ 4 | //购物车加入一件商品 5 | addOrder({commit,state},food) { 6 | let orders = state.cart; 7 | state.total += food.price; 8 | for(let i=0;i= 3? 1:-1; 21 | UserCache.submitRating(JSON.stringify(this.rating)) 22 | .then((res)=>{ 23 | this.$message({ 24 | message: res, 25 | type: 'success' 26 | }); 27 | this.$router.push({path:'/shop/rating'}); 28 | }).catch(err=>{ 29 | this.$message({ 30 | message: err, 31 | type: 'warning' 32 | }); 33 | }); 34 | } 35 | }, 36 | created: function(){ 37 | this.rating.orderId = this.$route.query.id; 38 | } 39 | }) -------------------------------------------------------------------------------- /src/components/pages/detail/component.less: -------------------------------------------------------------------------------- 1 | #detail { 2 | .detail-img { 3 | width: 100%; 4 | height: 300px; 5 | img { 6 | width: 100%; 7 | height: 100%; 8 | } 9 | } 10 | .detail-infor { 11 | padding: 18px 18px 0px; 12 | border-bottom: 20px solid #eee; 13 | h1 { 14 | font-size: 14px; 15 | } 16 | p { 17 | font-size: 12px; 18 | color: #999; 19 | margin: 8px 0px 18px; 20 | } 21 | span { 22 | color: #f01414; 23 | font-weight: 700; 24 | } 25 | div { 26 | position: relative; 27 | bottom: 25px; 28 | left: 240px; 29 | } 30 | } 31 | .detail-intro { 32 | padding: 18px; 33 | border-bottom: 20px solid #eee; 34 | h2 { 35 | font-size: 14px; 36 | font-weight: normal; 37 | margin-bottom: 8px; 38 | } 39 | p { 40 | font-size: 12px; 41 | color: #4d555d; 42 | line-height: 24px; 43 | padding: 0 8px; 44 | font-weight: 200; 45 | } 46 | } 47 | .detail-back { 48 | position: absolute; 49 | top: 20px; 50 | left: 20px; 51 | font-size: 20px; 52 | } 53 | } -------------------------------------------------------------------------------- /src/router/router.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | path: '/', 4 | redirect: '/login' 5 | }, 6 | { 7 | path: '/login', 8 | component: resolve => require(['@/components/pages/login/ui'],resolve) 9 | }, 10 | { 11 | path: '/admin', 12 | component: resolve => require(['@/components/pages/admin/ui'],resolve) 13 | }, 14 | { 15 | path: '/detail', 16 | component: resolve => require(['@/components/pages/detail/ui'],resolve) 17 | }, 18 | { 19 | path: '/account', 20 | component: resolve => require(['@/components/pages/account/ui'],resolve) 21 | }, 22 | { 23 | path: '/rate', 24 | component: resolve => require(['@/components/pages/rate/ui'],resolve) 25 | }, 26 | { 27 | path: '/shop', 28 | component: resolve => require(['@/components/shop/index/ui'],resolve), 29 | children: [ 30 | { 31 | path: '/', 32 | redirect: 'order' 33 | }, 34 | { 35 | path: 'order', 36 | component: resolve => require(['@/components/shop/order/ui'],resolve) 37 | }, 38 | { 39 | path: 'rating', 40 | component: resolve => require(['@/components/shop/rating/ui'],resolve) 41 | }, 42 | { 43 | path: 'shop', 44 | component: resolve => require(['@/components/shop/shop/ui'],resolve) 45 | } 46 | ] 47 | }, 48 | ] 49 | -------------------------------------------------------------------------------- /src/components/shop/order/component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | 10 |
11 |
12 | 13 |
14 |
    15 |
  • 16 |

    {{type.name}}

    17 |
      18 | 19 |
      20 | 21 |
      22 |
      23 |

      {{food.name}}

      24 |

      月售{{food.sellCount}}份 好评率{{food.rating}}%

      25 | ¥{{food.price}} 26 |
      27 | 28 | 29 |
      30 |
    31 |
  • 32 |
33 |
34 |
35 |
36 | 37 |
-------------------------------------------------------------------------------- /src/components/common/cart/component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | 购物车 5 | 清空 6 |
7 |
    8 |
  • 9 |

    {{food.name}}

    10 | ¥{{food.total}} 11 | 12 | 13 |  {{food.count}}  14 | 15 | 16 |
  • 17 |
18 |
19 |
20 |
21 | 22 | 23 | ¥{{totalMoney}} 24 | 另需配送费 ¥4元 25 |
26 |
27 | 还差 ¥{{shortMoney}}元 起送 28 |
29 |
30 | 去结算 31 |
32 |
33 |
34 |
-------------------------------------------------------------------------------- /src/components/pages/account/component.html: -------------------------------------------------------------------------------- 1 |
2 | 5 | 9 |
10 | 26 |
27 | 45 | 49 |
-------------------------------------------------------------------------------- /src/components/pages/admin/component.js: -------------------------------------------------------------------------------- 1 | import Base from '@/base/base.vue' 2 | import UserCache from '@/axios/user/cache' 3 | export default Base.extend({ 4 | data() { 5 | return { 6 | orders: [], 7 | user:{}, 8 | isActive: 1, 9 | } 10 | }, 11 | methods: { 12 | goBack: function() { 13 | this.$router.push({ 14 | path: '/shop/order' 15 | }); 16 | }, 17 | quit: function() { 18 | this.$store.dispatch('changeLoginState'); 19 | this.$router.push({ 20 | path: '/login' 21 | }); 22 | }, 23 | getUserInfo: function() { 24 | UserCache.getUser() 25 | .then((res)=>{ 26 | this.user = res; 27 | }) 28 | }, 29 | getOrders: function(type) { 30 | this.isActive = type; 31 | UserCache.getOrders(type) 32 | .then((res)=>{ 33 | this.orders = res; 34 | }) 35 | }, 36 | confirmOrder: function(orderId) { 37 | UserCache.confirmOrder(orderId) 38 | .then((res)=>{ 39 | this.$message({ 40 | message: res, 41 | type: 'success' 42 | }); 43 | this.getOrders('2'); 44 | }).catch((err)=>{ 45 | this.$message({ 46 | message: err, 47 | type: 'warning' 48 | }); 49 | }); 50 | } 51 | }, 52 | created: function() { 53 | this.getUserInfo(); 54 | this.getOrders('1'); 55 | } 56 | }) -------------------------------------------------------------------------------- /server/routes/seller.js: -------------------------------------------------------------------------------- 1 | const Router = require('koa-router'); 2 | const api = require('../api/'); 3 | const router = new Router(); 4 | 5 | router 6 | .get('/top',async(ctx)=>{ 7 | let seller; 8 | await api.getSellerInfo() 9 | .then(res=>{ 10 | seller = res[0]; 11 | }).catch(err=>{ 12 | ctx.body = {'status':false}; 13 | }); 14 | api.initSellerId( seller.sellerId ); 15 | await api.getSellerSupports() 16 | .then(res=>{ 17 | seller.supports = res; 18 | }).catch(err=>{ 19 | ctx.body = {'status':false}; 20 | }); 21 | ctx.body = {'status':true,'data':seller}; 22 | }) 23 | .get('/all',async(ctx)=>{ 24 | let seller; 25 | await api.getSellerInfo() 26 | .then(res=>{ 27 | seller = res[0]; 28 | }).catch(err=>{ 29 | ctx.body = {'status':false}; 30 | }); 31 | await api.getSellerSupports() 32 | .then(res=>{ 33 | seller.supports = res; 34 | }).catch(err=>{ 35 | ctx.body = {'status':false}; 36 | }); 37 | await api.getSellerPics() 38 | .then(res=>{ 39 | seller.pics = res; 40 | }).catch(err=>{ 41 | ctx.body = {'status':false}; 42 | }); 43 | await api.getSellerInfos() 44 | .then(res=>{ 45 | seller.infos = res; 46 | }).catch(err=>{ 47 | ctx.body = {'status':false}; 48 | }); 49 | ctx.body = {'status':true,'data':seller}; 50 | }) 51 | .get('/rating',async(ctx)=>{ 52 | let ratings; 53 | await api.getSellerRatings(ctx.query.type) 54 | .then(res=>{ 55 | ratings = res; 56 | }).catch(err=>{ 57 | ctx.body = {'status':false}; 58 | }); 59 | for(let rating of ratings){ 60 | await api.getUserInfo(rating.userId) 61 | .then(res=>{ 62 | rating.nick = res[0].nick; 63 | rating.avatar = res[0].headSrc; 64 | }).catch(err=>{ 65 | ctx.body = {'status':false}; 66 | }) 67 | } 68 | ctx.body = {'status':true,'data':ratings}; 69 | }); 70 | 71 | module.exports = router; -------------------------------------------------------------------------------- /src/components/shop/shop/component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | 5 |

{{seller.name}}

6 | ({{seller.ratingCount}}) 月售{{seller.sellCount}}单 7 |
8 |
9 | 10 | 11 |
起送价
12 | {{seller.minPrice}}元 13 |
14 | 15 |
商家配送
16 | {{seller.deliveryPrice}}元 17 |
18 | 19 |
平均配送时间
20 | {{seller.deliveryTime}}分钟 21 |
22 |
23 |
24 |
25 |
26 |

公告与活动

27 |

{{seller.bulletin}}

28 |
    29 |
  • 30 | 31 | {{support.description}} 32 |
  • 33 |
34 |
35 |
36 |
37 |

商家实景

38 |
    39 |
  • 40 | 41 |
  • 42 |
43 |
44 |
45 |
46 |

商家信息

47 |
    48 |
  • 49 | {{info.info}} 50 |
  • 51 |
52 |
53 |
-------------------------------------------------------------------------------- /src/components/pages/admin/component.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 |
6 | 注销 7 |
8 |
9 |

{{user.nick}}

10 | 11 | 12 |
13 |
14 |
15 | 地址 16 | {{user.address}} 17 |
18 |
19 | 余额 20 | ¥{{user.account}} 21 |
22 |
23 |
24 | 25 | 26 | 当前订单 27 | 28 | 29 | 30 | 待评价订单 31 | 32 | 33 | 34 | 完成订单 35 | 36 |
37 |
38 |
39 |
    40 |
  • 41 | {{order.orderTime}} 42 | ¥{{order.price}} 43 | 确认送达 44 | 45 | 评价 46 | 47 | 已评价 48 |
  • 49 |
50 |
51 |
-------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 技术栈 2 | 3 | - 前端部分 4 | vuejs,vuex,axios,element-ui,webpack 5 | - 后台部分 6 | koa2,mysql 7 | 8 | ### 安装和运行 9 | 10 | - 后台部分 11 | 安装依赖 12 | `npm install` 13 | `node index` 14 | 成功执行! 15 | 16 | - 前端部分 17 | 安装依赖 18 | `npm install` 19 | `npm run dev` 20 | 成功执行! 21 | 22 | 写的不好,欢迎 star 和 fork。 23 | 24 | ### 项目重构 25 | 26 | - 第一次重构(2018.4.21) 27 | 将 axios 操作抽离成单独的 app.js 文件 [elm1](https://github.com/paninix/elm/tree/elm1) 28 | - 第二次重构(2018.7.8) 29 | 将 axios 操作封装成类继承形式 [elm2](https://github.com/paninix/elm/tree/elm2) 30 | - 第三次重构(2019.4.14) 31 | 将 axios 操作封装成配置表形式 [elm3](https://github.com/paninix/elm/tree/elm3) 32 | 33 | ### 项目结构 34 | 35 |
36 | 
37 | ```
38 | ├── README.md
39 | ├── build              // 构建服务和webpack配置
40 | ├── config             // 项目不同环境的配置
41 | ├── index.html         // 项目入口文件
42 | ├── package.json       // 项目配置文件
43 | │
44 | ├── server             // 项目后台
45 | │   ├── api            // api操作
46 | │   ├── db             // 与数据库交互
47 | │   ├── routes          // 后台路由
48 | │   ├── index.js       // 后台入口文件
49 | │   └── package.json   // 项目配置文件
50 | |
51 | │
52 | ├── src                // 生产目录
53 | │   └── axios           // axios操作
54 | |         ├──index.js   // axios配置表
55 | |         ├──base       // axios公共部分
56 | |         |    ├──index.js    //公共方法
57 | |         |    └──setting.js  //状态码
58 | |         └── user
59 | |               ├──cache.js     //请求函数
60 | |               └──config.js    //配置信息
61 | |
62 | |   ├── base           //vue模板
63 | │   ├── components     // 组件
64 | |   |     ├──common    //公共组件
65 | |   |     └──admin
66 | |   |          ├── ui.vue             // 输出组件
67 | |   |          ├── component.html     // template
68 | |   |          ├── component.js       // script
69 | |   |          └── component.less     // style
70 | |   |
71 | │   ├── router         // 路由
72 | │   ├── store          // vuex状态管理器
73 | │	  ├── App.vue        // 首页
74 | │   └── main.js        // Webpack 预编译入口
75 | │
76 | ```
77 | 


--------------------------------------------------------------------------------
/src/components/pages/account/component.js:
--------------------------------------------------------------------------------
 1 | import Base from '@/base/base.vue'
 2 | import UserCache from '@/axios/user/cache'
 3 | import SellerCache from '@/axios/seller/cache'
 4 | 
 5 | export default Base.extend({
 6 |     data() {
 7 |         return {
 8 |             user: {},
 9 |             seller: {}
10 |         }
11 |     },
12 |     computed: {
13 |         orderFood: function() {
14 |             return this.$store.getters.getCart;
15 |         },
16 |         payMoney: function() {
17 |             if (this.$store.getters.getTotal > 28)
18 |                 return this.$store.getters.getTotal - 5 + this.seller.deliveryPrice;
19 |             else
20 |                 return this.$store.getters.getTotal + this.seller.deliveryPrice;
21 |         }
22 |     },
23 |     methods: {
24 |         goBack: function() {
25 |             this.$router.push({
26 |                 path: '/shop/order'
27 |             });
28 |         },
29 |         submitOrder: function() {
30 |             let order = {
31 |                 'orderTime': new Date().getTime(),
32 |                 'orderType': 1,
33 |                 'price': this.payMoney,
34 |             };
35 |             UserCache.submitOrder(JSON.stringify(order))
36 |             .then((res)=>{
37 |                 this.$message({
38 |                     message: res,
39 |                     type: 'success'
40 |                 });
41 |                 this.$router.push('/admin');
42 |             }).catch((err)=>{
43 |                 this.$message({
44 |                     message: err,
45 |                     type: 'warning'
46 |                 });
47 |             });
48 |         },
49 |         getUSer: function() {
50 |             UserCache.getUser()
51 |             .then((res)=>{
52 |                 this.user = res;
53 |             })
54 |         },
55 |         getSeller: function() {
56 |             SellerCache.getSeller()
57 |             .then((res)=>{
58 |                 this.seller = res;
59 |             })
60 |         }
61 |     },
62 |     created: function() {
63 |         this.getUSer();
64 |         this.getSeller();
65 |     }
66 | })


--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
 1 | {
 2 |   "name": "pos",
 3 |   "version": "1.0.0",
 4 |   "description": "A Vue.js project",
 5 |   "author": "",
 6 |   "private": true,
 7 |   "scripts": {
 8 |     "dev": "webpack-dev-server --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 |     "element-ui": "^2.3.3",
15 |     "html-loader": "^0.5.5",
16 |     "moment": "^2.22.2",
17 |     "vue": "^2.5.2",
18 |     "vue-router": "^3.0.1",
19 |     "vuex": "^3.0.1"
20 |   },
21 |   "devDependencies": {
22 |     "autoprefixer": "^7.1.2",
23 |     "babel-core": "^6.22.1",
24 |     "babel-helper-vue-jsx-merge-props": "^2.0.3",
25 |     "babel-loader": "^7.1.1",
26 |     "babel-plugin-syntax-jsx": "^6.18.0",
27 |     "babel-plugin-transform-runtime": "^6.22.0",
28 |     "babel-plugin-transform-vue-jsx": "^3.5.0",
29 |     "babel-preset-env": "^1.3.2",
30 |     "babel-preset-stage-2": "^6.22.0",
31 |     "chalk": "^2.0.1",
32 |     "copy-webpack-plugin": "^4.0.1",
33 |     "css-loader": "^0.28.0",
34 |     "extract-text-webpack-plugin": "^3.0.0",
35 |     "file-loader": "^1.1.4",
36 |     "friendly-errors-webpack-plugin": "^1.6.1",
37 |     "html-webpack-plugin": "^2.30.1",
38 |     "less": "^3.0.1",
39 |     "less-loader": "^4.1.0",
40 |     "node-notifier": "^5.1.2",
41 |     "optimize-css-assets-webpack-plugin": "^3.2.0",
42 |     "ora": "^1.2.0",
43 |     "portfinder": "^1.0.13",
44 |     "postcss-import": "^11.0.0",
45 |     "postcss-loader": "^2.0.8",
46 |     "postcss-url": "^7.2.1",
47 |     "rimraf": "^2.6.0",
48 |     "semver": "^5.3.0",
49 |     "shelljs": "^0.7.6",
50 |     "uglifyjs-webpack-plugin": "^1.1.1",
51 |     "url-loader": "^0.5.8",
52 |     "vue-loader": "^13.3.0",
53 |     "vue-style-loader": "^3.0.1",
54 |     "vue-template-compiler": "^2.5.2",
55 |     "webpack": "^3.6.0",
56 |     "webpack-bundle-analyzer": "^2.9.0",
57 |     "webpack-dev-server": "^2.9.1",
58 |     "webpack-merge": "^4.1.0"
59 |   },
60 |   "engines": {
61 |     "node": ">= 6.0.0",
62 |     "npm": ">= 3.0.0"
63 |   },
64 |   "browserslist": [
65 |     "> 1%",
66 |     "last 2 versions",
67 |     "not ie <= 8"
68 |   ]
69 | }
70 | 


--------------------------------------------------------------------------------
/src/components/shop/order/component.less:
--------------------------------------------------------------------------------
 1 | #order {
 2 |     .order-type {
 3 |       background-color: #f3f5f7;
 4 |       font-size: 12px;
 5 |       font-weight: 200;
 6 |       li {
 7 |         padding: 20px 15px;
 8 |         border-bottom: 1px solid #ccc;
 9 |       }
10 |       li:hover {
11 |         background-color: #fff;
12 |       }
13 |       li:last-child {
14 |         border-bottom: none;
15 |       }
16 |     }
17 |     .order-good {
18 |       height: 500px;
19 |       overflow-y: scroll;
20 |       ul {
21 |         li {
22 |           h2 {
23 |             height: 12px;
24 |             padding: 8px;
25 |             background-color: #f3f5f7;
26 |             font-size: 12px;
27 |             font-weight: normal;
28 |             border-left: 2px solid #ccc;
29 |           }
30 |           ul {
31 |             li {
32 |               position: relative;
33 |               padding: 18px 0;
34 |               margin: 0px 18px;
35 |               height: 60px;
36 |               border-bottom: 1px solid #ccc;
37 |               div {
38 |                 float: left;
39 |               }
40 |               div:first-of-type {
41 |                 margin-right: 10px;
42 |                 img {
43 |                   width: 57px;
44 |                   height: 57px;
45 |                 }
46 |               }
47 |               div:nth-child(2) {
48 |                 h3 {
49 |                   font-size: 14px;
50 |                 }
51 |                 p {
52 |                   margin: 8px 0px 2px;
53 |                   font-size: 10px;
54 |                   color: #93999f;
55 |                 }
56 |                 span {
57 |                   font-size: 14px;
58 |                   color: #f01414;
59 |                 }
60 |               }
61 |               i {
62 |                 position: absolute;
63 |                 top: 64px;
64 |               }
65 |               .icon-jia {
66 |                 left: 200px;
67 |               }
68 |               .icon-jian {
69 |                 left: 160px;
70 |                 display: none;
71 |               }
72 |             }
73 |             li:last-child {
74 |               border-bottom: none;
75 |             }
76 |           }
77 |         }
78 |       }
79 |     }
80 |   }


--------------------------------------------------------------------------------
/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 | 
15 |     // Various Dev Server settings
16 |     host: 'localhost', // can be overwritten by process.env.HOST
17 |     port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
18 |     autoOpenBrowser: false,
19 |     errorOverlay: true,
20 |     notifyOnErrors: true,
21 |     poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
22 | 
23 |     
24 |     /**
25 |      * Source Maps
26 |      */
27 | 
28 |     // https://webpack.js.org/configuration/devtool/#development
29 |     devtool: 'cheap-module-eval-source-map',
30 | 
31 |     // If you have problems debugging vue-files in devtools,
32 |     // set this to false - it *may* help
33 |     // https://vue-loader.vuejs.org/en/options.html#cachebusting
34 |     cacheBusting: true,
35 | 
36 |     cssSourceMap: true
37 |   },
38 | 
39 |   build: {
40 |     // Template for index.html
41 |     index: path.resolve(__dirname, '../dist/index.html'),
42 | 
43 |     // Paths
44 |     assetsRoot: path.resolve(__dirname, '../dist'),
45 |     assetsSubDirectory: 'static',
46 |     assetsPublicPath: './',
47 | 
48 |     /**
49 |      * Source Maps
50 |      */
51 | 
52 |     productionSourceMap: true,
53 |     // https://webpack.js.org/configuration/devtool/#production
54 |     devtool: '#source-map',
55 | 
56 |     // Gzip off by default as many popular static hosts such as
57 |     // Surge or Netlify already gzip all static assets for you.
58 |     // Before setting to `true`, make sure to:
59 |     // npm install --save-dev compression-webpack-plugin
60 |     productionGzip: false,
61 |     productionGzipExtensions: ['js', 'css'],
62 | 
63 |     // Run the build command with an extra argument to
64 |     // View the bundle analyzer report after build finishes:
65 |     // `npm run build --report`
66 |     // Set to `true` or `false` to always turn it on or off
67 |     bundleAnalyzerReport: process.env.npm_config_report
68 |   }
69 | }
70 | 


--------------------------------------------------------------------------------
/src/components/common/topBar/component.html:
--------------------------------------------------------------------------------
 1 | 
2 |
3 |
4 | 5 |
6 |
7 |

8 | 9 | {{seller.name}} 10 |

11 | {{seller.description}}/{{seller.deliveryTime}}分钟送达 12 |
13 | 14 | {{seller.supports[0].description}} 15 |
16 |
17 |
18 | {{seller.supports.length}}个 19 | 20 |
21 |
22 | 23 |
24 |
25 |
26 |

27 | 28 | {{seller.bulletin}} 29 | 30 |

31 |
32 |
33 | 商品 34 | 评价 35 | 商家 36 |
37 |
38 |

{{seller.name}}

39 | 40 | 41 |
42 |

优惠信息

43 |
    44 |
  • 45 | 46 | {{support.description}} 47 |
  • 48 |
49 |
50 |
51 |

商家公告

52 |

{{seller.bulletin}}

53 |
54 | 55 |
56 |
57 | 58 | 59 | 60 |
61 |
-------------------------------------------------------------------------------- /src/components/shop/shop/component.less: -------------------------------------------------------------------------------- 1 | #shop { 2 | .shop-title { 3 | padding: 18px 0px; 4 | margin: 0px 18px; 5 | border-bottom: 1px solid #ccc; 6 | h1 { 7 | display: inline-block; 8 | font-size: 14px; 9 | margin-top: 10px; 10 | } 11 | span { 12 | font-size: 12px; 13 | color: #4d555d; 14 | } 15 | } 16 | .shop-intro { 17 | text-align: center; 18 | padding: 18px 0px; 19 | font-size: 12px; 20 | color: #93999f; 21 | div { 22 | margin-bottom: 4px; 23 | } 24 | span { 25 | font-size: 24px; 26 | color: #000; 27 | } 28 | } 29 | .shop-public { 30 | padding-top: 18px; 31 | h2 { 32 | font-size: 14px; 33 | font-weight: normal; 34 | margin-left: 12px; 35 | } 36 | p { 37 | padding: 8px 12px 16px; 38 | font-size: 12px; 39 | font-weight: 200; 40 | color: #f01414; 41 | line-height: 24px; 42 | } 43 | ul { 44 | margin: 0px 18px; 45 | } 46 | li { 47 | padding: 16px; 48 | border-top: 1px solid #eee; 49 | font-size: 12px; 50 | font-weight: 200; 51 | color: #07111b; 52 | line-height: 16px; 53 | i { 54 | margin-right: 2px; 55 | } 56 | } 57 | } 58 | .shop-img { 59 | padding: 18px; 60 | h2 { 61 | font-size: 14px; 62 | margin-bottom: 10px; 63 | } 64 | ul { 65 | overflow: hidden; 66 | } 67 | li { 68 | margin-right: 6px; 69 | float: left; 70 | img { 71 | width: 78px; 72 | height: 75px; 73 | } 74 | } 75 | } 76 | .shop-infor { 77 | padding: 18px; 78 | h2 { 79 | font-size: 14px; 80 | margin-bottom: 10px; 81 | } 82 | ul { 83 | margin: 0px 18px; 84 | } 85 | li { 86 | padding: 16px; 87 | border-top: 1px solid #eee; 88 | font-size: 12px; 89 | font-weight: 200; 90 | color: #07111b; 91 | line-height: 16px; 92 | } 93 | } 94 | } -------------------------------------------------------------------------------- /src/components/shop/rating/component.less: -------------------------------------------------------------------------------- 1 | #rating { 2 | .el-row { 3 | padding: 18px 0px; 4 | .rating-total { 5 | font-size: 12px; 6 | text-align: center; 7 | border-right: 1px solid #ccc; 8 | h1 { 9 | font-size: 24px; 10 | color: #f90; 11 | line-height: 28px; 12 | font-weight: normal; 13 | } 14 | div { 15 | margin: 8px 0px; 16 | } 17 | } 18 | .rating-all { 19 | padding: 0px 16px; 20 | font-size: 12px; 21 | div { 22 | overflow: hidden; 23 | span { 24 | float: left; 25 | line-height: 20px; 26 | margin-right: 10px; 27 | } 28 | .el-rate { 29 | float: left; 30 | } 31 | div { 32 | font-size: 12px; 33 | color: #93999f; 34 | line-height: 18px; 35 | float: left; 36 | } 37 | } 38 | } 39 | } 40 | .rating-content { 41 | .rating-content-head { 42 | padding: 18px; 43 | font-size: 12px; 44 | overflow: hidden; 45 | border-bottom: 1px solid #ccc; 46 | span { 47 | float: left; 48 | width: 64px; 49 | line-height: 32px; 50 | text-align: center; 51 | margin-right: 8px; 52 | } 53 | } 54 | .rating-content-text { 55 | font-size: 12px; 56 | li { 57 | padding: 18px 0px; 58 | margin: 0px 18px; 59 | border-bottom: 1px solid #ccc; 60 | overflow: hidden; 61 | .rating-content-img { 62 | float: left; 63 | margin-right: 12px; 64 | img { 65 | width: 28px; 66 | height: 28px; 67 | border-radius: 50%; 68 | } 69 | } 70 | .rating-content-info { 71 | float: left; 72 | width: 85%; 73 | .rating-content-info-1 { 74 | overflow: hidden; 75 | span:first-child { 76 | float: left; 77 | } 78 | span:last-child { 79 | float: right; 80 | } 81 | } 82 | .rating-content-info-2 { 83 | margin: 6px 0px; 84 | span:first-child { 85 | color: #f90; 86 | margin-right: 5px; 87 | } 88 | } 89 | } 90 | } 91 | } 92 | } 93 | } -------------------------------------------------------------------------------- /src/components/shop/rating/component.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 |

{{seller.score}}

6 |
综合评分
7 |
高于周边商家{{seller.rankRate}}%
8 |
9 |
10 | 11 |
12 |
13 | 服务态度 14 | 15 | 16 |
17 |
18 | 商品质量 19 | 20 | 21 |
22 |
23 | 送达时间 24 |
{{seller.deliveryTime}}分钟
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 | 全部 33 | 推荐 34 | 吐槽 35 |
36 |
37 |
    38 |
  • 39 |
    40 | 41 |
    42 | 55 |
  • 56 |
57 |
58 |
59 |
-------------------------------------------------------------------------------- /server/routes/user.js: -------------------------------------------------------------------------------- 1 | const Router = require('koa-router'); 2 | const api = require('../api/'); 3 | const formatDate = require('../middleware/formatDate'); 4 | const router = new Router(); 5 | 6 | router 7 | .post('/login',async(ctx)=>{ 8 | let user = ctx.request.body; 9 | let userId; 10 | //进行登录验证 11 | await api.userLogin(user.username) 12 | .then(res=>{ 13 | let info = res[0]; 14 | if(info == undefined){ 15 | ctx.body = {'status':false,'data':'用户名不存在'}; 16 | }else{ 17 | if(info.password != user.password){ 18 | ctx.body = {'status':false,'data':'密码错误'}; 19 | }else{ 20 | userId = info.userId; 21 | ctx.body = {'status':true,'data':'登录成功'}; 22 | } 23 | } 24 | }).catch(err=>{ 25 | console.log(err); 26 | }); 27 | //用户ID初始化 28 | api.initUserId( userId ); 29 | }) 30 | .get('/infor',async(ctx)=>{ 31 | //获取用户基本信息 32 | await api.getUserInfo( ) 33 | .then(res=>{ 34 | ctx.body = {'status':true,'data':res[0]}; 35 | }).catch(err=>{ 36 | ctx.body = {'status':false,'data':'未知错误'}; 37 | }); 38 | }) 39 | .get('/order',async(ctx)=>{ 40 | await api.getUserOrders(ctx.query.type) 41 | .then(res=>{ 42 | ctx.body = {'status':true,'data':res}; 43 | }).catch(err=>{ 44 | ctx.body = {'status':false}; 45 | }); 46 | }) 47 | .get('/confirm',async(ctx)=>{ 48 | await api.userConfirmOrder(ctx.query.orderId) 49 | .then(res=>{ 50 | ctx.body = {'status':true,'data':'已收货'}; 51 | }).catch(err=>{ 52 | ctx.body = {'status':false,'data':'收货失败'}; 53 | }); 54 | }) 55 | .get('/submit',async(ctx)=>{ 56 | let order = JSON.parse(ctx.query.order); 57 | let account = 0; 58 | //获取用户余额信息 59 | await api.getUserInfo() 60 | .then(res=>{ 61 | account = res[0].account; 62 | }).catch(err=>{ 63 | ctx.body = {'status':false,'data':'未知错误'}; 64 | }); 65 | if(account < order.price){ 66 | ctx.body = {'status':false,'data':'余额不足'}; 67 | return; 68 | }else{ 69 | account = account - order.price; 70 | } 71 | //修改用户余额信息 72 | await api.userAccountSub(account) 73 | .then(res=>{ 74 | ; 75 | }).catch(err=>{ 76 | ctx.body = {'status':false,'data':'支付失败'}; 77 | }); 78 | //用户下单 79 | await api.userSubmitOrder(order) 80 | .then(res=>{ 81 | ctx.body = {'status':true,'data':'下单成功'}; 82 | }).catch(err=>{ 83 | ctx.body = {'status':false,'data':'下单失败'}; 84 | }); 85 | }) 86 | .get('/rating',async(ctx)=>{ 87 | let rating = JSON.parse(ctx.query.rating); 88 | await api.userSubmitRating(rating) 89 | .then(res=>{ 90 | ; 91 | }).catch(err=>{ 92 | ctx.body = {'status':false,'data':'评价失败'}; 93 | }); 94 | await api.userRatedOrder(rating.orderId) 95 | .then(res=>{ 96 | ctx.body = {'status':true,'data':'评价成功'}; 97 | }).catch(err=>{ 98 | ctx.body = {'status':false,'data':'评价失败'}; 99 | }); 100 | }) 101 | 102 | 103 | module.exports = router; -------------------------------------------------------------------------------- /src/components/pages/admin/component.less: -------------------------------------------------------------------------------- 1 | #admin { 2 | .admin-back { 3 | position: absolute; 4 | top: 20px; 5 | left: 20px; 6 | font-size: 20px; 7 | } 8 | .admin-quit { 9 | position: absolute; 10 | top: 20px; 11 | right: 20px; 12 | font-size: 14px; 13 | color: #00a0dc; 14 | } 15 | .admin-title { 16 | padding: 50px 0px; 17 | text-align: center; 18 | background-color: #f3f5f7; 19 | border-bottom: 1px solid #ccc; 20 | h1 { 21 | margin-bottom: 10px; 22 | } 23 | img { 24 | width: 50px; 25 | height: 50px; 26 | border-radius: 50%; 27 | } 28 | } 29 | .admin-infor { 30 | border-bottom: 1px solid #ccc; 31 | div { 32 | line-height: 40px; 33 | overflow: hidden; 34 | margin: 0px 18px; 35 | border-bottom: 1px solid #eee; 36 | span:first-of-type { 37 | font-size: 14px; 38 | float: left; 39 | } 40 | span:last-child { 41 | font-size: 12px; 42 | float: right; 43 | color: #93999f; 44 | } 45 | } 46 | div:last-child { 47 | border-bottom: none; 48 | } 49 | } 50 | .admin-order { 51 | padding: 50px 20px; 52 | span { 53 | text-align: center; 54 | border-radius: 10px; 55 | margin-right: 20px; 56 | padding: 10px 0px; 57 | display: inline-block; 58 | font-size: 14px; 59 | width: 95px; 60 | height: 48px; 61 | i { 62 | font-size: 24px; 63 | display: block; 64 | color: #f3f5f7; 65 | margin-bottom: 5px; 66 | } 67 | } 68 | span:last-child { 69 | margin-right: 0px; 70 | } 71 | span:hover { 72 | background: #00a9dc; 73 | } 74 | } 75 | .admin-order-content { 76 | ul { 77 | li { 78 | padding: 18px 0px; 79 | margin: 0px 18px; 80 | border-bottom: 1px solid #ccc; 81 | font-size: 14px; 82 | span { 83 | display: inline-block; 84 | } 85 | span:first-child { 86 | width: 180px; 87 | color: #93999f; 88 | font-size: 12px; 89 | } 90 | span:nth-of-type(2) { 91 | width: 50px; 92 | color: #f01414; 93 | } 94 | span:last-child { 95 | width: 100px; 96 | color: #00a0dc; 97 | text-align: center; 98 | } 99 | a { 100 | color: #00a0dc; 101 | } 102 | } 103 | } 104 | } 105 | } -------------------------------------------------------------------------------- /src/components/common/cart/component.less: -------------------------------------------------------------------------------- 1 | #cart { 2 | position: fixed; 3 | left: 0; 4 | bottom: 0; 5 | width: 100%; 6 | height: 48px; 7 | z-index: 50; 8 | .cart-bottom { 9 | position: relative; 10 | z-index: 2; 11 | height: 50px; 12 | line-height: 50px; 13 | background-color: #141d27; 14 | color: hsla(0, 0%, 100%, .4); 15 | .cart-left { 16 | float: left; 17 | width: 70%; 18 | i { 19 | font-size: 24px; 20 | margin: 0px 12px; 21 | } 22 | span { 23 | margin-right: 10px; 24 | } 25 | } 26 | .cart-right { 27 | float: right; 28 | width: 30%; 29 | background: #2b343c; 30 | text-align: center; 31 | font-size: 12px; 32 | font-weight: 700; 33 | a { 34 | color: #fff; 35 | } 36 | } 37 | } 38 | .cart-top { 39 | position: absolute; 40 | top: 0; 41 | left: 0; 42 | width: 100%; 43 | background: #fff; 44 | transform: translate3d(0, -100%, 0); 45 | z-index: 2; 46 | div { 47 | height: 40px; 48 | line-height: 40px; 49 | background: #f3f5f7; 50 | border-bottom: 1px solid rgba(7, 17, 27, .1); 51 | padding: 0px 18px; 52 | span:first-of-type { 53 | font-size: 14px; 54 | font-weight: 200; 55 | color: #07111b; 56 | } 57 | span:last-child { 58 | position: absolute; 59 | right: 8px; 60 | font-size: 12px; 61 | color: #00a0dc; 62 | padding: 0 10px; 63 | } 64 | } 65 | ul { 66 | background-color: #fff; 67 | li { 68 | height: 48px; 69 | line-height: 48px; 70 | margin: 0 18px; 71 | border-bottom: 1px solid rgba(7, 17, 27, .1); 72 | h3 { 73 | display: inline-block; 74 | font-size: 14px; 75 | width: 50%; 76 | } 77 | span:first-of-type { 78 | color: #f01414; 79 | display: inline-block; 80 | width: 30%; 81 | } 82 | span:last-child { 83 | font-size: 12px; 84 | color: #93999f; 85 | i { 86 | font-size: 12px; 87 | } 88 | } 89 | } 90 | li:last-child { 91 | border-bottom: none; 92 | } 93 | } 94 | } 95 | .cart-mask { 96 | position: fixed; 97 | top: 0; 98 | bottom: 0; 99 | left: 0; 100 | right: 0; 101 | background: rgba(7, 17, 27, .6); 102 | z-index: 1; 103 | } 104 | } -------------------------------------------------------------------------------- /src/components/common/topBar/component.less: -------------------------------------------------------------------------------- 1 | #topBar { 2 | .top-infor { 3 | height: 60px; 4 | position: relative; 5 | background: rgba(7, 17, 27, 0.7); 6 | padding: 30px 0px 20px 25px; 7 | color: #fff; 8 | .top-infor-img { 9 | float: left; 10 | margin-right: 15px; 11 | img { 12 | width: 64px; 13 | height: 64px; 14 | border-radius: 5px; 15 | } 16 | } 17 | .top-infor-text { 18 | float: left; 19 | h1 { 20 | font-size: 16px; 21 | } 22 | div { 23 | font-size: 10px; 24 | } 25 | span { 26 | font-size: 12px; 27 | display: block; 28 | margin: 10px 0px; 29 | } 30 | } 31 | .top-infor-more { 32 | height: 25px; 33 | width: 50px; 34 | position: absolute; 35 | top: 70px; 36 | left: 320px; 37 | background-color: rgba(0, 0, 0, 0.2); 38 | font-size: 12px; 39 | line-height: 25px; 40 | text-align: center; 41 | border-radius: 10px; 42 | } 43 | .top-infor-bg { 44 | position: absolute; 45 | top: 0; 46 | left: 0; 47 | width: 100%; 48 | height: 100%; 49 | z-index: -1; 50 | img { 51 | height: 100%; 52 | width: 100%; 53 | } 54 | } 55 | } 56 | .top-public { 57 | background-color: #333; 58 | padding: 8px; 59 | p { 60 | font-size: 12px; 61 | color: #fff; 62 | span { 63 | width: 320px; 64 | height: 14px; 65 | line-height: 14px; 66 | display: inline-block; 67 | overflow: hidden; 68 | text-overflow: ellipsis; 69 | white-space: nowrap; 70 | } 71 | } 72 | } 73 | .top-swiper { 74 | font-size: 14px; 75 | padding: 15px 50px; 76 | border-bottom: 1px solid #ccc; 77 | span { 78 | margin-right: 80px; 79 | } 80 | span:last-child { 81 | margin-right: 0px; 82 | } 83 | } 84 | .top-mask { 85 | color: #fff; 86 | background-color: #000; 87 | opacity: 0.8; 88 | position: fixed; 89 | min-height: 700px; 90 | z-index: 3; 91 | top: 0px; 92 | padding-top: 65px; 93 | text-align: center; 94 | .el-rate { 95 | margin: 20px 0px; 96 | } 97 | ul { 98 | text-align: left; 99 | padding: 28px 48px; 100 | font-size: 12px; 101 | li { 102 | margin-top: 16px; 103 | i { 104 | margin-right: 2px; 105 | } 106 | } 107 | } 108 | p { 109 | padding: 28px 48px; 110 | letter-spacing: 2px; 111 | text-align: left; 112 | font-size: 12px; 113 | line-height: 24px; 114 | } 115 | } 116 | .top-admin { 117 | position: absolute; 118 | top: 10px; 119 | right: 10px; 120 | font-size: 12px; 121 | font-weight: 700; 122 | a { 123 | color: #00a0dc; 124 | } 125 | } 126 | } -------------------------------------------------------------------------------- /static/reset.css: -------------------------------------------------------------------------------- 1 | /* 清除默认样式 */ 2 | html, body, div, span, object, iframe, 3 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 4 | abbr, address, cite, code, 5 | del, dfn, em, img, ins, kbd, q, samp, 6 | small, strong, sub, sup, var, 7 | b, i, 8 | dl, dt, dd, ol, ul, li, 9 | fieldset, form, label, legend, 10 | table, caption, tbody, tfoot, thead, tr, th, td, 11 | article, aside, canvas, details, figcaption, figure, 12 | footer, header, hgroup, menu, nav, section, summary, 13 | time, mark, audio, video { 14 | margin:0; 15 | padding:0; 16 | border:0; 17 | outline:0; 18 | font-size:100%; 19 | vertical-align:baseline; 20 | background:transparent; 21 | } 22 | 23 | body { 24 | line-height:1; 25 | } 26 | 27 | :focus { 28 | outline: 1; 29 | } 30 | 31 | article,aside,canvas,details,figcaption,figure, 32 | footer,header,hgroup,menu,nav,section,summary { 33 | display:block; 34 | } 35 | 36 | ul { 37 | list-style:none; 38 | } 39 | 40 | blockquote, q { 41 | quotes:none; 42 | } 43 | 44 | blockquote:before, blockquote:after, 45 | q:before, q:after { 46 | content:''; 47 | content:none; 48 | } 49 | 50 | a { 51 | margin:0; 52 | padding:0; 53 | border:0; 54 | font-size:100%; 55 | vertical-align:baseline; 56 | background:transparent; 57 | text-decoration: none; 58 | color: #333; 59 | } 60 | a:focus { 61 | color: #ff0000; 62 | } 63 | 64 | ins { 65 | background-color:#ff9; 66 | color:#000; 67 | text-decoration:none; 68 | } 69 | 70 | mark { 71 | background-color:#ff9; 72 | color:#000; 73 | font-style:italic; 74 | font-weight:bold; 75 | } 76 | 77 | del { 78 | text-decoration: line-through; 79 | } 80 | 81 | abbr[title], dfn[title] { 82 | border-bottom:1px dotted #000; 83 | cursor:help; 84 | } 85 | 86 | table { 87 | border-collapse:collapse; 88 | border-spacing:0; 89 | } 90 | 91 | hr { 92 | display:block; 93 | height:1px; 94 | border:0; 95 | border-top:1px solid #cccccc; 96 | margin:1em 0; 97 | padding:0; 98 | } 99 | 100 | input, select { 101 | vertical-align:middle; 102 | } 103 | 104 | /* 自定义样式 */ 105 | 106 | .block { 107 | height: 18px; 108 | background-color: #f3f5f7; 109 | border-top: 1px solid #ccc; 110 | border-bottom: 1px solid #ccc; 111 | } 112 | 113 | .good { 114 | background-color: rgba(0, 160, 220, .2); 115 | color: #4d555f; 116 | } 117 | .bad { 118 | background-color: rgba(77, 85, 93, .2); 119 | color: #4d555f; 120 | } 121 | 122 | .order { 123 | background-color: #aaa; 124 | color: #f3f5f7; 125 | } 126 | 127 | .goodActive { 128 | color: #fff; 129 | background-color: #00a9dc; 130 | } 131 | 132 | .badActive { 133 | color: #fff; 134 | background-color: #4d555d; 135 | } 136 | 137 | /* icon样式 */ 138 | .el-icon-arrow-left,.icon-jia,.icon-jian { 139 | color: #00a0dc; 140 | } 141 | .icon-jia:active, .icon-jian:active { 142 | color: #ff0000; 143 | } 144 | 145 | /* 动画效果 */ 146 | .drop-enter-active { 147 | transition: all .5s ease; 148 | } 149 | .drop-leave-active { 150 | transition: all .3s ease; 151 | } 152 | .drop-enter { 153 | transform: translateY(500px); 154 | } 155 | .drop-leave-active { 156 | transform: translateY(500px); 157 | } 158 | -------------------------------------------------------------------------------- /src/components/pages/account/component.less: -------------------------------------------------------------------------------- 1 | #account { 2 | .account-back { 3 | position: absolute; 4 | top: 20px; 5 | left: 20px; 6 | font-size: 20px; 7 | } 8 | .account-address { 9 | padding: 20px 0px; 10 | text-align: center; 11 | div { 12 | margin-bottom: 5px; 13 | font-size: 14px; 14 | font-weight: 200; 15 | } 16 | span { 17 | font-size: 12px; 18 | color: #00a0dc; 19 | } 20 | } 21 | .account-food { 22 | .account-food-shop { 23 | padding: 10px; 24 | overflow: hidden; 25 | div { 26 | float: left; 27 | margin-right: 5px; 28 | img { 29 | width: 24px; 30 | height: 24px; 31 | border-radius: 50%; 32 | } 33 | } 34 | span { 35 | float: left; 36 | font-size: 14px; 37 | line-height: 24px; 38 | } 39 | } 40 | ul { 41 | border-top: 1px solid #ccc; 42 | padding: 10px; 43 | li { 44 | overflow: hidden; 45 | line-height: 50px; 46 | border-bottom: 1px solid #ccc; 47 | font-size: 14px; 48 | img { 49 | float: left; 50 | width: 50px; 51 | height: 50px; 52 | margin-right: 10px; 53 | } 54 | span:nth-of-type(1) { 55 | float: left; 56 | width: 40%; 57 | font-weight: 300; 58 | font-size: 12px; 59 | } 60 | span:nth-of-type(2) { 61 | float: left; 62 | color: #00a0dc; 63 | } 64 | span:nth-of-type(3) { 65 | float: right; 66 | color: #f01414; 67 | } 68 | } 69 | li:last-child { 70 | border-bottom: none; 71 | } 72 | } 73 | } 74 | .account-content { 75 | div { 76 | line-height: 40px; 77 | overflow: hidden; 78 | margin: 0px 18px; 79 | border-bottom: 1px solid #ccc; 80 | span:first-of-type { 81 | font-size: 14px; 82 | float: left; 83 | } 84 | span:last-child { 85 | font-size: 12px; 86 | float: right; 87 | color: #93999f; 88 | } 89 | } 90 | } 91 | .account-pay { 92 | position: fixed; 93 | width: 100%; 94 | bottom: 0px; 95 | left: 0px; 96 | font-size: 14px; 97 | line-height: 48px; 98 | span:first-of-type { 99 | float: left; 100 | padding-left: 5%; 101 | width: 65%; 102 | background-color: #000; 103 | color: #fff; 104 | } 105 | span:last-child { 106 | text-align: center; 107 | font-weight: 600; 108 | float: right; 109 | width: 30%; 110 | background-color: #e6a23c; 111 | } 112 | } 113 | } -------------------------------------------------------------------------------- /server/api/index.js: -------------------------------------------------------------------------------- 1 | const query = require('../db'); 2 | 3 | 4 | let status = { 5 | userId: 0, //当前登录用户ID 6 | sellerId: 0, //当前访问的商家ID 7 | } 8 | 9 | 10 | module.exports = { 11 | /***********用户API*****************/ 12 | //用户登录校验 13 | userLogin: function (username) { 14 | return query(`SELECT * FROM user WHERE username = '${username}'`); 15 | }, 16 | //用户ID全局化 17 | initUserId: function (userId) { 18 | status.userId = userId; 19 | }, 20 | //获取用户基本信息 21 | getUserInfo: function () { 22 | return query(`SELECT * FROM userinfos WHERE userId = ${status.userId}`); 23 | }, 24 | //获取用户订单信息 25 | getUserOrders: function (type) { 26 | let sql; 27 | if (type === '0') { 28 | sql = `SELECT * FROM orders WHERE userId = ${status.userId} ORDER BY orderTime DESC`; 29 | } 30 | else { 31 | sql = `SELECT * FROM orders WHERE orderType = ${type} AND userId = ${status.userId} ORDER BY orderTime DESC`; 32 | } 33 | return query(sql); 34 | }, 35 | //扣除用户余额 36 | userAccountSub: function (account) { 37 | return query(`UPDATE userinfos SET account = ${account} WHERE userId = ${status.userId}`); 38 | }, 39 | //用户确认收货 40 | userConfirmOrder: function (orderId) { 41 | return query(`UPDATE orders SET orderType = 2 WHERE orderId = ${orderId}`); 42 | }, 43 | //用户完成评价 44 | userRatedOrder: function (orderId) { 45 | return query(`UPDATE orders SET orderType = 3 WHERE orderId = ${orderId}`); 46 | }, 47 | //用户下单 48 | userSubmitOrder: function (order) { 49 | return query(`INSERT INTO orders(userId,sellerId,orderTime,price,orderType) VALUES(${status.userId},${status.sellerId},${order.orderTime},${order.price},1);`); 50 | }, 51 | //用户评价 52 | userSubmitRating: function (rating) { 53 | 54 | return query(`INSERT INTO sellerratings (userId,sellerId,orderId,rateTime,deliveryTime,score,rateType,TEXT) VALUES(${status.userId},${status.sellerId},${rating.orderId},${rating.rateTime},${rating.deliveryTime},${rating.score},${rating.rateType},'${rating.text}');`); 55 | }, 56 | /***********商品API*****************/ 57 | //获取全部商品类型 58 | getGoodTypes: function () { 59 | return query(`SELECT * FROM foodtype`); 60 | }, 61 | //获取某一类型的全部商品 62 | getGoodsByType: function (goodType) { 63 | return query(`SELECT * FROM food WHERE fTypeId = ${goodType}`); 64 | }, 65 | //获取指定Id的某一商品 66 | getGoodByGoodId: function (goodId) { 67 | return query(`SELECT * FROM food WHERE foodId = ${goodId}`); 68 | }, 69 | /***********商家API*****************/ 70 | //商家ID全局化 71 | initSellerId: function (sellerId) { 72 | status.sellerId = sellerId; 73 | }, 74 | //获取商家基本信息 75 | getSellerInfo: function () { 76 | return query(`SELECT * FROM seller`); 77 | }, 78 | //获取商家优惠信息 79 | getSellerSupports: function () { 80 | return query(`SELECT * FROM sellersupports WHERE sellerId = ${status.sellerId}`); 81 | }, 82 | //获取商家实景信息 83 | getSellerPics: function () { 84 | return query(`SELECT * FROM sellerpics WHERE sellerId = ${status.sellerId}`); 85 | }, 86 | //获取商家介绍信息 87 | getSellerInfos: function () { 88 | return query(`SELECT * FROM sellerinfos WHERE sellerId = ${status.sellerId}`); 89 | }, 90 | //获取商家评价信息 91 | getSellerRatings: function (type) { 92 | let sql; 93 | if (type === '0') { 94 | sql = `SELECT * FROM sellerratings WHERE sellerId = ${status.sellerId} ORDER BY rateTime DESC`; 95 | } 96 | else { 97 | sql = `SELECT * FROM sellerratings WHERE rateType = ${type} AND sellerId = ${status.sellerId} ORDER BY rateTime DESC`; 98 | } 99 | return query(sql); 100 | }, 101 | }; 102 | 103 | 104 | -------------------------------------------------------------------------------- /elm.sql: -------------------------------------------------------------------------------- 1 | /* 2 | SQLyog Ultimate v11.24 (32 bit) 3 | MySQL - 5.7.12-log : Database - elm 4 | ********************************************************************* 5 | */ 6 | 7 | /*!40101 SET NAMES utf8 */; 8 | 9 | /*!40101 SET SQL_MODE=''*/; 10 | 11 | /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; 12 | /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; 13 | /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; 14 | /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; 15 | CREATE DATABASE /*!32312 IF NOT EXISTS*/`elm` /*!40100 DEFAULT CHARACTER SET utf8 */; 16 | 17 | USE `elm`; 18 | 19 | /*Table structure for table `food` */ 20 | 21 | DROP TABLE IF EXISTS `food`; 22 | 23 | CREATE TABLE `food` ( 24 | `foodId` int(11) NOT NULL AUTO_INCREMENT, 25 | `name` varchar(32) NOT NULL, 26 | `price` int(11) NOT NULL, 27 | `description` varchar(32) NOT NULL, 28 | `sellCount` int(11) NOT NULL DEFAULT '100', 29 | `rating` int(11) NOT NULL DEFAULT '90', 30 | `info` varchar(128) NOT NULL, 31 | `icon` varchar(256) NOT NULL, 32 | `image` varchar(256) NOT NULL, 33 | `fTypeId` int(11) NOT NULL, 34 | PRIMARY KEY (`foodId`), 35 | KEY `fTypeId` (`fTypeId`), 36 | CONSTRAINT `fTypeId` FOREIGN KEY (`fTypeId`) REFERENCES `foodtype` (`fTypeId`) 37 | ) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8; 38 | 39 | /*Data for the table `food` */ 40 | 41 | insert into `food`(`foodId`,`name`,`price`,`description`,`sellCount`,`rating`,`info`,`icon`,`image`,`fTypeId`) values (1,'皮蛋瘦肉粥',10,'咸粥',229,100,'一碗皮蛋瘦肉粥,总是我到粥店时的不二之选。香浓软滑,饱腹暖心,皮蛋的Q弹与瘦肉的滑嫩伴着粥香溢于满口,让人喝这样的一碗粥也觉得心满意足','http://fuss10.elemecdn.com/c/cd/c12745ed8a5171e13b427dbc39401jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/c/cd/c12745ed8a5171e13b427dbc39401jpeg.jpeg?imageView2/1/w/750/h/750',1),(2,'扁豆焖面',14,'',188,96,'','http://fuss10.elemecdn.com/c/6b/29e3d29b0db63d36f7c500bca31d8jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/c/6b/29e3d29b0db63d36f7c500bca31d8jpeg.jpeg?imageView2/1/w/750/h/750',1),(3,'葱花饼',10,'',124,85,'','http://fuss10.elemecdn.com/f/28/a51e7b18751bcdf871648a23fd3b4jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/f/28/a51e7b18751bcdf871648a23fd3b4jpeg.jpeg?imageView2/1/w/750/h/750',1),(4,'牛肉馅饼',14,'',114,91,'','http://fuss10.elemecdn.com/d/b9/bcab0e8ad97758e65ae5a62b2664ejpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/d/b9/bcab0e8ad97758e65ae5a62b2664ejpeg.jpeg?imageView2/1/w/750/h/750',1),(5,'招牌猪肉白菜锅贴/10个',17,'',101,78,'','http://fuss10.elemecdn.com/7/72/9a580c1462ca1e4d3c07e112bc035jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/7/72/9a580c1462ca1e4d3c07e112bc035jpeg.jpeg?imageView2/1/w/750/h/750',1),(6,'南瓜粥',9,'甜粥',91,100,'','http://fuss10.elemecdn.com/8/a6/453f65f16b1391942af11511b7a90jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/8/a6/453f65f16b1391942af11511b7a90jpeg.jpeg?imageView2/1/w/750/h/750',1),(7,'红豆薏米美肤粥',12,'甜粥',86,100,'','http://fuss10.elemecdn.com/d/22/260bd78ee6ac6051136c5447fe307jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/d/22/260bd78ee6ac6051136c5447fe307jpeg.jpeg?imageView2/1/w/750/h/750',1),(8,'八宝酱菜',4,'',84,100,'','http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/750/h/750',1),(9,'红枣山药糙米粥',10,'',81,91,'','http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/750/h/750',1),(10,'糊塌子',10,'',80,93,' ','http://fuss10.elemecdn.com/0/05/097a2a59fd2a2292d08067e16380cjpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/0/05/097a2a59fd2a2292d08067e16380cjpeg.jpeg?imageView2/1/w/750/h/750',1),(11,'红枣山药粥套餐',29,'',17,93,' ','http://fuss10.elemecdn.com/6/72/cb844f0bb60c502c6d5c05e0bddf5jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/6/72/cb844f0bb60c502c6d5c05e0bddf5jpeg.jpeg?imageView2/1/w/750/h/750',2),(12,'VC无限橙果汁',8,'',15,100,' ','http://fuss10.elemecdn.com/e/c6/f348e811772016ae24e968238bcbfjpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/e/c6/f348e811772016ae24e968238bcbfjpeg.jpeg?imageView2/1/w/750/h/750',3),(13,'娃娃菜炖豆腐',17,'',43,92,' ','http://fuss10.elemecdn.com/d/2d/b1eb45b305635d9dd04ddf157165fjpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/d/2d/b1eb45b305635d9dd04ddf157165fjpeg.jpeg?imageView2/1/w/750/h/750',4),(14,'手撕包菜',16,'',29,100,' ','http://fuss10.elemecdn.com/9/c6/f3bc84468820121112e79583c24efjpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/9/c6/f3bc84468820121112e79583c24efjpeg.jpeg?imageView2/1/w/750/h/750',4),(15,'香酥黄金鱼/3条',11,'',15,100,' ','http://fuss10.elemecdn.com/4/e7/8277a6a2ea0a2e97710290499fc41jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/4/e7/8277a6a2ea0a2e97710290499fc41jpeg.jpeg?imageView2/1/w/750/h/750',4),(16,'八宝酱菜',4,'',84,100,' ','http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/750/h/750',5),(17,'拍黄瓜',9,'',28,100,' ','http://fuss10.elemecdn.com/6/54/f654985b4e185f06eb07f8fa2b2e8jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/6/54/f654985b4e185f06eb07f8fa2b2e8jpeg.jpeg?imageView2/1/w/750/h/750',5),(18,'红豆薏米粥套餐',37,'',3,100,' ','http://fuss10.elemecdn.com/f/49/27f26ed00c025b2200a9ccbb7e67ejpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/f/49/27f26ed00c025b2200a9ccbb7e67ejpeg.jpeg?imageView2/1/w/750/h/750',6),(19,'皮蛋瘦肉粥套餐',31,'',12,100,' ','http://fuss10.elemecdn.com/8/96/f444a8087f0e940ef264617f9d98ajpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/8/96/f444a8087f0e940ef264617f9d98ajpeg.jpeg?imageView2/1/w/750/h/750',6),(20,'蜜瓜圣女萝莉杯',6,'',1,100,' ','http://fuss10.elemecdn.com/b/5f/b3b04c259d5ec9fa52e1856ee50dajpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/b/5f/b3b04c259d5ec9fa52e1856ee50dajpeg.jpeg?imageView2/1/w/750/h/750',7),(21,'加多宝',6,'',7,100,' ','http://fuss10.elemecdn.com/b/9f/5e6c99c593cf65229225c5661bcdejpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/b/9f/5e6c99c593cf65229225c5661bcdejpeg.jpeg?imageView2/1/w/750/h/750',7),(22,'VC无限橙果汁',8,'',15,100,' ','http://fuss10.elemecdn.com/e/c6/f348e811772016ae24e968238bcbfjpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/e/c6/f348e811772016ae24e968238bcbfjpeg.jpeg?imageView2/1/w/750/h/750',7),(23,'扁豆焖面',14,'',188,96,' ','http://fuss10.elemecdn.com/c/6b/29e3d29b0db63d36f7c500bca31d8jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/c/6b/29e3d29b0db63d36f7c500bca31d8jpeg.jpeg?imageView2/1/w/750/h/750',8),(24,'葱花饼',8,'',15,100,' ','http://fuss10.elemecdn.com/f/28/a51e7b18751bcdf871648a23fd3b4jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/f/28/a51e7b18751bcdf871648a23fd3b4jpeg.jpeg?imageView2/1/w/750/h/750',8),(25,'牛肉馅饼',14,'',114,91,' ','http://fuss10.elemecdn.com/d/b9/bcab0e8ad97758e65ae5a62b2664ejpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/d/b9/bcab0e8ad97758e65ae5a62b2664ejpeg.jpeg?imageView2/1/w/750/h/750',8),(26,'招牌猪肉白菜锅贴/10个',17,'',101,78,' ','http://fuss10.elemecdn.com/7/72/9a580c1462ca1e4d3c07e112bc035jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/7/72/9a580c1462ca1e4d3c07e112bc035jpeg.jpeg?imageView2/1/w/750/h/750',8),(27,'糊塌子',10,'',80,93,' ','http://fuss10.elemecdn.com/0/05/097a2a59fd2a2292d08067e16380cjpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/0/05/097a2a59fd2a2292d08067e16380cjpeg.jpeg?imageView2/1/w/750/h/750',8),(28,'皮蛋瘦肉粥',10,'',229,100,' ','http://fuss10.elemecdn.com/c/cd/c12745ed8a5171e13b427dbc39401jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/c/cd/c12745ed8a5171e13b427dbc39401jpeg.jpeg?imageView2/1/w/750/h/750',9),(29,'南瓜粥',9,'',91,100,' ','http://fuss10.elemecdn.com/8/a6/453f65f16b1391942af11511b7a90jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/8/a6/453f65f16b1391942af11511b7a90jpeg.jpeg?imageView2/1/w/750/h/750',9),(30,'红豆薏米美肤粥',12,'',86,100,' ','http://fuss10.elemecdn.com/d/22/260bd78ee6ac6051136c5447fe307jpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/d/22/260bd78ee6ac6051136c5447fe307jpeg.jpeg?imageView2/1/w/750/h/750',9),(31,'红枣山药糙米粥',10,'',81,100,' ','http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/750/h/750',9),(32,'鲜蔬菌菇粥',11,'',65,100,' ','http://fuss10.elemecdn.com/e/a3/5317c68dd618929b6ac05804e429ajpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/e/a3/5317c68dd618929b6ac05804e429ajpeg.jpeg?imageView2/1/w/750/h/750',9),(33,'田园蔬菜粥',10,'',78,100,' ','http://fuss10.elemecdn.com/a/94/7371083792c19df00e546b29e344cjpeg.jpeg?imageView2/1/w/114/h/114','http://fuss10.elemecdn.com/a/94/7371083792c19df00e546b29e344cjpeg.jpeg?imageView2/1/w/750/h/750',9); 42 | 43 | /*Table structure for table `foodrating` */ 44 | 45 | DROP TABLE IF EXISTS `foodrating`; 46 | 47 | CREATE TABLE `foodrating` ( 48 | `fRateId` int(11) NOT NULL AUTO_INCREMENT, 49 | `foodId` int(11) NOT NULL, 50 | `username` varchar(32) NOT NULL, 51 | `rateTime` varchar(128) NOT NULL, 52 | `rateType` int(11) NOT NULL, 53 | `text` varchar(128) DEFAULT NULL, 54 | `avatar` varchar(128) NOT NULL, 55 | PRIMARY KEY (`fRateId`), 56 | KEY `foodId` (`foodId`), 57 | CONSTRAINT `foodId` FOREIGN KEY (`foodId`) REFERENCES `food` (`foodId`) 58 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 59 | 60 | /*Data for the table `foodrating` */ 61 | 62 | /*Table structure for table `foodtype` */ 63 | 64 | DROP TABLE IF EXISTS `foodtype`; 65 | 66 | CREATE TABLE `foodtype` ( 67 | `fTypeId` int(11) NOT NULL AUTO_INCREMENT, 68 | `name` varchar(32) NOT NULL, 69 | PRIMARY KEY (`fTypeId`) 70 | ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8; 71 | 72 | /*Data for the table `foodtype` */ 73 | 74 | insert into `foodtype`(`fTypeId`,`name`) values (1,'热销榜'),(2,'单人精彩套餐'),(3,'冰爽饮品限时特惠'),(4,'精选热菜'),(5,'爽口凉菜'),(6,'精选套餐'),(7,'果拼果汁'),(8,'小吃主食'),(9,'特色粥品'); 75 | 76 | /*Table structure for table `orders` */ 77 | 78 | DROP TABLE IF EXISTS `orders`; 79 | 80 | CREATE TABLE `orders` ( 81 | `orderId` int(11) NOT NULL AUTO_INCREMENT, 82 | `userId` int(11) NOT NULL, 83 | `sellerId` int(11) NOT NULL, 84 | `orderTime` varchar(128) NOT NULL, 85 | `price` int(11) NOT NULL, 86 | `orderType` int(11) NOT NULL, 87 | PRIMARY KEY (`orderId`) 88 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 89 | 90 | /*Data for the table `orders` */ 91 | 92 | /*Table structure for table `seller` */ 93 | 94 | DROP TABLE IF EXISTS `seller`; 95 | 96 | CREATE TABLE `seller` ( 97 | `sellerId` int(11) NOT NULL, 98 | `name` varchar(128) NOT NULL, 99 | `description` varchar(128) NOT NULL, 100 | `deliveryTime` int(11) NOT NULL, 101 | `score` float NOT NULL, 102 | `serviceScore` float NOT NULL, 103 | `foodScore` float NOT NULL, 104 | `rankRate` float NOT NULL, 105 | `minPrice` int(11) NOT NULL, 106 | `deliveryPrice` int(11) NOT NULL, 107 | `ratingCount` int(11) NOT NULL, 108 | `sellCount` int(11) NOT NULL, 109 | `bulletin` varchar(256) NOT NULL, 110 | `avatar` varchar(256) NOT NULL, 111 | PRIMARY KEY (`sellerId`) 112 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 113 | 114 | /*Data for the table `seller` */ 115 | 116 | insert into `seller`(`sellerId`,`name`,`description`,`deliveryTime`,`score`,`serviceScore`,`foodScore`,`rankRate`,`minPrice`,`deliveryPrice`,`ratingCount`,`sellCount`,`bulletin`,`avatar`) values (1,'粥品香坊(回龙观)','蜂鸟专送',38,4.2,4.1,4.3,69.2,20,4,24,90,'粥品香坊其烹饪粥料的秘方源于中国千年古法,在融和现代制作工艺,由世界烹饪大师屈浩先生领衔研发。坚守纯天然、0添加的良心品质深得消费者青睐,发展至今成为粥类的引领品牌。是2008年奥运会和2013年园博会指定餐饮服务商。','http://static.galileo.xiaojukeji.com/static/tms/seller_avatar_256px.jpg'); 117 | 118 | /*Table structure for table `sellerinfos` */ 119 | 120 | DROP TABLE IF EXISTS `sellerinfos`; 121 | 122 | CREATE TABLE `sellerinfos` ( 123 | `sInfoId` int(11) NOT NULL AUTO_INCREMENT, 124 | `sellerId` int(11) NOT NULL, 125 | `info` varchar(128) NOT NULL, 126 | PRIMARY KEY (`sInfoId`) 127 | ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; 128 | 129 | /*Data for the table `sellerinfos` */ 130 | 131 | insert into `sellerinfos`(`sInfoId`,`sellerId`,`info`) values (1,1,'该商家支持发票,请下单写好发票抬头'),(2,1,'品类:其他菜系,包子粥店'),(3,1,'北京市昌平区回龙观西大街龙观置业大厦底商B座102单元1340'),(4,1,'营业时间:10:00-20:30'); 132 | 133 | /*Table structure for table `sellerpics` */ 134 | 135 | DROP TABLE IF EXISTS `sellerpics`; 136 | 137 | CREATE TABLE `sellerpics` ( 138 | `sPicsId` int(11) NOT NULL AUTO_INCREMENT, 139 | `sellerId` int(11) NOT NULL, 140 | `picSrc` varchar(256) NOT NULL, 141 | PRIMARY KEY (`sPicsId`), 142 | KEY `sellerId` (`sellerId`), 143 | CONSTRAINT `sellerId` FOREIGN KEY (`sellerId`) REFERENCES `seller` (`sellerId`) 144 | ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; 145 | 146 | /*Data for the table `sellerpics` */ 147 | 148 | insert into `sellerpics`(`sPicsId`,`sellerId`,`picSrc`) values (1,1,'http://fuss10.elemecdn.com/8/71/c5cf5715740998d5040dda6e66abfjpeg.jpeg?imageView2/1/w/180/h/180'),(2,1,'http://fuss10.elemecdn.com/b/6c/75bd250e5ba69868f3b1178afbda3jpeg.jpeg?imageView2/1/w/180/h/180'),(3,1,'http://fuss10.elemecdn.com/f/96/3d608c5811bc2d902fc9ab9a5baa7jpeg.jpeg?imageView2/1/w/180/h/180'),(4,1,'http://fuss10.elemecdn.com/6/ad/779f8620ff49f701cd4c58f6448b6jpeg.jpeg?imageView2/1/w/180/h/180'); 149 | 150 | /*Table structure for table `sellerratings` */ 151 | 152 | DROP TABLE IF EXISTS `sellerratings`; 153 | 154 | CREATE TABLE `sellerratings` ( 155 | `sRateId` int(11) NOT NULL AUTO_INCREMENT, 156 | `userId` int(11) NOT NULL, 157 | `sellerId` int(11) NOT NULL, 158 | `orderId` int(11) NOT NULL, 159 | `rateTime` varchar(128) NOT NULL, 160 | `deliveryTime` int(11) NOT NULL, 161 | `score` float NOT NULL, 162 | `rateType` int(11) NOT NULL, 163 | `text` varchar(256) NOT NULL, 164 | PRIMARY KEY (`sRateId`) 165 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 166 | 167 | /*Data for the table `sellerratings` */ 168 | 169 | /*Table structure for table `sellersupports` */ 170 | 171 | DROP TABLE IF EXISTS `sellersupports`; 172 | 173 | CREATE TABLE `sellersupports` ( 174 | `sSupportId` int(11) NOT NULL AUTO_INCREMENT, 175 | `description` varchar(128) NOT NULL, 176 | `sellerId` int(11) NOT NULL, 177 | PRIMARY KEY (`sSupportId`) 178 | ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 179 | 180 | /*Data for the table `sellersupports` */ 181 | 182 | insert into `sellersupports`(`sSupportId`,`description`,`sellerId`) values (1,'在线支付满28减5',1),(2,'VC无限橙果汁全场8折',1),(3,'单人精彩套餐',1),(4,'该商家支持发票,请下单写好发票抬头',1),(5,'已加入“外卖保”计划,食品安全保障',1); 183 | 184 | /*Table structure for table `user` */ 185 | 186 | DROP TABLE IF EXISTS `user`; 187 | 188 | CREATE TABLE `user` ( 189 | `userId` int(11) NOT NULL AUTO_INCREMENT, 190 | `username` varchar(32) NOT NULL, 191 | `password` varchar(32) NOT NULL, 192 | PRIMARY KEY (`userId`) 193 | ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 194 | 195 | /*Data for the table `user` */ 196 | 197 | insert into `user`(`userId`,`username`,`password`) values (1,'admin','1111'); 198 | 199 | /*Table structure for table `userinfos` */ 200 | 201 | DROP TABLE IF EXISTS `userinfos`; 202 | 203 | CREATE TABLE `userinfos` ( 204 | `uInfoId` int(11) NOT NULL AUTO_INCREMENT, 205 | `address` varchar(128) NOT NULL, 206 | `account` int(11) NOT NULL, 207 | `headSrc` varchar(128) DEFAULT NULL, 208 | `nick` varchar(32) DEFAULT NULL, 209 | `userId` int(11) NOT NULL, 210 | `phone` varchar(32) DEFAULT NULL, 211 | PRIMARY KEY (`uInfoId`), 212 | KEY `userId` (`userId`), 213 | CONSTRAINT `userId` FOREIGN KEY (`userId`) REFERENCES `user` (`userId`) 214 | ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 215 | 216 | /*Data for the table `userinfos` */ 217 | 218 | insert into `userinfos`(`uInfoId`,`address`,`account`,`headSrc`,`nick`,`userId`,`phone`) values (1,'南昌大学学生公寓6#666',1000,'https://pic1.zhimg.com/v2-ba9690274a886065a1d481d8f090da61_xl.jpg','帕尼尼',1,'13578889999'); 219 | 220 | /*!40101 SET SQL_MODE=@OLD_SQL_MODE */; 221 | /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; 222 | /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; 223 | /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; 224 | -------------------------------------------------------------------------------- /static/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "seller": { 3 | "name": "粥品香坊(回龙观)", 4 | "description": "蜂鸟专送", 5 | "deliveryTime": 38, 6 | "score": 4.2, 7 | "serviceScore": 4.1, 8 | "foodScore": 4.3, 9 | "rankRate": 69.2, 10 | "minPrice": 20, 11 | "deliveryPrice": 4, 12 | "ratingCount": 24, 13 | "sellCount": 90, 14 | "supportFirst":"在线支付满28减5", 15 | "supportsCount":5, 16 | "bulletin": "粥品香坊其烹饪粥料的秘方源于中国千年古法,在融和现代制作工艺,由世界烹饪大师屈浩先生领衔研发。坚守纯天然、0添加的良心品质深得消费者青睐,发展至今成为粥类的引领品牌。是2008年奥运会和2013年园博会指定餐饮服务商。", 17 | "supports": [ 18 | { 19 | "type": 0, 20 | "description": "在线支付满28减5" 21 | }, 22 | { 23 | "type": 1, 24 | "description": "VC无限橙果汁全场8折" 25 | }, 26 | { 27 | "type": 2, 28 | "description": "单人精彩套餐" 29 | }, 30 | { 31 | "type": 3, 32 | "description": "该商家支持发票,请下单写好发票抬头" 33 | }, 34 | { 35 | "type": 4, 36 | "description": "已加入“外卖保”计划,食品安全保障" 37 | } 38 | ], 39 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/seller_avatar_256px.jpg", 40 | "pics": [ 41 | "http://fuss10.elemecdn.com/8/71/c5cf5715740998d5040dda6e66abfjpeg.jpeg?imageView2/1/w/180/h/180", 42 | "http://fuss10.elemecdn.com/b/6c/75bd250e5ba69868f3b1178afbda3jpeg.jpeg?imageView2/1/w/180/h/180", 43 | "http://fuss10.elemecdn.com/f/96/3d608c5811bc2d902fc9ab9a5baa7jpeg.jpeg?imageView2/1/w/180/h/180", 44 | "http://fuss10.elemecdn.com/6/ad/779f8620ff49f701cd4c58f6448b6jpeg.jpeg?imageView2/1/w/180/h/180" 45 | ], 46 | "infos": [ 47 | "该商家支持发票,请下单写好发票抬头", 48 | "品类:其他菜系,包子粥店", 49 | "北京市昌平区回龙观西大街龙观置业大厦底商B座102单元1340", 50 | "营业时间:10:00-20:30" 51 | ] 52 | }, 53 | "goods": [ 54 | { 55 | "name": "热销榜", 56 | "type": -1, 57 | "foods": [ 58 | { 59 | "foodId": 10, 60 | "name": "皮蛋瘦肉粥", 61 | "price": 10, 62 | "oldPrice": "", 63 | "description": "咸粥", 64 | "sellCount": 229, 65 | "rating": 100, 66 | "info": "一碗皮蛋瘦肉粥,总是我到粥店时的不二之选。香浓软滑,饱腹暖心,皮蛋的Q弹与瘦肉的滑嫩伴着粥香溢于满口,让人喝这样的一碗粥也觉得心满意足", 67 | "ratings": [ 68 | { 69 | "username": "3******c", 70 | "rateTime": 1469281964000, 71 | "rateType": 0, 72 | "text": "很喜欢的粥", 73 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 74 | }, 75 | { 76 | "username": "2******3", 77 | "rateTime": 1469271264000, 78 | "rateType": 0, 79 | "text": "", 80 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 81 | }, 82 | { 83 | "username": "3******b", 84 | "rateTime": 1469261964000, 85 | "rateType": 1, 86 | "text": "", 87 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 88 | } 89 | ], 90 | "icon": "http://fuss10.elemecdn.com/c/cd/c12745ed8a5171e13b427dbc39401jpeg.jpeg?imageView2/1/w/114/h/114", 91 | "image": "http://fuss10.elemecdn.com/c/cd/c12745ed8a5171e13b427dbc39401jpeg.jpeg?imageView2/1/w/750/h/750" 92 | }, 93 | { 94 | "foodId": 11, 95 | "name": "扁豆焖面", 96 | "price": 14, 97 | "oldPrice": "", 98 | "description": "", 99 | "sellCount": 188, 100 | "rating": 96, 101 | "ratings": [ 102 | { 103 | "username": "3******c", 104 | "rateTime": 1469281964000, 105 | "rateType": 0, 106 | "text": "", 107 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 108 | }, 109 | { 110 | "username": "2******3", 111 | "rateTime": 1469271264000, 112 | "rateType": 0, 113 | "text": "", 114 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 115 | }, 116 | { 117 | "username": "3******b", 118 | "rateTime": 1469261964000, 119 | "rateType": 1, 120 | "text": "", 121 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 122 | } 123 | ], 124 | "info": "", 125 | "icon": "http://fuss10.elemecdn.com/c/6b/29e3d29b0db63d36f7c500bca31d8jpeg.jpeg?imageView2/1/w/114/h/114", 126 | "image": "http://fuss10.elemecdn.com/c/6b/29e3d29b0db63d36f7c500bca31d8jpeg.jpeg?imageView2/1/w/750/h/750" 127 | }, 128 | { 129 | "foodId": 12, 130 | "name": "葱花饼", 131 | "price": 10, 132 | "oldPrice": "", 133 | "description": "", 134 | "sellCount": 124, 135 | "rating": 85, 136 | "info": "", 137 | "ratings": [ 138 | { 139 | "username": "3******c", 140 | "rateTime": 1469281964000, 141 | "rateType": 1, 142 | "text": "没啥味道", 143 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 144 | }, 145 | { 146 | "username": "2******3", 147 | "rateTime": 1469271264000, 148 | "rateType": 1, 149 | "text": "很一般啊", 150 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 151 | }, 152 | { 153 | "username": "3******b", 154 | "rateTime": 1469261964000, 155 | "rateType": 0, 156 | "text": "", 157 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 158 | } 159 | ], 160 | "icon": "http://fuss10.elemecdn.com/f/28/a51e7b18751bcdf871648a23fd3b4jpeg.jpeg?imageView2/1/w/114/h/114", 161 | "image": "http://fuss10.elemecdn.com/f/28/a51e7b18751bcdf871648a23fd3b4jpeg.jpeg?imageView2/1/w/750/h/750" 162 | }, 163 | { 164 | "foodId": 13, 165 | "name": "牛肉馅饼", 166 | "price": 14, 167 | "oldPrice": "", 168 | "description": "", 169 | "sellCount": 114, 170 | "rating": 91, 171 | "info": "", 172 | "ratings": [ 173 | { 174 | "username": "3******c", 175 | "rateTime": 1469281964000, 176 | "rateType": 1, 177 | "text": "难吃不推荐", 178 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 179 | }, 180 | { 181 | "username": "2******3", 182 | "rateTime": 1469271264000, 183 | "rateType": 0, 184 | "text": "", 185 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 186 | }, 187 | { 188 | "username": "3******b", 189 | "rateTime": 1469261964000, 190 | "rateType": 0, 191 | "text": "", 192 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 193 | } 194 | ], 195 | "icon": "http://fuss10.elemecdn.com/d/b9/bcab0e8ad97758e65ae5a62b2664ejpeg.jpeg?imageView2/1/w/114/h/114", 196 | "image": "http://fuss10.elemecdn.com/d/b9/bcab0e8ad97758e65ae5a62b2664ejpeg.jpeg?imageView2/1/w/750/h/750" 197 | }, 198 | { 199 | "foodId": 14, 200 | "name": "招牌猪肉白菜锅贴/10个", 201 | "price": 17, 202 | "oldPrice": "", 203 | "description": "", 204 | "sellCount": 101, 205 | "rating": 78, 206 | "info": "", 207 | "ratings": [ 208 | { 209 | "username": "3******c", 210 | "rateTime": 1469281964000, 211 | "rateType": 1, 212 | "text": "不脆,不好吃", 213 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 214 | }, 215 | { 216 | "username": "2******3", 217 | "rateTime": 1469271264000, 218 | "rateType": 0, 219 | "text": "", 220 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 221 | }, 222 | { 223 | "username": "3******b", 224 | "rateTime": 1469261964000, 225 | "rateType": 0, 226 | "text": "", 227 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 228 | } 229 | ], 230 | "icon": "http://fuss10.elemecdn.com/7/72/9a580c1462ca1e4d3c07e112bc035jpeg.jpeg?imageView2/1/w/114/h/114", 231 | "image": "http://fuss10.elemecdn.com/7/72/9a580c1462ca1e4d3c07e112bc035jpeg.jpeg?imageView2/1/w/750/h/750" 232 | }, 233 | { 234 | "foodId": 15, 235 | "name": "南瓜粥", 236 | "price": 9, 237 | "oldPrice": "", 238 | "description": "甜粥", 239 | "sellCount": 91, 240 | "rating": 100, 241 | "ratings": [ 242 | { 243 | "username": "3******c", 244 | "rateTime": 1469281964000, 245 | "rateType": 0, 246 | "text": "", 247 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 248 | }, 249 | { 250 | "username": "2******3", 251 | "rateTime": 1469271264000, 252 | "rateType": 0, 253 | "text": "", 254 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 255 | }, 256 | { 257 | "username": "3******b", 258 | "rateTime": 1469261964000, 259 | "rateType": 0, 260 | "text": "", 261 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 262 | } 263 | ], 264 | "icon": "http://fuss10.elemecdn.com/8/a6/453f65f16b1391942af11511b7a90jpeg.jpeg?imageView2/1/w/114/h/114", 265 | "image": "http://fuss10.elemecdn.com/8/a6/453f65f16b1391942af11511b7a90jpeg.jpeg?imageView2/1/w/750/h/750" 266 | }, 267 | { 268 | "foodId": 16, 269 | "name": "红豆薏米美肤粥", 270 | "price": 12, 271 | "oldPrice": "", 272 | "description": "甜粥", 273 | "sellCount": 86, 274 | "rating": 100, 275 | "info": "", 276 | "ratings": [ 277 | { 278 | "username": "3******c", 279 | "rateTime": 1469281964000, 280 | "rateType": 0, 281 | "text": "", 282 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 283 | }, 284 | { 285 | "username": "2******3", 286 | "rateTime": 1469271264000, 287 | "rateType": 0, 288 | "text": "", 289 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 290 | }, 291 | { 292 | "username": "3******b", 293 | "rateTime": 1469261964000, 294 | "rateType": 0, 295 | "text": "", 296 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 297 | } 298 | ], 299 | "icon": "http://fuss10.elemecdn.com/d/22/260bd78ee6ac6051136c5447fe307jpeg.jpeg?imageView2/1/w/114/h/114", 300 | "image": "http://fuss10.elemecdn.com/d/22/260bd78ee6ac6051136c5447fe307jpeg.jpeg?imageView2/1/w/750/h/750" 301 | }, 302 | { 303 | "foodId": 17, 304 | "name": "八宝酱菜", 305 | "price": 4, 306 | "oldPrice": "", 307 | "description": "", 308 | "sellCount": 84, 309 | "rating": 100, 310 | "info": "", 311 | "ratings": [ 312 | { 313 | "username": "3******c", 314 | "rateTime": 1469281964000, 315 | "rateType": 0, 316 | "text": "", 317 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 318 | }, 319 | { 320 | "username": "2******3", 321 | "rateTime": 1469271264000, 322 | "rateType": 0, 323 | "text": "", 324 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 325 | }, 326 | { 327 | "username": "3******b", 328 | "rateTime": 1469261964000, 329 | "rateType": 0, 330 | "text": "", 331 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 332 | } 333 | ], 334 | "icon": "http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/114/h/114", 335 | "image": "http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/750/h/750" 336 | }, 337 | { 338 | "foodId": 18, 339 | "name": "红枣山药糙米粥", 340 | "price": 10, 341 | "oldPrice": "", 342 | "description": "", 343 | "sellCount": 81, 344 | "rating": 91, 345 | "info": "", 346 | "ratings": [ 347 | { 348 | "username": "3******c", 349 | "rateTime": 1469281964000, 350 | "rateType": 0, 351 | "text": "", 352 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 353 | }, 354 | { 355 | "username": "2******3", 356 | "rateTime": 1469271264000, 357 | "rateType": 0, 358 | "text": "", 359 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 360 | }, 361 | { 362 | "username": "3******b", 363 | "rateTime": 1469261964000, 364 | "rateType": 0, 365 | "text": "", 366 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 367 | } 368 | ], 369 | "icon": "http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/114/h/114", 370 | "image": "http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/750/h/750" 371 | }, 372 | { 373 | "foodId": 19, 374 | "name": "糊塌子", 375 | "price": 10, 376 | "oldPrice": "", 377 | "description": "", 378 | "sellCount": 80, 379 | "rating": 93, 380 | "info": "", 381 | "ratings": [ 382 | { 383 | "username": "3******c", 384 | "rateTime": 1469281964000, 385 | "rateType": 0, 386 | "text": "", 387 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 388 | }, 389 | { 390 | "username": "2******3", 391 | "rateTime": 1469271264000, 392 | "rateType": 0, 393 | "text": "", 394 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 395 | }, 396 | { 397 | "username": "3******b", 398 | "rateTime": 1469261964000, 399 | "rateType": 0, 400 | "text": "", 401 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 402 | } 403 | ], 404 | "icon": "http://fuss10.elemecdn.com/0/05/097a2a59fd2a2292d08067e16380cjpeg.jpeg?imageView2/1/w/114/h/114", 405 | "image": "http://fuss10.elemecdn.com/0/05/097a2a59fd2a2292d08067e16380cjpeg.jpeg?imageView2/1/w/750/h/750" 406 | } 407 | ] 408 | }, 409 | { 410 | "name": "单人精彩套餐", 411 | "type": 2, 412 | "foods": [ 413 | { 414 | "foodId": 20, 415 | "name": "红枣山药粥套餐", 416 | "price": 29, 417 | "oldPrice": 36, 418 | "description": "红枣山药糙米粥,素材包,爽口莴笋丝,四川泡菜或八宝酱菜,配菜可备注", 419 | "sellCount": 17, 420 | "rating": 100, 421 | "info": "", 422 | "ratings": [ 423 | { 424 | "username": "2******3", 425 | "rateTime": 1469271264000, 426 | "rateType": 0, 427 | "text": "", 428 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 429 | } 430 | ], 431 | "icon": "http://fuss10.elemecdn.com/6/72/cb844f0bb60c502c6d5c05e0bddf5jpeg.jpeg?imageView2/1/w/114/h/114", 432 | "image": "http://fuss10.elemecdn.com/6/72/cb844f0bb60c502c6d5c05e0bddf5jpeg.jpeg?imageView2/1/w/750/h/750" 433 | } 434 | ] 435 | }, 436 | { 437 | "name": "冰爽饮品限时特惠", 438 | "type": 1, 439 | "foods": [ 440 | { 441 | "foodId": 30, 442 | "name": "VC无限橙果汁", 443 | "price": 8, 444 | "oldPrice": 10, 445 | "description": "", 446 | "sellCount": 15, 447 | "rating": 100, 448 | "info": "", 449 | "ratings": [ 450 | { 451 | "username": "3******c", 452 | "rateTime": 1469281964000, 453 | "rateType": 0, 454 | "text": "还可以", 455 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 456 | }, 457 | { 458 | "username": "2******3", 459 | "rateTime": 1469271264000, 460 | "rateType": 0, 461 | "text": "", 462 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 463 | } 464 | ], 465 | "icon": "http://fuss10.elemecdn.com/e/c6/f348e811772016ae24e968238bcbfjpeg.jpeg?imageView2/1/w/114/h/114", 466 | "image": "http://fuss10.elemecdn.com/e/c6/f348e811772016ae24e968238bcbfjpeg.jpeg?imageView2/1/w/750/h/750" 467 | } 468 | ] 469 | }, 470 | { 471 | "name": "精选热菜", 472 | "type": -1, 473 | "foods": [ 474 | { 475 | "foodId": 40, 476 | "name": "娃娃菜炖豆腐", 477 | "price": 17, 478 | "oldPrice": "", 479 | "description": "", 480 | "sellCount": 43, 481 | "rating": 92, 482 | "info": "", 483 | "ratings": [ 484 | { 485 | "username": "3******c", 486 | "rateTime": 1469281964000, 487 | "rateType": 0, 488 | "text": "菜量还可以,味道还可以", 489 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 490 | }, 491 | { 492 | "username": "2******3", 493 | "rateTime": 1469271264000, 494 | "rateType": 0, 495 | "text": "", 496 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 497 | } 498 | ], 499 | "icon": "http://fuss10.elemecdn.com/d/2d/b1eb45b305635d9dd04ddf157165fjpeg.jpeg?imageView2/1/w/114/h/114", 500 | "image": "http://fuss10.elemecdn.com/d/2d/b1eb45b305635d9dd04ddf157165fjpeg.jpeg?imageView2/1/w/750/h/750" 501 | }, 502 | { 503 | "foodId": 41, 504 | "name": "手撕包菜", 505 | "price": 16, 506 | "oldPrice": "", 507 | "description": "", 508 | "sellCount": 29, 509 | "rating": 100, 510 | "info": "", 511 | "ratings": [ 512 | { 513 | "username": "3******c", 514 | "rateTime": 1469281964000, 515 | "rateType": 0, 516 | "text": "", 517 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 518 | }, 519 | { 520 | "username": "2******3", 521 | "rateTime": 1469271264000, 522 | "rateType": 0, 523 | "text": "", 524 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 525 | } 526 | ], 527 | "icon": "http://fuss10.elemecdn.com/9/c6/f3bc84468820121112e79583c24efjpeg.jpeg?imageView2/1/w/114/h/114", 528 | "image": "http://fuss10.elemecdn.com/9/c6/f3bc84468820121112e79583c24efjpeg.jpeg?imageView2/1/w/750/h/750" 529 | }, 530 | { 531 | "foodId": 42, 532 | "name": "香酥黄金鱼/3条", 533 | "price": 11, 534 | "oldPrice": "", 535 | "description": "", 536 | "sellCount": 15, 537 | "rating": 100, 538 | "info": "", 539 | "ratings": [ 540 | { 541 | "username": "3******c", 542 | "rateTime": 1469281964000, 543 | "rateType": 0, 544 | "text": "", 545 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 546 | }, 547 | { 548 | "username": "2******3", 549 | "rateTime": 1469271264000, 550 | "rateType": 0, 551 | "text": "", 552 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 553 | } 554 | ], 555 | "icon": "http://fuss10.elemecdn.com/4/e7/8277a6a2ea0a2e97710290499fc41jpeg.jpeg?imageView2/1/w/114/h/114", 556 | "image": "http://fuss10.elemecdn.com/4/e7/8277a6a2ea0a2e97710290499fc41jpeg.jpeg?imageView2/1/w/750/h/750" 557 | } 558 | ] 559 | }, 560 | { 561 | "name": "爽口凉菜", 562 | "type": -1, 563 | "foods": [ 564 | { 565 | "foodId": 50, 566 | "name": "八宝酱菜", 567 | "price": 4, 568 | "oldPrice": "", 569 | "description": "", 570 | "sellCount": 84, 571 | "rating": 100, 572 | "info": "", 573 | "ratings": [ 574 | { 575 | "username": "3******c", 576 | "rateTime": 1469281964000, 577 | "rateType": 0, 578 | "text": "", 579 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 580 | }, 581 | { 582 | "username": "2******3", 583 | "rateTime": 1469271264000, 584 | "rateType": 0, 585 | "text": "", 586 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 587 | }, 588 | { 589 | "username": "3******b", 590 | "rateTime": 1469261964000, 591 | "rateType": 0, 592 | "text": "", 593 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 594 | } 595 | ], 596 | "icon": "http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/114/h/114", 597 | "image": "http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/750/h/750" 598 | }, 599 | { 600 | "foodId": 51, 601 | "name": "拍黄瓜", 602 | "price": 9, 603 | "oldPrice": "", 604 | "description": "", 605 | "sellCount": 28, 606 | "rating": 100, 607 | "info": "", 608 | "ratings": [ 609 | { 610 | "username": "3******c", 611 | "rateTime": 1469281964000, 612 | "rateType": 0, 613 | "text": "", 614 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 615 | }, 616 | { 617 | "username": "2******3", 618 | "rateTime": 1469271264000, 619 | "rateType": 0, 620 | "text": "", 621 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 622 | }, 623 | { 624 | "username": "3******b", 625 | "rateTime": 1469261964000, 626 | "rateType": 0, 627 | "text": "", 628 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 629 | } 630 | ], 631 | "icon": "http://fuss10.elemecdn.com/6/54/f654985b4e185f06eb07f8fa2b2e8jpeg.jpeg?imageView2/1/w/114/h/114", 632 | "image": "http://fuss10.elemecdn.com/6/54/f654985b4e185f06eb07f8fa2b2e8jpeg.jpeg?imageView2/1/w/750/h/750" 633 | } 634 | ] 635 | }, 636 | { 637 | "name": "精选套餐", 638 | "type": -1, 639 | "foods": [ 640 | { 641 | "foodId": 60, 642 | "name": "红豆薏米粥套餐", 643 | "price": 37, 644 | "oldPrice": "", 645 | "description": "红豆薏米粥,三鲜干蒸烧卖,拍黄瓜", 646 | "sellCount": 3, 647 | "rating": 100, 648 | "info": "", 649 | "ratings": [ 650 | { 651 | "username": "2******3", 652 | "rateTime": 1469271264000, 653 | "rateType": 0, 654 | "text": "", 655 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 656 | } 657 | ], 658 | "icon": "http://fuss10.elemecdn.com/f/49/27f26ed00c025b2200a9ccbb7e67ejpeg.jpeg?imageView2/1/w/114/h/114", 659 | "image": "http://fuss10.elemecdn.com/f/49/27f26ed00c025b2200a9ccbb7e67ejpeg.jpeg?imageView2/1/w/750/h/750" 660 | }, 661 | { 662 | "foodId": 61, 663 | "name": "皮蛋瘦肉粥套餐", 664 | "price": 31, 665 | "oldPrice": "", 666 | "description": "", 667 | "sellCount": 12, 668 | "rating": 100, 669 | "info": "", 670 | "ratings": [ 671 | { 672 | "username": "2******3", 673 | "rateTime": 1469271264000, 674 | "rateType": 0, 675 | "text": "", 676 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 677 | } 678 | ], 679 | "icon": "http://fuss10.elemecdn.com/8/96/f444a8087f0e940ef264617f9d98ajpeg.jpeg?imageView2/1/w/114/h/114", 680 | "image": "http://fuss10.elemecdn.com/8/96/f444a8087f0e940ef264617f9d98ajpeg.jpeg?imageView2/1/w/750/h/750" 681 | } 682 | ] 683 | }, 684 | { 685 | "name": "果拼果汁", 686 | "type": -1, 687 | "foods": [ 688 | { 689 | "foodId": 70, 690 | "name": "蜜瓜圣女萝莉杯", 691 | "price": 6, 692 | "oldPrice": "", 693 | "description": "", 694 | "sellCount": 1, 695 | "rating": "", 696 | "info": "", 697 | "ratings": [], 698 | "icon": "http://fuss10.elemecdn.com/b/5f/b3b04c259d5ec9fa52e1856ee50dajpeg.jpeg?imageView2/1/w/114/h/114", 699 | "image": "http://fuss10.elemecdn.com/b/5f/b3b04c259d5ec9fa52e1856ee50dajpeg.jpeg?imageView2/1/w/750/h/750" 700 | }, 701 | { 702 | "foodId": 71, 703 | "name": "加多宝", 704 | "price": 6, 705 | "oldPrice": "", 706 | "description": "", 707 | "sellCount": 7, 708 | "rating": 100, 709 | "info": "", 710 | "ratings": [ 711 | { 712 | "username": "3******c", 713 | "rateTime": 1469281964000, 714 | "rateType": 0, 715 | "text": "", 716 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 717 | }, 718 | { 719 | "username": "2******3", 720 | "rateTime": 1469271264000, 721 | "rateType": 0, 722 | "text": "", 723 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 724 | }, 725 | { 726 | "username": "3******b", 727 | "rateTime": 1469261964000, 728 | "rateType": 0, 729 | "text": "", 730 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 731 | } 732 | ], 733 | "icon": "http://fuss10.elemecdn.com/b/9f/5e6c99c593cf65229225c5661bcdejpeg.jpeg?imageView2/1/w/114/h/114", 734 | "image": "http://fuss10.elemecdn.com/b/9f/5e6c99c593cf65229225c5661bcdejpeg.jpeg?imageView2/1/w/750/h/750" 735 | }, 736 | { 737 | "foodId": 72, 738 | "name": "VC无限橙果汁", 739 | "price": 8, 740 | "oldPrice": 10, 741 | "description": "", 742 | "sellCount": 15, 743 | "rating": 100, 744 | "info": "", 745 | "ratings": [ 746 | { 747 | "username": "3******c", 748 | "rateTime": 1469281964000, 749 | "rateType": 0, 750 | "text": "还可以", 751 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 752 | }, 753 | { 754 | "username": "2******3", 755 | "rateTime": 1469271264000, 756 | "rateType": 0, 757 | "text": "", 758 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 759 | } 760 | ], 761 | "icon": "http://fuss10.elemecdn.com/e/c6/f348e811772016ae24e968238bcbfjpeg.jpeg?imageView2/1/w/114/h/114", 762 | "image": "http://fuss10.elemecdn.com/e/c6/f348e811772016ae24e968238bcbfjpeg.jpeg?imageView2/1/w/750/h/750" 763 | } 764 | ] 765 | }, 766 | { 767 | "name": "小吃主食", 768 | "type": -1, 769 | "foods": [ 770 | { 771 | "foodId": 80, 772 | "name": "扁豆焖面", 773 | "price": 14, 774 | "oldPrice": "", 775 | "description": "", 776 | "sellCount": 188, 777 | "rating": 96, 778 | "info": "", 779 | "ratings": [ 780 | { 781 | "username": "3******c", 782 | "rateTime": 1469281964000, 783 | "rateType": 0, 784 | "text": "", 785 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 786 | }, 787 | { 788 | "username": "2******3", 789 | "rateTime": 1469271264000, 790 | "rateType": 0, 791 | "text": "", 792 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 793 | }, 794 | { 795 | "username": "3******b", 796 | "rateTime": 1469261964000, 797 | "rateType": 1, 798 | "text": "", 799 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 800 | } 801 | ], 802 | "icon": "http://fuss10.elemecdn.com/c/6b/29e3d29b0db63d36f7c500bca31d8jpeg.jpeg?imageView2/1/w/114/h/114", 803 | "image": "http://fuss10.elemecdn.com/c/6b/29e3d29b0db63d36f7c500bca31d8jpeg.jpeg?imageView2/1/w/750/h/750" 804 | }, 805 | { 806 | "foodId": 81, 807 | "name": "葱花饼", 808 | "price": 10, 809 | "oldPrice": "", 810 | "description": "", 811 | "sellCount": 124, 812 | "rating": 85, 813 | "info": "", 814 | "ratings": [ 815 | { 816 | "username": "3******c", 817 | "rateTime": 1469281964000, 818 | "rateType": 1, 819 | "text": "没啥味道", 820 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 821 | }, 822 | { 823 | "username": "2******3", 824 | "rateTime": 1469271264000, 825 | "rateType": 1, 826 | "text": "很一般啊", 827 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 828 | }, 829 | { 830 | "username": "3******b", 831 | "rateTime": 1469261964000, 832 | "rateType": 0, 833 | "text": "", 834 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 835 | } 836 | ], 837 | "icon": "http://fuss10.elemecdn.com/f/28/a51e7b18751bcdf871648a23fd3b4jpeg.jpeg?imageView2/1/w/114/h/114", 838 | "image": "http://fuss10.elemecdn.com/f/28/a51e7b18751bcdf871648a23fd3b4jpeg.jpeg?imageView2/1/w/750/h/750" 839 | }, 840 | { 841 | "foodId": 82, 842 | "name": "牛肉馅饼", 843 | "price": 14, 844 | "oldPrice": "", 845 | "description": "", 846 | "sellCount": 114, 847 | "rating": 91, 848 | "info": "", 849 | "ratings": [ 850 | { 851 | "username": "3******c", 852 | "rateTime": 1469281964000, 853 | "rateType": 1, 854 | "text": "难吃不推荐", 855 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 856 | }, 857 | { 858 | "username": "2******3", 859 | "rateTime": 1469271264000, 860 | "rateType": 0, 861 | "text": "", 862 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 863 | }, 864 | { 865 | "username": "3******b", 866 | "rateTime": 1469261964000, 867 | "rateType": 0, 868 | "text": "", 869 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 870 | } 871 | ], 872 | "icon": "http://fuss10.elemecdn.com/d/b9/bcab0e8ad97758e65ae5a62b2664ejpeg.jpeg?imageView2/1/w/114/h/114", 873 | "image": "http://fuss10.elemecdn.com/d/b9/bcab0e8ad97758e65ae5a62b2664ejpeg.jpeg?imageView2/1/w/750/h/750" 874 | }, 875 | { 876 | "foodId": 83, 877 | "name": "招牌猪肉白菜锅贴/10个", 878 | "price": 17, 879 | "oldPrice": "", 880 | "description": "", 881 | "sellCount": 101, 882 | "rating": 78, 883 | "info": "", 884 | "ratings": [ 885 | { 886 | "username": "3******c", 887 | "rateTime": 1469281964000, 888 | "rateType": 1, 889 | "text": "不脆,不好吃", 890 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 891 | }, 892 | { 893 | "username": "2******3", 894 | "rateTime": 1469271264000, 895 | "rateType": 0, 896 | "text": "", 897 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 898 | }, 899 | { 900 | "username": "3******b", 901 | "rateTime": 1469261964000, 902 | "rateType": 0, 903 | "text": "", 904 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 905 | } 906 | ], 907 | "icon": "http://fuss10.elemecdn.com/7/72/9a580c1462ca1e4d3c07e112bc035jpeg.jpeg?imageView2/1/w/114/h/114", 908 | "image": "http://fuss10.elemecdn.com/7/72/9a580c1462ca1e4d3c07e112bc035jpeg.jpeg?imageView2/1/w/750/h/750" 909 | }, 910 | { 911 | "foodId": 84, 912 | "name": "糊塌子", 913 | "price": 10, 914 | "oldPrice": "", 915 | "description": "", 916 | "sellCount": 80, 917 | "rating": 93, 918 | "info": "", 919 | "ratings": [ 920 | { 921 | "username": "3******c", 922 | "rateTime": 1469281964000, 923 | "rateType": 0, 924 | "text": "", 925 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 926 | }, 927 | { 928 | "username": "2******3", 929 | "rateTime": 1469271264000, 930 | "rateType": 0, 931 | "text": "", 932 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 933 | }, 934 | { 935 | "username": "3******b", 936 | "rateTime": 1469261964000, 937 | "rateType": 0, 938 | "text": "", 939 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 940 | } 941 | ], 942 | "icon": "http://fuss10.elemecdn.com/0/05/097a2a59fd2a2292d08067e16380cjpeg.jpeg?imageView2/1/w/114/h/114", 943 | "image": "http://fuss10.elemecdn.com/0/05/097a2a59fd2a2292d08067e16380cjpeg.jpeg?imageView2/1/w/750/h/750" 944 | } 945 | ] 946 | }, 947 | { 948 | "name": "特色粥品", 949 | "type": -1, 950 | "foods": [ 951 | { 952 | "foodId": 90, 953 | "name": "皮蛋瘦肉粥", 954 | "price": 10, 955 | "oldPrice": "", 956 | "description": "咸粥", 957 | "sellCount": 229, 958 | "rating": 100, 959 | "ratings": [ 960 | { 961 | "username": "3******c", 962 | "rateTime": 1469281964000, 963 | "rateType": 0, 964 | "text": "很喜欢的粥", 965 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 966 | }, 967 | { 968 | "username": "2******3", 969 | "rateTime": 1469271264000, 970 | "rateType": 0, 971 | "text": "", 972 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 973 | }, 974 | { 975 | "username": "3******b", 976 | "rateTime": 1469261964000, 977 | "rateType": 1, 978 | "text": "", 979 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 980 | } 981 | ], 982 | "icon": "http://fuss10.elemecdn.com/c/cd/c12745ed8a5171e13b427dbc39401jpeg.jpeg?imageView2/1/w/114/h/114", 983 | "image": "http://fuss10.elemecdn.com/c/cd/c12745ed8a5171e13b427dbc39401jpeg.jpeg?imageView2/1/w/750/h/750" 984 | }, 985 | { 986 | "foodId": 91, 987 | "name": "南瓜粥", 988 | "price": 9, 989 | "oldPrice": "", 990 | "description": "甜粥", 991 | "sellCount": 91, 992 | "rating": 100, 993 | "info": "", 994 | "ratings": [ 995 | { 996 | "username": "3******c", 997 | "rateTime": 1469281964000, 998 | "rateType": 0, 999 | "text": "", 1000 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1001 | }, 1002 | { 1003 | "username": "2******3", 1004 | "rateTime": 1469271264000, 1005 | "rateType": 0, 1006 | "text": "", 1007 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1008 | }, 1009 | { 1010 | "username": "3******b", 1011 | "rateTime": 1469261964000, 1012 | "rateType": 0, 1013 | "text": "", 1014 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1015 | } 1016 | ], 1017 | "icon": "http://fuss10.elemecdn.com/8/a6/453f65f16b1391942af11511b7a90jpeg.jpeg?imageView2/1/w/114/h/114", 1018 | "image": "http://fuss10.elemecdn.com/8/a6/453f65f16b1391942af11511b7a90jpeg.jpeg?imageView2/1/w/750/h/750" 1019 | }, 1020 | { 1021 | "foodId": 92, 1022 | "name": "红豆薏米美肤粥", 1023 | "price": 12, 1024 | "oldPrice": "", 1025 | "description": "甜粥", 1026 | "sellCount": 86, 1027 | "rating": 100, 1028 | "info": "", 1029 | "ratings": [ 1030 | { 1031 | "username": "3******c", 1032 | "rateTime": 1469281964000, 1033 | "rateType": 0, 1034 | "text": "", 1035 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1036 | }, 1037 | { 1038 | "username": "2******3", 1039 | "rateTime": 1469271264000, 1040 | "rateType": 0, 1041 | "text": "", 1042 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1043 | }, 1044 | { 1045 | "username": "3******b", 1046 | "rateTime": 1469261964000, 1047 | "rateType": 0, 1048 | "text": "", 1049 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1050 | } 1051 | ], 1052 | "icon": "http://fuss10.elemecdn.com/d/22/260bd78ee6ac6051136c5447fe307jpeg.jpeg?imageView2/1/w/114/h/114", 1053 | "image": "http://fuss10.elemecdn.com/d/22/260bd78ee6ac6051136c5447fe307jpeg.jpeg?imageView2/1/w/750/h/750" 1054 | }, 1055 | { 1056 | "foodId": 93, 1057 | "name": "红枣山药糙米粥", 1058 | "price": 10, 1059 | "oldPrice": "", 1060 | "description": "", 1061 | "sellCount": 81, 1062 | "rating": 91, 1063 | "info": "", 1064 | "ratings": [ 1065 | { 1066 | "username": "3******c", 1067 | "rateTime": 1469281964000, 1068 | "rateType": 0, 1069 | "text": "", 1070 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1071 | }, 1072 | { 1073 | "username": "2******3", 1074 | "rateTime": 1469271264000, 1075 | "rateType": 0, 1076 | "text": "", 1077 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1078 | }, 1079 | { 1080 | "username": "3******b", 1081 | "rateTime": 1469261964000, 1082 | "rateType": 0, 1083 | "text": "", 1084 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1085 | } 1086 | ], 1087 | "icon": "http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/114/h/114", 1088 | "image": "http://fuss10.elemecdn.com/9/b5/469d8854f9a3a03797933fd01398bjpeg.jpeg?imageView2/1/w/750/h/750" 1089 | }, 1090 | { 1091 | "foodId": 94, 1092 | "name": "鲜蔬菌菇粥", 1093 | "price": 11, 1094 | "oldPrice": "", 1095 | "description": "咸粥", 1096 | "sellCount": 56, 1097 | "rating": 100, 1098 | "info": "", 1099 | "ratings": [ 1100 | { 1101 | "username": "3******c", 1102 | "rateTime": 1469281964000, 1103 | "rateType": 0, 1104 | "text": "", 1105 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1106 | }, 1107 | { 1108 | "username": "2******3", 1109 | "rateTime": 1469271264000, 1110 | "rateType": 0, 1111 | "text": "" 1112 | }, 1113 | { 1114 | "username": "3******b", 1115 | "rateTime": 1469261964000, 1116 | "rateType": 0, 1117 | "text": "", 1118 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1119 | } 1120 | ], 1121 | "icon": "http://fuss10.elemecdn.com/e/a3/5317c68dd618929b6ac05804e429ajpeg.jpeg?imageView2/1/w/114/h/114", 1122 | "image": "http://fuss10.elemecdn.com/e/a3/5317c68dd618929b6ac05804e429ajpeg.jpeg?imageView2/1/w/750/h/750" 1123 | }, 1124 | { 1125 | "foodId": 95, 1126 | "name": "田园蔬菜粥", 1127 | "price": 10, 1128 | "oldPrice": "", 1129 | "description": "咸粥", 1130 | "sellCount": 33, 1131 | "rating": 100, 1132 | "info": "", 1133 | "ratings": [ 1134 | { 1135 | "username": "3******c", 1136 | "rateTime": 1469281964000, 1137 | "rateType": 0, 1138 | "text": "", 1139 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1140 | }, 1141 | { 1142 | "username": "2******3", 1143 | "rateTime": 1469271264000, 1144 | "rateType": 0, 1145 | "text": "", 1146 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1147 | }, 1148 | { 1149 | "username": "3******b", 1150 | "rateTime": 1469261964000, 1151 | "rateType": 0, 1152 | "text": "", 1153 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png" 1154 | } 1155 | ], 1156 | "icon": "http://fuss10.elemecdn.com/a/94/7371083792c19df00e546b29e344cjpeg.jpeg?imageView2/1/w/114/h/114", 1157 | "image": "http://fuss10.elemecdn.com/a/94/7371083792c19df00e546b29e344cjpeg.jpeg?imageView2/1/w/750/h/750" 1158 | } 1159 | ] 1160 | } 1161 | ], 1162 | "ratings": [ 1163 | { 1164 | "username": "3******c", 1165 | "rateTime": 1469281964000, 1166 | "deliveryTime": 30, 1167 | "score": 5, 1168 | "rateType": 0, 1169 | "text": "不错,粥很好喝,我经常吃这一家,非常赞,以后也会常来吃,强烈推荐.", 1170 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1171 | "recommend": [ 1172 | "南瓜粥", 1173 | "皮蛋瘦肉粥", 1174 | "扁豆焖面", 1175 | "娃娃菜炖豆腐", 1176 | "牛肉馅饼" 1177 | ] 1178 | }, 1179 | { 1180 | "username": "2******3", 1181 | "rateTime": 1469271264000, 1182 | "deliveryTime": "", 1183 | "score": 4, 1184 | "rateType": 0, 1185 | "deliveryTime": "", 1186 | "text": "服务态度不错", 1187 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1188 | "recommend": [ 1189 | "扁豆焖面" 1190 | ] 1191 | }, 1192 | { 1193 | "username": "3******b", 1194 | "rateTime": 1469261964000, 1195 | "score": 3, 1196 | "rateType": 1, 1197 | "text": "", 1198 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1199 | "recommend": [] 1200 | }, 1201 | { 1202 | "username": "1******c", 1203 | "rateTime": 1469261864000, 1204 | "deliveryTime": 20, 1205 | "score": 5, 1206 | "rateType": 0, 1207 | "text": "良心店铺", 1208 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1209 | "recommend": [] 1210 | }, 1211 | { 1212 | "username": "2******d", 1213 | "rateTime": 1469251264000, 1214 | "deliveryTime": 10, 1215 | "score": 4, 1216 | "rateType": 0, 1217 | "text": "", 1218 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1219 | "recommend": [] 1220 | }, 1221 | { 1222 | "username": "9******0", 1223 | "rateTime": 1469241964000, 1224 | "deliveryTime": 70, 1225 | "score": 1, 1226 | "rateType": 1, 1227 | "text": "送货速度蜗牛一样", 1228 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1229 | "recommend": [] 1230 | }, 1231 | { 1232 | "username": "d******c", 1233 | "rateTime": 1469231964000, 1234 | "deliveryTime": 30, 1235 | "score": 5, 1236 | "rateType": 0, 1237 | "text": "很喜欢的粥店", 1238 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1239 | "recommend": [] 1240 | }, 1241 | { 1242 | "username": "2******3", 1243 | "rateTime": 1469221264000, 1244 | "deliveryTime": "", 1245 | "score": 4, 1246 | "rateType": 0, 1247 | "text": "量给的还可以", 1248 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1249 | "recommend": [] 1250 | }, 1251 | { 1252 | "username": "3******8", 1253 | "rateTime": 1469211964000, 1254 | "deliveryTime": "", 1255 | "score": 3, 1256 | "rateType": 1, 1257 | "text": "", 1258 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1259 | "recommend": [] 1260 | }, 1261 | { 1262 | "username": "a******a", 1263 | "rateTime": 1469201964000, 1264 | "deliveryTime": "", 1265 | "score": 4, 1266 | "rateType": 0, 1267 | "text": "孩子喜欢吃这家", 1268 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1269 | "recommend": [ 1270 | "南瓜粥" 1271 | ] 1272 | }, 1273 | { 1274 | "username": "3******3", 1275 | "rateTime": 1469191264000, 1276 | "deliveryTime": "", 1277 | "score": 4, 1278 | "rateType": 0, 1279 | "text": "粥挺好吃的", 1280 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1281 | "recommend": [] 1282 | }, 1283 | { 1284 | "username": "t******b", 1285 | "rateTime": 1469181964000, 1286 | "deliveryTime": "", 1287 | "score": 3, 1288 | "rateType": 1, 1289 | "text": "", 1290 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1291 | "recommend": [] 1292 | }, 1293 | { 1294 | "username": "f******c", 1295 | "rateTime": 1469171964000, 1296 | "deliveryTime": 15, 1297 | "score": 5, 1298 | "rateType": 0, 1299 | "text": "送货速度很快", 1300 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1301 | "recommend": [] 1302 | }, 1303 | { 1304 | "username": "k******3", 1305 | "rateTime": 1469161264000, 1306 | "deliveryTime": "", 1307 | "score": 4, 1308 | "rateType": 0, 1309 | "text": "", 1310 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1311 | "recommend": [] 1312 | }, 1313 | { 1314 | "username": "u******b", 1315 | "rateTime": 1469151964000, 1316 | "deliveryTime": "", 1317 | "score": 4, 1318 | "rateType": 0, 1319 | "text": "下雨天给快递小哥点个赞", 1320 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1321 | "recommend": [] 1322 | }, 1323 | { 1324 | "username": "s******c", 1325 | "rateTime": 1469141964000, 1326 | "deliveryTime": "", 1327 | "score": 4, 1328 | "rateType": 0, 1329 | "text": "好", 1330 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1331 | "recommend": [] 1332 | }, 1333 | { 1334 | "username": "z******3", 1335 | "rateTime": 1469131264000, 1336 | "deliveryTime": "", 1337 | "score": 5, 1338 | "rateType": 0, 1339 | "text": "吃了还想再吃", 1340 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1341 | "recommend": [] 1342 | }, 1343 | { 1344 | "username": "n******b", 1345 | "rateTime": 1469121964000, 1346 | "deliveryTime": "", 1347 | "score": 3, 1348 | "rateType": 1, 1349 | "text": "发票开的不对", 1350 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1351 | "recommend": [] 1352 | }, 1353 | { 1354 | "username": "m******c", 1355 | "rateTime": 1469111964000, 1356 | "deliveryTime": 30, 1357 | "score": 5, 1358 | "rateType": 0, 1359 | "text": "好吃", 1360 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1361 | "recommend": [] 1362 | }, 1363 | { 1364 | "username": "l******3", 1365 | "rateTime": 1469101264000, 1366 | "deliveryTime": 40, 1367 | "score": 5, 1368 | "rateType": 0, 1369 | "text": "还不错吧", 1370 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1371 | "recommend": [] 1372 | }, 1373 | { 1374 | "username": "3******o", 1375 | "rateTime": 1469091964000, 1376 | "deliveryTime": "", 1377 | "score": 2, 1378 | "rateType": 1, 1379 | "text": "", 1380 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1381 | "recommend": [] 1382 | }, 1383 | { 1384 | "username": "3******p", 1385 | "rateTime": 1469081964000, 1386 | "deliveryTime": "", 1387 | "score": 4, 1388 | "rateType": 0, 1389 | "text": "很喜欢的粥", 1390 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1391 | "recommend": [] 1392 | }, 1393 | { 1394 | "username": "o******k", 1395 | "rateTime": 1469071264000, 1396 | "deliveryTime": "", 1397 | "score": 5, 1398 | "rateType": 0, 1399 | "text": "", 1400 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1401 | "recommend": [] 1402 | }, 1403 | { 1404 | "username": "k******b", 1405 | "rateTime": 1469061964000, 1406 | "deliveryTime": "", 1407 | "score": 4, 1408 | "rateType": 0, 1409 | "text": "", 1410 | "avatar": "http://static.galileo.xiaojukeji.com/static/tms/default_header.png", 1411 | "recommend": [] 1412 | } 1413 | ] 1414 | } --------------------------------------------------------------------------------