Commit aff15756d4a5231f8aea2dc4dbc1737b5b73110d
Merge branch 'ww' into 'main_dev'
fix(backgrounImage): 修复背景图片不能上传 See merge request yunteng/thingskit-view!37
Showing
8 changed files
with
85 additions
and
80 deletions
| 1 | import { defHttp } from "@/utils/external/http/axios"; | 1 | import { defHttp } from "@/utils/external/http/axios"; |
| 2 | -import { DictItem } from "./model"; | 2 | +import { DictItem, UploadResponse } from "./model"; |
| 3 | 3 | ||
| 4 | enum Api { | 4 | enum Api { |
| 5 | - GET_DICT = '/dict_item' | 5 | + GET_DICT = '/dict_item', |
| 6 | + UPLOAD = '/oss/upload' | ||
| 6 | } | 7 | } |
| 7 | 8 | ||
| 8 | export const getDictItemByCode = (value: string) => { | 9 | export const getDictItemByCode = (value: string) => { |
| @@ -13,3 +14,10 @@ export const getDictItemByCode = (value: string) => { | @@ -13,3 +14,10 @@ export const getDictItemByCode = (value: string) => { | ||
| 13 | } | 14 | } |
| 14 | }) | 15 | }) |
| 15 | } | 16 | } |
| 17 | + | ||
| 18 | +export const upload = (file: FormData) => { | ||
| 19 | + return defHttp.post<UploadResponse>({ | ||
| 20 | + url: Api.UPLOAD, | ||
| 21 | + params: file | ||
| 22 | + }) | ||
| 23 | +} |
| @@ -8,3 +8,11 @@ export interface DictItem { | @@ -8,3 +8,11 @@ export interface DictItem { | ||
| 8 | createTime: string; | 8 | createTime: string; |
| 9 | updateTime: string; | 9 | updateTime: string; |
| 10 | } | 10 | } |
| 11 | + | ||
| 12 | +export interface UploadResponse { | ||
| 13 | + fileName: string | ||
| 14 | + fileDownloadUri: string | ||
| 15 | + fileType: string | ||
| 16 | + size: number | ||
| 17 | + fileStaticUri: string | ||
| 18 | +} |
| 1 | +import { SelectOption } from "naive-ui" | ||
| 2 | +import { computed } from "vue" | ||
| 3 | + | ||
| 4 | +const isHref = (url: string) => { | ||
| 5 | + try { | ||
| 6 | + new URL(url) | ||
| 7 | + return true | ||
| 8 | + } catch (error) { | ||
| 9 | + return false | ||
| 10 | + } | ||
| 11 | +} | ||
| 12 | + | ||
| 13 | +export const useBackgroundSelect = () => { | ||
| 14 | + | ||
| 15 | + | ||
| 16 | + const getAllBackgroundImageList = computed(() => { | ||
| 17 | + const pathList = import.meta.glob('../../assets/external/background/*') | ||
| 18 | + return Object.keys(pathList).map(item => { | ||
| 19 | + const imgName = item.split('/').at(-1) | ||
| 20 | + return { | ||
| 21 | + label: imgName, | ||
| 22 | + value: imgName | ||
| 23 | + } as SelectOption | ||
| 24 | + }) | ||
| 25 | + }) | ||
| 26 | + | ||
| 27 | + const getBackgroundImagePath = (name: string) => { | ||
| 28 | + return isHref(name) ? name : new URL(`../../assets/external/background/${name}`, import.meta.url).href | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + return { | ||
| 32 | + getAllBackgroundImageList, | ||
| 33 | + getBackgroundImagePath | ||
| 34 | + } | ||
| 35 | + | ||
| 36 | +} | ||
| 37 | + |
src/utils/external/useSyncAssetsFile.ts
deleted
100644 → 0
| 1 | -import { useGlobSetting } from "@/hooks/external/setting" | ||
| 2 | -import { SelectOption } from "naive-ui" | ||
| 3 | -import { ProjectRuntimeEnvEnum } from "../../../build/external/envEnum" | ||
| 4 | - | ||
| 5 | -export const useSyncAssetsFile = () => { | ||
| 6 | - const { publicPath } = useGlobSetting() | ||
| 7 | - const staticDir = 'static' | ||
| 8 | - const isDev = [ProjectRuntimeEnvEnum.DEV, ProjectRuntimeEnvEnum.DEV_ALONE].includes(import.meta.env.MODE as ProjectRuntimeEnvEnum) | ||
| 9 | - const jpgModules = import.meta.glob('../../assets/**/*.jpg') | ||
| 10 | - const pngModules = import.meta.glob('../../assets/**/*.png') | ||
| 11 | - const imagesModules = { ...jpgModules, ...pngModules } | ||
| 12 | - | ||
| 13 | - const getFileInfo = (filePath: string) => { | ||
| 14 | - const filePathArr = filePath.split('/') | ||
| 15 | - const fileName = filePathArr.at(-1) | ||
| 16 | - const fileExt = fileName?.split('.').at(-1) | ||
| 17 | - return { fileName, fileExt } | ||
| 18 | - } | ||
| 19 | - | ||
| 20 | - const buildFilePath = (fileExt: string, fileName: string) => { | ||
| 21 | - return `${publicPath}${staticDir}/${fileExt}/${fileName}` | ||
| 22 | - } | ||
| 23 | - | ||
| 24 | - const setPath = (filePath: string) => { | ||
| 25 | - if (isDev && filePath) { | ||
| 26 | - const { fileExt, fileName } = getFileInfo(filePath) | ||
| 27 | - return buildFilePath(fileExt!, fileName!) | ||
| 28 | - } | ||
| 29 | - return filePath | ||
| 30 | - } | ||
| 31 | - | ||
| 32 | - const getPath = (filePath: string) => { | ||
| 33 | - if (isDev && filePath) { | ||
| 34 | - const { fileName } = getFileInfo(filePath) | ||
| 35 | - const imagesKeys = Object.keys(imagesModules) | ||
| 36 | - const path = imagesKeys.find(key => key.includes(fileName!)) | ||
| 37 | - return `/src/${path?.replaceAll('../', '')}` | ||
| 38 | - } | ||
| 39 | - | ||
| 40 | - return filePath ?? '' | ||
| 41 | - } | ||
| 42 | - | ||
| 43 | - const transformPath = (filesPath: string[]) => { | ||
| 44 | - const _filesPath: SelectOption[] = [] | ||
| 45 | - | ||
| 46 | - for (const file of filesPath) { | ||
| 47 | - const { fileExt, fileName } = getFileInfo(file) | ||
| 48 | - _filesPath.push({ | ||
| 49 | - label: fileName, | ||
| 50 | - value: buildFilePath(fileExt!, fileName!) | ||
| 51 | - }) | ||
| 52 | - } | ||
| 53 | - | ||
| 54 | - return _filesPath | ||
| 55 | - } | ||
| 56 | - | ||
| 57 | - return { setPath, getPath, transformPath } | ||
| 58 | -} |
| @@ -2,27 +2,23 @@ | @@ -2,27 +2,23 @@ | ||
| 2 | import { EditCanvasConfigEnum } from '@/store/modules/chartEditStore/chartEditStore.d'; | 2 | import { EditCanvasConfigEnum } from '@/store/modules/chartEditStore/chartEditStore.d'; |
| 3 | import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'; | 3 | import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'; |
| 4 | import { NEllipsis, NImage, NSelect, NSpace, NText, SelectOption } from 'naive-ui'; | 4 | import { NEllipsis, NImage, NSelect, NSpace, NText, SelectOption } from 'naive-ui'; |
| 5 | -import { computed, h } from 'vue'; | ||
| 6 | -import { useSyncAssetsFile } from '@/utils/external/useSyncAssetsFile'; | 5 | +import { computed, h, unref } from 'vue'; |
| 6 | +import { useBackgroundSelect } from '@/utils/external/useBackgroundImageSelect'; | ||
| 7 | 7 | ||
| 8 | const chartEditStore = useChartEditStore() | 8 | const chartEditStore = useChartEditStore() |
| 9 | const canvasConfig = chartEditStore.getEditCanvasConfig | 9 | const canvasConfig = chartEditStore.getEditCanvasConfig |
| 10 | 10 | ||
| 11 | -const { transformPath, setPath, getPath } = useSyncAssetsFile() | ||
| 12 | -const getSelectBgOptions = computed(() => { | ||
| 13 | - const imagesModules = import.meta.globEager('@/assets/external/background/*') | ||
| 14 | - return transformPath(Object.keys(imagesModules)) | ||
| 15 | -}) | 11 | +const { getAllBackgroundImageList, getBackgroundImagePath } = useBackgroundSelect() |
| 16 | 12 | ||
| 17 | const renderOption = (option: SelectOption) => { | 13 | const renderOption = (option: SelectOption) => { |
| 18 | return h(NSpace, { justify: 'space-between', style: 'padding: 0 15px; height: 28px; line-height: 28px;' }, () => [ | 14 | return h(NSpace, { justify: 'space-between', style: 'padding: 0 15px; height: 28px; line-height: 28px;' }, () => [ |
| 19 | - h(NImage, { width: 50, src: getPath(option.value as string), previewDisabled: true, class: 'select-image' } as Recordable), | 15 | + h(NImage, { width: 50, src: getBackgroundImagePath(option.value as string), previewDisabled: true, style: { height: '28px' } } as Recordable), |
| 20 | h(NEllipsis, null, () => option.label) | 16 | h(NEllipsis, null, () => option.label) |
| 21 | ]) | 17 | ]) |
| 22 | } | 18 | } |
| 23 | 19 | ||
| 24 | const handleUpdateValue = (value: string, _option: SelectOption) => { | 20 | const handleUpdateValue = (value: string, _option: SelectOption) => { |
| 25 | - chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND_IMAGE, setPath(value)) | 21 | + chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND_IMAGE, value) |
| 26 | } | 22 | } |
| 27 | 23 | ||
| 28 | </script> | 24 | </script> |
| @@ -32,7 +28,7 @@ const handleUpdateValue = (value: string, _option: SelectOption) => { | @@ -32,7 +28,7 @@ const handleUpdateValue = (value: string, _option: SelectOption) => { | ||
| 32 | <NSpace> | 28 | <NSpace> |
| 33 | <NText>背景选择</NText> | 29 | <NText>背景选择</NText> |
| 34 | <NSelect size="small" placeholder="请选择您要使用的背景" clearable style="width: 250px" :value="canvasConfig.backgroundImage" | 30 | <NSelect size="small" placeholder="请选择您要使用的背景" clearable style="width: 250px" :value="canvasConfig.backgroundImage" |
| 35 | - :options="getSelectBgOptions" :render-label="renderOption" @update-value="handleUpdateValue" /> | 31 | + :options="getAllBackgroundImageList" :render-label="renderOption" @update-value="handleUpdateValue" /> |
| 36 | </NSpace> | 32 | </NSpace> |
| 37 | </template> | 33 | </template> |
| 38 | 34 |
src/views/chart/ContentConfigurations/components/CanvasPage/external/useUploadBackground.ts
0 → 100644
| 1 | +import { upload } from "@/api/external/common" | ||
| 2 | +import { EditCanvasConfigEnum } from "@/store/modules/chartEditStore/chartEditStore.d" | ||
| 3 | +import { useChartEditStore } from "@/store/modules/chartEditStore/chartEditStore" | ||
| 4 | + | ||
| 5 | +export const useUploadBackgroundImg = async (file: File) => { | ||
| 6 | + const formData = new FormData() | ||
| 7 | + const chartEditStore = useChartEditStore() | ||
| 8 | + formData.set('file', file) | ||
| 9 | + const { fileStaticUri } = await upload(formData) | ||
| 10 | + chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND_IMAGE, fileStaticUri) | ||
| 11 | + chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, false) | ||
| 12 | +} |
| @@ -30,7 +30,7 @@ | @@ -30,7 +30,7 @@ | ||
| 30 | :onBeforeUpload="beforeUploadHandle" | 30 | :onBeforeUpload="beforeUploadHandle" |
| 31 | > | 31 | > |
| 32 | <n-upload-dragger> | 32 | <n-upload-dragger> |
| 33 | - <img v-if="canvasConfig.backgroundImage" class="upload-show" :src="canvasConfig.backgroundImage" alt="背景" /> | 33 | + <img v-if="canvasConfig.backgroundImage" class="upload-show" :src="getBackgroundImagePath(canvasConfig.backgroundImage)" alt="背景" /> |
| 34 | <div class="upload-img" v-show="!canvasConfig.backgroundImage"> | 34 | <div class="upload-img" v-show="!canvasConfig.backgroundImage"> |
| 35 | <img src="@/assets/images/canvas/noImage.png" /> | 35 | <img src="@/assets/images/canvas/noImage.png" /> |
| 36 | <n-text class="upload-desc" depth="3"> | 36 | <n-text class="upload-desc" depth="3"> |
| @@ -142,8 +142,9 @@ import { icon } from '@/plugins' | @@ -142,8 +142,9 @@ import { icon } from '@/plugins' | ||
| 142 | 142 | ||
| 143 | // THINGS_KIT 路径转换,同步生产环境与开发环境的保存的静态资源文件路径不一致 | 143 | // THINGS_KIT 路径转换,同步生产环境与开发环境的保存的静态资源文件路径不一致 |
| 144 | import SelectBackgroundImage from './external/SelectBackgroundImage.vue' | 144 | import SelectBackgroundImage from './external/SelectBackgroundImage.vue' |
| 145 | -import { useSyncAssetsFile } from '@/utils/external/useSyncAssetsFile' | ||
| 146 | -const { getPath } = useSyncAssetsFile() | 145 | +import { useBackgroundSelect } from '@/utils/external/useBackgroundImageSelect' |
| 146 | +import { useUploadBackgroundImg } from './external/useUploadBackground' | ||
| 147 | +const { getBackgroundImagePath } = useBackgroundSelect() | ||
| 147 | 148 | ||
| 148 | const { ColorPaletteIcon } = icon.ionicons5 | 149 | const { ColorPaletteIcon } = icon.ionicons5 |
| 149 | const { ScaleIcon, FitToScreenIcon, FitToHeightIcon, FitToWidthIcon } = icon.carbon | 150 | const { ScaleIcon, FitToScreenIcon, FitToHeightIcon, FitToWidthIcon } = icon.carbon |
| @@ -275,9 +276,11 @@ const customRequest = (options: UploadCustomRequestOptions) => { | @@ -275,9 +276,11 @@ const customRequest = (options: UploadCustomRequestOptions) => { | ||
| 275 | const { file } = options | 276 | const { file } = options |
| 276 | nextTick(() => { | 277 | nextTick(() => { |
| 277 | if (file.file) { | 278 | if (file.file) { |
| 278 | - const ImageUrl = fileToUrl(file.file) | ||
| 279 | - chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND_IMAGE, ImageUrl) | ||
| 280 | - chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, false) | 279 | + // THINGS_KIT 上传图片逻辑修改 |
| 280 | + useUploadBackgroundImg(file.file) | ||
| 281 | + // const ImageUrl = fileToUrl(file.file) | ||
| 282 | + // chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.BACKGROUND_IMAGE, ImageUrl) | ||
| 283 | + // chartEditStore.setEditCanvasConfig(EditCanvasConfigEnum.SELECT_COLOR, false) | ||
| 281 | } else { | 284 | } else { |
| 282 | window['$message'].error('添加图片失败,请稍后重试!') | 285 | window['$message'].error('添加图片失败,请稍后重试!') |
| 283 | } | 286 | } |
| @@ -106,7 +106,7 @@ import { EditRule } from './components/EditRule' | @@ -106,7 +106,7 @@ import { EditRule } from './components/EditRule' | ||
| 106 | import { EditBottom } from './components/EditBottom' | 106 | import { EditBottom } from './components/EditBottom' |
| 107 | import { EditShapeBox } from './components/EditShapeBox' | 107 | import { EditShapeBox } from './components/EditShapeBox' |
| 108 | import { EditTools } from './components/EditTools' | 108 | import { EditTools } from './components/EditTools' |
| 109 | -import { useSyncAssetsFile } from '@/utils/external/useSyncAssetsFile' | 109 | +import { useBackgroundSelect } from '@/utils/external/useBackgroundImageSelect' |
| 110 | 110 | ||
| 111 | const chartEditStore = useChartEditStore() | 111 | const chartEditStore = useChartEditStore() |
| 112 | const { handleContextMenu } = useContextMenu() | 112 | const { handleContextMenu } = useContextMenu() |
| @@ -164,7 +164,7 @@ const filterShow = computed(() => { | @@ -164,7 +164,7 @@ const filterShow = computed(() => { | ||
| 164 | 164 | ||
| 165 | // 背景 | 165 | // 背景 |
| 166 | // THINGS_KIT 路径转换,同步生产环境与开发环境的保存的静态资源文件路径不一致 | 166 | // THINGS_KIT 路径转换,同步生产环境与开发环境的保存的静态资源文件路径不一致 |
| 167 | -const { getPath } = useSyncAssetsFile() | 167 | +const { getBackgroundImagePath } = useBackgroundSelect() |
| 168 | const rangeStyle = computed(() => { | 168 | const rangeStyle = computed(() => { |
| 169 | // 设置背景色和图片背景 | 169 | // 设置背景色和图片背景 |
| 170 | const background = chartEditStore.getEditCanvasConfig.background | 170 | const background = chartEditStore.getEditCanvasConfig.background |
| @@ -176,8 +176,7 @@ const rangeStyle = computed(() => { | @@ -176,8 +176,7 @@ const rangeStyle = computed(() => { | ||
| 176 | ? { background: backgroundColor } | 176 | ? { background: backgroundColor } |
| 177 | // : { background: `url(${backgroundImage}) no-repeat center center / cover !important` } | 177 | // : { background: `url(${backgroundImage}) no-repeat center center / cover !important` } |
| 178 | // THINGS_KIT 路径转换,同步生产环境与开发环境的保存的静态资源文件路径不一致 | 178 | // THINGS_KIT 路径转换,同步生产环境与开发环境的保存的静态资源文件路径不一致 |
| 179 | - : { background: `url(${getPath(backgroundImage!)}) no-repeat center center / cover !important` } | ||
| 180 | - // @ts-ignore | 179 | + : { background: `url(${getBackgroundImagePath(backgroundImage!)}) no-repeat center center / cover !important` } |
| 181 | return { | 180 | return { |
| 182 | ...computedBackground, | 181 | ...computedBackground, |
| 183 | width: 'inherit', | 182 | width: 'inherit', |