内容很简单,代码做了注释可以看一下

主要是把 文本 标题 标题颜色  图片 赋值到数组内,

举例:

{ pic: "/Share/image/images/bgqq_01.png", text: "可以", title:"",display: "none", color:""} 
 
标题如果没有输入时隐藏,输入后展示,
具体参考代码为准!
下面上图片以代码

小程序代码   直接copy可用。

.wxml

<form bindsubmit='formsubmit'>
  <view class='main'>
    <input class='title' name="title" placeholder="请输入资讯标题" value=''></input>
    <view class='border'>
      <textarea placeholder="请输入" class='textarea' auto-height='true' bindblur="initialization" name="describe" maxlength="100000" value='{{initialization}}' />
      <block wx:for="{{controller}}" wx:for-item="item" wx:key="index">
        <view class='pic'>
          <image src="{{item.pic}}" mode="widthFix"></image>
          <view class='del' bindtap='del' data-index="{{index}}">
            <image mode="widthFix" src='/Share/image/delete.png'></image>
          </view>
        </view>
        <input name="titles{{index}}" placeholder="请输入标题" class='heading' bindblur="bindtitle" style='display:{{item.display}};color:{{item.color}}'></input>
        <view class='row'>

          <textarea placeholder="请输入" auto-height='true' class='textarea' focus wx:if="{{show}}" bindfocus="bintext" bindblur="bindblur" data-index="{{index}}" name="title{{index}}" value='{{item.text}}' />

        </view>
      </block>
      <view class='choice'>
        <view class="addpic" bindtap='bintitle'>
          <view class='selc'>
            <image mode="widthFix" src='/Share/image/title.png'></image>
          </view>
          <text>插入标题</text>
        </view>
        <view class='addtitle' bindtap='binpic'>
          <view class='selc'>
            <image mode="widthFix" src='/Share/image/pic.png'></image>
          </view>
          <text>插入图片</text>
        </view>
        <view class='clear'></view>
      </view>
    </view>
    <view class='null'></view>

  </view>
  <view class="modals modals-bottom-dialog" hidden="{{hideModal}}">
    <view class="modals-cancel" bindtap="hideModal"></view>
    <view class="bottom-dialog-body bottom-pos" animation="{{animationData}}">
      <text>选择标题颜色,</text>
      <text class='right' bindtap='bincolor' data-color="#666">默认</text>
      <view class='clear'></view>
      <view class='selector'>
        <view class='color co0' bindtap='bincolor' data-color="#666"></view>
        <view class='color co1' bindtap='bincolor' data-color="#ccc"></view>
        <view class='color co2' bindtap='bincolor' data-color="#000"></view>
        <view class='color co3' bindtap='bincolor' data-color="#ffc000"></view>
        <view class='color co4' bindtap='bincolor' data-color="#ff5722"></view>
        <view class='color co5' bindtap='bincolor' data-color="#c00000"></view>
        <view class='color co6' bindtap='bincolor' data-color="#ff0000"></view>
        <view class='color co7' bindtap='bincolor' data-color="#008000"></view>
        <view class='color co8' bindtap='bincolor' data-color="#00b050"></view>
        <view class='color co9' bindtap='bincolor' data-color="#92d050"></view>
        <view class='color co10' bindtap='bincolor' data-color="#002060"></view>
        <view class='color co11' bindtap='bincolor' data-color="#0070c0"></view>
        <view class='color co12' bindtap='bincolor' data-color="#00b0f0"></view>
        <view class='color co13' bindtap='bincolor' data-color="#7030a0"></view>
        <view class='clear'></view>
      </view>
    </view>
  </view>
  <button class='submit' form-type='submit'>发布</button>
</form>

.wxcs  

page {
  background: #f2f2f2;
}

.main {
  margin: 20rpx;
  background: white;
  border-radius: 10rpx;
}

.title {
  color: #666;
  font-size: 24rpx;
  border-bottom: 1px solid #f2f2f2;
  padding: 10rpx;
}

.textarea {
  padding: 10rpx;
  font-size: 24rpx;
}

.heading {
  font-size: 38rpx;
  text-align: center;
  border-bottom: 1px dashed #ccc;
  padding-bottom: 10rpx;
  margin-bottom: 30rpx;
}

.pic image {
  width: 100%;
  height: auto;
}

textarea {
  width: 100%;
  color: #666;
  font-size: 32rpx;
  padding-bottom: 10rpx;
}

