From c13c622eac5551c6f099f148feb5256711ca34de Mon Sep 17 00:00:00 2001 From: 疯狂的狮子Li <15040126243@163.com> Date: 星期二, 11 七月 2023 21:03:01 +0800 Subject: [PATCH] !25 部分优化以及新增功能 Merge pull request !25 from ahaos/tspr --- src/components/BuildCode/render.vue | 62 src/assets/styles/index.scss | 7 src/views/system/user/profile/userAvatar.vue | 120 src/views/system/tenant/index.vue | 284 +- src/views/system/user/authRole.vue | 78 src/views/monitor/logininfor/index.vue | 76 src/views/monitor/operlog/index.vue | 214 src/plugins/modal.ts | 30 src/assets/styles/ruoyi.scss | 4 src/views/register.vue | 125 .eslintrc.js | 3 src/views/system/role/authUser.vue | 80 src/plugins/tab.ts | 49 src/views/system/tenantPackage/index.vue | 347 +- src/components/BuildCode/index.vue | 64 src/components/ImageUpload/index.vue | 33 src/views/monitor/cache/index.vue | 7 src/types/router.d.ts | 8 src/views/system/post/index.vue | 179 src/views/system/user/profile/index.vue | 4 src/views/tool/gen/basicInfoForm.vue | 17 src/views/system/oss/index.vue | 296 +- src/components/Breadcrumb/index.vue | 38 src/components/Pagination/index.vue | 54 src/layout/components/topBar/search.vue | 158 + src/components/Hamburger/index.vue | 11 src/views/tool/gen/index.vue | 198 src/layout/components/TagsView/ScrollPane.vue | 13 src/views/system/notice/index.vue | 178 src/components/FileUpload/index.vue | 60 src/components/ImagePreview/index.vue | 58 src/layout/components/Settings/index.vue | 23 src/views/system/dict/index.vue | 212 src/views/system/config/index.vue | 208 src/views/system/role/index.vue | 430 ++- src/types/element.d.ts | 36 src/views/system/oss/config.vue | 330 +- src/types/vform3-builds.d.ts | 4 src/layout/components/Navbar.vue | 70 src/types/global.d.ts | 26 src/assets/styles/variables.module.scss | 65 src/components/Editor/index.vue | 202 src/views/system/menu/index.vue | 205 src/views/error/401.vue | 1 src/views/system/dict/data.vue | 228 +- src/views/system/role/selectUser.vue | 69 src/views/tool/gen/editTable.vue | 15 src/views/tool/gen/importTable.vue | 87 src/components/HeaderSearch/index.vue | 80 src/assets/styles/sidebar.scss | 4 src/components/DictTag/index.vue | 7 src/views/system/dept/index.vue | 223 +- .eslintrc-auto-import.json | 31 src/store/modules/tagsView.ts | 8 src/views/demo/tree/index.vue | 42 src/components/SvgIcon/index.vue | 17 src/components/RightToolbar/index.vue | 18 src/layout/components/TagsView/index.vue | 17 src/views/monitor/online/index.vue | 71 src/api/system/user/index.ts | 73 src/types/module.d.ts | 26 src/components/TreeSelect/index.vue | 76 src/components/IconSelect/index.vue | 12 src/views/system/user/index.vue | 425 +- src/views/login.vue | 13 src/views/tool/gen/genInfoForm.vue | 24 src/layout/components/IframeToggle/index.vue | 2 src/views/system/user/profile/userInfo.vue | 46 src/components/iFrame/index.vue | 7 src/utils/propTypes.ts | 25 src/views/demo/demo/index.vue | 80 package.json | 6 src/views/system/user/profile/resetPwd.vue | 56 73 files changed, 3,434 insertions(+), 3,021 deletions(-) diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json index d076c08..a6661b6 100644 --- a/.eslintrc-auto-import.json +++ b/.eslintrc-auto-import.json @@ -1,5 +1,36 @@ { "globals": { + "ComponentInternalInstance": true, + "TransferKey": true, + "ElFormRules": true, + "CheckboxValueType": true, + "PropType": true, + "DateModelType": true, + "UploadFile": true, + "ElFormInstance": true, + "ElTableInstance": true, + "ElTreeInstance": true, + "ElTreeSelectInstance": true, + "ElSelectInstance": true, + "ElUploadInstance": true, + "ElCardInstance": true, + "ElDialogInstance": true, + "ElInputInstance": true, + "ElInputNumberInstance": true, + "ElRadioInstance": true, + "ElRadioGroupInstance": true, + "ElRadioButtonInstance": true, + "ElCheckboxInstance": true, + "ElCheckboxGroupInstance": true, + "ElSwitchInstance": true, + "ElDatePickerInstance": true, + "ElTimePickerInstance": true, + "ElTimeSelectInstance": true, + "ElScrollbarInstance": true, + "ElCascaderInstance": true, + "ElColorPickerInstance": true, + "ElRateInstance": true, + "ElSliderInstance": true, "useRouter": true, "useRoute": true, "EffectScope": true, diff --git a/.eslintrc.js b/.eslintrc.js index 2b2e0d0..b6b10a6 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -29,7 +29,8 @@ // 鍏抽棴绌虹被鍨嬫鏌� {} extendDefaults: true, types: { - '{}': false + '{}': false, + 'Function': false } } ] diff --git a/package.json b/package.json index 98195b8..039083c 100644 --- a/package.json +++ b/package.json @@ -35,10 +35,12 @@ "path-to-regexp": "6.2.0", "pinia": "2.0.22", "screenfull": "6.0.0", + "vform3-builds": "3.0.8", "vue": "3.2.45", "vue-cropper": "1.0.3", "vue-i18n": "9.2.2", - "vue-router": "4.1.4" + "vue-router": "4.1.4", + "vue-types": "^5.0.3" }, "devDependencies": { "@iconify/json": "^2.2.40", @@ -71,11 +73,11 @@ "unplugin-auto-import": "0.13.0", "unplugin-icons": "0.15.1", "unplugin-vue-components": "0.23.0", + "vite": "4.3.1", "vite-plugin-compression": "0.5.1", "vite-plugin-svg-icons": "2.0.1", "vite-plugin-vue-setup-extend": "^0.4.0", "vitest": "^0.29.7", - "vite": "4.3.1", "vue-eslint-parser": "9.1.0", "vue-tsc": "0.35.0" } diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts index d9fc1bd..21325c3 100644 --- a/src/api/system/user/index.ts +++ b/src/api/system/user/index.ts @@ -9,64 +9,64 @@ * 鏌ヨ鐢ㄦ埛鍒楄〃 * @param query */ -export function listUser(query: UserQuery): AxiosPromise<UserVO[]> { +export const listUser = (query: UserQuery): AxiosPromise<UserVO[]> => { return request({ url: '/system/user/list', method: 'get', params: query }); -} +}; /** * 鑾峰彇鐢ㄦ埛璇︽儏 * @param userId */ -export function getUser(userId?: string | number): AxiosPromise<UserInfoVO> { +export const getUser = (userId?: string | number): AxiosPromise<UserInfoVO> => { return request({ url: '/system/user/' + parseStrEmpty(userId), method: 'get' }); -} +}; /** * 鏂板鐢ㄦ埛 */ -export function addUser(data: UserForm) { +export const addUser = (data: UserForm) => { return request({ url: '/system/user', method: 'post', data: data }); -} +}; /** * 淇敼鐢ㄦ埛 */ -export function updateUser(data: UserForm) { +export const updateUser = (data: UserForm) => { return request({ url: '/system/user', method: 'put', data: data }); -} +}; /** * 鍒犻櫎鐢ㄦ埛 * @param userId 鐢ㄦ埛ID */ -export function delUser(userId: Array<string | number> | string | number) { +export const delUser = (userId: Array<string | number> | string | number) => { return request({ url: '/system/user/' + userId, method: 'delete' }); -} +}; /** * 鐢ㄦ埛瀵嗙爜閲嶇疆 * @param userId 鐢ㄦ埛ID * @param password 瀵嗙爜 */ -export function resetUserPwd(userId: string | number, password: string) { +export const resetUserPwd = (userId: string | number, password: string) => { const data = { userId, password @@ -76,14 +76,14 @@ method: 'put', data: data }); -} +}; /** * 鐢ㄦ埛鐘舵�佷慨鏀� * @param userId 鐢ㄦ埛ID * @param status 鐢ㄦ埛鐘舵�� */ -export function changeUserStatus(userId: number | string, status: string) { +export const changeUserStatus = (userId: number | string, status: string) => { const data = { userId, status @@ -93,36 +93,36 @@ method: 'put', data: data }); -} +}; /** * 鏌ヨ鐢ㄦ埛涓汉淇℃伅 */ -export function getUserProfile(): AxiosPromise<UserInfoVO> { +export const getUserProfile = (): AxiosPromise<UserInfoVO> => { return request({ url: '/system/user/profile', method: 'get' }); -} +}; /** * 淇敼鐢ㄦ埛涓汉淇℃伅 * @param data 鐢ㄦ埛淇℃伅 */ -export function updateUserProfile(data: UserForm) { +export const updateUserProfile = (data: UserForm) => { return request({ url: '/system/user/profile', method: 'put', data: data }); -} +}; /** * 鐢ㄦ埛瀵嗙爜閲嶇疆 * @param oldPassword 鏃у瘑鐮� * @param newPassword 鏂板瘑鐮� */ -export function updateUserPwd(oldPassword: string, newPassword: string) { +export const updateUserPwd = (oldPassword: string, newPassword: string) => { const data = { oldPassword, newPassword @@ -132,49 +132,66 @@ method: 'put', params: data }); -} +}; /** * 鐢ㄦ埛澶村儚涓婁紶 * @param data 澶村儚鏂囦欢 */ -export function uploadAvatar(data: FormData) { +export const uploadAvatar = (data: FormData) => { return request({ url: '/system/user/profile/avatar', method: 'post', data: data }); -} +}; /** * 鏌ヨ鎺堟潈瑙掕壊 * @param userId 鐢ㄦ埛ID */ -export function getAuthRole(userId: string | number): AxiosPromise<{ user: UserVO; roles: RoleVO[] }> { +export const getAuthRole = (userId: string | number): AxiosPromise<{ user: UserVO; roles: RoleVO[] }> => { return request({ url: '/system/user/authRole/' + userId, method: 'get' }); -} +}; /** * 淇濆瓨鎺堟潈瑙掕壊 * @param data 鐢ㄦ埛ID */ -export function updateAuthRole(data: { userId: string; roleIds: string }) { +export const updateAuthRole = (data: { userId: string; roleIds: string }) => { return request({ url: '/system/user/authRole', method: 'put', params: data }); -} +}; /** * 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */ -export function deptTreeSelect(): AxiosPromise<DeptVO[]> { +export const deptTreeSelect = (): AxiosPromise<DeptVO[]> => { return request({ url: '/system/user/deptTree', method: 'get' }); -} +}; + +export default { + listUser, + getUser, + addUser, + updateUser, + delUser, + resetUserPwd, + changeUserStatus, + getUserProfile, + updateUserProfile, + updateUserPwd, + uploadAvatar, + getAuthRole, + updateAuthRole, + deptTreeSelect +}; diff --git a/src/assets/styles/index.scss b/src/assets/styles/index.scss index e797f64..e31ea97 100644 --- a/src/assets/styles/index.scss +++ b/src/assets/styles/index.scss @@ -26,6 +26,10 @@ box-sizing: border-box; } +html.dark .svg-icon, html.dark svg { + fill: var(--el-text-color-regular); +} + #app { height: 100%; } @@ -137,6 +141,7 @@ border: 1px solid var(--el-border-color-light); background-color: var(--el-bg-color-overlay); padding: 0.75rem; + transition: all ease 0.3s; &:hover { box-shadow: 0 2px 12px #0000001a; @@ -199,4 +204,4 @@ vertical-align: middle; margin-bottom: 10px; } -} \ No newline at end of file +} diff --git a/src/assets/styles/ruoyi.scss b/src/assets/styles/ruoyi.scss index 2e00d00..d2ecb24 100644 --- a/src/assets/styles/ruoyi.scss +++ b/src/assets/styles/ruoyi.scss @@ -90,8 +90,8 @@ .el-table__fixed-header-wrapper { th { word-break: break-word; - background-color: #f8f8f9 !important; - color: #515a6e; + background-color: $table-header-bg !important; + color: $table-header-text-color; height: 40px !important; font-size: 13px; } diff --git a/src/assets/styles/sidebar.scss b/src/assets/styles/sidebar.scss index 1db15fa..06bf057 100644 --- a/src/assets/styles/sidebar.scss +++ b/src/assets/styles/sidebar.scss @@ -84,7 +84,7 @@ .sub-menu-title-noDropdown, .el-sub-menu__title { &:hover { - background-color: rgba(0, 0, 0, 0.06) !important; + background-color: $base-sub-menu-title-hover !important; } } @@ -211,7 +211,7 @@ .el-menu-item { &:hover { // you can use $sub-menuHover - background-color: rgba(0, 0, 0, 0.06) !important; + background-color: $base-menu-hover !important; } } diff --git a/src/assets/styles/variables.module.scss b/src/assets/styles/variables.module.scss index 639b23b..fdcb11c 100644 --- a/src/assets/styles/variables.module.scss +++ b/src/assets/styles/variables.module.scss @@ -1,3 +1,38 @@ +// 鍏ㄥ眬SCSS鍙橀噺 +:root { + --menuBg: #304156; + --menuColor: #bfcbd9; + --menuActiveText: #f4f4f5; + --menuHover: #263445; + + --subMenuBg: #1f2d3d; + --subMenuActiveText: #f4f4f5; + --subMenuHover: #001528; + --subMenuTitleHover: #293444; + + --tableHeaderBg: #f8f8f9; + --tableHeaderTextColor: #515a6e; +} +html.dark { + --menuBg: #1d1e1f; + --menuColor: #bfcbd9; + --menuActiveText: #f4f4f5; + --menuHover: #171819; + + --subMenuBg: #1d1e1f; + --subMenuActiveText: #1d1e1f; + --subMenuHover: #171819; + --subMenuTitleHover: #171819; + + --tableHeaderBg: var(--el-bg-color); + --tableHeaderTextColor: var(--el-text-color); + + // 瑕嗙洊ele 楂樹寒褰撳墠琛岀殑鏍囧噯鏆楄壊 + .el-tree-node__content { + --el-color-primary-light-9: #262727; + } +} + // base color $blue: #324157; $light-blue: #3a71a8; @@ -9,32 +44,22 @@ $panGreen: #30b08f; // 榛樿鑿滃崟涓婚椋庢牸 -$base-menu-color: #bfcbd9; -$base-menu-color-active: #f4f4f5; -$base-menu-background: #304156; +$base-menu-color: var(--menuColor); +$base-menu-hover: var(--menuHover); +$base-menu-color-active: var(--menuActiveText); +$base-menu-background: var(--menuBg); $base-logo-title-color: #ffffff; $base-menu-light-color: rgba(0, 0, 0, 0.7); $base-menu-light-background: #ffffff; $base-logo-light-title-color: #001529; -$base-sub-menu-background: #1f2d3d; -$base-sub-menu-hover: #001528; - -// 鑷畾涔夋殫鑹茶彍鍗曢鏍� -/** -$base-menu-color:hsla(0,0%,100%,.65); -$base-menu-color-active:#fff; -$base-menu-background:#001529; -$base-logo-title-color: #ffffff; - -$base-menu-light-color:rgba(0,0,0,.70); -$base-menu-light-background:#ffffff; -$base-logo-light-title-color: #001529; - -$base-sub-menu-background:#000c17; -$base-sub-menu-hover:#001528; -*/ +$base-sub-menu-background: var(--subMenuBg); +$base-sub-menu-hover: var(--subMenuHover); +$base-sub-menu-title-hover: var(--subMenuTitleHover); +// 琛ㄥ崟澶磋儗鏅壊鍜屾爣棰橀鑹� +$table-header-bg: var(--tableHeaderBg); +$table-header-text-color: var(--tableHeaderTextColor); $--color-primary: #409eff; $--color-success: #67c23a; diff --git a/src/components/Breadcrumb/index.vue b/src/components/Breadcrumb/index.vue index 435d0cc..b96829a 100644 --- a/src/components/Breadcrumb/index.vue +++ b/src/components/Breadcrumb/index.vue @@ -18,34 +18,34 @@ 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] - // 鍒ゆ柇鏄惁涓洪椤� - if (!isDashboard(first)) { - matched = ([{ path: '/index', meta: { title: '棣栭〉' } }] as any).concat(matched) - } - levelList.value = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false) + // only show routes with meta.title + 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) + } + 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 - if (!name) { - return false - } - return name.trim() === 'Index' + const name = route && route.name as string + if (!name) { + return false + } + 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 you go to the redirect page, do not update the breadcrumbs + if (route.path.startsWith('/redirect/')) return + getBreadcrumb() }) onMounted(() => { - getBreadcrumb(); + getBreadcrumb(); }) </script> diff --git a/src/components/BuildCode/index.vue b/src/components/BuildCode/index.vue new file mode 100644 index 0000000..b23665c --- /dev/null +++ b/src/components/BuildCode/index.vue @@ -0,0 +1,64 @@ +<!-- 浠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> + <div> + <v-form-designer + class="build" + ref="buildRef" + :designer-config="{ importJsonButton: true, exportJsonButton: true, exportCodeButton: true, generateSFCButton: true, formTemplates: true }" + > + <template #customToolButtons v-if="showBtn"> + <el-button link type="primary" icon="Select" @click="getJson">淇濆瓨</el-button> + </template> + </v-form-designer> + </div> +</template> + +<style lang="scss"> +.build { + margin: 0 !important; + overflow-y: auto !important; + + & header.main-header { + display: none; + } + + & .right-toolbar-con { + text-align: right !important; + } +} +</style> diff --git a/src/components/BuildCode/render.vue b/src/components/BuildCode/render.vue new file mode 100644 index 0000000..5693ed8 --- /dev/null +++ b/src/components/BuildCode/render.vue @@ -0,0 +1,62 @@ +<!-- 鍔ㄦ�佽〃鍗曟覆鏌� --> +<script setup name="Render"> + +const props = defineProps({ + formJson: { + type: [String, Object], + default: {} + }, + formData: { + type: [String, Object], + default: {} + }, + isView: { + type: Boolean, + default: false + } +}) + +const vFormRef = ref(null) +// 鑾峰彇琛ㄥ崟鏁版嵁-寮傛 +const getFormData = () => { + return vFormRef.value.getFormData() +} + +/** + * 璁剧疆琛ㄥ崟鍐呭 + * @param {琛ㄥ崟閰嶇疆} formConf + * formConfig锛歿 formTemplate锛氳〃鍗曟ā鏉匡紝formData锛氳〃鍗曟暟鎹紝hiddenField锛氶渶瑕侀殣钘忕殑瀛楁瀛楃涓查泦鍚堬紝disabledField锛氶渶瑕佺鐢ㄧ殑鑷瀛楃涓查泦鍚坿 + */ +const initForm = (formConf) => { + const { formTemplate, formData, hiddenField, disabledField } = toRaw(formConf) + if (formTemplate) { + vFormRef.value.setFormJson(formTemplate) + if (formData) { + vFormRef.value.setFormData(formData) + } + if (disabledField && disabledField.length > 0) { + setTimeout(() => { + vFormRef.value.disableWidgets(disabledField) + }, 200) + } + if (hiddenField && hiddenField.length > 0) { + setTimeout(() => { + vFormRef.value.hideWidgets(hiddenField) + }, 200) + } + if (props.isView) { + console.log(props.isView) + setTimeout(() => { + vFormRef.value.disableForm() + }, 100) + } + } +} +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 f27b16a..08aef21 100644 --- a/src/components/DictTag/index.vue +++ b/src/components/DictTag/index.vue @@ -24,7 +24,7 @@ </template> <script setup lang="ts"> -import { PropType } from 'vue'; +import { propTypes } from '@/utils/propTypes'; const props = defineProps({ @@ -36,10 +36,7 @@ // 褰撳墠鐨勫�� value: [Number, String, Array] as PropType<number | string | Array<number | string>>, // 褰撴湭鎵惧埌鍖归厤鐨勬暟鎹椂锛屾樉绀簐alue - showValue: { - type: Boolean as PropType<boolean>, - default: true, - }, + showValue: propTypes.bool.def(true), }); const values = computed(() => { diff --git a/src/components/Editor/index.vue b/src/components/Editor/index.vue index a0728eb..b5b1526 100644 --- a/src/components/Editor/index.vue +++ b/src/components/Editor/index.vue @@ -30,152 +30,139 @@ import { QuillEditor, Quill } from '@vueup/vue-quill'; import '@vueup/vue-quill/dist/vue-quill.snow.css'; import { getToken } from "@/utils/auth"; -import { ComponentInternalInstance } from "vue"; +import { propTypes } from '@/utils/propTypes'; const props = defineProps({ - /* 缂栬緫鍣ㄧ殑鍐呭 */ - modelValue: { - type: String, - }, - /* 楂樺害 */ - height: { - type: Number, - default: null, - }, - /* 鏈�灏忛珮搴� */ - minHeight: { - type: Number, - default: null, - }, - /* 鍙 */ - readOnly: { - type: Boolean, - default: false, - }, - /* 涓婁紶鏂囦欢澶у皬闄愬埗(MB) */ - fileSize: { - type: Number, - default: 5, - }, - /* 绫诲瀷锛坆ase64鏍煎紡銆乽rl鏍煎紡锛� */ - type: { - type: String, - default: "url", - } + /* 缂栬緫鍣ㄧ殑鍐呭 */ + modelValue: propTypes.string, + /* 楂樺害 */ + height: propTypes.number.def(400), + /* 鏈�灏忛珮搴� */ + minHeight: propTypes.number.def(400), + /* 鍙 */ + readOnly: propTypes.bool.def(false), + /* 涓婁紶鏂囦欢澶у皬闄愬埗(MB) */ + fileSize: propTypes.number.def(5), + /* 绫诲瀷锛坆ase64鏍煎紡銆乽rl鏍煎紡锛� */ + type: propTypes.string.def('url') }); const { proxy } = getCurrentInstance() as ComponentInternalInstance; const upload = reactive<UploadOption>({ - headers: { Authorization: "Bearer " + getToken() }, - url: import.meta.env.VITE_APP_BASE_API + '/resource/oss/upload' + headers: { Authorization: "Bearer " + getToken() }, + url: import.meta.env.VITE_APP_BASE_API + '/resource/oss/upload' }) const myQuillEditor = ref(); const options = ref({ - theme: "snow", - bounds: document.body, - 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"] // 閾炬帴銆佸浘鐗囥�佽棰� - ], - handlers: { - image: function (value: any) { - if (value) { - // 璋冪敤element鍥剧墖涓婁紶 - (document.querySelector(".editor-img-uploader>.el-upload") as HTMLDivElement)?.click(); - } else { - Quill.format("image", true); - } - }, - }, - } - }, - placeholder: '璇疯緭鍏ュ唴瀹�', - readOnly: props.readOnly, + theme: "snow", + bounds: document.body, + 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"] // 閾炬帴銆佸浘鐗囥�佽棰� + ], + handlers: { + image: function (value: any) { + if (value) { + // 璋冪敤element鍥剧墖涓婁紶 + (document.querySelector(".editor-img-uploader>.el-upload") as HTMLDivElement)?.click(); + } else { + Quill.format("image", true); + } + }, + }, + } + }, + placeholder: '璇疯緭鍏ュ唴瀹�', + readOnly: props.readOnly, }); const styles = computed(() => { - let style: any = {}; - if (props.minHeight) { - style.minHeight = `${props.minHeight}px`; - } - if (props.height) { - style.height = `${props.height}px`; - } - return style; + let style: any = {}; + if (props.minHeight) { + style.minHeight = `${props.minHeight}px`; + } + if (props.height) { + 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; - } + if (v !== content.value) { + content.value = v === undefined ? "<p></p>" : v; + } }, { immediate: true }); // 鍥剧墖涓婁紶鎴愬姛杩斿洖鍥剧墖鍦板潃 const handleUploadSuccess = (res: any) => { - // 鑾峰彇瀵屾枃鏈疄渚� - let quill = toRaw(myQuillEditor.value).getQuill(); - // 濡傛灉涓婁紶鎴愬姛 - if (res.code === 200) { - // 鑾峰彇鍏夋爣浣嶇疆 - let length = quill.selection.savedRange.index; - // 鎻掑叆鍥剧墖锛宺es涓烘湇鍔″櫒杩斿洖鐨勫浘鐗囬摼鎺ュ湴鍧� - quill.insertEmbed(length, "image", res.data.url); - // 璋冩暣鍏夋爣鍒版渶鍚� - quill.setSelection(length + 1); - proxy?.$modal.closeLoading(); - } else { - proxy?.$modal.loading(res.msg); - proxy?.$modal.closeLoading(); - } + // 鑾峰彇瀵屾枃鏈疄渚� + let quill = toRaw(myQuillEditor.value).getQuill(); + // 濡傛灉涓婁紶鎴愬姛 + if (res.code === 200) { + // 鑾峰彇鍏夋爣浣嶇疆 + let length = quill.selection.savedRange.index; + // 鎻掑叆鍥剧墖锛宺es涓烘湇鍔″櫒杩斿洖鐨勫浘鐗囬摼鎺ュ湴鍧� + quill.insertEmbed(length, "image", res.data.url); + // 璋冩暣鍏夋爣鍒版渶鍚� + quill.setSelection(length + 1); + proxy?.$modal.closeLoading(); + } else { + proxy?.$modal.loading(res.msg); + proxy?.$modal.closeLoading(); + } } // 鍥剧墖涓婁紶鍓嶆嫤鎴� const handleBeforeUpload = (file: any) => { - // 鏍℃鏂囦欢澶у皬 - 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湪涓婁紶鏂囦欢锛岃绋嶅��...'); - return true; + } + proxy?.$modal.loading('姝e湪涓婁紶鏂囦欢锛岃绋嶅��...'); + return true; } // 鍥剧墖澶辫触鎷︽埅 const handleUploadError = (err: any) => { - console.error(err); - proxy?.$modal.msgError('涓婁紶鏂囦欢澶辫触'); + console.error(err); + proxy?.$modal.msgError('涓婁紶鏂囦欢澶辫触'); } </script> <style> -.editor, .ql-toolbar { +.editor, +.ql-toolbar { white-space: pre-wrap !important; line-height: normal !important; } + .quill-img { display: none; } + .ql-snow .ql-tooltip[data-mode="link"]::before { content: "璇疯緭鍏ラ摼鎺ュ湴鍧�:"; } + .ql-snow .ql-tooltip.ql-editing a.ql-action::after { border-right: 0; content: "淇濆瓨"; @@ -190,14 +177,17 @@ .ql-snow .ql-picker.ql-size .ql-picker-item::before { 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="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"; @@ -207,26 +197,32 @@ .ql-snow .ql-picker.ql-header .ql-picker-item::before { 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="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="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="6"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { content: "鏍囬6"; @@ -236,10 +232,12 @@ .ql-snow .ql-picker.ql-font .ql-picker-item::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: "绛夊瀛椾綋"; diff --git a/src/components/FileUpload/index.vue b/src/components/FileUpload/index.vue index a46d5ee..32e871f 100644 --- a/src/components/FileUpload/index.vue +++ b/src/components/FileUpload/index.vue @@ -45,31 +45,18 @@ <script setup lang="ts"> import { getToken } from "@/utils/auth"; import { listByIds, delOss } from "@/api/system/oss"; -import { ComponentInternalInstance } from "vue"; -import { ElUpload, UploadFile } from "element-plus"; +import { propTypes } from '@/utils/propTypes'; const props = defineProps({ modelValue: [String, Object, Array], // 鏁伴噺闄愬埗 - limit: { - type: Number, - default: 5, - }, + limit: propTypes.number.def(5), // 澶у皬闄愬埗(MB) - fileSize: { - type: Number, - default: 5, - }, + fileSize: propTypes.number.def(5), // 鏂囦欢绫诲瀷, 渚嬪['png', 'jpg', 'jpeg'] - fileType: { - type: Array, - default: () => ["doc", "xls", "ppt", "txt", "pdf"], - }, + fileType: propTypes.array.def(["doc", "xls", "ppt", "txt", "pdf"]), // 鏄惁鏄剧ず鎻愮ず - isShowTip: { - type: Boolean, - default: true - } + isShowTip: propTypes.bool.def(true), }); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -86,7 +73,7 @@ () => props.isShowTip && (props.fileType || props.fileSize) ); -const fileUploadRef = ref(ElUpload); +const fileUploadRef = ref<ElUploadInstance>(); watch(() => props.modelValue, async val => { if (val) { @@ -96,7 +83,7 @@ if (Array.isArray(val)) { list = val; } else { - const res = await listByIds(val as string) + 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; @@ -104,7 +91,7 @@ } // 鐒跺悗灏嗘暟缁勮浆涓哄璞℃暟缁� fileList.value = list.map(item => { - item = {name: item.name, url: item.url, ossId: item.ossId}; + item = { name: item.name, url: item.url, ossId: item.ossId }; item.uid = item.uid || new Date().getTime() + temp++; return item; }); @@ -112,7 +99,7 @@ fileList.value = []; return []; } -},{ deep: true, immediate: true }); +}, { deep: true, immediate: true }); // 涓婁紶鍓嶆牎妫�鏍煎紡鍜屽ぇ灏� const handleBeforeUpload = (file: any) => { @@ -150,7 +137,7 @@ } // 涓婁紶鎴愬姛鍥炶皟 -const handleUploadSuccess = (res:any, file: UploadFile) => { +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(); @@ -158,7 +145,7 @@ number.value--; proxy?.$modal.closeLoading(); proxy?.$modal.msgError(res.msg); - fileUploadRef.value.handleRemove(file); + fileUploadRef.value?.handleRemove(file); uploadedSuccessfully(); } } @@ -172,7 +159,7 @@ } // 涓婁紶缁撴潫澶勭悊 -const uploadedSuccessfully =() => { +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 = []; @@ -207,21 +194,24 @@ <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 fffcedf..489ac43 100644 --- a/src/components/Hamburger/index.vue +++ b/src/components/Hamburger/index.vue @@ -1,6 +1,6 @@ <template> <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"> + <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" /> @@ -9,16 +9,15 @@ </template> <script setup lang="ts"> +import { propTypes } from '@/utils/propTypes'; + defineProps({ - isActive: { - type: Boolean, - default: false - } + isActive: propTypes.bool.def(false) }) const emit = defineEmits(['toggleClick']) const toggleClick = () => { - emit('toggleClick'); + emit('toggleClick'); } </script> diff --git a/src/components/HeaderSearch/index.vue b/src/components/HeaderSearch/index.vue index 60ebb9d..9b0f2c6 100644 --- a/src/components/HeaderSearch/index.vue +++ b/src/components/HeaderSearch/index.vue @@ -17,12 +17,12 @@ </div> </template> -<script setup lang="ts"> -import Fuse from 'fuse.js' -import { getNormalPath } from '@/utils/ruoyi' -import { isHttp } from '@/utils/validate' -import usePermissionStore from '@/store/modules/permission' -import { RouteOption } from 'vue-router' +<script setup lang="ts" name="HeaderSearch"> +import Fuse from 'fuse.js'; +import { getNormalPath } from '@/utils/ruoyi'; +import { isHttp } from '@/utils/validate'; +import usePermissionStore from '@/store/modules/permission'; +import { RouteOption } from 'vue-router'; type Router = Array<{ path: string; @@ -34,7 +34,7 @@ const searchPool = ref<Router>([]); const show = ref(false); const fuse = ref(); -const headerSearchSelectRef = ref(ElSelect); +const headerSearchSelectRef = ref<ElSelectInstance>(); const router = useRouter(); const routes = computed(() => usePermissionStore().routes); @@ -123,9 +123,9 @@ searchPool.value = generateRoutes(routes.value); }) -watchEffect(() => { - searchPool.value = generateRoutes(routes.value) -}) +// watchEffect(() => { +// searchPool.value = generateRoutes(routes.value) +// }) watch(show, (value) => { if (value) { @@ -142,40 +142,40 @@ <style lang="scss" scoped> .header-search { - font-size: 0 !important; + font-size: 0 !important; - .search-icon { - cursor: pointer; - font-size: 18px; - vertical-align: middle; - } - - .header-search-select { - font-size: 18px; - transition: width 0.2s; - width: 0; - overflow: hidden; - background: transparent; - border-radius: 0; - display: inline-block; - vertical-align: middle; - - :deep(.el-input__inner) { - border-radius: 0; - border: 0; - padding-left: 0; - padding-right: 0; - box-shadow: none !important; - border-bottom: 1px solid #d9d9d9; - vertical-align: middle; + .search-icon { + cursor: pointer; + font-size: 18px; + vertical-align: middle; } - } - &.show { .header-search-select { - width: 210px; - margin-left: 10px; + font-size: 18px; + transition: width 0.2s; + width: 0; + overflow: hidden; + background: transparent; + border-radius: 0; + display: inline-block; + vertical-align: middle; + + :deep(.el-input__inner) { + border-radius: 0; + border: 0; + padding-left: 0; + padding-right: 0; + box-shadow: none !important; + border-bottom: 1px solid #d9d9d9; + vertical-align: middle; + } } - } + + &.show { + .header-search-select { + width: 210px; + margin-left: 10px; + } + } } </style> diff --git a/src/components/IconSelect/index.vue b/src/components/IconSelect/index.vue index 22b9484..c53b437 100644 --- a/src/components/IconSelect/index.vue +++ b/src/components/IconSelect/index.vue @@ -31,17 +31,11 @@ <script setup lang="ts"> import icons from '@/components/IconSelect/requireIcons'; +import { propTypes } from '@/utils/propTypes'; const props = defineProps({ - modelValue: { - type: String, - require: true - }, - width: { - type: String, - require: false, - default: '400px' - } + modelValue: propTypes.string.isRequired, + width: propTypes.string.def('400px') }); const emit = defineEmits(['update:modelValue']); diff --git a/src/components/ImagePreview/index.vue b/src/components/ImagePreview/index.vue index 57019e3..723ccdb 100644 --- a/src/components/ImagePreview/index.vue +++ b/src/components/ImagePreview/index.vue @@ -9,47 +9,46 @@ </template> <script setup lang="ts"> +import { propTypes } from '@/utils/propTypes'; + const props = defineProps({ - src: { - type: String, - default: "" - }, - width: { - type: [Number, String], - default: "" - }, - height: { - type: [Number, String], - default: "" - } + src: propTypes.string.def(''), + width: { + type: [Number, String], + default: "" + }, + height: { + type: [Number, String], + default: "" + } }); const realSrc = computed(() => { - if (!props.src) { - return; - } - let real_src = props.src.split(",")[0]; - return real_src; + if (!props.src) { + return; + } + let real_src = props.src.split(",")[0]; + return real_src; }); const realSrcList = computed(() => { - if (!props.src) { - return; - } - let real_src_list = props.src.split(","); - let srcList:string[] = []; - real_src_list.forEach(item => { - return srcList.push(item); - }); - return srcList; + if (!props.src) { + return; + } + let real_src_list = props.src.split(","); + let srcList: string[] = []; + real_src_list.forEach(item => { + return srcList.push(item); + }); + return srcList; }); const realWidth = computed(() => - typeof props.width == "string" ? props.width : `${props.width}px` + typeof props.width == "string" ? props.width : `${props.width}px` ); const realHeight = computed(() => - typeof props.height == "string" ? props.height : `${props.height}px` + typeof props.height == "string" ? props.height : `${props.height}px` ); </script> @@ -58,13 +57,16 @@ border-radius: 5px; background-color: #ebeef5; box-shadow: 0 0 5px 1px #ccc; + :deep(.el-image__inner) { transition: all 0.3s; cursor: pointer; + &:hover { transform: scale(1.2); } } + :deep(.image-slot) { display: flex; justify-content: center; diff --git a/src/components/ImageUpload/index.vue b/src/components/ImageUpload/index.vue index 0791f3e..01edc4f 100644 --- a/src/components/ImageUpload/index.vue +++ b/src/components/ImageUpload/index.vue @@ -17,7 +17,9 @@ :on-preview="handlePictureCardPreview" :class="{ hide: fileList.length >= limit }" > - <el-icon class="avatar-uploader-icon"><plus /></el-icon> + <el-icon class="avatar-uploader-icon"> + <plus /> + </el-icon> </el-upload> <!-- 涓婁紶鎻愮ず --> <div class="el-upload__tip" v-if="showTip"> @@ -42,25 +44,16 @@ import { listByIds, delOss } from "@/api/system/oss"; import { ComponentInternalInstance, PropType } from "vue"; import { OssVO } from "@/api/system/oss/types"; -import { ElUpload, UploadFile } from "element-plus"; +import { propTypes } from '@/utils/propTypes'; const props = defineProps({ modelValue: [String, Object, Array], // 鍥剧墖鏁伴噺闄愬埗 - limit: { - type: Number, - default: 5, - }, + limit: propTypes.number.def(5), // 澶у皬闄愬埗(MB) - fileSize: { - type: Number, - default: 5, - }, + fileSize: propTypes.number.def(5), // 鏂囦欢绫诲瀷, 渚嬪['png', 'jpg', 'jpeg'] - fileType: { - type: Array as PropType<string[]>, - default: () => ["png", "jpg", "jpeg"], - }, + fileType: propTypes.array.def(["png", "jpg", "jpeg"]), // 鏄惁鏄剧ず鎻愮ず isShowTip: { type: Boolean, @@ -84,12 +77,12 @@ () => props.isShowTip && (props.fileType || props.fileSize) ); -const imageUploadRef = ref(ElUpload); +const imageUploadRef = ref<ElUploadInstance>(); watch(() => props.modelValue, async val => { if (val) { // 棣栧厛灏嗗�艰浆涓烘暟缁� - let list:OssVO[] = []; + let list: OssVO[] = []; if (Array.isArray(val)) { list = val as OssVO[]; } else { @@ -112,7 +105,7 @@ fileList.value = []; return []; } -},{ deep: true, immediate: true }); +}, { deep: true, immediate: true }); /** 涓婁紶鍓峫oading鍔犺浇 */ const handleBeforeUpload = (file: any) => { @@ -122,7 +115,7 @@ if (file.name.lastIndexOf(".") > -1) { fileExtension = file.name.slice(file.name.lastIndexOf(".") + 1); } - isImg = props.fileType.some((type) => { + isImg = props.fileType.some((type: any) => { if (file.type.indexOf(type) > -1) return true; if (fileExtension && fileExtension.indexOf(type) > -1) return true; return false; @@ -161,7 +154,7 @@ number.value--; proxy?.$modal.closeLoading(); proxy?.$modal.msgError(res.msg); - imageUploadRef.value.handleRemove(file); + imageUploadRef.value?.handleRemove(file); uploadedSuccessfully(); } } @@ -207,7 +200,7 @@ let strs = ""; separator = separator || ","; for (let i in list) { - if(undefined !== list[i].ossId && list[i].url.indexOf("blob:") !== 0) { + if (undefined !== list[i].ossId && list[i].url.indexOf("blob:") !== 0) { strs += list[i].ossId + separator; } } diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue index de7b02c..df73ceb 100644 --- a/src/components/Pagination/index.vue +++ b/src/components/Pagination/index.vue @@ -22,52 +22,23 @@ <script setup lang="ts"> import { scrollTo } from '@/utils/scroll-to' -import { PropType } from "vue"; +import { propTypes } from "@/utils/propTypes"; const props = defineProps({ - total: { - required: true, - type: Number - }, - page: { - type: Number, - default: 1 - }, - limit: { - type: Number, - default: 20 - }, + total: propTypes.number, + page: propTypes.number.def(1), + limit: propTypes.number.def(20), pageSizes: { - type: Array as PropType<number[]>, - default() { - return [10, 20, 30, 50] - } + type: Array as PropType<number[]>, + default: () => [10, 20, 30, 50] }, // 绉诲姩绔〉鐮佹寜閽殑鏁伴噺绔粯璁ゅ��5 - pagerCount: { - type: Number, - default: document.body.clientWidth < 992 ? 5 : 7 - }, - layout: { - type: String, - default: 'total, sizes, prev, pager, next, jumper' - }, - background: { - type: Boolean, - default: true - }, - autoScroll: { - type: Boolean, - default: true - }, - hidden: { - type: Boolean, - default: false - }, - float: { - type: String, - default: 'right' - } + 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']); @@ -106,7 +77,6 @@ <style lang="scss" scoped> .pagination-container { - background: #fff; padding: 32px 16px; .el-pagination{ float: v-bind(float); diff --git a/src/components/RightToolbar/index.vue b/src/components/RightToolbar/index.vue index 20226d8..09036b7 100644 --- a/src/components/RightToolbar/index.vue +++ b/src/components/RightToolbar/index.vue @@ -18,25 +18,15 @@ </template> <script setup lang="ts"> -import { TransferKey } from "element-plus"; -import { PropType } from "vue"; +import { propTypes } from '@/utils/propTypes'; const props = defineProps({ - showSearch: { - type: Boolean, - default: true, - }, + showSearch: propTypes.bool.def(true), columns: { type: Array as PropType<FieldOption[]>, }, - search: { - type: Boolean, - default: true, - }, - gutter: { - type: Number, - default: 10, - }, + search: propTypes.bool.def(true), + gutter: propTypes.number.def(10), }) const emits = defineEmits(['update:showSearch', 'queryTable']); diff --git a/src/components/SvgIcon/index.vue b/src/components/SvgIcon/index.vue index f3562d7..3a7540f 100644 --- a/src/components/SvgIcon/index.vue +++ b/src/components/SvgIcon/index.vue @@ -5,19 +5,12 @@ </template> <script setup lang="ts"> +import { propTypes } from '@/utils/propTypes'; + const props = defineProps({ - iconClass: { - type: String, - required: true - }, - className: { - type: String, - default: '' - }, - color: { - type: String, - default: '' - }, + iconClass: propTypes.string.isRequired, + className: propTypes.string.def(''), + color: propTypes.string.def(''), }) const iconName = computed(() => `#icon-${props.iconClass}`); const svgClass = computed(() => { diff --git a/src/components/TreeSelect/index.vue b/src/components/TreeSelect/index.vue index 8f80377..3076804 100644 --- a/src/components/TreeSelect/index.vue +++ b/src/components/TreeSelect/index.vue @@ -29,94 +29,93 @@ </template> <script setup lang="ts"> -import { ElTreeSelect } from 'element-plus' const props = defineProps({ /* 閰嶇疆椤� */ objMap: { - type: Object, - default: () => { - return { - value: 'id', // ID瀛楁鍚� - label: 'label', // 鏄剧ず鍚嶇О - children: 'children' // 瀛愮骇瀛楁鍚� + type: Object, + default: () => { + return { + value: 'id', // ID瀛楁鍚� + label: 'label', // 鏄剧ず鍚嶇О + children: 'children' // 瀛愮骇瀛楁鍚� + } } - } }, /* 鑷姩鏀惰捣 */ accordion: { - type: Boolean, - default: () => { - return false - } + type: Boolean, + default: () => { + return false + } }, /**褰撳墠鍙屽悜鏁版嵁缁戝畾鐨勫�� */ value: { - type: [String, Number], - default: '' + type: [String, Number], + default: '' }, /**褰撳墠鐨勬暟鎹� */ options: { - type: Array, - default: () => [] + type: Array, + default: () => [] }, /**杈撳叆妗嗗唴閮ㄧ殑鏂囧瓧 */ placeholder: { - type: String, - default: '' + type: String, + default: '' } }) -const selectTree = ref(ElTreeSelect); +const selectTree = ref<ElTreeSelectInstance>(); const emit = defineEmits(['update:value']); const valueId = computed({ get: () => props.value, set: (val) => { - emit('update:value', val) + emit('update:value', val) } }); const valueTitle = ref(''); const defaultExpandedKey = ref<any[]>([]); -function initHandle() { +const initHandle = () => { nextTick(() => { - const selectedValue = valueId.value; - 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] // 璁剧疆榛樿灞曞紑 + const selectedValue = valueId.value; + 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] // 璁剧疆榛樿灞曞紑 + } + } else { + clearHandle() } - } else { - clearHandle() - } }) } -function handleNodeClick(node: any) { +const handleNodeClick = (node: any) => { valueTitle.value = node[props.objMap.label] valueId.value = node[props.objMap.value]; defaultExpandedKey.value = []; - selectTree.value.blur() + selectTree.value?.blur() selectFilterData('') } -function selectFilterData(val: any) { - selectTree.value.filter(val) +const selectFilterData = (val: any) => { + selectTree.value?.filter(val) } -function filterNode(value: any, data: any) { +const filterNode = (value: any, data: any) => { if (!value) return true return data[props.objMap['label']].indexOf(value) !== -1 } -function clearHandle() { +const clearHandle = () => { valueTitle.value = '' valueId.value = '' defaultExpandedKey.value = []; clearSelected() } -function clearSelected() { +const clearSelected = () => { const allNode = document.querySelectorAll('#tree-option .el-tree-node') allNode.forEach((element) => element.classList.remove('is-current')) } @@ -132,6 +131,7 @@ <style lang="scss" scoped> @import "@/assets/styles/variables.module.scss"; + .el-scrollbar .el-scrollbar__view .el-select-dropdown__item { padding: 0; background-color: #fff; diff --git a/src/components/iFrame/index.vue b/src/components/iFrame/index.vue index 3d1cc7b..6679f08 100644 --- a/src/components/iFrame/index.vue +++ b/src/components/iFrame/index.vue @@ -5,11 +5,10 @@ </template> <script setup lang="ts"> +import { propTypes } from '@/utils/propTypes'; + const props = defineProps({ - src: { - type: String, - required: true - } + src: propTypes.string.isRequired }) const height = ref(document.documentElement.clientHeight - 94.5 + "px;") diff --git a/src/layout/components/IframeToggle/index.vue b/src/layout/components/IframeToggle/index.vue index 1a24ba6..9ffae00 100644 --- a/src/layout/components/IframeToggle/index.vue +++ b/src/layout/components/IframeToggle/index.vue @@ -16,4 +16,4 @@ const route = useRoute(); const tagsViewStore = useTagsViewStore() -</script> \ No newline at end of file +</script> diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 156011f..d001ea8 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -20,8 +20,13 @@ <template #prefix><svg-icon icon-class="company" class="el-input__icon input-icon" /></template> </el-select> - <header-search id="header-search" class="right-menu-item" /> - + <!-- <header-search id="header-search" class="right-menu-item" /> --> + <search-menu ref="searchMenuRef" /> + <el-tooltip content="鎼滅储" effect="dark" placement="bottom"> + <div class="right-menu-item hover-effect" @click="openSearchMenu"> + <svg-icon class-name="search-icon" icon-class="search" /> + </div> + </el-tooltip> <el-tooltip content="Github" effect="dark" placement="bottom"> <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" /> </el-tooltip> @@ -68,17 +73,18 @@ </template> <script setup lang="ts"> -import useAppStore from '@/store/modules/app' -import useUserStore from '@/store/modules/user' -import useSettingsStore from '@/store/modules/settings' +import SearchMenu from './topBar/search.vue'; +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"; -const appStore = useAppStore() -const userStore = useUserStore() -const settingsStore = useSettingsStore() +const appStore = useAppStore(); +const userStore = useUserStore(); +const settingsStore = useSettingsStore(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -89,46 +95,52 @@ const dynamic = ref(false); // 绉熸埛寮�鍏� const tenantEnabled = ref(true); +// 鎼滅储鑿滃崟 +const searchMenuRef = ref<InstanceType<typeof SearchMenu>>(); + +const openSearchMenu = () => { + searchMenuRef.value?.openSearch(); +} // 鍔ㄦ�佸垏鎹� const dynamicTenantEvent = async (tenantId: string) => { - if (companyName.value != null && companyName.value !== '') { - await dynamicTenant(tenantId); - dynamic.value = true; - proxy?.$tab.closeAllPage(); - proxy?.$router.push('/'); - } + if (companyName.value != null && companyName.value !== '') { + await dynamicTenant(tenantId); + dynamic.value = true; + proxy?.$tab.closeAllPage(); + proxy?.$router.push('/'); + } } const dynamicClearEvent = async () => { - await dynamicClear(); - dynamic.value = false; - proxy?.$tab.closeAllPage(); - proxy?.$router.push('/') + await dynamicClear(); + dynamic.value = false; + proxy?.$tab.closeAllPage(); + proxy?.$router.push('/'); } /** 绉熸埛鍒楄〃 */ const initTenantList = async () => { - const { data } = await getTenantList(); - tenantEnabled.value = data.tenantEnabled === undefined ? true : data.tenantEnabled; - if (tenantEnabled.value) { - tenantList.value = data.voList; - } + const { data } = await getTenantList(); + tenantEnabled.value = data.tenantEnabled === undefined ? true : data.tenantEnabled; + if (tenantEnabled.value) { + tenantList.value = data.voList; + } } defineExpose({ - initTenantList, + initTenantList, }) const toggleSideBar = () => { - appStore.toggleSideBar(false) + appStore.toggleSideBar(false); } const logout = async () => { await ElMessageBox.confirm('纭畾娉ㄩ攢骞堕��鍑虹郴缁熷悧锛�', '鎻愮ず', { - confirmButtonText: '纭畾', - cancelButtonText: '鍙栨秷', - type: 'warning' + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' }) await userStore.logout() location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index'; @@ -169,7 +181,7 @@ height: 50px; overflow: hidden; position: relative; - background: #fff; + //background: #fff; box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08); .hamburger-container { diff --git a/src/layout/components/Settings/index.vue b/src/layout/components/Settings/index.vue index bf62b14..8eb7921 100644 --- a/src/layout/components/Settings/index.vue +++ b/src/layout/components/Settings/index.vue @@ -1,8 +1,7 @@ <template> <el-drawer v-model="showSettings" :withHeader="false" direction="rtl" size="300px" close-on-click-modal> - <div class="setting-drawer-title"> - <h3 class="drawer-title">涓婚椋庢牸璁剧疆</h3> - </div> + <h3 class="drawer-title">涓婚椋庢牸璁剧疆</h3> + <div class="setting-drawer-block-checbox"> <div class="setting-drawer-block-checbox-item" @click="handleTheme('theme-dark')"> <img src="@/assets/images/dark.svg" alt="dark" /> @@ -35,6 +34,13 @@ <el-color-picker v-model="theme" :predefine="predefineColors" @change="themeChange" /> </span> </div> + <div class="drawer-item"> + <span>娣辫壊妯″紡</span> + <span class="comp-style"> + <el-switch v-model="isDark" @change="toggleDark" class="drawer-switch" /> + </span> + </div> + <el-divider /> <h3 class="drawer-title">绯荤粺甯冨眬閰嶇疆</h3> @@ -102,7 +108,15 @@ const storeSettings = computed(() => settingsStore); const predefineColors = ref(["#409EFF", "#ff4500", "#ff8c00", "#ffd700", "#90ee90", "#00ced1", "#1e90ff", "#c71585"]); -/** 鏄惁闇�瑕乼opnav */ +// 鏄惁鏆楅粦妯″紡 +const isDark = useDark({ + storageKey: 'useDarkKey', + valueDark: 'dark', + valueLight: 'light', +}); +const toggleDark = () => useToggle(isDark); + +/** 鏄惁闇�瑕乼opNav */ const topNav = computed({ get: () => storeSettings.value.topNav, set: (val) => { @@ -234,7 +248,6 @@ } .drawer-item { - color: rgba(0, 0, 0, 0.65); padding: 12px 0; font-size: 14px; diff --git a/src/layout/components/TagsView/ScrollPane.vue b/src/layout/components/TagsView/ScrollPane.vue index e4624dc..b50c628 100644 --- a/src/layout/components/TagsView/ScrollPane.vue +++ b/src/layout/components/TagsView/ScrollPane.vue @@ -6,22 +6,21 @@ <script setup lang="ts"> import useTagsViewStore from '@/store/modules/tagsView' -import { ElScrollbar } from 'element-plus'; import { TagView } from 'vue-router' const tagAndTagSpacing = ref(4); -const scrollContainerRef = ref(ElScrollbar) -const scrollWrapper = computed(() => scrollContainerRef.value.$refs.wrapRef); +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 eventDelta = (e as any).wheelDelta || - e.deltaY * 40 const $scrollWrapper = scrollWrapper.value; $scrollWrapper.scrollLeft = $scrollWrapper.scrollLeft + eventDelta / 4 } @@ -34,7 +33,7 @@ const visitedViews = computed(() => tagsViewStore.visitedViews); const moveToTarget = (currentTag: TagView) => { - const $container = scrollContainerRef.value.$el + const $container = scrollContainerRef.value?.$el const $containerWidth = $container.offsetWidth const $scrollWrapper = scrollWrapper.value; diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue index cbf0a84..8998ca1 100644 --- a/src/layout/components/TagsView/index.vue +++ b/src/layout/components/TagsView/index.vue @@ -125,6 +125,9 @@ } const addTags = () => { const { name } = route; + if(route.query.title) { + route.meta.title = route.query.title; + } if (name) { useTagsViewStore().addView(route); if (route.meta.link) { @@ -237,8 +240,8 @@ .tags-view-container { height: 34px; width: 100%; - background: #fff; - border-bottom: 1px solid #d8dce5; + 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); .tags-view-wrapper { .tags-view-item { @@ -247,13 +250,16 @@ cursor: pointer; height: 26px; line-height: 23px; - border: 1px solid #d8dce5; + background-color: var(--el-bg-color); + border: 1px solid var(--el-border-color-light); color: #495060; - background: #fff; padding: 0 8px; font-size: 12px; margin-left: 5px; margin-top: 4px; + &:hover { + color: var(--el-color-primary); + } &:first-of-type { margin-left: 15px; } @@ -279,7 +285,7 @@ } .contextmenu { margin: 0; - background: #fff; + background: var(--el-bg-color); z-index: 3000; position: absolute; list-style-type: none; @@ -287,7 +293,6 @@ border-radius: 4px; font-size: 12px; font-weight: 400; - color: #333; box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.3); li { margin: 0; diff --git a/src/layout/components/topBar/search.vue b/src/layout/components/topBar/search.vue new file mode 100644 index 0000000..9dee360 --- /dev/null +++ b/src/layout/components/topBar/search.vue @@ -0,0 +1,158 @@ +<template> + <div class="layout-search-dialog"> + <el-dialog v-model="state.isShowSearch" destroy-on-close :show-close="false"> + <template #footer> + <el-autocomplete + v-model="state.menuQuery" + :fetch-suggestions="menuSearch" + placeholder="鎼滅储" + ref="layoutMenuAutocompleteRef" + @select="onHandleSelect" + :fit-input-width="true" + > + <template #prefix> + <svg-icon class-name="search-icon" icon-class="search" /> + </template> + <template #default="{ item }"> + <div> + <svg-icon :icon-class="item.icon" class="mr5" /> + {{ item.title }} + </div> + </template> + </el-autocomplete> + </template> + </el-dialog> + </div> +</template> + +<script setup lang="ts" name="layoutBreadcrumbSearch"> +import { getNormalPath } from '@/utils/ruoyi'; +import { isHttp } from '@/utils/validate'; +import usePermissionStore from '@/store/modules/permission'; +import { RouteOption } from 'vue-router'; +type Router = Array<{ + path: string; + icon: string; + title: string[]; +}> +type SearchState<T = any> = { + 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: [], +}); + +// 鎼滅储寮圭獥鎵撳紑 +const openSearch = () => { + state.menuQuery = ''; + state.isShowSearch = true; + state.menuList = generateRoutes(routes.value); + nextTick(() => { + setTimeout(() => { + layoutMenuAutocompleteRef.value.focus(); + }); + }); +}; +// 鎼滅储寮圭獥鍏抽棴 +const closeSearch = () => { + state.isShowSearch = false; +}; +// 鑿滃崟鎼滅储鏁版嵁杩囨护 +const menuSearch = (queryString: string, cb: Function) => { + 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 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(); + +}; + +// 鏆撮湶鍙橀噺 +defineExpose({ + 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%); + } +} +</style> diff --git a/src/plugins/modal.ts b/src/plugins/modal.ts index 9526623..a8b0548 100644 --- a/src/plugins/modal.ts +++ b/src/plugins/modal.ts @@ -1,57 +1,57 @@ -import { ElMessage, ElMessageBox, ElNotification, ElLoading, MessageBoxData } from 'element-plus'; +import { MessageBoxData } from 'element-plus'; import { LoadingInstance } from 'element-plus/es/components/loading/src/loading'; let loadingInstance: LoadingInstance; export default { // 娑堟伅鎻愮ず - msg(content: string) { + msg(content: any) { ElMessage.info(content); }, // 閿欒娑堟伅 - msgError(content: string) { + msgError(content: any) { ElMessage.error(content); }, // 鎴愬姛娑堟伅 - msgSuccess(content: string) { + msgSuccess(content: any) { ElMessage.success(content); }, // 璀﹀憡娑堟伅 - msgWarning(content: string) { + msgWarning(content: any) { ElMessage.warning(content); }, // 寮瑰嚭鎻愮ず - alert(content: string) { + alert(content: any) { ElMessageBox.alert(content, '绯荤粺鎻愮ず'); }, // 閿欒鎻愮ず - alertError(content: string) { + alertError(content: any) { ElMessageBox.alert(content, '绯荤粺鎻愮ず', { type: 'error' }); }, // 鎴愬姛鎻愮ず - alertSuccess(content: string, s: string, p: { dangerouslyUseHTMLString: boolean }) { + alertSuccess(content: any) { ElMessageBox.alert(content, '绯荤粺鎻愮ず', { type: 'success' }); }, // 璀﹀憡鎻愮ず - alertWarning(content: string) { + alertWarning(content: any) { ElMessageBox.alert(content, '绯荤粺鎻愮ず', { type: 'warning' }); }, // 閫氱煡鎻愮ず - notify(content: string) { + notify(content: any) { ElNotification.info(content); }, // 閿欒閫氱煡 - notifyError(content: string) { + notifyError(content: any) { ElNotification.error(content); }, // 鎴愬姛閫氱煡 - notifySuccess(content: string) { + notifySuccess(content: any) { ElNotification.success(content); }, // 璀﹀憡閫氱煡 - notifyWarning(content: string) { + notifyWarning(content: any) { ElNotification.warning(content); }, // 纭绐椾綋 - confirm(content: string): Promise<MessageBoxData> { + confirm(content: any): Promise<MessageBoxData> { return ElMessageBox.confirm(content, '绯荤粺鎻愮ず', { confirmButtonText: '纭畾', cancelButtonText: '鍙栨秷', @@ -59,7 +59,7 @@ }); }, // 鎻愪氦鍐呭 - prompt(content: string) { + prompt(content: any) { return ElMessageBox.prompt(content, '绯荤粺鎻愮ず', { confirmButtonText: '纭畾', cancelButtonText: '鍙栨秷', diff --git a/src/plugins/tab.ts b/src/plugins/tab.ts index a310154..97442ff 100644 --- a/src/plugins/tab.ts +++ b/src/plugins/tab.ts @@ -3,8 +3,11 @@ import { TagView, RouteLocationRaw } from 'vue-router'; export default { - // 鍒锋柊褰撳墠tab椤电 - async refreshPage(obj: TagView): Promise<void> { + /** + * 鍒锋柊褰撳墠tab椤电 + * @param obj 鏍囩瀵硅薄 + */ + async refreshPage(obj?: TagView): Promise<void> { const { path, query, matched } = router.currentRoute.value; if (obj === undefined) { matched.forEach((m) => { @@ -15,11 +18,16 @@ } }); } - // prettier-ignore - await useTagsViewStore().delCachedView(obj) - router.replace({ - path: '/redirect' + obj.path, - query: obj.query + let query1: undefined | {} = {}; + let path1: undefined | string = ''; + if (obj) { + query1 = obj.query; + path1 = obj.path; + } + await useTagsViewStore().delCachedView(obj); + await router.replace({ + path: '/redirect' + path1, + query: query1 }); }, // 鍏抽棴褰撳墠tab椤电锛屾墦寮�鏂伴〉绛� @@ -34,9 +42,9 @@ if (obj === undefined) { // prettier-ignore const { visitedViews } = await useTagsViewStore().delView(router.currentRoute.value) as any - const latestView = visitedViews.slice(-1)[0] + const latestView = visitedViews.slice(-1)[0]; if (latestView) { - return router.push(latestView.fullPath) + return router.push(latestView.fullPath); } return router.push('/'); } @@ -47,22 +55,31 @@ return useTagsViewStore().delAllViews(); }, // 鍏抽棴宸︿晶tab椤电 - closeLeftPage(obj: TagView) { + closeLeftPage(obj?: TagView) { return useTagsViewStore().delLeftTags(obj || router.currentRoute.value); }, // 鍏抽棴鍙充晶tab椤电 - closeRightPage(obj: TagView) { + closeRightPage(obj?: TagView) { return useTagsViewStore().delRightTags(obj || router.currentRoute.value); }, // 鍏抽棴鍏朵粬tab椤电 - closeOtherPage(obj: TagView) { + closeOtherPage(obj?: TagView) { return useTagsViewStore().delOthersViews(obj || router.currentRoute.value); }, - // 鎵撳紑tab椤电 - openPage(url: RouteLocationRaw) { - return router.push(url); + /** + * 鎵撳紑tab椤电 + * @param url 璺敱鍦板潃 + * @param title 鏍囬 + * @param query 鍙傛暟 + */ + openPage(url: string, title?: string, query?: any) { + const obj = { path: url, query: { ...query, title } }; + return router.push(obj); }, - // 淇敼tab椤电 + /** + * 淇敼tab椤电 + * @param obj 鏍囩瀵硅薄 + */ updatePage(obj: TagView) { return useTagsViewStore().updateVisitedView(obj); } diff --git a/src/store/modules/tagsView.ts b/src/store/modules/tagsView.ts index af980ef..cd065d1 100644 --- a/src/store/modules/tagsView.ts +++ b/src/store/modules/tagsView.ts @@ -54,8 +54,11 @@ resolve([...visitedViews.value]); }); }; - const delCachedView = (view: TagView): Promise<string[]> => { - const viewName = view.name as string; + const delCachedView = (view?: TagView): Promise<string[]> => { + let viewName = ''; + if (view) { + viewName = view.name as string; + } return new Promise((resolve) => { const index = cachedViews.value.indexOf(viewName); index > -1 && cachedViews.value.splice(index, 1); @@ -167,6 +170,7 @@ const addCachedView = (view: TagView): void => { const viewName = view.name as string; + if (!viewName) return; if (cachedViews.value.includes(viewName)) return; if (!view.meta?.noCache) { cachedViews.value.push(viewName); diff --git a/src/types/element.d.ts b/src/types/element.d.ts index 8632484..e8d1f62 100644 --- a/src/types/element.d.ts +++ b/src/types/element.d.ts @@ -1 +1,35 @@ -declare type ElTagType = '' | 'success' | 'warning' | 'info' | 'danger' | 'default' | 'primary'; +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 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>; + declare type ElInputNumberInstance = InstanceType<typeof ep.ElInputNumber>; + declare type ElRadioInstance = InstanceType<typeof ep.ElRadio>; + declare type ElRadioGroupInstance = InstanceType<typeof ep.ElRadioGroup>; + declare type ElRadioButtonInstance = InstanceType<typeof ep.ElRadioButton>; + declare type ElCheckboxInstance = InstanceType<typeof ep.ElCheckbox>; + declare type ElCheckboxGroupInstance = InstanceType<typeof ep.ElCheckboxGroup>; + declare type ElSwitchInstance = InstanceType<typeof ep.ElSwitch>; + declare type ElDatePickerInstance = InstanceType<typeof ep.ElDatePicker>; + declare type ElTimePickerInstance = InstanceType<typeof ep.ElTimePicker>; + declare type ElTimeSelectInstance = InstanceType<typeof ep.ElTimeSelect>; + declare type ElCascaderInstance = InstanceType<typeof ep.ElCascader>; + declare type ElColorPickerInstance = InstanceType<typeof ep.ElColorPicker>; + declare type ElRateInstance = InstanceType<typeof ep.ElRate>; + declare type ElSliderInstance = InstanceType<typeof ep.ElSlider>; + declare type ElUploadInstance = InstanceType<typeof ep.ElUpload>; + declare type ElScrollbarInstance = InstanceType<typeof ep.ElScrollbar>; + + declare type TransferKey = ep.TransferKey; + declare type CheckboxValueType = ep.CheckboxValueType; + declare type ElFormRules = ep.FormRules; + declare type DateModelType = ep.DateModelType; + declare type UploadFile = typeof ep.UploadFile; +} diff --git a/src/types/global.d.ts b/src/types/global.d.ts index 5a972a3..b9bc5f4 100644 --- a/src/types/global.d.ts +++ b/src/types/global.d.ts @@ -1,9 +1,15 @@ -import { FormRules } from 'element-plus'; +import type { ComponentInternalInstance as ComponentInstance, PropType as VuePropType } from 'vue'; + declare global { + /** vue Instance */ + declare type ComponentInternalInstance = ComponentInstance; + /**vue */ + declare type PropType<T> = VuePropType<T>; + /** * 鐣岄潰瀛楁闅愯棌灞炴�� */ - interface FieldOption { + declare interface FieldOption { key: number; label: string; visible: boolean; @@ -12,7 +18,7 @@ /** * 寮圭獥灞炴�� */ - interface DialogOption { + declare interface DialogOption { /** * 寮圭獥鏍囬 */ @@ -23,7 +29,7 @@ visible: boolean; } - interface UploadOption { + declare interface UploadOption { /** 璁剧疆涓婁紶鐨勮姹傚ご閮� */ headers: { [key: string]: any }; @@ -34,7 +40,7 @@ /** * 瀵煎叆灞炴�� */ - interface ImportOption extends UploadOption { + declare interface ImportOption extends UploadOption { /** 鏄惁鏄剧ず寮瑰嚭灞� */ open: boolean; /** 寮瑰嚭灞傛爣棰� */ @@ -48,14 +54,14 @@ /** * 瀛楀吀鏁版嵁 鏁版嵁閰嶇疆 */ - interface DictDataOption { + declare interface DictDataOption { label: string; value: string; elTagType?: ElTagType; elTagClass?: string; } - interface BaseEntity { + declare interface BaseEntity { createBy?: any; createDept?: any; createTime?: string; @@ -68,15 +74,15 @@ * T : 琛ㄥ崟鏁版嵁 * D : 鏌ヨ鍙傛暟 */ - interface PageData<T, D> { + declare interface PageData<T, D> { form: T; queryParams: D; - rules: FormRules; + rules: ElFormRules; } /** * 鍒嗛〉鏌ヨ鍙傛暟 */ - interface PageQuery { + declare interface PageQuery { pageNum: number; pageSize: number; } diff --git a/src/types/module.d.ts b/src/types/module.d.ts index b99bc44..987c349 100644 --- a/src/types/module.d.ts +++ b/src/types/module.d.ts @@ -1,23 +1,27 @@ -import modal from '@/plugins/modal'; -import tab from '@/plugins/tab'; -import { useDict } from '@/utils/dict'; -import { addDateRange, handleTree, selectDictLabel, selectDictLabels, parseTime } from '@/utils/ruoyi'; -import { getConfigKey, updateConfigByKey } from '@/api/system/config'; -import { download as download1 } from '@/utils/request'; -import download from '@/plugins/download'; -import animate from '@/animate'; +import type modal from '@/plugins/modal'; +import type tab from '@/plugins/tab'; +import type download from '@/plugins/download'; +import type auth from '@/plugins/auth'; +import type cache from '@/plugins/cache'; +import type animate from '@/animate'; +import type { useDict } from '@/utils/dict'; +import type { addDateRange, handleTree, selectDictLabel, selectDictLabels, parseTime } from '@/utils/ruoyi'; +import type { getConfigKey, updateConfigByKey } from '@/api/system/config'; +import type { download as rd } from '@/utils/request'; -declare module 'vue' { - export interface ComponentCustomProperties { +declare module '@vue/runtime-core' { + interface ComponentCustomProperties { // 鍏ㄥ眬鏂规硶澹版槑 $modal: typeof modal; $tab: typeof tab; $download: typeof download; + $auth: typeof auth; + $cache: typeof cache; animate: typeof animate; useDict: typeof useDict; addDateRange: typeof addDateRange; - download: typeof download1; + download: typeof rd; handleTree: typeof handleTree; getConfigKey: typeof getConfigKey; updateConfigByKey: typeof updateConfigByKey; diff --git a/src/types/router.d.ts b/src/types/router.d.ts index b60b831..9731fa2 100644 --- a/src/types/router.d.ts +++ b/src/types/router.d.ts @@ -1,7 +1,7 @@ import { RouteRecordRaw } from 'vue-router'; declare module 'vue-router' { - type RouteOption = { + declare type RouteOption = { hidden?: boolean; permissions?: string[]; roles?: string[]; @@ -16,15 +16,15 @@ query?: string; } & RouteRecordRaw; - interface _RouteLocationBase { + declare interface _RouteLocationBase { children?: RouteOption[]; } - interface RouteLocationOptions { + declare interface RouteLocationOptions { fullPath?: string; } - interface TagView extends Partial<_RouteLocationBase> { + declare interface TagView extends Partial<_RouteLocationBase> { title?: string; meta?: { link?: string; diff --git a/src/types/vform3-builds.d.ts b/src/types/vform3-builds.d.ts new file mode 100644 index 0000000..82573de --- /dev/null +++ b/src/types/vform3-builds.d.ts @@ -0,0 +1,4 @@ +declare module 'vform3-builds' { + const content: any; + export = content; +} diff --git a/src/utils/propTypes.ts b/src/utils/propTypes.ts new file mode 100644 index 0000000..4d69bb6 --- /dev/null +++ b/src/utils/propTypes.ts @@ -0,0 +1,25 @@ +import { CSSProperties } from 'vue'; +import { createTypes, VueTypeValidableDef, VueTypesInterface } from 'vue-types'; + +type PropTypes = VueTypesInterface & { + readonly style: VueTypeValidableDef<CSSProperties>; +}; + +const propTypes = createTypes({ + func: undefined, + bool: undefined, + string: undefined, + number: undefined, + object: undefined, + integer: undefined +}) as PropTypes; + +propTypes.extend([ + { + name: 'style', + getter: true, + type: [String, Object], + default: undefined + } +]); +export { propTypes }; diff --git a/src/views/demo/demo/index.vue b/src/views/demo/demo/index.vue index 2786a51..54f7c86 100644 --- a/src/views/demo/demo/index.vue +++ b/src/views/demo/demo/index.vue @@ -1,32 +1,34 @@ <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="68px"> - <el-form-item label="閮ㄩ棬id" prop="deptId"> - <el-input v-model="queryParams.deptId" placeholder="璇疯緭鍏ラ儴闂╥d" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鐢ㄦ埛id" prop="userId"> - <el-input v-model="queryParams.userId" placeholder="璇疯緭鍏ョ敤鎴穒d" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鎺掑簭鍙�" prop="orderNum"> - <el-input v-model="queryParams.orderNum" placeholder="璇疯緭鍏ユ帓搴忓彿" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="key閿�" prop="testKey"> - <el-input v-model="queryParams.testKey" placeholder="璇疯緭鍏ey閿�" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鍊�" prop="value"> - <el-input v-model="queryParams.value" placeholder="璇疯緭鍏ュ��" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form-item label="閮ㄩ棬id" prop="deptId"> + <el-input v-model="queryParams.deptId" placeholder="璇疯緭鍏ラ儴闂╥d" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鐢ㄦ埛id" prop="userId"> + <el-input v-model="queryParams.userId" placeholder="璇疯緭鍏ョ敤鎴穒d" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鎺掑簭鍙�" prop="orderNum"> + <el-input v-model="queryParams.orderNum" placeholder="璇疯緭鍏ユ帓搴忓彿" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="key閿�" prop="testKey"> + <el-input v-model="queryParams.testKey" placeholder="璇疯緭鍏ey閿�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鍊�" prop="value"> + <el-input v-model="queryParams.value" placeholder="璇疯緭鍏ュ��" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -36,7 +38,9 @@ <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['demo:demo:edit']">淇敼</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> + <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['demo:demo:remove']" + >鍒犻櫎</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> @@ -65,13 +69,7 @@ </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" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀规祴璇曞崟瀵硅瘽妗� --> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> @@ -105,8 +103,6 @@ <script setup name="Demo" lang="ts"> import { listDemo, getDemo, delDemo, addDemo, updateDemo } from '@/api/demo/demo'; import { DemoVO, DemoQuery, DemoForm } from '@/api/demo/demo/types'; -import { ComponentInternalInstance } from 'vue'; -import { ElForm } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -119,8 +115,8 @@ const multiple = ref(true); const total = ref(0); -const queryFormRef = ref(ElForm); -const demoFormRef = ref(ElForm); +const queryFormRef = ref<ElFormInstance>(); +const demoFormRef = ref<ElFormInstance>(); const dialog = reactive<DialogOption>({ visible: false, @@ -136,7 +132,7 @@ value: undefined, } const data = reactive<PageData<DemoForm, DemoQuery>>({ - form: {...initFormData}, + form: { ...initFormData }, queryParams: { pageNum: 1, pageSize: 10, @@ -187,8 +183,8 @@ /** 琛ㄥ崟閲嶇疆 */ const reset = () => { - form.value = {...initFormData}; - demoFormRef.value.resetFields(); + form.value = { ...initFormData }; + demoFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ @@ -199,7 +195,7 @@ /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); + queryFormRef.value?.resetFields(); handleQuery(); } @@ -235,13 +231,13 @@ /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - demoFormRef.value.validate(async (valid: boolean) => { + demoFormRef.value?.validate(async (valid: boolean) => { 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("淇敼鎴愬姛"); dialog.visible = false; diff --git a/src/views/demo/tree/index.vue b/src/views/demo/tree/index.vue index ae1d8c2..f6ec15c 100644 --- a/src/views/demo/tree/index.vue +++ b/src/views/demo/tree/index.vue @@ -1,20 +1,22 @@ <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="68px"> - <el-form-item label="鏍戣妭鐐瑰悕" prop="treeName"> - <el-input v-model="queryParams.treeName" placeholder="璇疯緭鍏ユ爲鑺傜偣鍚�" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form-item label="鏍戣妭鐐瑰悕" prop="treeName"> + <el-input v-model="queryParams.treeName" placeholder="璇疯緭鍏ユ爲鑺傜偣鍚�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -89,8 +91,6 @@ <script setup name="Tree" lang="ts"> import { listTree, getTree, delTree, addTree, updateTree } from "@/api/demo/tree"; import { TreeVO, TreeQuery, TreeForm } from '@/api/demo/tree/types'; -import { ComponentInternalInstance } from 'vue'; -import { ElForm, ElTable } from 'element-plus'; type TreeOption = { @@ -109,9 +109,9 @@ const isExpandAll = ref(true); const loading = ref(false); -const queryFormRef = ref(ElForm); -const treeFormRef = ref(ElForm); -const treeTableRef = ref(ElTable) +const queryFormRef = ref<ElFormInstance>(); +const treeFormRef = ref<ElFormInstance>(); +const treeTableRef = ref<ElTableInstance>() const dialog = reactive<DialogOption>({ visible: false, @@ -185,7 +185,7 @@ // 琛ㄥ崟閲嶇疆 const reset = () => { form.value = {...initFormData} - treeFormRef.value.resetFields(); + treeFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ @@ -195,7 +195,7 @@ /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); + queryFormRef.value?.resetFields(); handleQuery(); } @@ -223,7 +223,7 @@ /** 灞曞紑/鎶樺彔鎿嶄綔 */ const toggleExpandAll = (data: TreeVO[], status: boolean) => { data.forEach((item) => { - treeTableRef.value.toggleRowExpansion(item, status) + treeTableRef.value?.toggleRowExpansion(item, status) if (item.children && item.children.length > 0) toggleExpandAll(item.children, status) }) } @@ -247,7 +247,7 @@ /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - treeFormRef.value.validate(async (valid: boolean) => { + treeFormRef.value?.validate(async (valid: boolean) => { if (valid) { buttonLoading.value = true; if (form.value.id) { @@ -257,7 +257,7 @@ } proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); dialog.visible = false; - getList(); + await getList(); } }); } diff --git a/src/views/error/401.vue b/src/views/error/401.vue index 63c03ba..1d9c76e 100644 --- a/src/views/error/401.vue +++ b/src/views/error/401.vue @@ -21,7 +21,6 @@ <script setup lang="ts"> import errImage from '@/assets/401_images/401.gif'; -import { ComponentInternalInstance } from "vue"; let { proxy } = getCurrentInstance() as ComponentInternalInstance; diff --git a/src/views/login.vue b/src/views/login.vue index 0ac655c..4c8715a 100644 --- a/src/views/login.vue +++ b/src/views/login.vue @@ -65,14 +65,14 @@ import { encrypt, decrypt } from '@/utils/jsencrypt'; import { useUserStore } from '@/store/modules/user'; import { LoginData, TenantVO } from '@/api/types'; -import { ElForm, FormRules } from 'element-plus'; import { to } from 'await-to-js'; +import { HttpStatus } from "@/enums/RespEnum"; const userStore = useUserStore(); const router = useRouter(); const loginForm = ref<LoginData>({ - tenantId: "000000", + tenantId: '000000', username: 'admin', password: 'admin123', rememberMe: false, @@ -80,7 +80,7 @@ uuid: '' }); -const loginRules: FormRules = { +const loginRules: ElFormRules = { tenantId: [{ required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勭鎴风紪鍙�" }], username: [{ required: true, trigger: 'blur', message: '璇疯緭鍏ユ偍鐨勮处鍙�' }], password: [{ required: true, trigger: 'blur', message: '璇疯緭鍏ユ偍鐨勫瘑鐮�' }], @@ -98,12 +98,12 @@ // 娉ㄥ唽寮�鍏� const register = ref(false); const redirect = ref(undefined); -const loginRef = ref(ElForm); +const loginRef = ref<ElFormInstance>(); // 绉熸埛鍒楄〃 const tenantList = ref<TenantVO[]>([]); const handleLogin = () => { - loginRef.value.validate(async (valid: boolean, fields: any) => { + loginRef.value?.validate(async (valid: boolean, fields: any) => { if (valid) { loading.value = true; // 鍕鹃�変簡闇�瑕佽浣忓瘑鐮佽缃湪 cookie 涓缃浣忕敤鎴峰悕鍜屽瘑鐮� @@ -120,7 +120,6 @@ Cookies.remove('rememberMe'); } // 璋冪敤action鐨勭櫥褰曟柟娉� - // prittier-ignore const [err] = await to(userStore.login(loginForm.value)); if (!err) { await router.push({ path: redirect.value || '/' }); @@ -189,7 +188,7 @@ */ const doSocialLogin = (type: string) => { authBinding(type).then((res: any) => { - if (res.code === 200) { + if (res.code === HttpStatus.SUCCESS) { // 鑾峰彇鎺堟潈鍦板潃璺宠浆 window.location.href = res.data; } else { diff --git a/src/views/monitor/cache/index.vue b/src/views/monitor/cache/index.vue index 5cc2be5..8719c94 100644 --- a/src/views/monitor/cache/index.vue +++ b/src/views/monitor/cache/index.vue @@ -2,7 +2,7 @@ <div class="p-2"> <el-row> <el-col :span="24" class="card-box"> - <el-card> + <el-card shadow="hover"> <template #header> <Monitor style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍩烘湰淇℃伅</span> @@ -98,7 +98,7 @@ </el-col> <el-col :span="12" class="card-box"> - <el-card> + <el-card shadow="hover"> <template #header> <PieChart style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍛戒护缁熻</span> @@ -110,7 +110,7 @@ </el-col> <el-col :span="12" class="card-box"> - <el-card> + <el-card shadow="hover"> <template #header> <Odometer style="width: 1em; height: 1em; vertical-align: middle;" /> <span style="vertical-align: middle;">鍐呭瓨淇℃伅</span> </template> @@ -126,7 +126,6 @@ <script setup name="Cache" lang="ts"> import { getCache } from '@/api/monitor/cache'; import * as echarts from 'echarts'; -import { ComponentInternalInstance } from "vue"; const cache = ref<any>({}); const commandstats = ref(); diff --git a/src/views/monitor/logininfor/index.vue b/src/views/monitor/logininfor/index.vue index 8279363..38ab1ad 100644 --- a/src/views/monitor/logininfor/index.vue +++ b/src/views/monitor/logininfor/index.vue @@ -1,39 +1,41 @@ <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="68px"> - <el-form-item label="鐧诲綍鍦板潃" prop="ipaddr"> - <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-form-item> - <el-form-item label="鐘舵��" prop="status"> - <el-select v-model="queryParams.status" placeholder="鐧诲綍鐘舵��" clearable style="width: 240px"> - <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" /> - </el-select> - </el-form-item> - <el-form-item label="鐧诲綍鏃堕棿" style="width: 308px"> - <el-date-picker - v-model="dateRange" - value-format="YYYY-MM-DD HH:mm:ss" - type="daterange" - range-separator="-" - start-placeholder="寮�濮嬫棩鏈�" - end-placeholder="缁撴潫鏃ユ湡" - :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" - ></el-date-picker> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :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-form-item> + <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName"> + <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"> + <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" /> + </el-select> + </el-form-item> + <el-form-item label="鐧诲綍鏃堕棿" style="width: 308px"> + <el-date-picker + v-model="dateRange" + value-format="YYYY-MM-DD HH:mm:ss" + type="daterange" + range-separator="-" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" + ></el-date-picker> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -98,9 +100,7 @@ <script setup name="Logininfor" lang="ts"> import { list, delLoginInfo, cleanLoginInfo, unlockLoginInfo } from "@/api/monitor/loginInfo"; -import { ComponentInternalInstance } from "vue"; import { LoginInfoQuery, LoginInfoVO } from "@/api/monitor/loginInfo/types"; -import { DateModelType } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { sys_common_status } = toRefs<any>(proxy?.useDict("sys_common_status")); @@ -116,8 +116,8 @@ const dateRange = ref<[DateModelType,DateModelType]>(['', '']); const defaultSort = ref<any>({ prop: "loginTime", order: "descending" }); -const queryFormRef = ref(ElForm); -const loginInfoTableRef = ref(ElTable); +const queryFormRef = ref<ElFormInstance>(); +const loginInfoTableRef = ref<ElTableInstance>(); // 鏌ヨ鍙傛暟 const queryParams = ref<LoginInfoQuery>({ pageNum: 1, @@ -145,9 +145,9 @@ /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { dateRange.value = ['', '']; - queryFormRef.value.resetFields(); + queryFormRef.value?.resetFields(); queryParams.value.pageNum = 1; - loginInfoTableRef.value.sort(defaultSort.value.prop, defaultSort.value.order); + loginInfoTableRef.value?.sort(defaultSort.value.prop, defaultSort.value.order); } /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: LoginInfoVO[]) => { @@ -167,14 +167,14 @@ const infoIds = row?.infoId || ids.value; await proxy?.$modal.confirm('鏄惁纭鍒犻櫎璁块棶缂栧彿涓�"' + infoIds + '"鐨勬暟鎹」?'); await delLoginInfo(infoIds); - getList(); + await getList(); proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); } /** 娓呯┖鎸夐挳鎿嶄綔 */ const handleClean = async () => { await proxy?.$modal.confirm("鏄惁纭娓呯┖鎵�鏈夌櫥褰曟棩蹇楁暟鎹」?"); await cleanLoginInfo(); - getList(); + await getList(); proxy?.$modal.msgSuccess("娓呯┖鎴愬姛"); } /** 瑙i攣鎸夐挳鎿嶄綔 */ diff --git a/src/views/monitor/online/index.vue b/src/views/monitor/online/index.vue index 2b56d34..6d7bf87 100644 --- a/src/views/monitor/online/index.vue +++ b/src/views/monitor/online/index.vue @@ -1,20 +1,22 @@ <template> <div class="p-2"> - <div class="search"> - <el-form :model="queryParams" ref="queryFormRef" :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> - <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName"> - <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :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> + <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName"> + <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" clearable style="width: 200px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item> + <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> </div> - <div class="panel"> + <el-card shadow="hover"> <el-table v-loading="loading" :data="onlineList.slice((queryParams.pageNum - 1) * queryParams.pageSize, queryParams.pageNum * queryParams.pageSize)" @@ -48,13 +50,12 @@ </el-table> <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" /> - </div> + </el-card> </div> </template> <script setup name="Online" lang="ts"> import { forceLogout, list as initData } from "@/api/monitor/online"; -import { ComponentInternalInstance } from "vue"; import { OnlineQuery, OnlineVO } from "@/api/monitor/online/types"; const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -63,42 +64,42 @@ const loading = ref(true); const total = ref(0); -const queryFormRef = ref(ElForm); +const queryFormRef = ref<ElFormInstance>(); const queryParams = ref<OnlineQuery>({ - pageNum: 1, - pageSize: 10, - ipaddr: '', - userName: '' + pageNum: 1, + pageSize: 10, + ipaddr: '', + userName: '' }); /** 鏌ヨ鐧诲綍鏃ュ織鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await initData(queryParams.value); - onlineList.value = res.rows; - total.value = res.total; - loading.value = false; + loading.value = true; + const res = await initData(queryParams.value); + onlineList.value = res.rows; + total.value = res.total; + loading.value = false; } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); + queryParams.value.pageNum = 1; + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); - handleQuery(); + queryFormRef.value?.resetFields(); + handleQuery(); } /** 寮洪��鎸夐挳鎿嶄綔 */ const handleForceLogout = async (row: OnlineVO) => { - await proxy?.$modal.confirm('鏄惁纭寮洪��鍚嶇О涓�"' + row.userName + '"鐨勭敤鎴�?'); - await forceLogout(row.tokenId); - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + await proxy?.$modal.confirm('鏄惁纭寮洪��鍚嶇О涓�"' + row.userName + '"鐨勭敤鎴�?'); + await forceLogout(row.tokenId); + getList(); + proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); } onMounted(() => { - getList(); + getList(); }) </script> diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue index 086a1aa..70a2bd7 100644 --- a/src/views/monitor/operlog/index.vue +++ b/src/views/monitor/operlog/index.vue @@ -1,44 +1,46 @@ <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="68px"> - <el-form-item label="绯荤粺妯″潡" prop="title"> - <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-form-item> - <el-form-item label="绫诲瀷" prop="businessType"> - <el-select v-model="queryParams.businessType" placeholder="鎿嶄綔绫诲瀷" clearable style="width: 240px"> - <el-option v-for="dict in sys_oper_type" :key="dict.value" :label="dict.label" :value="dict.value" /> - </el-select> - </el-form-item> - <el-form-item label="鐘舵��" prop="status"> - <el-select v-model="queryParams.status" placeholder="鎿嶄綔鐘舵��" clearable style="width: 240px"> - <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" /> - </el-select> - </el-form-item> - <el-form-item label="鎿嶄綔鏃堕棿" style="width: 308px"> - <el-date-picker - v-model="dateRange" - value-format="YYYY-MM-DD HH:mm:ss" - type="daterange" - range-separator="-" - start-placeholder="寮�濮嬫棩鏈�" - end-placeholder="缁撴潫鏃ユ湡" - :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" - ></el-date-picker> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form-item label="绯荤粺妯″潡" prop="title"> + <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-form-item> + <el-form-item label="绫诲瀷" prop="businessType"> + <el-select v-model="queryParams.businessType" placeholder="鎿嶄綔绫诲瀷" clearable style="width: 240px"> + <el-option v-for="dict in sys_oper_type" :key="dict.value" :label="dict.label" :value="dict.value" /> + </el-select> + </el-form-item> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="queryParams.status" placeholder="鎿嶄綔鐘舵��" clearable style="width: 240px"> + <el-option v-for="dict in sys_common_status" :key="dict.value" :label="dict.label" :value="dict.value" /> + </el-select> + </el-form-item> + <el-form-item label="鎿嶄綔鏃堕棿" style="width: 308px"> + <el-date-picker + v-model="dateRange" + value-format="YYYY-MM-DD HH:mm:ss" + type="daterange" + range-separator="-" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" + ></el-date-picker> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -132,7 +134,7 @@ <el-form-item label="鎿嶄綔鏂规硶锛�">{{ form.method }}</el-form-item> </el-col> <el-col :span="24"> - <el-form-item label="璇锋眰鍙傛暟锛�">{{form.operParam}}</el-form-item> + <el-form-item label="璇锋眰鍙傛暟锛�">{{ form.operParam }}</el-form-item> </el-col> <el-col :span="24"> <el-form-item label="杩斿洖鍙傛暟锛�">{{ form.jsonResult }}</el-form-item> @@ -165,12 +167,10 @@ <script setup name="Operlog" lang="ts"> import { list, delOperlog, cleanOperlog } from '@/api/monitor/operlog'; -import { ComponentInternalInstance } from 'vue'; import { OperLogForm, OperLogQuery, OperLogVO } from '@/api/monitor/operlog/types'; -import { DateModelType } from 'element-plus'; 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); @@ -181,116 +181,116 @@ const dateRange = ref<[DateModelType, DateModelType]>(['', '']); const defaultSort = ref<any>({ prop: "operTime", order: "descending" }); -const operLogTableRef = ref(ElTable); -const queryFormRef = ref(ElForm); +const operLogTableRef = ref<ElTableInstance>(); +const queryFormRef = ref<ElFormInstance>(); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); const data = reactive<PageData<OperLogForm, OperLogQuery>>({ - form: { - operId: undefined, - tenantId: undefined, - title: '', - businessType: 0, - businessTypes: undefined, - method: '', - requestMethod: '', - operatorType: 0, - operName: '', - deptName: '', - operUrl: '', - operIp: '', - operLocation: '', - operParam: '', - jsonResult: '', - status: 0, - errorMsg: '', - operTime: '', - costTime: 0 - }, - queryParams: { - pageNum: 1, - pageSize: 10, - title: '', - operName: '', - businessType: '', - status: '', - orderByColumn: defaultSort.value.prop, - isAsc: defaultSort.value.order - }, - rules: {} + form: { + operId: undefined, + tenantId: undefined, + title: '', + businessType: 0, + businessTypes: undefined, + method: '', + requestMethod: '', + operatorType: 0, + operName: '', + deptName: '', + operUrl: '', + operIp: '', + operLocation: '', + operParam: '', + jsonResult: '', + status: 0, + errorMsg: '', + operTime: '', + costTime: 0 + }, + queryParams: { + pageNum: 1, + pageSize: 10, + title: '', + operName: '', + businessType: '', + status: '', + orderByColumn: defaultSort.value.prop, + isAsc: defaultSort.value.order + }, + rules: {} }); const { queryParams, form } = toRefs(data); /** 鏌ヨ鐧诲綍鏃ュ織 */ const getList = async () => { - loading.value = true; - const res = await list(proxy?.addDateRange(queryParams.value, dateRange.value)); - operlogList.value = res.rows; - total.value = res.total; - loading.value = false; + loading.value = true; + const res = await list(proxy?.addDateRange(queryParams.value, dateRange.value)); + operlogList.value = res.rows; + total.value = res.total; + loading.value = false; } /** 鎿嶄綔鏃ュ織绫诲瀷瀛楀吀缈昏瘧 */ const typeFormat = (row: OperLogForm) => { - return proxy?.selectDictLabel(sys_oper_type.value, row.businessType); + return proxy?.selectDictLabel(sys_oper_type.value, row.businessType); } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); + 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); + 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); - multiple.value = !selection.length; + 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(); + queryParams.value.orderByColumn = column.prop; + queryParams.value.isAsc = column.order; + getList(); } /** 璇︾粏鎸夐挳鎿嶄綔 */ const handleView = (row: OperLogVO) => { - dialog.visible = true; - form.value = row; + 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); - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + const operIds = row?.operId || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鏃ュ織缂栧彿涓�"' + operIds + '"鐨勬暟鎹」?'); + await delOperlog(operIds); + await getList(); + proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); } /** 娓呯┖鎸夐挳鎿嶄綔 */ const handleClean = async () => { - await proxy?.$modal.confirm("鏄惁纭娓呯┖鎵�鏈夋搷浣滄棩蹇楁暟鎹」?"); - await cleanOperlog(); - getList(); - proxy?.$modal.msgSuccess("娓呯┖鎴愬姛"); + await proxy?.$modal.confirm("鏄惁纭娓呯┖鎵�鏈夋搷浣滄棩蹇楁暟鎹」?"); + await cleanOperlog(); + await getList(); + 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(); + getList(); }) </script> diff --git a/src/views/register.vue b/src/views/register.vue index b80ce5d..0716532 100644 --- a/src/views/register.vue +++ b/src/views/register.vue @@ -58,19 +58,18 @@ <script setup lang="ts"> import { getCodeImg, register, getTenantList } from '@/api/login'; import { RegisterForm, TenantVO } from '@/api/types'; -import { FormRules } from 'element-plus'; import { to } from 'await-to-js'; 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" }); // 绉熸埛寮�鍏� @@ -78,30 +77,30 @@ const equalToPassword = (rule: any, value: string, callback: any) => { - if (registerForm.value.password !== value) { - callback(new Error("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�")); - } else { - callback(); - } + if (registerForm.value.password !== value) { + callback(new Error("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�")); + } else { + callback(); + } }; -const registerRules: FormRules = { - tenantId: [ - { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勭鎴风紪鍙�" } - ], - username: [ - { 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" } - ], - confirmPassword: [ - { required: true, trigger: "blur", message: "璇峰啀娆¤緭鍏ユ偍鐨勫瘑鐮�" }, - { required: true, validator: equalToPassword, trigger: "blur" } - ], - code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }] +const registerRules: ElFormRules = { + tenantId: [ + { required: true, trigger: "blur", message: "璇疯緭鍏ユ偍鐨勭鎴风紪鍙�" } + ], + username: [ + { 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" } + ], + confirmPassword: [ + { required: true, trigger: "blur", message: "璇峰啀娆¤緭鍏ユ偍鐨勫瘑鐮�" }, + { required: true, validator: equalToPassword, trigger: "blur" } + ], + code: [{ required: true, trigger: "change", message: "璇疯緭鍏ラ獙璇佺爜" }] }; const codeUrl = ref(""); const loading = ref(false); @@ -111,50 +110,50 @@ const tenantList = ref<TenantVO[]>([]); const handleRegister = () => { - registerRef.value.validate(async (valid: boolean) => { - if (valid) { - loading.value = true; - const [err] = await to(register(registerForm.value)); - if (!err) { - const username = registerForm.value.username; - await ElMessageBox.alert("<font color='red'>鎭枩浣狅紝鎮ㄧ殑璐﹀彿 " + username + " 娉ㄥ唽鎴愬姛锛�</font>", "绯荤粺鎻愮ず", { - dangerouslyUseHTMLString: true, - type: "success", - }); - await router.push("/login"); - } else { - loading.value = false; - if (captchaEnabled) { - getCode(); - } - } + registerRef.value.validate(async (valid: boolean) => { + if (valid) { + loading.value = true; + const [err] = await to(register(registerForm.value)); + if (!err) { + const username = registerForm.value.username; + await ElMessageBox.alert("<font color='red'>鎭枩浣狅紝鎮ㄧ殑璐﹀彿 " + username + " 娉ㄥ唽鎴愬姛锛�</font>", "绯荤粺鎻愮ず", { + dangerouslyUseHTMLString: true, + type: "success", + }); + await router.push("/login"); + } else { + loading.value = false; + if (captchaEnabled) { + getCode(); } - }); + } + } + }); } const getCode = async () => { - const { data } = await getCodeImg(); - captchaEnabled.value = data.captchaEnabled === undefined ? true : data.captchaEnabled; - if (captchaEnabled.value) { - codeUrl.value = "data:image/gif;base64," + data.img; - registerForm.value.uuid = data.uuid; - } + const { data } = await getCodeImg(); + captchaEnabled.value = data.captchaEnabled === undefined ? true : data.captchaEnabled; + if (captchaEnabled.value) { + codeUrl.value = "data:image/gif;base64," + data.img; + registerForm.value.uuid = data.uuid; + } } const initTenantList = async () => { - const { data } = await getTenantList(); - tenantEnabled.value = data.tenantEnabled === undefined ? true : data.tenantEnabled; - if (tenantEnabled.value) { - tenantList.value = data.voList; - if (tenantList.value != null && tenantList.value.length !== 0) { - registerForm.value.tenantId = tenantList.value[0].tenantId; - } + const { data } = await getTenantList(); + tenantEnabled.value = data.tenantEnabled === undefined ? true : data.tenantEnabled; + if (tenantEnabled.value) { + tenantList.value = data.voList; + if (tenantList.value != null && tenantList.value.length !== 0) { + registerForm.value.tenantId = tenantList.value[0].tenantId; } + } } onMounted(() => { - getCode(); - initTenantList(); + getCode(); + initTenantList(); }) </script> diff --git a/src/views/system/config/index.vue b/src/views/system/config/index.vue index 2f3efe0..8ed9f79 100644 --- a/src/views/system/config/index.vue +++ b/src/views/system/config/index.vue @@ -1,38 +1,40 @@ <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="68px"> - <el-form-item label="鍙傛暟鍚嶇О" prop="configName"> - <el-input v-model="queryParams.configName" placeholder="璇疯緭鍏ュ弬鏁板悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鍙傛暟閿悕" prop="configKey"> - <el-input v-model="queryParams.configKey" placeholder="璇疯緭鍏ュ弬鏁伴敭鍚�" clearable style="width: 240px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="绯荤粺鍐呯疆" prop="configType"> - <el-select v-model="queryParams.configType" placeholder="绯荤粺鍐呯疆" clearable> - <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-date-picker - v-model="dateRange" - value-format="YYYY-MM-DD HH:mm:ss" - type="daterange" - range-separator="-" - start-placeholder="寮�濮嬫棩鏈�" - end-placeholder="缁撴潫鏃ユ湡" - :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" - ></el-date-picker> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :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> + <el-form-item label="鍙傛暟閿悕" prop="configKey"> + <el-input v-model="queryParams.configKey" placeholder="璇疯緭鍏ュ弬鏁伴敭鍚�" clearable style="width: 240px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="绯荤粺鍐呯疆" prop="configType"> + <el-select v-model="queryParams.configType" placeholder="绯荤粺鍐呯疆" clearable> + <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-date-picker + v-model="dateRange" + value-format="YYYY-MM-DD HH:mm:ss" + type="daterange" + range-separator="-" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" + ></el-date-picker> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -123,8 +125,6 @@ <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 { ComponentInternalInstance } from "vue"; -import { DateModelType } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { sys_yes_no } = toRefs<any>(proxy?.useDict("sys_yes_no")); @@ -138,124 +138,124 @@ const total = ref(0); const dateRange = ref<[DateModelType, DateModelType]>(['', '']); -const queryFormRef = ref(ElForm); -const configFormRef = ref(ElForm); +const queryFormRef = ref<ElFormInstance>(); +const configFormRef = ref<ElFormInstance>(); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); const initFormData: ConfigForm = { - configId: undefined, - configName: '', - configKey: '', - configValue: '', - configType: "Y", - remark: '' + configId: undefined, + configName: '', + configKey: '', + configValue: '', + configType: "Y", + remark: '' } const data = reactive<PageData<ConfigForm, ConfigQuery>>({ - form: {...initFormData}, - queryParams: { - pageNum: 1, - pageSize: 10, - configName: '', - configKey: '', - configType: '', - }, - rules: { - configName: [{ required: true, message: "鍙傛暟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], - configKey: [{ required: true, message: "鍙傛暟閿悕涓嶈兘涓虹┖", trigger: "blur" }], - configValue: [{ required: true, message: "鍙傛暟閿�间笉鑳戒负绌�", trigger: "blur" }] - } + form: { ...initFormData }, + queryParams: { + pageNum: 1, + pageSize: 10, + configName: '', + configKey: '', + configType: '', + }, + rules: { + configName: [{ required: true, message: "鍙傛暟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], + configKey: [{ required: true, message: "鍙傛暟閿悕涓嶈兘涓虹┖", trigger: "blur" }], + configValue: [{ required: true, message: "鍙傛暟閿�间笉鑳戒负绌�", trigger: "blur" }] + } }); const { queryParams, form, rules } = toRefs(data); /** 鏌ヨ鍙傛暟鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await listConfig(proxy?.addDateRange(queryParams.value, dateRange.value)); - configList.value = res.rows; - total.value = res.total; - loading.value = false; + loading.value = true; + const res = await listConfig(proxy?.addDateRange(queryParams.value, dateRange.value)); + configList.value = res.rows; + total.value = res.total; + loading.value = false; } /** 鍙栨秷鎸夐挳 */ const cancel = () => { - reset(); - dialog.visible = false; + reset(); + dialog.visible = false; } /** 琛ㄥ崟閲嶇疆 */ const reset = () => { - form.value = {...initFormData}; - configFormRef.value.resetFields(); + form.value = { ...initFormData }; + configFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); + queryParams.value.pageNum = 1; + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - dateRange.value = ['', '']; - queryFormRef.value.resetFields(); - handleQuery(); + dateRange.value = ['', '']; + queryFormRef.value?.resetFields(); + handleQuery(); } /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: ConfigVO[]) => { - ids.value = selection.map(item => item.configId); - single.value = selection.length != 1; - multiple.value = !selection.length; + ids.value = selection.map(item => item.configId); + single.value = selection.length != 1; + multiple.value = !selection.length; } /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { - dialog.visible = true; - dialog.title = "娣诲姞鍙傛暟"; - nextTick(() => { - reset(); - }) + dialog.visible = true; + dialog.title = "娣诲姞鍙傛暟"; + nextTick(() => { + reset(); + }) } /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = (row?: ConfigVO) => { - dialog.visible = true; - dialog.title = "淇敼鍙傛暟"; - const configId = row?.configId || ids.value[0]; - nextTick(async () => { - reset(); - const res = await getConfig(configId); - form.value = res.data; - }) + dialog.visible = true; + dialog.title = "淇敼鍙傛暟"; + const configId = row?.configId || ids.value[0]; + nextTick(async () => { + reset(); + const res = await getConfig(configId); + form.value = res.data; + }) } /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - configFormRef.value.validate(async (valid: boolean) => { - if (valid) { - form.value.configId ? await updateConfig(form.value) : await addConfig(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); - dialog.visible = false; - getList(); - } - }); + configFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + form.value.configId ? await updateConfig(form.value) : await addConfig(form.value); + 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); - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + const configIds = row?.configId || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鍙傛暟缂栧彿涓�"' + configIds + '"鐨勬暟鎹」锛�'); + await delConfig(configIds); + await getList(); + 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("鍒锋柊缂撳瓨鎴愬姛"); + await refreshCache(); + proxy?.$modal.msgSuccess("鍒锋柊缂撳瓨鎴愬姛"); } onMounted(() => { - getList(); + getList(); }) </script> diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue index fad48a3..e833e71 100644 --- a/src/views/system/dept/index.vue +++ b/src/views/system/dept/index.vue @@ -1,25 +1,27 @@ <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 ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> - <el-form-item label="鑿滃崟鍚嶇О" prop="menuName"> - <el-input v-model="queryParams.deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鐘舵��" prop="status"> - <el-select v-model="queryParams.status" placeholder="閮ㄩ棬鐘舵��" clearable> - <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> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> + <el-form-item label="鑿滃崟鍚嶇О" prop="menuName"> + <el-input v-model="queryParams.deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="queryParams.status" placeholder="閮ㄩ棬鐘舵��" clearable> + <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> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10"> <el-col :span="1.5"> @@ -130,13 +132,12 @@ <script setup name="Dept" lang="ts"> import { listDept, getDept, delDept, addDept, updateDept, listDeptExcludeChild } from "@/api/system/dept" -import { ComponentInternalInstance } from 'vue'; import { DeptForm, DeptQuery, DeptVO } from "@/api/system/dept/types"; interface DeptOptionsType { - deptId: number | string; - deptName: string; - children: DeptOptionsType[]; + deptId: number | string; + deptName: string; + children: DeptOptionsType[]; } @@ -151,142 +152,146 @@ const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); -const deptTableRef = ref(ElTable); -const queryFormRef = ref(ElForm); -const deptFormRef = ref(ElForm); +const deptTableRef = ref<ElTableInstance>(); +const queryFormRef = ref<ElFormInstance>(); +const deptFormRef = ref<ElFormInstance>(); const initFormData: DeptForm = { - deptId: undefined, - parentId: undefined, - deptName: undefined, - orderNum: 0, - leader: undefined, - phone: undefined, - email: undefined, - status: "0" + deptId: undefined, + parentId: undefined, + deptName: undefined, + orderNum: 0, + leader: undefined, + phone: undefined, + email: undefined, + status: "0" } const data = reactive<PageData<DeptForm, DeptQuery>>({ - form: {...initFormData}, - queryParams: { - pageNum: 1, - pageSize: 10, - deptName: undefined, - 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" }] - }, + form: { ...initFormData }, + queryParams: { + pageNum: 1, + pageSize: 10, + deptName: undefined, + 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" }] + }, }) 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") - if (data) { - deptList.value = data - } - loading.value = false + loading.value = true; + const res = await listDept(queryParams.value); + const data = proxy?.handleTree<DeptVO>(res.data, "deptId") + if (data) { + deptList.value = data + } + loading.value = false } /** 鍙栨秷鎸夐挳 */ const cancel = () => { - reset() - dialog.visible = false + reset() + dialog.visible = false } /** 琛ㄥ崟閲嶇疆 */ const reset = () => { - form.value = {...initFormData}; - deptFormRef.value.resetFields(); + form.value = { ...initFormData }; + deptFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - getList(); + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); - handleQuery() + queryFormRef.value?.resetFields(); + handleQuery() } /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = (row?: DeptVO) => { - listDept().then(res => { - const data = proxy?.handleTree<DeptOptionsType>(res.data, "deptId"); - if (data) { - deptOptions.value = data - dialog.visible = true; - dialog.title = "娣诲姞閮ㄩ棬"; - nextTick(() => { - reset(); - if (row && row.deptId) { - form.value.parentId = row?.deptId; - } - }) + listDept().then(res => { + const data = proxy?.handleTree<DeptOptionsType>(res.data, "deptId"); + if (data) { + deptOptions.value = data + dialog.visible = true; + dialog.title = "娣诲姞閮ㄩ棬"; + nextTick(() => { + reset(); + if (row && row.deptId) { + form.value.parentId = row?.deptId; } - }) + }) + } + }) } /** 灞曞紑/鎶樺彔鎿嶄綔 */ const handleToggleExpandAll = () => { - isExpandAll.value = !isExpandAll.value; - toggleExpandAll(deptList.value, isExpandAll.value) + isExpandAll.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) - }) + data.forEach((item) => { + deptTableRef.value?.toggleRowExpansion(item, status) + if (item.children && item.children.length > 0) toggleExpandAll(item.children, status) + }) } /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row: DeptVO) => { - const res = await getDept(row.deptId); - dialog.visible = true; - dialog.title = "淇敼閮ㄩ棬"; - nextTick(async () => { - reset(); - form.value = res.data - const response = await listDeptExcludeChild(row.deptId); - const data = proxy?.handleTree<DeptOptionsType>(response.data, "deptId") - if (data) { - deptOptions.value = data; - if (data.length === 0) { - const noResultsOptions: DeptOptionsType = { deptId: res.data.parentId, deptName: res.data.parentName, children: [] }; - deptOptions.value.push(noResultsOptions); - } - } - }) + const res = await getDept(row.deptId); + dialog.visible = true; + dialog.title = "淇敼閮ㄩ棬"; + await nextTick(async () => { + reset(); + form.value = res.data + const response = await listDeptExcludeChild(row.deptId); + const data = proxy?.handleTree<DeptOptionsType>(response.data, "deptId") + if (data) { + deptOptions.value = data; + if (data.length === 0) { + const noResultsOptions: DeptOptionsType = { + deptId: res.data.parentId, + deptName: res.data.parentName, + children: [] + }; + deptOptions.value.push(noResultsOptions); + } + } + }) } /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - deptFormRef.value.validate(async (valid: boolean) => { - if (valid) { - form.value.deptId ? await updateDept(form.value) : await addDept(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); - dialog.visible = false; - getList(); - } - }) + deptFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + form.value.deptId ? await updateDept(form.value) : await addDept(form.value); + proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + dialog.visible = false; + await getList(); + } + }) } /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row: DeptVO) => { - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.deptName + '"鐨勬暟鎹」?'); - await delDept(row.deptId); - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.deptName + '"鐨勬暟鎹」?'); + await delDept(row.deptId); + await getList(); + proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); } onMounted(() => { - getList(); + getList(); }); </script> diff --git a/src/views/system/dict/data.vue b/src/views/system/dict/data.vue index 2b26493..f40c129 100644 --- a/src/views/system/dict/data.vue +++ b/src/views/system/dict/data.vue @@ -1,29 +1,31 @@ <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="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" /> - </el-select> - </el-form-item> - <el-form-item label="瀛楀吀鏍囩" prop="dictLabel"> - <el-input v-model="queryParams.dictLabel" placeholder="璇疯緭鍏ュ瓧鍏告爣绛�" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鐘舵��" prop="status"> - <el-select v-model="queryParams.status" placeholder="鏁版嵁鐘舵��" clearable style="width: 200px"> - <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> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :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" /> + </el-select> + </el-form-item> + <el-form-item label="瀛楀吀鏍囩" prop="dictLabel"> + <el-input v-model="queryParams.dictLabel" placeholder="璇疯緭鍏ュ瓧鍏告爣绛�" clearable style="width: 200px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="queryParams.status" placeholder="鏁版嵁鐘舵��" clearable style="width: 200px"> + <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> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -136,9 +138,7 @@ 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 { ComponentInternalInstance } from "vue"; import { DictDataForm, DictDataQuery, DictDataVO } from "@/api/system/dict/data/types"; -import { ElForm } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance const { sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_normal_disable")); @@ -154,159 +154,159 @@ const defaultDictType = ref(""); const typeOptions = ref<DictTypeVO[]>([]); -const dataFormRef = ref(ElForm); -const queryFormRef = ref(ElForm); +const dataFormRef = ref<ElFormInstance>(); +const queryFormRef = ref<ElFormInstance>(); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); // 鏁版嵁鏍囩鍥炴樉鏍峰紡 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: "鍗遍櫓" } + { value: "default", label: "榛樿" }, + { value: "primary", label: "涓昏" }, + { value: "success", label: "鎴愬姛" }, + { value: "info", label: "淇℃伅" }, + { value: "warning", label: "璀﹀憡" }, + { value: "danger", label: "鍗遍櫓" } ]); const initFormData: DictDataForm = { - dictCode: undefined, - dictLabel: '', - dictValue: '', - cssClass: '', - listClass: "default", - dictSort: 0, - status: "0", - remark: '' + dictCode: undefined, + dictLabel: '', + dictValue: '', + cssClass: '', + listClass: "default", + dictSort: 0, + status: "0", + remark: '' } const data = reactive<PageData<DictDataForm, DictDataQuery>>({ - form: { ...initFormData }, - queryParams: { - pageNum: 1, - pageSize: 10, - dictName: '', - dictType: '', - status: '', - dictLabel: '' - }, - rules: { - dictLabel: [{ required: true, message: "鏁版嵁鏍囩涓嶈兘涓虹┖", trigger: "blur" }], - dictValue: [{ required: true, message: "鏁版嵁閿�间笉鑳戒负绌�", trigger: "blur" }], - dictSort: [{ required: true, message: "鏁版嵁椤哄簭涓嶈兘涓虹┖", trigger: "blur" }] - } + form: { ...initFormData }, + queryParams: { + pageNum: 1, + pageSize: 10, + dictName: '', + dictType: '', + status: '', + dictLabel: '' + }, + rules: { + dictLabel: [{ required: true, message: "鏁版嵁鏍囩涓嶈兘涓虹┖", trigger: "blur" }], + dictValue: [{ required: true, message: "鏁版嵁閿�间笉鑳戒负绌�", trigger: "blur" }], + dictSort: [{ required: true, message: "鏁版嵁椤哄簭涓嶈兘涓虹┖", trigger: "blur" }] + } }); const { queryParams, form, rules } = toRefs(data); /** 鏌ヨ瀛楀吀绫诲瀷璇︾粏 */ const getTypes = async (dictId: string | number) => { - const { data } = await getType(dictId); - queryParams.value.dictType = data.dictType; - defaultDictType.value = data.dictType; - getList(); + const { data } = await getType(dictId); + queryParams.value.dictType = data.dictType; + defaultDictType.value = data.dictType; + getList(); } /** 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 */ const getTypeList = async () => { - const res = await getDictOptionselect() - typeOptions.value = res.data; + const res = await getDictOptionselect() + typeOptions.value = res.data; } /** 鏌ヨ瀛楀吀鏁版嵁鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await listData(queryParams.value); - dataList.value = res.rows; - total.value = res.total; - loading.value = false; + loading.value = true; + const res = await listData(queryParams.value); + dataList.value = res.rows; + total.value = res.total; + loading.value = false; } /** 鍙栨秷鎸夐挳 */ const cancel = () => { - dialog.visible = false; - reset(); + dialog.visible = false; + reset(); } /** 琛ㄥ崟閲嶇疆 */ const reset = () => { - form.value = { ...initFormData }; - dataFormRef.value.resetFields(); + form.value = { ...initFormData }; + dataFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); + queryParams.value.pageNum = 1; + getList(); } /** 杩斿洖鎸夐挳鎿嶄綔 */ const handleClose = () => { - const obj = { path: "/system/dict" }; - proxy?.$tab.closeOpenPage(obj); + const obj = { path: "/system/dict" }; + proxy?.$tab.closeOpenPage(obj); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); - queryParams.value.dictType = defaultDictType.value; - handleQuery(); + queryFormRef.value?.resetFields(); + queryParams.value.dictType = defaultDictType.value; + handleQuery(); } /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { - dialog.visible = true; - dialog.title = "娣诲姞瀛楀吀鏁版嵁"; - nextTick(() => { - reset(); - form.value.dictType = queryParams.value.dictType; - }) + dialog.visible = true; + dialog.title = "娣诲姞瀛楀吀鏁版嵁"; + nextTick(() => { + reset(); + form.value.dictType = queryParams.value.dictType; + }) } /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: DictDataVO[]) => { - ids.value = selection.map(item => item.dictCode); - single.value = selection.length != 1; - multiple.value = !selection.length; + ids.value = selection.map(item => item.dictCode); + single.value = selection.length != 1; + multiple.value = !selection.length; } /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = (row?: DictDataVO) => { - const dictCode = row?.dictCode || ids.value[0]; - dialog.visible = true; - dialog.title = "淇敼瀛楀吀鏁版嵁"; - nextTick(async () => { - const res = await getData(dictCode); - reset(); - form.value = res.data; - }) + const dictCode = row?.dictCode || ids.value[0]; + dialog.visible = true; + dialog.title = "淇敼瀛楀吀鏁版嵁"; + nextTick(async () => { + const res = await getData(dictCode); + reset(); + form.value = res.data; + }) } /** 鎻愪氦鎸夐挳 */ 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("鎿嶄綔鎴愬姛"); - dialog.visible = false; - getList(); + 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("鎿嶄綔鎴愬姛"); + dialog.visible = false; + await getList(); - } - }); + } + }); } /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: DictDataVO) => { - const dictCodes = row?.dictCode || ids.value; - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎瀛楀吀缂栫爜涓�"' + dictCodes + '"鐨勬暟鎹」锛�'); - await delData(dictCodes); - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); - useDictStore().removeDict(queryParams.value.dictType); + const dictCodes = row?.dictCode || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎瀛楀吀缂栫爜涓�"' + dictCodes + '"鐨勬暟鎹」锛�'); + await delData(dictCodes); + await getList(); + 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); - getTypeList(); + 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 7872c76..c246462 100644 --- a/src/views/system/dict/index.vue +++ b/src/views/system/dict/index.vue @@ -1,38 +1,40 @@ <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="68px"> - <el-form-item label="瀛楀吀鍚嶇О" prop="dictName"> - <el-input v-model="queryParams.dictName" placeholder="璇疯緭鍏ュ瓧鍏稿悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="瀛楀吀绫诲瀷" prop="dictType"> - <el-input v-model="queryParams.dictType" 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"> - <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-date-picker - v-model="dateRange" - value-format="YYYY-MM-DD HH:mm:ss" - type="daterange" - range-separator="-" - start-placeholder="寮�濮嬫棩鏈�" - end-placeholder="缁撴潫鏃ユ湡" - :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" - ></el-date-picker> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :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> + <el-form-item label="瀛楀吀绫诲瀷" prop="dictType"> + <el-input v-model="queryParams.dictType" 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"> + <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-date-picker + v-model="dateRange" + value-format="YYYY-MM-DD HH:mm:ss" + type="daterange" + range-separator="-" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" + ></el-date-picker> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -123,9 +125,7 @@ <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 { ComponentInternalInstance } from "vue"; import { DictTypeForm, DictTypeQuery, DictTypeVO } from "@/api/system/dict/type/types"; -import { DateModelType } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_normal_disable")) @@ -139,128 +139,128 @@ const total = ref(0); const dateRange = ref<[DateModelType, DateModelType]>(['', '']); -const dictFormRef = ref(ElForm); -const queryFormRef = ref(ElForm); +const dictFormRef = ref<ElFormInstance>(); +const queryFormRef = ref<ElFormInstance>(); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); const initFormData: DictTypeForm = { - dictId: undefined, - dictName: '', - dictType: '', - status: "0", - remark: '' + dictId: undefined, + dictName: '', + dictType: '', + status: "0", + remark: '' } const data = reactive<PageData<DictTypeForm, DictTypeQuery>>({ - form: {...initFormData}, - queryParams: { - pageNum: 1, - pageSize: 10, - dictName: '', - dictType: '', - status: '' - }, - rules: { - dictName: [{ required: true, message: "瀛楀吀鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], - dictType: [{ required: true, message: "瀛楀吀绫诲瀷涓嶈兘涓虹┖", trigger: "blur" }] - }, + form: { ...initFormData }, + queryParams: { + pageNum: 1, + pageSize: 10, + dictName: '', + dictType: '', + status: '' + }, + rules: { + dictName: [{ required: true, message: "瀛楀吀鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], + dictType: [{ required: true, message: "瀛楀吀绫诲瀷涓嶈兘涓虹┖", trigger: "blur" }] + }, }); const { queryParams, form, rules } = toRefs(data); /** 鏌ヨ瀛楀吀绫诲瀷鍒楄〃 */ const getList = () => { - loading.value = true; - listType(proxy?.addDateRange(queryParams.value, dateRange.value)).then(res => { - typeList.value = res.rows; - total.value = res.total; - loading.value = false; - }); + loading.value = true; + 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; + reset(); + dialog.visible = false; } /** 琛ㄥ崟閲嶇疆 */ const reset = () => { - form.value = {...initFormData}; - dictFormRef.value.resetFields(); + form.value = { ...initFormData }; + dictFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); + queryParams.value.pageNum = 1; + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - dateRange.value = ['', '']; - queryFormRef.value.resetFields(); - handleQuery(); + dateRange.value = ['', '']; + queryFormRef.value?.resetFields(); + handleQuery(); } /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { - dialog.visible = true; - dialog.title = "娣诲姞瀛楀吀绫诲瀷"; - nextTick(() => { - reset(); - }) + dialog.visible = true; + dialog.title = "娣诲姞瀛楀吀绫诲瀷"; + nextTick(() => { + reset(); + }) } /** 澶氶�夋閫変腑鏁版嵁 */ -const handleSelectionChange = (selection: DictTypeVO[]) => { - ids.value = selection.map(item => item.dictId); - single.value = selection.length != 1; - multiple.value = !selection.length; +const handleSelectionChange = (selection: DictTypeVO[]) => { + ids.value = selection.map(item => item.dictId); + single.value = selection.length != 1; + multiple.value = !selection.length; } /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = (row?: DictTypeVO) => { - dialog.visible = true; - dialog.title = "淇敼瀛楀吀绫诲瀷"; - const dictId = row?.dictId || ids.value[0]; - nextTick(async () => { - reset(); - const res = await getType(dictId); - form.value = res.data; - }) + dialog.visible = true; + dialog.title = "淇敼瀛楀吀绫诲瀷"; + const dictId = row?.dictId || ids.value[0]; + nextTick(async () => { + reset(); + const res = await getType(dictId); + form.value = res.data; + }) } /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - dictFormRef.value.validate(async (valid: boolean) => { - if (valid) { - form.value.dictId ? await updateType(form.value) : await addType(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); - dialog.visible = false; - getList(); - } - }); + dictFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + form.value.dictId ? await updateType(form.value) : await addType(form.value); + 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("鍒犻櫎鎴愬姛"); + const dictIds = row?.dictId || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎瀛楀吀缂栧彿涓�"' + dictIds + '"鐨勬暟鎹」锛�'); + await delType(dictIds); + getList(); + 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("鍒锋柊鎴愬姛"); - useDictStore().cleanDict(); + await refreshCache(); + proxy?.$modal.msgSuccess("鍒锋柊鎴愬姛"); + useDictStore().cleanDict(); } -onMounted(()=>{ - getList(); +onMounted(() => { + getList(); }) </script> diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index e282f81..3b496ea 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -1,25 +1,27 @@ <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 ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> - <el-form-item label="鑿滃崟鍚嶇О" prop="menuName"> - <el-input v-model="queryParams.menuName" placeholder="璇疯緭鍏ヨ彍鍗曞悕绉�" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鐘舵��" prop="status"> - <el-select v-model="queryParams.status" placeholder="鑿滃崟鐘舵��" clearable> - <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> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> + <el-form-item label="鑿滃崟鍚嶇О" prop="menuName"> + <el-input v-model="queryParams.menuName" placeholder="璇疯緭鍏ヨ彍鍗曞悕绉�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="queryParams.status" placeholder="鑿滃崟鐘舵��" clearable> + <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> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10"> <el-col :span="1.5"> @@ -37,7 +39,6 @@ :data="menuList" row-key="menuId" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" - border ref="menuTableRef" :default-expand-all="isExpandAll" > @@ -262,14 +263,12 @@ <script setup name="Menu" lang="ts"> import { addMenu, delMenu, getMenu, listMenu, updateMenu } from '@/api/system/menu'; import { MenuForm, MenuQuery, MenuVO } from '@/api/system/menu/types'; -import { ComponentInternalInstance } from 'vue'; import { MenuTypeEnum } from '@/enums/MenuTypeEnum'; -import { ElTable, ElForm } from 'element-plus'; interface MenuOptionsType { - menuId: number; - menuName: string; - children: MenuOptionsType[] | undefined; + menuId: number; + menuName: string; + children: MenuOptionsType[] | undefined; } const { proxy } = getCurrentInstance() as ComponentInternalInstance @@ -282,136 +281,136 @@ const isExpandAll = ref(false) const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); -const queryFormRef = ref(ElForm); -const menuFormRef = ref(ElForm); +const queryFormRef = ref<ElFormInstance>(); +const menuFormRef = ref<ElFormInstance>(); const initFormData = { - path: '', - menuId: undefined, - parentId: 0, - menuName: '', - icon: '', - menuType: MenuTypeEnum.M, - orderNum: 1, - isFrame: "1", - isCache: "0", - visible: "0", - status: "0" + path: '', + menuId: undefined, + parentId: 0, + menuName: '', + icon: '', + menuType: MenuTypeEnum.M, + orderNum: 1, + isFrame: "1", + isCache: "0", + visible: "0", + status: "0" } const data = reactive<PageData<MenuForm, MenuQuery>>({ - form: { ...initFormData }, - queryParams: { - menuName: undefined, - status: undefined - }, - rules: { - menuName: [{ required: true, message: "鑿滃崟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], - orderNum: [{ required: true, message: "鑿滃崟椤哄簭涓嶈兘涓虹┖", trigger: "blur" }], - path: [{ required: true, message: "璺敱鍦板潃涓嶈兘涓虹┖", trigger: "blur" }] - }, + form: { ...initFormData }, + queryParams: { + menuName: undefined, + status: undefined + }, + rules: { + menuName: [{ required: true, message: "鑿滃崟鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], + orderNum: [{ required: true, message: "鑿滃崟椤哄簭涓嶈兘涓虹┖", trigger: "blur" }], + path: [{ required: true, message: "璺敱鍦板潃涓嶈兘涓虹┖", trigger: "blur" }] + }, }) -const menuTableRef = ref(ElTable); +const menuTableRef = ref<ElTableInstance>(); const { queryParams, form, rules } = toRefs<PageData<MenuForm, MenuQuery>>(data) /** 鏌ヨ鑿滃崟鍒楄〃 */ const getList = async () => { - loading.value = true - const res = await listMenu(queryParams.value); - const data = proxy?.handleTree<MenuVO>(res.data, "menuId") - if (data) { - menuList.value = data - } - loading.value = false + loading.value = true + const res = await listMenu(queryParams.value); + const data = proxy?.handleTree<MenuVO>(res.data, "menuId") + if (data) { + menuList.value = data + } + loading.value = false } /** 鏌ヨ鑿滃崟涓嬫媺鏍戠粨鏋� */ const getTreeselect = async () => { - 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) + 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 cancel = () => { - reset() - dialog.visible = false + reset() + dialog.visible = false } /** 琛ㄥ崟閲嶇疆 */ const reset = () => { - form.value = { ...initFormData }; - menuFormRef.value.resetFields(); + form.value = { ...initFormData }; + menuFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - getList(); + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); - handleQuery(); + queryFormRef.value?.resetFields(); + handleQuery(); } /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = (row?: MenuVO) => { - dialog.visible = true; - dialog.title = "娣诲姞鑿滃崟"; - getTreeselect(); - nextTick(() => { - reset(); - row && row.menuId ? form.value.parentId = row.menuId : form.value.parentId = 0; - }) + dialog.visible = true; + dialog.title = "娣诲姞鑿滃崟"; + getTreeselect(); + nextTick(() => { + reset(); + row && row.menuId ? form.value.parentId = row.menuId : form.value.parentId = 0; + }) } /** 灞曞紑/鎶樺彔鎿嶄綔 */ const handleToggleExpandAll = () => { - isExpandAll.value = !isExpandAll.value; - toggleExpandAll(menuList.value, isExpandAll.value) + isExpandAll.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) - }) + data.forEach((item: MenuVO) => { + menuTableRef.value?.toggleRowExpansion(item, status) + if (item.children && item.children.length > 0) toggleExpandAll(item.children, status) + }) } /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row: MenuVO) => { - await getTreeselect(); - dialog.visible = true; - dialog.title = "淇敼鑿滃崟"; - await nextTick(async () => { - if (row.menuId) { - const { data } = await getMenu(row.menuId); - reset(); - form.value = data; - } - }) + await getTreeselect(); + dialog.visible = true; + dialog.title = "淇敼鑿滃崟"; + await nextTick(async () => { + if (row.menuId) { + const { data } = await getMenu(row.menuId); + reset(); + form.value = data; + } + }) } /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - menuFormRef.value.validate(async (valid: boolean) => { - if (valid) { - form.value.menuId ? await updateMenu(form.value) : await addMenu(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); - dialog.visible = false; - getList(); - } - }) + menuFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + form.value.menuId ? await updateMenu(form.value) : await addMenu(form.value); + proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + dialog.visible = false; + await getList(); + } + }) } /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row: MenuVO) => { - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.menuName + '"鐨勬暟鎹」?'); - await delMenu(row.menuId); - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鍚嶇О涓�"' + row.menuName + '"鐨勬暟鎹」?'); + await delMenu(row.menuId); + await getList(); + proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); } onMounted(() => { - getList(); + getList(); }); </script> diff --git a/src/views/system/notice/index.vue b/src/views/system/notice/index.vue index b041bb2..9548093 100644 --- a/src/views/system/notice/index.vue +++ b/src/views/system/notice/index.vue @@ -1,28 +1,30 @@ <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="68px"> - <el-form-item label="鍏憡鏍囬" prop="noticeTitle"> - <el-input v-model="queryParams.noticeTitle" placeholder="璇疯緭鍏ュ叕鍛婃爣棰�" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鎿嶄綔浜哄憳" prop="createByName"> - <el-input v-model="queryParams.createByName" placeholder="璇疯緭鍏ユ搷浣滀汉鍛�" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="绫诲瀷" prop="noticeType"> - <el-select v-model="queryParams.noticeType" placeholder="鍏憡绫诲瀷" clearable style="width: 200px"> - <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value" /> - </el-select> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :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> + <el-form-item label="鎿嶄綔浜哄憳" prop="createByName"> + <el-input v-model="queryParams.createByName" placeholder="璇疯緭鍏ユ搷浣滀汉鍛�" clearable style="width: 200px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="绫诲瀷" prop="noticeType"> + <el-select v-model="queryParams.noticeType" placeholder="鍏憡绫诲瀷" clearable style="width: 200px"> + <el-option v-for="dict in sys_notice_type" :key="dict.value" :label="dict.label" :value="dict.value" /> + </el-select> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -119,9 +121,7 @@ <script setup name="Notice" lang="ts"> import { listNotice, getNotice, delNotice, addNotice, updateNotice } from "@/api/system/notice"; -import { ComponentInternalInstance } from "vue"; import { NoticeForm, NoticeQuery, NoticeVO } from "@/api/system/notice/types"; -import { ElForm } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { sys_notice_status, sys_notice_type } = toRefs<any>(proxy?.useDict("sys_notice_status", "sys_notice_type")); @@ -134,116 +134,116 @@ const multiple = ref(true); const total = ref(0); -const queryFormRef = ref(ElForm); -const noticeFormRef = ref(ElForm); +const queryFormRef = ref<ElFormInstance>(); +const noticeFormRef = ref<ElFormInstance>(); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); const initFormData: NoticeForm = { - noticeId: undefined, - noticeTitle: '', - noticeType: '', - noticeContent: '', - status: "0", - remark: '', - createByName: '' + noticeId: undefined, + noticeTitle: '', + noticeType: '', + noticeContent: '', + status: "0", + remark: '', + createByName: '' } const data = reactive<PageData<NoticeForm, NoticeQuery>>({ - form: { ...initFormData }, - queryParams: { - pageNum: 1, - pageSize: 10, - noticeTitle: '', - createByName: '', - status: '', - noticeType: '' - }, - rules: { - noticeTitle: [{ required: true, message: "鍏憡鏍囬涓嶈兘涓虹┖", trigger: "blur" }], - noticeType: [{ required: true, message: "鍏憡绫诲瀷涓嶈兘涓虹┖", trigger: "change" }] - }, + form: { ...initFormData }, + queryParams: { + pageNum: 1, + pageSize: 10, + noticeTitle: '', + createByName: '', + status: '', + noticeType: '' + }, + rules: { + noticeTitle: [{ required: true, message: "鍏憡鏍囬涓嶈兘涓虹┖", trigger: "blur" }], + noticeType: [{ required: true, message: "鍏憡绫诲瀷涓嶈兘涓虹┖", trigger: "change" }] + }, }); const { queryParams, form, rules } = toRefs(data); /** 鏌ヨ鍏憡鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await listNotice(queryParams.value); - noticeList.value = res.rows; - total.value = res.total; - loading.value = false; + loading.value = true; + const res = await listNotice(queryParams.value); + noticeList.value = res.rows; + total.value = res.total; + loading.value = false; } /** 鍙栨秷鎸夐挳 */ const cancel = () => { - reset(); - dialog.visible = false; + reset(); + dialog.visible = false; } /** 琛ㄥ崟閲嶇疆 */ const reset = () => { - form.value = { ...initFormData }; - noticeFormRef.value.resetFields(); + form.value = { ...initFormData }; + noticeFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); + queryParams.value.pageNum = 1; + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); - handleQuery(); + queryFormRef.value?.resetFields(); + handleQuery(); } /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: NoticeVO[]) => { - ids.value = selection.map(item => item.noticeId); - single.value = selection.length != 1; - multiple.value = !selection.length; + ids.value = selection.map(item => item.noticeId); + single.value = selection.length != 1; + multiple.value = !selection.length; } /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { - dialog.visible = true; - dialog.title = "娣诲姞鍏憡"; - nextTick(() => { - reset(); - }) + dialog.visible = true; + dialog.title = "娣诲姞鍏憡"; + nextTick(() => { + reset(); + }) } /**淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = (row?: NoticeVO) => { - dialog.visible = true; - dialog.title = "淇敼鍏憡"; - nextTick(async () => { - const noticeId = row?.noticeId || ids.value[0]; - reset(); - const { data } = await getNotice(noticeId); - form.value = data; - }) + dialog.visible = true; + dialog.title = "淇敼鍏憡"; + nextTick(async () => { + const noticeId = row?.noticeId || ids.value[0]; + reset(); + const { data } = await getNotice(noticeId); + form.value = data; + }) } /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - noticeFormRef.value.validate(async (valid: boolean) => { - if (valid) { - form.value.noticeId ? await updateNotice(form.value) : await addNotice(form.value); - proxy?.$modal.msgSuccess("淇敼鎴愬姛"); - dialog.visible = false; - getList(); - } - }); + noticeFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + form.value.noticeId ? await updateNotice(form.value) : await addNotice(form.value); + proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + dialog.visible = false; + await getList(); + } + }); } /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: NoticeVO) => { - const noticeIds = row?.noticeId || ids.value - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鍏憡缂栧彿涓�"' + noticeIds + '"鐨勬暟鎹」锛�'); - await delNotice(noticeIds); - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + const noticeIds = row?.noticeId || ids.value + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎鍏憡缂栧彿涓�"' + noticeIds + '"鐨勬暟鎹」锛�'); + await delNotice(noticeIds); + await getList(); + proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); } onMounted(() => { - getList(); + getList(); }) -</script> \ No newline at end of file +</script> diff --git a/src/views/system/oss/config.vue b/src/views/system/oss/config.vue index 2d74633..ba64c1b 100644 --- a/src/views/system/oss/config.vue +++ b/src/views/system/oss/config.vue @@ -1,29 +1,31 @@ <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="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> - <el-form-item label="妗跺悕绉�" prop="bucketName"> - <el-input v-model="queryParams.bucketName" placeholder="璇疯緭鍏ユ《鍚嶇О" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鏄惁榛樿" prop="status"> - <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 200px"> - <el-option key="0" label="鏄�" value="0" /> - <el-option key="1" label="鍚�" value="1" /> - </el-select> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :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> + <el-form-item label="妗跺悕绉�" prop="bucketName"> + <el-input v-model="queryParams.bucketName" placeholder="璇疯緭鍏ユ《鍚嶇О" clearable style="width: 200px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鏄惁榛樿" prop="status"> + <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨鐘舵��" clearable style="width: 200px"> + <el-option key="0" label="鏄�" value="0" /> + <el-option key="1" label="鍚�" value="1" /> + </el-select> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -131,16 +133,14 @@ <script setup name="OssConfig" lang="ts"> import { - listOssConfig, - getOssConfig, - delOssConfig, - addOssConfig, - updateOssConfig, - changeOssConfigStatus + listOssConfig, + getOssConfig, + delOssConfig, + addOssConfig, + updateOssConfig, + changeOssConfigStatus } from "@/api/system/ossConfig"; -import { ComponentInternalInstance } from "vue"; import { OssConfigForm, OssConfigQuery, OssConfigVO } from "@/api/system/ossConfig/types"; -import { ElForm } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance @@ -155,193 +155,193 @@ const multiple = ref(true); const total = ref(0); -const queryFormRef = ref(ElForm); -const ossConfigFormRef = ref(ElForm); +const queryFormRef = ref<ElFormInstance>(); +const ossConfigFormRef = ref<ElFormInstance>(); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); // 鍒楁樉闅愪俊鎭� const columns = ref<FieldOption[]>([ - { key: 0, label: `涓诲缓`, visible: true }, - { key: 1, label: `閰嶇疆key`, visible: false }, - { key: 2, label: `璁块棶绔欑偣`, visible: true }, - { key: 3, label: `鑷畾涔夊煙鍚峘, visible: true }, - { key: 4, label: `妗跺悕绉癭, visible: true }, - { key: 5, label: `鍓嶇紑`, visible: true }, - { key: 6, label: `鍩焋, visible: true }, - { key: 7, label: `妗舵潈闄愮被鍨媊, visible: true }, - { key: 8, label: `鐘舵�乣, visible: true } + { key: 0, label: `涓诲缓`, visible: true }, + { key: 1, label: `閰嶇疆key`, visible: false }, + { key: 2, label: `璁块棶绔欑偣`, visible: true }, + { key: 3, label: `鑷畾涔夊煙鍚峘, visible: true }, + { key: 4, label: `妗跺悕绉癭, visible: true }, + { key: 5, label: `鍓嶇紑`, visible: true }, + { key: 6, label: `鍩焋, visible: true }, + { key: 7, label: `妗舵潈闄愮被鍨媊, visible: true }, + { key: 8, label: `鐘舵�乣, visible: true } ]); const initFormData: OssConfigForm = { - ossConfigId: undefined, - configKey: '', - accessKey: '', - secretKey: '', - bucketName: '', - prefix: '', - endpoint: '', - domain: '', - isHttps: "N", - accessPolicy: "1", - region: '', - status: "1", - remark: '', + ossConfigId: undefined, + configKey: '', + accessKey: '', + secretKey: '', + bucketName: '', + prefix: '', + endpoint: '', + domain: '', + isHttps: "N", + accessPolicy: "1", + region: '', + status: "1", + remark: '', } const data = reactive<PageData<OssConfigForm, OssConfigQuery>>({ - form: { ...initFormData }, - // 鏌ヨ鍙傛暟 - queryParams: { - pageNum: 1, - pageSize: 10, - configKey: '', - bucketName: '', - status: '', - }, - rules: { - configKey: [{ required: true, message: "configKey涓嶈兘涓虹┖", trigger: "blur" },], - accessKey: [ - { required: true, message: "accessKey涓嶈兘涓虹┖", trigger: "blur" }, - { - min: 2, - max: 200, - message: "accessKey闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", - trigger: "blur", - }, - ], - secretKey: [ - { required: true, message: "secretKey涓嶈兘涓虹┖", trigger: "blur" }, - { - min: 2, - max: 100, - message: "secretKey闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", - trigger: "blur", - }, - ], - bucketName: [ - { required: true, message: "bucketName涓嶈兘涓虹┖", trigger: "blur" }, - { - min: 2, - max: 100, - message: "bucketName闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", - trigger: "blur", - }, - ], - endpoint: [ - { required: true, message: "endpoint涓嶈兘涓虹┖", trigger: "blur" }, - { - min: 2, - max: 100, - message: "endpoint鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", - trigger: "blur", - }, - ], - accessPolicy: [{ required: true, message: "accessPolicy涓嶈兘涓虹┖", trigger: "blur" }] - } + form: { ...initFormData }, + // 鏌ヨ鍙傛暟 + queryParams: { + pageNum: 1, + pageSize: 10, + configKey: '', + bucketName: '', + status: '', + }, + rules: { + configKey: [{ required: true, message: "configKey涓嶈兘涓虹┖", trigger: "blur" },], + accessKey: [ + { required: true, message: "accessKey涓嶈兘涓虹┖", trigger: "blur" }, + { + min: 2, + max: 200, + message: "accessKey闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", + trigger: "blur", + }, + ], + secretKey: [ + { required: true, message: "secretKey涓嶈兘涓虹┖", trigger: "blur" }, + { + min: 2, + max: 100, + message: "secretKey闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", + trigger: "blur", + }, + ], + bucketName: [ + { required: true, message: "bucketName涓嶈兘涓虹┖", trigger: "blur" }, + { + min: 2, + max: 100, + message: "bucketName闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", + trigger: "blur", + }, + ], + endpoint: [ + { required: true, message: "endpoint涓嶈兘涓虹┖", trigger: "blur" }, + { + min: 2, + max: 100, + message: "endpoint鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 100 涔嬮棿", + trigger: "blur", + }, + ], + accessPolicy: [{ required: true, message: "accessPolicy涓嶈兘涓虹┖", trigger: "blur" }] + } }); const { queryParams, form, rules } = toRefs(data); /** 鏌ヨ瀵硅薄瀛樺偍閰嶇疆鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await listOssConfig(queryParams.value); - ossConfigList.value = res.rows; - total.value = res.total; - loading.value = false; + loading.value = true; + const res = await listOssConfig(queryParams.value); + ossConfigList.value = res.rows; + total.value = res.total; + loading.value = false; } /** 鍙栨秷鎸夐挳 */ const cancel = () => { - dialog.visible = false; - reset(); + dialog.visible = false; + reset(); } /** 琛ㄥ崟閲嶇疆 */ const reset = () => { - form.value = { ...initFormData }; - ossConfigFormRef.value.resetFields(); + form.value = { ...initFormData }; + ossConfigFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); + queryParams.value.pageNum = 1; + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); - handleQuery(); + queryFormRef.value?.resetFields(); + handleQuery(); } /** 閫夋嫨鏉℃暟 */ const handleSelectionChange = (selection: OssConfigVO[]) => { - ids.value = selection.map(item => item.ossConfigId); - single.value = selection.length != 1; - multiple.value = !selection.length; + ids.value = selection.map(item => item.ossConfigId); + single.value = selection.length != 1; + multiple.value = !selection.length; } /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { - dialog.visible = true; - dialog.title = "娣诲姞瀵硅薄瀛樺偍閰嶇疆"; - nextTick(() => { - reset(); - }) + dialog.visible = true; + dialog.title = "娣诲姞瀵硅薄瀛樺偍閰嶇疆"; + nextTick(() => { + reset(); + }) } /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = (row?: OssConfigVO) => { - loading.value = true; - dialog.visible = true; - dialog.title = "淇敼瀵硅薄瀛樺偍閰嶇疆"; - const ossConfigId = row?.ossConfigId || ids.value[0]; - nextTick(async () => { - reset(); - const res = await getOssConfig(ossConfigId); - loading.value = false; - form.value = res.data; - }) + loading.value = true; + dialog.visible = true; + dialog.title = "淇敼瀵硅薄瀛樺偍閰嶇疆"; + const ossConfigId = row?.ossConfigId || ids.value[0]; + nextTick(async () => { + reset(); + const res = await getOssConfig(ossConfigId); + loading.value = false; + form.value = res.data; + }) } /** 鎻愪氦鎸夐挳 */ 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); - } else { - await addOssConfig(form.value).finally(() => buttonLoading.value = false); - } - proxy?.$modal.msgSuccess("鏂板鎴愬姛"); - dialog.visible = false; - getList(); - } - }); + ossConfigFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + buttonLoading.value = true; + if (form.value.ossConfigId) { + await updateOssConfig(form.value).finally(() => buttonLoading.value = false); + } else { + await addOssConfig(form.value).finally(() => buttonLoading.value = false); + } + proxy?.$modal.msgSuccess("鏂板鎴愬姛"); + dialog.visible = false; + getList(); + } + }); } /** 鐘舵�佷慨鏀� */ -const handleStatusChange = async (row: OssConfigVO) => { - let text = row.status === "0" ? "鍚敤" : "鍋滅敤"; - try { - await proxy?.$modal.confirm('纭瑕�"' + text + '""' + row.configKey + '"閰嶇疆鍚�?'); - await changeOssConfigStatus(row.ossConfigId, row.status, row.configKey); - getList() - proxy?.$modal.msgSuccess(text + "鎴愬姛"); - } catch { return } finally { - row.status = row.status === "0" ? "1" : "0"; - } +const handleStatusChange = async (row: OssConfigVO) => { + let text = row.status === "0" ? "鍚敤" : "鍋滅敤"; + try { + await proxy?.$modal.confirm('纭瑕�"' + text + '""' + row.configKey + '"閰嶇疆鍚�?'); + await changeOssConfigStatus(row.ossConfigId, row.status, row.configKey); + 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); - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + const ossConfigIds = row?.ossConfigId || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎OSS閰嶇疆缂栧彿涓�"' + ossConfigIds + '"鐨勬暟鎹」?'); + loading.value = true; + await delOssConfig(ossConfigIds).finally(() => loading.value = false); + getList(); + proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); } onMounted(() => { - getList(); + getList(); }) -</script> \ No newline at end of file +</script> diff --git a/src/views/system/oss/index.vue b/src/views/system/oss/index.vue index 24d637d..7bfaabe 100644 --- a/src/views/system/oss/index.vue +++ b/src/views/system/oss/index.vue @@ -1,40 +1,42 @@ <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="68px"> - <el-form-item label="鏂囦欢鍚�" prop="fileName"> - <el-input v-model="queryParams.fileName" placeholder="璇疯緭鍏ユ枃浠跺悕" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鍘熷悕" prop="originalName"> - <el-input v-model="queryParams.originalName" placeholder="璇疯緭鍏ュ師鍚�" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鏂囦欢鍚庣紑" prop="fileSuffix"> - <el-input v-model="queryParams.fileSuffix" placeholder="璇疯緭鍏ユ枃浠跺悗缂�" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鍒涘缓鏃堕棿"> - <el-date-picker - v-model="daterangeCreateTime" - value-format="YYYY-MM-DD HH:mm:ss" - type="daterange" - range-separator="-" - start-placeholder="寮�濮嬫棩鏈�" - end-placeholder="缁撴潫鏃ユ湡" - :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" - ></el-date-picker> - </el-form-item> - <el-form-item label="鏈嶅姟鍟�" prop="service"> - <el-input v-model="queryParams.service" placeholder="璇疯緭鍏ユ湇鍔″晢" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :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> + <el-form-item label="鍘熷悕" prop="originalName"> + <el-input v-model="queryParams.originalName" placeholder="璇疯緭鍏ュ師鍚�" clearable style="width: 200px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鏂囦欢鍚庣紑" prop="fileSuffix"> + <el-input v-model="queryParams.fileSuffix" placeholder="璇疯緭鍏ユ枃浠跺悗缂�" clearable style="width: 200px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鍒涘缓鏃堕棿"> + <el-date-picker + v-model="daterangeCreateTime" + value-format="YYYY-MM-DD HH:mm:ss" + type="daterange" + range-separator="-" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" + ></el-date-picker> + </el-form-item> + <el-form-item label="鏈嶅姟鍟�" prop="service"> + <el-input v-model="queryParams.service" placeholder="璇疯緭鍏ユ湇鍔″晢" clearable style="width: 200px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -133,9 +135,7 @@ <script setup name="Oss" lang="ts"> import { listOss, delOss } from "@/api/system/oss"; import ImagePreview from "@/components/ImagePreview/index.vue"; -import { ComponentInternalInstance } from "vue"; import { OssForm, OssQuery, OssVO } from "@/api/system/oss/types"; -import { DateModelType } from 'element-plus'; const router = useRouter(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -154,186 +154,186 @@ const daterangeCreateTime = ref<[DateModelType, DateModelType]>(['', '']); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); // 榛樿鎺掑簭 const defaultSort = ref({ prop: 'createTime', order: 'ascending' }); -const ossFormRef = ref(ElForm); -const queryFormRef = ref(ElForm); +const ossFormRef = ref<ElFormInstance>(); +const queryFormRef = ref<ElFormInstance>(); const initFormData = { - file: undefined, + file: undefined, } const data = reactive<PageData<OssForm, OssQuery>>({ - form: { ...initFormData }, - // 鏌ヨ鍙傛暟 - queryParams: { - pageNum: 1, - pageSize: 10, - fileName: '', - originalName: '', - fileSuffix: '', - createTime: '', - service: '', - orderByColumn: defaultSort.value.prop, - isAsc: defaultSort.value.order - }, - rules: { - file: [ - { required: true, message: "鏂囦欢涓嶈兘涓虹┖", trigger: "blur" } - ] - } + form: { ...initFormData }, + // 鏌ヨ鍙傛暟 + queryParams: { + pageNum: 1, + pageSize: 10, + fileName: '', + originalName: '', + fileSuffix: '', + createTime: '', + service: '', + orderByColumn: defaultSort.value.prop, + isAsc: defaultSort.value.order + }, + rules: { + file: [ + { required: true, message: "鏂囦欢涓嶈兘涓虹┖", trigger: "blur" } + ] + } }); const { queryParams, form, rules } = toRefs(data); /** 鏌ヨOSS瀵硅薄瀛樺偍鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await proxy?.getConfigKey("sys.oss.previewListResource"); - previewListResource.value = res?.msg === undefined ? true : res.msg === 'true'; - 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; + loading.value = true; + const res = await proxy?.getConfigKey("sys.oss.previewListResource"); + previewListResource.value = res?.msg === undefined ? true : res.msg === 'true'; + 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 => { - return fileSuffix.indexOf(type) > -1; - }); + let arr = ["png", "jpg", "jpeg"]; + return arr.some(type => { + return fileSuffix.indexOf(type) > -1; + }); } /** 鍙栨秷鎸夐挳 */ function cancel() { - dialog.visible = false; - reset(); + dialog.visible = false; + reset(); } /** 琛ㄥ崟閲嶇疆 */ function reset() { - form.value = { ...initFormData }; - ossFormRef.value.resetFields(); + form.value = { ...initFormData }; + ossFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ function handleQuery() { - queryParams.value.pageNum = 1; - getList(); + queryParams.value.pageNum = 1; + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ function resetQuery() { - showTable.value = false; - daterangeCreateTime.value = ['', '']; - queryFormRef.value.resetFields(); - queryParams.value.orderByColumn = defaultSort.value.prop; - queryParams.value.isAsc = defaultSort.value.order; - handleQuery(); + showTable.value = false; + daterangeCreateTime.value = ['', '']; + queryFormRef.value?.resetFields(); + queryParams.value.orderByColumn = defaultSort.value.prop; + queryParams.value.isAsc = defaultSort.value.order; + handleQuery(); } /** 閫夋嫨鏉℃暟 */ function handleSelectionChange(selection: OssVO[]) { - ids.value = selection.map(item => item.ossId); - single.value = selection.length != 1; - multiple.value = !selection.length; + 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 - } - switch (column.multiOrder) { - case 'descending': - column.multiOrder = 'ascending'; - break; - case 'ascending': - column.multiOrder = ''; - break; - default: - column.multiOrder = 'descending'; - break; - } - handleOrderChange(column.property, column.multiOrder) + if (column.sortable !== 'custom') { + return + } + switch (column.multiOrder) { + case 'descending': + column.multiOrder = 'ascending'; + break; + case 'ascending': + column.multiOrder = ''; + break; + default: + column.multiOrder = 'descending'; + break; + } + 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) - if (propIndex !== -1) { - if (order) { - //鎺掑簭閲屽凡瀛樺湪 鍙慨鏀规帓搴� - isAscArr[propIndex] = order; - } else { - //濡傛灉order涓簄ull 鍒欏垹闄ゆ帓搴忓瓧娈靛拰灞炴�� - isAscArr.splice(propIndex, 1);//鍒犻櫎鎺掑簭 - orderByArr.splice(propIndex, 1);//鍒犻櫎灞炴�� - } + 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 { - //鎺掑簭閲屼笉瀛樺湪鍒欐柊澧炴帓搴� - orderByArr.push(prop); - isAscArr.push(order); + //濡傛灉order涓簄ull 鍒欏垹闄ゆ帓搴忓瓧娈靛拰灞炴�� + isAscArr.splice(propIndex, 1);//鍒犻櫎鎺掑簭 + orderByArr.splice(propIndex, 1);//鍒犻櫎灞炴�� } - //鍚堝苟鎺掑簭 - queryParams.value.orderByColumn = orderByArr.join(","); - queryParams.value.isAsc = isAscArr.join(","); - getList(); + } else { + //鎺掑簭閲屼笉瀛樺湪鍒欐柊澧炴帓搴� + orderByArr.push(prop); + isAscArr.push(order); + } + //鍚堝苟鎺掑簭 + 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 = () => { - dialog.visible = true; - dialog.title = "涓婁紶鏂囦欢"; - nextTick(() => { - reset(); - type.value = 0; - }) + dialog.visible = true; + dialog.title = "涓婁紶鏂囦欢"; + nextTick(() => { + reset(); + type.value = 0; + }) } /** 鍥剧墖鎸夐挳鎿嶄綔 */ const handleImage = () => { - dialog.visible = true; - dialog.title = "涓婁紶鍥剧墖"; - nextTick(() => { - reset(); - type.value = 1; - }) + dialog.visible = true; + dialog.title = "涓婁紶鍥剧墖"; + nextTick(() => { + reset(); + type.value = 1; + }) } /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - dialog.visible = false; - getList(); + 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 ? "鍚敤" : "鍋滅敤"; - try { - await proxy?.$modal.confirm('纭瑕�"' + text + '""棰勮鍒楄〃鍥剧墖"閰嶇疆鍚�?'); - await proxy?.updateConfigByKey("sys.oss.previewListResource", preview); - getList() - proxy?.$modal.msgSuccess(text + "鎴愬姛"); - } catch { return } + let text = preview ? "鍚敤" : "鍋滅敤"; + try { + await proxy?.$modal.confirm('纭瑕�"' + text + '""棰勮鍒楄〃鍥剧墖"閰嶇疆鍚�?'); + await proxy?.updateConfigByKey("sys.oss.previewListResource", preview); + 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); - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + const ossIds = row?.ossId || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎OSS瀵硅薄瀛樺偍缂栧彿涓�"' + ossIds + '"鐨勬暟鎹」?'); + loading.value = true; + await delOss(ossIds).finally(() => loading.value = false); + getList(); + proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); } onMounted(() => { - getList(); + getList(); }) </script> diff --git a/src/views/system/post/index.vue b/src/views/system/post/index.vue index 2dc0ca0..d53eb1c 100644 --- a/src/views/system/post/index.vue +++ b/src/views/system/post/index.vue @@ -1,27 +1,29 @@ <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="70"> - <el-form-item label="宀椾綅缂栫爜" prop="postCode"> - <el-input v-model="queryParams.postCode" placeholder="璇疯緭鍏ュ矖浣嶇紪鐮�" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="宀椾綅鍚嶇О" prop="postName"> - <el-input v-model="queryParams.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鐘舵��" prop="status"> - <el-select v-model="queryParams.status" placeholder="宀椾綅鐘舵��" clearable style="width: 200px"> - <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> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :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> + <el-form-item label="宀椾綅鍚嶇О" prop="postName"> + <el-input v-model="queryParams.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" clearable style="width: 200px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="queryParams.status" placeholder="宀椾綅鐘舵��" clearable style="width: 200px"> + <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> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -107,7 +109,6 @@ <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 { ComponentInternalInstance } from "vue"; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { sys_normal_disable } = toRefs<any>(proxy?.useDict("sys_normal_disable")); @@ -120,121 +121,121 @@ const multiple = ref(true); const total = ref(0); -const postFormRef = ref(ElForm); -const queryFormRef = ref(ElForm); +const postFormRef = ref<ElFormInstance>(); +const queryFormRef = ref<ElFormInstance>(); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); const initFormData: PostForm = { - postId: undefined, - postCode: '', - postName: '', - postSort: 0, - status: "0", - remark: '' + postId: undefined, + postCode: '', + postName: '', + postSort: 0, + status: "0", + remark: '' } const data = reactive<PageData<PostForm, PostQuery>>({ - form: {...initFormData}, - queryParams: { - pageNum: 1, - pageSize: 10, - postCode: '', - postName: '', - status: '' - }, - rules: { - postName: [{ required: true, message: "宀椾綅鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], - postCode: [{ required: true, message: "宀椾綅缂栫爜涓嶈兘涓虹┖", trigger: "blur" }], - postSort: [{ required: true, message: "宀椾綅椤哄簭涓嶈兘涓虹┖", trigger: "blur" }], - } + form: { ...initFormData }, + queryParams: { + pageNum: 1, + pageSize: 10, + postCode: '', + postName: '', + status: '' + }, + rules: { + postName: [{ required: true, message: "宀椾綅鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], + postCode: [{ required: true, message: "宀椾綅缂栫爜涓嶈兘涓虹┖", trigger: "blur" }], + postSort: [{ required: true, message: "宀椾綅椤哄簭涓嶈兘涓虹┖", trigger: "blur" }], + } }); const { queryParams, form, rules } = toRefs<PageData<PostForm, PostQuery>>(data); /** 鏌ヨ宀椾綅鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await listPost(queryParams.value); - postList.value = res.rows; - total.value = res.total; - loading.value = false; + loading.value = true; + const res = await listPost(queryParams.value); + postList.value = res.rows; + total.value = res.total; + loading.value = false; } /** 鍙栨秷鎸夐挳 */ const cancel = () => { - reset(); - dialog.visible = false; + reset(); + dialog.visible = false; } /** 琛ㄥ崟閲嶇疆 */ const reset = () => { - form.value = {...initFormData}; - postFormRef.value.resetFields(); + form.value = { ...initFormData }; + postFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); + queryParams.value.pageNum = 1; + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); - handleQuery(); + queryFormRef.value?.resetFields(); + handleQuery(); } /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: PostVO[]) => { - ids.value = selection.map(item => item.postId); - single.value = selection.length != 1; - multiple.value = !selection.length; + ids.value = selection.map(item => item.postId); + single.value = selection.length != 1; + multiple.value = !selection.length; } /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { - dialog.visible = true; - dialog.title = "娣诲姞宀椾綅"; - nextTick(() => { - reset(); - }) + dialog.visible = true; + dialog.title = "娣诲姞宀椾綅"; + nextTick(() => { + reset(); + }) } /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = (row?: PostVO) => { - dialog.visible = true; - dialog.title = "淇敼宀椾綅"; - nextTick(async () => { - reset(); - const postId = row?.postId || ids.value[0]; - const res = await getPost(postId); - form.value = res.data; - }) + dialog.visible = true; + dialog.title = "淇敼宀椾綅"; + nextTick(async () => { + reset(); + const postId = row?.postId || ids.value[0]; + const res = await getPost(postId); + form.value = res.data; + }) } /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - postFormRef.value.validate(async (valid: boolean) => { - if (valid) { - form.value.postId ? await updatePost(form.value) : await addPost(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); - dialog.visible = false; - getList(); - } - }); + postFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + form.value.postId ? await updatePost(form.value) : await addPost(form.value); + 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); - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + const postIds = row?.postId || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎宀椾綅缂栧彿涓�"' + postIds + '"鐨勬暟鎹」锛�'); + await delPost(postIds); + await getList(); + 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(); + getList(); }); </script> diff --git a/src/views/system/role/authUser.vue b/src/views/system/role/authUser.vue index ae4f73f..7ad8a5a 100644 --- a/src/views/system/role/authUser.vue +++ b/src/views/system/role/authUser.vue @@ -58,13 +58,7 @@ </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" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> <select-user ref="selectRef" :roleId="queryParams.roleId" @ok="handleQuery" /> </el-card> </div> @@ -73,10 +67,8 @@ <script setup name="AuthUser" lang="ts"> import { allocatedUserList, authUserCancel, authUserCancelAll } from "@/api/system/role"; import { UserQuery } from "@/api/system/user/types"; -import { ComponentInternalInstance } from "vue"; import { UserVO } from "@/api/system/user/types"; import SelectUser from "./selectUser.vue"; -// import { ElForm, ElSelect} from 'element-plus'; const route = useRoute(); @@ -90,68 +82,68 @@ const total = ref(0); const userIds = ref<Array<string | number>>([]); -const queryFormRef = ref(ElForm); -const selectRef = ref(SelectUser); +const queryFormRef = ref<ElFormInstance>(); +const selectRef = ref<InstanceType<typeof SelectUser>>(); const queryParams = reactive<UserQuery>({ - pageNum: 1, - pageSize: 10, - roleId: route.params.roleId as string, - userName: undefined, - phonenumber: undefined, + pageNum: 1, + pageSize: 10, + roleId: route.params.roleId as string, + userName: undefined, + phonenumber: undefined, }); /** 鏌ヨ鎺堟潈鐢ㄦ埛鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await allocatedUserList(queryParams); - userList.value = res.rows; - total.value = res.total; - loading.value = false; + loading.value = true; + const res = await allocatedUserList(queryParams); + userList.value = res.rows; + total.value = res.total; + loading.value = false; } // 杩斿洖鎸夐挳 const handleClose = () => { - const obj = { path: "/system/role" }; - proxy?.$tab.closeOpenPage(obj); + const obj = { path: "/system/role" }; + proxy?.$tab.closeOpenPage(obj); } /** 鎼滅储鎸夐挳鎿嶄綔 */ -const handleQuery=() => { - queryParams.pageNum = 1; - getList(); +const handleQuery = () => { + queryParams.pageNum = 1; + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ -const resetQuery=() =>{ - queryFormRef.value.resetFields(); - handleQuery(); +const resetQuery = () => { + queryFormRef.value?.resetFields(); + handleQuery(); } // 澶氶�夋閫変腑鏁版嵁 -const handleSelectionChange = (selection: UserVO[]) =>{ - userIds.value = selection.map(item => item.userId); - multiple.value = !selection.length; +const handleSelectionChange = (selection: UserVO[]) => { + userIds.value = selection.map(item => item.userId); + multiple.value = !selection.length; } /** 鎵撳紑鎺堟潈鐢ㄦ埛琛ㄥ脊绐� */ const openSelectUser = () => { - selectRef.value.show(); + selectRef.value?.show(); } /** 鍙栨秷鎺堟潈鎸夐挳鎿嶄綔 */ const cancelAuthUser = async (row: UserVO) => { - await proxy?.$modal.confirm('纭瑕佸彇娑堣鐢ㄦ埛"' + row.userName + '"瑙掕壊鍚楋紵'); - await authUserCancel({ userId: row.userId, roleId: queryParams.roleId }); - getList(); - proxy?.$modal.msgSuccess("鍙栨秷鎺堟潈鎴愬姛"); + await proxy?.$modal.confirm('纭瑕佸彇娑堣鐢ㄦ埛"' + row.userName + '"瑙掕壊鍚楋紵'); + await authUserCancel({ userId: row.userId, roleId: queryParams.roleId }); + await getList(); + proxy?.$modal.msgSuccess("鍙栨秷鎺堟潈鎴愬姛"); } /** 鎵归噺鍙栨秷鎺堟潈鎸夐挳鎿嶄綔 */ const cancelAuthUserAll = async () => { - const roleId = queryParams.roleId; - const uIds = userIds.value.join(","); - await proxy?.$modal.confirm("鏄惁鍙栨秷閫変腑鐢ㄦ埛鎺堟潈鏁版嵁椤�?"); - await authUserCancelAll({ roleId: roleId, userIds: uIds }); - getList(); - proxy?.$modal.msgSuccess("鍙栨秷鎺堟潈鎴愬姛"); + const roleId = queryParams.roleId; + const uIds = userIds.value.join(","); + await proxy?.$modal.confirm("鏄惁鍙栨秷閫変腑鐢ㄦ埛鎺堟潈鏁版嵁椤�?"); + await authUserCancelAll({ roleId: roleId, userIds: uIds }); + await getList(); + proxy?.$modal.msgSuccess("鍙栨秷鎺堟潈鎴愬姛"); } onMounted(() => { - getList(); + getList(); }); </script> diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue index 33189cd..bcc893f 100644 --- a/src/views/system/role/index.vue +++ b/src/views/system/role/index.vue @@ -1,40 +1,42 @@ <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 ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> - <el-form-item label="瑙掕壊鍚嶇О" prop="roleName"> - <el-input v-model="queryParams.roleName" placeholder="璇疯緭鍏ヨ鑹插悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鏉冮檺瀛楃" prop="roleKey"> - <el-input v-model="queryParams.roleKey" 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"> - <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-date-picker - v-model="dateRange" - value-format="YYYY-MM-DD" - type="daterange" - range-separator="-" - start-placeholder="寮�濮嬫棩鏈�" - end-placeholder="缁撴潫鏃ユ湡" - :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" - ></el-date-picker> - </el-form-item> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> + <el-form-item label="瑙掕壊鍚嶇О" prop="roleName"> + <el-input v-model="queryParams.roleName" placeholder="璇疯緭鍏ヨ鑹插悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鏉冮檺瀛楃" prop="roleKey"> + <el-input v-model="queryParams.roleKey" 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"> + <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-date-picker + v-model="dateRange" + value-format="YYYY-MM-DD" + type="daterange" + range-separator="-" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" + ></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-form-item> - </el-form> + <el-form-item> + <el-button type="primary" @click="handleQuery" icon="Search">鎼滅储</el-button> + <el-button @click="resetQuery" icon="Refresh">閲嶇疆</el-button> + </el-form-item> + </el-form> + </el-card> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10"> <el-col :span="1.5"> @@ -119,7 +121,7 @@ <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 + dict.label }}</el-radio> </el-radio-group> </el-form-item> @@ -196,8 +198,6 @@ 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'; -import { ComponentInternalInstance } from 'vue'; -import { ElTree, ElForm, DateModelType } from 'element-plus'; const router = useRouter(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -221,54 +221,54 @@ /** 鏁版嵁鑼冨洿閫夐」*/ 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(ElForm); -const roleFormRef = ref(ElForm); -const dataScopeRef = ref(ElForm); -const menuRef = ref(ElTree); -const deptRef = ref(ElTree); +const queryFormRef = ref<ElFormInstance>(); +const roleFormRef = ref<ElFormInstance>(); +const dataScopeRef = ref<ElFormInstance>(); +const menuRef = ref<ElTreeInstance>(); +const deptRef = ref<ElTreeInstance>(); const initForm: RoleForm = { - roleId: undefined, - roleSort: 1, - status: '0', - roleName: '', - roleKey: '', - menuCheckStrictly: true, - deptCheckStrictly: true, - remark: '', - dataScope: '1', - menuIds: [], - deptIds: [], + roleId: undefined, + roleSort: 1, + status: '0', + roleName: '', + roleKey: '', + menuCheckStrictly: true, + deptCheckStrictly: true, + remark: '', + dataScope: '1', + menuIds: [], + deptIds: [], } const data = reactive<PageData<RoleForm, RoleQuery>>({ - form: {...initForm}, - queryParams: { - pageNum: 1, - pageSize: 10, - roleName: '', - roleKey: '', - status: '', - }, - rules: { - roleName: [{ required: true, message: "瑙掕壊鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }], - roleKey: [{ required: true, message: "鏉冮檺瀛楃涓嶈兘涓虹┖", trigger: "blur" }], - roleSort: [{ required: true, message: "瑙掕壊椤哄簭涓嶈兘涓虹┖", trigger: "blur" }] - } + form: { ...initForm }, + queryParams: { + pageNum: 1, + pageSize: 10, + roleName: '', + roleKey: '', + status: '', + }, + rules: { + 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 dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); @@ -276,233 +276,241 @@ * 鏌ヨ瑙掕壊鍒楄〃 */ 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 + }) } /** * 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); + queryParams.value.pageNum = 1; + getList(); } /** 閲嶇疆 */ const resetQuery = () => { - dateRange.value = ['', ''] - queryFormRef.value.resetFields(); - handleQuery(); + dateRange.value = ['', ''] + queryFormRef.value?.resetFields(); + handleQuery(); } /**鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: RoleVO) => { - const roleids = row?.roleId || ids.value; - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎瑙掕壊缂栧彿涓�' + roleids + '鏁版嵁椤圭洰'); - await delRole(roleids); - getList(); - proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); + const roleids = row?.roleId || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎瑙掕壊缂栧彿涓�' + roleids + '鏁版嵁椤圭洰'); + 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; + 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" ? "鍚敤" : "鍋滅敤"; - try { - await proxy?.$modal.confirm('纭瑕�"' + text + '""' + row.roleName + '"瑙掕壊鍚�?'); - await changeRoleStatus(row.roleId, row.status); - proxy?.$modal.msgSuccess(text + "鎴愬姛"); - } catch { - row.status = row.status === "0" ? "1" : "0"; - } + let text = row.status === "0" ? "鍚敤" : "鍋滅敤"; + try { + await proxy?.$modal.confirm('纭瑕�"' + text + '""' + row.roleName + '"瑙掕壊鍚�?'); + await changeRoleStatus(row.roleId, row.status); + proxy?.$modal.msgSuccess(text + "鎴愬姛"); + } catch { + 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 res = await menuTreeselect(); + menuOptions.value = res.data; } /** 鎵�鏈夐儴闂ㄨ妭鐐规暟鎹� */ -const getDeptAllCheckedKeys = () => { - // 鐩墠琚�変腑鐨勯儴闂ㄨ妭鐐� - let checkedKeys = deptRef.value.getCheckedKeys(); - // 鍗婇�変腑鐨勯儴闂ㄨ妭鐐� - let halfCheckedKeys = deptRef.value.getHalfCheckedKeys(); - checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys); - return checkedKeys +const getDeptAllCheckedKeys = (): any => { + // 鐩墠琚�変腑鐨勯儴闂ㄨ妭鐐� + let checkedKeys = deptRef.value?.getCheckedKeys(); + // 鍗婇�変腑鐨勯儴闂ㄨ妭鐐� + let halfCheckedKeys = deptRef.value?.getHalfCheckedKeys(); + if (halfCheckedKeys) { + checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys); + } + return checkedKeys } /** 閲嶇疆鏂板鐨勮〃鍗曚互鍙婂叾浠栨暟鎹� */ const reset = () => { - menuRef.value.setCheckedKeys([]); - menuExpand.value = false - menuNodeAll.value = false - deptExpand.value = true - deptNodeAll.value = false - form.value = { ...initForm }; - roleFormRef.value.resetFields(); + menuRef.value?.setCheckedKeys([]); + menuExpand.value = false + menuNodeAll.value = false + deptExpand.value = true + deptNodeAll.value = false + form.value = { ...initForm }; + roleFormRef.value?.resetFields(); } /** 娣诲姞瑙掕壊 */ const handleAdd = () => { - dialog.visible = true; - dialog.title = "娣诲姞瑙掕壊"; - nextTick(() => { - reset(); - getMenuTreeselect(); - }) + dialog.visible = true; + dialog.title = "娣诲姞瑙掕壊"; + nextTick(() => { + reset(); + getMenuTreeselect(); + }) } /** 淇敼瑙掕壊 */ const handleUpdate = async (row?: RoleVO) => { - const roleId = row?.roleId || ids.value[0] - const roleMenu = getRoleMenuTreeselect(roleId) - const { data } = await getRole(roleId); - dialog.visible = true; - dialog.title = "淇敼瑙掕壊"; - nextTick(() => { - reset(); - Object.assign(form.value, data); - form.value.roleSort = Number(form.value.roleSort); - nextTick(async () => { - const res = await roleMenu; - let checkedKeys = res.checkedKeys; - checkedKeys.forEach((v) => { - nextTick(() => { - menuRef.value.setChecked(v, true, false); - }) - }) + const roleId = row?.roleId || ids.value[0] + const roleMenu = getRoleMenuTreeselect(roleId) + const { data } = await getRole(roleId); + dialog.visible = true; + dialog.title = "淇敼瑙掕壊"; + await nextTick(() => { + reset(); + Object.assign(form.value, data); + form.value.roleSort = Number(form.value.roleSort); + nextTick(async () => { + const res = await roleMenu; + let checkedKeys = res.checkedKeys; + 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; - }) + 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 res = await deptTreeSelect(roleId); + deptOptions.value = res.data.depts; + return res.data; } /** 鏍戞潈闄愶紙灞曞紑/鎶樺彔锛�*/ -const handleCheckedTreeExpand = (value: any, type: string) => { - if (type == "menu") { - let treeList = menuOptions.value; - for (let i = 0; i < treeList.length; i++) { - menuRef.value.store.nodesMap[treeList[i].id].expanded = value; - } - } else if (type == "dept") { - let treeList = deptOptions.value; - for (let i = 0; i < treeList.length; i++) { - deptRef.value.store.nodesMap[treeList[i].id].expanded = value; - } +const handleCheckedTreeExpand = (value: boolean, type: string) => { + 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") { + let treeList = deptOptions.value; + for (let i = 0; i < treeList.length; i++) { + if (deptRef.value) { + deptRef.value.store.nodesMap[treeList[i].id].expanded = value; + } + } + } } /** 鏍戞潈闄愶紙鍏ㄩ��/鍏ㄤ笉閫夛級 */ const handleCheckedTreeNodeAll = (value: any, type: string) => { - if (type == "menu") { - menuRef.value.setCheckedNodes(value ? menuOptions.value : []); - } else if (type == "dept") { - deptRef.value.setCheckedNodes(value ? deptOptions.value : []); - } + 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") { - form.value.menuCheckStrictly = value; - } else if (type == "dept") { - form.value.deptCheckStrictly = value; - } + if (type == "menu") { + form.value.menuCheckStrictly = value; + } else if (type == "dept") { + form.value.deptCheckStrictly = value; + } } /** 鎵�鏈夎彍鍗曡妭鐐规暟鎹� */ -const getMenuAllCheckedKeys = () => { - // 鐩墠琚�変腑鐨勮彍鍗曡妭鐐� - let checkedKeys = menuRef.value.getCheckedKeys(); - // 鍗婇�変腑鐨勮彍鍗曡妭鐐� - let halfCheckedKeys = menuRef.value.getHalfCheckedKeys(); - checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys); - return checkedKeys; +const getMenuAllCheckedKeys = (): any => { + // 鐩墠琚�変腑鐨勮彍鍗曡妭鐐� + let checkedKeys = menuRef.value?.getCheckedKeys(); + // 鍗婇�変腑鐨勮彍鍗曡妭鐐� + let halfCheckedKeys = menuRef.value?.getHalfCheckedKeys(); + if (halfCheckedKeys) { + checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys); + } + return checkedKeys; } /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - roleFormRef.value.validate(async (valid: boolean) => { - if (valid) { - form.value.menuIds = getMenuAllCheckedKeys() - form.value.roleId ? await updateRole(form.value) : await addRole(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛") - dialog.visible = false - getList() - } - }) + roleFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + form.value.menuIds = getMenuAllCheckedKeys() + form.value.roleId ? await updateRole(form.value) : await addRole(form.value); + proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛") + dialog.visible = false + getList() + } + }) } /** 鍙栨秷鎸夐挳 */ const cancel = () => { - reset() - dialog.visible = false; + 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 roleDeptTreeselect = getRoleDeptTreeSelect(row.roleId); - const response = await getRole(row.roleId); - Object.assign(form.value, response.data); - openDataScope.value = true; - dialog.title = "鍒嗛厤鏁版嵁鏉冮檺"; - nextTick(async () => { - const res = await roleDeptTreeselect; - nextTick(() => { - if (deptRef.value) { - deptRef.value.setCheckedKeys(res.checkedKeys); - } - }) + const roleDeptTreeselect = getRoleDeptTreeSelect(row.roleId); + const response = await getRole(row.roleId); + Object.assign(form.value, response.data); + openDataScope.value = true; + dialog.title = "鍒嗛厤鏁版嵁鏉冮檺"; + await nextTick(async () => { + const res = await roleDeptTreeselect; + await nextTick(() => { + if (deptRef.value) { + deptRef.value.setCheckedKeys(res.checkedKeys); + } }) + }) } /** 鎻愪氦鎸夐挳锛堟暟鎹潈闄愶級 */ const submitDataScope = async () => { - if (form.value.roleId) { - form.value.deptIds = getDeptAllCheckedKeys(); - await dataScope(form.value); - proxy?.$modal.msgSuccess("淇敼鎴愬姛"); - openDataScope.value = false; - getList(); - } + if (form.value.roleId) { + form.value.deptIds = getDeptAllCheckedKeys(); + await dataScope(form.value); + proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + openDataScope.value = false; + getList(); + } } /** 鍙栨秷鎸夐挳锛堟暟鎹潈闄愶級*/ const cancelDataScope = () => { - dataScopeRef.value.resetFields(); - form.value = {...initForm}; - openDataScope.value = false; + dataScopeRef.value?.resetFields(); + form.value = { ...initForm }; + openDataScope.value = false; } onMounted(() => { - getList(); + getList(); }); </script> diff --git a/src/views/system/role/selectUser.vue b/src/views/system/role/selectUser.vue index 38c6a44..26b7ae2 100644 --- a/src/views/system/role/selectUser.vue +++ b/src/views/system/role/selectUser.vue @@ -47,14 +47,12 @@ import { authUserSelectAll, unallocatedUserList } from "@/api/system/role"; import { UserVO } from '@/api/system/user/types'; import { UserQuery } from '@/api/system/user/types'; -import { ComponentInternalInstance } from 'vue'; -import { ElForm, ElTable } from 'element-plus'; const props = defineProps({ - roleId: { - type: [Number, String] - } + roleId: { + type: [Number, String] + } }) const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -66,67 +64,68 @@ const userIds = ref<Array<string | number>>([]); const queryParams = reactive<UserQuery>({ - pageNum: 1, - pageSize: 10, - roleId: undefined, - userName: undefined, - phonenumber: undefined + pageNum: 1, + pageSize: 10, + roleId: undefined, + userName: undefined, + phonenumber: undefined }) -const tableRef = ref(ElTable); -const queryFormRef = ref(ElForm); +const tableRef = ref<ElTableInstance>(); +const queryFormRef = ref<ElFormInstance>(); const show = () => { - queryParams.roleId = props.roleId; - getList(); - visible.value = true; + queryParams.roleId = props.roleId; + getList(); + visible.value = true; } /** * 閫夋嫨琛� */ const clickRow = (row: any) => { - tableRef.value.toggleRowSelection(row); + // ele鐨刡ug + tableRef.value?.toggleRowSelection(row); } /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: UserVO[]) => { - userIds.value = selection.map((item: UserVO) => item.userId); + 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 res = await unallocatedUserList(queryParams); + userList.value = res.rows; + total.value = res.total; } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.pageNum = 1; - getList(); + queryParams.pageNum = 1; + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); - getList(); + queryFormRef.value?.resetFields(); + getList(); } const emit = defineEmits(["ok"]); /**閫夋嫨鎺堟潈鐢ㄦ埛鎿嶄綔 */ const handleSelectUser = async () => { - const roleId = queryParams.roleId; - const ids = userIds.value.join(','); - if (ids == "") { - proxy?.$modal.msgError('璇烽�夋嫨瑕佸垎閰嶇殑鐢ㄦ埛'); - return; - } - await authUserSelectAll({ roleId, userIds: ids }); - proxy?.$modal.msgSuccess('鍒嗛厤鎴愬姛'); - emit('ok'); - visible.value = false; + const roleId = queryParams.roleId; + const ids = userIds.value.join(','); + if (ids == "") { + proxy?.$modal.msgError('璇烽�夋嫨瑕佸垎閰嶇殑鐢ㄦ埛'); + return; + } + await authUserSelectAll({ roleId, userIds: ids }); + 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 277a9ce..711ee7f 100644 --- a/src/views/system/tenant/index.vue +++ b/src/views/system/tenant/index.vue @@ -1,29 +1,31 @@ <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="68px"> - <el-form-item label="绉熸埛缂栧彿" prop="tenantId"> - <el-input v-model="queryParams.tenantId" placeholder="璇疯緭鍏ョ鎴风紪鍙�" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鑱旂郴浜�" prop="contactUserName"> - <el-input v-model="queryParams.contactUserName" placeholder="璇疯緭鍏ヨ仈绯讳汉" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鑱旂郴鐢佃瘽" prop="contactPhone"> - <el-input v-model="queryParams.contactPhone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="浼佷笟鍚嶇О" prop="companyName"> - <el-input v-model="queryParams.companyName" placeholder="璇疯緭鍏ヤ紒涓氬悕绉�" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form-item label="绉熸埛缂栧彿" prop="tenantId"> + <el-input v-model="queryParams.tenantId" placeholder="璇疯緭鍏ョ鎴风紪鍙�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鑱旂郴浜�" prop="contactUserName"> + <el-input v-model="queryParams.contactUserName" placeholder="璇疯緭鍏ヨ仈绯讳汉" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鑱旂郴鐢佃瘽" prop="contactPhone"> + <el-input v-model="queryParams.contactPhone" placeholder="璇疯緭鍏ヨ仈绯荤數璇�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="浼佷笟鍚嶇О" prop="companyName"> + <el-input v-model="queryParams.companyName" placeholder="璇疯緭鍏ヤ紒涓氬悕绉�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -80,7 +82,7 @@ </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" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀圭鎴峰璇濇 --> <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> @@ -143,8 +145,6 @@ import { selectTenantPackage } from '@/api/system/tenantPackage'; import { TenantForm, TenantQuery, TenantVO } from '@/api/system/tenant/types'; import { TenantPkgVO } from '@/api/system/tenantPackage/types'; -import { ComponentInternalInstance } from 'vue'; -import { ElForm } from 'element-plus'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -158,196 +158,196 @@ const multiple = ref(true); const total = ref(0); -const queryFormRef = ref(ElForm); -const tenantFormRef = ref(ElForm); +const queryFormRef = ref<ElFormInstance>(); +const tenantFormRef = ref<ElFormInstance>(); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); const initFormData: TenantForm = { - id: undefined, - tenantId: undefined, - contactUserName: '', - contactPhone: '', - username: '', - password: '', - companyName: '', - licenseNumber: '', - domain: '', - address: '', - intro: '', - remark: '', - packageId: '', - expireTime: '', - accountCount: 0, - status: '0', + id: undefined, + tenantId: undefined, + contactUserName: '', + contactPhone: '', + username: '', + password: '', + companyName: '', + licenseNumber: '', + domain: '', + address: '', + intro: '', + remark: '', + packageId: '', + expireTime: '', + accountCount: 0, + status: '0', } const data = reactive<PageData<TenantForm, TenantQuery>>({ - form: {...initFormData}, - queryParams: { - pageNum: 1, - pageSize: 10, - tenantId: '', - contactUserName: '', - contactPhone: '', - 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" }], - username: [ - { required: true, message: "鐢ㄦ埛鍚嶄笉鑳戒负绌�", trigger: "blur" }, - { min: 2, max: 20, message: '鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿', trigger: 'blur' } - ], - password: [ - { required: true, message: "瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, - { min: 5, max: 20, message: '鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿', trigger: 'blur' } - ] - } + form: { ...initFormData }, + queryParams: { + pageNum: 1, + pageSize: 10, + tenantId: '', + contactUserName: '', + contactPhone: '', + 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" }], + username: [ + { required: true, message: "鐢ㄦ埛鍚嶄笉鑳戒负绌�", trigger: "blur" }, + { min: 2, max: 20, message: '鐢ㄦ埛鍚嶇О闀垮害蹇呴』浠嬩簬 2 鍜� 20 涔嬮棿', trigger: 'blur' } + ], + password: [ + { required: true, message: "瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, + { min: 5, max: 20, message: '鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿', trigger: 'blur' } + ] + } }); const { queryParams, form, rules } = toRefs(data); /** 鏌ヨ鎵�鏈夌鎴峰椁� */ const getTenantPackage = async () => { - const res = await selectTenantPackage() - packageList.value = res.data; + const res = await selectTenantPackage() + packageList.value = res.data; } /** 鏌ヨ绉熸埛鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await listTenant(queryParams.value); - tenantList.value = res.rows; - total.value = res.total; - loading.value = false; + loading.value = true; + const res = await listTenant(queryParams.value); + tenantList.value = res.rows; + total.value = res.total; + loading.value = false; } // 绉熸埛濂楅鐘舵�佷慨鏀� const handleStatusChange = async (row: TenantVO) => { - 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 + "鎴愬姛"); - } catch { - row.status = row.status === "0" ? "1" : "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 + "鎴愬姛"); + } catch { + row.status = row.status === "0" ? "1" : "0"; + } } // 鍙栨秷鎸夐挳 const cancel = () => { - reset(); - dialog.visible = false; + reset(); + dialog.visible = false; } // 琛ㄥ崟閲嶇疆 const reset = () => { - form.value = {...initFormData}; - tenantFormRef.value.resetFields(); + form.value = { ...initFormData }; + tenantFormRef.value?.resetFields(); } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); + queryParams.value.pageNum = 1; + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); - handleQuery(); + queryFormRef.value?.resetFields(); + handleQuery(); } // 澶氶�夋閫変腑鏁版嵁 const handleSelectionChange = (selection: TenantVO[]) => { - ids.value = selection.map(item => item.id); - single.value = selection.length != 1; - multiple.value = !selection.length; + ids.value = selection.map(item => item.id); + single.value = selection.length != 1; + multiple.value = !selection.length; } /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { - dialog.visible = true; - dialog.title = "娣诲姞绉熸埛"; - nextTick(() => { - reset(); - getTenantPackage(); - }) + dialog.visible = true; + dialog.title = "娣诲姞绉熸埛"; + nextTick(() => { + reset(); + getTenantPackage(); + }) } /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = (row?: TenantVO) => { - loading.value = true; - dialog.visible = true; - dialog.title = "淇敼绉熸埛"; - nextTick(async () => { - reset(); - getTenantPackage(); - const _id = row?.id || ids.value[0]; - const res = await getTenant(_id); - loading.value = false; - Object.assign(form.value, res.data) - }) + loading.value = true; + dialog.visible = true; + dialog.title = "淇敼绉熸埛"; + nextTick(async () => { + reset(); + await getTenantPackage(); + const _id = row?.id || ids.value[0]; + const res = await getTenant(_id); + loading.value = false; + Object.assign(form.value, res.data) + }) } /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - tenantFormRef.value.validate(async (valid: boolean) => { - if (valid) { - buttonLoading.value = true; - if (form.value.id) { - await updateTenant(form.value).finally(() => buttonLoading.value = false); - } else { - await addTenant(form.value).finally(() => buttonLoading.value = false); - } - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); - dialog.visible = false; - getList(); - } - }); + tenantFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + buttonLoading.value = true; + if (form.value.id) { + await updateTenant(form.value).finally(() => buttonLoading.value = false); + } else { + await addTenant(form.value).finally(() => buttonLoading.value = false); + } + proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + dialog.visible = false; + getList(); + } + }); } /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: TenantVO) => { - const _ids = row?.id || ids.value; - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎绉熸埛缂栧彿涓�"' + _ids + '"鐨勬暟鎹」锛�') - loading.value = true; - await delTenant(_ids).finally(() => loading.value = false); - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + const _ids = row?.id || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎绉熸埛缂栧彿涓�"' + _ids + '"鐨勬暟鎹」锛�') + loading.value = true; + await delTenant(_ids).finally(() => loading.value = false); + await getList(); + proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); } /** 鍚屾绉熸埛濂楅鎸夐挳鎿嶄綔 */ const handleSyncTenantPackage = async (row: TenantVO) => { - try { - await proxy?.$modal.confirm('鏄惁纭鍚屾绉熸埛濂楅绉熸埛缂栧彿涓�"' + row.tenantId + '"鐨勬暟鎹」锛�'); - loading.value = true; - await syncTenantPackage(row.tenantId, row.packageId); - getList(); - proxy?.$modal.msgSuccess("鍚屾鎴愬姛"); - } catch {return} finally { - loading.value = false; - } + try { + await proxy?.$modal.confirm('鏄惁纭鍚屾绉熸埛濂楅绉熸埛缂栧彿涓�"' + row.tenantId + '"鐨勬暟鎹」锛�'); + loading.value = true; + await syncTenantPackage(row.tenantId, row.packageId); + await getList(); + 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(); + getList(); }) </script> diff --git a/src/views/system/tenantPackage/index.vue b/src/views/system/tenantPackage/index.vue index ca06734..add2eb5 100644 --- a/src/views/system/tenantPackage/index.vue +++ b/src/views/system/tenantPackage/index.vue @@ -1,37 +1,39 @@ <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="68px"> - <el-form-item label="濂楅鍚嶇О" prop="packageName"> - <el-input v-model="queryParams.packageName" placeholder="璇疯緭鍏ュ椁愬悕绉�" clearable @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form-item label="濂楅鍚嶇О" prop="packageName"> + <el-input v-model="queryParams.packageName" placeholder="璇疯緭鍏ュ椁愬悕绉�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <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 type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:tenantPackage:add']"> 鏂板 </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 - > + <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['system:tenantPackage:edit']"> + 淇敼 + </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 - > + <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['system:tenantPackage:remove']"> + 鍒犻櫎 + </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 type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['system:tenantPackage:export']">瀵煎嚭 </el-button> </el-col> <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> </el-row> @@ -53,13 +55,13 @@ <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['system:tenantPackage:edit']"></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 link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['system:tenantPackage:remove']"></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" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> </el-card> <!-- 娣诲姞鎴栦慨鏀圭鎴峰椁愬璇濇 --> @@ -70,8 +72,8 @@ </el-form-item> <el-form-item label="鍏宠仈鑿滃崟"> <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">灞曞紑/鎶樺彔</el-checkbox> - <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">鍏ㄩ��/鍏ㄤ笉閫�</el-checkbox> - <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">鐖跺瓙鑱斿姩</el-checkbox> + <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 class="tree-border" :data="menuOptions" @@ -98,12 +100,17 @@ </template> <script setup name="TenantPackage" lang="ts"> -import { listTenantPackage, getTenantPackage, delTenantPackage, addTenantPackage, updateTenantPackage, changePackageStatus } from "@/api/system/tenantPackage"; +import { + listTenantPackage, + getTenantPackage, + delTenantPackage, + addTenantPackage, + updateTenantPackage, + changePackageStatus +} from "@/api/system/tenantPackage"; import { treeselect as menuTreeselect, tenantPackageMenuTreeselect } from "@/api/system/menu"; -import { ComponentInternalInstance } from "vue"; import { TenantPkgForm, TenantPkgQuery, TenantPkgVO } from "@/api/system/tenantPackage/types"; import { MenuTreeOption } from "@/api/system/menu/types"; -import { CheckboxValueType, ElTree, ElForm } from 'element-plus'; import to from "await-to-js"; const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -120,212 +127,216 @@ const menuNodeAll = ref(false); const menuOptions = ref<MenuTreeOption[]>([]); -const menuTreeRef = ref(ElTree); -const queryFormRef = ref(ElForm); -const tenantPackageFormRef = ref(ElForm); +const menuTreeRef = ref<ElTreeInstance>(); +const queryFormRef = ref<ElFormInstance>(); +const tenantPackageFormRef = ref<ElFormInstance>(); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: "" }); const initFormData: TenantPkgForm = { - packageId: undefined, - packageName: '', - menuIds: '', - remark: '', - menuCheckStrictly: true + packageId: undefined, + packageName: "", + menuIds: "", + remark: "", + menuCheckStrictly: true }; const data = reactive<PageData<TenantPkgForm, TenantPkgQuery>>({ - form: {...initFormData}, - queryParams: { - pageNum: 1, - pageSize: 10, - packageName: '' - }, - rules: { - packageId: [{ required: true, message: "绉熸埛濂楅id涓嶈兘涓虹┖", trigger: "blur" }], - packageName: [{ required: true, message: "濂楅鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }] - } + form: { ...initFormData }, + queryParams: { + pageNum: 1, + pageSize: 10, + packageName: "" + }, + rules: { + packageId: [{ required: true, message: "绉熸埛濂楅id涓嶈兘涓虹┖", trigger: "blur" }], + packageName: [{ required: true, message: "濂楅鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }] + } }); const { queryParams, form, rules } = toRefs(data); /** 鏌ヨ鑿滃崟鏍戠粨鏋� */ -const getMenuTreeselect = async() => { - const { data } = await menuTreeselect(); - menuOptions.value = data; -} +const getMenuTreeselect = async () => { + const { data } = await menuTreeselect(); + menuOptions.value = data; +}; // 鎵�鏈夎彍鍗曡妭鐐规暟鎹� -const getMenuAllCheckedKeys = () => { - // 鐩墠琚�変腑鐨勮彍鍗曡妭鐐� - let checkedKeys = menuTreeRef.value.getCheckedKeys(); - // 鍗婇�変腑鐨勮彍鍗曡妭鐐� - let halfCheckedKeys = menuTreeRef.value.getHalfCheckedKeys(); - checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys); - return checkedKeys; -} +const getMenuAllCheckedKeys = (): any => { + // 鐩墠琚�変腑鐨勮彍鍗曡妭鐐� + let checkedKeys = menuTreeRef.value?.getCheckedKeys(); + // 鍗婇�変腑鐨勮彍鍗曡妭鐐� + let halfCheckedKeys = menuTreeRef.value?.getHalfCheckedKeys(); + if (halfCheckedKeys) { + checkedKeys?.unshift.apply(checkedKeys, halfCheckedKeys); + } + return checkedKeys; +}; /** 鏍规嵁绉熸埛濂楅ID鏌ヨ鑿滃崟鏍戠粨鏋� */ -const getPackageMenuTreeselect = async(packageId: string | number) => { - const res = await tenantPackageMenuTreeselect(packageId); - menuOptions.value = res.data.menus; - return Promise.resolve(res); -} +const getPackageMenuTreeselect = async (packageId: string | number) => { + const res = await tenantPackageMenuTreeselect(packageId); + menuOptions.value = res.data.menus; + return Promise.resolve(res); +}; /** 鏌ヨ绉熸埛濂楅鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await listTenantPackage(queryParams.value); - tenantPackageList.value = res.rows; - total.value = res.total; - loading.value = false; -} + loading.value = true; + const res = await listTenantPackage(queryParams.value); + tenantPackageList.value = res.rows; + total.value = res.total; + loading.value = false; +}; // 绉熸埛濂楅鐘舵�佷慨鏀� const handleStatusChange = async (row: TenantPkgVO) => { - 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"; - } else { - await changePackageStatus(row.packageId, row.status); - proxy?.$modal.msgSuccess(text + "鎴愬姛"); - } -} + 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"; + } else { + await changePackageStatus(row.packageId, row.status); + proxy?.$modal.msgSuccess(text + "鎴愬姛"); + } +}; // 鍙栨秷鎸夐挳 const cancel = () => { - reset(); - dialog.visible = false; -} + reset(); + dialog.visible = false; +}; // 琛ㄥ崟閲嶇疆 const reset = () => { - menuTreeRef.value.setCheckedKeys([]); - menuExpand.value = false; - menuNodeAll.value = false; - form.value = {...initFormData}; - tenantPackageFormRef.value.resetFields(); -} + menuTreeRef.value?.setCheckedKeys([]); + menuExpand.value = false; + menuNodeAll.value = false; + form.value = { ...initFormData }; + tenantPackageFormRef.value?.resetFields(); +}; /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); -} + queryParams.value.pageNum = 1; + getList(); +}; /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); - handleQuery(); -} + queryFormRef.value?.resetFields(); + handleQuery(); +}; // 澶氶�夋閫変腑鏁版嵁 const handleSelectionChange = (selection: TenantPkgVO[]) => { - ids.value = selection.map(item => item.packageId); - single.value = selection.length != 1; - multiple.value = !selection.length; -} + 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') { - let treeList = menuOptions.value; - for (let i = 0; i < treeList.length; i++) { - menuTreeRef.value.store.nodesMap[treeList[i].id].expanded = value; - } + if (type == "menu") { + let treeList = menuOptions.value; + for (let i = 0; i < treeList.length; i++) { + if (menuTreeRef.value) { + menuTreeRef.value.store.nodesMap[treeList[i].id].expanded = value as boolean; + } } -} + } +}; // 鏍戞潈闄愶紙鍏ㄩ��/鍏ㄤ笉閫夛級 const handleCheckedTreeNodeAll = (value: CheckboxValueType, type: string) => { - if (type == 'menu') { - menuTreeRef.value.setCheckedNodes(value ? menuOptions.value: []); - } -} + if (type == "menu") { + menuTreeRef.value?.setCheckedNodes(value ? menuOptions.value as any : []); + } +}; // 鏍戞潈闄愶紙鐖跺瓙鑱斿姩锛� const handleCheckedTreeConnect = (value: CheckboxValueType, type: string) => { - if (type == 'menu') { - form.value.menuCheckStrictly = value as boolean; - } -} + if (type == "menu") { + form.value.menuCheckStrictly = value as boolean; + } +}; /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { - dialog.visible = true; - dialog.title = "娣诲姞绉熸埛濂楅"; - nextTick(() => { - reset(); - getMenuTreeselect(); - }) -} + dialog.visible = true; + dialog.title = "娣诲姞绉熸埛濂楅"; + nextTick(() => { + reset(); + getMenuTreeselect(); + }); +}; /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = (row?: TenantPkgVO) => { - loading.value = true - dialog.visible = true; - dialog.title = "淇敼绉熸埛濂楅"; - nextTick(async () => { - reset(); - const _packageId = row?.packageId || ids.value[0]; - const packageMenu = getPackageMenuTreeselect(_packageId); - const response = await getTenantPackage(_packageId); - loading.value = false; - form.value = response.data; - nextTick(async () => { - const res = await packageMenu; - let checkedKeys = res.data.checkedKeys - checkedKeys.forEach((v) => { - nextTick(() => { - menuTreeRef.value.setChecked(v, true ,false); - }) - }) + loading.value = true; + dialog.visible = true; + dialog.title = "淇敼绉熸埛濂楅"; + nextTick(async () => { + reset(); + const _packageId = row?.packageId || ids.value[0]; + const packageMenu = getPackageMenuTreeselect(_packageId); + const response = await getTenantPackage(_packageId); + loading.value = false; + form.value = response.data; + await nextTick(async () => { + const res = await packageMenu; + let checkedKeys = res.data.checkedKeys; + checkedKeys.forEach((v) => { + nextTick(() => { + menuTreeRef.value?.setChecked(v, true, false); }); - }) -} + }); + }); + }); +}; /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - tenantPackageFormRef.value.validate(async (valid: boolean) => { - if (valid) { - buttonLoading.value = true; - form.value.menuIds = getMenuAllCheckedKeys(); - if (form.value.packageId != null) { - await updateTenantPackage(form.value).finally(() => buttonLoading.value = false); - } else { - await addTenantPackage(form.value).finally(() => buttonLoading.value = false); - } - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); - dialog.visible = false; - getList(); - } - }); -} + tenantPackageFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + buttonLoading.value = true; + form.value.menuIds = getMenuAllCheckedKeys(); + if (form.value.packageId != null) { + await updateTenantPackage(form.value).finally(() => buttonLoading.value = false); + } else { + await addTenantPackage(form.value).finally(() => buttonLoading.value = false); + } + proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + dialog.visible = false; + await getList(); + } + }); +}; /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: TenantPkgVO) => { - const _packageIds = row?.packageId || ids.value; - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎绉熸埛濂楅缂栧彿涓�"' + _packageIds + '"鐨勬暟鎹」锛�').finally(() => { - loading.value = false; - }); - await delTenantPackage(_packageIds); - loading.value = true; - getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); -} + const _packageIds = row?.packageId || ids.value; + await proxy?.$modal.confirm("鏄惁纭鍒犻櫎绉熸埛濂楅缂栧彿涓篭"" + _packageIds + "\"鐨勬暟鎹」锛�").finally(() => { + loading.value = false; + }); + await delTenantPackage(_packageIds); + loading.value = true; + await getList(); + 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(() => { - getList(); -}) + getList(); +}); </script> diff --git a/src/views/system/user/authRole.vue b/src/views/system/user/authRole.vue index 0e8eba2..e55a8d8 100644 --- a/src/views/system/user/authRole.vue +++ b/src/views/system/user/authRole.vue @@ -55,11 +55,10 @@ </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 { ElTable } from "element-plus"; -import { ComponentInternalInstance } from 'vue'; +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,58 +69,59 @@ const roleIds = ref<Array<string | number>>([]); const roles = ref<RoleVO[]>([]); const form = ref<Partial<UserForm>>({ - nickName: undefined, - userName: '', - userId: undefined + nickName: undefined, + userName: "", + userId: undefined }); -const tableRef = ref(ElTable) +const tableRef = ref<ElTableInstance>(); /** 鍗曞嚮閫変腑琛屾暟鎹� */ const clickRow = (row: RoleVO) => { - tableRef.value.toggleRowSelection(row); + // ele鐨勬柟娉曟湁闂锛宻elected搴旇涓哄彲閫夊弬鏁� + tableRef.value?.toggleRowSelection(row); }; /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: RoleVO[]) => { - roleIds.value = selection.map(item => item.roleId); + roleIds.value = selection.map(item => item.roleId); }; /** 淇濆瓨閫変腑鐨勬暟鎹紪鍙� */ const getRowKey = (row: RoleVO): string => { - return String(row.roleId); + return String(row.roleId); }; /** 鍏抽棴鎸夐挳 */ const close = () => { - const obj = { path: "/system/user" }; - proxy?.$tab.closeOpenPage(obj); + const obj = { path: "/system/user" }; + proxy?.$tab.closeOpenPage(obj); }; /** 鎻愪氦鎸夐挳 */ const submitForm = async () => { - const userId = form.value.userId; - const rIds = roleIds.value.join(","); - await updateAuthRole({ userId: userId as string, roleIds: rIds }) - proxy?.$modal.msgSuccess("鎺堟潈鎴愬姛"); - close(); + const userId = form.value.userId; + const rIds = roleIds.value.join(","); + await updateAuthRole({ userId: userId as string, roleIds: rIds }); + proxy?.$modal.msgSuccess("鎺堟潈鎴愬姛"); + close(); }; -const getList = async() => { - const userId = route.params && route.params.userId; - if (userId) { - loading.value = true; - const res = await getAuthRole(userId as string); - Object.assign(form.value, res.data.user) - Object.assign(roles.value, res.data.roles) - total.value = roles.value.length; - await nextTick(() => { - roles.value.forEach(row => { - if (row?.flag) { - tableRef.value.toggleRowSelection(row); - } - }); - }); - loading.value = false; - } -} +const getList = async () => { + const userId = route.params && route.params.userId; + if (userId) { + loading.value = true; + const res = await getAuthRole(userId as string); + Object.assign(form.value, res.data.user); + Object.assign(roles.value, res.data.roles); + total.value = roles.value.length; + await nextTick(() => { + roles.value.forEach(row => { + if (row?.flag) { + tableRef.value?.toggleRowSelection(row, true); + } + }); + }); + loading.value = false; + } +}; onMounted(() => { - getList(); -}) + getList(); +}); </script> diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue index bf5a3d3..8e3bcfa 100644 --- a/src/views/system/user/index.vue +++ b/src/views/system/user/index.vue @@ -16,40 +16,48 @@ highlight-current default-expand-all @node-click="handleNodeClick" - ></el-tree> + /> </el-card> </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="search" v-show="showSearch"> - <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> - <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName"> - <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber"> - <el-input v-model="queryParams.phonenumber" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" clearable style="width: 240px" @keyup.enter="handleQuery" /> - </el-form-item> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true" label-width="68px"> + <el-form-item label="鐢ㄦ埛鍚嶇О" prop="userName"> + <el-input v-model="queryParams.userName" placeholder="璇疯緭鍏ョ敤鎴峰悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鎵嬫満鍙风爜" prop="phonenumber"> + <el-input + v-model="queryParams.phonenumber" + 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"> - <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-date-picker - v-model="dateRange" - value-format="YYYY-MM-DD" - type="daterange" - range-separator="-" - start-placeholder="寮�濮嬫棩鏈�" - end-placeholder="缁撴潫鏃ユ湡" - ></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-form-item> - </el-form> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="queryParams.status" placeholder="鐢ㄦ埛鐘舵��" clearable style="width: 240px"> + <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-date-picker + v-model="dateRange" + value-format="YYYY-MM-DD" + type="daterange" + range-separator="-" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + ></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-form-item> + </el-form> + </el-card> </div> </transition> @@ -203,7 +211,7 @@ <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> + dict.label }}</el-radio> </el-radio-group> </el-form-item> </el-col> @@ -289,29 +297,18 @@ </template> <script setup name="User" lang="ts"> -import { - changeUserStatus, - listUser, - resetUserPwd, - delUser, - getUser, - updateUser, - addUser, - deptTreeSelect -} from "@/api/system/user" +import api from "@/api/system/user" import { UserForm, UserQuery, UserVO } from '@/api/system/user/types'; -import { ComponentInternalInstance } from "vue"; import { getToken } from "@/utils/auth"; 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 { DateModelType, ElTree, ElUpload, UploadFile, ElForm } from 'element-plus'; import { to } from "await-to-js"; + const router = useRouter(); 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); @@ -320,7 +317,7 @@ const single = ref(true); const multiple = ref(true); const total = ref(0); -const dateRange = ref<[DateModelType, DateModelType]>(['','']); +const dateRange = ref<[DateModelType, DateModelType]>(['', '']); const deptName = ref(''); const deptOptions = ref<DeptVO[]>([]); const initPassword = ref('123456'); @@ -328,274 +325,274 @@ const roleOptions = ref<RoleVO[]>([]); /*** 鐢ㄦ埛瀵煎叆鍙傛暟 */ const upload = reactive<ImportOption>({ - // 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛� - open: false, - // 寮瑰嚭灞傛爣棰橈紙鐢ㄦ埛瀵煎叆锛� - title: "", - // 鏄惁绂佺敤涓婁紶 - isUploading: false, - // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹� - updateSupport: 0, - // 璁剧疆涓婁紶鐨勮姹傚ご閮� - headers: { Authorization: "Bearer " + getToken() }, - // 涓婁紶鐨勫湴鍧� - url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData" + // 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛� + open: false, + // 寮瑰嚭灞傛爣棰橈紙鐢ㄦ埛瀵煎叆锛� + title: "", + // 鏄惁绂佺敤涓婁紶 + isUploading: false, + // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹� + updateSupport: 0, + // 璁剧疆涓婁紶鐨勮姹傚ご閮� + headers: { Authorization: "Bearer " + getToken() }, + // 涓婁紶鐨勫湴鍧� + url: import.meta.env.VITE_APP_BASE_API + "/system/user/importData" }) // 鍒楁樉闅愪俊鎭� const columns = ref<FieldOption[]>([ - { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: false }, - { key: 1, label: `鐢ㄦ埛鍚嶇О`, visible: true }, - { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true }, - { key: 3, label: `閮ㄩ棬`, visible: true }, - { key: 4, label: `鎵嬫満鍙风爜`, visible: true }, - { key: 5, label: `鐘舵�乣, visible: true }, - { key: 6, label: `鍒涘缓鏃堕棿`, visible: true } + { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: false }, + { key: 1, label: `鐢ㄦ埛鍚嶇О`, visible: true }, + { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true }, + { key: 3, label: `閮ㄩ棬`, visible: true }, + { key: 4, label: `鎵嬫満鍙风爜`, visible: true }, + { key: 5, label: `鐘舵�乣, visible: true }, + { key: 6, label: `鍒涘缓鏃堕棿`, visible: true } ]) -const deptTreeRef = ref(ElTree); -const queryFormRef = ref(ElForm); -const userFormRef = ref(ElForm); -const uploadRef = ref(ElUpload); +const deptTreeRef = ref<ElTreeInstance>(); +const queryFormRef = ref<ElFormInstance>(); +const userFormRef = ref<ElFormInstance>(); +const uploadRef = ref<ElUploadInstance>(); const dialog = reactive<DialogOption>({ - visible: false, - title: '' + visible: false, + title: '' }); const initFormData: UserForm = { - userId: undefined, - deptId: undefined, - userName: '', - nickName: undefined, - password: '', - phonenumber: undefined, - email: undefined, - sex: undefined, - status: "0", - remark: '', - postIds: [], - roleIds: [] + userId: undefined, + deptId: undefined, + userName: '', + nickName: undefined, + password: '', + phonenumber: undefined, + email: undefined, + sex: undefined, + status: "0", + remark: '', + postIds: [], + roleIds: [] } const data = reactive<PageData<UserForm, UserQuery>>({ - form: { ...initFormData }, - queryParams: { - pageNum: 1, - pageSize: 10, - userName: '', - phonenumber: '', - status: '', - 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" }] - } + form: { ...initFormData }, + queryParams: { + pageNum: 1, + pageSize: 10, + userName: '', + phonenumber: '', + status: '', + 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" }] + } }) 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);}, - { - flush: 'post' // watchEffect浼氬湪DOM鎸傝浇鎴栬�呮洿鏂颁箣鍓嶅氨浼氳Е鍙戯紝姝ゅ睘鎬ф帶鍒跺湪DOM鍏冪礌鏇存柊鍚庤繍琛� - } + () => { deptTreeRef.value?.filter(deptName.value); }, + { + flush: 'post' // watchEffect浼氬湪DOM鎸傝浇鎴栬�呮洿鏂颁箣鍓嶅氨浼氳Е鍙戯紝姝ゅ睘鎬ф帶鍒跺湪DOM鍏冪礌鏇存柊鍚庤繍琛� + } ); /** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */ const getTreeSelect = async () => { - const res = await deptTreeSelect(); - deptOptions.value = res.data; + const res = await api.deptTreeSelect(); + deptOptions.value = res.data; }; /** 鏌ヨ鐢ㄦ埛鍒楄〃 */ const getList = async () => { - loading.value = true; - const res = await listUser(proxy?.addDateRange(queryParams.value, dateRange.value)); - loading.value = false; - userList.value = res.rows; - total.value = res.total; + loading.value = true; + const res = await api.listUser(proxy?.addDateRange(queryParams.value, dateRange.value)); + loading.value = false; + userList.value = res.rows; + total.value = res.total; } /** 鑺傜偣鍗曞嚮浜嬩欢 */ const handleNodeClick = (data: DeptVO) => { - queryParams.value.deptId = data.id; - handleQuery() + queryParams.value.deptId = data.id; + handleQuery() } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1 - getList() + queryParams.value.pageNum = 1 + getList() } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - dateRange.value = ['',''] - queryFormRef.value.resetFields(); - queryParams.value.pageNum = 1; - queryParams.value.deptId = undefined; - deptTreeRef.value.setCurrentKey(null); - handleQuery(); + dateRange.value = ['', ''] + queryFormRef.value?.resetFields(); + queryParams.value.pageNum = 1; + queryParams.value.deptId = undefined; + deptTreeRef.value?.setCurrentKey(undefined); + handleQuery(); } /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: UserVO) => { - const userIds = row?.userId || ids.value; - const [err] = await to(proxy?.$modal.confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�') as any); - if (!err) { - await delUser(userIds); - await getList(); - proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); - } + const userIds = row?.userId || ids.value; + const [err] = await to(proxy?.$modal.confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�') as any); + if (!err) { + await api.delUser(userIds); + await getList(); + proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + } } /** 鐢ㄦ埛鐘舵�佷慨鏀� */ const handleStatusChange = async (row: UserVO) => { - let text = row.status === "0" ? "鍚敤" : "鍋滅敤" - try { - await proxy?.$modal.confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚�?'); - await changeUserStatus(row.userId, row.status); - proxy?.$modal.msgSuccess(text + "鎴愬姛"); - } catch (err) { - row.status = row.status === "0" ? "1" : "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 + "鎴愬姛"); + } catch (err) { + row.status = row.status === "0" ? "1" : "0"; + } } /** 璺宠浆瑙掕壊鍒嗛厤 */ const handleAuthRole = (row: UserVO) => { - const userId = row.userId; - router.push("/system/user-auth/role/" + userId); + const userId = row.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 涔嬮棿", - })) - if (!err) { - await resetUserPwd(row.userId, res.value); - proxy?.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + res.value); - } + 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); + } } /** 閫夋嫨鏉℃暟 */ const handleSelectionChange = (selection: UserVO[]) => { - ids.value = selection.map((item) => item.userId); - single.value = selection.length != 1; - multiple.value = !selection.length; + ids.value = selection.map((item) => item.userId); + single.value = selection.length != 1; + multiple.value = !selection.length; } /** 瀵煎叆鎸夐挳鎿嶄綔 */ const handleImport = () => { - upload.title = "鐢ㄦ埛瀵煎叆"; - upload.open = true; + 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; + 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 }); - getList(); + 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 }); + getList(); } /** 鎻愪氦涓婁紶鏂囦欢 */ function submitFileForm() { - uploadRef.value.submit(); + uploadRef.value?.submit(); } /** 鍒濆鍖栭儴闂ㄦ暟鎹� */ const initTreeData = async () => { - // 鍒ゆ柇閮ㄩ棬鐨勬暟鎹槸鍚﹀瓨鍦紝瀛樺湪涓嶈幏鍙栵紝涓嶅瓨鍦ㄥ垯鑾峰彇 - if (deptOptions.value === undefined) { - const { data } = await treeselect(); - deptOptions.value = data; - } + // 鍒ゆ柇閮ㄩ棬鐨勬暟鎹槸鍚﹀瓨鍦紝瀛樺湪涓嶈幏鍙栵紝涓嶅瓨鍦ㄥ垯鑾峰彇 + if (deptOptions.value === undefined) { + const { data } = await treeselect(); + deptOptions.value = data; + } } /** 閲嶇疆鎿嶄綔琛ㄥ崟 */ const reset = () => { - form.value = { ...initFormData }; - userFormRef.value.resetFields(); + form.value = { ...initFormData }; + userFormRef.value?.resetFields(); } /** 鍙栨秷鎸夐挳 */ const cancel = () => { - reset(); - dialog.visible = false; + reset(); + dialog.visible = false; } /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { - dialog.visible = true; - dialog.title = "鏂板鐢ㄦ埛"; - nextTick(async () => { - reset(); - await initTreeData(); - const { data } = await getUser(); - postOptions.value = data.posts; - roleOptions.value = data.roles; - form.value.password = initPassword.value; - }) + dialog.visible = true; + dialog.title = "鏂板鐢ㄦ埛"; + nextTick(async () => { + reset(); + await initTreeData(); + const { data } = await api.getUser(); + postOptions.value = data.posts; + roleOptions.value = data.roles; + form.value.password = initPassword.value; + }) } /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = (row?: UserForm) => { - dialog.visible = true; - dialog.title = "淇敼鐢ㄦ埛"; - nextTick(async () => { - reset(); - await initTreeData(); - const userId = row?.userId || ids.value[0] - const { data } = await getUser(userId) - 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 = ""; - }) + dialog.visible = true; + dialog.title = "淇敼鐢ㄦ埛"; + nextTick(async () => { + reset(); + await initTreeData(); + const userId = row?.userId || ids.value[0] + const { data } = await api.getUser(userId) + 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 = ""; + }) } /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - userFormRef.value.validate(async (valid: boolean) => { - if (valid) { - form.value.userId ? await updateUser(form.value) : await addUser(form.value); - proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); - dialog.visible = false; - await getList(); - } - }) + userFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + form.value.userId ? await api.updateUser(form.value) : await api.addUser(form.value); + proxy?.$modal.msgSuccess("鎿嶄綔鎴愬姛"); + dialog.visible = false; + await getList(); + } + }) } @@ -603,23 +600,23 @@ * 鍏抽棴鐢ㄦ埛寮圭獥 */ const closeDialog = () => { - dialog.visible = false; - resetForm(); + dialog.visible = false; + resetForm(); } /** * 閲嶇疆琛ㄥ崟 */ const resetForm = () => { - userFormRef.value.resetFields(); - userFormRef.value.clearValidate(); + userFormRef.value?.resetFields(); + userFormRef.value?.clearValidate(); - form.value.id = undefined; - form.value.status = '1'; + form.value.id = undefined; + form.value.status = '1'; } onMounted(() => { - getTreeSelect() // 鍒濆鍖栭儴闂ㄦ暟鎹� - getList() // 鍒濆鍖栧垪琛ㄦ暟鎹� + getTreeSelect() // 鍒濆鍖栭儴闂ㄦ暟鎹� + getList() // 鍒濆鍖栧垪琛ㄦ暟鎹� }); </script> diff --git a/src/views/system/user/profile/index.vue b/src/views/system/user/profile/index.vue index b06da65..31dc6ea 100644 --- a/src/views/system/user/profile/index.vue +++ b/src/views/system/user/profile/index.vue @@ -74,11 +74,11 @@ import { getUserProfile } from "@/api/system/user"; const activeTab = ref("userinfo"); -const state = ref<{ user: any; roleGroup: string; postGroup: string; auths:any[]}>({ +const state = ref<Record<string, any>>({ user: {}, roleGroup: '', postGroup: '', - auths: [], + auths: [] }); const userForm = ref({}); diff --git a/src/views/system/user/profile/resetPwd.vue b/src/views/system/user/profile/resetPwd.vue index 174e020..11b00f6 100644 --- a/src/views/system/user/profile/resetPwd.vue +++ b/src/views/system/user/profile/resetPwd.vue @@ -17,46 +17,50 @@ </template> <script setup lang="ts"> -import { updateUserPwd } from '@/api/system/user'; -import { ComponentInternalInstance } from 'vue'; -import { ResetPwdForm } from '@/api/system/user/types' -import { ElForm } from 'element-plus'; +import { updateUserPwd } from "@/api/system/user"; +import type { ResetPwdForm } from "@/api/system/user/types"; const { proxy } = getCurrentInstance() as ComponentInternalInstance; - - -const pwdRef = ref(ElForm); - +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("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�")); - } else { - callback(); - } + if (user.value.newPassword !== value) { + 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" + }] }); /** 鎻愪氦鎸夐挳 */ const submit = () => { - pwdRef.value.validate(async (valid: boolean) => { - if (valid) { - await updateUserPwd(user.value.oldPassword, user.value.newPassword) - proxy?.$modal.msgSuccess("淇敼鎴愬姛"); - } - }); + pwdRef.value?.validate(async (valid: boolean) => { + if (valid) { + await updateUserPwd(user.value.oldPassword, user.value.newPassword); + proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + } + }); }; /** 鍏抽棴鎸夐挳 */ const close = () => { - proxy?.$tab.closePage(); + proxy?.$tab.closePage(); }; </script> diff --git a/src/views/system/user/profile/userAvatar.vue b/src/views/system/user/profile/userAvatar.vue index 0af8b28..0796765 100644 --- a/src/views/system/user/profile/userAvatar.vue +++ b/src/views/system/user/profile/userAvatar.vue @@ -29,7 +29,9 @@ <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload"> <el-button> 閫夋嫨 - <el-icon class="el-icon--right"><Upload /></el-icon> + <el-icon class="el-icon--right"> + <Upload /> + </el-icon> </el-button> </el-upload> </el-col> @@ -58,18 +60,17 @@ import { VueCropper } from "vue-cropper"; import { uploadAvatar } from "@/api/system/user"; import useUserStore from "@/store/modules/user"; -import { ComponentInternalInstance } from "vue"; interface Options { - img: string | ArrayBuffer | null // 瑁佸壀鍥剧墖鐨勫湴鍧� - autoCrop: boolean // 鏄惁榛樿鐢熸垚鎴浘妗� - autoCropWidth: number // 榛樿鐢熸垚鎴浘妗嗗搴� - autoCropHeight: number // 榛樿鐢熸垚鎴浘妗嗛珮搴� - fixedBox: boolean // 鍥哄畾鎴浘妗嗗ぇ灏� 涓嶅厑璁告敼鍙� - fileName: string - previews: any // 棰勮鏁版嵁 - outputType: string - visible: boolean + img: string | ArrayBuffer | null; // 瑁佸壀鍥剧墖鐨勫湴鍧� + autoCrop: boolean; // 鏄惁榛樿鐢熸垚鎴浘妗� + autoCropWidth: number; // 榛樿鐢熸垚鎴浘妗嗗搴� + autoCropHeight: number; // 榛樿鐢熸垚鎴浘妗嗛珮搴� + fixedBox: boolean; // 鍥哄畾鎴浘妗嗗ぇ灏� 涓嶅厑璁告敼鍙� + fileName: string; + previews: any; // 棰勮鏁版嵁 + outputType: string; + visible: boolean; } @@ -83,75 +84,76 @@ const cropper = ref<any>({}); //鍥剧墖瑁佸壀鏁版嵁 const options = reactive<Options>({ - img: userStore.avatar, - autoCrop: true, - autoCropWidth: 200, - autoCropHeight: 200, - fixedBox: true, - outputType: "png", - fileName: '', - previews: {}, - visible: false + img: userStore.avatar, + autoCrop: true, + autoCropWidth: 200, + autoCropHeight: 200, + fixedBox: true, + outputType: "png", + fileName: "", + previews: {}, + visible: false }); /** 缂栬緫澶村儚 */ const editCropper = () => { - open.value = true; -} + open.value = true; +}; /** 鎵撳紑寮瑰嚭灞傜粨鏉熸椂鐨勫洖璋� */ const modalOpened = () => { - visible.value = true; -} + visible.value = true; +}; /** 瑕嗙洊榛樿涓婁紶琛屼负 */ -const requestUpload = (): any => {} +const requestUpload = (): any => { +}; /** 鍚戝乏鏃嬭浆 */ const rotateLeft = () => { - cropper.value.rotateLeft(); -} + cropper.value.rotateLeft(); +}; /** 鍚戝彸鏃嬭浆 */ const rotateRight = () => { - cropper.value.rotateRight(); -} + cropper.value.rotateRight(); +}; /** 鍥剧墖缂╂斁 */ const changeScale = (num: number) => { - num = num || 1; - cropper.value.changeScale(num); -} + num = num || 1; + cropper.value.changeScale(num); +}; /** 涓婁紶棰勫鐞� */ const beforeUpload = (file: any) => { - if (file.type.indexOf("image/") == -1) { - proxy?.$modal.msgError("鏂囦欢鏍煎紡閿欒锛岃涓婁紶鍥剧墖绫诲瀷,濡傦細JPG锛孭NG鍚庣紑鐨勬枃浠躲��"); - } else { - const reader = new FileReader(); - reader.readAsDataURL(file); - reader.onload = () => { - options.img = reader.result; - options.fileName = file.name; - }; - } -} + if (file.type.indexOf("image/") == -1) { + proxy?.$modal.msgError("鏂囦欢鏍煎紡閿欒锛岃涓婁紶鍥剧墖绫诲瀷,濡傦細JPG锛孭NG鍚庣紑鐨勬枃浠躲��"); + } else { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = () => { + options.img = reader.result; + options.fileName = file.name; + }; + } +}; /** 涓婁紶鍥剧墖 */ const uploadImg = async () => { - cropper.value.getCropBlob(async (data: any) => { - let formData = new FormData(); - formData.append("avatarfile", data, options.fileName); - const res = await uploadAvatar(formData); - open.value = false; - options.img = res.data.imgUrl; - userStore.avatar = options.img as string; - proxy?.$modal.msgSuccess("淇敼鎴愬姛"); - visible.value = false; - }); -} + cropper.value.getCropBlob(async (data: any) => { + let formData = new FormData(); + formData.append("avatarfile", data, options.fileName); + const res = await uploadAvatar(formData); + open.value = false; + options.img = res.data.imgUrl; + userStore.avatar = options.img as string + proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + visible.value = false; + }); +}; /** 瀹炴椂棰勮 */ const realTime = (data: any) => { - options.previews = data; -} + options.previews = data; +}; /** 鍏抽棴绐楀彛 */ const closeDialog = () => { - options.img = userStore.avatar; - options.visible = false; -} + options.img = userStore.avatar; + options.visible = false; +}; </script> <style lang="scss" scoped> diff --git a/src/views/system/user/profile/userInfo.vue b/src/views/system/user/profile/userInfo.vue index 0c3d6ef..3dd5ff7 100644 --- a/src/views/system/user/profile/userInfo.vue +++ b/src/views/system/user/profile/userInfo.vue @@ -24,40 +24,42 @@ <script setup lang="ts"> import { updateUserProfile } from "@/api/system/user"; -import { FormRules } from "element-plus"; -import { ComponentInternalInstance } from "vue"; -import { PropType } from "vue"; -import { ElForm } from "element-plus"; const props = defineProps({ - user: { - type: Object as PropType<any>, - } + user: { + type: Object as PropType<any>, + required: true + } }); const userForm = computed(() => props.user); - const { proxy } = getCurrentInstance() as ComponentInternalInstance; - -const userRef = ref(ElForm); - -const rules = ref<FormRules>({ - 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 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" }] }); /** 鎻愪氦鎸夐挳 */ const submit = () => { - userRef.value.validate(async (valid: boolean) => { - if (valid) { - await updateUserProfile(props.user) - proxy?.$modal.msgSuccess("淇敼鎴愬姛"); - } - }); + userRef.value?.validate(async (valid: boolean) => { + if (valid) { + await updateUserProfile(props.user); + proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + } + }); }; /** 鍏抽棴鎸夐挳 */ const close = () => { - proxy?.$tab.closePage(); + proxy?.$tab.closePage(); }; </script> diff --git a/src/views/tool/gen/basicInfoForm.vue b/src/views/tool/gen/basicInfoForm.vue index 5d8e781..c77d0c9 100644 --- a/src/views/tool/gen/basicInfoForm.vue +++ b/src/views/tool/gen/basicInfoForm.vue @@ -31,24 +31,19 @@ </template> <script setup lang="ts"> -import { PropType } from 'vue'; +import { propTypes } from "@/utils/propTypes"; const prop = defineProps({ - info: { - type: Object as PropType<any>, - default: () => { - return {}; - } - } + info: propTypes.any.def({}) }); 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 15e6edd..fdd1eeb 100644 --- a/src/views/tool/gen/editTable.vue +++ b/src/views/tool/gen/editTable.vue @@ -117,9 +117,8 @@ import { DbColumnVO, DbTableVO } from '@/api/tool/gen/types'; 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 { ComponentInternalInstance } from "vue"; +import BasicInfoForm from './basicInfoForm.vue'; +import GenInfoForm from "./genInfoForm.vue"; const route = useRoute(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -131,13 +130,13 @@ const dictOptions = ref<DictTypeVO[]>([]); const info = ref<Partial<DbTableVO>>({}); -const basicInfo = ref(basicInfoForm); -const genInfo = ref(genInfoForm); +const basicInfo = ref<InstanceType<typeof BasicInfoForm>>(); +const genInfo = ref<InstanceType<typeof GenInfoForm>>(); /** 鎻愪氦鎸夐挳 */ const submitForm = () => { - const basicForm = basicInfo.value.$refs.basicInfoForm; - const genForm = genInfo.value.$refs.genInfoForm; + 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); @@ -168,7 +167,7 @@ }); } 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); } diff --git a/src/views/tool/gen/genInfoForm.vue b/src/views/tool/gen/genInfoForm.vue index ab6e714..94486e2 100644 --- a/src/views/tool/gen/genInfoForm.vue +++ b/src/views/tool/gen/genInfoForm.vue @@ -223,7 +223,7 @@ <script setup lang="ts"> import { listMenu } from '@/api/system/menu'; -import { ComponentInternalInstance, PropType } from 'vue'; +import { propTypes } from "@/utils/propTypes"; interface MenuOptionsType { menuId: number | string; @@ -236,14 +236,8 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance; const props = defineProps({ - info: { - type: Object as PropType<any>, - default: null - }, - tables: { - type: Array as PropType<any[]>, - default: null - } + info: propTypes.any.def(null), + tables: propTypes.any.def(null) }); const infoForm = computed(() => props.info); @@ -252,11 +246,11 @@ // 琛ㄥ崟鏍¢獙 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 = ""; @@ -268,7 +262,7 @@ } } const setSubTableColumns = (value: string) => { - table.value.forEach(item => { + table.value.forEach((item: any) => { const name = item.tableName; if (value === name) { subColumns.value = item.columns; diff --git a/src/views/tool/gen/importTable.vue b/src/views/tool/gen/importTable.vue index eada1dc..91e88fc 100644 --- a/src/views/tool/gen/importTable.vue +++ b/src/views/tool/gen/importTable.vue @@ -3,11 +3,11 @@ <el-dialog title="瀵煎叆琛�" v-model="visible" width="1100px" top="5vh" append-to-body> <el-form :model="queryParams" ref="queryFormRef" :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> - </el-select> - </el-form-item> - <el-form-item label="琛ㄥ悕绉�" prop="tableName"> + <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> + </el-select> + </el-form-item> + <el-form-item label="琛ㄥ悕绉�" prop="tableName"> <el-input v-model="queryParams.tableName" placeholder="璇疯緭鍏ヨ〃鍚嶇О" clearable @keyup.enter="handleQuery" /> </el-form-item> <el-form-item label="琛ㄦ弿杩�" prop="tableComment"> @@ -26,7 +26,7 @@ <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" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" /> </el-row> <template #footer> <div class="dialog-footer"> @@ -40,8 +40,6 @@ <script setup lang="ts"> import { listDbTable, importTable, getDataNames } from '@/api/tool/gen'; import { DbTableQuery, DbTableVO } from '@/api/tool/gen/types'; -import { ComponentInternalInstance } from 'vue'; -import { ElTable, ElForm } from 'element-plus'; const total = ref(0); const visible = ref(false); @@ -49,15 +47,15 @@ const dbTableList = ref<Array<DbTableVO>>([]); const { proxy } = getCurrentInstance() as ComponentInternalInstance; -const tableRef = ref(ElTable); -const queryFormRef = ref(ElForm); +const tableRef = ref<ElTableInstance>(); +const queryFormRef = ref<ElFormInstance>(); const queryParams = reactive<DbTableQuery>({ - pageNum: 1, - pageSize: 10, - dataName: '', - tableName: '', - tableComment: '' + pageNum: 1, + pageSize: 10, + dataName: '', + tableName: '', + tableComment: '' }); const dataNameList = ref<Array<string>>([]); @@ -65,52 +63,53 @@ /** 鏌ヨ鍙傛暟鍒楄〃 */ const show = (dataName: string) => { - getDataNameList(); - if(dataName){ - queryParams.dataName = dataName; - } else { - queryParams.dataName = 'master'; - } - getList(); - visible.value = true; + getDataNameList(); + if (dataName) { + queryParams.dataName = dataName; + } else { + queryParams.dataName = 'master'; + } + getList(); + visible.value = true; } /** 鍗曞嚮閫夋嫨琛� */ const clickRow = (row: DbTableVO) => { - tableRef.value.toggleRowSelection(row); + // ele bug + tableRef.value?.toggleRowSelection(row); } /** 澶氶�夋閫変腑鏁版嵁 */ 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 res = await listDbTable(queryParams); + dbTableList.value = res.rows; + total.value = res.total; } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.pageNum = 1; - getList(); + queryParams.pageNum = 1; + getList(); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - queryFormRef.value.resetFields(); - handleQuery(); + queryFormRef.value?.resetFields(); + handleQuery(); } /** 瀵煎叆鎸夐挳鎿嶄綔 */ const handleImportTable = async () => { - 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"); - } + 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"); + } } /** 鏌ヨ澶氭暟鎹簮鍚嶇О */ const getDataNameList = async () => { @@ -119,6 +118,6 @@ } defineExpose({ - show, + show, }); </script> diff --git a/src/views/tool/gen/index.vue b/src/views/tool/gen/index.vue index 5775e6a..66300bd 100644 --- a/src/views/tool/gen/index.vue +++ b/src/views/tool/gen/index.vue @@ -1,39 +1,41 @@ <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="68px"> - <el-form-item label="鏁版嵁婧�" prop="dataName"> - <el-select v-model="queryParams.dataName" filterable clearable placeholder="璇烽�夋嫨/杈撳叆鏁版嵁婧愬悕绉�" style="width: 200px"> - <el-option key="" label="鍏ㄩ儴" value="" /> - <el-option v-for="item in dataNameList" :key="item" :label="item" :value="item"> </el-option> - </el-select> - </el-form-item> - <el-form-item label="琛ㄥ悕绉�" prop="tableName"> - <el-input v-model="queryParams.tableName" placeholder="璇疯緭鍏ヨ〃鍚嶇О" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="琛ㄦ弿杩�" prop="tableComment"> - <el-input v-model="queryParams.tableComment" placeholder="璇疯緭鍏ヨ〃鎻忚堪" clearable style="width: 200px" @keyup.enter="handleQuery" /> - </el-form-item> - <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px"> - <el-date-picker - v-model="dateRange" - value-format="YYYY-MM-DD" - type="daterange" - range-separator="-" - start-placeholder="寮�濮嬫棩鏈�" - end-placeholder="缁撴潫鏃ユ湡" - ></el-date-picker> - </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> - </el-form-item> - </el-form> + <div class="mb-[10px]" v-show="showSearch"> + <el-card shadow="hover"> + <el-form :model="queryParams" ref="queryFormRef" :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="" /> + <el-option v-for="item in dataNameList" :key="item" :label="item" :value="item"> </el-option> + </el-select> + </el-form-item> + <el-form-item label="琛ㄥ悕绉�" prop="tableName"> + <el-input v-model="queryParams.tableName" placeholder="璇疯緭鍏ヨ〃鍚嶇О" clearable style="width: 200px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="琛ㄦ弿杩�" prop="tableComment"> + <el-input v-model="queryParams.tableComment" placeholder="璇疯緭鍏ヨ〃鎻忚堪" clearable style="width: 200px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鍒涘缓鏃堕棿" style="width: 308px"> + <el-date-picker + v-model="dateRange" + value-format="YYYY-MM-DD" + type="daterange" + range-separator="-" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + ></el-date-picker> + </el-form-item> + <el-form-item> + <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> </div> </transition> - <el-card shadow="never"> + <el-card shadow="hover"> <template #header> <el-row :gutter="10" class="mb8"> <el-col :span="1.5"> @@ -99,9 +101,9 @@ :name="(key as any).substring((key as any).lastIndexOf('/') + 1, (key as any).indexOf('.vm'))" :key="value" > - <el-link :underline="false" icon="DocumentCopy" v-copyText="value" v-copyText:callback="copyTextSuccess" style="float:right" - > 澶嶅埗</el-link - > + <el-link :underline="false" icon="DocumentCopy" v-copyText="value" v-copyText:callback="copyTextSuccess" style="float:right"> + 澶嶅埗 + </el-link> <pre>{{ value }}</pre> </el-tab-pane> </el-tabs> @@ -114,9 +116,7 @@ import { listTable, previewTable, delTable, genCode, synchDb, getDataNames } from '@/api/tool/gen'; import { TableQuery, TableVO } from '@/api/tool/gen/types'; import router from '@/router'; -import importTable from './importTable.vue'; -import { ComponentInternalInstance } from 'vue'; -import { ElForm, DateModelType } from 'element-plus'; +import ImportTable from './importTable.vue'; const route = useRoute(); const { proxy } = getCurrentInstance() as ComponentInternalInstance; @@ -132,35 +132,35 @@ const uniqueId = ref(""); const dataNameList = ref<Array<string>>([]); -const queryFormRef = ref(ElForm); -const importRef = ref(importTable); +const queryFormRef = ref<ElFormInstance>(); +const importRef = ref<InstanceType<typeof ImportTable>>(); const queryParams = ref<TableQuery>({ - pageNum: 1, - pageSize: 10, - tableName: '', - tableComment: '', - dataName: "" + pageNum: 1, + pageSize: 10, + tableName: '', + tableComment: '', + dataName: "" }) -const preview = ref <any>({ - data: {}, - activeName: 'domain.java' +const preview = ref<any>({ + data: {}, + activeName: 'domain.java' }) const dialog = reactive<DialogOption>({ - visible: false, - title: '浠g爜棰勮' + visible: false, + title: '浠g爜棰勮' }); onActivated(() => { - const time = route.query.t; - if (time != null && time != uniqueId.value) { - uniqueId.value = time as string; - queryParams.value.pageNum = Number(route.query.pageNum); - dateRange.value = ['', '']; - queryFormRef.value.resetFields(); - getList(); - } + const time = route.query.t; + if (time != null && time != uniqueId.value) { + uniqueId.value = time as string; + queryParams.value.pageNum = Number(route.query.pageNum); + dateRange.value = ['', '']; + queryFormRef.value?.resetFields(); + getList(); + } }) /** 鏌ヨ澶氭暟鎹簮鍚嶇О */ @@ -171,81 +171,81 @@ /** 鏌ヨ琛ㄩ泦鍚� */ const getList = async () => { - loading.value = true; - const res = await listTable(proxy?.addDateRange(queryParams.value, dateRange.value)); - tableList.value = res.rows; - total.value = res.total; - loading.value = false; + loading.value = true; + const res = await listTable(proxy?.addDateRange(queryParams.value, dateRange.value)); + tableList.value = res.rows; + total.value = res.total; + loading.value = false; } /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { - queryParams.value.pageNum = 1; - getList(); + queryParams.value.pageNum = 1; + getList(); } /** 鐢熸垚浠g爜鎿嶄綔 */ const handleGenTable = async (row?: TableVO) => { - const tbIds = row?.tableId || ids.value; - if (tbIds == "") { - proxy?.$modal.msgError('璇烽�夋嫨瑕佺敓鎴愮殑鏁版嵁'); - return; - } - 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 tbIds = row?.tableId || ids.value; + if (tbIds == "") { + proxy?.$modal.msgError('璇烽�夋嫨瑕佺敓鎴愮殑鏁版嵁'); + return; + } + 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 tableId = row.tableId; + await proxy?.$modal.confirm('纭瑕佸己鍒跺悓姝�"' + row.tableName + '"琛ㄧ粨鏋勫悧锛�'); + await synchDb(tableId); + proxy?.$modal.msgSuccess('鍚屾鎴愬姛'); } /** 鎵撳紑瀵煎叆琛ㄥ脊绐� */ const openImportTable = () => { - importRef.value.show(queryParams.value.dataName); + importRef.value?.show(queryParams.value.dataName); } /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { - dateRange.value = ['', '']; - queryFormRef.value.resetFields(); - handleQuery(); + 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'; + 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('澶嶅埗鎴愬姛'); + proxy?.$modal.msgSuccess('澶嶅埗鎴愬姛'); } // 澶氶�夋閫変腑鏁版嵁 const handleSelectionChange = (selection: TableVO[]) => { - ids.value = selection.map(item => item.tableId); - single.value = selection.length != 1; - multiple.value = !selection.length; + 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 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; - await proxy?.$modal.confirm('鏄惁纭鍒犻櫎琛ㄧ紪鍙蜂负"' + tableIds + '"鐨勬暟鎹」锛�'); - await delTable(tableIds); - getList(); - proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); + const tableIds = row?.tableId || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎琛ㄧ紪鍙蜂负"' + tableIds + '"鐨勬暟鎹」锛�'); + await delTable(tableIds); + getList(); + proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); } onMounted(() => { - getList(); - getDataNameList(); + getList(); + getDataNameList(); }) </script> -- Gitblit v1.9.3