• 基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持formdesigner的本地图片上传与回显的功能实现


    更多ruoyi-nbcio功能请看演示系统

    gitee源代码地址

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

    演示地址:RuoYi-Nbcio后台管理系统

    其它后台相关配置请看我的另外两篇有关本地文件上传文章。

    这里主要说明一下formdesigner的相关代码,特别是

    previewRender.js 的代码如下,这里代码主要是针对ruoyi平台,jeecg平台看我另外的文章:

    注意以下几点:

    1、token的设置,不同的平台会不一样

    2、上传的图片路径问题,不同的平台处理也不一样

    1. import { isAttr,jsonClone } from '../utils';
    2. import childrenItem from './slot/index';
    3. import {remoteData} from './mixin';
    4. import { getToken } from "@/utils/auth";
    5. //先修改在这里,后续需要优化
    6. function vModel(self, dataObject) {
    7. dataObject.props.value = self.value;
    8. dataObject.on.input = val => {
    9. self.$emit('input', val)
    10. }
    11. //判断是否为上传组件
    12. if(self.conf.compType === 'upload'){
    13. //for token add by nbacheng 2022-09-07
    14. //dataObject.attrs['headers'] = {"Authorization":"Bearer " + getToken()};
    15. /**
    16. * 此处增加自定义的token,如果不能满足要求,可以重写此处代码
    17. */
    18. const token = getToken();
    19. dataObject.attrs['headers'] = {"Authorization":"Bearer " + token};
    20. console.log("dataObject.props.value",dataObject.props.value)
    21. if(dataObject.props.value!==undefined && dataObject.props.value !==''){
    22. const filevalue = JSON.parse(dataObject.props.value);
    23. dataObject.props['file-list'] = filevalue;
    24. }
    25. dataObject.attrs['before-upload'] = file=>{
    26. //非限定后缀不允许上传
    27. console.log("before-upload file",file);
    28. const fileName = file.name;
    29. console.log("before-upload fileName",fileName);
    30. const suffixName = fileName.split('.').pop();
    31. if(!self.conf.accept.includes(suffixName)){
    32. self.$message.error('该后缀文件不允许上传');
    33. return false;
    34. }
    35. const fileSize = file.size;
    36. if(fileSize>dataObject.props.fileSize*1024*1024){
    37. self.$message.error('文件大小超出限制,请检查!');
    38. return false;
    39. }
    40. }
    41. //for get return file url add by nbacheng 2022-09-07
    42. dataObject.attrs['on-success'] = file=>{
    43. console.log("on-success file",file);
    44. var filename,fileObj;
    45. if(file.data.hasOwnProperty('ossId') && file.data.ossId != "") {//oss上传
    46. filename=file.data.fileName.substring(file.data.fileName.lastIndexOf('/')+1) //获取文件名称
    47. fileObj = {name: filename, url: file.data.url}
    48. }
    49. else {//本地上传
    50. filename=file.data.fileName.substring(file.data.fileName.lastIndexOf('/')+1) //获取文件名称
    51. fileObj = {name: filename, url: process.env.VUE_APP_BASE_API + file.data.fileName}
    52. }
    53. console.log("dataObject=",dataObject);
    54. console.log("self.conf=",self.conf);
    55. let oldValue = [];
    56. if(dataObject.props.value) {
    57. oldValue = JSON.parse(dataObject.props.value);
    58. }else {
    59. oldValue = [];
    60. }
    61. if (oldValue) {
    62. oldValue.push(fileObj)
    63. } else {
    64. oldValue = [fileObj]
    65. }
    66. self.$emit('input',JSON.stringify(oldValue));
    67. console.log("on-success value",oldValue);
    68. }
    69. dataObject.attrs['on-remove'] = (file, fileList) => {
    70. console.log("on-remove file,fileList",file,fileList);
    71. let oldValue = JSON.parse(dataObject.props.value);
    72. console.log("on-remove oldValue",oldValue);
    73. //file 删除的文件
    74. //过滤掉删除的文件
    75. let newValue = oldValue.filter(item => item.name !== file.name)
    76. self.$emit('input',JSON.stringify(newValue));
    77. console.log("on-remove newValue",newValue);
    78. }
    79. dataObject.attrs['on-error'] = (file) => {
    80. console.log("on-error file",file);
    81. }
    82. dataObject.attrs['on-preview'] = (file) => {
    83. console.log("on-preview file",file);
    84. //download(file);
    85. }
    86. //for get return file url add by nbacheng 2022-09-07
    87. }
    88. }
    89. export default {
    90. render(h) {
    91. let dataObject = {
    92. attrs: {},
    93. props: {},
    94. on: {},
    95. style: {}
    96. }
    97. //远程获取数据
    98. this.getRemoteData();
    99. const confClone = jsonClone(this.conf);
    100. const children = childrenItem(h,confClone);
    101. Object.keys(confClone).forEach(key => {
    102. const val = confClone[key]
    103. if (dataObject[key]) {
    104. dataObject[key] = val
    105. } else if(key ==='width'){
    106. dataObject.style= 'width:'+val;
    107. } else if (!isAttr(key)) {
    108. dataObject.props[key] = val
    109. }else {
    110. if (key == 'classStyle' && val.length > 0){
    111. let style =""
    112. val.forEach(item =>{
    113. console.log(item)
    114. style+=item +" "
    115. })
    116. dataObject.attrs['class'] = style
    117. }else if (key == 'cssStyle'){
    118. dataObject.attrs['style'] = val
    119. }else if(key !== 'value'){
    120. dataObject.attrs[key] = val
    121. }
    122. }
    123. })
    124. /*调整赋值模式,规避cascader组件赋值props会出现覆盖预制参数的bug */
    125. vModel(this, dataObject);
    126. return h(confClone.ele, dataObject, children)
    127. },
    128. props: ['conf','value'],
    129. mixins:[remoteData]
    130. }

    效果图如下:

  • 相关阅读:
    MySQL索引设计原则
    数仓:Doris在美团的应用实践
    常见弱口令汇编
    无代理方式实现VMware的迁移?详细解析
    Vue 官方文档2.x教程学习笔记 1 基础 1.4 模板语法 1.4.2 指令
    python 拆分pdf(有可执行文件exe)
    【带限制的完全背包】Educational Codeforces Round 133 (Rated for Div. 2) D. Chip Move
    手记系列之六 ----- 分享个人使用kafka经验
    C语言学习笔记(三)
    使用 DM binary 部署 DM 集群
  • 原文地址:https://blog.csdn.net/qq_40032778/article/details/133783082