<template> <div class="renovation"> <!-- 左侧模块列表 --> <div class="model-list"> <div class="classification-title">基础模块</div> <draggable tag="ul" :list="modelData" v-bind="{group:{ name:'model', pull:'clone',put:false},sort:false, ghostClass: 'ghost'}" @end="handleMoveEnd" @start="handleMoveStart" :move="handleMove" > <li v-for="(model, index) in modelData" :key="index" class="model-item"> <Icon :type="model.icon" /> <span>{{model.name}}</span> </li> </draggable> </div> <!-- 中间展示模块 --> <div class="show-content"> <model-form ref="modelForm" :data="modelForm"></model-form> </div> <!-- 保存按钮 --> <div class="btn-bar"><Button type="primary" @click="saveTemplate">保存模板</Button> <Button @click="resetTemplate">还原模板</Button></div> </div> </template> <script> import { modelData } from './modelConfig'; import Draggable from "vuedraggable"; import ModelForm from './modelForm.vue'; import * as API_floor from '@/api/other.js'; export default { components:{ Draggable, ModelForm }, mounted(){ this.getTemplateItem(this.$route.query.id) }, data() { return { modelData, // 可选模块数据 modelForm:{list:[]} // 模板数据 } }, methods:{ saveTemplate(){ // 保存模板 this.modelForm.list.unshift(this.$refs.modelForm.navList) this.modelForm.list.unshift(this.$refs.modelForm.topAdvert) const modelForm = JSON.stringify(this.modelForm) const data = { id:this.$route.query.id, pageData:modelForm, } API_floor.updateHome(this.$route.query.id, data).then(res=> { if(res.success) { this.$Message.success('保存模板成功'); } else { this.$Message.error(res.message) } }) }, resetTemplate(){ // 还原模板 this.getTemplateItem(this.$route.query.id) }, getTemplateItem(id){ // 获取模板数据 API_floor.getHomeData(id).then(res => { if (res.success) { let pageData = res.result.pageData; if(pageData) { pageData = JSON.parse(pageData); if (pageData.list[0].type === 'topAdvert') { // topAdvert 为顶部广告 navList为导航栏 this.$refs.modelForm.topAdvert = pageData.list[0]; this.$refs.modelForm.navList = pageData.list[1]; pageData.list.splice(0,2) this.modelForm = pageData; } else { this.modelForm = {list:[]} } } else { this.modelForm = {list:[]} } } // this.$refs.modelForm.topAdvert = {}; // this.$refs.modelForm.navList = {} }) } }, watch: { modelForm: { deep: true, handler: function (val) { console.log(val) } } } } </script> <style lang="scss" scoped> .renovation{ position: relative; display: flex; } .model-list{ width: 120px; height:auto; padding: 10px; background: #fff; margin-top: 60px; position: fixed; z-index: 100; box-shadow: 1px 1px 10px #999; .classification-title{ width: 100%; height: 30px; line-height: 30px; } .model-item{ width: 100px; height: 30px; background: #eee; margin-top: 10px; line-height: 30px; text-align: center; color: #999; &:hover{ border: 1px dashed #409EFF; color: #409EFF; cursor: move; } } .ghost::after{ border:none; height: 0; content: ''; } } .show-content{ margin-left: 150px; margin-top: 60px; } .ghost{ background: #fff; height: 30px; position: relative; &::after{ content: '松开鼠标添加模块'; position: absolute; background: #fff; border: 1px dashed #409EFF; color: #409EFF; top: 0; left: 0; width: 100%; height: 50px; text-align: center; line-height: 50px; } } .btn-bar{ position: fixed; width: 100%; background:#fff; height: 50px; padding: 10px; box-shadow: 1px 1px 10px #999; z-index: 99; top: 100px; } </style>