Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
roncoo
roncoo-education
提交
36017e03
R
roncoo-education
项目概览
roncoo
/
roncoo-education
11 个月 前同步成功
通知
146
Star
5
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
1
Wiki
分析
仓库
DevOps
项目成员
Pages
R
roncoo-education
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
1
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
36017e03
编写于
9月 03, 2022
作者:
F
fengyw
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
修改
上级
ed5be07e
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
153 addition
and
26 deletion
+153
-26
roncoo-education-common/roncoo-education-common-core/src/main/java/com/roncoo/education/common/core/tools/Constants.java
...ava/com/roncoo/education/common/core/tools/Constants.java
+3
-0
roncoo-education-common/roncoo-education-common-service/src/main/java/com/roncoo/education/common/cache/CacheRedis.java
...in/java/com/roncoo/education/common/cache/CacheRedis.java
+4
-0
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/job/UserStudyJob.java
...in/java/com/roncoo/education/course/job/UserStudyJob.java
+49
-0
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/api/ApiUserStudyController.java
.../education/course/service/api/ApiUserStudyController.java
+17
-0
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/api/biz/ApiUserStudyBiz.java
...coo/education/course/service/api/biz/ApiUserStudyBiz.java
+59
-0
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/auth/biz/AuthCourseBiz.java
...ncoo/education/course/service/auth/biz/AuthCourseBiz.java
+7
-1
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/auth/req/AuthUserStudyReq.java
...o/education/course/service/auth/req/AuthUserStudyReq.java
+11
-25
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/auth/resp/AuthCourseSignResp.java
...ducation/course/service/auth/resp/AuthCourseSignResp.java
+3
-0
未找到文件。
roncoo-education-common/roncoo-education-common-core/src/main/java/com/roncoo/education/common/core/tools/Constants.java
浏览文件 @
36017e03
...
@@ -30,6 +30,9 @@ public final class Constants {
...
@@ -30,6 +30,9 @@ public final class Constants {
String
ADMINI_MENU
=
"admin::menu::"
;
String
ADMINI_MENU
=
"admin::menu::"
;
String
USERS_INFO
=
"users::info::"
;
String
USERS_INFO
=
"users::info::"
;
String
ADMIN_VERI_CODE
=
"admin::ver::code::"
;
String
ADMIN_VERI_CODE
=
"admin::ver::code::"
;
String
USER_STUDY
=
"user::study::"
;
String
RESOURCE
=
"resource::"
;
String
PROGRESS
=
"progress::"
;
}
}
}
}
roncoo-education-common/roncoo-education-common-service/src/main/java/com/roncoo/education/common/cache/CacheRedis.java
浏览文件 @
36017e03
...
@@ -18,6 +18,10 @@ public class CacheRedis {
...
@@ -18,6 +18,10 @@ public class CacheRedis {
@Autowired
@Autowired
private
StringRedisTemplate
stringRedisTemplate
;
private
StringRedisTemplate
stringRedisTemplate
;
public
StringRedisTemplate
getStringRedisTemplate
()
{
return
stringRedisTemplate
;
}
/**
/**
* 默认缓存5分钟
* 默认缓存5分钟
*/
*/
...
...
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/job/UserStudyJob.java
0 → 100644
浏览文件 @
36017e03
package
com.roncoo.education.course.job
;
import
cn.hutool.core.collection.CollUtil
;
import
com.roncoo.education.common.cache.CacheRedis
;
import
com.roncoo.education.common.core.tools.Constants
;
import
com.roncoo.education.course.dao.UserStudyDao
;
import
com.roncoo.education.course.dao.impl.mapper.entity.UserStudy
;
import
com.roncoo.education.course.service.auth.req.AuthUserStudyReq
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.scheduling.annotation.Scheduled
;
import
org.springframework.stereotype.Component
;
import
java.util.Set
;
import
java.util.concurrent.TimeUnit
;
/**
* @author fengyw
*/
@Component
public
class
UserStudyJob
{
@Autowired
private
UserStudyDao
userStudyDao
;
@Autowired
private
CacheRedis
cacheRedis
;
/**
* 每分钟执行一次
*/
@Scheduled
(
fixedRate
=
60000
)
public
void
progress
()
{
// 处理学习进度
Set
<
String
>
keys
=
cacheRedis
.
getStringRedisTemplate
().
keys
(
Constants
.
RedisPre
.
PROGRESS
+
"*"
);
if
(
CollUtil
.
isNotEmpty
(
keys
))
{
for
(
String
key
:
keys
)
{
if
(
60
-
cacheRedis
.
getStringRedisTemplate
().
getExpire
(
key
,
TimeUnit
.
MINUTES
)
>
59
)
{
// 如果大于1分钟,则处理
AuthUserStudyReq
req
=
cacheRedis
.
getByJson
(
key
,
AuthUserStudyReq
.
class
);
UserStudy
userStudy
=
userStudyDao
.
getById
(
req
.
getStudyId
());
userStudy
.
setProgress
(
req
.
getCurrentDuration
().
divide
(
req
.
getTotalDuration
()));
// 清楚缓存
cacheRedis
.
delete
(
Constants
.
RedisPre
.
USER_STUDY
+
req
.
getStudyId
());
cacheRedis
.
delete
(
key
);
}
}
}
}
}
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/api/ApiUserStudyController.java
浏览文件 @
36017e03
package
com.roncoo.education.course.service.api
;
package
com.roncoo.education.course.service.api
;
import
com.roncoo.education.common.core.base.Result
;
import
com.roncoo.education.course.service.api.biz.ApiUserStudyBiz
;
import
com.roncoo.education.course.service.api.biz.ApiUserStudyBiz
;
import
com.roncoo.education.course.service.auth.req.AuthUserStudyReq
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
lombok.RequiredArgsConstructor
;
import
lombok.RequiredArgsConstructor
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestMethod
;
import
org.springframework.web.bind.annotation.RestController
;
import
org.springframework.web.bind.annotation.RestController
;
import
javax.validation.constraints.NotNull
;
import
javax.validation.constraints.NotNull
;
...
@@ -23,4 +28,16 @@ public class ApiUserStudyController {
...
@@ -23,4 +28,16 @@ public class ApiUserStudyController {
@NotNull
@NotNull
private
final
ApiUserStudyBiz
biz
;
private
final
ApiUserStudyBiz
biz
;
/**
* 课程信息列表接口
*
* @author fengyw
*/
@ApiOperation
(
value
=
"记录学习进度"
,
notes
=
"记录学习进度"
)
@RequestMapping
(
value
=
"/progress"
,
method
=
RequestMethod
.
POST
)
public
Result
<
String
>
study
(
@RequestBody
AuthUserStudyReq
req
)
{
return
biz
.
study
(
req
);
}
}
}
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/api/biz/ApiUserStudyBiz.java
浏览文件 @
36017e03
package
com.roncoo.education.course.service.api.biz
;
package
com.roncoo.education.course.service.api.biz
;
import
cn.hutool.core.util.ObjectUtil
;
import
com.roncoo.education.common.cache.CacheRedis
;
import
com.roncoo.education.common.core.base.Result
;
import
com.roncoo.education.common.core.tools.Constants
;
import
com.roncoo.education.common.service.BaseBiz
;
import
com.roncoo.education.common.service.BaseBiz
;
import
com.roncoo.education.course.dao.ResourceDao
;
import
com.roncoo.education.course.dao.UserStudyDao
;
import
com.roncoo.education.course.dao.UserStudyDao
;
import
com.roncoo.education.course.dao.impl.mapper.entity.Resource
;
import
com.roncoo.education.course.dao.impl.mapper.entity.UserStudy
;
import
com.roncoo.education.course.service.auth.req.AuthUserStudyReq
;
import
lombok.RequiredArgsConstructor
;
import
lombok.RequiredArgsConstructor
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
import
javax.validation.constraints.NotNull
;
import
javax.validation.constraints.NotNull
;
import
java.math.BigDecimal
;
import
java.util.concurrent.TimeUnit
;
/**
/**
* API-课程用户学习日志
* API-课程用户学习日志
...
@@ -18,5 +28,54 @@ public class ApiUserStudyBiz extends BaseBiz {
...
@@ -18,5 +28,54 @@ public class ApiUserStudyBiz extends BaseBiz {
@NotNull
@NotNull
private
final
UserStudyDao
dao
;
private
final
UserStudyDao
dao
;
@NotNull
private
final
ResourceDao
resourceDao
;
@NotNull
private
final
CacheRedis
cacheRedis
;
public
Result
<
String
>
study
(
AuthUserStudyReq
req
)
{
// 资源信息
Resource
resource
=
getByResource
(
req
);
if
(
ObjectUtil
.
isEmpty
(
resource
))
{
Result
.
error
(
"resourceId不正确"
);
}
if
(
new
BigDecimal
(
resource
.
getVideoLength
()).
subtract
(
req
.
getCurrentDuration
()).
intValue
()
<
1
)
{
// 若视频时长-观看时长<1,则认为观看完成
UserStudy
userStudy
=
getUserStudy
(
req
);
if
(
ObjectUtil
.
isEmpty
(
userStudy
))
{
Result
.
error
(
"studyId不正确"
);
}
if
(
userStudy
.
getProgress
().
compareTo
(
BigDecimal
.
valueOf
(
100
))
<
0
)
{
// 更新进度
userStudy
.
setProgress
(
BigDecimal
.
valueOf
(
100
));
dao
.
updateById
(
userStudy
);
// 清空缓存
cacheRedis
.
delete
(
Constants
.
RedisPre
.
USER_STUDY
+
req
.
getStudyId
());
cacheRedis
.
delete
(
Constants
.
RedisPre
.
PROGRESS
+
req
.
getStudyId
());
return
Result
.
success
(
"学习完成"
);
}
}
// 没观看完成,进度存入redis,如没看完,定时任务处理
req
.
setTotalDuration
(
new
BigDecimal
(
resource
.
getVideoLength
()));
cacheRedis
.
set
(
Constants
.
RedisPre
.
PROGRESS
+
req
.
getStudyId
(),
req
,
1
,
TimeUnit
.
DAYS
);
return
Result
.
success
(
"学习中"
);
}
private
Resource
getByResource
(
AuthUserStudyReq
req
)
{
Resource
resource
=
cacheRedis
.
getByJson
(
Constants
.
RedisPre
.
RESOURCE
+
req
.
getResourceId
(),
Resource
.
class
);
if
(
ObjectUtil
.
isEmpty
(
resource
))
{
resource
=
resourceDao
.
getById
(
req
.
getResourceId
());
cacheRedis
.
set
(
Constants
.
RedisPre
.
RESOURCE
+
req
.
getResourceId
(),
resource
,
1
,
TimeUnit
.
HOURS
);
}
return
resource
;
}
private
UserStudy
getUserStudy
(
AuthUserStudyReq
req
)
{
UserStudy
userStudy
=
cacheRedis
.
getByJson
(
Constants
.
RedisPre
.
USER_STUDY
+
req
.
getStudyId
(),
UserStudy
.
class
);
if
(
ObjectUtil
.
isEmpty
(
userStudy
))
{
userStudy
=
dao
.
getById
(
req
.
getStudyId
());
cacheRedis
.
set
(
Constants
.
RedisPre
.
USER_STUDY
+
req
.
getStudyId
(),
userStudy
,
1
,
TimeUnit
.
HOURS
);
}
return
userStudy
;
}
}
}
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/auth/biz/AuthCourseBiz.java
浏览文件 @
36017e03
...
@@ -62,7 +62,13 @@ public class AuthCourseBiz extends BaseBiz {
...
@@ -62,7 +62,13 @@ public class AuthCourseBiz extends BaseBiz {
userStudyDao
.
save
(
userStudy
);
userStudyDao
.
save
(
userStudy
);
}
}
String
sign
=
""
;
String
sign
=
""
;
return
Result
.
success
(
null
);
AuthCourseSignResp
resp
=
new
AuthCourseSignResp
();
resp
.
setProgress
(
userStudy
.
getProgress
());
resp
.
setStudyId
(
userStudy
.
getId
());
resp
.
setResourceId
(
period
.
getResourceId
());
resp
.
setSign
(
sign
);
return
Result
.
success
(
resp
);
}
}
private
Boolean
play
(
CourseChapterPeriod
period
)
{
private
Boolean
play
(
CourseChapterPeriod
period
)
{
...
...
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/auth/req/AuthUserStudyReq.java
浏览文件 @
36017e03
package
com.roncoo.education.course.service.auth.req
;
package
com.roncoo.education.course.service.auth.req
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
java.math.BigDecimal
;
import
java.time.LocalDateTime
;
import
java.io.Serializable
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
lombok.Data
;
import
lombok.experimental.Accessors
;
import
lombok.experimental.Accessors
;
import
java.io.Serializable
;
import
java.math.BigDecimal
;
/**
/**
* <p>
* <p>
* API-AUTH-课程用户学习日志
* API-AUTH-课程用户学习日志
...
@@ -24,29 +23,16 @@ public class AuthUserStudyReq implements Serializable {
...
@@ -24,29 +23,16 @@ public class AuthUserStudyReq implements Serializable {
private
static
final
long
serialVersionUID
=
1L
;
private
static
final
long
serialVersionUID
=
1L
;
@ApiModelProperty
(
value
=
"主键"
)
@ApiModelProperty
(
value
=
"学习ID"
)
private
Long
id
;
private
Long
studyId
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
@ApiModelProperty
(
value
=
"创建时间"
)
private
LocalDateTime
gmtCreate
;
@JsonFormat
(
pattern
=
"yyyy-MM-dd HH:mm:ss"
)
@ApiModelProperty
(
value
=
"修改时间"
)
private
LocalDateTime
gmtModified
;
@ApiModelProperty
(
value
=
"课程ID"
)
private
Long
courseId
;
@ApiModelProperty
(
value
=
"
章节
ID"
)
@ApiModelProperty
(
value
=
"
资源
ID"
)
private
Long
chapter
Id
;
private
Long
resource
Id
;
@ApiModelProperty
(
value
=
"
课时ID
"
)
@ApiModelProperty
(
value
=
"
当前观看时长
"
)
private
Long
periodId
;
private
BigDecimal
currentDuration
;
@ApiModelProperty
(
value
=
"
用户ID
"
)
@ApiModelProperty
(
value
=
"
总时长
"
)
private
Long
userId
;
private
BigDecimal
totalDuration
;
@ApiModelProperty
(
value
=
"进度(百分比)"
)
private
BigDecimal
progress
;
}
}
roncoo-education-course/roncoo-education-course-service/src/main/java/com/roncoo/education/course/service/auth/resp/AuthCourseSignResp.java
浏览文件 @
36017e03
...
@@ -29,6 +29,9 @@ public class AuthCourseSignResp implements Serializable {
...
@@ -29,6 +29,9 @@ public class AuthCourseSignResp implements Serializable {
@ApiModelProperty
(
value
=
"学习ID"
)
@ApiModelProperty
(
value
=
"学习ID"
)
private
Long
studyId
;
private
Long
studyId
;
@ApiModelProperty
(
value
=
"资源ID"
)
private
Long
resourceId
;
@ApiModelProperty
(
value
=
"最大学习进度"
)
@ApiModelProperty
(
value
=
"最大学习进度"
)
private
BigDecimal
progress
;
private
BigDecimal
progress
;
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录