From 5463765c3f466e26a70003095c23b6fb260d9645 Mon Sep 17 00:00:00 2001 From: D <3066417822@qq.com> Date: Fri, 26 Jan 2024 01:08:01 +0800 Subject: [PATCH] update --- src/directive/common/copyText.js | 66 ++++++++++++++++++++++++++++ src/directive/index.js | 9 ++++ src/directive/permission/hasPermi.js | 28 ++++++++++++ src/directive/permission/hasRole.js | 28 ++++++++++++ src/main.js | 3 +- 5 files changed, 133 insertions(+), 1 deletion(-) create mode 100644 src/directive/common/copyText.js create mode 100644 src/directive/index.js create mode 100644 src/directive/permission/hasPermi.js create mode 100644 src/directive/permission/hasRole.js diff --git a/src/directive/common/copyText.js b/src/directive/common/copyText.js new file mode 100644 index 0000000..7063df8 --- /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 new file mode 100644 index 0000000..86b8f88 --- /dev/null +++ b/src/directive/index.js @@ -0,0 +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/directive/permission/hasPermi.js b/src/directive/permission/hasPermi.js new file mode 100644 index 0000000..44ef3f8 --- /dev/null +++ b/src/directive/permission/hasPermi.js @@ -0,0 +1,28 @@ + /** + * v-hasPermi 操作权限处理 + * Copyright (c) 2019 ruoyi + */ + +import useUserStore from '@/store/modules/user' + +export default { + mounted(el, binding, vnode) { + const { value } = binding + const all_permission = "*:*:*"; + const permissions = useUserStore().permissions + + if (value && value instanceof Array && value.length > 0) { + const permissionFlag = value + + const hasPermissions = permissions.some(permission => { + return all_permission === permission || permissionFlag.includes(permission) + }) + + if (!hasPermissions) { + el.parentNode && el.parentNode.removeChild(el) + } + } else { + throw new Error(`请设置操作权限标签值`) + } + } +} diff --git a/src/directive/permission/hasRole.js b/src/directive/permission/hasRole.js new file mode 100644 index 0000000..8774bdd --- /dev/null +++ b/src/directive/permission/hasRole.js @@ -0,0 +1,28 @@ + /** + * v-hasRole 角色权限处理 + * Copyright (c) 2019 ruoyi + */ + +import useUserStore from '@/store/modules/user' + +export default { + mounted(el, binding, vnode) { + const { value } = binding + const super_admin = "admin"; + const roles = useUserStore().roles + + if (value && value instanceof Array && value.length > 0) { + const roleFlag = value + + const hasRole = roles.some(role => { + return super_admin === role || roleFlag.includes(role) + }) + + if (!hasRole) { + el.parentNode && el.parentNode.removeChild(el) + } + } else { + throw new Error(`请设置角色权限标签值`) + } + } +} diff --git a/src/main.js b/src/main.js index be6738f..af41f74 100644 --- a/src/main.js +++ b/src/main.js @@ -5,6 +5,7 @@ import uviewPlus from 'uview-plus' import { createSSRApp } from 'vue' +import directive from './directive' // directive import { useDict } from '@/utils/dict' import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi' @@ -16,7 +17,7 @@ export function createApp() { app.use(store) app.use(uviewPlus) app.use(plugins) - + directive(app) // 全局方法挂载 app.config.globalProperties.useDict = useDict