|
@@ -0,0 +1,426 @@
|
|
|
+<template>
|
|
|
+ <div class="bs-container">
|
|
|
+ <div class="inner-container">
|
|
|
+ <el-form
|
|
|
+ :inline="true"
|
|
|
+ class="filter-container"
|
|
|
+ >
|
|
|
+ <el-form-item class="filter-input filter-item">
|
|
|
+ <el-input
|
|
|
+ v-model="searchForm.searchKey"
|
|
|
+ class="bs-el-input"
|
|
|
+ clearable
|
|
|
+ maxlength="200"
|
|
|
+ placeholder="请输入地图名称或编码"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item class="filter-item">
|
|
|
+ <el-select
|
|
|
+ v-model="searchForm.level"
|
|
|
+ class="bs-el-select"
|
|
|
+ clearable
|
|
|
+ placeholder="请选择地图级别"
|
|
|
+ popper-class="bs-el-select"
|
|
|
+ @change="getDataList"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="level in levelList"
|
|
|
+ :key="level.value"
|
|
|
+ :label="level.label"
|
|
|
+ :value="level.value"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item class="filter-item">
|
|
|
+ <el-button
|
|
|
+ :loading="searchLoading"
|
|
|
+ icon="el-icon-search"
|
|
|
+ type="primary"
|
|
|
+ @click="getDataList"
|
|
|
+ >
|
|
|
+ 查询
|
|
|
+ </el-button>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item class="filter-item">
|
|
|
+ <el-button
|
|
|
+ class="bs-el-button-default"
|
|
|
+ @click="addMap"
|
|
|
+ >
|
|
|
+ 新增
|
|
|
+ </el-button>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ <div class="bs-table-box">
|
|
|
+ <el-table
|
|
|
+ v-loading="searchLoading"
|
|
|
+ ref="table"
|
|
|
+ v-table
|
|
|
+ :data="mapList"
|
|
|
+ :element-loading-text="loadingText"
|
|
|
+ :load="load"
|
|
|
+ :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
|
|
|
+ class="bs-el-table bs-scrollbar"
|
|
|
+ height="0"
|
|
|
+ lazy
|
|
|
+ row-key="id"
|
|
|
+ >
|
|
|
+ <el-empty slot="empty"/>
|
|
|
+ <el-table-column
|
|
|
+ align="left"
|
|
|
+ label="名称"
|
|
|
+ prop="name"
|
|
|
+ show-overflow-tooltip
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ align="center"
|
|
|
+ label="编码"
|
|
|
+ prop="mapCode"
|
|
|
+ show-overflow-tooltip
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ align="center"
|
|
|
+ label="级别"
|
|
|
+ prop="level"
|
|
|
+ show-overflow-tooltip
|
|
|
+ >
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span v-if="scope.row.level === 0">世界</span>
|
|
|
+ <span v-else-if="scope.row.level === 1">国家</span>
|
|
|
+ <span v-else-if="scope.row.level === 2">省份</span>
|
|
|
+ <span v-else-if="scope.row.level === 3">城市</span>
|
|
|
+ <span v-else-if="scope.row.level === 4">区县</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ align="center"
|
|
|
+ label="开启下钻"
|
|
|
+ prop="enableDown"
|
|
|
+ show-overflow-tooltip
|
|
|
+ >
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span v-if="scope.row.enableDown === 1">是</span>
|
|
|
+ <span v-else>否</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ align="center"
|
|
|
+ label="已上传配置JSON"
|
|
|
+ prop="uploadedGeoJson"
|
|
|
+ show-overflow-tooltip
|
|
|
+ >
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <span v-if="scope.row.uploadedGeoJson === 1">是</span>
|
|
|
+ <span v-else>否</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column
|
|
|
+ align="center"
|
|
|
+ label="操作"
|
|
|
+ width="200"
|
|
|
+ >
|
|
|
+ <template slot-scope="scope">
|
|
|
+ <el-button
|
|
|
+ class="bs-el-button-default"
|
|
|
+ @click="editMap(scope.row)"
|
|
|
+ >
|
|
|
+ 编辑
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ class="bs-el-button-default"
|
|
|
+ @click="deleteMap(scope.row)"
|
|
|
+ >
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ v-if="scope.row.uploadedGeoJson === 1"
|
|
|
+ class="bs-el-button-default"
|
|
|
+ @click="addChild(scope.row)"
|
|
|
+ >
|
|
|
+ 添加下级
|
|
|
+ </el-button>
|
|
|
+ <el-button
|
|
|
+ v-if="scope.row.uploadedGeoJson === 0"
|
|
|
+ class="bs-el-button-default"
|
|
|
+ @click="uploadGeoJson(scope.row)"
|
|
|
+ >
|
|
|
+ 上传配置
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <add-form
|
|
|
+ ref="addForm"
|
|
|
+ @refresh="getDataList"
|
|
|
+ />
|
|
|
+ <edit-form
|
|
|
+ ref="editForm"
|
|
|
+ @refresh="getDataList"
|
|
|
+ />
|
|
|
+ <el-dialog
|
|
|
+ :close-on-click-modal="false"
|
|
|
+ :visible.sync="geoJsonVisible"
|
|
|
+ append-to-body
|
|
|
+ class="bs-dialog-wrap bs-el-dialog"
|
|
|
+ height="1000px"
|
|
|
+ title="geoJson数据"
|
|
|
+ width="1000px"
|
|
|
+ >
|
|
|
+ <vue-json-viewer
|
|
|
+ v-model="currentMapGeoJSon"
|
|
|
+ theme="dark"
|
|
|
+ :show-btns="false"
|
|
|
+ mode="code"
|
|
|
+ />
|
|
|
+ <el-button
|
|
|
+ class="bs-el-button-default"
|
|
|
+ @click="upload()"
|
|
|
+ >
|
|
|
+ <i class="el-icon-upload2"></i>
|
|
|
+ 上传
|
|
|
+ </el-button>
|
|
|
+ <span
|
|
|
+ slot="footer"
|
|
|
+ class="dialog-footer"
|
|
|
+ >
|
|
|
+ <el-button
|
|
|
+ class="bs-el-button-default"
|
|
|
+ @click="submitUpload"
|
|
|
+ >提交</el-button>
|
|
|
+ </span>
|
|
|
+ </el-dialog>
|
|
|
+ <input
|
|
|
+ ref="geoJsonFileUpload"
|
|
|
+ accept=".json"
|
|
|
+ name="file"
|
|
|
+ style="display: none"
|
|
|
+ type="file"
|
|
|
+ @change="handleBatchUpload"
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import table from 'data-room-ui/js/utils/table.js'
|
|
|
+import {mapList, mapDelete, uploadGeoJson, mapCascadeDelete} from 'data-room-ui/js/utils/mapDataService'
|
|
|
+import AddForm from "./AddForm"
|
|
|
+import EditForm from "./EditForm"
|
|
|
+import vueJsonViewer from 'vue-json-viewer'
|
|
|
+
|
|
|
+export default {
|
|
|
+ name: "MapManagement",
|
|
|
+ directives: {
|
|
|
+ table // 注册自定义指令
|
|
|
+ },
|
|
|
+ components: {
|
|
|
+ AddForm,
|
|
|
+ EditForm,
|
|
|
+ vueJsonViewer
|
|
|
+ },
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ currentMap: {}, // 当前操作的地图
|
|
|
+ currentMapGeoJSon: {}, // 当前操作的地图geoJson
|
|
|
+ loadingText: '',
|
|
|
+ searchLoading: false,
|
|
|
+ geoJsonVisible: false,
|
|
|
+ lazyResolveIds: [],
|
|
|
+ searchForm: {
|
|
|
+ searchKey: '',
|
|
|
+ level: null,
|
|
|
+ enableDown: null,
|
|
|
+ uploadedGeoJson: null,
|
|
|
+ parentCode: '0'
|
|
|
+ },
|
|
|
+ levelList: [
|
|
|
+ {
|
|
|
+ label: '世界',
|
|
|
+ value: 0
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '国家',
|
|
|
+ value: 1
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '省份',
|
|
|
+ value: 2
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '城市',
|
|
|
+ value: 3
|
|
|
+ },
|
|
|
+ {
|
|
|
+ label: '区县',
|
|
|
+ value: 4
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ mapList: []
|
|
|
+ }
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ this.init()
|
|
|
+
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ init() {
|
|
|
+ this.searchLoading = true
|
|
|
+ this.loadingText = '正在加载地图数据...'
|
|
|
+ mapList(this.searchForm).then(res => {
|
|
|
+ this.mapList = res
|
|
|
+ this.searchLoading = false
|
|
|
+ }).catch(err => {
|
|
|
+ this.searchLoading = false
|
|
|
+ })
|
|
|
+ },
|
|
|
+ getDataList() {
|
|
|
+ this.searchLoading = true
|
|
|
+ this.loadingText = '正在加载地图数据...'
|
|
|
+ mapList(this.searchForm).then(res => {
|
|
|
+ this.mapList = res
|
|
|
+ this.searchLoading = false
|
|
|
+ }).catch(err => {
|
|
|
+ this.searchLoading = false
|
|
|
+ })
|
|
|
+ // 清除展开状态
|
|
|
+ for (let i = 0; i < this.lazyResolveIds.length; i++) {
|
|
|
+ this.$refs.table.store.states.treeData[this.lazyResolveIds[i]].loaded = false;
|
|
|
+ this.$refs.table.store.states.treeData[this.lazyResolveIds[i]].expanded = false
|
|
|
+ }
|
|
|
+ },
|
|
|
+ addMap() {
|
|
|
+ this.$refs.addForm.mapFormVisible = true
|
|
|
+ this.$refs.addForm.init()
|
|
|
+ },
|
|
|
+ load(data, treeNode, resolve) {
|
|
|
+ this.lazyResolveIds.push(data.id)
|
|
|
+ mapList({
|
|
|
+ parentCode: data.mapCode
|
|
|
+ }).then(res => {
|
|
|
+ resolve(res)
|
|
|
+ }).catch(err => {
|
|
|
+ resolve([])
|
|
|
+ })
|
|
|
+ },
|
|
|
+ deleteMap(map) {
|
|
|
+ this.$confirm('确定删除该地图?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ customClass: 'bs-el-message-box'
|
|
|
+ }).then(async () => {
|
|
|
+ mapDelete(map.id).then(() => {
|
|
|
+ this.$message({
|
|
|
+ type: 'success',
|
|
|
+ message: '删除成功'
|
|
|
+ })
|
|
|
+ this.getDataList()
|
|
|
+ }).catch(() => {
|
|
|
+ this.deleteMapCascade(map)
|
|
|
+ })
|
|
|
+ }).catch(() => {
|
|
|
+ })
|
|
|
+ },
|
|
|
+ deleteMapCascade(map) {
|
|
|
+ this.$confirm('该地图存在子级,是否直接删除该地图以及其所有子级?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ customClass: 'bs-el-message-box'
|
|
|
+ }).then(async () => {
|
|
|
+ mapCascadeDelete(map.id).then(() => {
|
|
|
+ this.$message({
|
|
|
+ type: 'success',
|
|
|
+ message: '删除成功'
|
|
|
+ })
|
|
|
+ this.getDataList()
|
|
|
+ }).catch(() => {
|
|
|
+ })
|
|
|
+ }).catch(() => {
|
|
|
+ })
|
|
|
+ },
|
|
|
+ addChild(map) {
|
|
|
+ this.$refs.addForm.mapFormVisible = true
|
|
|
+ this.$refs.addForm.init(map)
|
|
|
+ },
|
|
|
+ editMap(map) {
|
|
|
+ this.$refs.editForm.mapFormVisible = true
|
|
|
+ this.$refs.editForm.init(map)
|
|
|
+ },
|
|
|
+ uploadGeoJson(map) {
|
|
|
+ this.currentMap = map
|
|
|
+ this.currentMapGeoJSon = {}
|
|
|
+ this.geoJsonVisible = true
|
|
|
+ },
|
|
|
+ upload() {
|
|
|
+ this.$refs.geoJsonFileUpload.click()
|
|
|
+ },
|
|
|
+ handleBatchUpload(source) {
|
|
|
+ this.uploadLoading = true
|
|
|
+ const file = source.target.files
|
|
|
+ const reader = new FileReader() // 新建一个FileReader
|
|
|
+ reader.readAsText(file[0], 'UTF-8') // 读取文件
|
|
|
+
|
|
|
+ reader.onload = (event) => {
|
|
|
+ let jsonStr = event.target.result
|
|
|
+ // 读取文件内容
|
|
|
+ try {
|
|
|
+ this.currentMapGeoJSon = JSON.parse(jsonStr)
|
|
|
+ } catch (e) {
|
|
|
+ this.uploadLoading = false
|
|
|
+ this.$message.error('JSON文件格式错误')
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ this.uploadLoading = false
|
|
|
+ // input通过onchange事件来触发js代码的,由于两次文件是重复的,所以这个时候onchange事件是没有触发到的,所以需要手动清空input的值
|
|
|
+ source.target.value = ''
|
|
|
+ }
|
|
|
+ },
|
|
|
+ submitUpload() {
|
|
|
+ // 先检查JSON是否合法
|
|
|
+ if (typeof this.currentMapGeoJSon === 'string') {
|
|
|
+ this.$message.error('JSON文件格式错误')
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ if (this.currentMapGeoJSon === {}) {
|
|
|
+ this.$message.error('JSON数据不能为空')
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ // 调接口保存
|
|
|
+ uploadGeoJson({
|
|
|
+ id: this.currentMap.id,
|
|
|
+ geoJson: JSON.stringify(this.currentMapGeoJSon)
|
|
|
+ }).then(res => {
|
|
|
+ this.$message({
|
|
|
+ type: 'success',
|
|
|
+ message: '上传成功'
|
|
|
+ })
|
|
|
+ this.geoJsonVisible = false
|
|
|
+ this.getDataList()
|
|
|
+ }).catch(err => {
|
|
|
+ this.$message({
|
|
|
+ type: 'error',
|
|
|
+ message: '上传失败'
|
|
|
+ })
|
|
|
+ })
|
|
|
+ this.geoJsonVisible = false
|
|
|
+ },
|
|
|
+ isWhitespace(str) {
|
|
|
+ // 如果是null、undefined,返回true
|
|
|
+ if (str == null) {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ return /^\s*$/.test(str);
|
|
|
+ },
|
|
|
+ },
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
+@import '../../assets/style/bsTheme.scss';
|
|
|
+.jv-container.dark {
|
|
|
+ color: aliceblue;
|
|
|
+ background: #161A26;
|
|
|
+}
|
|
|
+</style>
|