Jeecgboot:中国省市区树形数据生成

文章讲述了如何将Jeecgboot框架中基于china-area-data的省市区下拉选项改造为树形勾选组件。通过修改area.js生成具有pid和hasChild字段的表格数据,然后利用SQL更新id与code的关系,最后转换为treeData格式供前端展示。同时提供了生成treeData的代码示例和将数据保存为JSON文件的方法。
摘要由CSDN通过智能技术生成

Jeecgboot框架自带省市区下拉选项,但是我们的项目需要使用树形勾选,所以需要进行改造。

Jeecgboot的省市区数据来源于china-area-data组件的data.json,我们先利用框架自带的area.js生成具有pid和hasChild字段的表格数据。

area.js

import pcaa from 'china-area-data';
// 返回所有省
export function getProvince() {
  let arr = []
  const province = pcaa['86']
  Object.keys(province).map(key => {
    arr.push({
      value: key,
      label: province[key],
    });
  })
  return arr;
}
// 根据选择的省,返回对应的市
export function getCity(province) {
  let arr = []
  const city = pcaa[province]
  Object.keys(city).map(key => {
    arr.push({
      value: key,
      label: city[key],
    });
  })
  return arr;
}
// 根据选择的市,返回对应的区
export function getDistrict(city) {
  let arr = []
  const district = pcaa[city]
  Object.keys(district).map(key => {
    arr.push({
      value: key,
      label: district[key],
    });
  })
  return arr;
}

完整代码

<template>
    <div>
    </div>
</template>
<script>
    import {
        getProvince,
        getCity,
        getDistrict
    } from '@/utils/area'
    export default {
        data() {
            return {};
        },
        created() {
            this.tableToExcel();
        },
        methods: {
            getTreeArr() {
                let table = [];
                let col = ['编号', '名称', '父级节点', '是否有子节点'];
                table.push(col);
                let provinces = getProvince();
                provinces.forEach(p => {
                    // 省份没有父节点,有子节点
                    let row = [p.value, p.label, '0', '1'];
                    table.push(row);
                    let cities = getCity(p.value);
                    cities.forEach(c => {
                        // 市的父节点是省,有子节点
                        row = [c.value, c.label, p.value, '1'];
                        table.push(row);
                        let districts = getDistrict(c.value);
                        districts.forEach(d => {
                            //区的父节点是市,没有子节点
                            row = [d.value, d.label, c.value, '0'];
                            table.push(row);
                        })
                    })
                })
                console.log(table);
                return table;

            },
            tableToExcel() {
                const jsonData = this.getTreeArr() //想要导出的数据,必须是数组
                // 列标题,逗号隔开,每一个逗号就是隔开一个单元格
                let str = `中国省市区树状图数据表\n`;
                // 增加\t为了不让表格显示科学计数法或者其他格式
                for (let i = 0; i < jsonData.length; i++) {
                 for (const key in jsonData[i]) {
                        str += `${jsonData[i][key] + '\t'},`
                    }
                    str += '\n';
                }
             // encodeURIComponent解决中文乱码
                const uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(str)
                // 通过创建a标签实现
                const link = document.createElement("a")
                link.href = uri;
                // 对下载的文件命名
                link.download = "中国省市区树状图数据表.csv"
                link.click()
            }

        },
    }
</script>
<style scoped>


</style>

打开csv文件,去掉所有空格,然后使用online表单的导入功能,将数据写入数据库。

关键点来了:

导入的时候每条记录的id是系统随机生成的,但是我们设置的pid是每个地点的code,并不是每条记录的id,这样导致页面只能看到省份,下面的子节点无法显示。

只需要用SQL语句让所有id等于当前行的code即可。

update dic_cn_adcode_tree set id = dic_cn_adcode_tree.code;

数据表效果:

数据处理做好了,只需要让后端返回树形组件需要的数据格式即可。

但如果你的后端太忙,我们也可以自己生成treedata。

完整代码:

<template>
    <div>
        <a-tree
            checkable
            :tree-data="treeData"
            :replaceFields="replaceFields"
            @select="onSelect"
            @check="onCheck"
          />
    </div>
</template>
<script>
    import {
        getProvince,
        getCity,
        getDistrict
    } from '@/utils/area'
    export default {
        data() {
            return {
                treeData:[],
                replaceFields:{children:'children', title:'label', key:'value' },
            };
        },
        created() {
            this.treeData = this.getTreeData();
            
        },
        methods: {
            onSelect(selectedKeys, info) {
                  console.log('selected', selectedKeys, info);
                },
                onCheck(checkedKeys, info) {
                  console.log('onCheck', checkedKeys, info);
                },
            getTreeData() {
                let china = [];
                let provinces = getProvince();//对象数组
                provinces.forEach(p => {
                    let province = p ;
                    let cities = []
                    getCity(p.value).forEach(c => {
                        let city = c;
                        let districts = getDistrict(c.value);
                        city.children = districts;
                        cities.push(city);
                    })
                    province.children = cities;
                    china.push(province);
                })
                console.log(JSON.stringify(china));
                return china;
            }

        }
    }
</script>
<style scoped>


</style>

最终效果

把treedata保存在json文件里,把value改成key,label改成title,以后就可以直接用了。

使用json文件直接生成tree的代码:

<template>
    <div>
        <a-tree
            checkable
            :tree-data="treeData"
            @check="onCheck"
          />
    </div>
</template>
<script>
    import treeData from '../src/utils/chinaTree.json'
    export default {
        data() {
            return {
                treeData
            };
        },
        created() {
            
        },
        methods: {
                onCheck(checkedKeys, info) {
                  console.log('onCheck', checkedKeys, info);
                }
        }
    }
</script>
<style scoped>


</style>

JeecgBoot Vue3版提供了省市区组件。该组件可以实现省、市、区县的管理功能。在源码中的api.js文件中,有三个接口函数可以用来获取省、市、区县的数据,分别是provinceList、cityList和districtList。这些接口函数可以通过调用getAction方法来发送请求获取相应的数据。除此之外,还可以通过导入JAreaTreeTag组件来使用省市区组件。这个组件可以实现省市区树形展示,并提供选择功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [JeecgBoot平台前端Vue3源码](https://download.csdn.net/download/dcs_pk/88099139)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [jeecgboot省市区联动](https://blog.csdn.net/iwu2495rff/article/details/105392743)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [jeecg-boot自定义省市区划控件](https://blog.csdn.net/qq_45645324/article/details/122898043)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值