Showing
3 changed files
with
140 additions
and
90 deletions
@@ -50,6 +50,18 @@ export const uploadThumbnail = (file: FormData) => { | @@ -50,6 +50,18 @@ export const uploadThumbnail = (file: FormData) => { | ||
50 | return defHttp.post<FileUploadResponse>({ url: API.UPLOAD, params: file }); | 50 | return defHttp.post<FileUploadResponse>({ url: API.UPLOAD, params: file }); |
51 | }; | 51 | }; |
52 | 52 | ||
53 | +export const bigScreenPublish = (id) => { | ||
54 | + return defHttp.get({ | ||
55 | + url: API.basicUrl + '/publish/' + id, | ||
56 | + }); | ||
57 | +}; | ||
58 | + | ||
59 | +export const bigScreenCancelPublish = (id) => { | ||
60 | + return defHttp.get({ | ||
61 | + url: API.basicUrl + '/cancel_publish/' + id, | ||
62 | + }); | ||
63 | +}; | ||
64 | + | ||
53 | /** | 65 | /** |
54 | * 大屏公共接口 | 66 | * 大屏公共接口 |
55 | */ | 67 | */ |
@@ -81,14 +93,14 @@ export const deleteBigViewInterface = (ids: string[]) => { | @@ -81,14 +93,14 @@ export const deleteBigViewInterface = (ids: string[]) => { | ||
81 | }); | 93 | }); |
82 | }; | 94 | }; |
83 | 95 | ||
84 | -export function getPublish(id) { | 96 | +export const getPublish = (id) => { |
85 | return defHttp.get({ | 97 | return defHttp.get({ |
86 | url: API.DATA_VIEW_INTERFACE + '/publish/' + id, | 98 | url: API.DATA_VIEW_INTERFACE + '/publish/' + id, |
87 | }); | 99 | }); |
88 | -} | 100 | +}; |
89 | 101 | ||
90 | -export function getCancelPublish(id) { | 102 | +export const getCancelPublish = (id) => { |
91 | return defHttp.get({ | 103 | return defHttp.get({ |
92 | url: API.DATA_VIEW_INTERFACE + '/cancel_publish/' + id, | 104 | url: API.DATA_VIEW_INTERFACE + '/cancel_publish/' + id, |
93 | }); | 105 | }); |
94 | -} | 106 | +}; |
1 | -<script lang="ts" setup> | ||
2 | - import { Dropdown, Menu, Popconfirm } from 'ant-design-vue'; | ||
3 | - import { computed, useSlots } from 'vue'; | ||
4 | - import Icon from '../Icon'; | ||
5 | - import { usePermission } from '/@/hooks/web/usePermission'; | ||
6 | - | ||
7 | - export interface AuthDropDownProps { | ||
8 | - dropMenuList: AuthDropMenuList[]; | ||
9 | - trigger?: ('contextmenu' | 'click' | 'hover')[]; | ||
10 | - } | ||
11 | - | ||
12 | - export interface AuthDropMenuList { | ||
13 | - icon?: string; | ||
14 | - event: string | number; | ||
15 | - text: string; | ||
16 | - disabled?: boolean; | ||
17 | - divider?: boolean; | ||
18 | - auth?: string; | ||
19 | - onClick?: Fn; | ||
20 | - popconfirm?: { | ||
21 | - cancelText?: string; | ||
22 | - okText?: string; | ||
23 | - okType?: string; | ||
24 | - title?: string; | ||
25 | - icon?: string; | ||
26 | - disabled?: boolean; | ||
27 | - onCancel?: Fn; | ||
28 | - onConfirm?: Fn; | ||
29 | - onVisibleChange?: Fn; | ||
30 | - }; | ||
31 | - } | ||
32 | - | ||
33 | - const props = defineProps<AuthDropDownProps>(); | ||
34 | - | ||
35 | - const slot = useSlots(); | ||
36 | - | ||
37 | - const { hasPermission } = usePermission(); | ||
38 | - | ||
39 | - const getMenuList = computed(() => { | ||
40 | - const { dropMenuList } = props; | ||
41 | - return dropMenuList.filter((menu) => (menu.auth ? hasPermission(menu.auth) : true)); | ||
42 | - }); | ||
43 | - | ||
44 | - const hasDefaultSlot = computed(() => { | ||
45 | - return !!slot.default; | ||
46 | - }); | ||
47 | -</script> | ||
48 | - | ||
49 | -<template> | ||
50 | - <Dropdown :trigger="$props.trigger"> | ||
51 | - <template #overlay> | ||
52 | - <Menu v-if="getMenuList.length"> | ||
53 | - <template v-for="item in getMenuList" :key="item.event"> | ||
54 | - <Menu.Divider v-if="item.divider" /> | ||
55 | - <Menu.Item v-if="!item.popconfirm" @click="item.onClick"> | ||
56 | - <span class="flex justify-center items-center"> | ||
57 | - <Icon :icon="item.icon" /> | ||
58 | - <span class="ml-2">{{ item.text }}</span> | ||
59 | - </span> | ||
60 | - </Menu.Item> | ||
61 | - <Menu.Item v-if="item.popconfirm"> | ||
62 | - <Popconfirm v-bind="item.popconfirm"> | ||
63 | - <template v-if="item.popconfirm.icon" #icon> | ||
64 | - <Icon :icon="item.popconfirm.icon" /> | ||
65 | - </template> | ||
66 | - <span class="flex justify-center items-center"> | ||
67 | - <Icon :icon="item.icon" /> | ||
68 | - <span class="ml-2">{{ item.text }}</span> | ||
69 | - </span> | ||
70 | - </Popconfirm> | ||
71 | - </Menu.Item> | ||
72 | - </template> | ||
73 | - </Menu> | ||
74 | - </template> | ||
75 | - <Icon | ||
76 | - v-if="!hasDefaultSlot" | ||
77 | - class="items-center justify-center" | ||
78 | - icon="ant-design:ellipsis-outlined" | ||
79 | - :class="!getMenuList.length ? '!text-gray-200 !cursor-not-allowed' : ''" | ||
80 | - /> | ||
81 | - <slot name="default"></slot> | ||
82 | - </Dropdown> | ||
83 | -</template> | 1 | +<script lang="ts" setup> |
2 | + import { Dropdown, Menu, Popconfirm } from 'ant-design-vue'; | ||
3 | + import { computed, useSlots } from 'vue'; | ||
4 | + import Icon from '../Icon'; | ||
5 | + import { usePermission } from '/@/hooks/web/usePermission'; | ||
6 | + | ||
7 | + export interface AuthDropDownProps { | ||
8 | + dropMenuList: AuthDropMenuList[]; | ||
9 | + trigger?: ('contextmenu' | 'click' | 'hover')[]; | ||
10 | + } | ||
11 | + | ||
12 | + export interface AuthDropMenuList { | ||
13 | + icon?: string; | ||
14 | + event: string | number; | ||
15 | + text: string; | ||
16 | + disabled?: boolean; | ||
17 | + divider?: boolean; | ||
18 | + auth?: string; | ||
19 | + onClick?: Fn; | ||
20 | + popconfirm?: { | ||
21 | + cancelText?: string; | ||
22 | + okText?: string; | ||
23 | + okType?: string; | ||
24 | + title?: string; | ||
25 | + icon?: string; | ||
26 | + disabled?: boolean; | ||
27 | + onCancel?: Fn; | ||
28 | + onConfirm?: Fn; | ||
29 | + onVisibleChange?: Fn; | ||
30 | + }; | ||
31 | + } | ||
32 | + | ||
33 | + const props = defineProps<AuthDropDownProps>(); | ||
34 | + | ||
35 | + const slot = useSlots(); | ||
36 | + | ||
37 | + const { hasPermission } = usePermission(); | ||
38 | + | ||
39 | + const getMenuList = computed(() => { | ||
40 | + const { dropMenuList } = props; | ||
41 | + return dropMenuList.filter((menu) => (menu.auth ? hasPermission(menu.auth) : true)); | ||
42 | + }); | ||
43 | + | ||
44 | + const hasDefaultSlot = computed(() => { | ||
45 | + return !!slot.default; | ||
46 | + }); | ||
47 | +</script> | ||
48 | + | ||
49 | +<template> | ||
50 | + <Dropdown :trigger="$props.trigger"> | ||
51 | + <template #overlay> | ||
52 | + <Menu v-if="getMenuList.length"> | ||
53 | + <template v-for="item in getMenuList" :key="item.event"> | ||
54 | + <Menu.Divider v-if="item.divider" /> | ||
55 | + <Menu.Item :disabled="item.disabled" v-if="!item.popconfirm" @click="item.onClick"> | ||
56 | + <span class="flex justify-center items-center"> | ||
57 | + <Icon :icon="item.icon" /> | ||
58 | + <span class="ml-2">{{ item.text }}</span> | ||
59 | + </span> | ||
60 | + </Menu.Item> | ||
61 | + <Menu.Item :disabled="item.disabled" v-if="item.popconfirm"> | ||
62 | + <Popconfirm v-bind="item.popconfirm"> | ||
63 | + <template v-if="item.popconfirm.icon" #icon> | ||
64 | + <Icon :icon="item.popconfirm.icon" /> | ||
65 | + </template> | ||
66 | + <span class="flex justify-center items-center"> | ||
67 | + <Icon :icon="item.icon" /> | ||
68 | + <span class="ml-2">{{ item.text }}</span> | ||
69 | + </span> | ||
70 | + </Popconfirm> | ||
71 | + </Menu.Item> | ||
72 | + </template> | ||
73 | + </Menu> | ||
74 | + </template> | ||
75 | + <Icon | ||
76 | + v-if="!hasDefaultSlot" | ||
77 | + class="items-center justify-center" | ||
78 | + icon="ant-design:ellipsis-outlined" | ||
79 | + :class="!getMenuList.length ? '!text-gray-200 !cursor-not-allowed' : ''" | ||
80 | + /> | ||
81 | + <slot name="default"></slot> | ||
82 | + </Dropdown> | ||
83 | +</template> |
@@ -3,7 +3,12 @@ | @@ -3,7 +3,12 @@ | ||
3 | import { ReloadOutlined } from '@ant-design/icons-vue'; | 3 | import { ReloadOutlined } from '@ant-design/icons-vue'; |
4 | import { onMounted, reactive, ref, unref } from 'vue'; | 4 | import { onMounted, reactive, ref, unref } from 'vue'; |
5 | import { OrganizationIdTree, useResetOrganizationTree } from '../common/organizationIdTree'; | 5 | import { OrganizationIdTree, useResetOrganizationTree } from '../common/organizationIdTree'; |
6 | - import { deleteBigScreenenter, getPage } from '/@/api/bigscreen/center/bigscreenCenter'; | 6 | + import { |
7 | + bigScreenCancelPublish, | ||
8 | + bigScreenPublish, | ||
9 | + deleteBigScreenenter, | ||
10 | + getPage, | ||
11 | + } from '/@/api/bigscreen/center/bigscreenCenter'; | ||
7 | import { BigScreenCenterItemsModel } from '/@/api/bigscreen/center/model/bigscreenCenterModel'; | 12 | import { BigScreenCenterItemsModel } from '/@/api/bigscreen/center/model/bigscreenCenterModel'; |
8 | import { PageWrapper } from '/@/components/Page'; | 13 | import { PageWrapper } from '/@/components/Page'; |
9 | import { BasicForm, useForm } from '/@/components/Form'; | 14 | import { BasicForm, useForm } from '/@/components/Form'; |
@@ -150,6 +155,17 @@ | @@ -150,6 +155,17 @@ | ||
150 | }); | 155 | }); |
151 | 156 | ||
152 | const getPublicApiListData = () => {}; | 157 | const getPublicApiListData = () => {}; |
158 | + | ||
159 | + const handlePublish = async ({ id }) => { | ||
160 | + await bigScreenPublish(id); | ||
161 | + createMessage.success('发布成功'); | ||
162 | + getListData(); | ||
163 | + }; | ||
164 | + const handleCancelPublish = async ({ id }) => { | ||
165 | + await bigScreenCancelPublish(id); | ||
166 | + createMessage.success('取消发布成功'); | ||
167 | + getListData(); | ||
168 | + }; | ||
153 | </script> | 169 | </script> |
154 | 170 | ||
155 | <template> | 171 | <template> |
@@ -206,6 +222,11 @@ | @@ -206,6 +222,11 @@ | ||
206 | >所属组织:{{ item.organizationDTO.name }}</span | 222 | >所属组织:{{ item.organizationDTO.name }}</span |
207 | > | 223 | > |
208 | </div> | 224 | </div> |
225 | + <div> | ||
226 | + <span class="masker-text-state" | ||
227 | + >发布状态:{{ item.state === 1 ? '已发布' : '未发布' }}</span | ||
228 | + > | ||
229 | + </div> | ||
209 | </div> | 230 | </div> |
210 | </div> | 231 | </div> |
211 | </div> | 232 | </div> |
@@ -228,11 +249,19 @@ | @@ -228,11 +249,19 @@ | ||
228 | <AuthDropDown | 249 | <AuthDropDown |
229 | :dropMenuList="[ | 250 | :dropMenuList="[ |
230 | { | 251 | { |
231 | - text: '未发布', | 252 | + text: '发布', |
232 | auth: ConfigurationPermission.UPDATE, | 253 | auth: ConfigurationPermission.UPDATE, |
233 | icon: 'ant-design:node-expand-outlined', | 254 | icon: 'ant-design:node-expand-outlined', |
234 | event: '', | 255 | event: '', |
235 | - onClick: handleCreateOrUpdate.bind(null, item), | 256 | + onClick: handlePublish.bind(null, item), |
257 | + disabled: item.state === 0 ? false : true, | ||
258 | + }, | ||
259 | + { | ||
260 | + text: '取消发布', | ||
261 | + icon: 'ant-design:node-collapse-outlined', | ||
262 | + event: '', | ||
263 | + onClick: handleCancelPublish.bind(null, item), | ||
264 | + disabled: item.state === 1 ? false : true, | ||
236 | }, | 265 | }, |
237 | { | 266 | { |
238 | text: '编辑', | 267 | text: '编辑', |
@@ -240,11 +269,13 @@ | @@ -240,11 +269,13 @@ | ||
240 | icon: 'clarity:note-edit-line', | 269 | icon: 'clarity:note-edit-line', |
241 | event: '', | 270 | event: '', |
242 | onClick: handleCreateOrUpdate.bind(null, item), | 271 | onClick: handleCreateOrUpdate.bind(null, item), |
272 | + disabled: item.state === 0 ? false : true, | ||
243 | }, | 273 | }, |
244 | { | 274 | { |
245 | text: '删除', | 275 | text: '删除', |
246 | auth: ConfigurationPermission.DELETE, | 276 | auth: ConfigurationPermission.DELETE, |
247 | icon: 'ant-design:delete-outlined', | 277 | icon: 'ant-design:delete-outlined', |
278 | + disabled: item.state === 0 ? false : true, | ||
248 | event: '', | 279 | event: '', |
249 | popconfirm: { | 280 | popconfirm: { |
250 | title: '是否确认删除操作?', | 281 | title: '是否确认删除操作?', |
@@ -316,6 +347,13 @@ | @@ -316,6 +347,13 @@ | ||
316 | bottom: 0; | 347 | bottom: 0; |
317 | left: 0.8rem; | 348 | left: 0.8rem; |
318 | } | 349 | } |
350 | + | ||
351 | + .masker-text-state { | ||
352 | + font-size: 12px; | ||
353 | + position: absolute; | ||
354 | + bottom: 0; | ||
355 | + right: 0.8rem; | ||
356 | + } | ||
319 | } | 357 | } |
320 | } | 358 | } |
321 | 359 |