From 17950a3254f2367dea76f978c6e862341ce50306 Mon Sep 17 00:00:00 2001 From: RuoYi <yzz_ivy@163.com> Date: 星期一, 25 四月 2022 17:50:08 +0800 Subject: [PATCH] 代码生成预览支持复制内容 --- src/directive/common/copyText.js | 66 +++++++++++++++++++++++++++++++++ src/directive/index.js | 2 + src/views/tool/gen/index.vue | 5 ++ 3 files changed, 73 insertions(+), 0 deletions(-) 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" > + <el-link :underline="false" icon="DocumentCopy" v-copyText="value" v-copyText:callback="copyTextSuccess" style="float:right"> 澶嶅埗</el-link> <pre>{{ value }}</pre> </el-tab-pane> </el-tabs> @@ -274,6 +275,10 @@ preview.value.activeName = "domain.java"; }); } +/** 澶嶅埗浠g爜鎴愬姛 */ +function copyTextSuccess() { + proxy.$modal.msgSuccess("澶嶅埗鎴愬姛"); +} // 澶氶�夋閫変腑鏁版嵁 function handleSelectionChange(selection) { ids.value = selection.map(item => item.tableId); -- Gitblit v1.9.3