表单设计器附件的上传、显示和下载

简介: 表单设计器附件的上传、显示和下载

本文采用开源的form-generator和element-ui,相关技术可以参考下面的链接

form-generator: https://github.com/JakHuang/form-generator

element-ui: https://element.eleme.cn//#/zh-CN/component/installation

修改组件render.js

function vModel(dataObject, defaultValue)增加下面文件

//获取上传表单元素组件 上传// add by nbacheng 2022-07-19的文件
  if (this.conf.__config__.tag === 'el-upload') {
    // 上传表单元素组件 的成功和移除事件;
    dataObject.attrs['on-success'] = (response, file, fileList) => {
      this.$emit('upload', response, file, fileList)
    }

    dataObject.attrs['on-remove'] = (file, fileList) => {
      this.$emit('deleteUpload', file, fileList)
    }

    dataObject.attrs['on-preview'] = (file) => {
      this.$emit('download', file)
    }
    return
  }
  // add by nbacheng 2022-07-19

同时在组件Parser增加下面内容

function buildListeners(scheme) {
  const config = scheme.__config__
  const methods = this.formConf.__methods__ || {}
  const listeners = {}

  // 给__methods__中的方法绑定this和event
  Object.keys(methods).forEach(key => {
    listeners[key] = event => methods[key].call(this, event)
  })
  // 响应 render.js 中的 vModel $emit('input', val)
  listeners.input = event => setValue.call(this, event, config, scheme)
  //上传表单元素组件的成功和移除事件; // add by nbacheng 2022-07-19
  listeners.upload = (response, file, fileList) => setUpload.call(this, config, scheme,response, file, fileList)
  listeners.deleteUpload = (file, fileList) => deleteUpload.call(this, config, scheme,file, fileList)
  //listeners.download = (file) => download.call(this, file)
  // add by nbacheng 2022-07-19
  return listeners
}

//获取上传表单元素组件 上传的文件 // add by nbacheng 2022-07-19
function setUpload(config, scheme, response, file, fileList) {
  //response: 上传接口返回的数据sponse}
  var filename=response.message.substring(response.message.lastIndexOf('/')+1)  //获取文件名称
  let fileObj = {name: filename, url: response.message}
  let oldValue = JSON.parse(this[this.formConf.formModel][scheme.__vModel__])
  console.log("setUpload response=",response)
  if (oldValue) {
    oldValue.push(fileObj)
  } else {
    oldValue = [fileObj]
  }
  console.log("setUpload oldValue=",oldValue)
  this.$set(config, 'defaultValue', JSON.stringify(oldValue))
  this.$set(this[this.formConf.formModel], scheme.__vModel__, JSON.stringify(oldValue))
}
//获取上传表单元素组件 删除文件后的文件列表
function deleteUpload(config, scheme, file, fileList) {
  let oldValue = JSON.parse(this[this.formConf.formModel][scheme.__vModel__])

  //file 删除的文件
  //过滤掉删除的文件
  let newValue = oldValue.filter(item => item.name !== file.name)
  this.$set(config, 'defaultValue', JSON.stringify(newValue))
  this.$set(this[this.formConf.formModel], scheme.__vModel__, JSON.stringify(newValue))
}


//点击进行下载文件
function download(file) {
  var a = document.createElement('a');
  var event = new MouseEvent('click');
  a.download = file.name;
  a.href = file.url;
  a.dispatchEvent(event);
}
// add by nbacheng 2022-07-19

同时在下面的初始化Form数据里增加token

initFormData(componentList, formData) {
      componentList.forEach(cur => {
        const vModel = cur.__vModel__
        const val = formData[vModel]
        const config = cur.__config__
        if (config.tag === 'el-upload') {
          // 如果需要token,可以设置 
          const token = Vue.ls.get(ACCESS_TOKEN);
          cur['headers'] = {"X-Access-Token":token};
        }  
        if (cur.__vModel__) {
            formData[cur.__vModel__] = config.defaultValue
        }
        if (config.children) this.initFormData(config.children, formData)
      })
    },

同时在自己需要显示的页面上增加

<div style="margin-left:10%;margin-bottom: 20px">
           <!--对上传文件进行显示处理,临时方案 add by nbacheng 2022-07-27 -->
           <el-upload :on-preview="handleFilePreview" :file-list="fileList" v-if="fileDisplay" />
 </div>

