parent
eabb939ad2
commit
edf7a8b669
7 changed files with 919 additions and 33 deletions
@ -0,0 +1,644 @@ |
||||
<template> |
||||
<!-- 新增的一键布/撤防页面 --> |
||||
<basic-container> |
||||
<avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" ref="crud" v-model="form" |
||||
:permission="permissionList" :before-open="beforeOpen" @search-change="searchChange" @search-reset="searchReset" |
||||
@selection-change="selectionChange" @current-change="currentChange" @size-change="sizeChange" |
||||
@refresh-change="refreshChange" @on-load="onLoad" :selecttable="selectable1"> |
||||
<template slot="menuLeft"> |
||||
<el-button type="primary" icon="el-icon-plus" size="small" @click="handleAdd"> |
||||
新 增 |
||||
</el-button> |
||||
<el-button type="danger" icon="el-icon-delete" size="small" plain @click="handleDelete"> |
||||
删 除 |
||||
</el-button> |
||||
</template> |
||||
<template slot-scope="{row}" slot="status"> |
||||
<el-tag type="danger" v-show="row.status == 0">关闭</el-tag> |
||||
<el-tag type="success" v-show="row.status == 1">开启</el-tag> |
||||
</template> |
||||
<template #menu="{ size, row, index }"> |
||||
<el-button type="text" icon="el-icon-view" size="small" @click="handleDetail(row, index)">详情</el-button> |
||||
<el-button type="text" icon="el-icon-edit" size="small" @click="handleEdit(row, index)">编辑</el-button> |
||||
<el-button type="text" icon="el-icon-delete" size="small" v-show="row.status == 1 && row.type == 1" @click="handleSetup(row, index)">布防</el-button> |
||||
<el-button type="text" icon="el-icon-delete" size="small" v-show="row.status == 1 && row.type == 2" @click="handleClose(row, index)">撤防</el-button> |
||||
<el-button type="text" icon="el-icon-delete" size="small" @click="handleDeleteRow(row, index)">删除</el-button> |
||||
<!-- <el-button type="text" icon="el-icon-view" size="small" v-show="row.status == 1" @click="handleDetail(row, index)">停用</el-button> |
||||
<el-button type="text" icon="el-icon-edit" size="small" v-show="row.status == 0" @click="handleEdit(row, index)">启用</el-button> --> |
||||
|
||||
</template> |
||||
</avue-crud> |
||||
<el-dialog title="布/撤防设置" :visible.sync="dialogVisible" v-if="dialogVisible" :append-to-body="true" |
||||
:close-on-click-modal="false" :close-on-press-escape="false" custom-class="dia_box" width="950px"> |
||||
<el-form :model="addForm" ref="addform" :rules="addRules" label-width="100px"> |
||||
<el-row :gutter="20"> |
||||
<el-col :span="12"> |
||||
<el-form-item label="任务标题:" prop="taskTitle"> |
||||
<el-input v-model="addForm.taskTitle" placeholder="请输入任务标题" :disabled="isDetail ? true : false" |
||||
maxlength="30" clearable> |
||||
</el-input> |
||||
</el-form-item> |
||||
<!-- <el-form-item label="任务时间:" prop="executeTime"> |
||||
<el-time-picker v-model="addForm.executeTime" placeholder="请选择任务时间" :disabled="isDetail ? true : false" |
||||
value-format="HH:mm" format="HH:mm" style="width:100%;"> |
||||
</el-time-picker> |
||||
</el-form-item> --> |
||||
<el-form-item label="是否启用:" prop="status"> |
||||
<el-switch v-model="addForm.status" active-value="1" inactive-value="0" :disabled="isDetail ? true : false"> |
||||
</el-switch> |
||||
</el-form-item> |
||||
</el-col> |
||||
<el-col :span="12"> |
||||
<el-form-item label="任务类型:" prop="type"> |
||||
<el-radio-group v-model="addForm.type" :disabled="isDetail ? true : false"> |
||||
<el-radio :label="1">布防</el-radio> |
||||
<el-radio :label="2">撤防</el-radio> |
||||
</el-radio-group> |
||||
</el-form-item> |
||||
|
||||
</el-col> |
||||
</el-row> |
||||
<el-form-item label="选择设备:"> |
||||
<el-table class="table_box" ref="multipleTable" row-key="id" :data="tableData" tooltip-effect="dark" |
||||
style="width: 100%" @selection-change="handleSelectionChange" size="small"> |
||||
<el-table-column type="selection" width="55" align="center" reserve-selection :selectable="selectable"> |
||||
</el-table-column> |
||||
<el-table-column prop="name" label="设备名称"> |
||||
<template slot-scope="scope"> |
||||
{{ scope.row.name }}/{{ scope.row.remark }} |
||||
</template> |
||||
</el-table-column> |
||||
<el-table-column prop="productName" label="设备所属产品"> |
||||
</el-table-column> |
||||
<el-table-column prop="nodeLabel" label="节点类型"> |
||||
</el-table-column> |
||||
<el-table-column prop="gateway" label="网关信息"> |
||||
</el-table-column> |
||||
<el-table-column prop="statusLabel" label="设备状态"> |
||||
</el-table-column> |
||||
<el-table-column prop="createTime" label="创建时间" width="160px"> |
||||
</el-table-column> |
||||
</el-table> |
||||
<div class="page_box"> |
||||
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" |
||||
:current-page="diaPage.currentPage" :page-sizes="[10, 20, 30, 40]" :page-size="diaPage.pageSize" background |
||||
layout="total, sizes, prev, pager, next, jumper" :total="diaPage.total"> |
||||
</el-pagination> |
||||
</div> |
||||
</el-form-item> |
||||
<el-form-item label="任务描述:" prop="taskDescribe"> |
||||
<el-input type="textarea" v-model="addForm.taskDescribe" placeholder="请输入任务描述" |
||||
:disabled="isDetail ? true : false" maxlength="200" show-word-limit> |
||||
</el-input> |
||||
</el-form-item> |
||||
</el-form> |
||||
<div slot="footer" class="dialog-footer"> |
||||
<el-button @click="dialogVisible = false">取 消</el-button> |
||||
<el-button type="primary" @click="submitForm" v-if="!isDetail">确 认</el-button> |
||||
</div> |
||||
</el-dialog> |
||||
</basic-container> |
||||
</template> |
||||
|
||||
<script> |
||||
import { mapGetters } from "vuex"; |
||||
import { bizLogin, bizDeviceList, bizDeviceStatus, bizNodeType, cornJobList, cornJobSave, cornJobUpdate, cornJobRemove,setUpDecive,closeDecive } from "@/api/wirelessintrusion/wirelessintrusion"; |
||||
|
||||
export default { |
||||
data() { |
||||
return { |
||||
form: {}, |
||||
query: {}, |
||||
dialogVisible: false, |
||||
loading: true, |
||||
page: { |
||||
pageSize: 10, |
||||
currentPage: 1, |
||||
total: 0 |
||||
}, |
||||
diaPage: { |
||||
pageSize: 10, |
||||
currentPage: 1, |
||||
total: 10, |
||||
}, |
||||
addForm: {}, |
||||
addRules: { |
||||
taskTitle: [ |
||||
{ required: true, message: "请输入任务标题", trigger: "blur,change" }, |
||||
], |
||||
// executeTime: [ |
||||
// { required: true, message: "请选择任务时间", trigger: "change" }, |
||||
// ], |
||||
}, |
||||
selectionList: [], |
||||
option: { |
||||
height: 'auto', |
||||
menuWidth: 200, |
||||
calcHeight: 30, |
||||
dialogWidth: 950, |
||||
tip: false, |
||||
searchShow: true, |
||||
searchMenuSpan: 6, |
||||
searchLabelWidth: 100, |
||||
border: true, |
||||
addBtn: false, |
||||
viewBtn: false, |
||||
editBtn: false, |
||||
delBtn: false, |
||||
selection: true, |
||||
excelBtn: false, |
||||
dialogClickModal: false, |
||||
column: [ |
||||
// { |
||||
// label: "关联设备", |
||||
// prop: "deviceId", |
||||
// overHidden: true, |
||||
// }, |
||||
{ |
||||
label: "模板名称", |
||||
prop: "taskTitle", |
||||
minWidth: 200, |
||||
overHidden: true, |
||||
}, |
||||
{ |
||||
label: "模板说明", |
||||
prop: "taskDescribe", |
||||
minWidth: 200, |
||||
overHidden: true, |
||||
}, |
||||
// { |
||||
// label: "布/撤防时间", |
||||
// prop: "executeTime", |
||||
// addDisplay: false, |
||||
// editDisplay: false, |
||||
// viewDisplay: false, |
||||
// formatter: (data) => { |
||||
// let time = data.executeTime.split(":"); |
||||
// return time[0] + ':' + time[1]; |
||||
// } |
||||
// }, |
||||
|
||||
{ |
||||
label: "任务类型", |
||||
type: "select", |
||||
prop: "type", |
||||
dicData: [ |
||||
{ value: 1, label: '布防' }, { value: 2, label: '撤防' } |
||||
], |
||||
search: true, |
||||
// hide: true |
||||
}, |
||||
{ |
||||
label: "模板状态", |
||||
prop: "status", |
||||
align: "center", |
||||
slot: true, |
||||
}, |
||||
{ |
||||
label: "创建时间", |
||||
prop: "createTime", |
||||
align: "center", |
||||
width: 150 |
||||
}, |
||||
] |
||||
}, |
||||
tableData: [], |
||||
data: [], |
||||
multipleSelection: [], |
||||
isDetail: false |
||||
}; |
||||
}, |
||||
computed: { |
||||
...mapGetters(["permission"]), |
||||
permissionList() { |
||||
return { |
||||
addBtn: this.vaildData(this.permission.notice_add, false), |
||||
viewBtn: this.vaildData(this.permission.notice_view, false), |
||||
delBtn: this.vaildData(this.permission.notice_delete, false), |
||||
editBtn: this.vaildData(this.permission.notice_edit, false) |
||||
}; |
||||
}, |
||||
}, |
||||
mounted() { |
||||
this.loadDict(); |
||||
}, |
||||
methods: { |
||||
//字典加载 |
||||
loadDict() { |
||||
let token = window.sessionStorage.getItem('bizToken'); |
||||
if (token == 'undefined' || !token) { |
||||
bizLogin({ appKey: 'Arf7bd4f26', appSecret: 'kb207044c8' }).then(res => { |
||||
window.sessionStorage.setItem('bizToken', res.data.data.token); |
||||
bizDeviceStatus(res.data.data.token).then(res => { |
||||
this.bizDeviceStatus = res.data.data; |
||||
}) |
||||
bizNodeType(res.data.data.token).then(res => { |
||||
this.bizNodeType = res.data.data; |
||||
}) |
||||
}) |
||||
} else { |
||||
bizDeviceStatus(token).then(res => { |
||||
if (res.data.code == 401) { |
||||
window.sessionStorage.removeItem('bizToken'); |
||||
this.loadDict(); |
||||
} |
||||
else if (res.data.code == 200) { |
||||
this.bizDeviceStatus = res.data.data; |
||||
} |
||||
}) |
||||
bizNodeType(token).then(res => { |
||||
this.bizNodeType = res.data.data; |
||||
}) |
||||
} |
||||
}, |
||||
//节点类型转换 |
||||
renderLabel(node, col) { |
||||
const dicData = this[col]; |
||||
let idx = dicData.findIndex(item => item.dictValue == node); |
||||
return idx > -1 ? dicData[idx].dictLabel : ''; |
||||
}, |
||||
//设备列表多选框禁选 |
||||
selectable() { |
||||
return this.isDetail ? false : true; |
||||
}, |
||||
//任务列表多选框禁选 |
||||
selectable1(row, index) { |
||||
return row.status == 1 ? false : true; |
||||
}, |
||||
//点击新增按钮 |
||||
handleAdd() { |
||||
this.addForm = { |
||||
taskTitle: '', |
||||
taskDescribe: '', |
||||
type: 1, |
||||
ids: '', |
||||
deviceId: '', |
||||
status: '1' |
||||
} |
||||
this.multipleSelection = []; |
||||
this.dialogVisible = true; |
||||
this.isDetail = false; |
||||
this.diaPage.currentPage = 1; |
||||
this.$nextTick(() => { |
||||
this.$refs.multipleTable.clearSelection(); |
||||
this.queryDeviceList(this.diaPage); |
||||
}) |
||||
}, |
||||
// 弹窗表格多选 |
||||
handleSelectionChange(val) { |
||||
this.multipleSelection = val; |
||||
}, |
||||
// 弹窗确认按钮 |
||||
submitForm() { |
||||
this.$refs.addform.validate((valid) => { |
||||
if (valid) { |
||||
if (this.multipleSelection.length === 0 && this.addForm.deviceId == '') { |
||||
this.$message({ |
||||
type: "warning", |
||||
message: "请选择关联设备" |
||||
}) |
||||
return; |
||||
} |
||||
if (this.multipleSelection.length > 0) { |
||||
let ids = [], deviceId = [], hostSerialNumber = []; |
||||
this.multipleSelection.forEach(ele => { |
||||
let tags = JSON.parse(ele.tags) |
||||
ids.push(ele.id); |
||||
deviceId.push(tags.pmac); |
||||
hostSerialNumber.push(tags.hostNumber); |
||||
}); |
||||
this.addForm.ids = ids.join(","); |
||||
this.addForm.deviceId = deviceId.join(","); |
||||
this.addForm.hostSerialNumber = hostSerialNumber.join(","); |
||||
this.addForm.isRegular = 0 |
||||
} |
||||
this.submitLoading = true; |
||||
console.log('addForm ===>',this.addForm) |
||||
if (this.addForm.id > 0) { |
||||
cornJobUpdate(this.addForm).then((res) => { |
||||
this.submitLoading = false; |
||||
this.dialogVisible = false; |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: "success", |
||||
message: "操作成功!" |
||||
}); |
||||
}, () => { |
||||
this.submitLoading = false; |
||||
}) |
||||
} else { |
||||
cornJobSave(this.addForm).then(res => { |
||||
console.log('res ====>',res) |
||||
if(res.data.code == 200){ |
||||
this.submitLoading = false; |
||||
this.dialogVisible = false; |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: "success", |
||||
message: "操作成功!" |
||||
}); |
||||
}else if(res.data.code == 400){ |
||||
this.submitLoading = false; |
||||
this.$message.error(res.data.msg) |
||||
} |
||||
|
||||
}, () => { |
||||
this.submitLoading = false; |
||||
}) |
||||
} |
||||
} |
||||
}) |
||||
}, |
||||
searchReset() { |
||||
this.query = {}; |
||||
this.onLoad(this.page); |
||||
}, |
||||
searchChange(params, done) { |
||||
this.query = params; |
||||
this.page.currentPage = 1; |
||||
this.onLoad(this.page, params); |
||||
done(); |
||||
}, |
||||
selectionChange(list) { |
||||
console.log(list) |
||||
this.selectionList = list; |
||||
}, |
||||
selectionClear() { |
||||
this.selectionList = []; |
||||
this.$refs.crud.toggleSelection(); |
||||
}, |
||||
//查看详情 |
||||
handleDetail(row) { |
||||
row.status = row.status + ''; |
||||
this.addForm = row; |
||||
this.dialogVisible = true; |
||||
this.isDetail = true; |
||||
console.log('diaPage ====>',this.diaPage) |
||||
this.$nextTick(() => { |
||||
this.queryDeviceList(this.diaPage); |
||||
}) |
||||
}, |
||||
//点击编辑按钮 |
||||
handleEdit(row, index) { |
||||
row.status = row.status + ''; |
||||
// let time = row.executeTime.split(":"); |
||||
// row.executeTime = time[0] + ':' + time[1]; |
||||
this.addForm = JSON.parse(JSON.stringify(row)) ; |
||||
this.dialogVisible = true; |
||||
this.isDetail = false; |
||||
this.$nextTick(() => { |
||||
this.$refs.multipleTable.clearSelection(); |
||||
this.queryDeviceList(this.diaPage); |
||||
}) |
||||
}, |
||||
handleDelete() { |
||||
if (this.selectionList.length === 0) { |
||||
this.$message.warning("请选择至少一条数据"); |
||||
return; |
||||
} |
||||
this.$confirm("确定将选择数据删除?", { |
||||
confirmButtonText: "确定", |
||||
cancelButtonText: "取消", |
||||
type: "warning" |
||||
}) |
||||
.then(() => { |
||||
return cornJobRemove({ ids: this.ids.join(",") }); |
||||
}) |
||||
.then(() => { |
||||
this.onLoad(this.page); |
||||
this.selectionClear(); |
||||
this.$message({ |
||||
type: "success", |
||||
message: "操作成功!" |
||||
}); |
||||
}); |
||||
}, |
||||
handleSetup(row){ |
||||
let arr = [] |
||||
if(row.deviceId.indexOf(',') > -1){ |
||||
row.deviceId.split(',').map(item =>{ |
||||
arr.push(item) |
||||
}) |
||||
}else{ |
||||
arr.push(row.deviceId.substr(-1)) |
||||
} |
||||
console.log('arr =========>',arr.join(',')) |
||||
this.$confirm("确定进行布防吗?", { |
||||
confirmButtonText: "确定", |
||||
cancelButtonText: "取消", |
||||
type: "warning" |
||||
}).then(() =>{ |
||||
setUpDecive({hostSerialNumber:row.hostSerialNumber,num:arr.join(',')}).then(res =>{ |
||||
if(res.data.code == 200){ |
||||
this.$message.success('布防成功'); |
||||
this.onLoad(this.page); |
||||
}else{ |
||||
this.$message.error('布防失败') |
||||
} |
||||
}) |
||||
}) |
||||
}, |
||||
// 撤防 |
||||
handleClose(row){ |
||||
let arr = [] |
||||
if(row.deviceId.indexOf(',') > -1){ |
||||
row.deviceId.split(',').map(item =>{ |
||||
arr.push(item) |
||||
}) |
||||
}else{ |
||||
arr.push(row.deviceId.substr(-1)) |
||||
} |
||||
console.log('arr =========>',arr.join(',')) |
||||
this.$confirm("确定进行撤防吗?", { |
||||
confirmButtonText: "确定", |
||||
cancelButtonText: "取消", |
||||
type: "warning" |
||||
}).then(() =>{ |
||||
closeDecive({hostSerialNumber:row.hostSerialNumber,num:arr.join(',')}).then(res =>{ |
||||
if(res.data.code == 200){ |
||||
this.$message.success('撤防成功'); |
||||
this.onLoad(this.page); |
||||
}else{ |
||||
this.$message.error('撤防失败') |
||||
} |
||||
}) |
||||
}) |
||||
|
||||
}, |
||||
handleDeleteRow(row) { |
||||
this.$confirm("确定将选择数据删除?", { |
||||
confirmButtonText: "确定", |
||||
cancelButtonText: "取消", |
||||
type: "warning" |
||||
}) |
||||
.then(() => { |
||||
return cornJobRemove({ ids: row.id }); |
||||
}) |
||||
.then(() => { |
||||
this.onLoad(this.page); |
||||
this.$message({ |
||||
type: "success", |
||||
message: "操作成功!" |
||||
}); |
||||
}); |
||||
}, |
||||
currentChange(currentPage) { |
||||
this.page.currentPage = currentPage; |
||||
}, |
||||
sizeChange(pageSize) { |
||||
this.page.pageSize = pageSize; |
||||
}, |
||||
refreshChange() { |
||||
this.onLoad(this.page, this.query); |
||||
}, |
||||
onLoad(page, params = {}) { |
||||
let values = { |
||||
...params, |
||||
...this.query |
||||
}; |
||||
this.loading = true; |
||||
cornJobList({ current: page.currentPage, size: page.pageSize, ...values,isRegular:0 }).then(res => { |
||||
const data = res.data.data; |
||||
this.page.total = data.total; |
||||
this.data = data.records; |
||||
this.loading = false; |
||||
this.selectionClear(); |
||||
}, err => { |
||||
this.loading = false; |
||||
this.selectionClear(); |
||||
}); |
||||
}, |
||||
//设备列表 |
||||
queryDeviceList(page, params = {}) { |
||||
let values = { |
||||
...params, |
||||
pid: 100 |
||||
}; |
||||
let token = window.sessionStorage.getItem('bizToken'); |
||||
if (token == 'undefined' || !token) { |
||||
bizLogin({ appKey: 'Arf7bd4f26', appSecret: 'kb207044c8' }).then(res => { |
||||
window.sessionStorage.setItem('bizToken', res.data.data.token); |
||||
bizDeviceList(res.data.data.token, { ...values, pageSize: page.pageSize, pageNum: page.currentPage,'params[type]':3}).then(res2 => { |
||||
const data = res2.data; |
||||
this.diaPage.total = data.total; |
||||
data.rows.map(item => { |
||||
item.node = item.bizProduct.node; |
||||
item.nodeLabel = this.renderLabel(item.node, 'bizNodeType'); |
||||
item.statusLabel = this.renderLabel(item.status, 'bizDeviceStatus') |
||||
item.productName = item.bizProduct.name; |
||||
}) |
||||
this.tableData = data.records; |
||||
let multipleSelection = this.addForm.ids ? this.addForm.ids.split(",") : []; |
||||
if (multipleSelection.length > 0) { // 判断是否存在勾选过的数据 |
||||
this.$nextTick(() => { |
||||
this.tableData.forEach(row => { // 获取数据列表接口请求到的数据 |
||||
multipleSelection.forEach(item => { // 勾选到的数据 |
||||
if (row.id === parseInt(item)) { |
||||
this.$refs.multipleTable.toggleRowSelection(row, true); // 若有重合,则回显该条数据 |
||||
} |
||||
}); |
||||
}) |
||||
}) |
||||
|
||||
} |
||||
}); |
||||
}) |
||||
} else { |
||||
bizDeviceList(token, { ...values, pageSize: page.pageSize, pageNum: page.currentPage, pid: 100,'params[type]':3 }).then(res2 => { |
||||
if (res2.data.code == 401) { |
||||
window.sessionStorage.removeItem('bizToken'); |
||||
this.queryDeviceList(); |
||||
} |
||||
else if (res2.data.code == 200) { |
||||
const data = res2.data; |
||||
this.diaPage.total = data.total; |
||||
data.rows.map(item => { |
||||
item.node = item.bizProduct.node; |
||||
item.nodeLabel = this.renderLabel(item.node, 'bizNodeType'); |
||||
item.statusLabel = this.renderLabel(item.status, 'bizDeviceStatus') |
||||
item.productName = item.bizProduct.name; |
||||
}) |
||||
this.tableData = data.rows; |
||||
let multipleSelection = this.addForm.ids ? this.addForm.ids.split(",") : []; |
||||
if (multipleSelection.length > 0) { // 判断是否存在勾选过的数据 |
||||
this.$nextTick(() => { |
||||
this.tableData.forEach(row => { // 获取数据列表接口请求到的数据 |
||||
multipleSelection.forEach(item => { // 勾选到的数据 |
||||
if (row.id === parseInt(item)) { |
||||
this.$refs.multipleTable.toggleRowSelection(row, true); // 若有重合,则回显该条数据 |
||||
} |
||||
}); |
||||
}) |
||||
}) |
||||
} |
||||
} |
||||
}, err => { |
||||
}); |
||||
} |
||||
} |
||||
} |
||||
}; |
||||
</script> |
||||
|
||||
<style lang="scss" scoped> |
||||
::v-deep .cancel_item { |
||||
background: url('~@/assets/image/cancel_iten.png') center no-repeat; // 注意此处的url,在这里引入自己的图片 |
||||
font-size: 12px; |
||||
background-size: cover; |
||||
} |
||||
|
||||
::v-deep .cancel_item:before { |
||||
content: "替"; |
||||
font-size: 12px; |
||||
visibility: hidden; |
||||
} |
||||
|
||||
::v-deep .add_item { |
||||
background: url('~@/assets/image/add.png') center no-repeat; // 注意此处的url,在这里引入自己的图片 |
||||
font-size: 12px; |
||||
background-size: cover; |
||||
} |
||||
|
||||
::v-deep .add_item:before { |
||||
content: "替"; |
||||
font-size: 12px; |
||||
visibility: hidden; |
||||
} |
||||
|
||||
.table_box { |
||||
th.el-table__cell { |
||||
background: #F7F8FA; |
||||
} |
||||
} |
||||
|
||||
.dia_box { |
||||
height: 700px; |
||||
overflow: auto; |
||||
|
||||
.el-table { |
||||
width: 100% !important; |
||||
border: 1px solid #D6D8DF; |
||||
} |
||||
|
||||
.el-table th.el-table__cell { |
||||
background: #F7F8FA; |
||||
} |
||||
|
||||
.dialog-footer { |
||||
width: 100%; |
||||
height: 100%; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
} |
||||
|
||||
.page_box { |
||||
width: 90%; |
||||
margin-left: 9%; |
||||
display: flex; |
||||
align-items: center; |
||||
justify-content: center; |
||||
margin-top: 15px; |
||||
} |
||||
} |
||||
</style> |
||||
@ -0,0 +1,80 @@ |
||||
<!DOCTYPE html> |
||||
<html lang="en"> |
||||
<head> |
||||
<meta charset="UTF-8"> |
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
||||
<title>Document</title> |
||||
<style> |
||||
*{ |
||||
margin: 0; |
||||
padding: 0; |
||||
box-sizing: border-box; |
||||
} |
||||
ul{ |
||||
margin: 200px auto; |
||||
width: 200px; |
||||
list-style-type: none; |
||||
} |
||||
li{ |
||||
margin: 5px; |
||||
text-align: center; |
||||
width: 200px; |
||||
height: 30px; |
||||
background: skyblue; |
||||
} |
||||
.list .moving{ |
||||
background: transparent; |
||||
color: transparent; |
||||
border: 1px dashed #ccc; |
||||
} |
||||
</style> |
||||
</head> |
||||
<body> |
||||
<ul class="list"> |
||||
<li draggable="true">1</li> |
||||
<li draggable="true">2</li> |
||||
<li draggable="true">3</li> |
||||
<li draggable="true">4</li> |
||||
<li draggable="true">5</li> |
||||
</ul> |
||||
|
||||
<script> |
||||
let list = document.querySelector('.list') |
||||
let currentLi |
||||
list.addEventListener('dragstart',(e)=>{ |
||||
e.dataTransfer.effectAllowed = 'move' |
||||
currentLi = e.target |
||||
setTimeout(()=>{ |
||||
currentLi.classList.add('moving') |
||||
}) |
||||
}) |
||||
|
||||
list.addEventListener('dragenter',(e)=>{ |
||||
console.log('e===========>',e) |
||||
|
||||
e.preventDefault() |
||||
if(e.target === currentLi||e.target === list){ |
||||
return |
||||
} |
||||
let liArray = Array.from(list.childNodes) |
||||
let currentIndex = liArray.indexOf(currentLi) |
||||
let targetindex = liArray.indexOf(e.target) |
||||
|
||||
if(currentIndex<targetindex){ |
||||
|
||||
list.insertBefore(currentLi,e.target.nextElementSibling) |
||||
}else{ |
||||
|
||||
list.insertBefore(currentLi,e.target) |
||||
} |
||||
}) |
||||
list.addEventListener('dragover',(e)=>{ |
||||
e.preventDefault() |
||||
}) |
||||
list.addEventListener('dragend',(e)=>{ |
||||
currentLi.classList.remove('moving') |
||||
}) |
||||
</script> |
||||
</body> |
||||
</html> |
||||
Loading…
Reference in new issue