mirror of
https://github.com/PlayEdu/PlayEdu
synced 2025-07-29 05:49:31 +08:00
Compare commits
3 Commits
12c4b810c2
...
877aec3b01
Author | SHA1 | Date | |
---|---|---|---|
|
877aec3b01 | ||
|
e8399362ea | ||
|
5dcde4f911 |
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## 系统介绍
|
## 系统介绍
|
||||||
|
|
||||||
**PlayEdu** 是由白书科技团队经营多年线上教育系统打造出的一款全新的企业培训解决方案,致力于为更多企业机构搭建私有化内部培训平台。**PlayEdu** 基于 Java + MySQL 开发;采用前后端分离模式;前台采用 React18 为核心框架,后台采用 SpringBoot3 为核心框架。提供部门管理、学员管理、在线视频学习、学员进度追踪、视频私有化存储等培训主要功能。**与此同时,我们在开源版本的基础上还提供了功能更加丰富的企业版本。企业版本在开源功能的基础上提供了包括视频云端存储、视频加密、音频学习、文档(PDF|WORD|PPT)在线学习、在线考试、学习计划培训等功能。企业版本更多信息请点击下方的企业版链接查看。**
|
**PlayEdu** 是由白书科技团队经营多年线上教育系统打造出的一款全新的企业培训解决方案,致力于为更多企业机构搭建私有化内部培训平台。**PlayEdu** 基于 Java + MySQL 开发;采用前后端分离模式;前端采用 React18 为核心框架,后端采用 SpringBoot3 为核心框架。提供部门管理、学员管理、在线视频学习、学员进度追踪、视频私有化存储等培训主要功能。**与此同时,我们在开源版本的基础上还提供了功能更加丰富的企业版本。企业版本在开源功能的基础上提供了包括视频云端存储、视频加密、音频学习、文档(PDF|WORD|PPT)在线学习、在线考试、学习计划培训等功能。企业版本更多信息请点击下方的企业版链接查看。**
|
||||||
|
|
||||||
## 常用链接
|
## 常用链接
|
||||||
|
|
||||||
@ -14,7 +14,7 @@
|
|||||||
| **企业版** | [https://www.playedu.xyz/commercial](https://www.playedu.xyz/commercial) |
|
| **企业版** | [https://www.playedu.xyz/commercial](https://www.playedu.xyz/commercial) |
|
||||||
| 部署文档 | [https://www.playedu.xyz/book](https://www.playedu.xyz/book) |
|
| 部署文档 | [https://www.playedu.xyz/book](https://www.playedu.xyz/book) |
|
||||||
| 系统演示 | [https://www.playedu.xyz/demo](https://www.playedu.xyz/demo) |
|
| 系统演示 | [https://www.playedu.xyz/demo](https://www.playedu.xyz/demo) |
|
||||||
| 问答社区 | [https://www.playedu.xyz/qa?scene=new](https://www.playedu.xyz/qa?scene=new) |
|
| 问答社区 | [https://www.playedu.xyz/qa](https://www.playedu.xyz/qa) |
|
||||||
|
|
||||||
## 依赖前端项目
|
## 依赖前端项目
|
||||||
|
|
||||||
|
@ -36,6 +36,7 @@ import xyz.playedu.common.types.JsonResponse;
|
|||||||
import xyz.playedu.common.types.mapper.UserCourseHourRecordUserFirstCreatedAtMapper;
|
import xyz.playedu.common.types.mapper.UserCourseHourRecordUserFirstCreatedAtMapper;
|
||||||
import xyz.playedu.common.types.paginate.PaginationResult;
|
import xyz.playedu.common.types.paginate.PaginationResult;
|
||||||
import xyz.playedu.common.types.paginate.UserPaginateFilter;
|
import xyz.playedu.common.types.paginate.UserPaginateFilter;
|
||||||
|
import xyz.playedu.course.domain.UserCourseHourRecord;
|
||||||
import xyz.playedu.course.domain.UserCourseRecord;
|
import xyz.playedu.course.domain.UserCourseRecord;
|
||||||
import xyz.playedu.course.service.CourseService;
|
import xyz.playedu.course.service.CourseService;
|
||||||
import xyz.playedu.course.service.UserCourseHourRecordService;
|
import xyz.playedu.course.service.UserCourseHourRecordService;
|
||||||
@ -141,6 +142,14 @@ public class CourseUserController {
|
|||||||
userService.getDepIdsGroup(result.getData().stream().map(User::getId).toList()));
|
userService.getDepIdsGroup(result.getData().stream().map(User::getId).toList()));
|
||||||
data.put("departments", departmentService.id2name());
|
data.put("departments", departmentService.id2name());
|
||||||
|
|
||||||
|
// 获取每个学员的最早学习时间
|
||||||
|
List<UserCourseHourRecord> perUserEarliestRecords =
|
||||||
|
userCourseHourRecordService.getCoursePerUserEarliestRecord(courseId);
|
||||||
|
data.put(
|
||||||
|
"per_user_earliest_records",
|
||||||
|
perUserEarliestRecords.stream()
|
||||||
|
.collect(Collectors.toMap(UserCourseHourRecord::getUserId, e -> e)));
|
||||||
|
|
||||||
return JsonResponse.data(data);
|
return JsonResponse.data(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,17 +33,17 @@ public class LDAPSchedule {
|
|||||||
|
|
||||||
@Scheduled(fixedRate = 3600000)
|
@Scheduled(fixedRate = 3600000)
|
||||||
public void sync() {
|
public void sync() {
|
||||||
if (!ldapBus.enabledLDAP()) {
|
|
||||||
log.info("未配置LDAP服务");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 系统刚启动不执行
|
// 系统刚启动不执行
|
||||||
if (times == 0) {
|
if (times == 0) {
|
||||||
times++;
|
times++;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ldapBus.enabledLDAP()) {
|
||||||
|
log.info("未配置LDAP服务");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ldapBus.departmentSync();
|
ldapBus.departmentSync();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -50,4 +50,6 @@ public interface UserCourseHourRecordMapper extends BaseMapper<UserCourseHourRec
|
|||||||
Long paginateCount(UserCourseHourRecordPaginateFilter filter);
|
Long paginateCount(UserCourseHourRecordPaginateFilter filter);
|
||||||
|
|
||||||
List<UserCourseHourRecord> getUserPerCourseEarliestRecord(Integer userId);
|
List<UserCourseHourRecord> getUserPerCourseEarliestRecord(Integer userId);
|
||||||
|
|
||||||
|
List<UserCourseHourRecord> getCoursePerUserEarliestRecord(Integer courseId);
|
||||||
}
|
}
|
||||||
|
@ -68,4 +68,6 @@ public interface UserCourseHourRecordService extends IService<UserCourseHourReco
|
|||||||
int page, int size, UserCourseHourRecordPaginateFilter filter);
|
int page, int size, UserCourseHourRecordPaginateFilter filter);
|
||||||
|
|
||||||
List<UserCourseHourRecord> getUserPerCourseEarliestRecord(Integer userId);
|
List<UserCourseHourRecord> getUserPerCourseEarliestRecord(Integer userId);
|
||||||
|
|
||||||
|
List<UserCourseHourRecord> getCoursePerUserEarliestRecord(Integer courseId);
|
||||||
}
|
}
|
||||||
|
@ -184,4 +184,9 @@ public class UserCourseHourRecordServiceImpl
|
|||||||
public List<UserCourseHourRecord> getUserPerCourseEarliestRecord(Integer userId) {
|
public List<UserCourseHourRecord> getUserPerCourseEarliestRecord(Integer userId) {
|
||||||
return getBaseMapper().getUserPerCourseEarliestRecord(userId);
|
return getBaseMapper().getUserPerCourseEarliestRecord(userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<UserCourseHourRecord> getCoursePerUserEarliestRecord(Integer courseId) {
|
||||||
|
return getBaseMapper().getCoursePerUserEarliestRecord(courseId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -168,4 +168,25 @@
|
|||||||
AND `b`.`course_id` = `a`.`course_id`
|
AND `b`.`course_id` = `a`.`course_id`
|
||||||
AND `b`.`user_id` = `a`.`user_id`;
|
AND `b`.`user_id` = `a`.`user_id`;
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="getCoursePerUserEarliestRecord" resultType="xyz.playedu.course.domain.UserCourseHourRecord">
|
||||||
|
SELECT
|
||||||
|
`a`.*
|
||||||
|
FROM
|
||||||
|
`user_course_hour_records` AS `a`
|
||||||
|
INNER JOIN (
|
||||||
|
SELECT
|
||||||
|
min(`created_at`) AS `min_created_at`,
|
||||||
|
`course_id`,
|
||||||
|
`user_id`
|
||||||
|
FROM
|
||||||
|
`user_course_hour_records`
|
||||||
|
WHERE
|
||||||
|
`course_id` = #{courseId}
|
||||||
|
GROUP BY
|
||||||
|
`course_id`,
|
||||||
|
`user_id`) AS `b` ON `b`.`min_created_at` = `a`.`created_at`
|
||||||
|
AND `b`.`course_id` = `a`.`course_id`
|
||||||
|
AND `b`.`user_id` = `a`.`user_id`;
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user