.choice {
  padding: 20rpx;
  border-top: 10rpx solid #f2f2f2;
}

.selc {
  width: 150rpx;
  height: 60rpx;
}

.choice .addpic {
  width: 150rpx;
  text-align: center;
  font-size: 28rpx;
  color: #666;
  float: left;
  margin-left: 200rpx;
  font-family: '黑体';
}

.choice .addpic image {
  width: 50rpx;
}

.choice .addtitle {
  width: 150rpx;
  text-align: center;
  font-size: 28rpx;
  color: #666;
  float: left;
  font-family: '黑体';
}

.choice .addtitle image {
  width: 50rpx;
}

.null {
  height: 120rpx;
  background: #f2f2f2;
}

.submit {
  width: 100%;
  position: fixed;
  bottom:;
}

.clear {
  clear: both;
}

.right {
  float: right;
}

.left {
  float: left;
}

/*颜色选择*/

.submitview {
  z-index:;
}

.modals {
  position: fixed;
  z-index:;
  top:;
  left:;
  right:;
  bottom:;
}

.modals-cancel {
  position: absolute;
  z-index:;
  top:;
  left:;
  right:;
  bottom:;
  background-color: rgba(0, 0, 0, 0.5);
}

.bottom-dialog-body {
  position: absolute;
  border-radius: 10rpx;
  z-index:;
  bottom:;
  left:;
  right:;
  padding: 30rpx;
  height: 300rpx;
  background-color: #fff;
}

/*动画前初始位置*/

.bottom-pos {
  -webkit-transform: translateY(100%);
  transform: translateY(100%);
}

.pic {
  position: relative;
}

.del {
  position: absolute;
  top: 20rpx;
  right: 0rpx;
  color: white;
  font-size: 28rpx;
  display: inline-block;
  padding: 10rpx;
  border-radius: 10rpx;
}

.del image {
  width: 80rpx;
  border-radius: 7rpx;
}

.modals text {
  display: inline-block;
  color: #666;
}

.selector {
  margin-top: 30rpx;
}

.color {
  width: 60rpx;
  height: 60rpx;
  float: left;
  margin: 30rpx 20rpx;
  border-radius: 50%;
}

.co0 {
  background: #666;
}

.co1 {
  background: #ccc;
}

.co2 {
  background: #000;
}

.co3 {
  background: #ffc000;
}

.co4 {
  background: #ff5722;
}

.co5 {
  background: #c00000;
}

.co6 {
  background: #f00;
}

.co7 {
  background: #008000;
}

.co8 {
  background: #00b050;
}

.co9 {
  background: #92d050;
}

.co10 {
  background: #002060;
}

.co11 {
  background: #0070c0;
}

.co12 {
  background: #00b0f0;
}

.co13 {
  background: #7030a0;
}

/*颜色选择END*/

.wxjs

