pinPage.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <template>
  2. <view class="words-pin-box">
  3. <!-- 单词区 -->
  4. <!-- <selectWordsVue :active-words="activeWords" :activeWord="activeWord"></selectWordsVue> -->
  5. <!-- 显示区 -->
  6. <selectTypesVue activeSelect="2"></selectTypesVue>
  7. <!-- 拼读区 单词字母多余6个需要追加 class:pin-small-words-box 大哥看这里-->
  8. <view class="pin-words-box" :class="{isAll: data.isAll, 'pin-right-words-box': data.isAll && data.result, 'pin-error-words-box': data.isAll && !data.result}">
  9. <view class="words-item" v-for="item in data.selectList">{{item}}</view>
  10. </view>
  11. <view class="pin-body-box">
  12. <!-- 清空按钮和提示需要写个切换 大哥看这里 -->
  13. <!-- 清空按钮 -->
  14. <view class="clean-btn"></view>
  15. <!-- 提示 -->
  16. <view class="pin-tip">提示:请点击页面下方单词,选择正确答案。</view>
  17. <!-- 解释区 需要分成多行 大哥看这里-->
  18. <view class="pin-words-explain-box">
  19. <view class="words-explain-item">{{activeWord.jianyi.join(';')}}</view>
  20. </view>
  21. <!-- 播放和待播放需要写个切换 大哥看这里 -->
  22. <!-- 待播放 -->
  23. <view class="audio-play-btn"></view>
  24. <!-- 播放中 -->
  25. <view class="audio-playing-btn" v-if="false"></view>
  26. </view>
  27. <!-- 图片区 -->
  28. <!-- <view @click="handleReset">
  29. {{data.result ? '正确': '错误'}}
  30. </view> -->
  31. <!-- 选择区 单词字母多余6个需要追加 class:pin-small-words-box 大哥看这里-->
  32. <view class="pin-words-box pin-words-change-box">
  33. <view class="words-item words-change-item" v-for="item in data.randomList" :class="{disabled: isSelect(item)}" @click="handleSelect(item)">{{item}}</view>
  34. </view>
  35. </view>
  36. </template>
  37. <script setup>
  38. import selectWordsVue from './selectWords.vue';
  39. import selectTypesVue from './selectTypes.vue';
  40. import {
  41. reactive,
  42. computed
  43. } from 'vue';
  44. import {onLoad} from "@dcloudio/uni-app"
  45. import * as httpApi from "@/api/word.js"
  46. import {
  47. getUserIdentity,
  48. } from "@/utils/common.js"
  49. const userCode = getUserIdentity();
  50. const props = defineProps({
  51. activeWord: {
  52. type: Object,
  53. },
  54. activeWords: {
  55. type: Array
  56. },
  57. })
  58. const data = reactive({
  59. list: [],
  60. randomList: [],
  61. selectList: [],
  62. result: false, // 正确性
  63. isAll: false, // 是否全答
  64. })
  65. onLoad(() => {
  66. initItem()
  67. })
  68. setTimeout(() => {
  69. console.log('activeWord', props.activeWord)
  70. })
  71. function isSelect(item) {
  72. return data.selectList.some(ite => ite == item)
  73. }
  74. function handleReset() {
  75. data.list.forEach((item, index) => {
  76. data.selectList[index] = ''
  77. })
  78. data.result = false;
  79. data.isAll = false;
  80. }
  81. function shuffleArray(array) {
  82. for (let i = array.length - 1; i > 0; i--) {
  83. const j = Math.floor(Math.random() * (i + 1));
  84. [array[i], array[j]] = [array[j], array[i]]; // ES6解构赋值交换元素
  85. }
  86. return array;
  87. }
  88. function randomClone(arr) {
  89. const clone = [...arr];
  90. return shuffleArray(clone); // 复用方法一的洗牌算法
  91. }
  92. // 初始化 单词列表
  93. function initItem() {
  94. data.list = props.activeWord.chaifen;
  95. data.randomList = randomClone(data.list);
  96. data.list.forEach((item, index) => {
  97. data.selectList[index] = ''
  98. })
  99. }
  100. function handleSelect(word) {
  101. if (data.selectList.some(item => item == '') != -1) {
  102. data.isAll = true;
  103. } else {
  104. data.isAll = false;
  105. }
  106. // 点击触发取消
  107. /*if (data.selectList.find(item => item == word)) {
  108. data.selectList[data.selectList.findIndex(item => item == word)] = '';
  109. // 校验正确性
  110. checkIsRight();
  111. return;
  112. }*/
  113. // 覆盖状态
  114. let status = false;
  115. data.selectList.forEach((item, index) => {
  116. // 无值 无修改
  117. if (!item && !status) {
  118. // 第一项空值覆盖
  119. data.selectList[index] = word;
  120. // 以有控制覆盖
  121. status = true;
  122. }
  123. })
  124. // 校验正确性
  125. checkIsRight();
  126. }
  127. function checkIsRight() {
  128. if (data.list.join('') === data.selectList.join('')) {
  129. // 正确
  130. data.result = true;
  131. noticeBackDb();
  132. } else {
  133. data.result = false;
  134. }
  135. }
  136. function noticeBackDb() {
  137. if (userCode == 'Visitor') {
  138. // 游客不更新后台
  139. return;
  140. }
  141. httpApi.getWordZhangwo({
  142. type: 1,
  143. wordId: props.activeWord.id
  144. })
  145. }
  146. </script>
  147. <style lang="scss" scoped>
  148. </style>