Explorar el Código

feat: add two modules org and users

gemercheung hace 1 año
padre
commit
171717bd01

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 310 - 278
pnpm-lock.yaml


+ 17 - 0
src/request/URL.ts

@@ -23,3 +23,20 @@ export const exportVectorData = `/relics/excel/vectorData`;
 export const getDevicePage = `/relics/camera/page`;
 export const delDevice = `/relics/camera/del/:deviceId`;
 export const addDevice = `/relics/camera/add`;
+
+// organization
+export const organizationPage = `//relics/org/page`;
+export const addOrganization = `/relics/org/add`;
+export const delOrganization= `/relics/org/del`;
+export const getOrganizationDetail = `/relics/org/info//:orgId`;
+export const alterOrganization = `/relics/org/update`;
+
+
+// users
+export const addUser = `/relics/relics-scene/addUser`;
+export const changeUserStatus= `/relics/relics-scene/changeStatus`;
+export const delUser= `/relics/relics-scene/del/{id}`;
+export const alterUser= `/relics/relics-scene/edit`;
+export const getUserSceneInfo= `/relics/relics-scene/getUserInfo`;
+export const getUserInfoById= `/relics/relics-scene/info/{id}`;
+export const userScenepage= `/relics/relics-scene/page`;

+ 6 - 3
src/request/index.ts

@@ -47,9 +47,9 @@ export const sendFetch = <T>(
     ...init,
     headers: headers
       ? {
-          ...headers,
-          ...gHeaders,
-        }
+        ...headers,
+        ...gHeaders,
+      }
       : gHeaders,
   })
     .then((res) => {
@@ -300,3 +300,6 @@ export const addDeviceFetch = (sn: string) =>
     method: "post",
     body: JSON.stringify({ cameraSn: sn }),
   });
+
+
+export * from './organization'

+ 34 - 0
src/request/organization.ts

@@ -0,0 +1,34 @@
+import { sendFetch, PageProps } from './index'
+import * as URL from "./URL";
+
+
+export const getOrgListFetch = (params: any) =>
+    sendFetch<PageProps<{
+        orgId: number
+        orgName: string
+        type: number
+    }>>(URL.organizationPage, {
+        method: "post",
+        body: JSON.stringify(params),
+    });
+
+
+type addOrgParamType = {
+    ancestors: string
+    contact: string
+    orderNum: number
+    orgId: number
+    parentId: number
+    password: string
+    type: number
+    userName: string
+}
+export const addOrgFetch = (params: any) =>
+    sendFetch<PageProps<{
+        orgId: number
+        orgName: string
+        type: number
+    }>>(URL.organizationPage, {
+        method: "post",
+        body: JSON.stringify(params),
+    });

+ 13 - 0
src/router.ts

@@ -67,6 +67,19 @@ const routes: RouteRecordRaw[] = [
         meta: { title: "设备管理" },
         component: () => import("@/view/device.vue"),
       },
