Compare commits

...

182 Commits
main ... dev2

Author SHA1 Message Date
小张
6d6ded74b4 feat:bug修改 2025-09-20 18:02:40 +08:00
QDKF
50adc24979 feat: 调整路由 2025-09-20 14:35:59 +08:00
QDKF
b5db02d95c fix: 修复系统消息API响应数据格式解析错误 2025-09-19 20:41:08 +08:00
QDKF
dd73e28b08 fix: 修复消息中心角标显示问题 2025-09-19 20:26:43 +08:00
QDKF
23c54eaf40 feat: 消息中心接入接口,修复分页功能样式,新增班级Excel导出,统计页课程详情接入接口 2025-09-19 20:15:10 +08:00
小张
e687fa8ebd feat:讨论模式页面全部完成,bug修改,吴老师说的bug修改 2025-09-19 18:48:17 +08:00
yuk255
061a67a5e8 style:修复侧边栏高度溢出问题;修复课件导航条层级过高,浮动在nav上部错误样式 2025-09-19 10:59:17 +08:00
小张
23f6924711 feat:答题卡页面封装,练习功能全部完成 2025-09-19 01:49:34 +08:00
QDKF
935c68ac6d feat: 即时消息页面重构,新增表情,图片,文件功能,修复聊天区域布局问题,解决消息过多时输入框被挤下去的问题,调整系统消息页面 2025-09-18 22:35:37 +08:00
yuk255
aa87b0e8e4 feat: 课件界面重构,对接接口;章节页面基础框架接口对接;一些样式优化 2025-09-18 19:52:57 +08:00
小张
b20cc50f44 feat:讨论模式页面框架搭建 2025-09-18 02:18:47 +08:00
QDKF
8de56bd07c feat: 证书页面添加过滤动画,空状态样式,搜索反馈 2025-09-17 22:41:42 +08:00
yuk255
3c3c2063b0 fix:修复编辑按钮跳转失败问题 2025-09-17 13:01:27 +08:00
yuk255
e086442a2d fix:修复试卷页面不能跳转批阅和分析页面的bug 2025-09-17 12:57:28 +08:00
yuk255
8a2a8add39 feat:课程新增编辑添加学期和允许资源下载开关 2025-09-17 10:38:18 +08:00
yuk255
a4cd04429a fix:修复打包报错 2025-09-16 20:09:56 +08:00
yuk255
bff716f6b6 fix:修复课程删除报错,修复课程编辑字段保存回显问题 2025-09-16 19:42:33 +08:00
yuk255
568d8fdf47 refactor:重构章节新增编辑页面 2025-09-16 19:41:56 +08:00
yuk255
3425097b15 style: 修复教师端已知的页面滚动和页面过高的样式问题 2025-09-16 19:35:34 +08:00
QDKF
7e540664e2 feat: 添加班级管理搜索,调整学员库数据,批量删除,分页器显示,修复侧边栏高度问题 2025-09-16 19:28:31 +08:00
小张
68c64a96c1 feat:报错修复,练习页面加载, 2025-09-16 18:52:38 +08:00
小张
27b68d2abc feat:新增运维模式 2025-09-16 15:00:36 +08:00
QDKF
ef49c7b6d3 feat: 对接我的会话,查询会话消息,查询群聊成员列表,查询课程评论接口;添加会话消息空状态样式,添加证书中心内容样式,修复班级管理组件删除学员功能 2025-09-15 19:34:25 +08:00
yuk255
ad2ec33c6a fix:修复课程页面进入错误刷新的问题 2025-09-15 16:27:30 +08:00
yuk255
b287cf73b9 feat:修改菜单顺序,修改部分菜单命名 2025-09-15 15:44:23 +08:00
QDKF
760290bfb0 feat: 修复 2025-09-15 11:56:14 +08:00
小张
ed8e688422 feat:根据吴老师进行样式修改 2025-09-15 10:04:37 +08:00
QDKF
1721ab50fc feat: 试卷管理:删除接口,添加试卷部分接口(获取题库,获取题目,导入,导出功能),修复题库管理获取课程列表,分页器显示和切换问题,对接导入题库接口,添加试题接入查询分类,难度接口,修复试题渲染问题,修复编辑题目时选项数据无法正确显示的问题,添加试题编辑接口 2025-09-13 19:50:45 +08:00
yuk255
3461499661 feat:添加学校列表接口 2025-09-13 19:37:59 +08:00
yuk255
d9d80c8337 feat:对接课程下教师的接口;修改章节页面 2025-09-13 16:20:00 +08:00
小张
2031fa4ba4 feat:修复 2025-09-13 15:57:26 +08:00
小张
c35f54fdd9 feat:修复 2025-09-13 15:53:02 +08:00
yuk255
155db7a1e4 feat:对接部分班级页面接口,修改了部分课程页面,对接了一部分接口 2025-09-12 22:59:14 +08:00
QDKF
e645a190dd feat: 课程章节部分接口对接(编辑,查询,删除章节);阅卷中心接口对接: 获取阅卷列表, 获取班级列表;试卷管理接口对接: 获取试卷列表 2025-09-12 19:50:04 +08:00
小张
59c4d9ebc5 feat:修复 2025-09-12 17:26:58 +08:00
QDKF
21845cb21a feat: 课程章节部分接口对接(编辑,查询,删除章节), 合并远程更新并恢复本地 api 修改 2025-09-12 15:28:31 +08:00
小张
0c638147f2 feat:搜索结果展示 2025-09-12 03:11:18 +08:00
小张
7551571f0a feat:注册接口对接 2025-09-11 23:13:47 +08:00
yuk255
7911565249 feat:对接部分课程和班级接口 2025-09-11 14:34:30 +08:00
小张
7fb049d31d feat:即刻对话区域,和顶部logo切换,home页面的80改到50百分之, 2025-09-11 01:12:14 +08:00
QDKF
ec1a19d005 feat: 完善教师端AI助教和个人中心页面;新增AI助教分析页面(AssistantDetail.vue);优化AI助教主页面(Assistant.vue) 2025-09-10 21:30:45 +08:00
QDKF
2a3e6ccd91 fix: 修复白屏问题、路由冲突和TypeScript错误,打包问题,调整tab悬停样式 2025-09-10 16:14:51 +08:00
小张
b283f4e3c7 feat:搜索浮窗,和接口调用 2025-09-09 15:00:37 +08:00
QDKF
9b601f9117 style: 左侧导航栏菜单恢复为调整前样式 2025-09-08 21:01:40 +08:00
QDKF
75d722440f style: 调整左侧导航栏菜单 2025-09-08 20:18:27 +08:00
QDKF
2c1fb5ab7f feat: 完成“我的资源”页面,功能 2025-09-08 19:15:49 +08:00
小张
7de929ac18 feat:新浮窗,和切换语言,和个人中心的字体统一旧函数方法删除 2025-09-08 11:31:04 +08:00
小张
eb4c8504b1 feat:新浮窗,和切换语言,和个人中心的字体统一 2025-09-07 17:50:03 +08:00
QDKF
21b76b9683 feat: 完善课程详情页面;修复课程详情页面打包问题 2025-09-07 03:59:41 +08:00
QDKF
e39010c484 route: 路由调整 2025-09-06 17:20:05 +08:00
小张
f4991929c6 feat:新即时消息页面初步实现,ai伴学判定图标,fixbug修复 2025-09-06 02:18:54 +08:00
QDKF
e1b32c2c3c fix: 修复题目管理页面的 TypeScript 类型错误 2025-09-06 01:20:37 +08:00
QDKF
3d5d34b660 feat: 实现课程讨论管理和学习监控系统:新增讨论管理、评论查看、添加讨论页面;修复打包问题 2025-09-06 01:01:12 +08:00
yuk255
764064bd80 feat:添加试卷分析页面;添加消息中心页面 2025-09-05 21:00:10 +08:00
小张
6b685501dd feat:hls流误删导致视频报错,作业资料接口对接,逻辑处理下载,课程列表按钮按照 后端请求分为需传token 和不需要根据是否登录判断 2025-09-05 19:46:11 +08:00
小张
71ea0bbfb4 feat:hls流误删导致视频报错,作业资料接口对接,逻辑处理下载,课程列表按钮按照 后端请求分为需传token 和不需要根据是否登录判断 2025-09-04 23:15:29 +08:00
yuk255
81c0556559 feat:添加学院中心下班级管理页面和班级管理下的统计分析、学习进度页面 2025-09-04 20:38:53 +08:00
QDKF
580e32d69c fix: 修复打包错误 2025-09-04 17:25:47 +08:00
QDKF
a30e23ab07 feat: 完成学情统计和学生成绩页面开发:新增LearningStatistics.vue学情统计页面,包含6个统计模块和ECharts图表,新增StudentGrades.vue学生成绩页面,支持成绩管理、权重设置和提醒功能 2025-09-04 17:23:05 +08:00
小张
dd11e9aa2d feat:视频删除和之前的方法使用视频的bug修复 2025-09-03 22:55:49 +08:00
小张
177bdbc009 feat:课程列表ai伴学模式修发布评论对接 2025-09-03 22:17:58 +08:00
yuk255
7b993f0648 feat:添加课程管理菜单下的班级管理;优化导入组件;添加学员库页面 2025-09-03 20:51:13 +08:00
QDKF
a0cb27afe4 feat: 添加统计首页, 基础数据,课堂报告页面 2025-09-03 19:19:32 +08:00
小张
39020bd14c feat:课程列表ai伴学模式修改 2025-09-03 16:54:50 +08:00
小张
9a37ff49bc feat:学习进度对接和逻辑计算 2025-09-03 10:07:59 +08:00
yuk255
44e734b50c fix:修复打包报错 2025-09-02 20:29:13 +08:00
yuk255
739ad411c1 feat:添加课程-管理页面;考试管理菜单也同步添加到课程管理下;优化了一些页面 2025-09-02 20:21:02 +08:00
QDKF
f888b0b458 feat: 完善添加,编辑证书和相关页面,功能 2025-09-02 18:39:38 +08:00
小张
adeaf086c4 feat:学习进度对接和逻辑计算 2025-09-02 18:04:22 +08:00
小张
f0320a021d feat:对接ai伴学普通和ai伴学模式 2025-09-02 17:15:46 +08:00
小张
5f199931ca feat:ai伴学普通区分调整 2025-09-02 16:29:25 +08:00
QDKF
2aac753e3a fix: 修复打包报错 2025-09-01 22:38:43 +08:00
guoan
46df63e7fd feat: 更换图片, 调整样式 2025-09-01 22:35:40 +08:00
yuk255
96f433c745 fix: 修复打包报错 2025-09-01 22:04:00 +08:00
小张
5621903f34 feat:bug修复 2025-09-01 21:55:52 +08:00
yuk255
27f41332d4 Merge branches 'dev' and 'dev' of http://110.42.96.64:19890/GoCo/OL-LearnPlatform-Frontend into dev 2025-09-01 20:52:10 +08:00
yuk255
02dfa15e75 fix: 课程管理下的页面样式和逻辑补全优化并添加了文件预览页面 2025-09-01 20:51:13 +08:00
小张
b3ed88602f feat:ai伴学的未报名已报名完善央视修改,投诉功能完善,ai助手bug修改, 2025-09-01 20:04:57 +08:00
小张
8e146666f7 fix:配合后端接口变动 2025-09-01 17:56:41 +08:00
yuk255
590af0951f feat: 对接部分题库接口;添加考试界面;部分界面样式优化 2025-08-30 17:50:14 +08:00
小张
57eb57d0ce feat: 优化登录和课程功能
- 修复练习分数显示格式,与考试保持一致
- 增强热门好课报名功能,添加完整的用户反馈和错误处理
- 优化登录流程,添加详细的调试日志
- 修复右上角登录按钮跳转到登录页面
- 添加主标题API接口对接功能
- 改进用户体验和交互反馈
2025-08-30 16:24:08 +08:00
小张
7df60c4ea4 feat:登录功能迁移新登录页面 2025-08-30 15:16:19 +08:00
小张
714de2f19b feat:登录功能迁移新登录页面 2025-08-30 15:13:39 +08:00
小张
1714221e70 feat:登录功能迁移新登录页面 2025-08-30 15:13:24 +08:00
小张
48d80ef281 feat:紧急修复 2025-08-30 14:05:01 +08:00
小张
537a7f8fe6 feat:新评论 2025-08-30 13:46:58 +08:00
小张
06dfacc074 feat:新评论 2025-08-30 03:57:24 +08:00
小张
2aab0f7152 feat:home页面监听滚轮高度实现右下角客服展示等功能 2025-08-30 02:28:29 +08:00
QDKF
8000bde1b9 style: 调整练习考试页面 2025-08-29 22:54:05 +08:00
QDKF
39fff08a0d Merge branch 'dev' of http://110.42.96.65:19890/GoCo/OL-LearnPlatform-Frontend into dev 2025-08-29 20:12:37 +08:00
QDKF
027253f7b4 save: 更新路由 2025-08-29 20:12:34 +08:00
小张
7bb632f9a9 fix:hls传播问题 2025-08-29 18:28:59 +08:00
yuk255
3d4fa1abb4 feat:对naive ui添加国际化配置;添加考试相关api文件;考试管理菜单下逻辑优化完善;6种题型全部提取为独立组件。 2025-08-29 18:11:47 +08:00
小张
cea9929ebc fix:appheader的样式切换 2025-08-29 17:58:32 +08:00
QDKF
4f90499ada feat: 添加新建证书的页面和功能;页面添加过渡动画;添加证书有效期, 证书分类菜单;添加证书预览功能 2025-08-29 15:39:45 +08:00
小张
7c6c19d8f9 fix:样式UI调整 2025-08-29 03:39:15 +08:00
小张
d841224536 fix:登录页面 2025-08-29 03:09:49 +08:00
QDKF
dc912c3842 feat: 添加教师端证书首页;添加证书详情页;添加证书颁奖页面及一系列功能;添加新增证书页面; 2025-08-28 22:59:34 +08:00
QDKF
597b9a0d3f Merge branch 'dev' of http://110.42.96.65:19890/GoCo/OL-LearnPlatform-Frontend into dev 2025-08-28 10:37:32 +08:00
QDKF
0d3184104f chore: 保存本地路由调整 2025-08-28 10:37:30 +08:00
小张
8427f0ec82 fix:新登录页面初步实现 2025-08-28 03:26:25 +08:00
yuk255
2c27fe8730 feat:添加试题页面,预览试卷页面,试卷批阅页面添加 2025-08-27 19:53:19 +08:00
QDKF
adf90b1390 style: 调整创建课程页面 2025-08-27 19:06:26 +08:00
QDKF
be64951358 style: 教师端新增批阅作业页面;新增查看作业页面,回复评论 2025-08-27 16:50:14 +08:00
QDKF
788df9a92c Merge branch 'dev' of http://110.42.96.65:19890/GoCo/OL-LearnPlatform-Frontend into dev 2025-08-27 16:49:13 +08:00
QDKF
1172193733 feat: 更新路由配置 2025-08-27 16:49:10 +08:00
小张
a5a802c4a6 fix:旧方法,mock数据删除 2025-08-26 19:07:48 +08:00
小张
829660dbda feat:课程详情切换ai伴学,里面接口重新调用,dplayer播放器切换,播放器配置, 2025-08-26 18:51:07 +08:00
QDKF
068fc262ab fix: 打包问题 2025-08-26 18:27:42 +08:00
QDKF
541886b6e6 style: 新增添加作业库页面;编辑作业库页面;新增关闭顶部广告功能;调整富文本;添加作业库导入页面 2025-08-26 18:19:23 +08:00
yuk255
638e939fe5 feat:添加添加试题功能页面;添加试题管理的分类对应功能;删除一些不再使用的组件页面;其他样式优化 2025-08-25 20:23:48 +08:00
QDKF
cc7c4ec23a style: 章节模态框 2025-08-25 18:28:46 +08:00
小张
2d0dd00fc4 fix:师资详情页面,积分中心页面路由配置点击,顶部tab切换bug修复 2025-08-25 16:35:54 +08:00
yuk255
37198b3b37 fix:修复教师端考试管理入口被隐藏问题 2025-08-25 11:14:18 +08:00
QDKF
510b2b1b0c style: 教师端页面调整 2025-08-25 10:39:24 +08:00
Wxp
3293384d8e fix: 修复打包问题 2025-08-24 18:31:24 +08:00
Wxp
7be3eca61e style: 课件部分弹窗 2025-08-24 18:20:16 +08:00
Wxp
16ee40e020 style: 换图片 2025-08-23 19:45:38 +08:00
guoan
4d9b5eec2b style: 题库首页,课件弹框 2025-08-23 19:20:14 +08:00
yuk255
844d5721b7 fix: 修改组件路径,修改一些细节样式和报错 2025-08-23 18:43:12 +08:00
yuk255
5e34c71b14 feat: 新增导入组件,支持数据导入及模板下载;修改考试管理对应的路由层级及页面,加入过渡动画效果 2025-08-23 18:27:07 +08:00
小张
8bb211fc33 fix:ai布局调整 2025-08-23 17:56:15 +08:00
yuk255
59faaa25cb feat: 更新侧边栏和二级菜单逻辑,新增题库选择功能 2025-08-22 21:17:10 +08:00
Admin
2d8339ed4e 新增章节编辑器、课件上传弹窗等功能 2025-08-22 21:10:29 +08:00
guoan
56f5e7077e style: 添加课件 2025-08-22 19:59:17 +08:00
guoan
e75ffdf1e8 sytle: 教师端尺寸 2025-08-22 19:52:05 +08:00
小张
c4e96ea899 fix:logo替换 2025-08-22 17:52:39 +08:00
小张
b1a906f176 fix:跳转新增 2025-08-22 17:45:43 +08:00
小张
bc5d21fc76 Merge branch 'dev' of http://110.42.96.65:19890/GoCo/OL-LearnPlatform-Frontend into dev
# Conflicts:
#	src/views/Faculty.vue
2025-08-22 17:12:06 +08:00
小张
e18d5f610f fix:打包报错 2025-08-22 17:11:28 +08:00
Wxp
4e983b923c merge: integrate origin/dev and resolve conflicts 2025-08-22 17:08:52 +08:00
Wxp
8ce7c66fea style: 章节,作业部分页面 2025-08-22 16:59:07 +08:00
yuk255
8cd22653aa feat:添加练考通模块下的试卷库和新增试卷功能 2025-08-22 16:42:55 +08:00
Wxp
1193c017ee Merge branch 'dev' of http://110.42.96.65:19890/GoCo/OL-LearnPlatform-Frontend into dev 2025-08-22 16:42:02 +08:00
小张
1a11290c97 fix:ai自适应 2025-08-22 16:40:46 +08:00
小张
ad5b5b5de0 fix:细节修改 2025-08-22 14:53:47 +08:00
小张
f6142edd7d Merge branch 'dev' of http://110.42.96.65:19890/GoCo/OL-LearnPlatform-Frontend into dev 2025-08-22 13:54:11 +08:00
Wxp
2f13f5da8b Merge branch 'dev' of http://110.42.96.65:19890/GoCo/OL-LearnPlatform-Frontend into dev 2025-08-21 19:41:58 +08:00
Admin
36be89dac5 新增页面 2025-08-21 19:39:07 +08:00
Wxp
ebae7ab2dd fix: 打包 2025-08-21 16:08:18 +08:00
Admin
7ab20755b4 feat: 添加教师管理图片资源和更新课程组件 2025-08-21 13:07:39 +08:00
Admin
4e58477135 feat: 添加教师管理图片资源和更新课程组件 2025-08-21 11:31:49 +08:00
Admin
b2f00f4801 教师端功能 2025-08-20 23:40:16 +08:00
Admin
9889b6c57d 教师端功能 2025-08-20 22:50:28 +08:00
小张
fea00e8c1a Merge remote-tracking branch 'origin/dev' into dev 2025-08-20 22:30:49 +08:00
小张
7a8ebd903b fix:打包报错 2025-08-20 22:30:37 +08:00
Admin
c6bcb136ad 1 2025-08-20 21:55:23 +08:00
Admin
3fed1249c4 教师端 2025-08-20 21:47:52 +08:00
小张
fa3514dd55 feat:检查报名和报名接口对接 2025-08-20 17:11:43 +08:00
yangdongbit
34738a29e1 教师端页面 2025-08-20 14:10:48 +08:00
小张
a4832dc8fc Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	package-lock.json
#	src/views/CourseDetailEnrolled.vue
2025-08-20 11:16:39 +08:00
小张
5b82a9b044 feat:切换dplayer播放器 2025-08-20 11:15:12 +08:00
Wxp
2ddc067ebc style:换图片 2025-08-19 23:40:22 +08:00
Wxp
f06aef9913 fix: 打包和样式调整 2025-08-19 19:47:12 +08:00
Wxp
d6e76b7c73 merge: 合并远程dev分支,解决冲突 2025-08-19 19:07:54 +08:00
Wxp
0fe429cd79 style: 调整样式 2025-08-19 19:04:11 +08:00
小张
b37cdd3ccc fix:打包报错调整 2025-08-19 02:21:57 +08:00
小张
7cc9a80297 fix:评论调整 2025-08-19 02:06:33 +08:00
小张
bf03f35a35 Merge remote-tracking branch 'origin/dev' into dev
# Conflicts:
#	src/views/CourseDetail.vue
#	src/views/CourseDetailEnrolled.vue
2025-08-19 01:59:38 +08:00
小张
9201cc44e5 feat:个人中心对接 2025-08-19 01:50:27 +08:00
Wxp
eff83cfdc3 style:修复个人中心样式冲突 2025-08-18 22:52:22 +08:00
Wxp
713b81c4e1 style:样式 2025-08-18 22:09:42 +08:00
Wxp
fbf783582d style: 完善练习提交页面 2025-08-18 12:03:30 +08:00
Wxp
699c0e733c 优化 2025-08-16 22:48:10 +08:00
Wxp
6e1ad5ea07 样式 2025-08-16 20:39:56 +08:00
Wxp
94ee525ce6 Merge branch 'dev' of http://110.42.96.65:19890/GoCo/OL-LearnPlatform-Frontend into dev 2025-08-16 20:05:35 +08:00
Wxp
7e3e22ee4c 页面 2025-08-16 19:51:39 +08:00
小张
6bdd7d6999 feat:章节对应的视频,视频url切割,可切换清晰度 2025-08-16 13:08:38 +08:00
小张
f4a5f6f782 feat+fix:mock数据后端返回不匹配类型报错,讲师章节树状对接 2025-08-15 18:12:31 +08:00
小张
0e1a73192f fix:mock数据后端返回不匹配类型报错 2025-08-15 13:58:25 +08:00
小张
13113e1bbc feat:对接环境配置,登录,课程相关接口对接 2025-08-15 13:21:10 +08:00
Wxp
a428d2b36b 完善 2025-08-14 17:32:28 +08:00
Wxp
90ffb5a444 修复 2025-08-12 20:26:27 +08:00
Wxp
4bfd6f2351 样式 2025-08-12 19:52:20 +08:00
Wxp
d4db394b58 部分个人中心 2025-08-12 18:22:50 +08:00
Wxp
7e5809afde 样式 2025-08-12 18:10:55 +08:00
Wxp
495d6a2f9e Merge remote-tracking branch 'origin/main' into dev 2025-08-12 17:52:08 +08:00
87cce63ae8 docker compose port 2025-08-11 15:22:31 +08:00
853dd3d7ec 完成合并 dev 分支并解决冲突 2025-08-11 14:00:46 +08:00
a532924668 解决build问题 2025-08-11 10:03:56 +08:00
87478f82f2 ci: 🎡 dockercompose端口 2025-08-10 23:13:30 +08:00
username
c0dbb2c97d init 2025-08-10 22:49:43 +08:00
829 changed files with 211282 additions and 105664 deletions

