serv-学习

This commit is contained in:
2025-10-24 18:28:26 +08:00
parent 6f5603dd8b
commit 8968409b2d
55 changed files with 2144 additions and 2570 deletions

View File

@@ -0,0 +1,90 @@
package org.xyzh.common.core.enums;
/**
* @description 成就条件类型枚举
* @filename AchievementConditionType.java
* @author yslg
* @copyright xyzh
* @since 2025-10-24
*/
public enum AchievementConditionType {
/**
* 1-学习时长(分钟)
*/
LEARNING_TIME(1, "学习时长"),
/**
* 2-浏览资源数量
*/
RESOURCE_VIEW_COUNT(2, "浏览资源数量"),
/**
* 3-完成课程数量
*/
COURSE_COMPLETE_COUNT(3, "完成课程数量"),
/**
* 4-连续登录天数
*/
CONTINUOUS_LOGIN_DAYS(4, "连续登录天数"),
/**
* 5-收藏资源数量
*/
RESOURCE_COLLECT_COUNT(5, "收藏资源数量"),
/**
* 6-完成任务数量
*/
TASK_COMPLETE_COUNT(6, "完成任务数量"),
/**
* 7-获得积分数量
*/
POINTS_EARNED(7, "获得积分数量"),
/**
* 8-发表评论数量
*/
COMMENT_COUNT(8, "发表评论数量"),
/**
* 9-完成章节数量
*/
CHAPTER_COMPLETE_COUNT(9, "完成章节数量"),
/**
* 10-累计登录天数
*/
TOTAL_LOGIN_DAYS(10, "累计登录天数");
private final int code;
private final String description;
AchievementConditionType(int code, String description) {
this.code = code;
this.description = description;
}
public int getCode() {
return code;
}
public String getDescription() {
return description;
}
/**
* 根据code获取条件类型
*/
public static AchievementConditionType fromCode(int code) {
for (AchievementConditionType type : values()) {
if (type.code == code) {
return type;
}
}
return null;
}
}

View File

@@ -0,0 +1,84 @@
package org.xyzh.common.core.enums;
/**
* @description 成就事件类型枚举
* @filename AchievementEventType.java
* @author yslg
* @copyright xyzh
* @since 2025-10-24
*/
public enum AchievementEventType {
/**
* 学习相关事件
*/
LEARNING_TIME_UPDATED("learning_time_updated", "学习时长更新"),
COURSE_COMPLETED("course_completed", "课程完成"),
COURSE_STARTED("course_started", "开始学习课程"),
CHAPTER_COMPLETED("chapter_completed", "章节完成"),
/**
* 资源相关事件
*/
RESOURCE_VIEWED("resource_viewed", "浏览资源"),
RESOURCE_COLLECTED("resource_collected", "收藏资源"),
RESOURCE_SHARED("resource_shared", "分享资源"),
/**
* 任务相关事件
*/
TASK_COMPLETED("task_completed", "任务完成"),
TASK_ITEM_COMPLETED("task_item_completed", "任务项完成"),
/**
* 互动相关事件
*/
COMMENT_POSTED("comment_posted", "发表评论"),
LIKE_GIVEN("like_given", "点赞"),
/**
* 登录相关事件
*/
USER_LOGIN("user_login", "用户登录"),
CONTINUOUS_LOGIN("continuous_login", "连续登录"),
/**
* 积分相关事件
*/
POINTS_EARNED("points_earned", "获得积分"),
/**
* 测试相关事件
*/
TEST_PASSED("test_passed", "测试通过"),
TEST_PERFECT_SCORE("test_perfect_score", "测试满分");
private final String code;
private final String description;
AchievementEventType(String code, String description) {
this.code = code;
this.description = description;
}
public String getCode() {
return code;
}
public String getDescription() {
return description;
}
/**
* 根据code获取事件类型
*/
public static AchievementEventType fromCode(String code) {
for (AchievementEventType type : values()) {
if (type.code.equals(code)) {
return type;
}
}
return null;
}
}

View File

