diff --git a/src/logics/initAppConfig.ts b/src/logics/initAppConfig.ts index 563d6ae..fce0fe3 100644 --- a/src/logics/initAppConfig.ts +++ b/src/logics/initAppConfig.ts @@ -21,6 +21,7 @@ import { getCommonStoragePrefix, getStorageShortName } from '@/utils/env' import { Persistent } from '@/utils/cache/persistent' import { deepMerge } from '@/utils' import { ThemeEnum } from '@/enums/appEnum' +import { isInIframe } from '@/utils/iframe' // Initial project configuration export function initAppConfigStore() { @@ -47,6 +48,11 @@ export function initAppConfigStore() { catch (error) { console.log(error) } + + // 如果当前界面被当作iframe使用,设置页面全屏显示 + console.warn(`${isInIframe()}__isInIframe`) + projCfg.fullContent = isInIframe() + appStore.setProjectConfig(projCfg) // init dark mode diff --git a/src/router/guard/permissionGuard.ts b/src/router/guard/permissionGuard.ts index 97016b3..dbc794c 100644 --- a/src/router/guard/permissionGuard.ts +++ b/src/router/guard/permissionGuard.ts @@ -31,6 +31,10 @@ export function createPermissionGuard(router: Router) { // return // } + const routerToken = to.query.token || to.query.access_token || undefined + if (routerToken) + userStore.setAccessToken(routerToken as string) + const token = userStore.getAccessToken // Whitelist can be directly entered diff --git a/src/settings/projectSetting.ts b/src/settings/projectSetting.ts index 52d3c30..6454922 100644 --- a/src/settings/projectSetting.ts +++ b/src/settings/projectSetting.ts @@ -44,7 +44,7 @@ const setting: ProjectConfig = { // 色弱模式 colorWeak: false, // 是否取消菜单,顶部,多标签页显示, 用于可能内嵌在别的系统内 - fullContent: false, + fullContent: true, // 主题内容宽度 contentMode: ContentEnum.FULL, // 是否显示logo @@ -116,7 +116,7 @@ const setting: ProjectConfig = { // 多标签 multiTabsSetting: { // 刷新后是否保留已经打开的标签页 - cache: false, + cache: true, // 开启 show: true, // 显示图标 @@ -155,8 +155,8 @@ const setting: ProjectConfig = { // 是否使用全局错误捕获 useErrorHandle: false, // 是否开启回到顶部 - useOpenBackTop: true, - // 是否可以嵌入iframe页面 + useOpenBackTop: false, + // 是否可以嵌入iframe页面 canEmbedIFramePage: true, // 切换界面的时候是否删除未关闭的message及notify closeMessageOnSwitch: true, diff --git a/src/utils/iframe.ts b/src/utils/iframe.ts new file mode 100644 index 0000000..a5eb846 --- /dev/null +++ b/src/utils/iframe.ts @@ -0,0 +1,10 @@ +// 检测当前页面是否被嵌套在 iframe 中 +export function isInIframe(): boolean { + try { + return window.self !== window.top + } + catch (e) { + // 如果跨域访问被拒绝,catch 会捕获异常 + return true + } +} diff --git a/src/views/infra/bookmark/event.data.ts b/src/views/infra/bookmark/event.data.ts new file mode 100644 index 0000000..a8a49b1 --- /dev/null +++ b/src/views/infra/bookmark/event.data.ts @@ -0,0 +1,25 @@ +/** + * 第三方调用者发送事件格式 + */ +export type ReceiveEventData = + | { + MessageId: 'OPEN_FILE' + Values: Blob | File + } + | { + MessageId: 'ACTION_SAVE' + Values?: null + } + | { + MessageId: never + Values?: never + } + +/** + * 浏览器主动回调第三方 + */ +export type CallbackEventData = + | { + Action: 'SAVE' + Values?: never + } diff --git a/src/views/infra/bookmark/index.vue b/src/views/infra/bookmark/index.vue index e08bcfa..a73b030 100644 --- a/src/views/infra/bookmark/index.vue +++ b/src/views/infra/bookmark/index.vue @@ -1,17 +1,12 @@ <script setup lang="ts"> import { Button } from 'ant-design-vue' -import { ref, watchEffect } from 'vue' -import { useFileDialog } from '@vueuse/core' -import { useRouter } from 'vue-router' +import { ref } from 'vue' +import { useEventListener } from '@vueuse/core' import { IFrame } from '@/components/IFrame' import { FileSelectModal } from '@/components/FileSelect' import { useModal } from '@/components/Modal' import type { FileVO } from '@/api/infra/file' import { initFilePreviewUrl } from '@/utils/file/preview' -import type { BookmarkGenData, BookmarkQueryRespVo, PictureExData, TextExData } from '@/api/infra/bookmark' -import { getAllBookmarks, getDoBookmarkReplace } from '@/api/infra/bookmark' -import { useMessage } from '@/hooks/web/useMessage' -import { convertFileToBase64 } from '@/utils/file/base64Conver' defineOptions({ name: 'BookmarkReplace' }) @@ -25,120 +20,13 @@ async function handleSelect(file: FileVO) { currentEditFile.value = file previewUrl.value = await initFilePreviewUrl(file.id) - - await handleQueryBookmark() } -const bookmarks = ref<BookmarkQueryRespVo[]>([]) - -interface FormItemType { - name: string - type: 'PICTURE_DESC' | 'PICTURE' | 'TEXT' - value: string | File - fileName: string - width: number - height: number -} - -const formItems = ref<FormItemType[]>([]) -const initFinish = ref<boolean>(false) -watchEffect(() => { - if (currentEditFile.value) { - bookmarks.value = [] - formItems.value = [] - } +useEventListener(document, 'message', (e) => { + console.log(e) }) -const { createMessage } = useMessage() - -async function handleQueryBookmark() { - bookmarks.value = [] - formItems.value = [] - initFinish.value = false - if (currentEditFile.value) - bookmarks.value = await getAllBookmarks(currentEditFile.value.id) - - else - createMessage.error('请选择文件!') - - for (const bk of bookmarks.value) - formItems.value.push({ name: bk.name, type: bk.type, value: '', fileName: '', width: 0, height: 0 }) - - initFinish.value = true -} - -const { files, open, reset, onChange } = useFileDialog({ - accept: 'image/*', - directory: false, -}) - -let currentEdit - -function handleSelectPicture(item: FormItemType) { - reset() - open() - currentEdit = item -} - -onChange(() => { - if (files.value?.length && files.value?.length > 0 && currentEdit) { - const file = files.value.item(0) - if (file) { - currentEdit.value = file - currentEdit.fileName = file.name - } - } -}) - -const router = useRouter() - -async function handleGenerateNew() { - if (currentEditFile.value) { - const data: BookmarkGenData[] = [] - for (const item of formItems.value) { - if (!item.value) - continue - - if (item.type === 'TEXT') { - data.push({ name: item.name, extData: { - type: 'TEXT', - value: item.value as string, - } as TextExData }) - } - if (item.type === 'PICTURE') { - const file = item.value as File - data.push({ name: item.name, extData: { - type: 'PICTURE', - value: await convertFileToBase64(item.value as File), - width: item.width, - height: item.height, - pictureName: file.name, - dataType: 'BASE64', - } as PictureExData }) - } - - if (item.type === 'PICTURE_DESC') { - const file = item.value as File - data.push({ name: item.name, extData: { - type: 'PICTURE_DESC', - value: await convertFileToBase64(item.value as File), - pictureName: file.name, - dataType: 'BASE64', - } as PictureExData }) - } - } - - if (data.length <= 0) { - createMessage.error('请填写替换值!') - return - } - - const result = await getDoBookmarkReplace(currentEditFile.value.id, data) - const previewUrl = await initFilePreviewUrl(result) - const encode = encodeURIComponent(previewUrl) - await router.push(`/infra/file/file-preview?url=${encode}`) - } -} +// const { createMessage } = useMessage() </script> <template> @@ -154,55 +42,12 @@ async function handleGenerateNew() { : {{ currentEditFile?.name }} </div> <div class="flex flex-row items-center"> - <Button @click="handleQueryBookmark"> + <Button> 获取书签 </Button> </div> </div> - <div class="h-full w-full overflow-scroll rounded bg-white p-4 dark:bg-black"> - <a-form - v-if="initFinish" - class="w-full" - layout="vertical" - :label-col="{ span: 16 }" - > - <a-col v-for="(item) in formItems" :key="item.name"> - <a-form-item :label="item.name"> - <a-radio-group v-model:value="item.type" :disabled="item.type === 'PICTURE_DESC'" @change="item.value = null"> - <a-radio value="TEXT"> - 文本 - </a-radio> - <a-radio value="PICTURE"> - 图片 - </a-radio> - <a-radio v-if="item.type === 'PICTURE_DESC'" value="PICTURE_DESC" :disabled="true"> - 图片(替换) - </a-radio> - </a-radio-group> - </a-form-item> - <a-form-item label="替换值"> - <a-input v-if="item.type === 'TEXT'" v-model:value="item.value" /> - <a-button v-if="item.type.includes('PICTURE')" @click="handleSelectPicture(item)"> - 选择图片 - </a-button> - <p v-if="item.type.includes('PICTURE') && item.value && item?.fileName" class="overflow-hidden"> - {{ item?.fileName }} - </p> - </a-form-item> - <a-form-item v-if="item.type === 'PICTURE'" label="图片 宽(px)"> - <a-input v-model:value="item.width" type="number" /> - </a-form-item> - <a-form-item v-if="item.type === 'PICTURE'" label="图片 高(px)"> - <a-input v-model:value="item.height" type="number" /> - </a-form-item> - <a-divider /> - </a-col> - </a-form> - - <a-button v-if="formItems.length > 0" type="primary" @click="handleGenerateNew"> - 生成替换后文件 - </a-button> - </div> + <div class="h-full w-full overflow-scroll rounded bg-white p-4 dark:bg-black" /> </div> <div class="w-75% flex flex-row bg-white dark:bg-black"> <i-frame v-if="previewUrl" class="w-full bg-white dark:bg-black" :src="previewUrl" height="calc(100vh - 105px)" />