上周总结需要解决的问题:
sn加上结束地址文件上传和下载不采用服务器,改成本地操作项目经理申请订单时,要能同时上传多个类型的key项目经理只能看到自己的项目订单页展示各类型key名称,支持下载给订单生成MD5码- 邮箱点击下拉,弹出历史选项
问题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表中。