maguohua 8 лет назад
Родитель
Сommit
d1994164ba
10 измененных файлов с 245 добавлено и 6 удалено
  1. 2 1
      API.md
  2. 0 0
      InitData/rate.js
  3. 6 4
      README.md
  4. 23 0
      controller/shopping/food.js
  5. 26 0
      controller/shopping/shop.js
  6. 91 0
      controller/ugc/rating.js
  7. 85 0
      models/ugc/rating.js
  8. 2 0
      routes/index.js
  9. 2 0
      routes/shopping.js
  10. 8 1
      routes/ugc.js

+ 2 - 1
API.md

@@ -806,7 +806,8 @@ POST
 ```javascript
 {
   status: 1,
-  image_path: '/img/shop/15bfafa418322.jpeg'
+  image_path: '/img/shop/15bfafa418322.jpeg'  
+  // 对应的全部地址为: http://cangdu.org:8001/img/shop/15bfafa418322.jpeg
 }
 ```
 

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
InitData/rate.js


+ 6 - 4
README.md

@@ -34,7 +34,9 @@ cd node-elm
 
 npm install
 
-npm run dev (需开启本地mongodb,如果没有安装mongodb,可以运行 npm run online 连接线上mongodb)
+npm run dev (需开启本地mongodb)
+如果没有安装mongodb,可以运行 npm run online 连接线上mongodb
+
 
 访问: http://localhost:8001
 
@@ -54,10 +56,10 @@ npm run dev (需开启本地mongodb,如果没有安装mongodb,可以运行 n
 - [x] 测距
 - [x] 搜索美食,餐馆
 - [x] 餐馆排序
+- [x] 评价列表
+- [x] 食品详情
+- [x] 商家详情
 - [ ] 购物车功能
-- [ ] 评价
-- [ ] 食品详情
-- [ ] 商家详情
 - [ ] 登录、注册
 - [ ] 修改密码
 - [ ] 用户信息

+ 23 - 0
controller/shopping/food.js

@@ -259,6 +259,29 @@ class Food extends BaseComponent{
 			}
 		})
 	}
+	async getMenu(req, res, next){
+		const restaurant_id = req.query.restaurant_id;
+		if (!restaurant_id || !Number(restaurant_id)) {
+			console.log('获取餐馆参数ID错误');
+			res.send({
+				status: 0,
+				type: 'ERROR_PARAMS',
+				message: '餐馆ID参数错误',
+			})
+			return
+		}
+		try{
+			const menu = await FoodModel.find({restaurant_id}, '-_id');
+			res.send(menu);
+		}catch(err){
+			console.log('获取食品数据失败', err);
+			res.send({
+				status: 0,
+				type: 'GET_DATA_ERROR',
+				message: '获取食品数据失败'
+			})
+		}
+	}
 }
 
 export default new Food()

+ 26 - 0
controller/shopping/shop.js

@@ -4,6 +4,7 @@ import ShopModel from '../../models/shopping/shop'
 import AddressComponent from '../../prototype/addressComponent'
 import formidable from 'formidable'
 import CategoryHandle from './category'
