maguohua преди 8 години
родител
ревизия
f929944c00
променени са 11 файла, в които са добавени 299 реда и са изтрити 24 реда
  1. 17 0
      InitData/payments.js
  2. 25 0
      InitData/remark.js
  3. 3 3
      README.md
  4. 15 0
      controller/v1/address.js
  5. 123 5
      controller/v1/carts.js
  6. 34 0
      controller/v1/remark.js
  7. 15 0
      models/v1/address.js
  8. 29 0
      models/v1/payments.js
  9. 19 0
      models/v1/remark.js
  10. 14 15
      prototype/addressComponent.js
  11. 5 1
      routes/v1.js

+ 17 - 0
InitData/payments.js

@@ -0,0 +1,17 @@
+export default [{
+	description: "(商家仅支持在线支付)",
+	disabled_reason: "",
+	id: 1,
+	is_online_payment: true,
+	name: "在线支付",
+	promotion: [],
+	select_state: 1,
+}, {
+	description: "(商家不支持货到付款)",
+	disabled_reason: "商家仅支持在线支付",
+	id: 2,
+	is_online_payment: false,
+	name: "货到付款",
+	promotion: [],
+	select_state: -1,
+}]

+ 25 - 0
InitData/remark.js

@@ -0,0 +1,25 @@
+export default {
+remarks: [
+[
+"不要辣",
+"少点辣",
+"多点辣"
+],
+[
+"不要香菜"
+],
+[
+"不要洋葱"
+],
+[
+"多点醋"
+],
+[
+"多点葱"
+],
+[
+"去冰",
+"少冰"
+]
+]
+}

+ 3 - 3
README.md

@@ -21,7 +21,7 @@
 
 ## 技术栈
 
-nodejs + express + mongodb + mongoose + es6/7 + mocha + bluebird + bootstrap
+nodejs + express + mongodb + mongoose + es6/7 + mocha + bluebird + element-ui
 
 
 ## 项目运行
