gemercheung 8 miesięcy temu
rodzic
commit
279f9d88ff

+ 1 - 1
.env.development

@@ -1,4 +1,4 @@
 VITE_QJ_URL=https://test.4dkankan.com/panorama
 VITE_LASER_URL=https://uat-laser.4dkankan.com/4pc
 VITE_API=http://192.168.9.27/
-VITE_4DKK_URL=https://test.4dkankan.com
+VITE_4DKK_URL=http://192.168.9.27

+ 2 - 0
.gitignore

@@ -12,6 +12,8 @@ dist
 dist-ssr
 *.local
 
+.idea
+
 # Editor directories and files
 .vscode/*
 !.vscode/extensions.json

Plik diff jest za duży
+ 1463 - 1064
pnpm-lock.yaml


+ 2 - 0
src/request/URL.ts

@@ -59,3 +59,5 @@ export const updateDrawing = `/relics/relics/drawing/update`;
 
 //token
 export const getFdTokenByNum = `/relics/scene/getFdTokenByNum?num=`;
+
+

+ 6 - 0
src/router.ts

@@ -118,6 +118,12 @@ const routes: RouteRecordRaw[] = [
         meta: { title: "单位用户", svgIcon: 'yhgl' },
         component: () => import("@/view/org-users/users.vue"),
       },
+      {
+        path: "artifacts",
+        name: "artifacts",
+        meta: { title: "文物管理", svgIcon: "wwpc" },
+        component: () => import("@/view/artifacts/index.vue"),
+      },
     ],
   },
   {

+ 60 - 0
src/view/artifacts/addArtifacts.vue

@@ -0,0 +1,60 @@
+<template>
+
+  <el-form label-width="100px">
+    <el-form-item label="文物名称:" required>
+      <el-input
+          v-model.trim="data.name"
+          style="width: 100%"
+          :maxlength="100"
+          placeholder="请输入"
+      />
+    </el-form-item>
+    <el-form-item label="文物类别:" required>
+      <el-select style="width: 100%" v-model="data.category" clearable >
+        <el-option
+            :value="Number(key)"
+            :label="type"
+            v-for="(type, key) in relicsTypeDesc"
+        />
+      </el-select>
+    </el-form-item>
+    <el-form-item label="时代:" required>
+      <el-input
+          v-model.trim="data.period"
+          style="width: 100%"
+          :maxlength="100"
+          placeholder="请输入"
+      />
+    </el-form-item>
+
+  </el-form>
+
+</template>
+<script lang="ts" setup>
+import {QuiskExpose} from "@/helper/mount.ts";
+import {computed, ref} from "vue";
+import {relicsTypeDesc} from "@/store/relics.ts";
+// import {ElMessage} from "element-plus";
+
+const props = defineProps<{
+  data?: any;
+  submit: (data: any) => Promise<void>;
+}>();
+
+const data = ref({
+  name: "",
+  period: '',
+  category: ""
+})
+
+defineExpose<QuiskExpose>({
+  title: computed(() => `新增文物`),
+  async submit() {
+
+  },
+});
+</script>
+<style lang="scss" scoped>
+
+
+</style>

+ 196 - 0
src/view/artifacts/index.vue

@@ -0,0 +1,196 @@
+<template>
+  <div class="artifacts-layout">
+    <div class="artifacts-header">
+      <div class="search">
+
+        <div class="action-group">
+          <el-button type="primary" @click="addHandler">
+            新增文物
+          </el-button>
+        </div>
+
+      </div>
+
+    </div>
+
+    <div class="artifacts-content">
+      <el-table :data="relicsArray" border>
+        <el-table-column
+            prop="name"
+            label="文物名称"
+            v-slot:default="{ row }: { row: Relics }"
+        >
+<!--          <a class="link" @click="shareHandler(row)">-->
+<!--           -->
+<!--          </a>-->
+          <TexToolTip :text="row.name"/>
+        </el-table-column>
+
+        <el-table-column
+            prop="unicode"
+            label="时代"
+            v-slot:default="{ row }: { row: Relics }"
+        >
+          <TexToolTip :text="row.unicode" v-if="row.unicode"/>
+        </el-table-column>
+
+        <el-table-column label="文物级别" v-slot:default="{ row }: { row: Relics }">
+          <TexToolTip :text="relicsLevelDesc[row.level!]"/>
+        </el-table-column>
+        <el-table-column label="类别" v-slot:default="{ row }: { row: Relics }">
+          <TexToolTip :text="relicsTypeDesc[row.category!]"/>
+        </el-table-column>
+        <el-table-column label="文物地址" v-slot:default="{ row }: { row: Relics }">
+          <TexToolTip :text="row.address"/>
+        </el-table-column>
+
+        <el-table-column label="创建时间" v-slot:default="{ row }">
+          <TexToolTip :text="row.createTime.substr(0, 16)" v-if="row.createTime"/>
+        </el-table-column>
+        <el-table-column prop="userName" label="创建人账号" v-slot:default="{ row }">
+          <TexToolTip :text="row.userName"/>
+        </el-table-column>
+
+        <el-table-column label="操作" width="240" fixed="right">
+          <template #default="{ row }">
+
+            <el-button link type="primary" size="small" @click="editHandler(row)">
+              编辑
+            </el-button>
+
+            <el-button link type="danger" @click="delHandler(row.relicsId)" size="small">
+              删除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="pag-layout">
+      <el-pagination
+          background
+          layout="total, 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"
+      />
+    </div>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import {onActivated, ref, watch} from "vue";
+import {
+  relicsPageFetch,
+  RelicsPageProps,
+  delRelicsFetch,
+  updateRelicsFetch,
+} from "@/request";
+import {
+  Relics,
+  relicsLevelDesc,
+  relicsTypeDesc,
+  creationMethodDesc,
+} from "@/store/relics";
+import {COORD_NAME, router} from "@/router";
+import {ElMessageBox} from "element-plus";
+import {relicsEdit, addArtifacts} from "./quisk";
+import TexToolTip from "@/components/tex-tooltip.vue";
+import {debounce} from "@/util";
+import {QUERY_COORD_NAME} from "@/router";
+
+
+const initProps: RelicsPageProps = {
+  pageNum: 1,
+  pageSize: 10,
+};
+const pageProps = ref({...initProps});
+const total = ref<number>(0);
+const relicsArray = ref<Relics[]>([]);
+
+const refresh = debounce(async () => {
+  const data = await relicsPageFetch(pageProps.value);
+  total.value = data.total;
+  relicsArray.value = data.records;
+});
+
+const delHandler = async (relicsId: number) => {
+  const ok = await ElMessageBox.confirm("确定要删除吗", {
+    type: "warning",
+  });
+  if (ok) {
+    await delRelicsFetch(relicsId);
+    await refresh();
+  }
+};
+const getQueryRouteLocation = (row: Relics) =>
+    router.resolve({name: QUERY_COORD_NAME, params: {relicsId: row.relicsId}});
+
+const shareHandler = async (row: Relics) => {
+  const link = location.origin + location.pathname + getQueryRouteLocation(row).href;
+  window.open(link);
+  // await copyText(link);
+  // await ElMessage.success("链接复制成功");
+};
+
+const addHandler = async () => {
+  await addArtifacts({
+    submit: async (data) => {
+
+    },
+  });
+}
+
+const editHandler = async (relics: Relics) => {
+  await relicsEdit({
+    relics,
+    submit: async (data) => {
+      await updateRelicsFetch(data);
+      await refresh();
+    },
+  });
+};
+watch(pageProps, refresh, {deep: true, immediate: true});
+onActivated(refresh);
+
+const handleAddArtifact = () => {
+
+}
+
+</script>
+
+<style scoped lang="scss">
+.artifacts-layout {
+  height: 100%;
+  overflow-y: auto;
+  padding: 30px;
+
+  .action-group {
+    display: flex;
+    justify-content: flex-end
+  }
+}
+
+.pag-layout {
+  margin-top: 20px;
+  display: flex;
+  justify-content: center;
+}
+
+.artifacts-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 20px;
+
+  .search {
+    flex: 1;
+  }
+
+  .artifacts-oper {
+    flex: 0 0 100px;
+    text-align: right;
+  }
+}
+</style>
+  

+ 14 - 0
src/view/artifacts/quisk.ts

@@ -0,0 +1,14 @@
+import {quiskMountFactory} from "@/helper/mount";
+import RelicsEdit from "../relics-edit.vue";
+import AddArtifacts from "./addArtifacts.vue";
+
+
+export const relicsEdit = quiskMountFactory(RelicsEdit, {
+    title: "创建文物",
+    width: 520,
+});
+
+export const addArtifacts = quiskMountFactory(AddArtifacts, {
+    title: "创建文物",
+    width: 520,
+});

+ 194 - 0
src/view/artifactsDetail/index.vue

@@ -0,0 +1,194 @@
+<template>
+  <div class="artifacts-layout">
+    <div class="artifacts-header">
+      <div class="search">
+
+        <div class="action-group">
+          <el-button type="primary" >
+            新增文物
+          </el-button>
+        </div>
+      </div>
+
+    </div>
+
+    <div class="artifacts-content">
+      <el-table :data="relicsArray" border>
+        <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="时代"
+            v-slot:default="{ row }: { row: Relics }"
+        >
+          <TexToolTip :text="row.unicode" v-if="row.unicode"/>
+        </el-table-column>
+
+        <el-table-column label="文物级别" v-slot:default="{ row }: { row: Relics }">
+          <TexToolTip :text="relicsLevelDesc[row.level!]"/>
+        </el-table-column>
+        <el-table-column label="类别" v-slot:default="{ row }: { row: Relics }">
+          <TexToolTip :text="relicsTypeDesc[row.category!]"/>
+        </el-table-column>
+        <el-table-column label="文物地址" v-slot:default="{ row }: { row: Relics }">
+          <TexToolTip :text="row.address"/>
+        </el-table-column>
+
+        <el-table-column label="创建时间" v-slot:default="{ row }">
+          <TexToolTip :text="row.createTime.substr(0, 16)" v-if="row.createTime"/>
+        </el-table-column>
+        <el-table-column prop="userName" label="创建人账号" v-slot:default="{ row }">
+          <TexToolTip :text="row.userName"/>
+        </el-table-column>
+
+        <el-table-column label="操作" width="240" fixed="right">
+          <template #default="{ row }">
+
+            <el-button link type="primary" size="small" @click="editHandler(row)">
+              编辑
+            </el-button>
+
+            <el-button link type="danger" @click="delHandler(row.relicsId)" size="small">
+              删除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="pag-layout">
+      <el-pagination
+          background
+          layout="total, 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"
+      />
+    </div>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import {onActivated, ref, watch} from "vue";
+import {
+  relicsPageFetch,
+  RelicsPageProps,
+  delRelicsFetch,
+  updateRelicsFetch,
+} from "@/request";
+import {
+  Relics,
+  relicsLevelDesc,
+  relicsTypeDesc,
+
+} from "@/store/relics";
+import {COORD_NAME, router} from "@/router";
+import {ElMessageBox} from "element-plus";
+
+import TexToolTip from "@/components/tex-tooltip.vue";
+import {debounce} from "@/util";
+import {QUERY_COORD_NAME} from "@/router";
+
+
+const initProps: RelicsPageProps = {
+  pageNum: 1,
+  pageSize: 10,
+};
+const pageProps = ref({...initProps});
+const total = ref<number>(0);
+const relicsArray = ref<Relics[]>([]);
+
+const refresh = debounce(async () => {
+  const data = await relicsPageFetch(pageProps.value);
+  total.value = data.total;
+  relicsArray.value = data.records;
+});
+
+const delHandler = async (relicsId: number) => {
+  const ok = await ElMessageBox.confirm("确定要删除吗", {
+    type: "warning",
+  });
+  if (ok) {
+    await delRelicsFetch(relicsId);
+    await refresh();
+  }
+};
+const getQueryRouteLocation = (row: Relics) =>
+    router.resolve({name: QUERY_COORD_NAME, params: {relicsId: row.relicsId}});
+
+const shareHandler = async (row: Relics) => {
+  const link = location.origin + location.pathname + getQueryRouteLocation(row).href;
+  window.open(link);
+  // await copyText(link);
+  // await ElMessage.success("链接复制成功");
+};
+
+// const addHandler = async () => {
+//   await addArtifacts({
+//     submit: async (data) => {
+//
+//     },
+//   });
+// }
+
+const editHandler = async (relics: Relics) => {
+  await relicsEdit({
+    relics,
+    submit: async (data) => {
+      await updateRelicsFetch(data);
+      await refresh();
+    },
+  });
+};
+watch(pageProps, refresh, {deep: true, immediate: true});
+onActivated(refresh);
+
+const handleAddArtifact = () => {
+
+}
+
+</script>
+
+<style scoped lang="scss">
+.artifacts-layout {
+  height: 100%;
+  overflow-y: auto;
+  padding: 30px;
+
+  .action-group {
+    display: flex;
+    justify-content: flex-end
+  }
+}
+
+.pag-layout {
+  margin-top: 20px;
+  display: flex;
+  justify-content: center;
+}
+
+.artifacts-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 20px;
+
+  .search {
+    flex: 1;
+  }
+
+  .artifacts-oper {
+    flex: 0 0 100px;
+    text-align: right;
+  }
+}
+</style>
+  

+ 18 - 17
src/view/layout/slide/index.vue

@@ -1,32 +1,32 @@
 <template>
   <div class="slide">
     <el-menu
-      :default-active="(router.currentRoute.value.name as string)"
-      @select="(name: string) => router.push({ name })"
-      style="border-right: none"
+        :default-active="(router.currentRoute.value.name as string)"
+        @select="(name: string) => router.push({ name })"
+        style="border-right: none"
     >
       <sub-menu
-        v-for="route in routes"
-        :meta="route.meta"
-        v-show="!route.meta.hidden"
-        :name="(route.name as string)"
-        :key="route.name"
+          v-for="route in routes"
+          :meta="route.meta"
+          v-show="!route.meta.hidden"
+          :name="(route.name as string)"
+          :key="route.name"
       />
     </el-menu>
   </div>
 </template>
 
 <script setup lang="ts">
-import { computed } from "vue";
+import {computed} from "vue";
 import subMenu from "./submenu.vue";
-import { user } from "@/store/user";
+import {user} from "@/store/user";
 
-import { router, findRoute } from "@/router";
+import {router, findRoute} from "@/router";
 //@TODO
 
 const isSuper = computed(
-  () =>
-    user.value.roles.filter((item) => item.roleKey === "super_admin").length > 0
+    () =>
+        user.value.roles.filter((item) => item.roleKey === "super_admin").length > 0
 );
 
 const isORG = computed(() => user.value.type === 1);
@@ -54,15 +54,16 @@ const super_names = [
   "organization",
   "users",
   "org-users",
+  "artifacts",
   "no-persession",
 ];
 console.log("isSuper", isSuper.value);
 
 const routes = isSuper.value
-  ? super_names.map((name) => findRoute(name)!)
-  : isORG.value
-  ? normal_name_org.map((name) => findRoute(name)!)
-  : normal_name.map((name) => findRoute(name)!);
+    ? super_names.map((name) => findRoute(name)!)
+    : isORG.value
+        ? normal_name_org.map((name) => findRoute(name)!)
+        : normal_name.map((name) => findRoute(name)!);
 </script>
 
 <style lang="scss" scoped>