vue实现后台实时编辑预览页面,小程序端展示_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并渲染。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43631810/article/details/85101308

智能推荐

Linux——安装StarUML时提示依赖关系不满足libgcrypt11>=1.4.5_依赖关系不满足libconf-2-4-程序员宅基地

文章浏览阅读4k次。在安装StarUML时,提示“依赖关系不满足libgcrypt11>=1.4.5”解决方法如下: 在终端输入:wget http://mirrors.kernel.org/ubuntu/pool/main/libg/libgcrypt11/libgcrypt11_1.5.3-2ubuntu4.2_amd64.debsudo dpkg -i libgcrypt11_1.5.3-2ubuntu4.2_依赖关系不满足libconf-2-4

刷完 LeetCode 是什么水平?能拿到什么水平的 offer?-程序员宅基地

文章浏览阅读7.6k次,点赞3次,收藏13次。点击上方“五分钟学算法”,选择“星标”公众号重磅干货,第一时间送达链接:https://www.zhihu.com/question/32019460转自 深度学习与计算机视觉公众号声明..._leetcode100题什么水平

用户模块一(发送手机验证码功能的实现)_labview编程给手机发验证码-程序员宅基地

文章浏览阅读645次。一.前端发送验证码的准备工作1.点击发送验证码按钮之后,按钮倒计时功能的实现 <!--buttom标签在from表单内部,默认提交时summmit提交(写一个type属性),单独在外面才是一个普通按钮--> <button class="btn" v-html="htmlValue" type="button" :disabled="disabled" href="javascript:void(0);" @click="sendMobileCode" id="se_labview编程给手机发验证码

Vue3 highCharts 3D_highcharts3d安装-程序员宅基地

文章浏览阅读507次。【代码】Vue3 highCharts 3D。_highcharts3d安装

SpringBoot pdf打印及预览(openhtmltopdf+freemarker)_springboot打印pdf文件-程序员宅基地

文章浏览阅读601次。中可以使用下面的方法来方便建立三种模板加载。(每种方法都会在其内部新建一个模板加载器对象,然后创建。SpringBoot pdf打印及预览(openhtmltopdf+freemarker)_springboot打印pdf文件

求二叉树根节点到指定节点的路径_二叉树根节点到目标节点路径-程序员宅基地

文章浏览阅读1.3w次,点赞14次,收藏69次。算法 求二叉树根节点到指定节点的路径@author:Jingdai@date:2020.11.05题目描述给你一个棵二叉树,再给你一个指定的节点,求根节点到指定节点的路径。如图,比如让你求到 4 节点的路径,则应该返回的路径为 [0, 1, 4] 。思路利用二叉树的先序遍历,寻找指定的节点,同时用一个栈 stack 记录遍历到的节点,当找到需要的节点后立即返回结果。但是这样有一个问题,就是在遍历中 stack 记录的路径中包含一些其他的节点,比如要求上图中到 4 节点的路径,则遍历到 4_二叉树根节点到目标节点路径

随便推点

QT中Ui文件运行中文显示乱码处理办法_ui->btn_open_serial->settext("打开串口"); 汉字乱码-程序员宅基地

文章浏览阅读3.6k次,点赞4次,收藏11次。QT中Ui文件运行中文显示乱码处理办法_ui->btn_open_serial->settext("打开串口"); 汉字乱码

python pip3 install_ubuntu install python/python3 and pip/pip3-程序员宅基地

文章浏览阅读98次。$ make && make installgcc -pthread -c -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -I./Include -DPy_BUILD_CORE -o Modules/python.o ./Modules/python.cgcc -pthread -c -DNDEBUG -..._objects/bytes_methods.c',

python字典包含指定键_筛选python字典中键包含特定字符串的项-程序员宅基地

文章浏览阅读1k次。选择最可读、最容易维护的。仅仅因为你可以用一行字写出来并不意味着你应该写出来。您现有的解决方案与我使用iteritems跳过值查找之外的解决方案很接近,如果我可以避免使用嵌套ifs,我讨厌它们:for key, val in d.iteritems():if filter_string not in key:continue# do something然而,如果你真的想要一些东西让你遍历一个过滤的..._python 字典包含某个键 较大 字典

关于silverlight的ContextMenu问题_silverlight splitbutton contextmenu 位移-程序员宅基地

文章浏览阅读1.9k次。最近做一个项目遇到一个问题,就是在silverlight做的bingmap上有几个maplayer,每个maplayer上都有一个右键菜单contextmenu,然后出现问题,每次只有上层的contextmenu响应,下层的不是不显示就是只显示一次,经过搜索,大体了解是什么原因了先来了解下什么是WPF里的路由事件我们创建一个WPF应用程序,代码如下: xmln_silverlight splitbutton contextmenu 位移

SQL创建数据库-程序员宅基地

文章浏览阅读563次,点赞8次,收藏2次。使用 SQL 创建数据库是一个非常简单的过程,只需要记住 “CREATE DATABASE” 这个简单的语句。另外,我们也学习了如何查看所有数据库以及如何删除数据库。希望这篇文章能帮助到你,让你更加了解如何使用 SQL。

分享一些在ICME2016会议上获得的多媒体领域学术与科技动态_2016international conference on multimedia and exp-程序员宅基地

文章浏览阅读8.6k次。上周参加了ICME2016国际会议,做了presentation,也了解到了很多多媒体领域的学术动态和前沿科技,在这里整理分享给大家,希望大家有机会也多多参加这些优秀的会议,在开会的城市游玩之余也是能有很多收获的。会议简介ICME,全称International Conference on Multimedia and Expo,即国际多媒体与博览会议,又IEEE 计算机学会、电路与系统学..._2016international conference on multimedia and expo