@@ -51,13 +51,13 @@ npm run dev (需开启本地mongodb,如果没有安装mongodb,可以运行 n
 - [x] 上传图片
 - [x] 添加商铺
 - [x] 添加食品
-- [x] 测距
+- [x] 测
 - [x] 搜索美食,餐馆
 - [x] 餐馆排序
 - [x] 评价列表
 - [x] 食品详情
 - [x] 商家详情
-- [ ] 购物车功能
+- [x] 购物车功能
 - [ ] 登录、注册
 - [ ] 修改密码
 - [ ] 用户信息

+ 15 - 0
controller/v1/address.js

@@ -0,0 +1,15 @@
+'use strict';
+
+import BaseComponent from '../../prototype/baseComponent'
+
+class Address extends BaseComponent{
+	constructor(){
+		super()
+
+	}
+	async getAddress(req, res, next){
+		res.send([])
+	}
+}
+
+export default new Address()

+ 123 - 5
controller/v1/carts.js

@@ -1,17 +1,135 @@
 'use strict';
 
-import BaseComponent from '../../prototype/addressComponent'
+import AddressComponent from '../../prototype/addressComponent'
 import formidable from 'formidable'
+import PaymentsModel from '../../models/v1/payments'
+import ShopModel from '../../models/shopping/shop'
 
-class Carts extends BaseComponent{
+class Carts extends AddressComponent{
 	constructor(){
-		super()
+		super();
+		this.extra = [{
+			description: '',
+			name: '餐盒',
+			price: 2,
+			quantity: 1,
+			type: 0,
+		}]
+		this.checkout = this.checkout.bind(this);
 	}
 	async checkout(req, res, next){
+		const UID = req.session.UID;
 		const form = new formidable.IncomingForm();
-		res.send('dsdfsfs')
 		form.parse(req, async (err, fields, files) => {
-
+			const {come_from, geohash, entities = [], restaurant_id} = fields;
+			try{
+				if(!(entities instanceof Array) || !entities.length){
+					throw new Error('entities参数错误')
+				}else if(!(entities[0] instanceof Array) || !entities[0].length){
+					throw new Error('entities参数错误')
+				}else if(!restaurant_id){
+					throw new Error('restaurant_id参数错误')
+				}
+			}catch(err){
+				console.log(err);
+				res.send({
+					status: 0,
+					type: 'ERROR_PARAMS',
+					message: err.message
+				})
+				return 
+			}
+			let payments; //付款方式
+			let cart_id; //购物车id
+			let restaurant; //餐馆详情
+			let deliver_time; //配送时间
+			let delivery_reach_time; //到达时间
+			let from = geohash.split(',')[0] + ',' +  geohash.split(',')[1];
+			try{
+				payments = await PaymentsModel.find({}, '-_id');
+				cart_id = await this.getId('cart_id');
+				restaurant = await ShopModel.findOne({id: restaurant_id});
+				const to = restaurant.latitude+ ',' + restaurant.longitude;
+				deliver_time = await this.getDistance(from, to, 'tiemvalue');
+				let time = new Date().getTime() + deliver_time*1000;
+				let hour = ('0' + new Date(time).getHours()).substr(-2);
+				let minute = ('0' + new Date(time).getMinutes()).substr(-2);
+				delivery_reach_time = hour + ':' + minute;
+			}catch(err){
+				console.log('获取数据数据失败', err);
+				res.send({
+					status: 0,
+					type: 'ERROR_DATA',
+					message: '添加购物车失败',
+				})
+				return 
+			}
+			let deliver_amount = 0; //食品价格
+			entities[0].map(item => {
+				deliver_amount += item.price * item.quantity;
+				if (item.specs[0]) {
+					return item.name = item.name + '-' + item.specs[0];
+				}
+			})
+			//食品总价格
+			const total = deliver_amount + this.extra[0].price * this.extra[0].quantity;
+			//是否支持发票
+			let invoice = {
+				is_available: false,
+				status_text: "商家不支持开发票",
+			};
+			restaurant.supports.forEach(item => {
+				if (item.icon_name == '票') {
+					invoice = {
+						is_available: true,
+						status_text: "不需要开发票",
+					};
+				}
+			})
+			const checkoutInfo = {
+				cart: {
+					id: cart_id,
+					groups: entities,
+					extra: this.extra,
+					deliver_amount,
+					deliver_time: '',
+					discount_amount: '',
+					dist_info: '',
+					is_address_too_far: false,
+					is_deliver_by_fengniao: !!restaurant.delivery_mode,
+					is_online_paid: 1,
+					is_ontime_available: 0,
+					must_new_user: 0,
+					must_pay_online: 0,
+					ontime_status: 0,
+					ontime_unavailable_reason: '',
+					original_total: total,
+					phone: restaurant.phone,
+					promise_delivery_time: 0,
+					restaurant_id,
+					restaurant_info: restaurant,
+					restaurant_minimum_order_amount: restaurant.float_minimum_order_amount,
+					restaurant_name_for_url: '',
+					restaurant_status: 1,
+					service_fee_explanation: 0,
+					total,
+					user_id: UID,
+				},
+				delivery_reach_time,
+				invoice,
+				sig: "8d65fd81cb962c1f64cd162c6ac5728f",
+				current_address: {},
+				payments,
+				deliver_times: [],
+				deliver_times_v2: [],
+				merchant_coupon_info: {},
+				number_of_meals: {},
+				discount_rule: {},
+				hongbao_info: {},
+				is_support_coupon: false,
+				is_support_ninja: 1,
+			}
+			res.send(checkoutInfo)	
 		})
 	}
 }

+ 34 - 0
controller/v1/remark.js

@@ -0,0 +1,34 @@
+'use strict';
+
+import BaseComponent from '../../prototype/baseComponent'
+import RemarkModel from '../../models/v1/remark'
+
+class Remark extends BaseComponent{
+	constructor(){
+		super()
+	}
+	async getRemarks(req, res, next){
+		const cart_id = req.params.cart_id;
+		if (!cart_id || !Number(cart_id)) {
+			res.send({
+				status: 0,
+				type: 'ERROR_PARAMS',
+				message: '购物车ID参数错误'
+			})
+			return 
+		}
+		try{
+			const remarks = await RemarkModel.findOne({}, '-_id');
+			res.send(remarks);
+		}catch(err){
+			console.log('获取备注数据失败',err);
+			res.send({
+				status: 0,
+				type: 'ERROR_GET_DATA',
+				message: '获取备注数据失败'
+			})
+		}
+	}
+}
+
+export default new Remark()

+ 15 - 0
models/v1/address.js

@@ -0,0 +1,15 @@
+'use strict';
+
+import BaseComponent from '../../prototype/baseComponent'
+
+class Address extends BaseComponent{
+	constructor(){
+		super()
+
+	}
+	async getAddress(req, res, next){
+		res.send([])
+	}
+}
+
+export default new Address()

+ 29 - 0
models/v1/payments.js

@@ -0,0 +1,29 @@
+'use strict';
+
+import mongoose from 'mongoose'
+import paymentsData from '../../InitData/payments'
+
+const Schema = mongoose.Schema;
+
+const paymentsSchema = new Schema({
+	description: String,
+	disabled_reason: String,
+	id: Number,
+	is_online_payment: Boolean,
+	name: String,
+	promotion: [],
+	select_state: Number,
+})
+
+const Payments = mongoose.model('Payments', paymentsSchema);
+
+Payments.findOne((err, data) => {
+	if (!data) {
+		paymentsData.forEach(item => {
+			Payments.create(item);
+		})
+	}
+})	
+
+
+export default Payments

+ 19 - 0
models/v1/remark.js

@@ -0,0 +1,19 @@
+'use strict';
+
+import mongoose from 'mongoose'
+import remarkData from '../../InitData/remark'
+const Schema  = mongoose.Schema;
+
+const remarkSchema = new Schema({
+	remarks: [],
+})
+
+const Remark = mongoose.model('Remark', remarkSchema);
+
+Remark.findOne((err, data) => {
+	if(!data){
+		Remark.create(remarkData)
+	}
+})
+
+export default Remark

+ 14 - 15
prototype/addressComponent.js

@@ -36,10 +36,8 @@ class AddressComponent extends BaseComponent {
 	 			cityInfo.city = cityInfo.city.replace(/市$/, '');
 	 			return cityInfo
 	 		}else{
-	 			console.log('定位失败');
-	 			throw new Error(err);
+	 			throw new Error('定位失败');
 	 		}
- 			
  		}catch(err){
  			throw new Error(err);
  		}
@@ -56,15 +54,14 @@ class AddressComponent extends BaseComponent {
 			if (resObj.status == 0) {
 				return resObj
 			}else{
-				console.log('搜索位置信息失败')
-				throw new Error(err);
+				throw new Error('搜索位置信息失败');
 			}
 		}catch(err){
 			throw new Error(err);
 		}
 	}
 	//测量距离
