Appearance
我的模块接口
接口总览
| 名称 | 方法 | 路径 |
|---|---|---|
| 我的页面 | GET | /api/app/my/page |
| 我的课程列表 | GET | /api/app/my/course |
| 我的培训项目列表 | GET | /api/app/my/project_plan |
| 我的开班列表 | GET | /api/app/my/offline_class |
| 我的活动列表 | GET | /api/app/my/offline_activity |
| 学习报告 | GET | /api/app/offline_class/{offlineClassId}/study_report |
| 导航栏配置 | GET | /api/app/navigation |
导航栏配置(GET /api/app/navigation)
返回
json
{
"isShowAiKnowledgeAssistant": true,
"logo": "https://cdn.example.com/logo.png"
}字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| isShowAiKnowledgeAssistant | boolean | 是否显示AI知识助手 |
| logo | string | 站点Logo |
我的页面(GET /api/app/my/page)
返回
json
{
"basicInfo": {
"avatar": "https://cdn.example.com/avatar/2.png",
"truename": "张三",
"orgName": "市场部",
"postName": "产品经理"
},
"onlineLearningHours": 120.5,
"offlineLearningHours": 80.0,
"isCertificateEnabled": true,
"isRewardPointEnabled": true,
"isCreditEnabled": true,
"isMentorGuidedEnabled": false,
"isOfflineClassEnabled": true,
"isExamEnabled": true,
"isPostMapEnabled": false,
"isKnowledgeBaseEnabled": true,
"isQAEnabled": true,
"certificateCount": 3,
"rewardPointCount": 1200,
"mentorGuidedCount": 0,
"reviewPendingCount": 2,
"notificationCount": 5,
"messageCount": 1
}字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
| basicInfo | object | 基本信息 |
| onlineLearningHours | number | 线上学习总小时数 |
| offlineLearningHours | number | 线下学习总小时数 |
| isCertificateEnabled | boolean | 证书插件启用 |
| isRewardPointEnabled | boolean | 积分插件启用 |
| isCreditEnabled | boolean | 学分插件启用 |
| isMentorGuidedEnabled | boolean | 带教插件启用 |
| isOfflineClassEnabled | boolean | 线下开班启用 |
| isExamEnabled | boolean | 专项考试启用 |
| isPostMapEnabled | boolean | 岗位地图启用 |
| isKnowledgeBaseEnabled | boolean | 知识库启用 |
| isQAEnabled | boolean | 问答启用 |
| certificateCount | number | 证书数量 |
| rewardPointCount | number | 积分数量 |
| mentorGuidedCount | number | 带教数量 |
| reviewPendingCount | number | 待批阅数量 |
| notificationCount | number | 通知数量 |
| messageCount | number | 私信数量 |
basicInfo 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| avatar | string | 头像URL |
| truename | string | 真实姓名 |
| orgName | string | 部门名称 |
| postName | string | 岗位名称 |
我的课程列表(GET /api/app/my/course)
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| status | string | 否 | 状态筛选:all/in_progress/finished |
| page | number | 否 | 页码(从 0 开始) |
| size | number | 否 | 每页数量 |
返回
json
{
"content": [
{
"id": 82001,
"courseId": 2001,
"title": "课程A",
"cover": "https://cdn.example.com/course/cover/2001.png",
"joinedTime": 1700000000,
"finishedTime": 0,
"completionStatus": "in_progress",
"compulsoryTaskNum": 6,
"compulsoryFinishedTaskNum": 3
}
],
"totalElements": 1,
"totalPages": 1,
"size": 10,
"number": 0
}列表项字段
| 字段 | 类型 | 说明 |
|---|---|---|
| id | number | 成员ID |
| courseId | number | 课程ID |
| title | string | 课程名称 |
| cover | string | 课程封面 |
| joinedTime | number | 加入时间 |
| finishedTime | number | 完成时间 |
| completionStatus | string | 课程状态 |
| compulsoryTaskNum | number | 必修任务数 |
| compulsoryFinishedTaskNum | number | 已完成必修任务数 |
我的培训项目列表(GET /api/app/my/project_plan)
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| status | string | 否 | 状态筛选:doing/unFinished/finished(未传为全部) |
| page | number | 否 | 页码(从 0 开始) |
| size | number | 否 | 每页数量 |
返回
json
{
"content": [
{
"id": 91001,
"projectPlanId": 4001,
"name": "培训项目A",
"cover": "https://cdn.example.com/project/cover/4001.png",
"joinedTime": 1700000000,
"passingStatus": "passed",
"compulsoryFinishedTaskNum": 5,
"compulsoryTaskNum": 6,
"isArchived": false
}
],
"totalElements": 1,
"totalPages": 1,
"size": 10,
"number": 0
}列表项字段
| 字段 | 类型 | 说明 |
|---|---|---|
| id | number | 成员ID |
| projectPlanId | number | 项目ID |
| name | string | 项目名称 |
| cover | string | 项目封面 |
| joinedTime | number | 加入时间 |
| passingStatus | string | 通过状态 |
| compulsoryFinishedTaskNum | number | 必修任务完成数 |
| compulsoryTaskNum | number | 必修任务数 |
| isArchived | boolean | 是否归档 |
我的开班列表(GET /api/app/my/offline_class)
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| timeStatus | string | 否 | 时间状态:all/not_started/in_progress/ended |
| page | number | 否 | 页码(从 0 开始) |
| size | number | 否 | 每页数量 |
返回
json
{
"content": [
{
"id": 93001,
"offlineClassId": 3001,
"title": "线下开班A",
"cover": "https://cdn.example.com/course/cover/3001.png",
"joinedTime": 1700000000,
"timeStatus": "in_progress"
}
],
"totalElements": 1,
"totalPages": 1,
"size": 10,
"number": 0
}列表项字段
| 字段 | 类型 | 说明 |
|---|---|---|
| id | number | 成员ID |
| offlineClassId | number | 开班ID |
| title | string | 开班名称 |
| cover | string | 课程封面 |
| joinedTime | number | 加入时间 |
| timeStatus | string | 时间状态 |
我的活动列表(GET /api/app/my/offline_activity)
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| status | string | 否 | 活动状态:not_started(未开始)/in_progress(进行中)/ended(已结束),不传为全部 |
| page | number | 否 | 页码(从 0 开始) |
| size | number | 否 | 每页数量 |
返回
json
{
"content": [
{
"id": 94001,
"offlineActivityId": 4001,
"title": "线下活动A",
"cover": "https://cdn.example.com/activity/cover/4001.png",
"status": "in_progress",
"attendedStatus": "attended",
"passedStatus": "passed",
"startTime": 1700000000,
"address": "北京市朝阳区xxx"
}
],
"totalElements": 1,
"totalPages": 1,
"size": 10,
"number": 0
}列表项字段
| 字段 | 类型 | 说明 |
|---|---|---|
| id | number | 成员ID |
| offlineActivityId | number | 活动ID |
| title | string | 活动标题 |
| cover | string | 活动封面 |
| status | string | 活动状态:not_started(未开始)/in_progress(进行中)/ended(已结束) |
| attendedStatus | string | 活动签到状态:none(未签到)/attended(已签到)/unattended(缺勤) |
| passedStatus | string | 通过结果:none(无)/passed(通过)/unpassed(未通过) |
| startTime | number | 活动开始时间(时间戳) |
| address | string | 活动地点 |
说明
- 列表按活动开始时间降序排序
- 活动状态根据当前时间与活动的开始时间、结束时间自动计算:
not_started:当前时间 < 活动开始时间in_progress:活动开始时间 ≤ 当前时间 < 活动结束时间ended:当前时间 ≥ 活动结束时间
学习报告(GET /api/app/offline_class/{offlineClassId}/study_report)
返回
json
{
"userHeader": {
"userId": 2,
"truename": "张三",
"nickname": "zhangsan",
"avatarUrl": "https://cdn.example.com/avatar/2.png",
"orgName": "市场部",
"postName": "产品经理",
"credit": 12,
"certificateNum": 1,
"offlineClassCredit": 20,
"offlineClassCertificateNum": 2,
"isCreditEnabled": true,
"isCertificateEnabled": true
},
"title": "线下开班标题",
"items": [
{
"id": 5001,
"targetType": "offline_course",
"title": "课程A",
"seq": 1,
"startTime": 1700000000,
"endTime": 1700007200,
"time": "2h",
"attendStatus": "attended",
"offlineCoursePassedHomeworkRate": "50.00%",
"homeworkSubmittedNum": 1,
"homeworkFinishedNum": 1,
"homeworkNum": 2,
"signAttendedNum": 2,
"signNum": 2
},
{
"id": 3001,
"targetType": "offline_exam",
"title": "线下考试A",
"seq": 2,
"startTime": 1700010000,
"endTime": 1700013600,
"totalScore": 100.0,
"userScore": 86.0,
"passScore": 60.0,
"passed": true,
"status": "passed"
},
{
"id": 7001,
"targetType": "exam",
"title": "线上考试B",
"seq": 3,
"startTime": 1700020000,
"endTime": 1700021800,
"userScore": null,
"paperScore": 100.0,
"status": "absent",
"results": [
{
"id": 90001,
"startTime": 1700020000,
"endTime": 1700021800,
"score": 80.0,
"status": "finished"
}
]
}
]
}字段说明
顶层字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| userHeader | object | 用户头部信息 |
| title | string | 开班标题 |
| items | array | 学习记录条目 |
userHeader 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| userId | number | 用户ID |
| truename | string | 真实姓名 |
| nickname | string | 昵称 |
| avatarUrl | string | 头像地址 |
| orgName | string | 组织名称 |
| postName | string | 岗位名称 |
| credit | number | 已获学分 |
| certificateNum | number | 已获证书数量 |
| offlineClassCredit | number | 开班要求学分 |
| offlineClassCertificateNum | number | 开班要求证书数量 |
| isCreditEnabled | boolean | 学分启用 |
| isCertificateEnabled | boolean | 证书启用 |
条目通用字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | number | 条目ID |
| targetType | string | 目标类型:offline_course/offline_exam/exam |
| title | string | 标题 |
| startTime | number | 开始时间 |
| endTime | number | 结束时间 |
线下课程条目(targetType=offline_course):
| 字段 | 类型 | 说明 |
|---|---|---|
| time | string | 课程时长 |
| attendStatus | string | 出勤状态:attended/partial/absenteeism/leave/none |
| offlineCoursePassedHomeworkRate | string | 作业通过率 |
| homeworkNum | number | 作业任务总数 |
| homeworkSubmittedNum | number | 已提交作业数 |
| homeworkFinishedNum | number | 已完成作业数 |
| signNum | number | 考勤任务总数 |
| signAttendedNum | number | 已签到次数 |
线下考试条目(targetType=offline_exam):
| 字段 | 类型 | 说明 |
|---|---|---|
| totalScore | number | 总分 |
| userScore | number/null | 学员得分 |
| passScore | number | 及格分 |
| passed | boolean/null | 是否通过 |
| status | string | 考试状态:passed/unpassed/absent |
线上考试条目(targetType=exam):
| 字段 | 类型 | 说明 |
|---|---|---|
| userScore | number/null | 学员得分 |
| paperScore | number | 试卷总分 |
| status | string | 成员状态:notStart/doing/reviewing/finished/absent |
| hideResult | boolean | 是否隐藏成绩 |
| results | array | 考试结果详情列表 |
线上考试结果详情(items[].results[]):
| 字段 | 类型 | 说明 |
|---|---|---|
| id | number | 结果ID |
| startTime | number | 开始时间 |
| endTime | number | 结束时间 |
| score | number | 本次考试成绩 |
| status | string | 结果状态 |
异常
| 错误码 | HTTP状态码 | 错误信息 | 说明 |
|---|---|---|---|
OFFLINE_CLASS_NOT_FOUND | 404 | 线下开班不存在 | offlineClassId 无效或已删除 |
OFFLINE_CLASS_MEMBER_NOT_FOUND | 403 | 学员未加入线下开班 | 当前登录用户不是该开班成员 |