技术标签: 前端
这个功能是在后台编辑小程序页面,然后在小程序端展示出来。
左侧预览,右侧编辑,下方点击可以添加对应组件。
图片广告(轮播图)组件:
富文本组件:
整体功能的思路是这样的:
新建与编辑是同一个页面,进入页面时请求后端提供的接口拿到数据库中的数据,并展示出来,点击发布按钮请求后端接口把数据保存到数据库中。
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并渲染。
文章浏览阅读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
文章浏览阅读7.6k次,点赞3次,收藏13次。点击上方“五分钟学算法”,选择“星标”公众号重磅干货,第一时间送达链接:https://www.zhihu.com/question/32019460转自 深度学习与计算机视觉公众号声明..._leetcode100题什么水平
文章浏览阅读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编程给手机发验证码
文章浏览阅读507次。【代码】Vue3 highCharts 3D。_highcharts3d安装
文章浏览阅读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_二叉树根节点到目标节点路径
文章浏览阅读3.6k次,点赞4次,收藏11次。QT中Ui文件运行中文显示乱码处理办法_ui->btn_open_serial->settext("打开串口"); 汉字乱码
文章浏览阅读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',
文章浏览阅读1k次。选择最可读、最容易维护的。仅仅因为你可以用一行字写出来并不意味着你应该写出来。您现有的解决方案与我使用iteritems跳过值查找之外的解决方案很接近,如果我可以避免使用嵌套ifs,我讨厌它们:for key, val in d.iteritems():if filter_string not in key:continue# do something然而,如果你真的想要一些东西让你遍历一个过滤的..._python 字典包含某个键 较大 字典
文章浏览阅读1.9k次。最近做一个项目遇到一个问题,就是在silverlight做的bingmap上有几个maplayer,每个maplayer上都有一个右键菜单contextmenu,然后出现问题,每次只有上层的contextmenu响应,下层的不是不显示就是只显示一次,经过搜索,大体了解是什么原因了先来了解下什么是WPF里的路由事件我们创建一个WPF应用程序,代码如下: xmln_silverlight splitbutton contextmenu 位移
文章浏览阅读563次,点赞8次,收藏2次。使用 SQL 创建数据库是一个非常简单的过程,只需要记住 “CREATE DATABASE” 这个简单的语句。另外,我们也学习了如何查看所有数据库以及如何删除数据库。希望这篇文章能帮助到你,让你更加了解如何使用 SQL。
文章浏览阅读8.6k次。上周参加了ICME2016国际会议,做了presentation,也了解到了很多多媒体领域的学术动态和前沿科技,在这里整理分享给大家,希望大家有机会也多多参加这些优秀的会议,在开会的城市游玩之余也是能有很多收获的。会议简介ICME,全称International Conference on Multimedia and Expo,即国际多媒体与博览会议,又IEEE 计算机学会、电路与系统学..._2016international conference on multimedia and expo