Mark.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <template>
  2. <div class="my-container" @dblclick="saveTaskToServer">
  3. <mark-header />
  4. <div class="flex gap-1">
  5. <mark-history />
  6. <mark-body />
  7. </div>
  8. </div>
  9. </template>
  10. <script lang="ts">
  11. import { defineComponent, onMounted, onUnmounted, watch } from "vue";
  12. import {
  13. clearMarkTask,
  14. getGroup,
  15. getSetting,
  16. getStatus,
  17. getTask,
  18. saveTask,
  19. updateUISetting,
  20. } from "@/api/markPage";
  21. import { store } from "./store";
  22. import MarkHeader from "./MarkHeader.vue";
  23. import MarkBody from "./MarkBody.vue";
  24. import { useTimers } from "@/setups/useTimers";
  25. import MarkHistory from "./MarkHistory.vue";
  26. export default defineComponent({
  27. name: "Mark",
  28. components: {
  29. MarkHeader,
  30. MarkBody,
  31. MarkHistory,
  32. },
  33. setup: () => {
  34. const { addInterval } = useTimers();
  35. async function updateMarkTask() {
  36. const settingRes = await clearMarkTask();
  37. }
  38. async function updateSetting() {
  39. const settingRes = await getSetting();
  40. settingRes.data.uiSetting["answer.paper.scale"] ||= 1;
  41. store.setting = settingRes.data;
  42. }
  43. async function updateStatus() {
  44. const res = await getStatus();
  45. store.status = res.data;
  46. }
  47. async function updateGroups() {
  48. const res = await getGroup();
  49. store.groups = res.data;
  50. }
  51. async function updateTask() {
  52. const res = await getTask();
  53. if (res.data.libraryId) {
  54. store.tasks.push(res.data);
  55. store.currentTask = store.tasks[0];
  56. }
  57. }
  58. // 5秒更新一次tasks
  59. addInterval(() => {
  60. // console.log("get task", store.tasks);
  61. if (store.tasks.length < 3) {
  62. updateTask();
  63. }
  64. }, 5 * 1000);
  65. addInterval(() => {
  66. updateStatus();
  67. }, 30 * 1000);
  68. onMounted(async () => {
  69. await updateMarkTask();
  70. updateSetting();
  71. updateStatus();
  72. updateGroups();
  73. updateTask();
  74. });
  75. watch(
  76. () => store.setting.uiSetting,
  77. () => {
  78. updateUISetting(undefined, store.setting.uiSetting);
  79. },
  80. { deep: true }
  81. );
  82. const saveTaskToServer = async () => {
  83. console.log("save task to server");
  84. const res = (await saveTask()) as any;
  85. updateStatus();
  86. if (res.data.success && store.currentTask) {
  87. let { libraryId, studentId } = store.currentTask;
  88. const i = store.markResults.findIndex(
  89. (s) => s.libraryId === libraryId && s.studentId === studentId
  90. );
  91. store.markResults.splice(i, 1);
  92. store.currentTask = undefined;
  93. store.tasks.shift();
  94. } else {
  95. console.log(res.data.message);
  96. }
  97. };
  98. function scoreKeyInput(event: KeyboardEvent) {
  99. console.log(event);
  100. }
  101. onMounted(() => {
  102. document.addEventListener("keypress", scoreKeyInput);
  103. });
  104. onUnmounted(() => {
  105. document.removeEventListener("keypress", scoreKeyInput);
  106. });
  107. return { store, saveTaskToServer, scoreKeyInput };
  108. },
  109. });
  110. </script>
  111. <style scoped>
  112. .my-container {
  113. width: 100%;
  114. }
  115. a {
  116. color: #42b983;
  117. }
  118. label {
  119. margin: 0 0.5em;
  120. font-weight: bold;
  121. }
  122. code {
  123. background-color: #eee;
  124. padding: 2px 4px;
  125. border-radius: 4px;
  126. color: #304455;
  127. }
  128. </style>