index.tsx 5.8 KB

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