Commit ec30c513 authored by 李尚科's avatar 李尚科
parents 5edc7155 b5762670
'use strict';
const Controller = require('egg').Controller;
class InstitutionController extends Controller {
//机构列表
async getInstitutions() {
const { ctx } = this;
const inputParams = ctx.request.query;
const ret = await ctx.service.course.v2.institution.getInstitutions(inputParams);
ctx.success(ret);
}
//机构详情
async getInstitution() {
const { ctx } = this;
let inputParams = ctx.params;
const query = ctx.query;
inputParams = Object.assign(inputParams, query);
const result = await ctx.service.course.v2.institution.getInstitution(inputParams);
ctx.success({ result });
}
//课程列表
async getClasses() {
const { ctx } = this;
const inputParams = ctx.request.query;
const ret = await ctx.service.course.v2.institution.getClasses(inputParams);
ctx.success(ret);
}
//课程详情
async getClass() {
const { ctx } = this;
const class_id = ctx.params.class_id;
if (!class_id) {
ctx.failed('error class_id');
}
const ret = await ctx.service.course.v2.institution.getClass(class_id);
ctx.success(ret);
}
// 老师列表
async getTeachers() {
const { ctx } = this;
const inputParams = ctx.request.query;
if (ctx.isEmpty(inputParams.institution_id)) {
ctx.failed('institution_id is empty');
}
const ret = await ctx.service.course.v2.institution.getTeachers(inputParams);
ctx.success(ret);
}
// 老师详情
async getTeacher() {
const { ctx } = this;
const teacher_id = ctx.params.teacher_id;
if (!teacher_id) {
ctx.failed('error teacher_id');
}
const ret = await ctx.service.course.v2.institution.getTeacher(teacher_id);
ctx.success(ret);
}
// 获取分类
async getCats() {
const { ctx } = this;
const ret = await ctx.service.course.v2.institution.getCats();
ctx.success(ret);
}
// 搜索
async search() {
const { ctx } = this;
const inputParams = ctx.request.query;
const ret = await ctx.service.course.v2.institution.search(inputParams);
ctx.success(ret);
}
// 用户搜索历史
async getUserSearch() {
const { ctx, service } = this;
const ret = await service.course.v2.institution.getUserSearch();
ctx.success(ret);
}
// 获取热搜
async getHotSearch() {
const { ctx, service } = this;
const ret = await service.course.v2.institution.getHotSearch();
ctx.success(ret);
}
// 删除用户搜索历史
async deleteUserSearch() {
const { ctx, service } = this;
await service.course.v2.institution.deleteUserSearch();
ctx.success();
}
// 评论列表
async getComments() {
const { ctx, service } = this;
const inputParams = ctx.request.query;
const ret = await service.course.v2.institution.getComments(inputParams);
ctx.success(ret);
}
// 搜索联想
async getSuggestSearch() {
const { ctx, service } = this;
const inputParams = ctx.request.query;
const ret = await service.course.v2.institution.getSuggestSearch(inputParams);
ctx.success(ret);
}
//用户收藏机构列表
async getUserCollectedInstitutions() {
const { ctx, service } = this;
const inputParams = ctx.request.query;
const ret = await service.course.v2.institution.getUserCollectedInstitutions(inputParams);
ctx.success(ret);
}
}
module.exports = InstitutionController;
'use strict';
const Controller = require('egg').Controller;
class LocationController extends Controller {
/**
* 筛选项
*/
async getAddress() {
const { ctx } = this;
let { lat, lng } = ctx.request.body;
let address = '';
if (lat && lng) {
const location_ret = await ctx.service.course.v2.lbs.getLBSLocation({ lat, lng });
const loaction = location_ret.result;
if (loaction.formatted_addresses && loaction.formatted_addresses.recommend) {
address = loaction.formatted_addresses.recommend;
lat = loaction.location.lat;
lng = loaction.location.lng;
}
}
if (!address) {
const ip_ret = await ctx.service.course.v2.lbs.getLBSIp();
const ip = ip_ret.result;
if (ip.location && ip.ad_info) {
const city = ip.ad_info.city ? ip.ad_info.city : '';
const district = ip.ad_info.district ? ip.ad_info.district : '';
address = ip.ad_info.province + city + district;
lat = ip.location.lat;
lng = ip.location.lng;
}
}
if (!address) {
address = '获取地理位置信息失败';
}
ctx.success({ result: { address, lat, lng } });
}
}
module.exports = LocationController;
'use strict';
const Controller = require('egg').Controller;
class OptionController extends Controller {
/**
* 筛选项
*/
async getOptions() {
const { ctx } = this;
const results = await ctx.service.course.v2.option.getOptions();
ctx.success({ results });
}
async getBanners() {
const { ctx, service } = this;
const inputParams = ctx.request.query;
if (ctx.isEmpty(inputParams.alias)) {
ctx.failed('alias is empty');
}
const ret = await service.course.v2.option.getBanners(inputParams.alias);
ctx.success(ret);
}
}
module.exports = OptionController;
'use strict';
const Controller = require('egg').Controller;
const uuidv4 = require('uuid/v4');
class UserController extends Controller {
async auth() {
const { ctx, app } = this;
const code = ctx.request.body.code;
if (!code) {
ctx.failed('error code');
}
//请求微信授权 获取openid
const wx_auth_ret = await ctx.service.course.v2.user.requestWxAuth(code);
const openid = wx_auth_ret.openid;//获取openid
//检查是否已授权过 是否已入用户表
let user = await ctx.classModel.V2.CourseUser.one({ where: { openid, is_deleted: 0 } });
if (!user || !user.uuid) {
const uuid = uuidv4();
user = await ctx.classModel.V2.CourseUser.create({ uuid, openid });
// user.uuid = uuid;
}
console.info(user);
//存储缓存标识
const user_uuid = user.uuid;
const key = 'course_user_session_' + user_uuid;
await app.memcache.set(key, { user_uuid, openid }, 86400 * 180);
const auth_token = ctx.helper.md5(openid + user_uuid + 'jbwl');
ctx.set('uuid', key);
ctx.set('auth_token', auth_token);
const result = { uuid: user_uuid, auth_token };
ctx.success({ result });
}
async registerUserInfo() {
const { ctx } = this;
const uuid = ctx.userUuid;
const input_params = ctx.request.body;
const { avatar, nickname, province, country, sex, city } = input_params;
//查找用户是否存在并更新
const user = ctx.classModel.V2.CourseUser.one({ where: { uuid } });
await ctx.classModel.V2.CourseUser.edit({ params: { avatar, nickname, sex }, where: { uuid } });
let bindphone = 0;
if (user.phone) {
bindphone = 1;
}
const result = { bindphone };
ctx.success({ result });
}
/**
* 获取baby信息
*/
async getBabyInfo() {
const { ctx } = this;
const result = await ctx.service.course.v2.user.getBabyInfo();
ctx.success({ result });
}
/**
* 保存baby信息
*/
async saveBabyInfo() {
const { ctx } = this;
const input_params = ctx.request.body;
const result = await ctx.service.course.v2.user.saveBabyInfo(input_params);
ctx.success({ result });
}
/**
* 删除baby信息
*/
async delBabyInfo() {
const { ctx } = this;
const result = await ctx.service.course.v2.user.delBabyInfo();
ctx.success({ result });
}
/**
* 用户收藏机构列表
*/
async getCollectInstitutions() {
const { ctx } = this;
let input_params = ctx.request.body;
input_params = Object.assign(input_params, ctx.request.query);
const result = await ctx.service.course.v2.user.getCollectInstitutions(input_params);
ctx.success({ result });
}
/**
* 收藏机构
*/
async collectInstitution() {
const { ctx } = this;
const institution_id = ctx.request.body.institution_id;
if (!institution_id) {
ctx.failed('error institution_id');
}
const result = await ctx.service.course.v2.user.collectInstitution(institution_id);
ctx.success({ result });
}
/**
* 取消收藏机构
*/
async delCollectInstitution() {
const { ctx } = this;
const institution_id = ctx.request.body.institution_id;
if (!institution_id) {
ctx.failed('error institution_id');
}
const result = await ctx.service.course.v2.user.delCollectInstitution(institution_id);
ctx.success({ result });
}
}
module.exports = UserController;
'use strict';
const Controller = require('egg').Controller;
const crypto = require('crypto');
const fs = require('fs');
const request = require('request');
class WechatController extends Controller {
async test() {
const { ctx, service } = this;
const data = {MsgType: 'miniprogrampage'};
await service.course.v2.wechat.sendMsg(data);
ctx.success();
}
async callbackAction() {
const { ctx, service } = this;
await service.course.v2.wechat.callbackAction();
ctx.success('success');
}
async check() {
const { ctx } = this;
const params = ctx.request.query;
const {
signature,
timestamp,
nonce,
echostr,
} = params;
const array = [ '51gjj', timestamp, nonce ];
array.sort();
// 3.将三个参数字符串拼接成一个字符串进行sha1加密
const tempStr = array.join('');
const hashCode = crypto.createHash('sha1'); // 创建加密类型
const resultCode = hashCode.update(tempStr, 'utf8').digest('hex');
console.log(resultCode);
// 4.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if (resultCode === signature) {
ctx.success(echostr);
} else {
ctx.success();
}
}
}
module.exports = WechatController;
...@@ -6,7 +6,7 @@ const moment = require('moment'); ...@@ -6,7 +6,7 @@ const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM, FLOAT } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM, FLOAT } = app.Sequelize;
const CourseArea = app.classModel.define('course_area', { const CourseArea = app.classModel.define('course_old_area', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
...@@ -30,7 +30,7 @@ module.exports = app => { ...@@ -30,7 +30,7 @@ module.exports = app => {
} }
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_area', tableName: 'course_old_area',
}); });
CourseArea.one = async (data) => { CourseArea.one = async (data) => {
......
...@@ -6,7 +6,7 @@ const moment = require('moment'); ...@@ -6,7 +6,7 @@ const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize;
const CourseCat = app.classModel.define('course_cat', { const CourseCat = app.classModel.define('course_old_cat', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
...@@ -39,7 +39,7 @@ module.exports = app => { ...@@ -39,7 +39,7 @@ module.exports = app => {
}, },
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_cat', tableName: 'course_old_cat',
}); });
CourseCat.one = async data => { CourseCat.one = async data => {
......
...@@ -5,7 +5,7 @@ const moment = require('moment'); ...@@ -5,7 +5,7 @@ const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize;
const CourseClass = app.classModel.define('course_class', { const CourseClass = app.classModel.define('course_old_class', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
...@@ -37,7 +37,7 @@ module.exports = app => { ...@@ -37,7 +37,7 @@ module.exports = app => {
} }
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_class', tableName: 'course_old_class',
}); });
CourseClass.one = async (data) => { CourseClass.one = async (data) => {
......
...@@ -7,7 +7,7 @@ module.exports = app => { ...@@ -7,7 +7,7 @@ module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize;
const CourseImages = app.classModel.define('course_images', { const CourseImages = app.classModel.define('course_old_images', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
...@@ -30,7 +30,7 @@ module.exports = app => { ...@@ -30,7 +30,7 @@ module.exports = app => {
}, },
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_images', tableName: 'course_old_images',
}); });
CourseImages.one = async data => { CourseImages.one = async data => {
......
...@@ -9,7 +9,7 @@ module.exports = app => { ...@@ -9,7 +9,7 @@ module.exports = app => {
const CourseArea = app.classModel.define('course_area'); const CourseArea = app.classModel.define('course_area');
const CourseInstitution = app.classModel.define('course_institution', { const CourseInstitution = app.classModel.define('course_old_institution', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
...@@ -41,7 +41,7 @@ module.exports = app => { ...@@ -41,7 +41,7 @@ module.exports = app => {
}, },
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_institution', tableName: 'course_old_institution',
}); });
CourseInstitution.hasMany(CourseArea, { CourseInstitution.hasMany(CourseArea, {
......
...@@ -6,7 +6,7 @@ const moment = require('moment'); ...@@ -6,7 +6,7 @@ const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize;
const CourseInstitutionToCat = app.classModel.define('course_institution_to_cat', { const CourseInstitutionToCat = app.classModel.define('course_old_institution_to_cat', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
...@@ -34,7 +34,7 @@ module.exports = app => { ...@@ -34,7 +34,7 @@ module.exports = app => {
}, },
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_institution_to_cat', tableName: 'course_old_institution_to_cat',
}); });
CourseInstitutionToCat.one = async (data) => { CourseInstitutionToCat.one = async (data) => {
......
...@@ -6,7 +6,7 @@ const moment = require('moment'); ...@@ -6,7 +6,7 @@ const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize;
const CourseLogUserGps = app.classModel.define('course_log_user_gps', { const CourseLogUserGps = app.classModel.define('course_old_log_user_gps', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
...@@ -26,7 +26,7 @@ module.exports = app => { ...@@ -26,7 +26,7 @@ module.exports = app => {
}, },
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_log_user_gps', tableName: 'course_old_log_user_gps',
}); });
CourseLogUserGps.one = async (data) => { CourseLogUserGps.one = async (data) => {
......
...@@ -5,7 +5,7 @@ const moment = require('moment'); ...@@ -5,7 +5,7 @@ const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize;
const CourseTeacher = app.classModel.define('course_teacher', { const CourseTeacher = app.classModel.define('course_old_teacher', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
...@@ -35,7 +35,7 @@ module.exports = app => { ...@@ -35,7 +35,7 @@ module.exports = app => {
} }
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_teacher', tableName: 'course_old_teacher',
}); });
CourseTeacher.one = async (data) => { CourseTeacher.one = async (data) => {
......
...@@ -6,7 +6,7 @@ const moment = require('moment'); ...@@ -6,7 +6,7 @@ const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize;
const CourseUser = app.classModel.define('course_user', { const CourseUser = app.classModel.define('course_old_user', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
...@@ -41,7 +41,7 @@ module.exports = app => { ...@@ -41,7 +41,7 @@ module.exports = app => {
}, },
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_user', tableName: 'course_old_user',
}); });
CourseUser.one = async data => { CourseUser.one = async data => {
......
...@@ -6,7 +6,7 @@ const moment = require('moment'); ...@@ -6,7 +6,7 @@ const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize;
const CourseUserBaby = app.classModel.define('course_user_baby', { const CourseUserBaby = app.classModel.define('course_old_user_baby', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
...@@ -37,7 +37,7 @@ module.exports = app => { ...@@ -37,7 +37,7 @@ module.exports = app => {
}, },
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_user_baby', tableName: 'course_old_user_baby',
}); });
CourseUserBaby.one = async data => { CourseUserBaby.one = async data => {
......
...@@ -6,7 +6,7 @@ const moment = require('moment'); ...@@ -6,7 +6,7 @@ const moment = require('moment');
module.exports = app => { module.exports = app => {
const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize; const { STRING, INTEGER, DATE, DECIMAL, TEXT, ENUM } = app.Sequelize;
const CourseUserCollection = app.classModel.define('course_user_collection', { const CourseUserCollection = app.classModel.define('course_old_user_collection', {
id: { id: {
type: INTEGER, type: INTEGER,
primaryKey: true, primaryKey: true,
...@@ -33,7 +33,7 @@ module.exports = app => { ...@@ -33,7 +33,7 @@ module.exports = app => {
}, },
}, { }, {
timestamps: false, timestamps: false,
tableName: 'course_user_collection', tableName: 'course_old_user_collection',
}); });
CourseUserCollection.one = async (data) => { CourseUserCollection.one = async (data) => {
......
...@@ -33,38 +33,5 @@ module.exports = app => { ...@@ -33,38 +33,5 @@ module.exports = app => {
router.post('third', '/wechat/test', 'course.wechat.test'); router.post('third', '/wechat/test', 'course.wechat.test');
// 版本二
router.get('third', '/sub/cats', 'course.institutionSub.getCats');// 分类
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/institutions', miniAuth, 'course.institutionSub.getInstitutions');// 机构列表
router.get('third', '/sub/institution/:institution_id', miniAuth, 'course.institutionSub.getInstitution');// 机构详情
router.get('third', '/sub/classes', miniAuth, 'course.institutionSub.getClasses');// 课程列表
router.get('third', '/sub/class/:class_id', miniAuth, 'course.institutionSub.getClass');// 课程详情
router.get('third', '/sub/teachers', miniAuth, 'course.institutionSub.getTeachers');// 老师列表
router.get('third', '/sub/teacher/:teacher_id', miniAuth, 'course.institutionSub.getTeacher');// 老师详情
router.post('third', '/sub/user/auth', 'course.user.auth');// 微信授权登录
router.post('third', '/sub/user/register_user', miniAuth, 'course.user.registerUserInfo');// 授权后注册用户
router.get('third', '/sub/user/baby', miniAuth, 'course.user.getBabyInfo');// 获取baby信息
router.post('third', '/sub/user/baby', miniAuth, 'course.user.saveBabyInfo');// 保存baby信息
router.delete('third', '/sub/user/baby', miniAuth, 'course.user.delBabyInfo');// 删除baby信息
router.get('third', '/sub/user/collection/institution', miniAuth, 'course.institutionSub.getUserCollectedInstitutions');// 收藏的机构列表
router.post('third', '/sub/user/collection/institution', miniAuth, 'course.user.collectInstitution');// 收藏机构
router.delete('third', '/sub/user/collection/institution', miniAuth, 'course.user.delCollectInstitution');// 取消收藏机构
router.get('third', '/sub/wechat/callbackAction', 'course.wechat.check');
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/suggest', miniAuth, 'course.institutionSub.getSuggestSearch');//搜索联想
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');//清空用户搜索记录
}; };
'use strict';
module.exports = app => {
const router = app.router.namespace(app.config.projectRootPath + '/course/v2');
const loginAuth = app.middleware.loginAuth({ type: 'new' });// 登录中间件
const miniAuth = app.middleware.miniAuth();// 因为不跟现有的用户中心系统,所以使用单独的登录中间件
// 版本二
router.get('third', '/cats', 'course.v2.institution.getCats');// 分类
router.get('third', '/options', 'course.v2.option.getOptions');// 筛选项
router.get('third', '/banners', 'course.v2.option.getBanners');// banner
router.post('third', '/address', miniAuth, 'course.v2.location.getAddress');// 根据经纬度或ip获取地理位置信息
router.get('third', '/institutions', miniAuth, 'course.v2.institution.getInstitutions');// 机构列表
router.get('third', '/institution/:institution_id', miniAuth, 'course.v2.institution.getInstitution');// 机构详情
router.get('third', '/classes', miniAuth, 'course.v2.institution.getClasses');// 课程列表
router.get('third', '/class/:class_id', miniAuth, 'course.v2.institution.getClass');// 课程详情
router.get('third', '/teachers', miniAuth, 'course.v2.institution.getTeachers');// 老师列表
router.get('third', '/teacher/:teacher_id', miniAuth, 'course.v2.institution.getTeacher');// 老师详情
router.post('third', '/user/auth', 'course.v2.user.auth');// 微信授权登录
router.post('third', '/user/register_user', miniAuth, 'course.v2.user.registerUserInfo');// 授权后注册用户
router.get('third', '/user/baby', miniAuth, 'course.v2.user.getBabyInfo');// 获取baby信息
router.post('third', '/user/baby', miniAuth, 'course.v2.user.saveBabyInfo');// 保存baby信息
router.delete('third', '/user/baby', miniAuth, 'course.v2.user.delBabyInfo');// 删除baby信息
router.get('third', '/user/collection/institution', miniAuth, 'course.v2.institution.getUserCollectedInstitutions');// 收藏的机构列表
router.post('third', '/user/collection/institution', miniAuth, 'course.v2.user.collectInstitution');// 收藏机构
router.delete('third', '/user/collection/institution', miniAuth, 'course.v2.user.delCollectInstitution');// 取消收藏机构
router.get('third', '/wechat/callbackAction', 'course.v2.wechat.check');
router.post('third', '/wechat/callbackAction', 'course.v2.wechat.callbackAction');
router.post('third', '/wechat/test', 'course.v2.wechat.test');
router.get('third', '/comments', miniAuth, 'course.v2.institution.getComments');// 评论列表
router.get('third', '/search/hot', miniAuth, 'course.v2.institution.getHotSearch');// 热搜
router.get('third', '/search/suggest', miniAuth, 'course.v2.institution.getSuggestSearch');//搜索联想
router.get('third', '/search', miniAuth, 'course.v2.institution.search');// 搜索
router.get('third', '/user/search', miniAuth, 'course.v2.institution.getUserSearch');// 用户搜索历史
router.delete('third', '/user/search', miniAuth, 'course.v2.institution.deleteUserSearch');//清空用户搜索记录
};
...@@ -10,7 +10,7 @@ class InstitutionSubService extends Service { ...@@ -10,7 +10,7 @@ class InstitutionSubService extends Service {
async getCats() { async getCats() {
const { ctx } = this; const { ctx } = this;
const AllCats = await ctx.classModel.CourseCat.findAll({ where: { status: 1, is_deleted: 0 } }); const AllCats = await ctx.classModel.V2.CourseCat.findAll({ where: { status: 1, is_deleted: 0 } });
const rootCats = []; const rootCats = [];
let ret = []; let ret = [];
...@@ -56,14 +56,14 @@ class InstitutionSubService extends Service { ...@@ -56,14 +56,14 @@ class InstitutionSubService extends Service {
const lat = ctx.isEmpty(input.lat) ? 0 : input.lat; const lat = ctx.isEmpty(input.lat) ? 0 : input.lat;
const lng = ctx.isEmpty(input.lng) ? 0 : input.lng; const lng = ctx.isEmpty(input.lng) ? 0 : input.lng;
let institution = await ctx.classModel.CourseInstitution.findOne({ where: { id: institution_id, status: 'online', is_deleted: 0 } }); let institution = await ctx.classModel.V2.CourseInstitution.findOne({ where: { id: institution_id, status: 'online', is_deleted: 0 } });
if (ctx.isEmpty(institution)) { if (ctx.isEmpty(institution)) {
ctx.failed('机构不存在'); ctx.failed('机构不存在');
} }
institution = institution.dataValues; institution = institution.dataValues;
// 顶部相册 // 顶部相册
const images = await ctx.classModel.CourseImages.findAll({ where: { type: 1, type_id: institution_id, status: 'online', is_deleted: 0 } }); const images = await ctx.classModel.V2.CourseImages.findAll({ where: { type: 1, type_id: institution_id, status: 'online', is_deleted: 0 } });
// 去重 // 去重
const checkList = []; const checkList = [];
let album = []; let album = [];
...@@ -84,19 +84,19 @@ class InstitutionSubService extends Service { ...@@ -84,19 +84,19 @@ class InstitutionSubService extends Service {
album = R.sort(albumSort)(album); album = R.sort(albumSort)(album);
// 学习成果 // 学习成果
const student_video = await ctx.classModel.CourseStudentVideo.findAll({ where: { institution_id, status: 'online', is_deleted: 0 }, order: [[ 'sort', 'asc' ]] }); const student_video = await ctx.classModel.V2.CourseStudentVideo.findAll({ where: { institution_id, status: 'online', is_deleted: 0 }, order: [[ 'sort', 'asc' ]] });
// 教师 // 教师
const teachers = await ctx.classModel.CourseTeacher.findAll({ where: { institution_id, status: 'online', is_deleted: 0 } }); const teachers = await ctx.classModel.V2.CourseTeacher.findAll({ where: { institution_id, status: 'online', is_deleted: 0 } });
// 课程 // 课程
let classes = await ctx.classModel.CourseClass.findAll({ where: { institution_id, status: 'online', is_deleted: 0 }, row: true }); let classes = await ctx.classModel.V2.CourseClass.findAll({ where: { institution_id, status: 'online', is_deleted: 0 }, row: true });
classes = R.pluck('dataValues', classes); classes = R.pluck('dataValues', classes);
// 处理课程封面图 // 处理课程封面图
const classHandle = []; const classHandle = [];
if (classes.length > 0) { if (classes.length > 0) {
for (const v of classes) { for (const v of classes) {
classHandle.push(ctx.classModel.CourseImages.findOne({ where: { type: 2, type_id: v.id, status: 'online', is_deleted: 0, is_cover: 1 } })); classHandle.push(ctx.classModel.V2.CourseImages.findOne({ where: { type: 2, type_id: v.id, status: 'online', is_deleted: 0, is_cover: 1 } }));
} }
const classImages = await Promise.all(classHandle).then(result => { const classImages = await Promise.all(classHandle).then(result => {
return result; return result;
...@@ -110,7 +110,7 @@ class InstitutionSubService extends Service { ...@@ -110,7 +110,7 @@ class InstitutionSubService extends Service {
} }
// 校区 // 校区
let areas = await ctx.classModel.CourseArea.findAll({ where: { institution_id, status: 'online', is_deleted: 0 } }); let areas = await ctx.classModel.V2.CourseArea.findAll({ where: { institution_id, status: 'online', is_deleted: 0 } });
const areaHandle = []; const areaHandle = [];
if (areas.length > 0) { if (areas.length > 0) {
for (const v of areas) { for (const v of areas) {
...@@ -125,16 +125,16 @@ class InstitutionSubService extends Service { ...@@ -125,16 +125,16 @@ class InstitutionSubService extends Service {
areas = _.orderBy(areas, [ 'distance' ], [ 'asc' ]); 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.V2.CourseUserCollection.findOne({ where: { institution_id, user_uuid: userUuid, is_deleted: 0 } });
// 获取所有标签 // 获取所有标签
const allTags = await ctx.classModel.CourseTag.findAll({ where: { status: 'online', is_deleted: 0 } }); const allTags = await ctx.classModel.V2.CourseTag.findAll({ where: { status: 'online', is_deleted: 0 } });
const tagList = []; const tagList = [];
for (const v of allTags) { for (const v of allTags) {
tagList[v.id] = v; tagList[v.id] = v;
} }
let tags = await ctx.classModel.CourseInstitutionToTag.findAll({ where: { institution_id: institution.id, status: 'online', is_deleted: 0 } }); let tags = await ctx.classModel.V2.CourseInstitutionToTag.findAll({ where: { institution_id: institution.id, status: 'online', is_deleted: 0 } });
tags = _.orderBy(tags, [ 'sort' ], [ 'asc' ]); tags = _.orderBy(tags, [ 'sort' ], [ 'asc' ]);
institution.tags = []; institution.tags = [];
for (const v of tags) { for (const v of tags) {
...@@ -166,10 +166,10 @@ class InstitutionSubService extends Service { ...@@ -166,10 +166,10 @@ class InstitutionSubService extends Service {
return {}; return {};
} }
const distance = await service.course.lbs.getDistance({ lng: location.lng, lat: location.lat }, { lng: area.lng, lat: area.lat }); const distance = await service.course.v2.lbs.getDistance({ lng: location.lng, lat: location.lat }, { lng: area.lng, lat: area.lat });
// 暂定3公里以内步行 // 暂定3公里以内步行
area.travel_method = distance < 3000 ? 'walking' : 'driving'; area.travel_method = distance < 3000 ? 'walking' : 'driving';
const lbsResult = await service.course.lbs.getLBSDistance(area.travel_method, { lng: location.lng, lat: location.lat }, [{ lng: area.lng, lat: area.lat }]); const lbsResult = await service.course.v2.lbs.getLBSDistance(area.travel_method, { lng: location.lng, lat: location.lat }, [{ lng: area.lng, lat: area.lat }]);
if (lbsResult.results.length > 0) { if (lbsResult.results.length > 0) {
area.distance = (lbsResult.results[0].distance / 1000).toFixed(1); area.distance = (lbsResult.results[0].distance / 1000).toFixed(1);
area.duration = lbsResult.results[0].duration; area.duration = lbsResult.results[0].duration;
...@@ -194,7 +194,7 @@ class InstitutionSubService extends Service { ...@@ -194,7 +194,7 @@ class InstitutionSubService extends Service {
// 保存定位记录 // 保存定位记录
if (address && lat && lng) { if (address && lat && lng) {
ctx.classModel.CourseLogUserGps.create({ user_uuid: userUuid, address, lat, lng, created_time: moment().format('YYYY-MM-DD HH:mm:ss') }); ctx.classModel.V2.CourseLogUserGps.create({ user_uuid: userUuid, address, lat, lng, created_time: moment().format('YYYY-MM-DD HH:mm:ss') });
} }
let institutionList = []; let institutionList = [];
...@@ -208,15 +208,15 @@ class InstitutionSubService extends Service { ...@@ -208,15 +208,15 @@ class InstitutionSubService extends Service {
// 分类筛选 // 分类筛选
if (Number(cat_id) > 0) { if (Number(cat_id) > 0) {
// 如果是一级分类,则需要加入该分类下所有子分类 // 如果是一级分类,则需要加入该分类下所有子分类
const cats = await ctx.classModel.CourseCat.findAll({ where: { parent_id: cat_id, status: 'online', is_deleted: 0 } }); const cats = await ctx.classModel.V2.CourseCat.findAll({ where: { parent_id: cat_id, status: 'online', is_deleted: 0 } });
const catIds = R.pluck('id', cats); const catIds = R.pluck('id', cats);
catIds.push(Number(cat_id)); catIds.push(Number(cat_id));
institutionCats = await ctx.classModel.CourseInstitutionToCat.findAll({ where: { status: 'online', is_deleted: 0, cat_id: { $in: catIds } } }); institutionCats = await ctx.classModel.V2.CourseInstitutionToCat.findAll({ where: { status: 'online', is_deleted: 0, cat_id: { $in: catIds } } });
const institutionIds = R.pluck('institution_id', institutionCats); const institutionIds = R.pluck('institution_id', institutionCats);
filter.where.id = { $in: institutionIds }; filter.where.id = { $in: institutionIds };
} }
institutionList = await ctx.classModel.CourseInstitution.findAll(filter); institutionList = await ctx.classModel.V2.CourseInstitution.findAll(filter);
institutionList = R.pluck('dataValues', institutionList); institutionList = R.pluck('dataValues', institutionList);
...@@ -238,12 +238,12 @@ class InstitutionSubService extends Service { ...@@ -238,12 +238,12 @@ class InstitutionSubService extends Service {
let institutionIds = R.pluck('id', institutionList); let institutionIds = R.pluck('id', institutionList);
// 获取机构对应的校区 // 获取机构对应的校区
const areaList = await ctx.classModel.CourseArea.findAll({ where: { status: 'online', is_deleted: 0, institution_id: { $in: institutionIds } } }); const areaList = await ctx.classModel.V2.CourseArea.findAll({ where: { status: 'online', is_deleted: 0, institution_id: { $in: institutionIds } } });
// 计算校区对应的距离 // 计算校区对应的距离
const areaHandle = []; const areaHandle = [];
for (const v of areaList) { for (const v of areaList) {
areaHandle.push(service.course.lbs.getDistance({ lat, lng }, { lat: v.lat, lng: v.lng })); areaHandle.push(service.course.v2.lbs.getDistance({ lat, lng }, { lat: v.lat, lng: v.lng }));
} }
const areaDistanceCalcResult = await Promise.all(areaHandle).then(result => { const areaDistanceCalcResult = await Promise.all(areaHandle).then(result => {
return result; return result;
...@@ -291,22 +291,22 @@ class InstitutionSubService extends Service { ...@@ -291,22 +291,22 @@ class InstitutionSubService extends Service {
// 获取所有分类 // 获取所有分类
const allCats = await ctx.classModel.CourseCat.findAll({ where: { status: 'online', is_deleted: 0 } }); const allCats = await ctx.classModel.V2.CourseCat.findAll({ where: { status: 'online', is_deleted: 0 } });
const catList = []; const catList = [];
for (const v of allCats) { for (const v of allCats) {
catList[v.id] = v; catList[v.id] = v;
} }
institutionCats = await ctx.classModel.CourseInstitutionToCat.findAll({ where: { status: 'online', is_deleted: 0, institution_id: { $in: institutionIds } } }); institutionCats = await ctx.classModel.V2.CourseInstitutionToCat.findAll({ where: { status: 'online', is_deleted: 0, institution_id: { $in: institutionIds } } });
// 获取所有标签 // 获取所有标签
const allTags = await ctx.classModel.CourseTag.findAll({ where: { status: 'online', is_deleted: 0 } }); const allTags = await ctx.classModel.V2.CourseTag.findAll({ where: { status: 'online', is_deleted: 0 } });
const tagList = []; const tagList = [];
for (const v of allTags) { for (const v of allTags) {
tagList[v.id] = v; tagList[v.id] = v;
} }
// 用户已收藏机构列表 // 用户已收藏机构列表
const userInstitutions = await ctx.classModel.CourseUserCollection.findAll({ where: { is_deleted: 0, user_uuid: userUuid } }); const userInstitutions = await ctx.classModel.V2.CourseUserCollection.findAll({ where: { is_deleted: 0, user_uuid: userUuid } });
const userInstitutionIds = R.pluck('institution_id', userInstitutions); const userInstitutionIds = R.pluck('institution_id', userInstitutions);
// 机构图片及格式化 // 机构图片及格式化
...@@ -330,7 +330,7 @@ class InstitutionSubService extends Service { ...@@ -330,7 +330,7 @@ class InstitutionSubService extends Service {
} }
// 标签 // 标签
let tags = await ctx.classModel.CourseInstitutionToTag.findAll({ where: { institution_id: institutionList[i].id, status: 'online', is_deleted: 0 } }); let tags = await ctx.classModel.V2.CourseInstitutionToTag.findAll({ where: { institution_id: institutionList[i].id, status: 'online', is_deleted: 0 } });
tags = _.orderBy(tags, [ 'sort' ], [ 'asc' ]); tags = _.orderBy(tags, [ 'sort' ], [ 'asc' ]);
institutionList[i].tags = []; institutionList[i].tags = [];
for (const v of tags) { for (const v of tags) {
...@@ -338,9 +338,9 @@ class InstitutionSubService extends Service { ...@@ -338,9 +338,9 @@ class InstitutionSubService extends Service {
} }
// 优先获取机构详情图 // 优先获取机构详情图
let institutionImages = await ctx.classModel.CourseImages.findAll({ where: { type: 1, type_id: institutionList[i].id, status: 'online', is_deleted: 0 }, order: [[ 'sort', 'asc' ]], limit: 3 }); let institutionImages = await ctx.classModel.V2.CourseImages.findAll({ where: { type: 1, type_id: institutionList[i].id, status: 'online', is_deleted: 0 }, order: [[ 'sort', 'asc' ]], limit: 3 });
if (institutionImages.length < 3) { if (institutionImages.length < 3) {
const defaultImages = await ctx.classModel.CourseImages.findAll({ where: { type: 4, type_id: { $in: cats }, status: 'online', is_deleted: 0 }, limit: 3 - institutionImages.length }); const defaultImages = await ctx.classModel.V2.CourseImages.findAll({ where: { type: 4, type_id: { $in: cats }, status: 'online', is_deleted: 0 }, limit: 3 - institutionImages.length });
institutionImages = institutionImages.concat(defaultImages); institutionImages = institutionImages.concat(defaultImages);
} }
institutionList[i].images = institutionImages; institutionList[i].images = institutionImages;
...@@ -365,14 +365,14 @@ class InstitutionSubService extends Service { ...@@ -365,14 +365,14 @@ class InstitutionSubService extends Service {
// 保存搜索记录 // 保存搜索记录
if (search) { if (search) {
const searchInfo = await ctx.classModel.CourseSearch.findOne({ where: { content: search, is_deleted: 0 } }); const searchInfo = await ctx.classModel.V2.CourseSearch.findOne({ where: { content: search, is_deleted: 0 } });
if (searchInfo) { if (searchInfo) {
await ctx.classModel.CourseSearch.update({ count: searchInfo.count + 1 }, { where: { id: searchInfo.id } }); await ctx.classModel.V2.CourseSearch.update({ count: searchInfo.count + 1 }, { where: { id: searchInfo.id } });
} else { } else {
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.V2.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') }); await ctx.classModel.V2.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 = []; let institutionList = [];
...@@ -389,10 +389,10 @@ class InstitutionSubService extends Service { ...@@ -389,10 +389,10 @@ class InstitutionSubService extends Service {
// 分类筛选 // 分类筛选
if (Number(cat_id) > 0) { if (Number(cat_id) > 0) {
// 如果是一级分类,则需要加入该分类下所有子分类 // 如果是一级分类,则需要加入该分类下所有子分类
const cats = await ctx.classModel.CourseCat.findAll({ where: { parent_id: cat_id, status: 'online', is_deleted: 0 } }); const cats = await ctx.classModel.V2.CourseCat.findAll({ where: { parent_id: cat_id, status: 'online', is_deleted: 0 } });
const catIds = R.pluck('id', cats); const catIds = R.pluck('id', cats);
catIds.push(Number(cat_id)); catIds.push(Number(cat_id));
institutionCats = await ctx.classModel.CourseInstitutionToCat.findAll({ where: { status: 'online', is_deleted: 0, cat_id: { $in: catIds } } }); institutionCats = await ctx.classModel.V2.CourseInstitutionToCat.findAll({ where: { status: 'online', is_deleted: 0, cat_id: { $in: catIds } } });
institutionIds = R.pluck('institution_id', institutionCats); institutionIds = R.pluck('institution_id', institutionCats);
} }
...@@ -402,16 +402,16 @@ class InstitutionSubService extends Service { ...@@ -402,16 +402,16 @@ class InstitutionSubService extends Service {
} }
const institutionFilter = filter; const institutionFilter = filter;
institutionFilter.where.name = { $like: '%' + search + '%' }; institutionFilter.where.name = { $like: '%' + search + '%' };
institutionList = await ctx.classModel.CourseInstitution.findAll(institutionFilter); institutionList = await ctx.classModel.V2.CourseInstitution.findAll(institutionFilter);
const ids = R.pluck('id', institutionList); const ids = R.pluck('id', institutionList);
// 课程搜索 // 课程搜索
const classList = await ctx.classModel.CourseClass.findAll(classFilter); const classList = await ctx.classModel.V2.CourseClass.findAll(classFilter);
// 去除已经搜到的机构 // 去除已经搜到的机构
const classInstitutionIds = _.difference(R.pluck('institution_id', classList), ids); const classInstitutionIds = _.difference(R.pluck('institution_id', classList), ids);
if (classInstitutionIds.length > 0) { if (classInstitutionIds.length > 0) {
filter.where.id = { $in: classInstitutionIds }; filter.where.id = { $in: classInstitutionIds };
const classInstitutionList = await ctx.classModel.CourseInstitution.findAll(filter); const classInstitutionList = await ctx.classModel.V2.CourseInstitution.findAll(filter);
institutionList = institutionList.concat(classInstitutionList); institutionList = institutionList.concat(classInstitutionList);
} }
...@@ -424,7 +424,7 @@ class InstitutionSubService extends Service { ...@@ -424,7 +424,7 @@ class InstitutionSubService extends Service {
// 获取热搜 // 获取热搜
async getHotSearch() { async getHotSearch() {
const { ctx } = this; const { ctx } = this;
const search = await ctx.classModel.CourseSearch.findAll({ where: { status: 'online', is_deleted: 0, is_hot: 1 }, order: [[ 'sort', 'asc' ]] }); const search = await ctx.classModel.V2.CourseSearch.findAll({ where: { status: 'online', is_deleted: 0, is_hot: 1 }, order: [[ 'sort', 'asc' ]] });
const ret = { const ret = {
results: R.pluck('content', search), results: R.pluck('content', search),
...@@ -439,7 +439,7 @@ class InstitutionSubService extends Service { ...@@ -439,7 +439,7 @@ class InstitutionSubService extends Service {
async getUserSearch() { async getUserSearch() {
const { ctx } = this; const { ctx } = this;
const userUuid = ctx.userUuid; const userUuid = ctx.userUuid;
const search = await ctx.classModel.CourseUserSearch.findAll({ where: { status: 'online', user_uuid: userUuid } }); const search = await ctx.classModel.V2.CourseUserSearch.findAll({ where: { status: 'online', user_uuid: userUuid } });
const ret = { const ret = {
results: R.pluck('content', search), results: R.pluck('content', search),
...@@ -454,7 +454,7 @@ class InstitutionSubService extends Service { ...@@ -454,7 +454,7 @@ class InstitutionSubService extends Service {
async deleteUserSearch() { async deleteUserSearch() {
const { ctx } = this; const { ctx } = this;
const userUuid = ctx.userUuid; const userUuid = ctx.userUuid;
await ctx.classModel.CourseUserSearch.update({ status: 'offline' }, { where: { user_uuid: userUuid, status: 'online' } }); await ctx.classModel.V2.CourseUserSearch.update({ status: 'offline' }, { where: { user_uuid: userUuid, status: 'online' } });
return; return;
} }
...@@ -467,7 +467,7 @@ class InstitutionSubService extends Service { ...@@ -467,7 +467,7 @@ class InstitutionSubService extends Service {
const offset = (page - 1) * limit; const offset = (page - 1) * limit;
const institution_id = Number(input.institution_id) || 0; 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' ]] }); const comments = await ctx.classModel.V2.CourseComment.findAndCountAll({ where: { institution_id, status: 'online', is_deleted: 0 }, offset, limit, order: [[ 'id', 'desc' ]] });
comments.rows = R.pluck('dataValues', comments.rows); comments.rows = R.pluck('dataValues', comments.rows);
const ret = { const ret = {
...@@ -486,7 +486,7 @@ class InstitutionSubService extends Service { ...@@ -486,7 +486,7 @@ class InstitutionSubService extends Service {
} }
const ids = R.pluck('id', comments); 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 images = await ctx.classModel.V2.CourseImages.findAll({ where: { type: 3, type_id: { $in: ids }, status: 'online', is_deleted: 0 } });
const ret = []; const ret = [];
for (const v of comments) { for (const v of comments) {
...@@ -522,7 +522,7 @@ class InstitutionSubService extends Service { ...@@ -522,7 +522,7 @@ class InstitutionSubService extends Service {
const { search } = input; const { search } = input;
let results = []; let results = [];
if (!ctx.isEmpty(search)) { if (!ctx.isEmpty(search)) {
const institutions = await ctx.classModel.CourseInstitution.findAll({ where: { status: 'online', is_deleted: 0, name: { $like: '%' + search + '%' } }, limit: 10, attributes: [ 'id', 'name', 'status', 'is_deleted' ] }); const institutions = await ctx.classModel.V2.CourseInstitution.findAll({ where: { status: 'online', is_deleted: 0, name: { $like: '%' + search + '%' } }, limit: 10, attributes: [ 'id', 'name', 'status', 'is_deleted' ] });
results = R.pluck('name', institutions); results = R.pluck('name', institutions);
} }
...@@ -538,7 +538,7 @@ class InstitutionSubService extends Service { ...@@ -538,7 +538,7 @@ class InstitutionSubService extends Service {
// 教师详情 // 教师详情
async getTeacher(id) { async getTeacher(id) {
const { ctx } = this; const { ctx } = this;
let teacher = await ctx.classModel.CourseTeacher.findOne({ where: { id, status: 'online', is_deleted: 0 } }); let teacher = await ctx.classModel.V2.CourseTeacher.findOne({ where: { id, status: 'online', is_deleted: 0 } });
if (ctx.isEmpty(teacher)) { if (ctx.isEmpty(teacher)) {
ctx.failed('数据不存在'); ctx.failed('数据不存在');
} }
...@@ -547,7 +547,7 @@ class InstitutionSubService extends Service { ...@@ -547,7 +547,7 @@ class InstitutionSubService extends Service {
teacher.point_tags = teacher.point ? teacher.point.split(',') : []; teacher.point_tags = teacher.point ? teacher.point.split(',') : [];
teacher.work_experience_tags = teacher.work_experience ? teacher.work_experience.split(';') : []; teacher.work_experience_tags = teacher.work_experience ? teacher.work_experience.split(';') : [];
const institution = await ctx.classModel.CourseInstitution.findOne({ where: { id: teacher.institution_id } }); const institution = await ctx.classModel.V2.CourseInstitution.findOne({ where: { id: teacher.institution_id } });
teacher.institution_name = institution.name; teacher.institution_name = institution.name;
return teacher; return teacher;
...@@ -561,7 +561,7 @@ class InstitutionSubService extends Service { ...@@ -561,7 +561,7 @@ class InstitutionSubService extends Service {
const limit = Number(input.limit) || 10; const limit = Number(input.limit) || 10;
const offset = (page - 1) * limit; const offset = (page - 1) * limit;
const institutionId = Number(input.institution_id) || 0; const institutionId = Number(input.institution_id) || 0;
const teachers = await ctx.classModel.CourseTeacher.findAndCountAll({where: {institution_id: institutionId, status: 'online', is_deleted: 0}, raw:true, offset, limit}); const teachers = await ctx.classModel.V2.CourseTeacher.findAndCountAll({where: {institution_id: institutionId, status: 'online', is_deleted: 0}, raw:true, offset, limit});
const ret = { const ret = {
results: teachers.rows, results: teachers.rows,
...@@ -574,14 +574,14 @@ class InstitutionSubService extends Service { ...@@ -574,14 +574,14 @@ class InstitutionSubService extends Service {
//教师详情 //教师详情
async getTeacher(id) { async getTeacher(id) {
const {ctx} = this; const {ctx} = this;
const teacher = await ctx.classModel.CourseTeacher.findOne({where: {id, status:'online', is_deleted: 0}, raw: true}); const teacher = await ctx.classModel.V2.CourseTeacher.findOne({where: {id, status:'online', is_deleted: 0}, raw: true});
if (ctx.isEmpty(teacher)) { if (ctx.isEmpty(teacher)) {
ctx.failed('数据不存在'); ctx.failed('数据不存在');
} }
teacher.point_tags = teacher.point ? teacher.point.split(',') : []; teacher.point_tags = teacher.point ? teacher.point.split(',') : [];
teacher.work_experience_tags = teacher.work_experience ? teacher.work_experience.split(';') : []; teacher.work_experience_tags = teacher.work_experience ? teacher.work_experience.split(';') : [];
const institution = await ctx.classModel.CourseInstitution.findOne({ where: { id: teacher.institution_id } }); const institution = await ctx.classModel.V2.CourseInstitution.findOne({ where: { id: teacher.institution_id } });
teacher.institution_name = institution.name; teacher.institution_name = institution.name;
return teacher; return teacher;
} }
...@@ -595,11 +595,11 @@ class InstitutionSubService extends Service { ...@@ -595,11 +595,11 @@ class InstitutionSubService extends Service {
const offset = (page - 1) * limit; const offset = (page - 1) * limit;
const institutionId = Number(input.institution_id) || 0; const institutionId = Number(input.institution_id) || 0;
const attributes = [ 'id', 'institution_id', 'name', 'type', 'price', 'status', 'is_deleted' ]; const attributes = [ 'id', 'institution_id', 'name', 'type', 'price', 'status', 'is_deleted' ];
const classes = await ctx.classModel.CourseClass.findAndCountAll({where: {institution_id: institutionId, status: 'online', is_deleted: 0}, raw: true, offset, limit, attributes}); const classes = await ctx.classModel.V2.CourseClass.findAndCountAll({where: {institution_id: institutionId, status: 'online', is_deleted: 0}, raw: true, offset, limit, attributes});
const classIds = R.pluck('id', classes.rows); const classIds = R.pluck('id', classes.rows);
//课程图片 //课程图片
const classImages = await ctx.classModel.CourseImages.findAll({where: {type: 2, type_id: {$in:classIds}, status: 'online', is_deleted: 0}, raw:true}); const classImages = await ctx.classModel.V2.CourseImages.findAll({where: {type: 2, type_id: {$in:classIds}, status: 'online', is_deleted: 0}, raw:true});
for (const i in classes.rows) { for (const i in classes.rows) {
let images = []; let images = [];
for (const v of classImages) { for (const v of classImages) {
...@@ -622,13 +622,13 @@ class InstitutionSubService extends Service { ...@@ -622,13 +622,13 @@ class InstitutionSubService extends Service {
//课程详情 //课程详情
async getClass(id) { async getClass(id) {
const {ctx} = this; const {ctx} = this;
const classInfo = await ctx.classModel.CourseClass.findOne({where: {id, status: 'online', is_deleted: 0}, raw: true}); const classInfo = await ctx.classModel.V2.CourseClass.findOne({where: {id, status: 'online', is_deleted: 0}, raw: true});
if (ctx.isEmpty(classInfo)) { if (ctx.isEmpty(classInfo)) {
ctx.failed('数据不存在'); ctx.failed('数据不存在');
} }
//课程图片 //课程图片
let images = await ctx.classModel.CourseImages.findAll({where: {type: 2, type_id: id, status: 'online', is_deleted: 0}, raw: true}); let images = await ctx.classModel.V2.CourseImages.findAll({where: {type: 2, type_id: id, status: 'online', is_deleted: 0}, raw: true});
//去重 //去重
images = _.uniqBy(images, function(v){ return (v.is_image === 1 ? v.image_url : v.video_url)}); images = _.uniqBy(images, function(v){ return (v.is_image === 1 ? v.image_url : v.video_url)});
images = _.orderBy(images, ['sort'], ['asc']); images = _.orderBy(images, ['sort'], ['asc']);
...@@ -643,9 +643,9 @@ class InstitutionSubService extends Service { ...@@ -643,9 +643,9 @@ class InstitutionSubService extends Service {
const { ctx } = this; const { ctx } = this;
const userUuid = ctx.userUuid; const userUuid = ctx.userUuid;
const userCollection = await ctx.classModel.CourseUserCollection.findAll({where: {user_uuid: userUuid, is_deleted: 0}, raw: true}); const userCollection = await ctx.classModel.V2.CourseUserCollection.findAll({where: {user_uuid: userUuid, is_deleted: 0}, raw: true});
const institutionIds = R.pluck('institution_id', userCollection); const institutionIds = R.pluck('institution_id', userCollection);
const institutionList = await ctx.classModel.CourseInstitution.findAll({where: {id: {$in: institutionIds}, status: 'online', is_deleted:0}, raw: true}); const institutionList = await ctx.classModel.V2.CourseInstitution.findAll({where: {id: {$in: institutionIds}, status: 'online', is_deleted:0}, raw: true});
const ret = await this.formatInstitutionList(institutionList, input); const ret = await this.formatInstitutionList(institutionList, input);
return ret; return ret;
......
'use strict';
const Service = require('egg').Service;
class LbsService extends Service {
// 计算两个经纬度之间的距离,用Haversine公式,单位:m
async getDistance(from, to) {
const rad_from = from.lat * Math.PI / 180.0;
const rad_to = to.lat * Math.PI / 180.0;
const sub_lat = rad_from - rad_to;
const sub_lng = from.lng * Math.PI / 180.0 - to.lng * Math.PI / 180.0;
const r = 6378137; // 地球半径
const distance = r * 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(sub_lat / 2), 2) + Math.cos(rad_from) * Math.cos(rad_to) * Math.pow(Math.sin(sub_lng / 2), 2)));
return distance;
}
// 腾讯位置服务WebService API,距离计算(一对多)
// 返回示例:
// {
// "results": [
// {
// "from": {
// "lat": 39.983171,
// "lng": 116.308479
// },
// "to": {
// "lat": 39.996059,
// "lng": 116.353454
// },
// "distance": 5354.7,
// "duration": 1678
// },
// {
// "from": {
// "lat": 39.983171,
// "lng": 116.308479
// },
// "to": {
// "lat": 39.949226,
// "lng": 116.394309
// },
// "distance": 10495.8, // 起点到终点的距离,单位:米。如果radius半径过小或者无法搜索到,则返回-1
// "duration": 2635 // 表示从起点到终点的结合路况的时间,秒为单位。 注:步行方式不计算耗时,该值始终为0
// }
// ]
// }
async getLBSDistance(mode = 'driving', from, toArr) {
const { ctx } = this;
const to = [];
let result = [];
for (const v of toArr) {
to.push(String(v.lat) + ',' + String(v.lng));
}
console.info(from);
const params = {
mode, // driving, walking;默认driving
from: String(from.lat) + ',' + String(from.lng),
to: to.join(';'),
key: ctx.app.config.TX_LBS_KEY,
};
const resp = await ctx.helper.send_request(ctx.app.config.TX_LBS_DISTANCE_URL, params, { method: 'GET' });
// resp.data.status 状态码,0:正常,310:请求参数信息有误,311:Key格式错误,306:请求有护持信息请检查字符串,110:请求来源未被授权
ctx.logger.info('tx_lbs_distance_params: ' + JSON.stringify(params));
ctx.logger.info('tx_lbs_distance_resp: ' + JSON.stringify(resp));
if (resp.status === 200) {
// 判断响应是否正确
if (resp.data.status === 0) {
result = resp.data.result.elements;
}
}
return { results: result };
}
// 地址解析
async getLBSAddress(address) {
const { ctx } = this;
let result = {};
const params = {
address,
key: ctx.app.config.TX_LBS_KEY,
};
const resp = await ctx.helper.send_request(ctx.app.config.TX_LBS_ADDRESS_URL, params, { method: 'GET' });
// resp.data.status 状态码,0:正常,310:请求参数信息有误,311:Key格式错误,306:请求有护持信息请检查字符串,110:请求来源未被授权
ctx.logger.info('tx_lbs_address_resp: ' + JSON.stringify(resp));
if (resp.status === 200) {
// 判断响应是否正确
if (resp.data.status === 0) {
result = resp.data.result;
}
}
return { result };
}
// 逆地址解析
async getLBSLocation(location) {
const { ctx } = this;
let result = {};
const params = {
location: location.lat + ',' + location.lng,
key: ctx.app.config.TX_LBS_KEY,
};
const resp = await ctx.helper.send_request(ctx.app.config.TX_LBS_ADDRESS_URL, params, { method: 'GET' });
// resp.data.status 状态码,0:正常,310:请求参数信息有误,311:Key格式错误,306:请求有护持信息请检查字符串,110:请求来源未被授权
ctx.logger.info('tx_lbs_address_resp: ' + JSON.stringify(resp));
if (resp.status === 200) {
// 判断响应是否正确
if (resp.data.status === 0) {
result = resp.data.result;
}
}
return { result };
}
// 地址解析
async getLBSAddress(address) {
const { ctx } = this;
let result = {};
const params = {
address,
key: ctx.app.config.TX_LBS_KEY,
};
const resp = await ctx.helper.send_request(ctx.app.config.TX_LBS_ADDRESS_URL, params, { method: 'GET' });
// resp.data.status 状态码,0:正常,310:请求参数信息有误,311:Key格式错误,306:请求有护持信息请检查字符串,110:请求来源未被授权
ctx.logger.info('tx_lbs_location_resp: ' + JSON.stringify(resp));
if (resp.status === 200) {
// 判断响应是否正确
if (resp.data.status === 0) {
result = resp.data.result;
}
}
return { result };
}
// 逆地址解析
async getLBSIp() {
const { ctx } = this;
let result = {};
const ip = ctx.helper.getClientIP();
if (!ip) {
return result;
}
const params = {
ip: ip,
key: ctx.app.config.TX_LBS_KEY,
};
const resp = await ctx.helper.send_request(ctx.app.config.TX_LBS_URL + '/location/v1/ip ', params, { method: 'GET' });
// resp.data.status 状态码,0:正常,310:请求参数信息有误,311:Key格式错误,306:请求有护持信息请检查字符串,110:请求来源未被授权
ctx.logger.info('tx_lbs_ip_resp: ' + JSON.stringify(resp));
if (resp.status === 200) {
// 判断响应是否正确
if (resp.data.status === 0) {
result = resp.data.result;
}
}
return { result };
}
}
module.exports = LbsService;
...@@ -32,10 +32,10 @@ const DISTANCES = [ ...@@ -32,10 +32,10 @@ const DISTANCES = [
{ id: -21, name: '5公里以内', value: 5000 }, { id: -21, name: '5公里以内', value: 5000 },
]; ];
class OptionSubService extends Service { class OptionService extends Service {
async getOptions() { async getOptions() {
const { service } = this; const { service } = this;
const cats = await service.course.institutionSub.getCats(); const cats = await service.course.v2.institution.getCats();
const options = { const options = {
cats, cats,
...@@ -48,12 +48,12 @@ class OptionSubService extends Service { ...@@ -48,12 +48,12 @@ class OptionSubService extends Service {
async getBanners(alias) { async getBanners(alias) {
const { ctx } = this; const { ctx } = this;
const bannerType = await ctx.classModel.CourseBannerType.findOne({ where: { alias, status: 'online', is_deleted: 0 }, row: true }); const bannerType = await ctx.classModel.V2.CourseBannerType.findOne({ where: { alias, status: 'online', is_deleted: 0 }, row: true });
if (ctx.isEmpty(bannerType)) { if (ctx.isEmpty(bannerType)) {
ctx.failed('数据不存在'); ctx.failed('数据不存在');
} }
const banners = await ctx.classModel.CourseBanner.findAll({ where: { type_id: bannerType.id, status: 'online', is_deleted: 0 }, order: [[ 'sort', 'asc' ]], row: true }); const banners = await ctx.classModel.V2.CourseBanner.findAll({ where: { type_id: bannerType.id, status: 'online', is_deleted: 0 }, order: [[ 'sort', 'asc' ]], row: true });
const ret = { const ret = {
results: banners, results: banners,
count: banners.length, count: banners.length,
...@@ -63,4 +63,4 @@ class OptionSubService extends Service { ...@@ -63,4 +63,4 @@ class OptionSubService extends Service {
} }
} }
module.exports = OptionSubService; module.exports = OptionService;
'use strict';
const Service = require('egg').Service;
const moment = require('moment');
const R = require('ramda');
const GENDER = {
boy: '小王子',
girl: '小公主',
};
class UserService extends Service {
async getBabyInfo() {
const { ctx } = this;
const user_uuid = ctx.userUuid;
const where = { user_uuid, is_deleted: 0 };
const babys_info = await ctx.classModel.V2.CourseUserBaby.all({ where, order: [[ 'id', 'desc' ]] });
const babys = [];
for (const i in babys_info) {
const baby_info = babys_info[i];
babys.push({
id: baby_info.id,
gender: baby_info.gender,
birth: baby_info.birth,
address: baby_info.address,
lat: baby_info.lat,
lng: baby_info.lng,
gender_text: GENDER[baby_info.gender],
age: moment().format('YYYY') - baby_info.birth.substr(0, 4),
});
}
if (babys.length === 0) {
return {};
}
const user_info = { address: babys[0].address, lat: babys[0].lat, lng: babys[0].lng };
return { user_info, babys };
}
async saveBabyInfo(input) {
const { ctx } = this;
const user_uuid = ctx.userUuid;
const { id, gender, birth, address, lat, lng } = input;
const where = { id, user_uuid, is_deleted: 0 };
if (id) {
await ctx.classModel.V2.CourseUserBaby.edit({ params: { gender, birth, address, lat, lng }, where });
} else {
await ctx.classModel.V2.CourseUserBaby.add({ user_uuid, gender, birth, address, lat, lng });
}
return true;
}
async delBabyInfo() {
const { ctx } = this;
const user_uuid = ctx.userUuid;
await ctx.classModel.V2.CourseUserBaby.edit({ params: { is_deleted: 1 }, where: { user_uuid } });
return true;
}
async collectInstitution(institution_id) {
const { ctx } = this;
const user_uuid = ctx.userUuid;
const where = { user_uuid, is_deleted: 0, institution_id };
let ret = await ctx.classModel.V2.CourseUserCollection.one({ where });
if (ret && ret.id) {
return ret.id;
}
ret = await await ctx.classModel.V2.CourseUserCollection.add({ user_uuid, institution_id });
return ret;
}
async delCollectInstitution(institution_id) {
const { ctx } = this;
const user_uuid = ctx.userUuid;
const where = { user_uuid, is_deleted: 0, institution_id };
let ret = await ctx.classModel.V2.CourseUserCollection.one({ where });
if (!ret || !ret.id) {
return true;
}
ret = await await ctx.classModel.V2.CourseUserCollection.edit({ params: { is_deleted: 1 }, where });
return true;
}
async requestWxAuth(code) {
const { ctx } = this;
const APPID = 'wx07a5f0ed5bdf4751';
const SECRET = 'a1b2d32b018988176181497bd74a0b7d';
const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${APPID}&secret=${SECRET}&js_code=${code}&grant_type=authorization_code`;
const result = await ctx.helper.send_request(url, {}, { method: 'GET' });
// const result = {"data":{"session_key":"Ce7HE1+MXfyZpWLYmkP0Iw==","openid":"oSjKI5LlG6AF7_vdV5Qb_DsbHcf4"},"status":200,"headers":{"connection":"keep-alive","content-type":"text/plain","date":"Tue, 24 Sep 2019 06:18:58 GMT","content-length":"82"},"res":{"status":200,"statusCode":200,"statusMessage":"OK","headers":{"connection":"keep-alive","content-type":"text/plain","date":"Tue, 24 Sep 2019 06:18:58 GMT","content-length":"82"},"size":82,"aborted":false,"rt":113,"keepAliveSocket":false,"data":{"session_key":"Ce7HE1+MXfyZpWLYmkP0Iw==","openid":"oSjKI5LlG6AF7_vdV5Qb_DsbHcf4"},"requestUrls":["https://api.weixin.qq.com/sns/jscode2session?appid=wx4769ebba9b91f8ec&secret=680440637b4e38c9b66529cfd5dc590e&js_code=021678ss18NNAk0Fohps1oA6ss1678sT&grant_type=authorization_code"],"timing":{"queuing":15,"dnslookup":15,"connected":27,"requestSent":57,"waiting":111,"contentDownload":113},"remoteAddress":"101.227.162.120","remotePort":443,"socketHandledRequests":1,"socketHandledResponses":1}};
ctx.logger.info(JSON.stringify({ course_mini_auth_ret: result }));
if (result.status !== 200) {
ctx.failed('授权失败');
}
const ret = result.data;
if (!ret.session_key && !ret.openid && ret.errcode !== 0) {
ctx.failed(ret.errmsg);
}
const openid = ret.openid;
const session_key = ret.session_key;
return { openid, session_key };
}
}
module.exports = UserService;
This source diff could not be displayed because it is too large. You can view the blob instead.
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