feat: 地图列表批量删除 — checkbox多选+POST batch-delete API
This commit is contained in:
@@ -123,6 +123,22 @@ def delete_map(map_id: int, db: Session = Depends(get_db)):
|
|||||||
return {"message": "已删除"}
|
return {"message": "已删除"}
|
||||||
|
|
||||||
|
|
||||||
|
@router.post("/batch-delete")
|
||||||
|
def batch_delete_maps(data: dict, db: Session = Depends(get_db)):
|
||||||
|
"""批量删除战略地图"""
|
||||||
|
ids = data.get("ids", [])
|
||||||
|
if not ids:
|
||||||
|
raise HTTPException(400, "请选择要删除的地图")
|
||||||
|
deleted = 0
|
||||||
|
for mid in ids:
|
||||||
|
m = db.query(StrategicMap).filter(StrategicMap.id == mid).first()
|
||||||
|
if m:
|
||||||
|
db.delete(m)
|
||||||
|
deleted += 1
|
||||||
|
db.commit()
|
||||||
|
return {"message": f"已删除 {deleted} 个地图", "deleted": deleted}
|
||||||
|
|
||||||
|
|
||||||
# ── 连线管理 ─────────────────────────────────
|
# ── 连线管理 ─────────────────────────────────
|
||||||
|
|
||||||
def _get_connections(m: StrategicMap) -> list:
|
def _get_connections(m: StrategicMap) -> list:
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ export const mapApi = {
|
|||||||
create: (data: any) => api.post('/maps', data),
|
create: (data: any) => api.post('/maps', data),
|
||||||
update: (id: number, data: any) => api.put(`/maps/${id}`, data),
|
update: (id: number, data: any) => api.put(`/maps/${id}`, data),
|
||||||
delete: (id: number) => api.delete(`/maps/${id}`),
|
delete: (id: number) => api.delete(`/maps/${id}`),
|
||||||
|
batchDelete: (ids: number[]) => api.post('/maps/batch-delete', { ids }),
|
||||||
createWithTemplate: (data: any) => api.post('/maps/create-with-template', data),
|
createWithTemplate: (data: any) => api.post('/maps/create-with-template', data),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,13 @@
|
|||||||
<div>
|
<div>
|
||||||
<div style="display:flex;justify-content:space-between;margin-bottom:16px;">
|
<div style="display:flex;justify-content:space-between;margin-bottom:16px;">
|
||||||
<h3>战略地图</h3>
|
<h3>战略地图</h3>
|
||||||
|
<div>
|
||||||
|
<el-button type="danger" size="small" :disabled="selectedIds.length === 0" @click="batchDelete">批量删除({{ selectedIds.length }})</el-button>
|
||||||
<el-button type="primary" @click="showForm=true;form={}">新建地图</el-button>
|
<el-button type="primary" @click="showForm=true;form={}">新建地图</el-button>
|
||||||
</div>
|
</div>
|
||||||
<el-table :data="maps" style="width:100%">
|
</div>
|
||||||
|
<el-table :data="maps" style="width:100%" @selection-change="onSelectionChange">
|
||||||
|
<el-table-column type="selection" width="40" />
|
||||||
<el-table-column prop="title" label="地图名称" min-width="200" />
|
<el-table-column prop="title" label="地图名称" min-width="200" />
|
||||||
<el-table-column prop="version" label="版本" width="80" />
|
<el-table-column prop="version" label="版本" width="80" />
|
||||||
<el-table-column prop="status" label="状态" width="80">
|
<el-table-column prop="status" label="状态" width="80">
|
||||||
@@ -66,6 +70,24 @@ const showForm = ref(false)
|
|||||||
const editingMap = ref<any>(null)
|
const editingMap = ref<any>(null)
|
||||||
const form = ref<any>({})
|
const form = ref<any>({})
|
||||||
const createMode = ref("blank")
|
const createMode = ref("blank")
|
||||||
|
const selectedIds = ref<number[]>([])
|
||||||
|
|
||||||
|
function onSelectionChange(rows: any[]) {
|
||||||
|
selectedIds.value = rows.map(r => r.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
async function batchDelete() {
|
||||||
|
if (selectedIds.value.length === 0) return
|
||||||
|
try {
|
||||||
|
await ElMessageBox.confirm(`确定删除选中的 ${selectedIds.value.length} 个地图?`, "批量删除")
|
||||||
|
await mapApi.batchDelete(selectedIds.value)
|
||||||
|
ElMessage.success(`已删除 ${selectedIds.value.length} 个地图`)
|
||||||
|
selectedIds.value = []
|
||||||
|
load()
|
||||||
|
} catch (e: any) {
|
||||||
|
if (e !== "cancel") ElMessage.error("批量删除失败")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function load() {
|
async function load() {
|
||||||
try { const r: any = await mapApi.list(); maps.value = r.data || [] } catch (e) {}
|
try { const r: any = await mapApi.list(); maps.value = r.data || [] } catch (e) {}
|
||||||
|
|||||||
Reference in New Issue
Block a user