bill 1 rok temu
rodzic
commit
dc186f0da3

+ 41 - 0
src/components/tex-tooltip.vue

@@ -0,0 +1,41 @@
+<template>
+  <span class="text" v-if="!sample" ref="dom">{{ text }}</span>
+  <el-tooltip class="box-item" effect="dark" :content="text" placement="top" v-else>
+    <span class="text sample">{{ text }}</span>
+  </el-tooltip>
+</template>
+
+<script setup lang="ts">
+import { onMounted, onUnmounted, ref } from "vue";
+
+defineProps<{ text: string }>();
+
+const dom = ref<HTMLSpanElement>();
+const sample = ref(false);
+const initSample = () => {
+  if (dom.value) {
+    sample.value = dom.value!.offsetHeight > 50;
+  }
+};
+
+onMounted(initSample);
+onUnmounted(() => {
+  window.removeEventListener("resize", initSample);
+});
+window.addEventListener("resize", initSample);
+</script>
+
+<style lang="scss" scoped>
+.text {
+  display: inline-block;
+  line-height: 23px;
+}
+.sample {
+  display: -webkit-box;
+  max-height: 46px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 2;
+  -webkit-box-orient: vertical;
+}
+</style>

+ 1 - 0
src/request/URL.ts

@@ -4,6 +4,7 @@ export const getUserInfo = `/relics/getUserInfo`;
 export const getRelicsPage = `/relics/relicsInfo/page`;
 export const updateRelicsName = `/relics/relicsInfo/update`;
 export const getRelicsInfo = `/relics/relicsInfo/info/:relicsId`;
+export const relicsSelfCheck = `/relics/relicsInfo/info/check/:relicsId`;
 export const delRelics = `/relics/relicsInfo/del`;
 export const addRelics = `/relics/relicsInfo/add`;
 

+ 10 - 0
src/request/index.ts

@@ -103,6 +103,16 @@ export const relicsInfoFetch = (relicsId: number) =>
     { paths: { relicsId } }
   );
 
