Commit 5c2fd475 authored by 任国军's avatar 任国军

add comment & search

parent 13d19c1e
Pipeline #16415 passed with stage
in 47 seconds
......@@ -102,6 +102,39 @@ class InstitutionSubController extends Controller {
ctx.success(ret);
}
// 用户搜索历史
async getUserSearch() {
const { ctx, service } = this;
const ret = await service.course.institutionSub.getUserSearch();
ctx.success(ret);
}
// 获取热搜
async getHotSearch() {
const { ctx, service } = this;
const ret = await service.course.institutionSub.getHotSearch();
ctx.success(ret);
}
// 删除用户搜索历史
async deleteUserSearch() {
const { ctx, service } = this;
await service.course.institutionSub.deleteUserSearch();
ctx.success();
}
// 评论列表
async getComments() {
const { ctx, service } = this;
const inputParams = ctx.request.query;
const ret = await service.course.institutionSub.getComments(inputParams);
ctx.success(ret);
}
}
module.exports = InstitutionSubController;
'use strict';
const moment = require('moment');
module.exports = app => {
const { STRING, INTEGER, DATE, ENUM } = app.Sequelize;
const CourseComment = app.classModel.define('course_comment', {
id: {
type: INTEGER,
primaryKey: true,
autoIncrement: true,
},
institution_id: INTEGER,
user_uuid: STRING,
nickname: STRING,
avatar: STRING,
content: STRING,
has_image: INTEGER,
status: ENUM('offline', 'online'),
is_deleted: INTEGER,
created_time: {
type: DATE,
allowNull: true,
get() {
const date = this.getDataValue('created_time');
return date ? moment(date).format('YYYY-MM-DD HH:mm:ss') : undefined;
},
},
updated_time: {
type: DATE,
allowNull: true,
get() {
const date = this.getDataValue('updated_time');
return date ? moment(date).format('YYYY-MM-DD HH:mm:ss') : undefined;
},
},
}, {
timestamps: false,
tableName: 'course_comment',
});
return CourseComment;
};
'use strict';
const moment = require('moment');
module.exports = app => {
const { STRING, INTEGER, DATE, ENUM } = app.Sequelize;
const CourseUserSearch = app.classModel.define('course_user_search', {
id: {
type: INTEGER,
primaryKey: true,
autoIncrement: true,
},
user_uuid: STRING,
content: STRING,
status: ENUM('offline', 'online'),
created_time: {
type: DATE,
allowNull: true,
get() {
const date = this.getDataValue('created_time');
return date ? moment(date).format('YYYY-MM-DD HH:mm:ss') : undefined;
},
},
updated_time: {
type: DATE,
allowNull: true,
get() {
const date = this.getDataValue('updated_time');
return date ? moment(date).format('YYYY-MM-DD HH:mm:ss') : undefined;
},
},
}, {
timestamps: false,
tableName: 'course_user_search',
});
return CourseUserSearch;
};
......@@ -38,7 +38,6 @@ module.exports = app => {
router.get('third', '/sub/options', 'course.optionSub.getOptions');// 筛选项
router.get('third', '/sub/banners', 'course.optionSub.getBanners');// banner
router.post('third', '/sub/address', miniAuth, 'course.location.getAddress');// 根据经纬度或ip获取地理位置信息
router.get('third', '/sub/search', miniAuth, 'course.institutionSub.search');// 搜搜
router.get('third', '/sub/institutions', miniAuth, 'course.institutionSub.institutionList');// 机构列表
router.get('third', '/sub/institution/:institution_id', miniAuth, 'course.institutionSub.institutionInfo');// 机构详情
router.post('third', '/sub/classes', miniAuth, 'course.institution.classList');// 课程列表
......@@ -63,5 +62,9 @@ module.exports = app => {
router.post('third', '/sub/wechat/callbackAction', 'course.wechat.callbackAction');
router.post('third', '/sub/wechat/test', 'course.wechat.test');
router.get('third', '/sub/comments', miniAuth, 'course.institutionSub.getComments');// 评论列表
router.get('third', '/sub/search/hot', miniAuth, 'course.institutionSub.getHotSearch');// 热搜
router.get('third', '/sub/search', miniAuth, 'course.institutionSub.search');// 搜索
router.get('third', '/sub/user/search', miniAuth, 'course.institutionSub.getUserSearch');// 用户搜索历史
router.delete('third', '/sub/user/search', miniAuth, 'course.institutionSub.deleteUserSearch');//清空用户搜索记录
};
......@@ -51,7 +51,7 @@ class InstitutionSubService extends Service {
// 获取机构详情
async getInstitution(input) {
const { ctx } = this;
const userUUID = ctx.userUUID;
const userUuid = ctx.userUuid;
const { institution_id } = input;
const lat = ctx.isEmpty(input.lat) ? 0 : input.lat;
const lng = ctx.isEmpty(input.lng) ? 0 : input.lng;
......@@ -125,7 +125,7 @@ class InstitutionSubService extends Service {
areas = _.orderBy(areas, [ 'distance' ], [ 'asc' ]);
// 是否已收藏
const userCollect = await ctx.classModel.CourseUserCollection.findOne({ where: { institution_id, user_uuid: userUUID, is_deleted: 0 } });
const userCollect = await ctx.classModel.CourseUserCollection.findOne({ where: { institution_id, user_uuid: userUuid, is_deleted: 0 } });
institution.phone = areas.length > 0 ? areas[0].phone : '';
institution.distance = areas.length > 0 ? areas[0].distance : '';
......@@ -173,14 +173,14 @@ class InstitutionSubService extends Service {
// 机构列表
async getInstitutions(input) {
const { ctx } = this;
const userUUID = ctx.userUUID;
const userUuid = ctx.userUuid;
const { cat_id, age, address } = input;
const lat = ctx.isEmpty(input.lat) ? 0 : input.lat;
const lng = ctx.isEmpty(input.lng) ? 0 : input.lng;
// 保存定位记录
if (address && lat && lng) {
ctx.classModel.CourseLogUserGps.created({ user_uuid: userUUID, address, lat, lng, created_time: moment().format('YYYY-MM-DD HH:mm:ss') });
ctx.classModel.CourseLogUserGps.created({ user_uuid: userUuid, address, lat, lng, created_time: moment().format('YYYY-MM-DD HH:mm:ss') });
}
let institutionList = [];
......@@ -214,7 +214,7 @@ class InstitutionSubService extends Service {
// 格式化机构列表
async formatInstitutionList(institutionList, input) {
const { ctx, service } = this;
const userUUID = ctx.userUUID;
const userUuid = ctx.userUuid;
const distance = Number(input.distance) || 0;
const page = Number(input.page) || 1;
const limit = Number(input.limit) || 10;
......@@ -285,7 +285,7 @@ class InstitutionSubService extends Service {
institutionCats = await ctx.classModel.CourseInstitutionToCat.findAll({ where: { status: 'online', is_deleted: 0, institution_id: { $in: institutionIds } } });
// 用户已收藏机构列表
const userInstitutions = await ctx.classModel.CourseUserCollection.findAll({ where: { is_deleted: 0, user_uuid: userUUID } });
const userInstitutions = await ctx.classModel.CourseUserCollection.findAll({ where: { is_deleted: 0, user_uuid: userUuid } });
const userInstitutionIds = R.pluck('id', userInstitutions);
// 机构图片及格式化
......@@ -332,6 +332,7 @@ class InstitutionSubService extends Service {
async search(input) {
const { ctx } = this;
const { cat_id, age, search } = input;
const userUuid = ctx.userUuid;
// 保存搜索记录
if (search) {
......@@ -339,8 +340,10 @@ class InstitutionSubService extends Service {
if (searchInfo) {
await ctx.classModel.CourseSearch.update({ count: searchInfo.count + 1 }, { where: { id: searchInfo.id } });
} else {
ctx.classModel.CourseSearch.create({ content: search, sort: 0, count: 1, is_hot: 0, status: 'online', is_deleted: 0, created_time: moment().format('YYYY-MM-DD HH:mm:ss'), updated_time: moment().format('YYYY-MM-DD HH:mm:ss') });
await ctx.classModel.CourseSearch.create({ content: search, sort: 0, count: 1, is_hot: 0, status: 'online', is_deleted: 0, created_time: moment().format('YYYY-MM-DD HH:mm:ss'), updated_time: moment().format('YYYY-MM-DD HH:mm:ss') });
}
await ctx.classModel.CourseUserSearch.create({ user_uuid: userUuid, content: search, status: 'online', created_time: moment().format('YYYY-MM-DD HH:mm:ss'), updated_time: moment().format('YYYY-MM-DD HH:mm:ss') });
}
let institutionList = [];
......@@ -387,6 +390,101 @@ class InstitutionSubService extends Service {
const ret = await this.formatInstitutionList(institutionList, input);
return ret;
}
// 获取热搜
async getHotSearch() {
const { ctx } = this;
const search = await ctx.classModel.CourseSearch.findAll({ where: { status: 'online', is_deleted: 0, is_hot: 1 }, order: [[ 'sort', 'asc' ]] });
const ret = {
results: R.pluck('content', search),
count: search.length,
};
return ret;
}
// 获取用户搜索历史
async getUserSearch() {
const { ctx } = this;
const userUuid = ctx.userUuid;
const search = await ctx.classModel.CourseUserSearch.findAll({ where: { status: 'online', user_uuid: userUuid } });
const ret = {
results: R.pluck('content', search),
count: search.length,
};
return ret;
}
// 删除用户搜索历史
async deleteUserSearch() {
const { ctx } = this;
const userUuid = ctx.userUuid;
await ctx.classModel.CourseUserSearch.update({ status: 'offline' }, { where: { user_uuid: userUuid, status: 'online' } });
return;
}
// 评论列表
async getComments(input) {
const { ctx } = this;
const page = Number(input.page) || 1;
const limit = Number(input.limit) || 10;
const offset = (page - 1) * limit;
const institution_id = Number(input.institution_id) || 0;
const comments = await ctx.classModel.CourseComment.findAndCountAll({ where: { institution_id, status: 'online', is_deleted: 0 }, offset, limit, order: [[ 'id', 'desc' ]] });
comments.rows = R.pluck('dataValues', comments.rows);
const ret = {
results: await this.formatComments(comments.rows),
count: comments.count,
};
return ret;
}
// 格式化评论列表
async formatComments(comments) {
const { ctx } = this;
if (ctx.isEmpty(comments)) {
return [];
}
const ids = R.pluck('id', comments);
const images = await ctx.classModel.CourseImages.findALl({ where: { type: 3, type_id: { $in: ids }, status: 'online', is_deleted: 0 } });
const ret = [];
for (const v of comments) {
// 评论图片
let commentImages = [];
for (const j of images) {
if (j.type_id === v.id) {
commentImages.push(j);
}
}
commentImages = _.orderBy(commentImages, [ 'sort' ], [ 'asc' ]);
ret.push({
id: v.id,
institution_id: v.institution_id,
user_uuid: v.user_uuid,
nickname: v.nickname,
avatar: v.avatar,
content: v.content,
has_image: v.has_image,
images: commentImages,
created_time: v.created_time,
});
}
return ret;
}
}
module.exports = InstitutionSubService;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment