PreviewMixin.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import SerialNumberPosition from './SerialNumberPosition.vue';
  2. import DOMPurify from 'dompurify';
  3. import { GetCoursewareComponentContent_View } from '@/api/book';
  4. import { isEnable } from '@/views/book/courseware/data/common';
  5. const mixin = {
  6. data() {
  7. return {
  8. answer: { answer_list: [] }, // 答案
  9. isJudgingRightWrong: false, // 是否判断对错
  10. isShowRightAnswer: false, // 是否显示正确答案
  11. disabled: false, // 是否禁用
  12. isEnable,
  13. loader: false,
  14. };
  15. },
  16. props: {
  17. id: {
  18. type: String,
  19. required: true,
  20. },
  21. coursewareId: {
  22. type: String,
  23. required: true,
  24. },
  25. },
  26. components: {
  27. SerialNumberPosition,
  28. },
  29. created() {
  30. this.getCoursewareComponentContent_View();
  31. },
  32. methods: {
  33. getCoursewareComponentContent_View() {
  34. GetCoursewareComponentContent_View({ courseware_id: this.coursewareId, component_id: this.id }).then(
  35. ({ content }) => {
  36. if (content) this.data = JSON.parse(content);
  37. this.loader = true;
  38. },
  39. );
  40. },
  41. /**
  42. * 获取答案
  43. * @returns {array} 答案
  44. */
  45. getAnswer() {
  46. return this.answer;
  47. },
  48. /**
  49. * 显示答案
  50. * @param {boolean} isJudgingRightWrong 是否判断对错
  51. * @param {boolean} isShowRightAnswer 是否显示正确答案
  52. * @param {object} userAnswer 用户答案
  53. * @param {boolean} disabled 是否禁用
  54. */
  55. showAnswer(isJudgingRightWrong, isShowRightAnswer, userAnswer, disabled) {
  56. if (this.loader === false) {
  57. return setTimeout(() => this.showAnswer(isJudgingRightWrong, isShowRightAnswer, userAnswer, disabled), 100);
  58. }
  59. this.isJudgingRightWrong = isJudgingRightWrong;
  60. this.isShowRightAnswer = isShowRightAnswer;
  61. this.disabled = disabled;
  62. if (userAnswer) this.answer = userAnswer;
  63. },
  64. /**
  65. * 得到序号外部样式
  66. */
  67. getAreaStyle() {
  68. if (!isEnable(this.data.property.sn_display_mode)) {
  69. return {
  70. grid: `"main" / 1fr`,
  71. };
  72. }
  73. const position = this.data.property.sn_position;
  74. let grid = '';
  75. if (position.includes('right')) {
  76. grid = `"main position" / 1fr auto`;
  77. } else if (position.includes('left')) {
  78. grid = `"position main" / auto 1fr`;
  79. } else if (position.includes('top')) {
  80. grid = `"position" auto "main" 1fr`;
  81. } else if (position.includes('bottom')) {
  82. grid = `"main" 1fr "position" auto`;
  83. }
  84. return {
  85. grid,
  86. };
  87. },
  88. /**
  89. * 过滤 html,防止 xss 攻击
  90. * @param {string} html 需要过滤的html
  91. * @returns {string} 过滤后的html
  92. */
  93. sanitizeHTML(html) {
  94. return DOMPurify.sanitize(html);
  95. },
  96. },
  97. };
  98. export default mixin;