From 70f55d2a6cb6d54ad87b109263f293c989371bd6 Mon Sep 17 00:00:00 2001 From: coderlmw <2383250163@qq.com> Date: Fri, 27 Dec 2024 15:34:13 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF=E9=80=82?= =?UTF-8?q?=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BaseComponent/BaseTable/src/Table.vue | 2 +- src/assets/css/app.scss | 3 + src/assets/css/dark.scss | 3 + src/assets/icons/svg/desktop.svg | 1 + src/assets/icons/svg/mobile-screen.svg | 1 + .../HsjComponent/pageContent/index.js | 2 +- .../pageContent/src/MobileContent.vue | 589 ++++++++++++++++++ .../HsjComponent/pageContent/src/index.vue | 28 + .../pageContent/src/mobileItem.vue | 254 ++++++++ .../HsjComponent/pageSearch/index.js | 2 +- .../pageSearch/src/MobileSearch.vue | 120 ++++ .../HsjComponent/pageSearch/src/index.vue | 20 + src/layout/components/Config/index.vue | 14 +- src/store/modules/layout.js | 2 + src/store/modules/permission.js | 1 - src/views/system/user/config/contentConfig.js | 15 +- vite.config.js | 4 +- 17 files changed, 1047 insertions(+), 14 deletions(-) create mode 100644 src/assets/icons/svg/desktop.svg create mode 100644 src/assets/icons/svg/mobile-screen.svg create mode 100644 src/components/HsjComponent/pageContent/src/MobileContent.vue create mode 100644 src/components/HsjComponent/pageContent/src/index.vue create mode 100644 src/components/HsjComponent/pageContent/src/mobileItem.vue create mode 100644 src/components/HsjComponent/pageSearch/src/MobileSearch.vue create mode 100644 src/components/HsjComponent/pageSearch/src/index.vue diff --git a/src/BaseComponent/BaseTable/src/Table.vue b/src/BaseComponent/BaseTable/src/Table.vue index 956146c..9881af1 100644 --- a/src/BaseComponent/BaseTable/src/Table.vue +++ b/src/BaseComponent/BaseTable/src/Table.vue @@ -250,7 +250,7 @@ defineExpose({ :page-sizes="[20, 50, 100, 200, 300]" :layout="paginationLayoutComputed" :total="listCount" - :pager-count="isSmall ? 3 : 7" + :pager-count="isSmall ? 5 : 7" background > diff --git a/src/assets/css/app.scss b/src/assets/css/app.scss index e13f074..c5ac272 100644 --- a/src/assets/css/app.scss +++ b/src/assets/css/app.scss @@ -212,3 +212,6 @@ a { .lmw_popper { max-width: 600px; } +.mobileFooter { + background-color: #eef0f2; +} diff --git a/src/assets/css/dark.scss b/src/assets/css/dark.scss index 8e2929a..51fdf87 100644 --- a/src/assets/css/dark.scss +++ b/src/assets/css/dark.scss @@ -25,6 +25,9 @@ html.dark { @include set-component-css-var('bg-color', $bg-color); @include set-component-css-var('border-color', $border-color); } +html.dark .mobileFooter { + background-color: #2d3238; +} ::view-transition-old(root), ::view-transition-new(root) { diff --git a/src/assets/icons/svg/desktop.svg b/src/assets/icons/svg/desktop.svg new file mode 100644 index 0000000..106cda5 --- /dev/null +++ b/src/assets/icons/svg/desktop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/mobile-screen.svg b/src/assets/icons/svg/mobile-screen.svg new file mode 100644 index 0000000..9aa4880 --- /dev/null +++ b/src/assets/icons/svg/mobile-screen.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/HsjComponent/pageContent/index.js b/src/components/HsjComponent/pageContent/index.js index 25a42c0..8c5604b 100644 --- a/src/components/HsjComponent/pageContent/index.js +++ b/src/components/HsjComponent/pageContent/index.js @@ -1,3 +1,3 @@ -import PageContent from './src/PageContent.vue' +import PageContent from './src/index.vue' export default PageContent diff --git a/src/components/HsjComponent/pageContent/src/MobileContent.vue b/src/components/HsjComponent/pageContent/src/MobileContent.vue new file mode 100644 index 0000000..d102593 --- /dev/null +++ b/src/components/HsjComponent/pageContent/src/MobileContent.vue @@ -0,0 +1,589 @@ + + + + + + + + + {{ field.label }}: + + + {{ row[field.prop] }} + + + + + + + + + {{ field.label }}: + + + {{ row[field.prop] }} + + + + + + + + + + + diff --git a/src/components/HsjComponent/pageContent/src/index.vue b/src/components/HsjComponent/pageContent/src/index.vue new file mode 100644 index 0000000..7693a07 --- /dev/null +++ b/src/components/HsjComponent/pageContent/src/index.vue @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + diff --git a/src/components/HsjComponent/pageContent/src/mobileItem.vue b/src/components/HsjComponent/pageContent/src/mobileItem.vue new file mode 100644 index 0000000..08eb27a --- /dev/null +++ b/src/components/HsjComponent/pageContent/src/mobileItem.vue @@ -0,0 +1,254 @@ + + + + + + + + + {{ getHeaderFields[0].label }}: + {{ item[getHeaderFields[0].prop] }} + + + + + + + + + + + + + + + + + + {{ field.label }}: + {{ + formatValue(item[field.prop], field) + }} + + + + + + + + + + + + + + + + diff --git a/src/components/HsjComponent/pageSearch/index.js b/src/components/HsjComponent/pageSearch/index.js index d0d7408..dc72abc 100644 --- a/src/components/HsjComponent/pageSearch/index.js +++ b/src/components/HsjComponent/pageSearch/index.js @@ -1,3 +1,3 @@ -import PageSearch from './src/PageSearch.vue' +import PageSearch from './src/index.vue' export default PageSearch diff --git a/src/components/HsjComponent/pageSearch/src/MobileSearch.vue b/src/components/HsjComponent/pageSearch/src/MobileSearch.vue new file mode 100644 index 0000000..26593fb --- /dev/null +++ b/src/components/HsjComponent/pageSearch/src/MobileSearch.vue @@ -0,0 +1,120 @@ + + + + + + + + + diff --git a/src/components/HsjComponent/pageSearch/src/index.vue b/src/components/HsjComponent/pageSearch/src/index.vue new file mode 100644 index 0000000..6ad1998 --- /dev/null +++ b/src/components/HsjComponent/pageSearch/src/index.vue @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/src/layout/components/Config/index.vue b/src/layout/components/Config/index.vue index 8107701..09fb4fb 100644 --- a/src/layout/components/Config/index.vue +++ b/src/layout/components/Config/index.vue @@ -1,6 +1,5 @@ - - diff --git a/src/components/HsjComponent/pageSearch/src/MobileSearch.vue b/src/components/HsjComponent/pageSearch/src/MobileSearch.vue index 26593fb..61524fa 100644 --- a/src/components/HsjComponent/pageSearch/src/MobileSearch.vue +++ b/src/components/HsjComponent/pageSearch/src/MobileSearch.vue @@ -1,7 +1,6 @@ - + - + -- Gitee From a56549c5297895be508cf6501abb32382d1e26ec Mon Sep 17 00:00:00 2001 From: coderlmw Date: Fri, 27 Dec 2024 18:31:00 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=AB=AF=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pnpm-lock.yaml | 17 +++++-- .../HsjComponent/pageContent/index.js | 6 ++- .../pageContent/src/MobileContent.vue | 44 +++++++++++++------ .../HsjComponent/pageSearch/src/index.vue | 4 ++ src/views/monitor/job/config/contentConfig.js | 3 ++ .../logininfor/config/contentConfig.js | 1 + .../monitor/online/config/contentConfig.js | 2 + .../monitor/operlog/config/contentConfig.js | 1 + src/views/monitor/operlog/index.vue | 12 ++++- .../system/config/config/contentConfig.js | 1 + src/views/system/dept/index.vue | 1 + src/views/system/dict/config/contentConfig.js | 1 + src/views/system/menu/index.vue | 1 + .../system/notice/config/contentConfig.js | 1 + src/views/system/post/config/contentConfig.js | 1 + src/views/system/role/config/contentConfig.js | 11 ++--- src/views/tool/gen/config/contentConfig.js | 2 + vite.config.js | 4 +- 18 files changed, 85 insertions(+), 28 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f15be36..c085784 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,8 +27,8 @@ dependencies: specifier: 5.4.0 version: 5.4.0 element-plus: - specifier: ^2.8.7 - version: 2.8.7(vue@3.5.12) + specifier: ^2.9.0 + version: 2.9.0(vue@3.5.12) file-saver: specifier: 2.0.5 version: 2.0.5 @@ -744,6 +744,7 @@ packages: resolution: {integrity: sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==} cpu: [arm] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -751,6 +752,7 @@ packages: resolution: {integrity: sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==} cpu: [arm] os: [linux] + libc: [musl] requiresBuild: true optional: true @@ -758,6 +760,7 @@ packages: resolution: {integrity: sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==} cpu: [arm64] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -765,6 +768,7 @@ packages: resolution: {integrity: sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==} cpu: [arm64] os: [linux] + libc: [musl] requiresBuild: true optional: true @@ -772,6 +776,7 @@ packages: resolution: {integrity: sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==} cpu: [ppc64] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -779,6 +784,7 @@ packages: resolution: {integrity: sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==} cpu: [riscv64] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -786,6 +792,7 @@ packages: resolution: {integrity: sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==} cpu: [s390x] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -793,6 +800,7 @@ packages: resolution: {integrity: sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==} cpu: [x64] os: [linux] + libc: [glibc] requiresBuild: true optional: true @@ -800,6 +808,7 @@ packages: resolution: {integrity: sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==} cpu: [x64] os: [linux] + libc: [musl] requiresBuild: true optional: true @@ -1637,8 +1646,8 @@ packages: resolution: {integrity: sha512-xtoijJTZ+qeucLBDNztDOuQBE1ksqjvNjvqFoST3nGC7fSpqJ+X6BdTBaY5BHG+IhWWmpc6b/KfpeuEDupEPOQ==} dev: false - /element-plus@2.8.7(vue@3.5.12): - resolution: {integrity: sha512-oGQyFRufFOgjd872tZc+T4xQAYLlX4hj6d3ixeY13L4fFNUuc1N49JHAqJGPda0tdx3qCnjceZoh1kqqj2+tXQ==} + /element-plus@2.9.0(vue@3.5.12): + resolution: {integrity: sha512-ccOFXKsauo2dtokAr4OX7gZsb7TuAoVxA2zGRZo5o2yyDDBLBaZxOoFQPoxITSLcHbBfQuNDGK5Iag5hnyKkZA==} peerDependencies: vue: ^3.2.0 dependencies: diff --git a/src/components/HsjComponent/pageContent/index.js b/src/components/HsjComponent/pageContent/index.js index 8c5604b..169f841 100644 --- a/src/components/HsjComponent/pageContent/index.js +++ b/src/components/HsjComponent/pageContent/index.js @@ -1,3 +1,5 @@ -import PageContent from './src/index.vue' +import Content from './src/index.vue' +import PageContent from './src/PageContent.vue' -export default PageContent +export default Content +export { PageContent } diff --git a/src/components/HsjComponent/pageContent/src/MobileContent.vue b/src/components/HsjComponent/pageContent/src/MobileContent.vue index e91ae49..bfd1011 100644 --- a/src/components/HsjComponent/pageContent/src/MobileContent.vue +++ b/src/components/HsjComponent/pageContent/src/MobileContent.vue @@ -346,7 +346,11 @@ const columnsFilter = () => { headerItem.push(item) } if (item.mobileSlot === 'footer') { - footerSlot.push(item.prop + 'Slot') + if (item.slotName) { + footerSlot.push(item.slotName) + } else { + footerSlot.push(item.prop + 'Slot') + } } if (item.prop === 'todo') { hasTodo = true @@ -408,7 +412,13 @@ onActivated(() => { onDeactivated(() => { offListener() }) - +const vShowFooter = { + mounted: (el) => { + if (el.children.length === 1) { + el.parentNode && el.parentNode.removeChild(el) + } + }, +} init() defineExpose({ finalSearchData, @@ -430,10 +440,10 @@ defineExpose({ - {{ field.label }}: + {{ field.label }}: - {{ row[field.prop] }} + {{ row[field.prop] }} @@ -462,7 +472,7 @@ defineExpose({ - - + - - {{ listCount }}条 - + {{ listCount }}条 diff --git a/src/components/HsjComponent/pageSearch/src/index.vue b/src/components/HsjComponent/pageSearch/src/index.vue index e288383..d29a55d 100644 --- a/src/components/HsjComponent/pageSearch/src/index.vue +++ b/src/components/HsjComponent/pageSearch/src/index.vue @@ -11,6 +11,10 @@ const setFormData = (key, value) => { const search = (isReset = false) => { pageSearchRef.value.search(isReset) } +defineExpose({ + setFormData, + search, +}) { diff --git a/src/views/monitor/logininfor/config/contentConfig.js b/src/views/monitor/logininfor/config/contentConfig.js index 1d690c3..34a81c1 100644 --- a/src/views/monitor/logininfor/config/contentConfig.js +++ b/src/views/monitor/logininfor/config/contentConfig.js @@ -9,6 +9,7 @@ export const tableItem = [ label: '用户名称', sortable: true, minWidth: 120, + mobileSlot: 'header', }, { prop: 'ipaddr', diff --git a/src/views/monitor/online/config/contentConfig.js b/src/views/monitor/online/config/contentConfig.js index f2662e1..162ad31 100644 --- a/src/views/monitor/online/config/contentConfig.js +++ b/src/views/monitor/online/config/contentConfig.js @@ -3,6 +3,7 @@ export const tableItem = [ prop: 'tokenId', label: '会话编号', minWidth: 160, + mobileSlot: 'header', }, { prop: 'userName', @@ -48,6 +49,7 @@ export const tableItem = [ fixed: !window.isSmallScreen ? 'right' : false, slotName: 'doSth', showOverflowTooltip: false, + mobileSlot: 'footer', }, ] export default () => { diff --git a/src/views/monitor/operlog/config/contentConfig.js b/src/views/monitor/operlog/config/contentConfig.js index 6e66554..702e272 100644 --- a/src/views/monitor/operlog/config/contentConfig.js +++ b/src/views/monitor/operlog/config/contentConfig.js @@ -8,6 +8,7 @@ export const tableItem = [ prop: 'title', label: '系统模块', minWidth: 120, + mobileSlot: 'header', }, { prop: 'businessType', diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue index 1c7169f..4ded909 100644 --- a/src/views/monitor/operlog/index.vue +++ b/src/views/monitor/operlog/index.vue @@ -5,7 +5,7 @@ import getComputedConfig from '@/hooks/getPageConfig' import getDialogConfig from './config/dialogConfig' import { monitorBaseUrl } from '@/api/config/base.js' import { operlog } from '@/views/pageName.js' - +// 操作日志 const proxy = inject('proxy') const { sys_oper_type, sys_common_status } = proxy.useDict( 'sys_oper_type', @@ -89,6 +89,7 @@ const handleClose = () => { const typeFormat = (row) => { return proxy.selectDictLabel(sys_oper_type.value, row.businessType) } +const isSmall = window.isSmallScreen @@ -143,7 +144,14 @@ const typeFormat = (row) => { - + diff --git a/src/views/system/config/config/contentConfig.js b/src/views/system/config/config/contentConfig.js index 61ad313..b8a1ea0 100644 --- a/src/views/system/config/config/contentConfig.js +++ b/src/views/system/config/config/contentConfig.js @@ -8,6 +8,7 @@ export const tableItem = [ prop: 'configName', label: '参数名称', minWidth: 90, + mobileSlot: 'header', }, { prop: 'configKey', diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue index 77eb1c3..72117e5 100644 --- a/src/views/system/dept/index.vue +++ b/src/views/system/dept/index.vue @@ -4,6 +4,7 @@ import getContentConfig from './config/contentConfig.js' import getDialogConfig from './config/dialogConfig.js' import useDialog from '@/hooks/useDialog.js' import getComputedConfig from '@/hooks/getPageConfig.js' +import { PageContent } from '@/components/HsjComponent/pageContent/index' import { systemBaseUrl } from '@/api/config/base.js' import { dept } from '@/views/pageName.js' diff --git a/src/views/system/dict/config/contentConfig.js b/src/views/system/dict/config/contentConfig.js index cebda41..9e8453c 100644 --- a/src/views/system/dict/config/contentConfig.js +++ b/src/views/system/dict/config/contentConfig.js @@ -8,6 +8,7 @@ export const tableItem = [ prop: 'dictName', label: '字典名称', minWidth: 120, + mobileSlot: 'header', }, { prop: 'dictType', diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index bfcb351..03d7879 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -7,6 +7,7 @@ import getComputedConfig from '@/hooks/getPageConfig' import IconSelector from '@/components/IconSelector/IconSelector.vue' import { systemBaseUrl } from '@/api/config/base.js' import { menu } from '@/views/pageName.js' +import { PageContent } from '@/components/HsjComponent/pageContent/index' const proxy = inject('proxy') const { sys_normal_disable, sys_show_hide } = proxy.useDict( diff --git a/src/views/system/notice/config/contentConfig.js b/src/views/system/notice/config/contentConfig.js index eb99b76..5e8f887 100644 --- a/src/views/system/notice/config/contentConfig.js +++ b/src/views/system/notice/config/contentConfig.js @@ -8,6 +8,7 @@ export const tableItem = [ prop: 'noticeTitle', label: '公告标题', minWidth: 160, + mobileSlot: 'header', }, { prop: 'noticeType', diff --git a/src/views/system/post/config/contentConfig.js b/src/views/system/post/config/contentConfig.js index b5a2dd5..197e43e 100644 --- a/src/views/system/post/config/contentConfig.js +++ b/src/views/system/post/config/contentConfig.js @@ -13,6 +13,7 @@ export const tableItem = [ prop: 'postName', label: '岗位名称', minWidth: 100, + mobileSlot: 'header', }, { diff --git a/src/views/system/role/config/contentConfig.js b/src/views/system/role/config/contentConfig.js index 62a0f89..ad28128 100644 --- a/src/views/system/role/config/contentConfig.js +++ b/src/views/system/role/config/contentConfig.js @@ -1,13 +1,14 @@ export const tableItem = [ - { - prop: 'roleId', - label: '角色编号', - minWidth: 90, - }, + // { + // prop: 'roleId', + // label: '角色编号', + // minWidth: 90, + // }, { prop: 'roleName', label: '角色名称', minWidth: 90, + mobileSlot: 'header', }, { prop: 'roleKey', diff --git a/src/views/tool/gen/config/contentConfig.js b/src/views/tool/gen/config/contentConfig.js index 4334b9f..98968ff 100644 --- a/src/views/tool/gen/config/contentConfig.js +++ b/src/views/tool/gen/config/contentConfig.js @@ -3,6 +3,7 @@ export const tableItem = [ prop: 'tableName', label: '表名称', minWidth: 110, + mobileSlot: 'header', }, { prop: 'tableComment', @@ -30,6 +31,7 @@ export const tableItem = [ label: '操作', width: 280, slotName: 'doSth', + mobileSlot: 'footer', }, ] export default () => { diff --git a/vite.config.js b/vite.config.js index d465e39..7e033c7 100644 --- a/vite.config.js +++ b/vite.config.js @@ -30,8 +30,8 @@ export default defineConfig(({ mode, command }) => { open: true, proxy: { '/api': { - // target: 'http://vue.ruoyi.vip/prod-api/', - target: 'http://192.168.0.99:8080/', + target: 'http://vue.ruoyi.vip/prod-api/', + // target: 'http://192.168.0.99:8080/', changeOrigin: true, rewrite: (p) => p.replace(/^\/api/, ''), }, -- Gitee From 3fd88cd91434326756fccc6f0797e1f79c567c60 Mon Sep 17 00:00:00 2001 From: coderlmw Date: Sun, 29 Dec 2024 20:46:37 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF=E5=85=BC?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- pnpm-lock.yaml | 8 +- .../src/cpn/src/Datepicker/Datepicker.vue | 1 + src/assets/css/app.scss | 4 + src/assets/css/element.scss | 25 ++ src/assets/icons/svg/chevron-down.svg | 1 + src/assets/icons/svg/chevron-up.svg | 1 + src/assets/icons/svg/sync-alt.svg | 1 + .../pageContent/src/MobileContent.vue | 376 ++++++++++-------- .../HsjComponent/pageContent/src/index.vue | 32 +- .../pageDialog/src/PageDialog.vue | 1 + .../pageSearch/src/MobileSearch.vue | 36 +- .../HsjComponent/pageSearch/src/index.vue | 40 +- src/views/system/dept/index.vue | 3 +- src/views/system/menu/index.vue | 3 +- src/views/system/user/config/contentConfig.js | 2 +- src/views/system/user/config/searchConfig.js | 1 + vite.config.js | 3 +- 18 files changed, 335 insertions(+), 205 deletions(-) create mode 100644 src/assets/icons/svg/chevron-down.svg create mode 100644 src/assets/icons/svg/chevron-up.svg create mode 100644 src/assets/icons/svg/sync-alt.svg diff --git a/package.json b/package.json index b3afef3..ea5308f 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "axios": "0.27.2", "dayjs": "^1.11.10", "echarts": "5.4.0", - "element-plus": "^2.9.0", + "element-plus": "^2.9.1", "file-saver": "2.0.5", "highlight.js": "^11.9.0", "js-cookie": "3.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c085784..da59ee8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,8 +27,8 @@ dependencies: specifier: 5.4.0 version: 5.4.0 element-plus: - specifier: ^2.9.0 - version: 2.9.0(vue@3.5.12) + specifier: ^2.9.1 + version: 2.9.1(vue@3.5.12) file-saver: specifier: 2.0.5 version: 2.0.5 @@ -1646,8 +1646,8 @@ packages: resolution: {integrity: sha512-xtoijJTZ+qeucLBDNztDOuQBE1ksqjvNjvqFoST3nGC7fSpqJ+X6BdTBaY5BHG+IhWWmpc6b/KfpeuEDupEPOQ==} dev: false - /element-plus@2.9.0(vue@3.5.12): - resolution: {integrity: sha512-ccOFXKsauo2dtokAr4OX7gZsb7TuAoVxA2zGRZo5o2yyDDBLBaZxOoFQPoxITSLcHbBfQuNDGK5Iag5hnyKkZA==} + /element-plus@2.9.1(vue@3.5.12): + resolution: {integrity: sha512-9Agqf/jt4Ugk7EZ6C5LME71sgkvauPCsnvJN12Xid2XVobjufxMGpRE4L7pS4luJMOmFAH3J0NgYEGZT5r+NDg==} peerDependencies: vue: ^3.2.0 dependencies: diff --git a/src/BaseComponent/BaseForm/src/cpn/src/Datepicker/Datepicker.vue b/src/BaseComponent/BaseForm/src/cpn/src/Datepicker/Datepicker.vue index 34fef60..f99c019 100644 --- a/src/BaseComponent/BaseForm/src/cpn/src/Datepicker/Datepicker.vue +++ b/src/BaseComponent/BaseForm/src/cpn/src/Datepicker/Datepicker.vue @@ -27,6 +27,7 @@ defineExpose({ v-model="value" valueFormat="YYYY-MM-DD" v-bind="item.config" + :editable="false" v-on="item.eventFunction || {}" > diff --git a/src/assets/css/app.scss b/src/assets/css/app.scss index c5ac272..acc38f2 100644 --- a/src/assets/css/app.scss +++ b/src/assets/css/app.scss @@ -215,3 +215,7 @@ a { .mobileFooter { background-color: #eef0f2; } + +.overlayColor { + background: var(--ba-bg-color-overlay); +} diff --git a/src/assets/css/element.scss b/src/assets/css/element.scss index 286e459..aef6ea4 100644 --- a/src/assets/css/element.scss +++ b/src/assets/css/element.scss @@ -105,3 +105,28 @@ white-space: nowrap; } } +/** 移动端展示 **/ +@media screen and (max-width: 500px) { + .el-picker-panel { + width: 300px !important; + } + .el-picker-panel__content { + width: 100%; + } + .el-picker-panel__body { + height: 330px; + margin-left: 0 !important; + display: flex; + flex-direction: column; + min-width: auto !important; + overflow-y: scroll; + } + .el-picker-panel__sidebar { + position: relative; + } + .el-picker-panel__body-wrapper { + display: flex; + flex-direction: column; + align-items: center; + } +} diff --git a/src/assets/icons/svg/chevron-down.svg b/src/assets/icons/svg/chevron-down.svg new file mode 100644 index 0000000..2984e74 --- /dev/null +++ b/src/assets/icons/svg/chevron-down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/chevron-up.svg b/src/assets/icons/svg/chevron-up.svg new file mode 100644 index 0000000..1209cd3 --- /dev/null +++ b/src/assets/icons/svg/chevron-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/icons/svg/sync-alt.svg b/src/assets/icons/svg/sync-alt.svg new file mode 100644 index 0000000..fffda49 --- /dev/null +++ b/src/assets/icons/svg/sync-alt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/HsjComponent/pageContent/src/MobileContent.vue b/src/components/HsjComponent/pageContent/src/MobileContent.vue index bfd1011..2c3a29f 100644 --- a/src/components/HsjComponent/pageContent/src/MobileContent.vue +++ b/src/components/HsjComponent/pageContent/src/MobileContent.vue @@ -431,95 +431,136 @@ defineExpose({ - - - - - - {{ field.label }}: - - - {{ row[field.prop] }} - + + + + + + + + 添加 + + + + + + 删除 + + + + + + + + - - - - - - - {{ field.label }}: - - - - - - {{ row[field.prop] }} - - + + + + + + + + + {{ field.label }}: + + + {{ row[field.prop] }} + - - - - + + diff --git a/src/components/HsjComponent/pageDialog/src/PageDialog.vue b/src/components/HsjComponent/pageDialog/src/PageDialog.vue index 632ebac..9c0198a 100644 --- a/src/components/HsjComponent/pageDialog/src/PageDialog.vue +++ b/src/components/HsjComponent/pageDialog/src/PageDialog.vue @@ -223,6 +223,7 @@ defineExpose({ > import BaseForm from '@/BaseComponent/BaseForm' import emitter from '@/utils/hsj/bus' +import businessStore from '@/store/business/businessStore' const props = defineProps({ searchConfig: { @@ -31,12 +32,18 @@ const props = defineProps({ reset: { type: Function, }, + // 当页面会存在打开多个的时候会出现缓存问题,可以用这个区分缓存 + cacheKey: { + type: [String, Number], + default: '', + }, }) const pageSearchRef = ref(null) const baseFormRef = ref(null) const searchLoading = ref(false) const formItem = props.searchConfig?.formItems ?? [] - +const store = businessStore() +const hideItems = ref([]) let formData = ref({}) const search = (isReset = false) => { searchLoading.value = true @@ -73,6 +80,20 @@ const resizeObserver = new ResizeObserver((entries) => { } }) +const isOpen = computed(() => { + return store.pageSearchControl[`${props.pageName}${props.cacheKey}SearchShow`] +}) +const triggerSearch = () => { + store.handlePageSearch(props.pageName, props.cacheKey) + if (!isOpen.value) { + const formItems = props.searchConfig.formItems + hideItems.value = formItems + .filter((item, index) => index !== 0) + .map((item) => item.field) + } else { + hideItems.value = [] + } +} onMounted(() => { for (const item of formItem) { formData.value[item.field] = item.default ?? void 0 @@ -96,10 +117,18 @@ defineExpose({ ref="baseFormRef" v-bind="searchConfig" v-model:data="formData" + :hideItems="hideItems" @keyUpEnter="keyUpEnter" > - diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue index 72117e5..69ac751 100644 --- a/src/views/system/dept/index.vue +++ b/src/views/system/dept/index.vue @@ -4,7 +4,6 @@ import getContentConfig from './config/contentConfig.js' import getDialogConfig from './config/dialogConfig.js' import useDialog from '@/hooks/useDialog.js' import getComputedConfig from '@/hooks/getPageConfig.js' -import { PageContent } from '@/components/HsjComponent/pageContent/index' import { systemBaseUrl } from '@/api/config/base.js' import { dept } from '@/views/pageName.js' @@ -145,6 +144,7 @@ const unFoldAll = () => { { :permission="permission" :piniaConfig="piniaConfig" :requestBaseUrl="requestBaseUrl" + :useMobile="false" @beforeSend="beforeSend" @addClick="addClick" @editBtnClick="editBtnClick" diff --git a/src/views/system/menu/index.vue b/src/views/system/menu/index.vue index 03d7879..725eff4 100644 --- a/src/views/system/menu/index.vue +++ b/src/views/system/menu/index.vue @@ -7,7 +7,6 @@ import getComputedConfig from '@/hooks/getPageConfig' import IconSelector from '@/components/IconSelector/IconSelector.vue' import { systemBaseUrl } from '@/api/config/base.js' import { menu } from '@/views/pageName.js' -import { PageContent } from '@/components/HsjComponent/pageContent/index' const proxy = inject('proxy') const { sys_normal_disable, sys_show_hide } = proxy.useDict( @@ -167,6 +166,7 @@ const unFoldAll = () => { ref="pageSearchRef" :pageName="pageName" :searchConfig="searchConfigComputed" + :useMobile="false" > { :permission="permission" :piniaConfig="piniaConfig" :requestBaseUrl="requestBaseUrl" + :useMobile="false" @beforeSend="beforeSend" @addClick="addClick" @editBtnClick="editBtnClick" diff --git a/src/views/system/user/config/contentConfig.js b/src/views/system/user/config/contentConfig.js index e941bd7..449222d 100644 --- a/src/views/system/user/config/contentConfig.js +++ b/src/views/system/user/config/contentConfig.js @@ -42,7 +42,7 @@ export const tableItem = [ label: '操作', width: 280, fixed: !window.isSmallScreen ? 'right' : false, - slotName: 'todoSlot', + slotName: 'todo', showOverflowTooltip: false, }, ] diff --git a/src/views/system/user/config/searchConfig.js b/src/views/system/user/config/searchConfig.js index 2cb743a..469642f 100644 --- a/src/views/system/user/config/searchConfig.js +++ b/src/views/system/user/config/searchConfig.js @@ -39,5 +39,6 @@ export default (otherConfig = {}) => { }, }, ], + elFormConfig: {}, } } diff --git a/vite.config.js b/vite.config.js index 7e033c7..da8a91e 100644 --- a/vite.config.js +++ b/vite.config.js @@ -30,8 +30,9 @@ export default defineConfig(({ mode, command }) => { open: true, proxy: { '/api': { - target: 'http://vue.ruoyi.vip/prod-api/', + // target: 'http://vue.ruoyi.vip/prod-api/', // target: 'http://192.168.0.99:8080/', + target: 'http://localhost:8080/', changeOrigin: true, rewrite: (p) => p.replace(/^\/api/, ''), }, -- Gitee From cafb7d03e3326581356e8e945be24f2ac814083d Mon Sep 17 00:00:00 2001 From: coderlmw Date: Sun, 29 Dec 2024 23:58:41 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E7=AB=AF=E5=85=BC?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BaseComponent/BaseTable/index.js | 2 + .../BaseTable/src/MoblieTable.vue | 365 +++++++++ .../pageContent/src/InfoDialog.vue | 68 ++ .../pageContent/src/MobileContent copy.vue | 732 ++++++++++++++++++ .../pageContent/src/MobileContent.vue | 483 ++++-------- .../pageContent/src/PageContent.vue | 38 +- .../HsjComponent/pageContent/src/utils.js | 27 + src/views/monitor/operlog/index.vue | 2 +- src/views/system/role/authUser.vue | 1 - 9 files changed, 1361 insertions(+), 357 deletions(-) create mode 100644 src/BaseComponent/BaseTable/src/MoblieTable.vue create mode 100644 src/components/HsjComponent/pageContent/src/InfoDialog.vue create mode 100644 src/components/HsjComponent/pageContent/src/MobileContent copy.vue create mode 100644 src/components/HsjComponent/pageContent/src/utils.js diff --git a/src/BaseComponent/BaseTable/index.js b/src/BaseComponent/BaseTable/index.js index 707f12e..80b20b9 100644 --- a/src/BaseComponent/BaseTable/index.js +++ b/src/BaseComponent/BaseTable/index.js @@ -1,2 +1,4 @@ import Table from './src/Table.vue' +import MoblieTable from './src/MoblieTable.vue' export default Table +export { MoblieTable } diff --git a/src/BaseComponent/BaseTable/src/MoblieTable.vue b/src/BaseComponent/BaseTable/src/MoblieTable.vue new file mode 100644 index 0000000..ab2479d --- /dev/null +++ b/src/BaseComponent/BaseTable/src/MoblieTable.vue @@ -0,0 +1,365 @@ + + + + + + + + + + + + + + + + + + + + + + + + + {{ field.label }}: + + + + {{ row[field.prop] }} + + + + + + + + + + + + + + {{ field.label }}: + + + {{ row[field.prop] }} + + + + + + + + + + + + + + + + + diff --git a/src/components/HsjComponent/pageContent/src/InfoDialog.vue b/src/components/HsjComponent/pageContent/src/InfoDialog.vue new file mode 100644 index 0000000..7db1d62 --- /dev/null +++ b/src/components/HsjComponent/pageContent/src/InfoDialog.vue @@ -0,0 +1,68 @@ + + + + + + {{ item.label }}: + + + + + + + {{ row[item.prop] }} + + + + + + + + 关闭 + + + + + diff --git a/src/components/HsjComponent/pageContent/src/MobileContent copy.vue b/src/components/HsjComponent/pageContent/src/MobileContent copy.vue new file mode 100644 index 0000000..95d5f0a --- /dev/null +++ b/src/components/HsjComponent/pageContent/src/MobileContent copy.vue @@ -0,0 +1,732 @@ + + + + + + + + + + + 添加 + + + + + + 删除 + + + + + + + + + + + + + + + + + + + {{ field.label }}: + + + + {{ row[field.prop] }}32479237592dafhoiahfihawifhawielufh + + + + + + + + + + + {{ field.label }}: + + + + + + {{ row[field.prop] }} + + + + + + + + + + + + + + + + diff --git a/src/components/HsjComponent/pageContent/src/MobileContent.vue b/src/components/HsjComponent/pageContent/src/MobileContent.vue index 2c3a29f..a9ba455 100644 --- a/src/components/HsjComponent/pageContent/src/MobileContent.vue +++ b/src/components/HsjComponent/pageContent/src/MobileContent.vue @@ -6,7 +6,9 @@ import to from '@/utils/to' import { interceptor } from '@/store/business/businessStore' import { antiShake } from '@/utils/hsj/utils' import DictCpn from './dictCpn.vue' - +import { MoblieTable } from '@/BaseComponent/BaseTable/index' +import { collectObjectsWithSlotName, hasSlot } from './utils' +import InfoDialog from './InfoDialog.vue' const props = defineProps({ // table的配置 contentConfig: { @@ -97,14 +99,7 @@ const props = defineProps({ // header需要显示哪些按钮 headerButtons: { type: Array, - default: () => [ - 'refresh', - 'add', - 'edit', - 'delete', - 'columnDisplay', - 'comSearch', - ], + default: () => ['add', 'delete'], }, tableSelected: { type: Array, @@ -188,7 +183,6 @@ const finalSearchData = computed(() => { watch( () => paginationInfo.value, (newValue, oldValue) => { - console.log(1111) // 当pageSize发生变化时将pageNum设置成第一页 if (newValue.pageSize !== oldValue.pageSize) { paginationInfo.value.pageNum = 1 @@ -239,11 +233,11 @@ const deleteRow = async (delData) => { let id = '' if (Array.isArray(delData)) { const ids = delData.map((item) => { - return item[props.idKey] ?? item[props.pageName + 'Id'] ?? item.id + return getId(item) }) id = ids.toString() } else { - id = delData[props.idKey] ?? delData[props.pageName + 'Id'] ?? delData.id + id = getId(delData) } if (id || id === 0) { await to( @@ -261,29 +255,44 @@ const deleteRow = async (delData) => { } isLoading.value = false } - -// 编辑按钮 -const editClick = async (item, type) => { - isLoading.value = true - // 取出当前点击这一行数据的id 优先props传入的idKey - let id = item[props.idKey] ?? item[props.pageName + 'Id'] ?? item.id +const getId = (row) => { + if (!row) { + return + } + return row[props.idKey] ?? row[props.pageName + 'Id'] ?? row.id +} +const getRowInfo = async (row) => { + let id = getId(row) if (id || id === 0) { // 拼接getInfo请求的url地址 let url = `${props.requestBaseUrl}${interceptor(props.pageName)}/${id}` let [res] = await to(getInfo(url)) - if (res?.data) { - emit('editBtnClick', res.data, type, res) - } + return res } else { proxy.$modal.notifyWarning('未获取到有效Id') } +} +// 编辑按钮 +const editClick = async (item, type) => { + isLoading.value = true + // 取出当前点击这一行数据的id 优先props传入的idKey + const res = await getRowInfo(item) + if (res?.data) { + emit('editBtnClick', res.data, type, res) + } isLoading.value = false } const addClick = () => { emit('addClick') } - +// 其他的插槽 +const exceptSlot = ['todo'] +// 所有插槽名称 +let otherSlot = collectObjectsWithSlotName( + props.contentConfig?.tableItem, + exceptSlot +) // 页面数据刷新函数 const refresh = () => { send(finalSearchData.value) @@ -331,45 +340,24 @@ const offListener = () => { isListen = false } -let headerItem = [] -let hasTodo = false -let centerItem = [] -let footerSlot = [] +const infoDialog = ref(false) +const infoCurrent = ref({}) +const cardHeaderClick = (row) => { + infoCurrent.value = row + infoDialog.value = true +} + const columnsFilter = () => { // 列的权限判断 const tableItem = props.contentConfig.tableItem.filter((item) => { if (!item.permission) return true return proxy.hasPermi(item.permission) }) - tableItem.forEach((item) => { - if (item.mobileSlot === 'header') { - headerItem.push(item) - } - if (item.mobileSlot === 'footer') { - if (item.slotName) { - footerSlot.push(item.slotName) - } else { - footerSlot.push(item.prop + 'Slot') - } - } - if (item.prop === 'todo') { - hasTodo = true - footerSlot.push(item.prop + 'Slot') - } - if (!item.mobileSlot) { - centerItem.push(item) - } - }) props.contentConfig.tableItem = tableItem } -const handleToTop = () => { - const main = document.querySelector('.el-main') - main?.scrollTo(0, 0) -} const init = () => { columnsFilter() } -let mainEl = null onMounted(() => { // 判断是否需要自动排序 if (props.autoDesc) { @@ -399,7 +387,6 @@ onMounted(() => { ...obj, }) } - mainEl = document.querySelector('.el-main') mittResize() onListener() }) @@ -412,13 +399,6 @@ onActivated(() => { onDeactivated(() => { offListener() }) -const vShowFooter = { - mounted: (el) => { - if (el.children.length === 1) { - el.parentNode && el.parentNode.removeChild(el) - } - }, -} init() defineExpose({ finalSearchData, @@ -432,159 +412,125 @@ defineExpose({ - - - - - - - 添加 - - - - - - 删除 - - - - - - - - - - - - - - + - - - - {{ field.label }}: - - - {{ row[field.prop] }} - - + + + + 添加 + + + + + + 删除 + + + + - - - - - - {{ field.label }}: - - - - - - {{ row[field.prop] }} - - - - + + + + + + + 编辑 + + + + + + 删除 + + + - - - - - - + + + + + @@ -592,131 +538,12 @@ defineExpose({ .page-content { background-color: var(--ba-bg-color); } -.headerContent { - display: flex; - justify-content: space-between; - padding: 12px; -} -.data-card { - position: relative; - border-radius: 12px; - /* 手机端按钮不能太小 */ - :deep(.el-button--small) { - padding: 8px 15px; - font-size: 14px; - height: 32px; - } - :deep(.svg-icon) { - font-size: 14px !important; - } -} -// 头部样式 -.card-header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 12px; - border-bottom: 1px solid var(--el-border-color); - .order-number { - display: flex; - font-size: 15px; - .label { - width: 76px; - color: var(--el-text-color-primary); - font-weight: 500; - } - .value { - color: var(--el-color-primary); - font-weight: 500; - flex: 1; - } - } -} -// 信息列表样式 -.info-list { - padding: 16px; - .info-row { - display: grid; - grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); - gap: 12px 24px; - } - .info-item { - display: flex; - align-items: center; - font-size: 14px; - line-height: 1.5; - white-space: nowrap; - overflow: hidden; - &.full-width { - grid-column: 1 / -1; - white-space: normal; - } - .label { - color: #666; - margin-right: 4px; - } - .value { - color: var(--el-text-color-primary); - flex: 1; - overflow: hidden; - text-overflow: ellipsis; - } - } -} -// 底部操作区 -.card-footer { +.todo { display: flex; - justify-content: flex-end; flex-wrap: wrap; - padding: 12px 16px; + justify-content: flex-end; :deep(.el-button) { - margin: 4px !important; - } -} -// 响应式处理 -@media screen and (max-width: 768px) { - .info-list { - padding: 12px; - .info-row { - grid-template-columns: repeat(2, 1fr); - gap: 8px; - } - } - .info-item { - font-size: 13px; - } - .card-footer { - padding: 12px; - flex-wrap: wrap; - } -} -// 超窄屏幕处理 -@media screen and (max-width: 375px) { - .info-list .info-row { - grid-template-columns: 1fr; - } -} -.footer { - display: flex; - align-items: center; - flex-wrap: wrap; - :deep(.el-pager) { - li { - margin: 0 1px; - } - } - :deep(.btn-prev) { - margin: 0 2px; - } - :deep(.btn-next) { - margin: 0 0 0 2px; - } - :deep(.el-pagination) { - padding: 0px; - --el-pagination-button-height: 28px; - --el-pagination-button-width: 28px; + margin: 4px; } - background-color: var(--ba-bg-color-overlay); - padding: 8px; } diff --git a/src/components/HsjComponent/pageContent/src/PageContent.vue b/src/components/HsjComponent/pageContent/src/PageContent.vue index dbe49e3..334cb23 100644 --- a/src/components/HsjComponent/pageContent/src/PageContent.vue +++ b/src/components/HsjComponent/pageContent/src/PageContent.vue @@ -9,6 +9,7 @@ import { interceptor } from '@/store/business/businessStore' import useStorage from '@/utils/hsj/useStorage' import { antiShake } from '@/utils/hsj/utils' import { VueDraggable } from 'vue-draggable-plus' +import { collectObjectsWithSlotName } from './utils' const props = defineProps({ // table的配置 contentConfig: { @@ -288,26 +289,11 @@ const addClick = () => { // 其他的插槽 const exceptSlot = ['todo'] -// 用于收集contentConfig的所有插槽名称 -const collectObjectsWithSlotName = (data, collectedObjects = []) => { - if (Array.isArray(data)) { - // 如果当前层级是数组 - data.forEach((item) => { - collectObjectsWithSlotName(item, collectedObjects) - }) - } else if (typeof data === 'object' && data !== null) { - // 如果当前层级是对象 - if ('slotName' in data && !exceptSlot.includes(data.slotName)) { - collectedObjects.push(data) // 当前对象有 slotName 属性,将其加入结果数组 - } - Object.values(data).forEach((value) => { - collectObjectsWithSlotName(value, collectedObjects) - }) - } - return collectedObjects -} // 所有插槽名称 -let otherSlot = collectObjectsWithSlotName(props.contentConfig?.tableItem) +let otherSlot = collectObjectsWithSlotName( + props.contentConfig?.tableItem, + exceptSlot +) // 排序发生变化触发的函数 const sortChange = (shortData) => { const { order, prop } = shortData @@ -766,19 +752,17 @@ defineExpose({ confirmButtonType="danger" :hide-after="0" @confirm="deleteRow(backData)" - v-if="hasPermi(permission.del)" + v-if=" + hasPermi(permission.del) && + showDelete && + handleDeleteShow(backData) + " > - + 删除 - diff --git a/src/components/HsjComponent/pageContent/src/utils.js b/src/components/HsjComponent/pageContent/src/utils.js new file mode 100644 index 0000000..cdbb0b5 --- /dev/null +++ b/src/components/HsjComponent/pageContent/src/utils.js @@ -0,0 +1,27 @@ +// 用于收集contentConfig的所有插槽名称 +export const collectObjectsWithSlotName = (data, exceptSlot = []) => { + const collectedObjects = [] + function collect(data, exceptSlot = []) { + if (Array.isArray(data)) { + // 如果当前层级是数组 + data.forEach((item) => { + collect(item, exceptSlot) + }) + } else if (typeof data === 'object' && data !== null) { + // 如果当前层级是对象 + if ('slotName' in data && !exceptSlot.includes(data.slotName)) { + collectedObjects.push(data) // 当前对象有 slotName 属性,将其加入结果数组 + } + Object.values(data).forEach((value) => { + collect(value, exceptSlot) + }) + } + } + collect(data, exceptSlot) + return collectedObjects +} + +// 用于判断父组件使用是否有某插槽 +export const hasSlot = (slots, arr) => { + return arr.some((key) => slots.hasOwnProperty(key)) +} diff --git a/src/views/monitor/operlog/index.vue b/src/views/monitor/operlog/index.vue index 4ded909..5970e44 100644 --- a/src/views/monitor/operlog/index.vue +++ b/src/views/monitor/operlog/index.vue @@ -152,7 +152,7 @@ const isSmall = window.isSmallScreen :fullscreen="isSmall" :width="getWidth(1000)" > - + {{ backData.formData.title }} / {{ typeFormat(backData.formData) }} diff --git a/src/views/system/role/authUser.vue b/src/views/system/role/authUser.vue index adcadca..1df8c3c 100644 --- a/src/views/system/role/authUser.vue +++ b/src/views/system/role/authUser.vue @@ -125,7 +125,6 @@ init() > Date: Mon, 30 Dec 2024 16:56:35 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0webApp=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 39 +- public/manifest.json | 31 + public/vite.png | Bin 0 -> 4679 bytes .../src/cpn/src/Datepicker/Datepicker.vue | 2 +- .../BaseTable/src/MoblieTable.vue | 77 +- src/assets/css/app.scss | 3 +- src/assets/css/dark.scss | 3 - .../pageContent/src/MobileContent copy.vue | 732 ------------------ .../pageContent/src/MobileContent.vue | 24 +- .../pageContent/src/PageContent.vue | 6 +- .../HsjComponent/pageContent/src/index.vue | 34 +- .../pageSearch/src/MobileSearch.vue | 6 +- .../pageSearch/src/PageSearch.vue | 5 +- .../HsjComponent/pageSearch/src/index.vue | 5 +- src/layout/menus/Link.vue | 14 +- src/utils/useDark.js | 2 + src/views/monitor/operlog/index.vue | 2 +- .../system/config/config/contentConfig.js | 2 +- src/views/system/dict/data.vue | 3 +- .../system/role/components/AssignDialog.vue | 3 + .../system/role/components/AuthUserDialog.vue | 2 + 21 files changed, 195 insertions(+), 800 deletions(-) create mode 100644 public/manifest.json create mode 100644 public/vite.png delete mode 100644 src/components/HsjComponent/pageContent/src/MobileContent copy.vue diff --git a/index.html b/index.html index 0daeaff..ff172e1 100644 --- a/index.html +++ b/index.html @@ -1,21 +1,28 @@ - + + + + + + - - - - - - - 若依管理系统 - + + + - - - - - - - + 若依管理系统 + + + + + + diff --git a/public/manifest.json b/public/manifest.json new file mode 100644 index 0000000..1483b4c --- /dev/null +++ b/public/manifest.json @@ -0,0 +1,31 @@ +{ + "name": "若依管理系统", + "short_name": "若依", + "description": "若依管理系统", + "background_color": "#fff", + "display": "standalone", + "orientation": "portrait", + "start_url": "/", + "icons": [ + { + "src": "/vite.png", + "sizes": "96x96", + "type": "image/png" + }, + { + "src": "/vite.png", + "sizes": "144x144", + "type": "image/png" + }, + { + "src": "/vite.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/vite.png", + "sizes": "512x512", + "type": "image/png" + } + ] +} diff --git a/public/vite.png b/public/vite.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c72de27dd5e7e21937e7e372a88303baa7aed7 GIT binary patch literal 4679 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 JPDHLkV1i4D-`W5G literal 0 HcmV?d00001 diff --git a/src/BaseComponent/BaseForm/src/cpn/src/Datepicker/Datepicker.vue b/src/BaseComponent/BaseForm/src/cpn/src/Datepicker/Datepicker.vue index f99c019..29abc2e 100644 --- a/src/BaseComponent/BaseForm/src/cpn/src/Datepicker/Datepicker.vue +++ b/src/BaseComponent/BaseForm/src/cpn/src/Datepicker/Datepicker.vue @@ -26,8 +26,8 @@ defineExpose({ :placeholder="'请选择' + item.label" v-model="value" valueFormat="YYYY-MM-DD" - v-bind="item.config" :editable="false" + v-bind="item.config" v-on="item.eventFunction || {}" > diff --git a/src/BaseComponent/BaseTable/src/MoblieTable.vue b/src/BaseComponent/BaseTable/src/MoblieTable.vue index ab2479d..53e318c 100644 --- a/src/BaseComponent/BaseTable/src/MoblieTable.vue +++ b/src/BaseComponent/BaseTable/src/MoblieTable.vue @@ -55,7 +55,11 @@ const props = defineProps({ default: 100, }, }) -const emits = defineEmits(['cardHeaderClick']) +const emits = defineEmits([ + 'cardHeaderClick', + 'selectionChange', + 'update:paginationInfo', +]) let headerItem = [] let centerItem = [] let footerItem = [] @@ -94,6 +98,7 @@ const handleToTop = () => { const main = document.querySelector('.el-main') main?.scrollTo(0, 0) } + const vShowFooter = { mounted: (el) => { if (el.firstElementChild) { @@ -101,6 +106,8 @@ const vShowFooter = { if (firstChild.clientWidth === 0) { el.parentNode && el.parentNode.removeChild(el) } + } else { + el.parentNode && el.parentNode.removeChild(el) } }, } @@ -120,11 +127,20 @@ const isHiddenItem = (item) => { const cardHeaderClick = (row) => { emits('cardHeaderClick', row) } +const selectionChange = () => { + emits('selectionChange', checkList.value) +} +const hasSlot = (slots, arr) => { + return arr.some((key) => slots.hasOwnProperty(key)) +} const checkList = ref([]) - + @@ -139,21 +155,27 @@ const checkList = ref([]) - + - + {{ field.label }}: - + {{ row[field.prop] }} - + @@ -163,13 +185,21 @@ const checkList = ref([]) - + {{ field.label }}: - + {{ row[field.prop] }} @@ -181,7 +211,7 @@ const checkList = ref([]) @@ -211,7 +241,7 @@ const checkList = ref([]) @@ -219,6 +249,7 @@ const checkList = ref([]) diff --git a/src/components/HsjComponent/pageContent/src/MobileContent.vue b/src/components/HsjComponent/pageContent/src/MobileContent.vue index a9ba455..4e1d9c2 100644 --- a/src/components/HsjComponent/pageContent/src/MobileContent.vue +++ b/src/components/HsjComponent/pageContent/src/MobileContent.vue @@ -9,6 +9,8 @@ import DictCpn from './dictCpn.vue' import { MoblieTable } from '@/BaseComponent/BaseTable/index' import { collectObjectsWithSlotName, hasSlot } from './utils' import InfoDialog from './InfoDialog.vue' +import { useSlots } from 'vue' + const props = defineProps({ // table的配置 contentConfig: { @@ -18,7 +20,7 @@ const props = defineProps({ // table的事件监听 tableListener: { type: Object, - default: () => {}, + default: () => ({}), }, // 页面名称与PageSearch和PageDialog的一致,每个页面必须唯一 pageName: { @@ -73,7 +75,7 @@ const props = defineProps({ // 规则是 requestBaseUrl+ interceptor(pageName) + requestUrl requestBaseUrl: { type: String, - default: '/', + default: '', }, requestUrl: { type: String, @@ -358,6 +360,13 @@ const columnsFilter = () => { const init = () => { columnsFilter() } +const showHeader = () => { + const slots = useSlots() + const btns = props.headerButtons.some( + (item) => item === 'add' || item === 'delete' + ) + return hasSlot(slots, ['handleLeft']) || btns +} onMounted(() => { // 判断是否需要自动排序 if (props.autoDesc) { @@ -407,22 +416,22 @@ defineExpose({ deleteRow, editClick, dataList, + mittResize, }) - + - + { const editMoreClick = () => { emit('editMoreClick') } -// 用于判断父组件使用是否有某插槽 -const hasSlot = (slots, arr) => { - return arr.some((key) => slots.hasOwnProperty(key)) -} const columnsFilter = () => { // 列的权限判断 diff --git a/src/components/HsjComponent/pageContent/src/index.vue b/src/components/HsjComponent/pageContent/src/index.vue index 4aa3d39..7052c79 100644 --- a/src/components/HsjComponent/pageContent/src/index.vue +++ b/src/components/HsjComponent/pageContent/src/index.vue @@ -2,6 +2,7 @@ import PageContent from './PageContent.vue' import MobileContent from './MobileContent.vue' import { useConfig } from '@/store/modules/layout' +import { computed } from 'vue' defineOptions({ components: { PageContent, @@ -14,6 +15,7 @@ const props = defineProps({ default: true, }, }) +const tableRef = ref('tableRef') const config = useConfig() const layoutType = computed(() => { if (props.useMobile && config.layout.isMobile) { @@ -22,9 +24,39 @@ const layoutType = computed(() => { return 'PageContent' } }) +const refresh = () => { + tableRef.value?.refresh() +} +const baseTabelRef = computed(() => { + return tableRef.value?.baseTabelRef +}) +const finalSearchData = computed(() => { + return tableRef.value?.finalSearchData +}) +const deleteRow = (delData) => { + tableRef.value?.deleteRow(delData) +} +const editClick = (row, type) => { + tableRef.value?.deleteRow(row, type) +} +const dataList = computed(() => { + return tableRef.value?.dataList +}) +const mittResize = () => { + return tableRef.value?.mittResize +} +defineExpose({ + finalSearchData, + refresh, + baseTabelRef, + deleteRow, + editClick, + dataList, + mittResize, +}) - + { } resizeObserver.observe(pageSearchRef.value) }) +const getFormData = () => { + return formData.value +} defineExpose({ - formData, + getFormData, search, setFormData, }) @@ -152,7 +155,6 @@ defineExpose({