const app = getApp()
const util = require('../../utils/util.js'); //封装wx.request  以下util.request可以用wx.request代替
Page({
  data: {
    dataList: [], //储存图片
    index: null, //当前点击位置
    text: null, //储存当前输入内容
    initialization: null,
    show: true,
    controller: [
      // { pic: "/Share/image/images/bgqq_01.png", text: "可以", title:"",display: "none", color:""} //举例
    ],
    hideModal: true, //模态框的状态  true-隐藏  false-显示
    animationData: {}, //
    picarr: []
  },
  onLoad: function() {
    var that = this;
    console.log(that.data.controller);
  },

  //提交表单,事先处理图片上传,上传完图片后再调用that.submit()上传数据 参数为广本外的 title文章主标题跟describe文章描述
  formsubmit: function(e) {
    var that = this;
    var controller = that.data.controller;
    var title = e.detail.value.title;
    var describe = e.detail.value.describe;
    wx.showLoading({
      title: "发布中...",
      mask: true
    })
    for (var i = 0; i < controller.length; i++) {
      wx.uploadFile({
        url: util.rootDocment + '/app/Dynamics/upload',
        filePath: controller[i].pic,
        name: 'file',
        header: {
          'content-type': 'multipart/form-data'
        },
        success(res) {
          var newarray = {
            pic: res.data
          }
          that.setData({
            picarr: that.data.picarr.concat(newarray)
          })
          that.submit(title, describe);
        }
      })
    }
  },

  //上传数据
  submit: function(title, describe) {
    var that = this;
    var controller = that.data.controller;
    var str = "";
    //将controller内容转字符串赋值到空字符串str中,因为图片是倒序的所以用var j来处理
    for (var i = 0; i < controller.length; i++) {
      var j = controller.length - i - 1;
      str += that.data.picarr[j].pic + ',' + controller[i].title + ',' + controller[i].color + ',' + controller[i].text + '==';
    }
    //此时的str等于 &quot;83c5e201903230829295134.jpg&quot;,,undefined,根据国际市场的单价,澳大利亚通过在一年内出售铁矿石从中国赚取利润。至少500亿美元。双方合作良好,但澳大利亚采取了一些不合理的行动。澳大利亚怎么了?事实证明,由于多年的贸易,澳大利亚背后的铁矿石交易商有自己的脾气。==&quot;ceb17201903230829292802.jpg&quot;,,undefined,由于中国是一个严重依赖铁矿石的国家,他们知道自己开始经常定价,而不是减少交易量。这是澳大利亚旧生活的结果。重要的是要知道他们的大部分订单来自中国。突然,来自澳大利亚的650亿份订单消失了,这让他们意识到了问题的严重性。==&quot;a12be201903230829296884.png&quot;,小程序很重要,undefined,==
    //以上用==号来作为一个数组的结束,以方便后端处理
    util.request(
      "/app/Dynamics/ins", {
        userid: app.globalData.userid,
        title: title,
        describe: describe,
        content: str
      },
      function(res) {
        wx.hideLoading();
        setTimeout(function() {
          wx.reLaunch({
            url: "/pages/dynamic/index?id=" + app.globalData.userid
          })
        }, 2000)
      }
    )
    console.log(str);
  },

  /* 添加图片*/
  binpic: function() {
    var that = this;
    //这里考虑到性能,对于图片张数做了限制
    if (that.data.dataList.length >= 9) { //超过四张
      wx.showModal({
        title: '温馨提示',
        content: '最多只能添加一张图片哦',
        confirmText: "我知道了",
        confirmColor: "#000000",
        showCancel: false,
        success: function(res) {
          if (res.confirm) {} else if (res.cancel) {}
        }
      })
    } else { //添加图片
      wx.showActionSheet({
        itemList: ['从相册选择', '拍照'],
        itemColor: '#000000',
        success: function(res) {

          var choseType = res.tapIndex == 0 ? "album" : res.tapIndex == 1 ? "camera" : "";
          if (choseType != "") {
            wx.chooseImage({
              sizeType: ['original'], //原图
              sourceType: [choseType],
              count: 1, //每次添加一张
              success: function(res) {
                wx.showLoading({
                  title: "上传中...",
                  mask: true
                })
                console.log(res);
                var info = {
                  pic: res.tempFilePaths[0], //存储本地地址
                  temp: true, //标记是否是临时图片
                  value: '', //存储图片下方相邻的输入框的内容
                }
                that.data.dataList.splice(that.data.imgIndex, 0, info);
                var newarray = {
                  pic: res.tempFilePaths[0],
                  text: "",
                  display: "none",
                  title: ""
                }
                that.setData({
                  dataList: that.data.dataList,
                  controller: that.data.controller.concat(newarray)
                })
                wx.hideLoading();
              }
            })
          }
        },
        fail: function(res) {
          console.log(res.errMsg)
        }
      })
    }

  },

  //描述离开赋值
  initialization: function(e) {
    var that = this;
    that.setData({
      initialization: e.detail.value
    })
  },

  //点击插入标题显示标题
  bintitle: function(e) {
    var that = this;
    var index = that.data.index;
    console.log(that.data.controller);
    that.showModal();
    that.setData({
      ["controller[" + index + "].display"]: "block"
    })

  },

  //标题输入离开后赋值到controller
  bindtitle: function(e) {
    var that = this;
    var index = that.data.index;
    console.log(e.detail.value);
    that.setData({
      ['controller[' + index + '].title']: e.detail.value
    })
  },

  //点击textarea获取当前index
  bintext: function(e) {
    var that = this;
    console.log(e);
    that.setData({
      index: e.target.dataset.index
    })
  },

  //文本内容离开时触发
  bindblur: function(e) {
    var that = this;
    var index = that.data.index;
    console.log(e.detail.value);
    that.setData({
      ["controller[" + index + "].text"]: e.detail.value,
      text: e.detail.value
    })
  },
  //删除当前图片
  del: function(e) {

    var that = this;
    var index = e.currentTarget.dataset.index
    console.log(index);
    console.log(e);
    wx.showModal({
      title: '提示',
      content: '是否删除该记录',
      success: function(res) {
        if (res.confirm) {
          var text = that.data.controller[index].text;
          var controller = that.data.controller;
          controller.splice(index);
          //删除图片把当前的文本内容添加到上面文本内容中,如果index=0代表上面没有文本内容,则加到描述中
          if (index == 0) {
            that.setData({
              initialization: that.data.initialization + '\n' + that.data.text
            })
          } else {
            index = index - 1;
            that.setData({
              ["controller[" + index + "].text"]: that.data.controller[index].text + '\n' + that.data.text
            })
          }
          //End
          that.setData({
            controller: controller
          })
          console.log("删除成功");
          console.log(that.data.controller);
        }
      }
    })
    // console.log(that.data.controller);

  },
  // 显示遮罩层
  showModal: function() {
    var that = this;
    that.setData({
      hideModal: false,
      show: false
    })
    var animation = wx.createAnimation({
      duration: 600, //动画的持续时间 默认400ms   数值越大,动画越慢   数值越小,动画越快
      timingFunction: 'ease', //动画的效果 默认值是linear
    })
    this.animation = animation
    setTimeout(function() {
      that.fadeIn(); //调用显示动画
    }, 200)
  },

  // 隐藏遮罩层
  hideModal: function() {
    var that = this;
    var animation = wx.createAnimation({
      duration: 800, //动画的持续时间 默认400ms   数值越大,动画越慢   数值越小,动画越快
      timingFunction: 'ease', //动画的效果 默认值是linear
    })
    this.animation = animation
    that.fadeDown(); //调用隐藏动画
    setTimeout(function() {
      that.setData({
        hideModal: true,
        show: true
      })
    }, 720) //先执行下滑动画,再隐藏模块

  },

  //动画集
  fadeIn: function() {
    this.animation.translateY(0).step()
    this.setData({
      animationData: this.animation.export() //动画实例的export方法导出动画数据传递给组件的animation属性
    })
  },
  fadeDown: function() {
    this.animation.translateY(300).step()
    this.setData({
      animationData: this.animation.export(),
    })
  },

  //颜色选择
  bincolor: function(e) {
    var that = this;
    var color = e.currentTarget.dataset.color
    var index = that.data.index
    console.log(that.data.index);
    console.log(color);
    that.setData({
      ["controller[" + index + "].color"]: color,
      hideModal: true,
      show: true
    })
  }
});