mounted() {
      //表单数据回填,模拟异步请求场景
      setTimeout(() => {
        // 回填数据,这里主要是处理文件显示
        this.fillFormData(this.variablesData.fields, this.variablesData)
        // 更新表单
        this.key = +new Date().getTime()
      }, 1000)
    },

fillFormData(fields, formConf) {
        const { formModel, formRef } = formConf
        fields.forEach((item, i) => {
          const vModel = item.__vModel__
          const val = item.__config__.defaultValue 
          // 特殊处理el-upload,包括 回显图片
          if (item.__config__.tag === 'el-upload') {
            
            // 回显图片
            console.log("fillFormData val=",JSON.parse(val))
            this.fileDisplay = true
            console.log('item=',item['list-type'])
            if(item['list-type'] != 'text') {
              this.fileList = ''    //隐藏加的el-upload文件列表
              item['file-list'] = JSON.parse(val)
            }
            else {  //图片
              this.fileList = JSON.parse(val)
              item['file-list'] = '' //隐藏加的表单设计器的文件列表
            }
            
          }
          // 设置各表单项的默认值(回填表单),包括el-upload的默认值
          if (val) {
            item.__config__.defaultValue = val
          }
          if (Array.isArray(item.__config__.children)) {
            this.fillFormData(item.__config__.children, formConf)
          }
        })
      },

//点击文件列表中已上传文件进行下载
      handleFilePreview(file) {
        var a = document.createElement('a');
        var event = new MouseEvent('click');
        a.download = file.name;
        a.href = file.url;
        a.dispatchEvent(event);
        console.log(file)
      },

image.png

image.png

具体实现可以见我的开源项目

gitee源代码地址

后端代码: https://gitee.com/nbacheng/nbcio-boot

前端代码:https://gitee.com/nbacheng/nbcio-vue.git


相关文章
|
5天前
|
API
【sgUpload】自定义组件:自定义上传组件,支持上传文件夹及其子文件夹文件、批量上传,批量上传会有右下角上传托盘出现,支持本地上传图片转换为Base64image。
【sgUpload】自定义组件:自定义上传组件,支持上传文件夹及其子文件夹文件、批量上传,批量上传会有右下角上传托盘出现,支持本地上传图片转换为Base64image。
|
5天前
|
JavaScript 前端开发 数据库
如何实现在表单中有多个附件,想实现不同的附件发送给不同指定人员
如何实现在表单中有多个附件,想实现不同的附件发送给不同指定人员
51 0
|
9月前
针对FastAdmin新增上传多个图片,新增上传的视频的预览效果
针对FastAdmin新增上传多个图片,新增上传的视频的预览效果
468 0
|
存储 PHP 数据安全/隐私保护
Ueditor结合七牛云存储上传图片、附件和图片在线管理的实现和最新更新
最新下载地址: https://github.com/widuu/qiniu_ueditor_1.4.3 Ueditor七牛云存储版本 注意事项 老版本请查看 : https://github.com/widuu/qiniu_ueditor_1.
3031 0
实现手动上传表单数据+图片文件
在很多项目中都会有上传数据+图片的需求,我最近在项目中负责活动发布的板块,需要几个表单数据加两个图片和一个图片数组,我看到产品需求后头就很大,我之前没有做过相关的业务,所以这几天一直在尝试,看到接口文档我内心已经崩了。
121 1
实现手动上传表单数据+图片文件
表单一次性上传多个文件
表单一次性上传多个文件
150 0
表单一次性上传多个文件
|
移动开发 JSON 前端开发
mPaaS H5选图预览到上传怎么做
在金融性质的App里,选择本地相册图片或者拍照,然后预览并且上传是一个典型的使用场景,比如常见的身份证信息上传。在最近接触的几家银行客户里,都反馈有类似的场景,并且在使用上都或多或少的遇到一些问题,最后找到我们,希望我们提供一些最佳实践。在这里分享下对应场景的一些优化解决方案。
223 0
mPaaS H5选图预览到上传怎么做
|
JavaScript BI 数据安全/隐私保护
报表中如何控制附件的上传和下载权限
报表中如何控制附件的上传和下载权限
1434 0