Эх сурвалжийг харах

代码优化 增加测局api

maguohua 8 жил өмнө
parent
commit
a49e7c5dc3

+ 541 - 0
InitData/category.js

@@ -0,0 +1,541 @@
+export default [
+{
+count: 0,
+ids: [
+207,
+220,
+260,
+233,
+239,
+244,
+248,
+252
+],
+image_url: "",
+level: 1,
+name: "全部商家"
+},
+{
+count: 0,
+id: 207,
+ids: [
+207
+],
+image_url: "bff533cf9617bd57fe1dfb05603bebcfpng",
+level: 1,
+name: "快餐便当",
+sub_categories: [
+{
+count: 0,
+id: 207,
+image_url: "44545a0518aab93817cfe611e88bb702png",
+level: 1,
+name: "全部快餐便当"
+},
+{
+count: 0,
+id: 265,
+image_url: "be84bc4d7cf12deee9115b16eb099302png",
+level: 2,
+name: "简餐"
+},
+{
+count: 0,
+id: 209,
+image_url: "66b78c0e7099c278977298d7c6042c80png",
+level: 2,
+name: "盖浇饭"
+},
+{
+count: 0,
+id: 213,
+image_url: "02e6c9e3bf338ec0ba0d923717b9f8acpng",
+level: 2,
+name: "米粉面馆"
+},
+{
+count: 0,
+id: 215,
+image_url: "af6ab89041b3e77fe115d1e4b72d69f0png",
+level: 2,
+name: "包子粥店"
+},
+{
+count: 0,
+id: 219,
+image_url: "eddd9dc7e5d21debe2fb278ae01fefe9png",
+level: 2,
+name: "香锅砂锅"
+},
+{
+count: 0,
+id: 214,
+image_url: "4d347d0dc65dd75fb2911256aabf2327png",
+level: 2,
+name: "麻辣烫"
+},
+{
+count: 0,
+id: 217,
+image_url: "65b575c2278a3f6e5c70af45b578cbeepng",
+level: 2,
+name: "饺子馄饨"
+},
+{
+count: 0,
+id: 212,
+image_url: "7d47af01fccc46fc3621865a9cc07c93png",
+level: 2,
+name: "汉堡"
+},
+{
+count: 0,
+id: 216,
+image_url: "4c6af48f68284ad91c6d95d2bd3f4aa6png",
+level: 2,
+name: "生煎锅贴"
+},
+{
+count: 0,
+id: 267,
+image_url: "79637dc36d67de4fe48d121ea77b3eddpng",
+level: 2,
+name: "黄焖鸡米饭"
+},
+{
+count: 0,
+id: 266,
+image_url: "c09d1ff71384e2e1664f72e0a928810dpng",
+level: 2,
+name: "烧腊饭"
+},
+{
+count: 0,
+id: 269,
+image_url: "180cb951c2d4eb2e220debf4571bf83apng",
+level: 2,
+name: "煲仔饭"
+},
+{
+count: 0,
+id: 268,
+image_url: "cdf208b399b854e456f23d28b1972e97png",
+level: 2,
+name: "咖喱饭"
+}
+]
+},
+{
+count: 0,
+id: 220,
+ids: [
+220
+],
+image_url: "655ac1bfd1e818013a9f099e964f1e9djpeg",
+level: 1,
+name: "特色菜系",
+sub_categories: [
+{
+count: 0,
+id: 220,
+image_url: "ef32dabbcd88fbed5a336383e74c733dpng",
+level: 1,
+name: "全部特色菜系"
+},
+{
+count: 0,
+id: 221,
+image_url: "43b0e4694f8ebc393cce6723d5df5222png",
+level: 2,
+name: "川湘菜"
+},
+{
+count: 0,
+id: 263,
+image_url: "94ac841e2c3e27f8eeeaa917574ed574png",
+level: 2,
+name: "其他菜系"
+},
+{
+count: 0,
+id: 225,
+image_url: "2d098842683548f9626cf0a8c879257dpng",
+level: 2,
+name: "江浙菜"
+},
+{
+count: 0,
+id: 222,
+image_url: "e320bf1ab9762cb1faad27d79f51219cpng",
+level: 2,
+name: "粤菜"
+},
+{
+count: 0,
+id: 232,
+image_url: "a33f1ec0044ddd4d282fbc8b1f0a946fpng",
+level: 2,
+name: "海鲜"
+},
+{
+count: 0,
+id: 231,
+image_url: "c03d81f550eb849ed2d4d0290ced9099png",
+level: 2,
+name: "火锅烤鱼"
+},
+{
+count: 0,
+id: 223,
+image_url: "aa4de1e9b54170cf495d8052407658c5png",
+level: 2,
+name: "东北菜"
+},
+{
+count: 0,
+id: 226,
+image_url: "741d15270496d7699dd2e7804fccc7a1png",
+level: 2,
+name: "西北菜"
+},
+{
+count: 0,
+id: 224,
+image_url: "54dabf93116f4a336fcc91431be43828png",
+level: 2,
+name: "云南菜"
+},
+{
+count: 0,
+id: 228,
+image_url: "a7e6d9cf1993fa4fe0bd02d74d40c9c2png",
+level: 2,
+name: "新疆菜"
+},
+{
+count: 0,
+id: 227,
+image_url: "e19bf59188a157dfc372b3d254fc986dpng",
+level: 2,
+name: "鲁菜"
+}
+]
+},
+{
+count: 0,
+id: 260,
+ids: [
+260
+],
+image_url: "1babf6efbfdb0ef701f19689a5529e5fjpeg",
+level: 1,
+name: "异国料理",
+sub_categories: [
+{
+count: 0,
+id: 260,
+image_url: "754c5c2ad1b01668a7186ec5f0fb0e59png",
+level: 1,
+name: "全部异国料理"
+},
+{
+count: 0,
+id: 229,
+image_url: "cf8c84a2fe5ecf27b21bcbddc1724d36png",
+level: 2,
+name: "日韩料理"
+},
+{
+count: 0,
+id: 230,
+image_url: "78c45200d58e5c02cb70fb8287df732dpng",
+level: 2,
+name: "西餐"
+},
+{
+count: 0,
+id: 211,
+image_url: "bb7eb2afe778ba9afbe54f9d282818d1png",
+level: 2,
+name: "披萨意面"
+},
+{
+count: 0,
+id: 264,
+image_url: "614053401fddc171eed0436f3cd1f7dcpng",
+level: 2,
+name: "东南亚菜"
+}
+]
+},
+{
+count: 0,
+id: 233,
+ids: [
+233
+],
+image_url: "435a7eda7659bac613e524ca7c1ae12epng",
+level: 1,
+name: "小吃夜宵",
+sub_categories: [
+{
+count: 0,
+id: 233,
+image_url: "7d714540b1590552d991fd731e8772a3png",
+level: 1,
+name: "全部小吃夜宵"
+},
+{
+count: 0,
+id: 236,
+image_url: "d049fb617edcea921185258d1675db83png",
+level: 2,
+name: "小龙虾"
+},
+{
+count: 0,
+id: 237,
+image_url: "90483b16d9598aec798263220eb3a821png",
+level: 2,
+name: "地方小吃"
+},
+{
+count: 0,
+id: 218,
+image_url: "3c6e2763cf4ee56f18fd1b7360585fb3png",
+level: 2,
+name: "烧烤"
+},
+{
+count: 0,
+id: 234,
+image_url: "71164ef684e8a13b5e66a20a1c55671cpng",
+level: 2,
+name: "炸鸡炸串"
+},
+{
+count: 0,
+id: 235,
+image_url: "efdba78945f83ed1e8e6e838718b4c65png",
+level: 2,
+name: "鸭脖卤味"
+},
+{
+count: 0,
+id: 238,
+image_url: "d7e0be7e5420e213ea42e4fa3efa762bpng",
+level: 2,
+name: "零食"
+}
+]
+},
+{
+count: 0,
+id: 239,
+ids: [
+239
+],
+image_url: "48243703799592368585b23589cf3ba8png",
+level: 1,
+name: "甜品饮品",
+sub_categories: [
+{
+count: 0,
+id: 239,
+image_url: "3233a4cac2e5e02cade80cce22992796png",
+level: 1,
+name: "全部甜品饮品"
+},
+{
+count: 0,
+id: 240,
+image_url: "3a40add809b4405e677c4cab574e56c4png",
+level: 2,
+name: "奶茶果汁"
+},
+{
+count: 0,
+id: 241,
+image_url: "213cbac0242d4845d1d28af0fa5fe35epng",
+level: 2,
+name: "甜品"
+},
+{
+count: 0,
+id: 242,
+image_url: "c2f05ef82a7ee44b7848b7fb598d42e3png",
+level: 2,
+name: "咖啡"
+}
+]
+},
+{
+count: 0,
+id: 244,
+ids: [
+244
+],
+image_url: "6235a6fce94bed63a21508f68a72c158png",
+level: 1,
+name: "果蔬生鲜",
+sub_categories: [
+{
+count: 0,
+id: 244,
+image_url: "1ce198f37a81285f4afa2aaf826a558fpng",
+level: 1,
+name: "全部果蔬生鲜"
+},
+{
+count: 0,
+id: 245,
+image_url: "a831a37ec670ca93cd35a8a6b5a20e62png",
+level: 2,
+name: "水果"
+},
+{
+count: 0,
+id: 247,
+image_url: "6d3cef77e055d03598cba821ebcf1f06png",
+level: 2,
+name: "生鲜"
+},
+{
+count: 0,
+id: 246,
+image_url: "1729548b88614c1b3a6e71ef7f89f294png",
+level: 2,
+name: "蔬菜"
+},
+{
+count: 0,
+id: 270,
+image_url: "a2ab438ee4ac09e6e53b3f96694bac81png",
+level: 2,
+name: "海鲜水产"
+}
+]
+},
+{
+count: 0,
+id: 248,
+ids: [
+248
+],
+image_url: "0e07558e305abfb2618ae760142222f9png",
+level: 1,
+name: "鲜花蛋糕",
+sub_categories: [
+{
+count: 0,
+id: 248,
+image_url: "3edf3f4ef8ed1d300896c5b9178685ebpng",
+level: 1,
+name: "全部鲜花蛋糕"
+},
+{
+count: 0,
+id: 251,
+image_url: "cf598de7338b4bf9dd2924736c4ec9d2png",
+level: 2,
+name: "鲜花"
+},
+{
+count: 0,
+id: 249,
+image_url: "ac94b005c97ef158282326cb49389893png",
+level: 2,
+name: "蛋糕"
+},
+{
+count: 0,
+id: 250,
+image_url: "512232422a83e25a2c0a5588b7b6e730png",
+level: 2,
+name: "面包"
+}
+]
+},
+{
+count: 0,
+id: 252,
+ids: [
+252
+],
+image_url: "ac15c5dd59b641bdfdeb822362547fb4png",
+level: 1,
+name: "商店超市",
+sub_categories: [
+{
+count: 0,
+id: 252,
+image_url: "df21b511f287ccb402e68285d2653caepng",
+level: 1,
+name: "全部商店超市"
+},
+{
+count: 0,
+id: 254,
+image_url: "92ae70438be9a3adfc5a560c1e6ae818png",
+level: 2,
+name: "超市"
+},
+{
+count: 0,
+id: 271,
+image_url: "841d136b17fa4cb871a296c9e4997cfapng",
+level: 2,
+name: "便利店"
+},
+{
+count: 0,
+id: 274,
+image_url: "7df84232aebbb5ffb53e564c9e328d31png",
+level: 2,
+name: "名酒坊"
+},
+{
+count: 0,
+id: 273,
+image_url: "c2b0e2b27ea55a9a7211f14ad95dcd0apng",
+level: 2,
+name: "零食饮料"
+},
+{
+count: 0,
+id: 255,
+image_url: "825031dc99e1f99c26feb7186b6cf3a6png",
+level: 2,
+name: "水站"
+},
+{
+count: 0,
+id: 258,
+image_url: "54b7ce87994d6770f1ead57b0038c569png",
+level: 2,
+name: "茶"
+},
+{
+count: 0,
+id: 256,
+image_url: "f6460e330d25dabd4fd8db07cf53f039png",
+level: 2,
+name: "奶站"
+},
+{
+count: 0,
+id: 257,
+image_url: "b435af6662fd0b3e9fb6537474753f72png",
+level: 2,
+name: "粮油"
+},
+{
+count: 0,
+id: 272,
+image_url: "f7e32a289deca477c286362e3a1bc2bcpng",
+level: 2,
+name: "美妆母婴"
+}
+]
+}
+]

