From 76d72182f97167d54cc468ff3914a5a4eaa3d1cb Mon Sep 17 00:00:00 2001 From: landaiqing Date: Mon, 10 Feb 2025 01:08:28 +0800 Subject: [PATCH] :arrow_up: upgrade dependencies and optimize the image display list --- components.d.ts | 3 + package.json | 16 +- src/api/storage/index.ts | 109 ++++++++- src/assets/images/default-cover.png | Bin 0 -> 10699 bytes src/components/MyUI/CheckCard/CheckCard.vue | 9 +- src/components/MyUI/Pagination/Pagination.vue | 10 +- src/layout/default/Header/Menu.vue | 6 +- src/store/modules/uploadStore.ts | 16 +- src/views/Album/Phoalbum/PhoalbumList.vue | 212 ++++++++++++++---- src/views/Photograph/AllPhoto/AllPhoto.vue | 132 ++++------- .../Photograph/ImageUpload/ImageUpload.vue | 18 +- .../Photograph/RecentUpload/RecentUpload.vue | 6 +- 12 files changed, 379 insertions(+), 158 deletions(-) create mode 100644 src/assets/images/default-cover.png diff --git a/components.d.ts b/components.d.ts index eaefd98..94929a0 100644 --- a/components.d.ts +++ b/components.d.ts @@ -26,6 +26,7 @@ declare module 'vue' { AImage: typeof import('ant-design-vue/es')['Image'] AImagePreviewGroup: typeof import('ant-design-vue/es')['ImagePreviewGroup'] AInput: typeof import('ant-design-vue/es')['Input'] + AInputGroup: typeof import('ant-design-vue/es')['InputGroup'] AInputPassword: typeof import('ant-design-vue/es')['InputPassword'] Alert: typeof import('./src/components/MyUI/Alert/Alert.vue')['default'] AList: typeof import('ant-design-vue/es')['List'] @@ -187,5 +188,7 @@ declare module 'vue' { Video: typeof import('./src/components/MyUI/Video/Video.vue')['default'] VueCompareImage: typeof import('./src/components/VueCompareImage/VueCompareImage.vue')['default'] WarningOutlined: typeof import('@ant-design/icons-vue')['WarningOutlined'] + Waterfall: typeof import('./src/views/Photograph/WaterfallList/Waterfall.vue')['default'] + WaterfallList: typeof import('./src/views/Photograph/WaterfallList/WaterfallList.vue')['default'] } } diff --git a/package.json b/package.json index 745dba8..c0a4bf1 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "@types/json-stringify-safe": "^5.0.3", "@types/node": "^22.13.1", "@types/nprogress": "^0.2.3", - "@vladmandic/face-api": "^1.7.14", + "@vladmandic/face-api": "^1.7.15", "@vuepic/vue-datepicker": "^11.0.1", "@vueuse/core": "^12.5.0", "@vueuse/integrations": "^12.5.0", @@ -44,7 +44,7 @@ "buffer": "^6.0.3", "crypto-js": "^4.2.0", "echarts": "^5.6.0", - "eslint": "9.19.0", + "eslint": "9.20.0", "exifr": "^7.1.3", "go-captcha-vue": "^2.0.5", "gsap": "^3.12.7", @@ -66,28 +66,28 @@ "vite-plugin-node-polyfills": "^0.23.0", "vue": "^3.5.13", "vue-dompurify-html": "^5.2.0", - "vue-i18n": "^11.1.0", + "vue-i18n": "^11.1.1", "vue-router": "^4.5.0", - "vue-waterfall-plugin-next": "^2.6.5", + "vue3-justified-layout": "^0.0.6", "ws": "^8.18.0" }, "devDependencies": { - "@eslint/js": "^9.19.0", + "@eslint/js": "^9.20.0", "@vitejs/plugin-vue": "^5.2.1", "eslint-plugin-vue": "^9.32.0", "globals": "^15.14.0", - "sass": "^1.83.4", + "sass": "^1.84.0", "typescript": "^5.7.3", "typescript-eslint": "^8.23.0", "unplugin-vue-components": "^28.0.0", - "vite": "^6.0.11", + "vite": "^6.1.0", "vite-plugin-bundle-obfuscator": "1.4.1", "vite-plugin-chunk-split": "^0.5.0", "vue-tsc": "2.2.0" }, "overrides": { "vite-plugin-chunk-split": { - "vite": "^6.0.11" + "vite": "^6.1.0" } } } diff --git a/src/api/storage/index.ts b/src/api/storage/index.ts index 1c90e54..c93c4a3 100644 --- a/src/api/storage/index.ts +++ b/src/api/storage/index.ts @@ -1,11 +1,16 @@ import {service} from "@/utils/alova/service.ts"; +/** + * 上传文件 + * @param formData + */ export const uploadFile = (formData) => { return service.Post('/api/auth/storage/uploads', formData, { meta: { ignoreToken: false, signature: false, - } + }, + name: "upload-file", }); }; @@ -24,7 +29,8 @@ export const getFaceSamplesList = (type: number) => { meta: { ignoreToken: false, signature: false, - } + }, + hitSource: ["modify-face-sample-name", "modify-face-sample-type"], }); }; /** @@ -40,7 +46,8 @@ export const modifyFaceSampleName = (id: number, face_name: string) => { meta: { ignoreToken: false, signature: false, - } + }, + name: "modify-face-sample-name", }); }; /** @@ -56,7 +63,101 @@ export const modifyFaceTypeBatch = (ids: number[], face_type: number) => { meta: { ignoreToken: false, signature: false, - } + }, + name: "modify-face-sample-type" + }); +}; +/** + * 创建相册 + * @param name + */ +export const createAlbumApi = (name: string) => { + return service.Post('/api/auth/storage/album/create', { + name: name, + }, { + meta: { + ignoreToken: false, + signature: false, + }, + name: "create-album", + }); +}; +/** + * 获取相册列表 + * @param type + * @param sort + */ +export const albumListApi = (type: string, sort: boolean) => { + return service.Post('/api/auth/storage/album/list', { + type: type, + sort: sort, + }, { + cacheFor: { + expire: 60 * 60 * 24 * 7, + mode: "restore", + }, + meta: { + ignoreToken: false, + signature: false, + }, + hitSource: ["create-album", "rename-album", "delete-album"], }); }; +/** + * 重命名相册 + * @param id + * @param name + */ +export const renameAlbumApi = (id: number, name: string) => { + return service.Post('/api/auth/storage/album/rename', { + id: id, + name: name, + }, { + meta: { + ignoreToken: false, + signature: false, + }, + name: "rename-album", + }); +}; +/** + * 删除相册 + * @param id + */ +export const deleteAlbumApi = (id: number) => { + return service.Post('/api/auth/storage/album/delete', { + id: id, + }, { + meta: { + ignoreToken: false, + signature: false, + }, + name: "delete-album", + }); +}; +/** + * 获取所有照片列表 + * @param type + * @param sort + * @param provider + * @param bucket + */ +export const queryAllImagesApi = (type: string, sort: boolean, provider: string, bucket: string) => { + return service.Post('/api/auth/storage/image/all/list', { + type: type, + sort: sort, + provider: provider, + bucket: bucket, + }, { + cacheFor: { + expire: 60 * 60 * 24 * 7, + mode: "restore", + }, + meta: { + ignoreToken: false, + signature: false, + }, + hitSource: ["upload-file"], + }); +}; diff --git a/src/assets/images/default-cover.png b/src/assets/images/default-cover.png new file mode 100644 index 0000000000000000000000000000000000000000..1aef613fa2aa260cbd923e5d66def47fd9b2e6c1 GIT binary patch literal 10699 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 .check-card { position: relative; - display: flex; + display: inline-flex; align-items: center; justify-content: center; cursor: pointer; @@ -100,11 +100,16 @@ function toggleSelection() { .check-card.selected { border: 1px solid rgba(125, 167, 255, 0.68); box-shadow: 0 0 2px rgba(77, 167, 255, 0.89); - padding: 10px; } .card-content { + display: inline-block; flex: 1; + transition: transform 0.3s ease-in-out; +} + +.check-card.selected .card-content { + transform: scale(0.95); } .card-selected-icon { diff --git a/src/components/MyUI/Pagination/Pagination.vue b/src/components/MyUI/Pagination/Pagination.vue index 2998b72..5e8abd1 100644 --- a/src/components/MyUI/Pagination/Pagination.vue +++ b/src/components/MyUI/Pagination/Pagination.vue @@ -368,10 +368,10 @@ function onPageSizeChange(pageSize: number) { } &:hover { - border-color: @themeColor; + border-color: #00aced; .arrow-svg { - color: @themeColor; + color: #00aced; } } } @@ -383,8 +383,8 @@ function onPageSizeChange(pageSize: number) { .item-active { // 悬浮/选中样式 font-weight: 600; - color: @themeColor; - border-color: @themeColor; + color: #00aced; + border-color: #00aced; } .item-disabled { @@ -443,7 +443,7 @@ function onPageSizeChange(pageSize: number) { right: 0; margin: auto; display: inline-block; - fill: @themeColor; + fill: #000; width: 12px; height: 12px; opacity: 0; diff --git a/src/layout/default/Header/Menu.vue b/src/layout/default/Header/Menu.vue index 5247c88..15196a2 100644 --- a/src/layout/default/Header/Menu.vue +++ b/src/layout/default/Header/Menu.vue @@ -11,7 +11,8 @@
- + @@ -116,6 +117,7 @@ + diff --git a/src/store/modules/uploadStore.ts b/src/store/modules/uploadStore.ts index 0ff4e32..4f019ff 100644 --- a/src/store/modules/uploadStore.ts +++ b/src/store/modules/uploadStore.ts @@ -3,10 +3,12 @@ import localforage from 'localforage'; interface UploadPredictResult { isAnime: boolean; objectArray: string[] | unknown[]; - landscape: 'building' | 'forest' | 'glacier' | 'mountain' | 'sea' | 'street' | 'none'; + landscape: 'building' | 'forest' | 'glacier' | 'mountain' | 'sea' | 'street' | null; isScreenshot: boolean; topCategory: string | undefined; - exif: object | null; + exif: object | ""; + width: number | null; + height: number | null; } @@ -18,10 +20,12 @@ export const useUploadStore = defineStore( const predictResult = reactive({ isAnime: false, objectArray: [], - landscape: 'none', + landscape: null, isScreenshot: false, topCategory: '', - exif: {} + exif: "", + width: null, + height: null, }); /** @@ -37,10 +41,10 @@ export const useUploadStore = defineStore( function clearPredictResult() { predictResult.isAnime = false; predictResult.objectArray = []; - predictResult.landscape = 'none'; + predictResult.landscape = null; predictResult.isScreenshot = false; predictResult.topCategory = ''; - predictResult.exif = {}; + predictResult.exif = ""; } diff --git a/src/views/Album/Phoalbum/PhoalbumList.vue b/src/views/Album/Phoalbum/PhoalbumList.vue index dda2a9c..025b7ee 100644 --- a/src/views/Album/Phoalbum/PhoalbumList.vue +++ b/src/views/Album/Phoalbum/PhoalbumList.vue @@ -1,12 +1,28 @@