From 17950a3254f2367dea76f978c6e862341ce50306 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Mon, 25 Apr 2022 17:50:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E6=94=AF=E6=8C=81=E5=A4=8D=E5=88=B6=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/directive/common/copyText.js | 66 ++++++++++++++++++++++++++++++++ src/directive/index.js | 2 + src/views/tool/gen/index.vue | 5 +++ 3 files changed, 73 insertions(+) create mode 100644 src/directive/common/copyText.js diff --git a/src/directive/common/copyText.js b/src/directive/common/copyText.js new file mode 100644 index 0000000..f1316ce --- /dev/null +++ b/src/directive/common/copyText.js @@ -0,0 +1,66 @@ +/** +* v-copyText 复制文本内容 +* Copyright (c) 2022 ruoyi +*/ + +export default { + beforeMount(el, { value, arg }) { + if (arg === "callback") { + el.$copyCallback = value; + } else { + el.$copyValue = value; + const handler = () => { + copyTextToClipboard(el.$copyValue); + if (el.$copyCallback) { + el.$copyCallback(el.$copyValue); + } + }; + el.addEventListener("click", handler); + el.$destroyCopy = () => el.removeEventListener("click", handler); + } + } +} + +function copyTextToClipboard(input, { target = document.body } = {}) { + const element = document.createElement('textarea'); + const previouslyFocusedElement = document.activeElement; + + element.value = input; + + // Prevent keyboard from showing on mobile + element.setAttribute('readonly', ''); + + element.style.contain = 'strict'; + element.style.position = 'absolute'; + element.style.left = '-9999px'; + element.style.fontSize = '12pt'; // Prevent zooming on iOS + + const selection = document.getSelection(); + const originalRange = selection.rangeCount > 0 && selection.getRangeAt(0); + + target.append(element); + element.select(); + + // Explicit selection workaround for iOS + element.selectionStart = 0; + element.selectionEnd = input.length; + + let isSuccess = false; + try { + isSuccess = document.execCommand('copy'); + } catch { } + + element.remove(); + + if (originalRange) { + selection.removeAllRanges(); + selection.addRange(originalRange); + } + + // Get the focus back on the previously focused element, if any + if (previouslyFocusedElement) { + previouslyFocusedElement.focus(); + } + + return isSuccess; +} diff --git a/src/directive/index.js b/src/directive/index.js index 4f8b356..a86e00b 100644 --- a/src/directive/index.js +++ b/src/directive/index.js @@ -1,7 +1,9 @@ import hasRole from './permission/hasRole' import hasPermi from './permission/hasPermi' +import copyText from './common/copyText' export default function directive(app){ app.directive('hasRole', hasRole) app.directive('hasPermi', hasPermi) + app.directive('copyText', copyText) } \ No newline at end of file diff --git a/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue index d37e0bb..8487547 100644 --- a/src/views/tool/gen/index.vue +++ b/src/views/tool/gen/index.vue @@ -163,6 +163,7 @@ :name="key.substring(key.lastIndexOf('/')+1,key.indexOf('.vm'))" :key="key" > +  复制
{{ value }}
@@ -274,6 +275,10 @@ function handlePreview(row) { preview.value.activeName = "domain.java"; }); } +/** 复制代码成功 */ +function copyTextSuccess() { + proxy.$modal.msgSuccess("复制成功"); +} // 多选框选中数据 function handleSelectionChange(selection) { ids.value = selection.map(item => item.tableId);