浏览代码

release and bug fix

刘洋 2 年之前
父节点
当前提交
78357dcbcf

+ 1 - 0
package.json

@@ -27,6 +27,7 @@
     "echarts": "5.4.0",
     "element-plus": "2.2.17",
     "lodash-es": "4.17.21",
+    "mitt": "^3.0.0",
     "pinia": "2.0.23",
     "rgbaster": "^2.1.1",
     "splitpanes": "^3.1.5",

文件差异内容过多而无法显示
+ 0 - 0
src/assets/icons/none_message.svg


+ 10 - 0
src/assets/styles/element/custom.scss

@@ -117,6 +117,16 @@ button.el-button {
       display: none;
     }
   }
+  &[canoverflow]{
+    &>.el-dialog__body{
+      overflow:visible;
+    }
+  }
+  &[less] {
+    .el-dialog__header {
+      display: block !important;
+    }
+  }
 
   &[small] .el-dialog__body {
     padding: map-get($ep-dialog-body-padding, 'small');

+ 1 - 1
src/components/shared/ImagePreview.vue

@@ -1,5 +1,5 @@
 <template>
-  <base-dialog v-model="visible" title="试卷预览" :footer="false" :modal="false" draggable class="preview-dialog">
+  <base-dialog v-model="visible" less title="试卷预览" :footer="false" :modal="false" draggable class="preview-dialog">
     <div class="preview-content">
       <img v-show="!!url" :src="url" alt="" />
     </div>

+ 1 - 1
src/components/shared/RemarkListModal.vue

@@ -64,7 +64,7 @@ const tableColumns: EpTableColumn<HistoryTask>[] = [
   { label: '密号', prop: 'secretNumber' },
   { label: '分数', prop: 'markScore' },
   { label: '时间', prop: 'markTime' },
-  { label: '试卷类型', prop: 'taskType' },
+  // { label: '试卷类型', prop: 'taskType' },
 ]
 
 const viewType = ref<'list' | 'preview'>('list')

+ 6 - 2
src/components/shared/ScoringPanelWithConfirm.vue

@@ -19,8 +19,8 @@
     <template #footer>
       <div class="flex items-center justify-between">
         <el-button
-          :disabled="!modelScore.length"
           ref="confirmButtonRef"
+          :disabled="!modelScore.length"
           class="confirm-button"
           type="primary"
           @click="onConfirmSubmit"
@@ -92,7 +92,11 @@ const questionInfo = ref<ExtractApiResponse<'getQuestionStruct'>>()
 const onSubmit = (data: ExtractApiResponse<'getQuestionStruct'>) => {
   questionInfo.value = data
   modalVisible.value = false
-  submitModalVisible.value = true
+  nextTick(() => {
+    setTimeout(() => {
+      submitModalVisible.value = true
+    }, 10)
+  })
 }
 
 /** 取消提交 */

+ 2 - 2
src/components/shared/UpdateUserPwd.vue

@@ -1,6 +1,6 @@
 <template>
-  <base-dialog v-model="visible" title="个人信息" :footer="false" destroy-on-close>
-    <base-form ref="formRef" :model="userModel" :rules="rules" :items="items" :label-width="useVW(72)">
+  <base-dialog v-model="visible" title="个人信息" :footer="false" destroy-on-close :width="400">
+    <base-form ref="formRef" :model="userModel" :rules="rules" :items="items" :label-width="90">
       <template #form-item-confirm>
         <confirm-button class="m-t-large" @confirm="onSubmit" @cancel="visible = false"></confirm-button>
       </template>

+ 14 - 6
src/components/shared/message/Message.vue

@@ -2,7 +2,7 @@
   <message-component>
     <div ref="messageIcon" v-bind="$attrs" class="message-icon">
       <span v-show="unReadMessages?.newCount" class="un-read-num">
-        {{ (unReadMessages?.newCount || 0) > 99 ? unReadMessages?.newCount + '+' : unReadMessages?.newCount }}
+        {{ (unReadMessages?.newCount || 0) > 99 ? '99+' : unReadMessages?.newCount }}
       </span>
       <svg-icon name="message"></svg-icon>
     </div>
@@ -16,14 +16,15 @@
     >
       <div class="message-popover-content">
         <div class="title">
-          <span class="unread-count">{{ unReadMessages?.newCount || 0 }}</span>
-          <span>条消息</span>
+          <!-- <span class="unread-count">{{ unReadMessages?.newCount || 0 }}</span>
+          <span>条消息</span> -->
+          最近消息
         </div>
         <div class="message-list">
           <div
             v-for="message in unReadMessages?.messages"
             :key="message.sendUserId"
-            class="flex message-row"
+            class="message-row"
             @click="onReceiveMessage"
           >
             <div class="message-send-user">
@@ -198,12 +199,19 @@ const onSendMessage = () => {
   }
   .message-list {
     border-bottom: $OnePixelLine;
-    margin: 10px 0 40px;
+    // margin: 10px 0 40px;
+    height: 80px;
+    margin: 10px 0;
     .message-row {
-      padding: 10px 4px;
+      padding: 0 4px;
       font-size: $BaseFont;
       font-weight: 400;
       border-top: $OnePixelLine;
+      height: 40px;
+      line-height: 40px;
+      overflow: hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
       &:hover {
         background-color: #f5f5f5;
       }

+ 10 - 3
src/components/shared/message/MessageHistory.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="p-base scroll-y-auto message-history-container">
+  <div v-loading="loading" class="p-base scroll-y-auto message-history-container">
     <template v-if="!history?.length">
       <empty></empty>
     </template>
@@ -31,7 +31,7 @@ const previewModalVisible = ref<boolean>(false)
 /** 图片路径 */
 const paperPath = ref<string>('')
 
-const { fetch: getMessageHistory, result: history } = useFetch('getMessageHistory')
+const { fetch: getMessageHistory, result: history, loading } = useFetch('getMessageHistory')
 
 watch(
   () => props.sendUserId,
@@ -55,10 +55,17 @@ const onContentClick = (e: Event) => {
 
 <style scoped lang="scss">
 .message-history-container {
-  max-height: 400px;
+  // max-height: 400px;
+  // height: 250px;
   border-top: $OnePixelLine;
   border-radius: 0 0 6px 6px;
   background-color: $color--white;
+  position: absolute;
+  left: 100%;
+  top: 0;
+  height: 100%;
+  width: 300px;
+  border-left: 1px solid #eee;
   .message-info {
     .message-header {
       color: $color--primary;

+ 44 - 19
src/components/shared/message/MessageList.vue

@@ -1,18 +1,26 @@
 <template>
-  <div class="flex radius-base overflow-hidden message-list-modal">
+  <div class="flex radius-base message-list-modal">
     <div class="message-list p-base scroll-y-auto">
-      <div
-        v-for="message in messageList"
-        :key="message.id"
-        class="radius-base fill-blank p-base m-b-mini relative message-item"
-        :class="{ active: currentMessage?.sendUserId === message.sendUserId, 'un-read': message.unReadCount > 0 }"
-        @click="checkMessage(message)"
-      >
-        <div class="flex items-center m-b-base message-title">
-          <div class="message-send-user">{{ message.sendUserName }}</div>
-          <div class="m-l-auto message-send-time">{{ dayjs(message.sendTime).format('HH:mm') }}</div>
+      <template v-if="!!(messageList || []).length">
+        <div
+          v-for="message in messageList"
+          :key="message.id"
+          class="radius-base fill-blank p-base m-b-mini relative message-item"
+          :class="{ active: currentMessage?.sendUserId === message.sendUserId, 'un-read': message.unReadCount > 0 }"
+          @click="checkMessage(message)"
+        >
+          <div class="flex items-center m-b-base message-title">
+            <div class="message-send-user">{{ message.sendUserName }}</div>
+            <div class="m-l-auto message-send-time">{{ dayjs(message.sendTime).format('HH:mm') }}</div>
+          </div>
+          <pre class="message-content" v-html="message.content"></pre>
+        </div>
+      </template>
+      <div v-else class="none-msg-box">
+        <div class="center-box">
+          <svg-icon name="none_message" style="font-size: 120px"></svg-icon>
+          <p class="tip">暂无消息</p>
         </div>
-        <pre class="message-content" v-html="message.content"></pre>
       </div>
     </div>
     <div class="radius-base message-info-container">
@@ -34,8 +42,8 @@
           ></pre>
         </div>
         <div class="p-base flex items-center justify-end">
-          <el-button size="small" plain :disabled="!currentMessage" @click="toggleHistory">历史消息</el-button>
           <el-button size="small" type="primary" :disabled="!currentMessage" @click="onReply">回复</el-button>
+          <el-button size="small" plain :disabled="!currentMessage" @click="toggleHistory">历史消息</el-button>
         </div>
       </div>
       <message-history v-if="showHistory" :send-user-id="currentMessage?.sendUserId"></message-history>
@@ -56,9 +64,8 @@ import ImagePreview from '../ImagePreview.vue'
 import useMainStore from '@/store/main'
 import uesFetch from '@/hooks/useFetch'
 import { setLastMsgs } from '@/hooks/useMessageLoop'
-
+import SvgIcon from '@/components/common/SvgIcon.vue'
 import type { ExtractApiResponse } from '@/api/api'
-
 type MessageType = ExtractArrayValue<ExtractApiResponse<'getMessageList'>>
 const mainStore = useMainStore()
 const emits = defineEmits(['close', 'change-type', 'reply'])
@@ -129,13 +136,27 @@ onUnmounted(() => {
 
 <style scoped lang="scss">
 .message-list-modal {
-  width: 880px;
+  width: 750px;
   background-color: transparent;
   .message-list {
-    width: 280px;
+    width: 260px;
     height: 446px;
     background: #fafafa;
     box-shadow: 0px 6px 6px 0px rgba(0, 0, 0, 0.1);
+    .none-msg-box {
+      width: 100%;
+      height: 100%;
+      display: flex;
+      justify-content: center;
+      align-items: center;
+      .center-box {
+        text-align: center;
+        .tip {
+          color: #999;
+          margin-top: 5px;
+        }
+      }
+    }
     .message-item {
       &.un-read:after {
         content: '';
@@ -182,7 +203,9 @@ onUnmounted(() => {
     }
   }
   .message-info-container {
-    width: 600px;
+    // width: 600px;
+    width: calc(100% - 260px);
+    position: relative;
     .message-info {
       height: 446px;
       background-color: $color--white;
@@ -194,8 +217,10 @@ onUnmounted(() => {
           .user-name {
             display: inline-block;
             width: 160px;
-            padding: 10px 12px;
+            padding: 0 12px;
             border: $OnePixelLine;
+            height: 38px;
+            line-height: 36px;
           }
         }
         .close-icon {

+ 42 - 11
src/components/shared/message/MessageSend.vue

@@ -14,13 +14,16 @@
         ></el-tree>
       </div>
     </div>
-    <div class="message-info-container">
+    <div class="message-info-container" :class="{ big: !showCheckUser }">
       <div class="flex direction-column message-info">
         <div class="flex items-center p-base message-info-header">
           <div class="flex flex-1 items-center overflow-hidden send-user">
             <span class="m-r-mini">收件人</span>
             <span class="flex flex-1 overflow-hidden items-center justify-between radius-base m-r-base user-name">
-              <span class="flex-1 checked-users"> {{ viewCheckedUser }}</span>
+              <p class="flex-1 checked-users flex" :class="{ big: showCheckUser }">
+                <span class="split-names">{{ viewCheckedUser }}</span>
+                <span v-if="checkedUsers.length > 3">共计{{ checkedUsers.length }}个人员</span>
+              </p>
               <el-button class="m-l-base" size="small" type="primary" @click="toggleCheckUser"> 选择收件人 </el-button>
             </span>
           </div>
@@ -42,8 +45,13 @@
           <el-button size="small" type="primary" :disabled="!allowSend" :loading="loading" @click="onSendMessage">
             发送
           </el-button>
+          <el-button v-if="checkedUsers.length == 1" size="small" plain @click="toggleHistory">历史消息</el-button>
         </div>
       </div>
+      <message-history
+        v-if="showHistory"
+        :send-user-id="checkedUsers.length == 1 ? checkedUsers[0].id : undefined"
+      ></message-history>
     </div>
   </div>
   <image-preview v-model="previewModalVisible" :url="props.paperPath || ''"></image-preview>
@@ -57,7 +65,7 @@ import ContentEditAble from '@/components/common/ContentEditAble.vue'
 import ImagePreview from '../ImagePreview.vue'
 import useFetch from '@/hooks/useFetch'
 import useVModel from '@/hooks/useVModel'
-
+import MessageHistory from '@/components/shared/message/MessageHistory.vue'
 import type { ExtractApiResponse } from '@/api/api'
 
 type MarkerItem = ExtractArrayValue<ExtractApiResponse<'getUserGroup'>['chiffGroup']>
@@ -70,7 +78,7 @@ const props = defineProps<{
 
 /** cleat warning */
 const emit = defineEmits(['close', 'change-type', 'reply'])
-
+const showHistory = ref<boolean>(false)
 /** 默认的收件人ID */
 const replyUserId = useVModel(props, 'replyUserId')
 
@@ -122,7 +130,8 @@ const treeProp = {
   children: 'markers',
   label(treeNode: TreeNode) {
     if (isMarker(treeNode)) {
-      return treeNode.name || treeNode.loginName
+      // return treeNode.name || treeNode.loginName
+      return `${treeNode.loginName}-${treeNode.name}`
     }
     return treeNode.label
   },
@@ -165,6 +174,9 @@ watch(
 
 const onCheckChange = () => {
   checkedUsers.value = (treeRef?.value?.getCheckedNodes(true) as MarkerItem[]).filter((v) => !!v.id) || []
+  if (checkedUsers.value.length != 1) {
+    showHistory.value = false
+  }
 }
 
 watch(messageContent, () => {
@@ -210,28 +222,36 @@ const onSendMessage = async () => {
 }
 
 getUserGroup()
+
+const toggleHistory = () => {
+  showHistory.value = !showHistory.value
+}
 </script>
 
 <style scoped lang="scss">
 .message-list-modal {
   background-color: transparent;
-  width: 880px;
+  width: 750px;
   .tree-box {
-    width: 280px;
+    width: 260px;
     height: 446px;
     ::v-deep(.el-tree) {
       min-height: 100%;
     }
   }
   .message-list {
-    width: 280px;
+    width: 260px;
     height: 446px;
     background: #fafafa;
     box-shadow: 0px 6px 6px 0px rgba(0, 0, 0, 0.1);
   }
   .message-info-container {
     // width: 600px;
-    flex: 1;
+    // flex: 1;
+    width: calc(100% - 260px);
+    &.big {
+      width: 750px;
+    }
     .message-info {
       height: 446px;
       background-color: $color--white;
@@ -245,8 +265,19 @@ getUserGroup()
             padding: 10px 12px;
             border: $OnePixelLine;
             .checked-users {
-              overflow: hidden;
-              white-space: nowrap;
+              // overflow: hidden;
+              // white-space: nowrap;
+              display: flex;
+              width: 500px;
+              &.big {
+                width: 240px;
+              }
+              .split-names {
+                flex: 1;
+                overflow: hidden;
+                white-space: nowrap;
+                text-overflow: ellipsis;
+              }
             }
           }
         }

+ 1 - 1
src/components/shared/message/MessageWindow.vue

@@ -1,5 +1,5 @@
 <template>
-  <base-dialog v-model="visible" unless :footer="false" class="message-dialog" destroy-on-close>
+  <base-dialog v-model="visible" unless canoverflow :footer="false" class="message-dialog" destroy-on-close>
     <component
       :is="MessageWindowContent"
       :reply-user-id="replyUserId"

+ 3 - 1
src/hooks/useMarkHeader.ts

@@ -1,5 +1,6 @@
 import { reactive, ref, computed, watch, toRefs } from 'vue'
 import { useRouter } from 'vue-router'
+import bus from '@/utils/bus'
 const useMarkHeader = () => {
   const { back, push } = useRouter()
 
@@ -55,7 +56,8 @@ const useMarkHeader = () => {
 
   /** 查看评分标准 */
   const onViewStandard = () => {
-    push({ name: 'MarkStandard' })
+    // push({ name: 'MarkStandard' })
+    bus.emit('showStandard')
   }
 
   return {

+ 26 - 4
src/modules/admin-subject/edit-main-question/index.vue

@@ -26,10 +26,14 @@
       </base-form>
     </el-card>
   </div>
-  <base-dialog v-model="setLevelRangeVisible" title="档次设置" destroy-on-close>
+  <base-dialog v-model="setLevelRangeVisible" title="档次设置" destroy-on-close :width="340">
     <div class="level-list">
       <div v-for="([start, end], index) in levelRanges" :key="index" class="flex items-center level-row">
-        <div class="m-r-base level-label">档次 - ({{ start }}~{{ end }})</div>
+        <div class="m-r-large level-label flex items-center justify-between">
+          <span class="s1">档次{{ (start + end) / 2 }}</span>
+          <span class="s2">-</span>
+          <span class="s3">({{ start }}~{{ end }})</span>
+        </div>
         <div class="flex items-center level-input">
           <el-input-number
             v-model="levelRangValues[index]"
@@ -38,6 +42,8 @@
             :min="0"
             :max="100"
             :controls="false"
+            style="width: 100px"
+            @keyup="levelItemChange(index, $event)"
           ></el-input-number>
           %
         </div>
@@ -88,7 +94,12 @@ const levelRanges = [
   [10, 12],
   [13, 15],
 ]
-
+const levelItemChange = (index: number, e: any) => {
+  if (Number(e.target.value) > 100) {
+    levelRangValues.value[index] = 100
+    e.target.value = 100
+  }
+}
 const setLevelRangeVisible = ref<boolean>(false)
 
 const levelRangValues = ref<number[]>(Array.from<number>({ length: 6 }).fill(0))
@@ -381,8 +392,19 @@ const onCancel = () => {
   .level-row {
     margin-bottom: 8px;
     .level-label {
-      width: 100px;
+      width: 125px;
       text-align: right;
+      .s1 {
+        width: 41px;
+        text-align: left;
+      }
+      .s2 {
+        width: 7px;
+      }
+      .s3 {
+        width: 49px;
+        text-align: right;
+      }
     }
   }
 }

+ 13 - 3
src/modules/marking/mark/index.vue

@@ -36,13 +36,13 @@
       @submit="onSubmit"
     ></scoring-panel-with-confirm>
   </div>
-  <base-dialog v-model="problemVisible" unless :width="useVW(260)" center>
+  <base-dialog v-model="problemVisible" unless :width="280" center>
     <el-radio-group v-model="problemClass">
       <el-radio-button label="problem">问题卷</el-radio-button>
       <el-radio-button label="similar">雷同卷</el-radio-button>
     </el-radio-group>
 
-    <div class="m-t-base problem-pane">
+    <div class="m-t-base problem-pane" style="height: 80px">
       <el-radio-group v-show="problemClass === 'problem'" v-model="problemType" class="full-w">
         <div class="full-w">
           <el-radio label="OVERSTEP">跨套</el-radio>
@@ -62,6 +62,9 @@
   </base-dialog>
   <remark-list-modal v-model="remarkModalVisible" @task-change="historyTaskChange"></remark-list-modal>
   <image-preview v-model="previewModalVisible" :url="currentTask?.url"></image-preview>
+  <base-dialog v-model="standardVisible" title="评分标准" width="90vw" center :footer="false">
+    <iframe style="width: 100%; height: calc(100vh - 100px)" :src="standardRes?.url" alt="" />
+  </base-dialog>
 </template>
 
 <script setup lang="ts" name="MarkingMark">
@@ -82,6 +85,7 @@ import ImagePreview from '@/components/shared/ImagePreview.vue'
 import RemarkListModal from '@/components/shared/RemarkListModal.vue'
 import CurrentTime from '@/components/shared/CurrentTime.vue'
 import SvgIcon from '@/components/common/SvgIcon.vue'
+import bus from '@/utils/bus'
 
 import MarkingStatus from '@/assets/images/status-marking.png'
 import ReMarkingStatus from '@/assets/images/status-remarking.png'
@@ -91,7 +95,7 @@ import SampleBStatus from '@/assets/images/status-sample-b.png'
 import type { SetImgBgOption } from '@/hooks/useSetImgBg'
 import type { ExtractApiResponse } from '@/api/api'
 import type { MarkHeaderInstance } from 'global-type'
-
+const standardVisible = ref(false)
 const { push, replace } = useRouter()
 
 const { getSpentTime, resume } = useSpentTime()
@@ -427,6 +431,12 @@ watch(currentTask, () => {
 })
 
 onRefresh()
+
+bus.on('showStandard', () => {
+  standardVisible.value = true
+})
+const { fetch: fetchStandard, result: standardRes } = useFetch('getMarkingStandard')
+fetchStandard()
 </script>
 
 <style scoped lang="scss">

+ 2 - 0
src/utils/bus.ts

@@ -0,0 +1,2 @@
+import mitt from 'mitt'
+export default mitt()

部分文件因为文件数量过多而无法显示