jiangping
2025-06-30 61569d13baf15119cbc060441c6487a2c1eb895f
最新版本541200007
已添加1个文件
已修改8个文件
277 ■■■■■ 文件已修改
admin/package-lock.json 165 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/system/common.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCompanyDocumentsWindow.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/UploadFile.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/dict/OperaDictDataWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/companyDocuments.vue 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/common/PublicCloudController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/DownloadFileDTO.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package-lock.json
@@ -1876,6 +1876,63 @@
          "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
          "dev": true
        },
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "ssri": {
          "version": "8.0.1",
          "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1883,6 +1940,28 @@
          "dev": true,
          "requires": {
            "minipass": "^3.1.1"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
@@ -4994,6 +5073,11 @@
      "resolved": "https://registry.npm.taobao.org/dotenv-expand/download/dotenv-expand-5.1.0.tgz",
      "integrity": "sha1-P7rwIL/XlIhAcuomsel5HUWmKfA=",
      "dev": true
    },
    "downloadjs": {
      "version": "1.4.7",
      "resolved": "https://registry.npmmirror.com/downloadjs/-/downloadjs-1.4.7.tgz",
      "integrity": "sha512-LN1gO7+u9xjU5oEScGFKvXhYf7Y/empUIIEAGBs1LzUq/rg5duiDrkuH5A2lQGd5jfMOb9X9usDa2oVXwJ0U/Q=="
    },
    "duplexer": {
      "version": "0.1.2",
@@ -13904,87 +13988,6 @@
          "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
          "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
          "dev": true
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
admin/package.json
@@ -19,6 +19,7 @@
    "axios": "^0.21.1",
    "core-js": "^3.6.5",
    "dayjs": "^1.11.13",
    "downloadjs": "^1.4.7",
    "echarts": "^5.4.3",
    "el-tree-transfer": "^2.4.7",
    "element-tiptap": "^1.27.1",
admin/src/api/system/common.js
@@ -71,3 +71,11 @@
export function upload (data) {
  return request.post('/visitsAdmin/cloudService/public/upload', data)
}
// ä¸‹è½½ç½‘络附件
export function downloadFile(data) {
  return request.post('/visitsAdmin/cloudService/public/downloadFile', data, {
    trim: true,
    download: true
  })
}
admin/src/components/business/OperaCompanyDocumentsWindow.vue
@@ -27,7 +27,7 @@
            noResultsText="没有匹配的结果" />
      </el-form-item>
      <el-form-item label="附件地址" prop="fileurl">
        <UploadFile :uploadData="{ folder: 'company_documents',fileType:'' }" :fileList="fileList" @uploadSuccess="uploadFileBiz" />
        <UploadFile :uploadData="{ folder: 'company_documents',fileType:'.zip,.war,.pdf' }" :fileList="fileList"  @uploadSuccess="uploadFileBiz" />
<!--        <UploadFile width="100px" height="100px" :list="[]"  folder="company_documents" @success="uploadFileBiz($event, 2)" />-->
      </el-form-item>
@@ -35,7 +35,7 @@
        <el-input type="textarea" v-model="form.content" placeholder="请输入附件描述" v-trim/>
      </el-form-item>
      <el-form-item label="排序码(降序)" prop="sortnum">
        <el-input v-model="form.sortnum" placeholder="请输入排序码" v-trim/>
        <el-input type="number" v-model="form.sortnum" placeholder="请输入排序码" v-trim/>
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -106,6 +106,7 @@
      this.title = title
      this.visible = true
      this.getCate()
      this.fileList = []
      this.getCompany()
      // æ–°å»ºç»„织
      if (target == null) {
@@ -120,6 +121,9 @@
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        if(this.form.fileurl){
          this.fileList = [{ fileurl: this.form.fileurl, fileurlFull:this.form.fileurlFull, name: this.form.fileName,fileSize:this.form.fileSize }]
        }
      })
    },
    uploadFileBiz (file) {
admin/src/components/common/UploadFile.vue
@@ -2,7 +2,7 @@
  <div>
    <el-upload
      class="upload-demo"
      :accept="uploadData.fileTyp"
      :accept="uploadData.fileType"
      :action="uploadImgUrl"
      :limit="this.fileLength"
      :on-exceed="handleExceed"
@@ -11,7 +11,12 @@
      :before-upload="beforeFileUpload"
      :file-list="fileList">
    <el-button size="small" type="primary">点击上传</el-button>
    <div slot="tip" class="el-upload__tip"  >只能上传{{ this.fileLength }}个文件,数量超过请删除已传附件重新上传</div>
    <div slot="tip" class="el-upload__tip"  >
      åªèƒ½ä¸Šä¼ {{ this.fileLength }}个文件,
      {{uploadData.fileType?('只支持上传【'+uploadData.fileType+'】类型文件'):''}}
      æ–‡ä»¶å¤§å°ä¸èƒ½è¶…过30MB,
      æ•°é‡è¶…过请删除已传附件重新上传
     </div>
  </el-upload>
  </div>
@@ -67,9 +72,14 @@
    //
    beforeFileUpload(file) {
      if(this.fileList && this.fileList.length >= this.fileLength){
        this.$message.error('只允许上传【'+this.fileLength+'w文件】')
        this.$message.error('只允许上传【'+this.fileLength+'个文件】')
        return false;
      }
      const isLt2M = file.size / 1024 / 1024 <= 30; // æ£€æŸ¥æ–‡ä»¶å¤§å°æ˜¯å¦å°äºŽ30MB
      if (!isLt2M) {
        this.$message.error('上传文件大小不能超过 30MB!');
        return false; // ä¸å…è®¸ä¸Šä¼ è¶…过指定大小的文件
      }
      this.$emit('uploadBegin')
      return true
    }
admin/src/components/system/dict/OperaDictDataWindow.vue
@@ -41,7 +41,7 @@
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import RichEditor from '@/components/common/RichEditor'
import UploadFile from "@/components/common/UploadFile";
import UploadFile from "@/components/common/UploadFile"
export default {
  name: 'OperaDictDataWindow',
  extends: BaseOpera,
admin/src/views/business/companyDocuments.vue
@@ -68,6 +68,8 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaCompanyDocumentsWindow from '@/components/business/OperaCompanyDocumentsWindow'
import {downloadFile} from "@/api/system/common";
export default {
  name: 'CompanyDocuments',
  extends: BaseTable,
@@ -94,7 +96,7 @@
  methods:{
    download(row){
      if(row.fileurlFull){
        window.open(row.fileurlFull)
        downloadFile({ url: row.fileurlFull, fileName:row.fileName })
      }
    }
  }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/common/PublicCloudController.java
@@ -1,5 +1,6 @@
package com.doumee.cloud.common;
import cn.hutool.core.io.IoUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.doumee.api.BaseController;
@@ -15,7 +16,9 @@
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.FtpUtil;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.core.utils.aliyun.ALiYunUtil;
import com.doumee.dao.business.dto.DownloadFileDTO;
import com.doumee.dao.system.model.SystemDict;
import com.doumee.dao.system.model.SystemDictData;
import io.swagger.annotations.Api;
@@ -23,6 +26,9 @@
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.compress.archivers.zip.Zip64Mode;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -30,12 +36,12 @@
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.*;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.util.*;
/**
@@ -151,6 +157,42 @@
        return;
    }
    @ApiOperation(value = "下载网络文件")
    @RequestMapping(method= RequestMethod.POST,value="/downloadFile")
    @ResponseBody
    public void downloadFile(@RequestBody DownloadFileDTO param,  HttpServletRequest request, HttpServletResponse response) throws Exception {
        if(StringUtils.isBlank(param.getUrl())){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        InputStream inputStream = HttpsUtil.connectionInputsteam(param.getUrl(),"GET","",null);
        if(inputStream == null){
            if(StringUtils.isBlank(param.getUrl())){
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"文件下载失败,请检查文件路径是否合法!");
            }
        }
        if(StringUtils.isBlank(param.getFileName())){
            param.setFileName(System.currentTimeMillis()+"");
            if(param.getUrl().lastIndexOf(".") >0){
                String nfix = param.getUrl().substring(param.getUrl().lastIndexOf("."));
                param.setFileName(System.currentTimeMillis()+"."+nfix);
            }
        }
        String encodeFileName = URLEncoder.encode(param.getFileName(), Charset.forName("UTF-8").toString());
        response.setHeader("Content-Disposition","attachment;filename=" + encodeFileName);
        response.setContentType("application/octet-stream");
        response.setHeader("eva-opera-type", "download");
        response.setHeader("eva-download-filename", encodeFileName);
        ServletOutputStream os = response.getOutputStream();
        byte[] buffer = new byte[4096];
        int bytesRead;
        while ((bytesRead = inputStream.read(buffer)) != -1) {
            os.write(buffer, 0, bytesRead);
        }
        os.flush();
        os.close();
        inputStream.close();
    }
    @ApiOperation(value = "上传文件到FTP")
    @RequestMapping(method= RequestMethod.POST,value="/upload")
    @ResponseBody
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/dto/DownloadFileDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.doumee.dao.business.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2024/5/20 14:54
 */
@Data
public class DownloadFileDTO {
    @ApiModelProperty(value = "网络附件地址")
    private String url  ;
    @ApiModelProperty(value = "附件名称")
    private String fileName;
}