gemercheung 1 gadu atpakaļ
vecāks
revīzija
49d1bf5458

+ 8 - 4
src/components/noticeBox.vue

@@ -1,6 +1,8 @@
 <template>
   <n-card :title="title" class="notice-box" @click="handleDetail">
-    {{ content }}
+    <n-ellipsis :line-clamp="2" :tooltip="false">
+      <div v-html="content"></div>
+    </n-ellipsis>
     <template #footer>
       {{ time }}
     </template>
@@ -43,9 +45,11 @@ const handleDetail = () => {
 
 <style lang="scss" scoped>
 .n-card.notice-box {
-  --n-title-font-weight: 600 !important;
-  --n-title-font-size: 1.75rem !important;
-  --n-padding-top: 1.875rem !important;
+  --n-title-font-weight: 600;
+  --n-title-font-size: 1.75rem;
+  --n-padding-top: 1.875rem;
+  --n-font-size: 18px;
+  --n-color: #6e6e6e;
   border-radius: 1.875rem;
   background-size: contain;
   background-repeat: no-repeat;

+ 12 - 3
src/components/showCase.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="show-case-container">
+  <div class="show-case-container" ref="containerRef">
     <audio v-if="audio" ref="audioSound" :src="audio"></audio>
     <div class="show-case" v-if="isModel">
       <iframe ref="iframeRef" frameborder="0" :src="iframeURL"></iframe>
@@ -64,8 +64,8 @@
       </n-space>
       <div class="actions">
         <div v-if="isModel">
-          <img src="@/assets/zoom-in.png" />
-          <img src="@/assets/zoom-out.png" />
+          <img src="@/assets/zoom-in.png" @click="handleFullScreen" />
+          <img src="@/assets/zoom-out.png" @click="handleExitFullScreen" />
           <img src="@/assets/reload.png" @click="reloadIframe" />
         </div>
         <div v-if="isGallery && audio">
@@ -79,8 +79,10 @@
 
 <script setup>
 import { ref, computed, unref, watch } from "vue";
+import { useFullscreen } from "@vueuse/core";
 
 const iframeRef = ref();
+const containerRef = ref();
 const type = ref("model");
 const defaultType = ref(["model", "video", "audio", "gallery"]);
 
@@ -93,6 +95,7 @@ const isGallery = computed(() => type.value === "gallery");
 const domain = ref(import.meta.env.VITE_DOMAIN_URL);
 const audioSound = ref("");
 const currentSlideIndex = ref(1);
+const { isFullscreen, enter, exit, toggle } = useFullscreen(containerRef);
 
 defineOptions({
   name: "show-case",
@@ -150,6 +153,12 @@ const reloadIframe = () => {
     } catch (error) {}
   }
 };
+const handleFullScreen = () => {
+  enter();
+};
+const handleExitFullScreen = () => {
+  exit();
+};
 </script>
 
 <style>

+ 3 - 3
src/views/collect-detail.vue

@@ -5,11 +5,10 @@
       <div class="left">
         <hero-sub-title :type="3" />
         <div class="detail">
-      
           <div class="detail-wrapper">
             <div class="back" @click="$router.go(-1)"></div>
-            {{ files }}
-          {{ entity }}
+            <!-- {{ files }}
+            {{ entity }} -->
             <div class="info">
               <!-- <div class="show-case"></div> -->
               <show-case
@@ -69,6 +68,7 @@ watchEffect(() => {
     document.title = unref(entity).name;
   }
 });
+;
 </script>
 
 <style lang="scss" scoped>

+ 4 - 0
src/views/collect.vue

@@ -34,6 +34,7 @@
               <template v-for="item in collectLists">
                 <n-gi>
                   <collect-box
+                    v-if="Number(item.display) === 1"
                     :id="item.id"
                     :title="item.name"
                     :cover="domain + item.thumb"
@@ -49,6 +50,7 @@
               <template v-for="item in collectLists">
                 <n-gi>
                   <collect-box
+                    v-if="Number(item.display) === 1"
                     :id="item.id"
                     :title="item.name"
                     :cover="domain + item.thumb"
@@ -64,6 +66,7 @@
               <template v-for="item in collectLists">
                 <n-gi>
                   <collect-box
+                    v-if="Number(item.display) === 1"
                     :id="item.id"
                     :title="item.name"
                     :cover="domain + item.thumb"
@@ -79,6 +82,7 @@
               <template v-for="item in collectLists">
                 <n-gi>
                   <collect-box
+                    v-if="Number(item.display) === 1"
                     :id="item.id"
                     :title="item.name"
                     :cover="domain + item.thumb"

+ 2 - 1
src/views/info.vue

@@ -15,6 +15,7 @@
             tab="展览"
             v-infinite-scroll="onLoadMore"
           >
+   
             <n-grid :x-gap="XGap" :y-gap="YGap" :cols="3" class="tab-grid">
               <template v-for="item in exhibitions">
                 <n-gi>
@@ -66,7 +67,7 @@
                   <notice-box
                     :id="item.id"
                     :title="item.name"
-                    content="这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段摘要这是一段..."
+                    :content="item.richText"
                     :time="item.publishDate"
                   />
                 </n-gi>

+ 63 - 8
src/views/survey-detail.vue

@@ -95,6 +95,7 @@
                 class="submit"
                 size="large"
                 type="primary"
+                :disabled="isLockSubmit"
                 @click="submit"
               >
                 提交
@@ -109,19 +110,21 @@
 </template>
 
 <script setup>
-import { watchEffect, ref, onMounted, computed } from "vue";
+import { watch, watchEffect, ref, computed } from "vue";
 import { useMessage } from "naive-ui";
 import subHeader from "../components/subHeader";
 import sideMenu from "../components/sideMenu";
 import heroSubTitle from "../components/heroSubTitle";
 import { useSurveyStore } from "../store/survey";
 import { useRouter } from "vue-router";
-
+import { isDefined } from "@vueuse/core";
 const router = useRouter();
 const surveyStore = useSurveyStore();
 const title = ref("问卷调查");
 const message = useMessage();
 const details = computed(() => surveyStore.details);
+const isLockSubmit = ref(true);
+const isInit = ref(false);
 
 const props = defineProps({
   id: {
@@ -130,27 +133,78 @@ const props = defineProps({
     required: true,
   },
 });
+
 watchEffect(() => {
   document.title = title.value;
-  if (props.id) {
+  if (props.id && !isInit.value) {
     surveyStore.getDetail(props.id);
+    isInit.value = true;
   }
 });
 
+watch(
+  details,
+  (val) => {
+    const handleAnswerIsReady = Array.from(val).filter((item) => {
+      if (item.type === 1) {
+        return isDefined(item.value) ? true : false;
+      } else {
+        return isDefined(item.value)
+          ? Array.from(item.value).length > 0
+            ? true
+            : false
+          : false;
+      }
+    });
+    isLockSubmit.value =
+      handleAnswerIsReady.length === val.length ? false : true;
+  },
+  {
+    deep: true,
+  }
+);
+
 const submit = async () => {
-  const lastAnswers = details.value.map((detail) => {
+  let answers = [];
+
+  Array.from(unref(details)).forEach((detail) => {
     const mapper = {};
-    mapper["otherDesc"] = detail.value;
+    // console.log("mapper", detail, mapper);
     mapper["questionId"] = detail.id;
     mapper["questionnaireId"] = detail.questionnaireId;
     mapper["type"] = detail.type;
-    return mapper;
+    if (detail.type === 1) {
+      if (detail.value === "diy") {
+        mapper["otherDesc"] = detail[`custom-${detail.id}`];
+        mapper["type"] = 0;
+      } else {
+        mapper["otherDesc"] = "";
+        mapper["type"] = detail.value;
+      }
+      answers.push(mapper);
+    }
+    if (detail.type === 2) {
+      const muliAnswer = Array.from(detail.value).map((muli) => {
+        const subMapper = {};
+        subMapper["questionId"] = detail.id;
+        subMapper["questionnaireId"] = detail.questionnaireId;
+        if (muli === "diy") {
+          subMapper["otherDesc"] = detail[`custom-${detail.id}`];
+          subMapper["type"] = 0;
+        } else {
+          subMapper["otherDesc"] = "";
+          subMapper["type"] = muli;
+        }
+        return subMapper;
+      });
+      answers = answers.concat(muliAnswer);
+    }
   });
-  console.log("lastAnswers", lastAnswers);
+  console.log("last-answers", answers);
   message.success("提交成功!");
   // router.go(-1);
   try {
-    await surveyStore.sendAnswer(lastAnswers);
+    await surveyStore.sendAnswer(answers);
   } catch (error) {
     message.warning("提交服务器失败!");
   }
@@ -209,6 +263,7 @@ const submit = async () => {
       display: flex;
       justify-content: center;
       align-items: center;
+      margin-top: 1.875rem;
       :deep(.n-button) {
         font-size: 1.25rem;
         padding: 1.5625rem 3.125rem;