Commit 13ec4642 by 周海峰

密钥管理

parent 0fa75ffc
import request from '@/utils/request'
import { parseStrEmpty } from "@/utils/ruoyi"
/**
* 密管方式列表
* @param {*} query
* @returns
*/
export function queryKeys(query) {
return request({
url: '/key/manager/queryKeys',
method: 'get',
params: query
})
}
/**
* 修改使用的密管方式
*/
export function editIsUse(data) {
return request({
url: '/key/manager/editIsUse',
method: 'post',
data: data
})
}
/**
* 参数配置
* @param {*} query
* @returns
*/
export function showKeyParams(query) {
return request({
url: 'key/manager/showKeyParams',
method: 'get',
params: query
})
}
/**
*
* @param {*} query
* @returns
*/
export function testCallKey(query) {
return request({
url: 'key/manager/testCallKey',
method: 'get',
params: query
})
}
/** * 参数配置区域
* @param {*} data
* @returns {string}
*/
export function saveKeyParams(data) {
return request({
url: '/key/manager/saveKeyParams',
method: 'post',
data: data
})
}
export function uploadHsmConfig(formData) {
return request({
url: '/key/manager/uploadHsmConfig',
method: 'post',
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
}
})
}
\ No newline at end of file
<template>
<div class="params-config">
<div v-if="!editable" class="mask" @click.stop="handleMaskClick"></div>
<div v-if="type === 'local'" style="display: flex; justify-content: center; align-items: center; height: 300px;">
<span style="font-size: 40px; color: #909399;">无需参数配置</span>
</div>
<!-- 加密机配置 -->
<div v-if="type === 'machine'" class="params-form">
<el-form label-width="120px" label-position="left">
<el-form-item label="密钥索引" required>
<div class="input-group">
<el-input v-model="params.sdkkeyid" placeholder="110" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* sdkkeyid: SM2加密的密钥索引</div>
</div>
</el-form-item>
<el-form-item label="私钥授权码" required>
<div class="input-group">
<el-input v-model="params.sdkpassword" type="password" placeholder="****" show-password style="width: 500px" :disabled="!editable" />
<div class="tip-text">* SDKPassword: SM2加密私钥授权码</div>
</div>
</el-form-item>
<el-form-item label="配置文件" required>
<div class="input-group">
<el-input v-model="params.sdkPath" placeholder="/home/ghca/data/" style="width: 500px" :disabled="!editable" />
<div class="button-group">
<el-button type="primary" @click="downloadTemplate">下载配置模板</el-button>
<el-button type="primary" @click="uploadConfig">上传配置文件</el-button>
</div>
<div class="tip-text">* SDKPath: 点击下载HsmConfig模板,修改配置信息,然后上传HsmConfig文件</div>
</div>
</el-form-item>
</el-form>
</div>
<!-- 云加密机配置 -->
<div v-if="type === 'cloud'" class="params-form">
<el-form label-width="120px" label-position="left">
<el-form-item label="密钥索引" required>
<div class="input-group">
<el-input v-model="params.sdkkeyid" placeholder="110" style="width: 500px;" :disabled="!editable" />
<div class="tip-text">SDKKeyid: SM2加密的密钥索引</div>
</div>
</el-form-item>
<el-form-item label="私钥授权码" required>
<div class="input-group">
<el-input v-model="params.sdkpassword" type="password" placeholder="****" show-password style="width: 500px;" :disabled="!editable" />
<div class="tip-text">SDKPassword: SM2加密私钥授权码</div>
</div>
</el-form-item>
<el-form-item label="配置文件" required>
<div class="input-group">
<el-input v-model="params.hsmfiledir" placeholder="/home/ghca/data/" style="width: 500px" :disabled="!editable" />
<div class="button-group">
<el-button type="primary" @click="downloadTemplate">下载配置模板</el-button>
<el-button type="primary" @click="uploadConfig">上传配置文件</el-button>
</div>
<div class="tip-text">* SDKPath: 点击下载HsmConfig模板,修改配置信息,然后上传HsmConfig文件</div>
</div>
</el-form-item>
<el-form-item label="客户端证书" required>
<div class="input-group">
<el-input v-model="params.keystoredir" placeholder="/home/ghca/data/" style="width: 500px" :disabled="!editable" />
<div class="button-group">
<el-button type="primary" @click="uploadCert('client')">上传证书</el-button>
</div>
<div class="tip-text">* KeyStore: 类似client.p12客户端证书上传,此处上传路径应和配置文件中客户端证书路径保持一致</div>
</div>
</el-form-item>
<el-form-item label="CA证书" required>
<div class="input-group">
<el-input v-model="params.truststoredir" placeholder="/home/ghca/data/" style="width: 500px" :disabled="!editable" />
<div class="button-group">
<el-button type="primary" @click="uploadCert('ca')">上传证书</el-button>
</div>
<div class="tip-text">* TrustStore: 类似ca.cer CA证书上传,此处上传路径应和配置文件里的证书路径保持一致</div>
</div>
</el-form-item>
</el-form>
</div>
<!-- 国芯加密卡配置 -->
<div v-else-if="type === 'card'" class="params-form">
<el-form label-width="120px" label-position="left">
<el-form-item label="权限密码" required>
<div class="input-group">
<el-input v-model="params.password" placeholder="110" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* Ccore.PhKeyHandle.password</div>
</div>
</el-form-item>
<el-form-item label="比特值" required>
<div class="input-group">
<el-input v-model="params.bits" placeholder="pass" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* ECCCipher.bits</div>
</div>
</el-form-item>
<el-form-item label="X向量" required>
<div class="input-group">
<el-input v-model="params.x" placeholder="/home/ghca/data/" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* ECCCipher.X</div>
</div>
</el-form-item>
<el-form-item label="Y向量" required>
<div class="input-group">
<el-input v-model="params.y" placeholder="0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* ECCCipher.Y</div>
</div>
</el-form-item>
<el-form-item label="哈希值" required>
<div class="input-group">
<el-input v-model="params.m" placeholder="0, 27, 28, 35, 90, -3, -128, 76, -117, -31, 86" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* ECCCipher.M</div>
</div>
</el-form-item>
<el-form-item label="密钥密文" required>
<div class="input-group">
<el-input v-model="params.c" placeholder="-18, 92, 111, -108, 103, -78, 28, 59, 67, -5" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* ECCCipher.C</div>
</div>
</el-form-item>
<el-form-item label="向量长度" required>
<div class="input-group">
<el-input v-model="params.l" placeholder="16" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* ECCCipher.L</div>
</div>
</el-form-item>
<el-form-item>
<el-button type="primary">参数生成</el-button>
<span class="tip-text" style="margin-left: 16px;">* 点击自动带入加密卡的相关参数</span>
</el-form-item>
</el-form>
</div>
<!-- KMS配置 -->
<div v-else-if="type === 'kms'" class="params-form">
<el-form label-width="120px" label-position="left">
<el-form-item label="主键" required>
<div class="input-group">
<el-input v-model="params.tid" placeholder="110" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.credential.tid: 加密机设备ID</div>
</div>
</el-form-item>
<el-form-item label="访问密钥" required>
<div class="input-group">
<el-input v-model="params.credaccesskey" type="password" placeholder="****" show-password style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.credential.credaccesskey: 加密机设备密码</div>
</div>
</el-form-item>
<el-form-item label="私钥" required>
<div class="input-group">
<el-input v-model="params.secretkey" type="password" placeholder="************" show-password style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.credential.secretkey: 私钥</div>
</div>
</el-form-item>
<el-form-item label="序列" required>
<div class="input-group">
<el-input v-model="params.iv" placeholder="1,2,3,4,5,6,7,8,9,8,7,6," style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.credential.iv: 序列</div>
</div>
</el-form-item>
<el-form-item label="协议" required>
<div class="input-group">
<el-input v-model="params.protocol" placeholder="http" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.credential.protocol: 协议</div>
</div>
</el-form-item>
<el-form-item label="地址" required>
<div class="input-group">
<el-input v-model="params.host" placeholder="kotest.gh--truststoredir.com" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.credential.host: 地址</div>
</div>
</el-form-item>
<el-form-item label="端口" required>
<div class="input-group">
<el-input v-model="params.credport" placeholder="18180" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.credential.credport: 端口</div>
</div>
</el-form-item>
<el-form-item label="主密钥" required>
<div class="input-group">
<el-input v-model="params.keyid" placeholder="5984eba--2884--4ef7--a0c" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.keyid.keyid</div>
</div>
</el-form-item>
<el-form-item label="密钥的类型" required>
<div class="input-group">
<el-input v-model="params.keyspec" placeholder="SM4" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.keyid.keyspec</div>
</div>
</el-form-item>
<el-form-item label="密钥用途" required>
<div class="input-group">
<el-input v-model="params.keyusage" placeholder="ENCRYPT_DECRYPT" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.keyid.keyusage</div>
</div>
</el-form-item>
<el-form-item label="密钥来源" required>
<div class="input-group">
<el-input v-model="params.origin" placeholder="KMS" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.keyid.origin</div>
</div>
</el-form-item>
<el-form-item label="保护级别" required>
<div class="input-group">
<el-input v-model="params.protectionlevel" placeholder="HSM" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* kms.keyid.protectionlevel</div>
</div>
</el-form-item>
</el-form>
</div>
<!-- THKMS配置 -->
<div v-else-if="type === 'thkms'" class="params-form">
<el-form label-width="120px" label-position="left">
<el-form-item label="协议" required>
<div class="input-group">
<el-input v-model="params.protocol" placeholder="110" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* thkms.protocol</div>
</div>
</el-form-item>
<el-form-item label="主机" required>
<div class="input-group">
<el-input v-model="params.host" placeholder="pass" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* thkms.host</div>
</div>
</el-form-item>
<el-form-item label="端口" required>
<div class="input-group">
<el-input v-model="params.credport" placeholder="/home/ghca/data/" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* thkms.credport</div>
</div>
</el-form-item>
<el-form-item label="应用ID" required>
<div class="input-group">
<el-input v-model="params.appId" placeholder="0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* thkms.appId</div>
</div>
</el-form-item>
<el-form-item label="主密钥" required>
<div class="input-group">
<el-input v-model="params.keyid" placeholder="0, 27, 28, 35, 90, -3, -128, 76, -117, -31, 86" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* thkms.keyid</div>
</div>
</el-form-item>
<el-form-item label="私钥证书" required>
<div class="input-group">
<el-input v-model="params.sm2pri" placeholder="-18, 92, 111, -108, 103, -78, 28, 59, 67, -5" style="width: 500px" :disabled="!editable" />
<el-button type="primary" @click="uploadCert('sm2')">上传证书</el-button>
<div class="tip-text">* 类似sm2pri.pkcs8.der 证书上传</div>
</div>
</el-form-item>
<el-form-item label="公钥证书" required>
<div class="input-group">
<el-input v-model="params.sm2pub" placeholder="16" style="width: 500px" :disabled="!editable" />
<el-button type="primary" @click="uploadCert('sm2pub')">上传证书</el-button>
<div class="tip-text">* 类似sm2pub.cer 证书上传</div>
</div>
</el-form-item>
</el-form>
</div>
<!-- 得安加密机配置 -->
<div v-else-if="type === 'dean'" class="params-form">
<el-form label-width="120px" label-position="left">
<el-form-item label="IP" required>
<div class="input-group">
<el-input v-model="params.ip" placeholder="110" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* IP</div>
</div>
</el-form-item>
<el-form-item label="端口" required>
<div class="input-group">
<el-input v-model="params.port" placeholder="pass" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* 端口</div>
</div>
</el-form-item>
<el-form-item label="密码" required>
<div class="input-group">
<el-input v-model="params.password" type="password" placeholder="********" show-password style="width: 500px" :disabled="!editable" />
<div class="tip-text">* 密码</div>
</div>
</el-form-item>
<el-form-item label="算法类型" required>
<div class="input-group">
<el-input v-model="params.algorithm" placeholder="SM4" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* 算法类型</div>
</div>
</el-form-item>
<el-form-item label="密钥号" required>
<div class="input-group">
<el-input v-model="params.keyNo" placeholder="0, 27, 28, 35, 90, -3, -128, 76, -117, -31, 83, 84, 46, 61, -97, -92, 120, -19, 46, -121, -27, -107, -58, 90, 118, 0, 6, 105, 68, -41, 96, 30" style="width: 500px" :disabled="!editable" />
<div class="tip-text">* 密钥号</div>
</div>
</el-form-item>
</el-form>
</div>
<!-- 量子加密机配置 -->
<div v-else-if="type === 'star'" class="params-form">
<el-form label-width="120px" label-position="left">
<el-form-item label="配置文件" required>
<div class="input-group">
<el-input v-model="params.configPath" style="width: 500px" :disabled="!editable" />
<el-button type="primary" @click="downloadTemplate">下载配置模板</el-button>
<el-button type="primary" @click="uploadConfig">上传配置文件</el-button>
</div>
</el-form-item>
<el-form-item label="用户证书路径">
<div class="input-group">
<el-input v-model="params.certsPath" style="width: 500px" :disabled="!editable" />
<el-button type="primary" @click="uploadCert('certs')">上传证书</el-button>
<div class="tip-text">* certs.pem</div>
</div>
</el-form-item>
<el-form-item label="用户密钥路径">
<div class="input-group">
<el-input v-model="params.keyPath" style="width: 500px" :disabled="!editable" />
<el-button type="primary" @click="uploadCert('sigkey')">上传证书</el-button>
<div class="tip-text">* sig.key.pem</div>
</div>
</el-form-item>
<el-form-item label="服务端CA证书路径">
<div class="input-group">
<el-input v-model="params.caPath" style="width: 500px" :disabled="!editable" />
<el-button type="primary" @click="uploadCert('ca')">上传证书</el-button>
<div class="tip-text">* ca.crt.pem</div>
</div>
</el-form-item>
</el-form>
</div>
<!-- 三末加密机配置 -->
<div v-else-if="type === 'threeTerm'" class="params-form">
<el-form label-width="100px">
<div class="config-buttons" style="text-align: left;">
<el-button type="primary" @click="downloadTemplate">下载配置模板</el-button>
<el-button type="primary" @click="uploadConfig">上传配置文件</el-button>
</div>
</el-form>
</div>
</div>
</template>
<script>
export default {
name: 'ParamsConfig',
props: {
// 密管类型
type: {
type: String,
required: true
},
// 参数值
modelValue: {
type: Object,
default: () => ({})
},
// 是否可编辑
editable: {
type: Boolean,
default: false
}
},
data() {
return {
params: this.modelValue
}
},
watch: {
params: {
deep: true,
handler(val) {
this.$emit('update:modelValue', val)
}
},
modelValue: {
deep: true,
handler(val) {
this.params = val
}
}
},
methods: {
// 下载配置模板
downloadTemplate() {
this.$emit('download-template')
},
// 上传配置文件
uploadConfig() {
this.$emit('upload-config')
},
// 上传证书
uploadCert(type) {
this.$emit('upload-cert', type)
},
handleMaskClick() {
this.$modal && this.$modal.msgWarning ? this.$modal.msgWarning('不可编辑,请点击“编辑”按钮') : alert('不可编辑,请点击“编辑”按钮')
},
}
}
</script>
<style lang="scss" scoped>
.params-config {
position: relative;
.params-form {
padding: 20px;
border: 1px solid #dcdfe6;
border-radius: 4px;
margin: 10px 0;
.tip {
font-size: 12px;
color: #909399;
line-height: 1.2;
padding: 4px 0;
margin-top: 4px;
}
.input-group {
display: flex;
align-items: center;
gap: 12px;
.button-group {
display: flex;
gap: 8px;
}
.tip-text {
color: #F56C6C;
font-size: 14px;
white-space: nowrap;
}
}
.input-with-buttons {
display: flex;
align-items: center;
gap: 10px;
.button-group {
display: flex;
gap: 8px;
}
}
:deep(.el-form-item__label) {
font-weight: normal;
}
.required-star {
color: #f56c6c;
margin-left: 4px;
font-size: 14px;
cursor: help;
}
.config-buttons {
text-align: center;
button {
margin: 0 10px;
}
}
}
&.disabled-mask {
pointer-events: auto;
}
&.disabled-mask {
// 禁用所有交互
pointer-events: auto;
}
:disabled,
.disabled-mask button,
.disabled-mask .el-button {
pointer-events: none !important;
opacity: 0.6;
}
.mask {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(255,255,255,0.6);
z-index: 10;
cursor: not-allowed;
}
}
</style>
......@@ -12,10 +12,19 @@
<div class="section-content">
<div class="form-item">
<span class="label">密管方式</span>
<el-select v-model="keyManageType" placeholder="请选择" style="width: 200px;padding-right: 10px;">
<el-option label="三末加密机" value="threeTerm"></el-option>
<el-select
v-model="keyManageType"
placeholder="请选择"
style="width: 200px;padding-right: 10px;"
@change="handleKeyManageChange">
<el-option
v-for="item in keyManageData"
:key="item.id"
:label="item.typename"
:value="item.id">
</el-option>
</el-select>
<el-checkbox v-model="isEnabled">是否启用</el-checkbox>
<el-checkbox v-model="isEnabled" @change="handleEnableChange">是否启用</el-checkbox>
<span class="tip">
* 平台只能选择一种密管方式,切换加密规则,平台可切换密管方式。
</span>
......@@ -27,31 +36,279 @@
<div class="section-card">
<div class="section-title">参数配置区域:</div>
<div class="section-content">
<div class="button-group">
<el-button type="primary">下载配置模板</el-button>
<el-button type="primary">上传配置文件</el-button>
</div>
<params-config
v-model="configParams"
:type="getConfigType"
:editable="isEditing"
@download-template="handleDownloadTemplate"
@upload-config="handleUploadConfig"
@upload-cert="handleUploadCert"
/>
</div>
</div>
<!-- 底部按钮 -->
<div class="footer">
<el-button type="primary">编辑</el-button>
<template v-if="isEditing">
<el-button @click="handleCancel">取消</el-button>
<el-button @click="handleTest">测试</el-button>
<el-button type="primary" @click="handleConfirm">确定</el-button>
</template>
<template v-else>
<el-button type="primary" @click="isEditing = true">编辑</el-button>
</template>
</div>
</div>
<!-- 上传配置文件弹层 -->
<el-dialog
title="上传配置文件"
v-model="uploadDialogVisible"
width="500px"
:close-on-click-modal="false"
:close-on-press-escape="false"
@close="handleUploadCancel"
>
<div style="padding: 10px 0;">
<el-upload
drag
action=""
:auto-upload="false"
:file-list="uploadFileList"
:on-change="handleFileChange"
:show-file-list="true"
:limit="1"
>
<i class="el-icon-upload" style="font-size:48px;color:#409EFF;"></i>
<div class="el-upload__text" style="font-size:16px;color:#909399;">点击或拖拽文件到此处进行上传</div>
</el-upload>
</div>
<div style="text-align:center;margin-top:20px;">
<el-button @click="handleUploadCancel">取消</el-button>
<el-button type="primary" :loading="uploadLoading" @click="handleUploadConfirm">确定</el-button>
</div>
</el-dialog>
</template>
<script>
import { queryKeys, showKeyParams, editIsUse, testCallKey, saveKeyParams, uploadHsmConfig} from "@/api/ruleConfig/keyManagement.js"
import ParamsConfig from './components/ParamsConfig.vue'
/**
* 规则管理-密钥管理
*/
export default {
components: {
ParamsConfig
},
name: 'KeyManagement',
data() {
return {
keyManageType: '三末加密机',
isEnabled: false
keyManageType: '',
isEnabled: false,
keyManageData: [], // 存储完整的数据
configParams: {}, // 参数配置数据
isEditing: false, // 是否处于编辑状态
uploadDialogVisible: false, // 上传配置文件弹层可见性
uploadFile: null,
uploadFileList: [],
uploadLoading: false // 上传按钮加载状态
}
},
created() {
this.getKeyManageOptions()
},
computed: {
// 获取配置类型
getConfigType() {
const typeMap = {
'本地管理': 'local',
'加密机': 'machine',
'云加密机': 'cloud',
'国芯加密卡': 'card',
'KMS': 'kms',
'THKMS': 'thkms',
'得安加密机': 'dean',
'量子加密机': 'star',
'三未加密机': 'threeTerm'
}
const selectedOption = this.keyManageData.find(item => item.id === this.keyManageType)
return selectedOption ? typeMap[selectedOption.typename] : ''
}
},
watch: {},
methods: {
// 获取密管方式选项
async getKeyManageOptions() {
try {
const res = await queryKeys()
console.log('获取密管方式选项:', res)
if (res.code === "POP_00014") {
// 存储完整数据
this.keyManageData = res.data
// 设置选项数据
// 找到 isuse 为 1 的选项并设置为默认值
const activeOption = res.data.find(item => item.isuse === "1")
if (activeOption) {
this.keyManageType = activeOption.id
// 设置启用状态
this.isEnabled = true
}
}
} catch (error) {
console.error('获取密管方式选项失败:', error)
}
},
// 处理密管方式变更
async handleKeyManageChange(newVal) {
// 设置启用状态
const selectedOption = this.keyManageData.find(item => item.id === newVal)
this.isEnabled = selectedOption ? selectedOption.isuse === "1" : false
// 退出编辑状态
this.isEditing = false
// 清空之前的参数
this.configParams = {}
// 调用showKeyParams获取参数
try {
const res = await showKeyParams({ typeid: newVal })
if (res.code === "POP_00014") {
this.configParams = res.data
} else {
this.$modal.msgError('获取参数失败')
}
} catch (error) {
console.error('获取密管参数失败:', error)
this.$modal.msgError('获取参数失败')
}
},
// 处理启用状态变更
// 处理下载配置模板
handleDownloadTemplate() {
// TODO: 实现下载配置模板的逻辑
this.$modal.msgSuccess('开始下载配置模板')
},
// 处理上传配置文件
handleUploadConfig() {
console.log('上传配置文件')
this.uploadDialogVisible = true;
this.uploadFile = null;
this.uploadFileList = [];
},
// 处理证书上传
handleUploadCert(type) {
// TODO: 实现证书上传的逻辑
this.$modal.msgSuccess(`开始上传${type}证书`)
},
async handleEnableChange(newVal) {
if (!this.keyManageType) {
// this.isEnabled = false
this.$modal.msgError('请先选择密管方式')
return
}
const oldVal = !newVal
try {
const res = await editIsUse({
typeid: this.keyManageType,
isuse: newVal ? "1" : "0"
})
if (res.code === "POP_00014") {
this.$modal.msgSuccess(newVal ? '启用成功' : '禁用成功')
// 重新获取列表以更新状态
await this.getKeyManageOptions()
} else {
// 如果失败,恢复之前的状态
this.isEnabled = oldVal
this.$modal.msgError('操作失败')
}
} catch (error) {
// 发生错误时恢复之前的状态
this.isEnabled = oldVal
console.error('修改启用状态失败:', error)
this.$modal.msgError('操作失败')
}
},
// 取消编辑
handleCancel() {
// 可选:重置参数
this.isEditing = false
},
// 测试
async handleTest() {
try {
const res = await testCallKey({typeid: this.keyManageType})
if (res.code === 'POP_00014') {
this.$modal.msgSuccess('测试成功')
} else {
this.$modal.msgError(res.msg || '测试失败')
}
} catch (error) {
this.$modal.msgError('测试异常')
}
},
// 确认
async handleConfirm() {
try {
const res = await saveKeyParams({ ...this.configParams, typeid: this.keyManageType })
if (res.code === 'POP_00014') {
this.$modal.msgSuccess('保存成功')
this.isEditing = false
} else {
this.$modal.msgError(res.msg || '保存失败')
}
} catch (error) {
this.$modal.msgError('保存异常')
} finally {
await this.handleCancel()
// 重新获取密管方式选项
await this.getKeyManageOptions()
}
},
// 处理文件变更
handleFileChange(file, fileList) {
this.uploadFile = file.raw;
this.uploadFileList = fileList;
},
// 处理上传取消
handleUploadCancel() {
this.uploadDialogVisible = false;
this.uploadFile = null;
this.uploadFileList = [];
},
// 处理上传确认
async handleUploadConfirm() {
console.log('上传文件:', this.uploadFile);
if (!this.uploadFile) {
this.$modal.msgWarning('请先选择文件');
return;
}
this.uploadLoading = true;
try {
const filePath = this.configParams.sdkPath || '';
const formData = new FormData();
formData.append('file', this.uploadFile);
formData.append('filePath', filePath);
const res = await uploadHsmConfig(formData);
if (res.code === 'POP_00014') {
this.$modal.msgSuccess('上传成功');
this.uploadDialogVisible = false;
} else {
this.$modal.msgError(res.msg || '上传失败');
}
} catch (error) {
this.$modal.msgError('上传异常');
} finally {
this.uploadLoading = false;
}
},
}
}
</script>
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论