Commit 1da996ec46402704a97566fa86c5647792a3ad24

Authored by ww
1 parent 53e42e29

feat: DEFECT-1123 分享功能新增分享链接

@@ -3,9 +3,13 @@ @@ -3,9 +3,13 @@
3 import { BasicModal, useModalInner } from '/@/components/Modal'; 3 import { BasicModal, useModalInner } from '/@/components/Modal';
4 import { FieldsEnum, schemas, ViewTypeEnum } from './config'; 4 import { FieldsEnum, schemas, ViewTypeEnum } from './config';
5 import { DataBoardRecord } from '/@/api/dataBoard/model'; 5 import { DataBoardRecord } from '/@/api/dataBoard/model';
6 - import { Alert } from 'ant-design-vue'; 6 + import { Alert, Button, Tooltip } from 'ant-design-vue';
7 import { ref, unref } from 'vue'; 7 import { ref, unref } from 'vue';
8 import { nextTick } from 'vue'; 8 import { nextTick } from 'vue';
  9 + import { ModalParamsType } from '/#/utils';
  10 + import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
  11 + import { useMessage } from '/@/hooks/web/useMessage';
  12 + import { computed } from 'vue';
9 13
10 const props = defineProps<{ 14 const props = defineProps<{
11 shareApi?: (...args: any[]) => Promise<any>; 15 shareApi?: (...args: any[]) => Promise<any>;
@@ -13,15 +17,20 @@ @@ -13,15 +17,20 @@
13 17
14 const loading = ref(false); 18 const loading = ref(false);
15 const record = ref<DataBoardRecord>({} as unknown as DataBoardRecord); 19 const record = ref<DataBoardRecord>({} as unknown as DataBoardRecord);
  20 + const link = ref('');
16 21
17 - const [register, { closeModal }] = useModalInner(async (data: DataBoardRecord) => {  
18 - record.value = data;  
19 - await nextTick();  
20 - setFieldsValue({  
21 - [FieldsEnum.IS_SHARE]: data.viewType === ViewTypeEnum.PUBLIC_VIEW,  
22 - [FieldsEnum.ACCESS_CREDENTIALS]: data.accessCredentials,  
23 - });  
24 - }); 22 + const [register, { closeModal }] = useModalInner(
  23 + async (data: ModalParamsType<DataBoardRecord>) => {
  24 + const { record: value, href } = data;
  25 + record.value = value;
  26 + link.value = href;
  27 + await nextTick();
  28 + setFieldsValue({
  29 + [FieldsEnum.IS_SHARE]: value.viewType === ViewTypeEnum.PUBLIC_VIEW,
  30 + [FieldsEnum.ACCESS_CREDENTIALS]: value.accessCredentials,
  31 + });
  32 + }
  33 + );
25 34
26 const [registerForm, { getFieldsValue, setFieldsValue }] = useForm({ 35 const [registerForm, { getFieldsValue, setFieldsValue }] = useForm({
27 schemas, 36 schemas,
@@ -32,6 +41,10 @@ @@ -32,6 +41,10 @@
32 41
33 const emit = defineEmits(['register', 'success']); 42 const emit = defineEmits(['register', 'success']);
34 43
  44 + const handleOpenLink = () => {
  45 + window.open(unref(link));
  46 + };
  47 +
35 const handleSubmit = async () => { 48 const handleSubmit = async () => {
36 try { 49 try {
37 loading.value = true; 50 loading.value = true;
@@ -44,6 +57,19 @@ @@ -44,6 +57,19 @@
44 loading.value = false; 57 loading.value = false;
45 } 58 }
46 }; 59 };
  60 +
  61 + const isPublicState = computed(() => {
  62 + return unref(record).viewType === ViewTypeEnum.PUBLIC_VIEW;
  63 + });
  64 +
  65 + const { clipboardRef, isSuccessRef } = useCopyToClipboard();
  66 + const { createMessage } = useMessage();
  67 + const handleCopy = () => {
  68 + clipboardRef.value = unref(link);
  69 + if (unref(isSuccessRef)) {
  70 + createMessage.success('复制成功~');
  71 + }
  72 + };
47 </script> 73 </script>
48 74
49 <template> 75 <template>
@@ -54,5 +80,27 @@ @@ -54,5 +80,27 @@
54 message="私有视图只有项目成员可以浏览,公开视图拥有一个公开的 URL,任何人无需登录即可浏览." 80 message="私有视图只有项目成员可以浏览,公开视图拥有一个公开的 URL,任何人无需登录即可浏览."
55 /> 81 />
56 <BasicForm @register="registerForm" /> 82 <BasicForm @register="registerForm" />
  83 + <section>
  84 + <div v-if="isPublicState" class="mt-4">
  85 + <span> 设置分享后, 可通过如下 </span>
  86 + <Button type="link" class="!px-1" @click="handleOpenLink"> 链接 </Button>
  87 + <span>访问:</span>
  88 + </div>
  89 + <Tooltip v-if="isPublicState" title="点击复制链接">
  90 + <div
  91 + class="px-4 py-2 my-2 bg-gray-50 font-semibold tracking-wider text-base cursor-pointer truncate"
  92 + @click="handleCopy"
  93 + >
  94 + <span>{{ link }}</span>
  95 + </div>
  96 + </Tooltip>
  97 +
  98 + <Alert type="warning">
  99 + <template #message>
  100 + <span class="font-bold mr-1">提示:</span>
  101 + <span>不要忘记将相关设备 <span class="mx-1 font-bold">公开</span> 以访问其数据</span>
  102 + </template>
  103 + </Alert>
  104 + </section>
57 </BasicModal> 105 </BasicModal>
58 </template> 106 </template>
@@ -153,17 +153,20 @@ @@ -153,17 +153,20 @@
153 getListData(); 153 getListData();
154 }; 154 };
155 155
156 - const { clipboardRef, isSuccessRef } = useCopyToClipboard();  
157 - const handleCreateShareUrl = (record: ConfigurationCenterItemsModal) => {  
158 - if (!unref(getShareFlag)) return;  
159 - const { origin } = location; 156 + const createShareUrl = (record: ConfigurationCenterItemsModal) => {
160 const searchParams = new URLSearchParams(); 157 const searchParams = new URLSearchParams();
161 isDev && searchParams.set('dev', '1'); 158 isDev && searchParams.set('dev', '1');
162 searchParams.set('share', 'SCADA'); 159 searchParams.set('share', 'SCADA');
163 searchParams.set('configurationId', record.id); 160 searchParams.set('configurationId', record.id);
164 searchParams.set('publicId', record.publicId || ''); 161 searchParams.set('publicId', record.publicId || '');
165 searchParams.set('lightbox', '1'); 162 searchParams.set('lightbox', '1');
166 - const url = `${origin}${configurationPrefix}/?${searchParams.toString()}`; 163 + return `${origin}${configurationPrefix}/?${searchParams.toString()}`;
  164 + };
  165 +
  166 + const { clipboardRef, isSuccessRef } = useCopyToClipboard();
  167 + const handleCreateShareUrl = (record: ConfigurationCenterItemsModal) => {
  168 + if (!unref(getShareFlag)) return;
  169 + const url = createShareUrl(record);
167 clipboardRef.value = url; 170 clipboardRef.value = url;
168 if (unref(isSuccessRef)) { 171 if (unref(isSuccessRef)) {
169 createMessage.success('复制成功~'); 172 createMessage.success('复制成功~');
@@ -173,7 +176,7 @@ @@ -173,7 +176,7 @@
173 const [registerShareModal, { openModal }] = useModal(); 176 const [registerShareModal, { openModal }] = useModal();
174 177
175 const handleOpenShareModal = (record: ConfigurationCenterItemsModal) => { 178 const handleOpenShareModal = (record: ConfigurationCenterItemsModal) => {
176 - openModal(true, record); 179 + openModal(true, { record, href: createShareUrl(record) });
177 }; 180 };
178 181
179 const listEl = ref<Nullable<ComponentElRef>>(null); 182 const listEl = ref<Nullable<ComponentElRef>>(null);
@@ -163,15 +163,18 @@ @@ -163,15 +163,18 @@
163 const getPublicApiListData = () => {}; 163 const getPublicApiListData = () => {};
164 164
165 const [registerShareModal, { openModal }] = useModal(); 165 const [registerShareModal, { openModal }] = useModal();
166 - const handleOpenShareModal = (item: BigScreenCenterItemsModel) => {  
167 - openModal(true, item); 166 + const handleOpenShareModal = (record: BigScreenCenterItemsModel) => {
  167 + openModal(true, { record, href: createShareUrl(record) });
  168 + };
  169 +
  170 + const createShareUrl = (record: BigScreenCenterItemsModel) => {
  171 + const { origin } = location;
  172 + return `${origin}${largeDesignerPrefix}/#/share/preview/${record.id}/${record.publicId}`;
168 }; 173 };
169 174
170 const { clipboardRef, isSuccessRef } = useCopyToClipboard(); 175 const { clipboardRef, isSuccessRef } = useCopyToClipboard();
171 const handleCreateShareUrl = (record: BigScreenCenterItemsModel) => { 176 const handleCreateShareUrl = (record: BigScreenCenterItemsModel) => {
172 - const { origin } = location;  
173 - const { largeDesignerPrefix } = useGlobSetting();  
174 - clipboardRef.value = `${origin}${largeDesignerPrefix}/#/share/preview/${record.id}/${record.publicId}`; 177 + clipboardRef.value = createShareUrl(record);
175 if (unref(isSuccessRef)) { 178 if (unref(isSuccessRef)) {
176 createMessage.success('复制成功~'); 179 createMessage.success('复制成功~');
177 } 180 }
@@ -22,6 +22,8 @@ @@ -22,6 +22,8 @@
22 import { useForm, BasicForm } from '/@/components/Form'; 22 import { useForm, BasicForm } from '/@/components/Form';
23 import { formSchema } from './config/searchForm'; 23 import { formSchema } from './config/searchForm';
24 import { ShareModal } from '/@/views/common/ShareModal'; 24 import { ShareModal } from '/@/views/common/ShareModal';
  25 + import { ModalParamsType } from '/#/utils';
  26 + import { DataActionModeEnum } from '/@/enums/toolEnum';
25 27
26 const ListItem = List.Item; 28 const ListItem = List.Item;
27 const router = useRouter(); 29 const router = useRouter();
@@ -133,7 +135,11 @@ @@ -133,7 +135,11 @@
133 }; 135 };
134 136
135 const handleOpenShareModal = (record: DataBoardRecord) => { 137 const handleOpenShareModal = (record: DataBoardRecord) => {
136 - openShareModal(true, record); 138 + openShareModal(true, {
  139 + record,
  140 + mode: DataActionModeEnum.READ,
  141 + href: createShareUrl(record),
  142 + } as ModalParamsType<DataBoardRecord>);
137 }; 143 };
138 144
139 const handleMenuEvent = (event: DropMenu, record: DataBoardRecord) => { 145 const handleMenuEvent = (event: DropMenu, record: DataBoardRecord) => {
@@ -8,4 +8,5 @@ export type DynamicProps<T> = { @@ -8,4 +8,5 @@ export type DynamicProps<T> = {
8 export interface ModalParamsType<T = Recordable> { 8 export interface ModalParamsType<T = Recordable> {
9 mode: DataActionModeEnum; 9 mode: DataActionModeEnum;
10 record: T; 10 record: T;
  11 + [key: string]: any;
11 } 12 }