+import Rating from '../ugc/rating'
 
 class Shop extends AddressComponent{
 	constructor(){
@@ -157,6 +158,7 @@ class Shop extends AddressComponent{
 				const shop = new ShopModel(newShop);
 				await shop.save();
 				CategoryHandle.addCategory(fields.category)
+				Rating.initData(restaurant_id);
 				res.send({
 					status: 1,
 					sussess: '添加餐馆成功',
@@ -326,6 +328,30 @@ class Shop extends AddressComponent{
 			})
 		}
 	}
+	//获取餐馆详情
+	async getRestaurantDetail(req, res, next){
+		const restaurant_id = req.params.restaurant_id;
+		if (!restaurant_id || !Number(restaurant_id)) {
+			console.log('获取餐馆详情参数ID错误');
+			res.send({
+				status: 0,
+				type: 'ERROR_PARAMS',
+				message: '餐馆ID参数错误',
+			})
+			return
+		}
+		try{
+			const restaurant = await ShopModel.findOne({id: restaurant_id}, '-_id');
+			res.send(restaurant)
+		}catch(err){
+			console.log('获取餐馆详情失败', err);
+			res.send({
+				status: 0,
+				type: 'GET_DATA_ERROR',
+				message: '获取餐馆详情失败'
+			})
+		}
+	}
 }
 
 export default new Shop()

+ 91 - 0
controller/ugc/rating.js

@@ -0,0 +1,91 @@
+'use strict';
+
+import RatingModel from '../../models/ugc/rating'
+
+class Rating {
+	constructor(){
+		this.type = ['ratings', 'scores', 'tags'];
+		this.getRatings = this.getRatings.bind(this);
+		this.getScores = this.getScores.bind(this);
+		this.getTags = this.getTags.bind(this);
+	}
+	async initData(restaurant_id){
+		try{
+			const status = await RatingModel.initData(restaurant_id);
+			if (status) {
+				console.log('初始化评论数据成功');
+			}
+		}catch(err){
+			console.log('初始化评论数据失败');
+			throw new Error(err);
+		}
+	}
+	async getRatings(req, res, next){
+		const restaurant_id = req.params.restaurant_id;
+		if (!restaurant_id || !Number(restaurant_id)) {
+			res.send({
+				status: 0,
+				type: 'ERROR_PARAMS',
+				message: '餐馆ID参数错误'
+			})
+			return
+		}
+		try{
+			const ratings = await RatingModel.getData(restaurant_id, this.type[0]);
+			res.send(ratings)
+		}catch(err){
+			console.log('获取评论列表失败', err);
+			res.send({
+				status: 0,
+				type: "ERROR_DATA",
+				message: '未找到当前餐馆的评论数据'
+			})
+		}
+	}
+	async getScores(req, res, next){
+		const restaurant_id = req.params.restaurant_id;
+		if (!restaurant_id || !Number(restaurant_id)) {
+			res.send({
+				status: 0,
+				type: 'ERROR_PARAMS',
+				message: '餐馆ID参数错误'
+			})
+			return
+		}
+		try{
+			const scores = await RatingModel.getData(restaurant_id, this.type[1]);
+			res.send(scores)
+		}catch(err){
+			console.log('获取评论列表失败', err);
+			res.send({
+				status: 0,
+				type: "ERROR_DATA",
+				message: '未找到当前餐馆的评论数据'
+			})
+		}
+	}
+	async getTags(req, res, next){
+		const restaurant_id = req.params.restaurant_id;
+		if (!restaurant_id || !Number(restaurant_id)) {
+			res.send({
+				status: 0,
+				type: 'ERROR_PARAMS',
+				message: '餐馆ID参数错误'
+			})
+			return
+		}
+		try{
+			const tags = await RatingModel.getData(restaurant_id, this.type[2]);
+			res.send(tags)
+		}catch(err){
+			console.log('获取评论列表失败', err);
+			res.send({
+				status: 0,
+				type: "ERROR_DATA",
+				message: '未找到当前餐馆的评论数据'
+			})
+		}
+	}
+}
+
+export default new Rating()

+ 85 - 0
models/ugc/rating.js

@@ -0,0 +1,85 @@
+'use strict';
+
+import mongoose from 'mongoose'
+import {ratingList, scores, tags} from '../../InitData/rate'
+const Schema = mongoose.Schema;
+
+const rateSchema = new Schema({
+	restaurant_id: Number,
+	ratings: [
+		{
+			avatar: {type: String, default: ''},
+			highlights: [],
+			item_ratings: [
+				{
+					food_id: Number,
+					food_name: String,
+					image_hash: {type: String, default: ''},
+					is_valid: {type: Number, default: 1},
+				},
+			],
+			rated_at: String,
+			rating_star: Number,
+			rating_text: String,
+			tags: {type: Array, default: []},
+			time_spent_desc: String,
+			username: {type: String, default: "匿名用户"},
+		},
+	],
+	scores: {
+		compare_rating: {type: Number, default: 0},
+		deliver_time: {type: Number, default: 0},
+		food_score: {type: Number, default: 0},
+		order_rating_amount: {type: Number, default: 0},
+		overall_score: {type: Number, default: 0},
+		service_score: {type: Number, default: 0},
+	},
+	tags: [{
+		count: {type: Number, default: 0},
+		name: String,
+		unsatisfied: {type: Boolean, default: false},
+	}]
+})
+
+rateSchema.index({restaurant_id: 1});
+
+rateSchema.statics.initData = async function (restaurant_id){
+	try{
+		const data = await this.findOne();
+		if (!data) {
+			const newRating = {
+				restaurant_id,
+				ratings: ratingList,
+				scores,
+				tags,
+			}
+			await this.create(newRating);
+			return true
+		}else{
+			return false
+		}
+	}catch(err){
+		console.log('初始化评论数据失败');
+		throw new Error(err)
+	}
+}
+
+rateSchema.statics.getData = async function (restaurant_id, type){
+	try{
+		const data = await this.findOne({restaurant_id}, '-_id');
+		if (!data) {
+			throw new Error('未找到当前餐馆的评论数据');
+		}else{
+			return data[type]
+		}
+	}catch(err){
+		console.log('初始化评论数据失败');
+		throw new Error(err)
+	}
+}
+
+const Rating = mongoose.model('Rating', rateSchema);
+
+
+
+export default Rating

+ 2 - 0
routes/index.js

@@ -4,6 +4,7 @@ import home from './home';
 import v1 from './v1'
 import v2 from './v2'
 import v4 from './v4'
+import ugc from './ugc'
 import shopping from './shopping'
 
 export default app => {
@@ -14,5 +15,6 @@ export default app => {
 	app.use('/v1', v1);
 	app.use('/v2', v2);
 	app.use('/v4', v4);
+	app.use('/ugc', ugc);
 	app.use('/shopping', shopping);
 }

+ 2 - 0
routes/shopping.js

@@ -11,6 +11,8 @@ 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/menu', Food.getMenu);
+router.get('/restaurant/:restaurant_id', Shop.getRestaurantDetail);
 router.get('/v2/restaurant/category', Category.getCategories);
 router.get('/v1/restaurants/delivery_modes', Category.getDelivery);
 router.get('/v1/restaurants/activity_attributes', Category.getActivity);

+ 8 - 1
routes/ugc.js

@@ -1,4 +1,11 @@
 'use strict';
 
 import express from 'express';
-const router = express.Router();
+import Rating from '../controller/ugc/rating'
+const router = express.Router();
+
+router.get('/v2/restaurants/:restaurant_id/ratings', Rating.getRatings)
+router.get('/v2/restaurants/:restaurant_id/ratings/scores', Rating.getScores)
+router.get('/v2/restaurants/:restaurant_id/ratings/tags', Rating.getTags)
+
+export default router

Некоторые файлы не были показаны из-за большого количества измененных файлов