-	async getDistance(from, to){
+	async getDistance(from, to, type){
 		try{
 			const res = await this.fetch('http://api.map.baidu.com/routematrix/v2/driving', {
 				ak: this.baidukey,
@@ -73,9 +70,10 @@ class AddressComponent extends BaseComponent {
 				destinations: to,
 			})
 			if(res.status == 0){
-				const positionArr = []; 
+				const positionArr = [];
+				let timevalue;
 				res.result.forEach(item => {
-					const timevalue = parseInt(item.duration.value) + 1200;
+					timevalue = parseInt(item.duration.value) + 1200;
 					let durationtime = Math.ceil(timevalue%3600/60) + '分钟';
 					if(Math.floor(timevalue/3600)){
 						durationtime = Math.floor(timevalue/3600) + '小时' + durationtime;
@@ -85,10 +83,13 @@ class AddressComponent extends BaseComponent {
 						order_lead_time: durationtime,
 					})
 				})
-				return positionArr
+				if (type == 'tiemvalue') {
+					return timevalue
+				}else{
+					return positionArr
+				}
 			}else{
-				console.log('调用百度地图测距失败');
-				throw new Error(err);
+				throw new Error('调用百度地图测距失败');
 			}
 		}catch(err){
 			console.log('获取位置距离失败')
@@ -106,8 +107,7 @@ class AddressComponent extends BaseComponent {
 			if (res.status == 0) {
 				return res
 			}else{
-				console.log('获取具体位置信息失败');
-				throw new Error(err);
+				throw new Error('获取具体位置信息失败');
 			}
 		}catch(err){
 			console.log('geocoder获取定位失败')
@@ -124,8 +124,7 @@ class AddressComponent extends BaseComponent {
 			if (res.status == 0) {
 				return res
 			}else{
-				console.log('通过获geohash取具体位置失败');
-				throw new Error(err);
+				throw new Error('通过获geohash取具体位置失败');
 			}
 		}catch(err){
 			console.log('getpois获取定位失败')

+ 5 - 1
routes/v1.js

@@ -4,6 +4,8 @@ import express from 'express'
 import CityHandle from '../controller/v1/cities'
 import SearchPlace from '../controller/v1/search'
 import Carts from '../controller/v1/carts'
+import Address from '../controller/v1/address'
+import Remark from '../controller/v1/remark'
 import BaseComponent from '../prototype/baseComponent'
 const baseHandle = new BaseComponent();
 const router = express.Router();
@@ -13,6 +15,8 @@ router.get('/cities/:id', CityHandle.getCityById);
 router.get('/exactaddress', CityHandle.getExactAddress);
 router.get('/pois', SearchPlace.search);
 router.post('/addimg/:type', baseHandle.uploadImg);
-router.get('/carts/checkout', Carts.checkout);
+router.post('/carts/checkout', Carts.checkout);
+router.get('/carts/:cart_id/addresses', Address.getAddress);
+router.get('/carts/:cart_id/remarks', Remark.getRemarks);
 
 export default router