+      {
+        path: "organization",
+        name: "organization",
+        meta: { title: "单位管理" },
+        component: () => import("@/view/organization.vue"),
+      },
+      {
+        path: "users",
+        name: "users",
+        meta: { title: "用户管理" },
+        component: () => import("@/view/users.vue"),
+      },
+  
     ],
   },
   {

+ 5 - 12
src/view/layout/slide/index.vue

@@ -1,15 +1,8 @@
 <template>
   <div class="slide">
-    <el-menu
-      :default-active="(router.currentRoute.value.name as string)"
-      @select="(name: string) => router.push({ name })"
-    >
-      <sub-menu
-        v-for="route in routes"
-        :meta="route.meta"
-        :name="(route.name as string)"
-        :key="route.name"
-      />
+    <el-menu :default-active="(router.currentRoute.value.name as string)"
+      @select="(name: string) => router.push({ name })">
+      <sub-menu v-for="route in routes" :meta="route.meta" :name="(route.name as string)" :key="route.name" />
     </el-menu>
   </div>
 </template>
@@ -17,8 +10,8 @@
 <script setup lang="ts">
 import subMenu from "./submenu.vue";
 import { router, findRoute } from "@/router";
-
-const names = ["scene", "relics", "device"];
+//@TODO
+const names = ["scene", "relics", "device", "organization", "users"];
 const routes = names.map((name) => findRoute(name)!);
 </script>
 

+ 33 - 0
src/view/organization-edit.vue

@@ -0,0 +1,33 @@
+<template>
+  <el-form label-width="100px">
+    <el-form-item label="SN:" required>
+      <el-input
+        v-model="data.sn"
+        style="width: 250px"
+        :maxlength="500"
+        placeholder="请输入"
+      />
+    </el-form-item>
+  </el-form>
+</template>
+
+<script setup lang="ts">
+import { QuiskExpose } from "@/helper/mount";
+import { ElMessage } from "element-plus";
+import { ref } from "vue";
+
+const props = defineProps<{
+  submit: (sn: string) => Promise<any>;
+}>();
+const data = ref({ sn: "" });
+
+defineExpose<QuiskExpose>({
+  async submit() {
+    if (!data.value.sn) {
+      ElMessage.error("请输入SN!");
+      throw "请输入SN!";
+    }
+    await props.submit(data.value.sn);
+  },
+});
+</script>

+ 127 - 0
src/view/organization.vue

@@ -0,0 +1,127 @@
+<template>
+  <div class="relics-layout">
+    <div class="relics-header">
+      <div class="search">
+        <el-form label-width="100px" inline>
+          <el-form-item label="单位名称">
+            <el-input v-model="pageProps.orgName" clearable style="width: 250px" placeholder="请输入" />
+          </el-form-item>
+          <el-form-item label="类型">
+            <el-select style="width: 250px" v-model="pageProps.orgId" clearable>
+              <el-option :value="Number(key)" :label="type" v-for="(type, key) in DeviceTypeDesc" />
+            </el-select>
+
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="refresh">查询</el-button>
+            <el-button type="primary" plain @click="pageProps = { ...initProps }">
+              重置
+            </el-button>
+            <el-button type="primary" @click="addHandler"> 新增单位 </el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+
+    <div class="relics-content">
+      <el-table :data="relicsArray" border>
+        <el-table-column label="单位名称" prop="cameraSn"></el-table-column>
+        <el-table-column label="类型" prop="cameraSn"></el-table-column>
+        <el-table-column label="单位账号" prop="cameraSn"></el-table-column>
+        <el-table-column label="单位联系人" prop="cameraSn"></el-table-column>
+        <el-table-column label="创建时间" prop="cameraSn"></el-table-column>
+        <el-table-column label="创建人" prop="cameraSn"></el-table-column>
+        <el-table-column label="操作" width="100px" fixed="right">
+          <template #default="{ row }">
+            <el-button link type="danger" @click="() => { }" size="small">
+              编辑
+            </el-button>
+            <el-button link type="danger" @click="() => { }" 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 {
+  getOrgListFetch,
+  addOrgFetch,
+  PageProps
+} from "@/request";
+import { Device } from "@/request/type";
+import { DeviceTypeDesc } from "@/store/device";
+// import { ElMessageBox } from "element-plus";
+import { organizationEdit } from "./quisk";
+import { debounce } from "@/util";
+
+const initProps: PageProps<{
+  orgName: string
+  orgId: number | null
+  type: number | null
+}> = {
+  pageNum: 1,
+  pageSize: 10,
+  orgName: '',
+  orgId: null,
+  type: null,
+};
+const pageProps = ref({ ...initProps });
+const total = ref<number>(0);
+const relicsArray = ref<Device[]>([]);
+
+const refresh = debounce(async () => {
+  const data = await getOrgListFetch(pageProps.value);
+  debugger
+  // total.value = data.total;
+  // relicsArray.value = data.records;
+});
+
+watch(pageProps, refresh, { deep: true, immediate: true });
+onActivated(refresh);
+
+
+const addHandler = async () => {
+  await organizationEdit({ submit: addOrgFetch });
+  await refresh();
+};
+</script>
+
+<style scoped lang="scss">
+.relics-layout {
+  height: 100%;
+  overflow-y: auto;
+  padding: 30px;
+}
+
+.pag-layout {
+  margin-top: 20px;
+  display: flex;
+  justify-content: center;
+}
+
+.relics-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 20px;
+
+  .search {
+    flex: 1;
+  }
+
+  .relics-oper {
+    flex: 0 0 100px;
+    text-align: right;
+  }
+}
+</style>

+ 6 - 0
src/view/quisk.ts

