index.tsx 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. import { Tag, Image, Button, Cell, Icon } from 'vant'
  2. import { computed, defineComponent, nextTick, onMounted, PropType, reactive } from 'vue'
  3. import styles from './index.module.less'
  4. import {
  5. listenerMessage,
  6. postMessage,
  7. promisefiyPostMessage,
  8. removeListenerMessage
  9. } from '@/helpers/native-message'
  10. import deepClone from '@/helpers/deep-clone'
  11. import iconSong from '../../images/icon-song.png'
  12. import AnserTitle from '../anser-title'
  13. import { QuestionType } from '../../unit'
  14. import AnswerAnalysis from '../answer-analysis'
  15. import { browser } from '@/helpers/utils'
  16. // 单选和多选题
  17. export default defineComponent({
  18. name: 'choice-question',
  19. props: {
  20. value: {
  21. type: Array,
  22. default: () => []
  23. },
  24. index: {
  25. // 题目是第几道
  26. type: Number,
  27. default: 1
  28. },
  29. data: {
  30. type: Object,
  31. default: () => ({})
  32. },
  33. // 测试编号
  34. unitId: {
  35. type: String,
  36. default: ''
  37. },
  38. /* 只读 */
  39. readOnly: {
  40. type: Boolean,
  41. default: false
  42. },
  43. showRate: {
  44. type: Boolean,
  45. default: false
  46. },
  47. showAnalysis: {
  48. // 是否显示解析
  49. type: Boolean,
  50. default: false
  51. },
  52. analysis: {
  53. type: Object,
  54. default: () => ({
  55. message: '',
  56. topic: false, // 是否显示结果
  57. userResult: true // 用户答题对错
  58. })
  59. }
  60. },
  61. emits: ['update:value'],
  62. setup(props, { emit }) {
  63. console.log(props)
  64. const state = reactive({
  65. list: [] as any,
  66. score: 0
  67. })
  68. // const mediaUrls = computed(() => (props.data.mediaUrls ? props.data.mediaUrls.split(',') : ''))
  69. const questionExtendsInfo = computed(() =>
  70. props.data.questionExtendsInfo ? JSON.parse(props.data.questionExtendsInfo) : ''
  71. )
  72. /**
  73. * @description 进行评测
  74. */
  75. const onEvaluation = () => {
  76. const info = questionExtendsInfo.value
  77. if (!info) return
  78. console.log(props.unitId)
  79. postMessage({
  80. api: 'openAccompanyWebView',
  81. content: {
  82. // url: `https://ponline.colexiu.com/orchestra-music-score/?id=${info.musicSheetId}&modelType=evaluation&unitId=${props.unitId}&questionId=${props.data.id}`,
  83. url: `${location.origin}/orchestra-music-score/?id=${info.musicSheetId}&modelType=evaluation&unitId=${props.unitId}&questionId=${props.data.id}`,
  84. orientation: 0,
  85. isHideTitle: true,
  86. statusBarTextColor: false,
  87. isOpenLight: true
  88. }
  89. })
  90. // 打开页面监听
  91. listenerMessage('webViewOnResume', () => {
  92. if (browser().android) {
  93. const instance: any =
  94. (window as any).ORCHESTRA || (window as any).webkit?.messageHandlers?.ORCHESTRA
  95. console.log(instance, '-------------')
  96. const result = instance.getCache2('h5-orchestra-unit')
  97. console.log('🚀 ~ listenerMessage ~ result', result)
  98. const tempResult = result ? JSON.parse(result) : {}
  99. if (tempResult.questionId === props.data.id) {
  100. const tempScore = tempResult.score || 0
  101. // 跟上一次分数对比
  102. if (state.score < tempScore) {
  103. state.score = tempResult.score || 0
  104. }
  105. // 置空,存的缓存
  106. promisefiyPostMessage({
  107. api: 'setCache',
  108. content: {
  109. key: 'h5-orchestra-unit',
  110. value: ''
  111. }
  112. })
  113. }
  114. emit('update:value', [
  115. {
  116. answerId: '',
  117. answer: state.score,
  118. answerExtra: ''
  119. }
  120. ])
  121. // 关闭页面监听
  122. removeListenerMessage('webViewOnResume', () => {
  123. //
  124. })
  125. } else {
  126. promisefiyPostMessage({ api: 'getCache', content: { key: 'h5-orchestra-unit' } }).then(
  127. (res: any) => {
  128. const content = res.content
  129. if (content.value) {
  130. console.log(
  131. '🚀 ~ listenerMessage ~ content.value',
  132. content.value,
  133. '---------------'
  134. )
  135. const result = content.value ? JSON.parse(content.value) : {}
  136. console.log('🚀 ~ listenerMessage ~ result', result, props.data.questionId)
  137. if (result.questionId === props.data.id) {
  138. const tempScore = result.score || 0
  139. // 跟上一次分数对比
  140. if (state.score < tempScore) {
  141. state.score = result.score || 0
  142. }
  143. }
  144. emit('update:value', [
  145. {
  146. answerId: '',
  147. answer: state.score,
  148. answerExtra: ''
  149. }
  150. ])
  151. // 置空,存的缓存
  152. promisefiyPostMessage({
  153. api: 'setCache',
  154. content: {
  155. key: 'h5-orchestra-unit',
  156. value: ''
  157. }
  158. })
  159. }
  160. // 关闭页面监听
  161. removeListenerMessage('webViewOnResume', () => {
  162. //
  163. })
  164. }
  165. )
  166. }
  167. })
  168. }
  169. return () => (
  170. <>
  171. <div class={styles.unitSubject}>
  172. {/* 标题 */}
  173. <AnserTitle
  174. index={props.index}
  175. name={props.data.name}
  176. score={props.data.totalScore}
  177. showRate={props.showRate}
  178. answerType={QuestionType.PLAY}
  179. extra={{
  180. questionDetail: props.data.questionDetail,
  181. mediaUrls: '',
  182. rightRate: props.data.rightRate
  183. }}
  184. />
  185. <div class={[styles.unitAnswers]}>
  186. {questionExtendsInfo.value && (
  187. <Cell
  188. class={styles.playSection}
  189. center
  190. titleClass={['van-ellipsis', styles.playTitle]}
  191. >
  192. {{
  193. icon: () => <Image class={styles.img} src={iconSong} />,
  194. title: () => <>{questionExtendsInfo.value.musicName}</>,
  195. value: () => (
  196. <Button
  197. round
  198. class={styles.playBtn}
  199. type="primary"
  200. onClick={onEvaluation}
  201. disabled={props.readOnly}
  202. >
  203. 点击评测
  204. <Icon name="play" />
  205. </Button>
  206. )
  207. }}
  208. </Cell>
  209. )}
  210. {!props.readOnly && (
  211. <div class={['van-hairline--top', styles.unitScoreNum]}>
  212. <div class={styles.score}>{state.score}</div>
  213. <div class={styles.scoreTitle}>评测分数</div>
  214. <div class={styles.scoreTips}>多次评测取完整评测的最高分数</div>
  215. </div>
  216. )}
  217. </div>
  218. </div>
  219. {props.showAnalysis && (
  220. <div class={styles.unitSubject}>
  221. <AnswerAnalysis
  222. answerAnalysis={props.analysis.message}
  223. topic={props.analysis.topic}
  224. userResult={props.analysis.userResult}
  225. />
  226. </div>
  227. )}
  228. </>
  229. )
  230. }
  231. })