View File

@ -4,3 +4,4 @@ type: "manual"
1、在接下来的每一个步骤当中请帮我实现对页面的响应式设计
2、必须严格执行我给你的指令一步一步执行不得有缩减
3、我们用的是naive UI组件 TSvue3

2
.env
View File

@ -1,5 +1,5 @@
# API配置
VITE_API_BASE_URL=http://110.42.96.65:55510/api
VITE_API_BASE_URL=http://103.40.14.23:25526/jeecgboot
# Mock配置 - 禁用Mock使用真实API
VITE_ENABLE_MOCK=false

View File

@ -1,7 +1,7 @@
# 开发环境配置
# API配置
VITE_API_BASE_URL=http://110.42.96.65:55510/api
VITE_API_BASE_URL=http://103.40.14.23:25526/jeecgboot
# Mock配置
# 设置为 true 使用Mock数据false 使用真实API

View File

@ -1,7 +1,7 @@
# 生产环境配置
# API配置
VITE_API_BASE_URL=http://110.42.96.65:55510/api
VITE_API_BASE_URL=http://103.40.14.23:25526/jeecgboot
# Mock配置 - 生产环境禁用Mock使用真实API
VITE_ENABLE_MOCK=false

View File

@ -6,6 +6,6 @@ services:
context: .
dockerfile: Dockerfile
ports:
- "55514:80"
- "25527:80"
container_name: vue3-nginx
restart: unless-stopped