@@ -2,6 +2,7 @@ import { quiskMountFactory } from "@/helper/mount";
 import RelicsEdit from "./relics-edit.vue";
 import DeviceEdit from "./device-edit.vue";
 import SceneSelect from "./scene-select.vue";
+import OrganizationEdit from "./organization-edit.vue";
 
 export const relicsEdit = quiskMountFactory(RelicsEdit, {
   title: "创建文物",
@@ -16,3 +17,8 @@ export const selectScenes = quiskMountFactory(SceneSelect, {
   title: "选择场景",
   width: 1000,
 });
+
+export const organizationEdit = quiskMountFactory(OrganizationEdit, {
+  title: "添加单位",
+  width: 520,
+});

+ 116 - 0
src/view/users.vue

@@ -0,0 +1,116 @@
+<template>
+  <div class="relics-layout">
+    <div class="relics-header">
+      <div class="search">
+        <el-form label-width="100px" inline>
+          <el-form-item label="用户账号">
+            <el-input v-model="pageProps.cameraSn" clearable style="width: 250px" placeholder="请输入" />
+          </el-form-item>
+          <el-form-item label="所属单位">
+            <!-- <el-select style="width: 250px" v-model="pageProps.cameraType" clearable>
+              <el-option :value="Number(key)" :label="type" v-for="(type, key) in DeviceTypeDesc" />
+            </el-select> -->
+            <el-input v-model="pageProps.cameraSn" clearable style="width: 250px" placeholder="请输入" />
+          </el-form-item>
+
+          <el-form-item>
+            <el-button type="primary" @click="refresh">查询</el-button>
+            <el-button type="primary" plain @click="pageProps = { ...initProps }">
+              重置
+            </el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+    </div>
+
+    <div class="relics-content">
+      <el-table :data="relicsArray" border>
+        <el-table-column label="姓名" prop="cameraSn"></el-table-column>
+
+        <el-table-column label="账号" prop="snCode" v-slot:default="{ row }: { row: Device }">
+          {{ DeviceTypeDesc[row.cameraType] }}
+        </el-table-column>
+
+        <el-table-column label="所属单位" prop="createBy"> </el-table-column>
+        <el-table-column label="角色" prop="createBy"> </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>
+        <el-table-column label="状态" prop="createBy"> </el-table-column>
+        <el-table-column label="操作" width="100px" fixed="right">
+          <template #default="{ row }">
+            <!-- <el-button link type="danger" @click="delHandler(row.cameraId)" 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 {
+  getOrgListFetch,
+  PageProps
+} from "@/request";
+import { Device } from "@/request/type";
+import { DeviceTypeDesc } from "@/store/device";
+// import { ElMessageBox } from "element-plus";
+// import { deviceEdit } from "./quisk";
+import { debounce } from "@/util";
+
+const initProps: PageProps<{}> = {
+  pageNum: 1,
+  pageSize: 10,
+};
+const pageProps = ref({ ...initProps });
+const total = ref<number>(0);
+const relicsArray = ref<Device[]>([]);
+
+const refresh = debounce(async () => {
+  const data = await getOrgListFetch(pageProps.value);
+  debugger
+  // total.value = data.total;
+  // relicsArray.value = data.records;
+});
+
+watch(pageProps, refresh, { deep: true, immediate: true });
+onActivated(refresh);
+</script>
+
+<style scoped lang="scss">
+.relics-layout {
+  height: 100%;
+  overflow-y: auto;
+  padding: 30px;
+}
+
+.pag-layout {
+  margin-top: 20px;
+  display: flex;
+  justify-content: center;
+}
+
+.relics-header {
+  display: flex;
+  align-items: center;
+  margin-bottom: 20px;
+
+  .search {
+    flex: 1;
+  }
+
+  .relics-oper {
+    flex: 0 0 100px;
+    text-align: right;
+  }
+}
+</style>

+ 7 - 0
vite.config.ts

@@ -35,9 +35,16 @@ export default defineConfig({
       },
       "/api": {
         target: `http://sp.4dkankan.com`,
+        // target: `http://192.168.0.11:8324/relics/`,
         changeOrigin: true,
         rewrite: (path) => path.replace(/^\/api/, "/api"),
       },
+      "/api/test": {
+        // target: `http://sp.4dkankan.com`,
+        target: `http://192.168.0.11:8324/`,
+        changeOrigin: true,
+        rewrite: (path) => path.replace(/^\/api\/test/, "/api/test"),
+      },
     },
   },
 });