index.tsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  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. const result = content.value ? JSON.parse(content.value) : {}
  96. console.log('🚀 ~ listenerMessage ~ result', result, props.data.questionId)
  97. if (result.questionId === props.data.id) {
  98. const tempScore = result.score || 0
  99. // 跟上一次分数对比
  100. if (state.score < tempScore) {
  101. state.score = result.score || 0
  102. }
  103. }
  104. emit('update:value', [
  105. {
  106. answerId: '',
  107. answer: state.score,
  108. answerExtra: ''
  109. }
  110. ])
  111. // 置空,存的缓存
  112. promisefiyPostMessage({
  113. api: 'setCache',
  114. content: {
  115. key: 'h5-orchestra-unit',
  116. value: ''
  117. }
  118. })
  119. }
  120. // 关闭页面监听
  121. removeListenerMessage('webViewOnResume', () => {
  122. //
  123. })
  124. }
  125. )
  126. })
  127. }
  128. return () => (
  129. <>
  130. <div class={styles.unitSubject}>
  131. {/* 标题 */}
  132. <AnserTitle
  133. index={props.index}
  134. name={props.data.name}
  135. score={props.data.totalScore}
  136. showRate={props.showRate}
  137. answerType={QuestionType.PLAY}
  138. extra={{
  139. questionDetail: props.data.questionDetail,
  140. mediaUrls: '',
  141. rightRate: props.data.rightRate
  142. }}
  143. />
  144. <div class={[styles.unitAnswers]}>
  145. {questionExtendsInfo.value && (
  146. <Cell
  147. class={styles.playSection}
  148. center
  149. titleClass={['van-ellipsis', styles.playTitle]}
  150. >
  151. {{
  152. icon: () => <Image class={styles.img} src={iconSong} />,
  153. title: () => <>{questionExtendsInfo.value.musicName}</>,
  154. value: () => (
  155. <Button
  156. round
  157. class={styles.playBtn}
  158. type="primary"
  159. onClick={onEvaluation}
  160. disabled={props.readOnly}
  161. >
  162. 点击评测
  163. <Icon name="play" />
  164. </Button>
  165. )
  166. }}
  167. </Cell>
  168. )}
  169. {!props.readOnly && (
  170. <div class={['van-hairline--top', styles.unitScoreNum]}>
  171. <div class={styles.score}>{state.score}</div>
  172. <div class={styles.scoreTitle}>评测分数</div>
  173. <div class={styles.scoreTips}>多次评测取完整评测的最高分数</div>
  174. </div>
  175. )}
  176. </div>
  177. </div>
  178. {props.showAnalysis && (
  179. <div class={styles.unitSubject}>
  180. <AnswerAnalysis
  181. answerAnalysis={props.analysis.message}
  182. topic={props.analysis.topic}
  183. userResult={props.analysis.userResult}
  184. />
  185. </div>
  186. )}
  187. </>
  188. )
  189. }
  190. })