From b06f6a316b6a8293bb8aba6bfff33336b66c032a Mon Sep 17 00:00:00 2001 From: ahaos <8406649+lhailgl@user.noreply.gitee.com> Date: 星期三, 13 十二月 2023 09:01:52 +0800 Subject: [PATCH] !64 版本升级 * Merge branch 'dev' of gitee.com:JavaLionLi/plus-ui into ts * 升级依赖 * !61 fix: 删除重复环境变量ElUploadInstance * fix: 删除重复环境变量ElUploadInstance --- src/layout/index.vue | 64 src/views/system/tenant/index.vue | 128 src/views/system/user/authRole.vue | 28 src/views/monitor/logininfor/index.vue | 142 src/views/monitor/operlog/index.vue | 73 src/store/modules/permission.ts | 65 src/layout/components/TopBar/search.vue | 187 src/components/LangSelect/index.vue | 7 src/views/system/tenantPackage/index.vue | 93 src/components/BuildCode/index.vue | 73 src/components/ImageUpload/index.vue | 239 +- src/views/monitor/cache/index.vue | 74 src/layout/components/notice/index.vue | 23 src/store/modules/notice.ts | 2 src/views/error/404.vue | 8 src/components/SizeSelect/index.vue | 12 src/views/system/oss/index.vue | 132 src/components/Breadcrumb/index.vue | 39 src/layout/components/Sidebar/Link.vue | 44 src/directive/permission/index.ts | 4 src/components/Hamburger/index.vue | 8 src/views/tool/gen/index.vue | 74 src/components/TopNav/index.vue | 98 src/components/ImagePreview/index.vue | 18 src/views/system/role/index.vue | 252 +- src/types/element.d.ts | 6 src/views/system/oss/config.vue | 153 src/components/Editor/index.vue | 158 src/views/system/menu/index.vue | 132 src/views/error/401.vue | 4 src/views/system/dict/data.vue | 119 src/views/tool/gen/editTable.vue | 32 src/layout/components/Sidebar/index.vue | 41 src/views/tool/gen/importTable.vue | 40 src/components/RuoYiDoc/index.vue | 2 src/views/system/dept/index.vue | 126 src/store/modules/tagsView.ts | 22 src/layout/components/TagsView/index.vue | 343 +- src/permission.ts | 5 src/components/TreeSelect/index.vue | 123 .prettierrc | 20 src/views/system/user/profile/userInfo.vue | 33 src/components/iFrame/index.vue | 12 src/views/system/user/profile/resetPwd.vue | 44 src/layout/components/AppMain.vue | 21 .eslintignore | 2 src/api/tool/gen/index.ts | 4 src/views/index.vue | 12 src/components/BuildCode/render.vue | 67 src/views/system/user/profile/userAvatar.vue | 40 src/views/system/user/profile/thirdParty.vue | 39 src/views/register.vue | 65 src/layout/components/InnerLink/index.vue | 13 .eslintrc.js | 23 src/layout/components/Sidebar/Logo.vue | 26 src/views/system/role/authUser.vue | 57 src/plugins/tab.ts | 18 src/router/index.ts | 6 src/types/router.d.ts | 48 src/views/system/post/index.vue | 82 src/utils/request.ts | 2 src/views/system/user/profile/index.vue | 50 src/views/tool/gen/basicInfoForm.vue | 22 src/types/env.d.ts | 5 src/components/Pagination/index.vue | 94 tsconfig.json | 8 src/layout/components/TagsView/ScrollPane.vue | 114 src/views/system/notice/index.vue | 76 src/components/FileUpload/index.vue | 240 +- src/layout/components/Settings/index.vue | 176 src/views/system/dict/index.vue | 91 src/views/system/config/index.vue | 94 src/layout/components/SocialCallback/index.vue | 5 src/layout/components/Navbar.vue | 91 src/types/global.d.ts | 73 src/views/redirect/index.vue | 8 src/store/modules/settings.ts | 38 src/utils/websocket.ts | 4 src/views/system/role/selectUser.vue | 35 src/components/HeaderSearch/index.vue | 96 src/layout/components/Sidebar/SidebarItem.vue | 122 src/views/system/client/index.vue | 124 src/components/DictTag/index.vue | 60 src/views/demo/tree/index.vue | 123 src/components/SvgIcon/index.vue | 20 src/components/RightToolbar/index.vue | 50 src/views/monitor/online/index.vue | 18 src/components/IconSelect/index.vue | 24 /dev/null | 70 src/views/system/user/index.vue | 288 +- src/views/login.vue | 55 src/views/tool/gen/genInfoForm.vue | 49 src/layout/components/IframeToggle/index.vue | 12 src/utils/propTypes.ts | 1 src/views/demo/demo/index.vue | 104 package.json | 63 src/components/RuoYiGit/index.vue | 2 src/App.vue | 10 98 files changed, 3,191 insertions(+), 3,151 deletions(-) diff --git a/.eslintignore b/.eslintignore index c4d771a..9858f3e 100644 --- a/.eslintignore +++ b/.eslintignore @@ -14,4 +14,4 @@ .eslintrc.js prettier.config.js src/assets -tailwind.config.js \ No newline at end of file +tailwind.config.js diff --git a/.eslintrc.js b/.eslintrc.js index a1b32e3..3fab2db 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,28 +1,35 @@ module.exports = { env: { browser: true, - es2021: true, - node: true + node: true, + es6: true }, parser: 'vue-eslint-parser', extends: [ - 'eslint:recommended', - 'plugin:vue/vue3-essential', - 'plugin:@typescript-eslint/recommended', + 'plugin:vue/vue3-recommended', './.eslintrc-auto-import.json', - 'plugin:prettier/recommended' + 'plugin:@typescript-eslint/recommended', + "prettier", + 'plugin:prettier/recommended', ], parserOptions: { ecmaVersion: '2020', sourceType: 'module', + project: "./tsconfig.*?.json", parser: '@typescript-eslint/parser' }, - plugins: ['vue', '@typescript-eslint'], + plugins: ['vue', '@typescript-eslint', 'import', 'promise', 'node', 'prettier'], rules: { - 'vue/multi-word-component-names': 'off', '@typescript-eslint/no-empty-function': 'off', '@typescript-eslint/no-explicit-any': 'off', + + // vue + 'vue/multi-word-component-names': 'off', + 'vue/valid-define-props': 'off', 'vue/no-v-model-argument': 'off', + 'prefer-rest-params': 'off', + // prettier + 'prettier/prettier': 'error', '@typescript-eslint/ban-types': [ 'error', { diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..0b00890 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,20 @@ +{ + "printWidth": 150, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "singleQuote": true, + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "bracketSameLine": false, + "trailingComma": "none", + "bracketSpacing": true, + "embeddedLanguageFormatting": "auto", + "arrowParens": "always", + "requirePragma": false, + "insertPragma": false, + "proseWrap": "preserve", + "htmlWhitespaceSensitivity": "css", + "vueIndentScriptAndStyle": false, + "endOfLine": "auto" +} diff --git a/package.json b/package.json index 13e0f92..95cd2a1 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,10 @@ "license": "MIT", "scripts": { "dev": "vite serve --mode development", - "build:prod": "vite build --mode production &&vue-tsc --noEmit", + "build:prod": "vite build --mode production", + "build:dev": "vite build --mode development", "preview": "vite preview", - "lint": "eslint src/**/*.{ts,js,vue} --fix", + "lint:eslint": "eslint --fix --ext .ts,.js,.vue ./src ", "prepare": "husky install", "prettier": "prettier --write ." }, @@ -19,28 +20,28 @@ "dependencies": { "@element-plus/icons-vue": "2.1.0", "@vueup/vue-quill": "1.2.0", - "@vueuse/core": "9.5.0", + "@vueuse/core": "10.7.0", "animate.css": "4.1.1", "await-to-js": "^3.0.0", "axios": "^1.3.4", + "crypto-js": "^4.1.1", "echarts": "5.4.0", - "element-plus": "2.2.27", + "element-plus": "2.4.3", "file-saver": "2.0.5", "fuse.js": "6.6.2", "js-cookie": "3.0.1", "jsencrypt": "3.3.1", - "crypto-js": "^4.1.1", "nprogress": "0.2.0", "path-browserify": "1.0.1", "path-to-regexp": "6.2.0", - "pinia": "2.0.22", + "pinia": "2.1.7", "screenfull": "6.0.0", "vform3-builds": "3.0.8", - "vue": "3.2.45", + "vue": "3.3.11", "vue-cropper": "1.0.3", "vue-i18n": "9.2.2", - "vue-router": "4.1.4", - "vue-types": "^5.0.3" + "vue-router": "4.2.5", + "vue-types": "5.1.1" }, "devDependencies": { "@iconify/json": "^2.2.40", @@ -51,34 +52,38 @@ "@types/node": "18.14.2", "@types/nprogress": "0.2.0", "@types/path-browserify": "^1.0.0", - "@typescript-eslint/eslint-plugin": "5.56.0", - "@typescript-eslint/parser": "5.56.0", - "@unocss/preset-attributify": "^0.50.6", - "@unocss/preset-icons": "^0.50.6", - "@unocss/preset-uno": "^0.50.6", - "@vitejs/plugin-vue": "4.0.0", + "@typescript-eslint/eslint-plugin": "6.14.0", + "@typescript-eslint/parser": "6.14.0", + "@unocss/preset-attributify": "^0.58.0", + "@unocss/preset-icons": "^0.58.0", + "@unocss/preset-uno": "^0.58.0", "@vue/compiler-sfc": "3.2.45", + "@vitejs/plugin-vue": "4.5.2", "autoprefixer": "10.4.14", - "eslint": "8.36.0", - "eslint-config-prettier": "8.8.0", - "eslint-plugin-prettier": "4.2.1", - "eslint-plugin-vue": "9.9.0", + "eslint": "8.55.0", + "eslint-config-prettier": "9.1.0", + "eslint-define-config": "2.0.0", + "eslint-plugin-prettier": "5.0.1", + "eslint-plugin-promise": "6.1.1", + "eslint-plugin-node": "11.1.0", + "eslint-plugin-import": "2.29.0", + "eslint-plugin-vue": "9.19.2", "fast-glob": "^3.2.11", "husky": "7.0.4", "postcss": "^8.4.21", - "prettier": "2.8.6", + "prettier": "3.1.1", "sass": "1.56.1", - "typescript": "4.9.5", - "unocss": "^0.50.6", - "unplugin-auto-import": "0.13.0", - "unplugin-icons": "0.15.1", - "unplugin-vue-components": "0.23.0", - "vite": "4.3.1", + "typescript": "5.2.2", + "unocss": "^0.58.0", + "unplugin-auto-import": "0.17.2", + "unplugin-icons": "0.18.1", + "unplugin-vue-components": "0.26.0", + "unplugin-vue-setup-extend-plus": "0.4.9", "vite-plugin-compression": "0.5.1", "vite-plugin-svg-icons": "2.0.1", - "unplugin-vue-setup-extend-plus": "0.4.9", "vitest": "^0.29.7", - "vue-eslint-parser": "9.1.0", - "vue-tsc": "0.35.0" + "vue-eslint-parser": "9.3.2", + "vue-tsc": "0.35.0", + "vite": "5.0.4" } } diff --git a/src/App.vue b/src/App.vue index 41ffdd4..0b058d7 100644 --- a/src/App.vue +++ b/src/App.vue @@ -5,8 +5,8 @@ </template> <script setup lang="ts"> -import useSettingsStore from '@/store/modules/settings' -import { handleThemeStyle } from '@/utils/theme' +import useSettingsStore from '@/store/modules/settings'; +import { handleThemeStyle } from '@/utils/theme'; import useAppStore from '@/store/modules/app'; const appStore = useAppStore(); @@ -15,7 +15,7 @@ onMounted(() => { nextTick(() => { // 鍒濆鍖栦富棰樻牱寮� - handleThemeStyle(useSettingsStore().theme) - }) -}) + handleThemeStyle(useSettingsStore().theme); + }); +}); </script> diff --git a/src/api/tool/gen/index.ts b/src/api/tool/gen/index.ts index b91df6a..efe079c 100644 --- a/src/api/tool/gen/index.ts +++ b/src/api/tool/gen/index.ts @@ -28,7 +28,7 @@ }; // 淇敼浠g爜鐢熸垚淇℃伅 -export const updateGenTable = (data: DbTableForm) => { +export const updateGenTable = (data: DbTableForm): AxiosPromise<GenTableVO> => { return request({ url: '/tool/gen', method: 'put', @@ -37,7 +37,7 @@ }; // 瀵煎叆琛� -export const importTable = (data: { tables: string; dataName: string }) => { +export const importTable = (data: { tables: string; dataName: string }): AxiosPromise<GenTableVO> => { return request({ url: '/tool/gen/importTable', method: 'post', diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index b96829a..57a30ac 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -2,8 +2,7 @@ <el-breadcrumb class="app-breadcrumb" separator="/"> <transition-group name="breadcrumb"> <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path"> - <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ - item.meta?.title }}</span> + <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta?.title }}</span> <a v-else @click.prevent="handleLink(item)">{{ item.meta?.title }}</a> </el-breadcrumb-item> </transition-group> @@ -11,42 +10,42 @@ </template> <script setup lang="ts"> -import { RouteLocationMatched } from 'vue-router' +import { RouteLocationMatched } from 'vue-router'; const route = useRoute(); const router = useRouter(); -const levelList = ref<RouteLocationMatched[]>([]) +const levelList = ref<RouteLocationMatched[]>([]); const getBreadcrumb = () => { // only show routes with meta.title - let matched = route.matched.filter(item => item.meta && item.meta.title); - const first = matched[0] + let matched = route.matched.filter((item) => item.meta && item.meta.title); + const first = matched[0]; // 鍒ゆ柇鏄惁涓洪椤� if (!isDashboard(first)) { - matched = ([{ path: '/index', meta: { title: '棣栭〉' } }] as any).concat(matched) + matched = ([{ path: '/index', meta: { title: '棣栭〉' } }] as any).concat(matched); } - levelList.value = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false) -} + levelList.value = matched.filter((item) => item.meta && item.meta.title && item.meta.breadcrumb !== false); +}; const isDashboard = (route: RouteLocationMatched) => { - const name = route && route.name as string + const name = route && (route.name as string); if (!name) { - return false + return false; } - return name.trim() === 'Index' -} + return name.trim() === 'Index'; +}; const handleLink = (item: RouteLocationMatched) => { - const { redirect, path } = item - redirect ? router.push(redirect as string) : router.push(path) -} + const { redirect, path } = item; + redirect ? router.push(redirect as string) : router.push(path); +}; watchEffect(() => { // if you go to the redirect page, do not update the breadcrumbs - if (route.path.startsWith('/redirect/')) return - getBreadcrumb() -}) + if (route.path.startsWith('/redirect/')) return; + getBreadcrumb(); +}); onMounted(() => { getBreadcrumb(); -}) +}); </script> <style lang="scss" scoped> diff --git a/src/components/BuildCode/index.vue b/src/components/BuildCode/index.vue index b23665c..0b8e3f4 100644 --- a/src/components/BuildCode/index.vue +++ b/src/components/BuildCode/index.vue @@ -1,53 +1,50 @@ -<!-- 浠g爜鏋勫缓 --> -<script setup lang="ts"> - -const props = defineProps({ - showBtn: { - type: Boolean, - default: false - }, - formJson: { - type: Object, - default: undefined - } -}) -const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const buildRef = ref(); -const emits = defineEmits(['reJson', 'saveDesign']); - - - -//鑾峰彇琛ㄥ崟json -const getJson = () => { - const formJson = JSON.stringify(buildRef.value.getFormJson()) - const fieldJson = JSON.stringify(buildRef.value.getFieldWidgets()) - let data = { - formJson, fieldJson - } - emits("saveDesign", data) -} - -onMounted(() => { - if (props.formJson) { - buildRef.value.setFormJson(props.formJson) - } -}) -</script> - <template> + <!-- 浠g爜鏋勫缓 --> <div> <v-form-designer - class="build" ref="buildRef" + class="build" :designer-config="{ importJsonButton: true, exportJsonButton: true, exportCodeButton: true, generateSFCButton: true, formTemplates: true }" > - <template #customToolButtons v-if="showBtn"> + <template v-if="showBtn" #customToolButtons> <el-button link type="primary" icon="Select" @click="getJson">淇濆瓨</el-button> </template> </v-form-designer> </div> </template> +<script setup lang="ts"> +interface Props { + showBtn: boolean; + formJson: any; +} + +const props = withDefaults(defineProps<Props>(), { + showBtn: true, + formJson: '' +}); + +const buildRef = ref(); +const emits = defineEmits(['reJson', 'saveDesign']); + +//鑾峰彇琛ㄥ崟json +const getJson = () => { + const formJson = JSON.stringify(buildRef.value.getFormJson()); + const fieldJson = JSON.stringify(buildRef.value.getFieldWidgets()); + let data = { + formJson, + fieldJson + }; + emits('saveDesign', data); +}; + +onMounted(() => { + if (props.formJson) { + buildRef.value.setFormJson(props.formJson); + } +}); +</script> + <style lang="scss"> .build { margin: 0 !important; diff --git a/src/components/BuildCode/render.vue b/src/components/BuildCode/render.vue index 62f3d86..3c0865c 100644 --- a/src/components/BuildCode/render.vue +++ b/src/components/BuildCode/render.vue @@ -1,26 +1,28 @@ +<template> + <div class=""> + <v-form-render ref="vFormRef" :form-json="formJson" :form-data="formData" /> + </div> +</template> + <!-- 鍔ㄦ�佽〃鍗曟覆鏌� --> -<script setup name="Render"> +<script setup name="Render" lang="ts"> +interface Props { + formJson: string | object; + formData: string | object; + isView: boolean; +} -const props = defineProps({ - formJson: { - type: [String, Object], - default: "" - }, - formData: { - type: [String, Object], - default: "" - }, - isView: { - type: Boolean, - default: false - } -}) +const props = withDefaults(defineProps<Props>(), { + formJson: '', + formData: '', + isView: false +}); -const vFormRef = ref(null) +const vFormRef = ref(null); // 鑾峰彇琛ㄥ崟鏁版嵁-寮傛 const getFormData = () => { - return vFormRef.value.getFormData() -} + return vFormRef.value.getFormData(); +}; /** * 璁剧疆琛ㄥ崟鍐呭 @@ -28,35 +30,28 @@ * formConfig锛歿 formTemplate锛氳〃鍗曟ā鏉匡紝formData锛氳〃鍗曟暟鎹紝hiddenField锛氶渶瑕侀殣钘忕殑瀛楁瀛楃涓查泦鍚堬紝disabledField锛氶渶瑕佺鐢ㄧ殑鑷瀛楃涓查泦鍚坿 */ const initForm = (formConf) => { - const { formTemplate, formData, hiddenField, disabledField } = toRaw(formConf) + const { formTemplate, formData, hiddenField, disabledField } = toRaw(formConf); if (formTemplate) { - vFormRef.value.setFormJson(formTemplate) + vFormRef.value.setFormJson(formTemplate); if (formData) { - vFormRef.value.setFormData(formData) + vFormRef.value.setFormData(formData); } if (disabledField && disabledField.length > 0) { setTimeout(() => { - vFormRef.value.disableWidgets(disabledField) - }, 200) + vFormRef.value.disableWidgets(disabledField); + }, 200); } if (hiddenField && hiddenField.length > 0) { setTimeout(() => { - vFormRef.value.hideWidgets(hiddenField) - }, 200) + vFormRef.value.hideWidgets(hiddenField); + }, 200); } if (props.isView) { - console.log(props.isView) setTimeout(() => { - vFormRef.value.disableForm() - }, 100) + vFormRef.value.disableForm(); + }, 100); } } -} -defineExpose({ getFormData, initForm }) +}; +defineExpose({ getFormData, initForm }); </script> - -<template> - <div class=""> - <v-form-render ref="vFormRef" :form-json="formJson" :form-data="formData" /> - </div> -</template> diff --git a/src/components/DictTag/index.vue b/src/components/DictTag/index.vue index 45b288b..8d9fb40 100644 --- a/src/components/DictTag/index.vue +++ b/src/components/DictTag/index.vue @@ -8,13 +8,13 @@ </span> <el-tag v-else - :disable-transitions="true" :key="item.value + ''" + :disable-transitions="true" :index="index" :type="(item.elTagType === 'primary' || item.elTagType === 'default')? '' : item.elTagType" :class="item.elTagClass" > - {{ item.label + " " }} + {{ item.label + ' ' }} </el-tag> </template> </template> @@ -25,57 +25,53 @@ </template> <script setup lang="ts"> -import { propTypes } from '@/utils/propTypes'; - - -const props = defineProps({ - // 鏁版嵁 - options: { - type: Array as PropType<DictDataOption[]>, - default: null, - }, - // 褰撳墠鐨勫�� - value: [Number, String, Array] as PropType<number | string | Array<number | string>>, - // 褰撴湭鎵惧埌鍖归厤鐨勬暟鎹椂锛屾樉绀簐alue - showValue: propTypes.bool.def(true), - separator: propTypes.string.def(","), +interface Props { + options: Array<DictDataOption>; + value: number | string | Array<number | string>; + showValue: boolean; + separator: string; +} +const props = withDefaults(defineProps<Props>(), { + showValue: true, + separator: ',' }); + const values = computed(() => { - if (props.value === '' || props.value === null || typeof props.value === "undefined") return [] - return Array.isArray(props.value) ? props.value.map(item => '' + item) : String(props.value).split(props.separator); + if (props.value === '' || props.value === null || typeof props.value === 'undefined') return []; + return Array.isArray(props.value) ? props.value.map((item) => '' + item) : String(props.value).split(props.separator); }); const unmatch = computed(() => { - if (props.options?.length == 0 || props.value === '' || props.value === null || typeof props.value === "undefined") return false + if (props.options?.length == 0 || props.value === '' || props.value === null || typeof props.value === 'undefined') return false; // 浼犲叆鍊间负闈炴暟缁� - values.value.forEach(item => { - if (!props.options.some(v => v.value === item)) { - return true // 濡傛灉鏈夋湭鍖归厤椤癸紝灏嗘爣蹇楄缃负true + values.value.forEach((item) => { + if (!props.options.some((v) => v.value === item)) { + return true; // 濡傛灉鏈夋湭鍖归厤椤癸紝灏嗘爣蹇楄缃负true } - }) - return false // 杩斿洖鏍囧織鐨勫�� + }); + return false; // 杩斿洖鏍囧織鐨勫�� }); const unmatchArray = computed(() => { -// 璁板綍鏈尮閰嶇殑椤� + // 璁板綍鏈尮閰嶇殑椤� const itemUnmatchArray: Array<string | number> = []; - if (props.value !== '' && props.value !== null && typeof props.value !== "undefined") { - values.value.forEach(item => { - if (!props.options.some(v => v.value === item)) { + if (props.value !== '' && props.value !== null && typeof props.value !== 'undefined') { + values.value.forEach((item) => { + if (!props.options.some((v) => v.value === item)) { itemUnmatchArray.push(item); } - }) + }); } // 娌℃湁value涓嶆樉绀� return handleArray(itemUnmatchArray); }); const handleArray = (array: Array<string | number>) => { - if (array.length === 0) return ""; + if (array.length === 0) return ''; return array.reduce((pre, cur) => { - return pre + " " + cur; + return pre + ' ' + cur; }); -} +}; </script> <style scoped> diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue index b5299b4..44dee6d 100644 --- a/src/components/Editor/index.vue +++ b/src/components/Editor/index.vue @@ -1,6 +1,8 @@ <template> <div> <el-upload + v-if="type === 'url'" + ref="uploadRef" :action="upload.url" :before-upload="handleBeforeUpload" :on-success="handleUploadSuccess" @@ -9,18 +11,16 @@ name="file" :show-file-list="false" :headers="upload.headers" - ref="uploadRef" - v-if="type === 'url'" > </el-upload> <div class="editor"> <quill-editor ref="quillEditorRef" v-model:content="content" - contentType="html" - @textChange="(e: any) => $emit('update:modelValue', content)" + content-type="html" :options="options" :style="styles" + @text-change="(e: any) => $emit('update:modelValue', content)" /> </div> </div> @@ -30,7 +30,7 @@ import { QuillEditor, Quill } from '@vueup/vue-quill'; import '@vueup/vue-quill/dist/vue-quill.snow.css'; import { propTypes } from '@/utils/propTypes'; -import { globalHeaders } from "@/utils/request"; +import { globalHeaders } from '@/utils/request'; const props = defineProps({ /* 缂栬緫鍣ㄧ殑鍐呭 */ @@ -52,42 +52,42 @@ const upload = reactive<UploadOption>({ headers: globalHeaders(), url: import.meta.env.VITE_APP_BASE_API + '/resource/oss/upload' -}) +}); const quillEditorRef = ref(); const options = ref({ - theme: "snow", + theme: 'snow', bounds: document.body, - debug: "warn", + debug: 'warn', modules: { // 宸ュ叿鏍忛厤缃� toolbar: { container: [ - ["bold", "italic", "underline", "strike"], // 鍔犵矖 鏂滀綋 涓嬪垝绾� 鍒犻櫎绾� - ["blockquote", "code-block"], // 寮曠敤 浠g爜鍧� - [{ list: "ordered" }, { list: "bullet" }], // 鏈夊簭銆佹棤搴忓垪琛� - [{ indent: "-1" }, { indent: "+1" }], // 缂╄繘 - [{ size: ["small", false, "large", "huge"] }], // 瀛椾綋澶у皬 - [{ header: [1, 2, 3, 4, 5, 6, false] }], // 鏍囬 - [{ color: [] }, { background: [] }], // 瀛椾綋棰滆壊銆佸瓧浣撹儗鏅鑹� - [{ align: [] }], // 瀵归綈鏂瑰紡 - ["clean"], // 娓呴櫎鏂囨湰鏍煎紡 - ["link", "image", "video"] // 閾炬帴銆佸浘鐗囥�佽棰� + ['bold', 'italic', 'underline', 'strike'], // 鍔犵矖 鏂滀綋 涓嬪垝绾� 鍒犻櫎绾� + ['blockquote', 'code-block'], // 寮曠敤 浠g爜鍧� + [{ list: 'ordered' }, { list: 'bullet' }], // 鏈夊簭銆佹棤搴忓垪琛� + [{ indent: '-1' }, { indent: '+1' }], // 缂╄繘 + [{ size: ['small', false, 'large', 'huge'] }], // 瀛椾綋澶у皬 + [{ header: [1, 2, 3, 4, 5, 6, false] }], // 鏍囬 + [{ color: [] }, { background: [] }], // 瀛椾綋棰滆壊銆佸瓧浣撹儗鏅鑹� + [{ align: [] }], // 瀵归綈鏂瑰紡 + ['clean'], // 娓呴櫎鏂囨湰鏍煎紡 + ['link', 'image', 'video'] // 閾炬帴銆佸浘鐗囥�佽棰� ], handlers: { image: function (value: any) { if (value) { // 璋冪敤element鍥剧墖涓婁紶 - (document.querySelector(".editor-img-uploader>.el-upload") as HTMLDivElement)?.click(); + (document.querySelector('.editor-img-uploader>.el-upload') as HTMLDivElement)?.click(); } else { - Quill.format("image", true); + Quill.format('image', true); } - }, - }, + } + } } }, - placeholder: "璇疯緭鍏ュ唴瀹�", - readOnly: props.readOnly, + placeholder: '璇疯緭鍏ュ唴瀹�', + readOnly: props.readOnly }); const styles = computed(() => { @@ -99,14 +99,18 @@ style.height = `${props.height}px`; } return style; -}) +}); -const content = ref(""); -watch(() => props.modelValue, (v) => { - if (v !== content.value) { - content.value = v === undefined ? "<p></p>" : v; - } -}, { immediate: true }); +const content = ref(''); +watch( + () => props.modelValue, + (v) => { + if (v !== content.value) { + content.value = v === undefined ? '<p></p>' : v; + } + }, + { immediate: true } +); // 鍥剧墖涓婁紶鎴愬姛杩斿洖鍥剧墖鍦板潃 const handleUploadSuccess = (res: any) => { @@ -117,7 +121,7 @@ // 鑾峰彇鍏夋爣浣嶇疆 let length = quill.selection.savedRange.index; // 鎻掑叆鍥剧墖锛宺es涓烘湇鍔″櫒杩斿洖鐨勫浘鐗囬摼鎺ュ湴鍧� - quill.insertEmbed(length, "image", res.data.url); + quill.insertEmbed(length, 'image', res.data.url); // 璋冩暣鍏夋爣鍒版渶鍚� quill.setSelection(length + 1); proxy?.$modal.closeLoading(); @@ -125,11 +129,11 @@ proxy?.$modal.loading(res.msg); proxy?.$modal.closeLoading(); } -} +}; // 鍥剧墖涓婁紶鍓嶆嫤鎴� const handleBeforeUpload = (file: any) => { - const type = ["image/jpeg", "image/jpg", "image/png", "image/svg"]; + const type = ['image/jpeg', 'image/jpg', 'image/png', 'image/svg']; const isJPG = type.includes(file.type); //妫�楠屾枃浠舵牸寮� if (!isJPG) { @@ -146,13 +150,13 @@ } proxy?.$modal.loading('姝e湪涓婁紶鏂囦欢锛岃绋嶅��...'); return true; -} +}; // 鍥剧墖澶辫触鎷︽埅 const handleUploadError = (err: any) => { console.error(err); proxy?.$modal.msgError('涓婁紶鏂囦欢澶辫触'); -} +}; </script> <style> @@ -167,71 +171,71 @@ .quill-img { display: none; } -.ql-snow .ql-tooltip[data-mode="link"]::before { - content: "璇疯緭鍏ラ摼鎺ュ湴鍧�:"; +.ql-snow .ql-tooltip[data-mode='link']::before { + content: '璇疯緭鍏ラ摼鎺ュ湴鍧�:'; } .ql-snow .ql-tooltip.ql-editing a.ql-action::after { border-right: 0; - content: "淇濆瓨"; + content: '淇濆瓨'; padding-right: 0; } -.ql-snow .ql-tooltip[data-mode="video"]::before { - content: "璇疯緭鍏ヨ棰戝湴鍧�:"; +.ql-snow .ql-tooltip[data-mode='video']::before { + content: '璇疯緭鍏ヨ棰戝湴鍧�:'; } .ql-snow .ql-picker.ql-size .ql-picker-label::before, .ql-snow .ql-picker.ql-size .ql-picker-item::before { - content: "14px"; + content: '14px'; } -.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before, -.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before { - content: "10px"; +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='small']::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='small']::before { + content: '10px'; } -.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before, -.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before { - content: "18px"; +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='large']::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='large']::before { + content: '18px'; } -.ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before, -.ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before { - content: "32px"; +.ql-snow .ql-picker.ql-size .ql-picker-label[data-value='huge']::before, +.ql-snow .ql-picker.ql-size .ql-picker-item[data-value='huge']::before { + content: '32px'; } .ql-snow .ql-picker.ql-header .ql-picker-label::before, .ql-snow .ql-picker.ql-header .ql-picker-item::before { - content: "鏂囨湰"; + content: '鏂囨湰'; } -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { - content: "鏍囬1"; +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='1']::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='1']::before { + content: '鏍囬1'; } -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { - content: "鏍囬2"; +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='2']::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='2']::before { + content: '鏍囬2'; } -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { - content: "鏍囬3"; +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='3']::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='3']::before { + content: '鏍囬3'; } -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { - content: "鏍囬4"; +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='4']::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='4']::before { + content: '鏍囬4'; } -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { - content: "鏍囬5"; +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='5']::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='5']::before { + content: '鏍囬5'; } -.ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, -.ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { - content: "鏍囬6"; +.ql-snow .ql-picker.ql-header .ql-picker-label[data-value='6']::before, +.ql-snow .ql-picker.ql-header .ql-picker-item[data-value='6']::before { + content: '鏍囬6'; } .ql-snow .ql-picker.ql-font .ql-picker-label::before, .ql-snow .ql-picker.ql-font .ql-picker-item::before { - content: "鏍囧噯瀛椾綋"; + content: '鏍囧噯瀛椾綋'; } -.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before, -.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before { - content: "琛嚎瀛椾綋"; +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='serif']::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='serif']::before { + content: '琛嚎瀛椾綋'; } -.ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before, -.ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before { - content: "绛夊瀛椾綋"; +.ql-snow .ql-picker.ql-font .ql-picker-label[data-value='monospace']::before, +.ql-snow .ql-picker.ql-font .ql-picker-item[data-value='monospace']::before { + content: '绛夊瀛椾綋'; } </style> diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue index be99ac0..67abaab 100644 --- a/src/components/FileUpload/index.vue +++ b/src/components/FileUpload/index.vue @@ -1,6 +1,7 @@ <template> <div class="upload-file"> <el-upload + ref="fileUploadRef" multiple :action="uploadFileUrl" :before-upload="handleBeforeUpload" @@ -12,30 +13,29 @@ :show-file-list="false" :headers="headers" class="upload-file-uploader" - ref="fileUploadRef" > <!-- 涓婁紶鎸夐挳 --> <el-button type="primary">閫夊彇鏂囦欢</el-button> </el-upload> <!-- 涓婁紶鎻愮ず --> - <div class="el-upload__tip" v-if="showTip"> + <div v-if="showTip" class="el-upload__tip"> 璇蜂笂浼� <template v-if="fileSize"> 澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b> </template> <template v-if="fileType"> - 鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b> + 鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join('/') }}</b> </template> 鐨勬枃浠� </div> <!-- 鏂囦欢鍒楄〃 --> <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"> - <li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"> + <li v-for="(file, index) in fileList" :key="file.uid" class="el-upload-list__item ele-upload-list__item-content"> <el-link :href="`${file.url}`" :underline="false" target="_blank"> <span class="el-icon-document"> {{ getFileName(file.name) }} </span> </el-link> <div class="ele-upload-list__item-content-action"> - <el-link :underline="false" @click="handleDelete(index)" type="danger">鍒犻櫎</el-link> + <el-link :underline="false" type="danger" @click="handleDelete(index)">鍒犻櫎</el-link> </div> </li> </transition-group> @@ -43,20 +43,20 @@ </template> <script setup lang="ts"> -import { listByIds, delOss } from "@/api/system/oss"; +import { listByIds, delOss } from '@/api/system/oss'; import { propTypes } from '@/utils/propTypes'; -import { globalHeaders } from "@/utils/request"; +import { globalHeaders } from '@/utils/request'; const props = defineProps({ - modelValue: [String, Object, Array], - // 鏁伴噺闄愬埗 - limit: propTypes.number.def(5), - // 澶у皬闄愬埗(MB) - fileSize: propTypes.number.def(5), - // 鏂囦欢绫诲瀷, 渚嬪['png', 'jpg', 'jpeg'] - fileType: propTypes.array.def(["doc", "xls", "ppt", "txt", "pdf"]), - // 鏄惁鏄剧ず鎻愮ず - isShowTip: propTypes.bool.def(true), + modelValue: [String, Object, Array], + // 鏁伴噺闄愬埗 + limit: propTypes.number.def(5), + // 澶у皬闄愬埗(MB) + fileSize: propTypes.number.def(5), + // 鏂囦欢绫诲瀷, 渚嬪['png', 'jpg', 'jpeg'] + fileType: propTypes.array.def(['doc', 'xls', 'ppt', 'txt', 'pdf']), + // 鏄惁鏄剧ず鎻愮ず + isShowTip: propTypes.bool.def(true) }); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -65,153 +65,163 @@ const uploadList = ref<any[]>([]); const baseUrl = import.meta.env.VITE_APP_BASE_API; -const uploadFileUrl = ref(baseUrl + "/resource/oss/upload"); // 涓婁紶鏂囦欢鏈嶅姟鍣ㄥ湴鍧� +const uploadFileUrl = ref(baseUrl + '/resource/oss/upload'); // 涓婁紶鏂囦欢鏈嶅姟鍣ㄥ湴鍧� const headers = ref(globalHeaders()); const fileList = ref<any[]>([]); -const showTip = computed( - () => props.isShowTip && (props.fileType || props.fileSize) -); +const showTip = computed(() => props.isShowTip && (props.fileType || props.fileSize)); const fileUploadRef = ref<ElUploadInstance>(); -watch(() => props.modelValue, async val => { +watch( + () => props.modelValue, + async (val) => { if (val) { - let temp = 1; - // 棣栧厛灏嗗�艰浆涓烘暟缁� - let list = []; - if (Array.isArray(val)) { - list = val; - } else { - const res = await listByIds(val as string) - list = res.data.map((oss) => { - const data = { name: oss.originalName, url: oss.url, ossId: oss.ossId }; - return data; - }); - } - // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁� - fileList.value = list.map(item => { - item = { name: item.name, url: item.url, ossId: item.ossId }; - item.uid = item.uid || new Date().getTime() + temp++; - return item; + let temp = 1; + // 棣栧厛灏嗗�艰浆涓烘暟缁� + let list = []; + if (Array.isArray(val)) { + list = val; + } else { + const res = await listByIds(val as string); + list = res.data.map((oss) => { + const data = { + name: oss.originalName, + url: oss.url, + ossId: oss.ossId + }; + return data; }); + } + // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁� + fileList.value = list.map((item) => { + item = { name: item.name, url: item.url, ossId: item.ossId }; + item.uid = item.uid || new Date().getTime() + temp++; + return item; + }); } else { - fileList.value = []; - return []; + fileList.value = []; + return []; } -}, { deep: true, immediate: true }); + }, + { deep: true, immediate: true } +); // 涓婁紶鍓嶆牎妫�鏍煎紡鍜屽ぇ灏� const handleBeforeUpload = (file: any) => { - // 鏍℃鏂囦欢绫诲瀷 - if (props.fileType.length) { - const fileName = file.name.split('.'); - const fileExt = fileName[fileName.length - 1]; - const isTypeOk = props.fileType.indexOf(fileExt) >= 0; - if (!isTypeOk) { - proxy?.$modal.msgError(`鏂囦欢鏍煎紡涓嶆纭�, 璇蜂笂浼�${props.fileType.join("/")}鏍煎紡鏂囦欢!`); - return false; - } + // 鏍℃鏂囦欢绫诲瀷 + if (props.fileType.length) { + const fileName = file.name.split('.'); + const fileExt = fileName[fileName.length - 1]; + const isTypeOk = props.fileType.indexOf(fileExt) >= 0; + if (!isTypeOk) { + proxy?.$modal.msgError(`鏂囦欢鏍煎紡涓嶆纭�, 璇蜂笂浼�${props.fileType.join('/')}鏍煎紡鏂囦欢!`); + return false; } - // 鏍℃鏂囦欢澶у皬 - if (props.fileSize) { - const isLt = file.size / 1024 / 1024 < props.fileSize; - if (!isLt) { - proxy?.$modal.msgError(`涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`); - return false; - } + } + // 鏍℃鏂囦欢澶у皬 + if (props.fileSize) { + const isLt = file.size / 1024 / 1024 < props.fileSize; + if (!isLt) { + proxy?.$modal.msgError(`涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`); + return false; } - proxy?.$modal.loading("姝e湪涓婁紶鏂囦欢锛岃绋嶅��..."); - number.value++; - return true; -} + } + proxy?.$modal.loading('姝e湪涓婁紶鏂囦欢锛岃绋嶅��...'); + number.value++; + return true; +}; // 鏂囦欢涓暟瓒呭嚭 const handleExceed = () => { - proxy?.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`); -} + proxy?.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`); +}; // 涓婁紶澶辫触 const handleUploadError = () => { - proxy?.$modal.msgError("涓婁紶鏂囦欢澶辫触"); -} + proxy?.$modal.msgError('涓婁紶鏂囦欢澶辫触'); +}; // 涓婁紶鎴愬姛鍥炶皟 const handleUploadSuccess = (res: any, file: UploadFile) => { - if (res.code === 200) { - uploadList.value.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId }); - uploadedSuccessfully(); - } else { - number.value--; - proxy?.$modal.closeLoading(); - proxy?.$modal.msgError(res.msg); - fileUploadRef.value?.handleRemove(file); - uploadedSuccessfully(); - } -} + if (res.code === 200) { + uploadList.value.push({ + name: res.data.fileName, + url: res.data.url, + ossId: res.data.ossId + }); + uploadedSuccessfully(); + } else { + number.value--; + proxy?.$modal.closeLoading(); + proxy?.$modal.msgError(res.msg); + fileUploadRef.value?.handleRemove(file); + uploadedSuccessfully(); + } +}; // 鍒犻櫎鏂囦欢 const handleDelete = (index: number) => { - let ossId = fileList.value[index].ossId; - delOss(ossId); - fileList.value.splice(index, 1); - emit("update:modelValue", listToString(fileList.value)); -} + let ossId = fileList.value[index].ossId; + delOss(ossId); + fileList.value.splice(index, 1); + emit('update:modelValue', listToString(fileList.value)); +}; // 涓婁紶缁撴潫澶勭悊 const uploadedSuccessfully = () => { - if (number.value > 0 && uploadList.value.length === number.value) { - fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value); - uploadList.value = []; - number.value = 0; - emit("update:modelValue", listToString(fileList.value)); - proxy?.$modal.closeLoading(); - } -} + if (number.value > 0 && uploadList.value.length === number.value) { + fileList.value = fileList.value.filter((f) => f.url !== undefined).concat(uploadList.value); + uploadList.value = []; + number.value = 0; + emit('update:modelValue', listToString(fileList.value)); + proxy?.$modal.closeLoading(); + } +}; // 鑾峰彇鏂囦欢鍚嶇О const getFileName = (name: string) => { - // 濡傛灉鏄痷rl閭d箞鍙栨渶鍚庣殑鍚嶅瓧 濡傛灉涓嶆槸鐩存帴杩斿洖 - if (name.lastIndexOf("/") > -1) { - return name.slice(name.lastIndexOf("/") + 1); - } else { - return name; - } -} + // 濡傛灉鏄痷rl閭d箞鍙栨渶鍚庣殑鍚嶅瓧 濡傛灉涓嶆槸鐩存帴杩斿洖 + if (name.lastIndexOf('/') > -1) { + return name.slice(name.lastIndexOf('/') + 1); + } else { + return name; + } +}; // 瀵硅薄杞垚鎸囧畾瀛楃涓插垎闅� const listToString = (list: any[], separator?: string) => { - let strs = ""; - separator = separator || ","; - list.forEach(item => { - if (item.ossId) { - strs += item.ossId + separator; - } - }) - return strs != "" ? strs.substring(0, strs.length - 1) : ""; -} + let strs = ''; + separator = separator || ','; + list.forEach((item) => { + if (item.ossId) { + strs += item.ossId + separator; + } + }); + return strs != '' ? strs.substring(0, strs.length - 1) : ''; +}; </script> <style scoped lang="scss"> .upload-file-uploader { - margin-bottom: 5px; + margin-bottom: 5px; } .upload-file-list .el-upload-list__item { - border: 1px solid #e4e7ed; - line-height: 2; - margin-bottom: 10px; - position: relative; + border: 1px solid #e4e7ed; + line-height: 2; + margin-bottom: 10px; + position: relative; } .upload-file-list .ele-upload-list__item-content { - display: flex; - justify-content: space-between; - align-items: center; - color: inherit; + display: flex; + justify-content: space-between; + align-items: center; + color: inherit; } .ele-upload-list__item-content-action .el-link { - margin-right: 10px; + margin-right: 10px; } </style> diff --git a/src/components/Hamburger/index.vue b/src/components/Hamburger/index.vue index 489ac43..f9f5e62 100644 --- a/src/components/Hamburger/index.vue +++ b/src/components/Hamburger/index.vue @@ -1,5 +1,5 @@ <template> - <div style="padding: 0 15px;" @click="toggleClick"> + <div style="padding: 0 15px" @click="toggleClick"> <svg :class="{ 'is-active': isActive }" class="hamburger" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64"> <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z" @@ -13,12 +13,12 @@ defineProps({ isActive: propTypes.bool.def(false) -}) +}); -const emit = defineEmits(['toggleClick']) +const emit = defineEmits(['toggleClick']); const toggleClick = () => { emit('toggleClick'); -} +}; </script> <style scoped> diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue index b922c6c..f6143d0 100644 --- a/src/components/HeaderSearch/index.vue +++ b/src/components/HeaderSearch/index.vue @@ -1,6 +1,6 @@ <template> - <div :class="{ 'show': show }" class="header-search"> - <svg-icon class-name="search-icon" icon-class="search" @click.stop="click"/> + <div :class="{ show: show }" class="header-search"> + <svg-icon class-name="search-icon" icon-class="search" @click.stop="click" /> <el-select ref="headerSearchSelectRef" v-model="search" @@ -12,23 +12,22 @@ class="header-search-select" @change="change" > - <el-option v-for="option in options" :key="option.item.path" :value="option.item" - :label="option.item.title.join(' > ')"/> + <el-option v-for="option in options" :key="option.item.path" :value="option.item" :label="option.item.title.join(' > ')" /> </el-select> </div> </template> <script setup lang="ts" name="HeaderSearch"> import Fuse from 'fuse.js'; -import {getNormalPath} from '@/utils/ruoyi'; -import {isHttp} from '@/utils/validate'; +import { getNormalPath } from '@/utils/ruoyi'; +import { isHttp } from '@/utils/validate'; import usePermissionStore from '@/store/modules/permission'; -import {RouteOption} from 'vue-router'; +import { RouteRecordRaw } from 'vue-router'; type Router = Array<{ path: string; title: string[]; -}> +}>; const search = ref(''); const options = ref<any>([]); @@ -40,36 +39,36 @@ const routes = computed(() => usePermissionStore().routes); const click = () => { - show.value = !show.value + show.value = !show.value; if (show.value) { - headerSearchSelectRef.value && headerSearchSelectRef.value.focus() + headerSearchSelectRef.value && headerSearchSelectRef.value.focus(); } }; const close = () => { - headerSearchSelectRef.value && headerSearchSelectRef.value.blur() - options.value = [] - show.value = false -} + headerSearchSelectRef.value && headerSearchSelectRef.value.blur(); + options.value = []; + show.value = false; +}; const change = (val: any) => { const path = val.path; const query = val.query; if (isHttp(path)) { // http(s):// 璺緞鏂扮獥鍙f墦寮� - const pindex = path.indexOf("http"); - window.open(path.substr(pindex, path.length), "_blank"); + const pindex = path.indexOf('http'); + window.open(path.substr(pindex, path.length), '_blank'); } else { if (query) { router.push({ path: path, query: JSON.parse(query) }); } else { - router.push(path) + router.push(path); } } - search.value = '' - options.value = [] + search.value = ''; + options.value = []; nextTick(() => { - show.value = false - }) -} + show.value = false; + }); +}; const initFuse = (list: Router) => { fuse.value = new Fuse(list, { shouldSort: true, @@ -77,20 +76,23 @@ location: 0, distance: 100, minMatchCharLength: 1, - keys: [{ - name: 'title', - weight: 0.7 - }, { - name: 'path', - weight: 0.3 - }] - }) -} + keys: [ + { + name: 'title', + weight: 0.7 + }, + { + name: 'path', + weight: 0.3 + } + ] + }); +}; // Filter out the routes that can be displayed in the sidebar // And generate the internationalized title -const generateRoutes = (routes: RouteOption[], basePath = '', prefixTitle: string[] = []) => { - let res: Router = [] - routes.forEach(r => { +const generateRoutes = (routes: RouteRecordRaw[], basePath = '', prefixTitle: string[] = []) => { + let res: Router = []; + routes.forEach((r) => { // skip hidden router if (!r.hidden) { const p = r.path.length > 0 && r.path[0] === '/' ? r.path : '/' + r.path; @@ -98,7 +100,7 @@ path: !isHttp(r.path) ? getNormalPath(basePath + p) : r.path, title: [...prefixTitle], query: '' - } + }; if (r.meta && r.meta.title) { data.title = [...data.title, r.meta.title]; if (r.redirect !== 'noRedirect') { @@ -109,7 +111,7 @@ } if (r.query) { - data.query = r.query + data.query = r.query; } // recursive child routes @@ -120,20 +122,20 @@ } } } - }) + }); return res; -} +}; const querySearch = (query: string) => { if (query !== '') { - options.value = fuse.value.search(query) + options.value = fuse.value.search(query); } else { - options.value = [] + options.value = []; } -} +}; onMounted(() => { searchPool.value = generateRoutes(routes.value); -}) +}); // watchEffect(() => { // searchPool.value = generateRoutes(routes.value) @@ -141,15 +143,15 @@ watch(show, (value) => { if (value) { - document.body.addEventListener('click', close) + document.body.addEventListener('click', close); } else { - document.body.removeEventListener('click', close) + document.body.removeEventListener('click', close); } -}) +}); watch(searchPool, (list) => { - initFuse(list) -}) + initFuse(list); +}); </script> <style lang="scss" scoped> diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue index 1cd0023..7e392e7 100644 --- a/src/components/IconSelect/index.vue +++ b/src/components/IconSelect/index.vue @@ -1,6 +1,6 @@ <template> <div class="relative" :style="{ width: width }"> - <el-input v-model="modelValue" readonly @click="visible = !visible" placeholder="鐐瑰嚮閫夋嫨鍥炬爣"> + <el-input v-model="modelValue" readonly placeholder="鐐瑰嚮閫夋嫨鍥炬爣" @click="visible = !visible"> <template #prepend> <svg-icon :icon-class="modelValue" /> </template> @@ -8,18 +8,18 @@ <el-popover shadow="none" :visible="visible" placement="bottom-end" trigger="click" :width="450"> <template #reference> - <div @click="visible = !visible" class="cursor-pointer text-[#999] absolute right-[10px] top-0 height-[32px] leading-[32px]"> + <div class="cursor-pointer text-[#999] absolute right-[10px] top-0 height-[32px] leading-[32px]" @click="visible = !visible"> <i-ep-caret-top v-show="visible"></i-ep-caret-top> <i-ep-caret-bottom v-show="!visible"></i-ep-caret-bottom> </div> </template> - <el-input class="p-2" v-model="filterValue" placeholder="鎼滅储鍥炬爣" clearable @input="filterIcons" /> + <el-input v-model="filterValue" class="p-2" placeholder="鎼滅储鍥炬爣" clearable @input="filterIcons" /> <el-scrollbar height="w-[200px]"> <ul class="icon-list"> <el-tooltip v-for="(iconName, index) in iconNames" :key="index" :content="iconName" placement="bottom" effect="light"> - <li :class="['icon-item', {active: modelValue == iconName}]" @click="selectedIcon(iconName)"> + <li :class="['icon-item', { active: modelValue == iconName }]" @click="selectedIcon(iconName)"> <svg-icon color="var(--el-text-color-regular)" :icon-class="iconName" /> </li> </el-tooltip> @@ -50,13 +50,11 @@ */ const filterIcons = () => { if (filterValue.value) { - iconNames.value = icons.filter(iconName => - iconName.includes(filterValue.value) - ); + iconNames.value = icons.filter((iconName) => iconName.includes(filterValue.value)); } else { iconNames.value = icons; } -} +}; /** * 閫夋嫨鍥炬爣 * @param iconName 閫夋嫨鐨勫浘鏍囧悕绉� @@ -64,12 +62,12 @@ const selectedIcon = (iconName: string) => { emit('update:modelValue', iconName); visible.value = false; -} +}; </script> <style scoped lang="scss"> .el-scrollbar { - max-height: calc(50vh - 100px)!important; + max-height: calc(50vh - 100px) !important; overflow-y: auto; } .el-divider--horizontal { @@ -99,8 +97,8 @@ } } .active { - border-color: var(--el-color-primary); - color: var(--el-color-primary); - } + border-color: var(--el-color-primary); + color: var(--el-color-primary); + } } </style> diff --git a/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue index 723ccdb..349c443 100644 --- a/src/components/ImagePreview/index.vue +++ b/src/components/ImagePreview/index.vue @@ -15,11 +15,11 @@ src: propTypes.string.def(''), width: { type: [Number, String], - default: "" + default: '' }, height: { type: [Number, String], - default: "" + default: '' } }); @@ -27,7 +27,7 @@ if (!props.src) { return; } - let real_src = props.src.split(",")[0]; + let real_src = props.src.split(',')[0]; return real_src; }); @@ -35,21 +35,17 @@ if (!props.src) { return; } - let real_src_list = props.src.split(","); + let real_src_list = props.src.split(','); let srcList: string[] = []; - real_src_list.forEach(item => { + real_src_list.forEach((item) => { return srcList.push(item); }); return srcList; }); -const realWidth = computed(() => - typeof props.width == "string" ? props.width : `${props.width}px` -); +const realWidth = computed(() => (typeof props.width == 'string' ? props.width : `${props.width}px`)); -const realHeight = computed(() => - typeof props.height == "string" ? props.height : `${props.height}px` -); +const realHeight = computed(() => (typeof props.height == 'string' ? props.height : `${props.height}px`)); </script> <style lang="scss" scoped> diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue index d8ed32b..47945dd 100644 --- a/src/components/ImageUpload/index.vue +++ b/src/components/ImageUpload/index.vue @@ -1,6 +1,7 @@ <template> <div class="component-upload-image"> <el-upload + ref="imageUpload" multiple :action="uploadImgUrl" list-type="picture-card" @@ -9,7 +10,6 @@ :limit="limit" :on-error="handleUploadError" :on-exceed="handleExceed" - ref="imageUpload" :before-remove="handleDelete" :show-file-list="true" :headers="headers" @@ -22,13 +22,13 @@ </el-icon> </el-upload> <!-- 涓婁紶鎻愮ず --> - <div class="el-upload__tip" v-if="showTip"> + <div v-if="showTip" class="el-upload__tip"> 璇蜂笂浼� <template v-if="fileSize"> 澶у皬涓嶈秴杩� <b style="color: #f56c6c">{{ fileSize }}MB</b> </template> <template v-if="fileType"> - 鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join("/") }}</b> + 鏍煎紡涓� <b style="color: #f56c6c">{{ fileType.join('/') }}</b> </template> 鐨勬枃浠� </div> @@ -40,177 +40,176 @@ </template> <script setup lang="ts"> -import { listByIds, delOss } from "@/api/system/oss"; -import { ComponentInternalInstance } from "vue"; -import { OssVO } from "@/api/system/oss/types"; +import { listByIds, delOss } from '@/api/system/oss'; +import { OssVO } from '@/api/system/oss/types'; import { propTypes } from '@/utils/propTypes'; -import {globalHeaders} from "@/utils/request"; +import { globalHeaders } from '@/utils/request'; const props = defineProps({ - modelValue: [String, Object, Array], - // 鍥剧墖鏁伴噺闄愬埗 - limit: propTypes.number.def(5), - // 澶у皬闄愬埗(MB) - fileSize: propTypes.number.def(5), - // 鏂囦欢绫诲瀷, 渚嬪['png', 'jpg', 'jpeg'] - fileType: propTypes.array.def(["png", "jpg", "jpeg"]), - // 鏄惁鏄剧ず鎻愮ず - isShowTip: { - type: Boolean, - default: true - }, + modelValue: [String, Object, Array], + // 鍥剧墖鏁伴噺闄愬埗 + limit: propTypes.number.def(5), + // 澶у皬闄愬埗(MB) + fileSize: propTypes.number.def(5), + // 鏂囦欢绫诲瀷, 渚嬪['png', 'jpg', 'jpeg'] + fileType: propTypes.array.def(['png', 'jpg', 'jpeg']), + // 鏄惁鏄剧ず鎻愮ず + isShowTip: { + type: Boolean, + default: true + } }); const { proxy } = getCurrentInstance() as ComponentInternalInstance; const emit = defineEmits(['update:modelValue']); const number = ref(0); const uploadList = ref<any[]>([]); -const dialogImageUrl = ref(""); +const dialogImageUrl = ref(''); const dialogVisible = ref(false); const baseUrl = import.meta.env.VITE_APP_BASE_API; -const uploadImgUrl = ref(baseUrl + "/resource/oss/upload"); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃 +const uploadImgUrl = ref(baseUrl + '/resource/oss/upload'); // 涓婁紶鐨勫浘鐗囨湇鍔″櫒鍦板潃 const headers = ref(globalHeaders()); const fileList = ref<any[]>([]); -const showTip = computed( - () => props.isShowTip && (props.fileType || props.fileSize) -); +const showTip = computed(() => props.isShowTip && (props.fileType || props.fileSize)); const imageUploadRef = ref<ElUploadInstance>(); -watch(() => props.modelValue, async val => { +watch( + () => props.modelValue, + async (val) => { if (val) { - // 棣栧厛灏嗗�艰浆涓烘暟缁� - let list: OssVO[] = []; - if (Array.isArray(val)) { - list = val as OssVO[]; + // 棣栧厛灏嗗�艰浆涓烘暟缁� + let list: OssVO[] = []; + if (Array.isArray(val)) { + list = val as OssVO[]; + } else { + const res = await listByIds(val as string); + list = res.data; + } + // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁� + fileList.value = list.map((item) => { + // 瀛楃涓插洖鏄惧鐞� 濡傛灉姝ゅ瀛樼殑鏄痷rl鍙洿鎺ュ洖鏄� 濡傛灉瀛樼殑鏄痠d闇�瑕佽皟鐢ㄦ帴鍙f煡鍑烘潵 + let itemData; + if (typeof item === 'string') { + itemData = { name: item, url: item }; } else { - const res = await listByIds(val as string) - list = res.data + // 姝ゅname浣跨敤ossId 闃叉鍒犻櫎鍑虹幇閲嶅悕 + itemData = { name: item.ossId, url: item.url, ossId: item.ossId }; } - // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁� - fileList.value = list.map(item => { - // 瀛楃涓插洖鏄惧鐞� 濡傛灉姝ゅ瀛樼殑鏄痷rl鍙洿鎺ュ洖鏄� 濡傛灉瀛樼殑鏄痠d闇�瑕佽皟鐢ㄦ帴鍙f煡鍑烘潵 - let itemData; - if (typeof item === "string") { - itemData = { name: item, url: item }; - } else { - // 姝ゅname浣跨敤ossId 闃叉鍒犻櫎鍑虹幇閲嶅悕 - itemData = { name: item.ossId, url: item.url, ossId: item.ossId }; - } - return itemData; - }); + return itemData; + }); } else { - fileList.value = []; - return []; + fileList.value = []; + return []; } -}, { deep: true, immediate: true }); + }, + { deep: true, immediate: true } +); /** 涓婁紶鍓峫oading鍔犺浇 */ const handleBeforeUpload = (file: any) => { - let isImg = false; - if (props.fileType.length) { - let fileExtension = ""; - if (file.name.lastIndexOf(".") > -1) { - fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1); - } - isImg = props.fileType.some((type: any) => { - if (file.type.indexOf(type) > -1) return true; - if (fileExtension && fileExtension.indexOf(type) > -1) return true; - return false; - }); - } else { - isImg = file.type.indexOf("image") > -1; + let isImg = false; + if (props.fileType.length) { + let fileExtension = ''; + if (file.name.lastIndexOf('.') > -1) { + fileExtension = file.name.slice(file.name.lastIndexOf('.') + 1); } - if (!isImg) { - proxy?.$modal.msgError( - `鏂囦欢鏍煎紡涓嶆纭�, 璇蜂笂浼�${props.fileType.join("/")}鍥剧墖鏍煎紡鏂囦欢!` - ); - return false; + isImg = props.fileType.some((type: any) => { + if (file.type.indexOf(type) > -1) return true; + if (fileExtension && fileExtension.indexOf(type) > -1) return true; + return false; + }); + } else { + isImg = file.type.indexOf('image') > -1; + } + if (!isImg) { + proxy?.$modal.msgError(`鏂囦欢鏍煎紡涓嶆纭�, 璇蜂笂浼�${props.fileType.join('/')}鍥剧墖鏍煎紡鏂囦欢!`); + return false; + } + if (props.fileSize) { + const isLt = file.size / 1024 / 1024 < props.fileSize; + if (!isLt) { + proxy?.$modal.msgError(`涓婁紶澶村儚鍥剧墖澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`); + return false; } - if (props.fileSize) { - const isLt = file.size / 1024 / 1024 < props.fileSize; - if (!isLt) { - proxy?.$modal.msgError(`涓婁紶澶村儚鍥剧墖澶у皬涓嶈兘瓒呰繃 ${props.fileSize} MB!`); - return false; - } - } - proxy?.$modal.loading("姝e湪涓婁紶鍥剧墖锛岃绋嶅��..."); - number.value++; -} + } + proxy?.$modal.loading('姝e湪涓婁紶鍥剧墖锛岃绋嶅��...'); + number.value++; +}; // 鏂囦欢涓暟瓒呭嚭 const handleExceed = () => { - proxy?.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`); -} + proxy?.$modal.msgError(`涓婁紶鏂囦欢鏁伴噺涓嶈兘瓒呰繃 ${props.limit} 涓�!`); +}; // 涓婁紶鎴愬姛鍥炶皟 const handleUploadSuccess = (res: any, file: UploadFile) => { - if (res.code === 200) { - uploadList.value.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId }); - uploadedSuccessfully(); - } else { - number.value--; - proxy?.$modal.closeLoading(); - proxy?.$modal.msgError(res.msg); - imageUploadRef.value?.handleRemove(file); - uploadedSuccessfully(); - } -} + if (res.code === 200) { + uploadList.value.push({ name: res.data.fileName, url: res.data.url, ossId: res.data.ossId }); + uploadedSuccessfully(); + } else { + number.value--; + proxy?.$modal.closeLoading(); + proxy?.$modal.msgError(res.msg); + imageUploadRef.value?.handleRemove(file); + uploadedSuccessfully(); + } +}; // 鍒犻櫎鍥剧墖 const handleDelete = (file: UploadFile): boolean => { - const findex = fileList.value.map(f => f.name).indexOf(file.name); - if (findex > -1 && uploadList.value.length === number.value) { - let ossId = fileList.value[findex].ossId; - delOss(ossId); - fileList.value.splice(findex, 1); - emit("update:modelValue", listToString(fileList.value)); - return false; - } - return true; -} + const findex = fileList.value.map((f) => f.name).indexOf(file.name); + if (findex > -1 && uploadList.value.length === number.value) { + let ossId = fileList.value[findex].ossId; + delOss(ossId); + fileList.value.splice(findex, 1); + emit('update:modelValue', listToString(fileList.value)); + return false; + } + return true; +}; // 涓婁紶缁撴潫澶勭悊 const uploadedSuccessfully = () => { - if (number.value > 0 && uploadList.value.length === number.value) { - fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value); - uploadList.value = []; - number.value = 0; - emit("update:modelValue", listToString(fileList.value)); - proxy?.$modal.closeLoading(); - } -} + if (number.value > 0 && uploadList.value.length === number.value) { + fileList.value = fileList.value.filter((f) => f.url !== undefined).concat(uploadList.value); + uploadList.value = []; + number.value = 0; + emit('update:modelValue', listToString(fileList.value)); + proxy?.$modal.closeLoading(); + } +}; // 涓婁紶澶辫触 const handleUploadError = () => { - proxy?.$modal.msgError("涓婁紶鍥剧墖澶辫触"); - proxy?.$modal.closeLoading(); -} + proxy?.$modal.msgError('涓婁紶鍥剧墖澶辫触'); + proxy?.$modal.closeLoading(); +}; // 棰勮 const handlePictureCardPreview = (file: any) => { - dialogImageUrl.value = file.url; - dialogVisible.value = true; -} + dialogImageUrl.value = file.url; + dialogVisible.value = true; +}; // 瀵硅薄杞垚鎸囧畾瀛楃涓插垎闅� const listToString = (list: any[], separator?: string) => { - let strs = ""; - separator = separator || ","; - for (let i in list) { - if (undefined !== list[i].ossId && list[i].url.indexOf("blob:") !== 0) { - strs += list[i].ossId + separator; - } + let strs = ''; + separator = separator || ','; + for (let i in list) { + if (undefined !== list[i].ossId && list[i].url.indexOf('blob:') !== 0) { + strs += list[i].ossId + separator; } - return strs != "" ? strs.substring(0, strs.length - 1) : ""; -} + } + return strs != '' ? strs.substring(0, strs.length - 1) : ''; +}; </script> <style scoped lang="scss"> // .el-upload--picture-card 鎺у埗鍔犲彿閮ㄥ垎 :deep(.hide .el-upload--picture-card) { - display: none; + display: none; } </style> diff --git a/src/components/LangSelect/index.vue b/src/components/LangSelect/index.vue index a30a2f6..f5ae8e8 100644 --- a/src/components/LangSelect/index.vue +++ b/src/components/LangSelect/index.vue @@ -20,16 +20,15 @@ const appStore = useAppStore(); const { locale } = useI18n(); - const message: any = { zh_CN: '鍒囨崲璇█鎴愬姛锛�', - en_US: 'Switch Language Successful!', -} + en_US: 'Switch Language Successful!' +}; const handleLanguageChange = (lang: string) => { locale.value = lang; appStore.changeLanguage(lang); ElMessage.success(message[lang] || '鍒囨崲璇█鎴愬姛锛�'); -} +}; </script> <style lang="scss" scoped> diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue index df73ceb..ac02193 100644 --- a/src/components/Pagination/index.vue +++ b/src/components/Pagination/index.vue @@ -1,9 +1,9 @@ <template> - <div :class="{ 'hidden': hidden }" class="pagination-container"> + <div :class="{ hidden: hidden }" class="pagination-container"> <el-pagination - :background="background" v-model:current-page="currentPage" v-model:page-size="pageSize" + :background="background" :layout="layout" :page-sizes="pageSizes" :pager-count="pagerCount" @@ -16,69 +16,69 @@ <script lang="ts"> export default { - name: 'Pagination' -} + name: 'Pagination' +}; </script> <script setup lang="ts"> -import { scrollTo } from '@/utils/scroll-to' -import { propTypes } from "@/utils/propTypes"; +import { scrollTo } from '@/utils/scroll-to'; +import { propTypes } from '@/utils/propTypes'; const props = defineProps({ - total: propTypes.number, - page: propTypes.number.def(1), - limit: propTypes.number.def(20), - pageSizes: { - type: Array as PropType<number[]>, - default: () => [10, 20, 30, 50] - }, - // 绉诲姩绔〉鐮佹寜閽殑鏁伴噺绔粯璁ゅ��5 - pagerCount: propTypes.number.def(document.body.clientWidth < 992 ? 5 : 7), - layout: propTypes.string.def('total, sizes, prev, pager, next, jumper'), - background: propTypes.bool.def(true), - autoScroll: propTypes.bool.def(true), - hidden: propTypes.bool.def(false), - float: propTypes.string.def('right') -}) + total: propTypes.number, + page: propTypes.number.def(1), + limit: propTypes.number.def(20), + pageSizes: { + type: Array, + default: () => [10, 20, 30, 50] + }, + // 绉诲姩绔〉鐮佹寜閽殑鏁伴噺绔粯璁ゅ��5 + pagerCount: propTypes.number.def(document.body.clientWidth < 992 ? 5 : 7), + layout: propTypes.string.def('total, sizes, prev, pager, next, jumper'), + background: propTypes.bool.def(true), + autoScroll: propTypes.bool.def(true), + hidden: propTypes.bool.def(false), + float: propTypes.string.def('right') +}); const emit = defineEmits(['update:page', 'update:limit', 'pagination']); const currentPage = computed({ - get() { - return props.page - }, - set(val) { - emit('update:page', val) - } -}) + get() { + return props.page; + }, + set(val) { + emit('update:page', val); + } +}); const pageSize = computed({ - get() { - return props.limit - }, - set(val){ - emit('update:limit', val) - } -}) + get() { + return props.limit; + }, + set(val) { + emit('update:limit', val); + } +}); function handleSizeChange(val: number) { - if (currentPage.value * val > props.total) { - currentPage.value = 1 - } - emit('pagination', { page: currentPage.value, limit: val }) - if (props.autoScroll) { - scrollTo(0, 800) - } + if (currentPage.value * val > props.total) { + currentPage.value = 1; + } + emit('pagination', { page: currentPage.value, limit: val }); + if (props.autoScroll) { + scrollTo(0, 800); + } } function handleCurrentChange(val: number) { - emit('pagination', { page: val, limit: pageSize.value }) - if (props.autoScroll) { - scrollTo(0, 800) - } + emit('pagination', { page: val, limit: pageSize.value }); + if (props.autoScroll) { + scrollTo(0, 800); + } } </script> <style lang="scss" scoped> .pagination-container { padding: 32px 16px; - .el-pagination{ + .el-pagination { float: v-bind(float); } } diff --git a/src/components/RightToolbar/index.vue b/src/components/RightToolbar/index.vue index 6be382f..e8c9d65 100644 --- a/src/components/RightToolbar/index.vue +++ b/src/components/RightToolbar/index.vue @@ -1,13 +1,13 @@ <template> <div class="top-right-btn" :style="style"> <el-row> - <el-tooltip class="item" effect="dark" :content="showSearch ? '闅愯棌鎼滅储' : '鏄剧ず鎼滅储'" placement="top" v-if="search"> + <el-tooltip v-if="search" class="item" effect="dark" :content="showSearch ? '闅愯棌鎼滅储' : '鏄剧ず鎼滅储'" placement="top"> <el-button circle icon="Search" @click="toggleSearch()" /> </el-tooltip> <el-tooltip class="item" effect="dark" content="鍒锋柊" placement="top"> <el-button circle icon="Refresh" @click="refresh()" /> </el-tooltip> - <el-tooltip class="item" effect="dark" content="鏄剧ず/闅愯棌鍒�" placement="top" v-if="columns"> + <el-tooltip v-if="columns" class="item" effect="dark" content="鏄剧ず/闅愯棌鍒�" placement="top"> <div class="show-btn"> <el-popover placement="bottom" trigger="click"> <div class="tree-header">鏄剧ず/闅愯棌鍒�</div> @@ -15,9 +15,9 @@ ref="columnRef" :data="columns" show-checkbox - @check="columnChange" node-key="key" :props="{ label: 'label', children: 'children' }" + @check="columnChange" ></el-tree> <template #reference> <el-button circle icon="Menu" /> @@ -33,51 +33,49 @@ import { propTypes } from '@/utils/propTypes'; const props = defineProps({ - showSearch: propTypes.bool.def(true), - columns: { - type: Array as PropType<FieldOption[]>, - }, - search: propTypes.bool.def(true), - gutter: propTypes.number.def(10), -}) + showSearch: propTypes.bool.def(true), + columns: propTypes.fieldOption, + search: propTypes.bool.def(true), + gutter: propTypes.number.def(10) +}); const columnRef = ref<ElTreeInstance>(); const emits = defineEmits(['update:showSearch', 'queryTable']); const style = computed(() => { - const ret: any = {}; - if (props.gutter) { - ret.marginRight = `${props.gutter / 2}px`; - } - return ret; + const ret: any = {}; + if (props.gutter) { + ret.marginRight = `${props.gutter / 2}px`; + } + return ret; }); // 鎼滅储 function toggleSearch() { - emits("update:showSearch", !props.showSearch); + emits('update:showSearch', !props.showSearch); } // 鍒锋柊 function refresh() { - emits("queryTable"); + emits('queryTable'); } // 鏇存敼鏁版嵁鍒楃殑鏄剧ず鍜岄殣钘� function columnChange(...args: any[]) { props.columns?.forEach((item) => { item.visible = args[1].checkedKeys.includes(item.key); - }) + }); } // 鏄鹃殣鍒楀垵濮嬮粯璁ら殣钘忓垪 onMounted(() => { - props.columns?.forEach((item) => { - if (item.visible) { - columnRef.value?.setChecked(item.key, true, false); - // value.value.push(item.key); - } - }) -}) + props.columns?.forEach((item) => { + if (item.visible) { + columnRef.value?.setChecked(item.key, true, false); + // value.value.push(item.key); + } + }); +}); </script> <style lang="scss" scoped> @@ -93,7 +91,7 @@ .my-el-transfer { text-align: center; } -.tree-header{ +.tree-header { width: 100%; line-height: 24px; text-align: center; diff --git a/src/components/RuoYiDoc/index.vue b/src/components/RuoYiDoc/index.vue index 6c7ac0d..1e27d89 100644 --- a/src/components/RuoYiDoc/index.vue +++ b/src/components/RuoYiDoc/index.vue @@ -8,6 +8,6 @@ const url = ref('https://plus-doc.dromara.org/'); function goto() { - window.open(url.value) + window.open(url.value); } </script> diff --git a/src/components/RuoYiGit/index.vue b/src/components/RuoYiGit/index.vue index 82393eb..ad27808 100644 --- a/src/components/RuoYiGit/index.vue +++ b/src/components/RuoYiGit/index.vue @@ -8,6 +8,6 @@ const url = ref('https://gitee.com/dromara/RuoYi-Vue-Plus'); function goto() { - window.open(url.value) + window.open(url.value); } </script> diff --git a/src/components/SizeSelect/index.vue b/src/components/SizeSelect/index.vue index 058ff71..86671f5 100644 --- a/src/components/SizeSelect/index.vue +++ b/src/components/SizeSelect/index.vue @@ -16,20 +16,20 @@ </template> <script setup lang="ts"> -import useAppStore from "@/store/modules/app"; +import useAppStore from '@/store/modules/app'; const appStore = useAppStore(); const size = computed(() => appStore.size); const sizeOptions = ref([ - { label: "杈冨ぇ", value: "large" }, - { label: "榛樿", value: "default" }, - { label: "绋嶅皬", value: "small" }, + { label: '杈冨ぇ', value: 'large' }, + { label: '榛樿', value: 'default' }, + { label: '绋嶅皬', value: 'small' } ]); const handleSetSize = (size: string) => { - appStore.setSize(size); -} + appStore.setSize(size); +}; </script> <style lang="scss" scoped> diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue index 3a7540f..05dfe87 100644 --- a/src/components/SvgIcon/index.vue +++ b/src/components/SvgIcon/index.vue @@ -8,17 +8,17 @@ import { propTypes } from '@/utils/propTypes'; const props = defineProps({ - iconClass: propTypes.string.isRequired, - className: propTypes.string.def(''), - color: propTypes.string.def(''), -}) -const iconName = computed(() => `#icon-${props.iconClass}`); + iconClass: propTypes.string.isRequired, + className: propTypes.string.def(''), + color: propTypes.string.def('') +}); +const iconName = computed(() => `#icon-${props.iconClass}`); const svgClass = computed(() => { - if (props.className) { - return `svg-icon ${props.className}` - } - return 'svg-icon' -}) + if (props.className) { + return `svg-icon ${props.className}`; + } + return 'svg-icon'; +}); </script> <style scope lang="scss"> diff --git a/src/components/TopNav/index.vue b/src/components/TopNav/index.vue index 227fccc..6b416d4 100644 --- a/src/components/TopNav/index.vue +++ b/src/components/TopNav/index.vue @@ -1,19 +1,18 @@ <template> - <el-menu :default-active="activeMenu" mode="horizontal" @select="handleSelect" :ellipsis="false"> + <el-menu :default-active="activeMenu" mode="horizontal" :ellipsis="false" @select="handleSelect"> <template v-for="(item, index) in topMenus"> - <el-menu-item :style="{'--theme': theme}" :index="item.path" :key="index" v-if="index < visibleNumber" - ><svg-icon - v-if="item.meta && item.meta.icon && item.meta.icon !== '#'" - :icon-class="item.meta ? item.meta.icon : '' " /> {{ item.meta?.title }}</el-menu-item + <el-menu-item v-if="index < visibleNumber" :key="index" :style="{ '--theme': theme }" :index="item.path" + ><svg-icon v-if="item.meta && item.meta.icon && item.meta.icon !== '#'" :icon-class="item.meta ? item.meta.icon : ''" /> + {{ item.meta?.title }}</el-menu-item > </template> <!-- 椤堕儴鑿滃崟瓒呭嚭鏁伴噺鎶樺彔 --> - <el-sub-menu :style="{'--theme': theme}" index="more" v-if="topMenus.length > visibleNumber"> + <el-sub-menu v-if="topMenus.length > visibleNumber" :style="{ '--theme': theme }" index="more"> <template #title>鏇村鑿滃崟</template> <template v-for="(item, index) in topMenus"> - <el-menu-item :index="item.path" :key="index" v-if="index >= visibleNumber" - ><svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> {{ item.meta?.title }}</el-menu-item + <el-menu-item v-if="index >= visibleNumber" :key="index" :index="item.path" + ><svg-icon :icon-class="item.meta ? item.meta.icon : ''" /> {{ item.meta?.title }}</el-menu-item > </template> </el-sub-menu> @@ -26,7 +25,7 @@ import useAppStore from '@/store/modules/app'; import useSettingsStore from '@/store/modules/settings'; import usePermissionStore from '@/store/modules/permission'; -import { RouteOption } from 'vue-router'; +import { RouteRecordRaw } from 'vue-router'; // 椤堕儴鏍忓垵濮嬫暟 const visibleNumber = ref<number>(-1); @@ -35,9 +34,9 @@ // 闅愯棌渚ц竟鏍忚矾鐢� const hideList = ['/index', '/user/profile']; -const appStore = useAppStore() -const settingsStore = useSettingsStore() -const permissionStore = usePermissionStore() +const appStore = useAppStore(); +const settingsStore = useSettingsStore(); +const permissionStore = usePermissionStore(); const route = useRoute(); const router = useRouter(); @@ -48,73 +47,73 @@ // 椤堕儴鏄剧ず鑿滃崟 const topMenus = computed(() => { - let topMenus:RouteOption[] = []; + let topMenus: RouteRecordRaw[] = []; routers.value.map((menu) => { if (menu.hidden !== true) { // 鍏煎椤堕儴鏍忎竴绾ц彍鍗曞唴閮ㄨ烦杞� - if (menu.path === "/") { - topMenus.push(menu.children? menu.children[0] : menu); + if (menu.path === '/') { + topMenus.push(menu.children ? menu.children[0] : menu); } else { - topMenus.push(menu); + topMenus.push(menu); } } - }) + }); return topMenus; -}) +}); // 璁剧疆瀛愯矾鐢� const childrenMenus = computed(() => { - let childrenMenus:RouteOption[] = []; + let childrenMenus: RouteRecordRaw[] = []; routers.value.map((router) => { router.children?.forEach((item) => { if (item.parentPath === undefined) { - if(router.path === "/") { - item.path = "/" + item.path; + if (router.path === '/') { + item.path = '/' + item.path; } else { - if(!isHttp(item.path)) { - item.path = router.path + "/" + item.path; + if (!isHttp(item.path)) { + item.path = router.path + '/' + item.path; } } item.parentPath = router.path; } childrenMenus.push(item); - }) - }) + }); + }); return constantRoutes.concat(childrenMenus); -}) +}); // 榛樿婵�娲荤殑鑿滃崟 const activeMenu = computed(() => { const path = route.path; let activePath = path; - if (path !== undefined && path.lastIndexOf("/") > 0 && hideList.indexOf(path) === -1) { + if (path !== undefined && path.lastIndexOf('/') > 0 && hideList.indexOf(path) === -1) { const tmpPath = path.substring(1, path.length); - activePath = "/" + tmpPath.substring(0, tmpPath.indexOf("/")); + activePath = '/' + tmpPath.substring(0, tmpPath.indexOf('/')); if (!route.meta.link) { - appStore.toggleSideBarHide(false); + appStore.toggleSideBarHide(false); } - } else if(!route.children) { + } else if (!route.children) { activePath = path; appStore.toggleSideBarHide(true); } activeRoutes(activePath); return activePath; -}) +}); const setVisibleNumber = () => { const width = document.body.getBoundingClientRect().width / 3; visibleNumber.value = parseInt(String(width / 85)); -} +}; const handleSelect = (key: string) => { currentIndex.value = key; - const route = routers.value.find(item => item.path === key); + const route = routers.value.find((item) => item.path === key); if (isHttp(key)) { // http(s):// 璺緞鏂扮獥鍙f墦寮� - window.open(key, "_blank"); + window.open(key, '_blank'); } else if (!route || !route.children) { // 娌℃湁瀛愯矾鐢辫矾寰勫唴閮ㄦ墦寮� - const routeMenu = childrenMenus.value.find(item => item.path === key); + const routeMenu = childrenMenus.value.find((item) => item.path === key); if (routeMenu && routeMenu.query) { let query = JSON.parse(routeMenu.query); router.push({ path: key, query: query }); @@ -127,35 +126,35 @@ activeRoutes(key); appStore.toggleSideBarHide(false); } -} +}; const activeRoutes = (key: string) => { - let routes:RouteOption[] = []; + let routes: RouteRecordRaw[] = []; if (childrenMenus.value && childrenMenus.value.length > 0) { childrenMenus.value.map((item) => { - if (key == item.parentPath || (key == "index" && "" == item.path)) { + if (key == item.parentPath || (key == 'index' && '' == item.path)) { routes.push(item); } }); } - if(routes.length > 0) { + if (routes.length > 0) { permissionStore.setSidebarRouters(routes); } else { appStore.toggleSideBarHide(true); } return routes; -} +}; onMounted(() => { - window.addEventListener('resize', setVisibleNumber) -}) + window.addEventListener('resize', setVisibleNumber); +}); onBeforeUnmount(() => { - window.removeEventListener('resize', setVisibleNumber) -}) + window.removeEventListener('resize', setVisibleNumber); +}); onMounted(() => { - setVisibleNumber() -}) + setVisibleNumber(); +}); </script> <style lang="scss"> @@ -168,7 +167,8 @@ margin: 0 10px !important; } -.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, .el-menu--horizontal > .el-sub-menu.is-active .el-submenu__title { +.topmenu-container.el-menu--horizontal > .el-menu-item.is-active, +.el-menu--horizontal > .el-sub-menu.is-active .el-submenu__title { border-bottom: 2px solid #{'var(--theme)'} !important; color: #303133; } @@ -184,7 +184,9 @@ } /* 鑳屾櫙鑹查殣钘� */ -.topmenu-container.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus, .topmenu-container.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover, .topmenu-container.el-menu--horizontal>.el-submenu .el-submenu__title:hover { +.topmenu-container.el-menu--horizontal > .el-menu-item:not(.is-disabled):focus, +.topmenu-container.el-menu--horizontal > .el-menu-item:not(.is-disabled):hover, +.topmenu-container.el-menu--horizontal > .el-submenu .el-submenu__title:hover { background-color: #ffffff !important; } diff --git a/src/components/TreeSelect/index.vue b/src/components/TreeSelect/index.vue index 3076804..7accd6b 100644 --- a/src/components/TreeSelect/index.vue +++ b/src/components/TreeSelect/index.vue @@ -1,14 +1,14 @@ <template> <div class="el-tree-select"> <el-select - style="width: 100%" - v-model="valueId" ref="treeSelect" + v-model="valueId" + style="width: 100%" :filterable="true" :clearable="true" - @clear="clearHandle" :filter-method="selectFilterData" :placeholder="placeholder" + @clear="clearHandle" > <el-option :value="valueId" :label="valueTitle"> <el-tree @@ -29,43 +29,32 @@ </template> <script setup lang="ts"> +interface ObjMap { + value: string; + label: string; + children: string; +} +interface Props { + objMap: ObjMap; + accordion: boolean; + value: string | number; + options: any[]; + placeholder: string; +} -const props = defineProps({ - /* 閰嶇疆椤� */ - objMap: { - type: Object, - default: () => { - return { - value: 'id', // ID瀛楁鍚� - label: 'label', // 鏄剧ず鍚嶇О - children: 'children' // 瀛愮骇瀛楁鍚� - } - } +const props = withDefaults(defineProps<Props>(), { + objMap: () => { + return { + value: 'id', + label: 'label', + children: 'children' + }; }, - /* 鑷姩鏀惰捣 */ - accordion: { - type: Boolean, - default: () => { - return false - } - }, - /**褰撳墠鍙屽悜鏁版嵁缁戝畾鐨勫�� */ - value: { - type: [String, Number], - default: '' - }, - /**褰撳墠鐨勬暟鎹� */ - options: { - type: Array, - default: () => [] - }, - /**杈撳叆妗嗗唴閮ㄧ殑鏂囧瓧 */ - placeholder: { - type: String, - default: '' - } -}) - + accordion: false, + value: '', + options: () => [], + placeholder: '' +}); const selectTree = ref<ElTreeSelectInstance>(); @@ -74,7 +63,7 @@ const valueId = computed({ get: () => props.value, set: (val) => { - emit('update:value', val) + emit('update:value', val); } }); const valueTitle = ref(''); @@ -83,54 +72,54 @@ const initHandle = () => { nextTick(() => { const selectedValue = valueId.value; - if (selectedValue !== null && typeof (selectedValue) !== 'undefined') { - const node = selectTree.value?.getNode(selectedValue) + if (selectedValue !== null && typeof selectedValue !== 'undefined') { + const node = selectTree.value?.getNode(selectedValue); if (node) { - valueTitle.value = node.data[props.objMap.label] - selectTree.value?.setCurrentKey(selectedValue) // 璁剧疆榛樿閫変腑 - defaultExpandedKey.value = [selectedValue] // 璁剧疆榛樿灞曞紑 + valueTitle.value = node.data[props.objMap.label]; + selectTree.value?.setCurrentKey(selectedValue); // 璁剧疆榛樿閫変腑 + defaultExpandedKey.value = [selectedValue]; // 璁剧疆榛樿灞曞紑 } } else { - clearHandle() + clearHandle(); } - }) -} + }); +}; const handleNodeClick = (node: any) => { - valueTitle.value = node[props.objMap.label] + valueTitle.value = node[props.objMap.label]; valueId.value = node[props.objMap.value]; defaultExpandedKey.value = []; - selectTree.value?.blur() - selectFilterData('') -} + selectTree.value?.blur(); + selectFilterData(''); +}; const selectFilterData = (val: any) => { - selectTree.value?.filter(val) -} + selectTree.value?.filter(val); +}; const filterNode = (value: any, data: any) => { - if (!value) return true - return data[props.objMap['label']].indexOf(value) !== -1 -} + if (!value) return true; + return data[props.objMap['label']].indexOf(value) !== -1; +}; const clearHandle = () => { - valueTitle.value = '' - valueId.value = '' + valueTitle.value = ''; + valueId.value = ''; defaultExpandedKey.value = []; - clearSelected() -} + clearSelected(); +}; const clearSelected = () => { - const allNode = document.querySelectorAll('#tree-option .el-tree-node') - allNode.forEach((element) => element.classList.remove('is-current')) -} + const allNode = document.querySelectorAll('#tree-option .el-tree-node'); + allNode.forEach((element) => element.classList.remove('is-current')); +}; onMounted(() => { - initHandle() -}) + initHandle(); +}); watch(valueId, () => { initHandle(); -}) +}); </script> <style lang="scss" scoped> -@import "@/assets/styles/variables.module.scss"; +@import '@/assets/styles/variables.module.scss'; .el-scrollbar .el-scrollbar__view .el-select-dropdown__item { padding: 0; diff --git a/src/components/iFrame/index.vue b/src/components/iFrame/index.vue index 6679f08..98f2224 100644 --- a/src/components/iFrame/index.vue +++ b/src/components/iFrame/index.vue @@ -9,18 +9,18 @@ const props = defineProps({ src: propTypes.string.isRequired -}) +}); -const height = ref(document.documentElement.clientHeight - 94.5 + "px;") -const loading = ref(true) -const url = computed(() => props.src) +const height = ref(document.documentElement.clientHeight - 94.5 + 'px;'); +const loading = ref(true); +const url = computed(() => props.src); onMounted(() => { setTimeout(() => { loading.value = false; }, 300); window.onresize = function temp() { - height.value = document.documentElement.clientHeight - 94.5 + "px;"; + height.value = document.documentElement.clientHeight - 94.5 + 'px;'; }; -}) +}); </script> diff --git a/src/directive/permission/index.ts b/src/directive/permission/index.ts index 7e9ddeb..afde332 100644 --- a/src/directive/permission/index.ts +++ b/src/directive/permission/index.ts @@ -9,7 +9,7 @@ // 銆屽叾浠栬鑹层�嶆寜閽潈闄愭牎楠� const { value } = binding; if (value && value instanceof Array && value.length > 0) { - const hasPermission = permissions.some((permi) => { + const hasPermission = permissions.some((permi: string) => { return permi === '*:*:*' || value.includes(permi); }); if (!hasPermission) { @@ -30,7 +30,7 @@ const { value } = binding; const { roles } = useUserStore(); if (value && value instanceof Array && value.length > 0) { - const hasRole = roles.some((role) => { + const hasRole = roles.some((role: string) => { return role === 'admin' || value.includes(role); }); if (!hasRole) { diff --git a/src/layout/components/AppMain.vue b/src/layout/components/AppMain.vue index 8a73232..b7c6ef0 100644 --- a/src/layout/components/AppMain.vue +++ b/src/layout/components/AppMain.vue @@ -3,7 +3,7 @@ <router-view v-slot="{ Component, route }"> <transition :enter-active-class="animante" mode="out-in"> <keep-alive :include="tagsViewStore.cachedViews"> - <component v-if="!route.meta.link" :is="Component" :key="route.path" /> + <component :is="Component" v-if="!route.meta.link" :key="route.path" /> </keep-alive> </transition> </router-view> @@ -14,22 +14,25 @@ <script setup name="AppMain" lang="ts"> import useTagsViewStore from '@/store/modules/tagsView'; import useSettingsStore from '@/store/modules/settings'; -import IframeToggle from './IframeToggle/index.vue' -import { ComponentInternalInstance } from "vue"; +import IframeToggle from './IframeToggle/index.vue'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const tagsViewStore = useTagsViewStore(); // 闅忔満鍔ㄧ敾闆嗗悎 const animante = ref<string>(''); const animationEnable = ref(useSettingsStore().animationEnable); -watch(()=> useSettingsStore().animationEnable, (val) => { +watch( + () => useSettingsStore().animationEnable, + (val) => { animationEnable.value = val; if (val) { - animante.value = proxy?.animate.animateList[Math.round(Math.random() * proxy?.animate.animateList.length)] as string; + animante.value = proxy?.animate.animateList[Math.round(Math.random() * proxy?.animate.animateList.length)] as string; } else { - animante.value = proxy?.animate.defaultAnimate as string; + animante.value = proxy?.animate.defaultAnimate as string; } -}, { immediate: true }); + }, + { immediate: true } +); </script> <style lang="scss" scoped> @@ -41,7 +44,7 @@ overflow: hidden; } -.fixed-header+.app-main { +.fixed-header + .app-main { padding-top: 50px; } @@ -51,7 +54,7 @@ min-height: calc(100vh - 84px); } - .fixed-header+.app-main { + .fixed-header + .app-main { padding-top: 84px; } } diff --git a/src/layout/components/IframeToggle/index.vue b/src/layout/components/IframeToggle/index.vue index efb2b7a..b83f40f 100644 --- a/src/layout/components/IframeToggle/index.vue +++ b/src/layout/components/IframeToggle/index.vue @@ -2,16 +2,16 @@ <transition-group name="fade-transform" mode="out-in"> <inner-link v-for="(item, index) in tagsViewStore.iframeViews" - :key="item.path" - :iframeId="'iframe' + index" v-show="route.path === item.path" + :key="item.path" + :iframe-id="'iframe' + index" :src="iframeUrl(item.meta ? item.meta.link : '', item.query)" ></inner-link> </transition-group> </template> <script setup lang="ts"> -import InnerLink from "../InnerLink/index.vue"; +import InnerLink from '../InnerLink/index.vue'; import useTagsViewStore from '@/store/modules/tagsView'; const route = useRoute(); @@ -19,8 +19,10 @@ function iframeUrl(url: string, query: any) { if (Object.keys(query).length > 0) { - let params = Object.keys(query).map((key) => key + "=" + query[key]).join("&"); - return url + "?" + params; + let params = Object.keys(query) + .map((key) => key + '=' + query[key]) + .join('&'); + return url + '?' + params; } return url; } diff --git a/src/layout/components/InnerLink/index.vue b/src/layout/components/InnerLink/index.vue index fa2869c..b80b17b 100644 --- a/src/layout/components/InnerLink/index.vue +++ b/src/layout/components/InnerLink/index.vue @@ -5,14 +5,11 @@ </template> <script setup lang="ts"> +import { propTypes } from '@/utils/propTypes'; + const props = defineProps({ - src: { - type: String, - default: "/" - }, - iframeId: { - type: String - } + src: propTypes.string.def('/'), + iframeId: propTypes.string.isRequired }); -const height = ref(document.documentElement.clientHeight - 94.5 + "px"); +const height = ref(document.documentElement.clientHeight - 94.5 + 'px'); </script> diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 7818fd4..49018ce 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -1,18 +1,18 @@ <template> <div class="navbar"> - <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" /> - <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!settingsStore.topNav" /> - <top-nav id="topmenu-container" class="topmenu-container" v-if="settingsStore.topNav" /> + <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggle-click="toggleSideBar" /> + <breadcrumb v-if="!settingsStore.topNav" id="breadcrumb-container" class="breadcrumb-container" /> + <top-nav v-if="settingsStore.topNav" id="topmenu-container" class="topmenu-container" /> <div class="right-menu flex align-center"> <template v-if="appStore.device !== 'mobile'"> <el-select + v-if="userId === 1 && tenantEnabled" v-model="companyName" clearable filterable reserve-keyword :placeholder="$t('navbar.selectTenant')" - v-if="userId === 1 && tenantEnabled" @change="dynamicTenantEvent" @clear="dynamicClearEvent" > @@ -63,17 +63,17 @@ </el-tooltip> </template> <div class="avatar-container"> - <el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click"> + <el-dropdown class="right-menu-item hover-effect" trigger="click" @command="handleCommand"> <div class="avatar-wrapper"> <img :src="userStore.avatar" class="user-avatar" /> <el-icon><caret-bottom /></el-icon> </div> <template #dropdown> <el-dropdown-menu> - <router-link to="/user/profile" v-if="!dynamic"> + <router-link v-if="!dynamic" to="/user/profile"> <el-dropdown-item>{{ $t('navbar.personalCenter') }}</el-dropdown-item> </router-link> - <el-dropdown-item command="setLayout" v-if="settingsStore.showSettings"> + <el-dropdown-item v-if="settingsStore.showSettings" command="setLayout"> <span>{{ $t('navbar.layoutSetting') }}</span> </el-dropdown-item> <el-dropdown-item divided command="logout"> @@ -92,10 +92,9 @@ import useAppStore from '@/store/modules/app'; import useUserStore from '@/store/modules/user'; import useSettingsStore from '@/store/modules/settings'; -import { getTenantList } from "@/api/login"; -import { dynamicClear, dynamicTenant } from "@/api/system/tenant"; -import { ComponentInternalInstance } from "vue"; -import { TenantVO } from "@/api/types"; +import { getTenantList } from '@/api/login'; +import { dynamicClear, dynamicTenant } from '@/api/system/tenant'; +import { TenantVO } from '@/api/types'; import notice from './notice/index.vue'; import useNoticeStore from '@/store/modules/notice'; @@ -119,7 +118,7 @@ const openSearchMenu = () => { searchMenuRef.value?.openSearch(); -} +}; // 鍔ㄦ�佸垏鎹� const dynamicTenantEvent = async (tenantId: string) => { @@ -129,14 +128,14 @@ proxy?.$tab.closeAllPage(); proxy?.$router.push('/'); } -} +}; const dynamicClearEvent = async () => { await dynamicClear(); dynamic.value = false; proxy?.$tab.closeAllPage(); proxy?.$router.push('/'); -} +}; /** 绉熸埛鍒楄〃 */ const initTenantList = async () => { @@ -145,56 +144,58 @@ if (tenantEnabled.value) { tenantList.value = data.voList; } -} +}; defineExpose({ - initTenantList, -}) + initTenantList +}); const toggleSideBar = () => { appStore.toggleSideBar(false); -} +}; const logout = async () => { - await ElMessageBox.confirm('纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�', '鎻愮ず', { - confirmButtonText: '纭畾', - cancelButtonText: '鍙栨秷', - type: 'warning' - }) - await userStore.logout() - location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index'; -} + await ElMessageBox.confirm('纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }); + await userStore.logout(); + location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index'; +}; -const emits = defineEmits(['setLayout']) +const emits = defineEmits(['setLayout']); const setLayout = () => { - emits('setLayout'); -} + emits('setLayout'); +}; // 瀹氫箟Command鏂规硶瀵硅薄 閫氳繃key鐩存帴璋冪敤鏂规硶 -const commandMap: {[key: string]: any} = { - setLayout, - logout +const commandMap: { [key: string]: any } = { + setLayout, + logout }; const handleCommand = (command: string) => { - // 鍒ゆ柇鏄惁瀛樺湪璇ユ柟娉� - if (commandMap[command]) { - commandMap[command](); - } -} - + // 鍒ゆ柇鏄惁瀛樺湪璇ユ柟娉� + if (commandMap[command]) { + commandMap[command](); + } +}; //鐢ㄦ繁搴︾洃鍚� 娑堟伅 -watch(() => noticeStore.state.value.notices, (newVal, oldVal) => { - newNotice.value = newVal.filter((item: any) => !item.read).length; -}, { deep: true }); +watch( + () => noticeStore.state.value.notices, + (newVal) => { + newNotice.value = newVal.filter((item: any) => !item.read).length; + }, + { deep: true } +); </script> <style lang="scss" scoped> - :deep(.el-select .el-input__wrapper) { - height:30px; + height: 30px; } -:deep(.el-badge__content.is-fixed){ - top: 12px; +:deep(.el-badge__content.is-fixed) { + top: 12px; } .flex { diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue index d5522ae..c748998 100644 --- a/src/layout/components/Settings/index.vue +++ b/src/layout/components/Settings/index.vue @@ -1,11 +1,11 @@ <template> - <el-drawer v-model="showSettings" :withHeader="false" direction="rtl" size="300px" close-on-click-modal> + <el-drawer v-model="showSettings" :with-header="false" direction="rtl" size="300px" close-on-click-modal> <h3 class="drawer-title">涓婚椋庢牸璁剧疆</h3> <div class="setting-drawer-block-checbox"> <div class="setting-drawer-block-checbox-item" @click="handleTheme(SideThemeEnum.DARK)"> <img src="@/assets/images/dark.svg" alt="dark" /> - <div v-if="sideTheme === 'theme-dark'" class="setting-drawer-block-checbox-selectIcon" style="display: block;"> + <div v-if="sideTheme === 'theme-dark'" class="setting-drawer-block-checbox-selectIcon" style="display: block"> <i aria-label="鍥炬爣: check" class="anticon anticon-check"> <svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class> <path @@ -17,7 +17,7 @@ </div> <div class="setting-drawer-block-checbox-item" @click="handleTheme(SideThemeEnum.LIGHT)"> <img src="@/assets/images/light.svg" alt="light" /> - <div v-if="sideTheme === 'theme-light'" class="setting-drawer-block-checbox-selectIcon" style="display: block;"> + <div v-if="sideTheme === 'theme-light'" class="setting-drawer-block-checbox-selectIcon" style="display: block"> <i aria-label="鍥炬爣: check" class="anticon anticon-check"> <svg viewBox="64 64 896 896" data-icon="check" width="1em" height="1em" :fill="theme" aria-hidden="true" focusable="false" class> <path @@ -37,7 +37,7 @@ <div class="drawer-item"> <span>娣辫壊妯″紡</span> <span class="comp-style"> - <el-switch v-model="isDark" @change="toggleDark" class="drawer-switch" /> + <el-switch v-model="isDark" class="drawer-switch" @change="toggleDark" /> </span> </div> @@ -88,126 +88,126 @@ </template> <script setup lang="ts"> -import { useDynamicTitle } from '@/utils/dynamicTitle' -import useAppStore from '@/store/modules/app' -import useSettingsStore from '@/store/modules/settings' -import usePermissionStore from '@/store/modules/permission' -import { handleThemeStyle } from '@/utils/theme' -import { ComponentInternalInstance } from "vue"; -import { SettingTypeEnum } from "@/enums/SettingTypeEnum"; -import { SideThemeEnum } from "@/enums/SideThemeEnum"; +import { useDynamicTitle } from '@/utils/dynamicTitle'; +import useAppStore from '@/store/modules/app'; +import useSettingsStore from '@/store/modules/settings'; +import usePermissionStore from '@/store/modules/permission'; +import { handleThemeStyle } from '@/utils/theme'; +import { SettingTypeEnum } from '@/enums/SettingTypeEnum'; +import { SideThemeEnum } from '@/enums/SideThemeEnum'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const appStore = useAppStore() -const settingsStore = useSettingsStore() -const permissionStore = usePermissionStore() - +const appStore = useAppStore(); +const settingsStore = useSettingsStore(); +const permissionStore = usePermissionStore(); const showSettings = ref(false); const theme = ref(settingsStore.theme); const sideTheme = ref(settingsStore.sideTheme); const storeSettings = computed(() => settingsStore); -const predefineColors = ref(["#409EFF", "#ff4500", "#ff8c00", "#ffd700", "#90ee90", "#00ced1", "#1e90ff", "#c71585"]); +const predefineColors = ref(['#409EFF', '#ff4500', '#ff8c00', '#ffd700', '#90ee90', '#00ced1', '#1e90ff', '#c71585']); // 鏄惁鏆楅粦妯″紡 const isDark = useDark({ storageKey: 'useDarkKey', valueDark: 'dark', - valueLight: 'light', + valueLight: 'light' }); -watch(isDark, ()=> { +watch(isDark, () => { if (isDark.value) { - settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: SideThemeEnum.DARK }) + settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: SideThemeEnum.DARK }); } else { - settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: sideTheme.value }) + settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: sideTheme.value }); } -}) +}); const toggleDark = () => useToggle(isDark); /** 鏄惁闇�瑕乼opNav */ const topNav = computed({ - get: () => storeSettings.value.topNav, - set: (val) => { - settingsStore.changeSetting({ key: SettingTypeEnum.TOP_NAV, value: val }) - if (!val) { - appStore.toggleSideBarHide(false); - permissionStore.setSidebarRouters(permissionStore.defaultRoutes); - } + get: () => storeSettings.value.topNav, + set: (val) => { + settingsStore.changeSetting({ key: SettingTypeEnum.TOP_NAV, value: val }); + if (!val) { + appStore.toggleSideBarHide(false); + permissionStore.setSidebarRouters(permissionStore.defaultRoutes); } -}) + } +}); /** 鏄惁闇�瑕乼agview */ const tagsView = computed({ - get: () => storeSettings.value.tagsView, - set: (val) => { - settingsStore.changeSetting({ key: SettingTypeEnum.TAGS_VIEW, value: val }) - } -}) + get: () => storeSettings.value.tagsView, + set: (val) => { + settingsStore.changeSetting({ key: SettingTypeEnum.TAGS_VIEW, value: val }); + } +}); /**鏄惁闇�瑕佸浐瀹氬ご閮� */ const fixedHeader = computed({ - get: () => storeSettings.value.fixedHeader, - set: (val) => { - settingsStore.changeSetting({ key: SettingTypeEnum.FIXED_HEADER, value: val }) - } -}) + get: () => storeSettings.value.fixedHeader, + set: (val) => { + settingsStore.changeSetting({ key: SettingTypeEnum.FIXED_HEADER, value: val }); + } +}); /**鏄惁闇�瑕佷晶杈规爮鐨刲ogo */ const sidebarLogo = computed({ - get: () => storeSettings.value.sidebarLogo, - set: (val) => { - settingsStore.changeSetting({ key: SettingTypeEnum.SIDEBAR_LOGO, value: val }) - } -}) + get: () => storeSettings.value.sidebarLogo, + set: (val) => { + settingsStore.changeSetting({ key: SettingTypeEnum.SIDEBAR_LOGO, value: val }); + } +}); /**鏄惁闇�瑕佷晶杈规爮鐨勫姩鎬佺綉椤电殑title */ const dynamicTitle = computed({ - get: () => storeSettings.value.dynamicTitle, - set: (val) => { - settingsStore.changeSetting({ key: SettingTypeEnum.DYNAMIC_TITLE, value: val }) - // 鍔ㄦ�佽缃綉椤垫爣棰� - useDynamicTitle() - } -}) + get: () => storeSettings.value.dynamicTitle, + set: (val) => { + settingsStore.changeSetting({ key: SettingTypeEnum.DYNAMIC_TITLE, value: val }); + // 鍔ㄦ�佽缃綉椤垫爣棰� + useDynamicTitle(); + } +}); -const themeChange = (val: string | null) => { - settingsStore.changeSetting({ key: SettingTypeEnum.THEME, value: val }) - theme.value = val; - if (val) { - handleThemeStyle(val); - } -} +const themeChange = (val: string) => { + settingsStore.changeSetting({ key: SettingTypeEnum.THEME, value: val }); + theme.value = val; + if (val) { + handleThemeStyle(val); + } +}; const handleTheme = (val: string) => { - sideTheme.value = val; - if (isDark.value && val === SideThemeEnum.LIGHT) { - // 鏆楅粦妯″紡棰滆壊涓嶅彉 - settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: SideThemeEnum.DARK }) - return - } - settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: val }) -} + sideTheme.value = val; + if (isDark.value && val === SideThemeEnum.LIGHT) { + // 鏆楅粦妯″紡棰滆壊涓嶅彉 + settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: SideThemeEnum.DARK }); + return; + } + settingsStore.changeSetting({ key: SettingTypeEnum.SIDE_THEME, value: val }); +}; const saveSetting = () => { - proxy?.$modal.loading("姝e湪淇濆瓨鍒版湰鍦帮紝璇风◢鍊�..."); - let layoutSetting = { - "topNav": storeSettings.value.topNav, - "tagsView": storeSettings.value.tagsView, - "fixedHeader": storeSettings.value.fixedHeader, - "sidebarLogo": storeSettings.value.sidebarLogo, - "dynamicTitle": storeSettings.value.dynamicTitle, - "sideTheme": storeSettings.value.sideTheme, - "theme": storeSettings.value.theme - }; - localStorage.setItem("layout-setting", JSON.stringify(layoutSetting)); - setTimeout(() => {proxy?.$modal.closeLoading()}, 1000) -} + proxy?.$modal.loading('姝e湪淇濆瓨鍒版湰鍦帮紝璇风◢鍊�...'); + let layoutSetting = { + topNav: storeSettings.value.topNav, + tagsView: storeSettings.value.tagsView, + fixedHeader: storeSettings.value.fixedHeader, + sidebarLogo: storeSettings.value.sidebarLogo, + dynamicTitle: storeSettings.value.dynamicTitle, + sideTheme: storeSettings.value.sideTheme, + theme: storeSettings.value.theme + }; + localStorage.setItem('layout-setting', JSON.stringify(layoutSetting)); + setTimeout(() => { + proxy?.$modal.closeLoading(); + }, 1000); +}; const resetSetting = () => { - proxy?.$modal.loading("姝e湪娓呴櫎璁剧疆缂撳瓨骞跺埛鏂帮紝璇风◢鍊�..."); - localStorage.removeItem("layout-setting") - setTimeout("window.location.reload()", 1000) -} + proxy?.$modal.loading('姝e湪娓呴櫎璁剧疆缂撳瓨骞跺埛鏂帮紝璇风◢鍊�...'); + localStorage.removeItem('layout-setting'); + setTimeout('window.location.reload()', 1000); +}; const openSetting = () => { - showSettings.value = true; -} + showSettings.value = true; +}; defineExpose({ - openSetting, -}) + openSetting +}); </script> <style lang="scss" scoped> diff --git a/src/layout/components/Sidebar/Link.vue b/src/layout/components/Sidebar/Link.vue index 4c6e8b3..fd75f35 100644 --- a/src/layout/components/Sidebar/Link.vue +++ b/src/layout/components/Sidebar/Link.vue @@ -5,36 +5,36 @@ </template> <script setup lang="ts"> -import { isExternal } from '@/utils/validate' +import { isExternal } from '@/utils/validate'; const props = defineProps({ - to: { - type: [String, Object], - required: true - } -}) + to: { + type: [String, Object], + required: true + } +}); const isExt = computed(() => { - return isExternal(props.to as string) -}) + return isExternal(props.to as string); +}); const type = computed(() => { - if (isExt.value) { - return 'a' - } - return 'router-link' -}) + if (isExt.value) { + return 'a'; + } + return 'router-link'; +}); function linkProps() { - if (isExt.value) { - return { - href: props.to, - target: '_blank', - rel: 'noopener' - } - } + if (isExt.value) { return { - to: props.to - } + href: props.to, + target: '_blank', + rel: 'noopener' + }; + } + return { + to: props.to + }; } </script> diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue index a06158a..631c261 100644 --- a/src/layout/components/Sidebar/Logo.vue +++ b/src/layout/components/Sidebar/Logo.vue @@ -1,7 +1,7 @@ <template> <div class="sidebar-logo-container" - :class="{ 'collapse': collapse }" + :class="{ collapse: collapse }" :style="{ backgroundColor: sideTheme === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground }" > <transition :enter-active-class="proxy?.animate.logoAnimate.enter" mode="out-in"> @@ -22,18 +22,17 @@ </template> <script setup lang="ts"> -import variables from '@/assets/styles/variables.module.scss' -import logo from '@/assets/logo/logo.png' -import useSettingsStore from '@/store/modules/settings' -import { ComponentInternalInstance } from "vue"; +import variables from '@/assets/styles/variables.module.scss'; +import logo from '@/assets/logo/logo.png'; +import useSettingsStore from '@/store/modules/settings'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; defineProps({ - collapse: { - type: Boolean, - required: true - } -}) + collapse: { + type: Boolean, + required: true + } +}); const title = ref('RuoYi-Vue-Plus'); const settingsStore = useSettingsStore(); @@ -77,7 +76,12 @@ font-weight: 600; line-height: 50px; font-size: 14px; - font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif; + font-family: + Avenir, + Helvetica Neue, + Arial, + Helvetica, + sans-serif; vertical-align: middle; } } diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue index 4459cdf..7829d18 100644 --- a/src/layout/components/Sidebar/SidebarItem.vue +++ b/src/layout/components/Sidebar/SidebarItem.vue @@ -13,7 +13,7 @@ <el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" teleported> <template v-if="item.meta" #title> - <svg-icon :icon-class="item.meta ? item.meta.icon : '' " /> + <svg-icon :icon-class="item.meta ? item.meta.icon : ''" /> <span class="menu-title" :title="hasTitle(item.meta?.title)">{{ item.meta?.title }}</span> </template> @@ -30,79 +30,75 @@ </template> <script setup lang="ts"> -import { isExternal } from '@/utils/validate' -import AppLink from './Link.vue' -import { getNormalPath } from '@/utils/ruoyi' -import { RouteOption } from "vue-router"; +import { isExternal } from '@/utils/validate'; +import AppLink from './Link.vue'; +import { getNormalPath } from '@/utils/ruoyi'; +import { RouteRecordRaw } from 'vue-router'; const props = defineProps({ - // route object - item: { - type: Object as PropType<RouteOption>, - required: true - }, - isNest: { - type: Boolean, - default: false - }, - basePath: { - type: String, - default: '' - } -}) + // route object + item: { + type: Object as PropType<RouteRecordRaw>, + required: true + }, + isNest: { + type: Boolean, + default: false + }, + basePath: { + type: String, + default: '' + } +}); const onlyOneChild = ref<any>({}); -const hasOneShowingChild = (parent: RouteOption, children?:RouteOption[]) => { - if (!children) { - children = []; +const hasOneShowingChild = (parent: RouteRecordRaw, children?: RouteRecordRaw[]) => { + if (!children) { + children = []; + } + const showingChildren = children.filter((item) => { + if (item.hidden) { + return false; + } else { + // Temp set(will be used if only has one showing child) + onlyOneChild.value = item; + return true; } - const showingChildren = children.filter(item => { - if (item.hidden) { - return false - } else { - // Temp set(will be used if only has one showing child) - onlyOneChild.value = item - return true - } - }) + }); - // When there is only one child router, the child router is displayed by default - if (showingChildren.length === 1) { - return true - } + // When there is only one child router, the child router is displayed by default + if (showingChildren.length === 1) { + return true; + } - // Show parent if there are no child router to display - if (showingChildren.length === 0) { - onlyOneChild.value = { ...parent, path: '', noShowingChildren: true } - if (parent.name === '2222') { - console.log(onlyOneChild.value) - } - return true - } + // Show parent if there are no child router to display + if (showingChildren.length === 0) { + onlyOneChild.value = { ...parent, path: '', noShowingChildren: true }; + return true; + } - - return false + return false; }; -const resolvePath = (routePath:string, routeQuery?:string): any => { - if (isExternal(routePath)) { - return routePath - } - if (isExternal(props.basePath)) { - return props.basePath - } - if (routeQuery) { - let query = JSON.parse(routeQuery); - return { path: getNormalPath(props.basePath + '/' + routePath), query: query } - } - return getNormalPath(props.basePath + '/' + routePath) -} +const resolvePath = (routePath: string, routeQuery?: string): any => { + if (isExternal(routePath)) { + return routePath; + } + if (isExternal(props.basePath)) { + return props.basePath; + } + if (routeQuery) { + let query = JSON.parse(routeQuery); + return { path: getNormalPath(props.basePath + '/' + routePath), query: query }; + } + return getNormalPath(props.basePath + '/' + routePath); +}; const hasTitle = (title: string | undefined): string => { - if(!title || title.length <= 5) { - return ""; - } - return title; -} + if (!title || title.length <= 5) { + return ''; + } + return title; +}; </script> diff --git a/src/layout/components/Sidebar/index.vue b/src/layout/components/Sidebar/index.vue index fc290b1..a8f47e2 100644 --- a/src/layout/components/Sidebar/index.vue +++ b/src/layout/components/Sidebar/index.vue @@ -21,35 +21,34 @@ </template> <script setup lang="ts"> -import Logo from './Logo.vue' -import SidebarItem from './SidebarItem.vue' -import variables from '@/assets/styles/variables.module.scss' -import useAppStore from '@/store/modules/app' -import useSettingsStore from '@/store/modules/settings' -import usePermissionStore from '@/store/modules/permission' -import { RouteOption } from "vue-router"; +import Logo from './Logo.vue'; +import SidebarItem from './SidebarItem.vue'; +import variables from '@/assets/styles/variables.module.scss'; +import useAppStore from '@/store/modules/app'; +import useSettingsStore from '@/store/modules/settings'; +import usePermissionStore from '@/store/modules/permission'; +import { RouteRecordRaw } from 'vue-router'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const route = useRoute(); -const appStore = useAppStore() -const settingsStore = useSettingsStore() -const permissionStore = usePermissionStore() - -const sidebarRouters = computed<RouteOption[]>(() => permissionStore.sidebarRouters); +const appStore = useAppStore(); +const settingsStore = useSettingsStore(); +const permissionStore = usePermissionStore(); +const sidebarRouters = computed<RouteRecordRaw[]>(() => permissionStore.sidebarRouters); const showLogo = computed(() => settingsStore.sidebarLogo); const sideTheme = computed(() => settingsStore.sideTheme); const theme = computed(() => settingsStore.theme); const isCollapse = computed(() => !appStore.sidebar.opened); const activeMenu = computed(() => { - const { meta, path } = route; - // if set path, the sidebar will highlight the path you set - if (meta.activeMenu) { - return meta.activeMenu; - } - return path; -}) + const { meta, path } = route; + // if set path, the sidebar will highlight the path you set + if (meta.activeMenu) { + return meta.activeMenu; + } + return path; +}); -const bgColor = computed(() => sideTheme.value === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground); -const textColor = computed(() => sideTheme.value === 'theme-dark' ? variables.menuColor : variables.menuLightColor); +const bgColor = computed(() => (sideTheme.value === 'theme-dark' ? variables.menuBackground : variables.menuLightBackground)); +const textColor = computed(() => (sideTheme.value === 'theme-dark' ? variables.menuColor : variables.menuLightColor)); </script> diff --git a/src/layout/components/SocialCallback/index.vue b/src/layout/components/SocialCallback/index.vue index e3a50e0..eac66bc 100644 --- a/src/layout/components/SocialCallback/index.vue +++ b/src/layout/components/SocialCallback/index.vue @@ -10,7 +10,6 @@ const route = useRoute(); const loading = ref(true); - /** * 鎺ユ敹Route浼犻�掔殑鍙傛暟 * @param {Object} route.query. @@ -18,8 +17,7 @@ const code = route.query.code as string; const state = route.query.state as string; const source = route.query.source as string; -const tenantId = localStorage.getItem("tenantId") ? localStorage.getItem("tenantId") as string : '000000'; - +const tenantId = localStorage.getItem('tenantId') ? (localStorage.getItem('tenantId') as string) : '000000'; const processResponse = async (res: any) => { if (res.code !== 200) { @@ -52,7 +50,6 @@ }; const loginByCode = async (data: LoginData) => { - console.log(2) try { const res = await login(data); await processResponse(res); diff --git a/src/layout/components/TagsView/ScrollPane.vue b/src/layout/components/TagsView/ScrollPane.vue index b50c628..a8e2ebc 100644 --- a/src/layout/components/TagsView/ScrollPane.vue +++ b/src/layout/components/TagsView/ScrollPane.vue @@ -5,84 +5,84 @@ </template> <script setup lang="ts"> -import useTagsViewStore from '@/store/modules/tagsView' -import { TagView } from 'vue-router' +import useTagsViewStore from '@/store/modules/tagsView'; +import { TagView } from 'vue-router'; const tagAndTagSpacing = ref(4); -const scrollContainerRef = ref<ElScrollbarInstance>() +const scrollContainerRef = ref<ElScrollbarInstance>(); const scrollWrapper = computed(() => scrollContainerRef.value?.$refs.wrapRef as any); onMounted(() => { - scrollWrapper.value?.addEventListener('scroll', emitScroll, true) -}) + scrollWrapper.value?.addEventListener('scroll', emitScroll, true); +}); onBeforeUnmount(() => { - scrollWrapper.value?.removeEventListener('scroll', emitScroll) -}) + scrollWrapper.value?.removeEventListener('scroll', emitScroll); +}); const handleScroll = (e: WheelEvent) => { - const eventDelta = (e as any).wheelDelta || - e.deltaY * 40 - const $scrollWrapper = scrollWrapper.value; - $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4 -} -const emits = defineEmits(['scroll']) + const eventDelta = (e as any).wheelDelta || -e.deltaY * 40; + const $scrollWrapper = scrollWrapper.value; + $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4; +}; +const emits = defineEmits(['scroll']); const emitScroll = () => { - emits('scroll') -} + emits('scroll'); +}; -const tagsViewStore = useTagsViewStore() +const tagsViewStore = useTagsViewStore(); const visitedViews = computed(() => tagsViewStore.visitedViews); const moveToTarget = (currentTag: TagView) => { - const $container = scrollContainerRef.value?.$el - const $containerWidth = $container.offsetWidth - const $scrollWrapper = scrollWrapper.value; + const $container = scrollContainerRef.value?.$el; + const $containerWidth = $container.offsetWidth; + const $scrollWrapper = scrollWrapper.value; - let firstTag = null - let lastTag = null + let firstTag = null; + let lastTag = null; - // find first tag and last tag - if (visitedViews.value.length > 0) { - firstTag = visitedViews.value[0] - lastTag = visitedViews.value[visitedViews.value.length - 1] + // find first tag and last tag + if (visitedViews.value.length > 0) { + firstTag = visitedViews.value[0]; + lastTag = visitedViews.value[visitedViews.value.length - 1]; + } + + if (firstTag === currentTag) { + $scrollWrapper.scrollLeft = 0; + } else if (lastTag === currentTag) { + $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth; + } else { + const tagListDom: any = document.getElementsByClassName('tags-view-item'); + const currentIndex = visitedViews.value.findIndex((item) => item === currentTag); + let prevTag = null; + let nextTag = null; + + for (const k in tagListDom) { + if (k !== 'length' && Object.hasOwnProperty.call(tagListDom, k)) { + if (tagListDom[k].dataset.path === visitedViews.value[currentIndex - 1].path) { + prevTag = tagListDom[k]; + } + if (tagListDom[k].dataset.path === visitedViews.value[currentIndex + 1].path) { + nextTag = tagListDom[k]; + } + } } - if (firstTag === currentTag) { - $scrollWrapper.scrollLeft = 0 - } else if (lastTag === currentTag) { - $scrollWrapper.scrollLeft = $scrollWrapper.scrollWidth - $containerWidth - } else { - const tagListDom: any = document.getElementsByClassName('tags-view-item'); - const currentIndex = visitedViews.value.findIndex(item => item === currentTag) - let prevTag = null - let nextTag = null + // the tag's offsetLeft after of nextTag + const afterNextTagOffsetLeft = nextTag.offsetLeft + nextTag.offsetWidth + tagAndTagSpacing.value; - for (const k in tagListDom) { - if (k !== 'length' && Object.hasOwnProperty.call(tagListDom, k)) { - if (tagListDom[k].dataset.path === visitedViews.value[currentIndex - 1].path) { - prevTag = tagListDom[k]; - } - if (tagListDom[k].dataset.path === visitedViews.value[currentIndex + 1].path) { - nextTag = tagListDom[k]; - } - } - } - - // the tag's offsetLeft after of nextTag - const afterNextTagOffsetLeft = nextTag.offsetLeft + nextTag.offsetWidth + tagAndTagSpacing.value - - // the tag's offsetLeft before of prevTag - const beforePrevTagOffsetLeft = prevTag.offsetLeft - tagAndTagSpacing.value - if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) { - $scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth - } else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) { - $scrollWrapper.scrollLeft = beforePrevTagOffsetLeft - } + // the tag's offsetLeft before of prevTag + const beforePrevTagOffsetLeft = prevTag.offsetLeft - tagAndTagSpacing.value; + if (afterNextTagOffsetLeft > $scrollWrapper.scrollLeft + $containerWidth) { + $scrollWrapper.scrollLeft = afterNextTagOffsetLeft - $containerWidth; + } else if (beforePrevTagOffsetLeft < $scrollWrapper.scrollLeft) { + $scrollWrapper.scrollLeft = beforePrevTagOffsetLeft; } -} + } +}; defineExpose({ - moveToTarget, -}) + moveToTarget +}); </script> <style lang="scss" scoped> diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue index 1df486e..6b99675 100644 --- a/src/layout/components/TagsView/index.vue +++ b/src/layout/components/TagsView/index.vue @@ -14,36 +14,35 @@ > {{ tag.title }} <span v-if="!isAffix(tag)" @click.prevent.stop="closeSelectedTag(tag)"> - <close class="el-icon-close" style="width: 1em; height: 1em;vertical-align: middle;" /> + <close class="el-icon-close" style="width: 1em; height: 1em; vertical-align: middle" /> </span> </router-link> </scroll-pane> <ul v-show="visible" :style="{ left: left + 'px', top: top + 'px' }" class="contextmenu"> - <li @click="refreshSelectedTag(selectedTag)"><refresh-right style="width: 1em; height: 1em;" /> 鍒锋柊椤甸潰</li> - <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)"><close style="width: 1em; height: 1em;" /> 鍏抽棴褰撳墠</li> - <li @click="closeOthersTags"><circle-close style="width: 1em; height: 1em;" /> 鍏抽棴鍏朵粬</li> - <li v-if="!isFirstView()" @click="closeLeftTags"><back style="width: 1em; height: 1em;" /> 鍏抽棴宸︿晶</li> - <li v-if="!isLastView()" @click="closeRightTags"><right style="width: 1em; height: 1em;" /> 鍏抽棴鍙充晶</li> - <li @click="closeAllTags(selectedTag)"><circle-close style="width: 1em; height: 1em;" /> 鍏ㄩ儴鍏抽棴</li> + <li @click="refreshSelectedTag(selectedTag)"><refresh-right style="width: 1em; height: 1em" /> 鍒锋柊椤甸潰</li> + <li v-if="!isAffix(selectedTag)" @click="closeSelectedTag(selectedTag)"><close style="width: 1em; height: 1em" /> 鍏抽棴褰撳墠</li> + <li @click="closeOthersTags"><circle-close style="width: 1em; height: 1em" /> 鍏抽棴鍏朵粬</li> + <li v-if="!isFirstView()" @click="closeLeftTags"><back style="width: 1em; height: 1em" /> 鍏抽棴宸︿晶</li> + <li v-if="!isLastView()" @click="closeRightTags"><right style="width: 1em; height: 1em" /> 鍏抽棴鍙充晶</li> + <li @click="closeAllTags(selectedTag)"><circle-close style="width: 1em; height: 1em" /> 鍏ㄩ儴鍏抽棴</li> </ul> </div> </template> <script setup lang="ts"> -import ScrollPane from './ScrollPane.vue' -import { getNormalPath } from '@/utils/ruoyi' -import useTagsViewStore from "@/store/modules/tagsView"; -import useSettingsStore from '@/store/modules/settings' -import usePermissionStore from '@/store/modules/permission' -import { ComponentInternalInstance } from "vue"; -import { RouteOption, TagView, RouteLocationRaw } from "vue-router"; +import ScrollPane from './ScrollPane.vue'; +import { getNormalPath } from '@/utils/ruoyi'; +import useTagsViewStore from '@/store/modules/tagsView'; +import useSettingsStore from '@/store/modules/settings'; +import usePermissionStore from '@/store/modules/permission'; +import { RouteRecordRaw, TagView } from 'vue-router'; const visible = ref(false); const top = ref(0); const left = ref(0); const selectedTag = ref<TagView>({}); const affixTags = ref<TagView[]>([]); -const scrollPaneRef = ref(ScrollPane); +const scrollPaneRef = ref<InstanceType<typeof ScrollPane>>(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; const route = useRoute(); @@ -54,186 +53,186 @@ const theme = computed(() => useSettingsStore().theme); watch(route, () => { - addTags(); - moveToCurrentTag(); -}) + addTags(); + moveToCurrentTag(); +}); watch(visible, (value) => { - if (value) { - document.body.addEventListener('click', closeMenu); - } else { - document.body.removeEventListener('click', closeMenu); - } -}) + if (value) { + document.body.addEventListener('click', closeMenu); + } else { + document.body.removeEventListener('click', closeMenu); + } +}); const isActive = (r: TagView): boolean => { - return r.path === route.path; -} + return r.path === route.path; +}; const activeStyle = (tag: TagView) => { - if (!isActive(tag)) return {}; - return { - "background-color": theme.value, - "border-color": theme.value - }; -} + if (!isActive(tag)) return {}; + return { + 'background-color': theme.value, + 'border-color': theme.value + }; +}; const isAffix = (tag: TagView) => { - return tag.meta && tag.meta.affix; -} + return tag.meta && tag.meta.affix; +}; const isFirstView = () => { - try { - return selectedTag.value.fullPath === '/index' || selectedTag.value.fullPath === visitedViews.value[1].fullPath; - } catch (err) { - return false; - } -} + try { + return selectedTag.value.fullPath === '/index' || selectedTag.value.fullPath === visitedViews.value[1].fullPath; + } catch (err) { + return false; + } +}; const isLastView = () => { - try { - return selectedTag.value.fullPath === visitedViews.value[visitedViews.value.length - 1].fullPath; - } catch (err) { - return false; + try { + return selectedTag.value.fullPath === visitedViews.value[visitedViews.value.length - 1].fullPath; + } catch (err) { + return false; + } +}; +const filterAffixTags = (routes: RouteRecordRaw[], basePath = '') => { + let tags: TagView[] = []; + + routes.forEach((route) => { + if (route.meta && route.meta.affix) { + const tagPath = getNormalPath(basePath + '/' + route.path); + tags.push({ + fullPath: tagPath, + path: tagPath, + name: route.name as string, + meta: { ...route.meta } + }); } -} -const filterAffixTags = (routes:RouteOption [], basePath = '') => { - let tags:TagView[] = [] - routes.forEach(route => { - if (route.meta && route.meta.affix) { - const tagPath = getNormalPath(basePath + '/' + route.path); - tags.push({ - fullPath: tagPath, - path: tagPath, - name: route.name, - meta: { ...route.meta } - }) - } - if (route.children) { - const tempTags = filterAffixTags(route.children, route.path); - if (tempTags.length >= 1) { - tags = [...tags, ...tempTags]; - } - } - }) - return tags -} + if (route.children) { + const tempTags = filterAffixTags(route.children, route.path); + if (tempTags.length >= 1) { + tags = [...tags, ...tempTags]; + } + } + }); + return tags; +}; const initTags = () => { - const res = filterAffixTags(routes.value); - affixTags.value = res; - for (const tag of res) { - // Must have tag name - if (tag.name) { - useTagsViewStore().addVisitedView(tag); - } + const res = filterAffixTags(routes.value as any); + affixTags.value = res; + for (const tag of res) { + // Must have tag name + if (tag.name) { + useTagsViewStore().addVisitedView(tag); } -} + } +}; const addTags = () => { - const { name } = route; - if(route.query.title) { - route.meta.title = route.query.title; - } - if (name) { - useTagsViewStore().addView(route); - if (route.meta.link) { - useTagsViewStore().addIframeView(route); - } - } - return false -} -const moveToCurrentTag = () => { - nextTick(() => { - for (const r of visitedViews.value) { - if (r.path === route.path) { - scrollPaneRef.value.moveToTarget(r); - // when query is different then update - if (r.fullPath !== route.fullPath) { - useTagsViewStore().updateVisitedView(route); - } - } - } - }) -} -const refreshSelectedTag = (view: TagView) => { - proxy?.$tab.refreshPage(view); + const { name } = route; + if (route.query.title) { + route.meta.title = route.query.title as string; + } + if (name) { + useTagsViewStore().addView(route as any); if (route.meta.link) { - useTagsViewStore().delIframeView(route); + useTagsViewStore().addIframeView(route as any); } -} + } + return false; +}; +const moveToCurrentTag = () => { + nextTick(() => { + for (const r of visitedViews.value) { + if (r.path === route.path) { + scrollPaneRef.value?.moveToTarget(r); + // when query is different then update + if (r.fullPath !== route.fullPath) { + useTagsViewStore().updateVisitedView(route); + } + } + } + }); +}; +const refreshSelectedTag = (view: TagView) => { + proxy?.$tab.refreshPage(view); + if (route.meta.link) { + useTagsViewStore().delIframeView(route as any); + } +}; const closeSelectedTag = (view: TagView) => { - proxy?.$tab.closePage(view).then(({ visitedViews }: any) => { - if (isActive(view)) { - toLastView(visitedViews, view); - } - }) -} + proxy?.$tab.closePage(view).then(({ visitedViews }: any) => { + if (isActive(view)) { + toLastView(visitedViews, view); + } + }); +}; const closeRightTags = () => { - proxy?.$tab.closeRightPage(selectedTag.value).then(visitedViews => { - if (!visitedViews.find(i => i.fullPath === route.fullPath)) { - toLastView(visitedViews); - } - }) -} + proxy?.$tab.closeRightPage(selectedTag.value).then((visitedViews) => { + if (!visitedViews.find((i) => i.fullPath === route.fullPath)) { + toLastView(visitedViews); + } + }); +}; const closeLeftTags = () => { - proxy?.$tab.closeLeftPage(selectedTag.value).then(visitedViews => { - if (!visitedViews.find(i => i.fullPath === route.fullPath)) { - toLastView(visitedViews); - } - }) -} + proxy?.$tab.closeLeftPage(selectedTag.value).then((visitedViews) => { + if (!visitedViews.find((i: TagView) => i.fullPath === route.fullPath)) { + toLastView(visitedViews); + } + }); +}; const closeOthersTags = () => { - router.push(selectedTag.value as RouteLocationRaw).catch(() => { }); - proxy?.$tab.closeOtherPage(selectedTag.value).then(() => { - moveToCurrentTag(); - }) -} + router.push(selectedTag.value).catch(() => {}); + proxy?.$tab.closeOtherPage(selectedTag.value).then(() => { + moveToCurrentTag(); + }); +}; const closeAllTags = (view: TagView) => { - proxy?.$tab.closeAllPage().then(({ visitedViews }) => { - if (affixTags.value.some(tag => tag.path === route.path)) { - return; - } - toLastView(visitedViews, view); - }) -} -const toLastView = (visitedViews:TagView[], view?: TagView) => { - const latestView = visitedViews.slice(-1)[0]; - if (latestView) { - router.push(latestView.fullPath as string); - } else { - // now the default is to redirect to the home page if there is no tags-view, - // you can adjust it according to your needs. - if (view?.name === 'Dashboard') { - // to reload home page - router.replace({ path: '/redirect' + view?.fullPath }); - } else { - router.push('/'); - } + proxy?.$tab.closeAllPage().then(({ visitedViews }) => { + if (affixTags.value.some((tag) => tag.path === route.path)) { + return; } -} + toLastView(visitedViews, view); + }); +}; +const toLastView = (visitedViews: TagView[], view?: TagView) => { + const latestView = visitedViews.slice(-1)[0]; + if (latestView) { + router.push(latestView.fullPath as string); + } else { + // now the default is to redirect to the home page if there is no tags-view, + // you can adjust it according to your needs. + if (view?.name === 'Dashboard') { + // to reload home page + router.replace({ path: '/redirect' + view?.fullPath }); + } else { + router.push('/'); + } + } +}; const openMenu = (tag: TagView, e: MouseEvent) => { - const menuMinWidth = 105; - const offsetLeft = proxy?.$el.getBoundingClientRect().left; // container margin left - const offsetWidth = proxy?.$el.offsetWidth; // container width - const maxLeft = offsetWidth - menuMinWidth; // left boundary - const l = e.clientX - offsetLeft + 15; // 15: margin right + const menuMinWidth = 105; + const offsetLeft = proxy?.$el.getBoundingClientRect().left; // container margin left + const offsetWidth = proxy?.$el.offsetWidth; // container width + const maxLeft = offsetWidth - menuMinWidth; // left boundary + const l = e.clientX - offsetLeft + 15; // 15: margin right - if (l > maxLeft) { - left.value = maxLeft; - } else { - left.value = l; - } + if (l > maxLeft) { + left.value = maxLeft; + } else { + left.value = l; + } - top.value = e.clientY - visible.value = true; - selectedTag.value = tag; -} + top.value = e.clientY; + visible.value = true; + selectedTag.value = tag; +}; const closeMenu = () => { - visible.value = false; -} + visible.value = false; +}; const handleScroll = () => { - closeMenu(); -} - + closeMenu(); +}; onMounted(() => { - initTags(); - addTags(); -}) + initTags(); + addTags(); +}); </script> <style lang="scss" scoped> @@ -242,7 +241,9 @@ width: 100%; background-color: var(--el-bg-color); border: 1px solid var(--el-border-color-light); - box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.12), 0 0 3px 0 rgba(0, 0, 0, 0.04); + box-shadow: + 0 1px 3px 0 rgba(0, 0, 0, 0.12), + 0 0 3px 0 rgba(0, 0, 0, 0.04); .tags-view-wrapper { .tags-view-item { display: inline-block; @@ -271,7 +272,7 @@ color: #fff; border-color: #42b983; &::before { - content: ""; + content: ''; background: #fff; display: inline-block; width: 8px; diff --git a/src/layout/components/TopBar/search.vue b/src/layout/components/TopBar/search.vue index 9dee360..62322a4 100644 --- a/src/layout/components/TopBar/search.vue +++ b/src/layout/components/TopBar/search.vue @@ -3,12 +3,12 @@ <el-dialog v-model="state.isShowSearch" destroy-on-close :show-close="false"> <template #footer> <el-autocomplete + ref="layoutMenuAutocompleteRef" v-model="state.menuQuery" :fetch-suggestions="menuSearch" placeholder="鎼滅储" - ref="layoutMenuAutocompleteRef" - @select="onHandleSelect" :fit-input-width="true" + @select="onHandleSelect" > <template #prefix> <svg-icon class-name="search-icon" icon-class="search" /> @@ -29,130 +29,129 @@ import { getNormalPath } from '@/utils/ruoyi'; import { isHttp } from '@/utils/validate'; import usePermissionStore from '@/store/modules/permission'; -import { RouteOption } from 'vue-router'; +import { RouteRecordRaw } from 'vue-router'; type Router = Array<{ - path: string; - icon: string; - title: string[]; -}> + path: string; + icon: string; + title: string[]; +}>; type SearchState<T = any> = { - isShowSearch: boolean; - menuQuery: string; - menuList: T[]; + isShowSearch: boolean; + menuQuery: string; + menuList: T[]; }; // 瀹氫箟鍙橀噺鍐呭 const layoutMenuAutocompleteRef = ref(); const router = useRouter(); const routes = computed(() => usePermissionStore().routes); const state = reactive<SearchState>({ - isShowSearch: false, - menuQuery: '', - menuList: [], + isShowSearch: false, + menuQuery: '', + menuList: [] }); // 鎼滅储寮圭獥鎵撳紑 const openSearch = () => { - state.menuQuery = ''; - state.isShowSearch = true; - state.menuList = generateRoutes(routes.value); - nextTick(() => { - setTimeout(() => { - layoutMenuAutocompleteRef.value.focus(); - }); - }); + state.menuQuery = ''; + state.isShowSearch = true; + state.menuList = generateRoutes(routes.value); + nextTick(() => { + setTimeout(() => { + layoutMenuAutocompleteRef.value.focus(); + }); + }); }; // 鎼滅储寮圭獥鍏抽棴 const closeSearch = () => { - state.isShowSearch = false; + state.isShowSearch = false; }; // 鑿滃崟鎼滅储鏁版嵁杩囨护 const menuSearch = (queryString: string, cb: Function) => { - let options = state.menuList.filter((item) => { - return item.title.indexOf(queryString) > -1; - }); - cb(options); + let options = state.menuList.filter((item) => { + return item.title.indexOf(queryString) > -1; + }); + cb(options); }; // Filter out the routes that can be displayed in the sidebar // And generate the internationalized title -const generateRoutes = (routes: RouteOption[], basePath = '', prefixTitle: string[] = []) => { - let res: Router = [] - routes.forEach(r => { - // skip hidden router - if (!r.hidden) { - const p = r.path.length > 0 && r.path[0] === '/' ? r.path : '/' + r.path; - const data: any = { - path: !isHttp(r.path) ? getNormalPath(basePath + p) : r.path, - icon: r.meta?.icon, - title: [...prefixTitle] - } - if (r.meta && r.meta.title) { - data.title = [...data.title, r.meta.title]; - if (r.redirect !== 'noRedirect') { - // only push the routes with title - // special case: need to exclude parent router without redirect - res.push(data); - } - } - // recursive child routes - if (r.children) { - const tempRoutes = generateRoutes(r.children, data.path, data.title); - if (tempRoutes.length >= 1) { - res = [...res, ...tempRoutes]; - } - } - } - }) - res.forEach((item: any) => { - if (item.title instanceof Array) { - item.title = item.title.join('/'); - } - }); - return res; -} +const generateRoutes = (routes: RouteRecordRaw[], basePath = '', prefixTitle: string[] = []) => { + let res: Router = []; + routes.forEach((r) => { + // skip hidden router + if (!r.hidden) { + const p = r.path.length > 0 && r.path[0] === '/' ? r.path : '/' + r.path; + const data: any = { + path: !isHttp(r.path) ? getNormalPath(basePath + p) : r.path, + icon: r.meta?.icon, + title: [...prefixTitle] + }; + if (r.meta && r.meta.title) { + data.title = [...data.title, r.meta.title]; + if (r.redirect !== 'noRedirect') { + // only push the routes with title + // special case: need to exclude parent router without redirect + res.push(data); + } + } + // recursive child routes + if (r.children) { + const tempRoutes = generateRoutes(r.children, data.path, data.title); + if (tempRoutes.length >= 1) { + res = [...res, ...tempRoutes]; + } + } + } + }); + res.forEach((item: any) => { + if (item.title instanceof Array) { + item.title = item.title.join('/'); + } + }); + return res; +}; // 褰撳墠鑿滃崟閫変腑鏃� const onHandleSelect = (val: any) => { - const paths = val.path; - if (isHttp(paths)) { - // http(s):// 璺緞鏂扮獥鍙f墦寮� - const pindex = paths.indexOf("http"); - window.open(paths.substring(pindex, paths.length), "_blank"); - } else { - router.push(paths); - } - state.menuQuery = '' - closeSearch(); - + const paths = val.path; + if (isHttp(paths)) { + // http(s):// 璺緞鏂扮獥鍙f墦寮� + const pindex = paths.indexOf('http'); + window.open(paths.substring(pindex, paths.length), '_blank'); + } else { + router.push(paths); + } + state.menuQuery = ''; + closeSearch(); }; // 鏆撮湶鍙橀噺 defineExpose({ - openSearch + openSearch }); </script> <style scoped lang="scss"> .layout-search-dialog { - position: relative; - :deep(.el-dialog) { - .el-dialog__header, - .el-dialog__body { - display: none; - } - .el-dialog__footer { - width: 100%; - position: absolute; - left: 50%; - transform: translateX(-50%); - top: -53vh; - } - } - :deep(.el-autocomplete) { - width: 560px; - position: absolute; - top: 150px; - left: 50%; - transform: translateX(-50%); - } + position: relative; + :deep(.el-dialog) { + .el-dialog__header, + .el-dialog__body { + display: none; + } + .el-dialog__footer { + width: 100%; + position: absolute; + left: 50%; + transform: translateX(-50%); + top: -53vh; + } + } + :deep(.el-autocomplete) { + width: 560px; + position: absolute; + top: 150px; + left: 50%; + transform: translateX(-50%); + } } </style> diff --git a/src/layout/components/notice/index.vue b/src/layout/components/notice/index.vue index ef4a6a9..e43b2b8 100644 --- a/src/layout/components/notice/index.vue +++ b/src/layout/components/notice/index.vue @@ -1,12 +1,12 @@ <template> - <div class="layout-navbars-breadcrumb-user-news" v-loading="state.loading"> + <div v-loading="state.loading" class="layout-navbars-breadcrumb-user-news"> <div class="head-box"> <div class="head-box-title">閫氱煡鍏憡</div> <div class="head-box-btn" @click="readAll">鍏ㄩ儴宸茶</div> </div> - <div class="content-box" v-loading="state.loading"> + <div v-loading="state.loading" class="content-box"> <template v-if="newsList.length > 0"> - <div class="content-box-item" v-for="(v, k) in newsList" :key="k" @click="onNewsClick(k)"> + <div v-for="(v, k) in newsList" :key="k" class="content-box-item" @click="onNewsClick(k)"> <div class="item-conten"> <div>{{ v.message }}</div> <div class="content-box-msg"></div> @@ -17,26 +17,24 @@ <span v-else class="el-tag el-tag--danger el-tag--mini read">鏈</span> </div> </template> - <el-empty :description="'娑堟伅涓虹┖'" v-else></el-empty> + <el-empty v-else :description="'娑堟伅涓虹┖'"></el-empty> </div> - <div class="foot-box" @click="onGoToGiteeClick" v-if="newsList.length > 0">鍓嶅線gitee</div> + <div v-if="newsList.length > 0" class="foot-box" @click="onGoToGiteeClick">鍓嶅線gitee</div> </div> </template> <script setup lang="ts" name="layoutBreadcrumbUserNews"> -import { ref } from "vue"; -import { storeToRefs } from 'pinia' -import { nextTick, onMounted, reactive } from "vue"; +import { storeToRefs } from 'pinia'; import useNoticeStore from '@/store/modules/notice'; const noticeStore = storeToRefs(useNoticeStore()); -const {readAll} = useNoticeStore(); +const { readAll } = useNoticeStore(); // 瀹氫箟鍙橀噺鍐呭 const state = reactive({ - loading: false, + loading: false }); -const newsList =ref([]) as any; +const newsList = ref([]) as any; /** * 鍒濆鍖栨暟鎹� @@ -48,7 +46,6 @@ state.loading = false; }; - //鐐瑰嚮娑堟伅锛屽啓鍏ュ凡璇� const onNewsClick = (item: any) => { newsList.value[item].read = true; @@ -58,7 +55,7 @@ // 鍓嶅線閫氱煡涓績鐐瑰嚮 const onGoToGiteeClick = () => { - window.open("https://gitee.com/dromara/RuoYi-Vue-Plus/tree/5.X/"); + window.open('https://gitee.com/dromara/RuoYi-Vue-Plus/tree/5.X/'); }; onMounted(() => { diff --git a/src/layout/index.vue b/src/layout/index.vue index 8239ed7..fa43e69 100644 --- a/src/layout/index.vue +++ b/src/layout/index.vue @@ -12,7 +12,7 @@ <settings ref="settingRef" /> </el-scrollbar> --> <div :class="{ 'fixed-header': fixedHeader }"> - <navbar ref="navbarRef" @setLayout="setLayout" /> + <navbar ref="navbarRef" @set-layout="setLayout" /> <tags-view v-if="needTagsView" /> </div> <app-main /> @@ -22,12 +22,12 @@ </template> <script setup lang="ts"> -import SideBar from './components/Sidebar/index.vue' -import { AppMain, Navbar, Settings, TagsView } from './components' -import useAppStore from '@/store/modules/app' -import useSettingsStore from '@/store/modules/settings' +import SideBar from './components/Sidebar/index.vue'; +import { AppMain, Navbar, Settings, TagsView } from './components'; +import useAppStore from '@/store/modules/app'; +import useSettingsStore from '@/store/modules/settings'; -const settingsStore = useSettingsStore() +const settingsStore = useSettingsStore(); const theme = computed(() => settingsStore.theme); const sidebar = computed(() => useAppStore().sidebar); const device = computed(() => useAppStore().device); @@ -35,48 +35,48 @@ const fixedHeader = computed(() => settingsStore.fixedHeader); const classObj = computed(() => ({ - hideSidebar: !sidebar.value.opened, - openSidebar: sidebar.value.opened, - withoutAnimation: sidebar.value.withoutAnimation, - mobile: device.value === 'mobile' -})) + hideSidebar: !sidebar.value.opened, + openSidebar: sidebar.value.opened, + withoutAnimation: sidebar.value.withoutAnimation, + mobile: device.value === 'mobile' +})); const { width } = useWindowSize(); const WIDTH = 992; // refer to Bootstrap's responsive design watchEffect(() => { - if (device.value === 'mobile' && sidebar.value.opened) { - useAppStore().closeSideBar({ withoutAnimation: false }) - } - if (width.value - 1 < WIDTH) { - useAppStore().toggleDevice('mobile') - useAppStore().closeSideBar({ withoutAnimation: true }) - } else { - useAppStore().toggleDevice('desktop') - } -}) + if (device.value === 'mobile' && sidebar.value.opened) { + useAppStore().closeSideBar({ withoutAnimation: false }); + } + if (width.value - 1 < WIDTH) { + useAppStore().toggleDevice('mobile'); + useAppStore().closeSideBar({ withoutAnimation: true }); + } else { + useAppStore().toggleDevice('desktop'); + } +}); -const navbarRef = ref(Navbar); -const settingRef = ref(Settings); +const navbarRef = ref<InstanceType<typeof Navbar>>(); +const settingRef = ref<InstanceType<typeof Settings>>(); onMounted(() => { nextTick(() => { - navbarRef.value.initTenantList(); - }) -}) + navbarRef.value?.initTenantList(); + }); +}); const handleClickOutside = () => { - useAppStore().closeSideBar({ withoutAnimation: false }) -} + useAppStore().closeSideBar({ withoutAnimation: false }); +}; const setLayout = () => { - settingRef.value.openSetting(); -} + settingRef.value?.openSetting(); +}; </script> <style lang="scss" scoped> - @import "@/assets/styles/mixin.scss"; - @import "@/assets/styles/variables.module.scss"; +@import '@/assets/styles/mixin.scss'; +@import '@/assets/styles/variables.module.scss'; .app-wrapper { @include clearfix; diff --git a/src/permission.ts b/src/permission.ts index c819ff4..402fdec 100644 --- a/src/permission.ts +++ b/src/permission.ts @@ -8,6 +8,7 @@ import useUserStore from '@/store/modules/user'; import useSettingsStore from '@/store/modules/settings'; import usePermissionStore from '@/store/modules/permission'; +import { RouteRecordRaw } from 'vue-router'; NProgress.configure({ showSpinner: false }); const whiteList = ['/login', '/register', '/social-callback']; @@ -35,7 +36,7 @@ isRelogin.show = false; const accessRoutes = await usePermissionStore().generateRoutes(); // 鏍规嵁roles鏉冮檺鐢熸垚鍙闂殑璺敱琛� - accessRoutes.forEach((route) => { + accessRoutes.forEach((route: RouteRecordRaw) => { if (!isHttp(route.path)) { router.addRoute(route); // 鍔ㄦ�佹坊鍔犲彲璁块棶璺敱琛� } @@ -48,7 +49,7 @@ } } else { // 娌℃湁token - if (whiteList.indexOf(to.path) !== -1) { + if (whiteList.indexOf(to.path as string) !== -1) { // 鍦ㄥ厤鐧诲綍鐧藉悕鍗曪紝鐩存帴杩涘叆 next(); } else { diff --git a/src/plugins/tab.ts b/src/plugins/tab.ts index 97442ff..259dfa5 100644 --- a/src/plugins/tab.ts +++ b/src/plugins/tab.ts @@ -1,6 +1,6 @@ import { useTagsViewStore } from '@/store/modules/tagsView'; import router from '@/router'; -import { TagView, RouteLocationRaw } from 'vue-router'; +import { TagView, RouteLocationMatched } from 'vue-router'; export default { /** @@ -10,7 +10,7 @@ async refreshPage(obj?: TagView): Promise<void> { const { path, query, matched } = router.currentRoute.value; if (obj === undefined) { - matched.forEach((m) => { + matched.forEach((m: RouteLocationMatched) => { if (m.components && m.components.default && m.components.default.name) { if (!['Layout', 'ParentView'].includes(m.components.default.name)) { obj = { name: m.components.default.name, path: path, query: query }; @@ -31,8 +31,8 @@ }); }, // 鍏抽棴褰撳墠tab椤电锛屾墦寮�鏂伴〉绛� - closeOpenPage(obj: RouteLocationRaw): void { - useTagsViewStore().delView(router.currentRoute.value); + closeOpenPage(obj: TagView): void { + useTagsViewStore().delView(router.currentRoute.value as any); if (obj !== undefined) { router.push(obj); } @@ -41,10 +41,10 @@ async closePage(obj?: TagView): Promise<{ visitedViews: TagView[]; cachedViews: string[] } | any> { if (obj === undefined) { // prettier-ignore - const { visitedViews } = await useTagsViewStore().delView(router.currentRoute.value) as any + const { visitedViews } = await useTagsViewStore().delView(router.currentRoute.value as any) const latestView = visitedViews.slice(-1)[0]; if (latestView) { - return router.push(latestView.fullPath); + return router.push(latestView.fullPath as any); } return router.push('/'); } @@ -56,15 +56,15 @@ }, // 鍏抽棴宸︿晶tab椤电 closeLeftPage(obj?: TagView) { - return useTagsViewStore().delLeftTags(obj || router.currentRoute.value); + return useTagsViewStore().delLeftTags(obj || (router.currentRoute.value as any)); }, // 鍏抽棴鍙充晶tab椤电 closeRightPage(obj?: TagView) { - return useTagsViewStore().delRightTags(obj || router.currentRoute.value); + return useTagsViewStore().delRightTags(obj || (router.currentRoute.value as any)); }, // 鍏抽棴鍏朵粬tab椤电 closeOtherPage(obj?: TagView) { - return useTagsViewStore().delOthersViews(obj || router.currentRoute.value); + return useTagsViewStore().delOthersViews(obj || (router.currentRoute.value as any)); }, /** * 鎵撳紑tab椤电 diff --git a/src/router/index.ts b/src/router/index.ts index 271385c..0792d8e 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,4 +1,4 @@ -import { createWebHistory, createRouter, RouteOption } from 'vue-router'; +import { createWebHistory, createRouter, RouteRecordRaw } from 'vue-router'; /* Layout */ import Layout from '@/layout/index.vue'; @@ -25,7 +25,7 @@ */ // 鍏叡璺敱 -export const constantRoutes: RouteOption[] = [ +export const constantRoutes: RouteRecordRaw[] = [ { path: '/redirect', component: Layout, @@ -92,7 +92,7 @@ ]; // 鍔ㄦ�佽矾鐢憋紝鍩轰簬鐢ㄦ埛鏉冮檺鍔ㄦ�佸幓鍔犺浇 -export const dynamicRoutes: RouteOption[] = [ +export const dynamicRoutes: RouteRecordRaw[] = [ { path: '/system/user-auth', component: Layout, diff --git a/src/store/modules/notice.ts b/src/store/modules/notice.ts index f3f8e5a..de980b6 100644 --- a/src/store/modules/notice.ts +++ b/src/store/modules/notice.ts @@ -22,7 +22,7 @@ //瀹炵幇鍏ㄩ儴宸茶 const readAll = () => { - state.notices.forEach((item) => { + state.notices.forEach((item: any) => { item.read = true; }); }; diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index ed64e46..14d2387 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -2,35 +2,36 @@ import router, { constantRoutes, dynamicRoutes } from '@/router'; import store from '@/store'; import { getRouters } from '@/api/menu'; +import auth from '@/plugins/auth'; +import { RouteRecordRaw } from 'vue-router'; + import Layout from '@/layout/index.vue'; import ParentView from '@/components/ParentView/index.vue'; import InnerLink from '@/layout/components/InnerLink/index.vue'; -import auth from '@/plugins/auth'; -import { RouteOption } from 'vue-router'; + // 鍖归厤views閲岄潰鎵�鏈夌殑.vue鏂囦欢 const modules = import.meta.glob('./../../views/**/*.vue'); - export const usePermissionStore = defineStore('permission', () => { - const routes = ref<RouteOption[]>([]); - const addRoutes = ref<RouteOption[]>([]); - const defaultRoutes = ref<RouteOption[]>([]); - const topbarRouters = ref<RouteOption[]>([]); - const sidebarRouters = ref<RouteOption[]>([]); + const routes = ref<RouteRecordRaw[]>([]); + const addRoutes = ref<RouteRecordRaw[]>([]); + const defaultRoutes = ref<RouteRecordRaw[]>([]); + const topbarRouters = ref<RouteRecordRaw[]>([]); + const sidebarRouters = ref<RouteRecordRaw[]>([]); - const setRoutes = (newRoutes: RouteOption[]): void => { + const setRoutes = (newRoutes: RouteRecordRaw[]): void => { addRoutes.value = newRoutes; routes.value = constantRoutes.concat(newRoutes); }; - const setDefaultRoutes = (routes: RouteOption[]): void => { + const setDefaultRoutes = (routes: RouteRecordRaw[]): void => { defaultRoutes.value = constantRoutes.concat(routes); }; - const setTopbarRoutes = (routes: RouteOption[]): void => { + const setTopbarRoutes = (routes: RouteRecordRaw[]): void => { topbarRouters.value = routes; }; - const setSidebarRouters = (routes: RouteOption[]): void => { + const setSidebarRouters = (routes: RouteRecordRaw[]): void => { sidebarRouters.value = routes; }; - const generateRoutes = async (): Promise<RouteOption[]> => { + const generateRoutes = async (): Promise<RouteRecordRaw[]> => { const res = await getRouters(); const { data } = res; const sdata = JSON.parse(JSON.stringify(data)); @@ -47,7 +48,7 @@ setSidebarRouters(constantRoutes.concat(sidebarRoutes)); setDefaultRoutes(sidebarRoutes); setTopbarRoutes(defaultRoutes); - return new Promise<RouteOption[]>((resolve) => resolve(rewriteRoutes)); + return new Promise<RouteRecordRaw[]>((resolve) => resolve(rewriteRoutes)); }; /** @@ -56,22 +57,20 @@ * @param lastRouter 涓婁竴绾ц矾鐢� * @param type 鏄惁鏄噸鍐欒矾鐢� */ - const filterAsyncRouter = (asyncRouterMap: RouteOption[], lastRouter?: RouteOption, type = false): RouteOption[] => { + const filterAsyncRouter = (asyncRouterMap: RouteRecordRaw[], lastRouter?: RouteRecordRaw, type = false): RouteRecordRaw[] => { return asyncRouterMap.filter((route) => { if (type && route.children) { route.children = filterChildren(route.children, undefined); } - if (route.component) { - // Layout ParentView 缁勪欢鐗规畩澶勭悊 - if (route.component === 'Layout') { - route.component = Layout; - } else if (route.component === 'ParentView') { - route.component = ParentView; - } else if (route.component === 'InnerLink') { - route.component = InnerLink; - } else { - route.component = loadView(route.component); - } + // Layout ParentView 缁勪欢鐗规畩澶勭悊 + if (route.component?.toString() === 'Layout') { + route.component = Layout; + } else if (route.component?.toString() === 'ParentView') { + route.component = ParentView; + } else if (route.component?.toString() === 'InnerLink') { + route.component = InnerLink; + } else { + route.component = loadView(route.component); } if (route.children != null && route.children && route.children.length) { route.children = filterAsyncRouter(route.children, route, type); @@ -82,11 +81,11 @@ return true; }); }; - const filterChildren = (childrenMap: RouteOption[], lastRouter?: RouteOption): RouteOption[] => { - let children: RouteOption[] = []; + const filterChildren = (childrenMap: RouteRecordRaw[], lastRouter?: RouteRecordRaw): RouteRecordRaw[] => { + let children: RouteRecordRaw[] = []; childrenMap.forEach((el) => { if (el.children && el.children.length) { - if (el.component === 'ParentView' && !lastRouter) { + if (el.component?.toString() === 'ParentView' && !lastRouter) { el.children.forEach((c) => { c.path = el.path + '/' + c.path; if (c.children && c.children.length) { @@ -101,8 +100,8 @@ if (lastRouter) { el.path = lastRouter.path + '/' + el.path; if (el.children && el.children.length) { - children = children.concat(filterChildren(el.children, el)) - return + children = children.concat(filterChildren(el.children, el)); + return; } } children = children.concat(el); @@ -113,8 +112,8 @@ }); // 鍔ㄦ�佽矾鐢遍亶鍘嗭紝楠岃瘉鏄惁鍏峰鏉冮檺 -export const filterDynamicRoutes = (routes: RouteOption[]) => { - const res: RouteOption[] = []; +export const filterDynamicRoutes = (routes: RouteRecordRaw[]) => { + const res: RouteRecordRaw[] = []; routes.forEach((route) => { if (route.permissions) { if (auth.hasPermiOr(route.permissions)) { diff --git a/src/store/modules/settings.ts b/src/store/modules/settings.ts index fcf595c..861c6c8 100644 --- a/src/store/modules/settings.ts +++ b/src/store/modules/settings.ts @@ -2,26 +2,34 @@ import defaultSettings from '@/settings'; import { SettingTypeEnum } from '@/enums/SettingTypeEnum'; import { useDynamicTitle } from '@/utils/dynamicTitle'; -import { Ref } from 'vue'; - export const useSettingsStore = defineStore('setting', () => { const storageSetting = JSON.parse(localStorage.getItem('layout-setting') || '{}'); + const title = ref<string>(defaultSettings.title); + const theme = ref<string>(storageSetting.theme || defaultSettings.theme); + const sideTheme = ref<string>(storageSetting.sideTheme || defaultSettings.sideTheme); + const showSettings = ref<boolean>(storageSetting.showSettings || defaultSettings.showSettings); + const topNav = ref<boolean>(storageSetting.topNav === undefined ? defaultSettings.topNav : storageSetting.topNav); + const tagsView = ref<boolean>(storageSetting.tagsView === undefined ? defaultSettings.tagsView : storageSetting.tagsView); + const fixedHeader = ref<boolean>(storageSetting.fixedHeader === undefined ? defaultSettings.fixedHeader : storageSetting.fixedHeader); + const sidebarLogo = ref<boolean>(storageSetting.sidebarLogo === undefined ? defaultSettings.sidebarLogo : storageSetting.sidebarLogo); + const dynamicTitle = ref<boolean>(storageSetting.dynamicTitle === undefined ? defaultSettings.dynamicTitle : storageSetting.dynamicTitle); + const animationEnable = ref<boolean>( + storageSetting.animationEnable === undefined ? defaultSettings.animationEnable : storageSetting.animationEnable + ); + const dark = ref<boolean>(storageSetting.dark || defaultSettings.dark); const prop: { [key: string]: Ref<any> } = { - title: ref<string>(''), - theme: ref<string>(storageSetting.theme || defaultSettings.theme), - sideTheme: ref<string>(storageSetting.sideTheme || defaultSettings.sideTheme), - showSettings: ref<boolean>(storageSetting.showSettings || defaultSettings.showSettings), - topNav: ref<boolean>(storageSetting.topNav === undefined ? defaultSettings.topNav : storageSetting.topNav), - tagsView: ref<boolean>(storageSetting.tagsView === undefined ? defaultSettings.tagsView : storageSetting.tagsView), - fixedHeader: ref<boolean>(storageSetting.fixedHeader === undefined ? defaultSettings.fixedHeader : storageSetting.fixedHeader), - sidebarLogo: ref<boolean>(storageSetting.sidebarLogo === undefined ? defaultSettings.sidebarLogo : storageSetting.sidebarLogo), - dynamicTitle: ref<boolean>(storageSetting.dynamicTitle === undefined ? defaultSettings.dynamicTitle : storageSetting.dynamicTitle), - animationEnable: ref<boolean>(storageSetting.animationEnable === undefined ? defaultSettings.animationEnable : storageSetting.animationEnable), - dark: ref<boolean>(storageSetting.dark || defaultSettings.dark) + theme, + sideTheme, + showSettings, + topNav, + tagsView, + fixedHeader, + sidebarLogo, + dynamicTitle, + animationEnable, + dark }; - - const { title, theme, sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle, animationEnable, dark } = prop; // actions const changeSetting = (param: { key: SettingTypeEnum; value: any }) => { diff --git a/src/store/modules/tagsView.ts b/src/store/modules/tagsView.ts index 1c1c9a2..3456b38 100644 --- a/src/store/modules/tagsView.ts +++ b/src/store/modules/tagsView.ts @@ -11,7 +11,7 @@ }; const addIframeView = (view: TagView): void => { - if (iframeViews.value.some((v) => v.path === view.path)) return; + if (iframeViews.value.some((v: TagView) => v.path === view.path)) return; iframeViews.value.push( Object.assign({}, view, { title: view.meta?.title || 'no-name' @@ -20,12 +20,12 @@ }; const delIframeView = (view: TagView): Promise<TagView[]> => { return new Promise((resolve) => { - iframeViews.value = iframeViews.value.filter((item) => item.path !== view.path); + iframeViews.value = iframeViews.value.filter((item: TagView) => item.path !== view.path); resolve([...iframeViews.value]); }); }; const addVisitedView = (view: TagView): void => { - if (visitedViews.value.some((v) => v.path === view.path)) return; + if (visitedViews.value.some((v: TagView) => v.path === view.path)) return; visitedViews.value.push( Object.assign({}, view, { title: view.meta?.title || 'no-name' @@ -80,7 +80,7 @@ const delOthersVisitedViews = (view: TagView): Promise<TagView[]> => { return new Promise((resolve) => { - visitedViews.value = visitedViews.value.filter((v) => { + visitedViews.value = visitedViews.value.filter((v: TagView) => { return v.meta?.affix || v.path === view.path; }); resolve([...visitedViews.value]); @@ -111,7 +111,7 @@ }; const delAllVisitedViews = (): Promise<TagView[]> => { return new Promise((resolve) => { - visitedViews.value = visitedViews.value.filter((tag) => tag.meta?.affix); + visitedViews.value = visitedViews.value.filter((tag: TagView) => tag.meta?.affix); resolve([...visitedViews.value]); }); }; @@ -123,7 +123,7 @@ }); }; - const updateVisitedView = (view: TagView): void => { + const updateVisitedView = (view: TagView | RouteLocationNormalized): void => { for (let v of visitedViews.value) { if (v.path === view.path) { v = Object.assign(v, view); @@ -133,11 +133,11 @@ }; const delRightTags = (view: TagView): Promise<TagView[]> => { return new Promise((resolve) => { - const index = visitedViews.value.findIndex((v) => v.path === view.path); + const index = visitedViews.value.findIndex((v: TagView) => v.path === view.path); if (index === -1) { return; } - visitedViews.value = visitedViews.value.filter((item, idx) => { + visitedViews.value = visitedViews.value.filter((item: TagView, idx: number) => { if (idx <= index || (item.meta && item.meta.affix)) { return true; } @@ -152,11 +152,11 @@ }; const delLeftTags = (view: TagView): Promise<TagView[]> => { return new Promise((resolve) => { - const index = visitedViews.value.findIndex((v) => v.path === view.path); + const index = visitedViews.value.findIndex((v: TagView) => v.path === view.path); if (index === -1) { return; } - visitedViews.value = visitedViews.value.filter((item, idx) => { + visitedViews.value = visitedViews.value.filter((item: TagView, idx: number) => { if (idx >= index || (item.meta && item.meta.affix)) { return true; } @@ -170,7 +170,7 @@ }); }; - const addCachedView = (view: TagView): void => { + const addCachedView = (view: TagView | RouteLocationNormalized): void => { const viewName = view.name as string; if (!viewName) return; if (cachedViews.value.includes(viewName)) return; diff --git a/src/types/element.d.ts b/src/types/element.d.ts index ba7598d..13fb8db 100644 --- a/src/types/element.d.ts +++ b/src/types/element.d.ts @@ -1,12 +1,12 @@ import type * as ep from 'element-plus'; declare global { declare type ElTagType = '' | 'success' | 'warning' | 'info' | 'danger' | 'default' | 'primary'; - declare type ElFormInstance = InstanceType<typeof ep.ElForm>; - declare type ElTableInstance = InstanceType<typeof ep.ElTable>; + declare type ElFormInstance = ep.FormInstance; + declare type ElTableInstance = ep.TableInstance; + declare type ElUploadInstance = ep.UploadInstance; declare type ElTreeInstance = InstanceType<typeof ep.ElTree>; declare type ElTreeSelectInstance = InstanceType<typeof ep.ElTreeSelect>; declare type ElSelectInstance = InstanceType<typeof ep.ElSelect>; - declare type ElUploadInstance = InstanceType<typeof ep.ElUpload>; declare type ElCardInstance = InstanceType<typeof ep.ElCard>; declare type ElDialogInstance = InstanceType<typeof ep.ElDialog>; declare type ElInputInstance = InstanceType<typeof ep.ElInput>; diff --git a/src/types/env.d.ts b/src/types/env.d.ts index 9560307..b521b38 100644 --- a/src/types/env.d.ts +++ b/src/types/env.d.ts @@ -1,8 +1,9 @@ declare module '*.vue' { import { DefineComponent } from 'vue'; - const component: DefineComponent<{}, {}, any>; - export default component; + const Component: DefineComponent<{}, {}, any>; + export default Component; } + declare module '*.avif' { const src: string; export default src; diff --git a/src/types/global.d.ts b/src/types/global.d.ts index 32081bf..bb1c1e2 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -1,4 +1,4 @@ -import type { ComponentInternalInstance as ComponentInstance, PropType as VuePropType } from 'vue'; +import type { ComponentInternalInstance as ComponentInstance, PropType as VuePropType } from 'vue/runtime-core'; declare global { /** vue Instance */ @@ -87,5 +87,76 @@ pageNum: number; pageSize: number; } + + declare type DefaultSettings = { + /** + * 缃戦〉鏍囬 + */ + title: string; + + /** + * 渚ц竟鏍忎富棰� theme-dark | theme-light + */ + sideTheme?: string; + + /** + * 鏄惁鏄剧ず绯荤粺甯冨眬璁剧疆 + */ + showSettings?: boolean; + + /** + * 鏄惁鏄剧ず椤堕儴瀵艰埅 + */ + topNav?: boolean; + + /** + * 鏄惁鏄剧ず澶氭爣绛惧鑸� + */ + tagsView?: boolean; + /** + * 鏄惁鍥哄畾澶撮儴 + */ + fixedHeader?: boolean; + /** + * 鏄惁鏄剧ず渚ц竟鏍廘ogo + */ + sidebarLogo?: boolean; + /** + * 瀵艰埅鏍忓竷灞� + */ + layout?: string; + /** + * 涓婚妯″紡 + */ + theme?: string; + + /** + * 甯冨眬澶у皬 + */ + size?: string; + + /** + * 璇█ + */ + language?: string; + + /** + * 鏄惁鏄剧ず鍔ㄦ�佹爣棰� + */ + dynamicTitle?: boolean; + /** + * 鏄惁鍚敤鍔ㄧ敾鏁堟灉 + */ + animationEnable?: boolean; + /** + * 鏄惁鍚敤鏆楅粦妯″紡 + * + * true:鏆楅粦妯″紡 + * false: 鏄庝寒妯″紡 + */ + dark?: boolean; + + errorLog?: string; + }; } export {}; diff --git a/src/types/router.d.ts b/src/types/router.d.ts index 9731fa2..b161040 100644 --- a/src/types/router.d.ts +++ b/src/types/router.d.ts @@ -1,36 +1,34 @@ -import { RouteRecordRaw } from 'vue-router'; - +import { LocationQuery, type RouteMeta as VRouteMeta } from 'vue-router'; declare module 'vue-router' { - declare type RouteOption = { - hidden?: boolean; + interface RouteMeta extends VRouteMeta { + link?: string; + title?: string; + affix?: boolean; + noCache?: boolean; + activeMenu?: string; + icon?: string; + breadcrumb?: boolean; + } + + interface _RouteRecordBase { + hidden?: boolean | string | number; permissions?: string[]; roles?: string[]; - component?: any; - children?: RouteOption[]; alwaysShow?: boolean; - parentPath?: string; - meta?: { - title: string; - icon: string; - }; query?: string; - } & RouteRecordRaw; - - declare interface _RouteLocationBase { - children?: RouteOption[]; } - declare interface RouteLocationOptions { + interface _RouteLocationBase { + children?: _RouteRecordBase[]; + path?: string; + } + + interface TagView { fullPath?: string; - } - - declare interface TagView extends Partial<_RouteLocationBase> { + name?: string; + path?: string; title?: string; - meta?: { - link?: string; - title?: string; - affix?: boolean; - noCache?: boolean; - }; + meta?: RouteMeta; + query?: LocationQuery; } } diff --git a/src/types/setting.d.ts b/src/types/setting.d.ts deleted file mode 100644 index 1b5f9fd..0000000 --- a/src/types/setting.d.ts +++ /dev/null @@ -1,70 +0,0 @@ -declare type DefaultSettings = { - /** - * 缃戦〉鏍囬 - */ - title?: string; - - /** - * 渚ц竟鏍忎富棰� theme-dark | theme-light - */ - sideTheme?: string; - - /** - * 鏄惁鏄剧ず绯荤粺甯冨眬璁剧疆 - */ - showSettings?: boolean; - - /** - * 鏄惁鏄剧ず椤堕儴瀵艰埅 - */ - topNav?: boolean; - - /** - * 鏄惁鏄剧ず澶氭爣绛惧鑸� - */ - tagsView?: boolean; - /** - * 鏄惁鍥哄畾澶撮儴 - */ - fixedHeader?: boolean; - /** - * 鏄惁鏄剧ず渚ц竟鏍廘ogo - */ - sidebarLogo?: boolean; - /** - * 瀵艰埅鏍忓竷灞� - */ - layout?: string; - /** - * 涓婚妯″紡 - */ - theme?: string; - - /** - * 甯冨眬澶у皬 - */ - size?: string; - - /** - * 璇█ - */ - language?: string; - - /** - * 鏄惁鏄剧ず鍔ㄦ�佹爣棰� - */ - dynamicTitle?: boolean; - /** - * 鏄惁鍚敤鍔ㄧ敾鏁堟灉 - */ - animationEnable?: boolean; - /** - * 鏄惁鍚敤鏆楅粦妯″紡 - * - * true:鏆楅粦妯″紡 - * false: 鏄庝寒妯″紡 - */ - dark?: boolean; - - errorLog?: string; -}; diff --git a/src/utils/propTypes.ts b/src/utils/propTypes.ts index 1847040..24d861d 100644 --- a/src/utils/propTypes.ts +++ b/src/utils/propTypes.ts @@ -3,6 +3,7 @@ type PropTypes = VueTypesInterface & { readonly style: VueTypeValidableDef<CSSProperties>; + readonly fieldOption: VueTypeValidableDef<Array<FieldOption>>; }; const propTypes = createTypes({ diff --git a/src/utils/request.ts b/src/utils/request.ts index a183ca6..6135d69 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -89,7 +89,6 @@ return config; }, (error: any) => { - console.log(error); return Promise.reject(error); } ); @@ -138,7 +137,6 @@ } return Promise.reject('鏃犳晥鐨勪細璇濓紝鎴栬�呬細璇濆凡杩囨湡锛岃閲嶆柊鐧诲綍銆�'); } else if (code === HttpStatus.SERVER_ERROR) { - console.log(msg); ElMessage({ message: msg, type: 'error' }); return Promise.reject(new Error(msg)); } else if (code === HttpStatus.WARN) { diff --git a/src/utils/websocket.ts b/src/utils/websocket.ts index a4529f9..7add725 100644 --- a/src/utils/websocket.ts +++ b/src/utils/websocket.ts @@ -20,7 +20,7 @@ import { getToken } from '@/utils/auth'; import useNoticeStore from '@/store/modules/notice'; -import { ElNotification } from "element-plus"; +import { ElNotification } from 'element-plus'; const { addNotice } = useNoticeStore(); @@ -135,7 +135,7 @@ message: e.data, type: 'success', duration: 3000 - }) + }); return e.data; }; }; diff --git a/src/views/demo/demo/index.vue b/src/views/demo/demo/index.vue index a7f3bd7..1430a54 100644 --- a/src/views/demo/demo/index.vue +++ b/src/views/demo/demo/index.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="閮ㄩ棬id" prop="deptId"> <el-input v-model="queryParams.deptId" placeholder="璇疯緭鍏ラ儴闂╥d" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> @@ -32,26 +32,26 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['demo:demo:add']">鏂板</el-button> + <el-button v-hasPermi="['demo:demo:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['demo:demo:edit']">淇敼</el-button> + <el-button v-hasPermi="['demo:demo:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">淇敼</el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['demo:demo:remove']" + <el-button v-hasPermi="['demo:demo:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" >鍒犻櫎</el-button > </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['demo:demo:export']">瀵煎嚭</el-button> + <el-button v-hasPermi="['demo:demo:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="demoList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="涓婚敭" align="center" prop="id" v-if="true" /> + <el-table-column v-if="true" label="涓婚敭" align="center" prop="id" /> <el-table-column label="閮ㄩ棬id" align="center" prop="deptId" /> <el-table-column label="鐢ㄦ埛id" align="center" prop="userId" /> <el-table-column label="鎺掑簭鍙�" align="center" prop="orderNum" /> @@ -60,19 +60,19 @@ <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['demo:demo:edit']"></el-button> + <el-button v-hasPermi="['demo:demo:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['demo:demo:remove']"></el-button> + <el-button v-hasPermi="['demo:demo:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀规祴璇曞崟瀵硅瘽妗� --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-form ref="demoFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="閮ㄩ棬id" prop="deptId"> <el-input v-model="form.deptId" placeholder="璇疯緭鍏ラ儴闂╥d" /> @@ -129,8 +129,8 @@ userId: undefined, orderNum: undefined, testKey: undefined, - value: undefined, -} + value: undefined +}; const data = reactive<PageData<DemoForm, DemoQuery>>({ form: { ...initFormData }, queryParams: { @@ -140,27 +140,15 @@ userId: undefined, orderNum: undefined, testKey: undefined, - value: undefined, + value: undefined }, rules: { - id: [ - { required: true, message: "涓婚敭涓嶈兘涓虹┖", trigger: "blur" } - ], - deptId: [ - { required: true, message: "閮ㄩ棬id涓嶈兘涓虹┖", trigger: "blur" } - ], - userId: [ - { required: true, message: "鐢ㄦ埛id涓嶈兘涓虹┖", trigger: "blur" } - ], - orderNum: [ - { required: true, message: "鎺掑簭鍙蜂笉鑳戒负绌�", trigger: "blur" } - ], - testKey: [ - { required: true, message: "key閿笉鑳戒负绌�", trigger: "blur" } - ], - value: [ - { required: true, message: "鍊间笉鑳戒负绌�", trigger: "blur" } - ], + id: [{ required: true, message: '涓婚敭涓嶈兘涓虹┖', trigger: 'blur' }], + deptId: [{ required: true, message: '閮ㄩ棬id涓嶈兘涓虹┖', trigger: 'blur' }], + userId: [{ required: true, message: '鐢ㄦ埛id涓嶈兘涓虹┖', trigger: 'blur' }], + orderNum: [{ required: true, message: '鎺掑簭鍙蜂笉鑳戒负绌�', trigger: 'blur' }], + testKey: [{ required: true, message: 'key閿笉鑳戒负绌�', trigger: 'blur' }], + value: [{ required: true, message: '鍊间笉鑳戒负绌�', trigger: 'blur' }] } }); @@ -173,55 +161,55 @@ demoList.value = res.rows; total.value = res.total; loading.value = false; -} +}; /** 鍙栨秷鎸夐挳 */ const cancel = () => { reset(); dialog.visible = false; -} +}; /** 琛ㄥ崟閲嶇疆 */ const reset = () => { form.value = { ...initFormData }; demoFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: DemoVO[]) => { - ids.value = selection.map(item => item.id); + ids.value = selection.map((item) => item.id); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { reset(); dialog.visible = true; - dialog.title = "娣诲姞娴嬭瘯鍗�"; -} + dialog.title = '娣诲姞娴嬭瘯鍗�'; +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: DemoVO) => { reset(); - const _id = row?.id || ids.value[0] + const _id = row?.id || ids.value[0]; const res = await getDemo(_id); Object.assign(form.value, res.data); dialog.visible = true; - dialog.title = "淇敼娴嬭瘯鍗�"; -} + dialog.title = '淇敼娴嬭瘯鍗�'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { @@ -229,32 +217,36 @@ if (valid) { buttonLoading.value = true; if (form.value.id) { - await updateDemo(form.value).finally(() => buttonLoading.value = false); + await updateDemo(form.value).finally(() => (buttonLoading.value = false)); } else { - await addDemo(form.value).finally(() => buttonLoading.value = false); + await addDemo(form.value).finally(() => (buttonLoading.value = false)); } - proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + proxy?.$modal.msgSuccess('淇敼鎴愬姛'); dialog.visible = false; await getList(); } }); -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: DemoVO) => { const _ids = row?.id || ids.value; - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎娴嬭瘯鍗曠紪鍙蜂负"' + _ids + '"鐨勬暟鎹」锛�').finally(() => loading.value = false); + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎娴嬭瘯鍗曠紪鍙蜂负"' + _ids + '"鐨勬暟鎹」锛�').finally(() => (loading.value = false)); await delDemo(_ids); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); await getList(); -} +}; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download('demo/demo/export', { - ...queryParams.value - }, `demo_${new Date().getTime()}.xlsx`) -} + proxy?.download( + 'demo/demo/export', + { + ...queryParams.value + }, + `demo_${new Date().getTime()}.xlsx` + ); +}; onMounted(() => { getList(); diff --git a/src/views/demo/tree/index.vue b/src/views/demo/tree/index.vue index d79f817..5dfda6c 100644 --- a/src/views/demo/tree/index.vue +++ b/src/views/demo/tree/index.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="鏍戣妭鐐瑰悕" prop="treeName"> <el-input v-model="queryParams.treeName" placeholder="璇疯緭鍏ユ爲鑺傜偣鍚�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> @@ -20,21 +20,21 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['demo:tree:add']">鏂板</el-button> + <el-button v-hasPermi="['demo:tree:add']" type="primary" plain icon="Plus" @click="handleAdd()">鏂板</el-button> </el-col> <el-col :span="1.5"> <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">灞曞紑/鎶樺彔</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table + ref="treeTableRef" v-loading="loading" :data="treeList" row-key="id" :default-expand-all="isExpandAll" - :tree-props="{children: 'children', hasChildren: 'hasChildren'}" - ref="treeTableRef" + :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" > <el-table-column label="鐖秈d" align="center" prop="parentId" /> <el-table-column label="閮ㄩ棬id" align="center" prop="deptId" /> @@ -43,20 +43,20 @@ <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['demo:tree:edit']" /> + <el-button v-hasPermi="['demo:tree:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)" /> </el-tooltip> <el-tooltip content="鏂板" placement="top"> - <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['demo:tree:add']" /> + <el-button v-hasPermi="['demo:tree:add']" link type="primary" icon="Plus" @click="handleAdd(scope.row)" /> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['demo:tree:remove']" /> + <el-button v-hasPermi="['demo:tree:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)" /> </el-tooltip> </template> </el-table-column> </el-table> </el-card> <!-- 娣诲姞鎴栦慨鏀规祴璇曟爲瀵硅瘽妗� --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-form ref="treeFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="鐖秈d" prop="parentId"> <el-tree-select @@ -89,18 +89,16 @@ </template> <script setup name="Tree" lang="ts"> -import { listTree, getTree, delTree, addTree, updateTree } from "@/api/demo/tree"; +import { listTree, getTree, delTree, addTree, updateTree } from '@/api/demo/tree'; import { TreeVO, TreeQuery, TreeForm } from '@/api/demo/tree/types'; - type TreeOption = { id: number; treeName: string; children?: TreeOption[]; -} +}; -const { proxy } = getCurrentInstance() as ComponentInternalInstance;; - +const { proxy } = getCurrentInstance() as ComponentInternalInstance; const treeList = ref<TreeVO[]>([]); const treeOptions = ref<TreeOption[]>([]); @@ -111,46 +109,35 @@ const queryFormRef = ref<ElFormInstance>(); const treeFormRef = ref<ElFormInstance>(); -const treeTableRef = ref<ElTableInstance>() +const treeTableRef = ref<ElTableInstance>(); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); - const initFormData: TreeForm = { - id: undefined, - parentId: undefined, - deptId: undefined, - userId: undefined, - treeName: undefined, -} + id: undefined, + parentId: undefined, + deptId: undefined, + userId: undefined, + treeName: undefined +}; const data = reactive<PageData<TreeForm, TreeQuery>>({ - form: {...initFormData}, + form: { ...initFormData }, queryParams: { parentId: undefined, deptId: undefined, userId: undefined, - treeName: undefined, + treeName: undefined }, rules: { - id: [ - { required: true, message: "涓婚敭涓嶈兘涓虹┖", trigger: "blur" } - ], - parentId: [ - { required: true, message: "鐖秈d涓嶈兘涓虹┖", trigger: "blur" } - ], - deptId: [ - { required: true, message: "閮ㄩ棬id涓嶈兘涓虹┖", trigger: "blur" } - ], - userId: [ - { required: true, message: "鐢ㄦ埛id涓嶈兘涓虹┖", trigger: "blur" } - ], - treeName: [ - { required: true, message: "鍊间笉鑳戒负绌�", trigger: "blur" } - ], + id: [{ required: true, message: '涓婚敭涓嶈兘涓虹┖', trigger: 'blur' }], + parentId: [{ required: true, message: '鐖秈d涓嶈兘涓虹┖', trigger: 'blur' }], + deptId: [{ required: true, message: '閮ㄩ棬id涓嶈兘涓虹┖', trigger: 'blur' }], + userId: [{ required: true, message: '鐢ㄦ埛id涓嶈兘涓虹┖', trigger: 'blur' }], + treeName: [{ required: true, message: '鍊间笉鑳戒负绌�', trigger: 'blur' }] } }); @@ -160,44 +147,44 @@ const getList = async () => { loading.value = true; const res = await listTree(queryParams.value); - const data = proxy?.handleTree<TreeVO>(res.data, "id", "parentId"); + const data = proxy?.handleTree<TreeVO>(res.data, 'id', 'parentId'); if (data) { treeList.value = data; loading.value = false; } -} +}; /** 鏌ヨ娴嬭瘯鏍戜笅鎷夋爲缁撴瀯 */ const getTreeselect = async () => { const res = await listTree(); treeOptions.value = []; const data: TreeOption = { id: 0, treeName: '椤剁骇鑺傜偣', children: [] }; - data.children = proxy?.handleTree<TreeOption>(res.data, "id", "parentId"); + data.children = proxy?.handleTree<TreeOption>(res.data, 'id', 'parentId'); treeOptions.value.push(data); -} +}; // 鍙栨秷鎸夐挳 const cancel = () => { reset(); dialog.visible = false; -} +}; // 琛ㄥ崟閲嶇疆 const reset = () => { - form.value = {...initFormData} + form.value = { ...initFormData }; treeFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = (row?: TreeVO) => { @@ -209,22 +196,22 @@ form.value.parentId = 0; } dialog.visible = true; - dialog.title = "娣诲姞娴嬭瘯鏍�"; -} + dialog.title = '娣诲姞娴嬭瘯鏍�'; +}; /** 灞曞紑/鎶樺彔鎿嶄綔 */ const handleToggleExpandAll = () => { isExpandAll.value = !isExpandAll.value; - toggleExpandAll(treeList.value, isExpandAll.value) -} + toggleExpandAll(treeList.value, isExpandAll.value); +}; /** 灞曞紑/鎶樺彔鎿嶄綔 */ const toggleExpandAll = (data: TreeVO[], status: boolean) => { data.forEach((item) => { - treeTableRef.value?.toggleRowExpansion(item, status) - if (item.children && item.children.length > 0) toggleExpandAll(item.children, status) - }) -} + treeTableRef.value?.toggleRowExpansion(item, status); + if (item.children && item.children.length > 0) toggleExpandAll(item.children, status); + }); +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row: TreeVO) => { @@ -236,8 +223,8 @@ const res = await getTree(row.id); Object.assign(form.value, res.data); dialog.visible = true; - dialog.title = "淇敼娴嬭瘯鏍�"; -} + dialog.title = '淇敼娴嬭瘯鏍�'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { @@ -245,25 +232,25 @@ if (valid) { buttonLoading.value = true; if (form.value.id) { - await updateTree(form.value).finally(() => buttonLoading.value = false); + await updateTree(form.value).finally(() => (buttonLoading.value = false)); } else { - await addTree(form.value).finally(() => buttonLoading.value = false); + await addTree(form.value).finally(() => (buttonLoading.value = false)); } - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); dialog.visible = false; await getList(); } }); -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row: TreeVO) => { await proxy?.$modal.confirm('鏄惁纭鍒犻櫎娴嬭瘯鏍戠紪鍙蜂负"' + row.id + '"鐨勬暟鎹」锛�'); loading.value = true; - await delTree(row.id).finally(() => loading.value = false); + await delTree(row.id).finally(() => (loading.value = false)); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; onMounted(() => { getList(); diff --git a/src/views/error/401.vue b/src/views/error/401.vue index 1d9c76e..968550c 100644 --- a/src/views/error/401.vue +++ b/src/views/error/401.vue @@ -24,11 +24,11 @@ let { proxy } = getCurrentInstance() as ComponentInternalInstance; -const errGif = ref(errImage + "?" + +new Date()); +const errGif = ref(errImage + '?' + +new Date()); function back() { if (proxy?.$route.query.noGoBack) { - proxy.$router.push({ path: "/" }); + proxy.$router.push({ path: '/' }); } else { proxy?.$router.go(-1); } diff --git a/src/views/error/404.vue b/src/views/error/404.vue index 94ed936..b9a9ea3 100644 --- a/src/views/error/404.vue +++ b/src/views/error/404.vue @@ -23,13 +23,13 @@ <script setup lang="ts"> let message = computed(() => { - return '鎵句笉鍒扮綉椤碉紒' -}) + return '鎵句笉鍒扮綉椤碉紒'; +}); </script> <style lang="scss" scoped> -.wscn-http404-container{ - transform: translate(-50%,-50%); +.wscn-http404-container { + transform: translate(-50%, -50%); position: absolute; top: 40%; left: 50%; diff --git a/src/views/index.vue b/src/views/index.vue index 7f658d8..efb8b50 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -99,13 +99,13 @@ import { initWebSocket } from '@/utils/websocket'; onMounted(() => { - let protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://' - initWebSocket(protocol + window.location.host + import.meta.env.VITE_APP_BASE_API + "/resource/websocket"); + let protocol = window.location.protocol === 'https:' ? 'wss://' : 'ws://'; + initWebSocket(protocol + window.location.host + import.meta.env.VITE_APP_BASE_API + '/resource/websocket'); }); -const goTarget = (url:string) => { - window.open(url, '__blank') -} +const goTarget = (url: string) => { + window.open(url, '__blank'); +}; </script> <style scoped lang="scss"> @@ -131,7 +131,7 @@ margin: 0; } - font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-family: 'open sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; color: #676a6c; overflow-x: hidden; diff --git a/src/views/login.vue b/src/views/login.vue index e5c73fa..a92f399 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -2,7 +2,7 @@ <div class="login"> <el-form ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form"> <h3 class="title">RuoYi-Vue-Plus澶氱鎴风鐞嗙郴缁�</h3> - <el-form-item prop="tenantId" v-if="tenantEnabled"> + <el-form-item v-if="tenantEnabled" prop="tenantId"> <el-select v-model="loginForm.tenantId" filterable placeholder="璇烽�夋嫨/杈撳叆鍏徃鍚嶇О" style="width: 100%"> <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"></el-option> <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template> @@ -18,16 +18,16 @@ <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> </el-input> </el-form-item> - <el-form-item prop="code" v-if="captchaEnabled"> + <el-form-item v-if="captchaEnabled" prop="code"> <el-input v-model="loginForm.code" size="large" auto-complete="off" placeholder="楠岃瘉鐮�" style="width: 63%" @keyup.enter="handleLogin"> <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> </el-input> <div class="login-code"> - <img :src="codeUrl" @click="getCode" class="login-code-img" /> + <img :src="codeUrl" class="login-code-img" @click="getCode" /> </div> </el-form-item> - <el-checkbox v-model="loginForm.rememberMe" style="margin:0px 0px 25px 0px;">璁颁綇瀵嗙爜</el-checkbox> - <el-form-item style="float: right;"> + <el-checkbox v-model="loginForm.rememberMe" style="margin: 0px 0px 25px 0px">璁颁綇瀵嗙爜</el-checkbox> + <el-form-item style="float: right"> <el-button circle title="寰俊鐧诲綍" @click="doSocialLogin('wechat')"> <svg-icon icon-class="wechat" /> </el-button> @@ -41,12 +41,12 @@ <svg-icon icon-class="github" /> </el-button> </el-form-item> - <el-form-item style="width:100%;"> - <el-button :loading="loading" size="large" type="primary" style="width:100%;" @click.prevent="handleLogin"> + <el-form-item style="width: 100%"> + <el-button :loading="loading" size="large" type="primary" style="width: 100%" @click.prevent="handleLogin"> <span v-if="!loading">鐧� 褰�</span> <span v-else>鐧� 褰� 涓�...</span> </el-button> - <div style="float: right;" v-if="register"> + <div v-if="register" style="float: right"> <router-link class="link-type" :to="'/register'">绔嬪嵆娉ㄥ唽</router-link> </div> </el-form-item> @@ -64,7 +64,7 @@ import { useUserStore } from '@/store/modules/user'; import { LoginData, TenantVO } from '@/api/types'; import { to } from 'await-to-js'; -import { HttpStatus } from "@/enums/RespEnum"; +import { HttpStatus } from '@/enums/RespEnum'; const userStore = useUserStore(); const router = useRouter(); @@ -79,7 +79,7 @@ } as LoginData); const loginRules: ElFormRules = { - tenantId: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勭鎴风紪鍙�" }], + tenantId: [{ required: true, trigger: 'blur', message: '璇疯緭鍏ユ偍鐨勭鎴风紪鍙�' }], username: [{ required: true, trigger: 'blur', message: '璇疯緭鍏ユ偍鐨勮处鍙�' }], password: [{ required: true, trigger: 'blur', message: '璇疯緭鍏ユ偍鐨勫瘑鐮�' }], code: [{ required: true, trigger: 'change', message: '璇疯緭鍏ラ獙璇佺爜' }] @@ -92,7 +92,6 @@ // 绉熸埛寮�鍏� const tenantEnabled = ref(true); - // 娉ㄥ唽寮�鍏� const register = ref(false); const redirect = ref(undefined); @@ -100,9 +99,13 @@ // 绉熸埛鍒楄〃 const tenantList = ref<TenantVO[]>([]); -watch(() => router.currentRoute.value, (newRoute: any) => { - redirect.value = newRoute.query && newRoute.query.redirect; -}, { immediate: true }); +watch( + () => router.currentRoute.value, + (newRoute: any) => { + redirect.value = newRoute.query && newRoute.query.redirect; + }, + { immediate: true } +); const handleLogin = () => { loginRef.value?.validate(async (valid: boolean, fields: any) => { @@ -110,13 +113,13 @@ loading.value = true; // 鍕鹃�変簡闇�瑕佽浣忓瘑鐮佽缃湪 localStorage 涓缃浣忕敤鎴峰悕鍜屽瘑鐮� if (loginForm.value.rememberMe) { - localStorage.setItem("tenantId", String(loginForm.value.tenantId)); + localStorage.setItem('tenantId', String(loginForm.value.tenantId)); localStorage.setItem('username', String(loginForm.value.username)); localStorage.setItem('password', String(loginForm.value.password)); localStorage.setItem('rememberMe', String(loginForm.value.rememberMe)); } else { // 鍚﹀垯绉婚櫎 - localStorage.removeItem("tenantId"); + localStorage.removeItem('tenantId'); localStorage.removeItem('username'); localStorage.removeItem('password'); localStorage.removeItem('rememberMe'); @@ -153,7 +156,7 @@ }; const getLoginData = () => { - const tenantId = localStorage.getItem("tenantId"); + const tenantId = localStorage.getItem('tenantId'); const username = localStorage.getItem('username'); const password = localStorage.getItem('password'); const rememberMe = localStorage.getItem('rememberMe'); @@ -163,8 +166,7 @@ password: password === null ? String(loginForm.value.password) : String(password), rememberMe: rememberMe === null ? false : Boolean(rememberMe) } as LoginData; -} - +}; /** * 鑾峰彇绉熸埛鍒楄〃 @@ -178,12 +180,15 @@ loginForm.value.tenantId = tenantList.value[0].tenantId; } } -} +}; //妫�娴嬬鎴烽�夋嫨妗嗙殑鍙樺寲 -watch(() => loginForm.value.tenantId, () => { - localStorage.setItem("tenantId", String(loginForm.value.tenantId)) -}); +watch( + () => loginForm.value.tenantId, + () => { + localStorage.setItem('tenantId', String(loginForm.value.tenantId)); + } +); /** * 绗笁鏂圭櫥褰� @@ -200,8 +205,6 @@ }); }; - - onMounted(() => { getCode(); initTenantList(); @@ -215,7 +218,7 @@ justify-content: center; align-items: center; height: 100%; - background-image: url("../assets/images/login-background.jpg"); + background-image: url('../assets/images/login-background.jpg'); background-size: cover; } diff --git a/src/views/monitor/cache/index.vue b/src/views/monitor/cache/index.vue index 8719c94..c58f89c 100644 --- a/src/views/monitor/cache/index.vue +++ b/src/views/monitor/cache/index.vue @@ -4,8 +4,8 @@ <el-col :span="24" class="card-box"> <el-card shadow="hover"> <template #header> - <Monitor style="width: 1em; height: 1em; vertical-align: middle;" /> - <span style="vertical-align: middle;">鍩烘湰淇℃伅</span> + <Monitor style="width: 1em; height: 1em; vertical-align: middle" /> + <span style="vertical-align: middle">鍩烘湰淇℃伅</span> </template> <div class="el-table el-table--enable-row-hover el-table--medium"> @@ -16,25 +16,25 @@ <div class="cell">Redis鐗堟湰</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.info">{{ cache.info.redis_version }}</div> + <div v-if="cache.info" class="cell">{{ cache.info.redis_version }}</div> </td> <td class="el-table__cell is-leaf"> <div class="cell">杩愯妯″紡</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.info">{{ cache.info.redis_mode === "standalone" ? "鍗曟満" : "闆嗙兢" }}</div> + <div v-if="cache.info" class="cell">{{ cache.info.redis_mode === 'standalone' ? '鍗曟満' : '闆嗙兢' }}</div> </td> <td class="el-table__cell is-leaf"> <div class="cell">绔彛</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.info">{{ cache.info.tcp_port }}</div> + <div v-if="cache.info" class="cell">{{ cache.info.tcp_port }}</div> </td> <td class="el-table__cell is-leaf"> <div class="cell">瀹㈡埛绔暟</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.info">{{ cache.info.connected_clients }}</div> + <div v-if="cache.info" class="cell">{{ cache.info.connected_clients }}</div> </td> </tr> <tr> @@ -42,25 +42,25 @@ <div class="cell">杩愯鏃堕棿(澶�)</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.info">{{ cache.info.uptime_in_days }}</div> + <div v-if="cache.info" class="cell">{{ cache.info.uptime_in_days }}</div> </td> <td class="el-table__cell is-leaf"> <div class="cell">浣跨敤鍐呭瓨</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.info">{{ cache.info.used_memory_human }}</div> + <div v-if="cache.info" class="cell">{{ cache.info.used_memory_human }}</div> </td> <td class="el-table__cell is-leaf"> <div class="cell">浣跨敤CPU</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.info">{{ parseFloat(cache.info.used_cpu_user_children).toFixed(2) }}</div> + <div v-if="cache.info" class="cell">{{ parseFloat(cache.info.used_cpu_user_children).toFixed(2) }}</div> </td> <td class="el-table__cell is-leaf"> <div class="cell">鍐呭瓨閰嶇疆</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.info">{{ cache.info.maxmemory_human }}</div> + <div v-if="cache.info" class="cell">{{ cache.info.maxmemory_human }}</div> </td> </tr> <tr> @@ -68,25 +68,25 @@ <div class="cell">AOF鏄惁寮�鍚�</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.info">{{ cache.info.aof_enabled === "0" ? "鍚�" : "鏄�" }}</div> + <div v-if="cache.info" class="cell">{{ cache.info.aof_enabled === '0' ? '鍚�' : '鏄�' }}</div> </td> <td class="el-table__cell is-leaf"> <div class="cell">RDB鏄惁鎴愬姛</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.info">{{ cache.info.rdb_last_bgsave_status }}</div> + <div v-if="cache.info" class="cell">{{ cache.info.rdb_last_bgsave_status }}</div> </td> <td class="el-table__cell is-leaf"> <div class="cell">Key鏁伴噺</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.dbSize">{{ cache.dbSize }}</div> + <div v-if="cache.dbSize" class="cell">{{ cache.dbSize }}</div> </td> <td class="el-table__cell is-leaf"> <div class="cell">缃戠粶鍏ュ彛/鍑哄彛</div> </td> <td class="el-table__cell is-leaf"> - <div class="cell" v-if="cache.info"> + <div v-if="cache.info" class="cell"> {{ cache.info.instantaneous_input_kbps }}kps/{{ cache.info.instantaneous_output_kbps }}kps </div> </td> @@ -100,8 +100,8 @@ <el-col :span="12" class="card-box"> <el-card shadow="hover"> <template #header> - <PieChart style="width: 1em; height: 1em; vertical-align: middle;" /> - <span style="vertical-align: middle;">鍛戒护缁熻</span> + <PieChart style="width: 1em; height: 1em; vertical-align: middle" /> + <span style="vertical-align: middle">鍛戒护缁熻</span> </template> <div class="el-table el-table--enable-row-hover el-table--medium"> <div ref="commandstats" style="height: 420px" /> @@ -112,7 +112,7 @@ <el-col :span="12" class="card-box"> <el-card shadow="hover"> <template #header> - <Odometer style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍐呭瓨淇℃伅</span> + <Odometer style="width: 1em; height: 1em; vertical-align: middle" /> <span style="vertical-align: middle">鍐呭瓨淇℃伅</span> </template> <div class="el-table el-table--enable-row-hover el-table--medium"> <div ref="usedmemory" style="height: 420px" /> @@ -133,38 +133,38 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance; const getList = async () => { - proxy?.$modal.loading("姝e湪鍔犺浇缂撳瓨鐩戞帶鏁版嵁锛岃绋嶅�欙紒"); + proxy?.$modal.loading('姝e湪鍔犺浇缂撳瓨鐩戞帶鏁版嵁锛岃绋嶅�欙紒'); const res = await getCache(); proxy?.$modal.closeLoading(); cache.value = res.data; - const commandstatsIntance = echarts.init(commandstats.value, "macarons"); + const commandstatsIntance = echarts.init(commandstats.value, 'macarons'); commandstatsIntance.setOption({ tooltip: { - trigger: "item", - formatter: "{a} <br/>{b} : {c} ({d}%)" + trigger: 'item', + formatter: '{a} <br/>{b} : {c} ({d}%)' }, series: [ { - name: "鍛戒护", - type: "pie", - roseType: "radius", + name: '鍛戒护', + type: 'pie', + roseType: 'radius', radius: [15, 95], - center: ["50%", "38%"], + center: ['50%', '38%'], data: res.data.commandStats, - animationEasing: "cubicInOut", + animationEasing: 'cubicInOut', animationDuration: 1000 } ] }); - const usedmemoryInstance = echarts.init(usedmemory.value, "macarons"); + const usedmemoryInstance = echarts.init(usedmemory.value, 'macarons'); usedmemoryInstance.setOption({ tooltip: { - formatter: "{b} <br/>{a} : " + cache.value.info.used_memory_human + formatter: '{b} <br/>{a} : ' + cache.value.info.used_memory_human }, series: [ { - name: "宄板��", - type: "gauge", + name: '宄板��', + type: 'gauge', min: 0, max: 1000, detail: { @@ -173,19 +173,19 @@ data: [ { value: parseFloat(cache.value.info.used_memory_human), - name: "鍐呭瓨娑堣��" + name: '鍐呭瓨娑堣��' } ] } ] - }) - window.addEventListener("resize",()=>{ - commandstatsIntance.resize() - usedmemoryInstance.resize() }); -} + window.addEventListener('resize', () => { + commandstatsIntance.resize(); + usedmemoryInstance.resize(); + }); +}; onMounted(() => { getList(); -}) +}); </script> diff --git a/src/views/monitor/logininfor/index.vue b/src/views/monitor/logininfor/index.vue index 067790e..656a7bc 100644 --- a/src/views/monitor/logininfor/index.vue +++ b/src/views/monitor/logininfor/index.vue @@ -1,14 +1,14 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="鐧诲綍鍦板潃" prop="ipaddr"> - <el-input v-model="queryParams.ipaddr" placeholder="璇疯緭鍏ョ櫥褰曞湴鍧�" clearable style="width: 240px;" @keyup.enter="handleQuery" /> + <el-input v-model="queryParams.ipaddr" placeholder="璇疯緭鍏ョ櫥褰曞湴鍧�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName"> - <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" clearable style="width: 240px;" @keyup.enter="handleQuery" /> + <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="鐘舵��" prop="status"> <el-select v-model="queryParams.status" placeholder="鐧诲綍鐘舵��" clearable style="width: 240px"> @@ -39,22 +39,22 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['monitor:logininfor:remove']"> + <el-button v-hasPermi="['monitor:logininfor:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" @click="handleClean" v-hasPermi="['monitor:logininfor:remove']">娓呯┖</el-button> + <el-button v-hasPermi="['monitor:logininfor:remove']" type="danger" plain icon="Delete" @click="handleClean">娓呯┖</el-button> </el-col> <el-col :span="1.5"> - <el-button type="primary" plain icon="Unlock" :disabled="single" @click="handleUnlock" v-hasPermi="['monitor:logininfor:unlock']"> + <el-button v-hasPermi="['monitor:logininfor:unlock']" type="primary" plain icon="Unlock" :disabled="single" @click="handleUnlock"> 瑙i攣 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['monitor:logininfor:export']">瀵煎嚭</el-button> + <el-button v-hasPermi="['monitor:logininfor:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> @@ -62,8 +62,8 @@ ref="loginInfoTableRef" v-loading="loading" :data="loginInfoList" - @selection-change="handleSelectionChange" :default-sort="defaultSort" + @selection-change="handleSelectionChange" @sort-change="handleSortChange" > <el-table-column type="selection" width="55" align="center" /> @@ -99,18 +99,18 @@ </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> </div> </template> <script setup name="Logininfor" lang="ts"> -import { list, delLoginInfo, cleanLoginInfo, unlockLoginInfo } from "@/api/monitor/loginInfo"; -import { LoginInfoQuery, LoginInfoVO } from "@/api/monitor/loginInfo/types"; +import { list, delLoginInfo, cleanLoginInfo, unlockLoginInfo } from '@/api/monitor/loginInfo'; +import { LoginInfoQuery, LoginInfoVO } from '@/api/monitor/loginInfo/types'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const { sys_device_type } = toRefs<any>(proxy?.useDict("sys_device_type")); -const { sys_common_status } = toRefs<any>(proxy?.useDict("sys_common_status")); +const { sys_device_type } = toRefs<any>(proxy?.useDict('sys_device_type')); +const { sys_common_status } = toRefs<any>(proxy?.useDict('sys_common_status')); const loginInfoList = ref<LoginInfoVO[]>([]); const loading = ref(true); @@ -120,85 +120,89 @@ const multiple = ref(true); const selectName = ref<Array<string>>([]); const total = ref(0); -const dateRange = ref<[DateModelType,DateModelType]>(['', '']); -const defaultSort = ref<any>({ prop: "loginTime", order: "descending" }); +const dateRange = ref<[DateModelType, DateModelType]>(['', '']); +const defaultSort = ref<any>({ prop: 'loginTime', order: 'descending' }); const queryFormRef = ref<ElFormInstance>(); const loginInfoTableRef = ref<ElTableInstance>(); // 鏌ヨ鍙傛暟 const queryParams = ref<LoginInfoQuery>({ - pageNum: 1, - pageSize: 10, - ipaddr: '', - userName: '', - status: '', - orderByColumn: defaultSort.value.prop, - isAsc: defaultSort.value.order + pageNum: 1, + pageSize: 10, + ipaddr: '', + userName: '', + status: '', + orderByColumn: defaultSort.value.prop, + isAsc: defaultSort.value.order }); /** 鏌ヨ鐧诲綍鏃ュ織鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await list(proxy?.addDateRange(queryParams.value, dateRange.value)); - loginInfoList.value = res.rows; - total.value = res.total; - loading.value = false; -} + loading.value = true; + const res = await list(proxy?.addDateRange(queryParams.value, dateRange.value)); + loginInfoList.value = res.rows; + total.value = res.total; + loading.value = false; +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); -} + queryParams.value.pageNum = 1; + getList(); +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - dateRange.value = ['', '']; - queryFormRef.value?.resetFields(); - queryParams.value.pageNum = 1; - loginInfoTableRef.value?.sort(defaultSort.value.prop, defaultSort.value.order); -} + dateRange.value = ['', '']; + queryFormRef.value?.resetFields(); + queryParams.value.pageNum = 1; + loginInfoTableRef.value?.sort(defaultSort.value.prop, defaultSort.value.order); +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: LoginInfoVO[]) => { - ids.value = selection.map(item => item.infoId); - multiple.value = !selection.length; - single.value = selection.length != 1; - selectName.value = selection.map(item => item.userName); -} + ids.value = selection.map((item) => item.infoId); + multiple.value = !selection.length; + single.value = selection.length != 1; + selectName.value = selection.map((item) => item.userName); +}; /** 鎺掑簭瑙﹀彂浜嬩欢 */ const handleSortChange = (column: any) => { - queryParams.value.orderByColumn = column.prop; - queryParams.value.isAsc = column.order; - getList(); -} + queryParams.value.orderByColumn = column.prop; + queryParams.value.isAsc = column.order; + getList(); +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: LoginInfoVO) => { - const infoIds = row?.infoId || ids.value; - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎璁块棶缂栧彿涓�"' + infoIds + '"鐨勬暟鎹」?'); - await delLoginInfo(infoIds); - await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); -} + const infoIds = row?.infoId || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎璁块棶缂栧彿涓�"' + infoIds + '"鐨勬暟鎹」?'); + await delLoginInfo(infoIds); + await getList(); + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; /** 娓呯┖鎸夐挳鎿嶄綔 */ const handleClean = async () => { - await proxy?.$modal.confirm("鏄惁纭娓呯┖鎵�鏈夌櫥褰曟棩蹇楁暟鎹」?"); - await cleanLoginInfo(); - await getList(); - proxy?.$modal.msgSuccess("娓呯┖鎴愬姛"); -} + await proxy?.$modal.confirm('鏄惁纭娓呯┖鎵�鏈夌櫥褰曟棩蹇楁暟鎹」?'); + await cleanLoginInfo(); + await getList(); + proxy?.$modal.msgSuccess('娓呯┖鎴愬姛'); +}; /** 瑙i攣鎸夐挳鎿嶄綔 */ const handleUnlock = async () => { - const username = selectName.value; - await proxy?.$modal.confirm('鏄惁纭瑙i攣鐢ㄦ埛"' + username + '"鏁版嵁椤�?'); - await unlockLoginInfo(username); - proxy?.$modal.msgSuccess("鐢ㄦ埛" + username + "瑙i攣鎴愬姛"); -} + const username = selectName.value; + await proxy?.$modal.confirm('鏄惁纭瑙i攣鐢ㄦ埛"' + username + '"鏁版嵁椤�?'); + await unlockLoginInfo(username); + proxy?.$modal.msgSuccess('鐢ㄦ埛' + username + '瑙i攣鎴愬姛'); +}; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download("monitor/logininfor/export", { - ...queryParams.value, - }, `config_${new Date().getTime()}.xlsx`); -} + proxy?.download( + 'monitor/logininfor/export', + { + ...queryParams.value + }, + `config_${new Date().getTime()}.xlsx` + ); +}; onMounted(() => { - getList(); -}) + getList(); +}); </script> diff --git a/src/views/monitor/online/index.vue b/src/views/monitor/online/index.vue index d105cd7..cbab805 100644 --- a/src/views/monitor/online/index.vue +++ b/src/views/monitor/online/index.vue @@ -2,7 +2,7 @@ <div class="p-2"> <div class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form-item label="鐧诲綍鍦板潃" prop="ipaddr"> <el-input v-model="queryParams.ipaddr" placeholder="璇疯緭鍏ョ櫥褰曞湴鍧�" clearable style="width: 200px" @keyup.enter="handleQuery" /> </el-form-item> @@ -20,7 +20,7 @@ <el-table v-loading="loading" :data="onlineList.slice((queryParams.pageNum - 1) * queryParams.pageSize, queryParams.pageNum * queryParams.pageSize)" - style="width: 100%;" + style="width: 100%" > <el-table-column label="搴忓彿" width="50" type="index" align="center"> <template #default="scope"> @@ -48,14 +48,14 @@ <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="寮洪��" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleForceLogout(scope.row)" v-hasPermi="['monitor:online:forceLogout']"> + <el-button v-hasPermi="['monitor:online:forceLogout']" link type="primary" icon="Delete" @click="handleForceLogout(scope.row)"> </el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" /> </el-card> </div> </template> @@ -67,7 +67,7 @@ import {to} from "await-to-js"; const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const { sys_device_type } = toRefs<any>(proxy?.useDict("sys_device_type")); +const { sys_device_type } = toRefs<any>(proxy?.useDict('sys_device_type')); const onlineList = ref<OnlineVO[]>([]); const loading = ref(true); @@ -89,17 +89,17 @@ onlineList.value = res.rows; total.value = res.total; loading.value = false; -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 寮洪��鎸夐挳鎿嶄綔 */ const handleForceLogout = async (row: OnlineVO) => { const [err] = await to(proxy?.$modal.confirm('鏄惁纭寮洪��鍚嶇О涓�"' + row.userName + '"鐨勭敤鎴�?') as any); @@ -112,5 +112,5 @@ onMounted(() => { getList(); -}) +}); </script> diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue index ea68c24..e4eda79 100644 --- a/src/views/monitor/operlog/index.vue +++ b/src/views/monitor/operlog/index.vue @@ -3,15 +3,15 @@ <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> <div class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="鎿嶄綔鍦板潃" prop="operIp"> - <el-input v-model="queryParams.operIp" placeholder="璇疯緭鍏ユ搷浣滃湴鍧�" clearable style="width: 240px;" @keyup.enter="handleQuery"/> + <el-input v-model="queryParams.operIp" placeholder="璇疯緭鍏ユ搷浣滃湴鍧�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="绯荤粺妯″潡" prop="title"> - <el-input v-model="queryParams.title" placeholder="璇疯緭鍏ョ郴缁熸ā鍧�" clearable style="width: 240px;" @keyup.enter="handleQuery" /> + <el-input v-model="queryParams.title" placeholder="璇疯緭鍏ョ郴缁熸ā鍧�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="鎿嶄綔浜哄憳" prop="operName"> - <el-input v-model="queryParams.operName" placeholder="璇疯緭鍏ユ搷浣滀汉鍛�" clearable style="width: 240px;" @keyup.enter="handleQuery" /> + <el-input v-model="queryParams.operName" placeholder="璇疯緭鍏ユ搷浣滀汉鍛�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="绫诲瀷" prop="businessType"> <el-select v-model="queryParams.businessType" placeholder="鎿嶄綔绫诲瀷" clearable style="width: 240px"> @@ -47,17 +47,17 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['monitor:operlog:remove']"> + <el-button v-hasPermi="['monitor:operlog:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="WarnTriangleFilled" @click="handleClean" v-hasPermi="['monitor:operlog:remove']">娓呯┖</el-button> + <el-button v-hasPermi="['monitor:operlog:remove']" type="danger" plain icon="WarnTriangleFilled" @click="handleClean">娓呯┖</el-button> </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['monitor:operlog:export']">瀵煎嚭</el-button> + <el-button v-hasPermi="['monitor:operlog:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> @@ -65,8 +65,8 @@ ref="operLogTableRef" v-loading="loading" :data="operlogList" - @selection-change="handleSelectionChange" :default-sort="defaultSort" + @selection-change="handleSelectionChange" @sort-change="handleSortChange" > <el-table-column type="selection" width="50" align="center" /> @@ -114,20 +114,20 @@ <el-table-column label="鎿嶄綔" fixed="right" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="璇︾粏" placement="top"> - <el-button link type="primary" icon="View" @click="handleView(scope.row)" v-hasPermi="['monitor:operlog:query']"> </el-button> + <el-button v-hasPermi="['monitor:operlog:query']" link type="primary" icon="View" @click="handleView(scope.row)"> </el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 鎿嶄綔鏃ュ織璇︾粏 --> - <el-dialog title="鎿嶄綔鏃ュ織璇︾粏" v-model="dialog.visible" width="700px" append-to-body> + <el-dialog v-model="dialog.visible" title="鎿嶄綔鏃ュ織璇︾粏" width="700px" append-to-body> <el-form :model="form" label-width="100px"> <el-row> <el-col :span="24"> - <el-form-item label="鐧诲綍淇℃伅锛�">{{ form.operName }} / {{form.deptName}} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item> + <el-form-item label="鐧诲綍淇℃伅锛�">{{ form.operName }} / {{ form.deptName }} / {{ form.operIp }} / {{ form.operLocation }}</el-form-item> </el-col> <el-col :span="12"> <el-form-item label="璇锋眰淇℃伅锛�">{{ form.requestMethod }} {{ form.operUrl }}</el-form-item> @@ -157,7 +157,7 @@ <el-form-item label="鎿嶄綔鏃堕棿锛�">{{ parseTime(form.operTime) }}</el-form-item> </el-col> <el-col :span="24"> - <el-form-item label="寮傚父淇℃伅锛�" v-if="form.status === 1">{{ form.errorMsg }}</el-form-item> + <el-form-item v-if="form.status === 1" label="寮傚父淇℃伅锛�">{{ form.errorMsg }}</el-form-item> </el-col> </el-row> </el-form> @@ -175,7 +175,7 @@ import { OperLogForm, OperLogQuery, OperLogVO } from '@/api/monitor/operlog/types'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const { sys_oper_type, sys_common_status } = toRefs<any>(proxy?.useDict("sys_oper_type", "sys_common_status")); +const { sys_oper_type, sys_common_status } = toRefs<any>(proxy?.useDict('sys_oper_type', 'sys_common_status')); const operlogList = ref<OperLogVO[]>([]); const loading = ref(true); @@ -184,7 +184,7 @@ const multiple = ref(true); const total = ref(0); const dateRange = ref<[DateModelType, DateModelType]>(['', '']); -const defaultSort = ref<any>({ prop: "operTime", order: "descending" }); +const defaultSort = ref<any>({ prop: 'operTime', order: 'descending' }); const operLogTableRef = ref<ElTableInstance>(); const queryFormRef = ref<ElFormInstance>(); @@ -193,7 +193,6 @@ visible: false, title: '' }); - const data = reactive<PageData<OperLogForm, OperLogQuery>>({ form: { @@ -240,63 +239,67 @@ operlogList.value = res.rows; total.value = res.total; loading.value = false; -} +}; /** 鎿嶄綔鏃ュ織绫诲瀷瀛楀吀缈昏瘧 */ const typeFormat = (row: OperLogForm) => { return proxy?.selectDictLabel(sys_oper_type.value, row.businessType); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { dateRange.value = ['', '']; queryFormRef.value?.resetFields(); queryParams.value.pageNum = 1; operLogTableRef.value?.sort(defaultSort.value.prop, defaultSort.value.order); -} +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: OperLogVO[]) => { - ids.value = selection.map(item => item.operId); + ids.value = selection.map((item) => item.operId); multiple.value = !selection.length; -} +}; /** 鎺掑簭瑙﹀彂浜嬩欢 */ const handleSortChange = (column: any) => { queryParams.value.orderByColumn = column.prop; queryParams.value.isAsc = column.order; getList(); -} +}; /** 璇︾粏鎸夐挳鎿嶄綔 */ const handleView = (row: OperLogVO) => { dialog.visible = true; form.value = row; -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: OperLogVO) => { const operIds = row?.operId || ids.value; await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鏃ュ織缂栧彿涓�"' + operIds + '"鐨勬暟鎹」?'); await delOperlog(operIds); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; /** 娓呯┖鎸夐挳鎿嶄綔 */ const handleClean = async () => { - await proxy?.$modal.confirm("鏄惁纭娓呯┖鎵�鏈夋搷浣滄棩蹇楁暟鎹」?"); + await proxy?.$modal.confirm('鏄惁纭娓呯┖鎵�鏈夋搷浣滄棩蹇楁暟鎹」?'); await cleanOperlog(); await getList(); - proxy?.$modal.msgSuccess("娓呯┖鎴愬姛"); -} + proxy?.$modal.msgSuccess('娓呯┖鎴愬姛'); +}; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download("monitor/operlog/export", { - ...queryParams.value, - }, `config_${new Date().getTime()}.xlsx`); -} + proxy?.download( + 'monitor/operlog/export', + { + ...queryParams.value + }, + `config_${new Date().getTime()}.xlsx` + ); +}; onMounted(() => { getList(); -}) +}); </script> diff --git a/src/views/redirect/index.vue b/src/views/redirect/index.vue index 15401f8..97a6556 100644 --- a/src/views/redirect/index.vue +++ b/src/views/redirect/index.vue @@ -3,12 +3,12 @@ </template> <script setup> -import { useRoute, useRouter } from 'vue-router' +import { useRoute, useRouter } from 'vue-router'; const route = useRoute(); const router = useRouter(); -const { params, query } = route -const { path } = params +const { params, query } = route; +const { path } = params; -router.replace({ path: '/' + path, query }) +router.replace({ path: '/' + path, query }); </script> diff --git a/src/views/register.vue b/src/views/register.vue index ad78cf1..7f078c1 100644 --- a/src/views/register.vue +++ b/src/views/register.vue @@ -2,7 +2,7 @@ <div class="register"> <el-form ref="registerRef" :model="registerForm" :rules="registerRules" class="register-form"> <h3 class="title">RuoYi-Vue-Plus澶氱鎴风鐞嗙郴缁�</h3> - <el-form-item prop="tenantId" v-if="tenantEnabled"> + <el-form-item v-if="tenantEnabled" prop="tenantId"> <el-select v-model="registerForm.tenantId" filterable placeholder="璇烽�夋嫨/杈撳叆鍏徃鍚嶇О" style="width: 100%"> <el-option v-for="item in tenantList" :key="item.tenantId" :label="item.companyName" :value="item.tenantId"> </el-option> <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template> @@ -30,20 +30,20 @@ <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template> </el-input> </el-form-item> - <el-form-item prop="code" v-if="captchaEnabled"> - <el-input size="large" v-model="registerForm.code" auto-complete="off" placeholder="楠岃瘉鐮�" style="width: 63%" @keyup.enter="handleRegister"> + <el-form-item v-if="captchaEnabled" prop="code"> + <el-input v-model="registerForm.code" size="large" auto-complete="off" placeholder="楠岃瘉鐮�" style="width: 63%" @keyup.enter="handleRegister"> <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template> </el-input> <div class="register-code"> - <img :src="codeUrl" @click="getCode" class="register-code-img" /> + <img :src="codeUrl" class="register-code-img" @click="getCode" /> </div> </el-form-item> - <el-form-item style="width:100%;"> - <el-button :loading="loading" size="large" type="primary" style="width:100%;" @click.prevent="handleRegister"> + <el-form-item style="width: 100%"> + <el-button :loading="loading" size="large" type="primary" style="width: 100%" @click.prevent="handleRegister"> <span v-if="!loading">娉� 鍐�</span> <span v-else>娉� 鍐� 涓�...</span> </el-button> - <div style="float: right;"> + <div style="float: right"> <router-link class="link-type" :to="'/login'">浣跨敤宸叉湁璐︽埛鐧诲綍</router-link> </div> </el-form-item> @@ -63,46 +63,43 @@ const router = useRouter(); const registerForm = ref<RegisterForm>({ - tenantId: "", - username: "", - password: "", - confirmPassword: "", - code: "", - uuid: "", - userType: "sys_user" + tenantId: '', + username: '', + password: '', + confirmPassword: '', + code: '', + uuid: '', + userType: 'sys_user' }); // 绉熸埛寮�鍏� const tenantEnabled = ref(true); - const equalToPassword = (rule: any, value: string, callback: any) => { if (registerForm.value.password !== value) { - callback(new Error("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�")); + callback(new Error('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�')); } else { callback(); } }; const registerRules: ElFormRules = { - tenantId: [ - { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勭鎴风紪鍙�" } - ], + tenantId: [{ required: true, trigger: 'blur', message: '璇疯緭鍏ユ偍鐨勭鎴风紪鍙�' }], username: [ - { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勮处鍙�" }, - { min: 2, max: 20, message: "鐢ㄦ埛璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿", trigger: "blur" } + { required: true, trigger: 'blur', message: '璇疯緭鍏ユ偍鐨勮处鍙�' }, + { min: 2, max: 20, message: '鐢ㄦ埛璐﹀彿闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿', trigger: 'blur' } ], password: [ - { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勫瘑鐮�" }, - { min: 5, max: 20, message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿", trigger: "blur" } + { required: true, trigger: 'blur', message: '璇疯緭鍏ユ偍鐨勫瘑鐮�' }, + { min: 5, max: 20, message: '鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿', trigger: 'blur' } ], confirmPassword: [ - { required: true, trigger: "blur", message: "璇峰啀娆¤緭鍏ユ偍鐨勫瘑鐮�" }, - { required: true, validator: equalToPassword, trigger: "blur" } + { required: true, trigger: 'blur', message: '璇峰啀娆¤緭鍏ユ偍鐨勫瘑鐮�' }, + { required: true, validator: equalToPassword, trigger: 'blur' } ], - code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }] + code: [{ required: true, trigger: 'change', message: '璇疯緭鍏ラ獙璇佺爜' }] }; -const codeUrl = ref(""); +const codeUrl = ref(''); const loading = ref(false); const captchaEnabled = ref(true); const registerRef = ref<ElFormInstance>(); @@ -116,11 +113,11 @@ const [err] = await to(register(registerForm.value)); if (!err) { const username = registerForm.value.username; - await ElMessageBox.alert("<font color='red'>鎭枩浣狅紝鎮ㄧ殑璐﹀彿 " + username + " 娉ㄥ唽鎴愬姛锛�</font>", "绯荤粺鎻愮ず", { + await ElMessageBox.alert("<font color='red'>鎭枩浣狅紝鎮ㄧ殑璐﹀彿 " + username + ' 娉ㄥ唽鎴愬姛锛�</font>', '绯荤粺鎻愮ず', { dangerouslyUseHTMLString: true, - type: "success", + type: 'success' }); - await router.push("/login"); + await router.push('/login'); } else { loading.value = false; if (captchaEnabled) { @@ -129,7 +126,7 @@ } } }); -} +}; const getCode = async () => { const res = await getCodeImg(); @@ -150,12 +147,12 @@ registerForm.value.tenantId = tenantList.value[0].tenantId; } } -} +}; onMounted(() => { getCode(); initTenantList(); -}) +}); </script> <style lang="scss" scoped> @@ -164,7 +161,7 @@ justify-content: center; align-items: center; height: 100%; - background-image: url("../assets/images/login-background.jpg"); + background-image: url('../assets/images/login-background.jpg'); background-size: cover; } diff --git a/src/views/system/client/index.vue b/src/views/system/client/index.vue index b39b9e5..e201da0 100644 --- a/src/views/system/client/index.vue +++ b/src/views/system/client/index.vue @@ -1,8 +1,8 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="search" v-show="showSearch"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="100px"> + <div v-show="showSearch" class="search"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="100px"> <el-form-item label="瀹㈡埛绔痥ey" prop="clientKey"> <el-input v-model="queryParams.clientKey" placeholder="璇疯緭鍏ュ鎴风key" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> @@ -26,28 +26,28 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:client:add']">鏂板</el-button> + <el-button v-hasPermi="['system:client:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:client:edit']"> + <el-button v-hasPermi="['system:client:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"> 淇敼 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:client:remove']"> + <el-button v-hasPermi="['system:client:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:client:export']">瀵煎嚭</el-button> + <el-button v-hasPermi="['system:client:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="clientList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="id" align="center" prop="id" v-if="true" /> + <el-table-column v-if="true" label="id" align="center" prop="id" /> <el-table-column label="瀹㈡埛绔痠d" align="center" prop="clientId" /> <el-table-column label="瀹㈡埛绔痥ey" align="center" prop="clientKey" /> <el-table-column label="瀹㈡埛绔閽�" align="center" prop="clientSecret" /> @@ -63,7 +63,7 @@ </el-table-column> <el-table-column label="Token娲昏穬瓒呮椂鏃堕棿" align="center" prop="activeTimeout" /> <el-table-column label="Token鍥哄畾瓒呮椂鏃堕棿" align="center" prop="timeout" /> - <el-table-column label="鐘舵��" align="center" key="status"> + <el-table-column key="status" label="鐘舵��" align="center"> <template #default="scope"> <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> </template> @@ -71,19 +71,19 @@ <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:client:edit']"></el-button> + <el-button v-hasPermi="['system:client:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:client:remove']"></el-button> + <el-button v-hasPermi="['system:client:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total>0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀瑰鎴风绠$悊瀵硅瘽妗� --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-form ref="clientFormRef" :model="form" :rules="rules" label-width="100px"> <el-form-item label="瀹㈡埛绔痥ey" prop="clientKey"> <el-input v-model="form.clientKey" :disabled="form.id != null" placeholder="璇疯緭鍏ュ鎴风key" /> @@ -146,9 +146,9 @@ import { ClientVO, ClientQuery, ClientForm } from '@/api/system/client/types'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const { sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_normal_disable")); -const { sys_grant_type } = toRefs<any>(proxy?.useDict("sys_grant_type")); -const { sys_device_type } = toRefs<any>(proxy?.useDict("sys_device_type")); +const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable')); +const { sys_grant_type } = toRefs<any>(proxy?.useDict('sys_grant_type')); +const { sys_device_type } = toRefs<any>(proxy?.useDict('sys_device_type')); const clientList = ref<ClientVO[]>([]); const buttonLoading = ref(false); @@ -176,10 +176,10 @@ deviceType: undefined, activeTimeout: undefined, timeout: undefined, - status: undefined, -} + status: undefined +}; const data = reactive<PageData<ClientForm, ClientQuery>>({ - form: {...initFormData}, + form: { ...initFormData }, queryParams: { pageNum: 1, pageSize: 10, @@ -190,27 +190,15 @@ deviceType: undefined, activeTimeout: undefined, timeout: undefined, - status: undefined, + status: undefined }, rules: { - id: [ - { required: true, message: "id涓嶈兘涓虹┖", trigger: "blur" } - ], - clientId: [ - { required: true, message: "瀹㈡埛绔痠d涓嶈兘涓虹┖", trigger: "blur" } - ], - clientKey: [ - { required: true, message: "瀹㈡埛绔痥ey涓嶈兘涓虹┖", trigger: "blur" } - ], - clientSecret: [ - { required: true, message: "瀹㈡埛绔閽ヤ笉鑳戒负绌�", trigger: "blur" } - ], - grantTypeList: [ - { required: true, message: "鎺堟潈绫诲瀷涓嶈兘涓虹┖", trigger: "change" } - ], - deviceType: [ - { required: true, message: "璁惧绫诲瀷涓嶈兘涓虹┖", trigger: "change" } - ], + id: [{ required: true, message: 'id涓嶈兘涓虹┖', trigger: 'blur' }], + clientId: [{ required: true, message: '瀹㈡埛绔痠d涓嶈兘涓虹┖', trigger: 'blur' }], + clientKey: [{ required: true, message: '瀹㈡埛绔痥ey涓嶈兘涓虹┖', trigger: 'blur' }], + clientSecret: [{ required: true, message: '瀹㈡埛绔閽ヤ笉鑳戒负绌�', trigger: 'blur' }], + grantTypeList: [{ required: true, message: '鎺堟潈绫诲瀷涓嶈兘涓虹┖', trigger: 'change' }], + deviceType: [{ required: true, message: '璁惧绫诲瀷涓嶈兘涓虹┖', trigger: 'change' }] } }); @@ -223,55 +211,55 @@ clientList.value = res.rows; total.value = res.total; loading.value = false; -} +}; /** 鍙栨秷鎸夐挳 */ const cancel = () => { reset(); dialog.visible = false; -} +}; /** 琛ㄥ崟閲嶇疆 */ const reset = () => { - form.value = {...initFormData}; + form.value = { ...initFormData }; clientFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: ClientVO[]) => { - ids.value = selection.map(item => item.id); + ids.value = selection.map((item) => item.id); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { reset(); dialog.visible = true; - dialog.title = "娣诲姞瀹㈡埛绔鐞�"; -} + dialog.title = '娣诲姞瀹㈡埛绔鐞�'; +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: ClientVO) => { reset(); - const _id = row?.id || ids.value[0] + const _id = row?.id || ids.value[0]; const res = await getClient(_id); Object.assign(form.value, res.data); dialog.visible = true; - dialog.title = "淇敼瀹㈡埛绔鐞�"; -} + dialog.title = '淇敼瀹㈡埛绔鐞�'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { @@ -279,44 +267,48 @@ if (valid) { buttonLoading.value = true; if (form.value.id) { - await updateClient(form.value).finally(() => buttonLoading.value = false); + await updateClient(form.value).finally(() => (buttonLoading.value = false)); } else { - await addClient(form.value).finally(() => buttonLoading.value = false); + await addClient(form.value).finally(() => (buttonLoading.value = false)); } - proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + proxy?.$modal.msgSuccess('淇敼鎴愬姛'); dialog.visible = false; await getList(); } }); -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: ClientVO) => { const _ids = row?.id || ids.value; - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎瀹㈡埛绔鐞嗙紪鍙蜂负"' + _ids + '"鐨勬暟鎹」锛�').finally(() => loading.value = false); + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎瀹㈡埛绔鐞嗙紪鍙蜂负"' + _ids + '"鐨勬暟鎹」锛�').finally(() => (loading.value = false)); await delClient(_ids); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); await getList(); -} +}; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download('system/client/export', { - ...queryParams.value - }, `client_${new Date().getTime()}.xlsx`) -} + proxy?.download( + 'system/client/export', + { + ...queryParams.value + }, + `client_${new Date().getTime()}.xlsx` + ); +}; /** 鐘舵�佷慨鏀� */ const handleStatusChange = async (row: ClientVO) => { - let text = row.status === "0" ? "鍚敤" : "鍋滅敤" + let text = row.status === '0' ? '鍚敤' : '鍋滅敤'; try { await proxy?.$modal.confirm('纭瑕�"' + text + '"鍚�?'); await changeStatus(row.id, row.status); - proxy?.$modal.msgSuccess(text + "鎴愬姛"); + proxy?.$modal.msgSuccess(text + '鎴愬姛'); } catch (err) { - row.status = row.status === "0" ? "1" : "0"; + row.status = row.status === '0' ? '1' : '0'; } -} +}; onMounted(() => { getList(); diff --git a/src/views/system/config/index.vue b/src/views/system/config/index.vue index 7e2e161..467b37f 100644 --- a/src/views/system/config/index.vue +++ b/src/views/system/config/index.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="鍙傛暟鍚嶇О" prop="configName"> <el-input v-model="queryParams.configName" placeholder="璇疯緭鍏ュ弬鏁板悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> @@ -15,7 +15,7 @@ <el-option v-for="dict in sys_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> - <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px;"> + <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px"> <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD HH:mm:ss" @@ -38,31 +38,31 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:config:add']">鏂板</el-button> + <el-button v-hasPermi="['system:config:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:config:edit']"> + <el-button v-hasPermi="['system:config:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"> 淇敼 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:config:remove']"> + <el-button v-hasPermi="['system:config:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:config:export']">瀵煎嚭</el-button> + <el-button v-hasPermi="['system:config:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Refresh" @click="handleRefreshCache" v-hasPermi="['system:config:remove']">鍒锋柊缂撳瓨</el-button> + <el-button v-hasPermi="['system:config:remove']" type="danger" plain icon="Refresh" @click="handleRefreshCache">鍒锋柊缂撳瓨</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="configList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="鍙傛暟涓婚敭" align="center" prop="configId" v-if="false" /> + <el-table-column v-if="false" label="鍙傛暟涓婚敭" align="center" prop="configId" /> <el-table-column label="鍙傛暟鍚嶇О" align="center" prop="configName" :show-overflow-tooltip="true" /> <el-table-column label="鍙傛暟閿悕" align="center" prop="configKey" :show-overflow-tooltip="true" /> <el-table-column label="鍙傛暟閿��" align="center" prop="configValue" :show-overflow-tooltip="true" /> @@ -80,19 +80,19 @@ <el-table-column label="鎿嶄綔" align="center" width="150" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:config:edit']"></el-button> + <el-button v-hasPermi="['system:config:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:config:remove']"></el-button> + <el-button v-hasPermi="['system:config:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-form ref="configFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="鍙傛暟鍚嶇О" prop="configName"> <el-input v-model="form.configName" placeholder="璇疯緭鍏ュ弬鏁板悕绉�" /> @@ -123,11 +123,11 @@ </template> <script setup name="Config" lang="ts"> -import { listConfig, getConfig, delConfig, addConfig, updateConfig, refreshCache } from "@/api/system/config"; -import { ConfigForm, ConfigQuery, ConfigVO } from "@/api/system/config/types"; +import { listConfig, getConfig, delConfig, addConfig, updateConfig, refreshCache } from '@/api/system/config'; +import { ConfigForm, ConfigQuery, ConfigVO } from '@/api/system/config/types'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const { sys_yes_no } = toRefs<any>(proxy?.useDict("sys_yes_no")); +const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no')); const configList = ref<ConfigVO[]>([]); const loading = ref(true); @@ -149,9 +149,9 @@ configName: '', configKey: '', configValue: '', - configType: "Y", + configType: 'Y', remark: '' -} +}; const data = reactive<PageData<ConfigForm, ConfigQuery>>({ form: { ...initFormData }, queryParams: { @@ -159,12 +159,12 @@ pageSize: 10, configName: '', configKey: '', - configType: '', + configType: '' }, rules: { - configName: [{ required: true, message: "鍙傛暟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], - configKey: [{ required: true, message: "鍙傛暟閿悕涓嶈兘涓虹┖", trigger: "blur" }], - configValue: [{ required: true, message: "鍙傛暟閿�间笉鑳戒负绌�", trigger: "blur" }] + configName: [{ required: true, message: '鍙傛暟鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }], + configKey: [{ required: true, message: '鍙傛暟閿悕涓嶈兘涓虹┖', trigger: 'blur' }], + configValue: [{ required: true, message: '鍙傛暟閿�间笉鑳戒负绌�', trigger: 'blur' }] } }); @@ -177,40 +177,40 @@ configList.value = res.rows; total.value = res.total; loading.value = false; -} +}; /** 鍙栨秷鎸夐挳 */ const cancel = () => { reset(); dialog.visible = false; -} +}; /** 琛ㄥ崟閲嶇疆 */ const reset = () => { form.value = { ...initFormData }; configFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { dateRange.value = ['', '']; queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: ConfigVO[]) => { - ids.value = selection.map(item => item.configId); + ids.value = selection.map((item) => item.configId); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { reset(); dialog.visible = true; - dialog.title = "娣诲姞鍙傛暟"; -} + dialog.title = '娣诲姞鍙傛暟'; +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: ConfigVO) => { reset(); @@ -218,40 +218,44 @@ const res = await getConfig(configId); Object.assign(form.value, res.data); dialog.visible = true; - dialog.title = "淇敼鍙傛暟"; -} + dialog.title = '淇敼鍙傛暟'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { configFormRef.value?.validate(async (valid: boolean) => { if (valid) { form.value.configId ? await updateConfig(form.value) : await addConfig(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); dialog.visible = false; await getList(); } }); -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: ConfigVO) => { const configIds = row?.configId || ids.value; await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鍙傛暟缂栧彿涓�"' + configIds + '"鐨勬暟鎹」锛�'); await delConfig(configIds); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download("system/config/export", { - ...queryParams.value - }, `config_${new Date().getTime()}.xlsx`); -} + proxy?.download( + 'system/config/export', + { + ...queryParams.value + }, + `config_${new Date().getTime()}.xlsx` + ); +}; /** 鍒锋柊缂撳瓨鎸夐挳鎿嶄綔 */ const handleRefreshCache = async () => { await refreshCache(); - proxy?.$modal.msgSuccess("鍒锋柊缂撳瓨鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍒锋柊缂撳瓨鎴愬姛'); +}; onMounted(() => { getList(); -}) +}); </script> diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue index ea3321d..245eb6b 100644 --- a/src/views/system/dept/index.vue +++ b/src/views/system/dept/index.vue @@ -1,7 +1,7 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName"> @@ -25,21 +25,21 @@ <template #header> <el-row :gutter="10"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['system:dept:add']">鏂板 </el-button> + <el-button v-hasPermi="['system:dept:add']" type="primary" plain icon="Plus" @click="handleAdd()">鏂板 </el-button> </el-col> <el-col :span="1.5"> <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">灞曞紑/鎶樺彔</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table + ref="deptTableRef" v-loading="loading" :data="deptList" row-key="deptId" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" - ref="deptTableRef" :default-expand-all="isExpandAll" > <el-table-column prop="deptName" label="閮ㄩ棬鍚嶇О" width="260"></el-table-column> @@ -57,23 +57,23 @@ <el-table-column fixed="right" align="center" label="鎿嶄綔"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dept:edit']" /> + <el-button v-hasPermi="['system:dept:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)" /> </el-tooltip> <el-tooltip content="鏂板" placement="top"> - <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:dept:add']" /> + <el-button v-hasPermi="['system:dept:add']" link type="primary" icon="Plus" @click="handleAdd(scope.row)" /> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dept:remove']" /> + <el-button v-hasPermi="['system:dept:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)" /> </el-tooltip> </template> </el-table-column> </el-table> </el-card> - <el-dialog :title="dialog.title" v-model="dialog.visible" destroy-on-close append-to-bod width="600px"> + <el-dialog v-model="dialog.visible" :title="dialog.title" destroy-on-close append-to-bod width="600px"> <el-form ref="deptFormRef" :model="form" :rules="rules" label-width="80px"> <el-row> - <el-col :span="24" v-if="form.parentId !== 0"> + <el-col v-if="form.parentId !== 0" :span="24"> <el-form-item label="涓婄骇閮ㄩ棬" prop="parentId"> <el-tree-select v-model="form.parentId" @@ -115,8 +115,7 @@ <el-col :span="12"> <el-form-item label="閮ㄩ棬鐘舵��"> <el-radio-group v-model="form.status"> - <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label - }}</el-radio> + <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> </el-radio-group> </el-form-item> </el-col> @@ -133,26 +132,25 @@ </template> <script setup name="Dept" lang="ts"> -import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept" -import { DeptForm, DeptQuery, DeptVO } from "@/api/system/dept/types"; -import {UserVO} from "@/api/system/user/types"; -import {listUserByDeptId} from "@/api/system/user"; +import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from '@/api/system/dept'; +import { DeptForm, DeptQuery, DeptVO } from '@/api/system/dept/types'; +import { UserVO } from '@/api/system/user/types'; +import { listUserByDeptId } from '@/api/system/user'; interface DeptOptionsType { deptId: number | string; deptName: string; children: DeptOptionsType[]; - } -const { proxy } = getCurrentInstance() as ComponentInternalInstance -const { sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_normal_disable")); +const { proxy } = getCurrentInstance() as ComponentInternalInstance; +const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable')); -const deptList = ref<DeptVO[]>([]) -const loading = ref(true) -const showSearch = ref(true) -const deptOptions = ref<DeptOptionsType[]>([]) -const isExpandAll = ref(true) +const deptList = ref<DeptVO[]>([]); +const loading = ref(true); +const showSearch = ref(true); +const deptOptions = ref<DeptOptionsType[]>([]); +const isExpandAll = ref(true); const deptUserList = ref<UserVO[]>([]); const dialog = reactive<DialogOption>({ @@ -172,8 +170,8 @@ leader: undefined, phone: undefined, email: undefined, - status: "0" -} + status: '0' +}; const data = reactive<PageData<DeptForm, DeptQuery>>({ form: { ...initFormData }, queryParams: { @@ -183,30 +181,30 @@ status: undefined }, rules: { - parentId: [{ required: true, message: "涓婄骇閮ㄩ棬涓嶈兘涓虹┖", trigger: "blur" }], - deptName: [{ required: true, message: "閮ㄩ棬鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], - orderNum: [{ required: true, message: "鏄剧ず鎺掑簭涓嶈兘涓虹┖", trigger: "blur" }], - email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }], - phone: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }] - }, -}) + parentId: [{ required: true, message: '涓婄骇閮ㄩ棬涓嶈兘涓虹┖', trigger: 'blur' }], + deptName: [{ required: true, message: '閮ㄩ棬鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }], + orderNum: [{ required: true, message: '鏄剧ず鎺掑簭涓嶈兘涓虹┖', trigger: 'blur' }], + email: [{ type: 'email', message: '璇疯緭鍏ユ纭殑閭鍦板潃', trigger: ['blur', 'change'] }], + phone: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '璇疯緭鍏ユ纭殑鎵嬫満鍙风爜', trigger: 'blur' }] + } +}); -const { queryParams, form, rules } = toRefs<PageData<DeptForm, DeptQuery>>(data) +const { queryParams, form, rules } = toRefs<PageData<DeptForm, DeptQuery>>(data); /** 鏌ヨ鑿滃崟鍒楄〃 */ const getList = async () => { loading.value = true; const res = await listDept(queryParams.value); - const data = proxy?.handleTree<DeptVO>(res.data, "deptId") + const data = proxy?.handleTree<DeptVO>(res.data, 'deptId'); if (data) { - deptList.value = data + deptList.value = data; } - loading.value = false -} + loading.value = false; +}; /** 鏌ヨ褰撳墠閮ㄩ棬鐨勬墍鏈夌敤鎴� */ async function getDeptAllUser(deptId: any) { - if (deptId !== null && deptId !== "" && deptId !== undefined) { + if (deptId !== null && deptId !== '' && deptId !== undefined) { const res = await listUserByDeptId(deptId); deptUserList.value = res.data; } @@ -214,52 +212,52 @@ /** 鍙栨秷鎸夐挳 */ const cancel = () => { - reset() - dialog.visible = false -} + reset(); + dialog.visible = false; +}; /** 琛ㄥ崟閲嶇疆 */ const reset = () => { form.value = { ...initFormData }; deptFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); - handleQuery() -} + handleQuery(); +}; /** 灞曞紑/鎶樺彔鎿嶄綔 */ const handleToggleExpandAll = () => { isExpandAll.value = !isExpandAll.value; - toggleExpandAll(deptList.value, isExpandAll.value) -} + toggleExpandAll(deptList.value, isExpandAll.value); +}; /** 灞曞紑/鎶樺彔鎵�鏈� */ const toggleExpandAll = (data: DeptVO[], status: boolean) => { data.forEach((item) => { - deptTableRef.value?.toggleRowExpansion(item, status) - if (item.children && item.children.length > 0) toggleExpandAll(item.children, status) - }) -} + deptTableRef.value?.toggleRowExpansion(item, status); + if (item.children && item.children.length > 0) toggleExpandAll(item.children, status); + }); +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = async (row?: DeptVO) => { reset(); const res = await listDept(); - const data = proxy?.handleTree<DeptOptionsType>(res.data, "deptId"); + const data = proxy?.handleTree<DeptOptionsType>(res.data, 'deptId'); if (data) { - deptOptions.value = data + deptOptions.value = data; if (row && row.deptId) { form.value.parentId = row?.deptId; } dialog.visible = true; - dialog.title = "娣诲姞閮ㄩ棬"; + dialog.title = '娣诲姞閮ㄩ棬'; } -} +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row: DeptVO) => { @@ -267,9 +265,9 @@ //鏌ヨ褰撳墠閮ㄩ棬鎵�鏈夌敤鎴� getDeptAllUser(row.deptId); const res = await getDept(row.deptId); - form.value = res.data + form.value = res.data; const response = await listDeptExcludeChild(row.deptId); - const data = proxy?.handleTree<DeptOptionsType>(response.data, "deptId") + const data = proxy?.handleTree<DeptOptionsType>(response.data, 'deptId'); if (data) { deptOptions.value = data; if (data.length === 0) { @@ -282,26 +280,26 @@ } } dialog.visible = true; - dialog.title = "淇敼閮ㄩ棬"; -} + dialog.title = '淇敼閮ㄩ棬'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { deptFormRef.value?.validate(async (valid: boolean) => { if (valid) { form.value.deptId ? await updateDept(form.value) : await addDept(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); dialog.visible = false; await getList(); } - }) -} + }); +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row: DeptVO) => { await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.deptName + '"鐨勬暟鎹」?'); await delDept(row.deptId); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; onMounted(() => { getList(); diff --git a/src/views/system/dict/data.vue b/src/views/system/dict/data.vue index c2ef550..33df638 100644 --- a/src/views/system/dict/data.vue +++ b/src/views/system/dict/data.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="瀛楀吀鍚嶇О" prop="dictType"> <el-select v-model="queryParams.dictType" style="width: 200px"> <el-option v-for="item in typeOptions" :key="item.dictId" :label="item.dictName" :value="item.dictType" /> @@ -24,29 +24,29 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dict:add']">鏂板</el-button> + <el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:dict:edit']">淇敼</el-button> + <el-button v-hasPermi="['system:dict:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">淇敼</el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:dict:remove']"> + <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:dict:export']">瀵煎嚭</el-button> + <el-button v-hasPermi="['system:dict:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> </el-col> <el-col :span="1.5"> <el-button type="warning" plain icon="Close" @click="handleClose">鍏抽棴</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="dataList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="瀛楀吀缂栫爜" align="center" prop="dictCode" v-if="false" /> + <el-table-column v-if="false" label="瀛楀吀缂栫爜" align="center" prop="dictCode" /> <el-table-column label="瀛楀吀鏍囩" align="center" prop="dictLabel"> <template #default="scope"> <span v-if="(scope.row.listClass === '' || scope.row.listClass === 'default') && (scope.row.cssClass === '' || scope.row.cssClass == null)">{{ scope.row.dictLabel }}</span> @@ -64,19 +64,19 @@ <el-table-column label="鎿嶄綔" align="center" width="160" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']"></el-button> + <el-button v-hasPermi="['system:dict:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']"></el-button> + <el-button v-hasPermi="['system:dict:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-form ref="dataFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="瀛楀吀绫诲瀷"> <el-input v-model="form.dictType" :disabled="true" /> @@ -118,13 +118,13 @@ </template> <script setup name="Data" lang="ts"> -import useDictStore from '@/store/modules/dict' -import { optionselect as getDictOptionselect, getType } from "@/api/system/dict/type"; -import { listData, getData, delData, addData, updateData } from "@/api/system/dict/data"; +import useDictStore from '@/store/modules/dict'; +import { optionselect as getDictOptionselect, getType } from '@/api/system/dict/type'; +import { listData, getData, delData, addData, updateData } from '@/api/system/dict/data'; import { DictTypeVO } from '@/api/system/dict/type/types'; -import { DictDataForm, DictDataQuery, DictDataVO } from "@/api/system/dict/data/types"; +import { DictDataForm, DictDataQuery, DictDataVO } from '@/api/system/dict/data/types'; -const { proxy } = getCurrentInstance() as ComponentInternalInstance +const { proxy } = getCurrentInstance() as ComponentInternalInstance; const route = useRoute(); const dataList = ref<DictDataVO[]>([]); @@ -134,12 +134,11 @@ const single = ref(true); const multiple = ref(true); const total = ref(0); -const defaultDictType = ref(""); +const defaultDictType = ref(''); const typeOptions = ref<DictTypeVO[]>([]); const dataFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>(); - const dialog = reactive<DialogOption>({ visible: false, @@ -147,13 +146,13 @@ }); // 鏁版嵁鏍囩鍥炴樉鏍峰紡 -const listClassOptions = ref<Array<{ value: string, label: string }>>([ - { value: "default", label: "榛樿" }, - { value: "primary", label: "涓昏" }, - { value: "success", label: "鎴愬姛" }, - { value: "info", label: "淇℃伅" }, - { value: "warning", label: "璀﹀憡" }, - { value: "danger", label: "鍗遍櫓" } +const listClassOptions = ref<Array<{ value: string; label: string }>>([ + { value: 'default', label: '榛樿' }, + { value: 'primary', label: '涓昏' }, + { value: 'success', label: '鎴愬姛' }, + { value: 'info', label: '淇℃伅' }, + { value: 'warning', label: '璀﹀憡' }, + { value: 'danger', label: '鍗遍櫓' } ]); const initFormData: DictDataForm = { @@ -161,10 +160,10 @@ dictLabel: '', dictValue: '', cssClass: '', - listClass: "default", + listClass: 'default', dictSort: 0, remark: '' -} +}; const data = reactive<PageData<DictDataForm, DictDataQuery>>({ form: { ...initFormData }, queryParams: { @@ -175,9 +174,9 @@ dictLabel: '' }, rules: { - dictLabel: [{ required: true, message: "鏁版嵁鏍囩涓嶈兘涓虹┖", trigger: "blur" }], - dictValue: [{ required: true, message: "鏁版嵁閿�间笉鑳戒负绌�", trigger: "blur" }], - dictSort: [{ required: true, message: "鏁版嵁椤哄簭涓嶈兘涓虹┖", trigger: "blur" }] + dictLabel: [{ required: true, message: '鏁版嵁鏍囩涓嶈兘涓虹┖', trigger: 'blur' }], + dictValue: [{ required: true, message: '鏁版嵁閿�间笉鑳戒负绌�', trigger: 'blur' }], + dictSort: [{ required: true, message: '鏁版嵁椤哄簭涓嶈兘涓虹┖', trigger: 'blur' }] } }); @@ -189,13 +188,13 @@ queryParams.value.dictType = data.dictType; defaultDictType.value = data.dictType; getList(); -} +}; /** 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 */ const getTypeList = async () => { - const res = await getDictOptionselect() + const res = await getDictOptionselect(); typeOptions.value = res.data; -} +}; /** 鏌ヨ瀛楀吀鏁版嵁鍒楄〃 */ const getList = async () => { loading.value = true; @@ -203,46 +202,46 @@ dataList.value = res.rows; total.value = res.total; loading.value = false; -} +}; /** 鍙栨秷鎸夐挳 */ const cancel = () => { dialog.visible = false; reset(); -} +}; /** 琛ㄥ崟閲嶇疆 */ const reset = () => { form.value = { ...initFormData }; dataFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 杩斿洖鎸夐挳鎿嶄綔 */ const handleClose = () => { - const obj = { path: "/system/dict" }; + const obj = { path: '/system/dict' }; proxy?.$tab.closeOpenPage(obj); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); queryParams.value.dictType = defaultDictType.value; handleQuery(); -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { reset(); form.value.dictType = queryParams.value.dictType; dialog.visible = true; - dialog.title = "娣诲姞瀛楀吀鏁版嵁"; -} + dialog.title = '娣诲姞瀛楀吀鏁版嵁'; +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: DictDataVO[]) => { - ids.value = selection.map(item => item.dictCode); + ids.value = selection.map((item) => item.dictCode); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: DictDataVO) => { reset(); @@ -250,40 +249,42 @@ const res = await getData(dictCode); Object.assign(form.value, res.data); dialog.visible = true; - dialog.title = "淇敼瀛楀吀鏁版嵁"; -} + dialog.title = '淇敼瀛楀吀鏁版嵁'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { dataFormRef.value?.validate(async (valid: boolean) => { if (valid) { form.value.dictCode ? await updateData(form.value) : await addData(form.value); useDictStore().removeDict(queryParams.value.dictType); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); dialog.visible = false; await getList(); - } }); -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: DictDataVO) => { const dictCodes = row?.dictCode || ids.value; await proxy?.$modal.confirm('鏄惁纭鍒犻櫎瀛楀吀缂栫爜涓�"' + dictCodes + '"鐨勬暟鎹」锛�'); await delData(dictCodes); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); useDictStore().removeDict(queryParams.value.dictType); - -} +}; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download("system/dict/data/export", { - ...queryParams.value - }, `dict_data_${new Date().getTime()}.xlsx`); -} + proxy?.download( + 'system/dict/data/export', + { + ...queryParams.value + }, + `dict_data_${new Date().getTime()}.xlsx` + ); +}; onMounted(() => { - getTypes(route.params && route.params.dictId as string); + getTypes(route.params && (route.params.dictId as string)); getTypeList(); -}) +}); </script> diff --git a/src/views/system/dict/index.vue b/src/views/system/dict/index.vue index f3b0051..c87cf46 100644 --- a/src/views/system/dict/index.vue +++ b/src/views/system/dict/index.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="瀛楀吀鍚嶇О" prop="dictName"> <el-input v-model="queryParams.dictName" placeholder="璇疯緭鍏ュ瓧鍏稿悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> @@ -33,29 +33,29 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dict:add']">鏂板</el-button> + <el-button v-hasPermi="['system:dict:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:dict:edit']">淇敼</el-button> + <el-button v-hasPermi="['system:dict:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">淇敼</el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:dict:remove']"> + <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:dict:export']">瀵煎嚭</el-button> + <el-button v-hasPermi="['system:dict:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Refresh" @click="handleRefreshCache" v-hasPermi="['system:dict:remove']">鍒锋柊缂撳瓨</el-button> + <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Refresh" @click="handleRefreshCache">鍒锋柊缂撳瓨</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="typeList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="瀛楀吀缂栧彿" align="center" prop="dictId" v-if="false" /> + <el-table-column v-if="false" label="瀛楀吀缂栧彿" align="center" prop="dictId" /> <el-table-column label="瀛楀吀鍚嶇О" align="center" prop="dictName" :show-overflow-tooltip="true" /> <el-table-column label="瀛楀吀绫诲瀷" align="center" :show-overflow-tooltip="true"> <template #default="scope"> @@ -73,19 +73,19 @@ <el-table-column label="鎿嶄綔" align="center" width="160" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:dict:edit']"></el-button> + <el-button v-hasPermi="['system:dict:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:dict:remove']"></el-button> + <el-button v-hasPermi="['system:dict:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀瑰弬鏁伴厤缃璇濇 --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-form ref="dictFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="瀛楀吀鍚嶇О" prop="dictName"> <el-input v-model="form.dictName" placeholder="璇疯緭鍏ュ瓧鍏稿悕绉�" /> @@ -108,9 +108,9 @@ </template> <script setup name="Dict" lang="ts"> -import useDictStore from '@/store/modules/dict' -import { listType, getType, delType, addType, updateType, refreshCache } from "@/api/system/dict/type"; -import { DictTypeForm, DictTypeQuery, DictTypeVO } from "@/api/system/dict/type/types"; +import useDictStore from '@/store/modules/dict'; +import { listType, getType, delType, addType, updateType, refreshCache } from '@/api/system/dict/type'; +import { DictTypeForm, DictTypeQuery, DictTypeVO } from '@/api/system/dict/type/types'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -126,7 +126,6 @@ const dictFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>(); - const dialog = reactive<DialogOption>({ visible: false, title: '' @@ -137,7 +136,7 @@ dictName: '', dictType: '', remark: '' -} +}; const data = reactive<PageData<DictTypeForm, DictTypeQuery>>({ form: { ...initFormData }, queryParams: { @@ -147,9 +146,9 @@ dictType: '' }, rules: { - dictName: [{ required: true, message: "瀛楀吀鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], - dictType: [{ required: true, message: "瀛楀吀绫诲瀷涓嶈兘涓虹┖", trigger: "blur" }] - }, + dictName: [{ required: true, message: '瀛楀吀鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }], + dictType: [{ required: true, message: '瀛楀吀绫诲瀷涓嶈兘涓虹┖', trigger: 'blur' }] + } }); const { queryParams, form, rules } = toRefs(data); @@ -157,45 +156,45 @@ /** 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 */ const getList = () => { loading.value = true; - listType(proxy?.addDateRange(queryParams.value, dateRange.value)).then(res => { + listType(proxy?.addDateRange(queryParams.value, dateRange.value)).then((res) => { typeList.value = res.rows; total.value = res.total; loading.value = false; }); -} +}; /** 鍙栨秷鎸夐挳 */ const cancel = () => { reset(); dialog.visible = false; -} +}; /** 琛ㄥ崟閲嶇疆 */ const reset = () => { form.value = { ...initFormData }; dictFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { dateRange.value = ['', '']; queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { reset(); dialog.visible = true; - dialog.title = "娣诲姞瀛楀吀绫诲瀷"; -} + dialog.title = '娣诲姞瀛楀吀绫诲瀷'; +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: DictTypeVO[]) => { - ids.value = selection.map(item => item.dictId); + ids.value = selection.map((item) => item.dictId); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: DictTypeVO) => { reset(); @@ -203,41 +202,45 @@ const res = await getType(dictId); Object.assign(form.value, res.data); dialog.visible = true; - dialog.title = "淇敼瀛楀吀绫诲瀷"; -} + dialog.title = '淇敼瀛楀吀绫诲瀷'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { dictFormRef.value?.validate(async (valid: boolean) => { if (valid) { form.value.dictId ? await updateType(form.value) : await addType(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); dialog.visible = false; getList(); } }); -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: DictTypeVO) => { const dictIds = row?.dictId || ids.value; await proxy?.$modal.confirm('鏄惁纭鍒犻櫎瀛楀吀缂栧彿涓�"' + dictIds + '"鐨勬暟鎹」锛�'); await delType(dictIds); getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download("system/dict/type/export", { - ...queryParams.value - }, `dict_${new Date().getTime()}.xlsx`); -} + proxy?.download( + 'system/dict/type/export', + { + ...queryParams.value + }, + `dict_${new Date().getTime()}.xlsx` + ); +}; /** 鍒锋柊缂撳瓨鎸夐挳鎿嶄綔 */ const handleRefreshCache = async () => { await refreshCache(); - proxy?.$modal.msgSuccess("鍒锋柊鎴愬姛"); + proxy?.$modal.msgSuccess('鍒锋柊鎴愬姛'); useDictStore().cleanDict(); -} +}; onMounted(() => { getList(); -}) +}); </script> diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index 06cd928..3930b8f 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -1,7 +1,7 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="鑿滃崟鍚嶇О" prop="menuName"> @@ -25,21 +25,21 @@ <template #header> <el-row :gutter="10"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd()" v-hasPermi="['system:menu:add']">鏂板 </el-button> + <el-button v-hasPermi="['system:menu:add']" type="primary" plain icon="Plus" @click="handleAdd()">鏂板 </el-button> </el-col> <el-col :span="1.5"> <el-button type="info" plain icon="Sort" @click="handleToggleExpandAll">灞曞紑/鎶樺彔</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table + ref="menuTableRef" v-loading="loading" :data="menuList" row-key="menuId" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" - ref="menuTableRef" :default-expand-all="isExpandAll" > <el-table-column prop="menuName" label="鑿滃崟鍚嶇О" :show-overflow-tooltip="true" width="160"></el-table-column> @@ -64,20 +64,20 @@ <el-table-column fixed="right" label="鎿嶄綔" width="180"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:menu:edit']" /> + <el-button v-hasPermi="['system:menu:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)" /> </el-tooltip> <el-tooltip content="鏂板" placement="top"> - <el-button link type="primary" icon="Plus" @click="handleAdd(scope.row)" v-hasPermi="['system:menu:add']" /> + <el-button v-hasPermi="['system:menu:add']" link type="primary" icon="Plus" @click="handleAdd(scope.row)" /> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:menu:remove']" /> + <el-button v-hasPermi="['system:menu:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)" /> </el-tooltip> </template> </el-table-column> </el-table> </el-card> - <el-dialog :title="dialog.title" v-model="dialog.visible" destroy-on-close append-to-bod width="750px"> + <el-dialog v-model="dialog.visible" :title="dialog.title" destroy-on-close append-to-bod width="750px"> <el-form ref="menuFormRef" :model="form" :rules="rules" label-width="100px"> <el-row> <el-col :span="24"> @@ -101,7 +101,7 @@ </el-radio-group> </el-form-item> </el-col> - <el-col :span="24" v-if="form.menuType !== 'F'"> + <el-col v-if="form.menuType !== 'F'" :span="24"> <el-form-item label="鑿滃崟鍥炬爣" prop="icon"> <!-- 鍥炬爣閫夋嫨鍣� --> <icon-select v-model="form.icon" /> @@ -117,7 +117,7 @@ <el-input-number v-model="form.orderNum" controls-position="right" :min="0" /> </el-form-item> </el-col> - <el-col :span="12" v-if="form.menuType !== 'F'"> + <el-col v-if="form.menuType !== 'F'" :span="12"> <el-form-item> <template #label> <span> @@ -134,7 +134,7 @@ </el-radio-group> </el-form-item> </el-col> - <el-col :span="12" v-if="form.menuType !== 'F'"> + <el-col v-if="form.menuType !== 'F'" :span="12"> <el-form-item prop="path"> <template #label> <span> @@ -149,7 +149,7 @@ <el-input v-model="form.path" placeholder="璇疯緭鍏ヨ矾鐢卞湴鍧�" /> </el-form-item> </el-col> - <el-col :span="12" v-if="form.menuType === 'C'"> + <el-col v-if="form.menuType === 'C'" :span="12"> <el-form-item prop="component"> <template #label> <span> @@ -164,7 +164,7 @@ <el-input v-model="form.component" placeholder="璇疯緭鍏ョ粍浠惰矾寰�" /> </el-form-item> </el-col> - <el-col :span="12" v-if="form.menuType !== 'M'"> + <el-col v-if="form.menuType !== 'M'" :span="12"> <el-form-item> <el-input v-model="form.perms" placeholder="璇疯緭鍏ユ潈闄愭爣璇�" maxlength="100" /> <template #label> @@ -179,7 +179,7 @@ </template> </el-form-item> </el-col> - <el-col :span="12" v-if="form.menuType === 'C'"> + <el-col v-if="form.menuType === 'C'" :span="12"> <el-form-item> <el-input v-model="form.queryParam" placeholder="璇疯緭鍏ヨ矾鐢卞弬鏁�" maxlength="255" /> <template #label> @@ -194,7 +194,7 @@ </template> </el-form-item> </el-col> - <el-col :span="12" v-if="form.menuType === 'C'"> + <el-col v-if="form.menuType === 'C'" :span="12"> <el-form-item> <template #label> <span> @@ -212,7 +212,7 @@ </el-radio-group> </el-form-item> </el-col> - <el-col :span="12" v-if="form.menuType !== 'F'"> + <el-col v-if="form.menuType !== 'F'" :span="12"> <el-form-item> <template #label> <span> @@ -271,14 +271,14 @@ children: MenuOptionsType[] | undefined; } -const { proxy } = getCurrentInstance() as ComponentInternalInstance -const { sys_show_hide, sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_show_hide", "sys_normal_disable")); +const { proxy } = getCurrentInstance() as ComponentInternalInstance; +const { sys_show_hide, sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_show_hide', 'sys_normal_disable')); -const menuList = ref<MenuVO[]>([]) -const loading = ref(true) -const showSearch = ref(true) -const menuOptions = ref<MenuOptionsType[]>([]) -const isExpandAll = ref(false) +const menuList = ref<MenuVO[]>([]); +const loading = ref(true); +const showSearch = ref(true); +const menuOptions = ref<MenuOptionsType[]>([]); +const isExpandAll = ref(false); const dialog = reactive<DialogOption>({ visible: false, @@ -295,11 +295,11 @@ icon: '', menuType: MenuTypeEnum.M, orderNum: 1, - isFrame: "1", - isCache: "0", - visible: "0", - status: "0" -} + isFrame: '1', + isCache: '0', + visible: '0', + status: '0' +}; const data = reactive<PageData<MenuForm, MenuQuery>>({ form: { ...initFormData }, queryParams: { @@ -307,73 +307,73 @@ status: undefined }, rules: { - menuName: [{ required: true, message: "鑿滃崟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], - orderNum: [{ required: true, message: "鑿滃崟椤哄簭涓嶈兘涓虹┖", trigger: "blur" }], - path: [{ required: true, message: "璺敱鍦板潃涓嶈兘涓虹┖", trigger: "blur" }] - }, -}) + menuName: [{ required: true, message: '鑿滃崟鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }], + orderNum: [{ required: true, message: '鑿滃崟椤哄簭涓嶈兘涓虹┖', trigger: 'blur' }], + path: [{ required: true, message: '璺敱鍦板潃涓嶈兘涓虹┖', trigger: 'blur' }] + } +}); const menuTableRef = ref<ElTableInstance>(); -const { queryParams, form, rules } = toRefs<PageData<MenuForm, MenuQuery>>(data) +const { queryParams, form, rules } = toRefs<PageData<MenuForm, MenuQuery>>(data); /** 鏌ヨ鑿滃崟鍒楄〃 */ const getList = async () => { - loading.value = true + loading.value = true; const res = await listMenu(queryParams.value); - const data = proxy?.handleTree<MenuVO>(res.data, "menuId") + const data = proxy?.handleTree<MenuVO>(res.data, 'menuId'); if (data) { - menuList.value = data + menuList.value = data; } - loading.value = false -} + loading.value = false; +}; /** 鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋� */ const getTreeselect = async () => { - menuOptions.value = [] + menuOptions.value = []; const response = await listMenu(); - const menu: MenuOptionsType = { menuId: 0, menuName: "涓荤被鐩�", children: [] } - menu.children = proxy?.handleTree<MenuOptionsType>(response.data, "menuId") - menuOptions.value.push(menu) -} + const menu: MenuOptionsType = { menuId: 0, menuName: '涓荤被鐩�', children: [] }; + menu.children = proxy?.handleTree<MenuOptionsType>(response.data, 'menuId'); + menuOptions.value.push(menu); +}; /** 鍙栨秷鎸夐挳 */ const cancel = () => { - reset() - dialog.visible = false -} + reset(); + dialog.visible = false; +}; /** 琛ㄥ崟閲嶇疆 */ const reset = () => { form.value = { ...initFormData }; menuFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = (row?: MenuVO) => { reset(); getTreeselect(); - row && row.menuId ? form.value.parentId = row.menuId : form.value.parentId = 0; + row && row.menuId ? (form.value.parentId = row.menuId) : (form.value.parentId = 0); dialog.visible = true; - dialog.title = "娣诲姞鑿滃崟"; -} + dialog.title = '娣诲姞鑿滃崟'; +}; /** 灞曞紑/鎶樺彔鎿嶄綔 */ const handleToggleExpandAll = () => { isExpandAll.value = !isExpandAll.value; - toggleExpandAll(menuList.value, isExpandAll.value) -} + toggleExpandAll(menuList.value, isExpandAll.value); +}; /** 灞曞紑/鎶樺彔鎵�鏈� */ const toggleExpandAll = (data: MenuVO[], status: boolean) => { data.forEach((item: MenuVO) => { - menuTableRef.value?.toggleRowExpansion(item, status) - if (item.children && item.children.length > 0) toggleExpandAll(item.children, status) - }) -} + menuTableRef.value?.toggleRowExpansion(item, status); + if (item.children && item.children.length > 0) toggleExpandAll(item.children, status); + }); +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row: MenuVO) => { reset(); @@ -383,26 +383,26 @@ form.value = data; } dialog.visible = true; - dialog.title = "淇敼鑿滃崟"; -} + dialog.title = '淇敼鑿滃崟'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { menuFormRef.value?.validate(async (valid: boolean) => { if (valid) { form.value.menuId ? await updateMenu(form.value) : await addMenu(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); dialog.visible = false; await getList(); } - }) -} + }); +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row: MenuVO) => { await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.menuName + '"鐨勬暟鎹」?'); await delMenu(row.menuId); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; onMounted(() => { getList(); diff --git a/src/views/system/notice/index.vue b/src/views/system/notice/index.vue index 0c41ce1..7e063fb 100644 --- a/src/views/system/notice/index.vue +++ b/src/views/system/notice/index.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="鍏憡鏍囬" prop="noticeTitle"> <el-input v-model="queryParams.noticeTitle" placeholder="璇疯緭鍏ュ叕鍛婃爣棰�" clearable style="width: 200px" @keyup.enter="handleQuery" /> </el-form-item> @@ -28,25 +28,25 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:notice:add']">鏂板</el-button> + <el-button v-hasPermi="['system:notice:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:notice:edit']" + <el-button v-hasPermi="['system:notice:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" >淇敼</el-button > </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:notice:remove']"> + <el-button v-hasPermi="['system:notice:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="noticeList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="搴忓彿" align="center" prop="noticeId" width="100" v-if="false" /> + <el-table-column v-if="false" label="搴忓彿" align="center" prop="noticeId" width="100" /> <el-table-column label="鍏憡鏍囬" align="center" prop="noticeTitle" :show-overflow-tooltip="true" /> <el-table-column label="鍏憡绫诲瀷" align="center" prop="noticeType" width="100"> <template #default="scope"> @@ -67,19 +67,19 @@ <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:notice:edit']"></el-button> + <el-button v-hasPermi="['system:notice:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:notice:remove']"></el-button> + <el-button v-hasPermi="['system:notice:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀瑰叕鍛婂璇濇 --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="780px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="780px" append-to-body> <el-form ref="noticeFormRef" :model="form" :rules="rules" label-width="80px"> <el-row> <el-col :span="12"> @@ -97,8 +97,7 @@ <el-col :span="24"> <el-form-item label="鐘舵��"> <el-radio-group v-model="form.status"> - <el-radio v-for="dict in sys_notice_status" :key="dict.value" :label="dict.value">{{ dict.label - }}</el-radio> + <el-radio v-for="dict in sys_notice_status" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> </el-radio-group> </el-form-item> </el-col> @@ -120,11 +119,11 @@ </template> <script setup name="Notice" lang="ts"> -import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice"; -import { NoticeForm, NoticeQuery, NoticeVO } from "@/api/system/notice/types"; +import { listNotice, getNotice, delNotice, addNotice, updateNotice } from '@/api/system/notice'; +import { NoticeForm, NoticeQuery, NoticeVO } from '@/api/system/notice/types'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const { sys_notice_status, sys_notice_type } = toRefs<any>(proxy?.useDict("sys_notice_status", "sys_notice_type")); +const { sys_notice_status, sys_notice_type } = toRefs<any>(proxy?.useDict('sys_notice_status', 'sys_notice_type')); const noticeList = ref<NoticeVO[]>([]); const loading = ref(true); @@ -137,7 +136,6 @@ const queryFormRef = ref<ElFormInstance>(); const noticeFormRef = ref<ElFormInstance>(); - const dialog = reactive<DialogOption>({ visible: false, title: '' @@ -148,10 +146,10 @@ noticeTitle: '', noticeType: '', noticeContent: '', - status: "0", + status: '0', remark: '', createByName: '' -} +}; const data = reactive<PageData<NoticeForm, NoticeQuery>>({ form: { ...initFormData }, queryParams: { @@ -163,9 +161,9 @@ noticeType: '' }, rules: { - noticeTitle: [{ required: true, message: "鍏憡鏍囬涓嶈兘涓虹┖", trigger: "blur" }], - noticeType: [{ required: true, message: "鍏憡绫诲瀷涓嶈兘涓虹┖", trigger: "change" }] - }, + noticeTitle: [{ required: true, message: '鍏憡鏍囬涓嶈兘涓虹┖', trigger: 'blur' }], + noticeType: [{ required: true, message: '鍏憡绫诲瀷涓嶈兘涓虹┖', trigger: 'change' }] + } }); const { queryParams, form, rules } = toRefs(data); @@ -177,39 +175,39 @@ noticeList.value = res.rows; total.value = res.total; loading.value = false; -} +}; /** 鍙栨秷鎸夐挳 */ const cancel = () => { reset(); dialog.visible = false; -} +}; /** 琛ㄥ崟閲嶇疆 */ const reset = () => { form.value = { ...initFormData }; noticeFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: NoticeVO[]) => { - ids.value = selection.map(item => item.noticeId); + ids.value = selection.map((item) => item.noticeId); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { reset(); dialog.visible = true; - dialog.title = "娣诲姞鍏憡"; -} + dialog.title = '娣诲姞鍏憡'; +}; /**淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: NoticeVO) => { reset(); @@ -217,29 +215,29 @@ const { data } = await getNotice(noticeId); Object.assign(form.value, data); dialog.visible = true; - dialog.title = "淇敼鍏憡"; -} + dialog.title = '淇敼鍏憡'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { noticeFormRef.value?.validate(async (valid: boolean) => { if (valid) { form.value.noticeId ? await updateNotice(form.value) : await addNotice(form.value); - proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + proxy?.$modal.msgSuccess('淇敼鎴愬姛'); dialog.visible = false; await getList(); } }); -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: NoticeVO) => { - const noticeIds = row?.noticeId || ids.value + const noticeIds = row?.noticeId || ids.value; await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鍏憡缂栧彿涓�"' + noticeIds + '"鐨勬暟鎹」锛�'); await delNotice(noticeIds); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; onMounted(() => { getList(); -}) +}); </script> diff --git a/src/views/system/oss/config.vue b/src/views/system/oss/config.vue index 876347a..a33d958 100644 --- a/src/views/system/oss/config.vue +++ b/src/views/system/oss/config.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="閰嶇疆key" prop="configKey"> <el-input v-model="queryParams.configKey" placeholder="閰嶇疆key" clearable style="width: 200px" @keyup.enter="handleQuery" /> </el-form-item> @@ -39,27 +39,27 @@ 鍒犻櫎 </el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="ossConfigList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="涓诲缓" align="center" prop="ossConfigId" v-if="columns[0].visible" /> - <el-table-column label="閰嶇疆key" align="center" prop="configKey" v-if="columns[1].visible" /> - <el-table-column label="璁块棶绔欑偣" align="center" prop="endpoint" v-if="columns[2].visible" width="200" /> - <el-table-column label="鑷畾涔夊煙鍚�" align="center" prop="domain" v-if="columns[3].visible" width="200" /> - <el-table-column label="妗跺悕绉�" align="center" prop="bucketName" v-if="columns[4].visible" /> - <el-table-column label="鍓嶇紑" align="center" prop="prefix" v-if="columns[5].visible" /> - <el-table-column label="鍩�" align="center" prop="region" v-if="columns[6].visible" /> - <el-table-column label="妗舵潈闄愮被鍨�" align="center" prop="accessPolicy" v-if="columns[7].visible"> + <el-table-column v-if="columns[0].visible" label="涓诲缓" align="center" prop="ossConfigId" /> + <el-table-column v-if="columns[1].visible" label="閰嶇疆key" align="center" prop="configKey" /> + <el-table-column v-if="columns[2].visible" label="璁块棶绔欑偣" align="center" prop="endpoint" width="200" /> + <el-table-column v-if="columns[3].visible" label="鑷畾涔夊煙鍚�" align="center" prop="domain" width="200" /> + <el-table-column v-if="columns[4].visible" label="妗跺悕绉�" align="center" prop="bucketName" /> + <el-table-column v-if="columns[5].visible" label="鍓嶇紑" align="center" prop="prefix" /> + <el-table-column v-if="columns[6].visible" label="鍩�" align="center" prop="region" /> + <el-table-column v-if="columns[7].visible" label="妗舵潈闄愮被鍨�" align="center" prop="accessPolicy"> <template #default="scope"> - <el-tag type="warning" v-if="scope.row.accessPolicy === '0'">private</el-tag> - <el-tag type="success" v-if="scope.row.accessPolicy === '1'">public</el-tag> - <el-tag type="info" v-if="scope.row.accessPolicy === '2'">custom</el-tag> + <el-tag v-if="scope.row.accessPolicy === '0'" type="warning">private</el-tag> + <el-tag v-if="scope.row.accessPolicy === '1'" type="success">public</el-tag> + <el-tag v-if="scope.row.accessPolicy === '2'" type="info">custom</el-tag> </template> </el-table-column> - <el-table-column label="鏄惁榛樿" align="center" prop="status" v-if="columns[8].visible"> + <el-table-column v-if="columns[8].visible" label="鏄惁榛樿" align="center" prop="status"> <template #default="scope"> <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> </template> @@ -76,10 +76,10 @@ </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀瑰璞″瓨鍌ㄩ厤缃璇濇 --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="800px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="800px" append-to-body> <el-form ref="ossConfigFormRef" :model="form" :rules="rules" label-width="120px"> <el-form-item label="閰嶇疆key" prop="configKey"> <el-input v-model="form.configKey" placeholder="璇疯緭鍏ラ厤缃甼ey" /> @@ -132,19 +132,11 @@ </template> <script setup name="OssConfig" lang="ts"> -import { - listOssConfig, - getOssConfig, - delOssConfig, - addOssConfig, - updateOssConfig, - changeOssConfigStatus -} from "@/api/system/ossConfig"; -import { OssConfigForm, OssConfigQuery, OssConfigVO } from "@/api/system/ossConfig/types"; +import { listOssConfig, getOssConfig, delOssConfig, addOssConfig, updateOssConfig, changeOssConfigStatus } from '@/api/system/ossConfig'; +import { OssConfigForm, OssConfigQuery, OssConfigVO } from '@/api/system/ossConfig/types'; - -const { proxy } = getCurrentInstance() as ComponentInternalInstance -const { sys_yes_no } = toRefs<any>(proxy?.useDict("sys_yes_no")); +const { proxy } = getCurrentInstance() as ComponentInternalInstance; +const { sys_yes_no } = toRefs<any>(proxy?.useDict('sys_yes_no')); const ossConfigList = ref<OssConfigVO[]>([]); const buttonLoading = ref(false); @@ -176,7 +168,6 @@ { key: 8, label: `鐘舵�乣, visible: true } ]); - const initFormData: OssConfigForm = { ossConfigId: undefined, configKey: '', @@ -186,12 +177,12 @@ prefix: '', endpoint: '', domain: '', - isHttps: "N", - accessPolicy: "1", + isHttps: 'N', + accessPolicy: '1', region: '', - status: "1", - remark: '', -} + status: '1', + remark: '' +}; const data = reactive<PageData<OssConfigForm, OssConfigQuery>>({ form: { ...initFormData }, // 鏌ヨ鍙傛暟 @@ -200,47 +191,47 @@ pageSize: 10, configKey: '', bucketName: '', - status: '', + status: '' }, rules: { - configKey: [{ required: true, message: "configKey涓嶈兘涓虹┖", trigger: "blur" },], + configKey: [{ required: true, message: 'configKey涓嶈兘涓虹┖', trigger: 'blur' }], accessKey: [ - { required: true, message: "accessKey涓嶈兘涓虹┖", trigger: "blur" }, + { required: true, message: 'accessKey涓嶈兘涓虹┖', trigger: 'blur' }, { min: 2, max: 200, - message: "accessKey闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", - trigger: "blur", - }, + message: 'accessKey闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿', + trigger: 'blur' + } ], secretKey: [ - { required: true, message: "secretKey涓嶈兘涓虹┖", trigger: "blur" }, + { required: true, message: 'secretKey涓嶈兘涓虹┖', trigger: 'blur' }, { min: 2, max: 100, - message: "secretKey闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", - trigger: "blur", - }, + message: 'secretKey闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿', + trigger: 'blur' + } ], bucketName: [ - { required: true, message: "bucketName涓嶈兘涓虹┖", trigger: "blur" }, + { required: true, message: 'bucketName涓嶈兘涓虹┖', trigger: 'blur' }, { min: 2, max: 100, - message: "bucketName闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", - trigger: "blur", - }, + message: 'bucketName闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿', + trigger: 'blur' + } ], endpoint: [ - { required: true, message: "endpoint涓嶈兘涓虹┖", trigger: "blur" }, + { required: true, message: 'endpoint涓嶈兘涓虹┖', trigger: 'blur' }, { min: 2, max: 100, - message: "endpoint鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", - trigger: "blur", - }, + message: 'endpoint鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿', + trigger: 'blur' + } ], - accessPolicy: [{ required: true, message: "accessPolicy涓嶈兘涓虹┖", trigger: "blur" }] + accessPolicy: [{ required: true, message: 'accessPolicy涓嶈兘涓虹┖', trigger: 'blur' }] } }); @@ -253,39 +244,39 @@ ossConfigList.value = res.rows; total.value = res.total; loading.value = false; -} +}; /** 鍙栨秷鎸夐挳 */ const cancel = () => { dialog.visible = false; reset(); -} +}; /** 琛ㄥ崟閲嶇疆 */ const reset = () => { form.value = { ...initFormData }; ossConfigFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 閫夋嫨鏉℃暟 */ const handleSelectionChange = (selection: OssConfigVO[]) => { - ids.value = selection.map(item => item.ossConfigId); + ids.value = selection.map((item) => item.ossConfigId); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { reset(); dialog.visible = true; - dialog.title = "娣诲姞瀵硅薄瀛樺偍閰嶇疆"; -} + dialog.title = '娣诲姞瀵硅薄瀛樺偍閰嶇疆'; +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: OssConfigVO) => { reset(); @@ -293,49 +284,49 @@ const res = await getOssConfig(ossConfigId); Object.assign(form.value, res.data); dialog.visible = true; - dialog.title = "淇敼瀵硅薄瀛樺偍閰嶇疆"; -} + dialog.title = '淇敼瀵硅薄瀛樺偍閰嶇疆'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { ossConfigFormRef.value?.validate(async (valid: boolean) => { if (valid) { buttonLoading.value = true; if (form.value.ossConfigId) { - await updateOssConfig(form.value).finally(() => buttonLoading.value = false); + await updateOssConfig(form.value).finally(() => (buttonLoading.value = false)); } else { - await addOssConfig(form.value).finally(() => buttonLoading.value = false); + await addOssConfig(form.value).finally(() => (buttonLoading.value = false)); } - proxy?.$modal.msgSuccess("鏂板鎴愬姛"); + proxy?.$modal.msgSuccess('鏂板鎴愬姛'); dialog.visible = false; await getList(); } }); -} +}; /** 鐘舵�佷慨鏀� */ const handleStatusChange = async (row: OssConfigVO) => { - let text = row.status === "0" ? "鍚敤" : "鍋滅敤"; + let text = row.status === '0' ? '鍚敤' : '鍋滅敤'; try { await proxy?.$modal.confirm('纭瑕�"' + text + '""' + row.configKey + '"閰嶇疆鍚�?'); await changeOssConfigStatus(row.ossConfigId, row.status, row.configKey); - await getList() - proxy?.$modal.msgSuccess(text + "鎴愬姛"); - } catch { return } finally { - row.status = row.status === "0" ? "1" : "0"; + await getList(); + proxy?.$modal.msgSuccess(text + '鎴愬姛'); + } catch { + return; + } finally { + row.status = row.status === '0' ? '1' : '0'; } - -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: OssConfigVO) => { const ossConfigIds = row?.ossConfigId || ids.value; await proxy?.$modal.confirm('鏄惁纭鍒犻櫎OSS閰嶇疆缂栧彿涓�"' + ossConfigIds + '"鐨勬暟鎹」?'); loading.value = true; - await delOssConfig(ossConfigIds).finally(() => loading.value = false); + await delOssConfig(ossConfigIds).finally(() => (loading.value = false)); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); - -} + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; onMounted(() => { getList(); -}) +}); </script> diff --git a/src/views/system/oss/index.vue b/src/views/system/oss/index.vue index ec11708..1cc582e 100644 --- a/src/views/system/oss/index.vue +++ b/src/views/system/oss/index.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="鏂囦欢鍚�" prop="fileName"> <el-input v-model="queryParams.fileName" placeholder="璇疯緭鍏ユ枃浠跺悕" clearable style="width: 200px" @keyup.enter="handleQuery" /> </el-form-item> @@ -40,44 +40,42 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Upload" @click="handleFile" v-hasPermi="['system:oss:upload']">涓婁紶鏂囦欢</el-button> + <el-button v-hasPermi="['system:oss:upload']" type="primary" plain icon="Upload" @click="handleFile">涓婁紶鏂囦欢</el-button> </el-col> <el-col :span="1.5"> - <el-button type="primary" plain icon="Upload" @click="handleImage" v-hasPermi="['system:oss:upload']">涓婁紶鍥剧墖</el-button> + <el-button v-hasPermi="['system:oss:upload']" type="primary" plain icon="Upload" @click="handleImage">涓婁紶鍥剧墖</el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:oss:remove']"> + <el-button v-hasPermi="['system:oss:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> <el-col :span="1.5"> <el-button + v-hasPermi="['system:oss:edit']" :type="previewListResource ? 'danger' : 'warning'" plain @click="handlePreviewListResource(!previewListResource)" - v-hasPermi="['system:oss:edit']" - >棰勮寮�鍏� : - {{ - previewListResource ? "绂佺敤" : "鍚敤" }}</el-button + >棰勮寮�鍏� : {{ previewListResource ? '绂佺敤' : '鍚敤' }}</el-button > </el-col> <el-col :span="1.5"> - <el-button type="info" plain icon="Operation" @click="handleOssConfig" v-hasPermi="['system:oss:list']">閰嶇疆绠$悊</el-button> + <el-button v-hasPermi="['system:oss:list']" type="info" plain icon="Operation" @click="handleOssConfig">閰嶇疆绠$悊</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table + v-if="showTable" v-loading="loading" :data="ossList" - @selection-change="handleSelectionChange" :header-cell-class-name="handleHeaderClass" + @selection-change="handleSelectionChange" @header-click="handleHeaderCLick" - v-if="showTable" > <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="瀵硅薄瀛樺偍涓婚敭" align="center" prop="ossId" v-if="false" /> + <el-table-column v-if="false" label="瀵硅薄瀛樺偍涓婚敭" align="center" prop="ossId" /> <el-table-column label="鏂囦欢鍚�" align="center" prop="fileName" /> <el-table-column label="鍘熷悕" align="center" prop="originalName" /> <el-table-column label="鏂囦欢鍚庣紑" align="center" prop="fileSuffix" /> @@ -90,7 +88,7 @@ :src="scope.row.url" :preview-src-list="[scope.row.url]" /> - <span v-text="scope.row.url" v-if="!checkFileSuffix(scope.row.fileSuffix) || !previewListResource" /> + <span v-if="!checkFileSuffix(scope.row.fileSuffix) || !previewListResource" v-text="scope.row.url" /> </template> </el-table-column> <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180" sortable="custom"> @@ -103,23 +101,23 @@ <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="涓嬭浇" placement="top"> - <el-button link type="primary" icon="Download" @click="handleDownload(scope.row)" v-hasPermi="['system:oss:download']"></el-button> + <el-button v-hasPermi="['system:oss:download']" link type="primary" icon="Download" @click="handleDownload(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:oss:remove']"></el-button> + <el-button v-hasPermi="['system:oss:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀筄SS瀵硅薄瀛樺偍瀵硅瘽妗� --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-form ref="ossFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="鏂囦欢鍚�"> - <fileUpload v-model="form.file" v-if="type === 0" /> - <imageUpload v-model="form.file" v-if="type === 1" /> + <fileUpload v-if="type === 0" v-model="form.file" /> + <imageUpload v-if="type === 1" v-model="form.file" /> </el-form-item> </el-form> <template #footer> @@ -133,9 +131,9 @@ </template> <script setup name="Oss" lang="ts"> -import { listOss, delOss } from "@/api/system/oss"; -import ImagePreview from "@/components/ImagePreview/index.vue"; -import { OssForm, OssQuery, OssVO } from "@/api/system/oss/types"; +import { listOss, delOss } from '@/api/system/oss'; +import ImagePreview from '@/components/ImagePreview/index.vue'; +import { OssForm, OssQuery, OssVO } from '@/api/system/oss/types'; const router = useRouter(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -165,8 +163,8 @@ const queryFormRef = ref<ElFormInstance>(); const initFormData = { - file: undefined, -} + file: undefined +}; const data = reactive<PageData<OssForm, OssQuery>>({ form: { ...initFormData }, // 鏌ヨ鍙傛暟 @@ -182,9 +180,7 @@ isAsc: defaultSort.value.order }, rules: { - file: [ - { required: true, message: "鏂囦欢涓嶈兘涓虹┖", trigger: "blur" } - ] + file: [{ required: true, message: '鏂囦欢涓嶈兘涓虹┖', trigger: 'blur' }] } }); @@ -193,17 +189,17 @@ /** 鏌ヨOSS瀵硅薄瀛樺偍鍒楄〃 */ const getList = async () => { loading.value = true; - const res = await proxy?.getConfigKey("sys.oss.previewListResource"); + const res = await proxy?.getConfigKey('sys.oss.previewListResource'); previewListResource.value = res?.data === undefined ? true : res.data === 'true'; - const response = await listOss(proxy?.addDateRange(queryParams.value, dateRangeCreateTime.value, "CreateTime")); + const response = await listOss(proxy?.addDateRange(queryParams.value, dateRangeCreateTime.value, 'CreateTime')); ossList.value = response.rows; total.value = response.total; loading.value = false; showTable.value = true; -} +}; function checkFileSuffix(fileSuffix: string[]) { - let arr = ["png", "jpg", "jpeg"]; - return arr.some(type => { + let arr = ['png', 'jpg', 'jpeg']; + return arr.some((type) => { return fileSuffix.indexOf(type) > -1; }); } @@ -233,18 +229,18 @@ } /** 閫夋嫨鏉℃暟 */ function handleSelectionChange(selection: OssVO[]) { - ids.value = selection.map(item => item.ossId); + ids.value = selection.map((item) => item.ossId); single.value = selection.length != 1; multiple.value = !selection.length; } /** 璁剧疆鍒楃殑鎺掑簭涓烘垜浠嚜瀹氫箟鐨勬帓搴� */ const handleHeaderClass = ({ column }: any): any => { - column.order = column.multiOrder -} + column.order = column.multiOrder; +}; /** 鐐瑰嚮琛ㄥご杩涜鎺掑簭 */ const handleHeaderCLick = (column: any) => { if (column.sortable !== 'custom') { - return + return; } switch (column.multiOrder) { case 'descending': @@ -257,20 +253,20 @@ column.multiOrder = 'descending'; break; } - handleOrderChange(column.property, column.multiOrder) -} + handleOrderChange(column.property, column.multiOrder); +}; const handleOrderChange = (prop: string, order: string) => { - let orderByArr = queryParams.value.orderByColumn ? queryParams.value.orderByColumn.split(",") : []; - let isAscArr = queryParams.value.isAsc ? queryParams.value.isAsc.split(",") : []; - let propIndex = orderByArr.indexOf(prop) + let orderByArr = queryParams.value.orderByColumn ? queryParams.value.orderByColumn.split(',') : []; + let isAscArr = queryParams.value.isAsc ? queryParams.value.isAsc.split(',') : []; + let propIndex = orderByArr.indexOf(prop); if (propIndex !== -1) { if (order) { //鎺掑簭閲屽凡瀛樺湪 鍙慨鏀规帓搴� isAscArr[propIndex] = order; } else { //濡傛灉order涓簄ull 鍒欏垹闄ゆ帓搴忓瓧娈靛拰灞炴�� - isAscArr.splice(propIndex, 1);//鍒犻櫎鎺掑簭 - orderByArr.splice(propIndex, 1);//鍒犻櫎灞炴�� + isAscArr.splice(propIndex, 1); //鍒犻櫎鎺掑簭 + orderByArr.splice(propIndex, 1); //鍒犻櫎灞炴�� } } else { //鎺掑簭閲屼笉瀛樺湪鍒欐柊澧炴帓搴� @@ -278,58 +274,60 @@ isAscArr.push(order); } //鍚堝苟鎺掑簭 - queryParams.value.orderByColumn = orderByArr.join(","); - queryParams.value.isAsc = isAscArr.join(","); + queryParams.value.orderByColumn = orderByArr.join(','); + queryParams.value.isAsc = isAscArr.join(','); getList(); -} +}; /** 浠诲姟鏃ュ織鍒楄〃鏌ヨ */ const handleOssConfig = () => { - router.push('/system/oss-config/index') -} + router.push('/system/oss-config/index'); +}; /** 鏂囦欢鎸夐挳鎿嶄綔 */ const handleFile = () => { reset(); type.value = 0; dialog.visible = true; - dialog.title = "涓婁紶鏂囦欢"; -} + dialog.title = '涓婁紶鏂囦欢'; +}; /** 鍥剧墖鎸夐挳鎿嶄綔 */ const handleImage = () => { reset(); type.value = 1; dialog.visible = true; - dialog.title = "涓婁紶鍥剧墖"; -} + dialog.title = '涓婁紶鍥剧墖'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { dialog.visible = false; getList(); -} +}; /** 涓嬭浇鎸夐挳鎿嶄綔 */ const handleDownload = (row: OssVO) => { - proxy?.$download.oss(row.ossId) -} + proxy?.$download.oss(row.ossId); +}; /** 鐢ㄦ埛鐘舵�佷慨鏀� */ const handlePreviewListResource = async (preview: boolean) => { - let text = preview ? "鍚敤" : "鍋滅敤"; + let text = preview ? '鍚敤' : '鍋滅敤'; try { await proxy?.$modal.confirm('纭瑕�"' + text + '""棰勮鍒楄〃鍥剧墖"閰嶇疆鍚�?'); - await proxy?.updateConfigByKey("sys.oss.previewListResource", preview); - await getList() - proxy?.$modal.msgSuccess(text + "鎴愬姛"); - } catch { return } -} + await proxy?.updateConfigByKey('sys.oss.previewListResource', preview); + await getList(); + proxy?.$modal.msgSuccess(text + '鎴愬姛'); + } catch { + return; + } +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: OssVO) => { const ossIds = row?.ossId || ids.value; await proxy?.$modal.confirm('鏄惁纭鍒犻櫎OSS瀵硅薄瀛樺偍缂栧彿涓�"' + ossIds + '"鐨勬暟鎹」?'); loading.value = true; - await delOss(ossIds).finally(() => loading.value = false); + await delOss(ossIds).finally(() => (loading.value = false)); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; onMounted(() => { getList(); -}) +}); </script> diff --git a/src/views/system/post/index.vue b/src/views/system/post/index.vue index b1cddd3..030f05d 100644 --- a/src/views/system/post/index.vue +++ b/src/views/system/post/index.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="70"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="70"> <el-form-item label="宀椾綅缂栫爜" prop="postCode"> <el-input v-model="queryParams.postCode" placeholder="璇疯緭鍏ュ矖浣嶇紪鐮�" clearable style="width: 200px" @keyup.enter="handleQuery" /> </el-form-item> @@ -27,26 +27,26 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:post:add']">鏂板</el-button> + <el-button v-hasPermi="['system:post:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:post:edit']">淇敼</el-button> + <el-button v-hasPermi="['system:post:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">淇敼</el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:post:remove']"> + <el-button v-hasPermi="['system:post:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:post:export']">瀵煎嚭</el-button> + <el-button v-hasPermi="['system:post:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="宀椾綅缂栧彿" align="center" prop="postId" v-if="false" /> + <el-table-column v-if="false" label="宀椾綅缂栧彿" align="center" prop="postId" /> <el-table-column label="宀椾綅缂栫爜" align="center" prop="postCode" /> <el-table-column label="宀椾綅鍚嶇О" align="center" prop="postName" /> <el-table-column label="宀椾綅鎺掑簭" align="center" prop="postSort" /> @@ -63,20 +63,20 @@ <el-table-column label="鎿嶄綔" width="180" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:post:edit']"></el-button> + <el-button v-hasPermi="['system:post:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:post:remove']"></el-button> + <el-button v-hasPermi="['system:post:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀瑰矖浣嶅璇濇 --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-form ref="postFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="宀椾綅鍚嶇О" prop="postName"> <el-input v-model="form.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" /> @@ -107,11 +107,11 @@ </template> <script setup name="Post" lang="ts"> -import { listPost, addPost, delPost, getPost, updatePost } from "@/api/system/post"; -import { PostForm, PostQuery, PostVO } from "@/api/system/post/types"; +import { listPost, addPost, delPost, getPost, updatePost } from '@/api/system/post'; +import { PostForm, PostQuery, PostVO } from '@/api/system/post/types'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const { sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_normal_disable")); +const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable')); const postList = ref<PostVO[]>([]); const loading = ref(true); @@ -134,9 +134,9 @@ postCode: '', postName: '', postSort: 0, - status: "0", + status: '0', remark: '' -} +}; const data = reactive<PageData<PostForm, PostQuery>>({ form: { ...initFormData }, @@ -148,9 +148,9 @@ status: '' }, rules: { - postName: [{ required: true, message: "宀椾綅鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], - postCode: [{ required: true, message: "宀椾綅缂栫爜涓嶈兘涓虹┖", trigger: "blur" }], - postSort: [{ required: true, message: "宀椾綅椤哄簭涓嶈兘涓虹┖", trigger: "blur" }], + postName: [{ required: true, message: '宀椾綅鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }], + postCode: [{ required: true, message: '宀椾綅缂栫爜涓嶈兘涓虹┖', trigger: 'blur' }], + postSort: [{ required: true, message: '宀椾綅椤哄簭涓嶈兘涓虹┖', trigger: 'blur' }] } }); @@ -163,39 +163,39 @@ postList.value = res.rows; total.value = res.total; loading.value = false; -} +}; /** 鍙栨秷鎸夐挳 */ const cancel = () => { reset(); dialog.visible = false; -} +}; /** 琛ㄥ崟閲嶇疆 */ const reset = () => { form.value = { ...initFormData }; postFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: PostVO[]) => { - ids.value = selection.map(item => item.postId); + ids.value = selection.map((item) => item.postId); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { reset(); dialog.visible = true; - dialog.title = "娣诲姞宀椾綅"; -} + dialog.title = '娣诲姞宀椾綅'; +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: PostVO) => { reset(); @@ -203,33 +203,37 @@ const res = await getPost(postId); Object.assign(form.value, res.data); dialog.visible = true; - dialog.title = "淇敼宀椾綅"; -} + dialog.title = '淇敼宀椾綅'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { postFormRef.value?.validate(async (valid: boolean) => { if (valid) { form.value.postId ? await updatePost(form.value) : await addPost(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); dialog.visible = false; await getList(); } }); -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: PostVO) => { const postIds = row?.postId || ids.value; await proxy?.$modal.confirm('鏄惁纭鍒犻櫎宀椾綅缂栧彿涓�"' + postIds + '"鐨勬暟鎹」锛�'); await delPost(postIds); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download("system/post/export", { - ...queryParams.value - }, `post_${new Date().getTime()}.xlsx`); -} + proxy?.download( + 'system/post/export', + { + ...queryParams.value + }, + `post_${new Date().getTime()}.xlsx` + ); +}; onMounted(() => { getList(); diff --git a/src/views/system/role/authUser.vue b/src/views/system/role/authUser.vue index 7ad8a5a..98beb1b 100644 --- a/src/views/system/role/authUser.vue +++ b/src/views/system/role/authUser.vue @@ -1,8 +1,8 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="search" v-show="showSearch"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true"> + <div v-show="showSearch" class="search"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName"> <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> @@ -20,17 +20,17 @@ <template #header> <el-row :gutter="10"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="openSelectUser" v-hasPermi="['system:role:add']">娣诲姞鐢ㄦ埛</el-button> + <el-button v-hasPermi="['system:role:add']" type="primary" plain icon="Plus" @click="openSelectUser">娣诲姞鐢ㄦ埛</el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="CircleClose" :disabled="multiple" @click="cancelAuthUserAll" v-hasPermi="['system:role:remove']"> + <el-button v-hasPermi="['system:role:remove']" type="danger" plain icon="CircleClose" :disabled="multiple" @click="cancelAuthUserAll"> 鎵归噺鍙栨秷鎺堟潈 </el-button> </el-col> <el-col :span="1.5"> <el-button type="warning" plain icon="Close" @click="handleClose">鍏抽棴</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :search="true"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" :search="true" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> @@ -52,28 +52,27 @@ <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="鍙栨秷鎺堟潈" placement="top"> - <el-button link type="primary" icon="CircleClose" @click="cancelAuthUser(scope.row)" v-hasPermi="['system:role:remove']"> </el-button> + <el-button v-hasPermi="['system:role:remove']" link type="primary" icon="CircleClose" @click="cancelAuthUser(scope.row)"> </el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> - <select-user ref="selectRef" :roleId="queryParams.roleId" @ok="handleQuery" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> + <select-user ref="selectRef" :role-id="queryParams.roleId" @ok="handleQuery" /> </el-card> </div> </template> <script setup name="AuthUser" lang="ts"> -import { allocatedUserList, authUserCancel, authUserCancelAll } from "@/api/system/role"; -import { UserQuery } from "@/api/system/user/types"; -import { UserVO } from "@/api/system/user/types"; -import SelectUser from "./selectUser.vue"; - +import { allocatedUserList, authUserCancel, authUserCancelAll } from '@/api/system/role'; +import { UserQuery } from '@/api/system/user/types'; +import { UserVO } from '@/api/system/user/types'; +import SelectUser from './selectUser.vue'; const route = useRoute(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const { sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_normal_disable")); +const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable')); const userList = ref<UserVO[]>([]); const loading = ref(true); @@ -90,7 +89,7 @@ pageSize: 10, roleId: route.params.roleId as string, userName: undefined, - phonenumber: undefined, + phonenumber: undefined }); /** 鏌ヨ鎺堟潈鐢ㄦ埛鍒楄〃 */ @@ -100,47 +99,47 @@ userList.value = res.rows; total.value = res.total; loading.value = false; -} +}; // 杩斿洖鎸夐挳 const handleClose = () => { - const obj = { path: "/system/role" }; + const obj = { path: '/system/role' }; proxy?.$tab.closeOpenPage(obj); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; // 澶氶�夋閫変腑鏁版嵁 const handleSelectionChange = (selection: UserVO[]) => { - userIds.value = selection.map(item => item.userId); + userIds.value = selection.map((item) => item.userId); multiple.value = !selection.length; -} +}; /** 鎵撳紑鎺堟潈鐢ㄦ埛琛ㄥ脊绐� */ const openSelectUser = () => { selectRef.value?.show(); -} +}; /** 鍙栨秷鎺堟潈鎸夐挳鎿嶄綔 */ const cancelAuthUser = async (row: UserVO) => { await proxy?.$modal.confirm('纭瑕佸彇娑堣鐢ㄦ埛"' + row.userName + '"瑙掕壊鍚楋紵'); await authUserCancel({ userId: row.userId, roleId: queryParams.roleId }); await getList(); - proxy?.$modal.msgSuccess("鍙栨秷鎺堟潈鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍙栨秷鎺堟潈鎴愬姛'); +}; /** 鎵归噺鍙栨秷鎺堟潈鎸夐挳鎿嶄綔 */ const cancelAuthUserAll = async () => { const roleId = queryParams.roleId; - const uIds = userIds.value.join(","); - await proxy?.$modal.confirm("鏄惁鍙栨秷閫変腑鐢ㄦ埛鎺堟潈鏁版嵁椤�?"); + const uIds = userIds.value.join(','); + await proxy?.$modal.confirm('鏄惁鍙栨秷閫変腑鐢ㄦ埛鎺堟潈鏁版嵁椤�?'); await authUserCancelAll({ roleId: roleId, userIds: uIds }); await getList(); - proxy?.$modal.msgSuccess("鍙栨秷鎺堟潈鎴愬姛"); -} + proxy?.$modal.msgSuccess('鍙栨秷鎺堟潈鎴愬姛'); +}; onMounted(() => { getList(); diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index bb6fc2c..26c17de 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -1,7 +1,7 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="瑙掕壊鍚嶇О" prop="roleName"> @@ -28,8 +28,8 @@ </el-form-item> <el-form-item> - <el-button type="primary" @click="handleQuery" icon="Search">鎼滅储</el-button> - <el-button @click="resetQuery" icon="Refresh">閲嶇疆</el-button> + <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> + <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> </el-form-item> </el-form> </el-card> @@ -40,24 +40,24 @@ <template #header> <el-row :gutter="10"> <el-col :span="1.5"> - <el-button type="primary" plain @click="handleAdd()" icon="Plus" v-hasPermi="['system:role:add']">鏂板</el-button> + <el-button v-hasPermi="['system:role:add']" type="primary" plain icon="Plus" @click="handleAdd()">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain @click="handleUpdate()" :disabled="single" icon="Edit" v-hasPermi="['system:role:edit']">淇敼</el-button> + <el-button v-hasPermi="['system:role:edit']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()">淇敼</el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain :disabled="ids.length === 0" @click="handleDelete()" v-hasPermi="['system:role:delete']">鍒犻櫎</el-button> + <el-button v-hasPermi="['system:role:delete']" type="danger" plain :disabled="ids.length === 0" @click="handleDelete()">鍒犻櫎</el-button> </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:role:export']">瀵煎嚭</el-button> + <el-button v-hasPermi="['system:role:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table ref="roleTableRef" v-loading="loading" :data="roleList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="瑙掕壊缂栧彿" prop="roleId" width="120" v-if="false" /> + <el-table-column v-if="false" label="瑙掕壊缂栧彿" prop="roleId" width="120" /> <el-table-column label="瑙掕壊鍚嶇О" prop="roleName" :show-overflow-tooltip="true" width="150" /> <el-table-column label="鏉冮檺瀛楃" prop="roleKey" :show-overflow-tooltip="true" width="200" /> <el-table-column label="鏄剧ず椤哄簭" prop="roleSort" width="100" /> @@ -74,17 +74,17 @@ <el-table-column fixed="right" label="鎿嶄綔" width="180"> <template #default="scope"> - <el-tooltip content="淇敼" placement="top" v-if="scope.row.roleId !== 1"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:role:edit']"></el-button> + <el-tooltip v-if="scope.row.roleId !== 1" content="淇敼" placement="top"> + <el-button v-hasPermi="['system:role:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> </el-tooltip> - <el-tooltip content="鍒犻櫎" placement="top" v-if="scope.row.roleId !== 1"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:role:remove']"></el-button> + <el-tooltip v-if="scope.row.roleId !== 1" content="鍒犻櫎" placement="top"> + <el-button v-hasPermi="['system:role:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> - <el-tooltip content="鏁版嵁鏉冮檺" placement="top" v-if="scope.row.roleId !== 1"> - <el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:edit']"></el-button> + <el-tooltip v-if="scope.row.roleId !== 1" content="鏁版嵁鏉冮檺" placement="top"> + <el-button v-hasPermi="['system:role:edit']" link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)"></el-button> </el-tooltip> - <el-tooltip content="鍒嗛厤鐢ㄦ埛" placement="top" v-if="scope.row.roleId !== 1"> - <el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)" v-hasPermi="['system:role:edit']"></el-button> + <el-tooltip v-if="scope.row.roleId !== 1" content="鍒嗛厤鐢ㄦ埛" placement="top"> + <el-button v-hasPermi="['system:role:edit']" link type="primary" icon="User" @click="handleAuthUser(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> @@ -99,7 +99,7 @@ /> </el-card> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-form ref="roleFormRef" :model="form" :rules="rules" label-width="100px"> <el-form-item label="瑙掕壊鍚嶇О" prop="roleName"> <el-input v-model="form.roleName" placeholder="璇疯緭鍏ヨ鑹插悕绉�" /> @@ -120,9 +120,7 @@ </el-form-item> <el-form-item label="鐘舵��"> <el-radio-group v-model="form.status"> - <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ - dict.label - }}</el-radio> + <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> </el-radio-group> </el-form-item> <el-form-item label="鑿滃崟鏉冮檺"> @@ -130,10 +128,10 @@ <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">鍏ㄩ��/鍏ㄤ笉閫�</el-checkbox> <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">鐖跺瓙鑱斿姩</el-checkbox> <el-tree + ref="menuRef" class="tree-border" :data="menuOptions" show-checkbox - ref="menuRef" node-key="id" :check-strictly="!form.menuCheckStrictly" empty-text="鍔犺浇涓紝璇风◢鍊�" @@ -153,8 +151,8 @@ </el-dialog> <!-- 鍒嗛厤瑙掕壊鏁版嵁鏉冮檺瀵硅瘽妗� --> - <el-dialog :title="dialog.title" v-model="openDataScope" width="500px" append-to-body> - <el-form :model="form" label-width="80px" ref="dataScopeRef"> + <el-dialog v-model="openDataScope" :title="dialog.title" width="500px" append-to-body> + <el-form ref="dataScopeRef" :model="form" label-width="80px"> <el-form-item label="瑙掕壊鍚嶇О"> <el-input v-model="form.roleName" :disabled="true" /> </el-form-item> @@ -166,16 +164,16 @@ <el-option v-for="item in dataScopeOptions" :key="item.value" :label="item.label" :value="item.value"></el-option> </el-select> </el-form-item> - <el-form-item label="鏁版嵁鏉冮檺" v-show="form.dataScope === '2'"> + <el-form-item v-show="form.dataScope === '2'" label="鏁版嵁鏉冮檺"> <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">灞曞紑/鎶樺彔</el-checkbox> <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">鍏ㄩ��/鍏ㄤ笉閫�</el-checkbox> <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">鐖跺瓙鑱斿姩</el-checkbox> <el-tree + ref="deptRef" class="tree-border" :data="deptOptions" show-checkbox default-expand-all - ref="deptRef" node-key="id" :check-strictly="!form.deptCheckStrictly" empty-text="鍔犺浇涓紝璇风◢鍊�" @@ -194,7 +192,7 @@ </template> <script setup name="Role" lang="ts"> -import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from "@/api/system/role"; +import { addRole, changeRoleStatus, dataScope, delRole, getRole, listRole, updateRole, deptTreeSelect } from '@/api/system/role'; import { roleMenuTreeselect, treeselect as menuTreeselect } from '@/api/system/menu/index'; import { RoleVO, RoleForm, RoleQuery, DeptTreeOption } from '@/api/system/role/types'; import { MenuTreeOption, RoleMenuTree } from '@/api/system/menu/types'; @@ -204,29 +202,29 @@ const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable')); const roleList = ref<RoleVO[]>(); -const loading = ref(true) -const showSearch = ref(true) -const ids = ref<Array<string | number>>([]) -const single = ref(true) -const multiple = ref(true) -const total = ref(0) -const dateRange = ref<[DateModelType, DateModelType]>(['', '']) -const menuOptions = ref<MenuTreeOption[]>([]) -const menuExpand = ref(false) -const menuNodeAll = ref(false) -const deptExpand = ref(true) -const deptNodeAll = ref(false) -const deptOptions = ref<DeptTreeOption[]>([]) -const openDataScope = ref(false) +const loading = ref(true); +const showSearch = ref(true); +const ids = ref<Array<string | number>>([]); +const single = ref(true); +const multiple = ref(true); +const total = ref(0); +const dateRange = ref<[DateModelType, DateModelType]>(['', '']); +const menuOptions = ref<MenuTreeOption[]>([]); +const menuExpand = ref(false); +const menuNodeAll = ref(false); +const deptExpand = ref(true); +const deptNodeAll = ref(false); +const deptOptions = ref<DeptTreeOption[]>([]); +const openDataScope = ref(false); /** 鏁版嵁鑼冨洿閫夐」*/ const dataScopeOptions = ref([ - { value: "1", label: "鍏ㄩ儴鏁版嵁鏉冮檺" }, - { value: "2", label: "鑷畾鏁版嵁鏉冮檺" }, - { value: "3", label: "鏈儴闂ㄦ暟鎹潈闄�" }, - { value: "4", label: "鏈儴闂ㄥ強浠ヤ笅鏁版嵁鏉冮檺" }, - { value: "5", label: "浠呮湰浜烘暟鎹潈闄�" } -]) + { value: '1', label: '鍏ㄩ儴鏁版嵁鏉冮檺' }, + { value: '2', label: '鑷畾鏁版嵁鏉冮檺' }, + { value: '3', label: '鏈儴闂ㄦ暟鎹潈闄�' }, + { value: '4', label: '鏈儴闂ㄥ強浠ヤ笅鏁版嵁鏉冮檺' }, + { value: '5', label: '浠呮湰浜烘暟鎹潈闄�' } +]); const queryFormRef = ref<ElFormInstance>(); const roleFormRef = ref<ElFormInstance>(); @@ -245,8 +243,8 @@ remark: '', dataScope: '1', menuIds: [], - deptIds: [], -} + deptIds: [] +}; const data = reactive<PageData<RoleForm, RoleQuery>>({ form: { ...initForm }, @@ -255,15 +253,15 @@ pageSize: 10, roleName: '', roleKey: '', - status: '', + status: '' }, rules: { - roleName: [{ required: true, message: "瑙掕壊鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], - roleKey: [{ required: true, message: "鏉冮檺瀛楃涓嶈兘涓虹┖", trigger: "blur" }], - roleSort: [{ required: true, message: "瑙掕壊椤哄簭涓嶈兘涓虹┖", trigger: "blur" }] + roleName: [{ required: true, message: '瑙掕壊鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }], + roleKey: [{ required: true, message: '鏉冮檺瀛楃涓嶈兘涓虹┖', trigger: 'blur' }], + roleSort: [{ required: true, message: '瑙掕壊椤哄簭涓嶈兘涓虹┖', trigger: 'blur' }] } -}) -const { form, queryParams, rules } = toRefs(data) +}); +const { form, queryParams, rules } = toRefs(data); const dialog = reactive<DialogOption>({ visible: false, @@ -274,13 +272,13 @@ * 鏌ヨ瑙掕壊鍒楄〃 */ const getList = () => { - loading.value = true - listRole(proxy?.addDateRange(queryParams.value, dateRange.value)).then(res => { - roleList.value = res.rows - total.value = res.total - loading.value = false - }) -} + loading.value = true; + listRole(proxy?.addDateRange(queryParams.value, dateRange.value)).then((res) => { + roleList.value = res.rows; + total.value = res.total; + loading.value = false; + }); +}; /** * 鎼滅储鎸夐挳鎿嶄綔 @@ -288,14 +286,14 @@ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 閲嶇疆 */ const resetQuery = () => { - dateRange.value = ['', ''] + dateRange.value = ['', '']; queryFormRef.value?.resetFields(); handleQuery(); -} +}; /**鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: RoleVO) => { const roleids = row?.roleId || ids.value; @@ -303,43 +301,47 @@ await delRole(roleids); getList(); proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); -} +}; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download("system/role/export", { - ...queryParams.value, - }, `role_${new Date().getTime()}.xlsx`) -} + proxy?.download( + 'system/role/export', + { + ...queryParams.value + }, + `role_${new Date().getTime()}.xlsx` + ); +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: RoleVO[]) => { ids.value = selection.map((item: RoleVO) => item.roleId); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 瑙掕壊鐘舵�佷慨鏀� */ const handleStatusChange = async (row: RoleVO) => { - let text = row.status === "0" ? "鍚敤" : "鍋滅敤"; + let text = row.status === '0' ? '鍚敤' : '鍋滅敤'; try { await proxy?.$modal.confirm('纭瑕�"' + text + '""' + row.roleName + '"瑙掕壊鍚�?'); await changeRoleStatus(row.roleId, row.status); - proxy?.$modal.msgSuccess(text + "鎴愬姛"); + proxy?.$modal.msgSuccess(text + '鎴愬姛'); } catch { - row.status = row.status === "0" ? "1" : "0"; + row.status = row.status === '0' ? '1' : '0'; } -} +}; /** 鍒嗛厤鐢ㄦ埛 */ const handleAuthUser = (row: RoleVO) => { - router.push("/system/role-auth/user/" + row.roleId); -} + router.push('/system/role-auth/user/' + row.roleId); +}; /** 鏌ヨ鑿滃崟鏍戠粨鏋� */ const getMenuTreeselect = async () => { const res = await menuTreeselect(); menuOptions.value = res.data; -} +}; /** 鎵�鏈夐儴闂ㄨ妭鐐规暟鎹� */ const getDeptAllCheckedKeys = (): any => { // 鐩墠琚�変腑鐨勯儴闂ㄨ妭鐐� @@ -349,67 +351,65 @@ if (halfCheckedKeys) { checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys); } - return checkedKeys -} + return checkedKeys; +}; /** 閲嶇疆鏂板鐨勮〃鍗曚互鍙婂叾浠栨暟鎹� */ const reset = () => { menuRef.value?.setCheckedKeys([]); - menuExpand.value = false - menuNodeAll.value = false - deptExpand.value = true - deptNodeAll.value = false + menuExpand.value = false; + menuNodeAll.value = false; + deptExpand.value = true; + deptNodeAll.value = false; form.value = { ...initForm }; roleFormRef.value?.resetFields(); - -} +}; /** 娣诲姞瑙掕壊 */ const handleAdd = () => { reset(); getMenuTreeselect(); dialog.visible = true; - dialog.title = "娣诲姞瑙掕壊"; -} + dialog.title = '娣诲姞瑙掕壊'; +}; /** 淇敼瑙掕壊 */ const handleUpdate = async (row?: RoleVO) => { reset(); - const roleId = row?.roleId || ids.value[0] + const roleId = row?.roleId || ids.value[0]; const { data } = await getRole(roleId); Object.assign(form.value, data); form.value.roleSort = Number(form.value.roleSort); const res = await getRoleMenuTreeselect(roleId); - dialog.title = "淇敼瑙掕壊"; + dialog.title = '淇敼瑙掕壊'; dialog.visible = true; res.checkedKeys.forEach((v) => { nextTick(() => { menuRef.value?.setChecked(v, true, false); - }) - }) - -} + }); + }); +}; /** 鏍规嵁瑙掕壊ID鏌ヨ鑿滃崟鏍戠粨鏋� */ const getRoleMenuTreeselect = (roleId: string | number) => { return roleMenuTreeselect(roleId).then((res): RoleMenuTree => { menuOptions.value = res.data.menus; return res.data; - }) -} + }); +}; /** 鏍规嵁瑙掕壊ID鏌ヨ閮ㄩ棬鏍戠粨鏋� */ const getRoleDeptTreeSelect = async (roleId: string | number) => { const res = await deptTreeSelect(roleId); deptOptions.value = res.data.depts; return res.data; -} +}; /** 鏍戞潈闄愶紙灞曞紑/鎶樺彔锛�*/ const handleCheckedTreeExpand = (value: boolean, type: string) => { - if (type == "menu") { + if (type == 'menu') { let treeList = menuOptions.value; for (let i = 0; i < treeList.length; i++) { if (menuRef.value) { menuRef.value.store.nodesMap[treeList[i].id].expanded = value; } } - } else if (type == "dept") { + } else if (type == 'dept') { let treeList = deptOptions.value; for (let i = 0; i < treeList.length; i++) { if (deptRef.value) { @@ -417,23 +417,23 @@ } } } -} +}; /** 鏍戞潈闄愶紙鍏ㄩ��/鍏ㄤ笉閫夛級 */ const handleCheckedTreeNodeAll = (value: any, type: string) => { - if (type == "menu") { - menuRef.value?.setCheckedNodes(value ? menuOptions.value as any : []); - } else if (type == "dept") { - deptRef.value?.setCheckedNodes(value ? deptOptions.value as any : []); + if (type == 'menu') { + menuRef.value?.setCheckedNodes(value ? (menuOptions.value as any) : []); + } else if (type == 'dept') { + deptRef.value?.setCheckedNodes(value ? (deptOptions.value as any) : []); } -} +}; /** 鏍戞潈闄愶紙鐖跺瓙鑱斿姩锛� */ const handleCheckedTreeConnect = (value: any, type: string) => { - if (type == "menu") { + if (type == 'menu') { form.value.menuCheckStrictly = value; - } else if (type == "dept") { + } else if (type == 'dept') { form.value.deptCheckStrictly = value; } -} +}; /** 鎵�鏈夎彍鍗曡妭鐐规暟鎹� */ const getMenuAllCheckedKeys = (): any => { // 鐩墠琚�変腑鐨勮彍鍗曡妭鐐� @@ -444,57 +444,57 @@ checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys); } return checkedKeys; -} +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { roleFormRef.value?.validate(async (valid: boolean) => { if (valid) { - form.value.menuIds = getMenuAllCheckedKeys() + form.value.menuIds = getMenuAllCheckedKeys(); form.value.roleId ? await updateRole(form.value) : await addRole(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛") - dialog.visible = false - getList() + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); + dialog.visible = false; + getList(); } - }) -} + }); +}; /** 鍙栨秷鎸夐挳 */ const cancel = () => { - reset() + reset(); dialog.visible = false; -} +}; /** 閫夋嫨瑙掕壊鏉冮檺鑼冨洿瑙﹀彂 */ const dataScopeSelectChange = (value: string) => { - if (value !== "2") { - deptRef.value?.setCheckedKeys([]) + if (value !== '2') { + deptRef.value?.setCheckedKeys([]); } -} +}; /** 鍒嗛厤鏁版嵁鏉冮檺鎿嶄綔 */ const handleDataScope = async (row: RoleVO) => { const response = await getRole(row.roleId); Object.assign(form.value, response.data); const res = await getRoleDeptTreeSelect(row.roleId); openDataScope.value = true; - dialog.title = "鍒嗛厤鏁版嵁鏉冮檺"; + dialog.title = '鍒嗛厤鏁版嵁鏉冮檺'; await nextTick(() => { deptRef.value?.setCheckedKeys(res.checkedKeys); - }) -} + }); +}; /** 鎻愪氦鎸夐挳锛堟暟鎹潈闄愶級 */ const submitDataScope = async () => { if (form.value.roleId) { form.value.deptIds = getDeptAllCheckedKeys(); await dataScope(form.value); - proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + proxy?.$modal.msgSuccess('淇敼鎴愬姛'); openDataScope.value = false; getList(); } -} +}; /** 鍙栨秷鎸夐挳锛堟暟鎹潈闄愶級*/ const cancelDataScope = () => { dataScopeRef.value?.resetFields(); form.value = { ...initForm }; openDataScope.value = false; -} +}; onMounted(() => { getList(); diff --git a/src/views/system/role/selectUser.vue b/src/views/system/role/selectUser.vue index e0cd433..f6c1000 100644 --- a/src/views/system/role/selectUser.vue +++ b/src/views/system/role/selectUser.vue @@ -1,7 +1,7 @@ <template> <el-row> - <el-dialog title="閫夋嫨鐢ㄦ埛" v-model="visible" width="800px" top="5vh" append-to-body> - <el-form :model="queryParams" ref="queryFormRef" :inline="true"> + <el-dialog v-model="visible" title="閫夋嫨鐢ㄦ埛" width="800px" top="5vh" append-to-body> + <el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName"> <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" clearable @keyup.enter="handleQuery" /> </el-form-item> @@ -14,7 +14,7 @@ </el-form-item> </el-form> <el-row> - <el-table @row-click="clickRow" ref="tableRef" :data="userList" @selection-change="handleSelectionChange" height="260px"> + <el-table ref="tableRef" :data="userList" height="260px" @row-click="clickRow" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column label="鐢ㄦ埛鍚嶇О" prop="userName" :show-overflow-tooltip="true" /> <el-table-column label="鐢ㄦ埛鏄电О" prop="nickName" :show-overflow-tooltip="true" /> @@ -31,7 +31,7 @@ </template> </el-table-column> </el-table> - <pagination v-if="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-if="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-row> <template #footer> <div class="dialog-footer"> @@ -44,16 +44,15 @@ </template> <script setup name="SelectUser" lang="ts"> -import { authUserSelectAll, unallocatedUserList } from "@/api/system/role"; +import { authUserSelectAll, unallocatedUserList } from '@/api/system/role'; import { UserVO } from '@/api/system/user/types'; import { UserQuery } from '@/api/system/user/types'; - const props = defineProps({ roleId: { type: [Number, String] } -}) +}); const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable')); @@ -69,7 +68,7 @@ roleId: undefined, userName: undefined, phonenumber: undefined -}) +}); const tableRef = ref<ElTableInstance>(); const queryFormRef = ref<ElFormInstance>(); @@ -78,7 +77,7 @@ queryParams.roleId = props.roleId; getList(); visible.value = true; -} +}; /** * 閫夋嫨琛� @@ -86,35 +85,35 @@ const clickRow = (row: any) => { // ele鐨刡ug tableRef.value?.toggleRowSelection(row, false); -} +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: UserVO[]) => { userIds.value = selection.map((item: UserVO) => item.userId); -} +}; /** 鏌ヨ鏁版嵁 */ const getList = async () => { const res = await unallocatedUserList(queryParams); userList.value = res.rows; total.value = res.total; -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); getList(); -} +}; -const emit = defineEmits(["ok"]); +const emit = defineEmits(['ok']); /**閫夋嫨鎺堟潈鐢ㄦ埛鎿嶄綔 */ const handleSelectUser = async () => { const roleId = queryParams.roleId; const ids = userIds.value.join(','); - if (ids == "") { + if (ids == '') { proxy?.$modal.msgError('璇烽�夋嫨瑕佸垎閰嶇殑鐢ㄦ埛'); return; } @@ -122,10 +121,10 @@ proxy?.$modal.msgSuccess('鍒嗛厤鎴愬姛'); emit('ok'); visible.value = false; -} +}; // 鏆撮湶 defineExpose({ - show, + show }); </script> diff --git a/src/views/system/tenant/index.vue b/src/views/system/tenant/index.vue index 9a7fdf3..c3884b6 100644 --- a/src/views/system/tenant/index.vue +++ b/src/views/system/tenant/index.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="绉熸埛缂栧彿" prop="tenantId"> <el-input v-model="queryParams.tenantId" placeholder="璇疯緭鍏ョ鎴风紪鍙�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> @@ -29,28 +29,28 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:tenant:add']">鏂板</el-button> + <el-button v-hasPermi="['system:tenant:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:tenant:edit']" + <el-button v-hasPermi="['system:tenant:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" >淇敼</el-button > </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:tenant:remove']"> + <el-button v-hasPermi="['system:tenant:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:tenant:export']">瀵煎嚭</el-button> + <el-button v-hasPermi="['system:tenant:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="tenantList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="id" align="center" prop="id" v-if="false" /> + <el-table-column v-if="false" label="id" align="center" prop="id" /> <el-table-column label="绉熸埛缂栧彿" align="center" prop="tenantId" /> <el-table-column label="鑱旂郴浜�" align="center" prop="contactUserName" /> <el-table-column label="鑱旂郴鐢佃瘽" align="center" prop="contactPhone" /> @@ -69,23 +69,23 @@ <el-table-column width="150" label="鎿嶄綔" align="center" fixed="right" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:tenant:edit']"></el-button> + <el-button v-hasPermi="['system:tenant:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍚屾濂楅" placement="top"> - <el-button link type="primary" icon="Refresh" @click="handleSyncTenantPackage(scope.row)" v-hasPermi="['system:tenant:edit']"> + <el-button v-hasPermi="['system:tenant:edit']" link type="primary" icon="Refresh" @click="handleSyncTenantPackage(scope.row)"> </el-button> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:tenant:remove']"></el-button> + <el-button v-hasPermi="['system:tenant:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀圭鎴峰璇濇 --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-form ref="tenantFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="浼佷笟鍚嶇О" prop="companyName"> <el-input v-model="form.companyName" placeholder="璇疯緭鍏ヤ紒涓氬悕绉�" /> @@ -100,7 +100,7 @@ <el-input v-model="form.username" placeholder="璇疯緭鍏ョ郴缁熺敤鎴峰悕" maxlength="30" /> </el-form-item> <el-form-item v-if="!form.id" label="鐢ㄦ埛瀵嗙爜" prop="password"> - <el-input type="password" v-model="form.password" placeholder="璇疯緭鍏ョ郴缁熺敤鎴峰瘑鐮�" maxlength="20" /> + <el-input v-model="form.password" type="password" placeholder="璇疯緭鍏ョ郴缁熺敤鎴峰瘑鐮�" maxlength="20" /> </el-form-item> <el-form-item label="绉熸埛濂楅" prop="packageId"> <el-select v-model="form.packageId" :disabled="!!form.tenantId" placeholder="璇烽�夋嫨绉熸埛濂楅" clearable style="width: 100%"> @@ -108,7 +108,7 @@ </el-select> </el-form-item> <el-form-item label="杩囨湡鏃堕棿" prop="expireTime"> - <el-date-picker clearable v-model="form.expireTime" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="璇烽�夋嫨杩囨湡鏃堕棿"> + <el-date-picker v-model="form.expireTime" clearable type="datetime" value-format="YYYY-MM-DD HH:mm:ss" placeholder="璇烽�夋嫨杩囨湡鏃堕棿"> </el-date-picker> </el-form-item> <el-form-item label="鐢ㄦ埛鏁伴噺" prop="accountCount"> @@ -124,7 +124,7 @@ <el-input v-model="form.licenseNumber" placeholder="璇疯緭鍏ョ粺涓�绀句細淇$敤浠g爜" /> </el-form-item> <el-form-item label="浼佷笟绠�浠�" prop="intro"> - <el-input type="textarea" v-model="form.intro" placeholder="璇疯緭鍏ヤ紒涓氱畝浠�" /> + <el-input v-model="form.intro" type="textarea" placeholder="璇疯緭鍏ヤ紒涓氱畝浠�" /> </el-form-item> <el-form-item label="澶囨敞" prop="remark"> <el-input v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" /> @@ -182,8 +182,8 @@ packageId: '', expireTime: '', accountCount: 0, - status: '0', -} + status: '0' +}; const data = reactive<PageData<TenantForm, TenantQuery>>({ form: { ...initFormData }, queryParams: { @@ -195,17 +195,17 @@ companyName: '' }, rules: { - id: [{ required: true, message: "id涓嶈兘涓虹┖", trigger: "blur" }], - tenantId: [{ required: true, message: "绉熸埛缂栧彿涓嶈兘涓虹┖", trigger: "blur" }], - contactUserName: [{ required: true, message: "鑱旂郴浜轰笉鑳戒负绌�", trigger: "blur" }], - contactPhone: [{ required: true, message: "鑱旂郴鐢佃瘽涓嶈兘涓虹┖", trigger: "blur" }], - companyName: [{ required: true, message: "浼佷笟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], + id: [{ required: true, message: 'id涓嶈兘涓虹┖', trigger: 'blur' }], + tenantId: [{ required: true, message: '绉熸埛缂栧彿涓嶈兘涓虹┖', trigger: 'blur' }], + contactUserName: [{ required: true, message: '鑱旂郴浜轰笉鑳戒负绌�', trigger: 'blur' }], + contactPhone: [{ required: true, message: '鑱旂郴鐢佃瘽涓嶈兘涓虹┖', trigger: 'blur' }], + companyName: [{ required: true, message: '浼佷笟鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }], username: [ - { required: true, message: "鐢ㄦ埛鍚嶄笉鑳戒负绌�", trigger: "blur" }, + { required: true, message: '鐢ㄦ埛鍚嶄笉鑳戒负绌�', trigger: 'blur' }, { min: 2, max: 20, message: '鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿', trigger: 'blur' } ], password: [ - { required: true, message: "瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, + { required: true, message: '瀵嗙爜涓嶈兘涓虹┖', trigger: 'blur' }, { min: 5, max: 20, message: '鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿', trigger: 'blur' } ] } @@ -215,9 +215,9 @@ /** 鏌ヨ鎵�鏈夌鎴峰椁� */ const getTenantPackage = async () => { - const res = await selectTenantPackage() + const res = await selectTenantPackage(); packageList.value = res.data; -} +}; /** 鏌ヨ绉熸埛鍒楄〃 */ const getList = async () => { @@ -226,60 +226,58 @@ tenantList.value = res.rows; total.value = res.total; loading.value = false; -} +}; // 绉熸埛濂楅鐘舵�佷慨鏀� const handleStatusChange = async (row: TenantVO) => { - let text = row.status === "0" ? "鍚敤" : "鍋滅敤"; + let text = row.status === '0' ? '鍚敤' : '鍋滅敤'; try { await proxy?.$modal.confirm('纭瑕�"' + text + '""' + row.companyName + '"绉熸埛鍚楋紵'); await changeTenantStatus(row.id, row.tenantId, row.status); - proxy?.$modal.msgSuccess(text + "鎴愬姛"); + proxy?.$modal.msgSuccess(text + '鎴愬姛'); } catch { - row.status = row.status === "0" ? "1" : "0"; + row.status = row.status === '0' ? '1' : '0'; } - - -} +}; // 鍙栨秷鎸夐挳 const cancel = () => { reset(); dialog.visible = false; -} +}; // 琛ㄥ崟閲嶇疆 const reset = () => { form.value = { ...initFormData }; tenantFormRef.value?.resetFields(); -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; // 澶氶�夋閫変腑鏁版嵁 const handleSelectionChange = (selection: TenantVO[]) => { - ids.value = selection.map(item => item.id); + ids.value = selection.map((item) => item.id); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { reset(); getTenantPackage(); dialog.visible = true; - dialog.title = "娣诲姞绉熸埛"; -} + dialog.title = '娣诲姞绉熸埛'; +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: TenantVO) => { @@ -287,10 +285,10 @@ await getTenantPackage(); const _id = row?.id || ids.value[0]; const res = await getTenant(_id); - Object.assign(form.value, res.data) + Object.assign(form.value, res.data); dialog.visible = true; - dialog.title = "淇敼绉熸埛"; -} + dialog.title = '淇敼绉熸埛'; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { @@ -298,28 +296,26 @@ if (valid) { buttonLoading.value = true; if (form.value.id) { - await updateTenant(form.value).finally(() => buttonLoading.value = false); + await updateTenant(form.value).finally(() => (buttonLoading.value = false)); } else { - await addTenant(form.value).finally(() => buttonLoading.value = false); + await addTenant(form.value).finally(() => (buttonLoading.value = false)); } - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); dialog.visible = false; await getList(); } }); -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: TenantVO) => { const _ids = row?.id || ids.value; - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎绉熸埛缂栧彿涓�"' + _ids + '"鐨勬暟鎹」锛�') + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎绉熸埛缂栧彿涓�"' + _ids + '"鐨勬暟鎹」锛�'); loading.value = true; - await delTenant(_ids).finally(() => loading.value = false); + await delTenant(_ids).finally(() => (loading.value = false)); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); - - -} + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); +}; /** 鍚屾绉熸埛濂楅鎸夐挳鎿嶄綔 */ const handleSyncTenantPackage = async (row: TenantVO) => { @@ -328,20 +324,26 @@ loading.value = true; await syncTenantPackage(row.tenantId, row.packageId); await getList(); - proxy?.$modal.msgSuccess("鍚屾鎴愬姛"); - } catch { return } finally { + proxy?.$modal.msgSuccess('鍚屾鎴愬姛'); + } catch { + return; + } finally { loading.value = false; } -} +}; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download('system/tenant/export', { - ...queryParams.value - }, `tenant_${new Date().getTime()}.xlsx`) -} + proxy?.download( + 'system/tenant/export', + { + ...queryParams.value + }, + `tenant_${new Date().getTime()}.xlsx` + ); +}; onMounted(() => { getList(); -}) +}); </script> diff --git a/src/views/system/tenantPackage/index.vue b/src/views/system/tenantPackage/index.vue index 5311996..6f5aeaf 100644 --- a/src/views/system/tenantPackage/index.vue +++ b/src/views/system/tenantPackage/index.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="濂楅鍚嶇О" prop="packageName"> <el-input v-model="queryParams.packageName" placeholder="璇疯緭鍏ュ椁愬悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> </el-form-item> @@ -20,28 +20,28 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:tenantPackage:add']"> 鏂板 </el-button> + <el-button v-hasPermi="['system:tenantPackage:add']" type="primary" plain icon="Plus" @click="handleAdd"> 鏂板 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:tenantPackage:edit']"> + <el-button v-hasPermi="['system:tenantPackage:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()"> 淇敼 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:tenantPackage:remove']"> + <el-button v-hasPermi="['system:tenantPackage:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:tenantPackage:export']">瀵煎嚭 </el-button> + <el-button v-hasPermi="['system:tenantPackage:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭 </el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="tenantPackageList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> - <el-table-column label="绉熸埛濂楅id" align="center" prop="packageId" v-if="false" /> + <el-table-column v-if="false" label="绉熸埛濂楅id" align="center" prop="packageId" /> <el-table-column label="濂楅鍚嶇О" align="center" prop="packageName" /> <el-table-column label="澶囨敞" align="center" prop="remark" /> <el-table-column label="鐘舵��" align="center" prop="status"> @@ -52,20 +52,20 @@ <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="淇敼" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:tenantPackage:edit']"></el-button> + <el-button v-hasPermi="['system:tenantPackage:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:tenantPackage:remove']"></el-button> + <el-button v-hasPermi="['system:tenantPackage:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀圭鎴峰椁愬璇濇 --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> <el-form ref="tenantPackageFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="濂楅鍚嶇О" prop="packageName"> <el-input v-model="form.packageName" placeholder="璇疯緭鍏ュ椁愬悕绉�" /> @@ -75,10 +75,10 @@ <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">鍏ㄩ��/鍏ㄤ笉閫� </el-checkbox> <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">鐖跺瓙鑱斿姩 </el-checkbox> <el-tree + ref="menuTreeRef" class="tree-border" :data="menuOptions" show-checkbox - ref="menuTreeRef" node-key="id" :check-strictly="!form.menuCheckStrictly" empty-text="鍔犺浇涓紝璇风◢鍊�" @@ -107,11 +107,11 @@ addTenantPackage, updateTenantPackage, changePackageStatus -} from "@/api/system/tenantPackage"; -import { treeselect as menuTreeselect, tenantPackageMenuTreeselect } from "@/api/system/menu"; -import { TenantPkgForm, TenantPkgQuery, TenantPkgVO } from "@/api/system/tenantPackage/types"; -import { MenuTreeOption } from "@/api/system/menu/types"; -import to from "await-to-js"; +} from '@/api/system/tenantPackage'; +import { treeselect as menuTreeselect, tenantPackageMenuTreeselect } from '@/api/system/menu'; +import { TenantPkgForm, TenantPkgQuery, TenantPkgVO } from '@/api/system/tenantPackage/types'; +import { MenuTreeOption } from '@/api/system/menu/types'; +import to from 'await-to-js'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -133,15 +133,14 @@ const dialog = reactive<DialogOption>({ visible: false, - title: "" + title: '' }); - const initFormData: TenantPkgForm = { packageId: undefined, - packageName: "", - menuIds: "", - remark: "", + packageName: '', + menuIds: '', + remark: '', menuCheckStrictly: true }; const data = reactive<PageData<TenantPkgForm, TenantPkgQuery>>({ @@ -149,11 +148,11 @@ queryParams: { pageNum: 1, pageSize: 10, - packageName: "" + packageName: '' }, rules: { - packageId: [{ required: true, message: "绉熸埛濂楅id涓嶈兘涓虹┖", trigger: "blur" }], - packageName: [{ required: true, message: "濂楅鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }] + packageId: [{ required: true, message: '绉熸埛濂楅id涓嶈兘涓虹┖', trigger: 'blur' }], + packageName: [{ required: true, message: '濂楅鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }] } }); @@ -195,13 +194,13 @@ // 绉熸埛濂楅鐘舵�佷慨鏀� const handleStatusChange = async (row: TenantPkgVO) => { - let text = row.status === "0" ? "鍚敤" : "鍋滅敤"; - const [err] = await to(proxy?.$modal.confirm("纭瑕乗"" + text + "\"\"" + row.packageName + "\"濂楅鍚楋紵") as Promise<any>); + let text = row.status === '0' ? '鍚敤' : '鍋滅敤'; + const [err] = await to(proxy?.$modal.confirm('纭瑕�"' + text + '""' + row.packageName + '"濂楅鍚楋紵') as Promise<any>); if (err) { - row.status = row.status === "0" ? "1" : "0"; + row.status = row.status === '0' ? '1' : '0'; } else { await changePackageStatus(row.packageId, row.status); - proxy?.$modal.msgSuccess(text + "鎴愬姛"); + proxy?.$modal.msgSuccess(text + '鎴愬姛'); } }; @@ -234,14 +233,14 @@ // 澶氶�夋閫変腑鏁版嵁 const handleSelectionChange = (selection: TenantPkgVO[]) => { - ids.value = selection.map(item => item.packageId); + ids.value = selection.map((item) => item.packageId); single.value = selection.length != 1; multiple.value = !selection.length; }; // 鏍戞潈闄愶紙灞曞紑/鎶樺彔锛� const handleCheckedTreeExpand = (value: CheckboxValueType, type: string) => { - if (type == "menu") { + if (type == 'menu') { let treeList = menuOptions.value; for (let i = 0; i < treeList.length; i++) { if (menuTreeRef.value) { @@ -253,14 +252,14 @@ // 鏍戞潈闄愶紙鍏ㄩ��/鍏ㄤ笉閫夛級 const handleCheckedTreeNodeAll = (value: CheckboxValueType, type: string) => { - if (type == "menu") { - menuTreeRef.value?.setCheckedNodes(value ? menuOptions.value as any : []); + if (type == 'menu') { + menuTreeRef.value?.setCheckedNodes(value ? (menuOptions.value as any) : []); } }; // 鏍戞潈闄愶紙鐖跺瓙鑱斿姩锛� const handleCheckedTreeConnect = (value: CheckboxValueType, type: string) => { - if (type == "menu") { + if (type == 'menu') { form.value.menuCheckStrictly = value as boolean; } }; @@ -270,7 +269,7 @@ reset(); getMenuTreeselect(); dialog.visible = true; - dialog.title = "娣诲姞绉熸埛濂楅"; + dialog.title = '娣诲姞绉熸埛濂楅'; }; /** 淇敼鎸夐挳鎿嶄綔 */ @@ -281,7 +280,7 @@ form.value = response.data; const res = await getPackageMenuTreeselect(_packageId); dialog.visible = true; - dialog.title = "淇敼绉熸埛濂楅"; + dialog.title = '淇敼绉熸埛濂楅'; res.data.checkedKeys.forEach((v) => { nextTick(() => { menuTreeRef.value?.setChecked(v, true, false); @@ -296,11 +295,11 @@ buttonLoading.value = true; form.value.menuIds = getMenuAllCheckedKeys(); if (form.value.packageId != null) { - await updateTenantPackage(form.value).finally(() => buttonLoading.value = false); + await updateTenantPackage(form.value).finally(() => (buttonLoading.value = false)); } else { - await addTenantPackage(form.value).finally(() => buttonLoading.value = false); + await addTenantPackage(form.value).finally(() => (buttonLoading.value = false)); } - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); dialog.visible = false; await getList(); } @@ -310,20 +309,24 @@ /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: TenantPkgVO) => { const _packageIds = row?.packageId || ids.value; - await proxy?.$modal.confirm("鏄惁纭鍒犻櫎绉熸埛濂楅缂栧彿涓篭"" + _packageIds + "\"鐨勬暟鎹」锛�").finally(() => { + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎绉熸埛濂楅缂栧彿涓�"' + _packageIds + '"鐨勬暟鎹」锛�').finally(() => { loading.value = false; }); await delTenantPackage(_packageIds); loading.value = true; await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); }; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download("system/tenantPackage/export", { - ...queryParams.value - }, `tenantPackage_${new Date().getTime()}.xlsx`); + proxy?.download( + 'system/tenantPackage/export', + { + ...queryParams.value + }, + `tenantPackage_${new Date().getTime()}.xlsx` + ); }; onMounted(() => { diff --git a/src/views/system/user/authRole.vue b/src/views/system/user/authRole.vue index e869ba3..b661811 100644 --- a/src/views/system/user/authRole.vue +++ b/src/views/system/user/authRole.vue @@ -21,12 +21,12 @@ <h4 class="panel-title">瑙掕壊淇℃伅</h4> <div> <el-table + ref="tableRef" v-loading="loading" :row-key="getRowKey" - @row-click="clickRow" - ref="tableRef" - @selection-change="handleSelectionChange" :data="roles.slice((pageNum - 1) * pageSize, pageNum * pageSize)" + @row-click="clickRow" + @selection-change="handleSelectionChange" > <el-table-column label="搴忓彿" width="55" type="index" align="center"> <template #default="scope"> @@ -43,8 +43,8 @@ </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="pageNum" v-model:limit="pageSize" /> - <div style="text-align: center;margin-left:-120px;margin-top:30px;"> + <pagination v-show="total > 0" v-model:page="pageNum" v-model:limit="pageSize" :total="total" /> + <div style="text-align: center; margin-left: -120px; margin-top: 30px"> <el-button type="primary" @click="submitForm()">鎻愪氦</el-button> <el-button @click="close()">杩斿洖</el-button> </div> @@ -55,9 +55,9 @@ </template> <script setup name="AuthRole" lang="ts"> -import { RoleVO } from "@/api/system/role/types"; -import { getAuthRole, updateAuthRole } from "@/api/system/user"; -import { UserForm } from "@/api/system/user/types"; +import { RoleVO } from '@/api/system/role/types'; +import { getAuthRole, updateAuthRole } from '@/api/system/user'; +import { UserForm } from '@/api/system/user/types'; const route = useRoute(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -70,7 +70,7 @@ const roles = ref<RoleVO[]>([]); const form = ref<Partial<UserForm>>({ nickName: undefined, - userName: "", + userName: '', userId: undefined }); @@ -83,7 +83,7 @@ }; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: RoleVO[]) => { - roleIds.value = selection.map(item => item.roleId); + roleIds.value = selection.map((item) => item.roleId); }; /** 淇濆瓨閫変腑鐨勬暟鎹紪鍙� */ const getRowKey = (row: RoleVO): string => { @@ -91,15 +91,15 @@ }; /** 鍏抽棴鎸夐挳 */ const close = () => { - const obj = { path: "/system/user" }; + const obj = { path: '/system/user' }; proxy?.$tab.closeOpenPage(obj); }; /** 鎻愪氦鎸夐挳 */ const submitForm = async () => { const userId = form.value.userId; - const rIds = roleIds.value.join(","); + const rIds = roleIds.value.join(','); await updateAuthRole({ userId: userId as string, roleIds: rIds }); - proxy?.$modal.msgSuccess("鎺堟潈鎴愬姛"); + proxy?.$modal.msgSuccess('鎺堟潈鎴愬姛'); close(); }; @@ -112,7 +112,7 @@ Object.assign(roles.value, res.data.roles); total.value = roles.value.length; await nextTick(() => { - roles.value.forEach(row => { + roles.value.forEach((row) => { if (row?.flag) { tableRef.value?.toggleRowSelection(row, true); } diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index 100b5a7..79ae8f8 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -6,8 +6,8 @@ <el-card shadow="hover"> <el-input v-model="deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" prefix-icon="Search" clearable /> <el-tree - class="mt-2" ref="deptTreeRef" + class="mt-2" node-key="id" :data="deptOptions" :props="{ label: 'label', children: 'children' }" @@ -21,7 +21,7 @@ </el-col> <el-col :lg="20" :xs="24"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName"> @@ -42,7 +42,7 @@ <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> - <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px;"> + <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px"> <el-date-picker v-model="dateRange" value-format="YYYY-MM-DD" @@ -53,8 +53,8 @@ ></el-date-picker> </el-form-item> <el-form-item> - <el-button type="primary" @click="handleQuery" icon="Search">鎼滅储</el-button> - <el-button @click="resetQuery" icon="Refresh">閲嶇疆</el-button> + <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> + <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> </el-form-item> </el-form> </el-card> @@ -65,15 +65,15 @@ <template #header> <el-row :gutter="10"> <el-col :span="1.5"> - <el-button type="primary" plain @click="handleAdd()" v-has-permi="['system:user:add']" icon="Plus">鏂板</el-button> + <el-button v-has-permi="['system:user:add']" type="primary" plain icon="Plus" @click="handleAdd()">鏂板</el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain @click="handleUpdate()" :disabled="single" v-has-permi="['system:user:add']" icon="Edit"> + <el-button v-has-permi="['system:user:add']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()"> 淇敼 </el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain @click="handleDelete()" :disabled="multiple" v-has-permi="['system:user:delete']" icon="Delete"> + <el-button v-has-permi="['system:user:delete']" type="danger" plain :disabled="multiple" icon="Delete" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> @@ -85,38 +85,38 @@ ></el-button> <template #dropdown> <el-dropdown-menu> - <el-dropdown-item @click="importTemplate" icon="Download">涓嬭浇妯℃澘</el-dropdown-item> - <el-dropdown-item @click="handleImport" icon="Top"> 瀵煎叆鏁版嵁</el-dropdown-item> - <el-dropdown-item @click="handleExport" icon="Download"> 瀵煎嚭鏁版嵁</el-dropdown-item> + <el-dropdown-item icon="Download" @click="importTemplate">涓嬭浇妯℃澘</el-dropdown-item> + <el-dropdown-item icon="Top" @click="handleImport"> 瀵煎叆鏁版嵁</el-dropdown-item> + <el-dropdown-item icon="Download" @click="handleExport"> 瀵煎嚭鏁版嵁</el-dropdown-item> </el-dropdown-menu> </template> </el-dropdown> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList" :columns="columns" :search="true"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" :columns="columns" :search="true" @query-table="getList"></right-toolbar> </el-row> </template> <el-table v-loading="loading" :data="userList" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="50" align="center" /> - <el-table-column label="鐢ㄦ埛缂栧彿" align="center" key="userId" prop="userId" v-if="columns[0].visible" /> - <el-table-column label="鐢ㄦ埛鍚嶇О" align="center" key="userName" prop="userName" v-if="columns[1].visible" :show-overflow-tooltip="true" /> - <el-table-column label="鐢ㄦ埛鏄电О" align="center" key="nickName" prop="nickName" v-if="columns[2].visible" :show-overflow-tooltip="true" /> + <el-table-column v-if="columns[0].visible" key="userId" label="鐢ㄦ埛缂栧彿" align="center" prop="userId" /> + <el-table-column v-if="columns[1].visible" key="userName" label="鐢ㄦ埛鍚嶇О" align="center" prop="userName" :show-overflow-tooltip="true" /> + <el-table-column v-if="columns[2].visible" key="nickName" label="鐢ㄦ埛鏄电О" align="center" prop="nickName" :show-overflow-tooltip="true" /> <el-table-column + v-if="columns[3].visible" + key="deptName" label="閮ㄩ棬" align="center" - key="deptName" prop="dept.deptName" - v-if="columns[3].visible" :show-overflow-tooltip="true" /> - <el-table-column label="鎵嬫満鍙风爜" align="center" key="phonenumber" prop="phonenumber" v-if="columns[4].visible" width="120" /> - <el-table-column label="鐘舵��" align="center" key="status" v-if="columns[5].visible"> + <el-table-column v-if="columns[4].visible" key="phonenumber" label="鎵嬫満鍙风爜" align="center" prop="phonenumber" width="120" /> + <el-table-column v-if="columns[5].visible" key="status" label="鐘舵��" align="center"> <template #default="scope"> <el-switch v-model="scope.row.status" active-value="0" inactive-value="1" @change="handleStatusChange(scope.row)"></el-switch> </template> </el-table-column> - <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" v-if="columns[6].visible" width="160"> + <el-table-column v-if="columns[6].visible" label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="160"> <template #default="scope"> <span>{{ scope.row.createTime }}</span> </template> @@ -124,19 +124,19 @@ <el-table-column label="鎿嶄綔" fixed="right" width="180" class-name="small-padding fixed-width"> <template #default="scope"> - <el-tooltip content="淇敼" placement="top" v-if="scope.row.userId !== 1"> - <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:user:edit']"></el-button> + <el-tooltip v-if="scope.row.userId !== 1" content="淇敼" placement="top"> + <el-button v-hasPermi="['system:user:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> </el-tooltip> - <el-tooltip content="鍒犻櫎" placement="top" v-if="scope.row.userId !== 1"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:user:remove']"></el-button> + <el-tooltip v-if="scope.row.userId !== 1" content="鍒犻櫎" placement="top"> + <el-button v-hasPermi="['system:user:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> - <el-tooltip content="閲嶇疆瀵嗙爜" placement="top" v-if="scope.row.userId !== 1"> - <el-button link type="primary" icon="Key" @click="handleResetPwd(scope.row)" v-hasPermi="['system:user:resetPwd']"></el-button> + <el-tooltip v-if="scope.row.userId !== 1" content="閲嶇疆瀵嗙爜" placement="top"> + <el-button v-hasPermi="['system:user:resetPwd']" link type="primary" icon="Key" @click="handleResetPwd(scope.row)"></el-button> </el-tooltip> - <el-tooltip content="鍒嗛厤瑙掕壊" placement="top" v-if="scope.row.userId !== 1"> - <el-button link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)" v-hasPermi="['system:user:edit']"></el-button> + <el-tooltip v-if="scope.row.userId !== 1" content="鍒嗛厤瑙掕壊" placement="top"> + <el-button v-hasPermi="['system:user:edit']" link type="primary" icon="CircleCheck" @click="handleAuthRole(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> @@ -144,9 +144,9 @@ <pagination v-show="total > 0" - :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" + :total="total" @pagination="getList" /> </el-card> @@ -154,8 +154,8 @@ </el-row> <!-- 娣诲姞鎴栦慨鏀圭敤鎴烽厤缃璇濇 --> - <el-dialog ref="formDialogRef" :title="dialog.title" v-model="dialog.visible" width="600px" append-to-body @close="closeDialog"> - <el-form :model="form" :rules="rules" ref="userFormRef" label-width="80px"> + <el-dialog ref="formDialogRef" v-model="dialog.visible" :title="dialog.title" width="600px" append-to-body @close="closeDialog"> + <el-form ref="userFormRef" :model="form" :rules="rules" label-width="80px"> <el-row> <el-col :span="12"> <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName"> @@ -210,8 +210,7 @@ <el-col :span="12"> <el-form-item label="鐘舵��"> <el-radio-group v-model="form.status"> - <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ - dict.label }}</el-radio> + <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio> </el-radio-group> </el-form-item> </el-col> @@ -261,7 +260,7 @@ </el-dialog> <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� --> - <el-dialog :title="upload.title" v-model="upload.open" width="400px" append-to-body> + <el-dialog v-model="upload.open" :title="upload.title" width="400px" append-to-body> <el-upload ref="uploadRef" :limit="1" @@ -282,7 +281,7 @@ <div class="text-center el-upload__tip"> <div class="el-upload__tip"><el-checkbox v-model="upload.updateSupport" />鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�</div> <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span> - <el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">涓嬭浇妯℃澘</el-link> + <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">涓嬭浇妯℃澘</el-link> </div> </template> </el-upload> @@ -297,22 +296,22 @@ </template> <script setup name="User" lang="ts"> -import api from "@/api/system/user" +import api from '@/api/system/user'; import { UserForm, UserQuery, UserVO } from '@/api/system/user/types'; -import { treeselect } from "@/api/system/dept"; -import { DeptVO } from "@/api/system/dept/types"; -import { RoleVO } from "@/api/system/role/types"; -import { PostVO } from "@/api/system/post/types"; -import { to } from "await-to-js"; -import { globalHeaders } from "@/utils/request"; +import { treeselect } from '@/api/system/dept'; +import { DeptVO } from '@/api/system/dept/types'; +import { RoleVO } from '@/api/system/role/types'; +import { PostVO } from '@/api/system/post/types'; +import { to } from 'await-to-js'; +import { globalHeaders } from '@/utils/request'; const router = useRouter(); -const { proxy } = getCurrentInstance() as ComponentInternalInstance +const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { sys_normal_disable, sys_user_sex } = toRefs<any>(proxy?.useDict('sys_normal_disable', 'sys_user_sex')); const userList = ref<UserVO[]>(); const loading = ref(true); -const showSearch = ref(true) +const showSearch = ref(true); const ids = ref<Array<number | string>>([]); const single = ref(true); const multiple = ref(true); @@ -320,7 +319,7 @@ const dateRange = ref<[DateModelType, DateModelType]>(['', '']); const deptName = ref(''); const deptOptions = ref<DeptVO[]>([]); -const initPassword = ref<String>(''); +const initPassword = ref<string>(''); const postOptions = ref<PostVO[]>([]); const roleOptions = ref<RoleVO[]>([]); /*** 鐢ㄦ埛瀵煎叆鍙傛暟 */ @@ -328,7 +327,7 @@ // 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛� open: false, // 寮瑰嚭灞傛爣棰橈紙鐢ㄦ埛瀵煎叆锛� - title: "", + title: '', // 鏄惁绂佺敤涓婁紶 isUploading: false, // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹� @@ -336,19 +335,18 @@ // 璁剧疆涓婁紶鐨勮姹傚ご閮� headers: globalHeaders(), // 涓婁紶鐨勫湴鍧� - url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData" -}) + url: import.meta.env.VITE_APP_BASE_API + '/system/user/importData' +}); // 鍒楁樉闅愪俊鎭� const columns = ref<FieldOption[]>([ - { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: false,children: [] }, - { key: 1, label: `鐢ㄦ埛鍚嶇О`, visible: true,children: [] }, - { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true,children: [] }, - { key: 3, label: `閮ㄩ棬`, visible: true,children: [] }, - { key: 4, label: `鎵嬫満鍙风爜`, visible: true,children: [] }, - { key: 5, label: `鐘舵�乣, visible: true,children: [] }, - { key: 6, label: `鍒涘缓鏃堕棿`, visible: true,children: [] } -]) - + { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: false, children: [] }, + { key: 1, label: `鐢ㄦ埛鍚嶇О`, visible: true, children: [] }, + { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true, children: [] }, + { key: 3, label: `閮ㄩ棬`, visible: true, children: [] }, + { key: 4, label: `鎵嬫満鍙风爜`, visible: true, children: [] }, + { key: 5, label: `鐘舵�乣, visible: true, children: [] }, + { key: 6, label: `鍒涘缓鏃堕棿`, visible: true, children: [] } +]); const deptTreeRef = ref<ElTreeInstance>(); const queryFormRef = ref<ElFormInstance>(); @@ -370,11 +368,11 @@ phonenumber: undefined, email: undefined, sex: undefined, - status: "0", + status: '0', remark: '', postIds: [], roleIds: [] -} +}; const data = reactive<PageData<UserForm, UserQuery>>({ form: { ...initFormData }, queryParams: { @@ -386,24 +384,54 @@ deptId: '' }, rules: { - userName: [{ required: true, message: "鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }, { min: 2, max: 20, message: "鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿", trigger: "blur" }], - nickName: [{ required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }], - password: [{ required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, { min: 5, max: 20, message: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿", trigger: "blur" }], - email: [{ type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }], - phonenumber: [{ pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }] + userName: [ + { required: true, message: '鐢ㄦ埛鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }, + { + min: 2, + max: 20, + message: '鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿', + trigger: 'blur' + } + ], + nickName: [{ required: true, message: '鐢ㄦ埛鏄电О涓嶈兘涓虹┖', trigger: 'blur' }], + password: [ + { required: true, message: '鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖', trigger: 'blur' }, + { + min: 5, + max: 20, + message: '鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿', + trigger: 'blur' + } + ], + email: [ + { + type: 'email', + message: '璇疯緭鍏ユ纭殑閭鍦板潃', + trigger: ['blur', 'change'] + } + ], + phonenumber: [ + { + pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, + message: '璇疯緭鍏ユ纭殑鎵嬫満鍙风爜', + trigger: 'blur' + } + ] } -}) +}); -const { queryParams, form, rules } = toRefs<PageData<UserForm, UserQuery>>(data) +const { queryParams, form, rules } = toRefs<PageData<UserForm, UserQuery>>(data); /** 閫氳繃鏉′欢杩囨护鑺傜偣 */ const filterNode = (value: string, data: any) => { - if (!value) return true - return data.label.indexOf(value) !== -1 -} + if (!value) return true; + return data.label.indexOf(value) !== -1; +}; /** 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲 */ watchEffect( - () => { deptTreeRef.value?.filter(deptName.value); }, + () => { + deptTreeRef.value?.filter(deptName.value); + }, { flush: 'post' // watchEffect浼氬湪DOM鎸傝浇鎴栬�呮洿鏂颁箣鍓嶅氨浼氳Е鍙戯紝姝ゅ睘鎬ф帶鍒跺湪DOM鍏冪礌鏇存柊鍚庤繍琛� } @@ -422,29 +450,28 @@ loading.value = false; userList.value = res.rows; total.value = res.total; -} +}; /** 鑺傜偣鍗曞嚮浜嬩欢 */ const handleNodeClick = (data: DeptVO) => { queryParams.value.deptId = data.id; - handleQuery() -} - + handleQuery(); +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1 - getList() -} + queryParams.value.pageNum = 1; + getList(); +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - dateRange.value = ['', ''] + dateRange.value = ['', '']; queryFormRef.value?.resetFields(); queryParams.value.pageNum = 1; queryParams.value.deptId = undefined; deptTreeRef.value?.setCurrentKey(undefined); handleQuery(); -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: UserVO) => { @@ -453,78 +480,85 @@ if (!err) { await api.delUser(userIds); await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); } -} +}; /** 鐢ㄦ埛鐘舵�佷慨鏀� */ const handleStatusChange = async (row: UserVO) => { - let text = row.status === "0" ? "鍚敤" : "鍋滅敤" + let text = row.status === '0' ? '鍚敤' : '鍋滅敤'; try { await proxy?.$modal.confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚�?'); await api.changeUserStatus(row.userId, row.status); - proxy?.$modal.msgSuccess(text + "鎴愬姛"); + proxy?.$modal.msgSuccess(text + '鎴愬姛'); } catch (err) { - row.status = row.status === "0" ? "1" : "0"; + row.status = row.status === '0' ? '1' : '0'; } -} +}; /** 璺宠浆瑙掕壊鍒嗛厤 */ const handleAuthRole = (row: UserVO) => { const userId = row.userId; - router.push("/system/user-auth/role/" + userId); -} + router.push('/system/user-auth/role/' + userId); +}; /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */ const handleResetPwd = async (row: UserVO) => { - const [err, res] = await to(ElMessageBox.prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", { - confirmButtonText: "纭畾", - cancelButtonText: "鍙栨秷", - closeOnClickModal: false, - inputPattern: /^.{5,20}$/, - inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿", - })) + const [err, res] = await to( + ElMessageBox.prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + closeOnClickModal: false, + inputPattern: /^.{5,20}$/, + inputErrorMessage: '鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿' + }) + ); if (!err) { await api.resetUserPwd(row.userId, res.value); - proxy?.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + res.value); + proxy?.$modal.msgSuccess('淇敼鎴愬姛锛屾柊瀵嗙爜鏄細' + res.value); } -} +}; /** 閫夋嫨鏉℃暟 */ const handleSelectionChange = (selection: UserVO[]) => { ids.value = selection.map((item) => item.userId); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 瀵煎叆鎸夐挳鎿嶄綔 */ const handleImport = () => { - upload.title = "鐢ㄦ埛瀵煎叆"; + upload.title = '鐢ㄦ埛瀵煎叆'; upload.open = true; -} +}; /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { - proxy?.download("system/user/export", { - ...queryParams.value, - }, `user_${new Date().getTime()}.xlsx`); + proxy?.download( + 'system/user/export', + { + ...queryParams.value + }, + `user_${new Date().getTime()}.xlsx` + ); }; /** 涓嬭浇妯℃澘鎿嶄綔 */ const importTemplate = () => { - proxy?.download("system/user/importTemplate", { - }, `user_template_${new Date().getTime()}.xlsx`); -} + proxy?.download('system/user/importTemplate', {}, `user_template_${new Date().getTime()}.xlsx`); +}; /**鏂囦欢涓婁紶涓鐞� */ const handleFileUploadProgress = () => { upload.isUploading = true; -} +}; /** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */ const handleFileSuccess = (response: any, file: UploadFile) => { upload.open = false; upload.isUploading = false; uploadRef.value?.handleRemove(file); - ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "瀵煎叆缁撴灉", { dangerouslyUseHTMLString: true }); + ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + '</div>', '瀵煎叆缁撴灉', { + dangerouslyUseHTMLString: true + }); getList(); -} +}; /** 鎻愪氦涓婁紶鏂囦欢 */ function submitFileForm() { @@ -538,59 +572,57 @@ const { data } = await treeselect(); deptOptions.value = data; } -} - +}; /** 閲嶇疆鎿嶄綔琛ㄥ崟 */ const reset = () => { form.value = { ...initFormData }; userFormRef.value?.resetFields(); -} +}; /** 鍙栨秷鎸夐挳 */ const cancel = () => { dialog.visible = false; reset(); -} +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = async () => { reset(); const { data } = await api.getUser(); dialog.visible = true; - dialog.title = "鏂板鐢ㄦ埛"; + dialog.title = '鏂板鐢ㄦ埛'; await initTreeData(); postOptions.value = data.posts; roleOptions.value = data.roles; form.value.password = initPassword.value.toString(); -} +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: UserForm) => { reset(); - const userId = row?.userId || ids.value[0] - const { data } = await api.getUser(userId) + const userId = row?.userId || ids.value[0]; + const { data } = await api.getUser(userId); dialog.visible = true; - dialog.title = "淇敼鐢ㄦ埛"; + dialog.title = '淇敼鐢ㄦ埛'; await initTreeData(); Object.assign(form.value, data.user); postOptions.value = data.posts; roleOptions.value = data.roles; form.value.postIds = data.postIds; form.value.roleIds = data.roleIds; - form.value.password = ""; -} + form.value.password = ''; +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { userFormRef.value?.validate(async (valid: boolean) => { if (valid) { form.value.userId ? await api.updateUser(form.value) : await api.addUser(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + proxy?.$modal.msgSuccess('鎿嶄綔鎴愬姛'); dialog.visible = false; await getList(); } - }) -} - + }); +}; /** * 鍏抽棴鐢ㄦ埛寮圭獥 @@ -598,7 +630,7 @@ const closeDialog = () => { dialog.visible = false; resetForm(); -} +}; /** * 閲嶇疆琛ㄥ崟 @@ -609,11 +641,11 @@ form.value.id = undefined; form.value.status = '1'; -} +}; onMounted(() => { - getTreeSelect() // 鍒濆鍖栭儴闂ㄦ暟鎹� - getList() // 鍒濆鍖栧垪琛ㄦ暟鎹� - proxy?.getConfigKey("sys.user.initPassword").then(response => { + getTreeSelect(); // 鍒濆鍖栭儴闂ㄦ暟鎹� + getList(); // 鍒濆鍖栧垪琛ㄦ暟鎹� + proxy?.getConfigKey('sys.user.initPassword').then((response) => { initPassword.value = response.data; }); }); diff --git a/src/views/system/user/profile/index.vue b/src/views/system/user/profile/index.vue index 47a6632..75e1fde 100644 --- a/src/views/system/user/profile/index.vue +++ b/src/views/system/user/profile/index.vue @@ -3,14 +3,14 @@ <el-row :gutter="20"> <el-col :span="6" :xs="24"> <el-card class="box-card"> - <template v-slot:header> + <template #header> <div class="clearfix"> <span>涓汉淇℃伅</span> </div> </template> <div> <div class="text-center"> - <userAvatar/> + <userAvatar /> </div> <ul class="list-group list-group-striped"> <li class="list-group-item"> @@ -27,7 +27,7 @@ </li> <li class="list-group-item"> <svg-icon icon-class="tree" />鎵�灞為儴闂� - <div class="pull-right" v-if="state.user.dept">{{ state.user.dept.deptName }} / {{ state.postGroup }}</div> + <div v-if="state.user.dept" class="pull-right">{{ state.user.dept.deptName }} / {{ state.postGroup }}</div> </li> <li class="list-group-item"> <svg-icon icon-class="peoples" />鎵�灞炶鑹� @@ -43,7 +43,7 @@ </el-col> <el-col :span="18" :xs="24"> <el-card> - <template v-slot:header> + <template #header> <div class="clearfix"> <span>鍩烘湰璧勬枡</span> </div> @@ -66,38 +66,38 @@ </template> <script setup name="Profile" lang="ts"> -import UserAvatar from "./userAvatar.vue"; -import UserInfo from "./userInfo.vue"; -import ResetPwd from "./resetPwd.vue"; -import ThirdParty from "./thirdParty.vue"; -import { getAuthList } from "@/api/system/social/auth"; -import { getUserProfile } from "@/api/system/user"; +import UserAvatar from './userAvatar.vue'; +import UserInfo from './userInfo.vue'; +import ResetPwd from './resetPwd.vue'; +import ThirdParty from './thirdParty.vue'; +import { getAuthList } from '@/api/system/social/auth'; +import { getUserProfile } from '@/api/system/user'; -const activeTab = ref("userinfo"); +const activeTab = ref('userinfo'); const state = ref<Record<string, any>>({ - user: {}, - roleGroup: '', - postGroup: '', - auths: [] + user: {}, + roleGroup: '', + postGroup: '', + auths: [] }); const userForm = ref({}); const getUser = async () => { - const res = await getUserProfile(); - state.value.user = res.data.user; - userForm.value = { ...res.data.user } - state.value.roleGroup = res.data.roleGroup; - state.value.postGroup = res.data.postGroup; + const res = await getUserProfile(); + state.value.user = res.data.user; + userForm.value = { ...res.data.user }; + state.value.roleGroup = res.data.roleGroup; + state.value.postGroup = res.data.postGroup; }; const getAuths = async () => { - const res = await getAuthList(); - state.value.auths = res.data; + const res = await getAuthList(); + state.value.auths = res.data; }; onMounted(() => { - getUser(); - getAuths(); -}) + getUser(); + getAuths(); +}); </script> diff --git a/src/views/system/user/profile/resetPwd.vue b/src/views/system/user/profile/resetPwd.vue index 11b00f6..0a39fb1 100644 --- a/src/views/system/user/profile/resetPwd.vue +++ b/src/views/system/user/profile/resetPwd.vue @@ -17,37 +17,43 @@ </template> <script setup lang="ts"> -import { updateUserPwd } from "@/api/system/user"; -import type { ResetPwdForm } from "@/api/system/user/types"; +import { updateUserPwd } from '@/api/system/user'; +import type { ResetPwdForm } from '@/api/system/user/types'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const pwdRef = ref<ElFormInstance>(); const user = ref<ResetPwdForm>({ - oldPassword: "", - newPassword: "", - confirmPassword: "" + oldPassword: '', + newPassword: '', + confirmPassword: '' }); const equalToPassword = (rule: any, value: string, callback: any) => { if (user.value.newPassword !== value) { - callback(new Error("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�")); + callback(new Error('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�')); } else { callback(); } }; const rules = ref({ - oldPassword: [{ required: true, message: "鏃у瘑鐮佷笉鑳戒负绌�", trigger: "blur" }], - newPassword: [{ required: true, message: "鏂板瘑鐮佷笉鑳戒负绌�", trigger: "blur" }, { - min: 6, - max: 20, - message: "闀垮害鍦� 6 鍒� 20 涓瓧绗�", - trigger: "blur" - }], - confirmPassword: [{ required: true, message: "纭瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, { - required: true, - validator: equalToPassword, - trigger: "blur" - }] + oldPassword: [{ required: true, message: '鏃у瘑鐮佷笉鑳戒负绌�', trigger: 'blur' }], + newPassword: [ + { required: true, message: '鏂板瘑鐮佷笉鑳戒负绌�', trigger: 'blur' }, + { + min: 6, + max: 20, + message: '闀垮害鍦� 6 鍒� 20 涓瓧绗�', + trigger: 'blur' + } + ], + confirmPassword: [ + { required: true, message: '纭瀵嗙爜涓嶈兘涓虹┖', trigger: 'blur' }, + { + required: true, + validator: equalToPassword, + trigger: 'blur' + } + ] }); /** 鎻愪氦鎸夐挳 */ @@ -55,7 +61,7 @@ pwdRef.value?.validate(async (valid: boolean) => { if (valid) { await updateUserPwd(user.value.oldPassword, user.value.newPassword); - proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + proxy?.$modal.msgSuccess('淇敼鎴愬姛'); } }); }; diff --git a/src/views/system/user/profile/thirdParty.vue b/src/views/system/user/profile/thirdParty.vue index 4170894..7cdbea9 100644 --- a/src/views/system/user/profile/thirdParty.vue +++ b/src/views/system/user/profile/thirdParty.vue @@ -4,14 +4,14 @@ <el-table-column label="搴忓彿" width="50" type="index"></el-table-column> <el-table-column label="缁戝畾璐﹀彿骞冲彴" width="140" align="center" prop="source" show-overflow-tooltip /> <el-table-column label="澶村儚" width="120" align="center" prop="avatar"> - <template v-slot="scope"> + <template #default="scope"> <img :src="scope.row.avatar" style="width: 45px; height: 45px" /> </template> </el-table-column> <el-table-column label="绯荤粺璐﹀彿" width="180" align="center" prop="userName" :show-overflow-tooltip="true" /> <el-table-column label="缁戝畾鏃堕棿" width="180" align="center" prop="createTime" /> <el-table-column label="鎿嶄綔" width="80" align="center" class-name="small-padding fixed-width"> - <template v-slot="scope"> + <template #default="scope"> <el-button size="small" type="text" @click="unlockAuth(scope.row)">瑙g粦</el-button> </template> </el-table-column> @@ -20,25 +20,25 @@ <div id="git-user-binding"> <h4 class="provider-desc">浣犲彲浠ョ粦瀹氫互涓嬬涓夋柟甯愬彿</h4> <div id="authlist" class="user-bind"> - <a class="third-app" href="#" @click="authUrl('wechat');" title="浣跨敤 寰俊 璐﹀彿鎺堟潈鐧诲綍"> + <a class="third-app" href="#" title="浣跨敤 寰俊 璐﹀彿鎺堟潈鐧诲綍" @click="authUrl('wechat')"> <div class="git-other-login-icon"> <svg-icon icon-class="wechat" /> </div> <span class="app-name">WeiXin</span> </a> - <a class="third-app" href="#" @click="authUrl('maxkey');" title="浣跨敤 MaxKey 璐﹀彿鎺堟潈鐧诲綍"> + <a class="third-app" href="#" title="浣跨敤 MaxKey 璐﹀彿鎺堟潈鐧诲綍" @click="authUrl('maxkey')"> <div class="git-other-login-icon"> <svg-icon icon-class="maxkey" /> </div> <span class="app-name">MaxKey</span> </a> - <a class="third-app" href="#" @click="authUrl('gitee');" title="浣跨敤 Gitee 璐﹀彿鎺堟潈鐧诲綍"> + <a class="third-app" href="#" title="浣跨敤 Gitee 璐﹀彿鎺堟潈鐧诲綍" @click="authUrl('gitee')"> <div class="git-other-login-icon"> <svg-icon icon-class="gitee" /> </div> <span class="app-name">Gitee</span> </a> - <a class="third-app" href="#" @click="authUrl('github');" title="浣跨敤 GitHub 璐﹀彿鎺堟潈鐧诲綍"> + <a class="third-app" href="#" title="浣跨敤 GitHub 璐﹀彿鎺堟潈鐧诲綍" @click="authUrl('github')"> <div class="git-other-login-icon"> <svg-icon icon-class="github" /> </div> @@ -50,31 +50,32 @@ </template> <script lang="ts" setup> -import { authUnlock, authBinding } from "@/api/system/social/auth"; -import { PropType } from "vue"; +import { authUnlock, authBinding } from '@/api/system/social/auth'; +import { PropType } from 'vue'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const props = defineProps({ auths: { - type: Object as PropType<any>, + type: Object as PropType<any> } }); const auths = computed(() => props.auths); - const unlockAuth = (row: any) => { ElMessageBox.confirm('鎮ㄧ‘瀹氳瑙i櫎"' + row.source + '"鐨勮处鍙风粦瀹氬悧锛�') .then(() => { return authUnlock(row.id); - }).then((res: any) => { + }) + .then((res: any) => { if (res.code === 200) { - proxy?.$modal.msgSuccess("瑙g粦鎴愬姛"); + proxy?.$modal.msgSuccess('瑙g粦鎴愬姛'); proxy?.$tab.refreshPage(); } else { proxy?.$modal.msgError(res.msg); } - }).catch(() => { }); + }) + .catch(() => {}); }; const authUrl = (source: string) => { @@ -111,7 +112,7 @@ margin-top: 10px; } -.git-other-login-icon>img { +.git-other-login-icon > img { height: 32px; } @@ -122,15 +123,13 @@ } .provider-desc { - font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, - "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Liberation Sans", - "PingFang SC", "Microsoft YaHei", "Hiragino Sans GB", "Wenquanyi Micro Hei", - "WenQuanYi Zen Hei", "ST Heiti", SimHei, SimSun, "WenQuanYi Zen Hei Sharp", - sans-serif; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', + 'Liberation Sans', 'PingFang SC', 'Microsoft YaHei', 'Hiragino Sans GB', 'Wenquanyi Micro Hei', 'WenQuanYi Zen Hei', 'ST Heiti', SimHei, SimSun, + 'WenQuanYi Zen Hei Sharp', sans-serif; font-size: 1.071rem; } -td>img { +td > img { height: 20px; width: 20px; display: inline-block; diff --git a/src/views/system/user/profile/userAvatar.vue b/src/views/system/user/profile/userAvatar.vue index ce25c11..10ec21a 100644 --- a/src/views/system/user/profile/userAvatar.vue +++ b/src/views/system/user/profile/userAvatar.vue @@ -5,16 +5,16 @@ <el-row> <el-col :xs="24" :md="12" :style="{ height: '350px' }"> <vue-cropper + v-if="visible" ref="cropper" :img="options.img" :info="true" - :autoCrop="options.autoCrop" - :autoCropWidth="options.autoCropWidth" - :autoCropHeight="options.autoCropHeight" - :fixedBox="options.fixedBox" - :outputType="options.outputType" - @realTime="realTime" - v-if="visible" + :auto-crop="options.autoCrop" + :auto-crop-width="options.autoCropWidth" + :auto-crop-height="options.autoCropHeight" + :fixed-box="options.fixedBox" + :output-type="options.outputType" + @real-time="realTime" /> </el-col> <el-col :xs="24" :md="12" :style="{ height: '350px' }"> @@ -56,10 +56,10 @@ </template> <script setup lang="ts"> -import "vue-cropper/dist/index.css"; -import { VueCropper } from "vue-cropper"; -import { uploadAvatar } from "@/api/system/user"; -import useUserStore from "@/store/modules/user"; +import 'vue-cropper/dist/index.css'; +import { VueCropper } from 'vue-cropper'; +import { uploadAvatar } from '@/api/system/user'; +import useUserStore from '@/store/modules/user'; interface Options { img: string | any; // 瑁佸壀鍥剧墖鐨勫湴鍧� @@ -73,13 +73,12 @@ visible: boolean; } - const userStore = useUserStore(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; const open = ref(false); const visible = ref(false); -const title = ref("淇敼澶村儚"); +const title = ref('淇敼澶村儚'); const cropper = ref<any>({}); //鍥剧墖瑁佸壀鏁版嵁 @@ -89,8 +88,8 @@ autoCropWidth: 200, autoCropHeight: 200, fixedBox: true, - outputType: "png", - fileName: "", + outputType: 'png', + fileName: '', previews: {}, visible: false }); @@ -104,8 +103,7 @@ visible.value = true; }; /** 瑕嗙洊榛樿涓婁紶琛屼负 */ -const requestUpload = (): any => { -}; +const requestUpload = (): any => {}; /** 鍚戝乏鏃嬭浆 */ const rotateLeft = () => { cropper.value.rotateLeft(); @@ -121,8 +119,8 @@ }; /** 涓婁紶棰勫鐞� */ const beforeUpload = (file: any) => { - if (file.type.indexOf("image/") == -1) { - proxy?.$modal.msgError("鏂囦欢鏍煎紡閿欒锛岃涓婁紶鍥剧墖绫诲瀷,濡傦細JPG锛孭NG鍚庣紑鐨勬枃浠躲��"); + if (file.type.indexOf('image/') == -1) { + proxy?.$modal.msgError('鏂囦欢鏍煎紡閿欒锛岃涓婁紶鍥剧墖绫诲瀷,濡傦細JPG锛孭NG鍚庣紑鐨勬枃浠躲��'); } else { const reader = new FileReader(); reader.readAsDataURL(file); @@ -136,7 +134,7 @@ const uploadImg = async () => { cropper.value.getCropBlob(async (data: any) => { let formData = new FormData(); - formData.append("avatarfile", data, options.fileName); + formData.append('avatarfile', data, options.fileName); const res = await uploadAvatar(formData); open.value = false; options.img = res.data.imgUrl; @@ -164,7 +162,7 @@ } .user-info-head:hover:after { - content: "+"; + content: '+'; position: absolute; left: 0; right: 0; diff --git a/src/views/system/user/profile/userInfo.vue b/src/views/system/user/profile/userInfo.vue index 3dd5ff7..5ea5456 100644 --- a/src/views/system/user/profile/userInfo.vue +++ b/src/views/system/user/profile/userInfo.vue @@ -23,7 +23,7 @@ </template> <script setup lang="ts"> -import { updateUserProfile } from "@/api/system/user"; +import { updateUserProfile } from '@/api/system/user'; const props = defineProps({ user: { @@ -35,26 +35,31 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance; const userRef = ref<ElFormInstance>(); const rules = ref<ElFormRules>({ - nickName: [{ required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }], - email: [{ required: true, message: "閭鍦板潃涓嶈兘涓虹┖", trigger: "blur" }, { - type: "email", - message: "璇疯緭鍏ユ纭殑閭鍦板潃", - trigger: ["blur", "change"] - }], - phonenumber: [{ - required: true, - message: "鎵嬫満鍙风爜涓嶈兘涓虹┖", - trigger: "blur" - }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }] + nickName: [{ required: true, message: '鐢ㄦ埛鏄电О涓嶈兘涓虹┖', trigger: 'blur' }], + email: [ + { required: true, message: '閭鍦板潃涓嶈兘涓虹┖', trigger: 'blur' }, + { + type: 'email', + message: '璇疯緭鍏ユ纭殑閭鍦板潃', + trigger: ['blur', 'change'] + } + ], + phonenumber: [ + { + required: true, + message: '鎵嬫満鍙风爜涓嶈兘涓虹┖', + trigger: 'blur' + }, + { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '璇疯緭鍏ユ纭殑鎵嬫満鍙风爜', trigger: 'blur' } + ] }); - /** 鎻愪氦鎸夐挳 */ const submit = () => { userRef.value?.validate(async (valid: boolean) => { if (valid) { await updateUserProfile(props.user); - proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + proxy?.$modal.msgSuccess('淇敼鎴愬姛'); } }); }; diff --git a/src/views/tool/gen/basicInfoForm.vue b/src/views/tool/gen/basicInfoForm.vue index c77d0c9..5412088 100644 --- a/src/views/tool/gen/basicInfoForm.vue +++ b/src/views/tool/gen/basicInfoForm.vue @@ -3,27 +3,27 @@ <el-row> <el-col :span="12"> <el-form-item label="琛ㄥ悕绉�" prop="tableName"> - <el-input placeholder="璇疯緭鍏ヤ粨搴撳悕绉�" v-model="infoForm.tableName" /> + <el-input v-model="infoForm.tableName" placeholder="璇疯緭鍏ヤ粨搴撳悕绉�" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="琛ㄦ弿杩�" prop="tableComment"> - <el-input placeholder="璇疯緭鍏�" v-model="infoForm.tableComment" /> + <el-input v-model="infoForm.tableComment" placeholder="璇疯緭鍏�" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="瀹炰綋绫诲悕绉�" prop="className"> - <el-input placeholder="璇疯緭鍏�" v-model="infoForm.className" /> + <el-input v-model="infoForm.className" placeholder="璇疯緭鍏�" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="浣滆��" prop="functionAuthor"> - <el-input placeholder="璇疯緭鍏�" v-model="infoForm.functionAuthor" /> + <el-input v-model="infoForm.functionAuthor" placeholder="璇疯緭鍏�" /> </el-form-item> </el-col> <el-col :span="24"> <el-form-item label="澶囨敞" prop="remark"> - <el-input type="textarea" :rows="3" v-model="infoForm.remark"></el-input> + <el-input v-model="infoForm.remark" type="textarea" :rows="3"></el-input> </el-form-item> </el-col> </el-row> @@ -31,19 +31,19 @@ </template> <script setup lang="ts"> -import { propTypes } from "@/utils/propTypes"; +import { propTypes } from '@/utils/propTypes'; const prop = defineProps({ info: propTypes.any.def({}) }); -const infoForm = computed(() => prop.info) +const infoForm = computed(() => prop.info); // 琛ㄥ崟鏍¢獙 const rules = ref({ - tableName: [{ required: true, message: "璇疯緭鍏ヨ〃鍚嶇О", trigger: "blur" }], - tableComment: [{ required: true, message: "璇疯緭鍏ヨ〃鎻忚堪", trigger: "blur" }], - className: [{ required: true, message: "璇疯緭鍏ュ疄浣撶被鍚嶇О", trigger: "blur" }], - functionAuthor: [{ required: true, message: "璇疯緭鍏ヤ綔鑰�", trigger: "blur" }] + tableName: [{ required: true, message: '璇疯緭鍏ヨ〃鍚嶇О', trigger: 'blur' }], + tableComment: [{ required: true, message: '璇疯緭鍏ヨ〃鎻忚堪', trigger: 'blur' }], + className: [{ required: true, message: '璇疯緭鍏ュ疄浣撶被鍚嶇О', trigger: 'blur' }], + functionAuthor: [{ required: true, message: '璇疯緭鍏ヤ綔鑰�', trigger: 'blur' }] }); </script> diff --git a/src/views/tool/gen/editTable.vue b/src/views/tool/gen/editTable.vue index fdd1eeb..d2f7375 100644 --- a/src/views/tool/gen/editTable.vue +++ b/src/views/tool/gen/editTable.vue @@ -35,22 +35,22 @@ <el-table-column label="鎻掑叆" min-width="5%"> <template #default="scope"> - <el-checkbox true-label="1" false-label="0" v-model="scope.row.isInsert"></el-checkbox> + <el-checkbox v-model="scope.row.isInsert" true-label="1" false-label="0"></el-checkbox> </template> </el-table-column> <el-table-column label="缂栬緫" min-width="5%"> <template #default="scope"> - <el-checkbox true-label="1" false-label="0" v-model="scope.row.isEdit"></el-checkbox> + <el-checkbox v-model="scope.row.isEdit" true-label="1" false-label="0"></el-checkbox> </template> </el-table-column> <el-table-column label="鍒楄〃" min-width="5%"> <template #default="scope"> - <el-checkbox true-label="1" false-label="0" v-model="scope.row.isList"></el-checkbox> + <el-checkbox v-model="scope.row.isList" true-label="1" false-label="0"></el-checkbox> </template> </el-table-column> <el-table-column label="鏌ヨ" min-width="5%"> <template #default="scope"> - <el-checkbox true-label="1" false-label="0" v-model="scope.row.isQuery"></el-checkbox> + <el-checkbox v-model="scope.row.isQuery" true-label="1" false-label="0"></el-checkbox> </template> </el-table-column> <el-table-column label="鏌ヨ鏂瑰紡" min-width="10%"> @@ -69,7 +69,7 @@ </el-table-column> <el-table-column label="蹇呭~" min-width="5%"> <template #default="scope"> - <el-checkbox true-label="1" false-label="0" v-model="scope.row.isRequired"></el-checkbox> + <el-checkbox v-model="scope.row.isRequired" true-label="1" false-label="0"></el-checkbox> </template> </el-table-column> <el-table-column label="鏄剧ず绫诲瀷" min-width="12%"> @@ -104,7 +104,7 @@ </el-tab-pane> </el-tabs> <el-form label-width="100px"> - <div style="text-align: center;margin-left:-100px;margin-top:10px;"> + <div style="text-align: center; margin-left: -100px; margin-top: 10px"> <el-button type="primary" @click="submitForm()">鎻愪氦</el-button> <el-button @click="close()">杩斿洖</el-button> </div> @@ -118,7 +118,7 @@ import { optionselect as getDictOptionselect } from '@/api/system/dict/type'; import { DictTypeVO } from '@/api/system/dict/type/types'; import BasicInfoForm from './basicInfoForm.vue'; -import GenInfoForm from "./genInfoForm.vue"; +import GenInfoForm from './genInfoForm.vue'; const route = useRoute(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -138,8 +138,8 @@ const basicForm = basicInfo.value?.$refs.basicInfoForm; const genForm = genInfo.value?.$refs.genInfoForm; - Promise.all([basicForm, genForm].map(getFormPromise)).then(async res => { - const validateResult = res.every(item => !!item); + Promise.all([basicForm, genForm].map(getFormPromise)).then(async (res) => { + const validateResult = res.every((item) => !!item); if (validateResult) { const genTable: any = Object.assign({}, info.value); genTable.columns = columns.value; @@ -155,24 +155,24 @@ close(); } } else { - proxy?.$modal.msgError("琛ㄥ崟鏍¢獙鏈�氳繃锛岃閲嶆柊妫�鏌ユ彁浜ゅ唴瀹�"); + proxy?.$modal.msgError('琛ㄥ崟鏍¢獙鏈�氳繃锛岃閲嶆柊妫�鏌ユ彁浜ゅ唴瀹�'); } }); -} +}; const getFormPromise = (form: any) => { - return new Promise(resolve => { + return new Promise((resolve) => { form.validate((res: any) => { resolve(res); }); }); -} +}; const close = () => { - const obj = { path: "/tool/gen", query: { t: Date.now(), pageNum: route.query.pageNum } }; + const obj = { path: '/tool/gen', query: { t: Date.now(), pageNum: route.query.pageNum } }; proxy?.$tab.closeOpenPage(obj); -} +}; (async () => { - const tableId = route.params && route.params.tableId as string; + const tableId = route.params && (route.params.tableId as string); if (tableId) { // 鑾峰彇琛ㄨ缁嗕俊鎭� const res = await getGenTable(tableId); diff --git a/src/views/tool/gen/genInfoForm.vue b/src/views/tool/gen/genInfoForm.vue index 94486e2..84e1d90 100644 --- a/src/views/tool/gen/genInfoForm.vue +++ b/src/views/tool/gen/genInfoForm.vue @@ -95,7 +95,7 @@ </el-form-item> </el-col> - <el-col :span="24" v-if="infoForm.genType == '1'"> + <el-col v-if="infoForm.genType == '1'" :span="24"> <el-form-item prop="genPath"> <template #label> 鑷畾涔夎矾寰� @@ -223,7 +223,7 @@ <script setup lang="ts"> import { listMenu } from '@/api/system/menu'; -import { propTypes } from "@/utils/propTypes"; +import { propTypes } from '@/utils/propTypes'; interface MenuOptionsType { menuId: number | string; @@ -246,21 +246,21 @@ // 琛ㄥ崟鏍¢獙 const rules = ref({ - tplCategory: [{ required: true, message: "璇烽�夋嫨鐢熸垚妯℃澘", trigger: "blur" }], - packageName: [{ required: true, message: "璇疯緭鍏ョ敓鎴愬寘璺緞", trigger: "blur" }], - moduleName: [{ required: true, message: "璇疯緭鍏ョ敓鎴愭ā鍧楀悕", trigger: "blur" }], - businessName: [{ required: true, message: "璇疯緭鍏ョ敓鎴愪笟鍔″悕", trigger: "blur" }], - functionName: [{ required: true, message: "璇疯緭鍏ョ敓鎴愬姛鑳藉悕", trigger: "blur" }] + tplCategory: [{ required: true, message: '璇烽�夋嫨鐢熸垚妯℃澘', trigger: 'blur' }], + packageName: [{ required: true, message: '璇疯緭鍏ョ敓鎴愬寘璺緞', trigger: 'blur' }], + moduleName: [{ required: true, message: '璇疯緭鍏ョ敓鎴愭ā鍧楀悕', trigger: 'blur' }], + businessName: [{ required: true, message: '璇疯緭鍏ョ敓鎴愪笟鍔″悕', trigger: 'blur' }], + functionName: [{ required: true, message: '璇疯緭鍏ョ敓鎴愬姛鑳藉悕', trigger: 'blur' }] }); const subSelectChange = () => { - infoForm.value.subTableFkName = ""; -} + infoForm.value.subTableFkName = ''; +}; const tplSelectChange = (value: string) => { - if (value !== "sub") { - infoForm.value.subTableName = ""; - infoForm.value.subTableFkName = ""; + if (value !== 'sub') { + infoForm.value.subTableName = ''; + infoForm.value.subTableFkName = ''; } -} +}; const setSubTableColumns = (value: string) => { table.value.forEach((item: any) => { const name = item.tableName; @@ -268,24 +268,27 @@ subColumns.value = item.columns; return; } - }) -} + }); +}; /** 鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋� */ const getMenuTreeselect = async () => { const res = await listMenu(); - res.data.forEach(m => m.menuId = m.menuId.toString()); - const data = proxy?.handleTree<MenuOptionsType>(res.data, "menuId"); + res.data.forEach((m) => (m.menuId = m.menuId.toString())); + const data = proxy?.handleTree<MenuOptionsType>(res.data, 'menuId'); if (data) { - menuOptions.value = data + menuOptions.value = data; } -} +}; -watch(() => props.info.subTableName, val => { - setSubTableColumns(val); -}); +watch( + () => props.info.subTableName, + (val) => { + setSubTableColumns(val); + } +); onMounted(() => { getMenuTreeselect(); -}) +}); </script> diff --git a/src/views/tool/gen/importTable.vue b/src/views/tool/gen/importTable.vue index 1ba79ec..21c8148 100644 --- a/src/views/tool/gen/importTable.vue +++ b/src/views/tool/gen/importTable.vue @@ -1,7 +1,7 @@ <template> <!-- 瀵煎叆琛� --> - <el-dialog title="瀵煎叆琛�" v-model="visible" width="1100px" top="5vh" append-to-body> - <el-form :model="queryParams" ref="queryFormRef" :inline="true"> + <el-dialog v-model="visible" title="瀵煎叆琛�" width="1100px" top="5vh" append-to-body> + <el-form ref="queryFormRef" :model="queryParams" :inline="true"> <el-form-item label="鏁版嵁婧�" prop="dataName"> <el-select v-model="queryParams.dataName" filterable placeholder="璇烽�夋嫨/杈撳叆鏁版嵁婧愬悕绉�" style="width: 200px"> <el-option v-for="item in dataNameList" :key="item" :label="item" :value="item"> </el-option> @@ -19,14 +19,14 @@ </el-form-item> </el-form> <el-row> - <el-table @row-click="clickRow" ref="tableRef" :data="dbTableList" @selection-change="handleSelectionChange" height="260px"> + <el-table ref="tableRef" :data="dbTableList" height="260px" @row-click="clickRow" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55"></el-table-column> <el-table-column prop="tableName" label="琛ㄥ悕绉�" :show-overflow-tooltip="true"></el-table-column> <el-table-column prop="tableComment" label="琛ㄦ弿杩�" :show-overflow-tooltip="true"></el-table-column> <el-table-column prop="createTime" label="鍒涘缓鏃堕棿"></el-table-column> <el-table-column prop="updateTime" label="鏇存柊鏃堕棿"></el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-row> <template #footer> <div class="dialog-footer"> @@ -59,7 +59,7 @@ }); const dataNameList = ref<Array<string>>([]); -const emit = defineEmits(["ok"]); +const emit = defineEmits(['ok']); /** 鏌ヨ鍙傛暟鍒楄〃 */ const show = (dataName: string) => { @@ -71,53 +71,53 @@ } getList(); visible.value = true; -} +}; /** 鍗曞嚮閫夋嫨琛� */ const clickRow = (row: DbTableVO) => { // ele bug tableRef.value?.toggleRowSelection(row, false); -} +}; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: DbTableVO[]) => { - tables.value = selection.map(item => item.tableName); -} + tables.value = selection.map((item) => item.tableName); +}; /** 鏌ヨ琛ㄦ暟鎹� */ const getList = async () => { const res = await listDbTable(queryParams); dbTableList.value = res.rows; total.value = res.total; -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.pageNum = 1; getList(); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 瀵煎叆鎸夐挳鎿嶄綔 */ const handleImportTable = async () => { - const tableNames = tables.value.join(","); - if (tableNames == "") { - proxy?.$modal.msgError("璇烽�夋嫨瑕佸鍏ョ殑琛�"); + const tableNames = tables.value.join(','); + if (tableNames == '') { + proxy?.$modal.msgError('璇烽�夋嫨瑕佸鍏ョ殑琛�'); return; } const res = await importTable({ tables: tableNames, dataName: queryParams.dataName }); proxy?.$modal.msgSuccess(res.msg); if (res.code === 200) { visible.value = false; - emit("ok"); + emit('ok'); } -} +}; /** 鏌ヨ澶氭暟鎹簮鍚嶇О */ const getDataNameList = async () => { - const res = await getDataNames() + const res = await getDataNames(); dataNameList.value = res.data; -} +}; defineExpose({ - show, + show }); </script> diff --git a/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue index cb684f8..6a94119 100644 --- a/src/views/tool/gen/index.vue +++ b/src/views/tool/gen/index.vue @@ -1,9 +1,9 @@ <template> <div class="p-2"> <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div class="mb-[10px]" v-show="showSearch"> + <div v-show="showSearch" class="mb-[10px]"> <el-card shadow="hover"> - <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> <el-form-item label="鏁版嵁婧�" prop="dataName"> <el-select v-model="queryParams.dataName" filterable clearable placeholder="璇烽�夋嫨/杈撳叆鏁版嵁婧愬悕绉�" style="width: 200px"> <el-option key="" label="鍏ㄩ儴" value="" /> @@ -39,20 +39,20 @@ <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> - <el-button type="primary" plain icon="Download" @click="handleGenTable()" v-hasPermi="['tool:gen:code']">鐢熸垚</el-button> + <el-button v-hasPermi="['tool:gen:code']" type="primary" plain icon="Download" @click="handleGenTable()">鐢熸垚</el-button> </el-col> <el-col :span="1.5"> - <el-button type="info" plain icon="Upload" @click="openImportTable" v-hasPermi="['tool:gen:import']">瀵煎叆</el-button> + <el-button v-hasPermi="['tool:gen:import']" type="info" plain icon="Upload" @click="openImportTable">瀵煎叆</el-button> </el-col> <el-col :span="1.5"> - <el-button type="success" plain icon="Edit" :disabled="single" @click="handleEditTable()" v-hasPermi="['tool:gen:edit']">淇敼</el-button> + <el-button v-hasPermi="['tool:gen:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleEditTable()">淇敼</el-button> </el-col> <el-col :span="1.5"> - <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['tool:gen:remove']"> + <el-button v-hasPermi="['tool:gen:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> 鍒犻櫎 </el-button> </el-col> - <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> </el-row> </template> @@ -72,28 +72,28 @@ <el-table-column label="鎿嶄綔" align="center" width="330" class-name="small-padding fixed-width"> <template #default="scope"> <el-tooltip content="棰勮" placement="top"> - <el-button link type="primary" icon="View" @click="handlePreview(scope.row)" v-hasPermi="['tool:gen:preview']"></el-button> + <el-button v-hasPermi="['tool:gen:preview']" link type="primary" icon="View" @click="handlePreview(scope.row)"></el-button> </el-tooltip> <el-tooltip content="缂栬緫" placement="top"> - <el-button link type="primary" icon="Edit" @click="handleEditTable(scope.row)" v-hasPermi="['tool:gen:edit']"></el-button> + <el-button v-hasPermi="['tool:gen:edit']" link type="primary" icon="Edit" @click="handleEditTable(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍒犻櫎" placement="top"> - <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['tool:gen:remove']"></el-button> + <el-button v-hasPermi="['tool:gen:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鍚屾" placement="top"> - <el-button link type="primary" icon="Refresh" @click="handleSynchDb(scope.row)" v-hasPermi="['tool:gen:edit']"></el-button> + <el-button v-hasPermi="['tool:gen:edit']" link type="primary" icon="Refresh" @click="handleSynchDb(scope.row)"></el-button> </el-tooltip> <el-tooltip content="鐢熸垚浠g爜" placement="top"> - <el-button link type="primary" icon="Download" @click="handleGenTable(scope.row)" v-hasPermi="['tool:gen:code']"></el-button> + <el-button v-hasPermi="['tool:gen:code']" link type="primary" icon="Download" @click="handleGenTable(scope.row)"></el-button> </el-tooltip> </template> </el-table-column> </el-table> - <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> </el-card> <!-- 棰勮鐣岄潰 --> - <el-dialog :title="dialog.title" v-model="dialog.visible" width="80%" top="5vh" append-to-body class="scrollbar"> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="80%" top="5vh" append-to-body class="scrollbar"> <el-tabs v-model="preview.activeName"> <el-tab-pane v-for="(value, key) in preview.data" @@ -101,7 +101,7 @@ :name="key.substring(key.lastIndexOf('/') + 1, key.indexOf('.vm'))" :key="value" > - <el-link :underline="false" icon="DocumentCopy" v-copyText="value" v-copyText:callback="copyTextSuccess" style="float:right"> + <el-link v-copyText="value" v-copyText:callback="copyTextSuccess" :underline="false" icon="DocumentCopy" style="float: right"> 澶嶅埗 </el-link> <pre>{{ value }}</pre> @@ -129,7 +129,7 @@ const multiple = ref(true); const total = ref(0); const dateRange = ref<[DateModelType, DateModelType]>(['', '']); -const uniqueId = ref(""); +const uniqueId = ref(''); const dataNameList = ref<Array<string>>([]); const queryFormRef = ref<ElFormInstance>(); @@ -140,13 +140,13 @@ pageSize: 10, tableName: '', tableComment: '', - dataName: "" -}) + dataName: '' +}); const preview = ref<any>({ data: {}, activeName: 'domain.java' -}) +}); const dialog = reactive<DialogOption>({ visible: false, title: '浠g爜棰勮' @@ -161,13 +161,13 @@ queryFormRef.value?.resetFields(); getList(); } -}) +}); /** 鏌ヨ澶氭暟鎹簮鍚嶇О */ const getDataNameList = async () => { - const res = await getDataNames() + const res = await getDataNames(); dataNameList.value = res.data; -} +}; /** 鏌ヨ琛ㄩ泦鍚� */ const getList = async () => { @@ -176,65 +176,65 @@ tableList.value = res.rows; total.value = res.total; loading.value = false; -} +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; getList(); -} +}; /** 鐢熸垚浠g爜鎿嶄綔 */ const handleGenTable = async (row?: TableVO) => { const tbIds = row?.tableId || ids.value; - if (tbIds == "") { + if (tbIds == '') { proxy?.$modal.msgError('璇烽�夋嫨瑕佺敓鎴愮殑鏁版嵁'); return; } - if (row?.genType === "1") { + if (row?.genType === '1') { await genCode(row.tableId); proxy?.$modal.msgSuccess('鎴愬姛鐢熸垚鍒拌嚜瀹氫箟璺緞锛�' + row.genPath); } else { proxy?.$download.zip('/tool/gen/batchGenCode?tableIdStr=' + tbIds, 'ruoyi.zip'); } -} +}; /** 鍚屾鏁版嵁搴撴搷浣� */ const handleSynchDb = async (row: TableVO) => { const tableId = row.tableId; await proxy?.$modal.confirm('纭瑕佸己鍒跺悓姝�"' + row.tableName + '"琛ㄧ粨鏋勫悧锛�'); await synchDb(tableId); proxy?.$modal.msgSuccess('鍚屾鎴愬姛'); -} +}; /** 鎵撳紑瀵煎叆琛ㄥ脊绐� */ const openImportTable = () => { importRef.value?.show(queryParams.value.dataName); -} +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { dateRange.value = ['', '']; queryFormRef.value?.resetFields(); handleQuery(); -} +}; /** 棰勮鎸夐挳 */ const handlePreview = async (row: TableVO) => { const res = await previewTable(row.tableId); preview.value.data = res.data; dialog.visible = true; preview.value.activeName = 'domain.java'; -} +}; /** 澶嶅埗浠g爜鎴愬姛 */ const copyTextSuccess = () => { proxy?.$modal.msgSuccess('澶嶅埗鎴愬姛'); -} +}; // 澶氶�夋閫変腑鏁版嵁 const handleSelectionChange = (selection: TableVO[]) => { - ids.value = selection.map(item => item.tableId); + ids.value = selection.map((item) => item.tableId); single.value = selection.length != 1; multiple.value = !selection.length; -} +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleEditTable = (row?: TableVO) => { const tableId = row?.tableId || ids.value[0]; router.push({ path: '/tool/gen-edit/index/' + tableId, query: { pageNum: queryParams.value.pageNum } }); -} +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: TableVO) => { const tableIds = row?.tableId || ids.value; @@ -242,10 +242,10 @@ await delTable(tableIds); await getList(); proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); -} +}; onMounted(() => { getList(); getDataNameList(); -}) +}); </script> diff --git a/tsconfig.json b/tsconfig.json index 3dc32e7..cadd083 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,8 +1,8 @@ { "compilerOptions": { - "target": "es2022", - "useDefineForClassFields": true, + "target": "esnext", "module": "esnext", + "useDefineForClassFields": true, "moduleResolution": "node", "strict": true, "jsx": "preserve", @@ -21,6 +21,6 @@ "allowSyntheticDefaultImports": true, "forceConsistentCasingInFileNames": true }, - "include": ["src/**/*.ts", "src/**/*.vue", "src/types/**/*.d.ts"], - "exclude": ["node_modules", "dist", "**/*.js"] + "include": ["src/**/*.ts", "src/**/*.vue", "src/types/**/*.d.ts", "vite.config.ts"], + "exclude": ["node_modules", "dist", "**/*.js", "**/*.md", "src/**/*.md"] } -- Gitblit v1.9.3