2024/4/2 工作总结

文章讨论了项目管理中如何实现文件上传、下载功能,包括使用用户ID验证权限,根据文件类型顺序上传以保持后端数据一致性,以及使用MD5码确保文件唯一性。重点提到如何通过ClassPathResource获取本地文件路径生成MD5码,并在上传加密件时更新MD5信息到数据库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上周总结需要解决的问题:

  1. sn加上结束地址
  2. 文件上传和下载不采用服务器,改成本地操作
  3. 项目经理申请订单时,要能同时上传多个类型的key
  4. 项目经理只能看到自己的项目
  5. 订单页展示各类型key名称,支持下载
  6. 给订单生成MD5码
  7. 邮箱点击下拉,弹出历史选项

问题4

哈哈,很简单,按照导师说的,给项目加上申请人id就行了

查询订单时,SecurityUtils.getUserId() 获取到当前用过户id,看与项目中申请人id是否一致,即可筛选出项目经理对应的项目。

问题5

难在下载时要保证和上传时url对应上

订单类中添加了三个url属性,上传时表单也对应增加这三个属性

formData: {
        customerId: undefined,
        projectId: undefined,
        keyTypeId: undefined,
        keyCount: undefined,
        keyBaseUrl1: null,
        keyBaseUrl2: null,
        keyBaseUrl3: null,
        snBegin: undefined,
        snEnd: undefined,
        snCount: undefined,
        factoryDate: null,
      },
handleSuccess1(response, file, fileList) {
      console.log(response)
      this.formData.keyBaseUrl1 = decodeURIComponent(response.url)
      this.keyName.push(this.formData.keyBaseUrl1.split('/').pop())
      this.isFirstDisabled = false; // 启用第二个上传按钮
    },
    handleSuccess2(response, file, fileList) {
      console.log(response)
      this.formData.keyBaseUrl2 = decodeURIComponent(response.url)
      this.keyName.push(this.formData.keyBaseUrl2.split('/').pop())
      this.isSecondDisabled = false; // 启用第三个上传按钮
    },
    handleSuccess3(response, file, fileList) {
      console.log(response)
      this.formData.keyBaseUrl3 = decodeURIComponent(response.url)
      this.keyName.push(this.formData.keyBaseUrl3.split('/').pop())
    },

这样虽然能保证三个文件都成功上传,但是后端不能区分key类型,所以在上传文件时,让用户按照顺序上传,将类型顺序写死,这样一来,后端只需要按照索引取出对应keyBaseUrl并带上keyTypeId插入到表中即可

<el-table-column label="Attestationkeybox" align="center" prop="baseKeyName1" >
            <template slot-scope="scope">
<!--              <el-button type="text">{{scope.row.baseKeyName1}}</el-button>-->
              <el-button
                type="text"
                @click="handleDownloadBaseKey1(scope.row)"
                v-hasPermi="['system:baseKey:download']"
              >{{scope.row.baseKeyName1}}</el-button>
            </template>
          </el-table-column>
          <el-table-column label="widevinekeybox" align="center" prop="baseKeyName2" >
            <template slot-scope="scope">
<!--              <el-button type="text">{{scope.row.baseKeyName2}}</el-button>-->
              <el-button
                type="text"
                @click="handleDownloadBaseKey2(scope.row)"
                v-hasPermi="['system:baseKey:download']"
              >{{scope.row.baseKeyName2}}</el-button>
            </template>
          </el-table-column>
          <el-table-column label="mgkid" align="center" prop="baseKeyName3" >
            <template slot-scope="scope">
<!--              <el-button type="text">{{scope.row.baseKeyName3}}</el-button>-->
              <el-button
                type="text"
                @click="handleDownloadBaseKey3(scope.row)"
                v-hasPermi="['system:baseKey:download']"
              >{{scope.row.baseKeyName3}}</el-button>
            </template>
          </el-table-column>

下载同样按照索引顺序渲染到页面上,这样就可以保证前后端数据的一致了。

问题6

起初想法是在项目经理上传三个key原件后就根据文件生成MD5码,然后保存到表中,但是保存到哪个表中呢,因为订单表并没有实体,只是从其他表抽取对应属性合成的一个抽象表,而关联起来的表也只有两个,key表和sn表,当一次申请提交后,会生成三条key,以及对应数量的sn,这两个记录都不是唯一的,不便于保存,后来的想法是保存到key表中,根据项目id查询出三条记录后,插入md5码到第一条记录中,虽然不是什么好办法,但也是个办法。

然后就是生成MD5码了,根据文件生成MD5码,需要一个相对路径,并不能是服务器上的url路径,这样是无法识别的,还是之前提到过的那个关键类,ClassPathResource,这个类可以获取到资源路径下的文件,然后就可以通过输入流读取文件生成MD5码了。

public String calculateMd5ForResource(String resourcePath) {
        try {
            Resource resource = new ClassPathResource(resourcePath);
            if (resource.exists() && resource.isReadable()) {
                MessageDigest md = MessageDigest.getInstance("MD5");
                try (InputStream inputStream = resource.getInputStream()) {
                    byte[] buffer = new byte[1024];
                    int numRead;
                    while ((numRead = inputStream.read(buffer)) != -1) {
                        md.update(buffer, 0, numRead);
                    }
                    return new BigInteger(1, md.digest()).toString(16);
                }
            }
        } catch (IOException e) {
            // Log the exception or handle it as appropriate for your application
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
        return "";
    }

显然,当申请提交后,订单数据并不齐全,而且根据三个文件生成的MD5合并起来也非常长,所以,在上传加密件的时候根据加密件生成MD5码是比较合适的。

public int updateSdmcKey(SdmcKey sdmcKey) {
        SdmcKey key = sdmcKeyMapper.selectSdmcKeyByKeyId(sdmcKey.getKeyId());
        key.setUpdateTime(LocalDateTime.now());
        key.setUpdateBy(SecurityUtils.getUsername());
        String secretUrl = null;
        if (sdmcKey.getKeySecretUrl() != null && !sdmcKey.getKeySecretUrl().isEmpty()) {
            key.setKeySecretUrl(sdmcKey.getKeySecretUrl());
            secretUrl = sdmcKey.getKeySecretUrl();
        }
        if (sdmcKey.getStatus() != null && !sdmcKey.getStatus().isEmpty()) {
            key.setStatus(sdmcKey.getStatus());
        }
        // 在这里判断 keySecretUrl 是否为空,如果不为空,则获取 MD5 码,保存到对应 sn 记录中
        if (secretUrl != null && !secretUrl.isEmpty()) {
            URL obj = null;
            try {
                obj = new URL(secretUrl);
            } catch (MalformedURLException e) {
                throw new RuntimeException(e);
            }
            String path = obj.getPath();
            int lastIndexOfSlash = path.lastIndexOf('/');
            String fileName = path.substring(lastIndexOfSlash + 1);
            String md5 = md5Calculator.calculateMd5ForResource("upload/" + fileName);
            key.setMd5(md5);
        }
        return sdmcKeyMapper.updateSdmcKey(key);
    }

上传加密件时,会执行更新key操作,此时,将携带的keySecretUrl解析得到的文件名传给工具类,得到MD5码,再将MD5码赋值给key,更新到key表中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值