Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
O
online-edu-backend
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Redmine
Redmine
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
online-edu
online-edu-backend
Commits
151737f0
Commit
151737f0
authored
Sep 01, 2021
by
liuyang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
添加用户标签功能
parent
94585bef
Show whitespace changes
Inline
Side-by-side
Showing
22 changed files
with
433 additions
and
17 deletions
+433
-17
CourseAllowEnum.java
src/main/java/com/qkdata/biz/enums/CourseAllowEnum.java
+5
-1
MemberController.java
...om/qkdata/biz/management/controller/MemberController.java
+14
-4
UserTagController.java
...m/qkdata/biz/management/controller/UserTagController.java
+69
-0
CoursePO.java
src/main/java/com/qkdata/biz/management/entity/CoursePO.java
+4
-1
UserTagPO.java
...main/java/com/qkdata/biz/management/entity/UserTagPO.java
+34
-0
UserTagRelPO.java
...n/java/com/qkdata/biz/management/entity/UserTagRelPO.java
+42
-0
CourseMapper.java
...n/java/com/qkdata/biz/management/mapper/CourseMapper.java
+2
-2
UserTagMapper.java
.../java/com/qkdata/biz/management/mapper/UserTagMapper.java
+27
-0
UserTagRelMapper.java
...va/com/qkdata/biz/management/mapper/UserTagRelMapper.java
+19
-0
CourseService.java
...java/com/qkdata/biz/management/service/CourseService.java
+30
-4
MemberService.java
...java/com/qkdata/biz/management/service/MemberService.java
+5
-0
UserTagService.java
...ava/com/qkdata/biz/management/service/UserTagService.java
+57
-0
MemberListModel.java
...in/java/com/qkdata/biz/management/vo/MemberListModel.java
+6
-0
QueryMemberModel.java
...n/java/com/qkdata/biz/management/vo/QueryMemberModel.java
+1
-0
QueryUserTagModel.java
.../java/com/qkdata/biz/management/vo/QueryUserTagModel.java
+11
-0
SaveCourseModel.java
...in/java/com/qkdata/biz/management/vo/SaveCourseModel.java
+5
-1
MainPageController.java
...ava/com/qkdata/biz/web/controller/MainPageController.java
+39
-4
V1.0.1__update.sql
src/main/resources/db/migration/V1.0.1__update.sql
+18
-0
courseMapper.xml
src/main/resources/mappers/management/courseMapper.xml
+14
-0
user_tagMapper.xml
src/main/resources/mappers/management/user_tagMapper.xml
+17
-0
user_tag_relMapper.xml
src/main/resources/mappers/management/user_tag_relMapper.xml
+10
-0
SysUserExtMapper.xml
src/main/resources/mappers/sys/SysUserExtMapper.xml
+4
-0
No files found.
src/main/java/com/qkdata/biz/enums/CourseAllowEnum.java
View file @
151737f0
...
@@ -11,6 +11,10 @@ public enum CourseAllowEnum {
...
@@ -11,6 +11,10 @@ public enum CourseAllowEnum {
/**
/**
* 指定企业
* 指定企业
*/
*/
SPECIFY
SPECIFY
,
/**
* 用户标签
*/
USER_TAG
,
}
}
src/main/java/com/qkdata/biz/management/controller/MemberController.java
View file @
151737f0
package
com
.
qkdata
.
biz
.
management
.
controller
;
package
com
.
qkdata
.
biz
.
management
.
controller
;
import
com.qkdata.biz.management.service.MemberService
;
import
com.qkdata.biz.management.service.MemberService
;
import
com.qkdata.biz.management.service.UserTagService
;
import
com.qkdata.biz.management.vo.MemberListModel
;
import
com.qkdata.biz.management.vo.MemberListModel
;
import
com.qkdata.biz.management.vo.QueryMemberModel
;
import
com.qkdata.biz.management.vo.QueryMemberModel
;
import
com.qkdata.common.annotation.SysLog
;
import
com.qkdata.common.annotation.SysLog
;
import
com.qkdata.common.base.model.PageResult
;
import
com.qkdata.common.base.model.PageResult
;
import
com.qkdata.common.base.model.Result
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.PostMapping
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
java.util.List
;
import
org.springframework.web.bind.annotation.RestController
;
@Api
(
tags
=
"客户管理"
)
@Api
(
tags
=
"客户管理"
)
@RestController
@RestController
...
@@ -20,6 +21,8 @@ public class MemberController {
...
@@ -20,6 +21,8 @@ public class MemberController {
@Autowired
@Autowired
private
MemberService
memberService
;
private
MemberService
memberService
;
@Autowired
private
UserTagService
userTagService
;
@ApiOperation
(
"查询客户列表"
)
@ApiOperation
(
"查询客户列表"
)
@PostMapping
(
"/list"
)
@PostMapping
(
"/list"
)
...
@@ -27,4 +30,11 @@ public class MemberController {
...
@@ -27,4 +30,11 @@ public class MemberController {
public
PageResult
<
MemberListModel
>
list
(
@RequestBody
QueryMemberModel
param
){
public
PageResult
<
MemberListModel
>
list
(
@RequestBody
QueryMemberModel
param
){
return
memberService
.
queryPage
(
param
);
return
memberService
.
queryPage
(
param
);
}
}
@ApiOperation
(
"添加用户标签"
)
@PostMapping
(
"/addUserTags/{userId}"
)
@SysLog
(
"添加用户标签"
)
public
Result
<
String
>
addTags
(
@PathVariable
Long
userId
,
@RequestBody
List
<
Long
>
tagIds
){
userTagService
.
addUserTagRel
(
userId
,
tagIds
);
return
Result
.
succeed
(
"ok"
);
}
}
}
src/main/java/com/qkdata/biz/management/controller/UserTagController.java
0 → 100644
View file @
151737f0
package
com
.
qkdata
.
biz
.
management
.
controller
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.qkdata.biz.common.BizConstants
;
import
com.qkdata.biz.management.entity.UserTagPO
;
import
com.qkdata.biz.management.service.UserTagService
;
import
com.qkdata.biz.management.vo.QueryUserTagModel
;
import
com.qkdata.common.annotation.SysLog
;
import
com.qkdata.common.base.exception.BusinessException
;
import
com.qkdata.common.base.model.PageResult
;
import
com.qkdata.common.base.model.Result
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
org.apache.shiro.authz.annotation.Logical
;
import
org.apache.shiro.authz.annotation.RequiresRoles
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.validation.annotation.Validated
;
import
org.springframework.web.bind.annotation.*
;
/**
* <p>
* 用户标签 前端控制器
* </p>
*
* @author liuyang
* @since 2021-09-01
*/
@Api
(
tags
=
"用户标签管理"
)
@RestController
@RequestMapping
(
"/api/mgr/userTag"
)
public
class
UserTagController
{
@Autowired
private
UserTagService
userTagService
;
@ApiOperation
(
"添加用户标签"
)
@PostMapping
(
"/save"
)
@SysLog
(
value
=
"添加用户标签"
)
@RequiresRoles
(
value
=
{
BizConstants
.
ROLE_ADMIN
,
BizConstants
.
ROLE_OPERATOR
},
logical
=
Logical
.
OR
)
public
Result
<
String
>
save
(
@RequestBody
@Validated
UserTagPO
userTagPO
){
UserTagPO
dbPO
=
userTagService
.
getOne
(
Wrappers
.<
UserTagPO
>
lambdaQuery
().
eq
(
UserTagPO:
:
getName
,
userTagPO
.
getName
()));
if
(
dbPO
!=
null
){
throw
new
BusinessException
(
"标签名称已存在"
);
}
userTagService
.
save
(
userTagPO
);
return
Result
.
succeed
(
"ok"
);
}
@ApiOperation
(
"删除标签"
)
@GetMapping
(
"/delete/{id}"
)
@SysLog
(
value
=
"删除用户标签"
)
@RequiresRoles
(
value
=
{
BizConstants
.
ROLE_ADMIN
,
BizConstants
.
ROLE_OPERATOR
},
logical
=
Logical
.
OR
)
public
Result
<
String
>
delete
(
@PathVariable
Long
id
){
int
count
=
userTagService
.
countByUserTagId
(
id
);
if
(
count
>
0
){
throw
new
BusinessException
(
"请先解除用户与该标签的关联"
);
}
userTagService
.
removeById
(
id
);
return
Result
.
succeed
(
"ok"
);
}
@ApiOperation
(
"分页查询标签列表"
)
@PostMapping
(
"/list"
)
@SysLog
(
value
=
"标签列表"
)
@RequiresRoles
(
value
=
{
BizConstants
.
ROLE_ADMIN
,
BizConstants
.
ROLE_OPERATOR
},
logical
=
Logical
.
OR
)
public
PageResult
<
UserTagPO
>
list
(
@RequestBody
QueryUserTagModel
params
){
return
userTagService
.
queryPageList
(
params
);
}
}
src/main/java/com/qkdata/biz/management/entity/CoursePO.java
View file @
151737f0
...
@@ -98,6 +98,9 @@ public class CoursePO extends BasePO {
...
@@ -98,6 +98,9 @@ public class CoursePO extends BasePO {
*/
*/
@TableLogic
@TableLogic
private
Boolean
isDel
;
private
Boolean
isDel
;
/**
* 指定的用户标签
*/
private
String
userTagIds
;
}
}
src/main/java/com/qkdata/biz/management/entity/UserTagPO.java
0 → 100644
View file @
151737f0
package
com
.
qkdata
.
biz
.
management
.
entity
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.qkdata.common.base.entity.BasePO
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
org.hibernate.validator.constraints.Length
;
import
javax.validation.constraints.NotBlank
;
/**
* <p>
* 用户标签
* </p>
*
* @author liuyang
* @since 2021-09-01
*/
@Data
@EqualsAndHashCode
(
callSuper
=
true
)
@TableName
(
"user_tag"
)
public
class
UserTagPO
extends
BasePO
{
private
static
final
long
serialVersionUID
=
1L
;
/**
* 用户标签名称
*/
@NotBlank
(
message
=
"名称不能为空"
)
@Length
(
min
=
1
,
max
=
6
,
message
=
"名称最多6个字符"
)
private
String
name
;
}
src/main/java/com/qkdata/biz/management/entity/UserTagRelPO.java
0 → 100644
View file @
151737f0
package
com
.
qkdata
.
biz
.
management
.
entity
;
import
com.baomidou.mybatisplus.annotation.TableId
;
import
com.baomidou.mybatisplus.annotation.TableName
;
import
com.baomidou.mybatisplus.extension.activerecord.Model
;
import
com.qkdata.common.base.entity.BasePO
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
java.io.Serializable
;
/**
* <p>
* 用户与标签关联表
* </p>
*
* @author liuyang
* @since 2021-09-01
*/
@Data
@TableName
(
"user_tag_rel"
)
public
class
UserTagRelPO
implements
Serializable
{
private
static
final
long
serialVersionUID
=
1L
;
/**
* 主键ID
*/
@TableId
private
Long
id
;
/**
* 用户id
*/
private
Long
userId
;
/**
* 用户标签id
*/
private
Long
userTagId
;
}
src/main/java/com/qkdata/biz/management/mapper/CourseMapper.java
View file @
151737f0
...
@@ -33,9 +33,9 @@ public interface CourseMapper extends BaseMapper<CoursePO> {
...
@@ -33,9 +33,9 @@ public interface CourseMapper extends BaseMapper<CoursePO> {
List
<
CourseAllowEnterpriseModel
>
selectOrgListByCourseId
(
Long
id
);
List
<
CourseAllowEnterpriseModel
>
selectOrgListByCourseId
(
Long
id
);
List
<
SearchCourseResultModel
>
searchPageList
(
Page
page
,
@Param
(
"p"
)
SearchCourseConditionModel
model
);
List
<
SearchCourseResultModel
>
searchPageList
(
Page
page
,
@Param
(
"p"
)
SearchCourseConditionModel
model
,
@Param
(
"userTags"
)
List
<
Long
>
userTagIds
);
List
<
SearchCourseResultModel
>
recommendList
(
Page
page
,
@Param
(
"p"
)
SearchCourseConditionModel
model
);
List
<
SearchCourseResultModel
>
recommendList
(
Page
page
,
@Param
(
"p"
)
SearchCourseConditionModel
model
,
@Param
(
"userTags"
)
List
<
Long
>
userTagIds
);
List
<
CoursePO
>
findListByTags
(
List
<
Long
>
tagIds
);
List
<
CoursePO
>
findListByTags
(
List
<
Long
>
tagIds
);
...
...
src/main/java/com/qkdata/biz/management/mapper/UserTagMapper.java
0 → 100644
View file @
151737f0
package
com
.
qkdata
.
biz
.
management
.
mapper
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.qkdata.biz.management.entity.UserTagPO
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.qkdata.biz.management.vo.QueryUserTagModel
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
/**
* <p>
* 用户标签 Mapper 接口
* </p>
*
* @author liuyang
* @since 2021-09-01
*/
@Mapper
public
interface
UserTagMapper
extends
BaseMapper
<
UserTagPO
>
{
List
<
UserTagPO
>
queryPageList
(
Page
page
,
@Param
(
"p"
)
QueryUserTagModel
params
);
List
<
UserTagPO
>
findTagsByUserId
(
Long
userId
);
}
src/main/java/com/qkdata/biz/management/mapper/UserTagRelMapper.java
0 → 100644
View file @
151737f0
package
com
.
qkdata
.
biz
.
management
.
mapper
;
import
com.qkdata.biz.management.entity.UserTagRelPO
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
org.apache.ibatis.annotations.Mapper
;
/**
* <p>
* 用户与标签关联表 Mapper 接口
* </p>
*
* @author liuyang
* @since 2021-09-01
*/
@Mapper
public
interface
UserTagRelMapper
extends
BaseMapper
<
UserTagRelPO
>
{
int
countByUserTagId
(
Long
tagId
);
}
src/main/java/com/qkdata/biz/management/service/CourseService.java
View file @
151737f0
...
@@ -3,6 +3,7 @@ package com.qkdata.biz.management.service;
...
@@ -3,6 +3,7 @@ package com.qkdata.biz.management.service;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.collection.CollUtil
;
import
cn.hutool.core.date.BetweenFormater
;
import
cn.hutool.core.date.BetweenFormater
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.util.ArrayUtil
;
import
cn.hutool.core.util.StrUtil
;
import
cn.hutool.core.util.StrUtil
;
import
com.aliyuncs.exceptions.ClientException
;
import
com.aliyuncs.exceptions.ClientException
;
import
com.aliyuncs.vod.model.v20170321.GetVideoInfoResponse
;
import
com.aliyuncs.vod.model.v20170321.GetVideoInfoResponse
;
...
@@ -22,9 +23,11 @@ import com.qkdata.biz.management.vo.*;
...
@@ -22,9 +23,11 @@ import com.qkdata.biz.management.vo.*;
import
com.qkdata.biz.sys.entity.SysUserPO
;
import
com.qkdata.biz.sys.entity.SysUserPO
;
import
com.qkdata.biz.sys.service.SysUserService
;
import
com.qkdata.biz.sys.service.SysUserService
;
import
com.qkdata.biz.web.vo.*
;
import
com.qkdata.biz.web.vo.*
;
import
com.qkdata.common.base.entity.BasePO
;
import
com.qkdata.common.base.enums.CodeEnum
;
import
com.qkdata.common.base.enums.CodeEnum
;
import
com.qkdata.common.base.exception.BusinessException
;
import
com.qkdata.common.base.exception.BusinessException
;
import
com.qkdata.common.base.model.PageResult
;
import
com.qkdata.common.base.model.PageResult
;
import
com.qkdata.common.oauth.AuthorizedUser
;
import
com.qkdata.common.util.UserContext
;
import
com.qkdata.common.util.UserContext
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
@@ -33,6 +36,7 @@ import org.springframework.transaction.annotation.Transactional;
...
@@ -33,6 +36,7 @@ import org.springframework.transaction.annotation.Transactional;
import
java.time.Duration
;
import
java.time.Duration
;
import
java.time.LocalDateTime
;
import
java.time.LocalDateTime
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.List
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
...
@@ -70,6 +74,8 @@ public class CourseService extends ServiceImpl<CourseMapper, CoursePO> {
...
@@ -70,6 +74,8 @@ public class CourseService extends ServiceImpl<CourseMapper, CoursePO> {
private
UserFavoritesService
userFavoritesService
;
private
UserFavoritesService
userFavoritesService
;
@Autowired
@Autowired
private
RecommendConfigService
recommendConfigService
;
private
RecommendConfigService
recommendConfigService
;
@Autowired
private
UserTagService
userTagService
;
/**
/**
* 后台-分页查询课程列表
* 后台-分页查询课程列表
...
@@ -441,6 +447,14 @@ public class CourseService extends ServiceImpl<CourseMapper, CoursePO> {
...
@@ -441,6 +447,14 @@ public class CourseService extends ServiceImpl<CourseMapper, CoursePO> {
po
.
setModel
(
CourseModelEnum
.
VOD
);
po
.
setModel
(
CourseModelEnum
.
VOD
);
po
.
setSeriesId
(
model
.
getSeriesId
());
po
.
setSeriesId
(
model
.
getSeriesId
());
po
.
setAllow
(
model
.
getAllow
());
po
.
setAllow
(
model
.
getAllow
());
if
(
po
.
getAllow
()
==
CourseAllowEnum
.
USER_TAG
){
if
(
CollUtil
.
isEmpty
(
model
.
getUserTagIds
())){
throw
new
BusinessException
(
"请选择用户标签"
);
}
po
.
setUserTagIds
(
ArrayUtil
.
join
(
model
.
getTagIds
(),
","
));
}
else
{
po
.
setUserTagIds
(
""
);
}
saveOrUpdate
(
po
);
saveOrUpdate
(
po
);
return
po
.
getId
();
return
po
.
getId
();
}
}
...
@@ -465,9 +479,15 @@ public class CourseService extends ServiceImpl<CourseMapper, CoursePO> {
...
@@ -465,9 +479,15 @@ public class CourseService extends ServiceImpl<CourseMapper, CoursePO> {
* @param model
* @param model
* @return
* @return
*/
*/
public
PageResult
<
SearchCourseResultModel
>
search
(
SearchCourseConditionModel
model
)
{
public
PageResult
<
SearchCourseResultModel
>
search
(
SearchCourseConditionModel
model
,
AuthorizedUser
user
)
{
Page
page
=
new
Page
(
model
.
getPageIndex
(),
model
.
getPageSize
());
Page
page
=
new
Page
(
model
.
getPageIndex
(),
model
.
getPageSize
());
List
<
SearchCourseResultModel
>
list
=
baseMapper
.
searchPageList
(
page
,
model
);
List
<
Long
>
userTagIds
=
null
;
if
(
user
!=
null
){
List
<
UserTagPO
>
userTagList
=
userTagService
.
findTagsByUserId
(
user
.
getUserId
());
userTagIds
=
userTagList
.
stream
().
map
(
BasePO:
:
getId
).
collect
(
Collectors
.
toList
());
}
List
<
SearchCourseResultModel
>
list
=
baseMapper
.
searchPageList
(
page
,
model
,
userTagIds
);
addTagAndDuration
(
list
);
addTagAndDuration
(
list
);
return
PageResult
.<
SearchCourseResultModel
>
builder
().
code
(
CodeEnum
.
SUCCESS
.
getCode
()).
count
(
page
.
getTotal
()).
data
(
list
).
build
();
return
PageResult
.<
SearchCourseResultModel
>
builder
().
code
(
CodeEnum
.
SUCCESS
.
getCode
()).
count
(
page
.
getTotal
()).
data
(
list
).
build
();
}
}
...
@@ -623,9 +643,15 @@ public class CourseService extends ServiceImpl<CourseMapper, CoursePO> {
...
@@ -623,9 +643,15 @@ public class CourseService extends ServiceImpl<CourseMapper, CoursePO> {
return
resultList
;
return
resultList
;
}
}
public
PageResult
<
SearchCourseResultModel
>
mainPageRecommendList
(
SearchCourseConditionModel
model
)
{
public
PageResult
<
SearchCourseResultModel
>
mainPageRecommendList
(
SearchCourseConditionModel
model
,
AuthorizedUser
user
)
{
Page
page
=
new
Page
(
model
.
getPageIndex
(),
model
.
getPageSize
());
Page
page
=
new
Page
(
model
.
getPageIndex
(),
model
.
getPageSize
());
List
<
SearchCourseResultModel
>
list
=
baseMapper
.
recommendList
(
page
,
model
);
List
<
Long
>
userTagIds
=
null
;
if
(
user
!=
null
){
List
<
UserTagPO
>
userTagList
=
userTagService
.
findTagsByUserId
(
user
.
getUserId
());
userTagIds
=
userTagList
.
stream
().
map
(
BasePO:
:
getId
).
collect
(
Collectors
.
toList
());
}
List
<
SearchCourseResultModel
>
list
=
baseMapper
.
recommendList
(
page
,
model
,
userTagIds
);
for
(
SearchCourseResultModel
recommend
:
list
){
for
(
SearchCourseResultModel
recommend
:
list
){
List
<
CourseTagsModel
>
tagList
=
tagService
.
findListByCourseId
(
recommend
.
getCourseId
());
List
<
CourseTagsModel
>
tagList
=
tagService
.
findListByCourseId
(
recommend
.
getCourseId
());
recommend
.
setTags
(
tagList
);
recommend
.
setTags
(
tagList
);
...
...
src/main/java/com/qkdata/biz/management/service/MemberService.java
View file @
151737f0
...
@@ -45,10 +45,15 @@ public class MemberService {
...
@@ -45,10 +45,15 @@ public class MemberService {
private
SysRoleService
sysRoleService
;
private
SysRoleService
sysRoleService
;
@Autowired
@Autowired
private
SysUserRoleService
sysUserRoleService
;
private
SysUserRoleService
sysUserRoleService
;
@Autowired
private
UserTagService
userTagService
;
public
PageResult
<
MemberListModel
>
queryPage
(
QueryMemberModel
param
)
{
public
PageResult
<
MemberListModel
>
queryPage
(
QueryMemberModel
param
)
{
Page
page
=
new
Page
(
param
.
getPageIndex
(),
param
.
getPageSize
());
Page
page
=
new
Page
(
param
.
getPageIndex
(),
param
.
getPageSize
());
List
<
MemberListModel
>
list
=
sysUserExtMapper
.
queryPage
(
page
,
param
);
List
<
MemberListModel
>
list
=
sysUserExtMapper
.
queryPage
(
page
,
param
);
for
(
MemberListModel
member
:
list
){
member
.
setUserTags
(
userTagService
.
findTagsByUserId
(
member
.
getId
()));
}
return
PageResult
.<
MemberListModel
>
builder
().
code
(
CodeEnum
.
SUCCESS
.
getCode
()).
count
(
page
.
getTotal
()).
data
(
list
).
build
();
return
PageResult
.<
MemberListModel
>
builder
().
code
(
CodeEnum
.
SUCCESS
.
getCode
()).
count
(
page
.
getTotal
()).
data
(
list
).
build
();
}
}
...
...
src/main/java/com/qkdata/biz/management/service/UserTagService.java
0 → 100644
View file @
151737f0
package
com
.
qkdata
.
biz
.
management
.
service
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.qkdata.biz.management.entity.UserTagPO
;
import
com.qkdata.biz.management.entity.UserTagRelPO
;
import
com.qkdata.biz.management.mapper.UserTagMapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.qkdata.biz.management.mapper.UserTagRelMapper
;
import
com.qkdata.biz.management.vo.QueryUserTagModel
;
import
com.qkdata.common.base.enums.CodeEnum
;
import
com.qkdata.common.base.model.PageResult
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.List
;
/**
* <p>
* $!{table.comment} 服务类
* </p>
*
* @author liuyang
* @since 2021-09-01
*/
@Service
public
class
UserTagService
extends
ServiceImpl
<
UserTagMapper
,
UserTagPO
>
{
@Autowired
private
UserTagRelMapper
userTagRelMapper
;
public
PageResult
<
UserTagPO
>
queryPageList
(
QueryUserTagModel
params
)
{
Page
page
=
new
Page
(
params
.
getPageIndex
(),
params
.
getPageSize
());
List
<
UserTagPO
>
list
=
baseMapper
.
queryPageList
(
page
,
params
);
return
PageResult
.<
UserTagPO
>
builder
().
code
(
CodeEnum
.
SUCCESS
.
getCode
()).
count
(
page
.
getTotal
()).
data
(
list
).
build
();
}
public
List
<
UserTagPO
>
findTagsByUserId
(
Long
userId
)
{
return
baseMapper
.
findTagsByUserId
(
userId
);
}
public
int
countByUserTagId
(
Long
tagId
)
{
return
userTagRelMapper
.
countByUserTagId
(
tagId
);
}
@Transactional
public
void
addUserTagRel
(
Long
userId
,
List
<
Long
>
tagIds
)
{
userTagRelMapper
.
delete
(
Wrappers
.<
UserTagRelPO
>
lambdaQuery
().
eq
(
UserTagRelPO:
:
getUserId
,
userId
));
for
(
Long
tagId
:
tagIds
){
UserTagRelPO
po
=
new
UserTagRelPO
();
po
.
setUserId
(
userId
);
po
.
setUserTagId
(
tagId
);
userTagRelMapper
.
insert
(
po
);
}
}
}
\ No newline at end of file
src/main/java/com/qkdata/biz/management/vo/MemberListModel.java
View file @
151737f0
...
@@ -2,9 +2,11 @@ package com.qkdata.biz.management.vo;
...
@@ -2,9 +2,11 @@ package com.qkdata.biz.management.vo;
import
com.qkdata.biz.enums.AccountStatusEnum
;
import
com.qkdata.biz.enums.AccountStatusEnum
;
import
com.qkdata.biz.enums.AccountTypeEnum
;
import
com.qkdata.biz.enums.AccountTypeEnum
;
import
com.qkdata.biz.management.entity.UserTagPO
;
import
lombok.Data
;
import
lombok.Data
;
import
java.time.LocalDateTime
;
import
java.time.LocalDateTime
;
import
java.util.List
;
@Data
@Data
public
class
MemberListModel
{
public
class
MemberListModel
{
...
@@ -60,4 +62,8 @@ public class MemberListModel {
...
@@ -60,4 +62,8 @@ public class MemberListModel {
* 会员失效时间
* 会员失效时间
*/
*/
private
LocalDateTime
vipEndTime
;
private
LocalDateTime
vipEndTime
;
/**
* 用户标签列表
*/
private
List
<
UserTagPO
>
userTags
;
}
}
src/main/java/com/qkdata/biz/management/vo/QueryMemberModel.java
View file @
151737f0
...
@@ -9,4 +9,5 @@ public class QueryMemberModel {
...
@@ -9,4 +9,5 @@ public class QueryMemberModel {
private
int
pageSize
=
Constants
.
DEFAULT_PAGE_SIZE
;
private
int
pageSize
=
Constants
.
DEFAULT_PAGE_SIZE
;
private
String
username
;
private
String
username
;
private
Long
orgId
;
private
Long
orgId
;
private
Long
userTagId
;
}
}
src/main/java/com/qkdata/biz/management/vo/QueryUserTagModel.java
0 → 100644
View file @
151737f0
package
com
.
qkdata
.
biz
.
management
.
vo
;
import
com.qkdata.common.constants.Constants
;
import
lombok.Data
;
@Data
public
class
QueryUserTagModel
{
private
int
pageIndex
=
Constants
.
DEFAULT_PAGE
;
private
int
pageSize
=
Constants
.
DEFAULT_PAGE_SIZE
;
private
String
name
;
}
src/main/java/com/qkdata/biz/management/vo/SaveCourseModel.java
View file @
151737f0
...
@@ -66,7 +66,7 @@ public class SaveCourseModel {
...
@@ -66,7 +66,7 @@ public class SaveCourseModel {
*/
*/
private
String
seriesName
;
private
String
seriesName
;
/**
/**
* 可见范围(全部、指定企业)
* 可见范围(全部、指定企业
,指定用户标签
)
*/
*/
private
CourseAllowEnum
allow
;
private
CourseAllowEnum
allow
;
/**
/**
...
@@ -85,4 +85,8 @@ public class SaveCourseModel {
...
@@ -85,4 +85,8 @@ public class SaveCourseModel {
* 课程附件列表
* 课程附件列表
*/
*/
private
List
<
Long
>
attachmenIds
;
private
List
<
Long
>
attachmenIds
;
/**
* 指定的用户标签
*/
private
List
<
Long
>
userTagIds
;
}
}
src/main/java/com/qkdata/biz/web/controller/MainPageController.java
View file @
151737f0
package
com
.
qkdata
.
biz
.
web
.
controller
;
package
com
.
qkdata
.
biz
.
web
.
controller
;
import
cn.hutool.core.util.StrUtil
;
import
com.auth0.jwt.interfaces.DecodedJWT
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.qkdata.biz.enums.SwiperStatusEnum
;
import
com.qkdata.biz.enums.SwiperStatusEnum
;
import
com.qkdata.biz.management.entity.CourseTagPO
;
import
com.qkdata.biz.management.entity.CourseTagPO
;
import
com.qkdata.biz.management.entity.TeacherPO
;
import
com.qkdata.biz.management.entity.TeacherPO
;
...
@@ -15,11 +18,17 @@ import com.qkdata.biz.web.vo.SearchCourseResultModel;
...
@@ -15,11 +18,17 @@ import com.qkdata.biz.web.vo.SearchCourseResultModel;
import
com.qkdata.common.annotation.SysLog
;
import
com.qkdata.common.annotation.SysLog
;
import
com.qkdata.common.base.model.PageResult
;
import
com.qkdata.common.base.model.PageResult
;
import
com.qkdata.common.base.model.Result
;
import
com.qkdata.common.base.model.Result
;
import
com.qkdata.common.jwt.JWTService
;
import
com.qkdata.common.oauth.AuthorizedUser
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.http.HttpHeaders
;
import
org.springframework.util.StringUtils
;
import
org.springframework.web.bind.annotation.*
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.IOException
;
import
java.util.List
;
import
java.util.List
;
@Api
(
tags
=
"首页数据获取-手机端"
)
@Api
(
tags
=
"首页数据获取-手机端"
)
...
@@ -40,6 +49,8 @@ public class MainPageController {
...
@@ -40,6 +49,8 @@ public class MainPageController {
private
UserCenterService
userCenterService
;
private
UserCenterService
userCenterService
;
@Autowired
@Autowired
private
TeacherService
teacherService
;
private
TeacherService
teacherService
;
@Autowired
private
JWTService
jwtService
;
@ApiOperation
(
"获取配置信息"
)
@ApiOperation
(
"获取配置信息"
)
@GetMapping
(
""
)
@GetMapping
(
""
)
...
@@ -56,15 +67,39 @@ public class MainPageController {
...
@@ -56,15 +67,39 @@ public class MainPageController {
@ApiOperation
(
"首页推存课程列表"
)
@ApiOperation
(
"首页推存课程列表"
)
@PostMapping
(
"/course/recommend/list"
)
@PostMapping
(
"/course/recommend/list"
)
@SysLog
(
"首页推存课程列表"
)
@SysLog
(
"首页推存课程列表"
)
public
PageResult
<
SearchCourseResultModel
>
recommendCourseList
(
@RequestBody
SearchCourseConditionModel
model
){
public
PageResult
<
SearchCourseResultModel
>
recommendCourseList
(
@RequestBody
SearchCourseConditionModel
model
,
HttpServletRequest
request
)
throws
IOException
{
return
courseService
.
mainPageRecommendList
(
model
);
return
courseService
.
mainPageRecommendList
(
model
,
getUserFromToken
(
request
));
}
private
AuthorizedUser
getUserFromToken
(
HttpServletRequest
request
)
throws
IOException
{
AuthorizedUser
authUser
=
null
;
String
token
=
getRequestToken
(
request
);
if
(
StrUtil
.
isNotBlank
(
token
)){
DecodedJWT
decodedJWT
=
jwtService
.
decode
(
token
);
String
userJson
=
decodedJWT
.
getClaim
(
"user"
).
asString
();
ObjectMapper
mapper
=
new
ObjectMapper
();
authUser
=
mapper
.
readValue
(
userJson
,
AuthorizedUser
.
class
);
}
return
authUser
;
}
}
/**
* 获取请求的token
*/
private
String
getRequestToken
(
HttpServletRequest
httpRequest
){
//从header中获取token
String
token
=
httpRequest
.
getHeader
(
HttpHeaders
.
AUTHORIZATION
);
//如果header中不存在token,则从参数中获取token
if
(
StringUtils
.
isEmpty
(
token
)){
token
=
httpRequest
.
getParameter
(
HttpHeaders
.
AUTHORIZATION
);
}
return
token
;
}
@ApiOperation
(
"搜索课程"
)
@ApiOperation
(
"搜索课程"
)
@PostMapping
(
"/course/search"
)
@PostMapping
(
"/course/search"
)
@SysLog
(
"搜索课程"
)
@SysLog
(
"搜索课程"
)
public
PageResult
<
SearchCourseResultModel
>
searchCourse
(
@RequestBody
SearchCourseConditionModel
model
)
{
public
PageResult
<
SearchCourseResultModel
>
searchCourse
(
@RequestBody
SearchCourseConditionModel
model
,
HttpServletRequest
request
)
throws
IOException
{
return
courseService
.
search
(
model
);
return
courseService
.
search
(
model
,
getUserFromToken
(
request
)
);
}
}
@ApiOperation
(
"获取全部标签"
)
@ApiOperation
(
"获取全部标签"
)
...
...
src/main/resources/db/migration/V1.0.1__update.sql
0 → 100644
View file @
151737f0
CREATE
TABLE
`user_tag`
(
`id`
bigint
(
0
)
NOT
NULL
AUTO_INCREMENT
,
`name`
varchar
(
255
)
NULL
COMMENT
'用户标签名称'
,
`create_time`
datetime
DEFAULT
NULL
,
`update_time`
datetime
DEFAULT
NULL
,
PRIMARY
KEY
(
`id`
)
)
COMMENT
=
'用户标签'
;
CREATE
TABLE
`user_tag_rel`
(
`id`
bigint
(
0
)
NOT
NULL
AUTO_INCREMENT
,
`user_id`
bigint
(
0
)
NULL
COMMENT
'用户id'
,
`user_tag_id`
bigint
(
0
)
NULL
COMMENT
'用户标签id'
,
PRIMARY
KEY
(
`id`
)
)
COMMENT
=
'用户与标签关联表'
;
ALTER
TABLE
`course`
ADD
COLUMN
`user_tag_ids`
varchar
(
4000
)
NULL
COMMENT
'用户标签,多个以逗号分隔'
AFTER
`is_del`
;
\ No newline at end of file
src/main/resources/mappers/management/courseMapper.xml
View file @
151737f0
...
@@ -71,6 +71,13 @@
...
@@ -71,6 +71,13 @@
WHERE
WHERE
c.is_del = 0
c.is_del = 0
AND c.allow = 'ALL'
AND c.allow = 'ALL'
<if
test=
"userTags != null and userTags.size > 0"
>
or c.allow = 'USER_TAG'
and
<foreach
collection=
"userTags"
item=
"item"
open=
"("
close=
")"
separator=
"or"
>
FIND_IN_SET(#{item},c.user_tag_ids)
</foreach>
</if>
AND c.`status` = 'UP'
AND c.`status` = 'UP'
<if
test=
"p.courseName != null and p.courseName != ''"
>
<if
test=
"p.courseName != null and p.courseName != ''"
>
and c.`name` like concat ('%',#{p.courseName},'%')
and c.`name` like concat ('%',#{p.courseName},'%')
...
@@ -94,6 +101,13 @@
...
@@ -94,6 +101,13 @@
WHERE c.is_del = 0
WHERE c.is_del = 0
and c.`status` = 'UP'
and c.`status` = 'UP'
and c.allow = 'ALL'
and c.allow = 'ALL'
<if
test=
"userTags != null and userTags.size > 0"
>
or c.allow = 'USER_TAG'
and
<foreach
collection=
"userTags"
item=
"item"
open=
"("
close=
")"
separator=
"or"
>
FIND_IN_SET(#{item},c.user_tag_ids)
</foreach>
</if>
ORDER BY sort_no ASC
ORDER BY sort_no ASC
</select>
</select>
<select
id=
"findListByTags"
resultType=
"com.qkdata.biz.management.entity.CoursePO"
>
<select
id=
"findListByTags"
resultType=
"com.qkdata.biz.management.entity.CoursePO"
>
...
...
src/main/resources/mappers/management/user_tagMapper.xml
0 → 100644
View file @
151737f0
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.qkdata.biz.management.mapper.UserTagMapper"
>
<select
id=
"queryPageList"
resultType=
"com.qkdata.biz.management.entity.UserTagPO"
>
select * from user_tag where 1 = 1
<if
test=
"p.name != null and p.name != ''"
>
and name like concat('%',#{p.name},'%')
</if>
</select>
<select
id=
"findTagsByUserId"
resultType=
"com.qkdata.biz.management.entity.UserTagPO"
>
select u.*
from user_tag u
inner join user_tag_rel r on u.id = r.user_tag_id
where r.user_id = #{userId}
</select>
</mapper>
src/main/resources/mappers/management/user_tag_relMapper.xml
0 → 100644
View file @
151737f0
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.qkdata.biz.management.mapper.UserTagRelMapper"
>
<select
id=
"countByUserTagId"
resultType=
"java.lang.Integer"
>
select count(0)
from user_tag_rel
where user_tag_id = #{tagId}
</select>
</mapper>
src/main/resources/mappers/sys/SysUserExtMapper.xml
View file @
151737f0
...
@@ -20,6 +20,7 @@
...
@@ -20,6 +20,7 @@
FROM sys_user u
FROM sys_user u
INNER JOIN user_ext e on u.id = e.user_id
INNER JOIN user_ext e on u.id = e.user_id
LEFT JOIN organization o on e.enterprise_id = o.id
LEFT JOIN organization o on e.enterprise_id = o.id
LEFT JOIN user_tag_rel r on u.id = r.user_id
WHERE u.is_del = 0
WHERE u.is_del = 0
<if
test=
"p.username != null and p.username != ''"
>
<if
test=
"p.username != null and p.username != ''"
>
and u.username like concat('%',#{p.username},'%')
and u.username like concat('%',#{p.username},'%')
...
@@ -27,6 +28,9 @@
...
@@ -27,6 +28,9 @@
<if
test=
"p.orgId != null"
>
<if
test=
"p.orgId != null"
>
and e.enterprise_id = #{p.orgId}
and e.enterprise_id = #{p.orgId}
</if>
</if>
<if
test=
"p.userTagId != null"
>
and r.user_tag_id = #{p.userTagId}
</if>
ORDER BY u.last_login_time desc
ORDER BY u.last_login_time desc
</select>
</select>
<select
id=
"getByUsername"
resultType=
"com.qkdata.biz.management.vo.MemberInfoModel"
>
<select
id=
"getByUsername"
resultType=
"com.qkdata.biz.management.vo.MemberInfoModel"
>
...
...
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