diff --git a/components.d.ts b/components.d.ts index 3503511..cee4f7e 100644 --- a/components.d.ts +++ b/components.d.ts @@ -17,6 +17,7 @@ declare module 'vue' { ACardMeta: typeof import('ant-design-vue/es')['CardMeta'] ACascader: typeof import('ant-design-vue/es')['Cascader'] AccountSetting: typeof import('./src/views/User/AccountSetting/AccountSetting.vue')['default'] + AccountSettingBackup: typeof import('./src/views/User/AccountSetting/components/AccountSettingBackup/AccountSettingBackup.vue')['default'] AccountSettingHome: typeof import('./src/views/User/AccountSetting/components/AccountSettingHome/AccountSettingHome.vue')['default'] AccountSettingInfo: typeof import('./src/views/User/AccountSetting/components/AccountSettingInfo/AccountSettingInfo.vue')['default'] AccountSettingSidebar: typeof import('./src/views/User/AccountSetting/components/AccountSettingSidebar/AccountSettingSidebar.vue')['default'] @@ -110,14 +111,17 @@ declare module 'vue' { DownOutlined: typeof import('@ant-design/icons-vue')['DownOutlined'] DynamicTitle: typeof import('./src/components/DynamicTitle/DynamicTitle.vue')['default'] EditOutlined: typeof import('@ant-design/icons-vue')['EditOutlined'] + EmailModal: typeof import('./src/views/User/AccountSetting/components/AccountSettingHome/EmailModal.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'] FilerobotImageEditor: typeof import('./src/components/FilerobotImageEditor/FilerobotImageEditor.vue')['default'] Folder: typeof import('./src/components/Folder/Folder.vue')['default'] + FolderOutlined: typeof import('@ant-design/icons-vue')['FolderOutlined'] ForgetPage: typeof import('./src/views/Forget/ForgetPage.vue')['default'] GradientText: typeof import('./src/components/MyUI/GradientText/GradientText.vue')['default'] HeatmapPro: typeof import('./src/components/HeatmapPro/HeatmapPro.vue')['default'] + ImageBed: typeof import('./src/views/ImageBed/index.vue')['default'] ImageEnhancer: typeof import('./src/components/ImageEnhancer/ImageEnhancer.vue')['default'] ImageList: typeof import('./src/views/Photograph/PrivacySpace/ImageList.vue')['default'] ImageShare: typeof import('./src/views/Share/ImageShare/ImageShare.vue')['default'] @@ -126,6 +130,7 @@ declare module 'vue' { ImageWaterfallList: typeof import('./src/components/ImageWaterfallList/ImageWaterfallList.vue')['default'] InboxOutlined: typeof import('@ant-design/icons-vue')['InboxOutlined'] Index: typeof import('./src/views/Admin/System/Index.vue')['default'] + InfoCircleOutlined: typeof import('@ant-design/icons-vue')['InfoCircleOutlined'] 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'] @@ -142,12 +147,14 @@ declare module 'vue' { LogoutOutlined: typeof import('@ant-design/icons-vue')['LogoutOutlined'] MainPage: typeof import('./src/views/Main/MainPage.vue')['default'] MessageReport: typeof import('./src/components/CommentReply/src/MessageReport/MessageReport.vue')['default'] + MinusOutlined: typeof import('@ant-design/icons-vue')['MinusOutlined'] NotFound: typeof import('./src/views/404/NotFound.vue')['default'] OrderedListOutlined: typeof import('@ant-design/icons-vue')['OrderedListOutlined'] PageError403: typeof import('./src/views/Admin/Error/PageError403.vue')['default'] PageError404: typeof import('./src/views/Admin/Error/PageError404.vue')['default'] PageError500: typeof import('./src/views/Admin/Error/PageError500.vue')['default'] ParameterSetting: typeof import('./src/views/Upscale/ParameterSetting.vue')['default'] + PasswordModal: typeof import('./src/views/User/AccountSetting/components/AccountSettingHome/PasswordModal.vue')['default'] PeopleAlbumDetail: typeof import('./src/views/Album/PeopleAlbum/PeopleAlbumDetail.vue')['default'] PeopleAlbumIndex: typeof import('./src/views/Album/PeopleAlbum/PeopleAlbumIndex.vue')['default'] PeopleAlbumList: typeof import('./src/views/Album/PeopleAlbum/PeopleAlbumList.vue')['default'] @@ -157,6 +164,7 @@ declare module 'vue' { PhoalbumDetail: typeof import('./src/views/Album/Phoalbum/PhoalbumDetail.vue')['default'] PhoalbumIndex: typeof import('./src/views/Album/Phoalbum/PhoalbumIndex.vue')['default'] PhoalbumList: typeof import('./src/views/Album/Phoalbum/PhoalbumList.vue')['default'] + PhoneModal: typeof import('./src/views/User/AccountSetting/components/AccountSettingHome/PhoneModal.vue')['default'] 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'] @@ -201,6 +209,7 @@ declare module 'vue' { ThingAlbumDetail: typeof import('./src/views/Album/ThingAlbum/ThingAlbumDetail.vue')['default'] ThingAlbumIndex: typeof import('./src/views/Album/ThingAlbum/ThingAlbumIndex.vue')['default'] ThingAlbumList: typeof import('./src/views/Album/ThingAlbum/ThingAlbumList.vue')['default'] + ThirdPartyLoginModal: typeof import('./src/views/User/AccountSetting/components/AccountSettingHome/ThirdPartyLoginModal.vue')['default'] Tooltip: typeof import('./src/components/MyUI/Tooltip/Tooltip.vue')['default'] UploadImage: typeof import('./src/views/Upscale/UploadImage.vue')['default'] UploadSetting: typeof import('./src/components/ImageUpload/UploadSetting.vue')['default'] diff --git a/package.json b/package.json index 7839c69..2658b43 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@types/file-saver": "^2.0.7", "@types/json-stringify-safe": "^5.0.3", "@types/leaflet": "^1.9.16", - "@types/node": "^22.13.10", + "@types/node": "^22.13.11", "@types/nprogress": "^0.2.3", "@vladmandic/face-api": "^1.7.15", "@vuepic/vue-datepicker": "^11.0.2", @@ -48,7 +48,7 @@ "buffer": "^6.0.3", "crypto-js": "^4.2.0", "echarts": "^5.6.0", - "eslint": "9.22.0", + "eslint": "9.23.0", "exifr": "^7.1.3", "file-saver": "^2.0.5", "go-captcha-vue": "^2.0.6", @@ -85,7 +85,7 @@ "yaml-eslint-parser": "^1.3.0" }, "devDependencies": { - "@eslint/js": "^9.22.0", + "@eslint/js": "^9.23.0", "@vitejs/plugin-vue": "^5.2.3", "eslint-plugin-vue": "^10.0.0", "globals": "^16.0.0", diff --git a/src/api/storage/backup.ts b/src/api/storage/backup.ts new file mode 100644 index 0000000..e3ff2c1 --- /dev/null +++ b/src/api/storage/backup.ts @@ -0,0 +1,55 @@ +import {service} from "@/utils/alova/service.ts"; + +/** + * 从一个存储桶备份到另一个存储桶 + * @param sourceProvider 源存储商 + * @param sourceBucket 源存储桶 + * @param targetProvider 目标存储商 + * @param targetBucket 目标存储桶 + */ +export const backupStorageApi = (sourceProvider: string, sourceBucket: string, targetProvider: string, targetBucket: string) => { + return service.Post('/api/auth/storage/backup', { + source_provider: sourceProvider, + source_bucket: sourceBucket, + target_provider: targetProvider, + target_bucket: targetBucket, + }, { + meta: { + ignoreToken: false, + signature: false, + }, + name: "backup-storage", + }); +}; + +/** + * 获取备份进度 + * @param taskId 备份任务ID + */ +export const getBackupProgressApi = (taskId: string) => { + return service.Post('/api/auth/storage/backup/progress', { + task_id: taskId, + }, { + meta: { + ignoreToken: false, + signature: false, + }, + name: "get-backup-progress", + }); +}; + +/** + * 取消备份任务 + * @param taskId 备份任务ID + */ +export const cancelBackupTaskApi = (taskId: string) => { + return service.Post('/api/auth/storage/backup/cancel', { + task_id: taskId, + }, { + meta: { + ignoreToken: false, + signature: false, + }, + name: "cancel-backup-task", + }); +}; \ No newline at end of file diff --git a/src/api/user/email.ts b/src/api/user/email.ts new file mode 100644 index 0000000..0505da4 --- /dev/null +++ b/src/api/user/email.ts @@ -0,0 +1,70 @@ +import {service} from "@/utils/alova/service.ts"; + +/** + * 发送邮箱验证码 + * @param email 邮箱地址 + */ +export const sendEmailCaptchaApi = (email: string) => { + return service.Post('/api/user/email/captcha/send', { + email: email, + }, + { + meta: { + ignoreToken: false, + signature: true + } + } + ); +}; + +/** + * 绑定邮箱 + * @param email 邮箱地址 + * @param captcha 验证码 + */ +export const bindEmailApi = (email: string, captcha: string) => { + return service.Post('/api/user/email/bind', { + email: email, + captcha: captcha, + }, + { + meta: { + ignoreToken: false, + signature: true + } + } + ); +}; + +/** + * 解绑邮箱 + */ +export const unbindEmailApi = () => { + return service.Post('/api/user/email/unbind', {}, + { + meta: { + ignoreToken: false, + signature: true + } + } + ); +}; + +/** + * 修改邮箱 + * @param email 新邮箱地址 + * @param captcha 验证码 + */ +export const updateEmailApi = (email: string, captcha: string) => { + return service.Post('/api/user/email/update', { + email: email, + captcha: captcha, + }, + { + meta: { + ignoreToken: false, + signature: true + } + } + ); +}; \ No newline at end of file diff --git a/src/assets/svgs/github.svg b/src/assets/svgs/github.svg new file mode 100644 index 0000000..3d67caf --- /dev/null +++ b/src/assets/svgs/github.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgs/img_bed.svg b/src/assets/svgs/img_bed.svg new file mode 100644 index 0000000..f2b91b7 --- /dev/null +++ b/src/assets/svgs/img_bed.svg @@ -0,0 +1 @@ + diff --git a/src/assets/svgs/scan.svg b/src/assets/svgs/scan.svg new file mode 100644 index 0000000..f9bbe71 --- /dev/null +++ b/src/assets/svgs/scan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/source-storage.svg b/src/assets/svgs/source-storage.svg new file mode 100644 index 0000000..98da726 --- /dev/null +++ b/src/assets/svgs/source-storage.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/svgs/target-storage.svg b/src/assets/svgs/target-storage.svg new file mode 100644 index 0000000..7c007a0 --- /dev/null +++ b/src/assets/svgs/target-storage.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/components/ImageUpload/ImageUpload.vue b/src/components/ImageUpload/ImageUpload.vue index 5ff442b..59d233c 100644 --- a/src/components/ImageUpload/ImageUpload.vue +++ b/src/components/ImageUpload/ImageUpload.vue @@ -3,7 +3,7 @@