@@ -0,0 +1,33 @@
package org.xyzh.common.core.enums;
/**
* @description 任务项类型常量
* @filename TaskItemType.java
* @author yslg
* @copyright xyzh
* @since 2025-10-24
*/
public enum TaskItemType {
/**
* 资源类型
*/
RESOURCE(1),
/**
* 课程类型
*/
COURSE(2);
private int value;
TaskItemType(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}

View File

@@ -0,0 +1,151 @@
package org.xyzh.common.core.event;
import org.xyzh.common.core.enums.AchievementEventType;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @description 成就事件数据类
* @filename AchievementEvent.java
* @author yslg
* @copyright xyzh
* @since 2025-10-24
*/
public class AchievementEvent {
/**
* 用户ID
*/
private String userID;
/**
* 事件类型
*/
private AchievementEventType eventType;
/**
* 事件值(如学习时长、资源数量等)
*/
private Integer eventValue;
/**
* 事件时间
*/
private Date eventTime;
/**
* 额外数据
*/
private Map<String, Object> extraData;
public AchievementEvent() {
this.eventTime = new Date();
this.extraData = new HashMap<>();
}
public AchievementEvent(String userID, AchievementEventType eventType, Integer eventValue) {
this.userID = userID;
this.eventType = eventType;
this.eventValue = eventValue;
this.eventTime = new Date();
this.extraData = new HashMap<>();
}
/**
* 构建器模式
*/
public static class Builder {
private final AchievementEvent event;
public Builder(String userID, AchievementEventType eventType) {
event = new AchievementEvent();
event.userID = userID;
event.eventType = eventType;
}
public Builder value(Integer value) {
event.eventValue = value;
return this;
}
public Builder extra(String key, Object value) {
event.extraData.put(key, value);
return this;
}
public Builder time(Date time) {
event.eventTime = time;
return this;
}
public AchievementEvent build() {
return event;
}
}
public static Builder builder(String userID, AchievementEventType eventType) {
return new Builder(userID, eventType);
}
public String getUserID() {
return userID;
}
public void setUserID(String userID) {
this.userID = userID;
}
public AchievementEventType getEventType() {
return eventType;
}
public void setEventType(AchievementEventType eventType) {
this.eventType = eventType;
}
public Integer getEventValue() {
return eventValue;
}
public void setEventValue(Integer eventValue) {
this.eventValue = eventValue;
}
public Date getEventTime() {
return eventTime;
}
public void setEventTime(Date eventTime) {
this.eventTime = eventTime;
}
public Map<String, Object> getExtraData() {
return extraData;
}
public void setExtraData(Map<String, Object> extraData) {
this.extraData = extraData;
}
public Object getExtraData(String key) {
return extraData.get(key);
}
public void putExtraData(String key, Object value) {
this.extraData.put(key, value);
}
@Override
public String toString() {
return "AchievementEvent{" +
"userID='" + userID + '\'' +
", eventType=" + eventType +
", eventValue=" + eventValue +
", eventTime=" + eventTime +
", extraData=" + extraData +
'}';
}
}

View File

@@ -19,6 +19,11 @@ public class TbLearningRecord extends BaseDTO {
* @description 用户ID
*/
private String userID;
/**
* @description 任务ID
*/
private String taskID;
/**
* @description 资源类型1资源 2课程 3章节
@@ -29,11 +34,21 @@ public class TbLearningRecord extends BaseDTO {
* @description 资源ID
*/
private String resourceID;
/**
* @description 任务ID
* @description 课程ID
*/
private String taskID;
private String courseID;
/**
* @description 章节ID
*/
private String chapterID;
/**
* @description 节点ID
*/
private String nodeID;
/**
* @description 学习时长(秒)
@@ -79,11 +94,6 @@ public class TbLearningRecord extends BaseDTO {
* @description 删除时间
*/
private Date deleteTime;
/**
* @description 是否删除
*/
private Boolean deleted;
public String getUserID() {
return userID;
@@ -93,6 +103,14 @@ public class TbLearningRecord extends BaseDTO {
this.userID = userID;
}
public String getTaskID() {
return taskID;
}
public void setTaskID(String taskID) {
this.taskID = taskID;
}
public Integer getResourceType() {
return resourceType;
}
@@ -109,12 +127,30 @@ public class TbLearningRecord extends BaseDTO {
this.resourceID = resourceID;
}
public String getTaskID() {
return taskID;
public String getCourseID() {
return courseID;
}
public void setTaskID(String taskID) {
this.taskID = taskID;
public void setCourseID(String courseID) {
this.courseID = courseID;
}
public String getChapterID() {
return chapterID;
}
public void setChapterID(String chapterID) {
this.chapterID = chapterID;
}
public String getNodeID() {
return nodeID;
}
public void setNodeID(String nodeID) {
this.nodeID = nodeID;
}
public Integer getDuration() {
@@ -194,9 +230,12 @@ public class TbLearningRecord extends BaseDTO {
return "TbLearningRecord{" +
"id=" + getID() +
", userID='" + userID + '\'' +
", taskID='" + taskID + '\'' +
", resourceType=" + resourceType +
", resourceID='" + resourceID + '\'' +
", taskID='" + taskID + '\'' +
", courseID='" + courseID + '\'' +
", chapterID='" + chapterID + '\'' +
", nodeID='" + nodeID + '\'' +
", duration=" + duration +
", progress=" + progress +
", isComplete=" + isComplete +

View File

@@ -4,13 +4,13 @@ import org.xyzh.common.dto.BaseDTO;
import java.util.Date;
/**
* @description 任务课程关联表
* @filename TbTaskCourse.java
* @description 任务关联表统一管理资源和课程
* @filename TbTaskItem.java
* @author yslg
* @copyright xyzh
* @since 2025-10-15
* @since 2025-10-24
*/
public class TbTaskCourse extends BaseDTO {
public class TbTaskItem extends BaseDTO {
private static final long serialVersionUID = 1L;
@@ -20,9 +20,14 @@ public class TbTaskCourse extends BaseDTO {
private String taskID;
/**
* @description 课程ID
* @description 项类型1资源 2课程
*/
private String courseID;
private Integer itemType;
/**
* @description 项ID资源ID或课程ID
*/
private String itemID;
/**
* @description 是否必须完成
@@ -43,21 +48,8 @@ public class TbTaskCourse extends BaseDTO {
* @description 更新者
*/
private String updater;
/**
* @description 更新时间
*/
private Date updateTime;
/**
* @description 删除时间
*/
private Date deleteTime;
/**
* @description 是否删除
*/
private Boolean deleted;
public String getTaskID() {
return taskID;
@@ -67,12 +59,20 @@ public class TbTaskCourse extends BaseDTO {
this.taskID = taskID;
}
public String getCourseID() {
return courseID;
public Integer getItemType() {
return itemType;
}
public void setCourseID(String courseID) {
this.courseID = courseID;
public void setItemType(Integer itemType) {
this.itemType = itemType;
}
public String getItemID() {
return itemID;
}
public void setItemID(String itemID) {
this.itemID = itemID;
}
public Boolean getRequired() {
@@ -107,31 +107,18 @@ public class TbTaskCourse extends BaseDTO {
this.updater = updater;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Date getDeleteTime() {
return deleteTime;
}
public void setDeleteTime(Date deleteTime) {
this.deleteTime = deleteTime;
}
@Override
public String toString() {
return "TbTaskCourse{" +
return "TbTaskItem{" +
"id=" + getID() +
", taskID='" + taskID + '\'' +
", courseID='" + courseID + '\'' +
", itemType=" + itemType +
", itemID='" + itemID + '\'' +
", required=" + required +
", orderNum=" + orderNum +
", createTime=" + getCreateTime() +
'}';
}
}

View File

@@ -1,139 +0,0 @@
package org.xyzh.common.dto.study;
import org.xyzh.common.dto.BaseDTO;
import java.util.Date;
/**
* @description 任务资源关联表
* @filename TbTaskResource.java
* @author yslg
* @copyright xyzh
* @since 2025-10-15
*/
public class TbTaskResource extends BaseDTO {
private static final long serialVersionUID = 1L;
/**
* @description 任务ID
*/
private String taskID;
/**
* @description 资源ID
*/
private String resourceID;
/**
* @description 是否必须完成
*/
private Boolean required;
/**
* @description 排序号
*/
private Integer orderNum;
/**
* @description 创建者
*/
private String creator;
/**
* @description 更新者
*/
private String updater;
/**
* @description 更新时间
*/
private Date updateTime;
/**
* @description 删除时间
*/
private Date deleteTime;
/**
* @description 是否删除
*/
private Boolean deleted;
public String getTaskID() {
return taskID;
}
public void setTaskID(String taskID) {
this.taskID = taskID;
}
public String getResourceID() {
return resourceID;
}
public void setResourceID(String resourceID) {
this.resourceID = resourceID;
}
public Boolean getRequired() {
return required;
}
public void setRequired(Boolean required) {
this.required = required;
}
public Integer getOrderNum() {
return orderNum;
}
public void setOrderNum(Integer orderNum) {
this.orderNum = orderNum;
}
public String getCreator() {
return creator;
}
public void setCreator(String creator) {
this.creator = creator;
}
public String getUpdater() {
return updater;
}
public void setUpdater(String updater) {
this.updater = updater;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
public Date getDeleteTime() {
return deleteTime;
}
public void setDeleteTime(Date deleteTime) {
this.deleteTime = deleteTime;
}
@Override
public String toString() {
return "TbTaskResource{" +
"id=" + getID() +
", taskID='" + taskID + '\'' +
", resourceID='" + resourceID + '\'' +
", required=" + required +
", orderNum=" + orderNum +
", createTime=" + getCreateTime() +
'}';
}
}

View File

@@ -0,0 +1,134 @@
package org.xyzh.common.dto.usercenter;
import org.xyzh.common.dto.BaseDTO;
import java.util.Date;
/**
* @description 用户成就进度表 - 追踪用户朝向成就的进度
* @filename TbUserAchievementProgress.java
* @author yslg
* @copyright xyzh
* @since 2025-10-24
*/
public class TbUserAchievementProgress extends BaseDTO {
private static final long serialVersionUID = 1L;
/**
* @description 用户ID
*/
private String userID;
/**
* @description 成就ID
*/
private String achievementID;
/**
* @description 当前进度值
*/
private Integer currentValue;
/**
* @description 目标进度值(冗余字段,方便查询)
*/
private Integer targetValue;
/**
* @description 进度百分比 (0-100)
*/
private Integer progressPercentage;
/**
* @description 是否已完成
*/
private Boolean completed;
/**
* @description 最后更新时间
*/
private Date lastUpdateTime;
public String getUserID() {
return userID;
}
public void setUserID(String userID) {
this.userID = userID;
}
public String getAchievementID() {
return achievementID;
}
public void setAchievementID(String achievementID) {
this.achievementID = achievementID;
}
public Integer getCurrentValue() {
return currentValue;
}
public void setCurrentValue(Integer currentValue) {
this.currentValue = currentValue;
updateProgressPercentage();
}
public Integer getTargetValue() {
return targetValue;
}
public void setTargetValue(Integer targetValue) {
this.targetValue = targetValue;
updateProgressPercentage();
}
public Integer getProgressPercentage() {
return progressPercentage;
}
public void setProgressPercentage(Integer progressPercentage) {
this.progressPercentage = progressPercentage;
}
public Boolean getCompleted() {
return completed;
}
public void setCompleted(Boolean completed) {
this.completed = completed;
}
public Date getLastUpdateTime() {
return lastUpdateTime;
}
public void setLastUpdateTime(Date lastUpdateTime) {
this.lastUpdateTime = lastUpdateTime;
}
/**
* 更新进度百分比
*/
private void updateProgressPercentage() {
if (currentValue != null && targetValue != null && targetValue > 0) {
this.progressPercentage = Math.min(100, (int) ((currentValue * 100.0) / targetValue));
this.completed = currentValue >= targetValue;
}
}
@Override
public String toString() {
return "TbUserAchievementProgress{" +
"id=" + getID() +
", userID='" + userID + '\'' +
", achievementID='" + achievementID + '\'' +
", currentValue=" + currentValue +
", targetValue=" + targetValue +
", progressPercentage=" + progressPercentage +
", completed=" + completed +
", lastUpdateTime=" + lastUpdateTime +
'}';
}
}

View File

@@ -1,17 +1,15 @@
package org.xyzh.common.vo;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.xyzh.common.dto.study.TbLearningTask;
import org.xyzh.common.dto.study.TbTaskCourse;
import org.xyzh.common.dto.study.TbTaskResource;
import org.xyzh.common.dto.study.TbTaskItem;
import org.xyzh.common.dto.study.TbTaskUser;
public class TaskItemVO extends TbLearningTask {
private Integer itemType;
private String courseID;
private String courseName;
private String resourceID;
@@ -29,18 +27,31 @@ public class TaskItemVO extends TbLearningTask {
public TaskItemVO() {
}
public TaskItemVO(TbTaskCourse taskCourse) {
this.courseID = taskCourse.getCourseID();
this.setTaskID(taskCourse.getTaskID());
this.orderNum = taskCourse.getOrderNum();
this.required = taskCourse.getRequired();
public Integer getItemType() {
return itemType;
}
public TaskItemVO(TbTaskResource taskResource) {
this.resourceID = taskResource.getResourceID();
this.setTaskID(taskResource.getTaskID());
this.required = taskResource.getRequired();
this.orderNum = taskResource.getOrderNum();
public void setItemType(Integer itemType) {
this.itemType = itemType;
}
public TaskItemVO(TbTaskItem taskItem) {
this.itemType = taskItem.getItemType();
this.setTaskID(taskItem.getTaskID());
this.orderNum = taskItem.getOrderNum();
this.required = taskItem.getRequired();
this.setID(taskItem.getID());
this.setCreateTime(taskItem.getCreateTime());
this.setCreator(taskItem.getCreator());
// 根据类型设置对应的ID
if (taskItem.getItemType() != null) {
if (taskItem.getItemType() == 2) { // 课程
this.courseID = taskItem.getItemID();
} else if (taskItem.getItemType() == 1) { // 资源
this.resourceID = taskItem.getItemID();
}
}
}
public TaskItemVO(TbTaskUser taskUser) {
this.userID = taskUser.getUserID();
@@ -100,21 +111,30 @@ public class TaskItemVO extends TbLearningTask {
this.orderNum = orderNum;
}
public TbTaskCourse toTaskCourse() {
TbTaskCourse taskCourse = new TbTaskCourse();
taskCourse.setCourseID(courseID);
taskCourse.setTaskID(getTaskID());
taskCourse.setCreateTime(getCreateTime());
taskCourse.setCreator(getCreator());
return taskCourse;
}
public TbTaskResource toTaskResource() {
TbTaskResource taskResource = new TbTaskResource();
taskResource.setResourceID(resourceID);
taskResource.setTaskID(getTaskID());
taskResource.setCreateTime(getCreateTime());
taskResource.setCreator(getCreator());
return taskResource;
public TbTaskItem toTaskItem() {
TbTaskItem taskItem = new TbTaskItem();
taskItem.setID(getID());
taskItem.setTaskID(getTaskID());
taskItem.setItemType(itemType);
taskItem.setRequired(required);
taskItem.setOrderNum(orderNum);
taskItem.setCreateTime(getCreateTime());
taskItem.setCreator(getCreator());
// 根据类型设置对应的itemID
if (courseID != null && !courseID.isEmpty()) {
taskItem.setItemID(courseID);
if (itemType == null) {
taskItem.setItemType(2); // 课程
}
} else if (resourceID != null && !resourceID.isEmpty()) {
taskItem.setItemID(resourceID);
if (itemType == null) {
taskItem.setItemType(1); // 资源
}
}
return taskItem;
}
public TbTaskUser toTaskUser() {
TbTaskUser taskUser = new TbTaskUser();

View File

@@ -2,8 +2,7 @@ package org.xyzh.common.vo;
import org.xyzh.common.dto.BaseDTO;
import org.xyzh.common.dto.study.TbLearningTask;
import org.xyzh.common.dto.study.TbTaskCourse;
import org.xyzh.common.dto.study.TbTaskResource;
import org.xyzh.common.dto.study.TbTaskItem;
import org.xyzh.common.dto.study.TbTaskUser;
import java.util.List;
@@ -77,31 +76,28 @@ public class TaskVO extends BaseDTO{
public void setTaskStatus(Integer taskStatus) {
this.taskStatus = taskStatus;
}
public List<TbTaskCourse> toTaskCourses() {
return getTaskCourses().stream().map(TaskItemVO::toTaskCourse).collect(Collectors.toList());
public List<TbTaskItem> toTaskCourses() {
return getTaskCourses().stream().map(TaskItemVO::toTaskItem).collect(Collectors.toList());
}
public List<TbTaskResource> toTaskResources() {
return getTaskResources().stream().map(TaskItemVO::toTaskResource).collect(Collectors.toList());
public List<TbTaskItem> toTaskResources() {
return getTaskResources().stream().map(TaskItemVO::toTaskItem).collect(Collectors.toList());
}
public List<TbTaskUser> toTaskUsers() {
return getTaskUsers().stream().map(TaskItemVO::toTaskUser).collect(Collectors.toList());
}
public void setTaskCourseList(List<TbTaskCourse> taskCourses) {
if (taskCourses == null) {
public void setTaskItemList(List<TbTaskItem> taskItems) {
if (taskItems == null) {
return;
}
this.taskCourses = taskCourses.stream().map(item -> {
return new TaskItemVO(item);
}).collect(Collectors.toList());
}
public void setTaskResourceList(List<TbTaskResource> taskResources) {
if (taskResources == null) {
return;
}
this.taskResources = taskResources.stream().map(item -> {
return new TaskItemVO(item);
}).collect(Collectors.toList());
this.taskCourses = taskItems.stream()
.filter(item -> item.getItemType() == 2)
.map(TaskItemVO::new)
.collect(Collectors.toList());
this.taskResources = taskItems.stream()
.filter(item -> item.getItemType() == 1)
.map(TaskItemVO::new)
.collect(Collectors.toList());
}
public void setTaskUserList(List<TbTaskUser> taskUsers) {
if (taskUsers == null) {