Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
5
51business
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
方斌
51business
Commits
5c2fd475
Commit
5c2fd475
authored
Nov 15, 2019
by
任国军
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
add comment & search
parent
13d19c1e
Pipeline
#16415
passed with stage
in 47 seconds
Changes
5
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
230 additions
and
9 deletions
+230
-9
institutionSub.js
app/controller/course/institutionSub.js
+33
-0
courseComment.js
app/model/class/courseComment.js
+46
-0
courseUserSearch.js
app/model/class/courseUserSearch.js
+41
-0
course.js
app/router/course.js
+5
-2
institutionSub.js
app/service/course/institutionSub.js
+105
-7
No files found.
app/controller/course/institutionSub.js
View file @
5c2fd475
...
...
@@ -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
;
app/model/class/courseComment.js
0 → 100644
View file @
5c2fd475
'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
;
};
app/model/class/courseUserSearch.js
0 → 100644
View file @
5c2fd475
'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
;
};
app/router/course.js
View file @
5c2fd475
...
...
@@ -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'
);
//清空用户搜索记录
};
app/service/course/institutionSub.js
View file @
5c2fd475
...
...
@@ -51,7 +51,7 @@ class InstitutionSubService extends Service {
// 获取机构详情
async
getInstitution
(
input
)
{
const
{
ctx
}
=
this
;
const
userU
UID
=
ctx
.
userUUID
;
const
userU
uid
=
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
:
userU
UID
,
is_deleted
:
0
}
});
const
userCollect
=
await
ctx
.
classModel
.
CourseUserCollection
.
findOne
({
where
:
{
institution_id
,
user_uuid
:
userU
uid
,
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
userU
UID
=
ctx
.
userUUID
;
const
userU
uid
=
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
:
userU
UID
,
address
,
lat
,
lng
,
created_time
:
moment
().
format
(
'YYYY-MM-DD HH:mm:ss'
)
});
ctx
.
classModel
.
CourseLogUserGps
.
created
({
user_uuid
:
userU
uid
,
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
userU
UID
=
ctx
.
userUUID
;
const
userU
uid
=
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
:
userU
UID
}
});
const
userInstitutions
=
await
ctx
.
classModel
.
CourseUserCollection
.
findAll
({
where
:
{
is_deleted
:
0
,
user_uuid
:
userU
uid
}
});
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
;
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment