diff --git a/build.gradle b/build.gradle index 5216014..9e62936 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id "com.github.node-gradle.node" version "5.0.0" + id "com.github.node-gradle.node" version "7.0.2" id "io.freefair.lombok" version "8.0.1" id "run.halo.plugin.devtools" version "0.0.9" } @@ -16,11 +16,11 @@ repositories { } dependencies { - implementation platform('run.halo.tools.platform:plugin:2.16.0-SNAPSHOT') + implementation platform('run.halo.tools.platform:plugin:2.17.0-SNAPSHOT') compileOnly 'run.halo.app:api' testImplementation 'run.halo.app:api' - implementation 'cn.hutool:hutool-all:5.8.16' + implementation 'cn.hutool:hutool-all:5.8.25' } @@ -53,6 +53,6 @@ build { } halo { - version = '2.16.2' + version = '2.17.0' debug = true } diff --git a/gradle.properties b/gradle.properties index 26daa7a..166aa4a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=1.0.3 \ No newline at end of file +version=1.1.0 \ No newline at end of file diff --git a/src/main/java/site/muyin/picturebed/service/Impl/LskyProServiceImpl.java b/src/main/java/site/muyin/picturebed/service/Impl/LskyProServiceImpl.java index 9c7a4a7..bc7e5a1 100644 --- a/src/main/java/site/muyin/picturebed/service/Impl/LskyProServiceImpl.java +++ b/src/main/java/site/muyin/picturebed/service/Impl/LskyProServiceImpl.java @@ -105,12 +105,15 @@ private Mono req(String path, Map paramMa WebClient WEB_CLIENT = WebClient.builder() + .defaultHeader(HttpHeaders.CACHE_CONTROL, "no-cache") + .defaultHeader(HttpHeaders.PRAGMA, "no-cache") .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .defaultHeader("Authorization", "Bearer " + authorization).build(); switch (path) { case "albums": case "images": + paramMap.put("timestamp", System.currentTimeMillis()); return WEB_CLIENT.get() .uri(url + path + "?" + HttpUtil.toParams(paramMap)) .retrieve() diff --git a/src/main/java/site/muyin/picturebed/service/Impl/SmmsServiceImpl.java b/src/main/java/site/muyin/picturebed/service/Impl/SmmsServiceImpl.java index 848a08f..83e0564 100644 --- a/src/main/java/site/muyin/picturebed/service/Impl/SmmsServiceImpl.java +++ b/src/main/java/site/muyin/picturebed/service/Impl/SmmsServiceImpl.java @@ -88,10 +88,15 @@ private Mono req(String path, Map paramMap) WebClient WEB_CLIENT = WebClient.builder() + .defaultHeader(HttpHeaders.CACHE_CONTROL, "no-cache") + .defaultHeader(HttpHeaders.PRAGMA, "no-cache") .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) .defaultHeader("Authorization", "Basic " + authorization).build(); if (StrUtil.startWithAny(path, "upload_history", "delete/")) { + if (StrUtil.startWithAny(path, "upload_history")) { + path = path + "×tamp=" + System.currentTimeMillis(); + } return WEB_CLIENT.get() .uri(url + path) .retrieve() diff --git a/src/main/resources/plugin.yaml b/src/main/resources/plugin.yaml index d44de8d..111902a 100644 --- a/src/main/resources/plugin.yaml +++ b/src/main/resources/plugin.yaml @@ -5,7 +5,7 @@ metadata: name: PictureBed spec: enabled: true - requires: ">=2.16.0" + requires: ">=2.17.0" author: name: lywq website: https://blog.muyin.site diff --git a/ui/package.json b/ui/package.json index 48d9d14..cb8d25a 100644 --- a/ui/package.json +++ b/ui/package.json @@ -8,20 +8,20 @@ "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore" }, "dependencies": { + "@halo-dev/api-client": "^2.17.0", + "@halo-dev/components": "^2.17.0", + "@halo-dev/console-shared": "^2.17.0", + "@material-tailwind/html": "^2.2.2", + "@tanstack/vue-query": "^5.29.0", "@uppy/core": "^3.11.3", "@vueuse/core": "^10.3.0", - "pretty-bytes": "^6.0.0", + "axios": "^1.6.8", "path-browserify": "^1.0.1", - "@material-tailwind/html": "^2.2.2", - "@halo-dev/api-client": "^2.16.0", - "@halo-dev/components": "^2.16.0", - "@halo-dev/console-shared": "^2.16.0", - "@tanstack/vue-query": "^5.29.0", - "axios": "^1.5.0", + "pretty-bytes": "^6.0.0", "vue": "^3.3.12" }, "devDependencies": { - "@halo-dev/ui-plugin-bundler-kit": "^1.0.0", + "@halo-dev/ui-plugin-bundler-kit": "^2.17.0", "@iconify/json": "^2.2.159", "@rushstack/eslint-patch": "^1.6.1", "@types/canvas-confetti": "^1.6.4", diff --git a/ui/src/components/ImgtpSelectorProvider.vue b/ui/src/components/ImgtpSelectorProvider.vue index 30cfa78..92ec6a7 100644 --- a/ui/src/components/ImgtpSelectorProvider.vue +++ b/ui/src/components/ImgtpSelectorProvider.vue @@ -20,7 +20,7 @@ import {matchMediaTypes} from "@/utils/media-type"; import LazyImage from "@/components/image/LazyImage.vue"; import type {Album, Image, PageResult} from "@/types"; import {useQuery} from "@tanstack/vue-query"; -import apiClient from "@/utils/api-client"; +import {axiosInstance} from "@halo-dev/api-client"; import ImageDetailModal from "@/components/image/ImageDetailModal.vue"; import ImageUploadModal from "@/components/image/ImageUploadModal.vue"; @@ -45,6 +45,7 @@ const emit = defineEmits<{ }>(); const selectedImages = ref>(new Set()); +const deletedImageIds = ref>(new Set()); const selectedAlbum = ref(); const selectedImage = ref(); const checkedAll = ref(false); @@ -65,11 +66,10 @@ const { data: imageList, refetch, } = useQuery({ - // queryKey: [`imageList_${picturebedType}`, selectedAlbum, page, size, keyword], - queryKey: [selectedAlbum, page, size, keyword], + queryKey: [`imageList_${picturebedType}`, selectedAlbum, page, size, keyword], queryFn: async () => { isLoading.value = true; - const {data} = await apiClient.get>( + const {data} = await axiosInstance.get>( "/apis/picturebed.muyin.site/v1alpha1/images", { params: { @@ -85,7 +85,13 @@ const { page.value = data.page; size.value = data.size; isLoading.value = false; - return data.list; + + // 过滤已删除的图片 + const images = data.list.filter((image) => { + return !deletedImageIds.value.has(image.id); + }); + + return images; }, // keepPreviousData: true, enabled: true, @@ -118,7 +124,7 @@ const isDisabled = (image: Image) => { const deleteSelected = async () => { const selected = Array.from(selectedImages.value); selected.forEach((image) => { - apiClient.get( + axiosInstance.get( "/apis/picturebed.muyin.site/v1alpha1/deleteImage", { params: { @@ -127,6 +133,7 @@ const deleteSelected = async () => { }, } ); + deletedImageIds.value.add(image.id); }); selectedImages.value.clear(); await refetch(); @@ -150,9 +157,15 @@ const handleOpenDetail = (image: Image) => { watchEffect(() => { const images = Array.from(selectedImages.value).map((image) => { return { - url: image.url, - type: image.mediaType as string, - }; + spec: { + displayName: image.name, + mediaType: image.mediaType, + size: image.size, + }, + status: { + permalink: image.url, + } + } }); emit("update:selected", images); }); diff --git a/ui/src/components/LskySelectorProvider.vue b/ui/src/components/LskySelectorProvider.vue index fcbe02c..aada4d8 100644 --- a/ui/src/components/LskySelectorProvider.vue +++ b/ui/src/components/LskySelectorProvider.vue @@ -20,7 +20,7 @@ import {matchMediaTypes} from "@/utils/media-type"; import LazyImage from "@/components/image/LazyImage.vue"; import type {Album, Image, PageResult} from "@/types"; import {useQuery} from "@tanstack/vue-query"; -import apiClient from "@/utils/api-client"; +import {axiosInstance} from "@halo-dev/api-client"; import ImageDetailModal from "@/components/image/ImageDetailModal.vue"; import ImageUploadModal from "@/components/image/ImageUploadModal.vue"; @@ -45,6 +45,7 @@ const emit = defineEmits<{ }>(); const selectedImages = ref>(new Set()); +const deletedImageIds = ref>(new Set()); const selectedAlbum = ref(); const selectedImage = ref(); const checkedAll = ref(false); @@ -56,19 +57,19 @@ const page = ref(1); const size = ref(40); const keyword = ref(""); const totalLabel = ref(""); +const albumListIsLoading = ref(false); const isLoading = ref(false); const picturebedType = "lsky"; // 相册列表 -const { +let { data: albumList, - isLoading: albumListIsLoading, } = useQuery({ - // queryKey: [`albumList_${picturebedType}`, page, size, keyword], - queryKey: [page, size, keyword], + queryKey: [`albumList_${picturebedType}`, page, size, keyword], queryFn: async () => { - const {data} = await apiClient.get( + albumListIsLoading.value = true; + const {data} = await axiosInstance.get( "/apis/picturebed.muyin.site/v1alpha1/albums", { params: { @@ -86,20 +87,20 @@ const { }]; albums.push(...data); selectedAlbum.value = albums[0]; + albumListIsLoading.value = false; return albums; }, }); // 图片列表 -const { +let { data: imageList, refetch, } = useQuery({ - // queryKey: [`imageList_${picturebedType}`, selectedAlbum, page, size, keyword], - queryKey: [selectedAlbum, page, size, keyword], + queryKey: [`imageList_${picturebedType}`, selectedAlbum, page, size, keyword], queryFn: async () => { isLoading.value = true; - const {data} = await apiClient.get>( + const {data} = await axiosInstance.get>( "/apis/picturebed.muyin.site/v1alpha1/images", { params: { @@ -117,7 +118,13 @@ const { page.value = data.page; size.value = data.size; isLoading.value = false; - return data.list; + + // 过滤已删除的图片 + const images = data.list.filter((image) => { + return !deletedImageIds.value.has(image.id); + }); + + return images; }, // keepPreviousData: true, enabled: computed(() => selectedAlbum.value !== undefined), @@ -158,7 +165,7 @@ const isDisabled = (image: Image) => { const deleteSelected = async () => { const selected = Array.from(selectedImages.value); selected.forEach((image) => { - apiClient.get( + axiosInstance.get( "/apis/picturebed.muyin.site/v1alpha1/deleteImage", { params: { @@ -167,6 +174,7 @@ const deleteSelected = async () => { }, } ); + deletedImageIds.value.add(image.id); }); selectedImages.value.clear(); await refetch(); @@ -190,9 +198,15 @@ const handleOpenDetail = (image: Image) => { watchEffect(() => { const images = Array.from(selectedImages.value).map((image) => { return { - url: image.url, - type: image.mediaType as string, - }; + spec: { + displayName: image.name, + mediaType: image.mediaType, + size: image.size, + }, + status: { + permalink: image.url, + } + } }); emit("update:selected", images); }); diff --git a/ui/src/components/SmmsSelectorProvider.vue b/ui/src/components/SmmsSelectorProvider.vue index 96e013d..a688dc1 100644 --- a/ui/src/components/SmmsSelectorProvider.vue +++ b/ui/src/components/SmmsSelectorProvider.vue @@ -20,7 +20,7 @@ import {matchMediaTypes} from "@/utils/media-type"; import LazyImage from "@/components/image/LazyImage.vue"; import type {Album, Image, PageResult} from "@/types"; import {useQuery} from "@tanstack/vue-query"; -import apiClient from "@/utils/api-client"; +import {axiosInstance} from "@halo-dev/api-client"; import ImageDetailModal from "@/components/image/ImageDetailModal.vue"; import ImageUploadModal from "@/components/image/ImageUploadModal.vue"; @@ -45,6 +45,7 @@ const emit = defineEmits<{ }>(); const selectedImages = ref>(new Set()); +const deletedImageIds = ref>(new Set()); const selectedAlbum = ref(); const selectedImage = ref(); const checkedAll = ref(false); @@ -65,11 +66,10 @@ const { data: imageList, refetch, } = useQuery({ - // queryKey: [`imageList_${picturebedType}`, selectedAlbum, page, size, keyword], - queryKey: [selectedAlbum, page, size, keyword], + queryKey: [`imageList_${picturebedType}`, selectedAlbum, page, size, keyword], queryFn: async () => { isLoading.value = true; - const {data} = await apiClient.get>( + const {data} = await axiosInstance.get>( "/apis/picturebed.muyin.site/v1alpha1/images", { params: { @@ -85,7 +85,13 @@ const { page.value = data.page; size.value = data.size; isLoading.value = false; - return data.list; + + // 过滤已删除的图片 + const images = data.list.filter((image) => { + return !deletedImageIds.value.has(image.id); + }); + + return images; }, // keepPreviousData: true, enabled: true, @@ -118,7 +124,7 @@ const isDisabled = (image: Image) => { const deleteSelected = async () => { const selected = Array.from(selectedImages.value); selected.forEach((image) => { - apiClient.get( + axiosInstance.get( "/apis/picturebed.muyin.site/v1alpha1/deleteImage", { params: { @@ -127,6 +133,7 @@ const deleteSelected = async () => { }, } ); + deletedImageIds.value.add(image.id); }); selectedImages.value.clear(); await refetch(); @@ -150,9 +157,15 @@ const handleOpenDetail = (image: Image) => { watchEffect(() => { const images = Array.from(selectedImages.value).map((image) => { return { - url: image.url, - type: image.mediaType as string, - }; + spec: { + displayName: image.name, + mediaType: image.mediaType, + size: image.size, + }, + status: { + permalink: image.url, + } + } }); emit("update:selected", images); }); diff --git a/ui/src/utils/api-client.ts b/ui/src/utils/api-client.ts deleted file mode 100644 index e474903..0000000 --- a/ui/src/utils/api-client.ts +++ /dev/null @@ -1,8 +0,0 @@ -import axios from "axios"; - -const apiClient = axios.create({ - baseURL: import.meta.env.VITE_API_URL, - withCredentials: true, -}); - -export default apiClient; diff --git a/ui/src/views/PictureBeds.vue b/ui/src/views/PictureBeds.vue index b823353..53e2fff 100644 --- a/ui/src/views/PictureBeds.vue +++ b/ui/src/views/PictureBeds.vue @@ -4,9 +4,9 @@ import {ref} from "vue"; import {VButton, VCard, VEmpty, VLoading, VPageHeader, VSpace} from "@halo-dev/components"; import MdiPicture360Outline from '~icons/mdi/picture-360-outline'; import LskySelectorProvider from "@/components/LskySelectorProvider.vue"; -import SMMSSelectorProvider from "@/components/SmmsSelectorProvider.vue"; -import ImgTPSelectorProvider from "@/components/ImgTPSelectorProvider.vue"; -import apiClient from "@/utils/api-client"; +import SmmsSelectorProvider from "@/components/SmmsSelectorProvider.vue"; +import ImgtpSelectorProvider from "@/components/ImgtpSelectorProvider.vue"; +import {axiosInstance} from "@halo-dev/api-client"; import {useQuery} from "@tanstack/vue-query"; const pictureBedType = ref(); @@ -31,10 +31,10 @@ const pictureBeds = ref({ const { data: pictureBedsAvailable } = useQuery({ - queryKey: [], + queryKey: ['pictureBeds'], queryFn: async () => { isLoading.value = true; - const {data} = await apiClient.get( + const {data} = await axiosInstance.get( "/apis/picturebed.muyin.site/v1alpha1/pictureBeds" ); const pictureBedsEnabled = []; @@ -73,10 +73,10 @@ const {