feat:更新埃学习文档

This commit is contained in:
2026-06-01 19:58:05 +08:00
parent 2777ef8676
commit a825ccdadb
3 changed files with 56 additions and 10 deletions

View File

@@ -7,6 +7,7 @@
  为解决企业内部线下培训成本高、进度难追踪的问题,开发了一套企业在线学习平台,用于员工课程学习、在线考试、培训计划管理与数据统计分析,已全面接入企业微信工作台。
# 二、系统架构
![架构图](../images/aixuexi_arch.png)
# 三、核心模块
## 3.1 员工端
@@ -31,7 +32,15 @@
| **视频处理** | Java JAVE 2 (FFmpeg 封装,视频压缩转码) |
| **运维** | Docker、Fluent Bit (日志采集)、OpenObserver (日志可视化) |
# 五、难点/亮点
# 五、核心设计
- 基于 Spring Boot 3 + MyBatisPlus 构建稳定的后端架构,通过 SaToken 实现接口级鉴权,保障系统安全与权限可控。
- 集成企业微信 SDK实现企业微信工作台免登录认证通过企业微信消息通知机制自动推送学习任务与提醒。
- 设计课程、学习计划与考试等核心业务模型,支持批量下发培训任务;实现随机组卷、自动阅卷与成绩统计,并自动提醒员工完成学习任务。
- 基于 JAVE2FFmpeg实现视频自动压缩与转码适配多终端播放采用 AList 作为统一文件存储平台,集中管理音视频及课件资源。
- 基于 Vue 3 + Element Plus + Pinia 构建管理员端与员工端页面,集成 vueoffice 实现多格式文档在线预览集合ECharts实现多维度数据分析。
- 使用 Docker 容器化部署,结合 Fluent Bit + OpenObserver 构建统一日志监控体系,提升系统可观测性与运维效率。
# 六、难点/亮点
## 5.1 公网视频播放卡顿
* 问题
  服务器公网带宽小,高清视频并发播放严重卡顿。
@@ -62,7 +71,7 @@
* 效果
  培训通知实时触达,未读提醒显著提高培训完成率;管理员无需手动维护人员信息,降低了系统运维成本。
# 、成果
# 、成果
1. 平台全面替代线下培训,年度培训计划完成率由 60% 提升至 95% 以上,满足了企业合规培训要求。
2. 过视频压缩方案解决了公网带宽瓶颈,结合企业微信自动化通知,大幅降低人工催办成本,整体培训运营成本下降约 40%。
3. 实现了学习进度防作弊与学习记录全跟踪,为公司提供精准的数据统计报表,支撑人才盘点与绩效评估。

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

View File

@@ -262,10 +262,47 @@ public interface UserMapper {
</resultMap>
```
&emsp;&emsp;其中`<collection>`也可以使用嵌套查询:
&emsp;&emsp;对应的数据结构为:
```java
public class Blog {
private Integer id;
private String title;
private Author author; // 一对一
private List<Post> posts; // 一对多
}
public class Author {
private Integer id;
private String username;
private String password;
private String email;
private String bio;
private String favouriteSection;
}
public class Post {
private Integer id;
private String subject;
private Author author; // 一对一
private List<Comment> comments; // 一对多
private List<Tag> tags; // 一对多
}
public class Comment {
private Integer id;
}
public class Tag {
private Integer id;
}
```
&emsp;&emsp;其中`<collection>`也可以使用嵌套查询,例如`<collection property="posts" ofType="Post" select="queryPost"/>`
```xml
<collection property="posts" ofType="Post" select="queryPost"/>
<select id="queryPost" resultMap="postResultMap">
</select>
<resultMap id="postResultMap" type="Post">
<id property="id" column="post_id"/>
@@ -281,11 +318,6 @@ public interface UserMapper {
<case value="1" resultType="DraftPost"/>
</discriminator>
</resultMap>
<select id="queryPost" resultMap="postResultMap">
</select>
```
&emsp;&emsp;如果需要传递参数,可以在`<collection>`添加`column`属性:
@@ -304,7 +336,12 @@ public interface UserMapper {
+ 映射语句文件中的所有 select 语句的结果将会被缓存。
+ 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
+ 一级缓存和二级缓存区别在于一级缓存只针对一次SqlSession二级缓存针对全局范围。
+ 一级缓存和二级缓存区别在于一级缓存只针对一次SqlSession二级缓存针对全局范围。
::: tip
一级缓存作用于service里面的同一个方法一个方法就是一个SqlSession多次查询时直接返回缓存数据如果是同一个service里面的不同方法就是多个SqlSession一级缓存会失效。
二级缓存作用于同一个mapper即使是不同的service的不同方法只要是同一个mapper都可以使用二级缓存。
:::
## 4.6 动态SQL
+ if :是/否