소스 검색

feat: dev

gemercheung 5 달 전
부모
커밋
033b4acf25
7개의 변경된 파일170개의 추가작업 그리고 20개의 파일을 삭제
  1. 1 0
      package.json
  2. 15 0
      pnpm-lock.yaml
  3. 6 0
      src/request/URL.ts
  4. 19 0
      src/request/organization.ts
  5. 59 0
      src/view/organization-add.vue
  6. 66 20
      src/view/organization-edit.vue
  7. 4 0
      src/view/relics.vue

+ 1 - 0
package.json

@@ -14,6 +14,7 @@
     "@types/node": "^20.12.2",
     "@types/three": "^0.170.0",
     "china-area-data": "^5.0.1",
+    "element-china-area-data": "^6.1.0",
     "element-plus": "^2.6.3",
     "gl-matrix": "^3.4.3",
     "js-base64": "^3.7.7",

+ 15 - 0
pnpm-lock.yaml

@@ -20,6 +20,9 @@ importers:
       china-area-data:
         specifier: ^5.0.1
         version: 5.0.1
+      element-china-area-data:
+        specifier: ^6.1.0
+        version: 6.1.0
       element-plus:
         specifier: ^2.6.3
         version: 2.8.8(vue@3.5.13(typescript@5.6.3))
@@ -625,6 +628,9 @@ packages:
   china-area-data@5.0.1:
     resolution: {integrity: sha512-BQDPpiv5Nn+018ekcJK2oSD9PAD+E1bvXB0wgabc//dFVS/KvRqCgg0QOEUt3vBkx9XzB5a9BmkJCEZDBxVjVw==}
 
+  china-division@2.7.0:
+    resolution: {integrity: sha512-4uUPAT+1WfqDh5jytq7omdCmHNk3j+k76zEG/2IqaGcYB90c2SwcixttcypdsZ3T/9tN1TTpBDoeZn+Yw/qBEA==}
+
   chokidar@4.0.1:
     resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==}
     engines: {node: '>= 14.16.0'}
@@ -745,6 +751,9 @@ packages:
   earcut@2.2.4:
     resolution: {integrity: sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==}
 
+  element-china-area-data@6.1.0:
+    resolution: {integrity: sha512-IkpcjwQv2A/2AxFiSoaISZ+oMw1rZCPUSOg5sOCwT5jKc96TaawmKZeY81xfxXsO0QbKxU5LLc6AirhG52hUmg==}
+
   element-plus@2.8.8:
     resolution: {integrity: sha512-MLAH1x2PGTnOT7Iwqh9ASgfZhvgqQqrdbxuJH0w2fGjzE4ZjryyLQj24HXoQO7Zon66U3lrYxbdLI57M6OX0qw==}
     peerDependencies:
@@ -1696,6 +1705,8 @@ snapshots:
 
   china-area-data@5.0.1: {}
 
+  china-division@2.7.0: {}
+
   chokidar@4.0.1:
     dependencies:
       readdirp: 4.0.2
@@ -1806,6 +1817,10 @@ snapshots:
 
   earcut@2.2.4: {}
 
+  element-china-area-data@6.1.0:
+    dependencies:
+      china-division: 2.7.0
+
   element-plus@2.8.8(vue@3.5.13(typescript@5.6.3)):
     dependencies:
       '@ctrl/tinycolor': 3.6.1

+ 6 - 0
src/request/URL.ts

@@ -59,3 +59,9 @@ export const updateDrawing = `/relics/relics/drawing/update`;
 
 //token
 export const getFdTokenByNum = `/relics/scene/getFdTokenByNum?num=`;
+
+//
+
+export const getProvinces = `/relics/provincesInfo/provinces`;
+export const getCities = `/relics/provincesInfo/cities`;
+export const getAreas = `/relics/provincesInfo/areas`;

+ 19 - 0
src/request/organization.ts

@@ -78,3 +78,22 @@ export const registerOrganization = (params: any) => {
     });
 
 }
