@x-edu/live-player 0.0.19 → 0.0.21

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.
Files changed (302) hide show
  1. package/.browserslistrc +10 -10
  2. package/.eslintignore +8 -8
  3. package/.eslintrc.js +26 -26
  4. package/.gem-mine +11 -11
  5. package/.postcssrc.js +6 -6
  6. package/README.md +145 -145
  7. package/babel.config.js +33 -33
  8. package/dist/XEduLivePlayer.common.js +12161 -1154
  9. package/dist/XEduLivePlayerPre.common.js +12369 -1358
  10. package/doc/develop.md +23 -23
  11. package/gem-mine.config.js +86 -86
  12. package/jest.config.js +9 -9
  13. package/jsconfig.json +15 -15
  14. package/mock/helper.js +8 -8
  15. package/mock/index.js +34 -34
  16. package/package.json +99 -99
  17. package/public/3rd/ali-player/alipayercomponents-1.0.8.min.js +26 -26
  18. package/public/3rd/ali-player/aliplayer-hls-min.js +27 -27
  19. package/public/3rd/ali-player/aliplayer-min.js +1 -1
  20. package/public/3rd/im-web-push/index.umd.js +14 -14
  21. package/public/JsBridge.js +1602 -1602
  22. package/public/fish/editor/themes/default/css/ueditor.css +1905 -1905
  23. package/public/fish/editor/third-party/codemirror/codemirror.css +104 -104
  24. package/public/fish/editor/third-party/codemirror/codemirror.js +3581 -3581
  25. package/public/fish/editor/third-party/zeroclipboard/ZeroClipboard.js +1255 -1255
  26. package/public/fish/editor/ueditor.all.min.js +16 -16
  27. package/public/fish/editor/ueditor.config.js +467 -467
  28. package/public/fish/icon/umd-4.1.2.js +1 -1
  29. package/public/fish/video/videoplayer.min.css +6 -6
  30. package/public/fish/video/videoplayer.min.js +31 -31
  31. package/public/fish/video/zh-CN.js +82 -82
  32. package/public/icon/demo.css +539 -539
  33. package/public/icon/demo_index.html +2189 -2189
  34. package/public/icon/iconfont.css +363 -363
  35. package/public/icon/iconfont.json +618 -618
  36. package/public/index.html +50 -50
  37. package/script/image/readme.md +77 -77
  38. package/script/postcss.js +48 -48
  39. package/src/App.jsx +24 -24
  40. package/src/asset/img/course/playing.svg +21 -21
  41. package/src/asset/img/icon-course-white.svg +3 -3
  42. package/src/asset/img/icon-course.svg +3 -3
  43. package/src/asset/img/icon-eye-white.svg +4 -4
  44. package/src/asset/img/icon-eye.svg +4 -4
  45. package/src/asset/img/icon-school-white.svg +3 -3
  46. package/src/asset/img/icon-school.svg +3 -3
  47. package/src/asset/img/loading.svg +52 -52
  48. package/src/asset/img/video-play.svg +6 -6
  49. package/src/asset/style/background.less +19 -19
  50. package/src/asset/style/banner.less +36 -36
  51. package/src/asset/style/base.less +74 -74
  52. package/src/asset/style/index.less +114 -114
  53. package/src/asset/style/reset-theme.less +141 -141
  54. package/src/asset/style/theme/index.less +55 -55
  55. package/src/asset/style/theme/party/global.less +20 -20
  56. package/src/asset/style/theme/party/override.less +57 -57
  57. package/src/asset/style/theme/test/global.less +18 -18
  58. package/src/asset/style/theme/test/override.less +45 -45
  59. package/src/asset/style/variable.less +12 -12
  60. package/src/component/AliPlayer/index.jsx +49 -49
  61. package/src/component/Avatar/index.jsx +50 -50
  62. package/src/component/Empty/index.jsx +34 -34
  63. package/src/component/Empty/index.module.less +37 -37
  64. package/src/component/IMChatroom/component/status/403.jsx +13 -13
  65. package/src/component/IMChatroom/component/status/404.jsx +13 -13
  66. package/src/component/IMChatroom/component/status/Error.jsx +23 -23
  67. package/src/component/IMChatroom/component/status/Loading.jsx +5 -5
  68. package/src/component/IMChatroom/config/app/config.js +118 -118
  69. package/src/component/IMChatroom/config/app/index.js +60 -60
  70. package/src/component/IMChatroom/config/env.js +5 -5
  71. package/src/component/IMChatroom/config/index.js +3 -3
  72. package/src/component/IMChatroom/config/request/config/base.js +124 -124
  73. package/src/component/IMChatroom/config/request/config/chatroom.js +26 -26
  74. package/src/component/IMChatroom/config/request/config/imCoreApi.js +21 -21
  75. package/src/component/IMChatroom/config/request/index.js +21 -21
  76. package/src/component/IMChatroom/config/request/proxy.js +39 -39
  77. package/src/component/IMChatroom/config/url.js +7 -7
  78. package/src/component/IMChatroom/constants/errorCode.js +9 -9
  79. package/src/component/IMChatroom/constants/index.js +84 -84
  80. package/src/component/IMChatroom/constants/origin.js +27 -27
  81. package/src/component/IMChatroom/context/chatroom.js +154 -154
  82. package/src/component/IMChatroom/context/connect.js +28 -28
  83. package/src/component/IMChatroom/i18n/en/index.json +73 -73
  84. package/src/component/IMChatroom/i18n/index.jsx +14 -14
  85. package/src/component/IMChatroom/i18n/language.js +9 -9
  86. package/src/component/IMChatroom/i18n/zh-CN/index.json +73 -73
  87. package/src/component/IMChatroom/index.jsx +49 -49
  88. package/src/component/IMChatroom/page/chat/index.jsx +27 -27
  89. package/src/component/IMChatroom/page/chat/messageEditor/index.jsx +375 -375
  90. package/src/component/IMChatroom/page/chat/messageList/index.jsx +354 -354
  91. package/src/component/IMChatroom/page/chat/stickedMessage/index.jsx +59 -59
  92. package/src/component/IMChatroom/page/chat/stickedMessage/style/index.module.less +7 -7
  93. package/src/component/IMChatroom/page/chat/style/index.module.less +51 -51
  94. package/src/component/IMChatroom/page/home/connect/index.jsx +188 -188
  95. package/src/component/IMChatroom/page/home/connect/status.jsx +124 -124
  96. package/src/component/IMChatroom/page/home/context/cmd.jsx +37 -37
  97. package/src/component/IMChatroom/page/home/context/index.jsx +67 -67
  98. package/src/component/IMChatroom/page/home/index.jsx +164 -164
  99. package/src/component/IMChatroom/page/home/notice/index.jsx +123 -123
  100. package/src/component/IMChatroom/page/home/notice/style/index.module.less +49 -49
  101. package/src/component/IMChatroom/page/home/style/index.module.less +110 -110
  102. package/src/component/IMChatroom/page/member/index.jsx +15 -15
  103. package/src/component/IMChatroom/page/member/memberCount/index.jsx +44 -44
  104. package/src/component/IMChatroom/page/member/memberList/index.jsx +121 -121
  105. package/src/component/IMChatroom/page/member/style/index.module.less +2 -2
  106. package/src/component/IMChatroom/sdk/bridge.js +39 -39
  107. package/src/component/IMChatroom/sdk/cs/constants.js +20 -20
  108. package/src/component/IMChatroom/sdk/cs/index.js +101 -101
  109. package/src/component/IMChatroom/sdk/imChatroom.js +15 -15
  110. package/src/component/IMChatroom/sdk/imcore/constants.js +128 -128
  111. package/src/component/IMChatroom/sdk/imcore/emitters/chatroomDestroyed.js +5 -5
  112. package/src/component/IMChatroom/sdk/imcore/emitters/chatroomInfoGetFail.js +5 -5
  113. package/src/component/IMChatroom/sdk/imcore/emitters/chatroomKickedByAdmin.js +5 -5
  114. package/src/component/IMChatroom/sdk/imcore/emitters/chatroomKickedBySelf.js +5 -5
  115. package/src/component/IMChatroom/sdk/imcore/emitters/chatroomLoginFail.js +5 -5
  116. package/src/component/IMChatroom/sdk/imcore/emitters/chatroomLoginSuccess.js +5 -5
  117. package/src/component/IMChatroom/sdk/imcore/emitters/chatroomMemberLogin.js +5 -5
  118. package/src/component/IMChatroom/sdk/imcore/emitters/chatroomMemberLogout.js +5 -5
  119. package/src/component/IMChatroom/sdk/imcore/emitters/connectionConnected.js +5 -5
  120. package/src/component/IMChatroom/sdk/imcore/emitters/connectionConnecting.js +5 -5
  121. package/src/component/IMChatroom/sdk/imcore/emitters/connectionDisconnect.js +5 -5
  122. package/src/component/IMChatroom/sdk/imcore/emitters/index.js +57 -57
  123. package/src/component/IMChatroom/sdk/imcore/emitters/messageReceive.js +36 -36
  124. package/src/component/IMChatroom/sdk/imcore/index.js +178 -178
  125. package/src/component/IMChatroom/sdk/imcore/interceptors/request.js +7 -7
  126. package/src/component/IMChatroom/sdk/imcore/interceptors/response.js +5 -5
  127. package/src/component/IMChatroom/sdk/imcore/plugins/getAuth.js +64 -64
  128. package/src/component/IMChatroom/sdk/imcore/plugins/getConversationId.js +20 -20
  129. package/src/component/IMChatroom/sdk/imcore/plugins/getExtInfo.js +10 -10
  130. package/src/component/IMChatroom/sdk/imcore/plugins/getLoginInfo.js +48 -48
  131. package/src/component/IMChatroom/sdk/imcore/plugins/getPlatformType.js +12 -12
  132. package/src/component/IMChatroom/sdk/imcore/plugins/index.js +22 -22
  133. package/src/component/IMChatroom/sdk/imcore/util/format.js +177 -177
  134. package/src/component/IMChatroom/sdk/imcore/util/parser.js +35 -35
  135. package/src/component/IMChatroom/sdk/oms.js +18 -18
  136. package/src/component/IMChatroom/sdk/uc.js +3 -3
  137. package/src/component/IMChatroom/subscription/channel/app.js +5 -5
  138. package/src/component/IMChatroom/subscription/channel/ctl.js +22 -22
  139. package/src/component/IMChatroom/subscription/channel/member.js +40 -40
  140. package/src/component/IMChatroom/subscription/channel/message.js +13 -13
  141. package/src/component/IMChatroom/subscription/channel/ntf.js +86 -86
  142. package/src/component/IMChatroom/subscription/channel/tel.js +5 -5
  143. package/src/component/IMChatroom/subscription/channel/websocket.js +5 -5
  144. package/src/component/IMChatroom/subscription/event.js +37 -37
  145. package/src/component/IMChatroom/subscription/index.js +19 -19
  146. package/src/component/IMChatroom/util/account.js +8 -8
  147. package/src/component/IMChatroom/util/chatroom.js +255 -255
  148. package/src/component/IMChatroom/util/jsonBigInt.js +5 -5
  149. package/src/component/IMChatroom/util/location.js +12 -12
  150. package/src/component/Icon/index.jsx +16 -16
  151. package/src/component/Icon/index.module.less +2 -2
  152. package/src/component/Pagination/LocalPagination.jsx +27 -27
  153. package/src/component/Pagination/RemotePagination.jsx +32 -32
  154. package/src/component/Pagination/index.jsx +31 -31
  155. package/src/component/Pagination/index.module.less +110 -110
  156. package/src/component/PlayerTip/index.jsx +34 -34
  157. package/src/component/VideoBase/index.jsx +242 -242
  158. package/src/component/VideoBase/style.less +65 -65
  159. package/src/component/VideoBase/utils.js +81 -81
  160. package/src/component/mixin.less +9 -9
  161. package/src/component/status/403.jsx +15 -15
  162. package/src/component/status/404/index.jsx +73 -73
  163. package/src/component/status/404/index.module.less +36 -36
  164. package/src/component/status/Error/error.module.less +13 -13
  165. package/src/component/status/Error/index.jsx +47 -47
  166. package/src/component/status/Loading/img/loading.svg +52 -52
  167. package/src/component/status/Loading/index.jsx +31 -31
  168. package/src/component/status/Loading/index.less +56 -56
  169. package/src/component/status/None/index.jsx +20 -20
  170. package/src/component/status/None/index.module.less +35 -35
  171. package/src/component/status/Status/index.jsx +26 -26
  172. package/src/component/status/Status/index.module.less +8 -8
  173. package/src/config/constant/commonUrl.js +2 -2
  174. package/src/config/constant/user.js +6 -6
  175. package/src/config/context/site-config.js +48 -48
  176. package/src/config/env/index.js +5 -5
  177. package/src/config/env/local/index.js +13 -13
  178. package/src/config/env/ncet-xedu/api.js +175 -175
  179. package/src/config/env/ncet-xedu/app.js +12 -12
  180. package/src/config/env/ncet-xedu/cs.js +8 -8
  181. package/src/config/env/ncet-xedu/index.js +14 -14
  182. package/src/config/env/ncet-xedu/push.js +5 -5
  183. package/src/config/env/preproduction/api.js +144 -144
  184. package/src/config/env/preproduction/app.js +12 -12
  185. package/src/config/env/preproduction/cs.js +8 -8
  186. package/src/config/env/preproduction/index.js +14 -14
  187. package/src/config/env/preproduction/push.js +5 -5
  188. package/src/config/env/product/api.js +113 -113
  189. package/src/config/env/product/app.js +12 -12
  190. package/src/config/env/product/cs.js +5 -5
  191. package/src/config/env/product/index.js +14 -14
  192. package/src/config/env/product/push.js +5 -5
  193. package/src/config/live.js +80 -80
  194. package/src/config/publicLive.js +53 -53
  195. package/src/config/request/assessments.js +24 -24
  196. package/src/config/request/config-center.js +8 -8
  197. package/src/config/request/helper.js +166 -166
  198. package/src/config/request/im-broadcasts.js +12 -12
  199. package/src/config/request/live-activity-gateway.js +8 -8
  200. package/src/config/request/live-activity.js +13 -13
  201. package/src/config/request/raw.js +6 -6
  202. package/src/config/request/x-cloud-web.js +13 -13
  203. package/src/config/request/x-proxy.js +34 -34
  204. package/src/demo/Detail.jsx +11 -11
  205. package/src/demo/List.jsx +64 -64
  206. package/src/demo/index.jsx +17 -17
  207. package/src/detail/LineSwitch/index.jsx +71 -71
  208. package/src/detail/LiveCountDown/index.jsx +44 -44
  209. package/src/detail/LiveCountDown/index.module.less +31 -31
  210. package/src/detail/LiveOnlineCount/img/icon.svg +15 -15
  211. package/src/detail/LiveOnlineCount/index.jsx +68 -68
  212. package/src/detail/LiveOnlineCount/index.module.less +34 -34
  213. package/src/detail/LiveOnlineCount/util.js +74 -74
  214. package/src/detail/LiveStatus/AnchorOnTheWay.jsx +88 -88
  215. package/src/detail/LiveStatus/index.jsx +202 -202
  216. package/src/detail/LiveStatus/index.module.less +192 -192
  217. package/src/detail/LiveVideo/config.js +37 -37
  218. package/src/detail/LiveVideo/index.jsx +188 -188
  219. package/src/detail/LiveVideo/index.module.less +41 -41
  220. package/src/detail/NotLoginChatroom/index.jsx +37 -37
  221. package/src/detail/NotLoginChatroom/index.module.less +46 -46
  222. package/src/detail/RecordVideo/index.jsx +150 -150
  223. package/src/detail/RecordVideo/index.module.less +31 -31
  224. package/src/detail/ReplayVideo/index.jsx +93 -93
  225. package/src/detail/ReplayVideo/index.module.less +65 -65
  226. package/src/detail/const.js +20 -20
  227. package/src/detail/hook/usePullSource.js +82 -82
  228. package/src/detail/hook/usePullState.js +51 -51
  229. package/src/detail/index.jsx +482 -482
  230. package/src/detail/index.module.less +188 -188
  231. package/src/hook/useAsync.js +84 -84
  232. package/src/hook/useGoToPage.js +83 -83
  233. package/src/hook/useInterval.js +28 -28
  234. package/src/hook/useIsMounted.js +17 -17
  235. package/src/hook/useModuleByRole.js +53 -53
  236. package/src/hook/usePageScrollable.js +52 -52
  237. package/src/hook/usePortal.js +83 -83
  238. package/src/hook/useScrollRestore/index.js +32 -32
  239. package/src/hook/useScrollRestore/scrollContext.js +20 -20
  240. package/src/hook/useTrackRef.js +11 -11
  241. package/src/hook/useWindowSize.js +28 -28
  242. package/src/hook/useZoom.js +47 -47
  243. package/src/index.js +10 -10
  244. package/src/lib/getLiveOnlineCount.js +10 -10
  245. package/src/lib/getServiceConfig.js +102 -102
  246. package/src/list/Empty/index.jsx +20 -20
  247. package/src/list/Empty/index.module.less +23 -23
  248. package/src/list/ListItem/Action/index.jsx +98 -98
  249. package/src/list/ListItem/Action/index.module.less +21 -21
  250. package/src/list/ListItem/img/dianzan.svg +4 -0
  251. package/src/list/ListItem/img/play.svg +15 -15
  252. package/src/list/ListItem/img/yiguankan.svg +3 -0
  253. package/src/list/ListItem/index.jsx +24 -1
  254. package/src/list/ListItem/index.module.less +146 -123
  255. package/src/list/index.jsx +80 -0
  256. package/src/list/index.module.less +35 -35
  257. package/src/service/common.js +73 -73
  258. package/src/service/content-mgr.js +73 -73
  259. package/src/service/im-group.js +12 -12
  260. package/src/service/im.js +7 -7
  261. package/src/service/imBroadcasts.js +33 -33
  262. package/src/service/like.js +134 -134
  263. package/src/service/manageApi.js +7 -7
  264. package/src/service/managePortal.js +6 -6
  265. package/src/service/myStudyRecord.js +93 -93
  266. package/src/service/navigation.js +47 -47
  267. package/src/service/ndMeeting.js +10 -10
  268. package/src/service/ndr.js +122 -122
  269. package/src/service/news.js +93 -93
  270. package/src/service/personalCenter.js +270 -270
  271. package/src/service/qualityCourse.js +31 -31
  272. package/src/service/recommend.js +81 -81
  273. package/src/service/school.js +323 -323
  274. package/src/service/search.js +170 -170
  275. package/src/service/site-config.js +7 -7
  276. package/src/service/socialCensor.js +45 -45
  277. package/src/service/specialEdu.js +31 -31
  278. package/src/service/suggestion.js +85 -85
  279. package/src/service/syncClassroom.js +321 -321
  280. package/src/service/tCourse.js +204 -204
  281. package/src/service/tchTraining.js +37 -37
  282. package/src/service/uc.js +45 -45
  283. package/src/util/app.js +1 -1
  284. package/src/util/array.js +3 -3
  285. package/src/util/auth/func.js +57 -57
  286. package/src/util/date.js +53 -53
  287. package/src/util/env.js +9 -9
  288. package/src/util/getTimestamp.js +10 -10
  289. package/src/util/hof.js +105 -105
  290. package/src/util/live/index.js +42 -42
  291. package/src/util/liveCountUtil.js +52 -0
  292. package/src/util/netUrl.js +35 -35
  293. package/src/util/object.js +13 -13
  294. package/src/util/push/index.js +58 -58
  295. package/src/util/request.js +227 -227
  296. package/src/util/type.js +17 -17
  297. package/src/util/url.js +203 -203
  298. package/src/util/video.js +26 -26
  299. package/test/setup.js +21 -21
  300. package/test/unit/component/header/logo.spec.jsx +8 -8
  301. package/test/unit/helper.jsx +25 -25
  302. package/test/unit/util/date.spec.js +40 -40
