vue实现后台实时编辑预览页面,小程序端展示

这个功能是在后台编辑小程序页面,然后在小程序端展示出来。
左侧预览,右侧编辑,下方点击可以添加对应组件。

图片广告(轮播图)组件:
在这里插入图片描述
富文本组件:
在这里插入图片描述
整体功能的思路是这样的:
新建与编辑是同一个页面,进入页面时请求后端提供的接口拿到数据库中的数据,并展示出来,点击发布按钮请求后端接口把数据保存到数据库中。

json数据格式:

list:[
	{
		cardRight: 1,
		type: "image_ad",
		showRight: false,
		images:[
			{
				url:'',
				title:''
			}
		]
	}
	{
		cardRight: 2,
		type: "rich_text",
		showRight: false,
		content: "<p>这是富文本的内容</p>"
	}
]

父组件左侧思路:

<!--左侧预览区域-->
<div class="list" v-for="(item,index) in list" :key="index" @click="left_click(index)" :class="leftIndex == index ? 'border' : ''">
	<!--删除按钮-->
	<div v-if="leftIndex == index" class="close" @click.stop @click="close(index)">
		<img src="../../assets/xx.png" alt="">
	</div>
	<!--图片广告左侧预览组件-->
	<imageAd v-if="item.type == 'image_ad'" :list="list" :leftIndex="index"></imageAd>
	<!--富文本左侧预览组件-->
	<richText v-if="item.type == 'rich_text'" :list="list" :leftIndex="index"></richText>
</div>
<p class="bottom">添加内容</p>
<div class="add_item">
	<p @click="addImageAd()">图片广告</p>
	<p @click="addRichText()">富文本</p>
</div>
methods: {
	left_click(index){
     var that = this
     that.leftIndex = index
     for(let i=0;i<that.list.length; i++){
       that.list[i].showRight = false
       this.$set(that.list,i,that.list[i])
     }
     // this.$set(that.list,that.list)
     that.list[that.leftIndex].showRight = true
     console.log(that.list)
   },
   addImageAd(){
     var that = this
     that.list.push(
       {
         'showRight':true,
         'cardRight':1,
         'type':'image_ad',
         'images':[]
       }
     )
   },
   addRichText(){
     var that = this
     that.list.push(
       {
         'showRight':true,
         'cardRight':2,
         'type':'rich_text',
         'content':'<p>点击编辑富文本</p>'
       }
     )
   },
}

左侧子组件思路:

拿到父组件传入list和leftIndex,渲染页面即可

父组件右侧思路:

<!-- 编辑区域 -->
<div v-if="list.length && list[leftIndex].showRight">
  <div class="edit_wrap">
    <imageAdEdit v-if="list.length && list[leftIndex].cardRight == 1" :list="list" :leftIndex="leftIndex"></imageAdEdit>
    <richTextEdit @userDefinedEvent="userDefined" v-if="list.length && list[leftIndex].cardRight == 2" :list="list" :leftIndex="leftIndex"></richTextEdit>
  </div>
</div>

右侧子组件思路:
图片广告右侧编辑组件:

<p>建议尺寸: 750px(宽)* 400px(高)</p>
<div v-for="(item,index) in list[leftIndex].images" :key="index" class="add_image">
    <img src="../assets/xx.png" class="close" alt="" @click="close(index)">
    <span class="span1"><i>* </i>图片:</span>
    <!--无图片-->
    <div class="image" v-if="!list[leftIndex].images[index].url">
        <div v-if="list[leftIndex].images[index]">+添加图片</div>
        <input type="file" id="upfile" name="upfile" accept="image/*" @change="upFile(index)">
    </div>
    <!--有图片-->
    <div class="image" v-else>
        <img :src="cdn_url + item.url" alt="">
    </div>
</div>
<div v-if="list[leftIndex].images.length < 5" class="add_ad" @click="add_ad()">+ 添加一个广告</div>
<script>
    import { apis,cdn_url } from '../uitl/config'
    export default {
        data(){
            return{
                cdn_url:cdn_url
            }
        },
        props:["list","leftIndex"],
        methods:{
            add_ad(){//图片添加至list中
                this.list[this.leftIndex].images.push(
                    {
                        url:"",
                        title:""
                    }
                )
            },
            close(index){//删图片
                this.list[this.leftIndex].images.splice(index,1);
            },
            //图片上传至cdn
            upFile(index){
                var that = this
                var reads = new FileReader();
                var file = document.getElementById('upfile').files[0];
                console.log(file)
                if(file.size / 1024 / 1024 > 3){
                    that.$message({
                        message: '图片过大',
                        type: 'error'
                    });
                    return false
                }
                reads.readAsDataURL(file);
                var formData = new FormData();
                formData.append('file',file);
                // 获取图片的签名
                var api_token = localStorage.getItem('api_token')
                that.$axios.post(`${apis}/xxx/xxx/xxx`,{'api_token':api_token}).then(res => {
                    console.log(res.data.data.url)
                    formData.append('policy', res.data.data.policy);
                    formData.append('authorization', res.data.data.authorization);
                    // 上传到cdn
                    that.$axios.post(res.data.data.url,formData).then(res => {
                        console.log(res.data.url)
                        that.list[that.leftIndex].images[index].url = res.data.url
                    })
                })
            }
        }
    }
</script>

富文本右侧编辑组件:
这里就是引用富文本插件并获取内容。

保存发布:
请求接口保存list。

小程序端:
请求接口获取list并渲染。

猜你喜欢

转载自blog.csdn.net/weixin_43631810/article/details/85101308