+ 1 - 1
README.md

@@ -51,8 +51,8 @@ npm run dev
 - [x] 上传图片
 - [x] 添加商铺
 - [x] 添加食品
+- [x] 测距
 - [ ] 搜索美食,餐馆
-- [ ] 测距
 - [ ] 餐馆排序
 - [ ] 购物车功能
 - [ ] 评价

+ 5 - 2
app.js

@@ -18,8 +18,11 @@ app.all('*', (req, res, next) => {
   	res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
     res.header("Access-Control-Allow-Credentials", true); //可以带cookies
   	res.header("X-Powered-By",' 3.2.1')
-  	if(req.method=="OPTIONS") res.send(200);/*让options请求快速返回*/
-  	else  next();
+    if (req.method == 'OPTIONS') {
+      res.send(200);
+    } else {
+      next();
+    }
 });
 
 const MongoStore = connectMongo(session);

+ 33 - 0
controller/shopping/category.js

@@ -0,0 +1,33 @@
+'use strict';
+
+import CategoryModel from '../../models/shopping/category'
+import BaseComponent from '../../prototype/baseComponent'
+
+class Category extends BaseComponent{
+	constructor(){
+		super()
+	}
+	//获取所有餐馆分类和数量
+	async getCategories(req, res, next){
+		try{
+			const categories = await CategoryModel.find({}, '-_id');
+			res.send(categories);
+		}catch(err){
+			console.log('获取categories失败');
+			res.send({
+				status: 0,
+				type: 'ERROR_DATA',
+				message: '获取categories失败'
+			})
+		}
+	}
+	async addCategory(type){
+		try{
+			await CategoryModel.addCategory(type)
+		}catch(err){
+			console.log('增加category数量失败');
+		}
+	}
+}
+
+export default new Category()