Think PHP

增加到数据库

    public function ins()
    {
        $param = request()->param();
        $dyn = new Dynamic();
        $data['userid'] = $param['userid'];
        $data['title']  = $param['title'];
        $data['describe'] = $param['describe'];
        $data['content']  = $param['content'];
        $dyn->allowField(true)->save($data);
    }

数据查询(注意)

因为我们上传的是一个字符串,所以在查询时需要把字符串分割成数组后得出文章段落,再把文章的段落分割成数组得到我们要的标题 图片 内容等数据 ,最后把它们全部赋值到一个数组内用json的方式return给小程序前端请求

    public function sel()
    {
        $param = request()->param();
        $res = $dyn->where("id",$param['id'])->find();
        $content = trim($res['content'],"==");    //去除字符串中最后的==
        $content = explode("==", $content);        //以==为结尾,把字符串转为数组
        //遍历以上数组,以,号再次分割转为数组 用于再次遍历得出文章的次标题与颜色图片内容等。
        foreach($content as $key=>$val){
            $test[$key] = explode(",", $val);
        }
        //以下为文本外的 id  主标题  描述  上传时间
        $result['id']        = $res['id'];
        $result['title']        = $res['title'];
        $result['describe']    = $res['describe'];
        $result['create_time'] = $res['create_time'];
        // 将上面的test遍历,拿到以下数据 全部赋值到$result
        foreach($test as $key=>$val){
            $result['content'][$key]['title'] = $val[1];    //标题
            $result['content'][$key]['color'] = $val[2];    //标题颜色
            $pic = trim($val[0],""");
            $result['content'][$key]['pic'] = $Com->dispose($pic);    //图片
            $result['content'][$key]['content'] = $val[3];    //内容
        }
        return json_encode($result);
    }

//END   到这就全部结束了,如写的不好,请多指点,

第一次发,如有问题请留言,请指点,最后多谢支持(鞠躬)

微信小程序富文本编辑,Thinkphp5.1的更多相关文章

  1. [微信小程序] 微信小程序富文本-wxParse的使用

    最近小程序蛮火的,公司要做于是学了一点点小程序 不知道你们有没有遇到过这种问题: 从公司服务器获取的文章内容是有HTML标签格式的一段内容,但是微信是不支持这些标签的,怎么办呢? 1.一般网站后台的文 ...

  2. 微信小程序富文本渲染组件html2wxml及html2wxml代码块格式化在ios下字体过大问题

    1.组件使用: 之前微信小程序的富文本渲染组件用的wxParse,对普通富文本确实可以,但是对于代码格式pre标签则无法使用. 下面这个html2wxml很不错,可以支持代码高亮. 详细文档:http ...

  3. 微信小程序-富文本解析插件wxParse基础使用及问题解决

    一.插件准备 在github上可以直接下载该插件:https://github.com/icindy/wxParse 二.基本使用 1.将插件导入项目: 将wxParse文件夹放在项目目录下,如图: ...

  4. 微信小程序富文本中的图片大小超出屏幕

    这个问题我在小程序社区中提的,后来有个帮我回答了这个问题,我试了一下可以. 解决办法是过滤富文本内容,给图片标签添加一个样式,限制图片的最大宽度. replace(/\<img/gi,   '& ...

  5. 微信小程序 富文本插件 循环渲染方式

    感谢GitHub https://github.com/icindy/wxParse/wiki/wxParse%E5%A4%9A%E6%95%B0%E6%8D%AE%E5%BE%AA%E7%8E%AF ...

  6. 微信小程序富文本

    <div class="weui-panel__bd pad-all fs13 " > <rich-text nodes="{{detail.conte ...

  7. 适用于 Mpvue 的微信小程序富文本解析自定义组件

    废话不多说,直接上方法: 首先 npm 安装 mpvue-wxparse npm i mpvue-wxparse 接下来:使用 <template> <div> <wxP ...

  8. 微信小程序学习指南

    作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...

  9. 微信小程序开源项目库汇总

    最近做了一个微信小程序开源项目库汇总,里面集合了OpenDigg 上的优质的微信小程序开源项目库,方便移动开发人员便捷的找到自己需要的项目工具等,感兴趣的可以到GitHub上给个star. UI组件 ...

随机推荐

  1. Laravel中Trait的用法实例详解

    本文实例讲述了Laravel中Trait的用法.分享给大家供大家参考,具体如下: 看看PHP官方手册对Trait的定义: 自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 trait ...

  2. HBase的FlushLargeStoresPolicy多例族支持

    众所周知,HBase的一个例族flush时,会导致所有例族都跟着被flush.在HBase-0.94的官方说明(http://hbase.apache.org/0.94/book/number.of. ...

  3. Hdu4280 Island Transport 2017-02-15 17:10 44人阅读 评论(0) 收藏

    Island Transport Problem Description In the vast waters far far away, there are many islands. People ...

  4. Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用

    一.gitHub地址及介绍 https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh android-Ultra-Pull-To-Refre ...

  5. IDEA 配置SSH2

    系统换成了mac os,因为喜欢它的界面体验,同时受不了win下面系统对硬盘的疯狂访问.发现在mac下面,IDEA真的不错,速度上快,并且它的智能提示真的很厉害.但是导入一个myeclipse的ssh ...

  6. php 图像处理库ImageMagick windows下的安装

    http://blog.sina.com.cn/s/blog_966e43000101bgqj.html

  7. cesium编程中级(二)源码编译

    cesium编程中级(二)源码编译 有些情况下,比如我们自己从Github下载了最新的代码,或者自己临时修改了一点代码,想要编译后的Build文件夹的内容,需要自行编译源码,这里介绍一下编译的方法 下 ...

  8. Java并发之ReentrantLock详解

    一.入题 ReentrantLock是Java并发包中互斥锁,它有公平锁和非公平锁两种实现方式,以lock()为例,其使用方式为: ReentrantLock takeLock = new Reent ...

  9. 如何处理加括号的四则混合运算表达式——基于二叉树的实现(Eclipse平台 Java版)

    记得上<数据结构>课程时,利用栈的特性解决过四则混合运算表达式.而如今在编写小型关系数据库的时候,编译部分要处理where后面的逻辑表达式——检查语法正确与否的同时,还要将信息传给下一个接 ...

  10. win32拖拽编程

    本文由作者邹启文授权网易云社区发布. 在邮箱大师PC版中,我们需要实现一个功能:账号和邮件夹拖拽排序. 准备 封装win32 API.我们使用到的API有, ImageList_Create.Imag ...