Kaynağa Gözat

修改需求

bill 1 yıl önce
ebeveyn
işleme
624cb400e5

+ 11 - 1
src/components/single-input.vue

@@ -5,7 +5,13 @@
     :title="title"
     width="500"
   >
-    <el-input v-model="ivalue" />
+    <el-input
+      v-model.trim="ivalue"
+      :maxlength="500"
+      show-word-limit
+      type="textarea"
+      placeholder="请输入"
+    />
     <template #footer>
       <div class="dialog-footer">
         <el-button @click="emit('update:visible', false)">取消</el-button>
@@ -16,6 +22,7 @@
 </template>
 
 <script setup lang="ts">
+import { ElMessage } from "element-plus";
 import { ref, watchEffect } from "vue";
 
 const props = defineProps<{
@@ -34,6 +41,9 @@ watchEffect(() => {
 });
 
 const submit = async () => {
+  if (ivalue.value.length === 0) {
+    return ElMessage.error("点位名称不能为空!");
+  }
   await props.updateValue(ivalue.value);
   emit("update:visible", false);
 };

+ 1 - 1
src/request/type.ts

@@ -65,7 +65,7 @@ export type Device = {
   cameraId: number;
   cameraSn: string;
   cameraType: DeviceType;
-  createBy: null;
+  createBy: string;
   createTime: string;
   deptId: number;
   fdCameraId: number;

+ 18 - 1
src/router.ts

@@ -1,5 +1,7 @@
 import { RouteRecordRaw, createRouter, createWebHashHistory } from "vue-router";
 import { gHeaders } from "./request/state";
+import { UserStatus, userStatus } from "./store/user";
+import { watchEffect } from "vue";
 
 const history = createWebHashHistory();
 const routes: RouteRecordRaw[] = [
@@ -105,15 +107,30 @@ export const setDocTitle = (title: string) => {
   document.title = title + "-不移动动文物管理平台";
 };
 
+watchEffect(() => {
+  const routeName = router.currentRoute.value.name?.toString();
+  if (routeName === "login" && userStatus.value === UserStatus.LOGINED) {
+    router.replace({ name: "relics" });
+  } else if (
+    routeName &&
+    routeName !== "login" &&
+    !routeName.includes("query") &&
+    userStatus.value === UserStatus.NOT_LOGIN
+  ) {
+    router.replace({ name: "login" });
+  }
+});
+
 router.beforeEach((to, _, next) => {
   if (!to.name || to.name === "main-layout") {
-    if (gHeaders.token) {
+    if (userStatus.value !== UserStatus.NOT_LOGIN) {
       router.replace({ name: "relics" });
     } else {
       router.replace({ name: "login" });
     }
     return;
   }
+
   if (to.meta?.title) {
     setDocTitle(to.meta.title as string);
   }

+ 3 - 1
src/store/relics.ts

@@ -8,7 +8,9 @@ export const relics = ref<Relics>();
 
 export const initRelics = async (relicsId: number) => {
   relics.value = await relicsInfoFetch(relicsId);
-  refreshScenes();
+  if (relics.value) {
+    refreshScenes();
+  }
 };
 export const updateRelicsName = async (name: string) => {
   await updateRelicsFetch({ ...relics.value!, name });

+ 15 - 7
src/store/scene.ts

@@ -8,14 +8,19 @@ import { computed, ref } from "vue";
 import { Scene, ScenePoint } from "@/request/type";
 import { gHeaders } from "@/request/state";
 import { relics } from "./relics";
-import { DeviceType as SceneType } from "./device";
+import { DeviceType, DeviceType as SceneType } from "./device";
 
 export type { Scene, ScenePoint };
 
 export const scenes = ref<Scene[]>([]);
 export const scenePoints = computed(() =>
   scenes.value.reduce((t, scene) => {
-    t.push(...scene.scenePos);
+    t.push(
+      ...scene.scenePos.map((point) => ({
+        ...point,
+        cameraType: scene.cameraType,
+      }))
+    );
     return t;
   }, [] as ScenePoint[])
 );
@@ -23,15 +28,17 @@ export const relicsId = computed(() => relics.value!.relicsId);
 
 // https://4dkankan.oss-cn-shenzhen.aliyuncs.com/scene_view_data/KJ-t-OgSx9XIrvNQ/images/panoramas/22.jpg?x-oss-process=image/resize,m_fixed,w_6144&171342528615
 
-export const getPointPano = (sceneCode: string, pid: number, tile = false) => {
+export const getPointPano = (point: ScenePoint, tile = false) => {
   if (tile) {
     const fileNames = new Array(6).fill(0);
     return fileNames.map(
       (_, i) =>
-        `https://4dkk.4dage.com/scene_view_data/${sceneCode}/images/tiles/4k/${pid}_skybox${i}.jpg`
+        `https://4dkk.4dage.com/scene_view_data/${point.sceneCode}/images/tiles/4k/${point.uuid}_skybox${i}.jpg`
     );
-  } else {
-    return `https://4dkankan.oss-cn-shenzhen.aliyuncs.com/scene_view_data/${sceneCode}/images/panoramas/${pid}.jpg`;
+  } else if (point.cameraType === DeviceType.VR) {
+    return `https://4dkankan.oss-cn-shenzhen.aliyuncs.com/scene_view_data/${point.sceneCode}/images/panoramas/${point.uuid}.jpg`;
+  } else if (point.cameraType === DeviceType.CLUNT) {
+    return `https://4dkk.4dage.com/scene_view_data/${point.sceneCode}/images/pan/high/${point.uuid}.jpg`;
   }
 };
 export const refreshScenes = async () => {
@@ -64,7 +71,8 @@ export const gotoScene = (scene: Scene, edit = false) => {
   if (scene.sceneCode.startsWith("KJ")) {
     params.set("id", scene.sceneCode);
     window.open(
-      `https://www.4dkankan.com/panorama/show.html?` + params.toString()
+      `https://www.4dkankan.com/panorama/${edit ? "edit" : "show"}.html?` +
+        params.toString()
     );
   } else {
     params.set("m", scene.sceneCode);

+ 11 - 1
src/store/user.ts

@@ -5,6 +5,12 @@ import { encodePwd } from "@/util";
 import { ref } from "vue";
 
 export const user = ref<UserInfo>();
+export enum UserStatus {
+  NOT_LOGIN,
+  LOGINED,
+  UNKNOWN,
+}
+export const userStatus = ref<UserStatus>(UserStatus.UNKNOWN);
 
 export const login = async (props: LoginProps) => {
   const data = await loginFetch({
@@ -14,15 +20,17 @@ export const login = async (props: LoginProps) => {
   user.value = data.user;
   gHeaders.token = data.token;
   localStorage.setItem("token", data.token);
-  getUserInfo();
+  await getUserInfo();
 };
 
 export const logout = () => {
   localStorage.removeItem("token");
+  userStatus.value = UserStatus.NOT_LOGIN;
 };
 
 export const getUserInfo = async () => {
   user.value = await userInfoFetch();
+  userStatus.value = UserStatus.LOGINED;
 };
 
 errorHook.push((code) => {
@@ -34,4 +42,6 @@ const token = localStorage.getItem("token");
 if (token) {
   gHeaders.token = token;
   getUserInfo();
+} else {
+  userStatus.value = UserStatus.NOT_LOGIN;
 }

+ 35 - 28
src/util/pc4xlsl.ts

@@ -26,38 +26,45 @@ const genXLSLByTemp = (data: ArrayBuffer, tabs: any[][], name: string) => {
   return saveAs(blob, `${name}.xls`);
 };
 
-export const downloadPointsXLSL = async (
+export const downloadPointsXLSL1 = async (
+  points: number[][],
+  desc: { title: string; desc: string }[] = [],
+  name: string
+) => {
+  const temp = await fetch("/templaten.xls").then((r) => r.arrayBuffer());
+  const tabs = points.map((point, i) => {
+    const des = desc[i] || { title: "无", desc: "无" };
+    return [i, des.title, toDegrees(point[1], 4), toDegrees(point[0], 4)];
+  });
+
+  await genXLSLByTemp(temp, tabs, name);
+};
+
+export const downloadPointsXLSL2 = async (
   points: number[][],
   desc: { title: string; desc: string }[] = [],
   name: string
 ) => {
-  const temps = await Promise.all([
-    fetch("/templaten.xls").then((r) => r.arrayBuffer()),
-    fetch("/本体边界坐标.xls").then((r) => r.arrayBuffer()),
-  ]);
-  const tabsArray = [
-    points.map((point, i) => {
-      const des = desc[i] || { title: "无", desc: "无" };
-      return [i, des.title, toDegrees(point[1], 4), toDegrees(point[0], 4)];
-    }),
-    points.map((point, i) => {
-      const des = desc[i] || { title: "无", desc: "无" };
-      return [
-        toDegrees(point[1], 4),
-        toDegrees(point[0], 4),
-        round(point[2], 4),
-        des.title,
-        des.desc,
-      ];
-    }),
-  ];
-  console.log(tabsArray);
-  const names = [name, name + "本体边界坐标"];
+  const temp = await fetch("/本体边界坐标.xls").then((r) => r.arrayBuffer());
+  const tabs = points.map((point, i) => {
+    const des = desc[i] || { title: "无", desc: "无" };
+    return [
+      toDegrees(point[1], 4),
+      toDegrees(point[0], 4),
+      round(point[2], 4),
+      des.title,
+      des.desc,
+    ];
+  });
 
-  await Promise.all([
-    genXLSLByTemp(temps[0], tabsArray[0], names[0]),
-    genXLSLByTemp(temps[1], tabsArray[1], names[1]),
-  ]);
+  await genXLSLByTemp(temp, tabs, name);
+};
 
-  console.log(tabsArray);
+export const downloadPointsXLSL = async (
+  points: number[][],
+  desc: { title: string; desc: string }[] = [],
+  name: string
+) => {
+  downloadPointsXLSL1(points, desc, name);
+  downloadPointsXLSL2(points, desc, name + "本体边界坐标");
 };

+ 7 - 2
src/view/device-edit.vue

@@ -1,7 +1,12 @@
 <template>
   <el-form label-width="100px">
-    <el-form-item label="sn:" required>
-      <el-input v-model="data.sn" style="width: 250px" :maxlength="500" />
+    <el-form-item label="SN:" required>
+      <el-input
+        v-model="data.sn"
+        style="width: 250px"
+        :maxlength="500"
+        placeholder="请输入"
+      />
     </el-form-item>
   </el-form>
 </template>

+ 11 - 5
src/view/device.vue

@@ -3,8 +3,12 @@
     <div class="relics-header">
       <div class="search">
         <el-form label-width="100px" inline>
-          <el-form-item label="sn码:">
-            <el-input v-model="pageProps.cameraSn" style="width: 250px" />
+          <el-form-item label="SN码:">
+            <el-input
+              v-model="pageProps.cameraSn"
+              style="width: 250px"
+              placeholder="请输入"
+            />
           </el-form-item>
           <el-form-item label="设备类型:">
             <el-select style="width: 250px" v-model="pageProps.cameraType">
@@ -39,6 +43,7 @@
       </el-table-column>
       <!-- <el-table-column label="所属单位" prop="deptId"></el-table-column> -->
       <el-table-column label="绑定账号" prop="userName"> </el-table-column>
+      <el-table-column label="创建人" prop="createBy"> </el-table-column>
       <el-table-column label="创建时间" prop="createTime" v-slot:default="{ row }">
         {{ row.createTime && row.createTime.substr(0, 16) }}
       </el-table-column>
@@ -54,11 +59,12 @@
     <div class="pag-layout">
       <el-pagination
         background
-        layout="prev, pager, next"
+        layout="prev, pager, next, sizes, jumper"
+        v-model:page-size="pageProps.pageSize"
+        :page-sizes="[10, 20, 50, 100]"
         :total="total"
         @current-change="(data: number) => pageProps.pageNum = data"
         :current-page="pageProps.pageNum"
-        :page-size="pageProps.pageSize"
       />
     </div>
   </div>
@@ -79,7 +85,7 @@ import { deviceEdit } from "./quisk";
 
 const initProps: DevicePageProps = {
   pageNum: 1,
-  pageSize: 12,
+  pageSize: 10,
 };
 const pageProps = ref({ ...initProps });
 const total = ref<number>(0);

+ 1 - 1
src/view/layout/slide/index.vue

@@ -18,7 +18,7 @@
 import subMenu from "./submenu.vue";
 import { router, findRoute } from "@/router";
 
-const names = ["relics", "scene", "device"];
+const names = ["scene", "relics", "device"];
 const routes = names.map((name) => findRoute(name)!);
 </script>
 

+ 19 - 21
src/view/map/map-right.vue

@@ -2,13 +2,13 @@
   <div class="right-layout">
     <div class="right-content">
       <el-form :inline="false" v-if="router.currentRoute.value.name === 'map'">
-        <el-form-item v-if="relics">
+        <!-- <el-form-item v-if="relics">
           <el-input v-model="relicsName" :maxlength="50" placeholder="不可移动文物名称">
             <template #append>
               <el-button type="primary" @click="updateRelics">修改</el-button>
             </template>
           </el-input>
-        </el-form-item>
+        </el-form-item> -->
         <el-form-item>
           <el-button type="primary" :icon="Plus" style="width: 100%" @click="addHandler">
             添加场景
@@ -81,22 +81,24 @@
       type="primary"
       :icon="Document"
       style="width: 100%"
-      @click="exportFile(getSelectPoints())"
+      @click="exportFile(getSelectPoints(), 2)"
     >
-      导出四普数据
+      导出本体边界坐标
+    </el-button>
+    <el-button
+      type="primary"
+      :icon="Document"
+      style="width: 100%; margin-top: 20px; margin-left: 0"
+      @click="exportFile(getSelectPoints(), 1)"
+    >
+      导出绘制矢量数据
     </el-button>
 
     <el-button
       type="primary"
       :icon="Document"
       style="width: 100%; margin-top: 20px; margin-left: 0"
-      @click="
-        exportImage(
-          getSelectPoints().filter(
-            (point) => getPointSelect(point)?.cameraType === DeviceType.VR
-          )
-        )
-      "
+      @click="exportImage(getSelectPoints())"
     >
       下载全景图
     </el-button>
@@ -132,14 +134,13 @@ import {
   relicsId,
   refreshScenes,
 } from "@/store/scene";
-import { relics, updateRelicsName } from "@/store/relics";
+import { relics } from "@/store/relics";
 import SingleInput from "@/components/single-input.vue";
 import { ElMessage } from "element-plus";
 import { router } from "@/router";
 import { selectScenes } from "../quisk";
 import { addRelicsSceneFetch, delRelicsSceneFetch } from "@/request";
 import { exportFile, exportImage } from "./pc4Helper";
-import { DeviceType } from "@/store/device";
 
 const emit = defineEmits<{
   (e: "flyScene", data: Scene): void;
@@ -154,10 +155,10 @@ const updatePointName = async (title: string) => {
 
 const relicsName = ref("");
 watchEffect(() => (relicsName.value = relics.value?.name || ""));
-const updateRelics = async () => {
-  await updateRelicsName(relicsName.value);
-  ElMessage.success("修改成功");
-};
+// const updateRelics = async () => {
+//   await updateRelicsName(relicsName.value);
+//   ElMessage.success("修改成功");
+// };
 
 const treeRef = ref<any>();
 const treeNode = computed(() =>
@@ -172,7 +173,7 @@ const treeNode = computed(() =>
       disable: !pos.pos || pos.pos.length === 0,
       id: pos.id,
       type: "point",
-      raw: pos,
+      raw: { ...pos, cameraType: scene.cameraType },
     })),
   }))
 );
@@ -183,9 +184,6 @@ const getSelectPoints = () =>
     .filter((option: any) => option.type === "point")
     .map((option: any) => option.raw) as ScenePoint[];
 
-const getPointSelect = (point: ScenePoint) =>
-  scenes.value.find((scene) => scene.sceneCode === point.sceneCode);
-
 const addHandler = async () => {
   const sceneCodes = scenes.value.map((scene) => scene.sceneCode);
   await selectScenes({

+ 24 - 11
src/view/map/map.vue

@@ -1,10 +1,16 @@
 <template>
   <div class="map-layout">
-    <div id="map" class="map-container" ref="container" :class="{ active: !!active }">
+    <div
+      id="map"
+      class="map-container"
+      ref="container"
+      :class="{ active: !!activeId }"
+      @mousedown="activeId = null"
+    >
       <div class="map-component">
         <el-tooltip
           class="tooltip"
-          :visible="!!active"
+          :visible="!!activeId"
           :content="active?.name"
           effect="light"
           placement="top"
@@ -46,7 +52,10 @@ import { computed, onMounted, ref, watchEffect, watch } from "vue";
 import { Manage } from "./manage";
 
 const center = [109.47293862712675, 30.26530938156551];
-const active = ref<ScenePoint | null>();
+const activeId = ref<ScenePoint["id"] | null>();
+const active = computed(() =>
+  scenePoints.value.find((point) => point.id === activeId.value)
+);
 const activePixel = ref<number[] | null>();
 const triggerRef = ref({
   getBoundingClientRect() {
@@ -86,10 +95,10 @@ onMounted(() => {
   mapManage.setCenter(center);
   mapManage.hotsBus.on("active", (id) => {
     if (id) {
-      const point = scenePoints.value.find((point) => point.id === id);
-      point && activeScenePoint(point);
+      activeId.value = id;
+      active.value && activeScenePoint(active.value!);
     } else {
-      active.value = null;
+      activeId.value = null;
       activePixel.value = null;
     }
   });
@@ -103,7 +112,7 @@ onMounted(() => {
 
 const activeScenePoint = (point: ScenePoint) => {
   activePixel.value = mapManage.map.getPixelFromCoordinate(point.pos);
-  active.value = point;
+  activeId.value = point.id;
 };
 
 const flyPos = (pos: number[]) => mapManage.map.getView().setCenter(pos);
@@ -143,10 +152,14 @@ const refreshTileType = () => {
 watch(points, refreshHots, { immediate: true });
 watch(tileType, refreshTileType, { immediate: true });
 watch(
-  () => router.currentRoute.value.name,
-  () => {
-    if (["map", "query-map"].includes(router.currentRoute.value.name as string)) {
-      initRelics(Number(router.currentRoute.value.params.relicsId)).then(() => {
+  () => [router.currentRoute.value.name, router.currentRoute.value.params?.relicsId],
+  ([name, rid]) => {
+    if (["map", "query-map"].includes(name as string)) {
+      relics.value = undefined;
+      initRelics(Number(rid)).then(() => {
+        if (!relics.value) {
+          router.replace({ name: "relics" });
+        }
         scenes.value.length && flyScene(scenes.value[0]);
       });
     }

+ 27 - 10
src/view/map/pc4Helper.ts

@@ -4,9 +4,13 @@ import saveAs from "@/util/file-serve";
 import { openLoading, closeLoading } from "@/helper/loading";
 import { dateFormat } from "@/util";
 import { ElMessage } from "element-plus";
-import { downloadPointsXLSL } from "@/util/pc4xlsl";
+import {
+  downloadPointsXLSL,
+  downloadPointsXLSL1,
+  downloadPointsXLSL2,
+} from "@/util/pc4xlsl";
 
-export const exportFile = async (points: ScenePoint[]) => {
+export const exportFile = async (points: ScenePoint[], type: number) => {
   if (!points.length) {
     ElMessage.error("请选择要导出的点位");
     return;
@@ -17,28 +21,41 @@ export const exportFile = async (points: ScenePoint[]) => {
     ElMessage.error("当前选择点位没有gis信息");
     return;
   }
-  await downloadPointsXLSL(
-    points.map((point) => point.pos),
-    points.map((point) => ({ title: point.name, desc: point.name })),
-    "test"
-  );
+  if (type === 1) {
+    await downloadPointsXLSL1(
+      points.map((point) => point.pos),
+      points.map((point) => ({ title: point.name, desc: point.name })),
+      "绘制矢量数据"
+    );
+  } else if (type === 2) {
+    await downloadPointsXLSL2(
+      points.map((point) => point.pos),
+      points.map((point) => ({ title: point.name, desc: point.name })),
+      "本地边界坐标"
+    );
+  } else {
+    await downloadPointsXLSL(
+      points.map((point) => point.pos),
+      points.map((point) => ({ title: point.name, desc: point.name })),
+      "test"
+    );
+  }
   ElMessage.success("文件导出成功");
 };
 
 export const exportImage = async (points: ScenePoint[]) => {
-  openLoading();
-
   if (!points.length) {
     ElMessage.error("请选择要导出的点位");
     return;
   }
 
+  openLoading();
   const zip = new JSZip();
   const imgFolder = zip.folder("images")!;
 
   const downloadImages = Promise.all(
     points.map((point) => {
-      const url = getPointPano(point.sceneCode, point.uuid);
+      const url = getPointPano(point);
       return fetch(url as string)
         .then((res) => res.blob())
         .then((blob) => {

+ 1 - 6
src/view/pano/pano.vue

@@ -66,12 +66,7 @@ watchEffect(() => {
 
 const panoUrls = computed(() => {
   return (
-    point.value &&
-    getPointPano(
-      point.value.sceneCode,
-      Number(point.value.uuid),
-      point.value.cameraType === DeviceType.CLUNT
-    )
+    point.value && getPointPano(point.value, point.value.cameraType === DeviceType.CLUNT)
   );
 });
 const update = ref(false);

+ 2 - 2
src/view/quisk.ts

@@ -4,8 +4,8 @@ import DeviceEdit from "./device-edit.vue";
 import SceneSelect from "./scene-select.vue";
 
 export const relicsEdit = quiskMountFactory(RelicsEdit, {
-  title: "添加文物保护单位",
-  width: 486,
+  title: "创建文物",
+  width: 520,
 });
 export const deviceEdit = quiskMountFactory(DeviceEdit, {
   title: "添加设备",

+ 37 - 9
src/view/relics-edit.vue

@@ -1,13 +1,23 @@
 <template>
   <el-form label-width="100px">
     <el-form-item label="文物名称:" required>
-      <el-input v-model="data.name" style="width: 250px" :maxlength="500" />
+      <el-input
+        v-model.trim="data.name"
+        style="width: 100%"
+        :maxlength="500"
+        placeholder="请输入"
+      />
     </el-form-item>
     <el-form-item label="文物编号:">
-      <el-input v-model="data.unicode" style="width: 250px" :maxlength="500" />
+      <el-input
+        v-model="data.unicode"
+        style="width: 100%"
+        :maxlength="500"
+        placeholder="请输入字母或数字组合"
+      />
     </el-form-item>
     <el-form-item label="文物级别:">
-      <el-select style="width: 250px" v-model="data.level">
+      <el-select style="width: 100%" v-model="data.level">
         <el-option
           :value="Number(key)"
           :label="type"
@@ -16,7 +26,7 @@
       </el-select>
     </el-form-item>
     <el-form-item label="类别:">
-      <el-select style="width: 250px" v-model="data.category">
+      <el-select style="width: 100%" v-model="data.category">
         <el-option
           :value="Number(key)"
           :label="type"
@@ -25,7 +35,14 @@
       </el-select>
     </el-form-item>
     <el-form-item label="文物地址:">
-      <el-input v-model="data.address" style="width: 250px" :maxlength="500" />
+      <el-input
+        v-model="data.address"
+        style="width: 100%"
+        :maxlength="500"
+        show-word-limit
+        type="textarea"
+        placeholder="请输入"
+      />
     </el-form-item>
   </el-form>
 </template>
@@ -34,7 +51,7 @@
 import { QuiskExpose } from "@/helper/mount";
 import { Relics, relicsLevelDesc, relicsTypeDesc } from "@/store/relics";
 import { ElMessage } from "element-plus";
-import { computed, ref } from "vue";
+import { computed, ref, watch } from "vue";
 
 const props = defineProps<{
   relics?: Relics;
@@ -42,12 +59,23 @@ const props = defineProps<{
 }>();
 const data = ref<Relics>(props.relics ? { ...props.relics } : { name: "", relicsId: -1 });
 
+watch(
+  () => data.value.unicode,
+  (newv, oldv) => {
+    if (newv && !/^[a-zA-Z0-9]+$/.test(newv)) {
+      data.value.unicode = newv.replace(/[^a-zA-Z0-9]+/gi, "");
+      console.log(oldv);
+      ElMessage.error("文物编号仅支持字母或数字组合");
+    }
+  }
+);
+
 defineExpose<QuiskExpose>({
-  title: computed(() => `${props.relics ? "修改" : "添加"}文物保护单位`),
+  title: computed(() => `${props.relics ? "修改" : "添加"}文物`),
   async submit() {
     if (!data.value.name) {
-      ElMessage.error("请输入名称!");
-      throw "请输入名称!";
+      ElMessage.error("请输入文物名称!");
+      throw "请输入文物名称!";
     }
     props.submit(data.value);
   },

+ 19 - 8
src/view/relics.vue

@@ -3,8 +3,12 @@
     <div class="relics-header">
       <div class="search">
         <el-form label-width="100px" inline>
-          <el-form-item label="名称:">
-            <el-input v-model="pageProps.name" style="width: 250px" />
+          <el-form-item label="文物名称:">
+            <el-input
+              v-model="pageProps.name"
+              style="width: 250px"
+              placeholder="请输入"
+            />
           </el-form-item>
           <el-form-item label="文物级别:">
             <el-select style="width: 250px" v-model="pageProps.level">
@@ -29,7 +33,7 @@
             <el-button type="primary" plain @click="pageProps = { ...initProps }">
               重置
             </el-button>
-            <el-button type="primary" @click="addHandler">新增</el-button>
+            <el-button type="primary" @click="addHandler">创建文物</el-button>
           </el-form-item>
         </el-form>
       </div>
@@ -41,7 +45,11 @@
     <el-table :data="relicsArray" border>
       <el-table-column prop="name" label="文物保护单位名称" />
       <el-table-column prop="unicode" label="文物编号" />
-      <el-table-column prop="name" label="类别" v-slot:default="{ row }: { row: Relics }">
+      <el-table-column
+        prop="name"
+        label="文物级别"
+        v-slot:default="{ row }: { row: Relics }"
+      >
         {{ relicsLevelDesc[row.level!] }}
       </el-table-column>
       <el-table-column prop="name" label="类别" v-slot:default="{ row }: { row: Relics }">
@@ -85,7 +93,9 @@
     <div class="pag-layout">
       <el-pagination
         background
-        layout="prev, pager, next"
+        layout="prev, pager, next, sizes, jumper"
+        v-model:page-size="pageProps.pageSize"
+        :page-sizes="[10, 20, 50, 100]"
         :total="total"
         @current-change="(data: number) => pageProps.pageNum = data"
         :current-page="pageProps.pageNum"
@@ -117,7 +127,7 @@ import { relicsEdit } from "./quisk";
 
 const initProps: RelicsPageProps = {
   pageNum: 1,
-  pageSize: 12,
+  pageSize: 10,
 };
 const pageProps = ref({ ...initProps });
 const total = ref<number>(0);
@@ -143,8 +153,9 @@ const getQueryRouteLocation = (row: Relics) =>
 
 const shareHandler = async (row: Relics) => {
   const link = location.origin + location.pathname + getQueryRouteLocation(row).href;
-  await copyText(link);
-  await ElMessage.success("链接复制成功");
+  window.open(link);
+  // await copyText(link);
+  // await ElMessage.success("链接复制成功");
 };
 
 const addHandler = async () => {

+ 30 - 11
src/view/scene.vue

@@ -3,15 +3,27 @@
     <div class="relics-header">
       <div class="search">
         <el-form label-width="100px" inline>
-          <el-form-item label="名称:">
-            <el-input v-model="pageProps.sceneName" style="width: 250px" />
+          <el-form-item label="场景名称:">
+            <el-input
+              v-model="pageProps.sceneName"
+              style="width: 250px"
+              placeholder="请输入"
+            />
           </el-form-item>
           <el-form-item label="场景码:">
-            <el-input v-model="pageProps.sceneCode" style="width: 250px" />
+            <el-input
+              v-model="pageProps.sceneCode"
+              style="width: 250px"
+              placeholder="请输入"
+            />
           </el-form-item>
           <template v-if="!simple">
-            <el-form-item label="sn码:">
-              <el-input v-model="pageProps.snCode" style="width: 250px" />
+            <el-form-item label="SN码:">
+              <el-input
+                v-model="pageProps.snCode"
+                style="width: 250px"
+                placeholder="请输入"
+              />
             </el-form-item>
             <el-form-item label="设备类型:">
               <el-select style="width: 250px" v-model="pageProps.cameraType">
@@ -26,13 +38,19 @@
               <el-date-picker
                 type="daterange"
                 v-model="pageProps.algorithmTime"
+                start-placeholder="请选择"
+                end-placeholder="请选择"
                 range-separator="-"
                 placeholder="请选择"
                 style="width: 250px"
               />
             </el-form-item>
             <el-form-item label="绑定账号:">
-              <el-input v-model="pageProps.userName" style="width: 250px" />
+              <el-input
+                v-model="pageProps.userName"
+                style="width: 250px"
+                placeholder="请输入"
+              />
             </el-form-item>
             <el-form-item v-if="!simple">
               <el-button type="primary" @click="refresh">查询</el-button>
@@ -62,10 +80,10 @@
         {{ DeviceTypeDesc[row.cameraType as DeviceType] }}
       </el-table-column>
       <el-table-column label="拍摄时间" prop="algorithmTime" v-slot:default="{ row }">
-        {{ row.algorithmTime && row.algorithmTime.substr(0, 16) }}
+        {{ row.createTime && row.createTime.substr(0, 16) }}
       </el-table-column>
       <el-table-column label="计算完成时间" prop="createTime" v-slot:default="{ row }">
-        {{ row.createTime && row.createTime.substr(0, 16) }}
+        {{ row.algorithmTime && row.algorithmTime.substr(0, 16) }}
       </el-table-column>
       <el-table-column label="点位数量" prop="shootCount"></el-table-column>
       <el-table-column label="拍摄位置" prop="gpsInfo"></el-table-column>
@@ -90,11 +108,12 @@
     <div class="pag-layout">
       <el-pagination
         background
-        layout="prev, pager, next"
+        layout="prev, pager, next, sizes, jumper"
+        v-model:page-size="pageProps.pageSize"
+        :page-sizes="[10, 20, 50, 100]"
         :total="total"
         @current-change="(data: number) => pageProps.pageNum = data"
         :current-page="pageProps.pageNum"
-        :page-size="pageProps.pageSize"
       />
     </div>
   </div>
@@ -118,7 +137,7 @@ const props = defineProps<{ tableProps?: { [key in string]: any }; simple?: bool
 
 const initProps: ScenePageProps = {
   pageNum: 1,
-  pageSize: 12,
+  pageSize: 10,
 };
 const pageProps = ref({ ...initProps });
 const total = ref<number>(0);