+
+export const getProvinces = () => {
+    return sendFetch<ResResult>(URL.getProvinces, {
+        method: "get",
+    });
+}
+
+export const getCities = (provinceCode: string) => {
+    return sendFetch<ResResult>(URL.getCities + "?provinceCode=" + provinceCode, {
+        method: "get",
+    });
+}
+
+export const getAreas = (provinceCode: string, cityCode: string) => {
+    return sendFetch<ResResult>(URL.getAreas + `?provinceCode=${provinceCode}&cityCode=${cityCode}`, {
+        method: "get",
+    });
+}
+

+ 59 - 0
src/view/organization-add.vue

@@ -27,6 +27,10 @@
         />
       </el-select>
     </el-form-item>
+    <el-form-item label="行政区划" prop="type">
+      <el-cascader style="width: 300px" v-model="selectedValue" :props="lazyProps" :placeholder="'请选择地区'" clearable
+        @change="handleChange" lazy />
+    </el-form-item>
 
     <el-form-item label="上级单位" prop="parentId">
       <el-tree-select
@@ -93,11 +97,13 @@ import type { OrganizationType } from "@/request/organization";
 import { OrganizationTypeDesc } from "@/store/organization";
 import { globalPasswordRex } from "@/util/regex";
 import { ref, reactive, unref, watch, onMounted } from "vue";
+import { getProvinces, getCities, getAreas } from '@/request/organization';
 import { View, Hide } from "@element-plus/icons-vue";
 // import { user } from '@/store/user'
 import { getOrgListFetchList } from "@/request";
 
 const addPassFlag = ref(true); //图标显示标识
+const selectedValue = ref([])
 
 type SelectType = {
   orgName: string;
@@ -169,6 +175,59 @@ watch(
   }
 );
 
