From 3f93bcdd900f39414564595365dcd77d1c954752 Mon Sep 17 00:00:00 2001
From: air <30444667+sszdot@users.noreply.github.com>
Date: Tue, 23 Sep 2025 13:34:38 +0800
Subject: [PATCH] =?UTF-8?q?=E3=80=90=E7=B1=BB=20=20=E5=9E=8B=E3=80=91?=
=?UTF-8?q?=EF=BC=9Afactor=20=E3=80=90=E5=8E=9F=20=20=E5=9B=A0=E3=80=91?=
=?UTF-8?q?=EF=BC=9A=E5=AE=8C=E5=96=84=E5=9C=B0=E5=9B=BE=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=20=E7=BC=96=E8=BE=91=E5=8A=9F=E8=83=BD=20=E3=80=90=E8=BF=87=20?=
=?UTF-8?q?=20=E7=A8=8B=E3=80=91=EF=BC=9A=20=E3=80=90=E5=BD=B1=20=20?=
=?UTF-8?q?=E5=93=8D=E3=80=91=EF=BC=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/store/index.js | 10 +-
.../layout/components/main/mapstyle/add.vue | 160 ++++++++----------
.../layout/components/main/mapstyle/index.vue | 10 +-
3 files changed, 85 insertions(+), 95 deletions(-)
diff --git a/src/store/index.js b/src/store/index.js
index 89cd1b1..9fe1eba 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -1214,24 +1214,24 @@ const store = new Vuex.Store({
const host = rootState.settings.host
const list = res.data.mapStyleList.map(style => {
const tiles = Array.isArray(style.tiles) ? style.tiles : JSON.parse(style.tiles)
- const sourceKey = style.source_key || 'default'
+ const sourceKey = 'default'
+ const spriteUrl = style.sprite && String(style.sprite).trim() ? style.sprite : `${host}/Public/map/sprite`
return {
// 附带原始字段,便于管理端展示和操作
id: style.id,
is_active: Number(style.is_active ?? 1),
sort_order: Number(style.sort_order ?? 0),
- source_key: sourceKey,
name: style.name,
- sprite: `${host}/Public/map/sprite`,
+ sprite: spriteUrl,
glyphs: 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf',
version: 8,
sources: {
[sourceKey]: {
type: 'raster',
- tileSize: Number(style.tileSize || 256),
+ tileSize: 256,
tiles,
- attribution: style.attribution || ''
+ attribution: ''
}
},
layers: [{
diff --git a/src/views/layout/components/main/mapstyle/add.vue b/src/views/layout/components/main/mapstyle/add.vue
index d9289d8..93b5577 100644
--- a/src/views/layout/components/main/mapstyle/add.vue
+++ b/src/views/layout/components/main/mapstyle/add.vue
@@ -21,7 +21,8 @@
-
+
+
@@ -38,23 +39,12 @@
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
- 图层配置
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -116,16 +82,9 @@ export default {
id: null,
name: '',
sprite: '',
- glyphs: '',
+ glyphs: 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf',
version: 8,
- source_name: '',
- source_type: 'raster',
- tile_size: 256,
tiles: [], // 存数组,表单用 tilesInput 辅助
- attribution: '',
- layer_id: '',
- layer_type: 'raster',
- layer_source: '',
is_active: 1,
sort_order: 0
},
@@ -133,23 +92,23 @@ export default {
pageState: 'add',
mapStyleId: this.$route.params.id,
rules: {
- name: [{ required: true, message: '请输入样式名称', trigger: 'blur' }],
- version: [{ type: 'number', required: true, message: '请输入版本', trigger: 'change' }],
- source_name: [{ required: true, message: '请输入 source 名称', trigger: 'blur' }],
- source_type: [{ required: true, message: '请选择 source 类型', trigger: 'change' }],
- tile_size: [{ type: 'number', required: true, message: '请输入瓦片大小', trigger: 'change' }],
- layer_id: [{ required: true, message: '请输入图层ID', trigger: 'blur' }],
- layer_type: [{ required: true, message: '请选择图层类型', trigger: 'change' }],
- layer_source: [{ required: true, message: '请输入图层source', trigger: 'blur' }]
+ name: [{ required: true, message: '请输入样式名称', trigger: 'blur' }]
}
}
},
- created () {
+ async created () {
// 初始化页面状态与预填充
if (this.mapStyleId != null) {
this.pageState = 'edit'
this.form.id = this.mapStyleId
- const item = (this.$store.state.mapStyleList || []).find(i => String(i.id) === String(this.mapStyleId))
+ let item = (this.$store.state.mapStyleList || []).find(i => String(i.id) === String(this.mapStyleId))
+ if (!item) {
+ // 尝试拉取一次列表后再匹配(兼容刷新后store丢失)
+ try {
+ await this.$store.dispatch('fetchMapStyleList', this.$store.state.settings.host)
+ item = (this.$store.state.mapStyleList || []).find(i => String(i.id) === String(this.mapStyleId))
+ } catch (e) {}
+ }
if (item) {
this.fillFormFromItem(item)
} else {
@@ -172,24 +131,23 @@ export default {
},
fillFormFromItem (item) {
this.form.name = item.name || ''
- this.form.sprite = item.sprite || ''
- this.form.glyphs = item.glyphs || ''
- this.form.version = Number(item.version ?? 8)
- this.form.source_name = item.source_name || ''
- this.form.source_type = item.source_type || 'raster'
- this.form.tile_size = Number(item.tile_size ?? 256)
+ // 如果包含默认路径,设置为空字符串
+ this.form.sprite = (item.sprite && item.sprite.includes('/Public/map/sprite')) ? '' : (item.sprite || '')
+ this.form.glyphs = item.glyphs || 'mapbox://fonts/mapbox/{fontstack}/{range}.pbf'
+ this.form.version = 8
// tiles 兼容字符串JSON或数组
let tiles = []
- if (Array.isArray(item.tiles)) tiles = item.tiles
- else if (typeof item.tiles === 'string') {
- try { tiles = JSON.parse(item.tiles) } catch (e) { tiles = [] }
+ if (Array.isArray(item.tiles)) {
+ tiles = item.tiles
+ } else if (typeof item.tiles === 'string') {
+ try {
+ tiles = JSON.parse(item.tiles)
+ } catch (e) {
+ tiles = item.tiles.split('\n').filter(Boolean)
+ }
}
this.form.tiles = tiles
- this.tilesInput = tiles.join('\n')
- this.form.attribution = item.attribution || ''
- this.form.layer_id = item.layer_id || ''
- this.form.layer_type = item.layer_type || 'raster'
- this.form.layer_source = item.layer_source || ''
+ this.tilesInput = Array.isArray(tiles) ? tiles.join('\n') : tiles
this.form.is_active = Number(item.is_active ?? 1)
this.form.sort_order = Number(item.sort_order ?? 0)
},
@@ -197,26 +155,56 @@ export default {
this.$refs.formRef && this.$refs.formRef.resetFields()
this.tilesInput = ''
this.form.version = 8
- this.form.source_type = 'raster'
- this.form.tile_size = 256
- this.form.layer_type = 'raster'
this.form.is_active = 1
this.form.sort_order = 0
},
handleSubmit () {
- this.$refs.formRef.validate((valid) => {
- if (!valid) return
- // 准备 tiles
- const tiles = this.parseTilesInput(this.tilesInput)
- if (!tiles.length) {
- this.$message.error('请至少填写一个瓦片URL')
- return
- }
- this.form.tiles = tiles
+ this.$refs.formRef.validate(valid => {
+ if (valid) {
+ // 处理 tiles 输入
+ this.form.tiles = this.parseTilesInput(this.tilesInput)
+ if (this.form.tiles.length === 0) {
+ this.$message.warning('请至少输入一个瓦片URL')
+ return
+ }
- // 提交占位:待接入 store actions: fetchAddMapStyle / fetchSaveMapStyle
- this.$message.success(`${this.pageState === 'add' ? '创建' : '更新'}成功(示例页,待接入后端)`)
- this.$router.replace('/mapstyle/index')
+ // 准备提交的数据,只包含必要的字段
+ const submitData = {
+ name: this.form.name,
+ // 如果sprite为空,使用默认路径
+ sprite: this.form.sprite || '/Public/map/sprite',
+ glyphs: this.form.glyphs,
+ tiles: this.form.tiles,
+ is_active: this.form.is_active,
+ sort_order: this.form.sort_order
+ }
+
+ // 如果是编辑模式,添加ID
+ if (this.pageState === 'edit' && this.form.id) {
+ submitData.id = this.form.id
+ }
+
+ const loading = this.$loading({ lock: true })
+ const action = this.pageState === 'add'
+ ? this.$store.dispatch('addMapStyle', submitData)
+ : this.$store.dispatch('saveMapStyle', submitData)
+
+ action.then(res => {
+ if (res.data.status === 1) {
+ this.$message.success(res.data.msg)
+ this.$router.push('/layout/mapstyle')
+ } else {
+ this.$message.error(res.data.msg || '操作失败')
+ }
+ }).catch(e => {
+ this.$message.error(e.message || '请求出错')
+ }).finally(() => {
+ loading.close()
+ })
+ } else {
+ this.$message.warning('请正确填写表单')
+ return false
+ }
})
}
}
diff --git a/src/views/layout/components/main/mapstyle/index.vue b/src/views/layout/components/main/mapstyle/index.vue
index c895c69..9cb9c8c 100644
--- a/src/views/layout/components/main/mapstyle/index.vue
+++ b/src/views/layout/components/main/mapstyle/index.vue
@@ -24,7 +24,7 @@
{{ (currentPage - 1) * pageSize + scope.$index + 1 }}
-
+
{{ displayName(scope.row, scope.$index) }}
@@ -98,10 +98,12 @@ export default {
this.$message.error('只能选择一条记录')
return
}
- // 这里暂时用序号作为 id(样式可能没有后端 id),编辑页仅作占位
const row = sel[0]
- const id = typeof row === 'object' && row.id != null ? row.id : this.styleList.indexOf(row)
- this.$router.push('/mapstyle/edit/' + id)
+ if (!row || row.id == null) {
+ this.$message.error('此样式缺少后端ID,无法编辑')
+ return
+ }
+ this.$router.push('/mapstyle/edit/' + row.id)
}
}
}