+ 17 - 10
controller/shopping/shop.js

@@ -3,6 +3,7 @@
 import ShopModel from '../../models/shopping/shop'
 import AddressComponent from '../../prototype/addressComponent'
 import formidable from 'formidable'
+import CategoryHandle from './category'
 
 class Shop extends AddressComponent{
 	constructor(){
@@ -55,8 +56,8 @@ class Shop extends AddressComponent{
 				id: restaurant_id,
 				is_premium: fields.is_premium || false,
 				is_new: fields.new || false,
-				latitude: 31.056997,
-				longitude: 121.396113,
+				latitude: fields.latitude,
+				longitude: fields.longitude,
 				opening_hours: [opening_hours],
 				phone: fields.phone,
 				promotion_info: fields.promotion_info || "欢迎光临,用餐高峰请提前下单,谢谢",
@@ -65,6 +66,7 @@ class Shop extends AddressComponent{
 				recent_order_num: Math.ceil(Math.random()*1000),
 				status: Math.round(Math.random()),
 				image_path: fields.image_path,
+				category: fields.category,
 				piecewise_agent_fee: {
 					tips: "配送费约¥" + (fields.float_delivery_fee || 0),
 				},
@@ -146,6 +148,7 @@ class Shop extends AddressComponent{
 			try{
 				const shop = new ShopModel(newShop);
 				await shop.save();
+				CategoryHandle.addCategory(fields.category)
 				res.send({
 					status: 1,
 					shopDetail: newShop
@@ -160,6 +163,7 @@ class Shop extends AddressComponent{
 			}
 		})
 	}
+	//获取餐馆列表
 	async getRestaurants(req, res, next){
 		const {
 			latitude,
@@ -180,6 +184,7 @@ class Shop extends AddressComponent{
 				throw new Error('longitude参数错误');
 			}
 		}catch(err){
+			console.log('latitude,longitude参数错误');
 			res.send({
 				status: 0,
 				type: 'ERROR_PARAMS',
@@ -187,23 +192,25 @@ class Shop extends AddressComponent{
 			})
 			return
 		}
-		const restaurants = await ShopModel.find().limit(Number(limit)).skip(Number(offset));
+		const restaurants = await ShopModel.find({}, '-_id').limit(Number(limit)).skip(Number(offset));
 		const from = latitude + ',' + longitude;
 		let to = '';
 		restaurants.forEach((item, index) => {
-			const spStr = (index == restaurants.length -1) ? '':';';
-			to += item.latitude + ',' + item.longitude + spStr;
+			const slpitStr = (index == restaurants.length -1) ? '' : '|';
+			to += item.latitude + ',' + item.longitude + slpitStr;
 		})
 		try{
-			const distance = await this.getDistance(from, to)
-			res.send(distance)
-
+			const positionArr = await this.getDistance(from, to)
+			restaurants.map((item, index) => {
+				return Object.assign(item, positionArr[index])
+			})
+			res.send(restaurants)
 		}catch(err){
-			console.log('设置商铺距离信息失败');
+			console.log('从addressComoponent获取数据后处理失败');
 			res.send({
 				status: 0,
 				type: 'ERROR_DATA',
-				message: '获取信息失败'
+				message: '获取数据失败'
 			})
 		}
 	}

+ 64 - 3
controller/v1/cities.js

@@ -9,6 +9,8 @@ class CityHandle extends AddressComponent{
 	constructor(){
 		super()
 		this.getCity = this.getCity.bind(this);
+		this.getExactAddress = this.getExactAddress.bind(this);
+		this.pois = this.pois.bind(this);
 	}
 	async getCity(req, res, next){
 		const type = req.query.type;
@@ -34,7 +36,10 @@ class CityHandle extends AddressComponent{
 			}
 			res.send(cityInfo);
 		}catch(err){
-			res.send(err);
+			res.send({
+				name: 'ERROR_DATA',
+				message: '获取数据失败',
+			});
 		}
 	}
 	async getCityById(req, res, next){
@@ -50,7 +55,10 @@ class CityHandle extends AddressComponent{
 			const cityInfo = await Cities.getCityById(cityid);
 			res.send(cityInfo);
 		}catch(err){
-			res.send(err);
+			res.send({
+				name: 'ERROR_DATA',
+				message: '获取数据失败',
+			});
 		}
 	}
 	async getCityName(req){
@@ -58,7 +66,12 @@ class CityHandle extends AddressComponent{
 		try{
 			cityInfo = await this.guessPosition(req);
 		}catch(err){
-			console.error()
+			console.error('获取IP位置信息失败');
+			res.send({
+				name: 'ERROR_DATA',
+				message: '获取数据失败',
+			});
+			return 
 		}
 		/*
 		汉字转换成拼音
@@ -72,5 +85,53 @@ class CityHandle extends AddressComponent{
 		})
 		return cityName
 	}
+	async getExactAddress(req, res, next){
+		try{
+			const position = await this.geocoder(req)
+			res.send(position);
+		}catch(err){
+			console.log('获取精确位置信息失败');
+			res.send({
+				name: 'ERROR_DATA',
+				message: '获取精确位置信息失败',
+			});
+		}
+	}
+	async pois(req, res, next){
+		const geohash = req.params.geohash;
+		try{
+			if (geohash.indexOf(',') == -1) {
+				throw new Error('参数错误')
+			}
+		}catch(err){
+			console.log('参数错误');
+			res.send({
+				status: 0,
+				type: 'ERROR_PARAMS',
+				message: '参数错误',
+			})
+			return 
+		}
+		const poisArr = geohash.split(',');
+		try{
+			const result = await this.getpois(poisArr[0], poisArr[1]);
+			const address = {
+				address: result.result.address,
+				city: result.result.address_component.province,
+				geohash,
+				latitude: poisArr[0],
+				longitude: poisArr[1],
+				name: result.result.formatted_addresses.recommend,
+			}
+			res.send(address);
+		}catch(err){
+			console.log('getpois返回信息失败');
+			res.send({
+				status: 0,
+				type: 'ERROR_DATA',
+				message: '获取数据失败',
+			})
+		}
+	}
 }
 export default new CityHandle()

+ 1 - 1
controller/v2/entry.js

@@ -8,7 +8,7 @@ class Entry {
 	}
 	async getEntry(req, res, next){
 		try{
-			const entries = await EntryModel.find();
+			const entries = await EntryModel.find({}, '-_id');
 			res.send(entries);
 		}catch(err){
 			console.log('获取数据失败');

+ 58 - 0
models/shopping/category.js

@@ -0,0 +1,58 @@
+'use strict';
+
+import mongoose from 'mongoose'
+import categoryData from '../../InitData/category'
+
+const Schema = mongoose.Schema;
+
+const categorySchema = new Schema({
+	count: Number,
+	id: Number,
+	ids: [],
+	image_url: String,
+	level: Number,
+	name: String,
+	sub_categories: [
+		{
+			count: Number,
+			id: Number,
+			image_url: String,
+			level: Number,
+			name: String
+		},
+	]
+});
+
+categorySchema.statics.addCategory = async function (type){
+	const categoryName = type.split('/');
+	try{
+		const allcate = await this.findOne();
+		const subcate = await this.findOne({name: categoryName[0]});
+		allcate.count ++;
+		subcate.count ++ ;
+		subcate.sub_categories.map(item => {
+			if (item.name == categoryName[1]) {
+				return item.count ++ 
+			}
+		})
+		await allcate.save();
+		await subcate.save();
+		console.log('保存cetegroy成功');
+		return
+	}catch(err){
+		console.log('保存cetegroy失败');
+		throw new Error('保存cetegroy失败')
+	}
+}
+
+const Category = mongoose.model('Category', categorySchema)
+
+Category.findOne((err, data) => {
+	if (!data) {
+		for (let i = 0; i < categoryData.length; i++) {
+			Category.create(categoryData[i]);
+		}
+	}
+})
+
+export default Category

+ 4 - 1
models/shopping/shop.js

@@ -14,13 +14,16 @@ const shopSchema = new mongoose.Schema({
 	delivery_mode: {
 		color: String,
 		id: Number,
-		is_solid: { type: Boolean, default: true },
+		is_solid: Boolean,
 		text: String
 	},
 	description: { type: String, default: "" },
+	order_lead_time: { type: String, default: "" },
+	distance: { type: String, default: "" },
 	float_delivery_fee: { type: Number, default: 0 },
 	float_minimum_order_amount: { type: Number, default: 0 },
 	id: Number,
+	category: String,
 	identification: {
 		company_name: { type: String, default: "" },
 		identificate_agency: { type: String, default: "" },

+ 60 - 10
prototype/addressComponent.js

@@ -3,12 +3,13 @@
 import BaseComponent from './baseComponent'
 
 /*
-腾讯地图API统一调配组件
+腾讯地图和百度地图API统一调配组件
  */
 class AddressComponent extends BaseComponent {
 	constructor(){
 		super();
-		this.key = 'RLHBZ-WMPRP-Q3JDS-V2IQA-JNRFH-EJBHL';
+		this.tencentkey = 'RLHBZ-WMPRP-Q3JDS-V2IQA-JNRFH-EJBHL';
+		this.baidukey = 'fjke3YUipM9N64GdOIh1DNeK2APO2WcT';
 	}
 	//获取定位地址
 	async guessPosition(req){
@@ -24,7 +25,7 @@ class AddressComponent extends BaseComponent {
  		try{
 	 		const result = await this.fetch('http://apis.map.qq.com/ws/location/v1/ip', {
 	 			ip,
-	 			key: this.key,
+	 			key: this.tencentkey,
 	 		})
 	 		if (result.status == 0) {
 	 			const cityInfo = {
@@ -47,7 +48,7 @@ class AddressComponent extends BaseComponent {
 	async searchPlace(keyword, cityName){
 		try{
 			const resObj = await this.fetch('http://apis.map.qq.com/ws/place/v1/search', {
-				key: this.key,
+				key: this.tencentkey,
 				keyword: encodeURIComponent(keyword),
 				boundary: 'region(' + encodeURIComponent(cityName) + ',0)',
 				page_size: 10,
@@ -65,18 +66,67 @@ class AddressComponent extends BaseComponent {
 	//测量距离
 	async getDistance(from, to){
 		try{
-			const res = await this.fetch('http://apis.map.qq.com/ws/distance/v1/', {
-				key: this.key,
-				from,
-				to,
+			const res = await this.fetch('http://api.map.baidu.com/routematrix/v2/driving', {
+				ak: this.baidukey,
+				output: 'json',
+				origins: from,
+				destinations: to,
 			})
-			return res
+			if(res.status == 0){
+				const positionArr = []; 
+				res.result.forEach(item => {
+					positionArr.push({
+						distance: item.distance.text,
+						order_lead_time: item.duration.text,
+					})
+				})
+				return positionArr
+			}else{
+				console.log('调用百度地图测距失败');
+				throw new Error('调用百度地图测距失败');
+			}
 		}catch(err){
 			console.log('获取位置距离失败')
 			throw new Error('获取位置距离失败');
 		}
 	}
-
+	//通过ip地址获取精确位置
+	async geocoder(req){
+		try{
+			const address = await this.guessPosition(req);
+			const res = await this.fetch('http://apis.map.qq.com/ws/geocoder/v1/', {
+				key: this.tencentkey,
+				location: address.lat + ',' + address.lng
+			})
+			if (res.status == 0) {
+				return res
+			}else{
+				console.log('获取具体位置信息失败');
+				throw new Error('获取具体位置信息失败');
+			}
+		}catch(err){
+			console.log('geocoder获取定位失败')
+			throw new Error('geocoder获取定位失败');
+		}
+	}
+	//通过geohash获取精确位置
+	async getpois(lat, lng){
+		try{
+			const res = await this.fetch('http://apis.map.qq.com/ws/geocoder/v1/', {
+				key: this.tencentkey,
+				location: lat + ',' + lng
+			})
+			if (res.status == 0) {
+				return res
+			}else{
+				console.log('通过获geohash取具体位置失败');
+				throw new Error('通过geohash获取具体位置失败');
+			}
+		}catch(err){
+			console.log('getpois获取定位失败')
+			throw new Error('getpois获取定位失败');
+		}
+	}
 }
 
 export default AddressComponent

+ 2 - 0
routes/shopping.js

@@ -3,6 +3,7 @@
 import express from 'express';
 import Shop from '../controller/shopping/shop'
 import Food from '../controller/shopping/food'
+import Category from '../controller/shopping/category'
 import BaseComponent from '../prototype/baseComponent'
 const baseHandle = new BaseComponent();
 const router = express.Router();
@@ -13,5 +14,6 @@ router.get('/restaurants', Shop.getRestaurants)
 router.post('/addfood', Food.addFood);
 router.get('/getcategory/:restaurant_id', Food.getCategory);
 router.post('/addcategory', Food.addCategory);
+router.get('/v2/restaurant/category', Category.getCategories);
 
 export default router

+ 2 - 1
routes/v1.js

@@ -7,6 +7,7 @@ const router = express.Router();
 
 router.get('/cities', CityHandle.getCity);
 router.get('/cities/:id', CityHandle.getCityById);
-router.get('/pois', SearchPlace.search)
+router.get('/exactaddress', CityHandle.getExactAddress);
+router.get('/pois', SearchPlace.search);
 
 export default router

+ 2 - 0
routes/v2.js

@@ -2,8 +2,10 @@
 
 import express from 'express';
 import Entry from '../controller/v2/entry'
+import CityHandle from '../controller/v1/cities';
 const router = express.Router();
 
 router.get('/index_entry', Entry.getEntry);
+router.get('/pois/:geohash', CityHandle.pois);
 
 export default router