+
+// 动态加载配置
+const lazyProps = ref<CascaderProps>({
+  lazy: true,
+  // 启用懒加载模式
+  async lazyLoad(node, resolve) {
+    // debugger
+    const { level, value } = node; // level: 当前层级(0=省,1=市,2=区)
+    console.log('node', node.data)
+    const dataRes = await loadData(level, node.data);
+    resolve(dataRes);  // 将子节点数据返回给组件
+  },
+  checkStrictly: true, // 允许选择任意一级(可选)
+  label: 'name',    // 显示字段名
+  value: 'id',      // 值字段名
+  leaf: 'leaf',      // 标识是否为叶子节点(不可再展开)
+});
+
+
+const loadData = async (level, node) => {
+  // 根据层级模拟数据
+  console.log('level', level, node)
+
+  switch (level) {
+    case 0: // 加载省份
+      const provinces = await getProvinces();
+      const resP = Array.from(provinces as any).map(p => {
+        p.leaf = false
+        return p
+      });
+      return resP;
+    case 1:
+      const cities = await getCities(node.province);
+      console.log('cities', node.province, cities)
+      return cities
+    // break;
+    case 2: // 加载区县
+      const areas = await getAreas(node.province, node.city)
+      console.log('areas', areas)
+      return areas.map(a => {
+        a.leaf = true
+        return a
+      })
+    default:
+      return [];
+  }
+};
+
+// 处理选择事件
+const handleChange = (value: string) => {
+  console.log('选中的省市区编码:', value);
+};
+
 defineExpose<QuiskExpose>({
   async submit() {
     if (unref(baseFormRef)) {

+ 66 - 20
src/view/organization-edit.vue

@@ -11,12 +11,9 @@
       </el-select>
     </el-form-item>
 
-    <el-form-item label="行政区划" prop="type" required>
-      <!-- <el-select style="width: 300px" v-model="data.type">
-        <el-option :value="Number(key)" :label="type" v-for="(type, key) in OrganizationTypeDesc" /> -->
-      <!-- </el-select> -->
-      <el-cascader style="width: 300px" v-model="selectedArea" :options="options" :props="cityProps" placeholder="请选择省市区" clearable
-         @change="handleChange" />
+    <el-form-item label="行政区划" prop="type">
+      <el-cascader style="width: 300px" v-model="selectedValue" :props="lazyProps" :placeholder="'请选择地区'" clearable
+        @change="handleChange" lazy />
     </el-form-item>
 
   </el-form>
@@ -26,14 +23,18 @@
 import { QuiskExpose } from "@/helper/mount";
 import type { FormInstance, FormRules } from "element-plus";
 import type { OrganizationType } from "@/request/organization";
-import { OrganizationTypeDesc } from '@/store/organization'
+import { OrganizationTypeDesc } from '@/store/organization';
+import { getProvinces, getCities, getAreas } from '@/request/organization';
 import { ref, reactive, unref, watchEffect, onMounted } from "vue";
 import { user } from '@/store/user'
 import { globalPasswordRex } from "@/util/regex";
-import * as regionData from 'china-area-data';
+import type { CascaderProps } from 'element-plus'
+// import areaData from '@/util/area.json';
+const selectedValue = ref([])
 
 const baseFormRef = ref<FormInstance>();
 
+
 const rules = reactive<FormRules>({
   orgName: [
     { required: true, message: "请输入单位名称", trigger: "blur" },
@@ -57,6 +58,7 @@ const props = defineProps<{
   org: OrganizationType,
   submit: (data: OrganizationType) => Promise<any>;
 }>();
+
 const data = ref<OrganizationType & {}>({
   ancestors: "",
   contact: "",
@@ -81,21 +83,65 @@ watchEffect(() => {
   }
 
 })
-const selectedArea = ref([]);
-const options = ref([]);
-const cityProps = {
-  value: 'value',
-  label: 'label',
-  children: 'children',
-};
-// 初始化数据(已处理为 Element 需要的格式)
-onMounted(() => {
-  options.value = regionData;
-  console.log('regionData', regionData)
+
+
+// 动态加载配置
+const lazyProps = ref<CascaderProps>({
+  lazy: true,
+
+  // 启用懒加载模式
+  async lazyLoad(node, resolve) {
+    // debugger
+    const { level, value } = node; // level: 当前层级(0=省,1=市,2=区)
+    console.log('node', node.data)
+    const dataRes = await loadData(level, node.data);
+    resolve(dataRes);  // 将子节点数据返回给组件
+  },
+  checkStrictly: true, // 允许选择任意一级(可选)
+  label: 'name',    // 显示字段名
+  value: 'id',      // 值字段名
+  leaf: 'leaf',      // 标识是否为叶子节点(不可再展开)
 });
 
+
+const loadData = async (level, node) => {
+  // 根据层级模拟数据
+  console.log('level', level, node)
+
+  switch (level) {
+    case 0: // 加载省份
+      const provinces = await getProvinces();
+      const resP = Array.from(provinces as any).map(p => {
+        p.leaf = false
+        return p
+      });
+      return resP;
+    case 1:
+      let cities
+      if (node.zx) {
+        const areas = await getAreas(node.province, node.city);
+        console.log('areas', areas)
+      } else {
+        cities = await getCities(node.province);
+        console.log('cities', node.province, cities);
+      }
+
+      return cities
+    // break;
+    case 2: // 加载区县
+      const areas = await getAreas(node.province, node.city)
+      console.log('areas', areas)
+      return areas.map(a => {
+        a.leaf = true
+        return a
+      })
+    default:
+      return [];
+  }
+};
+
 // 处理选择事件
-const handleChange = (value) => {
+const handleChange = (value: string) => {
   console.log('选中的省市区编码:', value);
 };
 

+ 4 - 0
src/view/relics.vue

@@ -137,12 +137,14 @@ import {
   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 } from "./quisk";
@@ -154,6 +156,8 @@ const initProps: RelicsPageProps = {
   pageNum: 1,
   pageSize: 10,
 };
+
+
 const pageProps = ref({ ...initProps });
 const total = ref<number>(0);
 const relicsArray = ref<Relics[]>([]);