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
06a8f54a
Commit
06a8f54a
authored
Jun 09, 2021
by
liuyang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
记录用户观看课程数据
parent
8bc20f11
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
174 additions
and
9 deletions
+174
-9
Application.java
src/main/java/com/qkdata/Application.java
+2
-0
BizConstants.java
src/main/java/com/qkdata/biz/common/BizConstants.java
+2
-0
CourseConsumeRecordPO.java
...m/qkdata/biz/management/entity/CourseConsumeRecordPO.java
+55
-0
CourseConsumeRecordMapper.java
...data/biz/management/mapper/CourseConsumeRecordMapper.java
+18
-0
CourseConsumeRecordService.java
...ta/biz/management/service/CourseConsumeRecordService.java
+20
-0
TimeTaskService.java
...va/com/qkdata/biz/management/service/TimeTaskService.java
+48
-0
CourseConsumeRecordController.java
...ata/biz/web/controller/CourseConsumeRecordController.java
+18
-8
SaveConsumeRecord.java
src/main/java/com/qkdata/biz/web/vo/SaveConsumeRecord.java
+1
-1
V1.0.9__update.sql
src/main/resources/db/migration/V1.0.9__update.sql
+5
-0
course_consume_recordMapper.xml
...ources/mappers/management/course_consume_recordMapper.xml
+5
-0
No files found.
src/main/java/com/qkdata/Application.java
View file @
06a8f54a
...
...
@@ -6,6 +6,7 @@ import org.springframework.boot.web.servlet.ServletComponentScan;
import
org.springframework.cache.annotation.EnableCaching
;
import
org.springframework.context.annotation.ComponentScan
;
import
org.springframework.retry.annotation.EnableRetry
;
import
org.springframework.scheduling.annotation.EnableScheduling
;
@SpringBootApplication
@ComponentScan
(
basePackages
=
{
...
...
@@ -14,6 +15,7 @@ import org.springframework.retry.annotation.EnableRetry;
@ServletComponentScan
@EnableCaching
@EnableRetry
@EnableScheduling
public
class
Application
{
public
static
void
main
(
String
[]
args
)
{
...
...
src/main/java/com/qkdata/biz/common/BizConstants.java
View file @
06a8f54a
...
...
@@ -30,4 +30,6 @@ public class BizConstants {
public
static
final
String
SMS_TEMPLATE_CODE
=
"T_LG_CAPTCHA"
;
public
static
final
String
MOBILE_CAPTCHA_PREFIX
=
"CAPTCHA_"
;
public
static
final
String
CACHE_KE_CONSUME_RECORD
=
"CONSUME_RECORD"
;
}
src/main/java/com/qkdata/biz/management/entity/CourseConsumeRecordPO.java
0 → 100644
View file @
06a8f54a
package
com
.
qkdata
.
biz
.
management
.
entity
;
import
com.baomidou.mybatisplus.annotation.*
;
import
com.qkdata.common.base.entity.BasePO
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.EqualsAndHashCode
;
import
java.time.LocalDateTime
;
/**
* <p>
* 课程消耗记录
* </p>
*
* @author liuyang
* @since 2021-06-09
*/
@Data
@TableName
(
"course_consume_record"
)
public
class
CourseConsumeRecordPO
{
private
static
final
long
serialVersionUID
=
1L
;
@TableId
(
type
=
IdType
.
INPUT
)
private
String
id
;
/**
* 用户ID
*/
private
Long
userId
;
/**
* 观看时长(秒)
*/
private
Integer
watchTime
;
/**
* 课程ID
*/
private
Long
courseId
;
/**
* 章节ID
*/
private
Long
chapterId
;
@ApiModelProperty
(
example
=
"1619423186000"
)
@TableField
(
fill
=
FieldFill
.
INSERT
)
private
LocalDateTime
createTime
;
@ApiModelProperty
(
example
=
"1619423186000"
)
@TableField
(
fill
=
FieldFill
.
INSERT_UPDATE
)
private
LocalDateTime
updateTime
;
}
src/main/java/com/qkdata/biz/management/mapper/CourseConsumeRecordMapper.java
0 → 100644
View file @
06a8f54a
package
com
.
qkdata
.
biz
.
management
.
mapper
;
import
com.qkdata.biz.management.entity.CourseConsumeRecordPO
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
org.apache.ibatis.annotations.Mapper
;
/**
* <p>
* 课程消耗记录 Mapper 接口
* </p>
*
* @author liuyang
* @since 2021-06-09
*/
@Mapper
public
interface
CourseConsumeRecordMapper
extends
BaseMapper
<
CourseConsumeRecordPO
>
{
}
src/main/java/com/qkdata/biz/management/service/CourseConsumeRecordService.java
0 → 100644
View file @
06a8f54a
package
com
.
qkdata
.
biz
.
management
.
service
;
import
com.qkdata.biz.management.entity.CourseConsumeRecordPO
;
import
com.qkdata.biz.management.mapper.CourseConsumeRecordMapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
org.springframework.stereotype.Service
;
/**
* <p>
* $!{table.comment} 服务类
* </p>
*
* @author liuyang
* @since 2021-06-09
*/
@Service
public
class
CourseConsumeRecordService
extends
ServiceImpl
<
CourseConsumeRecordMapper
,
CourseConsumeRecordPO
>
{
}
\ No newline at end of file
src/main/java/com/qkdata/biz/management/service/TimeTaskService.java
0 → 100644
View file @
06a8f54a
package
com
.
qkdata
.
biz
.
management
.
service
;
import
com.google.common.collect.Lists
;
import
com.qkdata.biz.common.BizConstants
;
import
com.qkdata.biz.management.entity.CourseConsumeRecordPO
;
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.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Service
;
import
java.util.List
;
import
java.util.Set
;
/**
* 定时任务
*/
@Slf4j
@Service
public
class
TimeTaskService
{
@Autowired
@Qualifier
(
"objectRedisTemplate"
)
private
RedisTemplate
redisTemplate
;
@Autowired
private
CourseConsumeRecordService
recordService
;
/**
* 每30分钟执行一次
*/
@Scheduled
(
cron
=
"0 */30 * * * ?"
)
public
void
saveConsumeRecord
(){
log
.
debug
(
"TimeTaskService saveConsumeRecord excute start================="
);
Set
<
String
>
keys
=
redisTemplate
.
opsForHash
().
keys
(
BizConstants
.
CACHE_KE_CONSUME_RECORD
);
List
<
CourseConsumeRecordPO
>
saveList
=
Lists
.
newArrayList
();
for
(
String
key
:
keys
){
CourseConsumeRecordPO
po
=
(
CourseConsumeRecordPO
)
redisTemplate
.
opsForHash
().
get
(
BizConstants
.
CACHE_KE_CONSUME_RECORD
,
key
);
saveList
.
add
(
po
);
redisTemplate
.
opsForHash
().
delete
(
BizConstants
.
CACHE_KE_CONSUME_RECORD
,
key
);
}
if
(
saveList
.
size
()
>
0
){
recordService
.
saveOrUpdateBatch
(
saveList
);
}
log
.
debug
(
"TimeTaskService saveConsumeRecord excute end================="
);
}
}
src/main/java/com/qkdata/biz/web/controller/CourseConsumeRecordController.java
View file @
06a8f54a
package
com
.
qkdata
.
biz
.
web
.
controller
;
import
com.qkdata.biz.common.BizConstants
;
import
com.qkdata.biz.web.vo.CourseConsumeRecordModel
;
import
com.qkdata.biz.management.entity.CourseConsumeRecordPO
;
import
com.qkdata.biz.web.vo.SaveConsumeRecord
;
import
com.qkdata.common.base.model.Result
;
import
com.qkdata.common.util.UserContext
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
org.apache.shiro.authz.annotation.Logical
;
...
...
@@ -28,15 +30,23 @@ public class CourseConsumeRecordController {
@ApiOperation
(
"记录课程消耗记录"
)
@PostMapping
(
"/save"
)
@RequiresRoles
(
value
=
{
BizConstants
.
ROLE_USER
,
BizConstants
.
ROLE_ENTERPRISE_ADMIN
},
logical
=
Logical
.
OR
)
public
Result
<
String
>
save
(
@RequestBody
CourseConsumeRecordModel
model
){
if
(
redisTemplate
.
hasKey
(
model
.
getUuid
())){
CourseConsumeRecordModel
cacheModel
=
(
CourseConsumeRecordModel
)
redisTemplate
.
opsForValue
().
get
(
model
.
getUuid
());
cacheModel
.
setLearnDuration
(
model
.
getLearnDuration
());
redisTemplate
.
opsForValue
().
set
(
cacheModel
.
getUuid
(),
cacheModel
);
public
Result
<
String
>
save
(
@RequestBody
SaveConsumeRecord
model
){
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
());
redisTemplate
.
opsForHash
().
put
(
BizConstants
.
CACHE_KE_CONSUME_RECORD
,
cacheModel
.
getId
(),
cacheModel
);
}
else
{
model
.
setStartTime
(
LocalDateTime
.
now
());
redisTemplate
.
opsForValue
().
set
(
model
.
getUuid
(),
model
);
CourseConsumeRecordPO
po
=
new
CourseConsumeRecordPO
();
po
.
setId
(
model
.
getUuid
());
po
.
setUserId
(
UserContext
.
getUserId
());
po
.
setCourseId
(
model
.
getCourseId
());
po
.
setChapterId
(
model
.
getChaperId
());
po
.
setWatchTime
(
model
.
getLearnDuration
());
po
.
setCreateTime
(
LocalDateTime
.
now
());
redisTemplate
.
opsForHash
().
put
(
BizConstants
.
CACHE_KE_CONSUME_RECORD
,
po
.
getId
(),
po
);
}
return
Result
.
succeed
(
"ok"
);
}
}
src/main/java/com/qkdata/biz/web/vo/
CourseConsumeRecordModel
.java
→
src/main/java/com/qkdata/biz/web/vo/
SaveConsumeRecord
.java
View file @
06a8f54a
...
...
@@ -8,7 +8,7 @@ import java.time.LocalDateTime;
* 课程消耗记录
*/
@Data
public
class
CourseConsumeRecordModel
{
public
class
SaveConsumeRecord
{
/**
* 本次观看唯一标识
*/
...
...
src/main/resources/db/migration/V1.0.9__update.sql
0 → 100644
View file @
06a8f54a
ALTER
TABLE
`course_consume_record`
DROP
COLUMN
`video_id`
,
MODIFY
COLUMN
`id`
varchar
(
36
)
NOT
NULL
COMMENT
'主键'
FIRST
,
MODIFY
COLUMN
`watch_time`
int
(
11
)
NULL
DEFAULT
NULL
COMMENT
'观看时长(秒)'
AFTER
`user_id`
;
\ No newline at end of file
src/main/resources/mappers/management/course_consume_recordMapper.xml
0 → 100644
View file @
06a8f54a
<?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.CourseConsumeRecordMapper"
>
</mapper>
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