View File

@ -0,0 +1,320 @@
# DPlayer 集成指南
## 什么是 DPlayer
**DPlayer** 是由 [DIYGod](https://github.com/DIYGod) 开发的一个开源的 HTML5 视频播放器,具有以下特点:
- 🎨 **界面美观**:现代化的设计风格
- 🎯 **轻量级**:体积小,加载快
- 🌏 **中文友好**:由中国开发者开发,中文文档完善
- 🎮 **功能丰富**:支持弹幕、快捷键、倍速播放等
- 📱 **移动端适配**:响应式设计,支持移动设备
## 主要功能特性
### 基础功能
- ✅ 播放/暂停控制
- ✅ 音量控制
- ✅ 进度条拖拽
- ✅ 全屏切换
- ✅ 倍速播放 (0.5x - 2x)
### 高级功能
- 🎯 键盘快捷键支持
- 🎨 自定义主题色
- 📝 右键菜单自定义
- 🎵 音频可视化
- 📱 移动端手势支持
### 格式支持
- MP4
- WebM
- Ogg
- HLS (.m3u8)
- FLV
- 更多格式通过插件支持
## 安装和集成
### 方法1CDN 引入(推荐用于快速测试)
```html
<!-- 在 index.html 中引入 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/dplayer@1.27.1/dist/DPlayer.min.css">
<script src="https://cdn.jsdelivr.net/npm/dplayer@1.27.1/dist/DPlayer.min.js"></script>
```
### 方法2NPM 安装(推荐用于生产环境)
```bash
npm install dplayer
```
然后在组件中导入:
```javascript
import DPlayer from 'dplayer'
import 'dplayer/dist/DPlayer.min.css'
```
## 基础使用
### 创建播放器
```javascript
const player = new DPlayer({
container: document.getElementById('dplayer'),
video: {
url: 'video.mp4',
type: 'auto'
},
autoplay: false,
theme: '#007bff',
lang: 'zh-cn'
})
```
### 事件监听
```javascript
player.on('play', () => {
console.log('视频开始播放')
})
player.on('pause', () => {
console.log('视频暂停')
})
player.on('ended', () => {
console.log('视频播放结束')
})
player.on('error', () => {
console.log('播放出错')
})
```
## 配置选项
### 基础配置
```javascript
const options = {
container: document.getElementById('dplayer'), // 容器元素
video: {
url: 'video.mp4', // 视频地址
type: 'auto', // 视频类型auto, normal, hls, flv
defaultQuality: 0, // 默认画质
pic: 'poster.jpg', // 封面图
thumbnails: 'thumbnails.jpg' // 缩略图
},
autoplay: false, // 自动播放
theme: '#007bff', // 主题色
lang: 'zh-cn', // 语言zh-cn, en
hotkey: true, // 启用快捷键
preload: 'auto', // 预加载auto, metadata, none
volume: 0.8, // 默认音量
playbackSpeed: [0.5, 0.75, 1, 1.25, 1.5, 2], // 倍速选项
contextmenu: [ // 右键菜单
{
text: '关于 DPlayer',
link: 'https://github.com/DIYGod/DPlayer'
}
]
}
```
### 高级配置
```javascript
const advancedOptions = {
// 弹幕配置
danmaku: {
id: 'dplayer-danmaku',
api: 'https://api.prprpr.me/dplayer/',
token: 'token',
maximum: 1000,
addition: ['https://api.prprpr.me/dplayer/bilibili?aid=4157142'],
user: 'DIYGod',
bottom: '15%',
unlimited: true
},
// 字幕配置
subtitle: {
url: 'subtitle.vtt',
type: 'webvtt',
fontSize: '20px',
bottom: '10%',
color: '#fff'
},
// 画质切换
video: {
url: [
{
name: '1080P',
url: 'video-1080p.mp4'
},
{
name: '720P',
url: 'video-720p.mp4'
}
],
defaultQuality: 0
}
}
```
## 在 Vue 项目中使用
### 创建 DPlayer 组件
```vue
<template>
<div class="video-player-wrapper">
<div ref="dplayerContainer" class="dplayer-container"></div>
</div>
</template>
<script setup>
import { ref, onMounted, onUnmounted } from 'vue'
const dplayerContainer = ref()
let player = null
onMounted(() => {
// 确保 DPlayer 已加载
if (window.DPlayer) {
initPlayer()
} else {
loadDPlayer().then(() => {
initPlayer()
})
}
})
const loadDPlayer = () => {
return new Promise((resolve) => {
const cssLink = document.createElement('link')
cssLink.rel = 'stylesheet'
cssLink.href = 'https://cdn.jsdelivr.net/npm/dplayer@1.27.1/dist/DPlayer.min.css'
document.head.appendChild(cssLink)
const script = document.createElement('script')
script.src = 'https://cdn.jsdelivr.net/npm/dplayer@1.27.1/dist/DPlayer.min.js'
script.onload = resolve
document.head.appendChild(script)
})
}
const initPlayer = () => {
player = new window.DPlayer({
container: dplayerContainer.value,
video: {
url: '/video/first.mp4',
type: 'auto'
},
autoplay: false,
theme: '#007bff',
lang: 'zh-cn',
hotkey: true
})
}
onUnmounted(() => {
if (player) {
player.destroy()
}
})
</script>
<style scoped>
.video-player-wrapper {
width: 100%;
max-width: 800px;
margin: 0 auto;
}
.dplayer-container {
width: 100%;
aspect-ratio: 16/9;
}
</style>
```
## 样式定制
### 自定义主题色
```css
/* 修改播放器主题色 */
.dplayer {
--dplayer-theme: #007bff;
}
/* 自定义进度条颜色 */
.dplayer .dplayer-bar-wrap .dplayer-bar .dplayer-played {
background: #007bff;
}
/* 自定义控制按钮颜色 */
.dplayer .dplayer-icons .dplayer-icon {
color: #fff;
}
.dplayer .dplayer-icons .dplayer-icon:hover {
color: #007bff;
}
```
### 响应式设计
```css
/* 移动端适配 */
@media (max-width: 768px) {
.dplayer {
font-size: 14px;
}
.dplayer .dplayer-icons .dplayer-icon {
font-size: 16px;
}
}
```
## 快捷键支持
DPlayer 默认支持以下快捷键:
- `空格键` - 播放/暂停
- `←` - 后退 10 秒
- `→` - 前进 10 秒
- `↑` - 音量 +10%
- `↓` - 音量 -10%
- `F` - 全屏切换
- `M` - 静音切换
## 与 CKPlayer 对比
| 特性 | CKPlayer | DPlayer |
|------|----------|---------|
| 界面美观度 | ⭐⭐ | ⭐⭐⭐⭐⭐ |
| 功能丰富度 | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 移动端支持 | ⭐⭐⭐ | ⭐⭐⭐⭐ |
| 中文支持 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 社区活跃度 | ⭐⭐ | ⭐⭐⭐⭐ |
| 文档质量 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 学习成本 | ⭐⭐⭐⭐ | ⭐⭐⭐ |
## 总结
**DPlayer 是一个优秀的视频播放器选择**,特别适合:
- 🎯 需要美观界面的项目
- 🌏 中文用户群体
- 📱 重视移动端体验
- 🎨 需要自定义主题的项目
- ⚡ 追求轻量级解决方案
相比当前的 CKPlayerDPlayer 提供了更好的用户体验和更丰富的功能,是升级视频播放器的理想选择。

523
docs/ExamInfo-API-Usage.md Normal file
View File

@ -0,0 +1,523 @@
# 考试信息API使用文档
## 接口概述
`/aiol/aiolExam/getExamInfo` 接口用于获取教师名下的考试信息列表。
## 接口定义
### 请求方式
- **方法**: GET
- **路径**: `/aiol/aiolExam/getExamInfo`
- **参数**: `userId` (查询参数)
### 请求参数
| 参数名 | 类型 | 必选 | 说明 |
|--------|------|------|------|
| userId | string | 是 | 教师用户ID |
### 响应格式
```typescript
{
"success": boolean,
"message": string,
"code": number,
"result": ExamInfo[],
"timestamp": number
}
```
### ExamInfo 数据结构
```typescript
interface ExamInfo {
id: string // 考试ID
name: string // 考试名称
paperId: string // 试卷ID
startTime: string // 开始时间
endTime: string // 结束时间
totalTime: number // 考试时长(分钟)
type: number // 考试类型0=练习1=考试
status: number // 状态0=未发布1=发布中2=已结束
createBy: string // 创建人
createTime: string // 创建时间
updateBy: string // 更新人
updateTime: string // 更新时间
}
```
## 使用示例
### 1. 在API模块中调用
```typescript
import { ExamApi } from '@/api/modules/exam'
// 获取教师考试信息
const response = await ExamApi.getExamInfo('teacher_user_id')
console.log('考试信息:', response.data)
```
### 2. 在Vue组件中使用
```typescript
import { ExamApi } from '@/api/modules/exam'
import { useUserStore } from '@/stores/user'
export default {
setup() {
const userStore = useUserStore()
const loadExamInfo = async () => {
if (!userStore.user?.id) {
console.error('请先登录')
return
}
try {
const response = await ExamApi.getExamInfo(userStore.user.id.toString())
return response.data || []
} catch (error) {
console.error('加载考试信息失败:', error)
return []
}
}
return {
loadExamInfo
}
}
}
```
### 3. 在试卷管理页面中使用
```typescript
// 在 ExamLibrary.vue 中
import { ExamApi } from '@/api/modules/exam'
import { useUserStore } from '@/stores/user'
import type { ExamInfo } from '@/api/types'
const userStore = useUserStore()
const loadExamInfo = async () => {
loading.value = true
try {
const currentUser = userStore.user
if (!currentUser?.id) {
message.error('请先登录')
return
}
const response = await ExamApi.getExamInfo(currentUser.id.toString())
if (response.data && Array.isArray(response.data)) {
// 数据映射和显示逻辑
const mappedList = response.data.map((item: ExamInfo) => {
// 映射逻辑...
return {
id: item.id,
name: item.name,
// ... 其他字段映射
}
})
examData.value = mappedList
}
} catch (error) {
console.error('加载考试信息失败:', error)
message.error('加载考试信息失败')
} finally {
loading.value = false
}
}
```
## 数据映射说明
### 状态映射
```typescript
const statusMap: { [key: number]: string } = {
0: '未发布',
1: '发布中',
2: '已结束'
}
```
### 类型映射
```typescript
const categoryMap: { [key: number]: string } = {
0: '练习',
1: '考试'
}
```
### 难度映射
```typescript
const difficultyMap: { [key: number]: string } = {
0: '易',
1: '中',
2: '难'
}
```
## 错误处理
接口可能返回以下错误:
1. **401 Unauthorized**: 用户未登录或token过期
2. **403 Forbidden**: 没有权限访问
3. **500 Internal Server Error**: 服务器内部错误
建议在调用时添加适当的错误处理:
```typescript
try {
const response = await ExamApi.getExamInfo(userId)
// 处理成功响应
} catch (error) {
if (error.response?.status === 401) {
// 处理认证错误
console.error('登录已过期,请重新登录')
} else {
// 处理其他错误
console.error('获取考试信息失败:', error.message)
}
}
```
## 注意事项
1. 调用此接口前需要确保用户已登录
2. 只有教师用户才能调用此接口
3. 返回的考试信息按创建时间倒序排列
4. 建议在组件挂载时调用此接口加载数据
5. 可以根据需要添加分页、搜索等参数(需要后端支持)
## 相关文件
- API实现: `src/api/modules/exam.ts`
- 类型定义: `src/api/types.ts`
- 使用示例: `src/api/examples/getExamInfo-example.ts`
- 页面实现: `src/views/teacher/ExamPages/ExamLibrary.vue`
---
# 创建试卷API使用文档
## 接口概述
`POST /aiol/aiolPaper/add` 接口用于创建新的试卷。
## 接口定义
### 请求方式
- **方法**: POST
- **路径**: `/aiol/aiolPaper/add`
- **Content-Type**: `application/json`
### 请求参数
| 参数名 | 类型 | 必选 | 说明 |
|--------|------|------|------|
| title | string | 是 | 试卷标题 |
| generateMode | number | 否 | 组卷模式0=固定试卷组1=随机抽题组卷 |
| rules | string | 否 | 组卷规则(随机抽题时使用) |
| repoId | string | 否 | 题库ID随机抽题时使用 |
| totalScore | number | 是 | 试卷总分 |
| passScore | number | 否 | 及格分数默认总分的60% |
| requireReview | number | 否 | 是否需要批阅0=不需要1=需要 |
### 响应格式
```typescript
{
"success": boolean,
"message": string,
"code": number,
"result": string, // 试卷ID
"timestamp": number
}
```
## 使用示例
### 1. 在API模块中调用
```typescript
import { ExamApi } from '@/api/modules/exam'
// 创建固定试卷组
const response = await ExamApi.createExamPaper({
title: '数学期末考试试卷',
generateMode: 0,
totalScore: 100,
passScore: 60,
requireReview: 0
})
console.log('试卷ID:', response.data)
```
### 2. 在Vue组件中使用
```typescript
// 在 AddExam.vue 中
const saveExam = async () => {
try {
const apiData = {
title: examForm.title,
generateMode: examForm.type === 1 ? 0 : 1,
rules: '',
repoId: '',
totalScore: examForm.totalScore,
passScore: examForm.passScore || Math.floor(examForm.totalScore * 0.6),
requireReview: examForm.useAIGrading ? 1 : 0
}
const response = await ExamApi.createExamPaper(apiData)
console.log('创建试卷成功:', response.data)
} catch (error) {
console.error('创建试卷失败:', error)
}
}
```
### 3. 不同组卷模式示例
```typescript
// 固定试卷组
const fixedPaper = {
title: '固定试卷组示例',
generateMode: 0,
rules: '',
repoId: '',
totalScore: 100,
passScore: 60,
requireReview: 0
}
// 随机抽题组卷
const randomPaper = {
title: '随机抽题组卷示例',
generateMode: 1,
rules: '{"difficulty": [1, 2, 3], "types": [0, 1, 2], "count": 20}',
repoId: 'repo_123',
totalScore: 100,
passScore: 60,
requireReview: 1
}
```
## 相关文件
- API实现: `src/api/modules/exam.ts`
- 页面实现: `src/views/teacher/ExamPages/AddExam.vue`
- 使用示例: `src/api/examples/createPaper-example.ts`
---
# 删除试卷API使用文档
## 接口概述
删除试卷相关的API接口包括单个删除和批量删除功能。
## 接口定义
### 1. 删除单个试卷
- **方法**: DELETE
- **路径**: `/aiol/aiolPaper/delete?id={paperId}`
- **参数**: `id` (查询参数) - 试卷ID
### 2. 批量删除试卷
- **实现方式**: 循环调用单个删除接口(因为后端可能不支持批量删除接口)
- **方法**: 内部调用多个 `DELETE /aiol/aiolPaper/delete?id={paperId}`
- **参数**: `ids: string[]` - 试卷ID数组
### 响应格式
**单个删除响应**:
```typescript
{
"success": boolean,
"message": string,
"code": number,
"result": string,
"timestamp": number
}
```
**批量删除响应**:
```typescript
{
"success": boolean,
"message": string,
"code": number,
"result": {
"success": number, // 成功删除的数量
"failed": number, // 失败删除的数量
"total": number, // 总数量
"errors": string[] // 错误信息数组
},
"timestamp": number
}
```
## 使用示例
### 1. 删除单个试卷
```typescript
import { ExamApi } from '@/api/modules/exam'
// 删除单个试卷
const response = await ExamApi.deleteExamPaper('1962379646322384897')
console.log('删除结果:', response.data)
```
### 2. 批量删除试卷
```typescript
// 批量删除试卷
const paperIds = ['1962379646322384897', '1966450638717292545']
const response = await ExamApi.batchDeleteExamPapers(paperIds)
console.log('批量删除结果:', response.data)
```
### 3. 在Vue组件中使用使用 Naive UI 对话框组件)
```typescript
// 在 ExamLibrary.vue 中
import { useDialog, useMessage } from 'naive-ui'
const dialog = useDialog()
const message = useMessage()
const handleDeletePaper = async (row: any) => {
try {
// 使用 Naive UI 对话框组件
dialog.warning({
title: '确认删除',
content: `确定要删除试卷"${row.name}"吗?此操作不可撤销。`,
positiveText: '确定删除',
negativeText: '取消',
onPositiveClick: async () => {
try {
// 调用删除API
const response = await ExamApi.deleteExamPaper(row.id)
// 显示成功消息
message.success('试卷删除成功!')
// 重新加载试卷列表
await loadExamPaperList()
} catch (error) {
console.error('删除试卷失败:', error)
message.error('删除试卷失败,请重试')
}
}
})
} catch (error) {
console.error('删除试卷失败:', error)
message.error('删除试卷失败,请重试')
}
}
// 批量删除示例
const handleBatchDelete = async () => {
if (checkedRowKeys.value.length === 0) {
message.warning('请先选择要删除的试卷')
return
}
try {
// 使用 Naive UI 对话框组件
dialog.error({
title: '确认批量删除',
content: `确定要删除选中的 ${checkedRowKeys.value.length} 个试卷吗?此操作不可撤销。`,
positiveText: '确定删除',
negativeText: '取消',
onPositiveClick: async () => {
try {
// 调用批量删除API
const response = await ExamApi.batchDeleteExamPapers(checkedRowKeys.value as string[])
// 显示成功消息
message.success(`成功删除 ${checkedRowKeys.value.length} 个试卷!`)
// 清空选中状态
checkedRowKeys.value = []
// 重新加载试卷列表
await loadExamPaperList()
} catch (error) {
console.error('批量删除试卷失败:', error)
message.error('批量删除试卷失败,请重试')
}
}
})
} catch (error) {
console.error('批量删除试卷失败:', error)
message.error('批量删除试卷失败,请重试')
}
}
```
### 4. 错误处理
```typescript
const deletePaperWithErrorHandling = async (paperId: string) => {
try {
const response = await ExamApi.deleteExamPaper(paperId)
if (response.data === 'success') {
return { success: true, message: '删除成功' }
} else {
return { success: false, message: '删除失败,请重试' }
}
} catch (error: any) {
if (error.response?.status === 404) {
return { success: false, message: '试卷不存在' }
} else if (error.response?.status === 403) {
return { success: false, message: '没有权限删除此试卷' }
}
return { success: false, message: '删除失败,请检查网络连接' }
}
}
```
## 功能特性
### 单个删除
- 支持删除单个试卷
- 使用 Naive UI 警告对话框组件
- 删除成功后自动刷新列表
- 完整的错误处理
### 批量删除
- 支持同时删除多个试卷
- 循环调用单个删除接口(避免后端接口不存在的问题)
- 逐个删除,避免对服务器造成过大压力
- 详细的删除结果反馈(成功/失败数量)
- 使用 Naive UI 错误对话框组件(更醒目的警告)
- 删除后清空选中状态
### 用户体验
- **美观的确认对话框**: 使用 Naive UI 组件,样式统一美观
- **不同类型的对话框**: 单个删除使用 warning批量删除使用 error
- **成功/失败消息提示**: 使用 Naive UI 的 message 组件
- **按钮状态管理**: 批量删除按钮在未选中时禁用
- **实时更新选中数量显示**: 动态显示选中的试卷数量
- **异步操作处理**: 在对话框确认后才执行删除操作
## 相关文件
- API实现: `src/api/modules/exam.ts`
- 页面实现: `src/views/teacher/ExamPages/ExamLibrary.vue`
- 使用示例: `src/api/examples/deletePaper-example.ts`

View File

@ -2,13 +2,15 @@
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<link rel="icon" href="/logo/logo1.png">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>在线学习平台</title>
<meta name="description" content="专业的在线学习平台,提供优质的编程和技术课程">
<meta name="keywords" content="在线学习,编程课程,技术培训,Vue.js,React,Node.js">
<!-- CKPlayer CSS -->
<link rel="stylesheet" href="/ckplayer/css/ckplayer.css">
<!-- HLS.js for m3u8 playback in CKPlayer -->
<script src="/ckplayer/hls.js/hls.min.js"></script>
<!-- CKPlayer JS -->
<script src="/ckplayer/js/ckplayer.js"></script>
</head>

1094
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -13,16 +13,28 @@
"test:ui": "vitest --ui"
},
"dependencies": {
"@types/sortablejs": "^1.15.8",
"@vicons/ionicons5": "^0.13.0",
"@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12",
"@wangeditor/plugin-upload-attachment": "^1.1.0",
"axios": "^1.11.0",
"ckplayer": "^3.1.2",
"dplayer": "^1.27.1",
"echarts": "5.6.0",
"naive-ui": "^2.42.0",
"naive-ui-editor": "^1.0.6",
"pinia": "^3.0.3",
"quill": "^2.0.3",
"vue": "^3.5.17",
"vue-echarts": "7.0.3",
"vue-i18n": "^9.14.5",
"vue-router": "^4.5.1"
"vue-quill-editor": "^3.0.6",
"vue-router": "^4.5.1",
"vuedraggable": "^4.1.0"
},
"devDependencies": {
"@types/dplayer": "^1.25.5",
"@types/node": "^24.0.15",
"@vitejs/plugin-vue": "^6.0.0",
"typescript": "^5.8.3",

916
pnpm-lock.yaml generated

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 625 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 806 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 562 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 775 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 917 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 834 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
public/banners/banner8.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1011 B

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 812 B

After

Width:  |  Height:  |  Size: 908 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 944 B

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 844 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 368 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 295 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 447 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 442 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 724 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 858 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 252 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 680 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 359 B

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 438 B

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
public/images/courses/@.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 858 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 547 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 236 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 260 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 394 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

After

Width:  |  Height:  |  Size: 359 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 812 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Some files were not shown because too many files have changed in this diff Show More