Commit 95e6bb261e35bfae9126b1ca11d8f5cd67b4cafc
1 parent
7880b723
fix: set product profile button permission
Showing
6 changed files
with
138 additions
and
65 deletions
src/assets/icons/product-default.svg
0 → 100644
| 1 | +<svg t="1671442803003" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4002" width="200" height="200"><path d="M0 0m178.086957 0l667.826086 0q178.086957 0 178.086957 178.086957l0 667.826086q0 178.086957-178.086957 178.086957l-667.826086 0q-178.086957 0-178.086957-178.086957l0-667.826086q0-178.086957 178.086957-178.086957Z" fill="#2E7BFC" p-id="4003"></path><path d="M758.717217 394.373565v268.866783l-238.191304 134.455652v-268.911304l124.14887-70.054957v94.497391l51.956869-29.985391V429.412174l62.107826-35.038609z m-493.434434 0l238.191304 134.433392v268.866782l-238.191304-134.433391V394.373565zM512 226.304l246.717217 139.241739L512 504.787478l-246.717217-139.241739L512 226.326261z" fill="#FFFFFF" p-id="4004"></path></svg> |
| @@ -9,6 +9,14 @@ export enum Platform { | @@ -9,6 +9,14 @@ export enum Platform { | ||
| 9 | PC = 'pc', | 9 | PC = 'pc', |
| 10 | } | 10 | } |
| 11 | 11 | ||
| 12 | +export enum ConfigurationPermission { | ||
| 13 | + CREATE = 'api:yt:configuration:center:post', | ||
| 14 | + UPDATE = 'api:yt:configuration:center:update', | ||
| 15 | + DELETE = 'api:yt:configuration:center:delete', | ||
| 16 | + DESIGN = 'api:yt:configuration:center:get_configuration_info:design', | ||
| 17 | + PREVIEW = 'api:yt:configuration:center:get_configuration_info:preview', | ||
| 18 | +} | ||
| 19 | + | ||
| 12 | export const PC_DEFAULT_CONTENT = | 20 | export const PC_DEFAULT_CONTENT = |
| 13 | '<mxfile><diagram>dZHBDsIgDIafhvuEzOh5Tr142sEzGXWQsHVhmKFP7xbAidMT5fv/UtoSVrTuZHgvLyhAE5oJR9iBUMrybT4dM3l4stnTzJPGKBHYAir1hACj7a4EDInRImqr+hTW2HVQ24RxY3BMbTfUadWeN7ACVc31ml6VsPK7jVk4g2pkLJ3tgtLy6A5gkFzg+IFYSVhhEK2PWleAnscXB+Pzjn/U988MdPZHwhQsb0+XZEesfAE=</diagram></mxfile>'; | 21 | '<mxfile><diagram>dZHBDsIgDIafhvuEzOh5Tr142sEzGXWQsHVhmKFP7xbAidMT5fv/UtoSVrTuZHgvLyhAE5oJR9iBUMrybT4dM3l4stnTzJPGKBHYAir1hACj7a4EDInRImqr+hTW2HVQ24RxY3BMbTfUadWeN7ACVc31ml6VsPK7jVk4g2pkLJ3tgtLy6A5gkFzg+IFYSVhhEK2PWleAnscXB+Pzjn/U988MdPZHwhQsb0+XZEesfAE=</diagram></mxfile>'; |
| 14 | 22 |
| @@ -7,7 +7,7 @@ | @@ -7,7 +7,7 @@ | ||
| 7 | EditOutlined, | 7 | EditOutlined, |
| 8 | EllipsisOutlined, | 8 | EllipsisOutlined, |
| 9 | } from '@ant-design/icons-vue'; | 9 | } from '@ant-design/icons-vue'; |
| 10 | - import { onMounted, reactive, ref, unref } from 'vue'; | 10 | + import { computed, onMounted, reactive, ref, unref } from 'vue'; |
| 11 | import { OrganizationIdTree, useResetOrganizationTree } from '../../common/organizationIdTree'; | 11 | import { OrganizationIdTree, useResetOrganizationTree } from '../../common/organizationIdTree'; |
| 12 | import { | 12 | import { |
| 13 | deleteConfigurationCenter, | 13 | deleteConfigurationCenter, |
| @@ -17,7 +17,7 @@ | @@ -17,7 +17,7 @@ | ||
| 17 | import { PageWrapper } from '/@/components/Page'; | 17 | import { PageWrapper } from '/@/components/Page'; |
| 18 | import { Dropdown } from '/@/components/Dropdown'; | 18 | import { Dropdown } from '/@/components/Dropdown'; |
| 19 | import { BasicForm, useForm } from '/@/components/Form'; | 19 | import { BasicForm, useForm } from '/@/components/Form'; |
| 20 | - import { searchFormSchema } from './center.data'; | 20 | + import { ConfigurationPermission, searchFormSchema } from './center.data'; |
| 21 | import { useMessage } from '/@/hooks/web/useMessage'; | 21 | import { useMessage } from '/@/hooks/web/useMessage'; |
| 22 | import { Authority } from '/@/components/Authority'; | 22 | import { Authority } from '/@/components/Authority'; |
| 23 | import { isDevMode } from '/@/utils/env'; | 23 | import { isDevMode } from '/@/utils/env'; |
| @@ -98,6 +98,16 @@ | @@ -98,6 +98,16 @@ | ||
| 98 | 98 | ||
| 99 | const [registerDrawer, { openDrawer }] = useDrawer(); | 99 | const [registerDrawer, { openDrawer }] = useDrawer(); |
| 100 | 100 | ||
| 101 | + const { hasPermission } = usePermission(); | ||
| 102 | + | ||
| 103 | + const getPreviewFlag = computed(() => { | ||
| 104 | + return hasPermission(ConfigurationPermission.PREVIEW); | ||
| 105 | + }); | ||
| 106 | + | ||
| 107 | + const getDesignFlag = computed(() => { | ||
| 108 | + return hasPermission(ConfigurationPermission.DESIGN); | ||
| 109 | + }); | ||
| 110 | + | ||
| 101 | const handleCreateOrUpdate = (record?: ConfigurationCenterItemsModal) => { | 111 | const handleCreateOrUpdate = (record?: ConfigurationCenterItemsModal) => { |
| 102 | if (record) { | 112 | if (record) { |
| 103 | openDrawer(true, { | 113 | openDrawer(true, { |
| @@ -114,15 +124,15 @@ | @@ -114,15 +124,15 @@ | ||
| 114 | const { configurationPrefix } = useGlobSetting(); | 124 | const { configurationPrefix } = useGlobSetting(); |
| 115 | const isDev = isDevMode(); | 125 | const isDev = isDevMode(); |
| 116 | 126 | ||
| 117 | - const { hasPermission } = usePermission(); | ||
| 118 | const handlePreview = (record: ConfigurationCenterItemsModal) => { | 127 | const handlePreview = (record: ConfigurationCenterItemsModal) => { |
| 119 | - if (!hasPermission('api:yt:configuration:center:get_configuration_info:get')) return; | 128 | + if (!unref(getPreviewFlag)) return; |
| 120 | window.open( | 129 | window.open( |
| 121 | `${configurationPrefix}/${isDev ? '?dev=1&' : '?'}configurationId=${record!.id}&lightbox=1` | 130 | `${configurationPrefix}/${isDev ? '?dev=1&' : '?'}configurationId=${record!.id}&lightbox=1` |
| 122 | ); | 131 | ); |
| 123 | }; | 132 | }; |
| 124 | 133 | ||
| 125 | const handleDesign = (record: ConfigurationCenterItemsModal) => { | 134 | const handleDesign = (record: ConfigurationCenterItemsModal) => { |
| 135 | + if (!unref(getDesignFlag)) return; | ||
| 126 | window.open(`${configurationPrefix}/${isDev ? '?dev=1&' : '?'}configurationId=${record!.id}`); | 136 | window.open(`${configurationPrefix}/${isDev ? '?dev=1&' : '?'}configurationId=${record!.id}`); |
| 127 | }; | 137 | }; |
| 128 | 138 | ||
| @@ -175,7 +185,9 @@ | @@ -175,7 +185,9 @@ | ||
| 175 | > | 185 | > |
| 176 | <template #header> | 186 | <template #header> |
| 177 | <div class="flex gap-3 justify-end"> | 187 | <div class="flex gap-3 justify-end"> |
| 178 | - <Button type="primary" @click="handleCreateOrUpdate()">新增组态</Button> | 188 | + <Authority :value="ConfigurationPermission.CREATE"> |
| 189 | + <Button type="primary" @click="handleCreateOrUpdate()">新增组态</Button> | ||
| 190 | + </Authority> | ||
| 179 | <Popover :trigger="['hover']"> | 191 | <Popover :trigger="['hover']"> |
| 180 | <template #content> | 192 | <template #content> |
| 181 | <div class="w-50"> | 193 | <div class="w-50"> |
| @@ -214,29 +226,35 @@ | @@ -214,29 +226,35 @@ | ||
| 214 | </div> | 226 | </div> |
| 215 | </template> | 227 | </template> |
| 216 | <template class="ant-card-actions" #actions> | 228 | <template class="ant-card-actions" #actions> |
| 217 | - <Authority value="api:yt:configuration:center:get_configuration_info:get"> | ||
| 218 | - <Tooltip title="预览"> | ||
| 219 | - <EyeOutlined key="setting" @click="handlePreview(item)" /> | ||
| 220 | - </Tooltip> | ||
| 221 | - </Authority> | ||
| 222 | - <Authority value="api:yt:configuration:center:get_configuration_info:get"> | ||
| 223 | - <Tooltip title="设计"> | ||
| 224 | - <EditOutlined key="edit" @click="handleDesign(item)" /> | ||
| 225 | - </Tooltip> | ||
| 226 | - </Authority> | 229 | + <Tooltip title="预览"> |
| 230 | + <EyeOutlined | ||
| 231 | + :class="getPreviewFlag ? '' : '!cursor-not-allowed !text-gray-200'" | ||
| 232 | + key="setting" | ||
| 233 | + @click="handlePreview(item)" | ||
| 234 | + /> | ||
| 235 | + </Tooltip> | ||
| 236 | + <Tooltip title="设计"> | ||
| 237 | + <EditOutlined | ||
| 238 | + :class="getDesignFlag ? '' : '!cursor-not-allowed !text-gray-200'" | ||
| 239 | + key="edit" | ||
| 240 | + @click="handleDesign(item)" | ||
| 241 | + /> | ||
| 242 | + </Tooltip> | ||
| 227 | <Dropdown | 243 | <Dropdown |
| 228 | :dropMenuList="[ | 244 | :dropMenuList="[ |
| 229 | { | 245 | { |
| 230 | text: '编辑', | 246 | text: '编辑', |
| 231 | - auth: 'api:yt:configuration:center:update', | 247 | + auth: ConfigurationPermission.UPDATE, |
| 232 | icon: 'clarity:note-edit-line', | 248 | icon: 'clarity:note-edit-line', |
| 249 | + event: '', | ||
| 233 | onClick: handleCreateOrUpdate.bind(null, item), | 250 | onClick: handleCreateOrUpdate.bind(null, item), |
| 234 | }, | 251 | }, |
| 235 | { | 252 | { |
| 236 | text: '删除', | 253 | text: '删除', |
| 237 | - auth: 'api:yt:configuration:center:delete', | 254 | + auth: ConfigurationPermission.DELETE, |
| 238 | icon: 'ant-design:delete-outlined', | 255 | icon: 'ant-design:delete-outlined', |
| 239 | color: 'error', | 256 | color: 'error', |
| 257 | + event: '', | ||
| 240 | onClick: handleDelete.bind(null, item), | 258 | onClick: handleDelete.bind(null, item), |
| 241 | }, | 259 | }, |
| 242 | ]" | 260 | ]" |
| @@ -13,16 +13,23 @@ | @@ -13,16 +13,23 @@ | ||
| 13 | } from '/@/api/device/deviceConfigApi'; | 13 | } from '/@/api/device/deviceConfigApi'; |
| 14 | import { ProfileRecord } from '/@/api/device/model/deviceConfigModel'; | 14 | import { ProfileRecord } from '/@/api/device/model/deviceConfigModel'; |
| 15 | import { Dropdown } from '/@/components/Dropdown'; | 15 | import { Dropdown } from '/@/components/Dropdown'; |
| 16 | - import { defaultObj, searchFormSchema, DeviceTypeName } from './device.profile.data'; | 16 | + import { |
| 17 | + defaultObj, | ||
| 18 | + searchFormSchema, | ||
| 19 | + DeviceTypeName, | ||
| 20 | + ProductPermission, | ||
| 21 | + } from './device.profile.data'; | ||
| 17 | import { useMessage } from '/@/hooks/web/useMessage'; | 22 | import { useMessage } from '/@/hooks/web/useMessage'; |
| 18 | import { useSyncConfirm } from '/@/hooks/component/useSyncConfirm'; | 23 | import { useSyncConfirm } from '/@/hooks/component/useSyncConfirm'; |
| 19 | import DeviceProfileModal from './DeviceProfileModal.vue'; | 24 | import DeviceProfileModal from './DeviceProfileModal.vue'; |
| 20 | import DeviceProfileDrawer from './DeviceProfileDrawer.vue'; | 25 | import DeviceProfileDrawer from './DeviceProfileDrawer.vue'; |
| 21 | import { useModal } from '/@/components/Modal'; | 26 | import { useModal } from '/@/components/Modal'; |
| 22 | import { useDrawer } from '/@/components/Drawer'; | 27 | import { useDrawer } from '/@/components/Drawer'; |
| 28 | + import productDefault from '/@/assets/icons/product-default.svg'; | ||
| 29 | + import { usePermission } from '/@/hooks/web/usePermission'; | ||
| 23 | 30 | ||
| 24 | defineProps<{ | 31 | defineProps<{ |
| 25 | - mode: Mode; | 32 | + mode: EnumTableCardMode; |
| 26 | }>(); | 33 | }>(); |
| 27 | 34 | ||
| 28 | const emit = defineEmits(['changeMode']); | 35 | const emit = defineEmits(['changeMode']); |
| @@ -31,8 +38,7 @@ | @@ -31,8 +38,7 @@ | ||
| 31 | SET_DEFAULT = 'setDefault', | 38 | SET_DEFAULT = 'setDefault', |
| 32 | DELETE = 'delete', | 39 | DELETE = 'delete', |
| 33 | } | 40 | } |
| 34 | - const IMAGE_FALLBACK = | ||
| 35 | - 'data:image/png;base64,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'; | 41 | + const IMAGE_FALLBACK = productDefault; |
| 36 | 42 | ||
| 37 | const { createMessage } = useMessage(); | 43 | const { createMessage } = useMessage(); |
| 38 | const { createSyncConfirm } = useSyncConfirm(); | 44 | const { createSyncConfirm } = useSyncConfirm(); |
| @@ -94,6 +100,40 @@ | @@ -94,6 +100,40 @@ | ||
| 94 | } | 100 | } |
| 95 | }; | 101 | }; |
| 96 | 102 | ||
| 103 | + const { hasPermission } = usePermission(); | ||
| 104 | + | ||
| 105 | + const getHasDeleteFlag = computed(() => { | ||
| 106 | + return hasPermission(ProductPermission.DELETE); | ||
| 107 | + }); | ||
| 108 | + | ||
| 109 | + const getHasDetailFlag = computed(() => { | ||
| 110 | + return hasPermission(ProductPermission.DETAIL); | ||
| 111 | + }); | ||
| 112 | + | ||
| 113 | + const getHasUpdateFlag = computed(() => { | ||
| 114 | + return hasPermission(ProductPermission.UPDATE); | ||
| 115 | + }); | ||
| 116 | + | ||
| 117 | + const getDropDownList = (record: ProfileRecord) => { | ||
| 118 | + const list = [ | ||
| 119 | + { | ||
| 120 | + text: '默认', | ||
| 121 | + event: DropMenuEvent.SET_DEFAULT, | ||
| 122 | + icon: 'ant-design:unordered-list-outlined', | ||
| 123 | + onClick: handleSetDefault.bind(null, record), | ||
| 124 | + }, | ||
| 125 | + ]; | ||
| 126 | + if (unref(getHasDeleteFlag)) { | ||
| 127 | + list.push({ | ||
| 128 | + text: '删除', | ||
| 129 | + event: DropMenuEvent.DELETE, | ||
| 130 | + icon: 'ant-design:delete-outlined', | ||
| 131 | + onClick: handleDelete.bind(null, [record.id]), | ||
| 132 | + }); | ||
| 133 | + } | ||
| 134 | + return list; | ||
| 135 | + }; | ||
| 136 | + | ||
| 97 | const handleModeChange = (mode: EnumTableCardMode) => { | 137 | const handleModeChange = (mode: EnumTableCardMode) => { |
| 98 | emit('changeMode', mode); | 138 | emit('changeMode', mode); |
| 99 | }; | 139 | }; |
| @@ -118,10 +158,12 @@ | @@ -118,10 +158,12 @@ | ||
| 118 | }; | 158 | }; |
| 119 | 159 | ||
| 120 | const handleShowDetail = (record: ProfileRecord) => { | 160 | const handleShowDetail = (record: ProfileRecord) => { |
| 161 | + if (!unref(getHasDetailFlag)) return; | ||
| 121 | openDrawer(true, { record }); | 162 | openDrawer(true, { record }); |
| 122 | }; | 163 | }; |
| 123 | 164 | ||
| 124 | const handleUpdate = (record: ProfileRecord) => { | 165 | const handleUpdate = (record: ProfileRecord) => { |
| 166 | + if (!unref(getHasUpdateFlag)) return; | ||
| 125 | openModal(true, { | 167 | openModal(true, { |
| 126 | record, | 168 | record, |
| 127 | isUpdate: true, | 169 | isUpdate: true, |
| @@ -173,20 +215,27 @@ | @@ -173,20 +215,27 @@ | ||
| 173 | > | 215 | > |
| 174 | <template #header> | 216 | <template #header> |
| 175 | <div class="flex gap-3 justify-end"> | 217 | <div class="flex gap-3 justify-end"> |
| 176 | - <Button type="primary" @click="handleCreate">新增产品</Button> | 218 | + <Authority :value="ProductPermission.CREATE"> |
| 219 | + <Button type="primary" @click="handleCreate">新增产品</Button> | ||
| 220 | + </Authority> | ||
| 221 | + | ||
| 177 | <Button type="primary" @click="handleSelectAll"> | 222 | <Button type="primary" @click="handleSelectAll"> |
| 178 | {{ getSelectAllFlag ? '反选' : '全选' }} | 223 | {{ getSelectAllFlag ? '反选' : '全选' }} |
| 179 | </Button> | 224 | </Button> |
| 180 | - <Button | ||
| 181 | - type="primary" | ||
| 182 | - danger | ||
| 183 | - :disabled="!getCheckedRecord.length" | ||
| 184 | - @click="handleDelete(getCheckedRecord)" | ||
| 185 | - > | ||
| 186 | - 批量删除 | ||
| 187 | - </Button> | 225 | + <Authority :value="ProductPermission.DELETE"> |
| 226 | + <Button | ||
| 227 | + type="primary" | ||
| 228 | + danger | ||
| 229 | + :disabled="!getCheckedRecord.length" | ||
| 230 | + @click="handleDelete(getCheckedRecord)" | ||
| 231 | + > | ||
| 232 | + 批量删除 | ||
| 233 | + </Button> | ||
| 234 | + </Authority> | ||
| 235 | + | ||
| 188 | <ModeSwitchButton :value="$props.mode" @change="handleModeChange" /> | 236 | <ModeSwitchButton :value="$props.mode" @change="handleModeChange" /> |
| 189 | <CardLayoutButton v-model:value="colNumber" @change="getDataSource" /> | 237 | <CardLayoutButton v-model:value="colNumber" @change="getDataSource" /> |
| 238 | + | ||
| 190 | <Tooltip title="刷新"> | 239 | <Tooltip title="刷新"> |
| 191 | <Button type="primary" @click="getDataSource"> | 240 | <Button type="primary" @click="getDataSource"> |
| 192 | <ReloadOutlined :spin="loading" /> | 241 | <ReloadOutlined :spin="loading" /> |
| @@ -213,33 +262,21 @@ | @@ -213,33 +262,21 @@ | ||
| 213 | </div> | 262 | </div> |
| 214 | </template> | 263 | </template> |
| 215 | <template class="ant-card-actions" #actions> | 264 | <template class="ant-card-actions" #actions> |
| 216 | - <Authority> | ||
| 217 | - <Tooltip title="详情"> | ||
| 218 | - <EyeOutlined key="setting" @click.stop="handleShowDetail(item)" /> | ||
| 219 | - </Tooltip> | ||
| 220 | - </Authority> | ||
| 221 | - <Authority> | ||
| 222 | - <Tooltip title="编辑"> | ||
| 223 | - <FormOutlined key="edit" @click.stop="handleUpdate(item)" /> | ||
| 224 | - </Tooltip> | ||
| 225 | - </Authority> | ||
| 226 | - <Dropdown | ||
| 227 | - :trigger="['hover']" | ||
| 228 | - :drop-menu-list="[ | ||
| 229 | - { | ||
| 230 | - text: '默认', | ||
| 231 | - event: DropMenuEvent.SET_DEFAULT, | ||
| 232 | - icon: 'ant-design:unordered-list-outlined', | ||
| 233 | - onClick: handleSetDefault.bind(null, item), | ||
| 234 | - }, | ||
| 235 | - { | ||
| 236 | - text: '删除', | ||
| 237 | - event: DropMenuEvent.DELETE, | ||
| 238 | - icon: 'ant-design:delete-outlined', | ||
| 239 | - onClick: handleDelete.bind(null, [item.id]), | ||
| 240 | - }, | ||
| 241 | - ]" | ||
| 242 | - > | 265 | + <Tooltip title="详情"> |
| 266 | + <EyeOutlined | ||
| 267 | + :class="getHasDetailFlag ? '' : '!cursor-not-allowed !text-gray-200'" | ||
| 268 | + key="setting" | ||
| 269 | + @click.stop="handleShowDetail(item)" | ||
| 270 | + /> | ||
| 271 | + </Tooltip> | ||
| 272 | + <Tooltip title="编辑"> | ||
| 273 | + <FormOutlined | ||
| 274 | + :class="getHasUpdateFlag ? '' : '!cursor-not-allowed !text-gray-200'" | ||
| 275 | + key="edit" | ||
| 276 | + @click.stop="handleUpdate(item)" | ||
| 277 | + /> | ||
| 278 | + </Tooltip> | ||
| 279 | + <Dropdown :trigger="['hover']" :drop-menu-list="getDropDownList(item)"> | ||
| 243 | <MoreOutlined @click.stop class="transform rotate-90" /> | 280 | <MoreOutlined @click.stop class="transform rotate-90" /> |
| 244 | </Dropdown> | 281 | </Dropdown> |
| 245 | </template> | 282 | </template> |
| @@ -7,15 +7,15 @@ | @@ -7,15 +7,15 @@ | ||
| 7 | :clickToRowSelect="false" | 7 | :clickToRowSelect="false" |
| 8 | > | 8 | > |
| 9 | <template #toolbar> | 9 | <template #toolbar> |
| 10 | - <Authority value="api:yt:deviceProfile:post"> | 10 | + <Authority :value="ProductPermission.CREATE"> |
| 11 | <a-button type="primary" @click="handleCreate"> 新增产品 </a-button> | 11 | <a-button type="primary" @click="handleCreate"> 新增产品 </a-button> |
| 12 | </Authority> | 12 | </Authority> |
| 13 | - <Authority value="api:yt:deviceProfile:import"> | 13 | + <Authority :value="ProductPermission.IMPORT"> |
| 14 | <ImpExcel @success="loadDataSuccess" dateFormat="YYYY-MM-DD"> | 14 | <ImpExcel @success="loadDataSuccess" dateFormat="YYYY-MM-DD"> |
| 15 | <a-button @click="handleImport"> 导入产品 </a-button> | 15 | <a-button @click="handleImport"> 导入产品 </a-button> |
| 16 | </ImpExcel> | 16 | </ImpExcel> |
| 17 | </Authority> | 17 | </Authority> |
| 18 | - <Authority value="api:yt:deviceProfile:delete"> | 18 | + <Authority :value="ProductPermission.DELETE"> |
| 19 | <Popconfirm | 19 | <Popconfirm |
| 20 | title="您确定要批量删除数据" | 20 | title="您确定要批量删除数据" |
| 21 | ok-text="确定" | 21 | ok-text="确定" |
| @@ -44,13 +44,13 @@ | @@ -44,13 +44,13 @@ | ||
| 44 | :actions="[ | 44 | :actions="[ |
| 45 | { | 45 | { |
| 46 | label: '详情', | 46 | label: '详情', |
| 47 | - auth: 'api:yt:deviceProfile:get', | 47 | + auth: ProductPermission.DETAIL, |
| 48 | icon: 'ant-design:eye-outlined', | 48 | icon: 'ant-design:eye-outlined', |
| 49 | onClick: handleDetailView.bind(null, record), | 49 | onClick: handleDetailView.bind(null, record), |
| 50 | }, | 50 | }, |
| 51 | { | 51 | { |
| 52 | label: '编辑', | 52 | label: '编辑', |
| 53 | - auth: 'api:yt:deviceProfile:update', | 53 | + auth: ProductPermission.UPDATE, |
| 54 | icon: 'clarity:note-edit-line', | 54 | icon: 'clarity:note-edit-line', |
| 55 | onClick: handleEdit.bind(null, record), | 55 | onClick: handleEdit.bind(null, record), |
| 56 | ifShow: () => { | 56 | ifShow: () => { |
| @@ -69,13 +69,13 @@ | @@ -69,13 +69,13 @@ | ||
| 69 | }, | 69 | }, |
| 70 | { | 70 | { |
| 71 | label: '导出', | 71 | label: '导出', |
| 72 | - auth: 'api:yt:deviceProfile:export', | 72 | + auth: ProductPermission.EXPORT, |
| 73 | icon: 'ant-design:login-outlined', | 73 | icon: 'ant-design:login-outlined', |
| 74 | onClick: handleExport.bind(null, record), | 74 | onClick: handleExport.bind(null, record), |
| 75 | }, | 75 | }, |
| 76 | { | 76 | { |
| 77 | label: '删除', | 77 | label: '删除', |
| 78 | - auth: 'api:yt:deviceProfile:delete', | 78 | + auth: ProductPermission.DELETE, |
| 79 | icon: 'ant-design:delete-outlined', | 79 | icon: 'ant-design:delete-outlined', |
| 80 | color: 'error', | 80 | color: 'error', |
| 81 | popConfirm: { | 81 | popConfirm: { |
| @@ -102,7 +102,7 @@ | @@ -102,7 +102,7 @@ | ||
| 102 | <script lang="ts" setup> | 102 | <script lang="ts" setup> |
| 103 | import { ref, nextTick, onUnmounted } from 'vue'; | 103 | import { ref, nextTick, onUnmounted } from 'vue'; |
| 104 | import { BasicTable, TableImg, useTable, TableAction, BasicColumn } from '/@/components/Table'; | 104 | import { BasicTable, TableImg, useTable, TableAction, BasicColumn } from '/@/components/Table'; |
| 105 | - import { columns, searchFormSchema, defaultObj } from './device.profile.data'; | 105 | + import { columns, searchFormSchema, defaultObj, ProductPermission } from './device.profile.data'; |
| 106 | import { useMessage } from '/@/hooks/web/useMessage'; | 106 | import { useMessage } from '/@/hooks/web/useMessage'; |
| 107 | import { | 107 | import { |
| 108 | deviceConfigGetQuery, | 108 | deviceConfigGetQuery, |
| @@ -19,6 +19,15 @@ export enum DeviceTypeName { | @@ -19,6 +19,15 @@ export enum DeviceTypeName { | ||
| 19 | GATEWAY = '网关设备', | 19 | GATEWAY = '网关设备', |
| 20 | SENSOR = '网关子设备', | 20 | SENSOR = '网关子设备', |
| 21 | } | 21 | } |
| 22 | +export enum ProductPermission { | ||
| 23 | + DETAIL = 'api:yt:deviceProfile:get', | ||
| 24 | + CREATE = 'api:yt:deviceProfile:post', | ||
| 25 | + UPDATE = 'api:yt:deviceProfile:update', | ||
| 26 | + DELETE = 'api:yt:deviceProfile:delete', | ||
| 27 | + SET_DEFAULT = '', | ||
| 28 | + IMPORT = 'api:yt:deviceProfile:import', | ||
| 29 | + EXPORT = 'api:yt:deviceProfile:export', | ||
| 30 | +} | ||
| 22 | 31 | ||
| 23 | export enum ModelOfMatterPermission { | 32 | export enum ModelOfMatterPermission { |
| 24 | CREATE = 'api:yt:things_model:post', | 33 | CREATE = 'api:yt:things_model:post', |