Browse Source

Merge branch 'release-sy-v1.0.0' of ssh://gitlab.datameta.com:2224/project/water/shuili-vue into release-sy-v1.0.0

sy-water-data-board-ui
panyuyi 4 months ago
parent
commit
facadb8137
  1. 105
      src/api/aiSupervision/layerConfigApi.js
  2. 184
      src/views/aiSupervision/layerManage/resource/LayerDetails.vue
  3. 118
      vue.config.js

105
src/api/aiSupervision/layerConfigApi.js

@ -1,24 +1,24 @@
import request from '@/utils/request.js';
import axios from 'axios';
import request from "@/utils/request.js";
import axios from "axios";
export function addOrEditDirectoryApi(options) {
return request({
url: `/map/layerDir/saveDir`,
method: 'post',
method: "post",
params: {
id: options.id || '',
id: options.id || "",
name: options.name,
orderNm: -1,
parentId: 'root'
}
parentId: "root",
},
});
}
export function getDirectoryApi(data) {
return request({
url: `/map/layerDir/getAllTreeDir`,
method: 'post',
data
method: "post",
data,
});
}
// 通过id查找 单个图层目录
@ -28,43 +28,43 @@ export function getDirectoryByIdApi(id) {
pageSize: 1,
ids: null,
data: {
id
id,
},
params: {
orderBy: 'pub_date',
sortBy: 'asc'
}
orderBy: "pub_date",
sortBy: "asc",
},
};
return request({
url: `/map/layerDir/getAllTreeDir`,
method: 'post',
data
method: "post",
data,
});
}
export function deleteDirectoryApi(id) {
return request({
url: `/map/layerDir/deleteDir`,
method: 'delete',
method: "delete",
params: {
dirId: id
}
dirId: id,
},
});
}
export function getStyleListApi(data) {
return request({
url: `/map/layer/style/layerStylePage`,
method: 'post',
data
method: "post",
data,
});
}
export function getSceneList(data) {
return request({
url: `/map/scene/sceneList`,
method: 'post',
data
method: "post",
data,
});
}
@ -72,11 +72,11 @@ export function getSceneList(data) {
export function saveOrUpdateLayerApi(paramInfo) {
return request({
url: `/map/layer/saveOrUpdateLayer`,
method: 'post',
method: "post",
headers: {
'Content-Type': 'application/json'
"Content-Type": "application/json",
},
data: paramInfo
data: paramInfo,
});
}
@ -84,30 +84,30 @@ export function saveOrUpdateLayerApi(paramInfo) {
export function getLayerListApi(data) {
return request({
url: `/map/layer/getLayers`,
method: 'post',
data
method: "post",
data,
});
}
export function saveOrUpdateScene(data) {
return request({
url: `/map/scene/saveOrUpdateScene`,
method: 'post',
data
method: "post",
data,
});
}
export function getSceneDetail(id) {
return request({
url: `/map/scene/findSceneById/${id}`,
method: 'get'
method: "get",
});
}
export function getLayerTreeBySceneId(sceneId) {
return request({
url: `/map/scene/getLayerTree/${sceneId}`,
method: 'get'
method: "get",
});
}
@ -115,7 +115,7 @@ export function getLayerTreeBySceneId(sceneId) {
export function getLayerDirsBySceneId(sceneId) {
return request({
url: `/map/scene/getRelationSceneInfo/${sceneId}`,
method: 'get'
method: "get",
});
}
@ -123,10 +123,10 @@ export function getLayerDirsBySceneId(sceneId) {
export function updateSceneLayerDirs(data) {
return request({
url: `/map/scene/dir/saveSceneDirRelation`,
method: 'post',
method: "post",
params: {
...data
}
...data,
},
});
}
@ -134,7 +134,7 @@ export function updateSceneLayerDirs(data) {
export function getSceneConfig(sceneId) {
return request({
url: `/map/scene/config/findConfigBySceneId/${sceneId}`,
method: 'get'
method: "get",
});
}
@ -142,8 +142,8 @@ export function getSceneConfig(sceneId) {
export function updateSceneConfig(data) {
return request({
url: `/map/scene/config/saveOrUpdateConfig`,
method: 'post',
data
method: "post",
data,
});
}
@ -151,28 +151,28 @@ export function updateSceneConfig(data) {
export function deleteLayerApi(id) {
return request({
url: `/map/layer/deleteLayer/${id}`,
method: 'delete'
method: "delete",
});
}
export function deleteSceneById(id) {
return request({
url: `/map/scene/deleteScene/${id}`,
method: 'delete'
method: "delete",
});
}
export function getLayerStyle(id) {
return request({
url: `map/layer/style/${id}`,
method: 'get'
method: "get",
});
}
// 获取图层详情
export function queryServiceInfoApi(url, layer) {
switch (layer.type) {
case '021102': {
case "021102": {
return new Promise(async (resolve, reject) => {
const result = await axios.get(`${url}.json`);
if (result.status === 200 && result.data) {
@ -184,43 +184,44 @@ export function queryServiceInfoApi(url, layer) {
}
});
}
case '081100':
case "081100":
return new Promise(async (resolve, reject) => {
const name = layer.name;
const nameArr = name.split(':');
const splitUrl = url?.split('map-')[0];
const newUrl = `${splitUrl}data-supermap_shuili/rest/data/datasources/shuili/datasets/${nameArr[1]}/fields.json`;
const nameArr = name.split(":");
const splitUrl = url?.split("/rest/")[0];
const token = layer.token;
const newUrl = `${splitUrl.replace("/map-", "/data-")}/rest/data/datasources/${nameArr[0]}/datasets/${nameArr[1]}/fields.json?k=${token}`;
const result = await axios.get(newUrl);
if (result.status === 200 && result.data) {
const fields = result.data.fieldNames.map((item) => {
return {
name: item,
alias: item,
type: '-'
type: "-",
};
});
resolve({ fields });
}
});
case '030300':
case "030300":
return new Promise(async (resolve, reject) => {
const result = await axios.get(
`${url}?service=wfs&version=2.0.0&request=DescribeFeatureType&typeNames=${layer.index}`
`${url}?service=wfs&version=2.0.0&request=DescribeFeatureType&typeNames=${layer.index}`,
);
if (result.status === 200 && result.data) {
const xmlDom = new window.DOMParser().parseFromString(result.data, 'text/xml');
const elements = xmlDom.getElementsByTagName('xs:element');
const xmlDom = new window.DOMParser().parseFromString(result.data, "text/xml");
const elements = xmlDom.getElementsByTagName("xs:element");
let fields = [];
for (let i = 0; i < elements.length; i++) {
const item = elements[i];
const nillable = item.attributes?.nillable;
if (nillable) {
const name = item.attributes.name.value;
const type = item.attributes.type.value.split(':')?.[1];
const type = item.attributes.type.value.split(":")?.[1];
fields.push({
name,
alias: name,
type
type,
});
}
}

184
src/views/aiSupervision/layerManage/resource/LayerDetails.vue

@ -24,8 +24,12 @@
<el-form :model="editDataInfoForm">
<el-form-item label="服务类型" style="font-size: 1rem" :label-width="'120px'">
<el-select style="width: 80%" v-model="editDataInfoForm.serviceType" placeholder="请选择">
<el-option v-for="item in serviceTypeOptions" :key="item.value" :label="item.label"
:value="item.value" />
<el-option
v-for="item in serviceTypeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
@ -41,29 +45,49 @@
<el-form-item label="服务token" prop="serviceToken" style="font-size: 1rem" :label-width="'120px'">
<el-input v-model.trim="editDataInfoForm.serviceToken" style="width: 80%"></el-input>
</el-form-item>
<el-form-item v-if="editDataInfoForm.serviceType === '030300'" label="服务索引" prop="serviceIndex"
style="font-size: 1rem" :label-width="'120px'">
<el-form-item
v-if="editDataInfoForm.serviceType === '030300'"
label="服务索引"
prop="serviceIndex"
style="font-size: 1rem"
:label-width="'120px'"
>
<el-input v-model="editDataInfoForm.serviceIndex" style="width: 80%"></el-input>
</el-form-item>
<el-form-item v-show="['030300'].includes(editDataInfoForm.serviceType)" label="样式选择"
style="font-size: 1rem" :label-width="'120px'">
<el-form-item
v-show="['030300'].includes(editDataInfoForm.serviceType)"
label="样式选择"
style="font-size: 1rem"
:label-width="'120px'"
>
<div class="styleBtn">
<el-tag type="info" effect="plain" class="style-button" :class="{
'style-button-none': editDataInfoForm.relationStyleName,
}" @click="handleLayerStyleTypeChange">
{{
editDataInfoForm.relationStyleName
? editDataInfoForm.relationStyleName
: "点击选择样式"
}}
<el-tag
type="info"
effect="plain"
class="style-button"
:class="{
'style-button-none': editDataInfoForm.relationStyleName,
}"
@click="handleLayerStyleTypeChange"
>
{{ editDataInfoForm.relationStyleName ? editDataInfoForm.relationStyleName : "点击选择样式" }}
</el-tag>
<el-button style="margin-left: 15px" :disabled="editDataInfoForm.relationStyleName === ''" @click="
editDataInfoForm.relationStyleName = '';
editDataInfoForm.relationStyleId = '';
">取消选择样式</el-button>
<el-button
style="margin-left: 15px"
:disabled="editDataInfoForm.relationStyleName === ''"
@click="
editDataInfoForm.relationStyleName = '';
editDataInfoForm.relationStyleId = '';
"
>取消选择样式</el-button
>
</div>
<styleListDialogVue :visible="styleDialogVisible" :$currentStyleId="editDataInfoForm.relationStyleId"
@closeDialog="styleDialogVisible = false" @confirm="handleConfirm"></styleListDialogVue>
<styleListDialogVue
:visible="styleDialogVisible"
:$currentStyleId="editDataInfoForm.relationStyleId"
@closeDialog="styleDialogVisible = false"
@confirm="handleConfirm"
></styleListDialogVue>
</el-form-item>
</el-form>
</el-tab-pane>
@ -91,14 +115,38 @@
</el-table-column>
<el-table-column label="操作" width="200">
<template slot-scope="scope">
<el-button v-if="scope.row.isEdit" type="primary" icon="el-icon-success" size="mini"
@click="saveRow(scope.$index)">保存</el-button>
<el-button v-if="scope.row.isEdit" type="warning" icon="el-icon-error" size="mini"
@click="cancelRow(scope.$index)">取消</el-button>
<el-button v-if="!scope.row.isEdit" type="primary" icon="el-icon-edit" size="mini"
@click="editRow(scope.$index)">编辑</el-button>
<el-button v-if="!scope.row.isEdit" type="danger" icon="el-icon-delete-solid" size="mini"
@click="deleteRow(scope.$index)">删除</el-button>
<el-button
v-if="scope.row.isEdit"
type="primary"
icon="el-icon-success"
size="mini"
@click="saveRow(scope.$index)"
>保存</el-button
>
<el-button
v-if="scope.row.isEdit"
type="warning"
icon="el-icon-error"
size="mini"
@click="cancelRow(scope.$index)"
>取消</el-button
>
<el-button
v-if="!scope.row.isEdit"
type="primary"
icon="el-icon-edit"
size="mini"
@click="editRow(scope.$index)"
>编辑</el-button
>
<el-button
v-if="!scope.row.isEdit"
type="danger"
icon="el-icon-delete-solid"
size="mini"
@click="deleteRow(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
@ -113,15 +161,13 @@
</div>
<el-table max-height="400px" :data="fieldsTable" border>
<el-table-column type="index" width="50" align="center"></el-table-column>
<el-table-column prop="field" label="字段名称">
</el-table-column>
<el-table-column prop="field" label="字段名称"> </el-table-column>
<el-table-column prop="fieldName" label="字段别名">
<template slot-scope="scope">
<el-input v-model="scope.row.fieldName"></el-input>
</template>
</el-table-column>
<el-table-column prop="fieldType" label="字段类型">
</el-table-column>
<el-table-column prop="fieldType" label="字段类型"> </el-table-column>
<el-table-column prop="isShow" label="支持查询" width="80" align="center">
<template slot-scope="scope">
<el-checkbox v-model="scope.row.isShow" :true-label="1" :false-label="0"></el-checkbox>
@ -137,20 +183,21 @@
</div>
</el-dialog>
<div class="keyword-filter">
<el-input class="keyword-input" placeholder="请输入内容" v-model="keyword" clearable>
</el-input>
<el-input class="keyword-input" placeholder="请输入内容" v-model="keyword" clearable> </el-input>
<el-button class="search-btn">搜索</el-button>
</div>
</div>
<div class="content">
<el-table :data="tableData" stripe style="width: 100%">
<el-table-column type="index" :index="(index) =>
index + (pageOptions.pageNum - 1) * pageOptions.pageSize + 1
" label="序号" width="50" header-align="center"></el-table-column>
<el-table-column prop="id" label="图层资源目录编号" width="350">
</el-table-column>
<el-table-column prop="serviceNameAlias" label="图层资源名称">
</el-table-column>
<el-table-column
type="index"
:index="(index) => index + (pageOptions.pageNum - 1) * pageOptions.pageSize + 1"
label="序号"
width="50"
header-align="center"
></el-table-column>
<el-table-column prop="id" label="图层资源目录编号" width="350"> </el-table-column>
<el-table-column prop="serviceNameAlias" label="图层资源名称"> </el-table-column>
<el-table-column prop="pubDate" label="创建时间"> </el-table-column>
<el-table-column prop="createUser" label="创建人"> </el-table-column>
<el-table-column label="操作">
@ -160,8 +207,14 @@
</template>
</el-table-column>
</el-table>
<el-pagination background layout="prev, pager, next" :current-page.sync="pageOptions.pageNum"
:total="pageOptions.total" :page-size="pageOptions.pageSize" @current-change="getLayerList">
<el-pagination
background
layout="prev, pager, next"
:current-page.sync="pageOptions.pageNum"
:total="pageOptions.total"
:page-size="pageOptions.pageSize"
@current-change="getLayerList"
>
</el-pagination>
</div>
</el-container>
@ -255,6 +308,7 @@ export default {
"editDataInfoForm.serviceUrl"(val) {
if (val) {
if (!this.queryServiceUrlMap.has(val)) {
debugger;
this.queryLayerByUrl(val);
} else {
this.fieldsTable = this.queryServiceUrlMap.get(val);
@ -277,13 +331,9 @@ export default {
methods: {
searchField() {
if (this.fieldValue === "") {
this.fieldsTable = this.queryServiceUrlMap.get(
this.editDataInfoForm.serviceUrl
);
this.fieldsTable = this.queryServiceUrlMap.get(this.editDataInfoForm.serviceUrl);
} else {
this.fieldsTable = this.fieldsTable.filter((item) =>
item.field.includes(this.fieldValue)
);
this.fieldsTable = this.fieldsTable.filter((item) => item.field.includes(this.fieldValue));
}
},
goBack() {
@ -306,15 +356,11 @@ export default {
},
handleDelete(row) {
this.$confirm(
"删除图层将同时删除该图层资源以及关联的图层数据,删除后将不可恢复,是否继续删除?",
"提示",
{
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}
)
this.$confirm("删除图层将同时删除该图层资源以及关联的图层数据,删除后将不可恢复,是否继续删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(async () => {
const res = await deleteLayerApi(row.id);
if (res.success) {
@ -356,8 +402,7 @@ export default {
if (!reg.test(this.editDataInfoForm.serviceName)) {
this.$message({
type: "info",
message:
"格式有误,目录名称仅支持中文、数字、字母、下划线、冒号,最大长度不超过100",
message: "格式有误,目录名称仅支持中文、数字、字母、下划线、冒号,最大长度不超过100",
});
return;
}
@ -366,10 +411,7 @@ export default {
extendData: JSON.stringify(this.extendTable),
fields: this.fieldsTable,
};
this.queryServiceUrlMap.set(
this.editDataInfoForm.serviceUrl,
this.fieldsTable
);
this.queryServiceUrlMap.set(this.editDataInfoForm.serviceUrl, this.fieldsTable);
await saveOrUpdateLayerApi(params);
this.getLayerList();
this.dialogFormVisible = false;
@ -427,9 +469,7 @@ export default {
if (index !== undefined) {
this.extendTable.splice(index, 1);
} else {
this.extendTable = this.extendTable.filter(
(item) => !this.multipleSelection.includes(item)
);
this.extendTable = this.extendTable.filter((item) => !this.multipleSelection.includes(item));
}
})
.catch(() => {
@ -455,9 +495,7 @@ export default {
}
//
const name = this.extendTable[index].field;
const isRepeat = this.extendTable.some(
(item, i) => item.field === name && i !== index
);
const isRepeat = this.extendTable.some((item, i) => item.field === name && i !== index);
if (isRepeat) {
this.$message({
type: "info",
@ -471,16 +509,16 @@ export default {
this.multipleSelection = val;
},
showFieldExtend() {
return ["021102", "081100", "030300"].includes(
this.editDataInfoForm.serviceType
);
return ["021102", "081100", "030300"].includes(this.editDataInfoForm.serviceType);
},
queryLayerByUrl(url) {
debugger;
queryServiceInfoApi(url, {
type: this.editDataInfoForm.serviceType,
url: url,
index: this.editDataInfoForm.serviceIndex,
name: this.editDataInfoForm.serviceName,
token: this.editDataInfoForm.serviceToken,
alias: this.editDataInfoForm.serviceNameAlias,
}).then((res) => {
this.fieldsTable =

118
vue.config.js

@ -1,13 +1,13 @@
'use strict';
const path = require('path');
const defaultSettings = require('./src/settings.js');
"use strict";
const path = require("path");
const defaultSettings = require("./src/settings.js");
// const httpConfig = require('./public/config')
const webpack = require('webpack');
const webpack = require("webpack");
function resolve(dir) {
return path.join(__dirname, dir);
}
const name = defaultSettings.title || '智慧水利水工程应用v24.3.0'; // 标题
const name = defaultSettings.title || "智慧水利水工程应用v24.3.0"; // 标题
const port = process.env.port || process.env.npm_config_port || 80; // 端口
@ -18,18 +18,18 @@ module.exports = {
// 部署生产环境和开发环境下的URL。
// 默认情况下,Vue CLI 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
publicPath: './',
publicPath: "./",
// 在npm run build 或 yarn build 时 ,生成文件的目录名称(要和baseUrl的生产环境路径一致)(默认dist)
outputDir: 'dist',
outputDir: "dist",
// 用于放置生成的静态资源 (js、css、img、fonts) 的;(项目打包之后,静态资源会放在这个文件夹下)
assetsDir: 'static',
assetsDir: "static",
// 是否开启eslint保存检测,有效值:true | false | 'error'
lintOnSave: process.env.NODE_ENV === 'development',
lintOnSave: process.env.NODE_ENV === "development",
// 如果你不需要生产环境的 source map,可以将其设置为 false 以加速生产环境构建。
productionSourceMap: false,
// webpack-dev-server 相关配置
devServer: {
host: '0.0.0.0',
host: "0.0.0.0",
// host: '192.168.1.104',
// host: '127.0.0.1',
port: 80,
@ -68,18 +68,18 @@ module.exports = {
// }
// },
["profile"]: {
target: 'http://shuili-admin.product.dev.com:30115',
changeOrigin: true
},
target: "http://shuili-admin.product.dev.com:30115",
changeOrigin: true,
},
[process.env.VUE_APP_BASE_API]: {
target: 'http://shuili-admin.product.dev.com:30115',
target: "http://shuili-admin.product.dev.com:30115",
// target: 'http://172.16.34.59:18082',
// target: "http://172.16.34.27:18082",
// target: "http://127.0.0.1:18082",
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '/tianhui-admin-web'
}
["^" + process.env.VUE_APP_BASE_API]: "/tianhui-admin-web",
},
},
'/iserver': {
target: 'http://172.16.34.41:8090',
@ -89,90 +89,90 @@ module.exports = {
// '^/iserver': ''
// }
},
'/mapserver': {
target: 'http://172.16.32.63/tiles',
"/mapserver": {
target: "http://172.16.32.63/tiles",
changeOrigin: true,
pathRewrite: {
'^/mapserver': ''
}
}
"^/mapserver": "",
},
},
},
disableHostCheck: true
disableHostCheck: true,
},
configureWebpack: {
name: name,
resolve: {
alias: {
'@': resolve('src')
}
"@": resolve("src"),
},
},
plugins: [
new webpack.ProvidePlugin({
$: 'jquery',
jQuery: 'jquery',
'window.jQuery': 'jquery',
'window.$': 'jquery',
Popper: ['popper.js', 'default']
})
]
$: "jquery",
jQuery: "jquery",
"window.jQuery": "jquery",
"window.$": "jquery",
Popper: ["popper.js", "default"],
}),
],
},
chainWebpack(config) {
config.plugins.delete('preload'); // TODO: need test
config.plugins.delete('prefetch'); // TODO: need test
config.plugins.delete("preload"); // TODO: need test
config.plugins.delete("prefetch"); // TODO: need test
// set svg-sprite-loader
config.module.rule('svg').exclude.add(resolve('src/assets/icons')).end();
config.module.rule("svg").exclude.add(resolve("src/assets/icons")).end();
config.module
.rule('icons')
.rule("icons")
.test(/\.svg$/)
.include.add(resolve('src/assets/icons'))
.include.add(resolve("src/assets/icons"))
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.use("svg-sprite-loader")
.loader("svg-sprite-loader")
.options({
symbolId: 'icon-[name]'
symbolId: "icon-[name]",
})
.end();
config.when(process.env.NODE_ENV !== 'development', (config) => {
config.when(process.env.NODE_ENV !== "development", (config) => {
config
.plugin('ScriptExtHtmlWebpackPlugin')
.after('html')
.use('script-ext-html-webpack-plugin', [
.plugin("ScriptExtHtmlWebpackPlugin")
.after("html")
.use("script-ext-html-webpack-plugin", [
{
// `runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/
}
inline: /runtime\..*\.js$/,
},
])
.end();
config.optimization.splitChunks({
chunks: 'all',
chunks: "all",
cacheGroups: {
libs: {
name: 'chunk-libs',
name: "chunk-libs",
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: 'initial' // only package third parties that are initially dependent
chunks: "initial", // only package third parties that are initially dependent
},
elementUI: {
name: 'chunk-elementUI', // split elementUI into a single package
name: "chunk-elementUI", // split elementUI into a single package
priority: 20, // the weight needs to be larger than libs and app or it will be packaged into libs or app
test: /[\\/]node_modules[\\/]_?element-ui(.*)/ // in order to adapt to cnpm
test: /[\\/]node_modules[\\/]_?element-ui(.*)/, // in order to adapt to cnpm
},
commons: {
name: 'chunk-commons',
test: resolve('src/components'), // can customize your rules
name: "chunk-commons",
test: resolve("src/components"), // can customize your rules
minChunks: 3, // minimum common number
priority: 5,
reuseExistingChunk: true
}
}
reuseExistingChunk: true,
},
},
});
config.optimization.runtimeChunk('single'),
config.optimization.runtimeChunk("single"),
{
from: path.resolve(__dirname, './public/robots.txt'), //防爬虫文件
to: './' //到根目录下
from: path.resolve(__dirname, "./public/robots.txt"), //防爬虫文件
to: "./", //到根目录下
};
});
}
},
};

Loading…
Cancel
Save