diff --git a/src/modules/openapi/ApplyApiKeyDialog.vue b/src/modules/openapi/ApplyApiKeyDialog.vue index eef4fa1..657f86d 100644 --- a/src/modules/openapi/ApplyApiKeyDialog.vue +++ b/src/modules/openapi/ApplyApiKeyDialog.vue @@ -139,11 +139,35 @@ async function submit() { function onClose() { updateVisible(false); if (result.value) emit("refresh") } async function copySecret(text: string) { + // 优先用现代 Clipboard API (HTTPS / localhost 才允许) + // frp 走 http://direv.cloud:8080 是非安全上下文, clipboard API 不可用, 需降级 try { - await navigator.clipboard.writeText(text) - ElMessage.success('已复制') + if (navigator.clipboard?.writeText) { + await navigator.clipboard.writeText(text) + ElMessage.success('已复制') + return + } + throw new Error('no clipboard api') } catch { - ElMessage.error('复制失败,请手动选择文本') + // 降级方案: document.execCommand('copy') - HTTP 下也能用 + try { + const ta = document.createElement('textarea') + ta.value = text + ta.style.position = 'fixed' + ta.style.opacity = '0' + ta.style.pointerEvents = 'none' + document.body.appendChild(ta) + ta.select() + const ok = document.execCommand('copy') + document.body.removeChild(ta) + if (ok) { + ElMessage.success('已复制') + } else { + ElMessage.warning('浏览器阻止自动复制,请手动双击输入框选中后 Cmd/Ctrl+C') + } + } catch { + ElMessage.warning('浏览器阻止自动复制,请手动双击输入框选中后 Cmd/Ctrl+C') + } } } @@ -330,23 +354,25 @@ function notifyContact() { 请立即复制 connectCode 和 appSecret!关弹窗后无法再次查看
已为 {{ result.length }} 个客户生成 APIKey:
-{{ row.appId }}
+ {{ row.appId }}
{{ row.connectCode }}
+ {{ row.connectCode }}