@@ -1,270 +1,270 @@
1
- import dayjs from 'dayjs'
2
- // import SHA256 from 'crypto-js/sha256'
3
- import { communityWithUC } from '@/config/request/community'
4
- import { assessmentApi, assessmentApiCdn } from '@/config/request/assessments'
5
- import { getLoginUrl, getUserInfo, goToLoginPage } from '@/util/auth/func'
6
- import { assessmentRateCacheKey } from '@/config/constant/cacheKey'
7
- import { tchStudioGatewayWithUC } from '@/config/request/teacher-studio-gateway'
8
-
9
- import config from '@/config/env'
10
- import { ApiTimestampKey } from '@/config/constant/common'
11
- import { withOnce } from '@/util/hof'
12
-
13
- const { appid } = config.app
14
-
15
- function updateTimestamp(key = ApiTimestampKey.LAST_FAVOR_ACTION_TIMESTAMP) {
16
- window.localStorage.setItem(key, new Date().getTime())
17
- }
18
- function getTimestamp(key = ApiTimestampKey.LAST_FAVOR_ACTION_TIMESTAMP) {
19
- let time = window.localStorage.getItem(key)
20
- if (!time) {
21
- time = new Date().getTime()
22
- window.localStorage.setItem(key, new Date().getTime())
23
- }
24
- return time
25
- }
26
-
27
- export async function getTeacherStudios(params) {
28
- const url = '/v1/users/teacher_studios'
29
- try {
30
- const result = await tchStudioGatewayWithUC.get(url, {
31
- params: {
32
- $offset: params.page_no * params.page_size,
33
- $limit: params.page_size,
34
- $count: true,
35
- _userId: params.userId,
36
- _t: getTimestamp(ApiTimestampKey.LAST_TEACHERSTUDIO_ACTION_TIMESTAMP)
37
- }
38
- })
39
- return result
40
- } catch (e) {
41
- updateTimestamp(ApiTimestampKey.LAST_TEACHERSTUDIO_ACTION_TIMESTAMP)
42
- throw e
43
- }
44
- }
45
-
46
- export async function getMyCourses(params) {
47
- const url = '/user_study'
48
- try {
49
- const result = await communityWithUC.get(url, {
50
- params: {
51
- offset: params.page_no * params.page_size,
52
- limit: params.page_size,
53
- _userId: params.userId,
54
- _t: getTimestamp(ApiTimestampKey.LAST_STUDY_ACTION_TIMESTAMP)
55
- },
56
- headers: {
57
- 'sdp-app-id': appid
58
- }
59
- })
60
- return result
61
- } catch (e) {
62
- updateTimestamp(ApiTimestampKey.LAST_STUDY_ACTION_TIMESTAMP)
63
- throw e
64
- }
65
- }
66
-
67
- /** 获取用户课程评价信息
68
- * @param assessmentId: 评价对象(课程id)
69
- * @param assessmentType: 评价对象资源类型(默认course,前后端暂时都没有用这个字段,建议传递资源类型字段x_course(课本),x_class_hour_activity(课程也就是课时),t_course(教师研修),t_course_pdf(教师研修下的Pdf资源),x_audio_video,x_url,x_image_list,x_document,x_article
70
- * @return userAssessmentVo: {
71
- "assessment_id": "string",
72
- "assessment_type": "string",
73
- "user_id": 0,
74
- "score": 0
75
- }
76
- */
77
- export async function getUserAssessmentRate(assessmentId, assessmentType = 'course') {
78
- const userInfo = await getUserInfo()
79
- const cacheKey = assessmentRateCacheKey(assessmentId, userInfo.user_id)
80
- let userAssessmentVo = localStorage.getItem(cacheKey)
81
- if (userAssessmentVo) {
82
- try {
83
- userAssessmentVo = JSON.parse(userAssessmentVo)
84
- } catch (e) {
85
- // parse error
86
- }
87
- }
88
- if (!userAssessmentVo || !userAssessmentVo.assessment_id) {
89
- const url = `/assessments/${assessmentId}/user_assessment?assessment_type=${assessmentType}`
90
- const { data } = await assessmentApi.get(url, {
91
- headers: {
92
- 'sdp-app-id': appid
93
- }
94
- })
95
- if (data?.score ?? '') {
96
- userAssessmentVo = data
97
- }
98
- if (userAssessmentVo) {
99
- localStorage.setItem(cacheKey, JSON.stringify(userAssessmentVo))
100
- }
101
- }
102
- return userAssessmentVo
103
- }
104
-
105
- /** 获取课程评价
106
- * @param assessmentId: 评价对象(课程id)
107
- * @param assessment_type: 评价对象资源类型(默认course,前后端暂时都没有用这个字段,建议传递资源类型字段x_course(课本),x_class_hour_activity(课程也就是课时),t_course(教师研修),t_course_pdf(教师研修下的Pdf资源),x_audio_video,x_url,x_image_list,x_document,x_article
108
- * @return assessmentVo: {
109
- "assessment_id": "string",
110
- "assessment_type": "string",
111
- "total_user_count": "number",
112
- "score": 0,
113
- "star_1_rate": 0,
114
- "star_2_rate": 0,
115
- "star_3_rate": 0,
116
- "star_4_rate": 0,
117
- "star_5_rate": 0,
118
- "details": [
119
- {
120
- "user_count": 0,
121
- "score": 0
122
- }
123
- ]
124
- }
125
- */
126
- const getUserInfoOnce = withOnce(getUserInfo)
127
-
128
- export async function getAssessmentRate(
129
- assessmentId,
130
- assessmentType = 'course'
131
- ) {
132
- const userInfo = await getUserInfoOnce()
133
- let userAssessmentVo
134
- if (userInfo) {
135
- const cacheKey = assessmentRateCacheKey(assessmentId, userInfo.user_id)
136
- try {
137
- userAssessmentVo = JSON.parse(localStorage.getItem(cacheKey))
138
- } catch (e) {
139
- //
140
- }
141
- if (userAssessmentVo && !userAssessmentVo.assessment_id && userAssessmentVo.score) {
142
- submitUserAssessmentRate(assessmentId, userAssessmentVo.score, assessmentType)
143
- }
144
- }
145
- let lastModified
146
- let assessmentVo
147
- try {
148
- const { data, headers: { 'last-modified': _lastModified } } = await assessmentApiCdn.get(`/assessments/${assessmentId}?assessment_type=${assessmentType}`)
149
- assessmentVo = data
150
- lastModified = dayjs(_lastModified).valueOf()
151
- } catch (e) {
152
- //
153
- }
154
- if (!assessmentVo?.details?.length) {
155
- assessmentVo = {
156
- assessment_id: assessmentId,
157
- assessment_type: assessmentType,
158
- details: [{
159
- user_count: 0,
160
- score: 1
161
- }, {
162
- user_count: 0,
163
- score: 2
164
- }, {
165
- user_count: 0,
166
- score: 3
167
- }, {
168
- user_count: 0,
169
- score: 4
170
- }, {
171
- user_count: 0,
172
- score: 5
173
- }]
174
- }
175
- }
176
- if (userAssessmentVo?.updateTime > lastModified) {
177
- assessmentVo.details.forEach((detail) => {
178
- if (detail.score === userAssessmentVo.score) {
179
- detail.user_count += 1
180
- }
181
- })
182
- }
183
- assessmentVo.total_user_count = assessmentVo.details?.reduce((prev, next) => prev + next.user_count, 0)
184
- if (assessmentVo.total_user_count) {
185
- let lessThan1Count = 0
186
- let scoreOver1P = 0
187
- const totalScore = assessmentVo.details.reduce((prev, next) => prev + next.user_count * next.score, 0)
188
- assessmentVo.score = (totalScore / assessmentVo.total_user_count).toFixed(1)
189
- assessmentVo.details.forEach((detail) => {
190
- const rate = Math.round((detail.user_count * 100) / assessmentVo.total_user_count)
191
- assessmentVo[`star_${detail.score}_rate`] = rate
192
- if (rate) {
193
- scoreOver1P += (rate * assessmentVo.total_user_count * detail.score) / 100
194
- } else {
195
- lessThan1Count += detail.user_count
196
- }
197
- })
198
- let restRate = 100
199
- for (const key of Object.keys(assessmentVo)) {
200
- if (/^star_(\d)_rate$/.test(key)) {
201
- restRate -= assessmentVo[key]
202
- }
203
- }
204
- if (restRate * assessmentVo.total_user_count > 100) {
205
- let avarageScore
206
- if (lessThan1Count) {
207
- avarageScore = Math.round(Math.abs((totalScore - scoreOver1P)) / lessThan1Count / restRate)
208
- } else if (restRate) {
209
- avarageScore = Math.round(Math.abs(totalScore - scoreOver1P) / ((assessmentVo.total_user_count * restRate) / 100))
210
- }
211
- if (avarageScore) {
212
- // eslint-disable-next-line no-nested-ternary
213
- avarageScore = avarageScore > 5 ? 5 : avarageScore < 1 ? 1 : avarageScore
214
- assessmentVo[`star_${avarageScore}_rate`] += restRate
215
- }
216
- } else {
217
- let score = 5
218
- while (score) {
219
- if (assessmentVo[`star_${score}_rate`]) {
220
- assessmentVo[`star_${score}_rate`] += restRate
221
- break
222
- }
223
- score -= 1
224
- }
225
- }
226
- }
227
- if (assessmentVo.total_user_count > 100000) {
228
- assessmentVo.total_user_count = '10w+'
229
- } else if (assessmentVo.total_user_count > 10000) {
230
- assessmentVo.total_user_count = `${(assessmentVo.total_user_count / 10000).toFixed(1)}w`
231
- }
232
- return assessmentVo
233
- }
234
-
235
- /** 提交用户评价
236
- * @param assessmentId: 评价对象(课程id)
237
- * @param score: 评分
238
- * @param assessment_type: 评价对象资源类型(默认course,前后端暂时都没有用这个字段,建议传递资源类型字段x_course(课本),x_class_hour_activity(课程也就是课时),t_course(教师研修),t_course_pdf(教师研修下的Pdf资源),x_audio_video,x_url,x_image_list,x_document,x_article
239
- */
240
- export async function submitUserAssessmentRate(assessmentId, score, assessment_type = 'course') {
241
- const userInfo = await getUserInfo()
242
- if (!userInfo) {
243
- const loginUrl = getLoginUrl()
244
- await goToLoginPage(loginUrl)
245
- return
246
- }
247
- const cacheKey = assessmentRateCacheKey(assessmentId, userInfo.user_id)
248
- const url = `/assessments/${assessmentId}/user_assessments`
249
- let userAssessmentVo
250
- try {
251
- const { data } = await assessmentApi.post(url, {
252
- assessment_type,
253
- score
254
- }, {
255
- headers: {
256
- 'sdp-app-id': appid
257
- }
258
- })
259
- userAssessmentVo = data
260
- } catch (e) {
261
- userAssessmentVo = {
262
- assessment_type,
263
- user_id: userInfo.user_id,
264
- score
265
- }
266
- }
267
- userAssessmentVo.updateTime = Date.now()
268
- localStorage.setItem(cacheKey, JSON.stringify(userAssessmentVo))
269
- return userAssessmentVo
270
- }
1
+ import dayjs from 'dayjs'
2
+ // import SHA256 from 'crypto-js/sha256'
3
+ import { communityWithUC } from '@/config/request/community'
4
+ import { assessmentApi, assessmentApiCdn } from '@/config/request/assessments'
5
+ import { getLoginUrl, getUserInfo, goToLoginPage } from '@/util/auth/func'
6
+ import { assessmentRateCacheKey } from '@/config/constant/cacheKey'
7
+ import { tchStudioGatewayWithUC } from '@/config/request/teacher-studio-gateway'
8
+
9
+ import config from '@/config/env'
10
+ import { ApiTimestampKey } from '@/config/constant/common'
11
+ import { withOnce } from '@/util/hof'
12
+
13
+ const { appid } = config.app
14
+
15
+ function updateTimestamp(key = ApiTimestampKey.LAST_FAVOR_ACTION_TIMESTAMP) {
16
+ window.localStorage.setItem(key, new Date().getTime())
17
+ }
18
+ function getTimestamp(key = ApiTimestampKey.LAST_FAVOR_ACTION_TIMESTAMP) {
19
+ let time = window.localStorage.getItem(key)
20
+ if (!time) {
21
+ time = new Date().getTime()
22
+ window.localStorage.setItem(key, new Date().getTime())
23
+ }
24
+ return time
25
+ }
26
+
27
+ export async function getTeacherStudios(params) {
28
+ const url = '/v1/users/teacher_studios'
29
+ try {
30
+ const result = await tchStudioGatewayWithUC.get(url, {
31
+ params: {
32
+ $offset: params.page_no * params.page_size,
33
+ $limit: params.page_size,
34
+ $count: true,
35
+ _userId: params.userId,
36
+ _t: getTimestamp(ApiTimestampKey.LAST_TEACHERSTUDIO_ACTION_TIMESTAMP)
37
+ }
38
+ })
39
+ return result
40
+ } catch (e) {
41
+ updateTimestamp(ApiTimestampKey.LAST_TEACHERSTUDIO_ACTION_TIMESTAMP)
42
+ throw e
43
+ }
44
+ }
45
+
46
+ export async function getMyCourses(params) {
47
+ const url = '/user_study'
48
+ try {
49
+ const result = await communityWithUC.get(url, {
50
+ params: {
51
+ offset: params.page_no * params.page_size,
52
+ limit: params.page_size,
53
+ _userId: params.userId,
54
+ _t: getTimestamp(ApiTimestampKey.LAST_STUDY_ACTION_TIMESTAMP)
55
+ },
56
+ headers: {
57
+ 'sdp-app-id': appid
58
+ }
59
+ })
60
+ return result
61
+ } catch (e) {
62
+ updateTimestamp(ApiTimestampKey.LAST_STUDY_ACTION_TIMESTAMP)
63
+ throw e
64
+ }
65
+ }
66
+
67
+ /** 获取用户课程评价信息
68
+ * @param assessmentId: 评价对象(课程id)
69
+ * @param assessmentType: 评价对象资源类型(默认course,前后端暂时都没有用这个字段,建议传递资源类型字段x_course(课本),x_class_hour_activity(课程也就是课时),t_course(教师研修),t_course_pdf(教师研修下的Pdf资源),x_audio_video,x_url,x_image_list,x_document,x_article
70
+ * @return userAssessmentVo: {
71
+ "assessment_id": "string",
72
+ "assessment_type": "string",
73
+ "user_id": 0,
74
+ "score": 0
75
+ }
76
+ */
77
+ export async function getUserAssessmentRate(assessmentId, assessmentType = 'course') {
78
+ const userInfo = await getUserInfo()
79
+ const cacheKey = assessmentRateCacheKey(assessmentId, userInfo.user_id)
80
+ let userAssessmentVo = localStorage.getItem(cacheKey)
81
+ if (userAssessmentVo) {
82
+ try {
83
+ userAssessmentVo = JSON.parse(userAssessmentVo)
84
+ } catch (e) {
85
+ // parse error
86
+ }
87
+ }
88
+ if (!userAssessmentVo || !userAssessmentVo.assessment_id) {
89
+ const url = `/assessments/${assessmentId}/user_assessment?assessment_type=${assessmentType}`
90
+ const { data } = await assessmentApi.get(url, {
91
+ headers: {
92
+ 'sdp-app-id': appid
93
+ }
94
+ })
95
+ if (data?.score ?? '') {
96
+ userAssessmentVo = data
97
+ }
98
+ if (userAssessmentVo) {
99
+ localStorage.setItem(cacheKey, JSON.stringify(userAssessmentVo))
100
+ }
101
+ }
102
+ return userAssessmentVo
103
+ }
104
+
105
+ /** 获取课程评价
106
+ * @param assessmentId: 评价对象(课程id)
107
+ * @param assessment_type: 评价对象资源类型(默认course,前后端暂时都没有用这个字段,建议传递资源类型字段x_course(课本),x_class_hour_activity(课程也就是课时),t_course(教师研修),t_course_pdf(教师研修下的Pdf资源),x_audio_video,x_url,x_image_list,x_document,x_article
108
+ * @return assessmentVo: {
109
+ "assessment_id": "string",
110
+ "assessment_type": "string",
111
+ "total_user_count": "number",
112
+ "score": 0,
113
+ "star_1_rate": 0,
114
+ "star_2_rate": 0,
115
+ "star_3_rate": 0,
116
+ "star_4_rate": 0,
117
+ "star_5_rate": 0,
118
+ "details": [
119
+ {
120
+ "user_count": 0,
121
+ "score": 0
122
+ }
123
+ ]
124
+ }
125
+ */
126
+ const getUserInfoOnce = withOnce(getUserInfo)
127
+
128
+ export async function getAssessmentRate(
129
+ assessmentId,
130
+ assessmentType = 'course'
131
+ ) {
132
+ const userInfo = await getUserInfoOnce()
133
+ let userAssessmentVo
134
+ if (userInfo) {
135
+ const cacheKey = assessmentRateCacheKey(assessmentId, userInfo.user_id)
136
+ try {
137
+ userAssessmentVo = JSON.parse(localStorage.getItem(cacheKey))
138
+ } catch (e) {
139
+ //
140
+ }
141
+ if (userAssessmentVo && !userAssessmentVo.assessment_id && userAssessmentVo.score) {
142
+ submitUserAssessmentRate(assessmentId, userAssessmentVo.score, assessmentType)
143
+ }
144
+ }
145
+ let lastModified
146
+ let assessmentVo
147
+ try {
148
+ const { data, headers: { 'last-modified': _lastModified } } = await assessmentApiCdn.get(`/assessments/${assessmentId}?assessment_type=${assessmentType}`)
149
+ assessmentVo = data
150
+ lastModified = dayjs(_lastModified).valueOf()
151
+ } catch (e) {
152
+ //
153
+ }
154
+ if (!assessmentVo?.details?.length) {
155
+ assessmentVo = {
156
+ assessment_id: assessmentId,
157
+ assessment_type: assessmentType,
158
+ details: [{
159
+ user_count: 0,
160
+ score: 1
161
+ }, {
162
+ user_count: 0,
163
+ score: 2
164
+ }, {
165
+ user_count: 0,
166
+ score: 3
167
+ }, {
168
+ user_count: 0,
169
+ score: 4
170
+ }, {
171
+ user_count: 0,
172
+ score: 5
173
+ }]
174
+ }
175
+ }
176
+ if (userAssessmentVo?.updateTime > lastModified) {
177
+ assessmentVo.details.forEach((detail) => {
178
+ if (detail.score === userAssessmentVo.score) {
179
+ detail.user_count += 1
180
+ }
181
+ })
182
+ }
183
+ assessmentVo.total_user_count = assessmentVo.details?.reduce((prev, next) => prev + next.user_count, 0)
184
+ if (assessmentVo.total_user_count) {
185
+ let lessThan1Count = 0
186
+ let scoreOver1P = 0
187
+ const totalScore = assessmentVo.details.reduce((prev, next) => prev + next.user_count * next.score, 0)
188
+ assessmentVo.score = (totalScore / assessmentVo.total_user_count).toFixed(1)
189
+ assessmentVo.details.forEach((detail) => {
190
+ const rate = Math.round((detail.user_count * 100) / assessmentVo.total_user_count)
191
+ assessmentVo[`star_${detail.score}_rate`] = rate
192
+ if (rate) {
193
+ scoreOver1P += (rate * assessmentVo.total_user_count * detail.score) / 100
194
+ } else {
195
+ lessThan1Count += detail.user_count
196
+ }
197
+ })
198
+ let restRate = 100
199
+ for (const key of Object.keys(assessmentVo)) {
200
+ if (/^star_(\d)_rate$/.test(key)) {
201
+ restRate -= assessmentVo[key]
202
+ }
203
+ }
204
+ if (restRate * assessmentVo.total_user_count > 100) {
205
+ let avarageScore
206
+ if (lessThan1Count) {
207
+ avarageScore = Math.round(Math.abs((totalScore - scoreOver1P)) / lessThan1Count / restRate)
208
+ } else if (restRate) {
209
+ avarageScore = Math.round(Math.abs(totalScore - scoreOver1P) / ((assessmentVo.total_user_count * restRate) / 100))
210
+ }
211
+ if (avarageScore) {
212
+ // eslint-disable-next-line no-nested-ternary
213
+ avarageScore = avarageScore > 5 ? 5 : avarageScore < 1 ? 1 : avarageScore
214
+ assessmentVo[`star_${avarageScore}_rate`] += restRate
215
+ }
216
+ } else {
217
+ let score = 5
218
+ while (score) {
219
+ if (assessmentVo[`star_${score}_rate`]) {
220
+ assessmentVo[`star_${score}_rate`] += restRate
221
+ break
222
+ }
223
+ score -= 1
224
+ }
225
+ }
226
+ }
227
+ if (assessmentVo.total_user_count > 100000) {
228
+ assessmentVo.total_user_count = '10w+'
229
+ } else if (assessmentVo.total_user_count > 10000) {
230
+ assessmentVo.total_user_count = `${(assessmentVo.total_user_count / 10000).toFixed(1)}w`
231
+ }
232
+ return assessmentVo
233
+ }
234
+
235
+ /** 提交用户评价
236
+ * @param assessmentId: 评价对象(课程id)
237
+ * @param score: 评分
238
+ * @param assessment_type: 评价对象资源类型(默认course,前后端暂时都没有用这个字段,建议传递资源类型字段x_course(课本),x_class_hour_activity(课程也就是课时),t_course(教师研修),t_course_pdf(教师研修下的Pdf资源),x_audio_video,x_url,x_image_list,x_document,x_article
239
+ */
240
+ export async function submitUserAssessmentRate(assessmentId, score, assessment_type = 'course') {
241
+ const userInfo = await getUserInfo()
242
+ if (!userInfo) {
243
+ const loginUrl = getLoginUrl()
244
+ await goToLoginPage(loginUrl)
245
+ return
246
+ }
247
+ const cacheKey = assessmentRateCacheKey(assessmentId, userInfo.user_id)
248
+ const url = `/assessments/${assessmentId}/user_assessments`
249
+ let userAssessmentVo
250
+ try {
251
+ const { data } = await assessmentApi.post(url, {
252
+ assessment_type,
253
+ score
254
+ }, {
255
+ headers: {
256
+ 'sdp-app-id': appid
257
+ }
258
+ })
259
+ userAssessmentVo = data
260
+ } catch (e) {
261
+ userAssessmentVo = {
262
+ assessment_type,
263
+ user_id: userInfo.user_id,
264
+ score
265
+ }
266
+ }
267
+ userAssessmentVo.updateTime = Date.now()
268
+ localStorage.setItem(cacheKey, JSON.stringify(userAssessmentVo))
269
+ return userAssessmentVo
270
+ }
@@ -1,31 +1,31 @@
1
- import {
2
- getCdnAPI
3
- } from '@/config/request/cdn'
4
- import config from '@/config/env'
5
- import { getNDRTestQuery } from '@/util/url'
6
-
7
- const xCloudServiceName = config.api.serviceName['x-course']
8
-
9
- const cdnAPI = getCdnAPI()
10
-
11
- const isTest = getNDRTestQuery()
12
- /**
13
- * 获取精品课详情
14
- * https://pretest-s-file-2.ykt.cbern.com.cn/zxx/ndrs/resources/8ae7e495-7cde-81e8-017c-e4c7bf0f01ca.json
15
- * @param {*} contentId 课程id
16
- */
17
- export async function fetchQualityCourse(courseId) {
18
- const requestURL = isTest
19
- ? `https://bdcs-file-2.ykt.cbern.com.cn/zxx_secondary/ndrv2/resources/${courseId}.json`
20
- : `/${xCloudServiceName}/ndrv2/resources/${courseId}.json`
21
- const { data } = await cdnAPI.get(requestURL)
22
- return data
23
- }
24
-
25
- export async function fetchNationalCourse(courseId) {
26
- const requestURL = isTest
27
- ? `https://bdcs-file-2.ykt.cbern.com.cn/zxx_secondary/ndrs/resources/${courseId}/relation/national_lesson.json`
28
- : `/${xCloudServiceName}/ndrs/resources/${courseId}/relation/national_lesson.json`
29
- const { data } = await cdnAPI.get(requestURL)
30
- return data
31
- }
1
+ import {
2
+ getCdnAPI
3
+ } from '@/config/request/cdn'
4
+ import config from '@/config/env'
5
+ import { getNDRTestQuery } from '@/util/url'
6
+
7
+ const xCloudServiceName = config.api.serviceName['x-course']
8
+
9
+ const cdnAPI = getCdnAPI()
10
+
11
+ const isTest = getNDRTestQuery()
12
+ /**
13
+ * 获取精品课详情
14
+ * https://pretest-s-file-2.ykt.cbern.com.cn/zxx/ndrs/resources/8ae7e495-7cde-81e8-017c-e4c7bf0f01ca.json
15
+ * @param {*} contentId 课程id
16
+ */
17
+ export async function fetchQualityCourse(courseId) {
18
+ const requestURL = isTest
19
+ ? `https://bdcs-file-2.ykt.cbern.com.cn/zxx_secondary/ndrv2/resources/${courseId}.json`
20
+ : `/${xCloudServiceName}/ndrv2/resources/${courseId}.json`
21
+ const { data } = await cdnAPI.get(requestURL)
22
+ return data
23
+ }
24
+
25
+ export async function fetchNationalCourse(courseId) {
26
+ const requestURL = isTest
27
+ ? `https://bdcs-file-2.ykt.cbern.com.cn/zxx_secondary/ndrs/resources/${courseId}/relation/national_lesson.json`
28
+ : `/${xCloudServiceName}/ndrs/resources/${courseId}/relation/national_lesson.json`
29
+ const { data } = await cdnAPI.get(requestURL)
30
+ return data
31
+ }