提交 36017e03 编写于 作者: F fengyw

修改

上级 ed5be07e
......@@ -30,6 +30,9 @@ public final class Constants {
String ADMINI_MENU = "admin::menu::";
String USERS_INFO = "users::info::";
String ADMIN_VERI_CODE = "admin::ver::code::";
String USER_STUDY = "user::study::";
String RESOURCE = "resource::";
String PROGRESS = "progress::";
}
}
......@@ -18,6 +18,10 @@ public class CacheRedis {
@Autowired
private StringRedisTemplate stringRedisTemplate;
public StringRedisTemplate getStringRedisTemplate() {
return stringRedisTemplate;
}
/**
* 默认缓存5分钟
*/
......
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);
}
}
}
}
}
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.auth.req.AuthUserStudyReq;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotNull;
......@@ -23,4 +28,16 @@ public class ApiUserStudyController {
@NotNull
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);
}
}
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.course.dao.ResourceDao;
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 org.springframework.stereotype.Component;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.concurrent.TimeUnit;
/**
* API-课程用户学习日志
......@@ -18,5 +28,54 @@ public class ApiUserStudyBiz extends BaseBiz {
@NotNull
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;
}
}
......@@ -62,7 +62,13 @@ public class AuthCourseBiz extends BaseBiz {
userStudyDao.save(userStudy);
}
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) {
......
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.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* <p>
* API-AUTH-课程用户学习日志
......@@ -24,29 +23,16 @@ public class AuthUserStudyReq implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "主键")
private Long id;
@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")
private Long studyId;
@ApiModelProperty(value = "章节ID")
private Long chapterId;
@ApiModelProperty(value = "资源ID")
private Long resourceId;
@ApiModelProperty(value = "课时ID")
private Long periodId;
@ApiModelProperty(value = "当前观看时长")
private BigDecimal currentDuration;
@ApiModelProperty(value = "用户ID")
private Long userId;
@ApiModelProperty(value = "总时长")
private BigDecimal totalDuration;
@ApiModelProperty(value = "进度(百分比)")
private BigDecimal progress;
}
......@@ -29,6 +29,9 @@ public class AuthCourseSignResp implements Serializable {
@ApiModelProperty(value = "学习ID")
private Long studyId;
@ApiModelProperty(value = "资源ID")
private Long resourceId;
@ApiModelProperty(value = "最大学习进度")
private BigDecimal progress;
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册