MarkHeader.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <template>
  2. <div
  3. class="tw-flex tw-gap-4 tw-justify-start tw-items-center header-container"
  4. v-if="store.setting"
  5. >
  6. <div
  7. v-if="!isSingleStudent"
  8. class="tw-flex tw-place-content-center tw-cursor-pointer tw-relative menu"
  9. :class="[store.historyOpen && 'menu-toggled']"
  10. @click="store.toggleHistory"
  11. >
  12. <span title="回看" class="tw-inline-flex tw-place-content-center">
  13. <img
  14. src="../../mark/images/left-menu.svg"
  15. :class="[store.historyOpen && 'svg-red']"
  16. />
  17. </span>
  18. <div v-if="store.historyOpen" class="triangle"></div>
  19. </div>
  20. <div
  21. class="
  22. tw-text-white
  23. tw-block
  24. tw-overflow-ellipsis
  25. tw-overflow-hidden
  26. tw-whitespace-nowrap
  27. header-big-text
  28. tw-ml-4
  29. "
  30. >
  31. {{
  32. `${store.setting.subject?.code ?? ""}-${
  33. store.setting.subject?.name ?? ""
  34. }`
  35. }}
  36. </div>
  37. <div class="tw-flex tw-gap-1">
  38. <div>
  39. <span class="header-small-text">编号</span>
  40. <span class="highlight-text">
  41. {{ store.currentTask?.secretNumber ?? "-" }}
  42. </span>
  43. </div>
  44. </div>
  45. <div
  46. v-if="!isSingleStudent"
  47. class="tw-flex tw-gap-2 tw-items-center tw-flex-1"
  48. >
  49. <span>
  50. <span class="header-small-text">待复核</span
  51. ><span class="highlight-text">{{
  52. store.status.totalCount ?? "-"
  53. }}</span>
  54. </span>
  55. </div>
  56. <ZoomPaper v-if="store.isScanImage" :store="store" />
  57. <div class="tw-flex tw-place-items-center tw-justify-end tw-ml-auto">
  58. {{ store.setting.userName }}
  59. </div>
  60. <div
  61. class="tw-flex tw-place-items-center tw-cursor-pointer"
  62. @click="closeWindow"
  63. >
  64. <PoweroffOutlined class="icon-font icon-with-text" />关闭
  65. </div>
  66. <div
  67. class="
  68. tw-flex tw-place-content-center tw-cursor-pointer tw-justify-self-end
  69. menu
  70. "
  71. :class="[
  72. !store.setting.uiSetting['score.board.collapse'] &&
  73. store.currentTask &&
  74. 'menu-toggled',
  75. ]"
  76. @click="store.toggleScoreBoard"
  77. >
  78. <span
  79. title="给分板"
  80. class="tw-inline-flex tw-place-content-center tw-relative"
  81. >
  82. <img
  83. src="../../mark/images/right-menu.svg"
  84. :class="[
  85. !store.setting.uiSetting['score.board.collapse'] && 'svg-red',
  86. ]"
  87. />
  88. </span>
  89. <div
  90. v-if="
  91. !store.setting.uiSetting['score.board.collapse'] && store.currentTask
  92. "
  93. class="triangle"
  94. ></div>
  95. </div>
  96. </div>
  97. </template>
  98. <script setup lang="ts">
  99. import { onMounted } from "vue";
  100. import { store } from "@/store/store";
  101. import { PoweroffOutlined } from "@ant-design/icons-vue";
  102. import { useRoute } from "vue-router";
  103. import { clearInspectedTask } from "@/api/libraryInspectPage";
  104. import ZoomPaper from "@/components/ZoomPaper.vue";
  105. const route = useRoute();
  106. let isSingleStudent = $ref(false);
  107. isSingleStudent = !!route.query.studentId;
  108. const { subjectCode, groupNumber } = route.query as {
  109. subjectCode: string;
  110. groupNumber: string;
  111. };
  112. async function updateClearTask() {
  113. await clearInspectedTask(subjectCode, groupNumber);
  114. }
  115. const closeWindow = async () => {
  116. await updateClearTask();
  117. window.close();
  118. };
  119. onMounted(() => {
  120. // 不确定是否一定能在关闭页面时调用
  121. window.addEventListener("beforeunload", () => {
  122. updateClearTask();
  123. });
  124. });
  125. </script>
  126. <style scoped>
  127. .header-container {
  128. position: relative;
  129. height: 56px;
  130. line-height: 16px;
  131. background-color: var(--header-bg-color);
  132. color: rgba(255, 255, 255, 0.5);
  133. }
  134. .menu {
  135. width: 56px;
  136. height: 56px;
  137. padding: 20px;
  138. }
  139. .menu:hover,
  140. .menu-toggled {
  141. background-color: rgba(255, 255, 255, 0.2);
  142. }
  143. .header-container span {
  144. vertical-align: middle;
  145. }
  146. .header-big-text {
  147. font-size: 20px;
  148. line-height: 30px;
  149. }
  150. .header-small-text {
  151. font-size: var(--app-secondary-font-size);
  152. }
  153. .highlight-text {
  154. color: white;
  155. font-size: var(--app-title-font-size);
  156. }
  157. .svg-red {
  158. filter: invert(27%) sepia(51%) saturate(2878%) hue-rotate(346deg)
  159. brightness(104%) contrast(97%);
  160. }
  161. .triangle {
  162. background-color: white;
  163. width: 10px;
  164. height: 10px;
  165. clip-path: polygon(0 100%, 100% 100%, 50% 0);
  166. position: absolute;
  167. bottom: -2px;
  168. }
  169. </style>