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);