上传时的效果 预览时的效果
代码如下(可直接全部复制查看,注意:下面上传的接口需要改成你们自己的服务器上传接口)
<view class="col"> <text>编辑富文本</text> <view class="fill_text" bindtap="addText" wx:if="{{baseArr.length == 0}}"> <view>请点击下方图片或文字,编辑内容</view> </view> <block> <view class="enroll-content-item" wx:for="{{baseArr}}" wx:key="index"> <view class="enroll-content-item__header"> <view class="enroll-item__header__content"> <image src="{{item.img}}" class="enroll-content-item__icon"></image> <text class="enroll-content-item__text">{{item.name}}</text> <image bindtap="moveContent" data-type="shang" data-i="{{index}}" src="http://sucai.suoluomei.cn/sucai_zs/images/20200703115147-%E4%B8%8A%402x.png" class="enroll-content-item__down"></image> <image bindtap="moveContent" data-type="xia" data-i="{{index}}" src="http://sucai.suoluomei.cn/sucai_zs/images/20200703115147-%E4%B8%8A%E5%A4%87%E4%BB%BD%402x.png" class="enroll-content-item__down"></image> </view> <image bindtap="deleteContent" data-i="{{index}}" class="enroll-item__header__btn" src="http://sucai.suoluomei.cn/sucai_zs/images/20200703115147-%E5%88%A0%E9%99%A4%402x.png"></image> </view> <!-- 文本 --> <block wx:if="{{item.type == 'text'}}"> <textarea placeholder="请输入描述" data-i="{{index}}" value="{{item.value}}" bindinput="getAddText" maxlength="-1"></textarea> </block> <!-- 图片 --> <block wx:if="{{item.type == 'image'}}"> <view class="enroll-content-item__image-wrapper"> <image mode="aspectFill" class="{{item.value.length === 1 ? 'enroll-content-item__image' : 'enroll-content-item__image-mini'}}" wx:for="{{item.value}}" wx:for-item="ctValItem" wx:for-index="ctValIdx" src="{{ctValItem}}"></image> </view> </block> <!-- 视频 --> <block wx:if="{{item.type == 'video'}}"> <video src="{{item.value}}" class="enroll-content-item__video"></video> </block> </view> </block> <view class="enroll-uploader"> <view class="item" data-type="detail_img" bindtap="getuploadImg"> <image mode="aspectFill" class="icon" src="http://sucai.suoluomei.cn/sucai_zs/images/20200618171425-%E5%9B%BE%E7%89%87.png"></image> <view class="text">图片</view> </view> <view class="item" bindtap="addText"> <image mode="aspectFill" class="icon" src="http://sucai.suoluomei.cn/sucai_zs/images/20200618171425-%E6%B7%BB%E5%8A%A0%E6%96%87%E5%AD%97.png"></image> <view class="text">文字</view> </view> <view class="item" bindtap="getuploadVideo"> <image mode="aspectFill" class="icon" src="http://sucai.suoluomei.cn/sucai_zs/images/20200618171425-%E8%A7%86%E9%A2%91.png"></image> <view class="text">视频</view> </view> </view> </view> <view bindtap="savebtn" class="subimt"> <text>提交</text> </view> <view> <view class="xianqDeat" wx:if='{{description.length > 0}}' wx:for='{{description}}' wx:key='index'> <view class="xianqDeatWenz" wx:if="{{item.type == 'text'}}"> <text>{{item.value}}</text> </view> <view class="tupianxa" wx:if="{{item.type == 'image'}}"> <image wx:for='{{item.value}}' wx:for-item='roes' mode="widthFix" wx:for-index='i' wx:key='i' class="xqTupian" data-item="{{item.value}}" data-img_url="{{roes}}" src="{{roes}}" bindtap="yulanTp"> </image> </view> <view class="shipingBOfanone" wx:if="{{item.type == 'video'}}"> <video src="{{item.value}}" class='video' wx:if="{{videoIndex == index}}" objectFit='contain' autoplay='false' controls></video> <view style="display: {{videoIndex == index ? 'none' : 'block' }};" data-id="{{index}}" bindtap="videoPlay"> <image mode="aspectFill" class="moviseo" src="{{item.value+'?x-oss-process=video/snapshot,t_2000,f_jpg,w_0,h_0,m_fast'}}"> </image> <image class="video-image-play" src="https://sucai.suoluomei.cn/sucai_zs/images/20200321105958-suspended%403x.png" mode="scaleToFill"> </image> </view> </view> </view> </view> const wxRequest = require('../../utils/http.js') const app = getApp() Page({ data: { baseArr: [], //上传的整个数组 upImages: [], //上传的暂存区 textItem: { name: '文字', img: 'http://sucai.suoluomei.cn/sucai_zs/images/20200703115147-%E8%BE%93%E5%85%A5%402x.png', type: 'text', value: '', }, imageItem: { name: '图片', img: 'http://sucai.suoluomei.cn/sucai_zs/images/20200618171425-%E5%9B%BE%E7%89%87.png', type: 'image', value: '', }, videoItem: { name: '视频', img: 'http://sucai.suoluomei.cn/sucai_zs/images/20200618171425-%E8%A7%86%E9%A2%91.png', type: 'video', value: '', }, description: [], //页面渲染的数组 videoIndex: "", }, onLoad: function (options) { this.getgoods() }, onShow: function (options) { }, // 新增详情js // 删除baseArr数组 deleteContent(e) { let that = this let i = e.currentTarget.dataset.i that.data.baseArr.splice(i, 1) that.setData({ baseArr: that.data.baseArr }) }, // 添加文字 addText() { let that = this var textItem = JSON.parse(JSON.stringify(that.data.textItem)) that.data.baseArr.push(textItem) that.setData({ baseArr: that.data.baseArr }) }, // 给文本域赋值 getAddText(e) { let i = e.currentTarget.dataset.i this.data.baseArr[i].value = e.detail.value }, // 添加图片 addImage() { let that = this var imageItem = JSON.parse(JSON.stringify(that.data.imageItem)) that.data.baseArr.push(imageItem) that.setData({ baseArr: that.data.baseArr, forbidden: false }) }, // 添加视频 addVideo() { let that = this var videoItem = JSON.parse(JSON.stringify(that.data.videoItem)) that.data.baseArr.push(videoItem) that.setData({ baseArr: that.data.baseArr, forbidden: false }) }, // 上传图片 getuploadImg(e) { var that = this let i = e.currentTarget.dataset.i let idx = e.currentTarget.dataset.idx let type = e.currentTarget.dataset.type let count = 9 if (type == 'shop_img') { count = 1 } wx.chooseImage({ count: count, sizeType: ['compressed'], sourceType: ['album', 'camera'], success(res) { that.setData({ upImages: [], forbidden: true }) that.getpublish(res.tempFilePaths, 0, type, i, idx) } }) }, // 上传视频 getuploadVideo() { var that = this wx.chooseVideo({ success: function (res) { that.setData({ forbidden: true }) let arr = [] arr.push(res.tempFilePath) that.getpublish(arr, 0, 'video') } }) }, // 递归循环上传图片 //.herbplantist.com/sucai/public/index.php/post/post/uploadFile getpublish(list, i, type, index, idx) { wx.showLoading({ title: '正在上传第' + (i + 1) + '张', }) var that = this wx.uploadFile({ url: "https://api110", filePath: list[i], name: 'file', formData: { key: 'Gn1xVdBiTClSSHKZifg0pTQSU5XGagWO', is_https: 1, }, success(res) { let rows = JSON.parse(res.data) if (rows.status != 200) { app.showToast('上传失败') return false } that.data.upImages.push(rows.info.url) if (i + 1 == list.length) { app.showToast('上传成功') } wx.hideLoading() if (++i < list.length) { that.getpublish(list, i, type); } else { // 上传成功后添加到baseArr数组中 if (type == 'detail_img') { that.data.imageItem.value = that.data.upImages setTimeout(function () { that.addImage() }, 200) } else if (type == 'video') { that.data.videoItem.value = rows.info.url setTimeout(function () { that.addVideo() }, 200) } else if (type == 'shop_img') { that.data.fileList.push(rows.info.url) setTimeout(function () { that.setData({ fileList: that.data.fileList, forbidden: false }) }, 200) } } }, }) }, // 移动文字、图片、视频 moveContent(e) { let that = this let index = e.currentTarget.dataset.i let type = e.currentTarget.dataset.type let arr = this.data.baseArr var temp; temp = arr[index]; switch (type) { case 'shang': if (index == 0) { return false } arr[index] = arr[index - 1]; arr[index - 1] = temp; break; case 'xia': if (index == arr.length - 1) { return false } arr[index] = arr[index + 1]; arr[index + 1] = temp; break; default: break; } that.setData({ baseArr: arr }) }, // 提交接口 savebtn() { let that = this if (that.data.imgsts == false) { app.showToast('图片上传中,请稍后提交') return false } let csdata = { goods_description: JSON.stringify(that.data.baseArr) } that.setData({ description: that.data.baseArr, }) console.log('传给后台的json', csdata) }, // 渲染数据 getgoods() { let goodsArry = [{ name: '文字', img: "http://sucai.suoluomei.cn/sucai_zs/images/20200703115147-%E8%BE%93%E5%85%A5%402x.png", type: "text", value: "sadasd", }, { name: "图片", img: "http://sucai.suoluomei.cn/sucai_zs/images/20200618171425-%E5%9B%BE%E7%89%87.png", type: "image", value: [ "https://sucai.suoluomei.cn/sucai_zs/images/2020/10/22/090933144637eace7c1bf00dabb50b27.jpg", "https://sucai.suoluomei.cn/sucai_zs/images/2020/10/22/bfcb84660b7dce71f68a4da50924bfb2.jpg" ] }, { name: "视频", img: "http://sucai.suoluomei.cn/sucai_zs/images/20200618171425-%E8%A7%86%E9%A2%91.png", type: "video", value: "https://sucai.suoluomei.cn/sucai_zs/video/2020/10/22/5f4bff1a95d0f139567a1062d08b1ff5.mp4", }, { name: "视频", img: "http://sucai.suoluomei.cn/sucai_zs/images/20200618171425-%E8%A7%86%E9%A2%91.png", type: "video", value: "https://sucai.suoluomei.cn/sucai_zs/video/2020/10/22/5f4bff1a95d0f139567a1062d08b1ff5.mp4", }] this.setData({ baseArr: goodsArry, }) }, // 渲染出来的图片预览 yulanTp(e) { let item = e.currentTarget.dataset.item let img_url = e.currentTarget.dataset.img_url var img_list = [] for (let i in item) { img_list.push(item[i]) } wx.previewImage({ current: img_url, urls: img_list }) }, // 点击图片播放视频 videoPlay(e) { let that = this var videoIndex = e.currentTarget.dataset.id that.setData({ videoIndex: videoIndex }) //停止正在播放的视频 var videoContextPrev = wx.createVideoContext(videoIndex + "") videoContextPrev.stop(); setTimeout(function () { //将点击视频进行播放 var videoContext = wx.createVideoContext(videoIndex + "") videoContext.play(); }, 500) }, }) page { background: #f5f5f5; padding: 30rpx; box-sizing: border-box; } .col { padding-top: 30rpx; box-sizing: border-box; border-bottom: 1rpx solid #f5f5f5; } .col text { font-size: 30rpx; } .fill_text { height: 110px; border: 1rpx solid #d6e4ef; margin: 0 auto; padding: 15rpx 0; box-sizing: border-box; margin-top: 30rpx; } .fill_text view { color: rgba(210, 210, 210, 1); font-size: 28rpx; } .enroll-content-item { margin: 0 auto; position: relative; } .enroll-content-item::after { content: ""; position: absolute; -webkit-transform-origin: center; -ms-transform-origin: center; transform-origin: center; -webkit-box-sizing: border-box; box-sizing: border-box; pointer-events: none; top: -50%; left: -50%; right: -50%; bottom: -50%; border: 0 solid #d6e4ef; -webkit-transform: scale(0.5); -ms-transform: scale(0.5); transform: scale(0.5); border-bottom-width: 1PX; } .enroll-content-item__text { margin-right: 30rpx; } .enroll-content-item__textarea { border: none; padding: 0; padding-bottom: 12rpx; } .enroll-content-item__textarea .at-textarea__textarea { font-size: 28rpx; } .enroll-item__header__content { display: -webkit-inline-box; display: -webkit-inline-flex; display: -ms-inline-flexbox; display: inline-flex; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; } .enroll-content-item__header { height: 86rpx; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; line-height: 36rpx; font-size: 28rpx; -webkit-box-pack: justify; -webkit-justify-content: space-between; -ms-flex-pack: justify; justify-content: space-between; } textarea { width: 100% !important; height: 128rpx; font-size: 28rpx; } .enroll-item__header__btn { width: 36rpx; height: 36rpx; } .enroll-content-item__icon { width: 30rpx; height: 30rpx; margin-right: 13rpx; } .enroll-content-item__down { width: 36rpx; height: 36rpx; margin-left: 10rpx; } .enroll-content-item__video { width: 100%; margin-bottom: 24rpx; } .enroll-content-item__image { width: 100%; min-height: 1rpx; margin-bottom: 24rpx; } .enroll-content-item__image-mini { width: 200rpx; height: 200rpx; margin-right: 11rpx; margin-bottom: 15rpx; } .enroll-content-item__image-mini:nth-child(3), .enroll-content-item__image-mini:nth-child(6), .enroll-content-item__image-mini:nth-child(9) { margin-right: 0; } .enroll-uploader { padding: 42rpx 0 32rpx; display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; -webkit-justify-content: space-around; -ms-flex-pack: distribute; justify-content: space-around; -webkit-box-sizing: border-box; box-sizing: border-box; } .enroll-uploader .item { display: -webkit-box; display: -webkit-flex; display: -ms-flexbox; display: flex; -webkit-box-align: center; -webkit-align-items: center; -ms-flex-align: center; align-items: center; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; -ms-flex-direction: column; flex-direction: column; -webkit-box-pack: center; -webkit-justify-content: center; -ms-flex-pack: center; justify-content: center; } .enroll-uploader .item .icon { width: 34rpx; height: 34rpx; margin-bottom: 18rpx; } .enroll-uploader .item .text { font-size: 32rpx; } .enroll-uploader-item { width: 100rpx; height: 100rpx; padding: 24rpx; margin-right: 19rpx; -webkit-box-sizing: border-box; box-sizing: border-box; border: 1rpx dashed #b2b2b2; border-radius: 10rpx; } .subimt { display: flex; justify-content: center; } .subimt text{ font-size: 28rpx; padding: 15rpx 30rpx; box-sizing: border-box; background: red; border-radius: 40rpx; color: #fff; } /* 渲染的样式 */ .xianqDeat { display: flex; flex-direction: column; font-size: 28rpx; } .xianqDeatWenz { margin: 10rpx 0; } .xqTupian { width: 100%; border-radius: 10rpx; margin-bottom: 10rpx; } .tupianxa, .shipingBOfan, .shipingBOfanone { display: flex; flex-direction: column; position: relative; } .shipingBOfan { width: 100%; height: 500rpx; } .shipingBOfanone { width: 100%; height: 500rpx; margin: 0 0 15rpx 0; border-radius: 10rpx; overflow: hidden; } .sdBtonWxpl { position: fixed; left: 30rpx; bottom: 30rpx; display: flex; flex-direction: row; width: 690rpx; border-radius: 40rpx; border: 2rpx solid #fa4753; font-size: 28rpx; z-index: 99; overflow: hidden; } .sdBtonWxpl view:nth-child(1) { display: flex; flex-direction: column; width: 35%; text-align: center; color: #fa4753; background-color: #fff; } .sdBtonWxpl view:nth-child(2) { display: flex; flex-direction: column; width: 65%; text-align: center; color: #fff; background-color: #fa4753; } .moviseo { width: 100%; height: 100%; position: absolute; top: 0; left: 0; } .video-image-play { position: absolute; width: 80rpx; height: 80rpx; top: calc(50% - 40rpx); left: calc(50% - 40rpx); } .video { width: 100%; height: 100%; }