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

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

举例:

{ 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. ICG游戏:尼姆游戏异或解法的证明

    描述: 尼姆博奕(Nimm Game),有n堆石子,每堆石子有若干石子,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限.取走最后石子的人获胜. 标准解法: 判断: 先计算先手是必胜还是 ...

  2. 自己动手搭建Git服务器-Gitblit

      首先到官网http://gitblit.com/下载最新版本的Gitblit GO 解压缩到本地目录中 E:\git\gitblit132 官方文档:http://gitblit.com/setu ...

  3. qt4代码到qt5代码出错

    1.error C2039: “toAscii”: 不是“QString”的成员 QT5.0.1把这个函数取消掉了,可以用toLatin1这个函数

  4. [Training Video - 6] [File Reading] Making a Jar file with eclispe, Importing custom jars in SoapUI

    Code example : package com.file.properties; import java.io.FileInputStream; import java.util.Propert ...

  5. AES CFB/OFB/ECB/CBC/CTR优缺点

    AES CFB/OFB/ECB/CBC/CTR优缺点 摘自:http://www.metsky.com/archives/418.html 发表时间:2010年05月11 分类: 网络日志 作者: 天 ...

  6. Mosquitto服务器的搭建以及SSL/TLS安全通信配置

    Mosquitto服务器的搭建以及SSL/TLS安全通信配置 摘自:https://segmentfault.com/a/1190000005079300 openhab  raspberry-pi ...

  7. ADO.net开放式并发

    https://docs.microsoft.com/zh-cn/dotnet/framework/data/adonet/optimistic-concurrency 在多用户环境中,有两种用于更新 ...

  8. HDU 1569 方格取数(2) (最小割)

    方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  9. HAService 刨坑

    High availability is a characteristic of a system, which describes the duration (length of time) for ...

  10. (广搜)可口可乐 -- hdu -- 1495

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=1495 Time Limit: 2000/1000 MS (Java/Others)    Memory ...