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
101b2ce6
Commit
101b2ce6
authored
Jun 17, 2021
by
liuyang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
bb915ade
Show whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
337 additions
and
18 deletions
+337
-18
CourseConsumeRecordPO.java
...m/qkdata/biz/management/entity/CourseConsumeRecordPO.java
+8
-2
CourseConsumeRecordMapper.java
...data/biz/management/mapper/CourseConsumeRecordMapper.java
+9
-0
OrgSurplusMapper.java
...va/com/qkdata/biz/management/mapper/OrgSurplusMapper.java
+3
-0
CourseConsumeRecordService.java
...ta/biz/management/service/CourseConsumeRecordService.java
+101
-1
OrgSurplusService.java
.../com/qkdata/biz/management/service/OrgSurplusService.java
+6
-0
TimeTaskService.java
...va/com/qkdata/biz/management/service/TimeTaskService.java
+1
-1
MemberListModel.java
...in/java/com/qkdata/biz/management/vo/MemberListModel.java
+4
-0
CourseConsumeRecordController.java
...ata/biz/web/controller/CourseConsumeRecordController.java
+8
-2
MyEnterpriseController.java
...com/qkdata/biz/web/controller/MyEnterpriseController.java
+21
-9
UserCenterController.java
...a/com/qkdata/biz/web/controller/UserCenterController.java
+29
-0
AddMemberModel.java
src/main/java/com/qkdata/biz/web/vo/AddMemberModel.java
+2
-1
CourseConsumeRecordModel.java
.../java/com/qkdata/biz/web/vo/CourseConsumeRecordModel.java
+59
-0
QueryConsumeRecordModel.java
...n/java/com/qkdata/biz/web/vo/QueryConsumeRecordModel.java
+12
-0
SaveConsumeRecord.java
src/main/java/com/qkdata/biz/web/vo/SaveConsumeRecord.java
+6
-2
V1.0.11__update.sql
src/main/resources/db/migration/V1.0.11__update.sql
+3
-0
V1.0.12__update.sql
src/main/resources/db/migration/V1.0.12__update.sql
+4
-0
V1.0.13__update.sql
src/main/resources/db/migration/V1.0.13__update.sql
+3
-0
course_consume_recordMapper.xml
...ources/mappers/management/course_consume_recordMapper.xml
+47
-0
org_surplusMapper.xml
src/main/resources/mappers/management/org_surplusMapper.xml
+10
-0
SysUserExtMapper.xml
src/main/resources/mappers/sys/SysUserExtMapper.xml
+1
-0
No files found.
src/main/java/com/qkdata/biz/management/entity/CourseConsumeRecordPO.java
View file @
101b2ce6
...
...
@@ -30,9 +30,13 @@ public class CourseConsumeRecordPO {
private
Long
userId
;
/**
* 观看时长(秒)
*
本次
观看时长(秒)
*/
private
Integer
watchTime
;
private
Long
watchTime
;
/**
* 观看到视频的时间
*/
private
Long
videoTime
;
/**
* 课程ID
...
...
@@ -50,6 +54,8 @@ public class CourseConsumeRecordPO {
@ApiModelProperty
(
example
=
"1619423186000"
)
@TableField
(
fill
=
FieldFill
.
INSERT_UPDATE
)
private
LocalDateTime
updateTime
;
@TableLogic
private
Boolean
isDel
;
}
src/main/java/com/qkdata/biz/management/mapper/CourseConsumeRecordMapper.java
View file @
101b2ce6
package
com
.
qkdata
.
biz
.
management
.
mapper
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.qkdata.biz.management.entity.CourseConsumeRecordPO
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.qkdata.biz.web.vo.CourseConsumeRecordModel
;
import
com.qkdata.biz.web.vo.QueryConsumeRecordModel
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
/**
* <p>
...
...
@@ -15,4 +21,7 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public
interface
CourseConsumeRecordMapper
extends
BaseMapper
<
CourseConsumeRecordPO
>
{
CourseConsumeRecordModel
queryUserCourseRecord
(
@Param
(
"userId"
)
Long
userId
,
@Param
(
"courseId"
)
Long
courseId
);
List
<
CourseConsumeRecordModel
>
queryUserRecordPage
(
Page
page
,
@Param
(
"p"
)
QueryConsumeRecordModel
model
);
}
src/main/java/com/qkdata/biz/management/mapper/OrgSurplusMapper.java
View file @
101b2ce6
...
...
@@ -5,6 +5,7 @@ import com.qkdata.biz.management.entity.OrgSurplusPO;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
com.qkdata.biz.web.vo.OrgCourseSurplusModel
;
import
com.qkdata.biz.web.vo.QueryOrgCourseSurplusModel
;
import
com.qkdata.common.base.model.Result
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Param
;
...
...
@@ -22,4 +23,6 @@ import java.util.List;
public
interface
OrgSurplusMapper
extends
BaseMapper
<
OrgSurplusPO
>
{
List
<
OrgCourseSurplusModel
>
queryCourseSurplusPageList
(
Page
page
,
@Param
(
"p"
)
QueryOrgCourseSurplusModel
model
);
OrgCourseSurplusModel
queryCourseSurplus
(
@Param
(
"orgId"
)
Long
orgId
,
@Param
(
"courseId"
)
Long
courseId
);
}
src/main/java/com/qkdata/biz/management/service/CourseConsumeRecordService.java
View file @
101b2ce6
package
com
.
qkdata
.
biz
.
management
.
service
;
import
cn.hutool.core.util.StrUtil
;
import
com.aliyuncs.exceptions.ClientException
;
import
com.aliyuncs.vod.model.v20170321.GetVideoInfoResponse
;
import
com.baomidou.mybatisplus.core.toolkit.Wrappers
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.qkdata.aliyun.service.AliyunService
;
import
com.qkdata.biz.management.entity.CourseChapterPO
;
import
com.qkdata.biz.management.entity.CourseConsumeRecordPO
;
import
com.qkdata.biz.management.entity.CoursePO
;
import
com.qkdata.biz.management.entity.ResourcePO
;
import
com.qkdata.biz.management.mapper.CourseChapterMapper
;
import
com.qkdata.biz.management.mapper.CourseConsumeRecordMapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.qkdata.biz.web.vo.CourseConsumeRecordModel
;
import
com.qkdata.biz.web.vo.QueryConsumeRecordModel
;
import
com.qkdata.biz.web.vo.SaveConsumeRecord
;
import
com.qkdata.common.base.enums.CodeEnum
;
import
com.qkdata.common.base.model.PageResult
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
/**
* <p>
* $!{table.comment} 服务类
...
...
@@ -13,7 +34,85 @@ import org.springframework.stereotype.Service;
* @author liuyang
* @since 2021-06-09
*/
@Slf4j
@Service
public
class
CourseConsumeRecordService
extends
ServiceImpl
<
CourseConsumeRecordMapper
,
CourseConsumeRecordPO
>
{
@Autowired
private
AliyunService
aliyunService
;
@Autowired
@Qualifier
(
"objectRedisTemplate"
)
private
RedisTemplate
redisTemplate
;
@Autowired
private
CourseService
courseService
;
@Autowired
private
CourseChapterMapper
chapterMapper
;
@Autowired
private
ResourceService
resourceService
;
public
void
removeBatch
(
List
<
Long
>
ids
)
{
for
(
Long
id
:
ids
){
CourseConsumeRecordPO
po
=
getById
(
id
);
if
(
po
!=
null
){
remove
(
Wrappers
.<
CourseConsumeRecordPO
>
lambdaQuery
()
.
eq
(
CourseConsumeRecordPO:
:
getUserId
,
po
.
getUserId
())
.
eq
(
CourseConsumeRecordPO:
:
getCourseId
,
po
.
getCourseId
())
.
eq
(
CourseConsumeRecordPO:
:
getChapterId
,
po
.
getChapterId
()));
}
}
}
public
CourseConsumeRecordModel
findUserCourseRecord
(
Long
userId
,
Long
courseId
)
{
//先从缓存取用户观看记录
String
key
=
"record_"
+
userId
+
"_"
+
courseId
;
CourseConsumeRecordModel
model
=
null
;
if
(
redisTemplate
.
hasKey
(
key
)){
SaveConsumeRecord
userRecord
=
(
SaveConsumeRecord
)
redisTemplate
.
opsForValue
().
get
(
key
);
model
=
new
CourseConsumeRecordModel
();
model
.
setId
(
userRecord
.
getUuid
());
model
.
setUserId
(
userId
);
model
.
setCourseId
(
courseId
);
model
.
setChapterId
(
userRecord
.
getChaperId
());
model
.
setWatchTime
(
userRecord
.
getLearnDuration
());
model
.
setVideoTime
(
userRecord
.
getVideoDuration
());
model
.
setUpdateTime
(
userRecord
.
getStartTime
());
CoursePO
coursePO
=
courseService
.
getById
(
courseId
);
model
.
setCourseName
(
coursePO
.
getName
());
model
.
setCourseStatus
(
coursePO
.
getStatus
());
CourseChapterPO
chapterPO
=
chapterMapper
.
selectById
(
userRecord
.
getChaperId
());
model
.
setChapterId
(
chapterPO
.
getId
());
model
.
setChapterName
(
chapterPO
.
getName
());
ResourcePO
resourcePO
=
resourceService
.
getById
(
chapterPO
.
getResourceId
());
model
.
setVideoId
(
resourcePO
.
getVideoId
());
model
.
setUpdateTime
(
userRecord
.
getStartTime
());
appendChapterShapshot
(
model
);
}
else
{
model
=
baseMapper
.
queryUserCourseRecord
(
userId
,
courseId
);
appendChapterShapshot
(
model
);
}
return
model
;
}
private
void
appendChapterShapshot
(
CourseConsumeRecordModel
model
)
{
String
videoId
=
model
.
getVideoId
();
if
(
StrUtil
.
isNotBlank
(
videoId
)){
try
{
GetVideoInfoResponse
response
=
aliyunService
.
getVideoInfo
(
videoId
);
String
url
=
response
.
getVideo
().
getCoverURL
();
model
.
setLogoUrl
(
url
);
}
catch
(
ClientException
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
}
}
public
PageResult
<
CourseConsumeRecordModel
>
queryUserRecordPageList
(
QueryConsumeRecordModel
model
)
{
Page
page
=
new
Page
(
model
.
getPageIndex
(),
model
.
getPageSize
());
List
<
CourseConsumeRecordModel
>
list
=
baseMapper
.
queryUserRecordPage
(
page
,
model
);
for
(
CourseConsumeRecordModel
record
:
list
){
appendChapterShapshot
(
record
);
}
return
PageResult
.<
CourseConsumeRecordModel
>
builder
().
code
(
CodeEnum
.
SUCCESS
.
getCode
()).
count
(
page
.
getTotal
()).
data
(
list
).
build
();
}
}
\ No newline at end of file
src/main/java/com/qkdata/biz/management/service/OrgSurplusService.java
View file @
101b2ce6
...
...
@@ -11,6 +11,7 @@ import com.qkdata.biz.web.vo.QueryOrgCourseSurplusModel;
import
com.qkdata.common.base.enums.CodeEnum
;
import
com.qkdata.common.base.exception.BusinessException
;
import
com.qkdata.common.base.model.PageResult
;
import
com.qkdata.common.base.model.Result
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
...
...
@@ -77,4 +78,8 @@ public class OrgSurplusService extends ServiceImpl<OrgSurplusMapper, OrgSurplusP
.
eq
(
OrgSurplusPO:
:
getCourseId
,
courseId
)
.
eq
(
OrgSurplusPO:
:
getProductType
,
ProductTypeEnum
.
ENTERPRISE_COURSE_BUY
));
}
public
OrgCourseSurplusModel
findCourseSurplus
(
Long
orgId
,
Long
courseId
)
{
return
baseMapper
.
queryCourseSurplus
(
orgId
,
courseId
);
}
}
\ No newline at end of file
src/main/java/com/qkdata/biz/management/service/TimeTaskService.java
View file @
101b2ce6
...
...
@@ -30,7 +30,7 @@ public class TimeTaskService {
/**
* 每30分钟执行一次
*/
@Scheduled
(
cron
=
"0 */
30
* * * ?"
)
@Scheduled
(
cron
=
"0 */
5
* * * ?"
)
public
void
saveConsumeRecord
(){
log
.
debug
(
"TimeTaskService saveConsumeRecord excute start================="
);
Set
<
String
>
keys
=
redisTemplate
.
opsForHash
().
keys
(
BizConstants
.
CACHE_KE_CONSUME_RECORD
);
...
...
src/main/java/com/qkdata/biz/management/vo/MemberListModel.java
View file @
101b2ce6
...
...
@@ -16,6 +16,10 @@ public class MemberListModel {
* 用户帐号
*/
private
String
username
;
/**
* 姓名
*/
private
String
name
;
/**
* 用户昵称
*/
...
...
src/main/java/com/qkdata/biz/web/controller/CourseConsumeRecordController.java
View file @
101b2ce6
...
...
@@ -19,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
import
org.springframework.web.bind.annotation.RestController
;
import
java.time.LocalDateTime
;
import
java.util.concurrent.TimeUnit
;
@Api
(
tags
=
"课程消耗记录"
)
@RestController
...
...
@@ -33,10 +34,13 @@ public class CourseConsumeRecordController {
@RequiresRoles
(
value
=
{
BizConstants
.
ROLE_USER
,
BizConstants
.
ROLE_ENTERPRISE_ADMIN
},
logical
=
Logical
.
OR
)
@SysLog
(
"记录课程消耗记录"
)
public
Result
<
String
>
save
(
@RequestBody
SaveConsumeRecord
model
){
//缓存用户观看记录
redisTemplate
.
opsForValue
().
set
(
"record_"
+
UserContext
.
getUserId
()+
"_"
+
model
.
getCourseId
(),
model
,
5
,
TimeUnit
.
MINUTES
);
//缓存课程观看记录
if
(
redisTemplate
.
opsForHash
().
hasKey
(
BizConstants
.
CACHE_KE_CONSUME_RECORD
,
model
.
getUuid
())){
CourseConsumeRecordPO
cacheModel
=
(
CourseConsumeRecordPO
)
redisTemplate
.
opsForHash
().
get
(
BizConstants
.
CACHE_KE_CONSUME_RECORD
,
model
.
getUuid
());
cacheModel
.
setWatchTime
(
model
.
getLearnDuration
());
cacheModel
.
setVideoTime
(
model
.
getVideoDuration
());
redisTemplate
.
opsForHash
().
put
(
BizConstants
.
CACHE_KE_CONSUME_RECORD
,
cacheModel
.
getId
(),
cacheModel
);
}
else
{
CourseConsumeRecordPO
po
=
new
CourseConsumeRecordPO
();
...
...
@@ -45,9 +49,11 @@ public class CourseConsumeRecordController {
po
.
setCourseId
(
model
.
getCourseId
());
po
.
setChapterId
(
model
.
getChaperId
());
po
.
setWatchTime
(
model
.
getLearnDuration
());
po
.
setCreateTime
(
LocalDateTime
.
now
());
po
.
setVideoTime
(
model
.
getVideoDuration
());
po
.
setCreateTime
(
model
.
getStartTime
());
redisTemplate
.
opsForHash
().
put
(
BizConstants
.
CACHE_KE_CONSUME_RECORD
,
po
.
getId
(),
po
);
}
return
Result
.
succeed
(
"ok"
);
}
...
...
src/main/java/com/qkdata/biz/web/controller/MyEnterpriseController.java
View file @
101b2ce6
...
...
@@ -94,6 +94,15 @@ public class MyEnterpriseController {
model
.
setOrgId
(
orgId
);
return
orgSurplusService
.
queryCourseSurplusPageList
(
model
);
}
@ApiOperation
(
"获取企业购买的单个课程余额"
)
@GetMapping
(
"/orgCourseSurplus"
)
@RequiresRoles
(
value
=
{
BizConstants
.
ROLE_USER
,
BizConstants
.
ROLE_ENTERPRISE_ADMIN
},
logical
=
Logical
.
OR
)
@SysLog
(
"获取企业购买的单个课程余额"
)
public
Result
<
OrgCourseSurplusModel
>
orgCourseSurplus
(
@RequestParam
Long
courseId
){
Long
orgId
=
userService
.
getUserEnterpriesId
(
UserContext
.
getUserId
());
OrgCourseSurplusModel
model
=
orgSurplusService
.
findCourseSurplus
(
orgId
,
courseId
);
return
Result
.
succeed
(
model
);
}
@ApiOperation
(
"企业成员领取会员"
)
@GetMapping
(
"/receiveVIP"
)
...
...
@@ -104,10 +113,10 @@ public class MyEnterpriseController {
return
Result
.
succeed
(
"ok"
);
}
@ApiOperation
(
"企业成员领取企业购买课程"
)
@GetMapping
(
"/receiveCourse
/{courseId}
"
)
@GetMapping
(
"/receiveCourse"
)
@RequiresRoles
(
value
=
{
BizConstants
.
ROLE_USER
,
BizConstants
.
ROLE_ENTERPRISE_ADMIN
},
logical
=
Logical
.
OR
)
@SysLog
(
"领取企业购买课程"
)
public
Result
<
String
>
receiveCourse
(
@
PathVariable
Long
courseId
){
public
Result
<
String
>
receiveCourse
(
@
RequestParam
Long
courseId
){
userService
.
receiveOrgCourse
(
courseId
);
return
Result
.
succeed
(
"ok"
);
}
...
...
@@ -157,12 +166,10 @@ public class MyEnterpriseController {
return
Result
.
succeed
(
memberInfo
);
}
@ApiOperation
(
"企业成员领取记录"
)
@
Ge
tMapping
(
"/member/receive/record"
)
@
Pos
tMapping
(
"/member/receive/record"
)
@RequiresRoles
(
value
=
BizConstants
.
ROLE_ENTERPRISE_ADMIN
)
@SysLog
(
"企业成员领取记录"
)
public
PageResult
<
OrgUserReceiveRecordModel
>
memberReceiveRecord
(
@RequestParam
Long
memberId
){
QueryReceiveHistoryModel
query
=
new
QueryReceiveHistoryModel
();
query
.
setUserId
(
memberId
);
public
PageResult
<
OrgUserReceiveRecordModel
>
memberReceiveRecord
(
@RequestBody
QueryReceiveHistoryModel
query
){
return
orgUserReceiveRecordService
.
queryPageList
(
query
);
}
...
...
@@ -214,11 +221,16 @@ public class MyEnterpriseController {
public
Result
<
String
>
addMember
(
@RequestBody
@Validated
AddMemberModel
model
){
Long
orgId
=
userService
.
getUserEnterpriesId
(
UserContext
.
getUserId
());
MemberInfoModel
memberInfo
=
new
MemberInfoModel
();
memberInfo
.
setUsername
(
model
.
get
Mobil
e
());
memberInfo
.
setUsername
(
model
.
get
Usernam
e
());
memberInfo
.
setName
(
model
.
getName
());
memberInfo
.
setEnterpriseId
(
orgId
);
memberInfo
.
setType
(
AccountTypeEnum
.
ENTERPRISE_VIP
);
List
<
String
>
roleCodeList
=
Lists
.
newArrayList
(
BizConstants
.
ROLE_USER
);
List
<
String
>
roleCodeList
=
Lists
.
newArrayList
();
if
(
model
.
isManager
()){
roleCodeList
.
add
(
BizConstants
.
ROLE_ENTERPRISE_ADMIN
);
}
else
{
roleCodeList
.
add
(
BizConstants
.
ROLE_USER
);
}
memberInfo
.
setRoleCodeList
(
roleCodeList
);
memberService
.
save
(
memberInfo
);
return
Result
.
succeed
(
"ok"
);
...
...
@@ -235,7 +247,7 @@ public class MyEnterpriseController {
memberService
.
remove
(
userId
);
return
Result
.
succeed
(
"ok"
);
}
@ApiOperation
(
"修改成员信息"
)
@ApiOperation
(
"修改
企业
成员信息"
)
@PostMapping
(
"/member/modify"
)
@RequiresRoles
(
value
=
{
BizConstants
.
ROLE_ENTERPRISE_ADMIN
})
@SysLog
(
"修改成员信息"
)
...
...
src/main/java/com/qkdata/biz/web/controller/UserCenterController.java
View file @
101b2ce6
package
com
.
qkdata
.
biz
.
web
.
controller
;
import
com.aliyuncs.vod.model.v20170321.GetVideoPlayAuthResponse
;
import
com.google.common.collect.Lists
;
import
com.qkdata.biz.common.BizConstants
;
import
com.qkdata.biz.management.service.CourseConsumeRecordService
;
import
com.qkdata.biz.management.service.CourseService
;
import
com.qkdata.biz.management.service.ProductOrderService
;
import
com.qkdata.biz.management.vo.ProductOrderModel
;
...
...
@@ -35,6 +37,8 @@ public class UserCenterController {
private
CourseService
courseService
;
@Autowired
private
ProductOrderService
orderService
;
@Autowired
private
CourseConsumeRecordService
courseConsumeRecordService
;
@ApiOperation
(
"获取个人信息"
)
@GetMapping
(
"/userInfo"
)
...
...
@@ -118,4 +122,29 @@ public class UserCenterController {
return
orderService
.
queryPageList
(
model
);
}
@ApiOperation
(
"用户观看记录列表"
)
@PostMapping
(
"/consumeRecord/list"
)
@RequiresRoles
(
value
=
{
BizConstants
.
ROLE_USER
,
BizConstants
.
ROLE_ENTERPRISE_ADMIN
},
logical
=
Logical
.
OR
)
@SysLog
(
"用户观看记录列表"
)
public
PageResult
<
CourseConsumeRecordModel
>
consumeRecordList
(
@RequestBody
QueryConsumeRecordModel
model
){
model
.
setUserId
(
UserContext
.
getUserId
());
return
courseConsumeRecordService
.
queryUserRecordPageList
(
model
);
}
@ApiOperation
(
"删除观看记录列表"
)
@PostMapping
(
"/consumeRecord/delete"
)
@RequiresRoles
(
value
=
{
BizConstants
.
ROLE_USER
,
BizConstants
.
ROLE_ENTERPRISE_ADMIN
},
logical
=
Logical
.
OR
)
@SysLog
(
"删除观看记录列表"
)
public
Result
<
String
>
consumeRecordList
(
@RequestBody
List
<
Long
>
ids
){
courseConsumeRecordService
.
removeBatch
(
ids
);
return
Result
.
succeed
(
"ok"
);
}
@ApiOperation
(
"用户观看某课程的记录"
)
@GetMapping
(
"/user/consumeRecord"
)
@RequiresRoles
(
value
=
{
BizConstants
.
ROLE_USER
,
BizConstants
.
ROLE_ENTERPRISE_ADMIN
},
logical
=
Logical
.
OR
)
@SysLog
(
"用户观看某课程的记录"
)
public
Result
<
CourseConsumeRecordModel
>
consumeRecordList
(
@RequestParam
Long
courseId
){
CourseConsumeRecordModel
model
=
courseConsumeRecordService
.
findUserCourseRecord
(
UserContext
.
getUserId
(),
courseId
);
return
Result
.
succeed
(
model
);
}
}
src/main/java/com/qkdata/biz/web/vo/AddMemberModel.java
View file @
101b2ce6
...
...
@@ -10,6 +10,7 @@ import javax.validation.constraints.Pattern;
public
class
AddMemberModel
{
@NotBlank
(
message
=
"手机号不能为空"
)
@Pattern
(
regexp
=
ValidatorPattern
.
MOBILE_PATTERN
,
message
=
"手机号格式不正确"
)
private
String
mobil
e
;
private
String
usernam
e
;
private
String
name
;
private
boolean
manager
;
}
src/main/java/com/qkdata/biz/web/vo/CourseConsumeRecordModel.java
0 → 100644
View file @
101b2ce6
package
com
.
qkdata
.
biz
.
web
.
vo
;
import
com.qkdata.biz.enums.CourseStatusEnum
;
import
lombok.Data
;
import
java.time.LocalDateTime
;
@Data
public
class
CourseConsumeRecordModel
{
/**
* 记录ID
*/
private
String
id
;
/**
* 用户ID
*/
private
Long
userId
;
/**
* 课程ID
*/
private
Long
courseId
;
/**
* 课程名称
*/
private
String
courseName
;
/**
* 章节ID
*/
private
Long
chapterId
;
/**
* 章节名称
*/
private
String
chapterName
;
/**
* 本次看时长(秒)
*/
private
Long
watchTime
;
/**
* 观看到视频的时间(秒)
*/
private
Long
videoTime
;
/**
* 课程状态
*/
private
CourseStatusEnum
courseStatus
;
/**
* 视频快照url
*/
private
String
logoUrl
;
/**
* 最后观看时间
*/
private
LocalDateTime
updateTime
;
/**
* 视频ID
*/
private
String
videoId
;
}
src/main/java/com/qkdata/biz/web/vo/QueryConsumeRecordModel.java
0 → 100644
View file @
101b2ce6
package
com
.
qkdata
.
biz
.
web
.
vo
;
import
com.qkdata.common.constants.Constants
;
import
lombok.Data
;
@Data
public
class
QueryConsumeRecordModel
{
private
int
pageIndex
=
Constants
.
DEFAULT_PAGE
;
private
int
pageSize
=
Constants
.
DEFAULT_PAGE_SIZE
;
private
Long
userId
;
}
src/main/java/com/qkdata/biz/web/vo/SaveConsumeRecord.java
View file @
101b2ce6
...
...
@@ -22,9 +22,13 @@ public class SaveConsumeRecord {
*/
private
Long
chaperId
;
/**
* 本次观看累记时长
* 本次观看累记时长
(秒)
*/
private
int
learnDuration
;
private
Long
learnDuration
;
/**
* 视频观看到的时间(秒)
*/
private
Long
videoDuration
;
/**
* 开始观看时间
*/
...
...
src/main/resources/db/migration/V1.0.11__update.sql
0 → 100644
View file @
101b2ce6
ALTER
TABLE
`course_consume_record`
ADD
COLUMN
`is_del`
tinyint
(
1
)
NULL
AFTER
`update_time`
;
\ No newline at end of file
src/main/resources/db/migration/V1.0.12__update.sql
0 → 100644
View file @
101b2ce6
ALTER
TABLE
`course_consume_record`
MODIFY
COLUMN
`watch_time`
bigint
(
20
)
NULL
DEFAULT
NULL
COMMENT
'本次观看时长(秒)'
AFTER
`user_id`
,
ADD
COLUMN
`video_time`
bigint
(
20
)
NULL
COMMENT
'观看到视频的时间'
AFTER
`watch_time`
;
\ No newline at end of file
src/main/resources/db/migration/V1.0.13__update.sql
0 → 100644
View file @
101b2ce6
ALTER
TABLE
`course_consume_record`
MODIFY
COLUMN
`is_del`
tinyint
(
1
)
NULL
DEFAULT
0
AFTER
`update_time`
;
\ No newline at end of file
src/main/resources/mappers/management/course_consume_recordMapper.xml
View file @
101b2ce6
...
...
@@ -2,4 +2,51 @@
<!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.CourseConsumeRecordMapper"
>
<select
id=
"queryUserCourseRecord"
resultType=
"com.qkdata.biz.web.vo.CourseConsumeRecordModel"
>
SELECT r.id,
r.user_id,
r.course_id,
c.`name` course_name,
r.chapter_id,
chapter.`name` chapter_name,
r.watch_time,
r.video_time,
c.`status` course_status,
r.update_time,
res.video_id
from course_consume_record r
INNER JOIN course c on r.course_id = c.id
INNER JOIN course_chapter chapter on chapter.id = r.chapter_id
INNER JOIN resource res ON res.id = chapter.resource_id
WHERE r.is_del = 0
and r.user_id = #{userId}
and r.course_id = #{courseId}
ORDER BY c.update_time DESC
LIMIT 1
</select>
<select
id=
"queryUserRecordPage"
resultType=
"com.qkdata.biz.web.vo.CourseConsumeRecordModel"
>
SELECT r.id,
r.user_id,
r.course_id,
c.`name` course_name,
r.chapter_id,
chapter.`name` chapter_name,
r.watch_time,
r.video_time,
c.`status` course_status,
r.update_time,
res.video_id
FROM (
SELECT *
from course_consume_record
GROUP BY user_id,course_id
HAVING MAX(update_time)
) r
INNER JOIN course c on r.course_id = c.id
INNER JOIN course_chapter chapter on chapter.id = r.chapter_id
INNER JOIN resource res ON res.id = chapter.resource_id
WHERE r.is_del = 0
and r.user_id = #{p.userId}
ORDER BY r.update_time DESC
</select>
</mapper>
src/main/resources/mappers/management/org_surplusMapper.xml
View file @
101b2ce6
...
...
@@ -11,4 +11,14 @@
INNER JOIN course c ON s.course_id = c.id
WHERE s.org_id = #{p.orgId}
</select>
<select
id=
"queryCourseSurplus"
resultType=
"com.qkdata.biz.web.vo.OrgCourseSurplusModel"
>
SELECT c.id course_id,
c.`name` course_name,
c.logo_url,
s.count
from org_surplus s
INNER JOIN course c ON s.course_id = c.id
WHERE s.org_id = #{orgId}
and s.course_id = #{courseId}
</select>
</mapper>
src/main/resources/mappers/sys/SysUserExtMapper.xml
View file @
101b2ce6
...
...
@@ -11,6 +11,7 @@
u.create_time,
u.`status`,
e.type,
e.`name`,
e.enterprise_id,
o.`name` enterprise_name,
u.last_login_time,
...
...
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