@cqsjjb/course-res-design 0.1.0-beta.1 → 0.1.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CourseInfo.js +104 -15
- package/Designable.d.ts +4 -0
- package/Designable.js +4 -2
- package/Preview.js +4 -3
- package/PreviewVideo.js +11 -5
- package/VideoPlayer.js +5 -2
- package/api/courseLibrary.js +17 -7
- package/api/global.js +11 -3
- package/api/utils.js +15 -0
- package/package.json +1 -1
- package/utils/index.js +2 -2
package/CourseInfo.js
CHANGED
|
@@ -2,11 +2,74 @@ import React from 'react';
|
|
|
2
2
|
import { Descriptions } from 'antd';
|
|
3
3
|
import './CourseInfo.less';
|
|
4
4
|
import { getLabelName } from './utils/tools';
|
|
5
|
-
import { getCourseInfo } from './api/courseLibrary';
|
|
5
|
+
import { getCourseInfo, typePageAction } from './api/courseLibrary';
|
|
6
|
+
|
|
7
|
+
/** 资源渠道 */
|
|
8
|
+
export const COURSE_CHANNEL_ENUM = {
|
|
9
|
+
'01': '自有',
|
|
10
|
+
'02': '购买',
|
|
11
|
+
'03': '其他'
|
|
12
|
+
};
|
|
13
|
+
/** 资源形式 */
|
|
14
|
+
export const COURSE_MODE_ENUM = {
|
|
15
|
+
'01': '高清大屏',
|
|
16
|
+
'02': '慕课',
|
|
17
|
+
'03': '动画',
|
|
18
|
+
'04': 'PPT',
|
|
19
|
+
'05': '音频',
|
|
20
|
+
'06': '录屏',
|
|
21
|
+
'07': '情景剧',
|
|
22
|
+
'08': '实操',
|
|
23
|
+
'15': '微课',
|
|
24
|
+
'16': '微视频'
|
|
25
|
+
};
|
|
26
|
+
/** 内置字段 labelTypeCode -> { label, valueKey, enumMap } */
|
|
27
|
+
const INNER_FIELD_MAP = {
|
|
28
|
+
INDUSTRY: {
|
|
29
|
+
label: '行业',
|
|
30
|
+
valueKey: 'categorizeName'
|
|
31
|
+
},
|
|
32
|
+
JOB_TYPE: {
|
|
33
|
+
label: '工种',
|
|
34
|
+
valueKey: 'jobTypeName'
|
|
35
|
+
},
|
|
36
|
+
YEAR: {
|
|
37
|
+
label: '年份',
|
|
38
|
+
valueKey: 'yearValue'
|
|
39
|
+
},
|
|
40
|
+
REGION: {
|
|
41
|
+
label: '区域',
|
|
42
|
+
valueKey: 'regionName'
|
|
43
|
+
},
|
|
44
|
+
CHANNEL: {
|
|
45
|
+
label: '渠道',
|
|
46
|
+
valueKey: 'courseChannelEnum',
|
|
47
|
+
enumMap: COURSE_CHANNEL_ENUM
|
|
48
|
+
},
|
|
49
|
+
PRODUCER: {
|
|
50
|
+
label: '制作方',
|
|
51
|
+
valueKey: 'lecturerName'
|
|
52
|
+
},
|
|
53
|
+
RESOURCE_TYPE: {
|
|
54
|
+
label: '资源类型',
|
|
55
|
+
valueKey: 'courseModeEnum',
|
|
56
|
+
enumMap: COURSE_MODE_ENUM
|
|
57
|
+
},
|
|
58
|
+
RESOURCE_FORM: {
|
|
59
|
+
label: '资源形式',
|
|
60
|
+
valueKey: 'courseModeEnum',
|
|
61
|
+
enumMap: COURSE_MODE_ENUM
|
|
62
|
+
},
|
|
63
|
+
STAR: {
|
|
64
|
+
label: '星级',
|
|
65
|
+
valueKey: 'star'
|
|
66
|
+
}
|
|
67
|
+
};
|
|
6
68
|
export default class CourseInfo extends React.Component {
|
|
7
69
|
state = {
|
|
8
70
|
loading: false,
|
|
9
|
-
courseInfo: {}
|
|
71
|
+
courseInfo: {},
|
|
72
|
+
industryFields: []
|
|
10
73
|
};
|
|
11
74
|
componentDidMount() {
|
|
12
75
|
// 如果提供了 courseId,则内部获取数据
|
|
@@ -41,11 +104,19 @@ export default class CourseInfo extends React.Component {
|
|
|
41
104
|
loading: true
|
|
42
105
|
});
|
|
43
106
|
try {
|
|
44
|
-
const
|
|
45
|
-
id: courseId,
|
|
107
|
+
const labelRes = await typePageAction({
|
|
46
108
|
apiBaseName: apiBaseName
|
|
47
109
|
});
|
|
48
|
-
|
|
110
|
+
const data = labelRes.data;
|
|
111
|
+
const arr = Array.isArray(data) ? data : [];
|
|
112
|
+
const industryFields = arr.filter(item => item?.classificationType === 'INNER' && item?.useEnum === 'TRUE' && item?.requiredEnum === 'TRUE');
|
|
113
|
+
this.setState({
|
|
114
|
+
industryFields
|
|
115
|
+
});
|
|
116
|
+
const infoRes = await (this.props.getCourseInfoAction ? this.props.getCourseInfoAction() : getCourseInfo({
|
|
117
|
+
id: courseId,
|
|
118
|
+
apiBaseName: apiBaseName
|
|
119
|
+
}));
|
|
49
120
|
// 处理响应数据(兼容不同的响应格式)
|
|
50
121
|
const courseInfo = infoRes?.data || infoRes || {};
|
|
51
122
|
this.setState({
|
|
@@ -59,10 +130,22 @@ export default class CourseInfo extends React.Component {
|
|
|
59
130
|
});
|
|
60
131
|
}
|
|
61
132
|
}
|
|
133
|
+
getInnerFieldDisplay = item => {
|
|
134
|
+
const config = INNER_FIELD_MAP[item.labelTypeCode];
|
|
135
|
+
const label = config?.label ?? item.labelTypeName ?? '-';
|
|
136
|
+
const raw = config?.valueKey ? this.state.courseInfo[config.valueKey] : this.state.courseInfo[item.labelTypeCode];
|
|
137
|
+
const value = config?.enumMap && raw != null ? config.enumMap[raw] : raw;
|
|
138
|
+
return {
|
|
139
|
+
label,
|
|
140
|
+
value: value ?? '-'
|
|
141
|
+
};
|
|
142
|
+
};
|
|
62
143
|
render() {
|
|
63
144
|
const {
|
|
64
145
|
loading,
|
|
65
|
-
courseInfo: stateCourseInfo
|
|
146
|
+
courseInfo: stateCourseInfo,
|
|
147
|
+
industryFields,
|
|
148
|
+
customFields
|
|
66
149
|
} = this.state;
|
|
67
150
|
// 如果提供了 courseId,优先使用内部 state 的数据,否则使用 props
|
|
68
151
|
const hasCourseId = !!this.props.courseId;
|
|
@@ -78,10 +161,6 @@ export default class CourseInfo extends React.Component {
|
|
|
78
161
|
}, /*#__PURE__*/React.createElement(Descriptions.Item, {
|
|
79
162
|
label: "\u8BFE\u7A0B\u540D\u79F0"
|
|
80
163
|
}, courseInfo?.courseName || '--'), /*#__PURE__*/React.createElement(Descriptions.Item, {
|
|
81
|
-
label: "\u7C7B\u76EE"
|
|
82
|
-
}, courseInfo?.categorizeName ? courseInfo.categorizeName : courseInfo?.courseTypeLabel ? getLabelName(courseInfo?.courseTypeLabel) : '--'), courseInfo?.year && /*#__PURE__*/React.createElement(Descriptions.Item, {
|
|
83
|
-
label: "\u5E74\u4EFD"
|
|
84
|
-
}, courseInfo.year), /*#__PURE__*/React.createElement(Descriptions.Item, {
|
|
85
164
|
label: "\u8BFE\u7A0B\u4ECB\u7ECD"
|
|
86
165
|
}, courseInfo?.courseDescription ? /*#__PURE__*/React.createElement("div", {
|
|
87
166
|
dangerouslySetInnerHTML: {
|
|
@@ -94,11 +173,21 @@ export default class CourseInfo extends React.Component {
|
|
|
94
173
|
alt: "\u8BFE\u7A0B\u5C01\u9762",
|
|
95
174
|
width: 84,
|
|
96
175
|
height: 50
|
|
97
|
-
}) : '--'),
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
176
|
+
}) : '--'), industryFields.map((item, idx) => {
|
|
177
|
+
const {
|
|
178
|
+
label,
|
|
179
|
+
value
|
|
180
|
+
} = this.getInnerFieldDisplay(item);
|
|
181
|
+
return /*#__PURE__*/React.createElement(Descriptions.Item, {
|
|
182
|
+
key: item.id ?? idx,
|
|
183
|
+
label: label
|
|
184
|
+
}, value);
|
|
185
|
+
}), JSON.parse(stateCourseInfo.dynamicTags || '[]')?.map((item, idx) => {
|
|
186
|
+
return /*#__PURE__*/React.createElement(Descriptions.Item, {
|
|
187
|
+
key: item.id ?? idx,
|
|
188
|
+
label: item.fieldkey
|
|
189
|
+
}, item.fieldValue);
|
|
190
|
+
}), /*#__PURE__*/React.createElement(Descriptions.Item, {
|
|
102
191
|
label: "\u8BFE\u7A0B\u6807\u7B7E"
|
|
103
192
|
}, getLabelName(courseInfo?.courseLabel) || '--')));
|
|
104
193
|
}
|
package/Designable.d.ts
CHANGED
|
@@ -36,6 +36,10 @@ export interface DesignableProps {
|
|
|
36
36
|
apiBaseName?: 'res' | 'courseScd';
|
|
37
37
|
[key: string]: any;
|
|
38
38
|
};
|
|
39
|
+
// 入口类型
|
|
40
|
+
entry?: 'res' | 'reslib-app';
|
|
41
|
+
// 资源分类
|
|
42
|
+
sourceClassify?: ['PUBLIC' | 'PRIVATE'];
|
|
39
43
|
/** 关闭事件回调 */
|
|
40
44
|
onClose?: (data: DesignableCloseData) => void;
|
|
41
45
|
/** iframe 的源地址,如果提供则优先级高于 host */
|
package/Designable.js
CHANGED
|
@@ -9,12 +9,14 @@ export const Designable = ({
|
|
|
9
9
|
data = {},
|
|
10
10
|
onClose,
|
|
11
11
|
src,
|
|
12
|
-
visible = true
|
|
12
|
+
visible = true,
|
|
13
|
+
entry = 'res',
|
|
14
|
+
sourceClassify = ['PUBLIC', 'PRIVATE']
|
|
13
15
|
}) => {
|
|
14
16
|
const iframeRef = useRef(null);
|
|
15
17
|
|
|
16
18
|
// 计算 iframe 的 src
|
|
17
|
-
const iframeSrc = src || `${host}/res-design/setting`;
|
|
19
|
+
const iframeSrc = src || `${host}/res-design/setting?entry=${entry}&sourceClassify=${sourceClassify.join(',')}`;
|
|
18
20
|
|
|
19
21
|
// 处理 iframe 加载完成
|
|
20
22
|
const handleIframeLoad = () => {
|
package/Preview.js
CHANGED
|
@@ -66,10 +66,10 @@ export default class FormPreview extends React.Component {
|
|
|
66
66
|
});
|
|
67
67
|
try {
|
|
68
68
|
// 并行请求两个接口
|
|
69
|
-
const [menuRes, infoRes] = await Promise.all([getCourseMenu({
|
|
69
|
+
const [menuRes, infoRes] = await Promise.all([this.props.getCourseMenuInfoAction ? this.props.getCourseMenuInfoAction() : getCourseMenu({
|
|
70
70
|
apiBaseName: this.props.apiBaseName,
|
|
71
71
|
id: courseId
|
|
72
|
-
}), getCourseInfo({
|
|
72
|
+
}), this.props.getCourseInfoAction ? this.props.getCourseInfoAction() : getCourseInfo({
|
|
73
73
|
apiBaseName: this.props.apiBaseName,
|
|
74
74
|
id: courseId
|
|
75
75
|
})]);
|
|
@@ -364,7 +364,8 @@ export default class FormPreview extends React.Component {
|
|
|
364
364
|
borderRadius: '10px'
|
|
365
365
|
},
|
|
366
366
|
courseInfo: courseInfo,
|
|
367
|
-
apiBaseName: this.props.apiBaseName
|
|
367
|
+
apiBaseName: this.props.apiBaseName,
|
|
368
|
+
extraApiParams: this.props.extraApiParams
|
|
368
369
|
})), /*#__PURE__*/React.createElement("div", {
|
|
369
370
|
className: "course-preview__item-video-info"
|
|
370
371
|
}, /*#__PURE__*/React.createElement("a", null, "\u89C6\u9891\u65F6\u957F\uFF1A", secondToFormat(Number(item.resourceTotalIden))), courseInfo?.hourRuleId ? /*#__PURE__*/React.createElement("a", null, "\u53C2\u8003\u5B66\u65F6\uFF1A", item.resourceHour || '--', "\u5B66\u65F6") : '', /*#__PURE__*/React.createElement("a", null, "\u8BD5\u770B\u5206\u949F\uFF1A", item.auditionTime || '--'), JSON.parse(item.testExamJson || '[]')?.length > 0 && /*#__PURE__*/React.createElement("a", {
|
package/PreviewVideo.js
CHANGED
|
@@ -21,7 +21,8 @@ const PreviewVideo = ({
|
|
|
21
21
|
disabled,
|
|
22
22
|
onChange,
|
|
23
23
|
style,
|
|
24
|
-
apiBaseName = 'res'
|
|
24
|
+
apiBaseName = 'res',
|
|
25
|
+
extraApiParams
|
|
25
26
|
}) => {
|
|
26
27
|
const [openPreviewVideo, setOpenPreviewVideo] = useState(false);
|
|
27
28
|
const [jjbWebResSelectorShow, setJjbWebResSelectorShow] = useState(false);
|
|
@@ -52,7 +53,8 @@ const PreviewVideo = ({
|
|
|
52
53
|
data: url
|
|
53
54
|
} = await globalApi.getResUrlAction({
|
|
54
55
|
fileId: fileArr[0].id,
|
|
55
|
-
apiBaseName: apiBaseName
|
|
56
|
+
apiBaseName: apiBaseName,
|
|
57
|
+
extraApiParams
|
|
56
58
|
});
|
|
57
59
|
obj.resourceUrl = url ? url.length > 0 ? url[0].url : fileArr[0].fileUrl : fileArr[0].fileUrl;
|
|
58
60
|
} catch (err) {
|
|
@@ -62,7 +64,8 @@ const PreviewVideo = ({
|
|
|
62
64
|
try {
|
|
63
65
|
await courseLibraryApi.getResources({
|
|
64
66
|
fileId: fileArr[0].id,
|
|
65
|
-
apiBaseName: apiBaseName
|
|
67
|
+
apiBaseName: apiBaseName,
|
|
68
|
+
extraApiParams
|
|
66
69
|
}).then(res => {
|
|
67
70
|
if (res.success) {
|
|
68
71
|
obj.testExamJson = JSON.stringify(res.data);
|
|
@@ -78,7 +81,8 @@ const PreviewVideo = ({
|
|
|
78
81
|
} = await courseLibraryApi.getTemplateHour({
|
|
79
82
|
duration: fileArr[0].duration,
|
|
80
83
|
ruleId: courseInfo.hourRuleId,
|
|
81
|
-
apiBaseName: apiBaseName
|
|
84
|
+
apiBaseName: apiBaseName,
|
|
85
|
+
...extraApiParams
|
|
82
86
|
});
|
|
83
87
|
if (data.length > 0) {
|
|
84
88
|
obj.resourceHour = data[0].hour;
|
|
@@ -155,6 +159,7 @@ const PreviewVideo = ({
|
|
|
155
159
|
from: "https://cdn.cqjjb.cn/jjb1-web-jjb-web-saas-res-selector/latest/index.js",
|
|
156
160
|
componentKey: "jjbWebResSelector",
|
|
157
161
|
componentProps: {
|
|
162
|
+
apiBaseName: apiBaseName,
|
|
158
163
|
sourceType: ['media'],
|
|
159
164
|
onOk: handleResSelectorOk,
|
|
160
165
|
onCancel: handleResSelectorCancel
|
|
@@ -172,7 +177,8 @@ const PreviewVideo = ({
|
|
|
172
177
|
id: fileId,
|
|
173
178
|
src: resourceUrl,
|
|
174
179
|
apiBaseName: apiBaseName,
|
|
175
|
-
courseInfo: courseInfo
|
|
180
|
+
courseInfo: courseInfo,
|
|
181
|
+
extraApiParams: extraApiParams
|
|
176
182
|
})));
|
|
177
183
|
};
|
|
178
184
|
PreviewVideo.propTypes = {
|
package/VideoPlayer.js
CHANGED
|
@@ -9,6 +9,7 @@ const VideoPlayer = props => {
|
|
|
9
9
|
id,
|
|
10
10
|
courseInfo,
|
|
11
11
|
apiBaseName,
|
|
12
|
+
extraApiParams,
|
|
12
13
|
...rest
|
|
13
14
|
} = props;
|
|
14
15
|
const [tracks, setTracks] = useState([]);
|
|
@@ -19,7 +20,8 @@ const VideoPlayer = props => {
|
|
|
19
20
|
getResUrlAction({
|
|
20
21
|
fileId: id,
|
|
21
22
|
courseId: courseInfo?.id,
|
|
22
|
-
apiBaseName: apiBaseName
|
|
23
|
+
apiBaseName: apiBaseName,
|
|
24
|
+
extraApiParams
|
|
23
25
|
}).then(res => {
|
|
24
26
|
if (res.data) {
|
|
25
27
|
setNewSrc(res.data?.map((item, index) => {
|
|
@@ -47,7 +49,8 @@ const VideoPlayer = props => {
|
|
|
47
49
|
getVideoCaption({
|
|
48
50
|
fileId: id,
|
|
49
51
|
courseId: courseInfo?.id,
|
|
50
|
-
apiBaseName: apiBaseName
|
|
52
|
+
apiBaseName: apiBaseName,
|
|
53
|
+
extraApiParams
|
|
51
54
|
}).then(res => {
|
|
52
55
|
if (res.data?.length) {
|
|
53
56
|
setTracks(res.data.map((item, index) => {
|
package/api/courseLibrary.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import request
|
|
1
|
+
import request from '../utils/request';
|
|
2
|
+
import { getApiBaseName } from './utils';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* 资源库获取试题
|
|
@@ -6,7 +7,10 @@ import request, { API_BASE_NAME } from '../utils/request';
|
|
|
6
7
|
* @returns {Promise}
|
|
7
8
|
*/
|
|
8
9
|
export const getResources = params => {
|
|
9
|
-
|
|
10
|
+
const { apiBaseName, fileId, extraApiParams } = params;
|
|
11
|
+
return request.get(`/${getApiBaseName(apiBaseName)}/course/getResExam/${fileId}`, {
|
|
12
|
+
params: extraApiParams
|
|
13
|
+
});
|
|
10
14
|
};
|
|
11
15
|
|
|
12
16
|
/**
|
|
@@ -15,7 +19,7 @@ export const getResources = params => {
|
|
|
15
19
|
* @returns {Promise}
|
|
16
20
|
*/
|
|
17
21
|
export const getTemplateHour = params => {
|
|
18
|
-
return request.post(`/${params
|
|
22
|
+
return request.post(`/${getApiBaseName(params?.apiBaseName)}/course/getResourceHour`, params);
|
|
19
23
|
};
|
|
20
24
|
|
|
21
25
|
/**
|
|
@@ -24,14 +28,20 @@ export const getTemplateHour = params => {
|
|
|
24
28
|
* @returns {Promise}
|
|
25
29
|
*/
|
|
26
30
|
export const getCourseMenu = params => {
|
|
27
|
-
return request.get(`/${params
|
|
31
|
+
return request.get(`/${getApiBaseName(params?.apiBaseName)}/course/findCourseMenu/${params.id}`);
|
|
28
32
|
};
|
|
29
33
|
|
|
30
34
|
/**
|
|
31
35
|
* 获取课程基本信息数据(课程信息)
|
|
32
36
|
* @param {object} params - 请求参数,包含 id
|
|
33
|
-
* @returns {Promise}
|
|
37
|
+
* @returns {Promise}
|
|
34
38
|
*/
|
|
35
39
|
export const getCourseInfo = params => {
|
|
36
|
-
return request.get(`/${params
|
|
37
|
-
};
|
|
40
|
+
return request.get(`/${getApiBaseName(params?.apiBaseName)}/course/${params.id}`);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// 查询标签分类管理列表
|
|
44
|
+
export const typePageAction = params =>
|
|
45
|
+
request.get(`/${getApiBaseName(params?.apiBaseName)}/typeManage`, {
|
|
46
|
+
params
|
|
47
|
+
});
|
package/api/global.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import request
|
|
1
|
+
import request from '../utils/request';
|
|
2
|
+
import { getApiBaseName } from './utils';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* 根据资源id查询新的视频url
|
|
@@ -6,7 +7,10 @@ import request, { API_BASE_NAME } from '../utils/request';
|
|
|
6
7
|
* @returns {Promise}
|
|
7
8
|
*/
|
|
8
9
|
export const getResUrlAction = params => {
|
|
9
|
-
|
|
10
|
+
const { apiBaseName, fileId, extraApiParams } = params;
|
|
11
|
+
return request.get(`/${getApiBaseName(apiBaseName)}/course/getVideoUrlByFileId/${fileId}`, {
|
|
12
|
+
params: extraApiParams
|
|
13
|
+
});
|
|
10
14
|
};
|
|
11
15
|
|
|
12
16
|
/**
|
|
@@ -15,7 +19,11 @@ export const getResUrlAction = params => {
|
|
|
15
19
|
* @returns {Promise}
|
|
16
20
|
*/
|
|
17
21
|
export const getVideoCaption = params => {
|
|
22
|
+
const { apiBaseName, fileId, extraApiParams } = params;
|
|
18
23
|
return request.get(
|
|
19
|
-
`/${
|
|
24
|
+
`/${getApiBaseName(apiBaseName)}/course/getCaptionListByFileId/${fileId}`,
|
|
25
|
+
{
|
|
26
|
+
params: extraApiParams
|
|
27
|
+
}
|
|
20
28
|
);
|
|
21
29
|
};
|
package/api/utils.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const inIframe = () => {
|
|
2
|
+
return window.self !== window.top;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export const getApiBaseName = (baseName) => {
|
|
6
|
+
if(baseName) {
|
|
7
|
+
return baseName;
|
|
8
|
+
}
|
|
9
|
+
try {
|
|
10
|
+
const location = inIframe() ? window.parent.location : window.location;
|
|
11
|
+
return location.pathname.match(/^\/(.+)\/[C|c]ontainer/)[1];
|
|
12
|
+
} catch (error) {
|
|
13
|
+
return 'res';
|
|
14
|
+
}
|
|
15
|
+
}
|
package/package.json
CHANGED
package/utils/index.js
CHANGED
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export function getApiHost() {
|
|
6
6
|
return process.env.NODE_ENV === 'development' ?
|
|
7
|
-
process
|
|
8
|
-
: window.location.origin;
|
|
7
|
+
window?.['process']?.['env']?.['app']?.['API_HOST'] || sessionStorage.getItem('API_HOST') || 'https://yjap.cqzxaq.com'
|
|
8
|
+
: window?.['process']?.['env']?.['app']?.['API_HOST'] || sessionStorage.getItem('API_HOST') || window.location.origin;
|
|
9
9
|
}
|