From 8727d91415ef5786555b37542647f5482417880a Mon Sep 17 00:00:00 2001 From: fhysy <1149505133@qq.com> Date: Mon, 29 Sep 2025 09:12:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E9=9D=A2=E6=9D=83=E9=99=90=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E5=92=8CCRON=E8=A1=A8=E8=BE=BE=E5=BC=8F=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在设备详情页新增权限访问控制,防止无权限用户访问产品详情 - 引入并集成 shiyzhangcron 组件库实现 CRON 表达式可视化配置 - 新增 CronPickerModal 弹窗组件用于选择和确认 CRON 表达式 - 更新 package.json 添加 shiyzhangcron 依赖 - 调整按钮权限控制逻辑以适配新的权限校验方式 - 优化部分页面样式与交互逻辑 --- apps/web-antd/package.json | 1 + .../src/components/CronPickerModal/index.vue | 65 +++++++++++++++++++ apps/web-antd/src/views/demo/test/detail.vue | 51 ++++++++++++++- .../src/views/device/device/detail/index.vue | 7 ++ .../src/views/device/device/index.vue | 5 +- .../detail/components/DeviceAccess.vue | 2 +- apps/web-antd/types/shiyzhangcron.d.ts | 2 + .../pepicons-pencil--bulletin-notice.svg | 1 + packages/icons/src/svg/index.ts | 4 ++ 9 files changed, 131 insertions(+), 7 deletions(-) create mode 100644 apps/web-antd/src/components/CronPickerModal/index.vue create mode 100644 apps/web-antd/types/shiyzhangcron.d.ts create mode 100644 packages/icons/src/svg/icons/pepicons-pencil--bulletin-notice.svg diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index 110d9bc..9139186 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -53,6 +53,7 @@ "monaco-editor": "^0.52.2", "pinia": "catalog:", "rxjs": "^7.8.2", + "shiyzhangcron": "^0.1.5", "tinymce": "^7.3.0", "unplugin-vue-components": "^0.27.3", "vite-plugin-monaco-editor": "^1.1.0", diff --git a/apps/web-antd/src/components/CronPickerModal/index.vue b/apps/web-antd/src/components/CronPickerModal/index.vue new file mode 100644 index 0000000..68b30e1 --- /dev/null +++ b/apps/web-antd/src/components/CronPickerModal/index.vue @@ -0,0 +1,65 @@ + + + diff --git a/apps/web-antd/src/views/demo/test/detail.vue b/apps/web-antd/src/views/demo/test/detail.vue index e4221e6..a124a00 100644 --- a/apps/web-antd/src/views/demo/test/detail.vue +++ b/apps/web-antd/src/views/demo/test/detail.vue @@ -1,10 +1,57 @@ diff --git a/apps/web-antd/src/views/device/device/detail/index.vue b/apps/web-antd/src/views/device/device/detail/index.vue index 6463b87..65d3dbf 100644 --- a/apps/web-antd/src/views/device/device/detail/index.vue +++ b/apps/web-antd/src/views/device/device/detail/index.vue @@ -2,6 +2,7 @@ import { computed, defineAsyncComponent, onMounted, onUnmounted } from 'vue'; import { useRoute, useRouter } from 'vue-router'; +import { useAccess } from '@vben/access'; import { Page } from '@vben/common-ui'; import { ArrowLeftOutlined } from '@ant-design/icons-vue'; @@ -12,6 +13,8 @@ import { deviceStateOptions } from '#/constants/dicts'; import { useDeviceStore } from '#/store/device'; import { getWebSocket } from '#/utils/websocket'; +const { hasAccessByCodes } = useAccess(); + const BasicInfo = defineAsyncComponent( () => import('./components/BasicInfo.vue'), ); @@ -106,6 +109,10 @@ const handleTabChange = (key: string) => { }; const handleProductClick = () => { + if (!hasAccessByCodes(['device:product:query'])) { + message.warning('暂无权限'); + return; + } router.push(`/device/product/detail/${currentDevice.value.productId}`); }; diff --git a/apps/web-antd/src/views/device/device/index.vue b/apps/web-antd/src/views/device/device/index.vue index 84b9509..9b821c4 100644 --- a/apps/web-antd/src/views/device/device/index.vue +++ b/apps/web-antd/src/views/device/device/index.vue @@ -349,10 +349,7 @@ const [DeviceDrawer, drawerApi] = useVbenDrawer({