From c7288b2cb4e38f94f56811812289ec7c41d31949 Mon Sep 17 00:00:00 2001 From: landaiqing Date: Sat, 22 Feb 2025 23:41:22 +0800 Subject: [PATCH] :sparkles: add apis --- components.d.ts | 26 +- package.json | 14 +- src/api/share/index.ts | 39 ++- src/api/storage/index.ts | 82 +++++- src/assets/images/original.png | Bin 0 -> 50918 bytes src/assets/svgs/empty.svg | 2 +- src/layout/default/Sidebar/Sidebar.vue | 25 +- src/router/modules/main_router.ts | 33 +-- src/router/modules/share.ts | 11 + src/router/modules/upscale.ts | 11 + src/store/index.ts | 2 + src/store/modules/imageStore.ts | 52 ++++ src/store/modules/userStore.ts | 8 +- src/types/image.d.ts | 16 ++ .../LocationAlbum/LocationAlbumDetail.vue | 22 +- .../Album/LocationAlbum/LocationAlbumList.vue | 6 +- .../Album/PeopleAlbum/PeopleAlbumDetail.vue | 28 +- .../Album/PeopleAlbum/PeopleAlbumList.vue | 21 +- src/views/Album/Phoalbum/PhoalbumDetail.vue | 25 +- src/views/Album/Phoalbum/PhoalbumList.vue | 49 ++-- .../Album/ThingAlbum/ThingAlbumDetail.vue | 22 +- src/views/Album/ThingAlbum/ThingAlbumList.vue | 8 +- src/views/ImageShare/index.scss | 100 ------- src/views/Login/LoginPage.vue | 16 +- src/views/Photograph/AllPhoto/AllPhoto.vue | 264 +++++++++++++++--- .../Photograph/ImageToolbar/ImageToolbar.vue | 50 +++- .../Photograph/ImageUpload/ImageUpload.vue | 13 +- .../Photograph/RecentUpload/RecentUpload.vue | 16 +- src/views/QRLogin/QRLogin.vue | 8 +- src/views/RecyclingBin/RecyclingBin.vue | 42 ++- .../{ => Share}/ImageShare/ImageShare.vue | 150 +++++++++- .../{ => Share}/ImageShare/ShareUpload.vue | 41 ++- .../Share/ShareViewList/ShareSidebar.vue | 154 ++++++++++ src/views/Share/ShareViewList/index.vue | 142 ++++++++++ 34 files changed, 1170 insertions(+), 328 deletions(-) create mode 100644 src/assets/images/original.png create mode 100644 src/router/modules/share.ts create mode 100644 src/router/modules/upscale.ts create mode 100644 src/store/modules/imageStore.ts create mode 100644 src/types/image.d.ts delete mode 100644 src/views/ImageShare/index.scss rename src/views/{ => Share}/ImageShare/ImageShare.vue (67%) rename src/views/{ => Share}/ImageShare/ShareUpload.vue (94%) create mode 100644 src/views/Share/ShareViewList/ShareSidebar.vue create mode 100644 src/views/Share/ShareViewList/index.vue diff --git a/components.d.ts b/components.d.ts index 94c4c87..620fadb 100644 --- a/components.d.ts +++ b/components.d.ts @@ -31,33 +31,25 @@ declare module 'vue' { AInputGroup: typeof import('ant-design-vue/es')['InputGroup'] AInputNumber: typeof import('ant-design-vue/es')['InputNumber'] AInputPassword: typeof import('ant-design-vue/es')['InputPassword'] - AList: typeof import('ant-design-vue/es')['List'] - AListItem: typeof import('ant-design-vue/es')['ListItem'] AllPhoto: typeof import('./src/views/Photograph/AllPhoto/AllPhoto.vue')['default'] AMenu: typeof import('ant-design-vue/es')['Menu'] AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] AMenuItemGroup: typeof import('ant-design-vue/es')['MenuItemGroup'] AModal: typeof import('ant-design-vue/es')['Modal'] AnimatedNature: typeof import('./src/components/AnimatedNature/AnimatedNature.vue')['default'] - APagination: typeof import('ant-design-vue/es')['Pagination'] APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] APopover: typeof import('ant-design-vue/es')['Popover'] AProgress: typeof import('ant-design-vue/es')['Progress'] AQrcode: typeof import('ant-design-vue/es')['QRCode'] - ARadio: typeof import('ant-design-vue/es')['Radio'] - ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup'] ARangePicker: typeof import('ant-design-vue/es')['RangePicker'] ASelect: typeof import('ant-design-vue/es')['Select'] ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] - ASkeleton: typeof import('ant-design-vue/es')['Skeleton'] - ASpace: typeof import('ant-design-vue/es')['Space'] ASpin: typeof import('ant-design-vue/es')['Spin'] ASwitch: typeof import('ant-design-vue/es')['Switch'] ATable: typeof import('ant-design-vue/es')['Table'] ATabPane: typeof import('ant-design-vue/es')['TabPane'] ATabs: typeof import('ant-design-vue/es')['Tabs'] ATag: typeof import('ant-design-vue/es')['Tag'] - ATextarea: typeof import('ant-design-vue/es')['Textarea'] ATooltip: typeof import('ant-design-vue/es')['Tooltip'] AUpload: typeof import('ant-design-vue/es')['Upload'] AUploadDragger: typeof import('ant-design-vue/es')['UploadDragger'] @@ -67,28 +59,25 @@ declare module 'vue' { Card3D: typeof import('./src/components/Card3D/Card3D.vue')['default'] CheckCard: typeof import('./src/components/CheckCard/CheckCard.vue')['default'] CheckCircleOutlined: typeof import('@ant-design/icons-vue')['CheckCircleOutlined'] - CloseCircleOutlined: typeof import('@ant-design/icons-vue')['CloseCircleOutlined'] CloseOutlined: typeof import('@ant-design/icons-vue')['CloseOutlined'] Clouds: typeof import('./src/components/Clouds/Clouds.vue')['default'] + CloudUploadOutlined: typeof import('@ant-design/icons-vue')['CloudUploadOutlined'] CommentInput: typeof import('./src/components/CommentReply/src/CommentInput/CommentInput.vue')['default'] CommentList: typeof import('./src/components/CommentReply/src/CommentList/CommentList.vue')['default'] CommentReply: typeof import('./src/components/CommentReply/index.vue')['default'] CompareImage: typeof import('./src/views/Upscale/CompareImage.vue')['default'] - CopyOutlined: typeof import('@ant-design/icons-vue')['CopyOutlined'] DeleteOutlined: typeof import('@ant-design/icons-vue')['DeleteOutlined'] DownloadOutlined: typeof import('@ant-design/icons-vue')['DownloadOutlined'] DownOutlined: typeof import('@ant-design/icons-vue')['DownOutlined'] DynamicTitle: typeof import('./src/components/DynamicTitle/DynamicTitle.vue')['default'] EyeInvisibleOutlined: typeof import('@ant-design/icons-vue')['EyeInvisibleOutlined'] - EyeOutlined: typeof import('@ant-design/icons-vue')['EyeOutlined'] FileImageOutlined: typeof import('@ant-design/icons-vue')['FileImageOutlined'] Folder: typeof import('./src/components/Folder/Folder.vue')['default'] ForgetPage: typeof import('./src/views/Forget/ForgetPage.vue')['default'] GradientText: typeof import('./src/components/MyUI/GradientText/GradientText.vue')['default'] - ImageShare: typeof import('./src/views/ImageShare/ImageShare.vue')['default'] + ImageShare: typeof import('./src/views/Share/ImageShare/ImageShare.vue')['default'] ImageToolbar: typeof import('./src/views/Photograph/ImageToolbar/ImageToolbar.vue')['default'] ImageUpload: typeof import('./src/views/Photograph/ImageUpload/ImageUpload.vue')['default'] - InboxOutlined: typeof import('@ant-design/icons-vue')['InboxOutlined'] LandingPage: typeof import('./src/views/Landing/LandingPage.vue')['default'] LeftOutlined: typeof import('@ant-design/icons-vue')['LeftOutlined'] LinkOutlined: typeof import('@ant-design/icons-vue')['LinkOutlined'] @@ -110,12 +99,14 @@ declare module 'vue' { Phoalbum: typeof import('./src/views/Album/Phoalbum/Phoalbum.vue')['default'] PhoalbumDetail: typeof import('./src/views/Album/Phoalbum/PhoalbumDetail.vue')['default'] PhoalbumList: typeof import('./src/views/Album/Phoalbum/PhoalbumList.vue')['default'] - PhoneUpload: typeof import('./src/views/Phone/UpscalePhoneUpload/PhoneUpload.vue')['default'] + PhoneOutlined: typeof import('@ant-design/icons-vue')['PhoneOutlined'] PhotoStack: typeof import('./src/components/PhotoStack/PhotoStack.vue')['default'] PlusOutlined: typeof import('@ant-design/icons-vue')['PlusOutlined'] PlusSquareOutlined: typeof import('@ant-design/icons-vue')['PlusSquareOutlined'] + QrcodeOutlined: typeof import('@ant-design/icons-vue')['QrcodeOutlined'] QRLogin: typeof import('./src/views/QRLogin/QRLogin.vue')['default'] QRLoginFooter: typeof import('./src/views/QRLogin/QRLoginFooter.vue')['default'] + QuestionCircleOutlined: typeof import('@ant-design/icons-vue')['QuestionCircleOutlined'] Rate: typeof import('./src/components/MyUI/Rate/Rate.vue')['default'] RecentUpload: typeof import('./src/views/Photograph/RecentUpload/RecentUpload.vue')['default'] RecyclingBin: typeof import('./src/views/RecyclingBin/RecyclingBin.vue')['default'] @@ -126,10 +117,11 @@ declare module 'vue' { RouterView: typeof import('vue-router')['RouterView'] SafetyOutlined: typeof import('@ant-design/icons-vue')['SafetyOutlined'] SearchOutlined: typeof import('@ant-design/icons-vue')['SearchOutlined'] - SendOutlined: typeof import('@ant-design/icons-vue')['SendOutlined'] ShareAltOutlined: typeof import('@ant-design/icons-vue')['ShareAltOutlined'] SharePhoneUpload: typeof import('./src/views/Phone/SharePhoneUpload/SharePhoneUpload.vue')['default'] - ShareUpload: typeof import('./src/views/ImageShare/ShareUpload.vue')['default'] + ShareSidebar: typeof import('./src/views/Share/ShareViewList/ShareSidebar.vue')['default'] + ShareUpload: typeof import('./src/views/Share/ImageShare/ShareUpload.vue')['default'] + ShareViewList: typeof import('./src/views/Share/ShareViewList/index.vue')['default'] Spin: typeof import('./src/components/MyUI/Spin/Spin.vue')['default'] StarButton: typeof import('./src/components/StarButton/StarButton.vue')['default'] TabletOutlined: typeof import('@ant-design/icons-vue')['TabletOutlined'] @@ -138,11 +130,11 @@ declare module 'vue' { ThingAlbumList: typeof import('./src/views/Album/ThingAlbum/ThingAlbumList.vue')['default'] Tooltip: typeof import('./src/components/MyUI/Tooltip/Tooltip.vue')['default'] UploadImage: typeof import('./src/views/Upscale/UploadImage.vue')['default'] + UploadOutlined: typeof import('@ant-design/icons-vue')['UploadOutlined'] Upscale: typeof import('./src/views/Upscale/index.vue')['default'] UpscalePhoneUpload: typeof import('./src/views/Phone/UpscalePhoneUpload/UpscalePhoneUpload.vue')['default'] UserInfoCard: typeof import('./src/components/CommentReply/src/UserInfoCard/UserInfoCard.vue')['default'] UserOutlined: typeof import('@ant-design/icons-vue')['UserOutlined'] VueCompareImage: typeof import('./src/components/VueCompareImage/VueCompareImage.vue')['default'] - WarningOutlined: typeof import('@ant-design/icons-vue')['WarningOutlined'] } } diff --git a/package.json b/package.json index 935018e..e35d5ce 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "docker-build": "docker build -t schisandra/schisandra-cloud-album-front ." }, "dependencies": { - "@alova/adapter-axios": "^2.0.12", + "@alova/adapter-axios": "^2.0.13", "@ant-design/icons-vue": "^7.0.1", "@intlify/eslint-plugin-vue-i18n": "^3.2.0", "@mediapipe/face_detection": "^0.4.1646425229", @@ -27,10 +27,10 @@ "@tensorflow/tfjs-backend-webgpu": "^4.22.0", "@tensorflow/tfjs-converter": "^4.22.0", "@tensorflow/tfjs-core": "^4.22.0", - "@types/animejs": "^3.1.12", + "@types/animejs": "^3.1.13", "@types/crypto-js": "^4.2.2", "@types/json-stringify-safe": "^5.0.3", - "@types/node": "^22.13.4", + "@types/node": "^22.13.5", "@types/nprogress": "^0.2.3", "@vladmandic/face-api": "^1.7.15", "@vuepic/vue-datepicker": "^11.0.1", @@ -44,7 +44,7 @@ "buffer": "^6.0.3", "crypto-js": "^4.2.0", "echarts": "^5.6.0", - "eslint": "9.20.1", + "eslint": "9.21.0", "exifr": "^7.1.3", "go-captcha-vue": "^2.0.6", "gsap": "^3.12.7", @@ -70,13 +70,13 @@ "vue-i18n": "^11.1.1", "vue-router": "^4.5.0", "vue3-justified-layout": "^0.0.6", - "ws": "^8.18.0" + "ws": "^8.18.1" }, "devDependencies": { - "@eslint/js": "^9.20.0", + "@eslint/js": "^9.21.0", "@vitejs/plugin-vue": "^5.2.1", "eslint-plugin-vue": "^9.32.0", - "globals": "^15.15.0", + "globals": "^16.0.0", "sass": "^1.85.0", "typescript": "^5.7.3", "typescript-eslint": "^8.24.1", diff --git a/src/api/share/index.ts b/src/api/share/index.ts index 3e34981..22f5f89 100644 --- a/src/api/share/index.ts +++ b/src/api/share/index.ts @@ -14,12 +14,12 @@ export const shareImageUploadApi = (formData) => { }; /** * 查询分享图片列表 - * @param share_code + * @param invite_code * @param access_password */ -export const queryShareImageApi = (share_code: string, access_password: string) => { +export const queryShareImageApi = (invite_code: string, access_password: string) => { return service.Post('/api/auth/share/image/list', { - share_code: share_code, + invite_code: invite_code, access_password: access_password, }, { meta: { @@ -41,3 +41,36 @@ export const queryShareRecordListApi = (dataRequest: string[]) => { }, }); }; +/** + * 查询分享信息 + * @param invite_code + */ +export const queryShareInfoApi = (invite_code: string) => { + return service.Post('/api/auth/share/info', { + invite_code: invite_code, + }, { + cacheFor: { + expire: 60, //60 * 60 * 24 * 7 + mode: "restore", + }, + meta: { + ignoreToken: false, + signature: false, + }, + }); +}; +/** + * 查询分享概览 + */ +export const queryShareOverviewApi = () => { + return service.Post('/api/auth/share/overview', {}, { + cacheFor: { + expire: 60, //60 * 60 * 24 * 7 + mode: "restore", + }, + meta: { + ignoreToken: false, + signature: false, + }, + }); +}; diff --git a/src/api/storage/index.ts b/src/api/storage/index.ts index ff86bdb..26956da 100644 --- a/src/api/storage/index.ts +++ b/src/api/storage/index.ts @@ -30,7 +30,7 @@ export const getFaceSamplesList = (type: number) => { ignoreToken: false, signature: false, }, - hitSource: ["modify-face-sample-name", "modify-face-sample-type"], + hitSource: ["modify-face-sample-name", "modify-face-sample-type", "delete-images"], }); }; /** @@ -146,6 +146,8 @@ export const queryAlbumDetailListApi = (id: number, provider: string, bucket: st ignoreToken: false, signature: false, }, + name: "album-detail-list", + hitSource: ["upload-file", "delete-images"], }); }; @@ -203,7 +205,7 @@ export const queryAllImagesApi = (type: string, sort: boolean, provider: string, ignoreToken: false, signature: false, }, - hitSource: ["upload-file"], + hitSource: ["upload-file", "delete-images"], }); }; @@ -221,7 +223,7 @@ export const queryRecentImagesApi = () => { ignoreToken: false, signature: false, }, - hitSource: ["upload-file"], + hitSource: ["upload-file", "delete-images"], }); }; /** @@ -240,7 +242,7 @@ export const queryLocationAlbumApi = (provider: string, bucket: string) => { ignoreToken: false, signature: false, }, - hitSource: ["upload-file"], + hitSource: ["upload-file", "delete-images"], }); }; /** @@ -263,7 +265,7 @@ export const queryLocationDetailListApi = (id: number, provider: string, bucket: ignoreToken: false, signature: false, }, - hitSource: ["upload-file"], + hitSource: ["upload-file", "delete-images"], }); }; @@ -283,7 +285,7 @@ export const queryThingAlbumApi = (provider: string, bucket: string) => { ignoreToken: false, signature: false, }, - hitSource: ["upload-file"], + hitSource: ["upload-file", "delete-images"], }); }; @@ -307,7 +309,7 @@ export const queryThingDetailListApi = (tag_name: string, provider: string, buck ignoreToken: false, signature: false, }, - hitSource: ["upload-file"], + hitSource: ["upload-file", "delete-images"], }); }; @@ -327,6 +329,7 @@ export const getSingleImageApi = (id: number) => { ignoreToken: false, signature: false, }, + name: "single-image-url", }); }; /** @@ -342,7 +345,68 @@ export const getStorageConfigListApi = () => { ignoreToken: false, signature: false, }, + name: "storage-config-list", + }); +}; +/** + * 查询删除记录 + * @param provider + * @param bucket + */ +export const getDeletedRecordApi = (provider: string, bucket: string) => { + return service.Post('/api/auth/storage/delete/record', { + provider: provider, + bucket: bucket, + }, { + cacheFor: { + expire: 60 * 60 * 24 * 7, + mode: "restore", + }, + meta: { + ignoreToken: false, + signature: false, + }, + name: "deleted-record", + hitSource: ["upload-file", "delete-images"], + }); +}; +/** + * 删除照片 + * @param ids + * @param provider + * @param bucket + */ +export const deletedImagesApi = (ids: number[], provider: string, bucket: string) => { + return service.Post('/api/auth/storage/image/delete', { + ids: ids, + provider: provider, + bucket: bucket, + }, { + meta: { + ignoreToken: false, + signature: false, + }, + name: "delete-images", + }); +}; +/** + * 获取存储桶容量 + * @param provider + * @param bucket + */ +export const getBucketCapacityApi = (provider: string, bucket: string) => { + return service.Post('/api/auth/storage/bucket/capacity', { + provider: provider, + bucket: bucket, + }, { + cacheFor: { + expire: 60 * 60 * 24, + mode: "restore", + }, + meta: { + ignoreToken: false, + signature: false, + }, + name: "delete-images", }); }; - - diff --git a/src/assets/images/original.png b/src/assets/images/original.png new file mode 100644 index 0000000000000000000000000000000000000000..36a8fd88092777ca5692b8bc3d88fd42a930c2c3 GIT binary patch literal 50918 zcmcG$d03NI|L)tCS7=`fXcbWmLF=oi2ox2WGH6k$wGb5j}@Z z*81Mx&wVd$p7!-N`=|9kzxd({vy(p^JNv~KUuuAl!(ST%uiS*6P6xhxi9PH6;}`UP z(83pA9Qoqpv7_g3Uw&*g{VOrVzc`r(a%*?bT#0^}zGwT*hrgS|-#p=a`rMGf$SCyK zt}|zrF_y=CHu}8xzoYtP$IS|wCFFalhkwzvC-`3#eHGX*qN3+Qm5QR$gVNz61LM6!;>5dHKi@zrVwY^Qn{VNeoV@Q`*K!$ z;a6zp%%7*?vcyU!Czf_435lP*OWv&Q6X~AqH)%}r{Ci?vx%Ah5(=6B5r(oJ?3pgyU znQz%59Ux+Np@e7@Vd1F(0y}Sb^~}=>I|-fBOwTL*Q}c(|q77E!;JXKGXJ~BeHeA1x zN5Do0L~^~6^v0B3*LAQZMJxzb^|qUI3hB}*FNy| zW~my-!2|bf-n}v3@2V;OO+1t^Y||+1-X@XNP*OhTcQ6pk>=VqbVBT-7+hN_=Ml8K= zQuFW{^YA8ip_2b?A1iyC7RpTtz^Xz!9}>PZf>s<9mrc5t z+TE=_1qmOAT)VJjlZhTiZR5{rDTB(5LLc-fkMCv~Q#Pl~$|;@VZ9^BJ*3*{wUvN7b z-@u^+s2w<;0Kc>&&Hc?$sdWs8_79k#KdDW&R_=s5oV1_ZlGwx}qxIkCqHOQ-#X}Lf+>+I?MztaOVVs7M zRY3a3-@v3lA!&~a>HVcA+VsI7 z=IN4IQNb+X4Q^^_t%M!orJPWu+!7tvTH!W_UVGSJNQo0~&o=^HXj3A1p{NmcwS9B1$Z$b8L9nwoUPmt~fA6d$(d!Yf_%k5QE&Q*z zZ~IKYA|Ig3`1#ki_L$dQo0>1CKMhh{Ho4YlBsIQvnK{_D^E7La_}lW_?jd3LW8d%4 ze;9sG}89vY(URAkZcPkH+s|Zw#nZ#7*|JI~PBZFd(Ya!q6bLZKs{Kv|CcDeI`3a zyeMg(3sl}{MfVJH{x-7JPMIjI=1Ga^0h61h=sULC(A~g_BTxq|PYj|b=&{nsvb1h7 z>I-HO@#XM`)J7i6xu27LX&udPvS|9i^Gmo{u%AhYiwN57YSrz`15wZv)Vnn+tRhrX z^vNbDP9CwQEnXO9Z6^~IS0rj`F|}kur|Yhs zKam$c@3&5WZ)|hQ*ak;1lP7*vaQKeHePiB=?x%zeWk>*8HLo&t&zA+(l?)g znIy4tRR?yvH&Hl?qFyz!O7^x)YiS47?k3?U5#K(iLMWrQo8iwj)fAGvgtqj4SKHs$ zE;J3If<(#ayu&Z<2WU^8>ra@@$Ty>3^jn+-S!lOPQwue-;geaT=v>1o zqKR;@@>je^4Y03r`JQnrPT8`n3`kTWJxnOtz-xNTQQw2b*!R0sBqO2)^Y(dL9Pq35 z+|$rFxiXVwgGnI{)+WJUxCPCwFvT`OZHX+g4N^m^1=gWAv|=(9iamZ$21 zcpsU@P6^d9D}^Q8V3PD(Wp?490WS?y!}9T)Cnn81-G@<7Eh1IP-CyL@RfNKTTYQ;d z6=+h3>7nF%q=d+ZhZ9$#f3*mnTPCblZl)x6TfNi#N@k_y^~i2KH|nv|n9lwpd4uU@ zU1o(aziBM4^gC!UIJvB^wf z?bjD;ffD+YXoTbCG*&f#{>!G*;Tz$t-I~E~9t75;bI9!=NH+HfO=dKD8=fG^AxDs7 zr;^JZa3o3l%1yl%#!5~~kZzktWFzDmu6T#j=+n%T{!MP=JHp&wnB7|psn1EPO=r%5 z>Yans;ghI`wjnuEr-Hs~+gFvPmuME~m4s={20~Rc3f}qS!j>f|?lrL5&V7R!K}O{$D6?VM|@%(eEWCmo-v$iZ*O@0TlY`J=&lc{g>UG|&|lTIY&Rp> zh0qWbsF(z$^H0@rtufU$)Fjb4A+bGsxLt_p!iQndby_HeJ0a16Fd&1Ukg}-dW97kw zkCM-lNC$PTrSIqMcg#Z>Cm&;OfbFvuJJmz?H@4&!|BJU?E`#Wj?lU%a8ALoi zZk0u$-7#!iRSk~FTWOHGj(61x&jTBzC^WY2tnS0Os-Y8QHD}jd zIBAC-d2%t!^=nz%l{Ebe?lz8Sb zG&1~zxbF)x16<$025DTIHHKM*@OOl%cE9o*X0Fb6&aX&3GG+6Wd)24E^%-s>3nI4> zvuh7@TY2}Orx;0>yfU##C$;k@Sr-lO%tCUWV@T{w`)VwBnBz{#Sd2WnU>S2Y*S{bcOsw|8#B0H8{$_hayoYyC}|u zh4+dXi~i~`ZdTx(?mKIP*N0}@$|&rlSr}ZuTTecdvQ@c zZ7_?<*GO$LV|1sk50WuNRaX@%yDY!(45rfWf{QPiL6%kR_iSzFNp2d(?qK*MFQZoxPkfz5vHN`~ zsx$l)fz>r~By{vE(V#gf6Sa;2D ziaDLeHVG)Wi_snGMp(?vtIO5etClYk9NHFZb}s3pwP$qDRo1&RhBvX{2zpk`BBQ%t zY2#cn+iZ#_jgrt`@?k5UonGX~+4R?NP=Q64@Y8JrMr)&J0QwY5bdL7k>!bs9=|LaR z#xS?J1tjZ{J2THR=5@(Yvp+&Ch2PkyPpZy)QMVy~%1unGh?>#<4pl0|5NOwNtrSN@ z5}%WI6|CdvKR@(?M04TsYI338G!-#$QDqw7gtKjWR^+;_?z|TwLB7+ZEBO~kIsUJh zhwF+%z8SOb0xI%T_#WS#BELreG(q{|gUg^(FX2vct0evdx|+oCU(-Scri1anClxCnYXZcpw>AIh-?2?A`_$=OjBJM z1;42_ao7AFvpE`OaBVvF?X=~=&^uz}9T>Ok(U~F>mmj$7xzbM&#TZ`OKG-OnMtoV@ z`gzmIp#p+e_73NVyUE*fNSk}pH9KcW;Wp~>Jbfa@ep>TJ+#e|26gvyw>$_H7zj^}U zH+mp{Md_`dQvGV6^NI?`1VM3DvqP=Z638C7! zQml+uT{qu(q~GJK<;1WyqKZO~qfZ~``nK3LdV2w~T2u-r)xGLftb|r-d7kXM@R+&R zLL7gCXz|Nb*S4Z$HlqEirUq(ufHY+gS$$ z?Bo1O7dsig$|b5j)#T$~tqfdJ<`x~JWk{o>Z!ksZQ^bS0)WB}5y^L>OrZHLU`}TPS z17dJVxm)yB``E6_w(3m|)Xj@U6(|>ii~R2HM)G?8WzEGyrqoFrH&VV^3mbE^8WOi+ z*o_=P9h`kABKmDDXdn!?4_7vwz$m)w5&E&|?Bh$!zS7P1!xnHkQY<1u2EsiltyD|EqXlEmYv~Y@(8;%c-(Nl}Vze;|O zj13_(lIS)32Z6lGM-enP^71wne7$IX_%WZBOxXoX{;c6S@7%KyhbcK$f0M?e#8}rk zAFmI?L-i`=)AQcuk2y`UEWGeXyDF9CR)klxk9J8Kggt;llK`!wb;?9fi$#NX;#O5uhC6Vww!NX;3EaY#H3sonjA$r5u?or=DOmlp zRgACA1AWB%-|;#~`Rr0yNU#vr1GkMW=zUX7T)5mea4Lbjp z{!@E~#&`MpwYZ-@k|^xes}%M)zv88-3(l)Uk{Eq;Xnl*VBexcw{3QQM1*#2F(X`KT z?Ju^LRgKEbLR}iBZCc8k$Fo%iJS2~sPHFLtCitxl(r)QKyU?n6xy5`wjLx%7^ z%$>BGVfbmmF`N)vagjWu#Qg?W;vfyI(QU}Gm+B4CxK_cFmqKa5TBP>=ENsxr!00;A zKW|N}ESb8=2wD%1m3K_DCcT zET!DgFYiX6Xr@j@@d@rHOqcoH#~8v%Fe_EjkXB2 zb8rt*x6VoFIuCQ`A-kWdnq2-`D|l{VyXD@8E(xBv_Ld1L9{=1G&~E!#IYD%VYIx=> zY#_fk`<~Ua(`ibnJbzH_ z#=I~WX~SZPi|V(k8&5>C>n84(kP~l{(E%e;&mr*>EesW-b1-Axay{P&u$wwBmjr)A zbi@XCNg=&;7A?h7tFoPtJP`aD4!3NZ=@dx=YsjhW`pyeuZisJxJ{7v7)pt=ND)_2W zT|8XivJdLA_^KCA_XscJ2P-E5<-Gx7O0E8P>pey6GCf1?L6U>z!}v4*bdd{ot$Ix# z|3s+UPTB!2EB=G#exFw4lFdo8{%I0RDUay2=0N*lE7WI!9Tv~|Gk!H9$>{yk(l_-* zmEK+TguwTmt%p}!*?MUCV(#XuL%m_6%c+rnctpUS3{Hgxlr@WA5AL(0uZMcX*DY5y z{1|m;ALr<->Y&H13K7`Pf|#VO()(R9vvrC4hV%O0h4t!V0qtkqr_UUbtN4+-Z1uhK ze1@=y?T{q2E ze6cliCzzWlgRl!#vyUV}a4H}zp46WsNs5JUB_QY4q=g9jKiRz~b#Um%Vb{(+eQAi| z2A^*eMB0ibbNZ&=3i7K0$a4YzK>yjP?mLxuh?#10IC!nxRN65Z2uxF0w^Irj7D&hU zzwg9gPw(7R~ ziq?T8ukeuyA4PDSsu_Vz>5#j&=D9yGe2R>NcUU(Xb-g_3av9w6%&LVgq_Sgfh|VKX zg4){8-6<3vDBZ@e$U?{%5{F^_4}|7`Pj$NL#Clxom-W0Y_An)eY~L+ZWXYP@=f(BT z(p#v+{%!1EP^Yagt@m}C$!8~4zZ0Rh3U2ZoC^9b+;mWV(|0%z=E&WXi>fmLaU0k0f zZ60l+9ey|RzQ=(Ah{wOx}q z@e+|(p02YZki;0a@O8(m9<)tlF73E?t;)7o^IZhoMYA@68~A;BYx(dg1t_~i-w+Rt6N7uB*OA# z_r(t6r)fQ4$tPz`R>{4Zp;xI(Z$kT@-Y{|}znwntR^*}i$;5UdzJ%LdRD&7c8X{R& zKLIpwh&-b)t54 zJ`{zc<6g54bZsONri{8G%s{d|-0dd+5s`9E>p=u#M={~?x?;cHhvrwPq4!-J`k{W| zdH4#8lpaRC=nUpA-~G~QXsZRW>*Oh$-_#+�#^AcWl^;iTQfxh~M_p=9O!IKwb?ET#RG!Goz~t$ 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 KJH@*85&sWd?ZQI< literal 0 HcmV?d00001 diff --git a/src/assets/svgs/empty.svg b/src/assets/svgs/empty.svg index f8b7977..1f5d753 100644 --- a/src/assets/svgs/empty.svg +++ b/src/assets/svgs/empty.svg @@ -1 +1 @@ - + diff --git a/src/layout/default/Sidebar/Sidebar.vue b/src/layout/default/Sidebar/Sidebar.vue index 8c21b50..50af92e 100644 --- a/src/layout/default/Sidebar/Sidebar.vue +++ b/src/layout/default/Sidebar/Sidebar.vue @@ -74,11 +74,15 @@ @@ -97,11 +101,13 @@ import Folder from "@/components/Folder/Folder.vue"; import ai from '@/assets/svgs/ai.svg'; import share from '@/assets/svgs/share.svg'; import useStore from "@/store"; +import {getBucketCapacityApi} from "@/api/storage"; const {t} = useI18n(); const router = useRouter(); const route = useRoute(); const menu = useStore().menu; +const upload = useStore().upload; /** * handle click event of menu item @@ -117,6 +123,14 @@ const menuCSSStyle: any = reactive({ alignItems: 'center', }); +const bucketCapacityInfo = ref(); + +async function getBucketCapacity() { + const res: any = await getBucketCapacityApi(upload.storageSelected?.[0], upload.storageSelected?.[1]); + if (res && res.code === 200) { + bucketCapacityInfo.value = res.data; + } +} watch( () => route.path, @@ -135,9 +149,10 @@ function scrollToSelectedMenuItem() { }); } -onMounted(() => { +onMounted(async () => { menu.currentMenu = route.path.replace('/main', '').split('/').slice(0, 3).join('/').substring(1); scrollToSelectedMenuItem(); + await getBucketCapacity(); }); router.afterEach((_to) => { menu.currentMenu = route.path.replace('/main', '').split('/').slice(0, 3).join('/').substring(1); diff --git a/src/router/modules/main_router.ts b/src/router/modules/main_router.ts index 720687b..22fac11 100644 --- a/src/router/modules/main_router.ts +++ b/src/router/modules/main_router.ts @@ -1,12 +1,14 @@ import photo from "@/router/modules/photos.ts"; import albums from "@/router/modules/albums.ts"; import recycling_bin from "@/router/modules/recycling_bin.ts"; +import share from "@/router/modules/share.ts"; +import upscale from "@/router/modules/upscale.ts"; export default [ { path: '/main', name: 'main', - redirect: '/main/photos', + redirect: '/main/photo/all', component: () => import('@/views/Main/MainPage.vue'), meta: { requiresAuth: true, @@ -16,25 +18,18 @@ export default [ ...photo, ...albums, ...recycling_bin, - { - path: '/main/photo/upscale', - name: 'upscale', - component: () => import('@/views/Upscale/index.vue'), - meta: { - requiresAuth: true, - title: '图像修复' - }, - }, - { - path: '/main/photo/share', - name: 'share', - component: () => import('@/views/ImageShare/ImageShare.vue'), - meta: { - requiresAuth: true, - title: '快传' - } - } + ...share, + ...upscale, ] + }, { + path: '/main/share/list/:id', + name: 'share-list', + component: () => import('@/views/Share/ShareViewList/index.vue'), + meta: { + requiresAuth: true, + title: '分享列表' + }, } + ]; diff --git a/src/router/modules/share.ts b/src/router/modules/share.ts new file mode 100644 index 0000000..a1d6a3e --- /dev/null +++ b/src/router/modules/share.ts @@ -0,0 +1,11 @@ +export default [ + { + path: '/main/photo/share', + name: 'share', + component: () => import('@/views/Share/ImageShare/ImageShare.vue'), + meta: { + requiresAuth: true, + title: '快传' + } + } +]; diff --git a/src/router/modules/upscale.ts b/src/router/modules/upscale.ts new file mode 100644 index 0000000..19776ea --- /dev/null +++ b/src/router/modules/upscale.ts @@ -0,0 +1,11 @@ +export default [ + { + path: '/main/photo/upscale', + name: 'upscale', + component: () => import('@/views/Upscale/index.vue'), + meta: { + requiresAuth: true, + title: '图像修复' + }, + }, +]; diff --git a/src/store/index.ts b/src/store/index.ts index 5e02e80..54db36b 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -6,6 +6,7 @@ import {useWebSocketStore} from "@/store/modules/websocketStore.ts"; import {useUpscaleStore} from "@/store/modules/upscaleStore.ts"; import {useMenuStore} from "@/store/modules/menuStore.ts"; import {useUploadStore} from "@/store/modules/uploadStore.ts"; +import {useImageStore} from "@/store/modules/imageStore.ts"; export default function useStore() { return { @@ -17,5 +18,6 @@ export default function useStore() { upscale: useUpscaleStore(), menu: useMenuStore(), upload: useUploadStore(), + image: useImageStore(), }; } diff --git a/src/store/modules/imageStore.ts b/src/store/modules/imageStore.ts new file mode 100644 index 0000000..be08ce4 --- /dev/null +++ b/src/store/modules/imageStore.ts @@ -0,0 +1,52 @@ +import {ImageList} from "@/types/image"; + +export const useImageStore = defineStore( + 'image', + () => { + const selected = ref([]); + const tabActiveKey = ref("-1"); + const tabMap = reactive({ + "-1": "全部相册", + "0": "我的相册", + "1": "我的分享", + "2": "我的收藏", + }); + const homeTabActiveKey = ref("all"); + const homeTabMap = reactive({ + "all": "全部", + "video": "视频", + "gif": "动图", + "screenshot": "截图", + }); + + /** + * 统计图片总数 + * @param imageList 图片列表数据 + * @returns 图片总数 + */ + function countTotalImages(imageList: ImageList): number { + if (!imageList) { + return 0; + } + return imageList.reduce((total, record) => total + record.list.length, 0); + } + + return { + selected, + tabActiveKey, + tabMap, + homeTabMap, + homeTabActiveKey, + countTotalImages + }; + }, + { + // 开启数据持久化 + persistedState: { + persist: true, + storage: localStorage, + key: 'image', + includePaths: ["tabActiveKey", "tabMap", "homeTabActiveKey", "homeTabMap"], + } + } +); diff --git a/src/store/modules/userStore.ts b/src/store/modules/userStore.ts index b661bf4..1795fe6 100644 --- a/src/store/modules/userStore.ts +++ b/src/store/modules/userStore.ts @@ -84,7 +84,13 @@ export const useAuthStore = defineStore( message.success(t('login.loginSuccess')); window.removeEventListener("message", messageHandler); setTimeout(() => { - router.push('/main/photo/all'); + const currentUrl = new URL(window.location.href); + const redirect = currentUrl.searchParams.get('redirect'); + if (redirect) { + router.push(redirect); + } else { + router.push('/main/photo/all'); + } }, 1000); } else { message.error(t('login.loginError')); diff --git a/src/types/image.d.ts b/src/types/image.d.ts new file mode 100644 index 0000000..d2d1141 --- /dev/null +++ b/src/types/image.d.ts @@ -0,0 +1,16 @@ +export interface Image { + id: number; + file_name: string; + url: string; + width: number; + height: number; + created_at: string; + thumbnail: string; +} + +export interface ImageRecord { + date: string; + list: Image[]; +} + +export type ImageList = ImageRecord[]; diff --git a/src/views/Album/LocationAlbum/LocationAlbumDetail.vue b/src/views/Album/LocationAlbum/LocationAlbumDetail.vue index 25b09a8..a944c51 100644 --- a/src/views/Album/LocationAlbum/LocationAlbumDetail.vue +++ b/src/views/Album/LocationAlbum/LocationAlbumDetail.vue @@ -4,14 +4,15 @@
地点 > - 乌鲁木齐 + {{ route.query.name }}
+
- 共12张照片 + 共{{ imageStore.countTotalImages(albumList) }}张照片
-
+
{{ itemList.date }} @@ -21,7 +22,7 @@ class="photo-item" margin="0" border-radius="0" - v-model="selected" + v-model="imageStore.selected" :showHoverCircle="true" :iconSize="20" :showSelectedEffect="true" @@ -41,6 +42,15 @@
+
+ + + +
@@ -50,8 +60,10 @@ import Vue3JustifiedLayout from "vue3-justified-layout"; import 'vue3-justified-layout/dist/style.css'; import {queryLocationDetailListApi} from "@/api/storage"; import useStore from "@/store"; +import ImageToolbar from "@/views/Photograph/ImageToolbar/ImageToolbar.vue"; +import empty from "@/assets/svgs/empty.svg"; -const selected = ref<(string | number)[]>([]); +const imageStore = useStore().image; const albumList = ref([]); const route = useRoute(); diff --git a/src/views/Album/LocationAlbum/LocationAlbumList.vue b/src/views/Album/LocationAlbum/LocationAlbumList.vue index a876d97..3487d93 100644 --- a/src/views/Album/LocationAlbum/LocationAlbumList.vue +++ b/src/views/Album/LocationAlbum/LocationAlbumList.vue @@ -8,7 +8,7 @@
{{ item.location }}
-
@@ -30,8 +30,8 @@ const route = useRoute(); const router = useRouter(); const upload = useStore().upload; -function handleClick(id: number) { - router.push({path: route.path + `/${id}`}); +function handleClick(id: number,name: string) { + router.push({path: route.path + `/${id}`, query: {name: name}}); } const locationAlbums = ref([]); diff --git a/src/views/Album/PeopleAlbum/PeopleAlbumDetail.vue b/src/views/Album/PeopleAlbum/PeopleAlbumDetail.vue index 16d7552..cf57444 100644 --- a/src/views/Album/PeopleAlbum/PeopleAlbumDetail.vue +++ b/src/views/Album/PeopleAlbum/PeopleAlbumDetail.vue @@ -11,16 +11,16 @@
- 张皓扬 + {{ route.query.name }}
- +
- 共12张照片 + 共{{ imageStore.countTotalImages(images) }}张照片
-
-
+
+
{{ itemList.date }} @@ -29,7 +29,7 @@ class="photo-item" margin="0" border-radius="0" - v-model="selected" + v-model="imageStore.selected" :showHoverCircle="true" :iconSize="20" :showSelectedEffect="true" @@ -49,6 +49,15 @@
+
+ + + +
@@ -58,10 +67,11 @@ import 'vue3-justified-layout/dist/style.css'; import {getFaceSamplesDetailList} from "@/api/storage"; import ImageToolbar from "@/views/Photograph/ImageToolbar/ImageToolbar.vue"; import useStore from "@/store"; +import empty from "@/assets/svgs/empty.svg"; -const selected = ref<(string | number)[]>([]); -const albumList = ref([]); +const imageStore = useStore().image; +const images = ref([]); const route = useRoute(); const router = useRouter(); @@ -74,7 +84,7 @@ const options = reactive({ async function getAlbumList(id: number) { const res: any = await getFaceSamplesDetailList(id, upload.storageSelected?.[0], upload.storageSelected?.[1]); if (res && res.code === 200) { - albumList.value = res.data.records; + images.value = res.data.records; } } diff --git a/src/views/Album/PeopleAlbum/PeopleAlbumList.vue b/src/views/Album/PeopleAlbum/PeopleAlbumList.vue index bc1bfcf..8d27d35 100644 --- a/src/views/Album/PeopleAlbum/PeopleAlbumList.vue +++ b/src/views/Album/PeopleAlbum/PeopleAlbumList.vue @@ -3,11 +3,11 @@
- {{ selecetedKey === '0' ? '人 物' : '已隐藏' }} + {{ selectedKey === '0' ? '人 物' : '已隐藏' }}