+export const relicsSelfCheckFetch = (relicsId: number) =>
+  sendFetch<Relics>(
+    URL.relicsSelfCheck,
+    {
+      method: "post",
+      body: JSON.stringify({}),
+    },
+    { paths: { relicsId } }
+  );
+
 export const addRelicsFetch = (relics: Relics) => {
   return sendFetch(URL.addRelics, {
     method: "post",

+ 13 - 1
src/store/relics.ts

@@ -1,4 +1,8 @@
-import { relicsInfoFetch, updateRelicsFetch } from "@/request";
+import {
+  relicsInfoFetch,
+  relicsSelfCheckFetch,
+  updateRelicsFetch,
+} from "@/request";
 import { ref } from "vue";
 import { Relics } from "@/request/type";
 import { refreshScenes } from "./scene";
@@ -12,6 +16,14 @@ export const initRelics = async (relicsId: number) => {
     await refreshScenes();
   }
 };
+export const initSelfRelics = async (relicsId: number) => {
+  await relicsSelfCheckFetch(relicsId);
+
+  relics.value = await relicsInfoFetch(relicsId);
+  if (relics.value) {
+    await refreshScenes();
+  }
+};
 export const updateRelicsName = async (name: string) => {
   await updateRelicsFetch({ ...relics.value!, name });
   relics.value!.name = name;

+ 27 - 7
src/view/layout/nav.vue

@@ -1,13 +1,16 @@
 <template>
   <div class="main-layout">
     <div class="header" :class="{ [name]: true }">
-      <el-button
-        :icon="Back"
-        circle
-        type="primary"
-        @click="router.back()"
-        v-if="user || name === 'pano'"
-      />
+      <span class="title-span">
+        <el-button
+          :icon="Back"
+          circle
+          type="primary"
+          @click="router.back()"
+          v-if="showBack"
+        />
+        <span v-if="!name">不可移动文物管理平台</span>
+      </span>
       <el-dropdown class="avatar" v-if="user">
         <span>
           <el-avatar :src="user.head" />
@@ -41,6 +44,7 @@ import { errorHook } from "@/request/state";
 import lySlide from "./slide/index.vue";
 
 const name = computed(() => router.currentRoute.value.meta?.navClass as string);
+const routeName = computed(() => router.currentRoute.value.name as string);
 const logoutHandler = () => {
   logout();
   router.replace({ name: "login" });
@@ -50,6 +54,14 @@ errorHook.push((code) => {
     router.replace({ name: "login" });
   }
 });
+
+const showBack = computed(() => {
+  if (name.value === "pano") {
+    return true;
+  } else {
+    return user && routeName.value === "map";
+  }
+});
 </script>
 
 <style lang="scss" scoped>
@@ -121,4 +133,12 @@ errorHook.push((code) => {
     }
   }
 }
+
+.title-span {
+  display: flex;
+  align-items: center;
+  > span {
+    margin-left: 10px;
+  }
+}
 </style>

+ 1 - 1
src/view/login.vue

@@ -11,7 +11,7 @@
               <img src="/image/logo@2x.png" />
             </div>
             <div class="center">
-              <h1>第四次全国文物普查</h1>
+              <h1>不可移动文物管理平台</h1>
               <p>
                 <img src="/image/logo.png" />
               </p>

+ 6 - 8
src/view/map/map-right.vue

@@ -61,14 +61,12 @@
                     <Edit @click.stop="inputPoint = data.raw" />
                   </el-icon>
                 </template>
-                <el-icon color="#409efc" style="margin-left: 8px">
-                  <Link
-                    @click.stop="
-                      data.type === 'scene'
-                        ? gotoScene(data.raw)
-                        : emit('gotoPoint', data.raw)
-                    "
-                  />
+                <el-icon
+                  color="#409efc"
+                  style="margin-left: 8px"
+                  v-if="data.type === 'scene'"
+                >
+                  <Link @click.stop="gotoScene(data.raw)" />
                 </el-icon>
               </span>
             </div>

+ 7 - 3
src/view/map/map.vue

@@ -48,7 +48,7 @@ import MapRight from "./map-right.vue";
 import { router, setDocTitle } from "@/router";
 import { TileType, createMap } from "./";
 import { ScenePoint, Scene, scenePoints, scenes } from "@/store/scene";
-import { initRelics, relics } from "@/store/relics";
+import { initRelics, initSelfRelics, relics } from "@/store/relics";
 import { computed, onMounted, ref, watchEffect, watch } from "vue";
 import { Manage } from "./manage";
 
@@ -157,11 +157,15 @@ watch(
   ([name, rid]) => {
     if (["map", "query-map"].includes(name as string)) {
       relics.value = undefined;
-      initRelics(Number(rid)).finally(() => {
+      const fn = name === "map" ? initSelfRelics : initRelics;
+      fn(Number(rid)).finally(() => {
         if (!relics.value) {
           router.replace({ name: "relics" });
         }
-        scenes.value.length && flyScene(scenes.value[0]);
+        const scene = scenes.value.find(
+          (scene) => !scene.scenePos.every((pos) => !pos.pos || pos.pos.length === 0)
+        );
+        scene && flyScene(scene);
       });
     }
   },

+ 20 - 2
src/view/relics.vue

@@ -45,7 +45,16 @@
 
     <div class="relics-content">
       <el-table :data="relicsArray" border>
-        <el-table-column prop="name" label="文物名称" />
+        <el-table-column
+          prop="name"
+          label="文物名称"
+          v-slot:default="{ row }: { row: Relics }"
+        >
+          <a class="link" @click="shareHandler(row)">
+            <TexToolTip :text="row.name" />
+          </a>
+        </el-table-column>
+
         <el-table-column prop="unicode" label="文物编号" />
         <el-table-column
           prop="name"
@@ -61,7 +70,10 @@
         >
           {{ relicsTypeDesc[row.category!] }}
         </el-table-column>
-        <el-table-column prop="address" label="文物地址" />
+        <el-table-column label="文物地址" v-slot:default="{ row }: { row: Relics }">
+          <TexToolTip :text="row.address" v-if="row.address" />
+        </el-table-column>
+
         <el-table-column label="创建时间" prop="createTime" v-slot:default="{ row }">
           {{ row.createTime && row.createTime.substr(0, 16) }}
         </el-table-column>
@@ -128,6 +140,7 @@ import {
 import { router } from "@/router";
 import { ElMessageBox } from "element-plus";
 import { relicsEdit } from "./quisk";
+import TexToolTip from "@/components/tex-tooltip.vue";
 
 const initProps: RelicsPageProps = {
   pageNum: 1,
@@ -209,4 +222,9 @@ onActivated(refresh);
     text-align: right;
   }
 }
+
+.link {
+  color: var(--el-color-primary);
+  cursor: pointer;
+}
 </style>